refactor backend route and fulfillment modules
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user