refactor backend route and fulfillment modules

This commit is contained in:
yml
2026-05-21 18:38:04 +08:00
parent 1a9c832c7a
commit efa41ba976
22 changed files with 2441 additions and 2246 deletions
+15 -914
View File
@@ -1,922 +1,23 @@
import { Router } from "express";
import {
appointAdminCloudtentaclesVirtualNumber,
backAdminCloudtentaclesVirtualNumber,
buyAdminCloudtentaclesSku,
fetchAdminCloudtentaclesVirtualNumberCode,
generateAdminCloudtentaclesLoginCode,
getAdminCloudtentaclesAsset,
getAdminCloudtentaclesBindUrl,
getAdminCloudtentaclesCategories,
getAdminNotificationConfig,
getAdminScheduledJobsConfig,
getAdminKuaishouCloudFulfillmentConfig,
getAdminKuaishouEticketSourceConfig,
getAdminCloudtentaclesKnapsack,
listAdminCloudtentaclesSources,
deleteAdminCloudtentaclesSource,
getAdminCloudtentaclesSkuList,
useAdminCloudtentaclesSku,
getAdminAgisoShopConfigs,
getAdminFulfillmentBindingConfigs,
getAdminNinetyoneOrders,
consumeAdminKuaishouEticket,
failAdminNinetyoneOrder,
listAdminCloudtentaclesVirtualNumbers,
lookupAdminFulfillmentBindingOrder,
queryAdminKuaishouEticketShopInfo,
queryAdminKuaishouEticketDetail,
retryAdminNinetyoneOrder,
runAdminCloudtentaclesFullFlow,
runAdminScheduledJobNow,
sendAdminCloudtentaclesSmsCode,
testAdminNotification,
testAdminCloudtentaclesLogin,
updateAdminKuaishouCloudFulfillmentConfig,
updateAdminKuaishouEticketSourceConfig,
updateAdminCloudtentaclesSourceConfig,
updateAdminNotificationConfig,
updateAdminScheduledJobsConfig,
updateAdminAgisoShopConfigs,
updateAdminFulfillmentBindingConfigs,
verifyAdminCloudtentaclesLoginCode,
validateAdminCloudtentaclesSession,
} from "../../services/admin/platform-config/service.js";
import { createJsonHandler, requireAdminRoles } from "./shared.js";
import type { AdminAgisoShopConfigSaveResponse } from "../../types/admin-write-models.js";
import type {
AdminAgisoShopConfigRouteBody,
AdminCloudtentaclesCatalogQueryRouteBody,
AdminCloudtentaclesFullFlowRouteBody,
AdminCloudtentaclesSendSmsCodeRouteBody,
AdminCloudtentaclesSkuBuyRouteBody,
AdminCloudtentaclesSkuUseRouteBody,
AdminCloudtentaclesSourceConfigRouteBody,
AdminCloudtentaclesTestLoginRouteBody,
AdminCloudtentaclesValidateSessionRouteBody,
AdminCloudtentaclesVirtualNumberRouteBody,
AdminEntityRouteParams,
AdminFulfillmentBindingConfigRouteBody,
AdminFulfillmentBindingLookupRouteBody,
AdminKuaishouCloudFulfillmentConfigRouteBody,
AdminKuaishouEticketConsumeRouteBody,
AdminKuaishouEticketDetailQueryRouteBody,
AdminKuaishouEticketShopInfoRouteBody,
AdminKuaishouEticketSourceConfigRouteBody,
AdminNotificationConfigRouteBody,
AdminNotificationTestRouteBody,
AdminScheduledJobsConfigRouteBody,
} from "../../types/admin-route-inputs.js";
import { requireAdminRoles } from "./shared.js";
import agisoRouter from "./platform-config/agiso.js";
import cloudtentaclesRouter from "./platform-config/cloudtentacles.js";
import fulfillmentBindingsRouter from "./platform-config/fulfillment-bindings.js";
import kuaishouCloudFulfillmentRouter from "./platform-config/kuaishou-cloud-fulfillment.js";
import kuaishouEticketRouter from "./platform-config/kuaishou-eticket.js";
import ninetyoneRouter from "./platform-config/ninetyone.js";
import notificationsRouter from "./platform-config/notifications.js";
const router = Router();
type JsonRecord = Record<string, any>;
router.use("/platform-config", requireAdminRoles(["admin"]));
router.get(
"/platform-config/agiso-shops",
createJsonHandler(() => getAdminAgisoShopConfigs(), {
successMessage: "ok",
errorMessage: "读取 Agiso 店铺配置失败",
scope: "[admin/platform-config/agiso-shops]",
})
);
router.post(
"/platform-config/agiso-shops",
createJsonHandler(
(req) =>
updateAdminAgisoShopConfigs(
req.body as AdminAgisoShopConfigRouteBody
),
{
successMessage: "Agiso 店铺配置已保存",
errorMessage: "保存 Agiso 店铺配置失败",
scope: "[admin/platform-config/agiso-shops]",
audit: (_req, data) => {
const result = data as AdminAgisoShopConfigSaveResponse;
return {
action: "platform_shop_config_updated",
targetType: "platform_config",
targetId: "agiso_shops",
data: {
shopCount: result.shops.length,
filePath: result.filePath,
},
};
},
}
)
);
router.get(
"/platform-config/notifications",
createJsonHandler(() => getAdminNotificationConfig(), {
successMessage: "ok",
errorMessage: "读取内部通知配置失败",
scope: "[admin/platform-config/notifications]",
})
);
router.post(
"/platform-config/notifications",
createJsonHandler(
(req) =>
updateAdminNotificationConfig(
req.body as AdminNotificationConfigRouteBody
),
{
successMessage: "内部通知配置已保存",
errorMessage: "保存内部通知配置失败",
scope: "[admin/platform-config/notifications]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_notification_config_updated",
targetType: "platform_config",
targetId: "notifications",
data: {
filePath: String(result.filePath || "").trim(),
enabled: Boolean(result.source?.enabled),
barkRecipientCount: Array.isArray(
result.source?.channels?.bark?.recipients
)
? result.source.channels.bark.recipients.length
: 0,
},
};
},
}
)
);
router.post(
"/platform-config/notifications/test",
createJsonHandler(
(req) =>
testAdminNotification(
req.body as AdminNotificationTestRouteBody
),
{
successMessage: "内部通知测试已执行",
errorMessage: "内部通知测试失败",
scope: "[admin/platform-config/notifications/test]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_notification_test_sent",
targetType: "platform_config",
targetId: "notifications",
data: {
channel: String(result.channel || "").trim(),
successCount: Number(result.successCount || 0),
failedCount: Number(result.failedCount || 0),
},
};
},
}
)
);
router.get(
"/platform-config/scheduled-jobs",
createJsonHandler(() => getAdminScheduledJobsConfig(), {
successMessage: "ok",
errorMessage: "读取定时任务配置失败",
scope: "[admin/platform-config/scheduled-jobs]",
})
);
router.post(
"/platform-config/scheduled-jobs",
createJsonHandler(
(req) =>
updateAdminScheduledJobsConfig(
req.body as AdminScheduledJobsConfigRouteBody
),
{
successMessage: "定时任务配置已保存",
errorMessage: "保存定时任务配置失败",
scope: "[admin/platform-config/scheduled-jobs]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_scheduled_jobs_updated",
targetType: "platform_config",
targetId: "scheduled_jobs",
data: {
filePath: String(result.filePath || "").trim(),
enabled: Boolean(result.source?.enabled),
jobCount: Array.isArray(result.source?.jobs)
? result.source.jobs.length
: 0,
},
};
},
}
)
);
router.post(
"/platform-config/scheduled-jobs/:id/run",
createJsonHandler(
(req) =>
runAdminScheduledJobNow(
(req.params as AdminEntityRouteParams).id
),
{
successMessage: "定时任务已执行",
errorMessage: "执行定时任务失败",
scope: "[admin/platform-config/scheduled-jobs/:id/run]",
audit: (req, data) => {
const result = data as JsonRecord;
return {
action: "platform_scheduled_job_run",
targetType: "platform_config",
targetId: String(
(req.params as AdminEntityRouteParams).id || ""
).trim(),
data: {
status: String(result.result?.status || "").trim(),
message: String(result.result?.message || "").trim(),
},
};
},
}
)
);
router.get(
"/platform-config/kuaishou-eticket-source",
createJsonHandler(() => getAdminKuaishouEticketSourceConfig(), {
successMessage: "ok",
errorMessage: "读取快手小店核销配置失败",
scope: "[admin/platform-config/kuaishou-eticket-source]",
})
);
router.post(
"/platform-config/kuaishou-eticket-source",
createJsonHandler(
(req) =>
updateAdminKuaishouEticketSourceConfig(
req.body as AdminKuaishouEticketSourceConfigRouteBody
),
{
successMessage: "快手小店核销配置已保存",
errorMessage: "保存快手小店核销配置失败",
scope: "[admin/platform-config/kuaishou-eticket-source]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_kuaishou_eticket_source_updated",
targetType: "platform_config",
targetId: "kuaishou_eticket_source",
data: {
filePath: String(result.filePath || "").trim(),
enabled: Boolean(result.source?.enabled),
shopCount: Array.isArray(result.source?.shops)
? result.source.shops.length
: 0,
},
};
},
}
)
);
router.get(
"/platform-config/ninetyone/orders",
createJsonHandler((req) => getAdminNinetyoneOrders(req.query), {
successMessage: "ok",
errorMessage: "读取 91卡券订单失败",
scope: "[admin/platform-config/ninetyone/orders]",
})
);
router.post(
"/platform-config/ninetyone/orders/:id/retry",
createJsonHandler(
(req) =>
retryAdminNinetyoneOrder(
(req.params as AdminEntityRouteParams).id
),
{
successMessage: "91卡券订单已重试",
errorMessage: "重试 91卡券订单失败",
scope: "[admin/platform-config/ninetyone/orders/:id/retry]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_ninetyone_order_retried",
targetType: "order",
targetId: String(result.orderId || "").trim(),
data: {
orderNo: String(result.orderNo || "").trim(),
taskCount: Number(result.taskCount || 0),
},
};
},
}
)
);
router.post(
"/platform-config/ninetyone/orders/:id/fail",
createJsonHandler(
(req) =>
failAdminNinetyoneOrder(
(req.params as AdminEntityRouteParams).id,
req.body as { reason?: string }
),
{
successMessage: "91卡券订单已标记失败",
errorMessage: "标记 91卡券订单失败",
scope: "[admin/platform-config/ninetyone/orders/:id/fail]",
audit: (req, data) => {
const result = data as JsonRecord;
return {
action: "platform_ninetyone_order_failed",
targetType: "order",
targetId: String(result.orderId || "").trim(),
data: {
orderNo: String(result.orderNo || "").trim(),
reason: String(
(req.body as { reason?: string }).reason || ""
).trim(),
},
};
},
}
)
);
router.post(
"/platform-config/kuaishou-eticket/query-detail",
createJsonHandler(
(req) =>
queryAdminKuaishouEticketDetail(
req.body as AdminKuaishouEticketDetailQueryRouteBody
),
{
successMessage: "快手小店核销信息查询成功",
errorMessage: "查询快手小店核销信息失败",
scope: "[admin/platform-config/kuaishou-eticket/query-detail]",
audit: (req, data) => {
const body = req.body as AdminKuaishouEticketDetailQueryRouteBody;
const result = data as JsonRecord;
return {
action: "platform_kuaishou_eticket_query_detail",
targetType: "platform_config",
targetId:
String(result.eTicketId || body.eTicketId || "").trim() ||
"kuaishou_eticket",
data: {
result: Number(result.result || 0),
ok: Boolean(result.ok),
alreadyConsumed: Boolean(result.alreadyConsumed),
},
};
},
}
)
);
router.post(
"/platform-config/kuaishou-eticket/query-shop-info",
createJsonHandler(
(req) =>
queryAdminKuaishouEticketShopInfo(
req.body as AdminKuaishouEticketShopInfoRouteBody
),
{
successMessage: "快手小店店铺信息查询成功",
errorMessage: "查询快手小店店铺信息失败",
scope: "[admin/platform-config/kuaishou-eticket/query-shop-info]",
audit: (req, data) => {
const body = req.body as AdminKuaishouEticketShopInfoRouteBody;
const result = data as JsonRecord;
return {
action: "platform_kuaishou_eticket_query_shop_info",
targetType: "platform_config",
targetId:
String(result.shop?.shopId || body.shopId || "").trim() ||
"kuaishou_eticket_shop_info",
data: {
result: Number(result.result || 0),
ok: Boolean(result.ok),
kshopName: String(result.shop?.kshopName || "").trim(),
},
};
},
}
)
);
router.post(
"/platform-config/kuaishou-eticket/consume",
createJsonHandler(
(req) =>
consumeAdminKuaishouEticket(
req.body as AdminKuaishouEticketConsumeRouteBody
),
{
successMessage: "快手小店核销请求已执行",
errorMessage: "执行快手小店核销失败",
scope: "[admin/platform-config/kuaishou-eticket/consume]",
audit: (req, data) => {
const body = req.body as AdminKuaishouEticketConsumeRouteBody;
const result = data as JsonRecord;
return {
action: "platform_kuaishou_eticket_consume",
targetType: "platform_config",
targetId:
String(result.eTicketId || body.eTicketId || "").trim() ||
"kuaishou_eticket",
data: {
result: Number(result.result || 0),
consumed: Boolean(result.consumed),
alreadyConsumed: Boolean(result.alreadyConsumed),
},
};
},
}
)
);
router.get(
"/platform-config/cloudtentacles-source",
createJsonHandler(() => listAdminCloudtentaclesSources(), {
successMessage: "ok",
errorMessage: "读取 cloudtentacles 履约平台配置失败",
scope: "[admin/platform-config/cloudtentacles-source]",
})
);
router.delete(
"/platform-config/cloudtentacles-source/:sourceKey",
createJsonHandler(
(req) =>
deleteAdminCloudtentaclesSource(
String(req.params.sourceKey || "").trim()
),
{
successMessage: "cloudtentacles 履约平台配置已删除",
errorMessage: "删除 cloudtentacles 履约平台配置失败",
scope: "[admin/platform-config/cloudtentacles-source/:sourceKey]",
audit: (req) => ({
action: "platform_cloudtentacles_source_deleted",
targetType: "platform_config",
targetId: String(req.params.sourceKey || "").trim(),
data: {},
}),
}
)
);
router.post(
"/platform-config/cloudtentacles-source",
createJsonHandler(
(req) =>
updateAdminCloudtentaclesSourceConfig(
req.body as AdminCloudtentaclesSourceConfigRouteBody
),
{
successMessage: "cloudtentacles 履约平台配置已保存",
errorMessage: "保存 cloudtentacles 履约平台配置失败",
scope: "[admin/platform-config/cloudtentacles-source]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_cloudtentacles_source_updated",
targetType: "platform_config",
targetId: "cloudtentacles_source",
data: {
filePath: String(result.filePath || "").trim(),
username: String(result.source?.username || "").trim(),
enabled: Boolean(result.source?.enabled),
},
};
},
}
)
);
router.post(
"/platform-config/cloudtentacles/send-sms-code",
createJsonHandler(
(req) =>
sendAdminCloudtentaclesSmsCode(
req.body as AdminCloudtentaclesSendSmsCodeRouteBody
),
{
successMessage: "cloudtentacles 短信验证码已发送",
errorMessage: "cloudtentacles 发送短信验证码失败",
scope: "[admin/platform-config/cloudtentacles/send-sms-code]",
audit: (req, data) => {
const body = req.body as AdminCloudtentaclesSendSmsCodeRouteBody;
const result = data as JsonRecord;
return {
action: "platform_cloudtentacles_send_sms_code",
targetType: "platform_config",
targetId:
String(result.username || body.username || "").trim() ||
"cloudtentacles",
data: {
baseUrl: result.baseUrl || String(body.baseUrl || "").trim(),
phoneMasked: result.phoneMasked || "",
},
};
},
}
)
);
router.post(
"/platform-config/cloudtentacles/test-login",
createJsonHandler(
(req) =>
testAdminCloudtentaclesLogin(
req.body as AdminCloudtentaclesTestLoginRouteBody
),
{
successMessage: "cloudtentacles 登录测试成功",
errorMessage: "cloudtentacles 登录测试失败",
scope: "[admin/platform-config/cloudtentacles/test-login]",
audit: (req, data) => {
const body = req.body as AdminCloudtentaclesTestLoginRouteBody;
const result = data as JsonRecord;
return {
action: "platform_cloudtentacles_test_login",
targetType: "platform_config",
targetId:
String(result.username || body.username || "").trim() ||
"cloudtentacles",
data: {
baseUrl: result.baseUrl || String(body.baseUrl || "").trim(),
permissionCount: Number(result.session?.permissionCount || 0),
},
};
},
}
)
);
router.post(
"/platform-config/cloudtentacles/validate-session",
createJsonHandler(
(req) =>
validateAdminCloudtentaclesSession(
req.body as AdminCloudtentaclesValidateSessionRouteBody
),
{
successMessage: "cloudtentacles 会话校验成功",
errorMessage: "cloudtentacles 会话校验失败",
scope: "[admin/platform-config/cloudtentacles/validate-session]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_cloudtentacles_validate_session",
targetType: "platform_config",
targetId: "cloudtentacles_session",
data: {
baseUrl: String(result.baseUrl || "").trim(),
permissionCount: Number(result.session?.permissionCount || 0),
},
};
},
}
)
);
router.post(
"/platform-config/cloudtentacles/asset",
createJsonHandler(
(req) =>
getAdminCloudtentaclesAsset(
req.body as AdminCloudtentaclesCatalogQueryRouteBody
),
{
successMessage: "cloudtentacles 余额查询成功",
errorMessage: "cloudtentacles 余额查询失败",
scope: "[admin/platform-config/cloudtentacles/asset]",
}
)
);
router.post(
"/platform-config/cloudtentacles/categories",
createJsonHandler(
(req) =>
getAdminCloudtentaclesCategories(
req.body as AdminCloudtentaclesCatalogQueryRouteBody
),
{
successMessage: "cloudtentacles 分类查询成功",
errorMessage: "cloudtentacles 分类查询失败",
scope: "[admin/platform-config/cloudtentacles/categories]",
}
)
);
router.post(
"/platform-config/cloudtentacles/sku/list",
createJsonHandler(
(req) =>
getAdminCloudtentaclesSkuList(
req.body as AdminCloudtentaclesCatalogQueryRouteBody
),
{
successMessage: "cloudtentacles SKU 列表查询成功",
errorMessage: "cloudtentacles SKU 列表查询失败",
scope: "[admin/platform-config/cloudtentacles/sku/list]",
}
)
);
router.post(
"/platform-config/cloudtentacles/sku/buy",
createJsonHandler(
(req) =>
buyAdminCloudtentaclesSku(
req.body as AdminCloudtentaclesSkuBuyRouteBody
),
{
successMessage: "cloudtentacles SKU 购买成功",
errorMessage: "cloudtentacles SKU 购买失败",
scope: "[admin/platform-config/cloudtentacles/sku/buy]",
}
)
);
router.post(
"/platform-config/cloudtentacles/sku/use",
createJsonHandler(
(req) =>
useAdminCloudtentaclesSku(
req.body as AdminCloudtentaclesSkuUseRouteBody
),
{
successMessage: "cloudtentacles 发货成功",
errorMessage: "cloudtentacles 发货失败",
scope: "[admin/platform-config/cloudtentacles/sku/use]",
}
)
);
router.post(
"/platform-config/cloudtentacles/knapsack",
createJsonHandler(
(req) =>
getAdminCloudtentaclesKnapsack(
req.body as AdminCloudtentaclesCatalogQueryRouteBody
),
{
successMessage: "cloudtentacles 背包查询成功",
errorMessage: "cloudtentacles 背包查询失败",
scope: "[admin/platform-config/cloudtentacles/knapsack]",
}
)
);
router.post(
"/platform-config/cloudtentacles/vn/list",
createJsonHandler(
(req) =>
listAdminCloudtentaclesVirtualNumbers(
req.body as AdminCloudtentaclesVirtualNumberRouteBody
),
{
successMessage: "cloudtentacles 虚拟号列表查询成功",
errorMessage: "cloudtentacles 虚拟号列表查询失败",
scope: "[admin/platform-config/cloudtentacles/vn/list]",
}
)
);
router.post(
"/platform-config/cloudtentacles/vn/appoint",
createJsonHandler(
(req) =>
appointAdminCloudtentaclesVirtualNumber(
req.body as AdminCloudtentaclesVirtualNumberRouteBody
),
{
successMessage: "cloudtentacles 虚拟号申请成功",
errorMessage: "cloudtentacles 虚拟号申请失败",
scope: "[admin/platform-config/cloudtentacles/vn/appoint]",
}
)
);
router.post(
"/platform-config/cloudtentacles/vn/generate-login-code",
createJsonHandler(
(req) =>
generateAdminCloudtentaclesLoginCode(
req.body as AdminCloudtentaclesVirtualNumberRouteBody
),
{
successMessage: "cloudtentacles 登录码生成成功",
errorMessage: "cloudtentacles 登录码生成失败",
scope: "[admin/platform-config/cloudtentacles/vn/generate-login-code]",
}
)
);
router.post(
"/platform-config/cloudtentacles/vn/fetch-code",
createJsonHandler(
(req) =>
fetchAdminCloudtentaclesVirtualNumberCode(
req.body as AdminCloudtentaclesVirtualNumberRouteBody
),
{
successMessage: "cloudtentacles 验证码获取成功",
errorMessage: "cloudtentacles 验证码获取失败",
scope: "[admin/platform-config/cloudtentacles/vn/fetch-code]",
}
)
);
router.post(
"/platform-config/cloudtentacles/vn/verify-code",
createJsonHandler(
(req) =>
verifyAdminCloudtentaclesLoginCode(
req.body as AdminCloudtentaclesVirtualNumberRouteBody
),
{
successMessage: "cloudtentacles 登录码校验成功",
errorMessage: "cloudtentacles 登录码校验失败",
scope: "[admin/platform-config/cloudtentacles/vn/verify-code]",
}
)
);
router.post(
"/platform-config/cloudtentacles/vn/bind-url",
createJsonHandler(
(req) =>
getAdminCloudtentaclesBindUrl(
req.body as AdminCloudtentaclesVirtualNumberRouteBody
),
{
successMessage: "cloudtentacles 兑换链接获取成功",
errorMessage: "cloudtentacles 兑换链接获取失败",
scope: "[admin/platform-config/cloudtentacles/vn/bind-url]",
}
)
);
router.post(
"/platform-config/cloudtentacles/vn/back",
createJsonHandler(
(req) =>
backAdminCloudtentaclesVirtualNumber(
req.body as AdminCloudtentaclesVirtualNumberRouteBody
),
{
successMessage: "cloudtentacles 号码退还成功",
errorMessage: "cloudtentacles 号码退还失败",
scope: "[admin/platform-config/cloudtentacles/vn/back]",
}
)
);
router.post(
"/platform-config/cloudtentacles/debug/full-flow",
createJsonHandler(
(req) =>
runAdminCloudtentaclesFullFlow(
req.body as AdminCloudtentaclesFullFlowRouteBody
),
{
successMessage: "cloudtentacles 完整调试流程执行成功",
errorMessage: "cloudtentacles 完整调试流程执行失败",
scope: "[admin/platform-config/cloudtentacles/debug/full-flow]",
}
)
);
router.get(
"/platform-config/fulfillment-bindings",
createJsonHandler(() => getAdminFulfillmentBindingConfigs(), {
successMessage: "ok",
errorMessage: "读取履约配置失败",
scope: "[admin/platform-config/fulfillment-bindings]",
})
);
router.post(
"/platform-config/fulfillment-bindings/lookup-order",
createJsonHandler(
(req) =>
lookupAdminFulfillmentBindingOrder(
req.body as AdminFulfillmentBindingLookupRouteBody
),
{
successMessage: "订单商品查询成功",
errorMessage: "手动查询订单商品失败",
scope: "[admin/platform-config/fulfillment-bindings/lookup-order]",
audit: (req, data) => {
const result = data as JsonRecord;
return {
action: "platform_fulfillment_order_lookup",
targetType: "platform_config",
targetId: [
result.order?.provider || "unknown",
result.order?.platform || "unknown",
result.order?.shopId || "unknown",
result.order?.platformOrderId || "unknown",
].join(":"),
data: {
itemCount: Array.isArray(result.items) ? result.items.length : 0,
shopId:
result.order?.shopId ||
String(
(req.body as AdminFulfillmentBindingLookupRouteBody)?.shopId || ""
).trim(),
platformOrderId:
result.order?.platformOrderId ||
String(
(req.body as AdminFulfillmentBindingLookupRouteBody)
?.platformOrderId || ""
).trim(),
},
};
},
}
)
);
router.post(
"/platform-config/fulfillment-bindings",
createJsonHandler(
(req) =>
updateAdminFulfillmentBindingConfigs(
req.body as AdminFulfillmentBindingConfigRouteBody
),
{
successMessage: "履约配置已保存",
errorMessage: "保存履约配置失败",
scope: "[admin/platform-config/fulfillment-bindings]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_fulfillment_config_updated",
targetType: "platform_config",
targetId: "fulfillment_bindings",
data: {
bindingCount: Array.isArray(result.bindings)
? result.bindings.length
: 0,
filePath: result.filePath || "",
},
};
},
}
)
);
router.get(
"/platform-config/kuaishou-cloud-fulfillment",
createJsonHandler(() => getAdminKuaishouCloudFulfillmentConfig(), {
successMessage: "ok",
errorMessage: "读取新履约配置失败",
scope: "[admin/platform-config/kuaishou-cloud-fulfillment]",
})
);
router.post(
"/platform-config/kuaishou-cloud-fulfillment",
createJsonHandler(
(req) =>
updateAdminKuaishouCloudFulfillmentConfig(
req.body as AdminKuaishouCloudFulfillmentConfigRouteBody
),
{
successMessage: "新履约配置已保存",
errorMessage: "保存新履约配置失败",
scope: "[admin/platform-config/kuaishou-cloud-fulfillment]",
audit: (_req, data) => {
const result = data as JsonRecord;
return {
action: "platform_kuaishou_cloud_fulfillment_updated",
targetType: "platform_config",
targetId: "kuaishou_cloud_fulfillment",
data: {
itemCount: Array.isArray(result.source?.items)
? result.source.items.length
: 0,
filePath: String(result.filePath || "").trim(),
},
};
},
}
)
);
router.use("/platform-config", agisoRouter);
router.use("/platform-config", notificationsRouter);
router.use("/platform-config", kuaishouEticketRouter);
router.use("/platform-config", ninetyoneRouter);
router.use("/platform-config", cloudtentaclesRouter);
router.use("/platform-config", fulfillmentBindingsRouter);
router.use("/platform-config", kuaishouCloudFulfillmentRouter);
export default router;