From 8087e69b4195c2d00876285802693f49bcf3b229 Mon Sep 17 00:00:00 2001 From: liyang <2154243450@qq.com> Date: Fri, 17 Oct 2025 10:49:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20ipo=20=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/service/setting/IPOService.php | 106 ++++++++++++++--------- 1 file changed, 65 insertions(+), 41 deletions(-) diff --git a/app/admin/service/setting/IPOService.php b/app/admin/service/setting/IPOService.php index b376f982..1d1a364e 100644 --- a/app/admin/service/setting/IPOService.php +++ b/app/admin/service/setting/IPOService.php @@ -36,6 +36,7 @@ use think\exception\ValidateException; use think\facade\Db; use think\facade\Log; use think\facade\Queue; +use think\facade\Cache; class IPOService extends AdminBaseService { @@ -647,7 +648,6 @@ class IPOService extends AdminBaseService return $this->toData('1', '无法操作'); } - Db::startTrans(); // 修改股票状态 $num = Db::table($table_obj['stock_table'])->where('id', $preInStock['id'])->update([ @@ -662,10 +662,6 @@ class IPOService extends AdminBaseService $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']; @@ -676,13 +672,19 @@ class IPOService extends AdminBaseService $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', '股票转移失败'); + + if (Db::table($table_obj['list_table'])->where('stock_code', $preInStock['stock_code'])->find()) { + $bool = Db::table($table_obj['list_table'])->where('stock_code', $preInStock['stock_code'])->update($inStock); + } else { + $inStock['create_time'] = date('Y-m-d H:i:s'); + $bool = Db::table($table_obj['list_table'])->insert($inStock); + if (!$bool) { + Db::rollback(); + return $this->toData('1', '股票转移失败'); + } } // 加入缓存 @@ -785,46 +787,68 @@ class IPOService extends AdminBaseService return $this->toData('1', '市场类型无效'); } if (empty($param['id']) || !is_numeric($param['id'])) { - return $this->toData('1', '主键 无效'); + 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'], - 'source' => 0, - 'market_type' => $market_type, - ], 'sendGo'); + // ✅【防重复点击】锁键 + $lockKey = "repeatNoteGo_lock_{$market_type}_{$param['id']}_{$param['type']}"; + if (!Cache::store('redis')->setnx($lockKey, 1)) { + return $this->toData('1', '请勿重复操作'); } - 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, - 'source' => 0, - ], 'sendGo'); + // 锁自动过期时间 60 秒(你可以根据需求改为 2-10 秒) + Cache::store('redis')->expire($lockKey, 60); + + try { + $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'], + 'source' => 0, + 'market_type' => $market_type, + ], '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, + 'source' => 0, + ], 'sendGo'); + } + + return $this->toData('0', 'SUCCESS'); + } catch (\Throwable $e) { + return $this->toData('1', '系统错误:' . $e->getMessage()); + } finally { + // ✅ 无论成功或异常都释放锁 + Cache::store('redis')->del($lockKey); } - return $this->toData('0', 'SUCCESS'); } - /** * 处理股票IPO中签 */