| | |
| | | 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" |
| | |
| | | <!-- </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> |
| | |
| | | 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: [], |
| | | |
| | |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | companyId: null, |
| | | itemId: null |
| | | itemId: null, |
| | | type:null |
| | | } |
| | | await getCompanyList() |
| | | }else { |
| | |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | companyId: data.queryParams.companyId, |
| | | itemId: null |
| | | itemId: null, |
| | | type:null |
| | | } |
| | | } |
| | | choosedData.value = [] |
| | | await getList() |
| | | await getProjectList() |
| | | } |
| | |
| | | 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('取消预览') |
| | |
| | | } |
| | | |
| | | } |
| | | 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> |