本地Mock自定义店铺自动记忆沉淀为下拉可选项

This commit is contained in:
yml2213
2026-08-22 14:31:34 +08:00
parent 72b3f7c592
commit 15396822b5
7 changed files with 91 additions and 3 deletions
@@ -7,6 +7,7 @@ export const APP_CONFIG_KEYS = {
workerProductMatch: 'worker_product_match',
workerAnnouncement: 'worker_announcement',
workerHall: 'worker_hall',
workerMockShops: 'worker_mock_shops',
cloudtentaclesSources: 'cloudtentacles_sources',
cloudtentaclesSession: 'cloudtentacles_session',
cloudtentaclesOverrideRules: 'cloudtentacles_override_rules',
@@ -9,6 +9,7 @@ import {
deleteAdminWorkOrder,
getAdminWorkOrderEvents,
getAdminWorkOrderSharing,
listAdminMockCustomShops,
listAdminWorkOrders,
pinAdminWorkOrder,
publishAdminWorkOrder,
@@ -35,6 +36,16 @@ router.get(
}),
)
router.get(
'/worker-platform/orders/mock/custom-shops',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(() => ({ items: listAdminMockCustomShops() }), {
successMessage: 'ok',
errorMessage: '读取自定义店铺失败',
scope: '[admin/worker-platform/orders/mock/custom-shops]',
}),
)
router.post(
'/worker-platform/orders/mock',
requireAdminRoles(['admin', 'operator', 'support']),
@@ -0,0 +1,51 @@
import { APP_CONFIG_KEYS } from '../../config/app-config-keys.js'
import { readAppConfigEntry, saveAppConfigEntry } from '../config/app-config-store.js'
/** 记忆的自定义店铺上限,超出后淘汰最早录入的。 */
const MAX_CUSTOM_SHOPS = 50
type MockCustomShopsConfig = {
shops: string[]
}
/** 本地 Mock 用自定义店铺列表:录入过的外部平台店铺沉淀为可选项。 */
export function listAdminMockCustomShops(): string[] {
return readAppConfigEntry({
configKey: APP_CONFIG_KEYS.workerMockShops,
fallback: createDefaultMockCustomShops,
normalize: normalizeMockCustomShops,
}).shops
}
export async function rememberAdminMockCustomShop(shopName: string): Promise<string[]> {
const name = normalizeShopName(shopName)
if (!name) return listAdminMockCustomShops()
const nextShops = [name, ...listAdminMockCustomShops().filter((item) => item !== name)].slice(
0,
MAX_CUSTOM_SHOPS,
)
const saved = await saveAppConfigEntry({
configKey: APP_CONFIG_KEYS.workerMockShops,
value: { shops: nextShops },
normalize: normalizeMockCustomShops,
})
return saved.shops
}
export function normalizeMockCustomShops(rawValue: unknown): MockCustomShopsConfig {
const shops = Array.isArray((rawValue as MockCustomShopsConfig | null)?.shops)
? (rawValue as MockCustomShopsConfig).shops
: []
const normalized = [...new Set(shops.map((item) => normalizeShopName(item)).filter(Boolean))]
return { shops: normalized.slice(0, MAX_CUSTOM_SHOPS) }
}
function createDefaultMockCustomShops(): MockCustomShopsConfig {
return { shops: [] }
}
function normalizeShopName(value: unknown) {
return String(value || '')
.trim()
.slice(0, 64)
}
@@ -20,6 +20,7 @@ import {
normalizeInteger,
normalizeRequirementFields,
} from './mappers.js'
import { rememberAdminMockCustomShop } from './admin-mock-custom-shop-service.js'
import { ensureWorkerPlatformDefaults } from './worker-platform-defaults.js'
import { normalizeWorkOrderTimeoutPolicy } from './work-order-timeout-policy.js'
@@ -94,6 +95,10 @@ export async function createAdminMockWorkOrder(payload: JsonObject = {}) {
errorCode: 'work_order_create_failed',
})
}
if (input.isCustomShop && shop.shopName) {
// 自定义店铺录入后沉淀为可选项,下次直接下拉选择。
await rememberAdminMockCustomShop(shop.shopName)
}
await createWorkOrderEvent({
workOrderId: workOrder.id,
actorType: 'admin',
@@ -155,6 +160,7 @@ export function resolveAdminMockWorkOrderInput(
}
// 未命中已配置店铺时视为自定义店铺(用于其他平台订单手动录入),
// 与真实店铺一样落入 material.source,保证链路与展示一致。
const isCustomShop = !matchedShop
const shop =
matchedShop ||
({
@@ -169,6 +175,7 @@ export function resolveAdminMockWorkOrderInput(
platformOrderId,
productName,
shop,
isCustomShop,
rewardAmount: requireMockWorkOrderAmount(payload.rewardAmount, '接单金额', 'reward_amount'),
paymentAmount: requireMockWorkOrderAmount(
payload.paymentAmount,
@@ -36,6 +36,7 @@ export * from './admin-work-order-realtime-service.js'
export * from './admin-work-order-material-service.js'
export * from './admin-work-order-gift-service.js'
export * from './admin-mock-work-order-service.js'
export * from './admin-mock-custom-shop-service.js'
export * from './admin-work-order-management-service.js'
export * from './admin-worker-platform-summary-service.js'
export * from './admin-work-order-assignment-service.js'