From f2c217544356bb02f36b67de101c71d51a26d248 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:12 +0800
Subject: [PATCH] =?UTF-8?q?feat(=E8=AE=A2=E5=8D=95=E4=B8=AD=E5=8F=B0):=20?=
=?UTF-8?q?=E5=90=8E=E5=8F=B0=E6=96=B0=E5=A2=9E=E3=80=8C=E5=B7=B2=E5=88=A0?=
=?UTF-8?q?=E9=99=A4=E3=80=8D=E9=A1=B5=E7=AD=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 常规页签与统计排除用户删除与后台删除(is_del=0 AND is_system_del=0)
- 新增已删除页签:只列用户已删且后台未删的订单,deleted_count 计数
与列表体同口径(随大类/日期筛选联动)
- 修复统计缓存失效:cache delete 不支持通配,原 order_center:stat:*
清理为静默无效,改版本号 key(statCacheKey/clearStatCache)
---
.../order/OrderCenterController.php | 1 +
.../services/order/OrderCenterServices.php | 58 ++++++++++++++++---
.../src/pages/order/orderCenter/index.vue | 16 +++--
3 files changed, 61 insertions(+), 14 deletions(-)
diff --git a/backend/app/adminapi/controller/order/OrderCenterController.php b/backend/app/adminapi/controller/order/OrderCenterController.php
index 763e4bdc8..734006063 100644
--- a/backend/app/adminapi/controller/order/OrderCenterController.php
+++ b/backend/app/adminapi/controller/order/OrderCenterController.php
@@ -43,6 +43,7 @@ class OrderCenterController extends AuthController
'date_range' => $this->request->param('date_range', ''),
'uid' => (int) $this->request->param('uid', 0),
'after_sale' => $this->request->param('after_sale', ''),
+ 'is_deleted' => (string) $this->request->param('is_deleted', ''),
];
$page = (int) $this->request->param('page', 1);
$limit = (int) $this->request->param('limit', 20);
diff --git a/backend/app/services/order/OrderCenterServices.php b/backend/app/services/order/OrderCenterServices.php
index 211c5c083..abbb9af13 100644
--- a/backend/app/services/order/OrderCenterServices.php
+++ b/backend/app/services/order/OrderCenterServices.php
@@ -220,10 +220,31 @@ class OrderCenterServices extends BaseService implements OrderCenterSyncInterfac
];
$result = $this->dao->saveOrUpdate(['order_no' => $data['order_no']], $insert);
- app()->cache->delete('order_center:stat:*');
+ $this->clearStatCache();
return (bool) $result;
}
+ /**
+ * 订单中台统计缓存 key(带版本号:失效走版本递增,旧 key 靠自身 TTL 自然过期)
+ * cache 的 delete 不支持通配,此前 delete('order_center:stat:*') 为静默无效调用
+ * @param array $where 统计查询条件
+ * @return string 缓存 key
+ */
+ protected function statCacheKey(array $where): string
+ {
+ $ver = (int) app()->cache->get('order_center:stat:ver');
+
+ return 'order_center:stat:v' . ($ver ?: 1) . ':' . md5(json_encode($where));
+ }
+
+ /**
+ * 清除订单中台统计缓存
+ */
+ protected function clearStatCache(): void
+ {
+ app()->cache->set('order_center:stat:ver', (int) app()->cache->get('order_center:stat:ver') + 1, 86400);
+ }
+
/**
* 获取支付方式中文名称
* 从 eb_pay_channel 表动态读取,避免硬编码
@@ -280,7 +301,7 @@ class OrderCenterServices extends BaseService implements OrderCenterSyncInterfac
$this->dao->update(['order_no' => $orderNo], [
'extra_info' => $this->encodeExtraInfo($extraArray),
]);
- app()->cache->delete('order_center:stat:*');
+ $this->clearStatCache();
return true;
}
@@ -294,7 +315,7 @@ class OrderCenterServices extends BaseService implements OrderCenterSyncInterfac
public function updateRecord(string $orderNo, array $data): bool
{
$result = $this->dao->update(['order_no' => $orderNo], $data) !== false;
- app()->cache->delete('order_center:stat:*');
+ $this->clearStatCache();
return $result;
}
@@ -2248,9 +2269,15 @@ class OrderCenterServices extends BaseService implements OrderCenterSyncInterfac
{
$searchWhere = [];
- // 通用:是否后台删除筛选,默认不查已删除;用户删除(is_del)不影响后台可见性
- $isDeleted = $where['is_deleted'] ?? false;
- $searchWhere[] = ['is_system_del', '=', $isDeleted ? 1 : 0];
+ // 通用:is_deleted=1 时为「已删除」tab,只查用户已删且后台未删的订单;
+ // 常规 tab 用户删除与后台删除均不显示
+ if (!empty($where['is_deleted'])) {
+ $searchWhere[] = ['is_del', '=', 1];
+ $searchWhere[] = ['is_system_del', '=', 0];
+ } else {
+ $searchWhere[] = ['is_del', '=', 0];
+ $searchWhere[] = ['is_system_del', '=', 0];
+ }
// 订单大类筛选
if (!empty($where['order_category'])) {
@@ -2503,11 +2530,11 @@ class OrderCenterServices extends BaseService implements OrderCenterSyncInterfac
*/
public function getStatistics(array $where): array
{
- $cacheKey = 'order_center:stat:' . md5(json_encode($where));
+ $cacheKey = $this->statCacheKey($where);
$ttl = empty($where['date_range']) ? 300 : 60;
return app()->cache->remember($cacheKey, function () use ($where) {
- $baseWhere = [['is_system_del', '=', 0]];
+ $baseWhere = [['is_del', '=', 0], ['is_system_del', '=', 0]];
// 按订单大类筛选
if (!empty($where['order_category'])) {
$baseWhere[] = ['order_category', '=', $where['order_category']];
@@ -2563,6 +2590,18 @@ class OrderCenterServices extends BaseService implements OrderCenterSyncInterfac
->field('COUNT(*) as count, SUM(pay_price) as amount')
->find();
+ // 「已删除」tab 计数:用户删除(is_del=1)且后台未删(is_system_del=0),与列表体口径一致,
+ // 随大类/日期筛选联动
+ $deletedWhere = [['is_del', '=', 1], ['is_system_del', '=', 0]];
+ if (!empty($where['order_category'])) {
+ $deletedWhere[] = ['order_category', '=', $where['order_category']];
+ }
+ if (!empty($where['date_range'])) {
+ [$start, $end] = $this->parseDateRange($where['date_range']);
+ $deletedWhere[] = ['add_time', 'BETWEEN', [$start, $end]];
+ }
+ $deletedCount = $this->dao->getDb()->where($deletedWhere)->count();
+
// 补全所有状态码,缺值填0
$statusCounts = [];
foreach (OrderCenter::$statusMap as $code => $label) {
@@ -2595,6 +2634,7 @@ class OrderCenterServices extends BaseService implements OrderCenterSyncInterfac
],
'status_counts' => $statusCounts,
'by_category' => $categoryResult,
+ 'deleted_count' => $deletedCount,
];
}, $ttl);
}
@@ -2627,7 +2667,7 @@ class OrderCenterServices extends BaseService implements OrderCenterSyncInterfac
throw new ApiException('订单未被用户删除,不能删除');
}
$res = $this->dao->update(['id' => $id], ['is_system_del' => 1]) !== false;
- app()->cache->delete('order_center:stat:*');
+ $this->clearStatCache();
return $res;
}
diff --git a/frontend/admin/src/pages/order/orderCenter/index.vue b/frontend/admin/src/pages/order/orderCenter/index.vue
index a80cd248f..4518b3a99 100644
--- a/frontend/admin/src/pages/order/orderCenter/index.vue
+++ b/frontend/admin/src/pages/order/orderCenter/index.vue
@@ -149,6 +149,7 @@
+
@@ -240,8 +241,10 @@
详情
备注
-
- 删除
+
+
+ 删除
+
@@ -331,7 +334,9 @@ function getList(res) {
loading.value = true;
orderCenterList({
...searchForm.value,
- status_code: statusTab.value,
+ // 「已删除」tab 只查用户删除(is_del=1)的订单,不按状态过滤
+ status_code: statusTab.value === 'deleted' ? '' : statusTab.value,
+ is_deleted: statusTab.value === 'deleted' ? 1 : '',
page: page.value.page,
limit: page.value.limit,
})
@@ -359,6 +364,7 @@ function getStat() {
pending_count: d.status_counts?.pending_payment?.count || 0,
completed_count: d.status_counts?.completed?.count || 0,
status_counts: d.status_counts || {},
+ deleted_count: d.deleted_count || 0,
};
})
.catch((res) => {
@@ -446,7 +452,7 @@ function saveRemark() {
function deleteOrder(row) {
ElMessageBox({
title: '提示',
- message: '确定要删除该订单吗?',
+ message: '确定删除该订单吗?删除后后台列表将不再显示。',
showCancelButton: true,
cancelButtonText: '取消',
confirmButtonText: '确定',
@@ -511,7 +517,7 @@ function getPayStatusClass(status) {
}
function getTabLabel(text, statusCode) {
- const count = statData.value.status_counts?.[statusCode]?.count;
+ const count = statusCode === 'deleted' ? statData.value.deleted_count : statData.value.status_counts?.[statusCode]?.count;
return count ? `${text}(${count})` : text;
}