Ver código fonte

feat: 资料归纳列表接口对接

shiyanyu 1 mês atrás
pai
commit
7fabfb584a

+ 30 - 0
src/api/audit/dataInduction.js

@@ -0,0 +1,30 @@
+import request from '@/utils/request'
+
+const url = window.context.form
+
+// 资料归纳列表
+export function getDataInductionList(data) {
+  return request({
+    url: url + '/api/materialSummary/v1/listByTaskId',
+    method: 'get',
+    params: data,
+  })
+}
+
+// 添加资料列表
+export function addDataInductionList(data) {
+  return request({
+    url: url + '/api/materialSummary/v1/getDetail',
+    method: 'post',
+    data: data,
+  })
+}
+
+// 添加编辑资料
+export function editDataInductionList(data) {
+  return request({
+    url: url + '/api/materialSummary/v1/saveWithDetails',
+    method: 'post',
+    data: data,
+  })
+}

+ 570 - 100
src/views/costAudit/auditInfo/archivesManage/pendingArchiveList.vue

@@ -319,47 +319,200 @@
       @cancel="handleCancel('dataDialog')"
     >
       <el-form
+        ref="dataDialogForm"
         :model="dataDialogForm"
         :rules="dataDialogRules"
-        style="width: 50%"
+        style="width: 100%"
       >
-        <el-form-item label="资料名称">
-          <el-input v-model="dataDialogForm.name"></el-input>
-        </el-form-item>
-        <el-form-item label="资料序号">
-          <el-input v-model="dataDialogForm.sortOrder"></el-input>
-        </el-form-item>
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="资料名称" prop="materialName">
+              <el-input
+                v-model="dataDialogForm.materialName"
+                placeholder="请输入资料名称"
+                clearable
+                @input="handleMaterialNameInput"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="序号" prop="materialOrderNum">
+              <el-input-number
+                v-model="dataDialogForm.materialOrderNum"
+                :min="1"
+                placeholder="请输入序号"
+                style="width: 100%"
+              ></el-input-number>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
-      <CostAuditTable
-        v-loading="loading"
-        :table-data="dataDialogData"
-        :columns="dataDialogColumns"
-        :show-index="true"
-        :border="true"
-        :show-pagination="false"
-      >
-        <template slot="action" slot-scope="{ row, index }">
-          <el-button type="text" size="small" @click="handleView(row)">
-            查看
-          </el-button>
-          <el-button type="text" size="small" @click="handleEdit(row, index)">
-            修改
-          </el-button>
-          <el-button type="text" size="small" @click="handlePreview(row)">
-            删除
-          </el-button>
-        </template>
-      </CostAuditTable>
+      <!-- 查询结果列表 -->
+      <div v-if="materialQueryList.length > 0" style="margin-top: 20px">
+        <div style="margin-bottom: 10px; font-weight: 500">
+          查询结果列表(点击行添加)
+        </div>
+        <el-table
+          v-loading="dataDialogLoading"
+          :data="materialQueryList"
+          border
+          style="width: 100%"
+          :row-style="{ cursor: 'pointer' }"
+          @row-click="handleAddFileFromList"
+        >
+          <el-table-column
+            type="index"
+            label="序号"
+            width="60"
+            align="center"
+          />
+          <el-table-column
+            prop="materialOrderNum"
+            label="序号"
+            width="100"
+            align="center"
+          />
+          <el-table-column
+            prop="materialName"
+            label="资料名称"
+            min-width="200"
+            align="left"
+          />
+          <el-table-column
+            prop="documentName"
+            label="文书名称"
+            min-width="200"
+            align="left"
+          />
+          <el-table-column
+            prop="documentNo"
+            label="文号"
+            width="150"
+            align="center"
+          />
+          <el-table-column
+            prop="auditedUnit"
+            label="被监审单位"
+            min-width="150"
+            align="left"
+          />
+          <el-table-column
+            prop="generateTime"
+            label="生成(上传)时间"
+            width="180"
+            align="center"
+          />
+          <el-table-column
+            prop="fileSource"
+            label="文件来源"
+            width="120"
+            align="center"
+          />
+          <el-table-column
+            label="操作"
+            width="100"
+            align="center"
+            fixed="right"
+          >
+            <template slot-scope="{ row }">
+              <el-button
+                type="text"
+                size="small"
+                style="color: #409eff"
+                @click.stop="handleAddFileFromList(row)"
+              >
+                添加
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 已添加列表 -->
+      <div style="margin-top: 20px">
+        <div style="margin-bottom: 10px; font-weight: 500">
+          已添加列表(共 {{ selectedFileList.length }} 条)
+        </div>
+        <el-table :data="selectedFileList" border style="width: 100%">
+          <el-table-column
+            type="index"
+            label="序号"
+            width="60"
+            align="center"
+          />
+          <el-table-column
+            prop="materialOrderNum"
+            label="序号"
+            width="100"
+            align="center"
+          >
+            <template slot-scope="{ row }">
+              <el-input-number
+                v-model="row.materialOrderNum"
+                :min="1"
+                size="mini"
+                style="width: 100%"
+                @change="handleOrderNumChange"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="materialName"
+            label="资料名称"
+            min-width="200"
+            align="left"
+          />
+          <el-table-column
+            prop="documentName"
+            label="文书名称"
+            min-width="200"
+            align="left"
+          />
+          <el-table-column
+            prop="documentNo"
+            label="文号"
+            width="150"
+            align="center"
+          />
+          <el-table-column
+            prop="auditedUnit"
+            label="被监审单位"
+            min-width="150"
+            align="left"
+          />
+          <el-table-column
+            prop="generateTime"
+            label="生成(上传)时间"
+            width="180"
+            align="center"
+          />
+          <el-table-column
+            prop="fileSource"
+            label="文件来源"
+            width="120"
+            align="center"
+          />
+          <el-table-column
+            label="操作"
+            width="100"
+            align="center"
+            fixed="right"
+          >
+            <template slot-scope="{ row, $index }">
+              <el-button
+                type="text"
+                size="small"
+                style="color: #f56c6c"
+                @click="handleDeleteFile(row, $index)"
+              >
+                删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
       <div slot="footer">
