修复接单物品规则管理

This commit is contained in:
yml2213
2026-08-10 15:53:11 +08:00
parent bcde47ef97
commit 16f9531b40
6 changed files with 185 additions and 7 deletions
@@ -0,0 +1,19 @@
-- 修复历史库中迁移记录已存在、但 008/009 的接单字段未实际落库的情况。
-- 所有变更均幂等,正常完成过旧迁移的数据库不会受影响。
ALTER TABLE work_orders ADD COLUMN IF NOT EXISTS sharing_enabled BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE work_orders ADD COLUMN IF NOT EXISTS sharing_total_quantity INTEGER NOT NULL DEFAULT 1;
ALTER TABLE work_orders ADD COLUMN IF NOT EXISTS sharing_unit_reward INTEGER NOT NULL DEFAULT 0;
ALTER TABLE work_orders ADD COLUMN IF NOT EXISTS deadline_at TIMESTAMPTZ;
ALTER TABLE work_orders ADD COLUMN IF NOT EXISTS timeout_minutes INTEGER NOT NULL DEFAULT 0;
ALTER TABLE work_orders ADD COLUMN IF NOT EXISTS timeout_policy TEXT NOT NULL DEFAULT 'reopen';
ALTER TABLE work_product_rules ADD COLUMN IF NOT EXISTS sharing_enabled BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE work_product_rules ADD COLUMN IF NOT EXISTS sharing_total_quantity INTEGER NOT NULL DEFAULT 1;
ALTER TABLE work_product_rules ADD COLUMN IF NOT EXISTS sharing_unit_reward INTEGER NOT NULL DEFAULT 0;
ALTER TABLE work_product_rules ADD COLUMN IF NOT EXISTS timeout_minutes INTEGER NOT NULL DEFAULT 0;
ALTER TABLE work_product_rules ADD COLUMN IF NOT EXISTS timeout_policy TEXT NOT NULL DEFAULT 'reopen';
CREATE INDEX IF NOT EXISTS idx_work_orders_deadline
ON work_orders(status, deadline_at)
WHERE deadline_at IS NOT NULL;
@@ -391,6 +391,16 @@ export async function getWorkProductRuleByKey(ruleKey: string): Promise<WorkProd
return result.rows[0] || null
}
export async function deleteWorkProductRule(
ruleId: number | string,
): Promise<{ deleted: boolean }> {
const result = await query<{ id: number }>(
'DELETE FROM work_product_rules WHERE id = $1 RETURNING id',
[Number(ruleId)],
)
return { deleted: Boolean(result.rows[0]) }
}
export async function upsertWorkProductRule(input: {
ruleKey: string
provider: string
@@ -6,6 +6,7 @@ import {
createAdminMockWorkOrder,
deductAdminWorkOrderPendingDeposit,
deleteAdminWorkCategory,
deleteAdminWorkProductRule,
deleteAdminWorkOrder,
deleteAdminWorkerLevel,
getAdminWorkerFinanceConfig,
@@ -157,6 +158,22 @@ router.post(
}),
)
router.delete(
'/worker-platform/product-rules/:ruleId',
requireAdminRoles(['admin', 'operator']),
createJsonHandler((req) => deleteAdminWorkProductRule(String(req.params.ruleId || '')), {
successMessage: '接单物品规则已删除',
errorMessage: '删除接单物品规则失败',
scope: '[admin/worker-platform/product-rules/:ruleId]',
audit: (_req, data) => ({
action: 'work_product_rule_deleted',
targetType: 'work_product_rule',
targetId: String(_req.params.ruleId || ''),
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
}),
}),
)
router.get(
'/worker-platform/workers',
requireAdminRoles(['admin', 'operator', 'support']),
@@ -21,6 +21,7 @@ import {
createWorkerUser,
deductPendingDepositUnfreeze,
deleteWorkCategory,
deleteWorkProductRule,
deleteWorkOrder,
deleteWorkerLevel,
getWorkerFinanceRequestById,
@@ -293,6 +294,24 @@ export async function saveAdminWorkProductRule(payload: JsonObject = {}) {
return { rule: mapWorkProductRule(rule) }
}
export async function deleteAdminWorkProductRule(ruleId: number | string) {
const normalizedRuleId = normalizeOptionalId(ruleId)
if (!normalizedRuleId) {
throw createHttpError('物品规则 ID 不正确', {
statusCode: 400,
errorCode: 'work_product_rule_id_invalid',
})
}
const { deleted } = await deleteWorkProductRule(normalizedRuleId)
if (!deleted) {
throw createHttpError('物品规则不存在或已删除', {
statusCode: 404,
errorCode: 'work_product_rule_not_found',
})
}
return { deleted }
}
export async function listAdminWorkerUsers(query: JsonObject = {}) {
const page = normalizePage(query.page)
const pageSize = normalizePageSize(query.pageSize)