@wishcbg/bobcode
Version:
基於店家同步功能的需求,讓店家能夠在不同的店家之間同步各項功能設定,並且能夠檢視各項功能的異動情況。 規劃出一套店家設定即程式碼的機制,讓店家能夠以 config file (.sac) 來定義各項功能設定,並且能夠還原店家各項功能設定。 暫且稱這個機制為「Settings as Code」「店家設定即程式碼」。
132 lines (131 loc) • 7.01 kB
JavaScript
"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',
};