From f94b96403234f5927e74f72fc0cbc65d7b426019 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期三, 10 十二月 2025 14:52:50 +0800
Subject: [PATCH] 修改

---
 src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectReview/index.vue |  212 ++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 195 insertions(+), 17 deletions(-)

diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectReview/index.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectReview/index.vue
index bce4f95..6517b6d 100644
--- a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectReview/index.vue
+++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectReview/index.vue
@@ -9,9 +9,10 @@
               plain
               icon="Plus"
               @click="openDialog('add',{})"
+              v-hasPermi="['projectReview:add']"
           >新增</el-button>
         </el-form-item>
-        <el-form-item v-if="isAdmin" label="企业:" >
+        <el-form-item v-if="isAdmin" label="单位:" >
           <el-select v-model="data.queryParams.companyId" placeholder="请选择" @change="changeCom" clearable>
             <el-option
                 v-for="item in companyList"
@@ -37,27 +38,60 @@
 <!--          </el-select>-->
 
         </el-form-item>
+        <el-form-item label="类型:">
+          <el-select v-model="data.queryParams.type" filterable placeholder="请选择"
+          >
+            <el-option
+                v-for="item in data.typeList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item >
           <el-button  type="primary" @click="getList">查询</el-button>
           <el-button  type="primary" plain @click="reset">重置</el-button>
+          <el-form-item style="margin-left: 15px">
+            <el-button
+                type="primary"
+                @click="exportData"
+            >导出</el-button>
+          </el-form-item>
         </el-form-item>
       </el-form>
     </div>
     <!-- 表格数据 -->
-    <el-table v-loading="loading" :data="dataList" :border="true">
+    <el-table v-loading="loading" :data="dataList" :border="true" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" :selectable="isRowSelectable" />
       <el-table-column label="序号" type="index" align="center" width="80"/>
-      <el-table-column label="项目名称" prop="itemName" align="center" width="130"  :show-overflow-tooltip="true" />
-      <el-table-column label="文件编号" prop="num" align="center"  />
-      <el-table-column label="文件名称" prop="fileName" align="center"  />
-      <el-table-column label="文件" prop="fileName" align="center" >
+      <el-table-column label="项目名称" prop="itemName" align="center"   :show-overflow-tooltip="true" />
+      <el-table-column label="设计和开发阶段" prop="stage" align="center"  />
+      <el-table-column label="类型" prop="type" align="center"  >
         <template #default="scope">
-          <el-link v-if="scope.row.fileName" style="" type="primary" @click="openFile(scope.row.filePath)">{{scope.row.fileName}}</el-link>
+          <span>{{scope.row.type == 1 ? '会签评审' :scope.row.type == 2? '会议评审' :'' }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-if="userTpye == 0 || userTpye == 6">
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
-          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
-          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
+          <div v-if="scope.row.type == 2" style="display: flex;align-items: center;justify-content: center">
+            <el-button link type="primary"  @click="downloadFile(scope.row)" v-hasPermi="['projectReview:edit']">下载</el-button>
+            <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['projectReview:edit']">编辑</el-button>
+            <el-button link type="danger" @click="handleDelete(scope.row)" v-hasPermi="['projectReview:del']">删除</el-button>
+          </div>
+          <div v-if="scope.row.type == 1" style="display: flex;align-items: center;justify-content: center">
+              <!--没发送之前-->
+            <div v-if="scope.row.status ==1" style="display: flex;align-items: center;justify-content: center">
+              <el-button  link type="primary" @click="sendReviewMsg(scope.row)" v-hasPermi="['projectReview:send']">发送</el-button>
+              <el-button link type="primary" @click="openDialog('edit',scope.row)" v-hasPermi="['projectReview:edit']">编辑</el-button>
+              <el-button link type="danger" @click="handleDelete(scope.row)"  v-hasPermi="['projectReview:del']">删除</el-button>
+            </div>
+            <!--发送之后-->
+            <div v-if="scope.row.status == 2" style="display: flex;align-items: center;justify-content: center">
+              <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
+              <el-button link type="danger" @click="handleDelete(scope.row)" v-if="userTpye == 0" v-hasPermi="['projectReview:del']">删除</el-button>
+            </div>
+          </div>
         </template>
       </el-table-column>
     </el-table>
@@ -83,25 +117,40 @@
 import Cookies from "js-cookie";
 import {renderAsync} from "docx-preview";
 import {get} from "@vueuse/core";
-import {delReview, getReviewPage} from "@/api/selfProblems/projectReview";
+import {delReview, getReviewPage, sendReview} from "@/api/selfProblems/projectReview";
+import axios from "axios";
+import {getToken} from "@/utils/auth";
+// import {generateWordDocument} from "@/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/components/exportDoc";
+import {generateWordDocument} from "@/utils/exportWord";
+import {imageUrlToBase64} from "@/utils/imageToBase";
 const userStore = useUserStore()
 const { proxy } = getCurrentInstance();
 const loading = ref(false);
 const dialogRef = ref();
-
+const choosedData = ref([])
 const data = reactive({
   queryParams: {
     pageNum: 1,
     pageSize: 10,
     companyId: null,
-    itemName: null
+    itemName: null,
+    type:null
   },
   total: 0,
   dataList: [],
   companyList: [],
   industryList: [],
   isAdmin: false,
-  typeList: [],
+  typeList: [
+    {
+      id: 1,
+      name: '会签评审'
+    },
+    {
+      id: 2,
+      name: '会议评审'
+    },
+  ],
   exportDialog: false,
   projectList: [],
 
@@ -175,7 +224,8 @@
       pageNum: 1,
       pageSize: 10,
       companyId: null,
-      itemId: null
+      itemId: null,
+      type:null
     }
     await getCompanyList()
   }else {
@@ -183,9 +233,11 @@
       pageNum: 1,
       pageSize: 10,
       companyId: data.queryParams.companyId,
-      itemId: null
+      itemId: null,
+      type:null
     }
   }
