From bcc592534f8e3550b73634d9a3eee63673e32501 Mon Sep 17 00:00:00 2001 From: linfso Date: Sat, 22 Feb 2025 16:59:48 +0800 Subject: [PATCH] md --- public/static/tpl/import_site_batch.xlsx | Bin 9960 -> 10028 bytes src/utils/custom.js | 85 +++++++++++++++++- .../panel/BatchImportSiteBatch.vue | 13 ++- .../panel/BigBatchListPanel.vue | 1 + 4 files changed, 93 insertions(+), 6 deletions(-) diff --git a/public/static/tpl/import_site_batch.xlsx b/public/static/tpl/import_site_batch.xlsx index eb5d44597637b6e4f7420721c6b9a25510433dbf..2022c70d0ed28767830191863425162a7c5e7fad 100644 GIT binary patch delta 4193 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 Sj9wz3L633K5Du~bJ^UX_e9R~S delta 4123 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 FzX0bp$x#3R diff --git a/src/utils/custom.js b/src/utils/custom.js index d651c726..3dad090a 100644 --- a/src/utils/custom.js +++ b/src/utils/custom.js @@ -4,9 +4,90 @@ import request from '@/utils/request' import dayjs from "dayjs"; /** - * 通用js方法封装处理 - * Copyright (c) 2019 ruoyi + * 解析日期字符串并返回指定格式的日期。 + * + * @param {string|number} dateString - 要解析的日期字符串或 Excel 日期数字。 + * @param {boolean} isDateTime - 是否需要返回日期和时间格式。 + * @returns {string} - 格式化后的日期字符串。 */ +export function parseExcelTime(dateString, isDateTime){ + // 帮助函数:将 Date 对象格式化为 yyyy-MM-dd HH:mm:ss + const formatDateTime = date => { + return dayjs(date).format("YYYY-MM-DD HH:mm:ss"); + }; + + // 帮助函数:将 Date 对象格式化为 yyyy-MM-dd + const formatDate = date => { + return dayjs(date).format("YYYY-MM-DD"); + }; + + // 将非字符串的日期转换为字符串 + if (typeof dateString !== "string") { + dateString = String(dateString); + } + + // 处理包含 "23:59:17" 的日期字符串 + if (dateString.includes("23:59:17")) { + dateString = dayjs(dateString) + .add(isDateTime ? 43 : 1, isDateTime ? "second" : "day") + .format(isDateTime ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD"); + } + + // 检查日期字符串是否为数字(Excel 日期格式) + if (!isNaN(dateString) && !isNaN(parseFloat(dateString))) { + const excelDate = parseFloat(dateString); + const excelEpoch = new Date(Date.UTC(1899, 11, 30)); + const dayInMs = 24 * 60 * 60 * 1000; + const parsedDate = new Date( + excelEpoch.getTime() + excelDate * dayInMs + ); + return isDateTime + ? formatDateTime(parsedDate) + : formatDate(parsedDate); + } + + // 处理各种日期格式 + let date; + const chineseDateTimeRegex = /^(\d{4})年(\d{1,2})月(\d{1,2})日 (\d{2}):(\d{2}):(\d{2})$/; + const chineseDateRegex = /^(\d{4})年(\d{1,2})月(\d{1,2})日$/; + const chineseMatch = dateString.match(chineseDateTimeRegex); + const chineseDateMatch = dateString.match(chineseDateRegex); + const dotDateRegex = /^(\d{4})\.(\d{1,2})\.(\d{1,2})$/; // 匹配 2024.06.20 格式的正则表达式 + const dotDateMatch = dateString.match(dotDateRegex); + + if (chineseMatch) { + const [_, year, month, day, hour, minute, second] = chineseMatch; + date = new Date(year, month - 1, day, hour, minute, second); + } else if (chineseDateMatch) { + const [_, year, month, day] = chineseDateMatch; + date = new Date(year, month - 1, day); + } else if (dotDateMatch) { + const [_, year, month, day] = dotDateMatch; + date = new Date(year, month - 1, day); + } else { + const slashDateTimeRegex = /^(\d{4})\/(\d{1,2})\/(\d{1,2})( \d{2}:\d{2}:\d{2})?$/; + const slashMatch = dateString.match(slashDateTimeRegex); + if (slashMatch) { + const [_, year, month, day, time] = slashMatch; + date = new Date( + `${year}-${month}-${day}T${time ? time.trim() : "00:00:00"}` + ); + } else { + date = new Date(dateString); + if (!isDateTime) { + date.setUTCHours(0, 0, 0, 0); + } + } + } + + if (isNaN(date.getTime())) { + console.error(`Invalid date object: ${dateString}`); + return dateString; + } + + return isDateTime ? formatDateTime(date) : formatDate(date); +} + // 日期格式化 export function parseTime(time, pattern) { diff --git a/src/views/emis/emisTmsSiteBatch/panel/BatchImportSiteBatch.vue b/src/views/emis/emisTmsSiteBatch/panel/BatchImportSiteBatch.vue index 213af9f2..cd48c4a5 100644 --- a/src/views/emis/emisTmsSiteBatch/panel/BatchImportSiteBatch.vue +++ b/src/views/emis/emisTmsSiteBatch/panel/BatchImportSiteBatch.vue @@ -83,7 +83,11 @@ - + + + @@ -100,10 +104,11 @@ import { listSimpleEmisSupplier } from "@/api/emis/emisSupplier"; import { listEmisTmsSiteBatchDtl, delEmisTmsSiteBatchDtl, addEmisTmsSiteBatchDtl } from "@/api/emis/emisTmsSiteBatchDtl"; import { listEmisWaybill } from "@/api/emis/emisWaybill"; -import { parseTime } from "@/utils/custom"; +import { parseTime,parseExcelTime } from "@/utils/custom"; import {timeDiffTime,timeFormat} from '@/utils/dateUtils' import { formatSearchStr,deepClone } from '@/utils/index' import { result } from "lodash"; +import dayjs from "dayjs"; import XLSX from 'xlsx' import moment from 'moment' @@ -211,7 +216,7 @@ export default { const reader = new FileReader() reader.onload = e => { const data = e.target.result - const workbook = XLSX.read(data, { type: 'array' }) + const workbook = XLSX.read(data, { type: 'array' ,cellDates: true}) const firstSheetName = workbook.SheetNames[0] // firstSheetName // if (!excelTypes.includes(firstSheetName)) { // reject('无法识别当前Excel模板') @@ -272,7 +277,7 @@ export default { transType: element['运输方式'], startSiteCode: element['起始网点'], nextSiteCode: element['下一网点'], - etd: element['发出时间'], + etd: parseExcelTime(element['发出时间'],false), carNo: element['运输号'], destCountry: element['目的国家'], destCountryName: null, diff --git a/src/views/emis/emisTmsSiteBatch/panel/BigBatchListPanel.vue b/src/views/emis/emisTmsSiteBatch/panel/BigBatchListPanel.vue index fc27bae8..c4d2756b 100644 --- a/src/views/emis/emisTmsSiteBatch/panel/BigBatchListPanel.vue +++ b/src/views/emis/emisTmsSiteBatch/panel/BigBatchListPanel.vue @@ -155,6 +155,7 @@ icon="el-icon-download" size="mini" @click="handleExport" + v-hasPermi="['emis:emisTmsSiteBatch:export']" >导出