yxh
8 天以前 fb16e99d60035949b870d0bed7f38b452458000a
修改了专家费校验和附件名字校验
已修改39个文件
已添加1个文件
581 ■■■■■ 文件已修改
src/utils/fileNameCheck.js 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/components/annexupload/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/documentfiles/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donatebaseinfo/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donateconsolationfund/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donatefinish/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donatefinishcheck/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donatefollowup/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donateorgan/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donatereview/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donationdetails/index.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donationwitness/index.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donorcharge/donorcharge/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donorcharge/donorchargedetail/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/ethicalReview/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fund/applyDetail/index.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fund/applyDetail0/index.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fund/ethicalExpertFeeApply/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fund/expertFeeApply/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fund/officeExpenseApply/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fund/performanceApply/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fund/performancedetails/index.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fundcheck/ethicalExpertFeeCheck/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fundcheck/expertFeeCheck/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fundcheck/medicalCostCheck/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fundcheck/officeExpenseCheck/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fundcheck/performanceCheck/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fundflow/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/itemexpense/index.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/medicalevaluation/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/organallocation/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/organallocation/index0.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/organization/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/relativesconfirmation/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/tallage/computingBill/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/travelexpenseapply/edit.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/travelexpenseapply/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/travelexpenseapply/travelexpensedetail/index.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/travelexpensecheck/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/unitCost/particulars/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/fileNameCheck.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,153 @@
/**
 * æŠ¥é”€å•附件文件名规范校验(2026-10-15)
 *
 * ä¸šåŠ¡å£å¾„ï¼ˆä¸šåŠ¡æ–¹ç¡®è®¤ï¼‰ï¼š
 *   1. å¿…须包含中文(至少 1 ä¸ªæ±‰å­—)——"为方便查验附件,请用中文规范命名附件!"
 *   2. åŽ»æŽ‰æ‰©å±•ååŽçš„ä¸»å¹²ï¼ŒæŒ‰å­—ç¬¦æ•°è®¡ç®—ä¸èƒ½è¶…è¿‡ 20 ä¸ªå­———"为方便查验附件,附件名字长度不能超过20个字!"
 *   3. ä¸èƒ½åŒ…含空格及 / \ : * ? " < > | # % ç­‰ç‰¹æ®Šå­—符
 *   4. åŒä¸€æ˜Žç»†è¡Œå†…不能重名(比较时忽略扩展名大小写与首尾空格)
 *
 * ä½¿ç”¨åœºæ™¯ï¼š
 *   - ä¸Šä¼ æˆåŠŸå›žè°ƒï¼šä¸åˆæ ¼ â†’ å¼¹æç¤ºä¸”不加入列表;
 *   - ä¿å­˜/提交前:调用 checkDetails ç»Ÿä¸€æ ¡éªŒï¼Œä¸åˆæ ¼åˆ™æ‹¦ä¸‹ä¸å…è®¸ä¿å­˜ï¼›
 *   - åŽç«¯ä¿å­˜æŽ¥å£å¦æœ‰åŒå£å¾„的二次校验(防止绕过前端)。
 */
