From 3114bfec4e2278bdd394eb9e74dd9506f42232b2 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 05 十一月 2026 16:11:27 +0800
Subject: [PATCH] 1. 完成项目管理全流程优化,补充阶段推进、汇报统计及生命周期记录。 2. 完成业务与项目数据关联,支持查看项目进度、详情及相关附件。 3. 完成采购审批流程接入,支持配置审批人员及采购业务审批。 4. 精简用户、角色、部门、菜单和字典,完善操作日志及附件下载。

---
 src/views/basicData/customerFile/index.vue |  325 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 233 insertions(+), 92 deletions(-)

diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue
index 1c4e6e8..cd2ae30 100644
--- a/src/views/basicData/customerFile/index.vue
+++ b/src/views/basicData/customerFile/index.vue
@@ -263,92 +263,107 @@
       </template>
     </el-dialog>
     <!-- 杩�3骞磋储鍔℃姤琛ㄤ笂浼� -->
-    <el-dialog title="杩�3骞磋储鍔℃姤琛ㄤ笂浼�"
+    <el-dialog title="杩�3骞磋储鍔℃姤琛�"
                v-model="reportDialogVisible"
-               width="900px"
+               width="980px"
                @close="closeReportDialog">
-      <div class="report-customer">瀹㈡埛锛歿{ reportCustomer.customerName }}</div>
-      <el-form :model="reportForm"
-               label-width="90px"
-               inline
-               class="report-form">
-        <el-form-item label="鎶ヨ〃骞村害">
-          <el-select v-model="reportForm.reportYear"
-                     placeholder="璇烽�夋嫨骞村害"
-                     style="width: 150px">
-            <el-option v-for="year in reportYears"
-                       :key="year"
-                       :label="year + '骞�'"
-                       :value="year" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="鎶ヨ〃鍚嶇О">
-          <el-input v-model="reportForm.reportName"
-                    placeholder="渚嬪锛�2025骞村害璐㈠姟鎶ヨ〃"
-                    style="width: 260px"
-                    clearable />
-        </el-form-item>
-      </el-form>
-      <FileUpload v-model="reportForm.reportFiles"
-                  :limit="5"
-                  :file-size="20"
-                  :file-type="['pdf', 'doc', 'docx', 'xls', 'xlsx', 'jpg', 'png', 'zip', 'rar']" />
-      <div class="report-actions">
-        <el-button type="primary"
-                   :loading="reportSaving"
-                   @click="saveReport">淇濆瓨涓婁紶</el-button>
-        <el-button @click="resetReportForm">閲嶇疆</el-button>
+      <div class="report-dialog-head">
+        <div>
+          <div class="report-dialog-head__label">褰撳墠瀹㈡埛</div>
+          <div class="report-dialog-head__name">{{ reportCustomer.customerName }}</div>
+        </div>
+        <el-tag type="primary" effect="light">
+          宸蹭笂浼� {{ reportRows.length }} / 3 涓勾搴�
+        </el-tag>
       </div>
