suhp 1 месяц назад
Родитель
Сommit
1ea4ed6baf

+ 19 - 3
src/views/costAudit/auditInfo/auditManage/index.vue

@@ -91,9 +91,9 @@
                 任务详情
               </el-button>
               <el-button
-                v-if="scope.row.currentNode === 'sdshenhe'"
+                v-if="scope.row.currentNode === 'jtsy'"
                 type="text"
-                @click="handleOpenDetails(scope.row)"
+                @click="handleOpenMainDetails(scope.row)"
               >
                 任务办理
               </el-button>
@@ -183,12 +183,23 @@
       @close="handleDetailsClose"
       @refresh="handleRefresh"
     />
+    <!-- 主详情弹窗组件 -->
+    <mainDetailsDialog
+      :id="selectedProject && selectedProject.id"
+      ref="mainDetailsRef"
+      :visible.sync="mainDetailsVisible"
+      :current-node="selectedProject && selectedProject.currentNode"
+      :current-status="selectedProject && selectedProject.status"
+      @close="handleMainDetailsClose"
+      @refresh="handleMainRefresh"
+    />
     <taskInfo ref="taskInfo" />
   </div>
 </template>
 <script>
   import { doProcessBtn } from '@/api/dataPreliminaryReview'
   import detailsDialog from './details.vue'
+  import mainDetailsDialog from './mainDetails.vue'
   import taskMixins from './taskMixins.js'
   // 成本监审任务列表API
   import { getReviewTaskList } from '@/api/audit/auditIndex'
@@ -198,6 +209,7 @@
     components: {
       detailsDialog,
       taskInfo,
+      mainDetailsDialog,
     },
     mixins: [taskMixins],
     data() {
@@ -339,7 +351,11 @@
         this.selectedProject = project
         this.detailsVisible = true
       },
