ajaxReturn(['status' => 0, 'msg' => '请扫描/输入正确使用码']); } // 实例化模型 $RetailCardUseCodeModel = new RetailCardUseCodeModel(); // 判断使用码是否可用 $find_code = $RetailCardUseCodeModel->getFind(['use_code' => $use_code, 'merchantid' => self::$merchant_id]); if (!$find_code) { $this->ajaxReturn(['status' => 0, 'msg' => '请扫描正确的使用码']); } $time = time(); // 判断是否过期 if ($time > $find_code['end_time'] || $find_code['status'] == 1) { $this->ajaxReturn(['status' => 0, 'msg' => '使用码已过期,请用户刷新使用码']); } $RetailVipModel = new RetailVipModel(); // 判断会员 $vip_info = $RetailVipModel->getFind(['id' => $find_code['vip_id'], 'status' => 1]); if (!$vip_info) { $this->ajaxReturn(['status' => 0, 'msg' => '会员查询失败']); } $SubCardViewModel = new SubCardViewModel(); // 查询用户次卡 $map = [ 'VipCard.id' => $find_code['vip_card_id'], 'VipCard.merchantid' => self::$merchant_id, 'VipCard.vip_id' => $vip_info['id'], 'VipCard.status' => 0, 'VipCard.state' => 0, ]; $sub_card = $SubCardViewModel->toFind($map); if (!$sub_card) { $this->ajaxReturn(['status' => 0, 'msg' => '用户次卡查询失败']); } // 判断有效使用时间 if ($sub_card['effective_time_type'] == 1) { if (!$sub_card['effective_start'] || !$sub_card['effective_end'] || $sub_card['effective_start'] > time() || $sub_card['effective_end'] < time()) { $this->ajaxReturn(['status' => 0, 'msg' => '非有效的使用时间']); } } else if ($sub_card['effective_time_type'] == 2) { $sub_card['effective_start'] = $sub_card['addtime']; $sub_card['effective_end'] = $sub_card['effective_start'] + ($sub_card['effective_day'] * 86400); if ($sub_card['effective_start'] > time() || $sub_card['effective_end'] < time()) { $this->ajaxReturn(['status' => 0, 'msg' => '非有效的使用时间']); } } else if ($sub_card['effective_time_type'] == 3) { $sub_card['effective_start'] = $sub_card['addtime'] + 86400; $sub_card['effective_end'] = $sub_card['effective_start'] + ($sub_card['effective_day'] * 86400); if ($sub_card['effective_start'] > time() || $sub_card['effective_end'] < time()) { $this->ajaxReturn(['status' => 0, 'msg' => '非有效的使用时间']); } } // 判断类型 查询指定门店 if ($sub_card['card_type'] == 1 && $sub_card['sub_card_id']) { $SubCard = new SubCardModel(); $store_ids = $SubCard->toFindField(['id' => $sub_card['sub_card_id']], 'storeids'); } else if ($sub_card['card_type'] == 2 && $sub_card['card_bag_id']) { $CardBag = new CardBagModel(); $store_ids = $CardBag->toFindField(['id' => $sub_card['card_bag_id']], 'storeids'); } else { $this->ajaxReturn(['status' => 0, 'msg' => '未知的次卡类型']); } // 判断门店 if ($store_ids && ($store_ids != 0 || $store_ids != '0')) { $store_ids = explode(',', $store_ids); if (!in_array(self::$store_id, $store_ids)) { $this->ajaxReturn(['status' => 0, 'msg' => '该次卡无法在当前门店核销']); } } $RetailVipCardRecordModel = new RetailVipCardRecordModel(); $start_time = strtotime(date("Y-m-d") . ' 00:00:00'); // 今日开始时间 $end_time = strtotime(date("Y-m-d") . ' 23:59:59'); // 今日结束时间 $day_date = date('Y-m-d', $time); // 统计使用次数 $map1 = [ 'vip_id' => $vip_info['id'], 'merchantid' => self::$merchant_id, 'vip_card_id' => $find_code['vip_card_id'], 'addtime' => ['between', [$start_time, $end_time]] ]; $day_use_num = $RetailVipCardRecordModel->getCount($map1); // 判断次数 if ($sub_card['use_type'] == 1) { // 该次卡每天可用一次 if ($day_use_num >= 1) { $this->ajaxReturn(['status' => 0, 'msg' => '该次卡已达到使用上限']); } $frequency = round(($sub_card['effective_end'] - $sub_card['effective_start']) / 60 / 60 / 24); } else if ($sub_card['use_type'] == 2) { // 自定义使用次数 if (!$sub_card['frequency'] || !$sub_card['limit_num']) { $this->ajaxReturn(['status' => 0, 'msg' => '无效的次卡']); } if (intval($day_use_num) >= $sub_card['limit_num']) { $this->ajaxReturn(['status' => 0, 'msg' => '该次卡已达到使用上限']); } // 自定义使用判断总次数 $map2 = [ 'vip_id' => $vip_info['id'], 'merchantid' => self::$merchant_id, 'vip_card_id' => $find_code['vip_card_id'], ]; $all_num = $RetailVipCardRecordModel->getCount($map2); // 判断总次数 if (intval($all_num) >= $sub_card['frequency']) { $this->ajaxReturn(['status' => 0, 'msg' => '该次卡已使用完毕']); } $frequency = intval($sub_card['frequency']); } else if ($sub_card['use_type'] == 3) { if (!$sub_card['limit_num']) { $this->ajaxReturn(['status' => 0, 'msg' => '无效的次卡']); } $timeTwo = $time - ($sub_card['limit_num'] * 86400);//当前时间 - 天数时间 //查询符合条件的最后一条记录,添加时间倒序 $mapTwo = [ 'vip_id' => $vip_info['id'], 'merchantid' => self::$merchant_id, 'vip_card_id' => $find_code['vip_card_id'], 'addtime' => array('gt', $timeTwo), ]; $addtime = $RetailVipCardRecordModel->getOrderFindField($mapTwo, $field = 'addtime', $order = 'addtime desc'); if ($addtime) { $this->ajaxReturn(['status' => 0, 'msg' => '次卡尚未冷却']); } $frequency = ceil(($sub_card['effective_end'] - $sub_card['effective_start']) / 86400 / ($sub_card['limit_num'])); } $RetailVipCardModel = new RetailVipCardModel(); // 判断使用时段 $time_interval = explode(',', $sub_card['time_interval']); $day_start = strtotime($day_date . $time_interval[0]); $day_end = strtotime($day_date . $time_interval[1]); if ($time < $day_start || $time > $day_end) { $this->ajaxReturn(['status' => 0, 'msg' => '非使用时段,无法使用']); } // 增加使用次数 $set_result = $RetailVipCardModel->toSetInc(['id' => $find_code['vip_card_id']], 'use_num', 1); if (!$set_result) { $this->ajaxReturn(['status' => 1, 'msg' => '使用失败']); } // 判断剩余次数是否可以使用 $use_num = intval($sub_card['use_num'] + 1); if ($use_num >= $frequency) { $RetailVipCardModel->updateOrder(['id' => $find_code['vip_card_id']], ['state' => 1]); } // 修改使用码状态 $save_result = $RetailCardUseCodeModel->updateOrder(['id' => $find_code['id']], ['status' => 1]); if (!$save_result) { $this->ajaxReturn(['status' => 0, 'msg' => '使用成功,本次使用码未失效,请收银员注意避免重复使用']); } // 添加使用记录 $cr = [ 'merchantid' => self::$merchant_id, 'vip_id' => $vip_info['id'], 'vip_card_id' => $find_code['vip_card_id'], 'addtime' => $time, 'use_store_id' => self::$store_id, 'cashier_id' => self::$cashier_id, ]; $add_result = $RetailVipCardRecordModel->addOrder($cr); if ($add_result) { $res = ['status' => 1, 'msg' => '使用成功']; } else { $res = ['status' => 0, 'msg' => '使用成功,使用记录添加失败']; } $this->ajaxReturn($res); } /** * 用户次卡列表 * 2020年12月12日16:50:02 * @param phone 会员手机号 * @return array */ public function userCardList() { // 接收参数 $phone = I('post.phone'); $page = I('post.page') ? I('post.page') : 1; $limit = I('post.limit') ? I('post.limit') : 10; // 判断 if (!$page || !$limit || !verifyMobilePhone($phone)) { $this->ajaxReturn(['status' => 0, 'msg' => '参数错误']); } // 获取会员 $RetailVipModel = new RetailVipModel(); $vipInfo = $RetailVipModel->getFind(['mobile_phone' => $phone, 'merchantid' => self::$merchant_id], 'id,name,nickname,mobile_phone,headimgurl'); if (empty($vipInfo['id'])) { $this->ajaxReturn(['status' => 0, 'msg' => '请先绑定会员卡']); } if (!$vipInfo['name']) $vipInfo['name'] = '-'; if (!$vipInfo['nickname']) $vipInfo['nickname'] = '-'; // 查询 $SubCardApi = new \Api\Controller\SubCardController(); $res = $SubCardApi->userCardList(self::$merchant_id, $vipInfo['id'], $page, $limit); if (empty($res['card_list']) && $page == 1) { $this->ajaxReturn(['status' => 0, 'msg' => '用户暂无次卡']); } $res['vipInfo'] = $vipInfo; $this->ajaxReturn($res); } /** * 次卡核销 * 2020年12月12日10:50:03 * @param card_id 次卡id * @param vip_id 会员id * @param use_num 核销次数 * @param use_code 核销码 */ public function timeCardVerify() { $cardId = I('post.card_id'); if (empty($cardId)) { $this->ajaxReturn(['status' => 0, 'msg' => '请选择次卡']); } $vipId = I('post.vip_id'); $useNum = I('post.use_num'); $useCode = I('post.use_code'); if (empty($useNum)) { $this->ajaxReturn(['status' => 0, 'msg' => '请选择核销次数']); } $SubCardViewModel = new SubCardViewModel(); $RetailVipCardModel = new RetailVipCardModel(); $VipCardRecordModel = new RetailVipCardRecordModel(); $RetailCardUseCodeModel = new RetailCardUseCodeModel(); $time = time(); $MerchantConfigModel = new RetailMerchantConfigModel(); $use_sub_card_code = $MerchantConfigModel->getFindField(['merchant_id' => self::$merchant_id], 'use_sub_card_code'); //商户配置 //判断次卡的使用是否需要核销码 if ($use_sub_card_code == 1 || !$vipId) { // 判断使用码是否可用 $find_code = $RetailCardUseCodeModel->getFind(['use_code' => $useCode, 'merchantid' => self::$merchant_id, 'status' => 0]); if (!$find_code) { $this->ajaxReturn(['status' => 0, 'msg' => '请扫描/输入正确的核销码']); } // 判断是否过期 if ($time > $find_code['end_time'] || $find_code['status'] == 1) { $this->ajaxReturn(['status' => 0, 'msg' => '使用码已过期,请用户刷新使用码']); } // 核销码进入没有会员id if (!$vipId) { $RetailVipModel = new RetailVipModel(); // 判断会员 $vip_info = $RetailVipModel->getFind(['id' => $find_code['vip_id'], 'status' => 1]); if (!$vip_info) { $this->ajaxReturn(['status' => 0, 'msg' => '会员查询失败']); } $vipId = $vip_info['id']; } } // 查询用户次卡 $map = [ 'VipCard.id' => $cardId, 'VipCard.merchantid' => self::$merchant_id, 'VipCard.vip_id' => $vipId, 'VipCard.status' => 0, 'VipCard.state' => 0, 'VipCard.start_time' => ['elt', $time], 'VipCard.end_time' => ['egt', $time], ]; $sub_card = $SubCardViewModel->toFind($map); if (!$sub_card) { $this->ajaxReturn(['status' => 0, 'msg' => '用户次卡查询失败']); } // 判断类型 查询指定门店 if ($sub_card['card_type'] == 1 && $sub_card['sub_card_id']) { $SubCard = new SubCardModel(); $store_ids = $SubCard->toFindField(['id' => $sub_card['sub_card_id']], 'storeids'); } else if ($sub_card['card_type'] == 2 && $sub_card['card_bag_id']) { $CardBag = new CardBagModel(); $store_ids = $CardBag->toFindField(['id' => $sub_card['card_bag_id']], 'storeids'); } else { $this->ajaxReturn(['status' => 0, 'msg' => '未知的次卡类型']); } // 判断门店 if ($store_ids && ($store_ids != 0 || $store_ids != '0')) { $store_ids = explode(',', $store_ids); if (!in_array(self::$store_id, $store_ids)) { $this->ajaxReturn(['status' => 0, 'msg' => '次卡无法在当前门店核销']); } } $start_time = strtotime(date("Y-m-d") . ' 00:00:00'); // 今日开始时间 $end_time = strtotime(date("Y-m-d") . ' 23:59:59'); // 今日结束时间 $day_date = date('Y-m-d', $time); // 判断使用时段 $time_interval = explode(',', $sub_card['time_interval']); $day_start = strtotime($day_date . $time_interval[0]); $day_end = strtotime($day_date . $time_interval[1]); if ($time < $day_start || $time > $day_end) { $this->ajaxReturn(['status' => 0, 'msg' => '非使用时段,无法使用']); } // 统计使用次数 $useMap = [ 'vip_id' => $vipId, 'merchantid' => self::$merchant_id, 'vip_card_id' => $cardId, 'addtime' => ['between', [$start_time, $end_time]], ]; // 判断次数 $less_num = 0;//该次卡的剩余使用次数 switch ($sub_card['use_type']) { case '1': // 每天可用一次 $day_use_num = $VipCardRecordModel->getCount($useMap); if ($day_use_num >= 1) { $this->ajaxReturn(['status' => 0, 'msg' => '该次卡已达到使用上限']); } $less_num = ceil(($sub_card['end_time'] - $sub_card['start_time']) / 86400); break; case '2': //自定义使用次数 $day_use_num = $VipCardRecordModel->getCount($useMap); if (intval($day_use_num) >= $sub_card['limit_num']) { $this->ajaxReturn(['status' => 0, 'msg' => '该次卡已达到使用上限']); } if (bcadd($sub_card['use_num'], $useNum, 0) > $sub_card['frequency']) { $this->ajaxReturn(['status' => 0, 'msg' => '超出次卡使用上限']); } $less_num = bcsub($sub_card['frequency'], bcadd($sub_card['use_num'], $useNum, 0), 0); break; case '3': //几天可使用一次 if ($useNum > 1) { $this->ajaxReturn(['status' => 0, 'msg' => '超出次卡使用上限']); } unset($useMap['addtime']); $pre_use_time = $VipCardRecordModel->getOrderFindField($useMap, 'addtime', 'id desc'); $pre_use_start_time = strtotime(date('Y-m-d', $pre_use_time));//15 00:00:00 $min_pre_use_start_time = $start_time - ($sub_card['limit_num'] * 86400);//18 00:00:00 - 3*86400 = 15 00:00:00 if (empty($pre_use_time) || $pre_use_start_time <= $min_pre_use_start_time) { $less_num = ceil(($sub_card['end_time'] - ($start_time + 86400)) / 86400 / ($sub_card['limit_num'])); } else { $this->ajaxReturn(['status' => 0, 'msg' => '次卡尚未冷却']); } break; } // 增加已使用次数 $set_result = $RetailVipCardModel->toSetInc(['id' => $cardId], 'use_num', $useNum); if (!$set_result) { $this->ajaxReturn(['status' => 1, 'msg' => '使用失败']); } // 判断剩余次数是否可以使用 if ($less_num <= 0) { $RetailVipCardModel->updateOrder(['id' => $cardId], ['state' => 1]); } // 添加使用记录 for ($i = 0; $i < $useNum; $i++) { $cr = [ 'vip_id' => $vipId, 'addtime' => $time, 'merchantid' => self::$merchant_id, 'cashier_id' => self::$cashier_id, 'vip_card_id' => $cardId, 'use_store_id' => self::$store_id, ]; $VipCardRecordModel->addOrder($cr); } if ($use_sub_card_code == 1 || !$vipId) { // 作废核销码 $RetailCardUseCodeModel->updateOrder(['id' => $find_code['id']], ['status' => 1]); } $this->ajaxReturn(['status' => 1, 'msg' => '次卡核销成功']); } /** * 根据核销码获取对应次卡 */ public function getCardInfo() { // 接受数据 $use_code = I('post.use_code'); if (!$use_code || !verifyNumber($use_code)) { $this->ajaxReturn(['status' => 0, 'msg' => '请扫描/输入正确使用码']); } // 实例化模型 $RetailVipModel = new RetailVipModel(); $RetailCardUseCodeModel = new RetailCardUseCodeModel(); // 判断使用码是否可用 $find_code = $RetailCardUseCodeModel->getFind(['use_code' => $use_code, 'merchantid' => self::$merchant_id, 'status' => 0]); if (!$find_code) { $this->ajaxReturn(['status' => 0, 'msg' => '请扫描/输入正确的核销码']); } $time = time(); // 判断是否过期 if ($time > $find_code['end_time'] || $find_code['status'] == 1) { $this->ajaxReturn(['status' => 0, 'msg' => '使用码已过期,请用户刷新使用码']); } // 判断会员 $vip_id = $RetailVipModel->getFindField(['id' => $find_code['vip_id'], 'status' => 1], 'id'); if (!$vip_id) { $this->ajaxReturn(['status' => 0, 'msg' => '会员查询失败']); } $page = 1; $limit = 10; $SubCardApi = new \Api\Controller\SubCardController(); $result = $SubCardApi->userCardList(self::$merchant_id, $vip_id, $page, $limit, $find_code['vip_card_id']); $this->ajaxReturn($result); } }