model = new CardMain(); } public function select(Request $request): Response { [$where, $format, $limit, $field, $order] = $this->selectInput($request); $order = $request->get('order', 'desc'); $field = $field ?? 'card_main_addtimes'; if (!empty($where['card_main_name'])) { $where['card_main_name'] = ['like', $where['card_main_name']]; } if (!empty($where['card_main_addtimes'])) { $where['card_main_addtimes'][0] = strtotime($where['card_main_addtimes'][0]); $where['card_main_addtimes'][1] = strtotime($where['card_main_addtimes'][1]); } $query = $this->doSelect($where, $field, $order); return $this->doFormat($query, $format, $limit); } /** * 指定查询where条件,并没有真正的查询数据库操作 * @param array $where * @param string|null $field * @param string $order * @return EloquentBuilder|QueryBuilder|Model */ protected function doSelect(array $where, string $field = null, string $order = 'desc') { $model = $this->model->with('category'); foreach ($where as $column => $value) { if (is_array($value)) { if ($value[0] === 'like' || $value[0] === 'not like') { $model = $model->where($column, $value[0], "%$value[1]%"); } elseif (in_array($value[0], ['>', '=', '<', '<>'])) { $model = $model->where($column, $value[0], $value[1]); } elseif ($value[0] == 'in' && !empty($value[1])) { $valArr = $value[1]; if (is_string($value[1])) { $valArr = explode(",", trim($value[1])); } $model = $model->whereIn($column, $valArr); } elseif ($value[0] == 'not in' && !empty($value[1])) { $valArr = $value[1]; if (is_string($value[1])) { $valArr = explode(",", trim($value[1])); } $model = $model->whereNotIn($column, $valArr); } elseif ($value[0] == 'null') { $model = $model->whereNull($column); } elseif ($value[0] == 'not null') { $model = $model->whereNotNull($column); } elseif ($value[0] !== '' || $value[1] !== '') { $model = $model->whereBetween($column, $value); } } else { $model = $model->where($column, $value); } } if ($field) { $model = $model->orderBy($field, $order); } return $model; } /** * @Desc 查询后处理 * @Author Gorden * @Date 2024/11/15 8:35 * * @param $items * @return mixed */ public function afterQuery($items) { foreach ($items as &$item) { if ($item['card_main_valid_mode'] == 'DAYS') { $item['valid_term'] = $item['card_main_valid_days'] ? $item['card_main_valid_days'] . '天' : 0; } elseif ($item['card_main_valid_mode'] == 'LONG') { $item['valid_term'] = '长期有效'; } elseif ($item['card_main_valid_mode'] == 'DATE') { $item['valid_term'] = date('Y/m/d H:i:s', strtotime($item['card_main_valid_begin'])) . '-' . date('Y/m/d H:i:s', strtotime($item['card_main_valid_end'])); } } return $items; } /** * @Desc 卡的下拉搜索 * @Author Gorden * @Date 2024/11/18 9:51 * * @return Response */ public function selectList() { $cardMain = CardMain::where('card_main_status', 'ACTIVED') ->orderBy('card_main_addtimes', 'DESC') ->select('card_main_id', 'card_main_name') ->get() ->toArray(); return json_success('success', $cardMain); } /** * @Desc 储值卡详情 * @Author Gorden * @Date 2024/11/15 11:33 * * @param Request $request * @return Response */ public function info(Request $request): Response { $cardMainId = $request->get('card_main_id'); if (!$cardMainId) { return json_fail('参数异常'); } // 发行记录 $cardIssue = CardIssue::where('join_issue_card_main_id', $cardMainId)->orderBy('card_issue_addtimes', 'DESC')->get()->toArray(); // 发行统计 $cardTotal = Card::where('join_card_main_id', $cardMainId)->count(); $cardInitTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'INIT')->count(); $cardWaitingTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'WAITING')->count(); $cardPendingTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'PENDING')->count(); $cardUsedTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'USED')->count(); $cardDoneTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'DONE')->count(); $cardExpiredTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'EXPIRED')->count(); $cardPausedTotal = Card::where('join_card_main_id', $cardMainId)->where('card_status', 'PAUSED')->count(); $statistics = [ [ 'total' => $cardTotal, 'initTotal' => $cardInitTotal, 'waitingTotal' => $cardWaitingTotal, 'pendingTotal' => $cardPendingTotal, 'usedTotal' => $cardUsedTotal, 'doneTotal' => $cardDoneTotal, 'expiredTotal' => $cardExpiredTotal, 'pausedTotal' => $cardPausedTotal ] ]; $data = [ 'issue' => $cardIssue, 'statistics' => $statistics ]; return json_success('', $data); } /** * @Desc 插入前置方法 * @Author Gorden * @Date 2024/11/14 14:29 * * @param Request $request * @return array * @throws BusinessException */ public function insertInput(Request $request): array { $params = $request->post(); $data = $this->inputFilter($request->post()); if ($data['card_main_valid_mode'] == 'DATE') { $data['card_main_valid_begin'] = date('Y-m-d 00:00:00', strtotime($data['card_main_valid_begin'])); $data['card_main_valid_end'] = date('Y-m-d 23:59:59', strtotime($data['card_main_valid_end'])); $data['card_main_valid_days'] = 0; } elseif ($data['card_main_valid_mode'] == 'LONG' || $data['card_main_valid_mode'] == 'DAYS') { $data['card_main_valid_begin'] = ''; $data['card_main_valid_end'] = ''; } $cardMainJson = [ 'desc' => $params['card_main_desc'] ?? [], 'is_recharge' => $params['is_recharge'] ?? 'N', 'issue' => $params['issue'] ?? 'BATCH', 'demand_config' => [] ]; if ($params['issue'] == 'DEMAND') { $cardMainJson['demand_config'] = [ 'length' => $params['card_length'], 'begin' => $params['card_begin'], 'end' => $params['card_end'], 'prefix' => $params['card_prefix'], 'suffix' => $params['card_suffix'], 'rand' => $params['card_rand'], 'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING', ]; } $data['card_main_json'] = json_encode($cardMainJson); return $data; } /** * 更新前置方法 * @param Request $request * @return array * @throws BusinessException */ protected function updateInput(Request $request): array { $params = $request->post(); $primary_key = $this->model->getKeyName(); $id = $request->post($primary_key); $data = $this->inputFilter($request->post()); $model = $this->model->find($id); if (!$model) { throw new BusinessException('记录不存在', 2); } if ($data['card_main_valid_mode'] == 'DATE') { $data['card_main_valid_begin'] = date('Y-m-d 00:00:00', strtotime($data['card_main_valid_begin'])); $data['card_main_valid_end'] = date('Y-m-d 23:59:59', strtotime($data['card_main_valid_end'])); $data['card_main_valid_days'] = 0; } elseif ($data['card_main_valid_mode'] == 'LONG' || $data['card_main_valid_mode'] == 'DAYS') { $data['card_main_valid_begin'] = ''; $data['card_main_valid_end'] = ''; } $cardMainJson = []; if (!empty($model->card_main_json)) { $cardMainJson = json_decode($model->card_main_json, true); } $cardMainJson['desc'] = $params['card_main_desc'] ?? []; if (!empty($params['is_recharge'])) { $cardMainJson['is_recharge'] = $params['is_recharge']; } if (!empty($params['issue'])) { $cardMainJson['issue'] = $params['issue']; } if ($cardMainJson['issue'] == 'BATCH') { $cardMainJson['demand_config'] = []; } elseif ($cardMainJson['issue'] == 'DEMAND') { $cardMainJson['demand_config'] = [ 'length' => $params['card_length'], 'begin' => $params['card_begin'], 'end' => $params['card_end'], 'prefix' => $params['card_prefix'], 'suffix' => $params['card_suffix'], 'rand' => $params['card_rand'], 'rand_varchar' => is_numeric($params['card_rand']) ? 'NUMBER' : 'STRING', ]; } $data['card_main_json'] = json_encode($cardMainJson); // 卡状态设置为禁用,则未绑定的卡冻结,恢复未发行状态 if ($data['card_main_status'] == 'DISABLED' && $model->card_main_status != 'DISABLED') { Card::where('join_card_main_id', $id)->where('join_card_member_id', '')->update(['card_status' => 'PAUSED', 'is_issue' => 'N']); // 记录日志 _syslog("储值卡", "禁用"); } elseif ($data['card_main_status'] == 'ACTIVED' && $model->card_main_status == 'DISABLED') { Card::where('join_card_main_id', $id)->where('join_card_member_id', '') ->where('card_status', 'PAUSED') ->update(['card_status' => 'INIT']); // 记录日志 _syslog("储值卡", "重新启用"); } unset($data[$primary_key]); return [$id, $data]; } /** * @Desc 删除储值卡 * @Author Gorden * @Date 2024/11/18 16:33 * * @param Request $request * @return Response * @throws BusinessException */ public function delete(Request $request): Response { $ids = $this->deleteInput($request); Db::beginTransaction(); try { if (Card::whereIn('join_card_main_id', $ids)->where(function ($query) { $query->where('card_status', '<>', 'INIT') ->orWhere('join_card_dept_id', '<>', '') ->orWhere('join_card_member_id', '<>', ''); })->exists()) { return json_fail("存在已发行、已分配的卡,无法删除!"); } $this->doDelete($ids); // 同时删除批次记录 CardIssue::whereIn('join_issue_card_main_id',$ids)->delete(); // 同时删除卡记录 Card::whereIn('join_card_main_id', $ids)->delete(); Db::commit(); _syslog("储值卡", '删除成功'); return json_success('success'); } catch (\Exception $e) { Db::rollBack(); _syslog("储值次", '删除失败'); Log::error("储值卡删除失败", ['msg' => $e->getMessage()]); return json_fail("删除失败"); } } /** * @Desc 储值卡发行 * @Author Gorden * @Date 2024/11/15 13:56 * * @param Request $request * @return Response|void */ // public function issue(Request $request) // { // $params = $request->post(); // // Db::beginTransaction(); // try { // $cardIds = []; // // 创建卡号 // for ($i = 0; $i < intval($params['card_issue_num']); $i++) { // $prefixLength = strlen($params['card_issue_serial_prefix']); // $suffixLength = strlen($params['card_issue_serial_suffix']); // $cardIds[] = $params['card_issue_serial_prefix'] . str_pad($params['card_issue_serial_begin'] + $i, $params['card_issue_serial_length'] - $prefixLength - $suffixLength, '0', STR_PAD_LEFT) . $params['card_issue_serial_suffix']; // // } // // // 写入发行表 // $issueId = CardIssue::insertGetId([ // 'join_issue_card_main_id' => $params['join_issue_card_main_id'], // 'card_issue_name' => $params['card_issue_name'], // 'card_issue_num' => $params['card_issue_num'], // 'card_issue_datetime' => date('Y-m-d H:i:s'), // 'card_issue_serial_length' => $params['card_issue_serial_length'], // 'card_issue_serial_prefix' => $params['card_issue_serial_prefix'], // 'card_issue_serial_suffix' => $params['card_issue_serial_suffix'], // 'card_issue_serial_begin' => $params['card_issue_serial_begin'], // 'card_issue_serial_end' => $params['card_issue_serial_end'], // 'card_issue_serial_fill' => $params['card_issue_serial_fill'] ?? 0, // 'card_issue_begin_nbr' => $cardIds[0], // 'card_issue_end_nbr' => $cardIds[count($cardIds) - 1], // 'card_issue_creator_user_id' => JwtToken::getCurrentId(), // 'card_issue_addtimes' => time() // ]); // // 分批入库 // $cardsCollect = collect($cardIds); // $chunks = $cardsCollect->chunk(200); // foreach ($chunks as $chunk) { // $insertData = []; // foreach ($chunk as $key => $item) { // $insertData[$key] = [ // 'card_id' => $item, // 'join_card_main_id' => $params['join_issue_card_main_id'], // 'join_card_issue_id' => $issueId, // 'card_status' => 'INIT', // 'card_cdkey' => random_string(8, 'number'), // 'card_addtimes' => time() // ]; // } // // Card::insert($insertData); // } // // Db::commit(); // _syslog("储值卡", '发行成功', false, $request->all()); // return json_success('success'); // } catch (\Exception $e) { // Db::rollBack(); // _syslog("储值卡", '发行失败', false, $request->all()); // Log::error("储值卡发行失败", ['msg' => $e->getMessage()]); // // return json_fail("储值卡发行失败"); // } // } }