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