-
+      handleOpenMainDetails(project) {
+        console.log('project', project)
+        this.selectedProject = project
+        this.mainDetailsVisible = true
+      },
       // 详情弹窗关闭处理
       handleDetailsClose() {
         this.selectedProject = null

+ 308 - 0
src/views/costAudit/auditInfo/auditManage/mainDetails.vue

@@ -0,0 +1,308 @@
+<template>
+  <div class="details-container">
+    <el-drawer
+      :visible.sync="visible"
+      :title="dialogTitle"
+      size="90%"
+      @close="handleClose"
+    >
+      <!-- 操作按钮区域 -->
+      <div class="btn-group">
+        <el-button
+          v-for="item in buttonData"
+          :key="item.id"
+          type="primary"
+          @click="handleAuditPass(item)"
+        >
+          {{ item.value }}
+        </el-button>
+      </div>
+      <!-- 标签页面 -->
+      <el-tabs v-model="activeTab" type="card" class="audit-tabs">
+        <el-tab-pane label="监审文书" name="submitData"></el-tab-pane>
+        <el-tab-pane label="集体审议" name="costSurvey"></el-tab-pane>
+        <el-tab-pane
+          v-if="currentNode !== 'clcs'"
+          label="出具结论"
+          name="costAudit"
+        ></el-tab-pane>
+      </el-tabs>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+  import {
+    getDataPreliminaryReviewButton,
+    doProcessBtn,
+  } from '@/api/dataPreliminaryReview'
+  export default {
+    name: 'Details',
+    components: {},
+    props: {
+      visible: {
+        type: Boolean,
+        default: true,
+      },
+      id: {
+        type: [String, Number],
+        default: null,
+      },
+      currentNode: {
+        type: String,
+        default: '',
+      },
+      currentStatus: {
+        type: String,
+        default: '',
+      },
+    },
+    data() {
+      return {
+        buttonData: [], //资料初审按钮数据
+        activeTab: 'submitData', // 默认选中报送资料标签页
+        // 弹窗显示状态
+        showSupplementDialog: false,
+        showAbortDialog: false,
+        showRejectDialog: false,
+        // 弹窗数据
+        additionalParams: {},
+        // 当前操作按钮信息
+        currentButton: null,
+      }
+    },
+    computed: {
+      dialogTitle() {
+        // 根据节点类型设置标题
+        if (
+          this.currentNode === 'sdshenhe' &&
+          this.currentStatus === '审核中'
+        ) {
+          return '审核详情'
+        } else if (this.currentNode === 'clcs') {
+          return '成本调查详情'
+        } else if (
+          this.currentNode === 'yjgaozhi' ||
+          this.currentNode === 'yjfk'
+        ) {
+          return '意见告知'
+        }
+        return '成本审核详情'
+      },
+    },
+    watch: {
+      visible(newVal) {
+        // 监听visible变化,弹窗打开时设置标签页并获取按钮数据
+        if (newVal && this.id) {
+          // 使用 $nextTick 确保 props 已更新
+          this.$nextTick(() => {
+            // 设置标签页
+            this.setActiveTab()
+            // 弹窗打开时,无论什么情况都要获取资料初审按钮数据
+            this.getPreliminaryReviewButton()
+          })
+        }
+      },
+      // 监听currentNode变化,如果弹窗已打开,更新标签页并重新获取按钮数据
+      currentNode(newVal, oldVal) {
+        if (this.visible && this.id && newVal && newVal !== oldVal) {
+          this.$nextTick(() => {
+            // 设置标签页
+            this.setActiveTab()
+            // 重新获取按钮数据
+            this.getPreliminaryReviewButton()
+          })
+        }
+      },
+      // 监听currentStatus变化,如果弹窗已打开,更新标签页并重新获取按钮数据
+      currentStatus(newVal, oldVal) {
+        if (this.visible && this.id && newVal && newVal !== oldVal) {
+          this.$nextTick(() => {
+            // 设置标签页
+            this.setActiveTab()
+            // 重新获取按钮数据
+            this.getPreliminaryReviewButton()
+          })
+        }
+      },
+      // 监听id变化,如果弹窗已打开,重新获取按钮数据
+      id(newVal) {
+        if (this.visible && newVal) {
+          this.$nextTick(() => {
+            // 设置标签页
+            this.setActiveTab()
+            // 获取按钮数据
+            this.getPreliminaryReviewButton()
+          })
+        }
+      },
+    },
+    mounted() {
+      // 设置标签页
+      this.setActiveTab()
+      // 如果组件挂载时弹窗已打开且有id,也要获取按钮数据
+      if (this.visible && this.id) {
+        this.$nextTick(() => {
+          // 弹窗打开时,无论什么情况都要获取资料初审按钮数据
+          this.getPreliminaryReviewButton()
+        })
+      }
+    },
+    methods: {
+      // 根据 currentNode 和 currentStatus 设置活动标签页
+      setActiveTab() {},
+      // 获取资料初审按钮
+      async getPreliminaryReviewButton() {
+        // 直接从 props 获取 currentNode,确保是最新的值
+        const currentNode = this.currentNode
+
+        // 构建参数对象
+        const params = {
+          taskId: this.id,
+        }
+
+        // 只有当 currentNode 有值时才添加 processNodeKey
+        if (currentNode && currentNode.trim() !== '') {
+          params.processNodeKey = currentNode === 'ccls' ? 'clcs' : currentNode
+        }
+
+        try {
+          const response = await getDataPreliminaryReviewButton(params)
+          this.buttonData = response.value || []
+        } catch (error) {
+          this.buttonData = []
+        }
+      },
+      handleClose() {
+        // 关闭弹窗时触发事件
+        this.$emit('update:visible', false)
+        this.$emit('close')
+      },
+      // 处理审核意见保存成功后的刷新
+      handleAuditOpinionRefresh() {
+        // 触发父组件刷新列表
+        this.$emit('refresh')
+      },
+      open() {
+        // 打开弹窗方法,供父组件通过ref调用
+        this.$emit('update:visible', true)
+      },
+      // 处理审核操作按钮点击
+      handleAuditPass(item) {},
+
+      // 执行审核操作
+      async executeAuditOperation() {
+        if (!this.id) {
+          this.$message.error('缺少任务ID')
+          return
+        }
+        if (!this.currentButton) {
+          this.$message.error('操作失败:缺少按钮信息')
+          return
+        }
+        try {
+          const params = {
+            taskId: this.id,
+            processNodeKey: this.currentNode,
+            key: this.currentButton.key,
+            sendType: this.additionalParams.sendType?.join(','),
+            content: this.additionalParams.content,
+          }
+
+          const response = await doProcessBtn(params)
+
+          if (response && response.code === 200) {
+            this.$message.success(this.currentButton.value + '操作成功')
+            // 关闭所有弹窗
+            this.showSupplementDialog = false
+            this.showAbortDialog = false
+            this.showRejectDialog = false
+            // 关闭主弹窗
+            this.handleClose()
+            // 触发父组件刷新列表
+            this.$emit('refresh')
+          } else {
+            this.$message.error(
+              response?.message || this.currentButton.value + '操作失败'
+            )
+          }
+        } catch (error) {
+          this.$message.error(this.currentButton.value + '操作失败')
+        }
+      },
+    },
+  }
+</script>
+
+<style scoped>
+  .btn-group {
+    margin-bottom: 20px;
+    margin-left: 20px;
+  }
+
+  .btn-group .el-button {
+    margin-right: 10px;
+  }
+  .details-container {
+    width: 100%;
+    height: 100%;
+  }
+
+  .audit-tabs {
+    height: calc(100vh - 150px);
+  }
+
+  .audit-tabs .el-tabs__header {
+    margin-bottom: 0;
+    padding: 15px 15px 0;
+    background: #f5f7fa;
+    border-bottom: 1px solid #ebeef5;
+  }
+
+  .audit-tabs .el-tabs__nav-wrap {
+    padding-bottom: 10px;
+  }
+
+  .audit-tabs .el-tabs__content {
+    height: calc(100% - 60px);
+    padding: 15px;
+    overflow-y: auto;
+  }
+
+  .audit-tabs .el-tab-pane {
+    height: 100%;
+  }
+
+  /* 弹窗样式 */
+  .dialog-content {
+    padding: 10px 0;
+  }
+
+  .form-item {
+    margin-bottom: 20px;
+  }
+
+  .form-label {
+    display: inline-block;
+    width: 100px;
+    text-align: right;
+    margin-right: 0;
+    color: #606266;
+    vertical-align: middle;
+  }
+
+  .form-item .el-checkbox-group {
+    display: inline-block;
+    margin-left: 10px;
+  }
+
+  .form-item .el-checkbox {
+    margin-right: 20px;
+    vertical-align: middle;
+  }
+
+  .form-item .el-input__inner {
+    width: calc(100% - 115px);
+    margin-left: 115px;
+  }
+</style>