From 2cd379cc5766253ad6bd2bdf8bf68dbb1bb5e942 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Fri, 11 Sep 2026 15:46:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=EF=BC=8C=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/canteen/canteenReport.ts | 27 ++- src/utils/formatTime.ts | 7 + .../canteenDailyMenu/importConfirmDialog.vue | 36 +++- src/views/canteen/canteenDailyMenu/index.vue | 26 ++- .../canteenDailyMenu/orderOrdersDialog.vue | 156 ++++++++++++++++++ .../canteen/canteenDailyMenu/rowDialog.vue | 22 ++- .../canteen/canteenReportAdjust/index.vue | 11 +- .../canteen/canteenReportBoard/index.vue | 9 +- .../canteen/canteenReportBoxImport/index.vue | 126 +++++++++++++- .../canteen/canteenReportFaceImport/index.vue | 91 ++++++++-- .../canteen/canteenReportFoodEnergy/index.vue | 83 +++++++++- .../canteen/canteenReportPerson/index.vue | 69 ++++++-- .../canteen/canteenReportRoster/index.vue | 11 +- .../canteen/canteenReportSettlePark/index.vue | 9 +- .../canteen/canteenReportSwipe/index.vue | 27 ++- 15 files changed, 627 insertions(+), 83 deletions(-) create mode 100644 src/views/canteen/canteenDailyMenu/orderOrdersDialog.vue diff --git a/src/api/canteen/canteenReport.ts b/src/api/canteen/canteenReport.ts index b3fbb456..65d295a2 100644 --- a/src/api/canteen/canteenReport.ts +++ b/src/api/canteen/canteenReport.ts @@ -5,7 +5,13 @@ export function fetchFaceImportLogPage(query?: Object) { return request({ url: "/canteen/canteenReport/faceImport/log/page", method: "get", params: query }) } export function delFaceImportLog(ids?: Object) { - return request({ url: "/canteen/canteenReport/faceImport/log", method: "delete", data: ids }) + return request({ + url: "/canteen/canteenReport/faceImport/log", + method: "delete", + data: ids, + // 大批量明细/刷卡分批物理删除可能较久 + timeout: 600000, + }) } export function fetchFaceDetailPage(query?: Object) { return request({ url: "/canteen/canteenReport/faceImport/detail/page", method: "get", params: query }) @@ -89,8 +95,20 @@ export function putFoodEnergy(obj?: Object) { export function delFoodEnergy(ids?: Object) { return request({ url: "/canteen/canteenReport/foodEnergy", method: "delete", data: ids }) } -export function clearFoodEnergyMonth(bizMonth: string) { - return request({ url: `/canteen/canteenReport/foodEnergy/month/${bizMonth}`, method: "delete" }) +export function clearFoodEnergyMonth(bizMonth: string, park?: string) { + return request({ + url: `/canteen/canteenReport/foodEnergy/month/${bizMonth}`, + method: "delete", + params: park ? { park } : undefined, + }) +} + +export function clearBoxImport(params: { bizMonth: string; park?: string }) { + return request({ url: "/canteen/canteenReport/boxImport/clear", method: "delete", params }) +} + +export function reportParks(bizMonth: string) { + return request({ url: "/canteen/canteenReport/parks", method: "get", params: { bizMonth } }) } /** 手工调整 */ @@ -161,6 +179,9 @@ export function delPerson(ids?: Object) { export function clearPersonAll() { return request({ url: "/canteen/canteenReport/person/all", method: "delete" }) } +export function clearPersonByMonth(bizMonth: string) { + return request({ url: "/canteen/canteenReport/person/month", method: "delete", params: { bizMonth } }) +} export function importPersonExcel(data: FormData, params: Object) { return request({ url: "/canteen/canteenReport/person/import", diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts index 452ea087..82b6610c 100644 --- a/src/utils/formatTime.ts +++ b/src/utils/formatTime.ts @@ -233,3 +233,10 @@ export const dateTimeStr: string = "YYYY-MM-DD HH:mm:ss" export const dateStr: string = "YYYY-MM-DD" export const timeStr: string = "HH:mm:ss" + +/** 当前自然月,格式 yyyy-MM(报表业务月默认值) */ +export function currentBizMonth(): string { + const d = new Date() + const m = d.getMonth() + 1 + return `${d.getFullYear()}-${m < 10 ? `0${m}` : m}` +} diff --git a/src/views/canteen/canteenDailyMenu/importConfirmDialog.vue b/src/views/canteen/canteenDailyMenu/importConfirmDialog.vue index 65e797eb..f4a98dba 100644 --- a/src/views/canteen/canteenDailyMenu/importConfirmDialog.vue +++ b/src/views/canteen/canteenDailyMenu/importConfirmDialog.vue @@ -148,9 +148,14 @@ - + + + + @@ -198,6 +203,19 @@ const ALL_MEALS = ["早餐", "午餐", "晚餐"] as const const selectedCount = computed(() => rows.value.filter((r) => r.selected && !r.locked).length) +/** 把后端/Excel 各种日期写法统一成 yyyy-MM-dd,避免同一天拆成两个 Tab */ +const normalizeBizDate = (raw?: string) => { + const s = String(raw || "").trim() + if (!s) return "" + const head = s.split(/[ T]/)[0] || s + const m = head.match(/^(\d{4})[\/\-.](\d{1,2})[\/\-.](\d{1,2})$/) + if (!m) return head + const y = m[1] + const mo = String(Number(m[2])).padStart(2, "0") + const d = String(Number(m[3])).padStart(2, "0") + return `${y}-${mo}-${d}` +} + const dayTabs = computed(() => { const map = new Map { skipLockedCount: number }>() for (const r of rows.value) { - const date = String(r.bizDate || "").trim() + const date = normalizeBizDate(r.bizDate) if (!date) continue const tab = map.get(date) || { bizDate: date, @@ -231,7 +249,8 @@ const dayTabs = computed(() => { } // 优先用后端 daySummaries 的锁定标记补齐 for (const d of preview.value?.daySummaries || []) { - const exist = map.get(d.bizDate) + const key = normalizeBizDate(d.bizDate) + const exist = map.get(key) if (exist && d.locked) exist.locked = true } return [...map.values()].sort((a, b) => a.bizDate.localeCompare(b.bizDate)) @@ -283,7 +302,7 @@ const onRowMealsChange = (row: any) => { } const dayRows = computed(() => - rows.value.filter((r) => String(r.bizDate || "").trim() === activeDate.value), + rows.value.filter((r) => normalizeBizDate(r.bizDate) === activeDate.value), ) const dayStats = computed(() => { @@ -357,15 +376,17 @@ const open = (payload: { replaceDay.value = payload.replaceDay rows.value = (payload.preview?.rows || []).map((r: any) => { const mealNames = parseMealNames(r.mealName) + const bizDate = normalizeBizDate(r.bizDate) return { ...r, + bizDate, mealNames: mealNames.length ? mealNames : [], mealName: mealNames.join(",") || r.mealName, } }) mealFilters.value = [...ALL_MEALS] const dates = [ - ...new Set(rows.value.map((r) => String(r.bizDate || "").trim()).filter(Boolean)), + ...new Set(rows.value.map((r) => normalizeBizDate(r.bizDate)).filter(Boolean)), ].sort() activeDate.value = dates[0] || "" visible.value = true @@ -425,7 +446,8 @@ const submitConfirm = async () => { categoryName: r.categoryName, dishPriceYuan: toNumberOrUndef(r.dishPriceYuan), priceYuan: toNumberOrUndef(r.priceYuan), - stock: toNumberOrUndef(r.stock), + onlineStock: toNumberOrUndef(r.onlineStock), + offlineStock: toNumberOrUndef(r.offlineStock), ingredients: r.ingredients, id: r.id, spuId: r.spuId, diff --git a/src/views/canteen/canteenDailyMenu/index.vue b/src/views/canteen/canteenDailyMenu/index.vue index 82aa1a00..8f1de29d 100644 --- a/src/views/canteen/canteenDailyMenu/index.vue +++ b/src/views/canteen/canteenDailyMenu/index.vue @@ -245,18 +245,24 @@ - - + + + + + - +