Files
order_site/apps/backend/src/services/bootstrap/fulfillment-bootstrap-service.ts
T

84 lines
2.2 KiB
TypeScript

import {
listFulfillmentProfileRequirements,
replaceFulfillmentProfileRequirements,
upsertFulfillmentProfile,
type FulfillmentProfileRequirementInput,
} from '../../repositories/fulfillment-profile-repo.js'
import { nowIso } from '../../utils/time.js'
type JsonObject = Record<string, any>
type CoreProfile = {
profileKey: string
name: string
executorKey: string
requiresClaim: boolean
autoDispatch: boolean
inventoryStrategy: string
requirements: FulfillmentProfileRequirementInput[]
}
const CORE_PROFILES: CoreProfile[] = [
{
profileKey: 'manual_review',
name: '人工发货',
executorKey: 'manual_dispatch',
requiresClaim: false,
autoDispatch: false,
inventoryStrategy: 'static_pool',
requirements: [],
},
{
profileKey: 'kuaishou_ct_assisted',
name: 'kuaishou-lewan 履约',
executorKey: 'kuaishou_ct_assisted',
requiresClaim: false,
autoDispatch: false,
inventoryStrategy: 'external_platform',
requirements: [],
},
{
profileKey: 'kuaishou_feifei',
name: 'kuaishou-feifei 履约',
executorKey: 'kuaishou_feifei',
requiresClaim: true,
autoDispatch: false,
inventoryStrategy: 'external_platform',
requirements: [],
},
]
export async function ensureFulfillmentCatalogBootstrapped() {
await ensureCoreProfiles()
}
async function ensureCoreProfiles() {
const timestamp = nowIso()
const profileMap: JsonObject = {}
for (const profile of CORE_PROFILES) {
const saved = await upsertFulfillmentProfile({
profileKey: profile.profileKey,
name: profile.name,
executorKey: profile.executorKey,
requiresClaim: profile.requiresClaim,
autoDispatch: profile.autoDispatch,
inventoryStrategy: profile.inventoryStrategy,
configJson: '{}',
createdAt: timestamp,
updatedAt: timestamp,
})
if (!saved) {
continue
}
profileMap[profile.profileKey] = saved
const currentRequirements = await listFulfillmentProfileRequirements(saved.id)
if (currentRequirements.length !== profile.requirements.length) {
await replaceFulfillmentProfileRequirements(saved.id, profile.requirements, timestamp)
}
}
return profileMap
}