$v) { $use_num = $v['use_num']; $total_num = $v['total_num']; $temp_use_num = $v['temp_use_num']; if ($card_right_goods_type != 'all') { if (($use_num + $temp_use_num) > $total_num) { return $this->error([], '使用次数超出可使用次数'); } } else { if ($temp_use_num > $card_right_goods_count) { return $this->error([], '使用次数超出可使用次数'); } } $item_condition = array( ['id', '=', $v['id']] ); model('giftcard_card_goods')->setInc($item_condition, 'use_num', $temp_use_num); model('giftcard_card')->setInc($condition, 'use_count', $temp_use_num);//卡整体使用次数 $card_right_goods_count -= $temp_use_num; } //写入使用记录 $card_use_records_model = new CardUse(); $result = $card_use_records_model->addCardUseRecords($params); $records_id = $result['data']; //核验礼品卡还是否存在可使用次数 if ($card_right_goods_type != 'all') { $surplus_num = model('giftcard_card_goods')->getSum($condition, Db::raw('(total_num - use_num)')); } else { $card_model = new Card(); $card_info = $card_model->getCardInfo($condition)['data'] ?? []; $surplus_num = $card_info['card_right_goods_count'] - $card_info['use_count']; } (new CardLog())->add([ 'card_id' => $card_id, 'type_id' => $records_id, 'type' => 'use', 'operator_type' => 'member',//todo 暂时是确定的 'operator' => $params['member_id'], ]); if ($surplus_num == 0) { //使用 $this->used($params); } return $this->success(); } /** * 储值礼品卡使用 * @param $params */ public function cardUse($params) { $member_id = $params['member_id'] ?? 0; $site_id = $params['site_id'] ?? 0; $member_card_id = $params['member_card_id']; $order_id = $params['order_id'] ?? 0; $member_card_model = new MemberCard(); $member_card_condition = array( ['member_card_id', '=', $member_card_id], ['member_id', '=', $member_id], ['is_transfer', '=', 0] ); if ($site_id > 0) { $member_card_condition[] = ['site_id', '=', $site_id]; } $member_card_info = $member_card_model->getMemberCardInfo($member_card_condition)['data'] ?? []; if (empty($member_card_info)) return $this->error([], '礼品卡不存在或已转赠'); $member_id = $member_card_info['member_id']; $card_id = $member_card_info['card_id']; $card_model = new Card(); $card_condition = array( ['card_id', '=', $card_id], ); $card_info = $card_model->getCardInfo($card_condition)['data'] ?? []; if (empty($card_info)) return $this->error([], '礼品卡不存在或已转赠'); $card_info['use_order_id'] = $order_id; $status = $card_info['status']; //todo 加入队列概念,队列 if ($status != 'to_use') return $this->error([], '当前礼品卡不可以使用'); $site_id = $member_card_info['site_id']; $card_right_type = $card_info['card_right_type']; if($card_right_type == 'balance'){ $card_goods_list = $card_model->getCardGoodsList($card_condition)['data'] ?? []; foreach ($card_goods_list as $k => $v) { $card_goods_list[$k]['temp_use_num'] = $v['total_num']; } }else{ $card_goods_array = $params['card_goods_json'];//[{'card_goods_id':15,'order_goods_id':1, 'num': 2}] if(empty($card_goods_array)) return $this->error([], '礼品卡使用参数有误'); $card_goods_ids = array_column($card_goods_array, 'card_goods_id'); $card_goods_column = array_column($card_goods_array, null, 'card_goods_id'); $temp_card_condition = $card_condition; $temp_card_condition[] = ['id', 'in', $card_goods_ids]; $card_goods_list = $card_model->getCardGoodsList($temp_card_condition)['data'] ?? []; foreach ($card_goods_list as $k => $v) { $item_column = $card_goods_column[$v['id']]; $card_goods_list[$k]['temp_use_num'] = $item_column['num']; $card_goods_list[$k]['use_order_goods_id'] = $item_column['order_goods_id']; } } model('giftcard_card')->startTrans(); try { $user_params = array_merge($member_card_info, $card_info); $user_params['goods_list'] = $card_goods_list; $result = $this->cardUseOperation($user_params); if($result['code'] < 0){ model('giftcard_card')->rollback(); return $result; } $result = $this->balanceCardUse($user_params); if($result['code'] < 0){ model('giftcard_card')->rollback(); return $result; } model('giftcard_card')->commit(); return $this->success(); } catch ( \Exception $e ) { model('giftcard_card')->rollback(); return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine()); } } /** * 礼品卡兑换 * @param $params * @return array */ public function balanceCardUse($params){ $card_goods_list = $params['goods_list']; //将余额给会员 $member_account_model = new MemberAccount(); foreach ($card_goods_list as $k => $v) { $item_balance = $v['total_balance'];//总的余额 if ($item_balance > 0) { $member_account_model->addMemberAccount($params['site_id'], $params['member_id'], 'balance', $item_balance, 'giftcard', '会员升级得红包' . $item_balance, '储值礼品卡兑换'); } $card_goods_list[$k]['temp_use_num'] = $v['total_num']; } return $this->success(); } public function cardExpire($params){ $site_id = $params['site_id'] ?? 0; $card_ids = $params['card_ids']; $condition = array( ['card_id', 'in', $card_ids], ['status', 'in', ['to_activate', 'to_use']]//暂时认为只有待使用和待激活的卡项会过期 ); if($site_id > 0){ $condition[] = ['site_id', '=', $site_id]; } $card_model = new Card(); $list = $card_model->getCardList($condition)['data'] ?? []; if(empty($list)) return $this->error(); $data = array( 'status' => 'expire' ); model('giftcard_card')->update($data, $condition); $this->cardExpireOperation($list); return $this->success(); } /** * 卡过期后续任务 * @param $list * @return array */ public function cardExpireOperation($list){ $card_log_model = new CardLog(); foreach($list as $k => $v){ //将贺卡全部作废 $card_blessing_condition = array( ['card_id', '=', $v['card_id']], ['status', '=', 0] ); model('giftcard_card_blessing')->update(['status' => 1], $card_blessing_condition); $card_log_model->add([ 'card_id' => $v['card_id'], 'type' => 'expire', 'operator_type' => 'system',//todo 暂时是确定的 ]); } return $this->success(); } /** * 卡使用 * @param $params */ public function used($params){ $condition = array( ['card_id', '=', $params['card_id']] ); $data = array( 'status' => 'used', 'use_time' => time(), ); model('giftcard_card')->update($data, $condition); //数据统计 (new CardStat())->stat(array_merge($params, ['stat_type' => 'use'])); (new CardLog())->add([ 'card_id' => $params['card_id'], 'type' => 'used', 'operator_type' => 'member',//todo 暂时是确定的 'operator' => $params['member_id'], ]); return $this->success(); } /** * 批量作废 * @param $params * @return array */ public function cardInvalid($params){ $site_id = $params['site_id'] ?? 0; $card_import_id = $params['card_import_id'] ?? 0; $card_id = $params['card_id'] ?? 0; $condition = [ ['status', '=', 'to_activate'] ]; if($site_id > 0){ $condition[] = ['site_id', '=', $site_id]; } if($card_import_id > 0){ $condition[] = ['card_import_id', '=', $card_import_id]; } if($card_id > 0){ $condition[] = ['card_id', '=', $card_id]; } $data = array( 'status' => 'invalid', 'invalid_time' => time(), ); $card_model = new Card(); $list = $card_model->getCardList($condition)['data'] ?? []; if(empty($list)) return $this->error(); model('giftcard_card')->update($data, $condition); $params['list'] = $list; //作废后的操作 $this->cardInvalidOperation($params); return $this->success(); } /** * 作废后操作 * @param $params * @return array */ public function cardInvalidOperation($params){ $list = $params['list']; $card_log_model = new CardLog(); foreach($list as $k => $v){ //添加日志 $card_log_model->add([ 'card_id' => $v['card_id'], 'type' => 'used', 'operator_type' => 'member',//todo 暂时是确定的 'operator_data' => $params['operator_data'], ]); } (new CardStat())->stat(array_merge($params, ['stat_type' => 'invalid','num' => count($list)])); return $this->success(); } }