-        <el-button type="primary" @click="handleSubmit('dataDialog')">
-          添加资料
-        </el-button>
-        <el-button type="primary" @click="handleSubmit('dataDialog')">
-          文件排序
-        </el-button>
-        <el-button type="primary" @click="handleSubmit('dataDialog')">
-          保存
-        </el-button>
+        <el-button type="primary" @click="handleAddFile">添加文件</el-button>
+        <el-button type="primary" @click="handleSaveDataDialog">保存</el-button>
         <el-button @click="handleCancel('dataDialog')">取消</el-button>
       </div>
     </CostAuditDialog>
@@ -372,6 +525,11 @@
   import CostAuditDialog from '@/components/costAudit/CostAuditDialog.vue'
   import taskDetail from '@/components/task/taskDetail.vue'
   import { getArchiveList } from '@/api/audit/archive'
+  import {
+    getDataInductionList,
+    addDataInductionList,
+    editDataInductionList,
+  } from '@/api/audit/dataInduction'
   export default {
     name: 'PendingArchiveList',
     components: {
@@ -397,6 +555,7 @@
         activeTab: 'list', // list
         currentStep: 0, // 当前步骤 0:资料归纳 1:目录核对 2:档案预览
         archiveTab: 'dataCollect', // 归档页面标签页  dataCollect preview
+        currentArchiveRow: null, // 当前归档的行数据,用于获取taskId
         archiveColumns: [
           {
             prop: 'name',
@@ -634,104 +793,75 @@
         ],
         dataDialogTitle: '添加资料',
         dataDialogVisible: false,
+        dataDialogLoading: false,
         dataDialogForm: {
-          name: '',
-          sortOrder: '',
+          materialName: '',
+          materialOrderNum: 1,
         },
         dataDialogRules: {
-          name: [
+          materialName: [
             { required: true, message: '请输入资料名称', trigger: 'blur' },
           ],
-          sortOrder: [
-            { required: true, message: '请输入资料序号', trigger: 'blur' },
+          materialOrderNum: [
+            { required: true, message: '请输入序号', trigger: 'blur' },
           ],
         },
         dataDialogColumns: [
           {
+            prop: 'materialOrderNum',
+            label: '序号',
+            width: 100,
+            align: 'center',
+          },
+          {
+            prop: 'materialName',
+            label: '资料名称',
+            minWidth: 200,
+            align: 'left',
+          },
+          {
             prop: 'documentName',
             label: '文书名称',
+            minWidth: 200,
             align: 'left',
           },
           {
             prop: 'documentNo',
             label: '文号',
+            width: 150,
+            align: 'center',
           },
           {
             prop: 'auditedUnit',
             label: '被监审单位',
+            minWidth: 150,
+            align: 'left',
           },
           {
             prop: 'generateTime',
             label: '生成(上传)时间',
+            width: 180,
+            align: 'center',
           },
           {
             prop: 'fileSource',
             label: '文件来源',
+            width: 120,
+            align: 'center',
           },
           {
             slotName: 'action',
             label: '操作',
+            width: 100,
             fixed: 'right',
           },
         ],
-        dataDialogData: [
-          {
-            id: 1,
-            documentName: '成本监审报告',
-            documentNo: '晋成审报(2025)11号',
-            auditedUnit: '*****A公司',
-            generateTime: '2025-5-11 16:40',
-            fileSource: '系统生成电子文书',
-          },
-          {
-            id: 2,
-            documentName: '成本监审报告送达回证',
-            documentNo: '',
-            auditedUnit: '*****A公司',
-            generateTime: '2025-5-11 16:56',
-            fileSource: '监审单位反馈文件',
-          },
-          {
-            id: 3,
-            documentName: '成本监审报告',
-            documentNo: '晋成审报(2025)12号',
-            auditedUnit: '*****B公司',
-            generateTime: '2025-5-11 16:56',
-            fileSource: '系统生成电子文书',
-          },
-          {
-            id: 4,
-            documentName: '成本监审报告送达回证',
-            documentNo: '',
-            auditedUnit: '*****B公司',
-            generateTime: '2025-5-11 16:56',
-            fileSource: '监审单位反馈文件',
-          },
-          {
-            id: 5,
-            documentName: '成本监审报告',
-            documentNo: '晋成审报(2025)13号',
-            auditedUnit: '*****C公司',
-            generateTime: '2025-5-11 16:56',
-            fileSource: '系统生成电子文书',
-          },
-          {
-            id: 6,
-            documentName: '成本监审报告送达回证',
-            documentNo: '',
-            auditedUnit: '*****C公司',
-            generateTime: '2025-5-11 16:56',
-            fileSource: '监审单位反馈文件',
-          },
-          {
-            id: 7,
-            documentName: '成本监审报告交换稿',
-            documentNo: '',
-            auditedUnit: 'A公司、B公司、C公司',
-            generateTime: '2025-5-16 16:56',
-            fileSource: '监管主体上传文件',
-          },
-        ],
+        dataDialogData: [], // 已废弃,保留用于兼容
+        materialQueryList: [], // 查询结果列表
+        selectedFileList: [], // 已选择的文件列表(待保存)
+        isEditingDataDialog: false, // 是否为编辑模式
+        currentEditMaterialId: null, // 当前编辑的资料ID
+        materialNameSearchTimer: null, // 搜索防抖定时器
         catalogueData: [
           {
             id: 1,
@@ -879,8 +1009,16 @@
         // 打开任务详情弹窗
         this.$refs.taskDetail.open(row, 'chengben')
       },
-      handleArchive(id) {
+      handleArchive(row) {
+        // 保存当前归档的行数据
+        this.currentArchiveRow = row
         this.activeTab = 'archive'
+        // 切换到归档页面时,如果当前在资料归纳标签页,加载数据
+        if (this.archiveTab === 'dataCollect') {
+          this.$nextTick(() => {
+            this.loadArchiveData()
+          })
+        }
       },
       // 获取资料按钮点击事件
       fetchMoreData() {
@@ -895,11 +1033,343 @@
       // 标签页切换事件
       handleTabClick(tab) {
         this.archiveTab = tab.name
+        // 如果切换到资料归纳标签页,加载资料归纳数据
+        if (tab.name === 'dataCollect' && this.currentArchiveRow) {
+          this.loadArchiveData()
+        }
+      },
+      // 加载资料归纳列表数据
+      async loadArchiveData() {
+        if (!this.currentArchiveRow) {
+          return
+        }
+
+        try {
+          this.loading = true
+          const taskId =
+            this.currentArchiveRow.taskId || this.currentArchiveRow.id
+
+          if (!taskId) {
+            this.$message.warning('缺少任务ID')
+            this.archiveData = []
+            return
+          }
+
+          const response = await getDataInductionList({ taskId })
+
+          // 根据API返回格式处理数据
+          if (response && response.value) {
+            // 处理返回的数据,映射到archiveData格式
+            this.archiveData = (
+              Array.isArray(response.value)
+                ? response.value
+                : response.value.list || []
+            ).map((item) => {
+              return {
+                id: item.id,
+                name: item.materialName || item.name || '',
+                pageCount: item.pageCount || item.pageNum || '--',
+                lastModified:
+                  item.updateTime ||
+                  item.createTime ||
+                  item.lastModified ||
+                  '--',
+                sortOrder: item.sortOrder || item.orderNum || 0,
+                // 保留原始数据,便于后续操作
+                originalData: item,
+              }
+            })
+
+            // 按sortOrder排序
+            this.archiveData.sort((a, b) => {
+              return (a.sortOrder || 0) - (b.sortOrder || 0)
+            })
+          } else {
+            this.archiveData = []
+          }
+        } catch (error) {
+          this.$message.error('加载资料归纳列表失败')
+          console.error('加载资料归纳列表失败:', error)
+          this.archiveData = []
+        } finally {
+          this.loading = false
+        }
       },
       // 添加资料按钮点击事件
       addData() {
+        // 重置表单和数据
+        this.dataDialogForm = {
+          materialName: '',
+          materialOrderNum: 1,
+        }
+        this.materialQueryList = []
+        this.selectedFileList = []
+        this.dataDialogData = []
+        this.isEditingDataDialog = false
+        this.currentEditMaterialId = null
         this.dataDialogVisible = true
       },
+      // 资料名称输入时自动查询列表
+      handleMaterialNameInput() {
+        // 防抖处理,延迟500ms执行查询
+        if (this.materialNameSearchTimer) {
+          clearTimeout(this.materialNameSearchTimer)
+        }
+        this.materialNameSearchTimer = setTimeout(() => {
+          this.queryMaterialList()
+        }, 500)
+      },
+      // 查询资料列表
+      async queryMaterialList() {
+        if (
+          !this.dataDialogForm.materialName ||
+          !this.dataDialogForm.materialName.trim()
+        ) {
+          this.materialQueryList = []
+          return
+        }
+
+        if (!this.currentArchiveRow) {
+          this.$message.warning('缺少任务信息')
+          return
+        }
+
+        try {
+          this.dataDialogLoading = true
+          const taskId =
+            this.currentArchiveRow.taskId || this.currentArchiveRow.id
+          const params = {
+            taskId: taskId,
+            materialName: this.dataDialogForm.materialName.trim(),
+          }
+
+          const response = await addDataInductionList(params)
+
+          // 处理返回的数据
+          if (response && response.value) {
+            const list = Array.isArray(response.value)
+              ? response.value
+              : response.value.list || []
+            this.materialQueryList = list.map((item) => {
+              return {
+                id: item.id,
+                materialOrderNum:
+                  item.materialOrderNum ||
+                  item.orderNum ||
+                  this.dataDialogForm.materialOrderNum,
+                materialName:
+                  item.materialName || this.dataDialogForm.materialName,
+                documentName: item.documentName || item.name || '',
+                documentNo: item.documentNo || item.number || '',
+                auditedUnit: item.auditedUnit || item.auditedUnitName || '',
+                generateTime:
+                  item.generateTime || item.createTime || item.updateTime || '',
+                fileSource: item.fileSource || item.source || '',
+                // 保留原始数据
+                originalData: item,
+              }
+            })
+          } else {
+            this.materialQueryList = []
+          }
+        } catch (error) {
+          this.$message.error('查询资料列表失败')
+          console.error('查询资料列表失败:', error)
+          this.materialQueryList = []
+        } finally {
+          this.dataDialogLoading = false
+        }
+      },
+      // 从查询结果列表中添加文件
+      handleAddFileFromList(row) {
+        // if (!row) {
+        //   return
+        // }
+
+        // 检查是否已经添加过
+        const exists = this.selectedFileList.some(
+          (item) =>
+            item.id === row.id ||
+            (item.materialName === row.materialName &&
+              item.materialOrderNum === row.materialOrderNum)
+        )
+
+        if (exists) {
+          this.$message.warning('该文件已添加')
+          return
+        }
+
+        // 添加到已选择列表,序号自动递增
+        const newOrderNum =
+          this.selectedFileList.length > 0
+            ? Math.max(
+                ...this.selectedFileList.map(
+                  (item) => item.materialOrderNum || 0
+                )
+              ) + 1
+            : 1
+
+        this.selectedFileList.push({
+          ...row,
+          // 使用自动递增的序号
+          materialOrderNum: newOrderNum,
+        })
+
+        this.$message.success('添加成功')
+      },
+      // 序号变化时处理
+      handleOrderNumChange() {
+        // 可以在这里添加序号验证逻辑,比如检查是否重复
+      },
+      // 添加文件(手动输入添加)
+      handleAddFile() {
+        // 验证表单
+        this.$refs.dataDialogForm.validate((valid) => {
+          if (!valid) {
+            return false
+          }
+
+          if (
+            !this.dataDialogForm.materialName ||
+            !this.dataDialogForm.materialName.trim()
+          ) {
+            this.$message.warning('请输入资料名称')
+            return
+          }
+
+          // 检查是否已经添加过
+          const exists = this.selectedFileList.some(
+            (item) =>
+              item.materialName === this.dataDialogForm.materialName.trim() &&
+              item.materialOrderNum === this.dataDialogForm.materialOrderNum
+          )
+
+          if (exists) {
+            this.$message.warning('该文件已添加')
+            return
+          }
+
+          // 添加到已选择列表
+          this.selectedFileList.push({
+            id: null, // 新添加的行没有ID
+            materialOrderNum: this.dataDialogForm.materialOrderNum,
+            materialName: this.dataDialogForm.materialName.trim(),
+            documentName: '',
+            documentNo: '',
+            auditedUnit: '',
+            generateTime: '',
+            fileSource: '',
+            isNew: true, // 标记为新添加的行
+          })
+
+          // 重置表单中的资料名称,序号自动递增
+          this.dataDialogForm.materialName = ''
+          this.dataDialogForm.materialOrderNum =
+            this.selectedFileList.length + 1 || 1
+          this.$message.success('添加成功')
+        })
+      },
+      // 删除文件
+      handleDeleteFile(row, index) {
+        this.$confirm('确定要删除该文件吗?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+        })
+          .then(() => {
+            this.selectedFileList.splice(index, 1)
+            this.$message.success('删除成功')
+          })
+          .catch(() => {
+            this.$message.info('已取消删除')
+          })
+      },
+      // 保存资料对话框数据
+      async handleSaveDataDialog() {
+        if (!this.selectedFileList || this.selectedFileList.length === 0) {
+          this.$message.warning('请先添加文件')
+          return
+        }
+
+        if (!this.currentArchiveRow) {
+          this.$message.warning('缺少任务信息')
+          return
+        }
+
+        try {
+          this.dataDialogLoading = true
+          const taskId =
+            this.currentArchiveRow.taskId || this.currentArchiveRow.id
+
+          // 构建保存参数
+          const params = {
+            taskId: taskId,
+            materialName: this.dataDialogForm.materialName || '',
+            materialOrderNum: this.dataDialogForm.materialOrderNum || 1,
+            details: this.selectedFileList.map((item) => {
+              return {
+                id: item.id || null,
+                materialOrderNum: item.materialOrderNum,
+                materialName: item.materialName,
+                documentName: item.documentName,
+                documentNo: item.documentNo,
+                auditedUnit: item.auditedUnit,
+                generateTime: item.generateTime,
+                fileSource: item.fileSource,
+                // 如果有原始数据,保留其他必要字段
+                ...(item.originalData || {}),
+              }
+            }),
+          }
+
+          const response = await editDataInductionList(params)
+
+          if (response && response.success !== false) {
+            this.$message.success(response.message || '保存成功')
+            this.handleCancel('dataDialog')
+            // 刷新资料归纳列表
+            if (
+              this.activeTab === 'archive' &&
+              this.archiveTab === 'dataCollect'
+            ) {
+              this.loadArchiveData()
+            }
+          } else {
+            this.$message.error(response.message || '保存失败')
+          }
+        } catch (error) {
+          this.$message.error('保存失败')
+          console.error('保存资料失败:', error)
+        } finally {
+          this.dataDialogLoading = false
+        }
+      },
+      // 取消/关闭弹窗
+      handleCancel(type) {
+        if (type === 'dataDialog') {
+          this.dataDialogVisible = false
+          // 重置表单和数据
+          this.$nextTick(() => {
+            if (this.$refs.dataDialogForm) {
+              this.$refs.dataDialogForm.resetFields()
+            }
+            this.dataDialogForm = {
+              materialName: '',
+              materialOrderNum: 1,
+            }
+            this.materialQueryList = []
+            this.selectedFileList = []
+            this.dataDialogData = []
+            this.isEditingDataDialog = false
+            this.currentEditMaterialId = null
+            // 清除搜索定时器
+            if (this.materialNameSearchTimer) {
+              clearTimeout(this.materialNameSearchTimer)
+              this.materialNameSearchTimer = null
+            }
+          })
+        }
+      },
       // 查看按钮点击事件
       handleView(row) {
         this.$message.info(`查看资料:${row.name}`)

+ 1 - 1
src/views/costAudit/baseInfo/financeSheetManage/infoMaintain.vue

@@ -1477,8 +1477,8 @@
   import {
     listByTemplateIdAndVersion,
     getCellCodesByTemplateId,
-    listByCurrentTemplateId,
   } from '@/api/costSurveyFdTemplateItems'
+  import { listByCurrentTemplateId } from '@/api/catalogManage'
   import {
     addSurveyFdTemplateVersion,
     delSurveyFdTemplateVersionById,