getFind(array($Vip::ID => $vip_id, $Vip::MERCHANT_ID => $merchant_id)); if (!$vip_info) { $res = array('status' => 0, 'msg' => '会员信息查询失败'); return $res; } // 查询等级 $Integral = D('VipIntegral'); $grade_info = $Integral->getFindGrade(array('merchantid' => $merchant_id, 'min_integral' => array('elt', $vip_info[$Vip::GRADE_INTEGRAL]))); $vip_grade = !empty($grade_info) ? $grade_info['id'] : 0; // 0 为无等级 // 次卡发放 $this->giveSubCard($merchant_id, $vip_info, $money, $vip_grade, $type, $source, $ro_id, $bill_id); // 卡包发放 $this->giveCardBag($merchant_id, $vip_info, $money, $vip_grade, $type, $source, $ro_id, $bill_id); // 返回值 $res = array('status' => 1, 'msg' => '发放成功'); return $res; } /** * 次卡发放 * @param int $merchantid 商户id * @param array $vip 会员 * @param float $money 充值金额 * @param int $vip_grad 等级 * @return bool */ protected function giveSubCard($merchant_id, $vip_info, $money, $vip_grade, $type, $source, $ro_id, $bill_id) { $time = time(); // 查询次卡 $map = array( 'merchantid' => $merchant_id, 'type' => $type, 'card_type' => 1, 'money' => array('elt', $money), '_string' => "end_time > {$time} AND surplus > 0 AND status = 0", ); // 判断来源 if ($source == 1) { $map['line_state'] = 1; } else { $map['online_state'] = 1; } $SubCard = D('SubCard'); $sub_card = $SubCard->toSelect($map, '', '', '*', 'money desc,addtime desc'); // 判断 if (empty($sub_card)) { $res = array('status' => 0, 'msg' => '暂无次卡赠送'); return $res; } $res = $this->vipGetSubCard($merchant_id, $vip_info, $sub_card, $vip_grade, $ro_id, 0, $bill_id); return $res; } /** * 会员添加次卡 * @param array $merchant_id * @param int $vip_info * @param int $sub_card * @param int $vip_grade * @param int $ro_id * @param int $po_id * @return array $res */ public function vipGetSubCard($merchant_id, $vip_info, $sub_card, $vip_grade = 0, $ro_id = 0, $po_id = 0, $bill_id = 0) { // 定义 $record = array( 'vip_id' => $vip_info['id'], 'merchantid' => $merchant_id, 'type' => 1, 'use_num' => 0, 'addtime' => time(), 'status' => 0, 'recharge_order_id' => $ro_id, 'pay_order_id' => $po_id, 'bill_id' => $bill_id, ); $start_time = strtotime(date('Y-m-d')); $VipCardModel = new RetailVipCardModel(); $SubCardModel = new SubCardModel(); // 处理次卡 $num = 0; foreach ($sub_card as $val) { // 判断类型 if ($val['type'] == 1 || $val['type'] == 2 || $val['type'] == 3) { // 判断等级 if ($val['gradeids'] && $val['gradeids'] != 0) { $gradeids = explode(',', $val['gradeids']); if (!in_array($vip_grade, $gradeids)) { continue; } } // 判断门店 if ($val['storeids'] && $val['storeids'] != 0) { $storeids = explode(',', $val['storeids']); if (!in_array($vip_info['storeid'], $storeids)) { continue; } } } // 判断类型 if ($val['type'] != 1) { // 判断赠送次数 $count = $VipCardModel->getCount(['vip_id' => $vip_info['id'], 'sub_card_id' => $val['id'], 'status' => 0]); // 会员以领取过该张次卡 if ($count && intval($count) > 0) { if (intval($count) >= intval($val['give_num'])) { // 该张次卡不可重复领取 continue; } } } //判断使用时间限制 switch ($val['effective_time_type']) { case '1': //固定时间使用 $record['start_time'] = $start_time; $record['end_time'] = $val['effective_end']; break; case '2': //领卡当日生效 $record['start_time'] = $start_time; $record['end_time'] = $start_time + $val['effective_day'] * 86400 - 1; break; case '3': //领卡次日生效 $record['start_time'] = $start_time + 86400; $record['end_time'] = $start_time + $val['effective_day'] * 86400 - 1; break; } $record['sub_card_id'] = $val['id']; // 赠送次卡 $vc_add = $VipCardModel->addOrder($record); // 赠送成功 减数量 if (!$vc_add) { // 该张次卡发放失败 continue; } else { // 减库存 $SubCardModel->toSetDec(array('id' => $val['id']), 'surplus'); ++$num; break; } } if ($num > 0) { $res = array('status' => 1, 'msg' => '发放成功'); } else { $res = array('status' => 0, 'msg' => '发放失败'); } return $res; } /** * 卡包发放 * @param array $merchant_id * @param int $vip_info * @param int $vip_grade * @param int $sub_card * @param int $ro_id * @return array $res */ protected function giveCardBag($merchant_id, $vip_info, $money, $vip_grade, $type, $source, $ro_id, $bill_id) { $CardBag = D('CardBag'); $time = time(); // 条件 $map = array( 'merchantid' => $merchant_id, 'type' => $type, 'money' => array('elt', $money), '_string' => "end_time > {$time} AND surplus > 0 AND status = 0", ); // 判断来源 if ($source == 1) { $map['line_state'] = 1; } else { $map['online_state'] = 1; } // 查询 $card_bag = $CardBag->toSelect($map, '', '', '*', 'money desc,addtime desc'); if (empty($card_bag)) { $res = array('status' => 0, 'msg' => '暂无卡包赠送'); return $res; } $res = $this->vipGetCardBag($merchant_id, $vip_info, $card_bag, $vip_grade, $ro_id, 0, $bill_id); return $res; } /** * 会员添加卡包次卡 * @param array $merchant_id * @param int $vip_info * @param int $sub_card * @param int $vip_grade * @param int $ro_id * @return array $res */ public function vipGetCardBag($merchant_id, $vip_info, $card_bag, $vip_grade = 0, $ro_id = 0, $po_id = 0, $bill_id = 0) { // 定义 $Vip = D('RetailVip'); $cr = array( 'vip_id' => $vip_info[$Vip::ID], 'merchantid' => $merchant_id, 'type' => 1, 'use_num' => 0, 'addtime' => time(), 'status' => 0, 'recharge_order_id' => $ro_id, 'pay_order_id' => $po_id, 'bill_id' => $bill_id, ); // 定义次卡查询条件 $map = array( 'merchantid' => $merchant_id, 'card_type' => 2, 'status' => 0, ); // 处理数据 $SubCard = D('SubCard'); $CardBag = D('CardBag'); $num = 0; foreach ($card_bag as &$val) { $cr['card_bag_id'] = $val['id']; // 判断类型 if ($val['type'] == 1 || $val['type'] == 2 || $val['type'] == 3) { // 判断门店 if ($val['storeids'] && $val['storeids'] != 0) { $storeids = explode(',', $val['storeids']); if (!in_array($vip_info['storeid'], $storeids)) { continue; } } // 判断等级 if ($val['gradeids'] && $val['gradeids'] != 0) { $gradeids = explode(',', $val['gradeids']); if (!in_array($vip_grade, $gradeids)) { continue; } } } // 查询次卡 $b_map = $map; $b_map['bag_id'] = $val['id']; $sub_card = $SubCard->toSelect($b_map); // 判断卡包次卡 if (empty($sub_card)) { // 暂无次卡发放 continue; } // 发放次卡 $s_num = $this->giveBagCard($sub_card, $cr, $val['give_num'], $val['type']); // 判断是否赠送成功 if ($s_num && intval($s_num) > 0) { // 减库存 $CardBag->toSetDec(array('id' => $val['id']), 'surplus'); ++$num; break; } else { // 卡包次卡发放失败 continue; } } if ($num > 0) { $res = array('status' => 1, 'msg' => '发放成功'); } else { $res = array('status' => 0, 'msg' => '发放失败'); } return $res; } /** * 添加卡包次卡 * */ protected function giveBagCard($sub_card, $record, $give_num, $type) { // 定义 $map = array( 'vip_id' => $record['vip_id'], 'merchantid' => $record['merchantid'], 'card_bag_id' => $record['card_bag_id'], 'status' => 0 ); $VipCardModel = new RetailVipCardModel(); $num = 0; $start_time = strtotime(date('Y-m-d')); foreach ($sub_card as $val) { // 判断类型 if ($type == 1 || $type == 2 || $type == 3) { // 判断赠送次数 $c_map = $map; $c_map['sub_card_id'] = $val['id']; $count = $VipCardModel->getCount($c_map); // 判断领取 if ($count && intval($count) > 0) { if (intval($count) >= intval($give_num)) { // 该卡包不可重复领取 break; } } } switch ($val['effective_time_type']) { case '1': //固定时间使用 $record['start_time'] = $start_time; $record['end_time'] = $val['effective_end']; break; case '2': //领卡当日生效 $record['start_time'] = $start_time; $record['end_time'] = $start_time + $val['effective_day'] * 86400 - 1; break; case '3': //领卡次日生效 $record['start_time'] = $start_time + 86400; $record['end_time'] = $start_time + $val['effective_day'] * 86400 - 1; break; } $record['type'] = 2; $record['sub_card_id'] = $val['id']; // 赠送次卡 $vc_add = $VipCardModel->addOrder($record); if ($vc_add) { ++$num; } } return $num; } }