getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '市场类型无效'); } if (empty($param['page']) || !is_numeric($param['page']) || empty($param['limit']) || !is_numeric($param['limit'])) { return $this->toData('1', '分页参数错误'); } $userId = 0; $where = []; $stockTypeList = $this->getStockTape($market_type); // 用户号精确搜索 if (!empty($param['user_no'])) { $user = UserModel::where('user_no', $param['user_no'])->find(); if (empty($user)) { return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => [ 'tape_list' => $stockTypeList['tape'], 'stock_type_list' => $stockTypeList['type'], 'symbol' => $table_obj['stock_id']]]); } $userId = $user['user_id']; } // 判断是否是代理 如果是代理 只能看他自己管理的用户 $whereU = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId); if (!is_array($whereU)) { return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => [ 'tape_list' => $stockTypeList['tape'], 'stock_type_list' => $stockTypeList['type'], 'symbol' => $table_obj['stock_id']]]); } // 未删除 $where[] = [ 'is_delete', '=', 1 ]; // 股票号 if (!empty($param['stock_code']) && is_string($param['stock_code'])) { $where[] = [ 'stock_code', 'like', '%' . $param['stock_code'] ]; } // 状态 if (!empty($param['status']) && in_array($param['status'], [1, 2])) { $where[] = [ 'status', '=', $param['status'] ]; } // 上市状态 1 待申购 2 (申购中)待中签 3 (申购结束)待中签 4 待上市 5 已上市 $query = Db::table($table_obj['stock_table'])->where($where)->where($whereU); $totalQuery = Db::table($table_obj['stock_table'])->where($where)->where($whereU); if (!empty($param['open_status']) && in_array($param['open_status'], ['1', '2', '3', '4'])) { switch ($param['open_status']) { case '1': $query = $query->whereTime('start_time', '>', date('Y-m-d H:i:s')); $totalQuery = $totalQuery->whereTime('start_time', '>', date('Y-m-d H:i:s')); break; case '2': $query = $query->whereTime('start_time', '<=', date('Y-m-d H:i:s'))->whereTime('end_time', '>=', date('Y-m-d H:i:s')); $totalQuery = $totalQuery->whereTime('start_time', '<=', date('Y-m-d H:i:s'))->whereTime('end_time', '>=', date('Y-m-d H:i:s')); break; case '3': $query = $query->whereTime('end_time', '<=', date('Y-m-d H:i:s'))->whereTime('get_time', '>', date('Y-m-d H:i:s')); $totalQuery = $totalQuery->whereTime('end_time', '<=', date('Y-m-d H:i:s'))->whereTime('get_time', '>', date('Y-m-d H:i:s')); break; case '4': $query = $query->where('open_status', 1)->whereTime('get_time', '<', date('Y-m-d H:i:s')); $totalQuery = $totalQuery->where('open_status', 2); break; case '5': $query = $query->where('open_status', 2); $totalQuery = $totalQuery->where('open_status', 2); break; } } $list = $query->order('id', 'desc')->page($param['page'], $param['limit'])->select(); $total = $totalQuery->order('id', 'desc')->count(); $rows = []; if (!$list->isEmpty()) { $rows = $list->toArray(); foreach ($rows as $key => $item) { $open_status_name = '-'; if (strtotime($item['start_time']) > time()) { $open_status_name = '待申购'; $re_status = 1; } if (strtotime($item['start_time']) <= time() && strtotime($item['end_time']) >= time()) { $open_status_name = '待中签(申购中)'; $re_status = 2; } if (strtotime($item['end_time']) < time()) { $open_status_name = '待中签(申购结束)'; $re_status = 3; } if ($item['sign_status'] == 1) { $open_status_name = '待上市(已中签)'; $re_status = 4; } if ($item['open_status'] == 2) { $open_status_name = '已上市'; $re_status = 5; } $rows[$key]['open_status_name'] = $open_status_name; $rows[$key]['re_status'] = $re_status; if (strpos($item['stock_code'], ':') !== false) { $rows[$key]['stock_code'] = explode(':', $item['stock_code'])[1]; } } } return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => $total, 'extend' => [ 'tape_list' => $stockTypeList['tape'], 'stock_type_list' => $stockTypeList['type'], 'symbol' => $table_obj['stock_id'], 're_status_list' => ['1' => '待申购', '2' => '待中签(申购中)', '3' => '待中签(申购结束)', '4' => '待上市(已中签)', '5' => '已上市'] ]]); } catch (\Exception $exception) { return $this->toData('1', '系统繁忙', [$exception->getMessage(), $exception->getTrace()]); } } /** * 添加IPO */ public function addStockIPO($market_type, $param) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '市场类型无效'); } // 股票代码 if (empty($param['stock_code']) || !is_string($param['stock_code']) || !preg_match('/^[a-zA-Z0-9]+$/', $param['stock_code'])) { return $this->toData('1', '股票代码 无效'); } // 股票名称 if (empty($param['stock_name']) || !is_string($param['stock_name'])) { return $this->toData('1', '股票名称 无效'); } if ($market_type == 5) { if (empty($param['numeric_code']) || !preg_match('/^[a-zA-Z0-9]+$/', $param['numeric_code'])) { return $this->toData('1', '数字编码 无效'); } } $stockTypeList = $this->getStockTape($market_type); // 股票类型 if (empty($param['stock_type']) || !in_array($param['stock_type'], array_keys($stockTypeList['type']))) { return $this->toData('1', '股票类型 无效'); } // 交易所类型 if (empty($param['tape']) || !in_array($param['tape'], array_keys($stockTypeList['tape']))) { return $this->toData('1', '交易所类型 无效'); } // 发布状态 if (empty($param['status']) || !in_array($param['status'], [1, 2])) { return $this->toData('1', '发布状态 无效'); } // 单股价格 if (empty($param['price']) || !is_numeric($param['price']) || $param['price'] <= 0) { return $this->toData('1', '单股价格 无效'); } // 最小申购数量 if (empty($param['min']) || !is_numeric($param['min']) || $param['min'] <= 0 || ceil($param['min']) != $param['min']) { return $this->toData('1', '最小申购数量 无效'); } // 发行总数 if (empty($param['total']) || !is_numeric($param['total']) || $param['total'] <= 0 || ceil($param['total']) != $param['total']) { return $this->toData('1', '发行总数 无效'); } // 中签率 两位小数 if (empty($param['rate']) || !is_numeric($param['rate']) || is_float($param['rate']) || $param['rate'] < 0 || $param['rate'] > 100) { return $this->toData('1', '中签率无效;范围 0 - 100 , 必须是整数'); } // 开始认购时间 if (empty($param['start_time']) || !is_string($param['start_time'])) { return $this->toData('1', '开始认购时间 无效'); } // 认购结束时间 if (empty($param['end_time']) || !is_string($param['end_time'])) { return $this->toData('1', '认购结束时间 无效'); } // 中签时间 if (empty($param['get_time']) || !is_string($param['get_time'])) { return $this->toData('1', '中签时间 无效'); } // 上市时间 if (empty($param['open_time']) || !is_string($param['open_time'])) { return $this->toData('1', '上市时间 无效'); } // 公司注册资本 $companyRegAmount = ""; if (!empty($param['company_reg_amount']) && is_string($param['company_reg_amount'])) { $companyRegAmount = $param['company_reg_amount']; } // 公司上市时间 if (empty($param['company_open_time']) || !is_string($param['company_open_time'])) { return $this->toData('1', '公司上市时间 无效'); } // 公司简介 if (empty($param['company_info']) || !is_string($param['company_info'])) { return $this->toData('1', '公司简介 无效'); } // 股票logo if (empty($param['logo']) || !is_string($param['logo'])) { return $this->toData('1', '股票logo 无效'); } // 上市时间 要大于 中签时间 中签时间要大于 认购结结束时间 if (strtotime($param['open_time']) <= strtotime($param['get_time']) || strtotime($param['get_time']) <= strtotime($param['end_time'])) { return $this->toData('1', '上市时间 要大于 中签时间 中签时间要大于 认购结结束时间'); } // 是否后支付 if (empty($param['is_post_pay']) || !in_array($param['is_post_pay'], [1, 2])) { return $this->toData('1', '交易所类型 无效'); } // 后支付截止时间 > 中签时间 && 后支付截止时间 < 上市时间 // if ($param['is_post_pay'] == 2 && (empty($param['pay_deadline_time']) || strtotime($param['pay_deadline_time']) <= strtotime($param['get_time']) || strtotime($param['pay_deadline_time']) >= strtotime($param['open_time']))) { // return $this->toData('1', '后支付截止时间 要大于 中签时间 且 后支付截止时间 要小于 上市时间'); // } if (strpos($param['stock_code'], ':') !== false) { $param['stock_code'] = explode(':', $param['stock_code'])[1]; } //除了美股 其他的 code前拼交易所 if ($market_type != 3) { $param['stock_code'] = $this->getStockTape($market_type)['tape'][$param['tape']] . ":" . $param['stock_code']; } // 1.0 判断股票号是否已经存在 $preStock = Db::table($table_obj['stock_table'])->where('stock_code', $param['stock_code'])->where('is_delete', 1)->find(); if (!empty($preStock)) { return $this->toData('1', '股票号已经存在'); } $stock = Db::table($table_obj['list_table'])->where('stock_code', $param['stock_code'])->find(); if (!empty($stock)) { return $this->toData('1', '股票号已经上市'); } // 新增数据 $preHkStock['stock_code'] = $param['stock_code']; $preHkStock['stock_name'] = $param['stock_name']; $preHkStock['stock_type'] = $param['stock_type']; $preHkStock['tape'] = $param['tape']; $preHkStock['status'] = $param['status']; $preHkStock['price'] = $param['price']; $preHkStock['min'] = $param['min']; $preHkStock['max'] = $param['max'] ?? 0; $preHkStock['total'] = $param['total']; $preHkStock['rate'] = $param['rate']; $preHkStock['start_time'] = $param['start_time']; $preHkStock['end_time'] = $param['end_time']; $preHkStock['get_time'] = $param['get_time']; $preHkStock['open_time'] = $param['open_time']; $preHkStock['is_post_pay'] = $param['is_post_pay']; if (!empty($param['pay_deadline_time'])) $preHkStock['pay_deadline_time'] = $param['pay_deadline_time']; $preHkStock['limit_get_num'] = $param['limit_get_num'] ?? 100; $preHkStock['is_delete'] = 1; $preHkStock['open_status'] = 1; $preHkStock['create_time'] = date('Y-m-d H:i:s'); $preHkStock['update_time'] = date('Y-m-d H:i:s'); $preHkStock['company_reg_amount'] = $companyRegAmount; $preHkStock['company_open_time'] = $param['company_open_time']; $preHkStock['company_info'] = $param['company_info']; $preHkStock['logo'] = $param['logo']; if ($market_type == 5) $preHkStock['numeric_code'] = $param['numeric_code'] ?? '0'; $bool = Db::table($table_obj['stock_table'])->insert($preHkStock); if ($bool) { return $this->toData('0', 'SUCCESS'); } else { return $this->toData('1', 'FAIL'); } } catch (\Exception $exception) { return $this->toData('0', '系统繁忙', [$exception->getMessage()]); } } /** * 编辑IPO */ public function editStockIPO($market_type, $param) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '数据异常'); } if (empty($param['id']) || !is_numeric($param['id'])) { return $this->toData('1', '主键 无效'); } $preHkStock = Db::table($table_obj['stock_table'])->where('id', $param['id'])->where('is_delete', 1)->find(); if (empty($preHkStock)) { return $this->toData('1', '主键 无效'); } $stockTypeList = $this->getStockTape($market_type); // 股票类型 if (empty($param['stock_type']) || !in_array($param['stock_type'], array_keys($stockTypeList['type']))) { return $this->toData('1', '股票类型 无效'); } // 股票代码 if (empty($param['stock_code']) || !is_string($param['stock_code']) || !preg_match('/^[a-zA-Z0-9]+$/', $param['stock_code'])) { return $this->toData('1', '股票代码 无效'); } // 股票名称 if (empty($param['stock_name']) || !is_string($param['stock_name'])) { return $this->toData('1', '股票代码 无效'); } if ($market_type == 5) { if (empty($param['numeric_code']) || !preg_match('/^[a-zA-Z0-9]+$/', $param['numeric_code'])) { return $this->toData('1', '数字编码 无效'); } } // 交易所类型 if (empty($param['tape']) || !in_array($param['tape'], array_keys($stockTypeList['tape']))) { return $this->toData('1', '交易所类型 无效'); } // 发布状态 if (empty($param['status']) || !in_array($param['status'], [1, 2])) { return $this->toData('1', '发布状态 无效'); } // 单股价格 if (empty($param['price']) || !is_numeric($param['price']) || $param['price'] <= 0) { return $this->toData('1', '单股价格 无效'); } // 开始认购时间 if (empty($param['start_time']) || !is_string($param['start_time'])) { return $this->toData('1', '开始认购时间 无效'); } // 最小申购数量 if (empty($param['min']) || !is_numeric($param['min']) || $param['min'] <= 0 || ceil($param['min']) != $param['min']) { return $this->toData('1', '最小申购数量 无效'); } // 发行总数 if (empty($param['total']) || !is_numeric($param['total']) || $param['total'] <= 0 || ceil($param['total']) != $param['total']) { return $this->toData('1', '发行总数 无效'); } // 中签率 两位小数 if (empty($param['rate']) || !is_numeric($param['rate']) || is_float($param['rate']) || $param['rate'] < 0 || $param['rate'] > 100) { return $this->toData('1', '中签率无效;范围 0 - 100 , 必须是整数'); } // 认购结束时间 if (empty($param['end_time']) || !is_string($param['end_time'])) { return $this->toData('1', '认购结束时间 无效'); } // 中签时间 if (empty($param['get_time']) || !is_string($param['get_time'])) { return $this->toData('1', '中签时间 无效'); } // 上市时间 if (empty($param['open_time']) || !is_string($param['open_time'])) { return $this->toData('1', '上市时间 无效'); } // 公司注册资本 $companyRegAmount = ""; if (!empty($param['company_reg_amount']) && is_string($param['company_reg_amount'])) { $companyRegAmount = $param['company_reg_amount']; } // 公司上市时间 if (empty($param['company_open_time']) || !is_string($param['company_open_time'])) { return $this->toData('1', '公司上市时间 无效'); } // 公司简介 if (empty($param['company_info']) || !is_string($param['company_info'])) { return $this->toData('1', '公司简介 无效'); } // 股票logo if (empty($param['logo']) || !is_string($param['logo'])) { return $this->toData('1', '股票logo 无效'); } // 上市时间 要大于 中签时间 中签时间要大于 认购结结束时间 if (strtotime($param['open_time']) <= strtotime($param['get_time']) || strtotime($param['get_time']) <= strtotime($param['end_time'])) { return $this->toData('1', '上市时间 要大于 中签时间 中签时间要大于 认购结结束时间'); } // 是否后支付 if (empty($param['is_post_pay']) || !in_array($param['is_post_pay'], [1, 2])) { return $this->toData('1', '交易所类型 无效'); } // 后支付截止时间 > 中签时间 && 后支付截止时间 < 上市时间 // if ($param['is_post_pay'] == 2 && (empty($param['pay_deadline_time']) || strtotime($param['pay_deadline_time']) <= strtotime($param['get_time']) || strtotime($param['pay_deadline_time']) >= strtotime($param['open_time']))) { // return $this->toData('1', '后支付截止时间 要大于 中签时间 且 后支付截止时间 要小于 上市时间'); // } if (strpos($param['stock_code'], ':') !== false) { $param['stock_code'] = explode(':', $param['stock_code'])[1]; } //除了美股 其他的 code前拼交易所 if ($market_type != 3) { $param['stock_code'] = $this->getStockTape($market_type)['tape'][$param['tape']] . ":" . $param['stock_code']; } //code变更进行通知 if ($preHkStock['stock_code'] != $param['stock_code'] && $preHkStock['open_status'] == 2) { $source = 0; if ($market_type == 7) $source = 1; // 通知行情 $bool = $this->sendNewStockToGo($table_obj['country'], $param['stock_code'], $preHkStock['stock_code'], $param['stock_name'], $stockTypeList['tape'][$preHkStock['tape']], $preHkStock['price'], 1, $preHkStock['company_info'], $source, $param['numeric_code'] ?? 0); if (!$bool) { return $this->toData('1', '给行情推送数据异常', []); } // 通知交易 $bool = $this->sendUpdateCodeGo($param['stock_code'], $preHkStock['stock_code'], $market_type); if (!$bool) { return $this->toData('1', '给交易推送数据异常', []); } //修改股票code $stock = Db::table($table_obj['list_table'])->where('stock_code', $preHkStock['stock_code'])->find(); $stock_update['stock_code'] = $param['stock_code']; $stock_update['update_time'] = date('Y-m-d H:i:m'); $updateCodeBool = Db::table($table_obj['list_table'])->where('id', $stock['id'])->update($stock_update); if (!$updateCodeBool) return $this->toData('1', '修改股票code失败'); $oldKey = $table_obj['redis_key'] . $preHkStock['stock_code']; $redis = $this->getRedis(); $redis->del($oldKey); $newKey = $table_obj['redis_key'] . $param['stock_code']; $cacheArr = [ 'stock_name' => $stock['stock_name'], 'stock_code' => $param['stock_code'], 'status' => $stock['status'], 'keep_decimal' => $stock['keep_decimal'], 'forced_closure' => $stock['forced_closure'], 'up_limit' => $stock['up_limit'], 'down_limit' => $stock['down_limit'], 'info' => $stock['info'], 'tape' => $stock['tape'], ]; if ($market_type == 5) $cacheArr['numeric_code'] = $param['numeric_code'] ?? '0'; $redis->hMset($newKey, $cacheArr); } $preHkStock['stock_code'] = $param['stock_code']; $preHkStock['stock_name'] = $param['stock_name']; $preHkStock['tape'] = $param['tape']; $preHkStock['status'] = $param['status']; $preHkStock['price'] = $param['price']; $preHkStock['start_time'] = $param['start_time']; // 新增数据 $preHkStock['min'] = $param['min']; $preHkStock['max'] = $param['max'] ?? 0; $preHkStock['total'] = $param['total']; $preHkStock['rate'] = $param['rate']; $preHkStock['end_time'] = $param['end_time']; $preHkStock['get_time'] = $param['get_time']; $preHkStock['open_time'] = $param['open_time']; $preHkStock['is_post_pay'] = $param['is_post_pay']; if (!empty($param['pay_deadline_time'])) $preHkStock['pay_deadline_time'] = $param['pay_deadline_time']; $preHkStock['limit_get_num'] = $param['limit_get_num'] ?? 100; $preHkStock['is_delete'] = 1; $preHkStock['update_time'] = date('Y-m-d H:i:s'); $preHkStock['company_reg_amount'] = $companyRegAmount; $preHkStock['company_open_time'] = $param['company_open_time']; $preHkStock['company_info'] = $param['company_info']; $preHkStock['logo'] = $param['logo']; if ($market_type == 5) $preHkStock['numeric_code'] = $param['numeric_code'] ?? '0'; $bool = Db::table($table_obj['stock_table'])->where('id', $param['id'])->update($preHkStock); if ($bool) { return $this->toData('0', 'SUCCESS'); } else { return $this->toData('1', 'FAIL'); } } catch (\Exception $exception) { return $this->toData('0', '系统繁忙', [$exception->getMessage()]); } } /** * 删除IPO */ public function delStockIPO($market_type, $param) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '数据异常'); } if (empty($param['id']) || !is_numeric($param['id'])) { return $this->toData('1', '主键 无效'); } $preHkStock = Db::table($table_obj['stock_table'])->where('id', $param['id'])->where('is_delete', 1)->find(); if (empty($preHkStock)) { return $this->toData('1', '主键 无效'); } // 删除 $list_key = $table_obj['redis_key'] . $preHkStock['stock_code']; $redis = $this->getRedis(); $redis->del($list_key); //删除 修改状态 $preHkStock['is_delete'] = 2; $preHkStock['update_time'] = date('Y-m-d H:i:s'); $bool = Db::table($table_obj['stock_table'])->where('id', $param['id'])->update($preHkStock); if ($bool) { return $this->toData('0', 'SUCCESS'); } else { return $this->toData('1', 'FAIL'); } } catch (\Exception $exception) { return $this->toData('1', '系统繁忙', [$exception->getMessage()]); } } /** * IPO上市 */ public function stockIPO($market_type, $param) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '市场类型无效'); } if (empty($param['id']) || !is_numeric($param['id'])) { return $this->toData('1', '主键 无效'); } $isReal = 1; if (isset($param['is_real']) && is_numeric($param['is_real']) && $param['is_real'] == '2') { $isReal = 2; } $preInStock = Db::table($table_obj['stock_table'])->where('id', $param['id'])->where('is_delete', 1)->find(); if (empty($preInStock)) { return $this->toData('1', '主键 无效'); } // 判断是否签名 if ($preInStock['sign_status'] != 1) { return $this->toData('1', '还未签名'); } // 未签名 上市 if ($preInStock['open_status'] != 1 || strtotime($preInStock['get_time']) < date('Y-m-d H:i:s')) { return $this->toData('1', '无法操作'); } Db::startTrans(); // 修改股票状态 $num = Db::table($table_obj['stock_table'])->where('id', $preInStock['id'])->update(['open_status' => 2, 'open_time' => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s')]); if ($num <= 0) { Db::rollback(); return $this->toData('1', '股票状态修改失败'); } $tape_list = $this->getStockTape($market_type); if (Db::table($table_obj['list_table'])->where('stock_code', $preInStock['stock_code'])->find()) { Db::rollback(); return $this->toData('1', '股票列表已存在该股票'); } // 将新股加入股票 $inStock['stock_name'] = $preInStock['stock_name']; $inStock['stock_code'] = $preInStock['stock_code']; $inStock['status'] = 1; $inStock['tape'] = $preInStock['tape']; $inStock['keep_decimal'] = 4; $inStock['info'] = ''; $inStock['forced_closure'] = 30; $inStock['up_limit'] = 30; $inStock['down_limit'] = 30; $inStock['create_time'] = date('Y-m-d H:i:s'); $inStock['update_time'] = date('Y-m-d H:i:s'); if ($market_type == 5) $inStock['numeric_code'] = $preInStock['numeric_code']; $bool = Db::table($table_obj['list_table'])->insert($inStock); if (!$bool) { Db::rollback(); return $this->toData('1', '股票转移失败'); } // 加入缓存 $list_key = $table_obj['redis_key'] . $preInStock['stock_code']; $redis = $this->getRedis(); $redis->del($list_key); $cacheArr = [ 'stock_name' => $inStock['stock_name'], 'stock_code' => $inStock['stock_code'], 'status' => $inStock['status'], 'keep_decimal' => $inStock['keep_decimal'], 'forced_closure' => $inStock['forced_closure'], 'up_limit' => $inStock['up_limit'], 'down_limit' => $inStock['down_limit'], 'info' => $inStock['info'], 'tape' => $inStock['tape'], ]; if ($market_type == 5) $cacheArr['numeric_code'] = $preInStock['numeric_code']; $redis->hMset($list_key, $cacheArr); $hqArr = [ 'type' => 'hq', 'stock_code' => $inStock['stock_code'], 'stock_name' => $inStock['stock_name'], 'tape' => $tape_list['tape'][$inStock['tape']], 'price' => $preInStock['price'], 'isReal' => $isReal, 'company_info' => $preInStock['company_info'], 'country' => $table_obj['country'], 'id' => $preInStock['id'], 'market_type' => $market_type, 'source' => 0 ]; if ($market_type == 7) $hqArr['source'] = 2; if ($market_type == 5) $hqArr['numeric_code'] = $preInStock['numeric_code']; Db::commit(); return $this->toData('0', 'SUCCESS'); } catch (\Exception $exception) { Db::rollback(); trace('预售股上市失败' . $exception->getMessage(), 'error'); return $this->toData('1', '系统繁忙', [$exception->getMessage(), $exception->getTrace()]); } } public function updateIPOStatus($market_type, $id, $type, $status, $order_no = '') { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return false; } switch ($type) { case 'trade': $bool = Db::table($table_obj['stock_table'])->where('id', $id)->update([ 'update_time' => date('Y-m-d H:i:s'), 'trade_status' => $status ]); if ($bool && $status == 1) { Db::table($table_obj['order_table'])->where('pre_stock_id', $id)->where('status', 3)->update([ 'update_time' => date('Y-m-d H:i:s'), 'trade_status' => 1 ]); } break; case 'last_trade': $bool = Db::table($table_obj['order_table'])->where('pre_stock_id', $id)->where('order_no', $order_no)->update([ 'update_time' => date('Y-m-d H:i:s'), 'trade_status' => 1 ]); break; case 'hq': $bool = Db::table($table_obj['stock_table'])->where('id', $id)->update([ 'update_time' => date('Y-m-d H:i:s'), 'hq_status' => $status ]); break; } if (!$bool) { trace('预售股上市修改通知状态失败-' . $id, 'error'); } } public function repeatNoteGo($market_type, $param) { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '市场类型无效'); } if (empty($param['id']) || !is_numeric($param['id'])) { return $this->toData('1', '主键 无效'); } if (empty($param['type'])) { return $this->toData('1', '缺少参数'); } $tape_list = $this->getStockTape($market_type); $preInStock = Db::table($table_obj['stock_table'])->where('id', $param['id'])->where('open_status', 2)->where('is_delete', 1)->find(); if (empty($preInStock)) { return $this->toData('1', '股票未上市'); } if ($preInStock['hq_status'] == 2 && $param['type'] == 'hq') { // 给行情发送数据 Queue::push('app\admin\job\SendGo', [ 'type' => 'hq', 'stock_code' => $preInStock['stock_code'], 'stock_name' => $preInStock['stock_name'], 'tape' => $tape_list['tape'][$preInStock['tape']], 'price' => $preInStock['price'], 'isReal' => 1, 'company_info' => $preInStock['company_info'], 'country' => $table_obj['country'], 'id' => $preInStock['id'], ], 'sendGo'); } if ($preInStock['trade_status'] == 2 && $param['type'] == 'trade') { Queue::push('app\admin\job\SendGo', [ 'type' => 'trade', 'id' => $preInStock['id'], 'stock_code' => $preInStock['stock_code'], 'market_type' => $market_type ], 'sendGo'); } return $this->toData('0', 'SUCCESS'); } /** * 处理股票IPO中签 */ public function signStockIPO($market_type) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { trace('数据异常,股票市场:' . $market_type, 'info'); return json(["数据异常"]); } $now = date('Y-m-d H:i:s'); $preStockList = Db::table($table_obj['stock_table'])->where('is_delete', 1) ->where('status', 1) // 签名状态 ->where('sign_status', 2) // 中签时间已过 ->whereTime('get_time', '<=', $now) ->select(); if ($preStockList->isEmpty()) { trace('没有需要处理的新股,股票市场:' . $market_type, 'info'); return json(["没有需要处理的新股"]); } foreach ($preStockList as $preStock) { try { // 单个股票 开始事务 Db::startTrans(); // 中签率 $rate = bcdiv($preStock['rate'], 100, 6); $rate = number_format($rate, '6', '.', ''); // 申购的订单列表 $orderList = Db::table($table_obj['order_table'])->where('pre_stock_id', $preStock['id'])->whereIn('status', [1, 5])->select(); if (!$orderList->isEmpty()) { foreach ($orderList as $order) { $status = ($order['status'] == 5) ? 5 : 2; // 中签 $get_num = $order['get_num'] > 0 ? $order['get_num'] : ceil($order['num'] * $rate); // 计算中签 数量 * 中签率 向上取整 $orderPrice = number_format($order['price'], '6', '.', ''); $get_amount = bcmul($get_num, $orderPrice, 6); $orderAmount = number_format($order['amount'], '6', '.', ''); $diffAmount = bcsub($orderAmount, $get_amount, 6); $feeRate = number_format($order['fee_rate'], '6', '.', ''); $get_fee = bcmul($get_amount, $feeRate, 6); $orderFee = number_format($order['fee'], '6', '.', ''); // 总手续费 $diff_fee = bcsub($orderFee, $get_fee, 6); // 手续费差值 // 修改订单数据 $num = Db::table($table_obj['order_table'])->where('id', $order['id']) ->update([ 'status' => $status, 'get_num' => $get_num, 'get_amount' => $get_amount, 'get_fee' => $get_fee, 'get_time' => $now, 'update_time' => $now]); if ($num <= 0) { Db::rollback(); trace('股票签名失败01,股票市场:' . $market_type . "股票名称:" . $preStock['stock_code'], 'info'); return json(["股票签名失败00"]); } //已退款订单 直接跳过 if ($order['status'] == 7) continue; //后支付-未支付 直接跳过 if ($order['pay_type'] == 2 && $order['status'] == 5) continue; // 回退本金 if ($diffAmount > 0) { // 新增金额 $beforeAmount = Db::table($table_obj['user_table'])->where('user_id', $order['user_id'])->where('stock_id', $table_obj['stock_id'])->value('usable_num'); $num = Db::table($table_obj['user_table'])->where('user_id', $order['user_id'])->where('stock_id', $table_obj['stock_id']) ->inc('usable_num', $diffAmount) ->dec('frozen_num', $diffAmount) ->update(['update_time' => $now]); if ($num <= 0) { Db::rollback(); trace('股票签名失败02,股票市场:' . $market_type . "股票名称:" . $preStock['stock_code'], 'info'); return json(["股票签名失败02"]); } // 生成日志 $userStockLog['user_id'] = $order['user_id']; $userStockLog['change_type'] = 17; $userStockLog['stock_id'] = $table_obj['stock_id']; $userStockLog['before_num'] = $beforeAmount; $userStockLog['change_num'] = $diffAmount; $userStockLog['order_id'] = $order['order_no']; $userStockLog['update_time'] = $now; $userStockLog['create_time'] = $now; $bool = Db::table($table_obj['log_table'])->insert($userStockLog); if (!$bool) { Db::rollback(); trace('股票签名失败03,股票市场:' . $market_type . "股票名称:" . $preStock['stock_code'], 'info'); return json(["股票签名失败03"]); } } // 退回手续费 if ($diff_fee > 0) { // 新增金额 $beforeFee = Db::table($table_obj['user_table'])->where('user_id', $order['user_id'])->where('stock_id', $table_obj['stock_id'])->value('usable_num'); $num = Db::table($table_obj['user_table'])->where('user_id', $order['user_id'])->where('stock_id', $table_obj['stock_id']) ->inc('usable_num', $diff_fee) ->dec('frozen_num', $diff_fee) ->update(['update_time' => $now]); if ($num <= 0) { Db::rollback(); trace('股票签名失败04,股票市场:' . $market_type . "股票名称:" . $preStock['stock_code'], 'info'); return json(["股票签名失败04"]); } // 生成日志 $userStockLogFee['user_id'] = $order['user_id']; $userStockLogFee['change_type'] = 18; $userStockLogFee['stock_id'] = $table_obj['stock_id']; $userStockLogFee['before_num'] = $beforeFee; $userStockLogFee['change_num'] = $diff_fee; $userStockLogFee['order_id'] = $order['order_no']; $userStockLogFee['update_time'] = $now; $userStockLogFee['create_time'] = $now; $bool = Db::table($table_obj['log_table'])->insert($userStockLogFee); if (!$bool) { Db::rollback(); trace('股票签名失败05,股票市场:' . $market_type . "股票名称:" . $preStock['stock_code'], 'info'); return json(["股票签名失败05"]); } } } } // 更新股票数据 $bool = Db::table($table_obj['stock_table'])->where('id', $preStock['id'])->update(['sign_status' => 1, 'update_time' => $now]); if (!$bool) { Db::rollback(); trace('股票签名失败07,股票市场:' . $market_type . "股票名称:" . $preStock['stock_code'], 'info'); return json(["股票签名失败07"]); } // 提交事务 Db::commit(); } catch (\Exception $exception) { Db::rollback(); trace("股票签名失败-exception 股票市场:" . $market_type . $exception->getMessage(), 'error'); return json([$exception->getMessage()]); } } return json(["SUCCESS"]); } catch (\Exception $exception) { trace("股票签名失败-exception 股票市场:" . $market_type . $exception->getMessage(), 'error'); return json([$exception->getMessage()]); } } /** * 股票列表 */ public function stockList($market_type, $param) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '数据异常'); } validate(StockValidate::class)->scene($table_obj['check'] . 'index')->check($param); $tapeList = $this->getStockTape($market_type); $stockCode = $param['stock_code'] ?? ''; $where = []; $whereOr = []; if (!empty($stockCode)) { if ($market_type == 5) { $whereOr[] = ['stock_code', 'like', '%' . $stockCode]; $whereOr[] = ['numeric_code', 'like', '%' . $stockCode]; } else { $where[] = ['stock_code', 'like', '%' . $stockCode]; } } $list = Db::table($table_obj['list_table'])->order('id', 'desc'); $total = Db::table($table_obj['list_table'])->order('id', 'desc'); if (!empty($whereOr)) { $list = $list->whereOr($whereOr); $total = $total->whereOr($whereOr); } if (!empty($where)) { $list = $list->where($where); $total = $total->where($where); } $list = $list->page($param['page'], $param['limit'])->select(); $total = $total->count(); return $this->toData('0', 'SUCCESS', ['list' => $list, 'total' => $total, 'extend' => [ 'tape_list' => $tapeList['tape'], 'source_list' => $tapeList['source'] ?? [], ]]); } catch (ValidateException $validateException) { // 参数校验失败 $message = $validateException->getError(); return $this->toData('1', $message); } catch (\Exception $exception) { return $this->toData('1', '系统繁忙', [$exception->getMessage(), $exception->getTrace()]); } } /** * 添加股票 */ public function addStock($market_type, $param) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '数据异常'); } validate(StockValidate::class)->scene($table_obj['check'] . 'add')->check($param); $info = ''; if (isset($param['info']) && is_string($param['info'])) { $info = $param['info']; } $tapeList = $this->getStockTape($market_type); // 判断股票交易所 $tape = '0'; if (isset($param['tape']) && in_array($param['tape'], array_keys($tapeList['tape']))) { $tape = $param['tape']; } if (empty($param['yesterday_close']) || !is_numeric($param['yesterday_close']) || $param['yesterday_close'] <= 0) { return $this->toData('1', '昨日收盘价错误'); } if (strpos($param['stock_code'], ':') !== false) { $param['stock_code'] = explode(':', $param['stock_code'])[1]; } if ($market_type != 3) { $stock_code = $tapeList['tape'][$tape] . ":" . $param['stock_code']; } else { $stock_code = $param['stock_code']; } // 判断股票代码是否已经存在 $count = Db::table($table_obj['list_table'])->where('stock_code', $stock_code)->count(); if ($count > 0) { return $this->toData('1', '股票代码已经存在'); } $source = 0; if ($market_type == 7) { $stockList['source'] = $source = $param['source'] ?? 1; } // 给行情推送 $bool = $this->sendNewStockToGo($table_obj['country'], $stock_code, $stock_code, $param['stock_name'], $tapeList['tape'][$tape], $param['yesterday_close'], 1, '', $source, $param['numeric_code'] ?? '0'); if (!$bool) { return $this->toData('1', '数据设置成功 但给行情推送数据异常', []); } // 新增数据 $stockList['stock_name'] = $param['stock_name']; $stockList['stock_code'] = $stock_code; $stockList['status'] = $param['status']; $stockList['keep_decimal'] = $param['keep_decimal']; $stockList['forced_closure'] = $param['forced_closure']; $stockList['up_limit'] = $param['up_limit']; $stockList['down_limit'] = $param['down_limit']; $stockList['tape'] = $tape; // 交易所类型 $stockList['info'] = $info; $stockList['yesterday_close'] = $param['yesterday_close']; $stockList['create_time'] = date('Y-m-d H:i:s'); $stockList['update_time'] = date('Y-m-d H:i:s'); if ($market_type == 5) $stockList['numeric_code'] = $param['numeric_code'] ?? '0'; $bool = Db::table($table_obj['list_table'])->insert($stockList); if ($bool) { // 新增缓存 $list_key = $table_obj['redis_key'] . $stock_code; $redis = $this->getRedis(); $redis->del($list_key); $redis_arr = [ 'stock_name' => $param['stock_name'], 'stock_code' => $stock_code, 'status' => $param['status'], 'keep_decimal' => $param['keep_decimal'], 'forced_closure' => $param['forced_closure'], 'up_limit' => $param['up_limit'], 'down_limit' => $param['down_limit'], 'info' => $info, 'tape' => $tape, ]; if ($market_type == 5) $redis_arr['numeric_code'] = $param['numeric_code'] ?? '0'; $redis->hMset($list_key, $redis_arr); } return $this->toData('0', 'SUCCESS', []); } catch (ValidateException $validateException) { $message = $validateException->getError(); return $this->toData('1', $message); } catch (\Exception $exception) { return $this->toData('1', '系统繁忙', []); } } /** * 编辑股票 */ public function editStock($market_type, $param) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '数据异常'); } validate(StockValidate::class)->scene($table_obj['check'] . 'edit')->check($param); $stockList = Db::table($table_obj['list_table'])->where('id', $param['id'])->find(); if (empty($stockList)) { return $this->toData('1', '目标不存在', []); } $info = ''; if (isset($param['info']) && is_string($param['info'])) { $info = $param['info']; } $tapeList = $this->getStockTape($market_type); // 判断股票交易所 $tape = '0'; if (isset($param['tape']) && in_array($param['tape'], array_keys($tapeList['tape']))) { $tape = $param['tape']; } if (empty($param['yesterday_close']) || !is_numeric($param['yesterday_close']) || $param['yesterday_close'] <= 0) { return $this->toData('1', '昨日收盘价错误'); } if (strpos($param['stock_code'], ':') !== false) { $param['stock_code'] = explode(':', $param['stock_code'])[1]; } if ($market_type != 3) { $stock_code = $tapeList['tape'][$param['tape']] . ":" . $param['stock_code']; } else { $stock_code = $param['stock_code']; } $old_code = $stockList['stock_code']; // 判断股票代码是否已经存在 $count = Db::table($table_obj['list_table'])->where('stock_code', $stock_code)->where('id', '<>', $param['id'])->count(); if ($count > 0) { return $this->toData('1', '股票代码已经存在'); } $source = 0; if ($stock_code != $old_code || ($market_type == 7 && $param['source'] != $stockList['source'])) { if ($market_type == 7) { $stockList['source'] = $source = $param['source'] ?? 1; } // 给行情推送 $bool = $this->sendNewStockToGo($table_obj['country'], $stock_code, $old_code, $param['stock_name'], $tapeList['tape'][$tape], $param['yesterday_close'], 1, '', $source, $param['numeric_code'] ?? '0'); if (!$bool) { return $this->toData('1', '数据设置成功 但给行情推送数据异常', []); } } if ($stock_code != $old_code) { // 通知交易 $bool = $this->sendUpdateCodeGo($stock_code, $old_code, $market_type); if (!$bool) { return $this->toData('1', '数据设置成功 但给交易推送数据异常', []); } //插针 $stockPrices = StockPricesSettingModel::where('market_type', $market_type)->where('stock_id', $param['id'])->find(); if (!empty($stockPrices)) { // 添加缓存 $old_key = 'STOCK_PRICES:' . $stockPrices->market_type . ':' . $old_code; $new_key = 'STOCK_PRICES:' . $stockPrices->market_type . ':' . $stock_code; $redis = $this->getRedis(); $redis->del($old_key); $redis->hMSet($new_key, [ 'market_type' => $stockPrices->market_type, 'stock_id' => $stockPrices->stock_id, 'stock_code' => $stock_code, 'status' => $stockPrices->status, 'price' => $stockPrices->price, ]); } //IPO $stockIPO = Db::table($table_obj['stock_table'])->where('stock_code', $old_code)->find(); if (!empty($stockIPO)) { Db::table($table_obj['stock_table'])->where('stock_code', $old_code)->update(['stock_code' => $stock_code, 'update_time' => date('Y-m-d H:i:s')]); } } // 修改数据 $stockList['stock_name'] = $param['stock_name']; $stockList['stock_code'] = $stock_code; $stockList['status'] = $param['status']; $stockList['keep_decimal'] = $param['keep_decimal']; $stockList['forced_closure'] = $param['forced_closure']; $stockList['up_limit'] = $param['up_limit']; $stockList['down_limit'] = $param['down_limit']; $stockList['info'] = $info; $stockList['tape'] = $tape; $stockList['update_time'] = date('Y-m-d H:i:s'); $stockList['yesterday_close'] = $param['yesterday_close']; if ($market_type == 5) $stockList['numeric_code'] = $param['numeric_code'] ?? '0'; $bool = Db::table($table_obj['list_table'])->where('id', $param['id'])->update($stockList); if ($bool) { // 新增缓存 $old_key = $table_obj['redis_key'] . $old_code; $new_key = $table_obj['redis_key'] . $stock_code; $redis = $this->getRedis(); $redis->del($old_key); $redis_arr = [ 'stock_name' => $param['stock_name'], 'stock_code' => $stock_code, 'status' => $param['status'], 'keep_decimal' => $param['keep_decimal'], 'forced_closure' => $param['forced_closure'], 'up_limit' => $param['up_limit'], 'down_limit' => $param['down_limit'], 'info' => $info, 'tape' => $tape, ]; if ($market_type == 5) $redis_arr['numeric_code'] = $param['numeric_code'] ?? '0'; $redis->hMset($new_key, $redis_arr); } return $this->toData('0', 'SUCCESS', []); } catch (ValidateException $validateException) { $message = $validateException->getError(); return $this->toData('1', $message); } catch (\Exception $exception) { return $this->toData('1', '系统繁忙', [$exception->getMessage(), $exception->getTrace()]); } } /** * 自动添加股票 */ public function autoAddStock($param) { try { $market_type = intval($param['country']); $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '数据异常'); } validate(StockValidate::class)->scene('stock_auto_add')->check($param); $tapeList = $this->getStockTape($market_type); $tape_arr = array_flip($tapeList['tape']); // 判断股票交易所 $tape = '0'; if (isset($param['tape']) && in_array($param['tape'], array_keys($tape_arr))) { $tape = $tape_arr[$param['tape']]; } $stock_code = $param['stock_code']; // 判断股票代码是否已经存在 $count = Db::table($table_obj['list_table'])->where('stock_code', $stock_code)->count(); if ($count > 0) { return $this->toData('1', '股票代码已经存在'); } // 新增数据 $stockList['stock_name'] = $param['stock_name']; $stockList['stock_code'] = $stock_code; $stockList['status'] = 1; $stockList['keep_decimal'] = 4; $stockList['forced_closure'] = 30; $stockList['up_limit'] = 30; $stockList['down_limit'] = 30; $stockList['tape'] = $tape; // 交易所类型 $stockList['info'] = ''; $stockList['yesterday_close'] = 0; $stockList['create_time'] = date('Y-m-d H:i:s'); $stockList['update_time'] = date('Y-m-d H:i:s'); $bool = Db::table($table_obj['list_table'])->insert($stockList); if ($bool) { // 新增缓存 $list_key = $table_obj['redis_key'] . $stock_code; $redis = $this->getRedis(); $redis->del($list_key); $redis->hMset($list_key, [ 'stock_name' => $stockList['stock_name'], 'stock_code' => $stock_code, 'status' => $stockList['status'], 'keep_decimal' => $stockList['keep_decimal'], 'forced_closure' => $stockList['forced_closure'], 'up_limit' => $stockList['up_limit'], 'down_limit' => $stockList['down_limit'], 'info' => '', 'tape' => $tape, ]); } return $this->toData('0', 'SUCCESS', []); } catch (ValidateException $validateException) { $message = $validateException->getError(); return $this->toData('1', $message); } catch (\Exception $exception) { return $this->toData('1', '系统繁忙', [$exception->getMessage(), $exception->getTrace()]); } } /** * 取消上市 */ public function cancelIPO($market_type,$param){ $table_obj = $this->getStockModel($market_type); $redis = $this->getRedis(); if (empty($table_obj)) { return false; } $preStock = Db::table($table_obj['stock_table'])->where('is_delete', 1) ->where('status', 1) ->where('id', $param['pre_id']) // 签名状态 ->where('sign_status', 1) ->where('open_status', 1) ->find(); if(empty($preStock)){ return $this->toData('1', '数据异常'); } //1、2已支付,5、6未支付可能存在借款 $order_list = Db::table($table_obj['order_table'])->where('pre_stock_id', $param['pre_id']) ->whereIn('status',[1,2,5,6]) ->select(); $now = date('Y-m-d H:i:s'); foreach ($order_list as $order){ Db::startTrans(); $total_num=$order['amount']+$order['fee']; //查询订单有没有欠款 $user_arrears=UserArrearsModel::where('order_no', $order['order_no'])->where('status',0)->where('user_id', $order['user_id'])->find(); if($user_arrears){ $user_arrears=$user_arrears->toArray(); if($user_arrears['is_add']==1){ //扣除冻结,不加可用 $updateNum = Db::table($table_obj['user_table'])->where('stock_id', $table_obj['stock_id'])->where('user_id', $order['user_id']) ->where('frozen_num', '>=', $total_num) ->dec('frozen_num',$total_num) ->update(['update_time' => $now]); if(!$updateNum){ Db::rollback(); trace('给用户ID:' . $order['user_id'] . "解冻资金异常" . $order['order_no'], 'error'); continue; } } $update_bool=UserArrearsModel::where('order_no', $order['order_no'])->where('user_id', $order['user_id']) ->update([ 'update_time'=>$now, 'status'=>1 ]); if(!$update_bool){ Db::rollback(); trace('给用户ID:' . $order['user_id'] . "更新贷款订单异常" . $order['order_no'], 'error'); continue; } $status=8; }else{ //扣除冻结 加可用 $updateNum = Db::table($table_obj['user_table'])->where('stock_id', $table_obj['stock_id'])->where('user_id', $order['user_id']) ->where('frozen_num', '>=', $total_num) ->inc('usable_num', $total_num) ->dec('frozen_num',$total_num) ->update(['update_time' => $now]); if(!$updateNum){ Db::rollback(); trace('给用户ID:' . $order['user_id'] . "解冻资金异常" . $order['order_no'], 'error'); continue; } $status=7; } //更新状态 $bool_status = Db::table($table_obj['order_table'])->where('id', $order['id'])->update([ 'status' => $status, 'update_time' => $now ]); if (!$bool_status) { Db::rollback(); trace('更新订单状态异常' . $order['order_no'], 'error'); continue; } //删除缓存订单 $key = "USER:ARREAR:ORDER:" . $order['order_no']; $redis->del($key); Db::commit(); } $bool = Db::table($table_obj['stock_table'])->where('id', $param['pre_id'])->update([ 'is_delete'=>2, 'update_time' => $now ]); if($bool){ return $this->toData('0', 'SUCCESS'); }else{ return $this->toData('1', '数据异常'); } } // 美股列表 public function getTradeNameList($market_type) { try { $table_obj = $this->getStockModel($market_type); if (empty($table_obj)) { return $this->toData('1', '数据异常'); } $list = Db::table($table_obj['list_table'])->where('status', 1)->order('id', 'desc')->column('stock_name', 'id'); return $this->toData('0', 'SUCCESS', ['list' => $list]); } catch (\Exception $exception) { return $this->toData('1', '系统繁忙', []); } } public function getStockModel($market_type) { //3美股、4印尼股、5马股、6泰股、7印度股、9新加坡股、12港股、14英股 $prefix = env('database.prefix'); switch ($market_type) { case 3: $result = [ 'stock_table' => $prefix . 'pre_us_stock', 'order_table' => $prefix . 'user_us_pre_stock_order', 'user_table' => $prefix . 'user_stock', 'log_table' => $prefix . 'user_stock_log', 'list_table' => $prefix . 'stock_list', 'trade_table' => $prefix . 'stock_trade', 'give_order_table' => $prefix . 'user_us_give_stock_order', 'redis_key' => 'US:STOCK:LIST:', 'stock_id' => 'USD', 'country' => 'US', 'check' => 'us_stock_', ]; break; case 4: $result = [ 'stock_table' => $prefix . 'pre_idn_stock', 'order_table' => $prefix . 'user_idn_pre_stock_order', 'user_table' => $prefix . 'user_stock_idn', 'log_table' => $prefix . 'user_stock_idn_log', 'list_table' => $prefix . 'stock_idn_list', 'trade_table' => $prefix . 'stock_idn_trade', 'give_order_table' => $prefix . 'user_idn_give_stock_order', 'redis_key' => 'IDN:STOCK:LIST:', 'stock_id' => 'IDR', 'country' => 'Indonesia', 'check' => 'idn_stock_', ]; break; case 5: $result = [ 'stock_table' => $prefix . 'pre_mys_stock', 'order_table' => $prefix . 'user_mys_pre_stock_order', 'user_table' => $prefix . 'user_stock_mys', 'log_table' => $prefix . 'user_stock_mys_log', 'list_table' => $prefix . 'stock_mys_list', 'trade_table' => $prefix . 'stock_mys_trade', 'give_order_table' => $prefix . 'user_mys_give_stock_order', 'redis_key' => 'MYS:STOCK:LIST:', 'stock_id' => 'MYR', 'country' => 'Malaysia', 'check' => 'mys_stock_', ]; break; case 6: $result = [ 'stock_table' => $prefix . 'pre_tha_stock', 'order_table' => $prefix . 'user_tha_pre_stock_order', 'user_table' => $prefix . 'user_stock_tha', 'log_table' => $prefix . 'user_stock_tha_log', 'list_table' => $prefix . 'stock_tha_list', 'trade_table' => $prefix . 'stock_tha_trade', 'give_order_table' => $prefix . 'user_tha_give_stock_order', 'redis_key' => 'THA:STOCK:LIST:', 'stock_id' => 'THB', 'country' => 'Thailand', 'check' => 'tha_stock_', ]; break; case 7: $result = [ 'stock_table' => $prefix . 'pre_in_stock', 'order_table' => $prefix . 'user_in_pre_stock_order', 'user_table' => $prefix . 'user_stock_in', 'log_table' => $prefix . 'user_stock_in_log', 'list_table' => $prefix . 'stock_in_list', 'trade_table' => $prefix . 'stock_in_trade', 'give_order_table' => $prefix . 'user_in_give_stock_order', 'redis_key' => 'IN:STOCK:LIST:', 'stock_id' => 'INR', 'country' => 'India', 'check' => 'idn_stock_', ]; break; case 9: $result = [ 'stock_table' => $prefix . 'pre_sgd_stock', 'order_table' => $prefix . 'user_sgd_pre_stock_order', 'user_table' => $prefix . 'user_stock_sgd', 'log_table' => $prefix . 'user_stock_sgd_log', 'list_table' => $prefix . 'stock_sgd_list', 'trade_table' => $prefix . 'stock_sgd_trade', 'give_order_table' => $prefix . 'user_sgd_give_stock_order', 'redis_key' => 'SGD:STOCK:LIST:', 'stock_id' => 'SGD', 'country' => 'Singapore', 'check' => 'sgd_stock_', ]; break; case 12: $result = [ 'stock_table' => $prefix . 'pre_hkd_stock', 'order_table' => $prefix . 'user_hkd_pre_stock_order', 'user_table' => $prefix . 'user_stock_hkd', 'log_table' => $prefix . 'user_stock_hkd_log', 'list_table' => $prefix . 'stock_hkd_list', 'trade_table' => $prefix . 'stock_hkd_trade', 'give_order_table' => $prefix . 'user_hkd_give_stock_order', 'redis_key' => 'HKD:STOCK:LIST:', 'stock_id' => 'HKD', 'country' => 'HongKong', 'check' => 'hk_stock_', ]; break; case 14: $result = [ 'stock_table' => $prefix . 'pre_gbx_stock', 'order_table' => $prefix . 'user_gbx_pre_stock_order', 'user_table' => $prefix . 'user_stock_gbx', 'log_table' => $prefix . 'user_stock_gbx_log', 'list_table' => $prefix . 'stock_gbx_list', 'trade_table' => $prefix . 'stock_gbx_trade', 'give_order_table' => $prefix . 'user_gbx_give_stock_order', 'redis_key' => 'UK:STOCK:LIST:', 'stock_id' => 'GBX', 'country' => 'UK', 'check' => 'gbx_stock_', ]; break; case 15: $result = [ 'stock_table' => $prefix . 'pre_fur_stock', 'order_table' => $prefix . 'user_fur_pre_stock_order', 'user_table' => $prefix . 'user_stock_fur', 'log_table' => $prefix . 'user_stock_fur_log', 'list_table' => $prefix . 'stock_fur_list', 'trade_table' => $prefix . 'stock_fur_trade', 'give_order_table' => $prefix . 'user_fur_give_stock_order', 'redis_key' => 'FUR:STOCK:LIST:', 'stock_id' => 'EUR', 'country' => 'FUR', 'check' => 'fur_stock_', ]; break; case 16: $result = [ 'stock_table' => $prefix . 'pre_eur_stock', 'order_table' => $prefix . 'user_eur_pre_stock_order', 'user_table' => $prefix . 'user_stock_eur', 'log_table' => $prefix . 'user_stock_eur_log', 'list_table' => $prefix . 'stock_eur_list', 'trade_table' => $prefix . 'stock_eur_trade', 'give_order_table' => $prefix . 'user_eur_give_stock_order', 'redis_key' => 'EUR:STOCK:LIST:', 'stock_id' => 'EUR', 'country' => 'EUR', 'check' => 'eur_stock_', ]; break; case 17: $result = [ 'stock_table' => $prefix . 'pre_brl_stock', 'order_table' => $prefix . 'user_brl_pre_stock_order', 'user_table' => $prefix . 'user_stock_brl', 'log_table' => $prefix . 'user_stock_brl_log', 'list_table' => $prefix . 'stock_brl_list', 'trade_table' => $prefix . 'stock_brl_trade', 'give_order_table' => $prefix . 'user_brl_give_stock_order', 'redis_key' => 'BR:STOCK:LIST:', 'stock_id' => 'BRL', 'country' => 'BRL', 'check' => 'brl_stock_', ]; break; case 18: $result = [ 'stock_table' => $prefix . 'pre_jp_stock', 'order_table' => $prefix . 'user_jp_pre_stock_order', 'user_table' => $prefix . 'user_stock_jp', 'log_table' => $prefix . 'user_stock_jp_log', 'list_table' => $prefix . 'stock_jp_list', 'trade_table' => $prefix . 'stock_jp_trade', 'give_order_table' => $prefix . 'user_jp_give_stock_order', 'redis_key' => 'JP:STOCK:LIST:', 'stock_id' => 'JPY', 'country' => 'Japan', 'check' => 'jp_stock_', ]; break; default: $result = []; break; } return $result; } public function getStockTape($market_type) { //3美股、4印尼股、5马股、6泰股、7印度股、9新加坡股、12港股 $result = []; switch ($market_type) { case 3: $result = [ 'tape' => StockListModel::$tapeList, 'type' => PreUsStockModel::$stockTypeList, ]; break; case 4: $result = [ 'tape' => StockIdnListModel::$tapeList, 'type' => PreIdnStockModel::$stockTypeList, ]; break; case 5: $result = [ 'tape' => StockMysListModel::$tapeList, 'type' => PreMysStockModel::$stockTypeList, ]; break; case 6: $result = [ 'tape' => StockThaListModel::$tapeList, 'type' => PreThaStockModel::$stockTypeList, ]; break; case 7: $result = [ 'tape' => StockInListModel::$tapeList, 'type' => PreInStockModel::$stockTypeList, 'source' => StockInListModel::SOURCE_LIST, ]; break; case 9: $result = [ 'tape' => StockSgdListModel::$tapeList, 'type' => PreSgdStockModel::$stockTypeList, ]; break; case 12: $result = [ 'tape' => StockHkdListModel::$tapeList, 'type' => PreHkdStockModel::$stockTypeList, ]; break; case 14: $result = [ 'tape' => StockGBXListModel::$tapeList, 'type' => PreGBXStockModel::$stockTypeList, ]; break; case 15: $result = [ 'tape' => StockFurListModel::$tapeList, 'type' => PreFurStockModel::$stockTypeList, ]; break; case 16: $result = [ 'tape' => StockEurListModel::$tapeList, 'type' => PreEurStockModel::$stockTypeList, ]; break; case 17: $result = [ 'tape' => StockBrlListModel::$tapeList, 'type' => PreBrlStockModel::$stockTypeList, ]; break; case 18: $result = [ 'tape' => StockJpListModel::$tapeList, 'type' => PreJpStockModel::$stockTypeList, ]; break; } return $result; } }