/** ä¸»å¹²ï¼ˆåŽ»æ‰©å±•åï¼‰æœ€å¤§å­—ç¬¦æ•° */
export const MAX_MAIN_LENGTH = 20;
/** æ±‰å­— */
const RE_CHINESE = /[\u4e00-\u9fa5]/;
/** éžæ³•字符:空格(含各类空白)+ / \ : * ? " < > | # % */
const RE_ILLEGAL = /[\s/\\:*?"<>|#%]/;
export const MSG_NO_CHINESE = "为方便查验附件,请用中文规范命名附件!";
export const MSG_TOO_LONG = "为方便查验附件,附件名字长度不能超过20个字!";
export const MSG_ILLEGAL = '为方便查验附件,附件名不能包含空格及 / \\ : * ? " < > | # % ç­‰ç‰¹æ®Šå­—符!';
export const MSG_DUPLICATE = "为方便查验附件,同一行内不能有重名的附件!";
/**
 * å–主干(去掉最后一个扩展名)
 * @param {string} fileName åŽŸå§‹æ–‡ä»¶å
 * @returns {string} ä¸»å¹²
 */
export function mainName(fileName) {
  const s = (fileName || "").trim();
  const i = s.lastIndexOf(".");
  return i > 0 ? s.substring(0, i) : s;
}
/**
 * å•个文件名校验
 * @param {string} fileName åŽŸå§‹æ–‡ä»¶å
 * @returns {{ok: boolean, msg: string, main: string}}
 */
export function checkFileName(fileName) {
  const name = (fileName || "").trim();
  if (!name) {
    return { ok: false, msg: MSG_NO_CHINESE, main: "" };
  }
  if (RE_ILLEGAL.test(name)) {
    return { ok: false, msg: MSG_ILLEGAL, main: mainName(name) };
  }
  const main = mainName(name);
  if (!RE_CHINESE.test(main)) {
    return { ok: false, msg: MSG_NO_CHINESE, main };
  }
  // æŒ‰å­—符数计(用扩展运算符按码点计数,中文/字母/数字/全角各计 1)
  if ([...main].length > MAX_MAIN_LENGTH) {
    return { ok: false, msg: MSG_TOO_LONG, main };
  }
  return { ok: true, msg: "", main };
}
/** å–附件项显示名(不同页面字段名可能是 name / fileName,取不到就返回空串表示"不判断") */
function itemName(item) {
  if (!item) return "";
  if (typeof item === "string") return item;
  return item.name || item.fileName || "";
}
/**
 * ä¸€ç»„附件校验(含同行重名)
 * @param {Array} list é™„件数组,元素形如 {name, url}
 * @returns {{ok: boolean, msg: string, index: number}}
 */
export function checkFileList(list) {
  const arr = list || [];
  const seen = {};
  for (let i = 0; i < arr.length; i++) {
    const name = itemName(arr[i]);
    if (!name) continue; // å–不到原文件名则不判断,避免误拦
    const r = checkFileName(name);
    if (!r.ok) {
      return { ok: false, msg: r.msg, index: i };
    }
    const key = name.trim().toLowerCase();
    if (seen[key]) {
      return { ok: false, msg: MSG_DUPLICATE, index: i };
    }
    seen[key] = true;
  }
  return { ok: true, msg: "", index: -1 };
}
/**
 * ä¿å­˜å‰æ ¡éªŒæ•´å•明细(发票 + é™„件)
 * @param {Array} details æ˜Žç»†è¡Œæ•°ç»„,行内含 invoicefilesList / annexfilesList(数组)
 * @returns {{ok: boolean, msg: string}}
 */
export function checkDetails(details) {
  const rows = details || [];
  for (let i = 0; i < rows.length; i++) {
    const groups = [
      { label: "发票", list: rows[i] && rows[i].invoicefilesList },
      { label: "附件", list: rows[i] && rows[i].annexfilesList }
    ];
    for (let g = 0; g < groups.length; g++) {
      const arr = groups[g].list || [];
      const seen = {};
      for (let j = 0; j < arr.length; j++) {
        const name = itemName(arr[j]);
        if (!name) continue;
        const r = checkFileName(name);
        if (!r.ok) {
          return {
            ok: false,
            msg:
              "附件文件名不符合要求,无法保存:第" + (i + 1) + "行第" + (j + 1) +
              "个(" + name + ")——" + r.msg
          };
        }
        const key = name.trim().toLowerCase();
        if (seen[key]) {
          return {
            ok: false,
            msg:
              "附件文件名不符合要求,无法保存:第" + (i + 1) + "行第" + (j + 1) +
              "个(" + name + ")——" + MSG_DUPLICATE
          };
        }
        seen[key] = true;
      }
    }
  }
  return { ok: true, msg: "" };
}
/**
 * æ•´å•里所有附件(不分行)的扁平校验,供只有单个文件列表的页面使用
 * @param {Array} lists å¤šä¸ªé™„件数组
 * @returns {{ok: boolean, msg: string}}
 */
export function checkAllLists(lists) {
  const all = lists || [];
  for (let i = 0; i < all.length; i++) {
    const r = checkFileList(all[i]);
    if (!r.ok) {
      return { ok: false, msg: r.msg };
    }
  }
  return { ok: true, msg: "" };
}
src/views/project/components/annexupload/index.vue
@@ -124,7 +124,7 @@
              size="small"
              v-model="uploadtime"
              type="datetime" format="yyyy-MM-dd HH:mm"
              value-format="yyyy-MM-dd HH:mm"
              value-format="yyyy-MM-dd HH:mm:ss"
              placeholder="请选择上传时间"
            >
            </el-date-picker>
src/views/project/documentfiles/index.vue
@@ -274,7 +274,7 @@
                style="width: 220px"
                v-model="form.uploadtime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
              >
              </el-date-picker>
            </el-form-item>
src/views/project/donatebaseinfo/index.vue
@@ -864,7 +864,7 @@
                  style="width: 190px"
                  v-model="form.contacttime"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择报告时间"
                >
                </el-date-picker>
@@ -921,7 +921,7 @@
                  style="width: 190px"
                  v-model="form.reporttime"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择报告时间"
                >
                </el-date-picker>
src/views/project/donateconsolationfund/index.vue
@@ -636,7 +636,7 @@
                style="width: 100%"
                v-model="form.createTime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="申请日期"
              >
              </el-date-picker>
src/views/project/donatefinish/index.vue
@@ -309,7 +309,7 @@
                size="small"
                v-model="form.completetime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择完成时间"
              >
              </el-date-picker>
@@ -379,7 +379,7 @@
                    style="width: 90%"
                    v-model="scope.row.transplanttime"
                    type="date" format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择器官移植时间"
                  >
                  </el-date-picker>
src/views/project/donatefinishcheck/index.vue
@@ -251,7 +251,7 @@
                size="small"
                v-model="form.completetime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择完成时间"
              >
              </el-date-picker>
@@ -321,7 +321,7 @@
                    style="width: 90%"
                    v-model="scope.row.transplanttime"
                    type="date" format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择器官获取时间"
                  >
                  </el-date-picker>
src/views/project/donatefollowup/index.vue
@@ -340,7 +340,7 @@
                size="small"
                v-model="form.followuptime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择随访时间"
              >
              </el-date-picker>
src/views/project/donateorgan/index.vue
@@ -361,7 +361,7 @@
          <el-col :span="12">
            <el-form-item label="获取时间" prop="organgettime">
              <el-date-picker clearable size="medium" v-model="form.organgettime" type="date" format="yyyy-MM-dd" disabled
                value-format="yyyy-MM-dd" placeholder="选择器官获取时间">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择器官获取时间">
              </el-date-picker>
            </el-form-item>
          </el-col>
@@ -411,7 +411,7 @@
          <el-col :span="12">
            <el-form-item label="移植时间" prop="transplanttime">
              <el-date-picker clearable size="medium" v-model="form.transplanttime" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="选择移植时间" disabled>
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择移植时间" disabled>
              </el-date-picker>
            </el-form-item>
          </el-col>
src/views/project/donatereview/index.vue
@@ -397,7 +397,7 @@
                v-model="form.birthday"
                type="date" format="yyyy-MM-dd"
                style="width: 174px"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择出生日期"
              >
              </el-date-picker>
@@ -757,7 +757,7 @@
                size="small"
                v-model="form.reporttime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择报告时间"
              >
              </el-date-picker>
src/views/project/donationdetails/index.vue
@@ -222,7 +222,7 @@
                    size="small"
                    v-model="form.reporttime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择报告日期"
                  >
                  </el-date-picker>
@@ -268,7 +268,7 @@
                    size="small"
                    v-model="form.birthday"
                    type="date" format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择出生日期"
                  >
                  </el-date-picker>
@@ -780,7 +780,7 @@
                  style="width: 190px"
                  v-model="form.contacttime"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择报告时间"
                >
                </el-date-picker>
@@ -863,7 +863,7 @@
                  size="small"
                  v-model="medicineform.hospitalassesstime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择院级评估时间"
                >
                </el-date-picker> </el-form-item
@@ -916,7 +916,7 @@
                  size="small"
                  v-model="medicineform.provincialassesstime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择省级评估时间"
                >
                </el-date-picker> </el-form-item></el-col
@@ -970,7 +970,7 @@
                  size="small"
                  v-model="medicineform.coreteamassesstime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="评估时间"
                >
                </el-date-picker>
@@ -1389,7 +1389,7 @@
                  size="small"
                  v-model="ethicform.conclusiontime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择结论时间"
                >
                </el-date-picker>
@@ -1479,7 +1479,7 @@
                        style="width: 100%"
                        v-model="scope.row.applicanttime"
                        type="datetime" format="yyyy-MM-dd HH:mm"
                        value-format="yyyy-MM-dd HH:mm"
                        value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="选择分配接收时间"
                      >
                      </el-date-picker>
@@ -1659,7 +1659,7 @@
                  clearable
                  v-model="witnessform.deathtime"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择死亡时间"
                >
                </el-date-picker>
@@ -1698,7 +1698,7 @@
                  clearable
                  v-model="witnessform.operationbegtime"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择手术开始时间"
                >
                </el-date-picker>
@@ -1715,7 +1715,7 @@
                  clearable
                  v-model="witnessform.operationendtime"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择手术结束时间"
                >
                </el-date-picker>
@@ -1734,7 +1734,7 @@
                  clearable
                  v-model="witnessform.coordinatorInOperating"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择手术开始时间"
                >
                </el-date-picker>
@@ -1751,7 +1751,7 @@
                  clearable
                  v-model="witnessform.coordinatorOutOperating"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择手术结束时间"
                >
                </el-date-picker>
@@ -1768,7 +1768,7 @@
                  clearable
                  v-model="witnessform.coordinatorSignTime"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择手术结束时间"
                >
                </el-date-picker>
@@ -1795,7 +1795,7 @@
                    clearable
                    v-model="witnessform.abdominalaortacannulatime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择腹主动脉插管时间"
                  >
                  </el-date-picker>
@@ -1812,7 +1812,7 @@
                    clearable
                    v-model="witnessform.abdominalaortaperfusiontime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择腹主动脉灌注时间"
                  >
                  </el-date-picker>
@@ -1829,7 +1829,7 @@
                    clearable
                    v-model="witnessform.portalveincannulatime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择门静脉脉插管时间"
                  >
                  </el-date-picker>
@@ -1846,7 +1846,7 @@
                    clearable
                    v-model="witnessform.portalveinperfusiontime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择门静脉灌注时间"
                  >
                  </el-date-picker>
@@ -1865,7 +1865,7 @@
                    clearable
                    v-model="witnessform.pulmonaryarterycannulatime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择门静脉插管时间"
                  >
                  </el-date-picker>
@@ -1882,7 +1882,7 @@
                    clearable
                    v-model="witnessform.pulmonaryarteryperfusiontime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择门静脉灌注时间"
                  >
                  </el-date-picker>
@@ -1899,7 +1899,7 @@
                    clearable
                    v-model="witnessform.aortacannulatime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择主动脉插管时间"
                  >
                  </el-date-picker>
@@ -1916,7 +1916,7 @@
                    clearable
                    v-model="witnessform.aortaperfusiontime"
                    type="datetime" format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="选择主动脉灌注时间"
                  >
                  </el-date-picker>
@@ -2029,7 +2029,7 @@
                        style="width: 100%"
                        v-model="scope.row.organStartTime"
                        type="datetime" format="yyyy-MM-dd HH:mm"
                        value-format="yyyy-MM-dd HH:mm"
                        value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="请输入获取开始时间"
                      >
                      </el-date-picker>
@@ -2049,7 +2049,7 @@
                        style="width: 100%"
                        v-model="scope.row.organgettime"
                        type="datetime" format="yyyy-MM-dd HH:mm"
                        value-format="yyyy-MM-dd HH:mm"
                        value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="请输入器官离体时间"
                      >
                      </el-date-picker>
@@ -2451,7 +2451,7 @@
                  size="small"
                  v-model="accomplishform.completetime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择完成时间"
                >
                </el-date-picker>
src/views/project/donationwitness/index.vue
@@ -468,7 +468,7 @@
                clearable
                v-model="form.deathtime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择死亡时间"
              >
              </el-date-picker>
@@ -493,7 +493,7 @@
                clearable
                v-model="form.operationbegtime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择手术开始时间"
              >
              </el-date-picker>
@@ -505,7 +505,7 @@
                clearable
                v-model="form.operationendtime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择手术结束时间"
              >
              </el-date-picker>
@@ -526,7 +526,7 @@
                clearable
                v-model="form.abdominalaortacannulatime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择腹主动脉插管时间"
              >
              </el-date-picker>
@@ -542,7 +542,7 @@
                clearable
                v-model="form.abdominalaortaperfusiontime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择腹主动脉灌注时间"
              >
              </el-date-picker>
@@ -564,7 +564,7 @@
                clearable
                v-model="form.portalveincannulatime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择门静脉脉插管时间"
              >
              </el-date-picker>
@@ -580,7 +580,7 @@
                clearable
                v-model="form.portalveinperfusiontime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择门静脉灌注时间"
              >
              </el-date-picker>
@@ -601,7 +601,7 @@
                clearable
                v-model="form.pulmonaryarterycannulatime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择门静脉插管时间"
              >
              </el-date-picker>
@@ -617,7 +617,7 @@
                clearable
                v-model="form.pulmonaryarteryperfusiontime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择门静脉灌注时间"
              >
              </el-date-picker>
@@ -635,7 +635,7 @@
                clearable
                v-model="form.aortacannulatime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择主动脉灌注时间"
              >
              </el-date-picker>
@@ -651,7 +651,7 @@
                clearable
                v-model="form.aortaperfusiontime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择主动脉灌注时间"
              >
              </el-date-picker>
@@ -708,7 +708,7 @@
                  style="width: 100%"
                  v-model="scope.row.organgettime"
                  type="datetime" format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择器官获取时间"
                >
                </el-date-picker>
src/views/project/donorcharge/donorcharge/index.vue
@@ -153,7 +153,7 @@
            <el-table-column prop="amounttime" align="center" label="接收时间" width="120">
              <template slot-scope="scope">
                <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="接收时间">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="接收时间">
                </el-date-picker> </template>
            </el-table-column>
            <el-table-column prop="amount" align="center" label="已收费用" width="120">
@@ -164,7 +164,7 @@
            <el-table-column prop="amounttime" align="center" label="收款时间" width="120">
              <template slot-scope="scope">
                <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="收款时间" @blur="getdays(scope.row)">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="收款时间" @blur="getdays(scope.row)">
                </el-date-picker> </template>
            </el-table-column>
            <el-table-column prop="organcharge" align="center" label="标准费用" width="120">
src/views/project/donorcharge/donorchargedetail/index.vue
@@ -180,7 +180,7 @@
                  style="width: 100%"
                  v-model="scope.row.amounttime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="实收时间"
                >
                </el-date-picker>
@@ -243,7 +243,7 @@
                  style="width: 100%"
                  v-model="scope.row.organtime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="移植时间"
                >
                </el-date-picker>
src/views/project/ethicalReview/index.vue
@@ -293,7 +293,7 @@
                size="small"
                v-model="form.createTime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择结论时间"
              >
              </el-date-picker>
src/views/project/fund/applyDetail/index.vue
@@ -13,7 +13,7 @@
          <el-col :span="5">
            <el-form-item label="申请日期" prop="applyTime">
              <el-date-picker clearable :disabled="true" style="width: 100%" v-model="form.applyTime" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="日   æœŸ">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="日   æœŸ">
              </el-date-picker>
            </el-form-item>
          </el-col>
@@ -795,6 +795,7 @@
import OrgSelecter from "@/views/project/components/orgselect";
import { getToken } from "@/utils/auth";
import { moneySum, moneyMul, moneySub, moneyRound } from "@/utils/money";
import { checkFileName, checkDetails } from "@/utils/fileNameCheck";
import CustomImageViewer from "@/components/CustomImageViewer"; // æ ¹æ®ä½ çš„路径调整
export default {
@@ -1561,6 +1562,11 @@
    },
    /** æäº¤æŒ‰é’® */
    submitForm: debounce(function () {
      // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行)
      if (!this.checkDetailFileNames()) {
        return;
      }
      if (!this.randomnumber) {
        this.randomnumber = this.generateRandomString(9);
        this.form.randomnumber = this.randomnumber;
@@ -2343,6 +2349,11 @@
    },
    // æŽ¥å—提醒立刻保存
    Savenow() {
      // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行)
      if (!this.checkDetailFileNames()) {
        return;
      }
      if (!this.randomnumber) {
        this.randomnumber = this.generateRandomString(9);
        this.form.randomnumber = this.randomnumber;
@@ -2927,7 +2938,43 @@
      }
    },
    /**
     * 2026-10-15:上传时校验附件文件名(业务要求:不合格立即提示且不加入列表)。
     * è§„则与后端 AttachmentNameValidator åŒå£å¾„:必须含中文 / åŽ»æŽ‰æ‰©å±•ååŽä¸»å¹² â‰¤20 å­— /
     * ä¸å«ç©ºæ ¼åŠ / \ : * ? " < > | # % ç­‰ç‰¹æ®Šå­—符。
     */
    checkUploadFileName(file) {
      const raw = file && file.raw ? file.raw.name : file && file.name;
      const r = checkFileName(raw);
      if (!r.ok) {
        this.$modal.msgError(r.msg);
        return false;
      }
      return true;
    },
    /**
     * 2026-10-15:保存前校验整单明细附件文件名(含同一行内重名)。
     * å£å¾„(业务确认):只校验"本次变更"的附件——老单据里已存在的不合规附件名不能把保存卡死
     * ï¼ˆå¦åˆ™è€å•据改一个金额都存不进去)。后端按 id è¯»æ—§è®°å½•放行历史附件;前端拿不到"哪些是历史"
     * çš„æƒå¨ä¿¡æ¯ï¼Œå› æ­¤**仅新增单据**做保存前拦截,编辑老单据时新增的不合规附件由后端二次校验拦下。
     */
    checkDetailFileNames() {
      if (this.form && this.form.id) {
        return true;
      }
      const c = checkDetails(this.rbDetails);
      if (!c.ok) {
        this.$modal.msgError(c.msg);
        return false;
      }
      return true;
    },
    uploadSccess(response, file, fileList) {
      if (!this.checkUploadFileName(file)) {
        return;
      }
      this.rbDetails;
      const config = {
        headers: { Authorization: "Bearer " + this.ICDtoken }
src/views/project/fund/applyDetail0/index.vue
@@ -12,7 +12,7 @@
                style="width: 100%"
                v-model="form.createTime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="申请日期"
              >
              </el-date-picker>
@@ -1228,6 +1228,7 @@
import OrgSelecter from "@/views/project/components/orgselect";
import { getToken } from "@/utils/auth";
import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money";
import { checkFileName, checkDetails } from "@/utils/fileNameCheck";
export default {
  //import引入的组件需要注入到对象中才能使用
@@ -1845,6 +1846,11 @@
    },
    /** æäº¤æŒ‰é’® */
    submitForm: debounce(function() {
      // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行)
      if (!this.checkDetailFileNames()) {
        return;
      }
      if (!this.randomnumber) {
        this.randomnumber = this.generateRandomString(9);
        this.form.randomnumber = this.randomnumber;
@@ -2523,6 +2529,11 @@
    },
    // æŽ¥å—提醒立刻保存
    Savenow() {
      // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行)
      if (!this.checkDetailFileNames()) {
        return;
      }
      if (!this.randomnumber) {
        this.randomnumber = this.generateRandomString(9);
        this.form.randomnumber = this.randomnumber;
@@ -2998,7 +3009,43 @@
    //     console.log(response.msg);
    //   }
    // },
    /**
     * 2026-10-15:上传时校验附件文件名(业务要求:不合格立即提示且不加入列表)。
     * è§„则与后端 AttachmentNameValidator åŒå£å¾„:必须含中文 / åŽ»æŽ‰æ‰©å±•ååŽä¸»å¹² â‰¤20 å­— /
     * ä¸å«ç©ºæ ¼åŠ / \ : * ? " < > | # % ç­‰ç‰¹æ®Šå­—符。
     */
    checkUploadFileName(file) {
      const raw = file && file.raw ? file.raw.name : file && file.name;
      const r = checkFileName(raw);
      if (!r.ok) {
        this.$modal.msgError(r.msg);
        return false;
      }
      return true;
    },
    /**
     * 2026-10-15:保存前校验整单明细附件文件名(含同一行内重名)。
     * å£å¾„(业务确认):只校验"本次变更"的附件——老单据里已存在的不合规附件名不能把保存卡死
     * ï¼ˆå¦åˆ™è€å•据改一个金额都存不进去)。后端按 id è¯»æ—§è®°å½•放行历史附件;前端拿不到"哪些是历史"
     * çš„æƒå¨ä¿¡æ¯ï¼Œå› æ­¤**仅新增单据**做保存前拦截,编辑老单据时新增的不合规附件由后端二次校验拦下。
     */
    checkDetailFileNames() {
      if (this.form && this.form.id) {
        return true;
      }
      const c = checkDetails(this.rbDetails);
      if (!c.ok) {
        this.$modal.msgError(c.msg);
        return false;
      }
      return true;
    },
    uploadSccess(response, file, fileList) {
      if (!this.checkUploadFileName(file)) {
        return;
      }
      this.rbDetails;
      //获取票据信息位置
src/views/project/fund/ethicalExpertFeeApply/index.vue
@@ -285,7 +285,7 @@
                style="width: 100%"
                v-model="form.applyTime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="申请日期"
              >
              </el-date-picker>
src/views/project/fund/expertFeeApply/index.vue
@@ -318,7 +318,7 @@
                style="width: 100%"
                v-model="form.applyTime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="申请日期"
              >
              </el-date-picker>
src/views/project/fund/officeExpenseApply/index.vue
@@ -226,7 +226,7 @@
                style="width: 100%"
                v-model="form.applyTime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="申请日期"
              >
              </el-date-picker>
@@ -1928,7 +1928,9 @@
      if (response.code == 200) {
        this.form.filename = file.raw.name;
        this.$modal.msgSuccess(response.msg);
        this.fileList.push({ name: response.fileName, url: response.fileName });
        // 2026-10-15:列表里的 name ç”¨æ“ä½œäººçš„原始文件名,不要用 response.fileName(那是存储路径)。
        // ä¿å­˜æ—¶åªå›žå†™ url(form.annexbankcard å­˜çš„æ˜¯é€—号拼接的 url),所以这里只影响上传框的显示。
        this.fileList.push({ name: file.raw.name, url: response.fileName });
      } else {
        console.log(response.msg);
      }
src/views/project/fund/performanceApply/index.vue
@@ -53,7 +53,7 @@
          <el-form-item label="申请日期" prop="applyTime">
            <el-date-picker
              format="yyyy-MM-dd"
              value-format="yyyy-MM-dd"
              value-format="yyyy-MM-dd HH:mm:ss"
              v-model="queryParams.value1"
              type="daterange"
              range-separator="至"
src/views/project/fund/performancedetails/index.vue
@@ -12,7 +12,7 @@
                style="width: 100%"
                v-model="form.applyTime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="申请日期"
                :disabled="true"
              >
@@ -919,6 +919,7 @@
import OrgSelecter from "@/views/project/components/orgselect";
import { getToken } from "@/utils/auth";
import { moneySum, moneyAdd, moneySub, moneyRound } from "@/utils/money";
import { checkFileName, checkDetails } from "@/utils/fileNameCheck";
import CustomImageViewer from "@/components/CustomImageViewer";
export default {
@@ -1660,6 +1661,11 @@
    },
    /** æäº¤æŒ‰é’® */
    submitForm: debounce(function() {
      // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行)
      if (!this.checkDetailFileNames()) {
        return;
      }
      if (!this.randomnumber) {
        this.randomnumber = this.generateRandomString(9);
        this.form.randomnumber = this.randomnumber;
@@ -2178,6 +2184,11 @@
    },
    // æŽ¥å—提醒立刻保存
    Savenow() {
      // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行)
      if (!this.checkDetailFileNames()) {
        return;
      }
      if (!this.randomnumber) {
        this.randomnumber = this.generateRandomString(9);
        this.form.randomnumber = this.randomnumber;
@@ -2759,7 +2770,43 @@
        this.Networkheader = string.slice(0, index + 4); // æˆªå–8032及其前部字符
      }
    },
    /**
     * 2026-10-15:上传时校验附件文件名(业务要求:不合格立即提示且不加入列表)。
     * è§„则与后端 AttachmentNameValidator åŒå£å¾„:必须含中文 / åŽ»æŽ‰æ‰©å±•ååŽä¸»å¹² â‰¤20 å­— /
     * ä¸å«ç©ºæ ¼åŠ / \ : * ? " < > | # % ç­‰ç‰¹æ®Šå­—符。
     */
    checkUploadFileName(file) {
      const raw = file && file.raw ? file.raw.name : file && file.name;
      const r = checkFileName(raw);
      if (!r.ok) {
        this.$modal.msgError(r.msg);
        return false;
      }
      return true;
    },
    /**
     * 2026-10-15:保存前校验整单明细附件文件名(含同一行内重名)。
     * å£å¾„(业务确认):只校验"本次变更"的附件——老单据里已存在的不合规附件名不能把保存卡死
     * ï¼ˆå¦åˆ™è€å•据改一个金额都存不进去)。后端按 id è¯»æ—§è®°å½•放行历史附件;前端拿不到"哪些是历史"
     * çš„æƒå¨ä¿¡æ¯ï¼Œå› æ­¤**仅新增单据**做保存前拦截,编辑老单据时新增的不合规附件由后端二次校验拦下。
     */
    checkDetailFileNames() {
      if (this.form && this.form.id) {
        return true;
      }
      const c = checkDetails(this.rbDetails);
      if (!c.ok) {
        this.$modal.msgError(c.msg);
        return false;
      }
      return true;
    },
    uploadSccess(response, file, fileList) {
      if (!this.checkUploadFileName(file)) {
        return;
      }
      this.rbDetails;
      const config = {
        headers: { Authorization: "Bearer " + this.ICDtoken }
src/views/project/fundcheck/ethicalExpertFeeCheck/index.vue
@@ -41,7 +41,7 @@
        </el-col>
        <el-col :span="8">
          <el-form-item label="申请日期" prop="applyTime">
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd"
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss"
              v-model="applyTime" type="daterange" range-separator="至" start-placeholder="申请开始日期"
              end-placeholder="申请结束日期" @keyup.enter.native="flowconclusion">
            </el-date-picker>
@@ -312,7 +312,7 @@
            <el-form-item label="申请日期" prop="applyTime">
              <!-- <el-input v-model="form.donorno" placeholder="请输入申请日期" /> -->
              <el-date-picker clearable style="width: 100%" v-model="form.applyTime" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="申请日期">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="申请日期">
              </el-date-picker>
            </el-form-item>
          </el-col>
src/views/project/fundcheck/expertFeeCheck/index.vue
@@ -48,7 +48,7 @@
        </el-col>
        <el-col :span="8">
          <el-form-item label="申请日期" prop="createTime">
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd"
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss"
              v-model="createTime" type="daterange" range-separator="至" start-placeholder="申请开始日期"
              end-placeholder="申请结束日期" @keyup.enter.native="flowconclusion">
            </el-date-picker>
@@ -158,7 +158,7 @@
            <el-form-item label="申请日期" prop="createTime">
              <!-- <el-input v-model="form.donorno" placeholder="请输入申请日期" /> -->
              <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="申请日期">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="申请日期">
              </el-date-picker>
            </el-form-item>
          </el-col>
src/views/project/fundcheck/medicalCostCheck/index.vue
@@ -48,7 +48,7 @@
        </el-col>
        <el-col :span="8">
          <el-form-item label="申请日期" prop="createTime">
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd"
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss"
              v-model="createTime" type="daterange" range-separator="至" start-placeholder="申请开始日期"
              end-placeholder="申请结束日期" @keyup.enter.native="flowconclusion">
            </el-date-picker>
@@ -146,7 +146,7 @@
            <el-form-item label="申请日期" prop="createTime">
              <!-- <el-input v-model="form.donorno" placeholder="请输入申请日期" /> -->
              <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="申请日期">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="申请日期">
              </el-date-picker>
            </el-form-item>
          </el-col>
src/views/project/fundcheck/officeExpenseCheck/index.vue
@@ -48,7 +48,7 @@
        </el-col>
        <el-col :span="8">
          <el-form-item label="申请日期" prop="createTime">
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd"
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss"
              v-model="createTime" type="daterange" range-separator="至" start-placeholder="申请开始日期"
              end-placeholder="申请结束日期" @keyup.enter.native="flowconclusion">
            </el-date-picker>
@@ -149,7 +149,7 @@
            <el-form-item label="申请日期" prop="createTime">
              <!-- <el-input v-model="form.donorno" placeholder="请输入申请日期" /> -->
              <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="申请日期">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="申请日期">
              </el-date-picker>
            </el-form-item>
          </el-col>
src/views/project/fundcheck/performanceCheck/index.vue
@@ -34,7 +34,7 @@
        </el-col>
        <el-col :span="8">
          <el-form-item label="申请日期" prop="createTime">
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd" v-model="createTime"
            <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss" v-model="createTime"
              type="daterange" range-separator="至" start-placeholder="申请开始日期" end-placeholder="申请结束日期"
              @keyup.enter.native="flowconclusion">
            </el-date-picker>
src/views/project/fundflow/index.vue
@@ -31,7 +31,7 @@
        <el-form-item label="申请日期" prop="createTime">
        <el-date-picker
          format="yyyy-MM-dd"
          value-format="yyyy-MM-dd hh:mm:ss"
          value-format="yyyy-MM-dd HH:mm:ss"
          v-model="queryParams.createTime"
          type="date"
          placeholder="请选择申请日期"
src/views/project/itemexpense/index.vue
@@ -97,6 +97,13 @@
      <el-table-column label="费用金额" align="center" prop="expense" />
      <el-table-column label="费用说明" align="center" prop="expensedescribe" />
      <el-table-column label="启用状态" align="center" prop="usestate" />
      <el-table-column label="校验模式" align="center" prop="validateMode" width="110">
        <template slot-scope="scope">
          <el-tag v-if="scope.row.validateMode == 3" type="danger">不校验</el-tag>
          <el-tag v-else-if="scope.row.validateMode == 2" type="warning">校验提醒</el-tag>
          <el-tag v-else>强制校验</el-tag>
        </template>
      </el-table-column>
      <el-table-column label="备注" align="center" prop="remark" />
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
@@ -140,6 +147,13 @@
        </el-form-item>
        <el-form-item label="启用状态" prop="usestate">
          <el-input v-model="form.usestate" placeholder="请输入启用状态" />
        </el-form-item>
        <el-form-item label="校验模式" prop="validateMode">
          <el-select v-model="form.validateMode" placeholder="请选择专家费校验模式" style="width: 100%">
            <el-option label="强制校验(不通过不能保存)" :value="1" />
            <el-option label="校验提醒(仅提醒,允许保存)" :value="2" />
            <el-option label="不校验(跳过金额类校验)" :value="3" />
          </el-select>
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="form.remark" placeholder="请输入备注" />
@@ -222,6 +236,7 @@
        expense: null,
        expensedescribe: null,
        usestate: null,
        validateMode: 1,
        remark: null,
        delFlag: null,
        createBy: null,
src/views/project/medicalevaluation/index.vue
@@ -411,7 +411,7 @@
                  size="small"
                  v-model="form.hospitalassesstime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择院级评估时间"
                >
                </el-date-picker> </el-form-item
@@ -464,7 +464,7 @@
                  size="small"
                  v-model="form.provincialassesstime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择省级评估时间"
                >
                </el-date-picker> </el-form-item></el-col
@@ -518,7 +518,7 @@
                  size="small"
                  v-model="form.coreteamassesstime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="评估时间"
                >
                </el-date-picker>
src/views/project/organallocation/index.vue
@@ -338,7 +338,7 @@
                style="width: 100%"
                v-model="form.applicanttime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择接收时间"
              >
              </el-date-picker>
src/views/project/organallocation/index0.vue
@@ -199,7 +199,7 @@
          <el-col :span="12">
            <el-form-item label="获取时间" prop="organgettime">
              <el-date-picker clearable size="medium" v-model="form.organgettime" type="date" format="yyyy-MM-dd" disabled
                value-format="yyyy-MM-dd" placeholder="选择器官获取时间">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择器官获取时间">
              </el-date-picker>
            </el-form-item>
          </el-col>
@@ -249,7 +249,7 @@
          <el-col :span="12">
            <el-form-item label="移植时间" prop="transplanttime">
              <el-date-picker clearable size="medium" v-model="form.transplanttime" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="选择移植时间" disabled>
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择移植时间" disabled>
              </el-date-picker>
            </el-form-item>
          </el-col>
src/views/project/organization/index.vue
@@ -273,7 +273,7 @@
                size="small"
                v-model="form.registertime"
                type="datetime" format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择注册时间"
              >
              </el-date-picker>
src/views/project/relativesconfirmation/index.vue
@@ -589,7 +589,7 @@
                  size="small"
                  v-model="form.signdate"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="选择签字日期"
                >
                </el-date-picker>
@@ -746,7 +746,7 @@
                style="width: 310px"
                v-model="evaluationForm.hospitalassesstime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择院级评估时间"
              >
              </el-date-picker>
@@ -793,7 +793,7 @@
                style="width: 310px"
                v-model="evaluationForm.provincialassesstime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="选择省级评估时间"
              >
              </el-date-picker>
@@ -841,7 +841,7 @@
                style="width: 310px"
                v-model="evaluationForm.coreteamassesstime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="评估时间"
              >
              </el-date-picker>
src/views/project/tallage/computingBill/index.vue
@@ -42,7 +42,7 @@
            ><el-form-item label="算税时间" prop="donateno">
              <el-date-picker
                v-model="form.taxedtime"
                value-format="yyyy-MM-dd HH:mm"
                value-format="yyyy-MM-dd HH:mm:ss"
                type="datetime" format="yyyy-MM-dd HH:mm"
                :disabled="true"
                placeholder="选择时间"
src/views/project/travelexpenseapply/edit.vue
@@ -64,7 +64,7 @@
                <el-col :span="7">
                    <el-form-item label="申请日期" prop="applyTime">
                        <el-date-picker style="width: 100%" v-model="form.applyTime" type="date" format="yyyy-MM-dd"
                            value-format="yyyy-MM-dd" placeholder="申请日期">
                            value-format="yyyy-MM-dd HH:mm:ss" placeholder="申请日期">
                        </el-date-picker>
                    </el-form-item>
                </el-col>
@@ -101,7 +101,7 @@
                    <el-table-column prop="starttime" slot="" label="出发日期" fixed align="center" width="150">
                        <template slot-scope="scope">
                            <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.starttime"
                                type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" placeholder="出发日期"
                                type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" placeholder="出发日期"
                                @change="getStandard(scope.row)">
                            </el-date-picker>
                        </template>
@@ -115,7 +115,7 @@
                    <el-table-column prop="endtime" slot="" label="到达日期" align="center" width="150" fixed>
                        <template slot-scope="scope">
                            <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.endtime"
                                type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" placeholder="到达日期">
                                type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" placeholder="到达日期">
                            </el-date-picker>
                        </template>
                    </el-table-column>
src/views/project/travelexpenseapply/index.vue
@@ -18,7 +18,7 @@
        </el-col>
        <el-col :span="8">
          <el-form-item label="报销日期" prop="applyTime">
            <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd" v-model="value1" type="daterange"
            <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" v-model="value1" type="daterange"
              @change="selecttime" range-separator="至" start-placeholder="报销开始日期" end-placeholder="报销结束日期"
              @keyup.enter.native="handlQuery">
            </el-date-picker>
@@ -143,7 +143,7 @@
        <el-row><el-col :span="5">
            <el-form-item label="申请日期" prop="applyTime">
              <el-date-picker style="width: 100%" v-model="form.applyTime" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="申请日期">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="申请日期">
              </el-date-picker>
            </el-form-item>
          </el-col>
@@ -352,7 +352,7 @@
                    }
                  }
                }" clearable size="small" style="width: 100%" v-model="scope.row.starttime" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="开始日期" @blur="getdays(scope.row)">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="开始日期" @blur="getdays(scope.row)">
                </el-date-picker>
              </template>
            </el-table-column>
@@ -368,7 +368,7 @@
                    }
                  }
                }" clearable size="small" style="width: 100%" v-model="scope.row.endtime" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="结束日期" @blur="getdays(scope.row)">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="结束日期" @blur="getdays(scope.row)">
                </el-date-picker>
              </template>
            </el-table-column>
@@ -563,7 +563,7 @@
              width="150">
              <template slot-scope="scope">
                <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.paiddate" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="打款日期" :disabled="true">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="打款日期" :disabled="true">
                </el-date-picker>
              </template>
            </el-table-column>
src/views/project/travelexpenseapply/travelexpensedetail/index.vue
@@ -10,7 +10,7 @@
                style="width: 100%"
                v-model="form.applyTime"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="申请日期"
                :disabled="true"
              >
@@ -370,7 +370,7 @@
                  style="width: 100%"
                  v-model="scope.row.starttime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="开始日期"
                  @blur="getdays(scope.row)"
                >
@@ -402,7 +402,7 @@
                  style="width: 100%"
                  v-model="scope.row.endtime"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="结束日期"
                  @blur="getdays(scope.row)"
                >
@@ -849,7 +849,7 @@
            <el-table-column prop="paiddate" slot="" label="打款日期" fixed align="center" width="150">
              <template slot-scope="scope">
                <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.paiddate" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="打款日期" :disabled="true">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="打款日期" :disabled="true">
                </el-date-picker>
              </template>
            </el-table-column>-->
@@ -1306,6 +1306,7 @@
import { getToken } from "@/utils/auth";
import debounce from "lodash/debounce";
import { moneySum, moneyAdd, moneyRound } from "@/utils/money";
import { checkFileName, checkDetails } from "@/utils/fileNameCheck";
export default {
  components: {
    Treeselect,
@@ -1690,7 +1691,43 @@
    },
    //文件上传成功回调
    /**
     * 2026-10-15:上传时校验附件文件名(业务要求:不合格立即提示且不加入列表)。
     * è§„则与后端 AttachmentNameValidator åŒå£å¾„:必须含中文 / åŽ»æŽ‰æ‰©å±•ååŽä¸»å¹² â‰¤20 å­— /
     * ä¸å«ç©ºæ ¼åŠ / \ : * ? " < > | # % ç­‰ç‰¹æ®Šå­—符。
     */
    checkUploadFileName(file) {
      const raw = file && file.raw ? file.raw.name : file && file.name;
      const r = checkFileName(raw);
      if (!r.ok) {
        this.$modal.msgError(r.msg);
        return false;
      }
      return true;
    },
    /**
     * 2026-10-15:保存前校验整单明细附件文件名(含同一行内重名)。
     * å£å¾„(业务确认):只校验"本次变更"的附件——老单据里已存在的不合规附件名不能把保存卡死
     * ï¼ˆå¦åˆ™è€å•据改一个金额都存不进去)。后端按 id è¯»æ—§è®°å½•放行历史附件;前端拿不到"哪些是历史"
     * çš„æƒå¨ä¿¡æ¯ï¼Œå› æ­¤**仅新增单据**做保存前拦截,编辑老单据时新增的不合规附件由后端二次校验拦下。
     */
    checkDetailFileNames() {
      if (this.form && this.form.id) {
        return true;
      }
      const c = checkDetails(this.rbDetails);
      if (!c.ok) {
        this.$modal.msgError(c.msg);
        return false;
      }
      return true;
    },
    uploadSccess(response, file, fileList) {
      if (!this.checkUploadFileName(file)) {
        return;
      }
      this.rbDetails;
      const config = {
        headers: { Authorization: "Bearer " + this.ICDtoken }
@@ -1711,14 +1748,11 @@
                name: file.name,
                url: URL.createObjectURL(blob)
              });
              // console.log(file.response.url);
              // console.log(file);
              this.pdfimgsrcList.push(file.response.url);
              this.fileListto.push({
                name: file.response.fileName,
                url: file.response.url
              });
              // 2026-10-15:删除这里的第二次 push。原来一次上传会向 fileListto / pdfimgsrcList
              // å„写两条,且第二条的 name å–的是 file.response.fileName(存储路径);而 remove()
              // ä¼šæŠŠæ•´ä¸ª fileListto å›žå†™åˆ° rbDetails[atpresent].annexfilesList,导致明细附件里
              // æ··å…¥è·¯å¾„形态的 name,被附件文件名校验误拦(前端没有"路径形态跳过"豁免),
              // åŒæ—¶ç¥¨æ®åˆ—表会多出一行。
              console.log(URL.createObjectURL(blob), "ur转换");
            })
            .catch(error => {
@@ -2760,6 +2794,11 @@
    /** æäº¤ä¿å­˜æŒ‰é’® */
    submitForm: debounce(function (data) {
      // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行)
      if (!this.checkDetailFileNames()) {
        return;
      }
      this.$refs["form"].validate(valid => {
        if (valid) {
          //票据文件处理
@@ -2983,6 +3022,11 @@
    },
    // æŽ¥å—提醒立刻保存
    Savenow() {
      // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行)
      if (!this.checkDetailFileNames()) {
        return;
      }
      this.Savereminder = false;
      this.Reminderquantity = 0;
      this.totalquantity = 0;
src/views/project/travelexpensecheck/index.vue
@@ -59,7 +59,7 @@
      <el-row>
        <el-col :span="8">
          <el-form-item label="申请日期" prop="applyTime">
            <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd" v-model="value1" type="daterange"
            <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" v-model="value1" type="daterange"
              @blur="onpick" range-separator="至" start-placeholder="报销申请开始日期" end-placeholder="报销申请结束日期"
              @keyup.enter.native="handleQuery">
            </el-date-picker>
@@ -157,7 +157,7 @@
          <el-col :span="5">
            <el-form-item label="申请日期" prop="applyTime">
              <el-date-picker style="width: 100%" v-model="form.applyTime" :disabled="true" type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd" placeholder="申请日期">
                value-format="yyyy-MM-dd HH:mm:ss" placeholder="申请日期">
              </el-date-picker>
            </el-form-item>
          </el-col>
@@ -305,7 +305,7 @@
                    }
                  }
                }" clearable size="small" style="width: 100%" v-model="scope.row.starttime" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="开始日期" @blur="getallowance(scope.row)">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="开始日期" @blur="getallowance(scope.row)">
                </el-date-picker>
              </template>
            </el-table-column>
@@ -321,7 +321,7 @@
                    }
                  }
                }" clearable size="small" style="width: 100%" v-model="scope.row.endtime" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="结束日期" @blur="getallowance(scope.row)">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="结束日期" @blur="getallowance(scope.row)">
                </el-date-picker>
              </template>
            </el-table-column>
@@ -549,7 +549,7 @@
              width="150">
              <template slot-scope="scope">
                <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.paiddate" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="打款日期" :disabled="true"
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="打款日期" :disabled="true"
                  @blur="getallowance(scope.row)">
                </el-date-picker>
              </template>
src/views/project/unitCost/particulars/index.vue
@@ -199,7 +199,7 @@
                  v-model="scope.row.receiveTime"
                  :disabled="true"
                  type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  placeholder="接收日期"
                >
                </el-date-picker>
@@ -258,7 +258,7 @@
            <el-table-column prop="amounttime" align="center" label="收款日期" width="200">
              <template slot-scope="scope">
                <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" format="yyyy-MM-dd"
                  value-format="yyyy-MM-dd" placeholder="收款日期">
                  value-format="yyyy-MM-dd HH:mm:ss" placeholder="收款日期">
                </el-date-picker>
              </template>
            </el-table-column>