From 27e1b529a8758433b1439ed5627dfd062ca9a6aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=98=8A=E5=A4=A9?= <442384644@qq.com> Date: Fri, 9 Oct 2026 14:08:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=AE=9E=E7=89=A9=E8=AE=A2=E5=8D=95):=20?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E8=AE=A2=E5=8D=95=E5=88=A0=E9=99=A4=E8=AF=AD?= =?UTF-8?q?=E4=B9=89=E5=B9=B6=E4=BF=AE=E5=A4=8D=E5=88=A0=E9=99=A4=E9=93=BE?= =?UTF-8?q?=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 列表/统计/导出口径与中台一致:常规排除双标记,已删除只列 用户已删且后台未删的订单 - 删除去掉状态门槛,改由中台守卫(用户已删)拦截,ApiException 消息透出(原先被吞成「删除失败」) - 修复 softDelete 两处死代码:centerServices->get 传 string 撞 BaseDao ?array 严格类型;扩展表 eb_pt_normal_order 无 is_del 列, 源表同步移除,删除标记以中台为唯一真源 - 前端删除入口只在「已删除」页签展示,批量发货反之;确认文案与 导出参数同步对齐 --- .../controller/admin/OrderController.php | 40 ++++++------------- .../product/normal/service/OrderServices.php | 9 ++--- .../src/pages/plugin/normal/order/List.vue | 7 ++-- .../normal/order/components/OrderTable.vue | 15 +++---- 4 files changed, 28 insertions(+), 43 deletions(-) diff --git a/backend/modules/product/normal/controller/admin/OrderController.php b/backend/modules/product/normal/controller/admin/OrderController.php index dfa34014d..0cc588444 100644 --- a/backend/modules/product/normal/controller/admin/OrderController.php +++ b/backend/modules/product/normal/controller/admin/OrderController.php @@ -85,6 +85,7 @@ class OrderController extends AuthController $candidateQuery = $centerDao->getDb() ->where($baseWhere) ->where('is_del', '=', 0) + ->where('is_system_del', '=', 0) ->where('status_code', '<>', 'canceled'); $this->applyCommonFilter($candidateQuery, $commonFilter); $candidateOrderNos = $candidateQuery->column('order_no'); @@ -99,7 +100,8 @@ class OrderController extends AuthController $query = $centerDao->getDb() ->where($baseWhere) ->where('status_code', '=', $statusCode) - ->where('is_del', '=', 0)->where('status_code', '<>', 'canceled'); + ->where('is_del', '=', 0)->where('is_system_del', '=', 0) + ->where('status_code', '<>', 'canceled'); $this->applyCommonFilter($query, $commonFilter); $businessStats[$statusCode] = $query->count(); } else { @@ -107,7 +109,8 @@ class OrderController extends AuthController foreach ($node['children'] as $childKey => $child) { $query = $centerDao->getDb() ->where($baseWhere) - ->where('is_del', '=', 0)->where('status_code', '<>', 'canceled'); + ->where('is_del', '=', 0)->where('is_system_del', '=', 0) + ->where('status_code', '<>', 'canceled'); $this->applyCommonFilter($query, $commonFilter); // 应用子状态特有的筛选条件 if (!empty($child['filter'])) { @@ -127,9 +130,9 @@ class OrderController extends AuthController } } - // 已删除 + // 已删除(用户删除且后台未删,与「已删除」页签列表口径一致) $delQuery = $centerDao->getDb() - ->where($baseWhere)->where('is_del', '=', 1); + ->where($baseWhere)->where('is_del', '=', 1)->where('is_system_del', '=', 0); $this->applyCommonFilter($delQuery, $commonFilter); $businessStats['deleted'] = $delQuery->count(); @@ -956,19 +959,12 @@ class OrderController extends AuthController return app('json')->fail('参数错误'); } - // 校验订单状态,已支付/已发货订单不能删除 - $order = $centerServices->get($id, 'status_code, pay_status, delivery_time'); - if (!$order) { - return app('json')->fail('订单不存在'); - } - $statusCode = $order['status_code']; - if (!in_array($statusCode, ['pending_payment', 'canceled'])) { - return app('json')->fail('已支付/已发货的订单不能删除,如需清理请先取消订单'); - } - try { + // softDelete → 中台 delete:仅允许删除用户已删的订单,写 is_system_del 隐藏后台 $orderServices->softDelete($id); return app('json')->success('删除成功'); + } catch (ApiException $e) { + return app('json')->fail($e->getMessage()); } catch (\Throwable $e) { Log::error('[NormalOrder] delete failed: ' . $e->getMessage()); return app('json')->fail('删除失败'); @@ -1037,7 +1033,7 @@ class OrderController extends AuthController try { // 如果没有订单号,通过 ID 查询 if (empty($orderNo) && $id > 0) { - $order = $centerServices->get($id, 'order_no'); + $order = $centerServices->get($id, ['order_no']); if ($order) { $orderNo = $order['order_no']; } @@ -1237,18 +1233,7 @@ class OrderController extends AuthController foreach ($ids as $id) { try { - $order = $centerServices->get((int)$id, 'status_code, pay_status'); - if (!$order) { - $fail++; - $errors[] = "订单ID {$id} 不存在"; - continue; - } - $statusCode = $order['status_code']; - if (!in_array($statusCode, ['pending_payment', 'canceled'])) { - $fail++; - $errors[] = "订单ID {$id} 状态不允许删除"; - continue; - } + // 与单笔删除一致:由中台守卫校验「用户已删」,写 is_system_del $orderServices->softDelete((int)$id); $success++; } catch (\Throwable $e) { @@ -1277,6 +1262,7 @@ class OrderController extends AuthController ['date_range', ''], ['pay_type', ''], ['type', ''], + ['is_deleted', ''], ]); $where['order_category'] = 'goods'; $where['product_type'] = 'normal'; diff --git a/backend/modules/product/normal/service/OrderServices.php b/backend/modules/product/normal/service/OrderServices.php index f61e9c831..ca5291ef2 100644 --- a/backend/modules/product/normal/service/OrderServices.php +++ b/backend/modules/product/normal/service/OrderServices.php @@ -522,17 +522,14 @@ class OrderServices extends BaseService // ===== 软删除 ===== /** - * 软删除订单(中台表 is_del = 1 + 扩展表同步) + * 软删除订单(中台 is_system_del = 1) + * 中台 delete 守卫要求用户已删,仅用于后台清理用户删除过的订单; + * 扩展表 eb_pt_normal_order 无删除列,删除标记以中台为唯一真源 * @param int $id 中台表 id * @return void */ public function softDelete(int $id): void { - // 获取 order_no 用于同步扩展表 - $order = $this->centerServices->get($id, 'order_no'); - if ($order && !empty($order['order_no'])) { - $this->dao->update(['order_no' => $order['order_no']], ['is_del' => 1]); - } $this->centerServices->delete($id); } diff --git a/frontend/admin/src/pages/plugin/normal/order/List.vue b/frontend/admin/src/pages/plugin/normal/order/List.vue index da09ebf5a..edcc72633 100644 --- a/frontend/admin/src/pages/plugin/normal/order/List.vue +++ b/frontend/admin/src/pages/plugin/normal/order/List.vue @@ -578,7 +578,7 @@ function openPrintWindow(data, type) { function handleDelete(row) { ElMessageBox({ title: '提示', - message: '确定要删除该订单吗?', + message: '确定删除该订单吗?删除后后台列表将不再显示。', showCancelButton: true, cancelButtonText: '取消', confirmButtonText: '确定', @@ -709,7 +709,7 @@ function handleBatchDelete() { } ElMessageBox({ title: '提示', - message: '确定要批量删除选中的订单吗?', + message: '确定批量删除选中的订单吗?删除后后台列表将不再显示。', showCancelButton: true, cancelButtonText: '取消', confirmButtonText: '确定', @@ -745,7 +745,8 @@ function handleExport() { page: 1, limit: 200, ...searchParams.value, - status_code: statusTab.value, + status_code: statusTab.value === 'deleted' ? '' : statusTab.value, + is_deleted: statusTab.value === 'deleted' ? 1 : '', }; doExport(params); }) diff --git a/frontend/admin/src/pages/plugin/normal/order/components/OrderTable.vue b/frontend/admin/src/pages/plugin/normal/order/components/OrderTable.vue index b6b1c7315..a9bd96b76 100644 --- a/frontend/admin/src/pages/plugin/normal/order/components/OrderTable.vue +++ b/frontend/admin/src/pages/plugin/normal/order/components/OrderTable.vue @@ -14,8 +14,10 @@
@@ -186,7 +188,7 @@ >配送信息 -