+  choosedData.value = []
   await getList()
   await getProjectList()
 }
@@ -212,7 +264,7 @@
 const openFile = async(path)=>{
   const ext = path.split('.').pop().toLowerCase();
   if (ext === 'doc') {
-    ElMessageBox.confirm('暂不支持线上预览.doc文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => {
+    ElMessageBox.confirm('暂不支持线上预览.doc、.xls、.xlsx文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => {
       window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank');
     }).catch(() => {
       console.log('取消预览')
@@ -252,7 +304,133 @@
   }
 
 }
+const downloadFile = (e)=>{
+  axios.get(import.meta.env.VITE_APP_BASE_API + '/' +e.filePath,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`},responseType: 'blob'}).then(res=>{
+    if (res) {
+      const link = document.createElement('a')
+      let blob = new Blob([res.data],{type: res.data.type})
+      link.style.display = "none";
+      link.href = URL.createObjectURL(blob); // 创建URL
+      link.setAttribute("download", e.fileName);
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+    } else {
+      ElMessage({
+        type: 'warning',
+        message: '文件读取失败'
+      });
+    }
+  })
+}
+const sendReviewMsg = (val) =>{
+  ElMessageBox.confirm(
+      '确定发送审核此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await sendReview(val.id)
+        if(res.code == 200){
+          ElMessage.success('数据发送成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/projectReviewExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+
+  for(const item of data){
+    item.leaderList = await Promise.all(
+        item.reviewUsers
+            .filter(user => user.reviewType === '评审组长')
+            .map(async (x, index) => {
+              let signBase64 = '';
+              if (x.sign != '') {
+                try {
+                  const url = import.meta.env.VITE_APP_BASE_API + '/' + x.sign;
+                  signBase64 = await imageUrlToBase64(url, {
+                    format: 'png',
+                    quality: 0.8
+                  });
+                } catch (err) {
+                  signBase64 = '';
+                }
+              }
+              return {
+                ...x,
+                first: index === 0,
+                sign: signBase64 || '',
+                reviewOpinionName: x.reviewOpinion == 1 ? '同意':x.reviewOpinion == 2 ? '不同意':'',
+                reviewTime: x.reviewTime ?x.reviewTime: ''
+              };
+            })
+    );
+    item.leaderAgre = item.leaderList.filter(item => item.reviewOpinion == 1)
+
+    // 2. 处理 peopleList:同样用 Promise.all 等待异步完成
+    item.peopleList = await Promise.all(
+        item.reviewUsers
+            .filter(user => user.reviewType === '评审组员')
+            .map(async (x, index) => {
+              let signBase64 = '';
+              if (x.sign != '') {
+                try {
+                  const url = import.meta.env.VITE_APP_BASE_API + '/' + x.sign;
+                  signBase64 = await imageUrlToBase64(url, {
+                    format: 'png',
+                    quality: 0.8
+                  });
+                } catch (err) {
+                  signBase64 = '';
+                }
+              }
+              return {
+                ...x,
+                first: index === 0,
+                sign: signBase64 || '',
+                reviewOpinionName: x.reviewOpinion == 1 ? '同意':x.reviewOpinion == 2 ? '不同意':'',
+                reviewTime: x.reviewTime ?x.reviewTime: ''
+              };
+            })
+    );
+    item.productItems = item.productItems.map(i => i.fileName)
+
+    console.log('item.productItems', item.productItems)
+    try {
+      generateWordDocument(templatePath.value, item, item.itemName + `_${item.stage}审批表.docx`);
+    } catch (error) {
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+
+
+  }
+}
+
+
 const changeCom = () => {
   getProjectList()
 }
+const isRowSelectable = (row) => {
+  return row.type !== 2;
+}
 </script>

--
Gitblit v1.9.2