-      <el-table :data="reportRows"
-                border
-                size="small"
-                style="margin-top: 16px">
-        <el-table-column prop="reportYear"
-                         label="骞村害"
-                         width="90"
-                         align="center" />
-        <el-table-column prop="reportName"
-                         label="鎶ヨ〃鍚嶇О"
-                         min-width="180"
-                         show-overflow-tooltip />
-        <el-table-column label="鎶ヨ〃闄勪欢"
-                         min-width="260">
-          <template #default="scope">
-            <FileUpload v-model="scope.row.reportFiles"
-                        disabled
-                        :is-show-tip="false" />
-          </template>
-        </el-table-column>
-        <el-table-column prop="uploadUserName"
-                         label="涓婁紶浜�"
-                         width="110" />
-        <el-table-column prop="updateTime"
-                         label="涓婁紶鏃堕棿"
-                         width="170" />
-        <el-table-column label="瀹℃壒鐘舵��"
-                         width="100"
-                         align="center">
-          <template #default="scope">
-            <el-tag :type="reportStatusTag(scope.row.auditStatus)">
-              {{ reportStatusText(scope.row.auditStatus) }}
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column label="鎿嶄綔"
-                         width="140"
-                         align="center">
-          <template #default="scope">
-            <el-button type="primary"
-                       link
-                       @click="editReport(scope.row)">淇敼</el-button>
-            <el-button type="danger"
-                       link
-                       @click="deleteReport(scope.row)">鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div v-if="reportRows.length === 0"
-           class="no-record">鏆傛棤璐㈠姟鎶ヨ〃锛岃鎸夊勾搴︿笂浼犺繎3骞磋储鍔℃姤琛�</div>
+
+      <div class="report-layout">
+        <div class="report-upload-card">
+          <div class="report-card-title">涓婁紶鎴栨浛鎹㈡姤琛�</div>
+          <div class="report-card-tip">姣忎釜骞村害淇濆瓨涓�缁勬姤琛ㄦ枃浠讹紝鍐嶆淇濆瓨灏嗘洿鏂拌骞村害璁板綍銆�</div>
+          <el-form :model="reportForm" label-position="top" class="report-form">
+            <el-form-item label="鎶ヨ〃骞村害">
+              <el-select
+                v-model="reportForm.reportYear"
+                placeholder="璇烽�夋嫨骞村害"
+                style="width: 100%"
+                @change="selectReportYear"
+              >
+                <el-option
+                  v-for="year in reportYears"
+                  :key="year"
+                  :label="year + '骞�'"
+                  :value="year"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="鎶ヨ〃鍚嶇О">
+              <el-input
+                v-model="reportForm.reportName"
+                placeholder="渚嬪锛�2026骞村害璐㈠姟鎶ヨ〃"
+                clearable
+              />
+            </el-form-item>
+            <el-form-item label="鎶ヨ〃闄勪欢">
+              <FileUpload
+                v-model="reportForm.reportFiles"
+                :limit="5"
+                :file-size="20"
+                :file-type="['pdf', 'doc', 'docx', 'xls', 'xlsx', 'jpg', 'png', 'zip', 'rar']"
+              />
+            </el-form-item>
+          </el-form>
+          <div class="report-actions">
+            <el-button type="primary" :loading="reportSaving" @click="saveReport">
+              {{ reportYearRecord(reportForm.reportYear) ? "淇濆瓨淇敼" : "淇濆瓨涓婁紶" }}
+            </el-button>
+            <el-button @click="resetReportForm">娓呯┖</el-button>
+          </div>
+        </div>
+
+        <div class="report-year-list">
+          <div class="report-card-title">杩�3骞翠笂浼犳儏鍐�</div>
+          <div
+            v-for="year in reportYears"
+            :key="year"
+            class="report-year-card"
+            :class="{ 'is-empty': !reportYearRecord(year) }"
+          >
+            <div class="report-year-card__year">{{ year }}骞�</div>
+            <template v-if="reportYearRecord(year)">
+              <div class="report-year-card__body">
+                <div class="report-year-card__name">
+                  {{ reportYearRecord(year).reportName || year + "骞村害璐㈠姟鎶ヨ〃" }}
+                </div>
+                <div class="report-year-card__meta">
+                  涓婁紶浜猴細{{ reportYearRecord(year).uploadUserName || "-" }} 路
+                  {{ reportYearRecord(year).updateTime || "-" }}
+                </div>
+                <FileUpload
+                  v-model="reportYearRecord(year).reportFiles"
+                  disabled
+                  :is-show-tip="false"
+                />
+              </div>
+              <div class="report-year-card__actions">
+                <el-tag :type="reportStatusTag(reportYearRecord(year).auditStatus)">
+                  {{ reportStatusText(reportYearRecord(year).auditStatus) }}
+                </el-tag>
+                <el-button type="primary" link @click="editReport(reportYearRecord(year))">
+                  淇敼
+                </el-button>
+                <el-button type="danger" link @click="deleteReport(reportYearRecord(year))">
+                  鍒犻櫎
+                </el-button>
+              </div>
+            </template>
+            <template v-else>
+              <div class="report-year-card__empty">灏氭湭涓婁紶</div>
+              <el-button type="primary" link @click="selectReportYear(year)">绔嬪嵆涓婁紶</el-button>
+            </template>
+          </div>
+        </div>
+      </div>
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="closeReportDialog">鍏抽棴</el-button>
@@ -921,8 +936,12 @@
   const loadReports = customerId => {
     listCustomerFinancialReport({ customerId }).then(res => {
       reportRows.value = res.data || [];
+      selectReportYear(reportForm.reportYear);
     });
   };
