|
@@ -14,10 +14,10 @@
|
|
|
<div v-for="(item, idx) in getCustomerList(model['categoryId'])" :key="item.value">
|
|
|
<Card class="my-4">
|
|
|
<FormItem :label="`${item.label}场地`" required :labelCol="{ xl: 2, sm: 3 }">
|
|
|
- <InputNumber addon-before="共有" addon-after="个球场" v-model:value="model['inventory' + idx]"></InputNumber>
|
|
|
+ <InputNumber addon-before="共有" addon-after="个球场" v-model:value="model['inventory' + idx]" :max="30" :min="1"></InputNumber>
|
|
|
</FormItem>
|
|
|
<FormItem label="时间段及费用" required :labelCol="{ xl: 2, sm: 3 }" :wrapper-col="{ span: 22 }">
|
|
|
- <ZtCustomTable :tableColumn="ScheduleArrangementColums" v-model:value="model[item.value]"></ZtCustomTable>
|
|
|
+ <ZtCustomTable :tableColumn="ScheduleArrangementColums" v-model:value="model[item.value]"> </ZtCustomTable>
|
|
|
</FormItem>
|
|
|
</Card>
|
|
|
</div>
|
|
@@ -44,12 +44,18 @@
|
|
|
import { DemoOptionsItem } from '/@/api/demo/model/optionsModel';
|
|
|
import ZtCustomTable from '/@/components/ZtCustomTable/index.vue';
|
|
|
import { ScheduleArrangementColums, apiForm, priceRules } from './gymnasiumBag.data';
|
|
|
- import { h, ref } from 'vue';
|
|
|
+ import { saveOrUpdate, queryById, Business } from './gymnasiumBag.api';
|
|
|
+ import { h, onUnmounted, ref, watch } from 'vue';
|
|
|
import { OriginalItem } from '/#/utils';
|
|
|
import { areAllItemsAllFieldsFilled } from '/@/utils';
|
|
|
import dayjs from 'dayjs';
|
|
|
import { useTabs } from '/@/hooks/web/useTabs';
|
|
|
+ import { useShopInfoStore } from '/@/store/modules/shopInfo';
|
|
|
+ import { storeToRefs } from 'pinia';
|
|
|
+ import { unref } from 'vue';
|
|
|
const projectList = ref<DemoOptionsItem[]>([]);
|
|
|
+ useShopInfoStore().getCurrentDep();
|
|
|
+ const { deptList, currentId } = storeToRefs(useShopInfoStore());
|
|
|
const { close: closeTab } = useTabs();
|
|
|
const isSubmit = ref(false);
|
|
|
const formSchema: FormSchema[] = [
|
|
@@ -57,15 +63,26 @@
|
|
|
field: 'name',
|
|
|
label: '营业名称',
|
|
|
component: 'Select',
|
|
|
- defaultValue: '111',
|
|
|
required: true,
|
|
|
labelWidth: 120,
|
|
|
+ componentProps: {
|
|
|
+ // api: Business,
|
|
|
+ // params: {
|
|
|
+ // currentId,
|
|
|
+ // },
|
|
|
+ // immediate: false,
|
|
|
+ // valueField: 'id',
|
|
|
+ // labelField: 'name',
|
|
|
+ onChange(e) {
|
|
|
+ console.log(e, '请求新的');
|
|
|
+ getQueryData(e);
|
|
|
+ },
|
|
|
+ },
|
|
|
colProps: {
|
|
|
span: 14,
|
|
|
xs: 24,
|
|
|
},
|
|
|
},
|
|
|
-
|
|
|
{
|
|
|
field: 'title1',
|
|
|
colSlot: 'title1',
|
|
@@ -157,33 +174,87 @@
|
|
|
schemas: formSchema,
|
|
|
showActionButtonGroup: false,
|
|
|
});
|
|
|
+ const isUpdate = ref(false);
|
|
|
async function back() {
|
|
|
await closeTab();
|
|
|
}
|
|
|
- async function save() {
|
|
|
- const data = await getFieldsValue();
|
|
|
- console.log(data);
|
|
|
- return;
|
|
|
- const form = await validate();
|
|
|
-
|
|
|
- const cusotmValidate = await validateInventoryFields(form);
|
|
|
- if (!cusotmValidate) {
|
|
|
- return message.error('请填写必填项');
|
|
|
+ async function getQueryData(id) {
|
|
|
+ const res = await queryById({ siteId: id });
|
|
|
+ if (!res.siteCategoryRuleDTOS) {
|
|
|
+ isUpdate.value = false;
|
|
|
+ } else {
|
|
|
+ isUpdate.value = true;
|
|
|
+ console.log(res, '打印');
|
|
|
+ const categoryIdList = res.siteCategoryRuleDTOS.map((it) => it.categoryId);
|
|
|
+ const formData = res.siteCategoryRuleDTOS.map((it) => reverseTransformData(it.appSiteRuleDTOList));
|
|
|
+ const filed = {
|
|
|
+ categoryId: categoryIdList,
|
|
|
+ buyLimit: res.appSitePlaceCuDTO.buyLimit,
|
|
|
+ earlyRefundTime: res.appSitePlaceCuDTO.earlyRefundTime,
|
|
|
+ reminder: res.appSitePlaceCuDTO.reminder,
|
|
|
+ };
|
|
|
+ categoryIdList.forEach((it, idx) => {
|
|
|
+ filed[it] = formData[idx][it];
|
|
|
+ filed[`inventory${idx}`] = res.siteCategoryRuleDTOS[idx].count;
|
|
|
+ });
|
|
|
+ setFieldsValue(filed);
|
|
|
+ console.log(filed, 'filed');
|
|
|
}
|
|
|
- const newObj: apiForm = {
|
|
|
- site: {
|
|
|
- name: form.name,
|
|
|
- categoryId: form.categoryId,
|
|
|
- earlyRefundTime: form.earlyRefundTime,
|
|
|
+ }
|
|
|
+ async function getBusinessData() {
|
|
|
+ const res = await Business({ currentId: currentId.value });
|
|
|
+ updateSchema({ field: 'name', componentProps: { options: res.map((it) => ({ label: it.name, value: it.id })) } });
|
|
|
+ //如果商家端进入默认取第一个
|
|
|
+ setFieldsValue({
|
|
|
+ name: res[0].id,
|
|
|
+ });
|
|
|
+ getQueryData(res[0].id);
|
|
|
+ }
|
|
|
+ watch(
|
|
|
+ () => currentId.value,
|
|
|
+ () => {
|
|
|
+ if (currentId.value) getBusinessData();
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+ );
|
|
|
+ async function save() {
|
|
|
+ const form = await getFieldsValue();
|
|
|
+ await validate();
|
|
|
+ console.log(validateInventoryFields(form));
|
|
|
+ if (!validateInventoryFields(form)) return message.error('请填写完整包场时间');
|
|
|
+ const categoryList = form.categoryId.split(',');
|
|
|
+ const newObj = {
|
|
|
+ appSitePlaceCuDTO: {
|
|
|
buyLimit: form.buyLimit,
|
|
|
+ earlyRefundTime: form.earlyRefundTime,
|
|
|
reminder: form.reminder,
|
|
|
- type: 1, //0学校,1是体育馆
|
|
|
+ siteId: form.name,
|
|
|
},
|
|
|
- priceRulesList: getResultData(form),
|
|
|
+ siteCategoryRuleDTOS: categoryList.map((it, idx) => {
|
|
|
+ return {
|
|
|
+ categoryId: it,
|
|
|
+ count: form[`inventory${idx}`],
|
|
|
+ appSiteRuleDTOList: transformData(
|
|
|
+ form[it].map((items) => {
|
|
|
+ {
|
|
|
+ return {
|
|
|
+ ...items,
|
|
|
+ ...items.editValueRefs,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ it,
|
|
|
+ form.name
|
|
|
+ ),
|
|
|
+ };
|
|
|
+ }),
|
|
|
};
|
|
|
+ console.log(newObj, '打印');
|
|
|
isSubmit.value = true;
|
|
|
try {
|
|
|
- await siteAdd(newObj);
|
|
|
+ await saveOrUpdate(newObj, isUpdate.value);
|
|
|
+ isSubmit.value = false;
|
|
|
+
|
|
|
await closeTab();
|
|
|
} catch (error) {
|
|
|
isSubmit.value = false;
|
|
@@ -229,21 +300,40 @@
|
|
|
);
|
|
|
});
|
|
|
}
|
|
|
+ type TransformedItem = {
|
|
|
+ dayOfWeek: string;
|
|
|
+ sellingPrice: number | null;
|
|
|
+ startTime: string;
|
|
|
+ endTime: string;
|
|
|
+ categoryId: string;
|
|
|
+ sitePlaceId: string;
|
|
|
+ batchuuid?: string;
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * 将原始数据转换为目标格式
|
|
|
+ * @param data - 原始数据数组
|
|
|
+ * @returns 转换后的数据数组
|
|
|
+ */
|
|
|
+ function transformData(data: OriginalItem[], categoryId: string, sitePlaceId: string): TransformedItem[] {
|
|
|
+ const result: TransformedItem[] = [];
|
|
|
+ for (const item of data) {
|
|
|
+ const { time = ['1', '2'] } = item;
|
|
|
+ for (let i = 1; i <= 7; i++) {
|
|
|
+ const key = `day${i}` as keyof OriginalItem;
|
|
|
+ const sellingPrice: any = item[key];
|
|
|
+ result.push({
|
|
|
+ dayOfWeek: `${i}`,
|
|
|
+ sellingPrice: sellingPrice === undefined ? null : unref(sellingPrice),
|
|
|
+ startTime: unref(time)[0],
|
|
|
+ endTime: unref(time)[1],
|
|
|
+ categoryId,
|
|
|
+ sitePlaceId,
|
|
|
+ batchuuid: item[`dayId${i}`],
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- function getResultData(form: any): priceRules[] {
|
|
|
- const priceRulesList: any = [];
|
|
|
- form.categoryId.split(',').map((it, idx) => {
|
|
|
- const data = transformData(form[it]?.obj).map((item) => {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- categoryId: it,
|
|
|
- inventory: form[`inventory${idx}`],
|
|
|
- type: 1, //0学校 1体育馆包场 2体育馆不固定场
|
|
|
- };
|
|
|
- });
|
|
|
- priceRulesList.push(...data);
|
|
|
- });
|
|
|
- return priceRulesList;
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -258,8 +348,7 @@
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- const categoryIds = categoryId.split(',').map((id) => id.trim());
|
|
|
-
|
|
|
+ const categoryIds = categoryId.split(',');
|
|
|
for (let i = 0; i < categoryIds.length; i++) {
|
|
|
const inventoryField = `inventory${i}`;
|
|
|
const inventoryValue = formValues[inventoryField];
|
|
@@ -267,39 +356,66 @@
|
|
|
if (inventoryValue === undefined || inventoryValue === null || inventoryValue <= 0 || !priceRulesList) {
|
|
|
return false;
|
|
|
}
|
|
|
- if (!areAllItemsAllFieldsFilled(priceRulesList.obj)) {
|
|
|
+ const priceRulesListIsValid = priceRulesList.map((it) => it.editValueRefs);
|
|
|
+ if (!areAllItemsAllFieldsFilled(priceRulesListIsValid)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
- type TransformedItem = {
|
|
|
- dayOfWeek: string;
|
|
|
- sellingPrice: number | null;
|
|
|
- startTime: string;
|
|
|
- endTime: string;
|
|
|
- };
|
|
|
- /**
|
|
|
- * 将原始数据转换为目标格式
|
|
|
- * @param data - 原始数据数组
|
|
|
- * @returns 转换后的数据数组
|
|
|
- */
|
|
|
- function transformData(data: OriginalItem[]): TransformedItem[] {
|
|
|
- const result: TransformedItem[] = [];
|
|
|
- for (const item of data) {
|
|
|
- const { time = ['1', '2'] } = item;
|
|
|
- for (let i = 1; i <= 7; i++) {
|
|
|
- const key = `day${i}` as keyof OriginalItem;
|
|
|
- const sellingPrice = item[key];
|
|
|
- result.push({
|
|
|
- dayOfWeek: `${i}`,
|
|
|
- sellingPrice: sellingPrice === undefined ? null : sellingPrice,
|
|
|
- startTime: dayjs(time[0]).format('YYYY-MM-DD hh:mm:ss'),
|
|
|
- endTime: dayjs(time[1]).format('YYYY-MM-DD hh:mm:ss'),
|
|
|
- });
|
|
|
+ onUnmounted(() => {
|
|
|
+ useShopInfoStore().isShowSelect = false;
|
|
|
+ });
|
|
|
+ function reverseTransformData(transformedData: TransformedItem[]): Record<string, OriginalItem[]> {
|
|
|
+ const groupedByTime: Record<string, TransformedItem[]> = {};
|
|
|
+
|
|
|
+ // 首先按时间分组数据
|
|
|
+ transformedData.forEach((item) => {
|
|
|
+ const timeKey = `${item.startTime}-${item.endTime}`;
|
|
|
+ if (!groupedByTime[timeKey]) {
|
|
|
+ groupedByTime[timeKey] = [];
|
|
|
}
|
|
|
- }
|
|
|
+ groupedByTime[timeKey].push(item);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 构造结果对象
|
|
|
+ const result: Record<string, OriginalItem[]> = {};
|
|
|
+
|
|
|
+ Object.keys(groupedByTime).forEach((timeKey) => {
|
|
|
+ const items = groupedByTime[timeKey];
|
|
|
+ const [startTime, endTime] = timeKey.split('-');
|
|
|
+
|
|
|
+ // 按照 categoryId 分组
|
|
|
+ const groupedByCategory: Record<string, TransformedItem[]> = {};
|
|
|
+ items.forEach((item) => {
|
|
|
+ if (!groupedByCategory[item.categoryId]) {
|
|
|
+ groupedByCategory[item.categoryId] = [];
|
|
|
+ }
|
|
|
+ groupedByCategory[item.categoryId].push(item);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 为每个 categoryId 创建原始数据项
|
|
|
+ Object.keys(groupedByCategory).forEach((categoryId) => {
|
|
|
+ if (!result[categoryId]) {
|
|
|
+ result[categoryId] = [];
|
|
|
+ }
|
|
|
+
|
|
|
+ const categoryItems = groupedByCategory[categoryId];
|
|
|
+ const originalItem: OriginalItem = {
|
|
|
+ time: [startTime, endTime],
|
|
|
+ };
|
|
|
+
|
|
|
+ // 添加每天的价格信息
|
|
|
+ categoryItems.forEach((item) => {
|
|
|
+ const dayKey = `day${item.dayOfWeek}` as keyof OriginalItem;
|
|
|
+ originalItem[dayKey] = item.sellingPrice;
|
|
|
+ originalItem[`dayId${item.dayOfWeek}`] = item.batchuuid;
|
|
|
+ });
|
|
|
+
|
|
|
+ result[categoryId].push(originalItem);
|
|
|
+ });
|
|
|
+ });
|
|
|
|
|
|
return result;
|
|
|
}
|