yuan
3 天以前 79548559809eec7c4fb8c666314605d688dffeb4
feat(date-format): 全站时间格式化为只显示年月日
已修改17个文件
已添加1个文件
170 ■■■■■ 文件已修改
src/components/PIMTable/PIMTable.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/dateFormat.js 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/ruoyi.js 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/customerFile/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/collaborativeApproval/notificationManagement/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/collaborativeApproval/rulesRegulationsManagement/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/repair/Modal/MaintainModal.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/upkeep/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockWarning/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/transportTaskManagement/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/advancedPriceManagement/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/priceManagement/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/afterSalesTraceability/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safeProduction/accidentReportingRecord/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/invoiceLedger/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/returnOrder/components/formDia.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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">