getFind(array($RVModel::ID => $vip_id, $RVModel::STATUS => 1)); if (!$vip_info) { // 会员查询失败 return false; } } // 判断会员类型 if ($vip_info[$RVModel::PLUS_ID]) { // 充值过plus // 查询plus会员 $RPVModel = D('RetailPlusVip'); $map2 = array( $RPVModel::ID => $vip_info[$RVModel::PLUS_ID], $RPVModel::VIP_ID => $vip_id, ); $plus_info = $RPVModel->getFind($map2); if ($plus_info) { // 判断过期 if ($plus_info[$RPVModel::STATE] == 2 || $plus_info[$RPVModel::END_TIME] < time()) { $vip_type = 2; } else { $vip_type = 3; } } else { // 未查询到plus $vip_type = 1; } } else { // 未充值过plus会员 $vip_type = 1; } return $vip_type; } /** * 更新充值订单(余额记录) * @param $pay_order pay_order表数据 * @return array */ public function updateOrder($pay_order) { // 实例化模型 $RechargeOrderModel = new RetailRechargeOrderModel(); $VipIntegralModel = new RetailVipIntegralModel(); $VipRechargeModel = new RetailVipRechargeModel(); $VipChangeModel = new RetailVipChangeModel(); $VipConfigModel = new RetailVipConfigModel(); $PayOrderModel = new RetailPayOrderModel(); $VipModel = new RetailVipModel(); $time = time(); // 余额记录查询条件 $map = array( $RechargeOrderModel::PAY_ORDER_ID => $pay_order[$PayOrderModel::ID], $RechargeOrderModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID], $RechargeOrderModel::STORE_ID => $pay_order[$PayOrderModel::STORE_ID], $RechargeOrderModel::STATUS => 0, $RechargeOrderModel::STATE => 1, ); // 余额记录订单 $recharge_order = $RechargeOrderModel->getFind($map); if (!$recharge_order) { $res = array( 'status' => 0, 'msg' => '充值订单查询失败' ); return $res; } $data = [ $RechargeOrderModel::STATUS => 1 ]; if (!empty($pay_order['pay_coupon_id_str']) && !empty($pay_order['pay_coupon_fee'])) { //使用了代金券 $data['pay_coupon_id_str'] = $pay_order['pay_coupon_id_str']; $data['pay_coupon_fee'] = $pay_order['pay_coupon_fee']; $data['money'] = round($recharge_order['money'] - $pay_order['pay_coupon_fee'], 2); } // 更新余额订单 $save = $RechargeOrderModel->updateOrder($map, $data); if (!$save) { $res = array( 'status' => 0, 'msg' => '充值订单更新失败' ); return $res; } // 查询会员 $map2 = array( $VipModel::ID => $recharge_order[$RechargeOrderModel::VID], $VipModel::STATUS => 1 ); $vip_info = $VipModel->getFind($map2); if (!$vip_info) { $res = array( 'status' => 0, 'msg' => '会员查询失败' ); return $res; } // 获取会员类型 $vip_type = $this->getVipType($recharge_order[$RechargeOrderModel::VID], $vip_info); // 获取充值送积分设置 $vip_config = $VipConfigModel->getFind(array($VipConfigModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID])); if ($vip_config) { $parameter = array( 'vip_type' => $vip_type, 'vip_config' => $vip_config ); $percent_state = $VipConfigModel->recharge_integral_config($parameter); //true验证成功 if ($percent_state) { $parameter['vip_info'] = $vip_info; $parameter['recharge_order'] = $recharge_order; $integral = $VipConfigModel->recharge_get_integral($parameter); $vip_info[$VipModel::INTEGRAL] = $vip_info[$VipModel::INTEGRAL] && $vip_info[$VipModel::INTEGRAL] > 0 ? $vip_info[$VipModel::INTEGRAL] : 0; $vip_info[$VipModel::GRADE_INTEGRAL] = $vip_info[$VipModel::GRADE_INTEGRAL] && $vip_info[$VipModel::GRADE_INTEGRAL] > 0 ? $vip_info[$VipModel::GRADE_INTEGRAL] : 0; // 修改积分 等级积分 $up2[$VipModel::INTEGRAL] = $vip_info[$VipModel::INTEGRAL] + $integral; $up2[$VipModel::GRADE_INTEGRAL] = $vip_info[$VipModel::GRADE_INTEGRAL] + $integral; } } // 增加会员余额 积分 if ($recharge_order['repay_name'] == 1) { $up2[$VipModel::BALANCE] = $vip_info[$VipModel::BALANCE] + $recharge_order[$RechargeOrderModel::MONEY]; } else { $up2[$VipModel::BALANCE] = $vip_info[$VipModel::BALANCE] + $recharge_order[$RechargeOrderModel::ALL_MONEY]; } $save2 = $VipModel->updateOrder($map2, $up2); if (!$save2) { $res = array( 'status' => 0, 'msg' => '会员信息更新失败,请联系商家' ); return $res; } // 判断积分是否修改 if ($integral && $integral > 0) { // 添加积分记录 $IntegralOrderModel = D('RetailIntegralOrder'); $cr = array( $IntegralOrderModel::VID => $vip_info[$VipModel::ID], $IntegralOrderModel::TYPE => 8, $IntegralOrderModel::INTEGRAL => $integral, $IntegralOrderModel::ADD_TIME => $time, $IntegralOrderModel::STORE_ID => $pay_order[$PayOrderModel::STORE_ID], $IntegralOrderModel::BILL_ID => 0, $IntegralOrderModel::REMARK => '充值获得' . $integral . '积分', $IntegralOrderModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID], $IntegralOrderModel::RECHARGE_ORDER_ID => $recharge_order[$RechargeOrderModel::ID], ); $add_result = $IntegralOrderModel->addOrder($cr); if (!$add_result) { $res = array( 'status' => 0, 'msg' => '积分记录失败' ); $this->ajaxReturn($res); } } // 获取会员原等级 $grade = $VipIntegralModel->getOrderFind(array($VipIntegralModel::MIN_INTEGRAL => array('elt', $vip_info[$VipModel::GRADE_INTEGRAL])), array($VipIntegralModel::ID, $VipIntegralModel::CARD_NAME), $VipIntegralModel::MIN_INTEGRAL . ' desc'); $vip_info['grade_id'] = $grade[$VipIntegralModel::ID] ? $grade[$VipIntegralModel::ID] : 0; $grade_name = $grade[$VipIntegralModel::CARD_NAME] ? $grade[$VipIntegralModel::CARD_NAME] : '无等级'; // 增加变更记录 $cr2 = array( $VipChangeModel::AFTER_BALANCE => $up2[$VipModel::BALANCE], $VipChangeModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID], $VipChangeModel::STORE_ID => $pay_order[$PayOrderModel::STORE_ID], $VipChangeModel::VIP_ID => $vip_info[$VipModel::ID], $VipChangeModel::OPERATOR => $recharge_order[$RechargeOrderModel::USER_TYPE], $VipChangeModel::OPERATOR_ID => $recharge_order[$RechargeOrderModel::CASHIER_ID], $VipChangeModel::BEFORE_PHONE => $vip_info[$VipModel::MOBILE_PHONE], $VipChangeModel::BEFORE_BALANCE => $vip_info[$VipModel::BALANCE], $VipChangeModel::BEFORE_GRADE => $grade_name, $VipChangeModel::ADD_TIME => $time ); $add_result2 = $VipChangeModel->addOrder($cr2); if (!$add_result2) { $res = array( 'status' => 0, 'msg' => '余额变更记录添加失败' ); return $res; } // 充值送优惠券(与充值活动没有绑定的优惠券) $this->rechargeGiveCoupon($vip_info, $pay_order['trade_amount'], $pay_order['merchant_id'], $vip_type, $recharge_order['id'], $pay_order['store_id']); // 充值送次卡 if ($recharge_order[$RechargeOrderModel::SCENE_TYPE] == 4 || $recharge_order[$RechargeOrderModel::SCENE_TYPE] == 5) { $source = 2; } else { $source = 1; } A('PayApi/VipCard')->rechargeGiveCard($pay_order[$PayOrderModel::MERCHANT_ID], $vip_info[$VipModel::ID], $pay_order[$PayOrderModel::TRADE_AMOUNT], 2, $source, $recharge_order[$RechargeOrderModel::ID]); // 判断充值活动 if ($recharge_order[$RechargeOrderModel::VIP_RECHARGE_ID]) { // 查询充值活动 $map2 = array( $VipRechargeModel::ID => $recharge_order[$RechargeOrderModel::VIP_RECHARGE_ID], $VipRechargeModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID], $VipRechargeModel::STORE_ID => $pay_order[$PayOrderModel::STORE_ID], $VipRechargeModel::STATUS => 1, $VipRechargeModel::STATE => 1, $VipRechargeModel::SURPLUS => array(array('gt', 0), array('eq', -1), 'or'), $VipRechargeModel::START_TIME => array(array('eq', ''), array('lt', $time), 'or'), $VipRechargeModel::END_TIME => array(array('eq', ''), array('gt', $time), 'or') ); $field = array( $VipRechargeModel::ID, $VipRechargeModel::SCENE_TYPE, $VipRechargeModel::COUPON_ID, $VipRechargeModel::COUPON_TYPE, $VipRechargeModel::SURPLUS, $VipRechargeModel::TIME, ); $recharge_activity = $VipRechargeModel->getFind($map2, $field); if (!$recharge_activity) { $res = array( 'status' => 0, 'msg' => '未查询到该充值活动' ); return $res; } // 判断类型 if ($recharge_activity[$VipRechargeModel::SCENE_TYPE] == 2) { // 开通plus $result = $this->openPlus($vip_info, $pay_order, $recharge_activity[$VipRechargeModel::TIME]); } else if ($recharge_activity[$VipRechargeModel::SCENE_TYPE] == 3) { // 续费plus $result = $this->renewPlus($vip_info, $pay_order, $recharge_activity[$VipRechargeModel::TIME]); } else { $result = array( 'status' => 1, 'msg' => '常规充值活动' ); } if ($result['status'] == 0) { return $result; } // 判断充值送优惠券 if ($recharge_activity[$VipRechargeModel::COUPON_ID]) { if ($recharge_activity[$VipRechargeModel::COUPON_TYPE] == 1) { // 优惠券 $this->rechargeActivityGiveCoupon($vip_info, $recharge_activity[$VipRechargeModel::COUPON_ID], $pay_order[$PayOrderModel::MERCHANT_ID], $vip_type, $recharge_order[$RechargeOrderModel::ID]); } else { // 券包 $this->rechargeActivityGiveCouponGroup($vip_info, $recharge_activity[$VipRechargeModel::COUPON_ID], $pay_order[$PayOrderModel::MERCHANT_ID], $vip_type, $recharge_order[$RechargeOrderModel::ID]); } } // 限制数量则减少剩余数量 if (intval($recharge_activity[$VipRechargeModel::SURPLUS]) > 0) { $actMap = array( $VipRechargeModel::ID => $recharge_activity[$VipRechargeModel::ID] ); $VipRechargeModel->toSetDec($actMap, $VipRechargeModel::SURPLUS, 1); } } // 判断支付方式 switch ($pay_order[$PayOrderModel::PAY_TYPE]) { case 1: $pay_name = '微信支付'; break; case 2: $pay_name = '支付宝'; break; case 3: $pay_name = '现金支付'; break; case 4: $pay_name = '微信支付'; break; default: $pay_name = '现金支付'; } // 公众号推送 A('Vip/Mark')->rechargesuccess($pay_order[$PayOrderModel::STORE_ID], $vip_info[$VipModel::ID], $recharge_order[$RechargeOrderModel::MONEY], $recharge_order[$RechargeOrderModel::ALL_MONEY], $pay_name); $res = array( 'status' => 1, 'msg' => '充值成功' ); return $res; } /** * 充值送优惠券 * @param array $vip_info 会员信息 * @return array $res */ public function rechargeGiveCoupon($vip_info, $money, $merchant_id, $vip_type, $recharge_order_id, $store_id = 0) { // 实例化模型 $retailMCouponModel = D('RetailMCoupon'); $VipModel = D('RetailVip'); $time = time(); // 查询优惠券 $map = array( $retailMCouponModel::MERCHANT_ID => $merchant_id, $retailMCouponModel::STATUS => 1, $retailMCouponModel::COUPON_NUM => array('gt', 0), $retailMCouponModel::RECHARGE_STATE => 1, $retailMCouponModel::MONEY => array('elt', $money), $retailMCouponModel::TYPE => 1, '_string' => "(" . $retailMCouponModel::COUPON_TYPE . " = 1 AND " . $retailMCouponModel::START_TIME . " < {$time} AND " . $retailMCouponModel::END_TIME . "> {$time}) OR (" . $retailMCouponModel::COUPON_TYPE . " = 2) OR (" . $retailMCouponModel::COUPON_TYPE . " = 3)" ); $coupon = $retailMCouponModel->getSelect($map); if (!$coupon) { $res = array('status' => 0, 'msg' => '暂无发放的优惠券'); return $res; } $XcxUserModel = new RetailSmallProgramUserModel(); $uid = $XcxUserModel->getFindField(['vid' => $vip_info['id']], 'id'); $isVip = $uid ? true : false; foreach ($coupon as &$val) { // 判断门店 if ($val[$retailMCouponModel::STORE_IDS] != 0) { if (!in_array($store_id, explode(',', $val[$retailMCouponModel::STORE_IDS]))) { //不满足优惠券发放条件 continue; } } // 判断等级 if ($val[$retailMCouponModel::COUPON_GRADE_ID] != 0) { // plus专属优惠券 if ($val[$retailMCouponModel::COUPON_GRADE_ID] == -1 || $val[$retailMCouponModel::COUPON_GRADE_ID] == '-1') { // plus会员专属优惠券 if ($vip_type != 3) { //不满足优惠券发放条件 continue; } } else { // 普通优惠券 if (!in_array($vip_info['grade_id'], explode(',', $val[$retailMCouponModel::COUPON_GRADE_ID]))) { // 普通优惠券 //不满足优惠券发放条件 continue; } } } // 优惠券发放 $result = $this->publicGiveCoupon($vip_info[$VipModel::ID], $val, $merchant_id, $recharge_order_id); if ($result['status'] == 1) { // 发放成功,减库存 $dec_result = $retailMCouponModel->toSetDec(array($retailMCouponModel::ID => $val[$retailMCouponModel::ID]), $retailMCouponModel::COUPON_NUM, 1); unset($dec_result); if ($isVip) { $RetailMessageModel = new RetailMessageModel(); $RetailMessageModel->couponSkipAdd($uid, $val['id']); } } unset($result); } return true; } /** * 开通plus会员 * @param array $vip_info 会员信息 * @param array $pay_order 订单 * @param int $plus_time plus会员时长 * @return array */ public function openPlus($vip_info = array(), $pay_order = array(), $plus_time = 365) { // 实例化模型 $PlusRecordModel = D('RetailPlusRecord'); $PayOrderModel = D('RetailPayOrder'); $PlusVipModel = D('RetailPlusVip'); $VipModel = D('RetailVip'); $time = time(); $merchant_id = $pay_order[$PayOrderModel::MERCHANT_ID]; $store_id = $pay_order[$PayOrderModel::STORE_ID]; // 查询plus $map = array( $PlusVipModel::VIP_ID => $vip_info[$VipModel::ID], $PlusVipModel::MERCHANT_ID => $merchant_id, // $PlusVipModel::STORE_ID => $store_id, ); $plus_info = $PlusVipModel->getFind($map); if (!empty($plus_info)) { $res = array( 'status' => 0, 'msg' => '该会员已开通plus会员,请选择续费活动' ); return $res; } // 查询小程序用户 $RetailSmallProgramUser = D('RetailSmallProgramUser'); $s_map = array( $RetailSmallProgramUser::MERCHANT_ID => $merchant_id, $RetailSmallProgramUser::VID => $vip_info[$VipModel::ID], ); if (!empty($pay_order[$PayOrderModel::UID])) { $s_map[$RetailSmallProgramUser::ID] = $pay_order[$PayOrderModel::UID]; } $s_user = $RetailSmallProgramUser->getFind($s_map); unset($s_map[$RetailSmallProgramUser::ID]); // 添加plus会员 $cr = array( $PlusVipModel::VIP_ID => $vip_info[$VipModel::ID], $PlusVipModel::XCX_VIP_ID => $s_user ? $s_user[$RetailSmallProgramUser::ID] : 0, $PlusVipModel::MERCHANT_ID => $merchant_id, // $PlusVipModel::STORE_ID => $store_id, $PlusVipModel::STORE_ID => $vip_info['storeid'], $PlusVipModel::ADD_TIME => $time, $PlusVipModel::START_TIME => $time, $PlusVipModel::END_TIME => $time + $plus_time * 86400, $PlusVipModel::STATE => 1, ); $add_plus_id = $PlusVipModel->addOrder($cr); if (!$add_plus_id) { $res = array( 'status' => 0, 'msg' => '开通失败' ); return $res; } // 修改会员类型 $up = array( $VipModel::PLUS_ID => $add_plus_id, $VipModel::PLUS_TYPE => 2, $VipModel::PLUS_STATE => 1, ); $save_result = $VipModel->updateOrder(array($VipModel::ID => $vip_info[$VipModel::ID]), $up); if (!$save_result) { $res = array( 'status' => 0, 'msg' => 'plus会员添加失败' ); return $res; } // 更新小程序用户 if (!empty($s_user)) { $save = array( $RetailSmallProgramUser::USER_TYPE => 2, $RetailSmallProgramUser::PLUS_VIP_ID => $add_plus_id, ); $RetailSmallProgramUser->updateOrder($s_map, $save); } // 添加plus会员开通记录 $cr2 = array( $PlusRecordModel::PAY_ORDER_ID => $pay_order[$PayOrderModel::ID], $PlusRecordModel::MERCHANT_ID => $merchant_id, $PlusRecordModel::STORE_ID => $store_id, $PlusRecordModel::VIP_ID => $vip_info[$VipModel::ID], $PlusRecordModel::XCX_UID => $s_user ? $s_user[$RetailSmallProgramUser::ID] : 0, $PlusRecordModel::MONEY => $pay_order[$PayOrderModel::TRADE_AMOUNT], $PlusRecordModel::PAY_STATE => 1, $PlusRecordModel::PAY_TYPE => $pay_order[$PayOrderModel::PAY_TYPE], $PlusRecordModel::TYPE => 3, $PlusRecordModel::ADD_TIME => time(), $PlusRecordModel::TIME => $plus_time, ); $add_result2 = $PlusRecordModel->addOrder($cr2); if ($add_result2) { $res = array( 'status' => 1, 'msg' => '开通成功' ); } else { $res = array( 'status' => 0, 'msg' => '开通记录添加失败' ); } return $res; } /** * 续费plus会员 * @param array $vip_info 会员信息 * @param array $pay_order 订单 * @param int $plus_time plus会员时长 * @return array */ public function renewPlus($vip_info = array(), $pay_order = array(), $plus_time = 365) { // 实例化模型 $PlusRecordModel = D('RetailPlusRecord'); $PayOrderModel = D('RetailPayOrder'); $PlusVipModel = D('RetailPlusVip'); $VipModel = D('RetailVip'); $time = time(); $merchant_id = $pay_order[$PayOrderModel::MERCHANT_ID]; $store_id = $pay_order[$PayOrderModel::STORE_ID]; // 查询plus状态 $map = array( $PlusVipModel::ID => $vip_info[$VipModel::PLUS_ID], $PlusVipModel::VIP_ID => $vip_info[$VipModel::ID], $PlusVipModel::MERCHANT_ID => $merchant_id, ); $plus_info = $PlusVipModel->getFind($map); if (empty($plus_info)) { $res = array( 'status' => 0, 'msg' => 'plus会员查询失败' ); return $res; } // 修改plus会员 $up = array(); if ($plus_info[$PlusVipModel::STATE] == 2 || $plus_info[$PlusVipModel::END_TIME] < $time) { // 过期 if ($plus_info[$PlusVipModel::STATE] == 2) { $up[$PlusVipModel::STATE] = 1; } $up[$PlusVipModel::START_TIME] = $time; $up[$PlusVipModel::END_TIME] = $time + $plus_time * 86400; } else { // 正常 $up[$PlusVipModel::END_TIME] = $plus_info[$PlusVipModel::END_TIME] + $plus_time * 86400; } $pMap = array( $PlusVipModel::ID => $plus_info[$PlusVipModel::ID] ); // 查询小程序用户 $RetailSmallProgramUser = D('RetailSmallProgramUser'); $s_map = array( $RetailSmallProgramUser::MERCHANT_ID => $merchant_id, $RetailSmallProgramUser::VID => $vip_info[$VipModel::ID], ); $s_user = $RetailSmallProgramUser->getFind($s_map); $up[$PlusVipModel::XCX_VIP_ID] = $s_user ? $s_user[$RetailSmallProgramUser::ID] : 0; $save_result = $PlusVipModel->updateOrder($pMap, $up); if (!$save_result) { $res = array( 'status' => 0, 'msg' => '续费失败' ); return $res; } // 修改会员 $up2 = array(); // 会员plus_id if ($vip_info[$VipModel::PLUS_ID] != $plus_info[$PlusVipModel::ID]) { $up2[$VipModel::PLUS_ID] = $plus_info[$PlusVipModel::ID]; } // 会员类型 if ($vip_info[$VipModel::PLUS_TYPE] != 2) { $up2[$VipModel::PLUS_TYPE] = 2; } // 判断过期 if ($vip_info[$VipModel::PLUS_STATE] != 1) { $up2[$VipModel::PLUS_STATE] = 1; } // 二次判断是否修改 if ($up2) { // 修改会员状态 $save_result2 = $VipModel->updateOrder(array($VipModel::ID => $vip_info[$VipModel::ID]), $up2); if (!$save_result2) { $res = array( 'status' => 0, 'msg' => '会员类型变更失败' ); return $res; } } // 更新小程序用户 if (!empty($s_user)) { $RetailSmallProgramUser->updateOrder($map, array($RetailSmallProgramUser::USER_TYPE => 2)); } // 添加plus会员续费记录 $cr = array( $PlusRecordModel::PAY_ORDER_ID => $pay_order[$PayOrderModel::ID], $PlusRecordModel::MERCHANT_ID => $merchant_id, $PlusRecordModel::STORE_ID => $store_id, $PlusRecordModel::VIP_ID => $vip_info[$VipModel::ID], $PlusRecordModel::XCX_UID => $s_user ? $s_user[$RetailSmallProgramUser::ID] : 0, $PlusRecordModel::MONEY => $pay_order[$PayOrderModel::TRADE_AMOUNT], $PlusRecordModel::PAY_STATE => 1, $PlusRecordModel::PAY_TYPE => $pay_order[$PayOrderModel::PAY_TYPE], $PlusRecordModel::TYPE => 4, $PlusRecordModel::ADD_TIME => time(), $PlusRecordModel::TIME => $plus_time, ); $add_result = $PlusRecordModel->addOrder($cr); if ($add_result) { $res = array( 'status' => 1, 'msg' => '续费成功' ); } else { $res = array( 'status' => 0, 'msg' => '续费记录添加失败' ); } return $res; } /** * 充值活动送优惠券(与充值活动绑定) * @param array $vip_info 会员信息 * @param int $id 优惠券id * @return array $res */ public function rechargeActivityGiveCoupon($vip_info, $id, $merchant_id, $vip_type, $recharge_order_id) { // 实例化模型 $retailMCouponModel = D('RetailMCoupon'); $VipModel = D('RetailVip'); $time = time(); // 查询优惠券 $map = array( $retailMCouponModel::ID => $id, $retailMCouponModel::MERCHANT_ID => $merchant_id, $retailMCouponModel::STATUS => 1, $retailMCouponModel::COUPON_NUM => array('gt', 0), $retailMCouponModel::TYPE => 1, '_string' => "(" . $retailMCouponModel::COUPON_TYPE . " = 1 AND " . $retailMCouponModel::START_TIME . " < {$time} AND " . $retailMCouponModel::END_TIME . " > {$time}) OR (" . $retailMCouponModel::COUPON_TYPE . " = 2) OR (" . $retailMCouponModel::COUPON_TYPE . " = 3)" ); $coupon = $retailMCouponModel->getFind($map); if (!$coupon) { $res = array('status' => 0, 'msg' => '该优惠券不可发放'); return $res; } // 判断门店(目前门店限制仅限于自助发放与支付发放) // if ($coupon[$retailMCouponModel::STORE_IDS] != 0) { // if (!in_array($vip_info[$VipModel::STORE_ID], explode(',', $coupon[$retailMCouponModel::STORE_IDS]))) { // $res = array('status' => 0, 'msg' => '不满足优惠券发放条件'); // return $res; // } // } // 判断等级(目前充值不限制等级) // if ($coupon[$retailMCouponModel::COUPON_GRADE_ID] != 0) { // // plus专属优惠券 // if ($coupon[$retailMCouponModel::COUPON_GRADE_ID] == -1 || $coupon[$retailMCouponModel::COUPON_GRADE_ID] == '-1') { // plus会员专属优惠券 // if ($vip_type != 3) { // $res = array('status' => 0, 'msg' => '不满足优惠券发放条件'); // return $res; // } // } else { // 普通优惠券 // if (!in_array($vip_info['grade_id'], explode(',', $coupon[$retailMCouponModel::COUPON_GRADE_ID]))) { // $res = array('status' => 0, 'msg' => '不满足优惠券发放条件'); // return $res; // } // } // } // 优惠券发放 $result = $this->publicGiveCoupon($vip_info[$VipModel::ID], $coupon, $merchant_id, $recharge_order_id); if ($result['status'] == 0) { return $result; } $XcxUserModel = new RetailSmallProgramUserModel(); $uid = $XcxUserModel->getFindField(['vid' => $vip_info['id']], 'id'); $isVip = $uid ? true : false; // 发放成功,减库存 $dec_result = $retailMCouponModel->toSetDec(array($retailMCouponModel::ID => $coupon[$retailMCouponModel::ID]), $retailMCouponModel::COUPON_NUM, 1); if ($isVip) { $RetailMessageModel = new RetailMessageModel(); $RetailMessageModel->couponSkipAdd($uid, $coupon['id']); } if ($dec_result) { $res = array('status' => 1, 'msg' => '发放成功'); } else { $res = array('status' => 1, 'msg' => '优惠券减少失败'); } return $res; } /** * 充值活动送券包优惠券(与充值活动绑定) * @param array $vip_info 会员信息 * @param int $id 券包id * @return array $res */ public function rechargeActivityGiveCouponGroup($vip_info, $id, $merchant_id, $vip_type, $recharge_order_id) { // 实例化模型 $retailMCouponGroupModel = D('RetailMCouponGroup'); $retailMCouponModel = D('RetailMCoupon'); $VipModel = D('RetailVip'); $time = time(); // 券包查询条件 $map = array( $retailMCouponGroupModel::ID => $id, $retailMCouponGroupModel::MERCHANT_ID => $merchant_id, $retailMCouponGroupModel::COUPON_GROUP_NUM => array('gt', 0), $retailMCouponGroupModel::STATUS => 1 ); // 查询券包 $coupon_group = $retailMCouponGroupModel->getFind($map); if (!$coupon_group) { $res = array('status' => 0, 'msg' => '该优惠券券包不可发放'); return $res; } // 判断门店(目前门店限制仅限于自助发放与支付发放) // if ($coupon_group[$retailMCouponGroupModel::STORE_IDS] != 0) { // if (!in_array($vip_info[$VipModel::STORE_ID], explode(',', $coupon_group[$retailMCouponModel::STORE_IDS]))) { // $res = array('status' => 0, 'msg' => '不满足优惠券券包发放条件'); // return $res; // } // } // 判断等级(目前充值不限制等级) // if ($coupon_group[$retailMCouponGroupModel::GRADE_IDS] != 0) { // if ($coupon_group[$retailMCouponGroupModel::GRADE_IDS] != -1 || $coupon_group[$retailMCouponGroupModel::GRADE_IDS] != '-1') { // if ($vip_type != 3) { // $res = array('status' => 0, 'msg' => '不满足优惠券发放条件'); // return $res; // } // } else { // if (!in_array($vip_info['grade_id'], explode(',', $coupon_group[$retailMCouponModel::GRADE_IDS]))) { // $res = array('status' => 0, 'msg' => '不满足优惠券券包发放条件'); // return $res; // } // } // } // 优惠券查询条件 $map2 = array( $retailMCouponModel::MERCHANT_ID => $merchant_id, $retailMCouponModel::TYPE => 2, $retailMCouponModel::M_COUPON_GROUP_ID => $coupon_group[$retailMCouponModel::ID], '_string' => "(" . $retailMCouponModel::COUPON_TYPE . " = 1 AND " . $retailMCouponModel::END_TIME . " > {$time}) OR (" . $retailMCouponModel::COUPON_TYPE . " = 2) OR (" . $retailMCouponModel::COUPON_TYPE . " = 3)" ); // 查询优惠券 $coupon = $retailMCouponModel->getSelect($map2); if (!$coupon) { $res = array('status' => 0, 'msg' => '该券包暂无可发放的优惠券'); return $res; } // 小程序uid处理 $XcxUserModel = new RetailSmallProgramUserModel(); $uid = $XcxUserModel->getFindField(['vid' => $vip_info['id']], 'id'); $isVip = $uid ? true : false; // 发放优惠券 $num = 0; foreach ($coupon as &$val) { $result = $this->publicGiveCoupon($vip_info[$VipModel::ID], $val, $merchant_id, $recharge_order_id); if ($result['status'] == 1) { $num++; if ($isVip) { $RetailMessageModel = new RetailMessageModel(); $RetailMessageModel->couponSkipAdd($uid, $val['id']); } } unset($result); } // 判断券包是否有发放 if ($num <= 0) { $res = array('status' => 0, 'msg' => '券包优惠券发放失败'); return $res; } // 券包减库存 $dec_result = $retailMCouponGroupModel->toSetDec(array($retailMCouponGroupModel::ID => $coupon_group[$retailMCouponGroupModel::ID]), $retailMCouponGroupModel::COUPON_GROUP_NUM, 1); if ($dec_result) { $res = array('status' => 1, 'msg' => '发放成功'); } else { $res = array('status' => 1, 'msg' => '优惠券减少失败'); } return $res; } /** * 发放优惠券(公共方法) * @param $vip_id 会员id * @param $coupon 优惠券 * @param $merchant_id 商户ID * @param int $recharge_order_id 充值记录ID * @param int $bill_id 订单ID * @return array */ public function publicGiveCoupon($vip_id, $coupon, $merchant_id, $recharge_order_id = 0, $bill_id = 0) { // 实例化模型 $retailMCouponModel = D('RetailMCoupon'); $retailVipMCouponModel = D('RetailVipMCoupon'); // 发放优惠券 $cr = array( $retailVipMCouponModel::VID => $vip_id, $retailVipMCouponModel::MCOUPON_ID => $coupon[$retailMCouponModel::ID], $retailVipMCouponModel::MERCHANT_ID => $merchant_id, $retailVipMCouponModel::NEED_MONEY => $coupon[$retailMCouponModel::NEED_MONEY], $retailVipMCouponModel::REDUCE_MONEY => $coupon[$retailMCouponModel::REDUCE_MONEY], $retailVipMCouponModel::CAN_USE_STORE_IDS => $coupon[$retailMCouponModel::STORE_IDS], $retailVipMCouponModel::RECHARGE_ORDER_ID => $recharge_order_id, $retailVipMCouponModel::BILL_ID => $bill_id ? $bill_id : 0, $retailVipMCouponModel::ADD_TIME => time(), ); // 判断时间类型 if ($coupon[$retailMCouponModel::COUPON_TYPE] == 1) { $cr[$retailVipMCouponModel::START_TIME] = $coupon[$retailMCouponModel::START_TIME]; $cr[$retailVipMCouponModel::END_TIME] = $coupon[$retailMCouponModel::END_TIME]; } else if ($coupon[$retailMCouponModel::COUPON_TYPE] == 2) { $cr[$retailVipMCouponModel::START_TIME] = time(); $cr[$retailVipMCouponModel::END_TIME] = strtotime(date('Y-m-d') . ' 23:59:59') + $coupon[$retailMCouponModel::DAY_NUM] * 86400; } else if ($coupon[$retailMCouponModel::COUPON_TYPE] == 3) { $cr[$retailVipMCouponModel::START_TIME] = strtotime(date('Y-m-d') . ' 23:59:59') + 1; $cr[$retailVipMCouponModel::END_TIME] = strtotime(date('Y-m-d') . ' 23:59:59') + ($coupon[$retailMCouponModel::DAY_NUM] + 1) * 86400; } else { $res = array('status' => 0, 'mag' => '无效的优惠券,无法发放'); return $res; } // 判断是否为券包优惠券 if ($coupon[$retailMCouponModel::TYPE] == 2 && $coupon[$retailMCouponModel::M_COUPON_GROUP_ID]) { $cr[$retailVipMCouponModel::MCOUPON_GROUP_ID] = $coupon[$retailMCouponModel::M_COUPON_GROUP_ID]; $cr['type'] = 2; } // 发放优惠券 $add_result = $retailVipMCouponModel->addOrder($cr); if (!$add_result) { $res = array('status' => 0, 'msg' => '优惠券发放失败'); } else { $res = array('status' => 1, 'msg' => '发放成功'); } // 查询商户 $retailMerchantModel = new RetailMerchantModel(); $merchant = $retailMerchantModel->getFind(array('id' => $merchant_id)); if ($merchant) { // 公众号推送 $tips = "尊敬的用户,赠送您一张" . $coupon[$retailMCouponModel::COUPON_NAME]; $remark = $merchant['name'] . '提示:优惠券在' . date('Y-m-d', $cr[$retailVipMCouponModel::START_TIME]) . '到' . date('Y-m-d', $cr[$retailVipMCouponModel::END_TIME]) . '有效期内可以使用'; A('Vip/Mark')->launchcoupon($vip_id, $tips, $remark, $cr); } return $res; } }