src/components/PIMTable/PIMTable.vue
@@ -202,11 +202,11 @@ style="width: 100%" @click="goLink(scope.row, item.linkMethod)" > <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span> <span v-if="!item.formatData">{{ dateOnly(scope.row[item.prop]) }}</span> </div> <!-- é»è®¤çº¯å±ç¤ºæ°æ® --> <div v-else class="cell" style="width: 100%"> <span v-if="!item.formatData">{{ scope.row[item.prop] }}</span> <span v-if="!item.formatData">{{ dateOnly(scope.row[item.prop]) }}</span> <span v-else>{{ formatters(scope.row[item.prop], item.formatData) }}</span> @@ -228,6 +228,7 @@ import pagination from "./Pagination.vue"; import { ref, inject, getCurrentInstance } from "vue"; import { ElMessage } from "element-plus"; import { dateOnly } from "@/utils/dateFormat"; // è·åå ¨å±ç uploadHeader const { proxy } = getCurrentInstance(); src/main.js
@@ -27,6 +27,7 @@ import "./permission"; // permission control import { useDict } from "@/utils/dict"; import { dateOnlyFormatter, dateOnlyTextMixin } from "@/utils/dateFormat"; import { parseTime, resetForm, @@ -113,4 +114,16 @@ }); app._context.components.ElDialog.props.closeOnClickModal.default = false; // --------------------------------------------------------------------------- // æ¶é´åªæ¾ç¤ºå¹´ææ¥ï¼å®¢æ·å£å¾ï¼ææé¡µé¢ä¸æ¾ç¤ºæ¶åç§ï¼ // 1) ææã没æèªå®ä¹ææ§½ãçè¡¨æ ¼åèµ°é»è®¤ formatterï¼èªå¨æªææ YYYY-MM-DD // 2) å ¨å± mixin å ä½å ¶ä½æå¼ï¼è¯¦æ å¼¹çª / el-descriptions / span / å¸¦ææ§½çåå æ ¼ï¼ // åªæ¹ DOM ææ¬ï¼ä¸å¨æ°æ® ââ 表åãæ¥æéæ©å¨ã导åºãæ¥å£åæ°é½ä¸åå½±å // --------------------------------------------------------------------------- const tableColumn = app._context.components.ElTableColumn; if (tableColumn && tableColumn.props && tableColumn.props.formatter) { tableColumn.props.formatter = { type: Function, default: dateOnlyFormatter }; } app.mixin(dateOnlyTextMixin); app.mount("#app"); src/utils/dateFormat.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,100 @@ /** * å ¨ç«ãæ¶é´åªæ¾ç¤ºå¹´ææ¥ãå·¥å ·ï¼éæ± 14ï¼ * --------------------------------------------------------------- * 客æ·å£å¾ï¼é¡µé¢ä¸æææ¶é´é½ä¸æ¾ç¤ºæ¶åç§ï¼åªä¿ç `YYYY-MM-DD`ã * * ä¸ç§æ¥å ¥æ¹å¼ï¼è¦çå ¨é¨æ¾ç¤ºè·¯å¾ï¼å**ä¸å½±åæ°æ®ãä¸å½±å导åº/æ¥å£åæ°**ï¼ï¼ * 1. è¡¨æ ¼åï¼`main.js` ç» Element Plus ç `el-table-column` ç `formatter` 设äºé»è®¤å¼ * â ææã没æèªå®ä¹ææ§½ãçåèªå¨åªæ¾ç¤ºæ¥æï¼ * 2. å ±äº«è¡¨æ ¼ç»ä»¶ï¼`PIMTable.vue` çé»è®¤å±ç¤ºåæ¯è°ç¨ `dateOnly()`ï¼PIMTable çåé½å¸¦ææ§½ï¼ * æ¿ä¸å°ä¸é¢çé»è®¤ formatterï¼ï¼ * 3. å ¶å®ä»»ä½æå¼ï¼detail å¼¹çªãel-descriptionsãspanãslot åå æ ¼â¦ï¼ï¼ * å ¨å± mixin `dateOnlyTextMixin` å¨ç»ä»¶æè½½/æ´æ°åï¼æ**çº¯æ¥ææ¶é´ææ¬èç¹**æªæææ¥æã * * åªå¤çãæ¥æ + æ¶åç§ãè¿ç§å®æ´å½¢æçåç¬¦ä¸²ï¼ * â '2026-10-09 14:20:00' -> '2026-10-09' â '2026-10-09T14:20:00.000+08:00' -> '2026-10-09' * â '08:00:00'ï¼ç¨çµæ¶æ®µ/çæ¬¡è¿ç±»çº¯æ¶é´ï¼æ²¡æå¹´ææ¥ï¼ä¿æåæ · * â '2026-10-09'ï¼æ¬æ¥å°±æ¯æ¥æï¼ã'2026-10'ãæ°åéé¢çä¿æåæ · * * éè¦ä¿ç宿´æ¶é´çå±é¨ï¼ç»å ç´ å `data-keep-time` 屿§å³å¯è·³è¿ï¼å¦ï¼ * `<span data-keep-time>{{ row.createTime }}</span>`ï¼ã */ const DATE_PART = /^(\d{4}-\d{2}-\d{2})[ T](\d{2}:\d{2}(?::\d{2})?(?:\.\d+)?)(?:Z|[+-]\d{2}:?\d{2})?$/ const TEXT_NODE_RE = /^(\s*)(\d{4}-\d{2}-\d{2})[ T]\d{2}:\d{2}(?::\d{2})?(?:\.\d+)?(?:\s*)$/ const HAS_DATETIME = /\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}/ /** Date / æ¶é´æ³ â 'YYYY-MM-DD'ï¼æ¬å°æ¶åºï¼ */ function fromDateObject(d) { const p = (n) => String(n).padStart(2, '0') return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}` } // åªæãåæ¶é´æ³ãçæ°åå½å¹´ææ¥çå¾ ï¼2000-01-01 ~ 2100-01-01ï¼ï¼ // å¦åæ°é/éé¢/åºå·éç 0ã1ã123 ä¼è¢«è¯¯æ¸²ææ 1970-01-01 const TS_MS_MIN = 946684800000 const TS_MS_MAX = 4102444800000 const TS_S_MIN = 946684800 const TS_S_MAX = 4102444800 function fromTimestamp(n) { let ms if (Number.isInteger(n) && n >= TS_MS_MIN && n <= TS_MS_MAX) ms = n else if (Number.isInteger(n) && n >= TS_S_MIN && n <= TS_S_MAX) ms = n * 1000 else return undefined const d = new Date(ms) return Number.isNaN(d.getTime()) ? undefined : fromDateObject(d) } /** * æãæ¥æ + æ¶åç§ãæªææãå¹´ææ¥ãï¼å ¶å®å¼åæ ·è¿åã * è¿å null/undefined/'' æ¶ä¹åæ ·è¿åï¼ä¿ç页é¢ä¸ç '-' / 空æå¤çï¼ã */ export function dateOnly(value) { if (value === null || value === undefined || value === '') return value if (value instanceof Date) return Number.isNaN(value.getTime()) ? value : fromDateObject(value) if (typeof value === 'number') return fromTimestamp(value) ?? value if (typeof value !== 'string') return value const m = DATE_PART.exec(value.trim()) return m ? m[1] : value } /** el-table-column çé»è®¤ formatterï¼æ èªå®ä¹ææ§½çåçæï¼ */ export function dateOnlyFormatter(row, column, cellValue) { const v = dateOnly(cellValue) return v === null || v === undefined ? '' : String(v) } /** æä¸ä¸ªææ¬èç¹æªæææ¥æï¼è¿åæ¯å¦æ¹å¨ */ function truncateTextNode(node) { const m = TEXT_NODE_RE.exec(node.nodeValue || '') if (!m) return false node.nodeValue = `${m[1]}${m[2]}` return true } function walk(el) { if (!el || el.nodeType !== 1) return // å¿«éå¤æï¼æ´æ£µåæ æ²¡æãæ¥æ+æ¶åãå°±ä¸ç¨éä¸ªææ¬èç¹çäº if (!HAS_DATETIME.test(el.textContent || '')) return const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT) let n = walker.nextNode() while (n) { const next = walker.nextNode() if (n.parentElement && !n.parentElement.closest('[data-keep-time]')) truncateTextNode(n) n = next } } /** * å ¨å± mixinï¼ç»ä»¶æè½½/æ´æ°åæçº¯æ¥ææ¶é´ææ¬æªæææ¥æã * åªæ¹ DOM ææ¬ï¼ä¸å¨ååºå¼æ°æ® ââ 表ååæ¾ãæ¥æéæ©å¨ã导åºãæ¥å£åæ°é½ä¸åå½±åã */ export const dateOnlyTextMixin = { mounted() { walk(this.$el) }, updated() { walk(this.$el) }, } src/utils/ruoyi.js
@@ -4,11 +4,13 @@ */ // æ¥ææ ¼å¼å // 说æï¼é»è®¤æ ¼å¼å·²æå®¢æ·å£å¾æ¹ä¸ºãåªæ¾ç¤ºå¹´ææ¥ãï¼ç¡®å®è¦å¸¦æ¶åç§è¯·æ¾å¼ä¼ patternï¼ // ä¾å¦ parseTime(time, '{y}-{m}-{d} {h}:{i}:{s}') export function parseTime(time, pattern) { if (arguments.length === 0 || !time) { return null } const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' const format = pattern || '{y}-{m}-{d}' let date if (typeof time === 'object') { date = time src/views/basicData/customerFile/index.vue
@@ -269,7 +269,7 @@ <el-date-picker v-model="reminderForm.reminderTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" placeholder="è¯·éæ©æéæ¶é´" style="width: 100%" /> </el-form-item> @@ -338,7 +338,7 @@ <el-date-picker v-model="negotiationForm.followUpTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" placeholder="è¯·éæ©" style="width: 100%" /> </el-form-item> src/views/collaborativeApproval/notificationManagement/index.vue
@@ -155,7 +155,7 @@ v-model="meetingForm.startTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" placeholder="è¯·éæ©å¼å§æ¶é´" style="width: 100%" /> src/views/collaborativeApproval/rulesRegulationsManagement/index.vue
@@ -103,7 +103,7 @@ prop="effectiveTime"> <el-date-picker v-model="regulationForm.effectiveTime" type="datetime" format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="éæ©çææ¶é´" style="width: 100%" /> src/views/equipmentManagement/repair/Modal/MaintainModal.vue
@@ -25,7 +25,7 @@ <el-date-picker v-model="form.maintenanceTime" placeholder="è¯·éæ©ç»´ä¿®æ¥æ" format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" clearable src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
@@ -18,7 +18,7 @@ <el-date-picker v-model="form.maintenanceActuallyTime" placeholder="è¯·éæ©å®é ä¿å »æ¥æ" format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="datetime" clearable src/views/equipmentManagement/upkeep/index.vue
@@ -389,7 +389,7 @@ align: "center", prop: "maintenanceActuallyTime", formatData: (cell) => cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-", cell ? dayjs(cell).format("YYYY-MM-DD") : "-", }, { label: "ä¿å »ç»æ", src/views/inventoryManagement/stockWarning/index.vue
@@ -259,7 +259,7 @@ <el-form-item label="é¢è¦æ¶é´ï¼" prop="warningTime"> <el-date-picker v-model="form.warningTime" type="datetime" type="datetime" format="YYYY-MM-DD" placeholder="è¯·éæ©é¢è¦æ¶é´" style="width: 100%" value-format="YYYY-MM-DD HH:mm:ss" @@ -270,7 +270,7 @@ <el-form-item label="é¢è®¡å è£ æ¶é´ï¼" prop="expectedRefillTime"> <el-date-picker v-model="form.expectedRefillTime" type="datetime" type="datetime" format="YYYY-MM-DD" placeholder="è¯·éæ©é¢è®¡å è£ æ¶é´" style="width: 100%" value-format="YYYY-MM-DD HH:mm:ss" @@ -284,7 +284,7 @@ <el-form-item label="é¢è®¡ç¼ºæ°æ¶é´ï¼" prop="expectedShortageTime"> <el-date-picker v-model="form.expectedShortageTime" type="datetime" type="datetime" format="YYYY-MM-DD" placeholder="è¯·éæ©é¢è®¡ç¼ºæ°æ¶é´" style="width: 100%" value-format="YYYY-MM-DD HH:mm:ss" src/views/inventoryManagement/transportTaskManagement/index.vue
@@ -308,7 +308,7 @@ v-model="form.loadTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD" placeholder="è¯·éæ©è£ è´§æ¶é´" style="width: 100%" /> @@ -320,7 +320,7 @@ v-model="form.deliveryTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD" placeholder="è¯·éæ©éè´§æ¶é´" style="width: 100%" /> @@ -332,7 +332,7 @@ v-model="form.signTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD" placeholder="è¯·éæ©ç¾æ¶æ¶é´" style="width: 100%" /> src/views/procurementManagement/advancedPriceManagement/index.vue
@@ -210,7 +210,7 @@ <el-form-item label="ææ£æææ"> <el-date-picker v-model="formData.discountEndTime" type="datetime" type="datetime" format="YYYY-MM-DD" placeholder="éæ©ç»ææ¶é´" style="width: 100%" /> @@ -241,12 +241,12 @@ <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="çææ¶é´" prop="effectiveTime"> <el-date-picker v-model="formData.effectiveTime" type="datetime" placeholder="éæ©çææ¶é´" style="width: 100%" /> <el-date-picker v-model="formData.effectiveTime" type="datetime" format="YYYY-MM-DD" placeholder="éæ©çææ¶é´" style="width: 100%" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å¤±ææ¶é´"> <el-date-picker v-model="formData.expireTime" type="datetime" placeholder="éæ©å¤±ææ¶é´" style="width: 100%" /> <el-date-picker v-model="formData.expireTime" type="datetime" format="YYYY-MM-DD" placeholder="éæ©å¤±ææ¶é´" style="width: 100%" /> </el-form-item> </el-col> </el-row> @@ -288,10 +288,10 @@ /> </el-form-item> <el-form-item label="çææ¶é´"> <el-date-picker v-model="batchDiscountForm.effectiveTime" type="datetime" placeholder="éæ©çææ¶é´" style="width: 100%" /> <el-date-picker v-model="batchDiscountForm.effectiveTime" type="datetime" format="YYYY-MM-DD" placeholder="éæ©çææ¶é´" style="width: 100%" /> </el-form-item> <el-form-item label="å¤±ææ¶é´"> <el-date-picker v-model="batchDiscountForm.expireTime" type="datetime" placeholder="éæ©å¤±ææ¶é´" style="width: 100%" /> <el-date-picker v-model="batchDiscountForm.expireTime" type="datetime" format="YYYY-MM-DD" placeholder="éæ©å¤±ææ¶é´" style="width: 100%" /> </el-form-item> <el-form-item label="éç¨åå"> <div class="selected-items"> src/views/procurementManagement/priceManagement/index.vue
@@ -88,7 +88,7 @@ <el-input v-model="formData.newPrice" placeholder="请è¾å ¥æ°ä»·æ ¼" type="number" /> </el-form-item> <el-form-item label="çææ¶é´"> <el-date-picker v-model="formData.effectiveTime" type="datetime" placeholder="éæ©çææ¶é´" style="width: 100%" /> <el-date-picker v-model="formData.effectiveTime" type="datetime" format="YYYY-MM-DD" placeholder="éæ©çææ¶é´" style="width: 100%" /> </el-form-item> <el-form-item label="è°ä»·åå "> <el-select v-model="formData.reason" placeholder="è¯·éæ©è°ä»·åå " style="width: 100%"> src/views/qualityManagement/afterSalesTraceability/index.vue
@@ -223,7 +223,7 @@ v-model="form.feedbackTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD" placeholder="è¯·éæ©å馿¶é´" style="width: 100%" /> src/views/safeProduction/accidentReportingRecord/index.vue
@@ -77,7 +77,7 @@ <el-date-picker style="width: 100%" v-model="form.happenTime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" type="datetime" placeholder="è¯·éæ©" clearable /> @@ -157,7 +157,7 @@ <el-date-picker style="width: 100%" v-model="form.createTime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" type="datetime" disabled placeholder="è¯·éæ©" src/views/salesManagement/invoiceLedger/index.vue
@@ -219,7 +219,7 @@ return parseFloat(cellValue).toFixed(2); }; const formatDate = (row, column, cellValue) => { return dayjs(cellValue).format("YYYY-MM-DD HH:mm:ss"); return dayjs(cellValue).format("YYYY-MM-DD"); }; // æ¥è¯¢å表 /** æç´¢æé®æä½ */ src/views/salesManagement/returnOrder/components/formDia.vue
@@ -52,7 +52,7 @@ </el-col> <el-col :span="4"> <el-form-item label="å¶åæ¶é´ï¼" prop="makeTime"> <el-date-picker v-model="form.makeTime" type="datetime" style="width:100%" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" /> <el-date-picker v-model="form.makeTime" type="datetime" style="width:100%" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD" /> </el-form-item> </el-col> <el-col :span="4">