434 lines
12 KiB
TypeScript
434 lines
12 KiB
TypeScript
import { Router } from "express";
|
|
|
|
import {
|
|
closeAdminTask,
|
|
completeAdminTaskManualDispatch,
|
|
confirmAdminTaskAssistedRole,
|
|
dispatchAdminTaskKuaishouCloudFulfillment,
|
|
markAdminTaskManualReview,
|
|
prepareAdminTaskKuaishouCloudFulfillment,
|
|
refreshAdminTaskKuaishouCloudRoleInfo,
|
|
regenerateAdminTaskClaimLink,
|
|
redeemAdminTaskAssisted,
|
|
releaseAdminTaskInventoryBinding,
|
|
releaseAdminTaskInventory,
|
|
returnNumberAdminTaskKuaishouCloudFulfillment,
|
|
retryAdminTask,
|
|
} from "../../services/admin/admin-write-service.js";
|
|
import {
|
|
getAdminTaskDetail,
|
|
getAdminTaskScreenshotPath,
|
|
getAdminTasks,
|
|
} from "../../services/admin/admin-read-service.js";
|
|
import {
|
|
createFileHandler,
|
|
createJsonHandler,
|
|
requireAdminRoles,
|
|
} from "./shared.js";
|
|
import type { Request } from "express";
|
|
import type {
|
|
AdminTaskKuaishouCloudDispatchRouteBody,
|
|
AdminTaskManualDispatchRouteBody,
|
|
AdminTaskRouteParams,
|
|
AdminTaskRouteQuery,
|
|
} from "../../types/admin-route-inputs.js";
|
|
import type {
|
|
AdminTaskActionResponse,
|
|
AdminTaskBindingReleaseResponse,
|
|
AdminTaskManualDispatchResponse,
|
|
} from "../../types/admin-write-models.js";
|
|
|
|
const router = Router();
|
|
|
|
function getTaskId(req: Request): string | undefined {
|
|
return (req.params as AdminTaskRouteParams).taskId;
|
|
}
|
|
|
|
function getBindingId(req: Request): string | undefined {
|
|
return (req.params as AdminTaskRouteParams).bindingId;
|
|
}
|
|
|
|
router.get(
|
|
"/tasks",
|
|
createJsonHandler(
|
|
(req) =>
|
|
getAdminTasks(req.query as AdminTaskRouteQuery, req.adminSession || null),
|
|
{
|
|
successMessage: "ok",
|
|
errorMessage: "读取任务列表失败",
|
|
scope: "[admin/tasks]",
|
|
}
|
|
)
|
|
);
|
|
|
|
router.get(
|
|
"/tasks/:taskId",
|
|
createJsonHandler(
|
|
(req) => getAdminTaskDetail(getTaskId(req), req.adminSession || null),
|
|
{
|
|
successMessage: "ok",
|
|
errorMessage: "读取任务详情失败",
|
|
scope: "[admin/tasks/:taskId]",
|
|
}
|
|
)
|
|
);
|
|
|
|
router.get(
|
|
"/tasks/:taskId/screenshot",
|
|
createFileHandler(
|
|
(req) =>
|
|
getAdminTaskScreenshotPath(getTaskId(req), req.adminSession || null),
|
|
{
|
|
errorMessage: "读取任务截图失败",
|
|
scope: "[admin/tasks/:taskId/screenshot]",
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/retry",
|
|
requireAdminRoles(["admin", "operator"]),
|
|
createJsonHandler((req) => retryAdminTask(getTaskId(req)), {
|
|
successMessage: "任务已重试",
|
|
errorMessage: "重试任务失败",
|
|
scope: "[admin/tasks/:taskId/retry]",
|
|
})
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/release-inventory",
|
|
requireAdminRoles(["admin"]),
|
|
createJsonHandler((req) => releaseAdminTaskInventory(getTaskId(req)), {
|
|
successMessage: "库存凭据已释放",
|
|
errorMessage: "释放库存凭据失败",
|
|
scope: "[admin/tasks/:taskId/release-inventory]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_release_inventory",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
inventoryItemId: result.task.inventoryItemId,
|
|
},
|
|
};
|
|
},
|
|
})
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/inventory-bindings/:bindingId/release",
|
|
requireAdminRoles(["admin"]),
|
|
createJsonHandler(
|
|
(req) =>
|
|
releaseAdminTaskInventoryBinding(getTaskId(req), getBindingId(req)),
|
|
{
|
|
successMessage: "库存绑定已释放",
|
|
errorMessage: "释放库存绑定失败",
|
|
scope: "[admin/tasks/:taskId/inventory-bindings/:bindingId/release]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskBindingReleaseResponse;
|
|
return {
|
|
action: "task_release_inventory_binding",
|
|
targetType: "task_inventory_binding",
|
|
targetId: String(getBindingId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
bindingId: result.bindingId,
|
|
inventoryItemId: result.inventoryItemId,
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/regenerate-claim-link",
|
|
requireAdminRoles(["admin", "operator", "support"]),
|
|
createJsonHandler(
|
|
(req) =>
|
|
regenerateAdminTaskClaimLink(getTaskId(req), req.adminSession || null),
|
|
{
|
|
successMessage: "领取链接已重新生成",
|
|
errorMessage: "重新生成领取链接失败",
|
|
scope: "[admin/tasks/:taskId/regenerate-claim-link]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_regenerate_claim_link",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
primaryClaimTokenId: result.task.primaryClaimTokenId,
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/support-confirm-role",
|
|
requireAdminRoles(["admin", "operator", "support"]),
|
|
createJsonHandler(
|
|
(req) =>
|
|
confirmAdminTaskAssistedRole(getTaskId(req), req.adminSession || null),
|
|
{
|
|
successMessage: "角色已确认",
|
|
errorMessage: "客服确认角色失败",
|
|
scope: "[admin/tasks/:taskId/support-confirm-role]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_support_confirm_role",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
status: result.task.status,
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/support-redeem",
|
|
requireAdminRoles(["admin", "operator", "support"]),
|
|
createJsonHandler(
|
|
(req) => redeemAdminTaskAssisted(getTaskId(req), req.adminSession || null),
|
|
{
|
|
successMessage: "兑换任务已启动",
|
|
errorMessage: "客服发起兑换失败",
|
|
scope: "[admin/tasks/:taskId/support-redeem]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_support_redeem",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
status: result.task.status,
|
|
deliveryStatus: result.task.deliveryStatus,
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/close",
|
|
requireAdminRoles(["admin", "operator", "support"]),
|
|
createJsonHandler((req) => closeAdminTask(getTaskId(req)), {
|
|
successMessage: "任务已关闭",
|
|
errorMessage: "关闭任务失败",
|
|
scope: "[admin/tasks/:taskId/close]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_closed",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
status: result.task.status,
|
|
},
|
|
};
|
|
},
|
|
})
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/mark-manual-review",
|
|
requireAdminRoles(["admin", "operator"]),
|
|
createJsonHandler((req) => markAdminTaskManualReview(getTaskId(req)), {
|
|
successMessage: "任务已转人工处理",
|
|
errorMessage: "标记人工处理失败",
|
|
scope: "[admin/tasks/:taskId/mark-manual-review]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_mark_manual_review",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
status: result.task.status,
|
|
},
|
|
};
|
|
},
|
|
})
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/complete-manual-dispatch",
|
|
requireAdminRoles(["admin", "operator"]),
|
|
createJsonHandler(
|
|
(req) =>
|
|
completeAdminTaskManualDispatch(
|
|
getTaskId(req),
|
|
req.body as AdminTaskManualDispatchRouteBody,
|
|
req.adminSession || null
|
|
),
|
|
{
|
|
successMessage: "人工履约结果已回写",
|
|
errorMessage: "回写人工履约结果失败",
|
|
scope: "[admin/tasks/:taskId/complete-manual-dispatch]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskManualDispatchResponse;
|
|
return {
|
|
action: "task_complete_manual_dispatch",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
outcome: result.outcome,
|
|
deliveryStatus: result.task.deliveryStatus,
|
|
resultCode: result.task.resultCode,
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/kuaishou-cloud/prepare",
|
|
requireAdminRoles(["admin", "operator"]),
|
|
createJsonHandler(
|
|
(req) =>
|
|
prepareAdminTaskKuaishouCloudFulfillment(
|
|
getTaskId(req),
|
|
req.adminSession || null
|
|
),
|
|
{
|
|
successMessage: "绑定资源已准备完成",
|
|
errorMessage: "准备绑定资源失败",
|
|
scope: "[admin/tasks/:taskId/kuaishou-cloud/prepare]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_kuaishou_cloud_prepare",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
status: result.task.status,
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/kuaishou-cloud/refresh-role-info",
|
|
requireAdminRoles(["admin", "operator", "support"]),
|
|
createJsonHandler(
|
|
(req) =>
|
|
refreshAdminTaskKuaishouCloudRoleInfo(
|
|
getTaskId(req),
|
|
req.adminSession || null
|
|
),
|
|
{
|
|
successMessage: "角色信息已刷新",
|
|
errorMessage: "刷新角色信息失败",
|
|
scope: "[admin/tasks/:taskId/kuaishou-cloud/refresh-role-info]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_kuaishou_cloud_role_info_refreshed",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
status: result.task.status,
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/kuaishou-cloud/dispatch",
|
|
requireAdminRoles(["admin", "operator"]),
|
|
createJsonHandler(
|
|
(req) =>
|
|
dispatchAdminTaskKuaishouCloudFulfillment(
|
|
getTaskId(req),
|
|
req.body as AdminTaskKuaishouCloudDispatchRouteBody,
|
|
req.adminSession || null
|
|
),
|
|
{
|
|
successMessage: "已完成绑定确认并发货",
|
|
errorMessage: "执行发货失败",
|
|
scope: "[admin/tasks/:taskId/kuaishou-cloud/dispatch]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
const body = req.body as AdminTaskKuaishouCloudDispatchRouteBody;
|
|
return {
|
|
action: "task_kuaishou_cloud_dispatch",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
status: result.task.status,
|
|
deliveryStatus: result.task.deliveryStatus,
|
|
ticketCodeProvided: Boolean(String(body.ticketCode || "").trim()),
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
router.post(
|
|
"/tasks/:taskId/kuaishou-cloud/return-number",
|
|
requireAdminRoles(["admin", "operator"]),
|
|
createJsonHandler(
|
|
(req) =>
|
|
returnNumberAdminTaskKuaishouCloudFulfillment(
|
|
getTaskId(req),
|
|
req.adminSession || null
|
|
),
|
|
{
|
|
successMessage: "号码已退还",
|
|
errorMessage: "退还号码失败",
|
|
scope: "[admin/tasks/:taskId/kuaishou-cloud/return-number]",
|
|
audit: (req, data) => {
|
|
const result = data as AdminTaskActionResponse;
|
|
return {
|
|
action: "task_kuaishou_cloud_return_number",
|
|
targetType: "task",
|
|
targetId: String(getTaskId(req)),
|
|
data: {
|
|
taskId: result.task.taskId,
|
|
taskNo: result.task.taskNo,
|
|
status: result.task.status,
|
|
},
|
|
};
|
|
},
|
|
}
|
|
)
|
|
);
|
|
|
|
export default router;
|