From 1b3a41da145aaf6e2ae10bbb5cb9aa25bcf2af70 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 2 Apr 2026 19:54:18 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(mes):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=8F=AD=E6=97=A5=E5=8E=86=E6=9F=A5=E8=AF=A2=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=94=AF=E6=8C=81=E6=89=B9=E9=87=8F=E7=8F=AD?= =?UTF-8?q?=E7=BB=84=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构排班日历查询功能,简化代码实现,支持一次性查询多个班组的排班记录。 新增班组编号集合字段,提升查询效率和可读性。 --- src/views/mes/cal/calendar/TeamView.vue | 71 ++------------- src/views/mes/cal/calendar/TypeView.vue | 71 ++------------- src/views/mes/cal/calendar/UserView.vue | 90 ++++++------------- src/views/mes/cal/calendar/useCalendar.ts | 90 +++++++++++++++++++ .../dv/machinery/type/MachineryTypeForm.vue | 6 +- 5 files changed, 139 insertions(+), 189 deletions(-) create mode 100644 src/views/mes/cal/calendar/useCalendar.ts diff --git a/src/views/mes/cal/calendar/TeamView.vue b/src/views/mes/cal/calendar/TeamView.vue index c847ae889..2557ad839 100644 --- a/src/views/mes/cal/calendar/TeamView.vue +++ b/src/views/mes/cal/calendar/TeamView.vue @@ -33,26 +33,16 @@ diff --git a/src/views/mes/cal/calendar/TypeView.vue b/src/views/mes/cal/calendar/TypeView.vue index 70de72522..ea06668c9 100644 --- a/src/views/mes/cal/calendar/TypeView.vue +++ b/src/views/mes/cal/calendar/TypeView.vue @@ -33,91 +33,38 @@ diff --git a/src/views/mes/cal/calendar/useCalendar.ts b/src/views/mes/cal/calendar/useCalendar.ts new file mode 100644 index 000000000..2f9db7f98 --- /dev/null +++ b/src/views/mes/cal/calendar/useCalendar.ts @@ -0,0 +1,90 @@ +import { ref, watch } from 'vue' +import { CalCalendarApi, CalCalendarDayVO } from '@/api/mes/cal/calendar' +import { CalHolidayApi, CalHolidayVO } from '@/api/mes/cal/holiday' +import { formatDate } from '@/utils/formatTime' +import { HolidayType } from '@/views/mes/utils/constants' + +/** + * 排班日历通用 composable + * + * 封装日历组件中通用的响应式状态、假期加载、排班查询、月份切换逻辑 + */ +export function useCalendar() { + const loading = ref(false) + const currentDate = ref(new Date()) + const calendarDayMap = ref>(new Map()) + const holidaySet = ref(new Set()) + + /** 获取节假日列表,按当前月份范围加载 */ + const loadHolidays = async () => { + holidaySet.value.clear() + const { startDay, endDay } = getMonthRange() + const list = await CalHolidayApi.getHolidayList({ + startDay: formatDate(startDay, 'YYYY-MM-DD HH:mm:ss'), + endDay: formatDate(endDay, 'YYYY-MM-DD HH:mm:ss') + }) + if (!list) { + return + } + list.forEach((item: CalHolidayVO) => { + const day = item.day ? formatDate(item.day as any, 'YYYY-MM-DD') : '' + if (day && item.type === HolidayType.HOLIDAY) { + holidaySet.value.add(day) + } + }) + } + + /** 查询排班日历,params 由调用方提供 queryType 相关参数 */ + const fetchCalendar = async (params: Record) => { + loading.value = true + try { + const { startDay, endDay } = getMonthRange() + const list = await CalCalendarApi.getCalendarList({ + ...params, + startDay: formatDate(startDay, 'YYYY-MM-DD HH:mm:ss'), + endDay: formatDate(endDay, 'YYYY-MM-DD HH:mm:ss') + }) + calendarDayMap.value.clear() + if (!list) { + return + } + list.forEach((item: CalCalendarDayVO) => { + const day = item.day ? formatDate(item.day as any, 'YYYY-MM-DD') : '' + if (day) { + calendarDayMap.value.set(day, { ...item, day }) + } + }) + } finally { + loading.value = false + } + } + + /** 计算当前月份的起止时间 */ + const getMonthRange = () => { + const date = currentDate.value + const year = date.getFullYear() + const month = date.getMonth() + return { + startDay: new Date(year, month, 1), + endDay: new Date(year, month + 1, 0, 23, 59, 59) + } + } + + /** 监听月份切换,调用回调刷新数据 */ + const watchMonth = (callback: () => void) => { + watch(currentDate, () => { + loadHolidays().then() + callback() + }) + } + + return { + loading, + currentDate, + calendarDayMap, + holidaySet, + loadHolidays, + fetchCalendar, + watchMonth + } +} diff --git a/src/views/mes/dv/machinery/type/MachineryTypeForm.vue b/src/views/mes/dv/machinery/type/MachineryTypeForm.vue index 6aa2dabc2..a5181fc91 100644 --- a/src/views/mes/dv/machinery/type/MachineryTypeForm.vue +++ b/src/views/mes/dv/machinery/type/MachineryTypeForm.vue @@ -19,8 +19,9 @@ class="w-1/1" /> - - + + + @@ -75,7 +76,6 @@ const formData = ref({ }) const formRules = reactive({ parentId: [{ required: true, message: '上级类型不能为空', trigger: 'blur' }], - code: [{ required: true, message: '类型编码不能为空', trigger: 'blur' }], name: [{ required: true, message: '类型名称不能为空', trigger: 'blur' }], sort: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }], status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]