+
+  const reportYearRecord = year =>
+    reportRows.value.find(item => Number(item.reportYear) === Number(year));
 
   const reportStatusText = status => {
     if (status === 1) return "宸查�氳繃";
@@ -937,17 +956,26 @@
 
   const resetReportForm = () => {
     reportForm.reportYear = nowYear;
-    reportForm.reportName = "";
+    reportForm.reportName = `${nowYear}骞村害璐㈠姟鎶ヨ〃`;
     reportForm.reportFiles = "";
   };
 
+  const selectReportYear = year => {
+    reportForm.reportYear = Number(year);
+    const current = reportYearRecord(year);
+    reportForm.reportName = current?.reportName || `${year}骞村害璐㈠姟鎶ヨ〃`;
+    reportForm.reportFiles = current?.reportFiles || "";
+  };
+
   const editReport = row => {
-    reportForm.reportYear = row.reportYear;
-    reportForm.reportName = row.reportName;
-    reportForm.reportFiles = row.reportFiles;
+    selectReportYear(row.reportYear);
   };
 
   const saveReport = () => {
+    if (!reportForm.reportName?.trim()) {
+      proxy.$modal.msgWarning("璇疯緭鍏ユ姤琛ㄥ悕绉�");
+      return;
+    }
     if (!reportForm.reportFiles) {
       proxy.$modal.msgWarning("璇蜂笂浼犺储鍔℃姤琛ㄩ檮浠�");
       return;
@@ -1073,17 +1101,130 @@
     font-size: 14px;
   }
 
-  .report-customer {
-    font-size: 14px;
-    color: #606266;
-    margin-bottom: 12px;
+  .report-dialog-head {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 14px 18px;
+    margin-bottom: 16px;
+    background: linear-gradient(135deg, #eef5ff, #f8fbff);
+    border: 1px solid #dbe9fb;
+    border-radius: 10px;
+
+    &__label {
+      margin-bottom: 3px;
+      font-size: 12px;
+      color: #8491a5;
+    }
+
+    &__name {
+      font-size: 17px;
+      font-weight: 700;
+      color: #23334d;
+    }
+  }
+
+  .report-layout {
+    display: grid;
+    grid-template-columns: 360px minmax(0, 1fr);
+    gap: 18px;
+    align-items: start;
+  }
+
+  .report-upload-card,
+  .report-year-list {
+    padding: 18px;
+    background: #fff;
+    border: 1px solid #e5eaf1;
+    border-radius: 10px;
+  }
+
+  .report-card-title {
+    margin-bottom: 6px;
+    font-size: 16px;
+    font-weight: 700;
+    color: #26364d;
+  }
+
+  .report-card-tip {
+    margin-bottom: 14px;
+    font-size: 12px;
+    line-height: 1.6;
+    color: #8a95a6;
   }
 
   .report-form {
-    margin-bottom: 4px;
+    :deep(.el-form-item) {
+      margin-bottom: 14px;
+    }
   }
 
   .report-actions {
+    display: flex;
+    justify-content: flex-end;
     margin-top: 10px;
   }
+
+  .report-year-card {
+    display: flex;
+    align-items: flex-start;
+    gap: 14px;
+    padding: 14px;
+    margin-top: 12px;
+    background: #f9fbfe;
+    border: 1px solid #dfe7f2;
+    border-radius: 9px;
+
+    &.is-empty {
+      align-items: center;
+      color: #98a2b3;
+      background: #fafafa;
+      border-style: dashed;
+    }
+
+    &__year {
+      flex: 0 0 58px;
+      padding: 6px 8px;
+      font-weight: 700;
+      color: #1254b5;
+      text-align: center;
+      background: #eaf2ff;
+      border-radius: 6px;
+    }
+
+    &__body {
+      flex: 1;
+      min-width: 0;
+    }
+
+    &__name {
+      margin-bottom: 5px;
+      font-weight: 600;
+      color: #303b4c;
+    }
+
+    &__meta {
+      margin-bottom: 5px;
+      font-size: 12px;
+      color: #8a95a6;
+    }
+
+    &__actions {
+      display: flex;
+      flex: 0 0 auto;
+      align-items: center;
+      gap: 4px;
+    }
+
+    &__empty {
+      flex: 1;
+      font-size: 13px;
+    }
+  }
+
+  @media (max-width: 900px) {
+    .report-layout {
+      grid-template-columns: 1fr;
+    }
+  }
 </style>

--
Gitblit v1.9.3