UNPKG

@wishcbg/bobcode

Version:

基於店家同步功能的需求,讓店家能夠在不同的店家之間同步各項功能設定,並且能夠檢視各項功能的異動情況。 規劃出一套店家設定即程式碼的機制,讓店家能夠以 config file (.sac) 來定義各項功能設定,並且能夠還原店家各項功能設定。 暫且稱這個機制為「Settings as Code」「店家設定即程式碼」。

132 lines (131 loc) 7.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AppointmentServiceResourceSchema = exports.appointmentServiceResourceSettingSchema = void 0; const zod_1 = require("zod"); const appointmentSubServiceSchema = zod_1.z.object({ logicId: zod_1.z.string().uuid().optional().describe('子服務ID'), name: zod_1.z.string().describe('服務名稱'), description: zod_1.z.string().optional().describe('服務描述'), price: zod_1.z.number().int().describe('實際價格'), showPrice: zod_1.z.string().optional().describe('顯示價格'), bookingTime: zod_1.z.number().int().describe('庫存佔用時間'), showTime: zod_1.z.number().int().optional().describe('顯示時間'), order: zod_1.z.number().int().default(0).optional().describe('排序'), allAppointmentUnit: zod_1.z.boolean().default(true).optional().describe('允許預約所有服務人員'), allResourceItem: zod_1.z.boolean().default(true).optional().describe('允許預約所有設備項目'), // append fields imageId: zod_1.z.string().uuid().optional().describe('圖片ID'), appointmentUnitLogicIds: zod_1.z.array(zod_1.z.string().uuid()).optional().describe('服務人員ID'), resourceItemLogicIds: zod_1.z.array(zod_1.z.string().uuid()).optional().describe('設備項目ID'), }); exports.appointmentServiceResourceSettingSchema = zod_1.z.object({ // appointmentService name: zod_1.z.string().describe('服務名稱'), description: zod_1.z.string().describe('服務描述').optional(), price: zod_1.z.number().int().describe('實際價格'), showPrice: zod_1.z.string().describe('顯示價格').optional(), showTime: zod_1.z.number().int().describe('顯示時間').optional(), bookingTime: zod_1.z.number().int().describe('庫存佔用時間'), order: zod_1.z.number().int().default(0).describe('排序').optional(), isPublic: zod_1.z.boolean().default(true).describe('是否公開於 Client').optional(), isPubApt: zod_1.z.boolean().default(false).describe('是否用於跨境預約').optional(), enableSubService: zod_1.z.boolean().default(false).describe('是否啟用子服務').optional(), enableSubServiceClientHide: zod_1.z.boolean().default(false).describe('是否在客戶端隱藏子服務').optional(), enableClassTicket: zod_1.z.boolean().default(false).describe('是否啟用堂票').optional(), requiredClassTicket: zod_1.z.boolean().default(false).describe('若啟用堂票,是否必須使用堂票').optional(), enableAppointmentUnit: zod_1.z.boolean().default(true).describe('是否啟用服務人員綁定').optional(), enableResourceItem: zod_1.z.boolean().default(false).describe('是否啟用設備項目綁定').optional(), attachServiceSettings: zod_1.z.array(zod_1.z.object({ appointmentServiceAttachLogicId: zod_1.z.string().uuid().describe('附加服務 ID'), enableResourceItemBooking: zod_1.z.boolean().default(false).describe('是否佔用設備庫存'), })).default([]).describe('附加服務額外設定(是否佔用設備庫存)').optional(), // append fields imageId: zod_1.z.string().uuid().optional().describe('圖片ID'), wideImageId: zod_1.z.string().uuid().optional().describe('寬圖片ID'), appointmentUnitLogicIds: zod_1.z.array(zod_1.z.string().uuid()).optional().describe('服務人員ID'), resourceItemLogicIds: zod_1.z.array(zod_1.z.string().uuid()).optional().describe('設備項目ID'), appointmentCategorieLogicIds: zod_1.z.array(zod_1.z.string().uuid()).optional().describe('服務類別ID'), appointmentServiceAttacheLogicIds: zod_1.z.array(zod_1.z.string().uuid()).optional().describe('附加服務ID'), appointmentSubServices: zod_1.z.array(appointmentSubServiceSchema).optional().describe('服務子項目'), classTicketLogicIds: zod_1.z.array(zod_1.z.string().uuid()).optional().describe('堂票ID'), }).describe('預約類別設定'); exports.AppointmentServiceResourceSchema = { // —— 基本欄位 resourceType: 'appointmentService', resourceName: '預約服務', resourceSettingSchema: exports.appointmentServiceResourceSettingSchema, // —— 關聯 relationScope: 'shop', relationType: 'multi', relationResources: [ { resourceType: 'appointmentCategory', settingSchemaField: 'appointmentCategorieLogicIds', useLogicIdToResourceId: true, logicIdToResourceIdNewField: 'appointmentCategories', relationType: 'multi', }, { resourceType: 'image', settingSchemaField: 'imageId', logicIdToResourceIdNewField: 'image', useLogicIdToResourceId: false, relationType: 'single', }, { resourceType: 'image', settingSchemaField: 'wideImageId', logicIdToResourceIdNewField: 'wideImage', relationType: 'single', }, { resourceType: 'appointmentUnit', useLogicIdToResourceId: true, settingSchemaField: 'appointmentUnitLogicIds', logicIdToResourceIdNewField: 'appointmentUnits', relationType: 'multi', }, { resourceType: 'resourceItem', useLogicIdToResourceId: true, settingSchemaField: 'resourceItemLogicIds', logicIdToResourceIdNewField: 'resourceItems', relationType: 'multi', }, { resourceType: 'classTicket', useLogicIdToResourceId: true, settingSchemaField: 'classTicketLogicIds', logicIdToResourceIdNewField: 'classTickets', relationType: 'multi' }, { resourceType: 'appointmentServiceAttach', useLogicIdToResourceId: true, settingSchemaField: 'appointmentServiceAttacheLogicIds', logicIdToResourceIdNewField: 'appointmentServiceAttaches', relationType: 'multi' }, { resourceType: 'appointmentServiceAttach', useLogicIdToResourceId: true, settingSchemaField: 'attachServiceSettings[*].appointmentServiceAttachLogicId', logicIdToResourceIdNewField: 'attachServiceSettings[*].appointmentServiceAttachId', relationType: 'single', acceptsNullValue: false, }, // 多層嵌套 需要思考 { resourceType: 'appointmentSubService', useLogicIdToResourceId: true, settingSchemaField: 'appointmentSubServiceLogicIds', logicIdToResourceIdNewField: 'appointmentSubServices', relationType: 'multi' }, ], // —— apply API path applySingleUpdateApiPath: null, applyCreateApiPath: '/:shopId/appointmentService', applyUpdateApiPath: '/:shopId/appointmentService/:resourceId', applyDestroyApiPath: '/:shopId/appointmentService/:resourceId', };