Merge branch 'dev1023' into dev

解决 9 个冲突文件,并修复合并后遗留问题:

- 大厅候选集:采用 FIFO 窗口 + 全部置顶单 UNION(列表与抢单/拼单复核同源)
- 拼单份额:采用多次参与模型(每次参与 INSERT 新份额、requestId 幂等),
  取消后可重新参与;移除 HEAD 已废弃的单行 rejoin 逻辑与对应测试
- 工单迁移与成本中心 103–108 编号撞车:合并重写为
  109_work_order_share_participation / 110_work_order_hall_and_shop_indexes;
  临时库全量执行与重跑幂等验证通过(10 列、唯一键已删、7 个索引)
- 实时补丁:保留个性化字段、置顶重排、分页总数同步;补回 orderTimelineVisible 类型
- 打手大厅:保留 memo 组件化,移植「再拼一次」多份额按钮逻辑
- 全项目表格统一 PercentTable:WorkerOrderShareTable 改造

验证:backend typecheck/lint/check:sql/test(833 pass)、
frontend typecheck/lint/test(172 pass)/build 全绿。
This commit is contained in:
yml2213
2026-10-26 12:10:53 +08:00
94 changed files with 8991 additions and 744 deletions
@@ -7,7 +7,10 @@ import {
cancelAdminWorkOrderSharing,
deductAdminWorkOrderPendingDeposit,
markAdminWorkOrderProblem,
markAdminWorkOrderShareProblem,
reduceAdminWorkOrderShareQuantity,
resolveAdminProblemWorkOrder,
disposeAdminWorkOrderShareProblem,
} from '../../../services/worker-platform/index.js'
import { createJsonHandler, requireAdminPermission, requireAnyAdminPermission } from '../session.js'
@@ -148,7 +151,7 @@ router.post(
req.adminSession?.displayName || req.adminSession?.username || '',
),
{
successMessage: '拼单参与者已撤单,份数已退回大厅',
successMessage: '拼单参与者已撤单,押金已退还,母单状态保持不变',
errorMessage: '撤销拼单参与者失败',
scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/cancel]',
audit: (req, data) => ({
@@ -161,6 +164,84 @@ router.post(
),
)
// 按份数撤销部分份额:减少的份数自动回到大厅,押金保持原冻结额。
router.post(
'/worker-platform/orders/:workOrderId/shares/:shareId/reduce-quantity',
requireAdminPermission('worker_order.cancel_share'),
createJsonHandler(
(req) =>
reduceAdminWorkOrderShareQuantity(
String(req.params.workOrderId || ''),
String(req.params.shareId || ''),
req.body || {},
req.adminSession?.displayName || req.adminSession?.username || '',
),
{
successMessage: '已撤销指定份数,剩余份数继续履约',
errorMessage: '撤销拼单份额失败',
scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/reduce-quantity]',
audit: (req, data) => ({
action: 'work_order_share_quantity_reduced',
targetType: 'work_order_share',
targetId: String(req.params.shareId || ''),
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
}),
},
),
)
// 份额级问题单:只影响该份额持有人,母单状态不变。
router.post(
'/worker-platform/orders/:workOrderId/shares/:shareId/problem',
requireAdminPermission('worker_order.manage_problem'),
createJsonHandler(
(req) =>
markAdminWorkOrderShareProblem(
String(req.params.workOrderId || ''),
String(req.params.shareId || ''),
req.body || {},
req.adminSession?.displayName || req.adminSession?.username || '',
),
{
successMessage: '该份额已标记为问题单,仅影响该打手',
errorMessage: '标记份额问题单失败',
scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/problem]',
audit: (req, data) => ({
action: 'work_order_share_marked_problem',
targetType: 'work_order_share',
targetId: String(req.params.shareId || ''),
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
}),
},
),
)
// 份额级问题单处置:处置方式与母单一致,但只作用于这一份份额,母单状态不变。
router.post(
'/worker-platform/orders/:workOrderId/shares/:shareId/problem/dispose',
requireAdminPermission('worker_order.manage_problem'),
createJsonHandler(
(req) =>
disposeAdminWorkOrderShareProblem(
String(req.params.workOrderId || ''),
String(req.params.shareId || ''),
req.body || {},
req.adminSession?.displayName || req.adminSession?.username || '',
),
{
successMessage: '该份额问题单已处置',
errorMessage: '处置份额问题单失败',
scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/problem/dispose]',
audit: (req, data) => ({
action: 'work_order_share_problem_disposed',
targetType: 'work_order_share',
targetId: String(req.params.shareId || ''),
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
}),
},
),
)
router.post(
'/worker-platform/orders/:workOrderId/deduct-pending-deposit',
requireAdminPermission('worker_order.deduct_deposit'),