From d5bd0e88c1eec6bb2947d2bfa57348d89edbc1c3 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期五, 18 七月 2025 16:20:45 +0800 Subject: [PATCH] 修改 --- src/views/work/qualityInfo/supplierQuality/supplierList/components/addCert.vue | 201 +++++ src/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDialog.vue | 446 ++++++++++++ public/qualityExample.docx | 0 src/api/supplier/supplierList.js | 78 + src/views/work/qualityInfo/supplierQuality/supplierList/components/performanceTableDialog.vue | 573 +++++++++++++++ src/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDatas.js | 146 +++ src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/index.vue | 2 src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/index.vue | 2 src/views/work/onlineEducation/classHourBatch/components/batchDialog.vue | 14 public/performanceExample.docx | 0 src/views/work/onlineEducation/people/index.vue | 10 src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/components/editDialog.vue | 10 src/views/work/qualityInfo/supplierQuality/supplierList/components/certDialog.vue | 202 +++++ src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue | 45 public/supplierExample.docx | 0 src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/components/editDialog.vue | 10 src/views/work/qualityInfo/supplierQuality/supplierList/index.vue | 476 ++++++++++++ 17 files changed, 2,152 insertions(+), 63 deletions(-) diff --git a/public/performanceExample.docx b/public/performanceExample.docx new file mode 100644 index 0000000..04f1f54 --- /dev/null +++ b/public/performanceExample.docx Binary files differ diff --git a/public/qualityExample.docx b/public/qualityExample.docx new file mode 100644 index 0000000..0d94212 --- /dev/null +++ b/public/qualityExample.docx Binary files differ diff --git a/public/supplierExample.docx b/public/supplierExample.docx new file mode 100644 index 0000000..a32319b --- /dev/null +++ b/public/supplierExample.docx Binary files differ diff --git a/src/api/supplier/supplierList.js b/src/api/supplier/supplierList.js index fe53c2d..3995839 100644 --- a/src/api/supplier/supplierList.js +++ b/src/api/supplier/supplierList.js @@ -3,7 +3,7 @@ export function getSupplierPage(params) { return request({ - url: '/internal/audit/supplier/list', + url: '/supplier/list', method: 'get', params: params }) @@ -12,7 +12,7 @@ export function addSupplier(data) { return request({ - url: '/internal/audit/supplier/insert', + url: '/supplier/insert', method: 'post', data: data }) @@ -20,17 +20,85 @@ export function editSupplier(params) { return request({ - url: `/internal/audit/supplier/update`, + url: `/supplier/update`, method: 'post', data: params }) } -export function delSupplier(data) { +export function delSupplierById(data) { return request({ - url: `/internal/audit/supplier/deleted?supplierId=${data}`, + url: `/supplier/deleted?supplierId=${data}`, method: 'get' }) } +//业绩评定表 +export function getPerformance(params) { + return request({ + url: '/supplier/performance/list', + method: 'get', + params: params + }) +} + + +export function editPerformance(params) { + return request({ + url: `/supplier/performance/update`, + method: 'post', + data: params + }) +} + +//质量保证表 +export function getQuality(params) { + return request({ + url: '/supplier/quality/list', + method: 'get', + params: params + }) +} + + +export function editQuality(params) { + return request({ + url: `/supplier/quality/update`, + method: 'post', + data: params + }) +} + +//证书 +export function getSupplierCert(params) { + return request({ + url: '/supplier/certifity/list', + method: 'get', + params: params + }) +} + + +export function addSupplierCert(data) { + return request({ + url: '/supplier/certifity/insert', + method: 'post', + data: data + }) +} + +export function editSupplierCert(params) { + return request({ + url: `/supplier/certifity/update`, + method: 'post', + data: params + }) +} + +export function delSupplierCert(data) { + return request({ + url: `/supplier/certifity/deleted?certifityId=${data}`, + method: 'get' + }) +} diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/components/editDialog.vue index d7b193c..4357099 100644 --- a/src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/components/editDialog.vue +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/components/editDialog.vue @@ -27,6 +27,9 @@ <el-form-item label="目录名称:" prop="mess"> <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> </el-form-item> + <el-form-item label="排序:" prop="sort"> + <el-input v-model.number.trim="state.form.sort" type="number" :disabled="state.title =='查看'" placeholder="排序"></el-input> + </el-form-item> </el-form> <template #footer v-if="state.title !='查看'"> <span class="dialog-footer"> @@ -52,12 +55,14 @@ mess: '', number:'', parentId: null, - companyId: null + companyId: null, + sort: null }, formRules:{ mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], number: [{ required: true, message: '请输入序号', trigger: 'blur' }], parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + sort: [{ required: true, message: '请输入排序', trigger: 'blur' }], }, isAdmin: false, companyList: [], @@ -161,7 +166,8 @@ mess: '', number:'', parentId: null, - companyId: null + companyId: null, + sort: null } state.isTree = false superRef.value.clearValidate(); diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/index.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/index.vue index ccee6f1..b73c988 100644 --- a/src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/index.vue +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/product/proCaralog/index.vue @@ -52,6 +52,8 @@ {{scope.row.number}} {{scope.row.mess}} </template> </el-table-column> + <el-table-column label="排序" prop="sort" > + </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > <template #default="scope"> <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/components/editDialog.vue index ea221c7..6d368be 100644 --- a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/components/editDialog.vue +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/components/editDialog.vue @@ -27,6 +27,9 @@ <el-form-item label="目录名称:" prop="mess"> <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> </el-form-item> + <el-form-item label="排序:" prop="sort"> + <el-input v-model.number.trim="state.form.sort" type="number" :disabled="state.title =='查看'" placeholder="排序"></el-input> + </el-form-item> </el-form> <template #footer v-if="state.title !='查看'"> <span class="dialog-footer"> @@ -52,12 +55,14 @@ mess: '', number:'', parentId: null, - companyId: null + companyId: null, + sort: null }, formRules:{ mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], number: [{ required: true, message: '请输入序号', trigger: 'blur' }], parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + sort: [{ required: true, message: '请输入排序', trigger: 'blur' }], }, isAdmin: false, companyList: [], @@ -161,7 +166,8 @@ mess: '', number:'', parentId: null, - companyId: null + companyId: null, + sort: null } state.isTree = false superRef.value.clearValidate(); diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/index.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/index.vue index 7451f0b..a49b4cf 100644 --- a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/index.vue +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectCaralog/index.vue @@ -52,6 +52,8 @@ {{scope.row.number}} {{scope.row.mess}} </template> </el-table-column> + <el-table-column label="排序" prop="sort" > + </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > <template #default="scope"> <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> diff --git a/src/views/work/onlineEducation/classHourBatch/components/batchDialog.vue b/src/views/work/onlineEducation/classHourBatch/components/batchDialog.vue index ac2a8ee..2d5cb3a 100644 --- a/src/views/work/onlineEducation/classHourBatch/components/batchDialog.vue +++ b/src/views/work/onlineEducation/classHourBatch/components/batchDialog.vue @@ -208,13 +208,13 @@ } const onSubmit = async () => { - if(state.isAdmin){ - ElMessage({ - type: 'warning', - message: '管理员暂无权限' - }); - return; - } + // if(state.isAdmin){ + // ElMessage({ + // type: 'warning', + // message: '管理员暂无权限' + // }); + // return; + // } const valid = await busRef.value.validate(); if(valid){ if(title.value === '新增'){ diff --git a/src/views/work/onlineEducation/people/index.vue b/src/views/work/onlineEducation/people/index.vue index 96480ff..c48a4a1 100644 --- a/src/views/work/onlineEducation/people/index.vue +++ b/src/views/work/onlineEducation/people/index.vue @@ -38,11 +38,11 @@ </el-table-column> <el-table-column label="手机号" prop="phone" align="center" width="130"/> <el-table-column label="身份证" prop="idNo" align="center" width="200" :show-overflow-tooltip="true"/> - <el-table-column label="创建人" prop="createBy" align="center"> - <template #default="scope"> - <span>{{scope.row.createUser.name}}</span> - </template> - </el-table-column> +<!-- <el-table-column label="创建人" prop="createBy" align="center">--> +<!-- <template #default="scope">--> +<!-- <span>{{scope.row.createUser.name}}</span>--> +<!-- </template>--> +<!-- </el-table-column>--> <el-table-column label="工作岗位" prop="post" align="center"/> <el-table-column label="职务" prop="duty" align="center"/> <el-table-column label="一人一档" prop="duty" align="center" width="120"> diff --git a/src/views/work/qualityInfo/supplierQuality/supplierList/components/addCert.vue b/src/views/work/qualityInfo/supplierQuality/supplierList/components/addCert.vue new file mode 100644 index 0000000..34761cb --- /dev/null +++ b/src/views/work/qualityInfo/supplierQuality/supplierList/components/addCert.vue @@ -0,0 +1,201 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + title="证书列表" + width="600px" + :before-close="handleClose" + :close-on-press-escape="false" + :close-on-click-modal="false" + > + <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" > + <el-form-item label="证书名称:" prop="certifityName"> + <el-input v-model.trim="state.form.certifityName" :disabled="state.title =='查看'" placeholder="文件名称"></el-input> + </el-form-item> + <el-form-item label="文件:" prop="filePath"> + <el-upload accept=".jpg,.jpeg,.png,.doc,.docx,.pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" > + <el-button type="primary">点击上传</el-button> + <template #tip> + <div class="el-upload__tip">尺寸小于5M,最多可上传1份</div> + </template> + </el-upload> + </el-form-item> + </el-form> + <template #footer v-if="state.title !='查看'"> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' +import {ElMessage} from "element-plus"; +import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" +import {Base64} from "js-base64" +import {getCompany} from "@/api/onlineEducation/company"; +import {addIndustryTemp, updateIndustryTemp, updateInfoPlatforms} from "@/api/staffManage/staff"; +import {getToken} from "@/utils/auth"; +import {delPic} from "@/api/onlineEducation/banner"; +import {addFile, editFile} from "@/api/qualityManage/range"; +import {addProductFile, editProductFile} from "@/api/selfProblems/productFile"; +import {addSupplierCert, editSupplierCert} from "@/api/supplier/supplierList"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + certifityName: '', + filePath: '', + supplierSureId: null, + }, + formRules:{ + certifityName: [{ required: true, message: '请输入证书名称', trigger: 'blur' }], + filePath: [{ required: true, message: '请上传文件', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + industryList: [], + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileList: [] +}) +onMounted(() => { + +}); + +const openDialog = async (type, value) => { + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ; + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + if(value.filePath) { + const obj = { + url: value.filePath, + name: value.certifityName + } + state.fileList = [obj] + } + dialogVisible.value = true +} + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + const res = await addSupplierCert(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + + const res = await editSupplierCert(state.form) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + state.form.fileName = res.data.originName + state.form.filePath = res.data.path + }else{ + state.fileList = [] + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} + +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + return false + } +}; +const handleRemove = async (file, uploadFiles) => { + let path = state.form.filePath; + await delPic({path: path}).then(res => { + if(res.code == 200){ + // ElMessage({ + // type: 'success', + // message: '文件已删除' + // }) + state.form.fileName = '' + state.form.filePath = '' + }else{ + ElMessage({ + type: 'warning', + message: res.message + }) + } + }).catch(() => { + state.form.fileName = '' + state.form.filePath = '' + }); +} + +const handleClose = () => { + state.form = { + id: null, + certifityName: '', + filePath: '', + supplierSureId: null, + } + state.fileList = [] + superRef.value.clearValidate(); + superRef.value.resetFields() + dialogVisible.value = false; +} + +defineExpose({ + openDialog +}); + +</script> + +<style scoped lang="scss"> +.notice{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } + .file { + display: flex; + flex-direction: column; + align-items: flex-start; + } +} +</style> diff --git a/src/views/work/qualityInfo/supplierQuality/supplierList/components/certDialog.vue b/src/views/work/qualityInfo/supplierQuality/supplierList/components/certDialog.vue new file mode 100644 index 0000000..53e1e62 --- /dev/null +++ b/src/views/work/qualityInfo/supplierQuality/supplierList/components/certDialog.vue @@ -0,0 +1,202 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + title="证书列表" + width="600px" + :before-close="handleClose" + :close-on-press-escape="false" + :close-on-click-modal="false" + > + <el-button + style="margin-bottom: 15px;float: right" + type="primary" + @click="openAddDialog('add',{})" + >新增</el-button> + <el-table v-loading="loading" :data="dataList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="证书名称" prop="certifityName" align="center" /> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" > + <template #default="scope" > + <el-button link type="primary" @click="openFile(scope.row.filePath)">查看</el-button> + <el-button link type="primary" @click="downloadFile(scope.row)">下载</el-button> + <el-button link type="primary" @click="openAddDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + + <div class="pag-container"> +<!-- <el-pagination--> +<!-- v-model:current-page="data.queryParams.pageNum"--> +<!-- v-model:page-size="data.queryParams.pageSize"--> +<!-- :page-sizes="[10,15,20,25]"--> +<!-- layout="total, sizes, prev, pager, next, jumper"--> +<!-- :total="total"--> +<!-- @size-change="handleSizeChange"--> +<!-- @current-change="handleCurrentChange"--> +<!-- />--> + </div> + </el-dialog> + <addCertDialog ref="certRef" @getList="getCertList"></addCertDialog> + </div> +</template> +<script setup> +import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' +import {ElMessage, ElMessageBox} from "element-plus"; +import addCertDialog from './addCert.vue' +import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" +import {Base64} from "js-base64" +import {getCompany} from "@/api/onlineEducation/company"; +import {addIndustryTemp, updateIndustryTemp, updateInfoPlatforms} from "@/api/staffManage/staff"; +import {getToken} from "@/utils/auth"; +import {delPic} from "@/api/onlineEducation/banner"; +import {addFile, editFile} from "@/api/qualityManage/range"; +import {addProductFile, editProductFile} from "@/api/selfProblems/productFile"; +import {delSupplierById, delSupplierCert, getPerformance, getSupplierCert} from "@/api/supplier/supplierList"; +import axios from "axios"; +import {renderAsync} from "docx-preview"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const certRef = ref() +const state = reactive({ + title: '', + supplierSureId: null +}) +onMounted(() => { + +}); +const loading = ref(false); +const dataList = ref([]); +const total = ref(0); +const openDialog = async (type, value) => { + state.supplierSureId = value.id + await getCertList() + dialogVisible.value = true +} +const getCertList = async () => { + const param = { + supplierSureId: state.supplierSureId + } + const res = await getSupplierCert(param) + if(res.code == 200){ + dataList.value = res.data + + }else { + ElMessage.warning(res.message) + } +} + + + +const handleClose = () => { + dialogVisible.value = false; +} +const openAddDialog = (type,value) => { + value.supplierSureId = state.supplierSureId + certRef.value.openDialog(type,value) +} + +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delSupplierCert(val.id); + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '删除成功' + }); + getCertList(); + }else{ + ElMessage.warning(res.message) + } + }) +} +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.certifityName); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } else { + ElMessage({ + type: 'warning', + message: '文件读取失败' + }); + } + }) +} +const openFile = async(path)=>{ + + const ext = path.split('.').pop().toLowerCase(); + if (ext === 'doc') { + ElMessageBox.confirm('暂不支持线上预览.doc文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => { + window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank'); + }).catch(() => { + console.log('取消预览') + }); + return + }else if(ext == 'pdf' || ext == 'jpg' || ext == 'jpeg' || ext == 'png' ){ + window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank'); + }else{ + try { + // 1. 获取文件 + const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path); + const arrayBuffer = await response.arrayBuffer() + // 2. 创建新窗口 + const win = window.open('', '_blank') + win.document.write(` + <!DOCTYPE html> + <html> + <head> + <title>预览</title> + <style> + body { margin: 20px; font-family: Arial; } + .docx-container { width: 100%; height: 100%; } + </style> + </head> + <body> + <div id="container" class="docx-container"></div> + </body> + </html> + `); + // 3. 渲染 DOCX + await renderAsync(arrayBuffer, win.document.getElementById('container')); + + } catch (error) { + alert(`预览失败: ${error.message}`); + } + } +} +defineExpose({ + openDialog +}); + +</script> + +<style scoped lang="scss"> +.notice{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } + .file { + display: flex; + flex-direction: column; + align-items: flex-start; + } +} +</style> diff --git a/src/views/work/qualityInfo/supplierQuality/supplierList/components/performanceTableDialog.vue b/src/views/work/qualityInfo/supplierQuality/supplierList/components/performanceTableDialog.vue new file mode 100644 index 0000000..b605876 --- /dev/null +++ b/src/views/work/qualityInfo/supplierQuality/supplierList/components/performanceTableDialog.vue @@ -0,0 +1,573 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + title="业绩评定表" + width="900px" + :before-close="handleClose" + :close-on-press-escape="false" + :close-on-click-modal="false" + > + <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150" > + <el-row :gutter="24"> + <el-col :span="12"> + <el-form-item label="供方名称:" prop="name" > + <el-input v-model="state.form.name" placeholder="请输入供方名称" disabled/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="地址:" prop="address" > + <el-input v-model="state.form.address" placeholder="请输入地址" type="textarea" :rows="1" disabled/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="8"> + <el-form-item label="联系人:" prop="person" > + <el-input v-model="state.form.person" placeholder="请输入联系人" disabled/> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="联系电话:" prop="phone" > + <el-input v-model="state.form.phone" placeholder="请输入联系电话" disabled/> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="邮编:" prop="emil" > + <el-input v-model="state.form.emil" placeholder="请输入邮编" :disabled="title === '查看'"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="8"> + <el-form-item label="供应产品:" prop="product" > + <el-input v-model="state.form.product" placeholder="请输入供应产品" disabled/> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="产品类别:" prop="type" > + <el-input v-model="state.form.type" placeholder="请输入产品类别" :disabled="title === '查看'"/> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="评审依据:" prop="gist" > + <el-input v-model="state.form.gist" type="textarea" :rows="1" placeholder="请输入评审依据" :disabled="title === '查看'"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="验证方式:" prop="verify" > + <el-radio-group v-model="state.form.verify" :disabled="title === '查看'"> + <el-radio :label="1">现场验证</el-radio> + <el-radio :label="2">入库验证</el-radio> + <el-radio :label="3">供方资源处验证</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + </el-row> + <el-table :data="state.tableData" border :span-method="arraySpanMethod" style="margin-bottom: 15px"> + <el-table-column align="center" prop="content" fixed min-width="100"></el-table-column> + <el-table-column align="center" prop="name" width="120"></el-table-column> + <el-table-column align="center" label="优(86-100)" prop="" min-width="120"> + <template #default="scope"> + <el-input :disabled="title === '查看'" v-model="scope.row.good"></el-input> + </template> + </el-table-column> + <el-table-column align="center" label="良(71-85)" prop="" min-width="120"> + <template #default="scope"> + <el-input :disabled="title === '查看'" v-model="scope.row.fine"></el-input> + </template> + </el-table-column> + <el-table-column align="center" label="中(60-70)" prop="" min-width="120"> + <template #default="scope"> + <el-input :disabled="title === '查看'" v-model="scope.row.middle"></el-input> + </template> + </el-table-column> + <el-table-column align="center" label="差(<60)" prop="" min-width="120"> + <template #default="scope"> + <el-input :disabled="title === '查看'" v-model="scope.row.bad"></el-input> + </template> + </el-table-column> + <el-table-column align="center" prop="conclusion" label="结论" fixed="right" min-width="85"></el-table-column> + </el-table> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="评审意见:" prop="opinion" > + <el-radio-group v-model="state.form.opinion" :disabled="title === '查看'"> + <el-radio :label="1">保留(≥80)</el-radio> + <el-radio :label="2">暂停,整改后再评价(≥65)</el-radio> + <el-radio :label="3">剔除(<65)</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="12"> + <el-form-item label="参加评审人员签字:" prop="reviewUsers" > + <el-select clearable + v-model="state.checkList" + multiple + collapse-tags + collapse-tags-tooltip + :disabled="title =='查看'" + filterable + style="width: 100%" + @change="changeCheckPeople" + > + <el-option + v-for="item in state.peopleList" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="日期:" prop="reviewTime" > + <el-date-picker + :disabled="title === '查看'" + v-model="state.form.reviewTime" + type="date" + placeholder="请选择日期" + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="审批意见:" prop="reviewMess" > + <el-input type="textarea" :rows="2" v-model="state.form.reviewMess" placeholder="请输入审批意见" :disabled="title === '查看'" style="width: 100%"></el-input> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="12"> + <el-form-item label="审批人:" prop="checkId" > + <el-select clearable v-model="state.form.checkId" :disabled="title =='查看'" filterable style="width: 100%"> + <el-option + v-for="item in state.peopleList" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="日期:" prop="checkTime" > + <el-date-picker + :disabled="title === '查看'" + v-model="state.form.checkTime" + type="date" + placeholder="请选择日期" + /> + </el-form-item> + </el-col> + </el-row> + </el-form> + + <template #footer v-if="title !== '查看'"> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {computed, onMounted, reactive, ref, toRefs} from 'vue' +import Editor from "@/components/Editor/index.vue"; +import {ElMessage} from "element-plus"; +import {addNotice} from "@/api/backManage/notice"; +import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; +import {addCompany, checkName, distributeCompany, editCompany, getCompany} from "@/api/onlineEducation/company"; +import {validEmail, verifyPhone} from "@/utils/validate"; +import {addBasic, editBasic} from "@/api/companyInfo/basicInfo"; +import Cookies from "js-cookie"; +import {addSupplier, editPerformance, editSupplier, getPerformance} from "@/api/supplier/supplierList"; +import {getUser} from "@/api/onlineEducation/user"; + +const dialogVisible = ref(false); +const title = ref(""); +const busRef = ref(); +const length = ref() +const emit = defineEmits(["getList"]); +const validatePhone = (rule, value, callback)=>{ + if(value === ''){ + callback(new Error('请输入手机号')) + }else{ + if(!verifyPhone(value)){ + callback(new Error('手机号格式有误')) + }else{ + callback() + } + } +} + + +const state = reactive({ + form: { + id: '', + companyId: null, + address: '', + checkId: '', + checkTime: '', + gist: '', + phone: '', + emil: '', + name: '', + p1: '', + p2: '', + p3: '', + p4: '', + p5: '', + p6: '', + people: '', + product: '', + reviewMess: '', + reviewTime: '', + reviewUsers: '', + type: '', + verify: '', + }, + formRules:{ + companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], + address: [{ required: true, message: '请输入地址', trigger: 'blur' }], + gist:[{ required: true, message: '请输入评审依据', trigger: 'blur' }], + phone: [{ required: true, validator: validatePhone, trigger: 'blur' }], + people: [{ required: true, message: '请输入联系人', trigger: 'blur' }], + emil: [{ required: true, message: '请输入邮编', trigger: 'blur' }], + product: [{ required: true, message: '请输入供应产品', trigger: 'blur' }], + reviewMess: [{ required: true, message: '请选择审批意见', trigger: 'blur' }], + reviewTime: [{ required: true, message: '请输入评审日期', trigger: 'blur' }], + type: [{ required: true, message: '请输入产品类型', trigger: 'blur' }], + verify: [{ required: true, message: '请选择验证方式', trigger: 'blur' }], + name: [{ required: true, message: '请输入供方名称', trigger: 'blur' }], + checkId: [{ required: true, message: '请选择审批人', trigger: 'blur' }], + checkTime: [{ required: true, message: '请选择审批日期', trigger: 'blur' }], + opinion: [{ required: true, message: '请选择评审意见', trigger: 'blur' }], + reviewUsers: [{ required: true, message: '请选择评审人员', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + peopleList: [], + supplierSureId: null, + tableData: [ + { + content: '评审内容(P)', + name: '产品质量 p1', + conclusion: 'Σ(Pi)/6 =' + }, + { + name: '交货期 p2' + }, + { + + name: '履约能力 p3' + }, + { + + name: '价格 p4' + }, + { + + name: '售后服务 p5' + }, + { + name: '资历 p6' + }, + ], + checkList: [] + +}) + +onMounted(() => { + +}) +const openDialog = async (type, value) => { + title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ; + const userInfo = JSON.parse(Cookies.get('userInfo')) + state.isAdmin = userInfo.userType === 0; + state.form.companyId = value.companyId + state.supplierSureId = value.id + await getPerformanceInfo() + state.form.name = value.supplierName + state.form.address = value.supplierAddr + state.form.product = value.merito + state.form.person = value.user + state.form.phone = value.phone + await getPeopleList() + + dialogVisible.value = true; +} +const demo = ref([ + { + rage: '86-100', + field: 'good' + }, + { + rage: '71-85', + field: 'fine' + }, + { + rage: '60-70', + field: 'middle' + }, + { + rage: '0-59', + field: 'bad' + }, +]) +const getPerformanceInfo = async () => { + const param = { + supplierSureId: state.supplierSureId + } + const res = await getPerformance(param) + if(res.code == 200){ + state.form.id = res.data.id + if(!res.data.p1){ + return + } + state.form = res.data + state.form.checkId = res.data.checkId ==0? null: res.data.checkId + state.checkList = res.data.reviewUsers ? res.data.reviewUsers.split(',').map(i => Number(i)):[] + //更新表格字段名 + const p1Field = getMatchedField(res.data.p1) + if(p1Field){ + state.tableData[0][p1Field] = res.data.p1 + } + const p2Field = getMatchedField(res.data.p2) + if(p2Field){ + state.tableData[1][p2Field] = res.data.p2 + } + const p3Field = getMatchedField(res.data.p3) + if(p3Field){ + state.tableData[2][p3Field] = res.data.p3 + } + const p4Field = getMatchedField(res.data.p4) + if(p4Field){ + state.tableData[3][p4Field] = res.data.p4 + } + const p5Field = getMatchedField(res.data.p5) + if(p5Field){ + state.tableData[4][p5Field] = res.data.p5 + } + const p6Field = getMatchedField(res.data.p6) + if(p6Field){ + state.tableData[5][p6Field] = res.data.p6 + } + const sum = res.data.p1+res.data.p2+res.data.p3+res.data.p4+res.data.p5+res.data.p6 + state.tableData[0].conclusion += (sum/6).toFixed(2) + + + }else{ + ElMessage.warning(res.message) + } +} +const getMatchedField = (num) => { + for (const item of demo.value) { + const [min, max] = item.rage.split('-').map(Number); + if (num >= min && num <= max) { + return item.field; // 返回匹配的字段名(如 "good") + } + } + return null; // 无匹配时返回 null +} + +const onSubmit = async () => { + state.tableData[0].conclusion = 'Σ(Pi)/6 =' + if(!handleTableData()){ + return + } + const valid = await busRef.value.validate(); + if(valid){ + if(title.value === '编辑'){ + const {...data} = JSON.parse(JSON.stringify(state.form)) + data.reviewUsers = state.checkList.join(',') + const res = await editPerformance(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '编辑成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + } + } +} + +const handleTableData = () => { + console.log('dd',state.form) + const demo = ['good','fine','middle','bad'] + let sum = 0 + state.tableData[0].conclusion = 'Σ(Pi)/6 =' + for(const item of state.tableData){ + //填了两个及以上或没填 + const length = Object.keys(item).filter(key => (demo.includes(key) && item[key] !== '')).length + if(length>1 || length===0){ + ElMessage.warning(`请填写${item.name}的正确评分`) + return false; + } + //填的数字不在范围内 + const content = Object.keys(item).filter(key => (demo.includes(key) && item[key] !== '')) + if(content == 'good'){ + if(!(item[content]>=86 &&item[content]<=100)){ + ElMessage.warning(`请填写${item.name}的正确评分`) + return false + }else{ + sum+=Number(item[content]) + } + }else if(content == 'fine'){ + if(!(item[content]>=71 &&item[content]<=85)){ + ElMessage.warning(`请填写${item.name}的正确评分`) + return false + }else{ + sum+=Number(item[content]) + } + }else if(content == 'middle'){ + if(!(item[content]>=60 &&item[content]<=70)){ + ElMessage.warning(`请填写${item.name}的正确评分`) + return false + }else{ + sum+=Number(item[content]) + } + }else if(content == 'bad'){ + if(!(item[content]<60)){ + ElMessage.warning(`请填写${item.name}的正确评分`) + return false + }else{ + sum+=Number(item[content]) + } + } + item.num = Number(item[content]) + } + state.form.p1 = state.tableData[0].num + state.form.p2 = state.tableData[1].num + state.form.p3 = state.tableData[2].num + state.form.p4 = state.tableData[3].num + state.form.p5 = state.tableData[4].num + state.form.p6 = state.tableData[5].num + state.tableData[0].conclusion += (sum/6).toFixed(2) + return true +} +const handleClose = () => { + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + emit("getList") + +} +const reset = () => { + state.form = { + id: '', + companyId: null, + address: '', + checkId: '', + checkTime: '', + gist: '', + phone: '', + emil: '', + name: '', + p1: '', + p2: '', + p3: '', + p4: '', + p5: '', + p6: '', + people: '', + product: '', + reviewMess: '', + reviewTime: '', + reviewUsers: '', + type: '', + verify: '', + } + state.companyList = [] + state.checkList = [] + state.tableData = [ + { + content: '评审内容(P)', + name: '产品质量 p1', + conclusion: 'Σ(Pi)/6 =' + }, + { + name: '交货期 p2' + }, + { + + name: '履约能力 p3' + }, + { + + name: '价格 p4' + }, + { + + name: '售后服务 p5' + }, + { + + name: '资历 p6' + }, + ] +} +const arraySpanMethod = ( {row, column, rowIndex, columnIndex}) => { + if(columnIndex == 0 || columnIndex == 6){ + if (rowIndex === 0) { + return { + rowspan: 7, + colspan: 1 + } + } else { + // 其他行不显示(被合并) + return { + rowspan: 0, + colspan: 0 + } + } + } + +} +const getPeopleList = async ()=> { + const queryParams = { + pageNum: 1, + pageSize: 9999, + companyId: state.form.companyId + } + const res = await getUser(queryParams) + if(res.code == 200){ + state.peopleList = res.data.list?res.data.list:[] + }else{ + ElMessage.warning(res.message) + } +}; +const changeCheckPeople = (val) => { + state.form.reviewUsers = state.checkList.join(',') +} + +defineExpose({ + openDialog +}); + +</script> + +<style scoped lang="scss"> +.notice{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } + .file { + display: flex; + flex-direction: column; + align-items: flex-start; + } +} +</style> diff --git a/src/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDatas.js b/src/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDatas.js new file mode 100644 index 0000000..1c4cebf --- /dev/null +++ b/src/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDatas.js @@ -0,0 +1,146 @@ +export const traitList = [ + { + id: 1, + name: '成批生产' + }, + { + id: 2, + name: '流水线生产' + }, + { + id: 3, + name: '单台生产' + }, + { + id: 4, + name: '其他' + }, +] +export const facilityList= [ + { + id: 1, + name: '齐全、良好' + }, + { + id: 2, + name: '基本齐全、尚可' + }, + { + id: 3, + name: '不全' + }, + { + id: 4, + name: '代理商' + }, +] +export const craftList= [ + { + id: 1, + name: '齐备' + }, + { + id: 2, + name: '有一部分' + }, + { + id: 3, + name: '没有' + }, + { + id: 4, + name: '代理商' + }, +] +export const developList= [ + { + id: 1, + name: '能自行设计开发新品' + }, + { + id: 2, + name: '只能开发简单产品' + }, + { + id: 3, + name: '没有自行开发能力,代理商' + }, +] +export const teamWorkList=[ + { + id: 1, + name: '是外资企业' + }, + { + id: 2, + name: '是合资企业' + }, + { + id: 3, + name: '给企业提供产品' + }, + { + id: 4, + name: '无对外合作经验' + }, + { + id: 5, + name: '有对外合作经验,但不经常发生' + }, +] +export const qualificationList = [ + { + id: 1, + name: '营业执照' + }, + { + id: 2, + name: '有效期内' + }, + { + id: 3, + name: '有效期外' + }, + { + id: 4, + name: '高新技术企业' + }, + { + id: 5, + name: '有效期内' + }, + { + id: 6, + name: '有效期外' + }, + { + id: 7, + name: '资质代理商' + }, + { + id: 8, + name: '其他资质情况:' + }, +] +export const productList=[ + { + id: 1, + name: '通过产品认证' + }, + { + id: 2, + name: '没有产品认证' + }, + { + id: 3, + name: '通过质量体系认证' + }, + { + id: 4, + name: '没有体系认证' + }, + { + id: 5, + name: '其他认证(请指出具体内容):' + }, +] diff --git a/src/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDialog.vue b/src/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDialog.vue new file mode 100644 index 0000000..5dcfd65 --- /dev/null +++ b/src/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDialog.vue @@ -0,0 +1,446 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + title="供方质量保证能力调查表" + width="700px" + :before-close="handleClose" + :close-on-press-escape="false" + :close-on-click-modal="false" + > + <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" > + <el-row :gutter="24"> + <el-col :span="12"> + <el-form-item label="供方名称:" prop="name" > + <el-input v-model="state.form.name" disabled/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="负责人或联系人:" prop="person" > + <el-input v-model="state.form.person" :rows="1" disabled/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="8"> + <el-form-item label="供方地址:" prop="address" > + <el-input v-model="state.form.address" type="textarea" :rows="1" disabled/> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="邮编:" prop="emil" > + <el-input v-model="state.form.emil" :rows="1" :disabled="title === '查看'"/> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="电话/传真:" prop="phone" > + <el-input v-model="state.form.phone" :rows="1" disabled/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="供方主要产品:" prop="productName" > + <el-input v-model="state.form.productName" type="textarea" disabled/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="生产特点:" prop="trait" > + <el-checkbox-group v-model="state.checkTraitList" style="display: flex" :disabled="title === '查看'" @change="changeCheck('trait')"> + <div v-for="(item,index) in traitList"> + <el-checkbox :label="item.id" :key="item.id" style="margin-left: 20px;">{{item.name}}</el-checkbox> + </div> + </el-checkbox-group> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="生产设备:" prop="facility" > + <el-checkbox-group v-model="state.checkFacilityList" style="display: flex" :disabled="title === '查看'" @change="changeCheck('facility')"> + <div v-for="(item,index) in facilityList"> + <el-checkbox :label="item.id" :key="item.id" style="margin-left: 20px;">{{item.name}}</el-checkbox> + </div> + </el-checkbox-group> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="工艺文件:" prop="craft" > + <el-checkbox-group v-model="state.checkCraftList" style="display: flex" :disabled="title === '查看'" @change="changeCheck('craft')"> + <div v-for="(item,index) in craftList"> + <el-checkbox :label="item.id" :key="item.id" style="margin-left: 20px;">{{item.name}}</el-checkbox> + </div> + </el-checkbox-group> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="新品开发能力:" prop="develop" > + <el-checkbox-group v-model="state.checkDevelopList" @change="changeCheck('develop')" :disabled="title === '查看'" class="custom-checkbox-group"> + <div v-for="(item,index) in developList"> + <el-checkbox :label="item.id" :key="item.id" style="margin-left: 20px;">{{item.name}}</el-checkbox> + </div> + </el-checkbox-group> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="国际合作经验:" prop="teamWork" > + <el-checkbox-group v-model="state.checkTeamWorkList" @change="changeCheck('teamWork')" :disabled="title === '查看'" style="display: flex" class="custom-checkbox-group"> + <div v-for="(item,index) in teamWorkList"> + <el-checkbox :label="item.id" :key="item.id" style="margin-left: 20px;">{{item.name}}</el-checkbox> + </div> + </el-checkbox-group> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="公司资质情况:" prop="qualification" > + <el-checkbox-group v-model="state.checkQualificationList" :disabled="title === '查看'" @change="changeCheck('qualification')" style="display: flex" class="custom-checkbox-group"> + <div v-for="(item,index) in state.qualificationList"> + <el-checkbox :label="item.id" :key="item.id" style="margin-left: 20px;"> + {{item.name}} + <el-input + :disabled="title === '查看'" + v-if="item.id == 8 && state.checkQualificationList.includes(8)" + v-model="state.form.otherQualifi" + style="margin-left: 5px;width: 140px" + placeholder="请输入其他资质情况" + size="small" + /> + </el-checkbox> + </div> + </el-checkbox-group> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="是否通过产品或体系认证:" prop="product" > + <el-checkbox-group v-model="state.checkProductList" :disabled="title === '查看'" style="display: flex" @change="changeCheck('product')" class="custom-checkbox-group"> + <div v-for="(item,index) in state.productList"> + <el-checkbox :label="item.id" :key="item.id" style="margin-left: 20px;"> + {{item.name}} + <el-input + :disabled="title === '查看'" + v-if="item.id == 5 && state.checkProductList.includes(5)" + v-model="state.form.otherProduct" + style="margin-left: 5px;width: 160px" + placeholder="请输入其他认证" + size="small" + /> + </el-checkbox> + </div> + </el-checkbox-group> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="24"> + <el-form-item label="供方企业确认:" prop="companyMess" > + <el-input v-model="state.form.companyMess" type="textarea" :rows="2" :disabled="title === '查看'"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="12"> + <el-form-item label="供方负责人:" prop="chargeName" > + <el-input v-model="state.form.chargeName" :rows="1" :disabled="title === '查看'"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="日期:" prop="chargeTime" > + <el-date-picker + :disabled="title === '查看'" + v-model="state.form.chargeTime" + type="date" + value-format="YYYY-MM-DD" + placeholder="请选择编制日期" + /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer v-if="title !== '查看'"> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {onMounted, reactive, ref, toRefs} from 'vue' +import {ElMessage} from "element-plus"; +import {validEmail, verifyPhone} from "@/utils/validate"; +import Cookies from "js-cookie"; +import {addSupplier, editQuality, editSupplier, getPerformance, getQuality} from "@/api/supplier/supplierList"; +import {getUser} from "@/api/onlineEducation/user"; +import {traitList,facilityList,craftList,developList,teamWorkList} from "@/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDatas"; + +const dialogVisible = ref(false); +const title = ref(""); +const busRef = ref(); +const length = ref() +const emit = defineEmits(["getList"]); +const validatePhone = (rule, value, callback)=>{ + if(value === ''){ + callback(new Error('请输入手机号')) + }else{ + if(!verifyPhone(value)){ + callback(new Error('手机号格式有误')) + }else{ + callback() + } + } +} + + +const state = reactive({ + form: { + id: '', + companyId: null, + name: '', + address: '', + product: '', + person: '', + phone: '', + emil: '', + trait: '', + facility: '', + craft: '', + develop: '', + teamWork: '', + qualification: '', + chargeName: '', + chargeTime: '', + companyMess: '', + otherQualifi: '', + otherProduct: '' + }, + formRules:{ + companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], + address: [{ required: true, message: '请输入地址', trigger: 'blur' }], + phone: [{ required: true, validator: validatePhone, trigger: 'blur' }], + people: [{ required: true, message: '请输入联系人', trigger: 'blur' }], + emil: [{ required: true, message: '请输入邮编', trigger: 'blur' }], + productName: [{ required: true, message: '请输入供应产品', trigger: 'blur' }], + name: [{ required: true, message: '请输入供方名称', trigger: 'blur' }], + trait: [{ required: true, message: '请选择生产特点', trigger: 'blur' }], + facility: [{ required: true, message: '请选择生产设备', trigger: 'blur' }], + craft: [{ required: true, message: '请选择工艺文件', trigger: 'blur' }], + develop: [{ required: true, message: '请选择新品开发能力', trigger: 'blur' }], + teamWork: [{ required: true, message: '请选择国际合作经验', trigger: 'blur' }], + qualification: [{ required: true, message: '请选择公司资质情况', trigger: 'blur' }], + product: [{ required: true, message: '请选择是否通过产品或体系认证', trigger: 'blur' }], + // chargeName: [{ required: true, message: '请输入供方负责人', trigger: 'blur' }], + // companyMess: [{ required: true, message: '请输入供方企业确认', trigger: 'blur' }], + // chargeTime: [{ required: true, message: '请选择日期', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + + checkTraitList: [], + checkFacilityList: [], + checkCraftList: [], + checkDevelopList: [], + checkTeamWorkList: [], + checkQualificationList: [], + checkProductList: [], + peopleList: [], + qualificationList: [ + { + id: 1, + name: '营业执照' + }, + { + id: 2, + name: '有效期内' + }, + { + id: 3, + name: '有效期外' + }, + { + id: 4, + name: '高新技术企业' + }, + { + id: 5, + name: '有效期内' + }, + { + id: 6, + name: '有效期外' + }, + { + id: 7, + name: '资质代理商' + }, + { + id: 8, + name: '其他资质情况:' + }, + ], + productList: [ + { + id: 1, + name: '通过产品认证' + }, + { + id: 2, + name: '没有产品认证' + }, + { + id: 3, + name: '通过质量体系认证' + }, + { + id: 4, + name: '没有体系认证' + }, + { + id: 5, + name: '其他认证(请指出具体内容):' + }, + ] +}) + +onMounted(() => { + +}) +const openDialog = async (type, value,companyList) => { + title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ; + const userInfo = JSON.parse(Cookies.get('userInfo')) + state.isAdmin = userInfo.userType === 0; + state.form.companyId = value.companyId + state.supplierSureId = value.id + await getQualityInfo() + state.form.name = value.supplierName + state.form.address = value.supplierAddr + state.form.productName = value.merito + state.form.person = value.user + state.form.phone = value.phone + await getPeopleList() + dialogVisible.value = true; +} +const getQualityInfo = async () => { + const param = { + supplierSureId: state.supplierSureId + } + const res = await getQuality(param) + if(res.code == 200){ + state.form = res.data + state.checkTraitList = res.data.trait ? res.data.trait.split(',').map(i => Number(i)):[] + state.checkFacilityList = res.data.facility ? res.data.facility.split(',').map(i => Number(i)):[] + state.checkCraftList = res.data.craft ? res.data.craft.split(',').map(i => Number(i)):[] + state.checkDevelopList = res.data.develop ? res.data.develop.split(',').map(i => Number(i)):[] + state.checkTeamWorkList = res.data.teamWork ? res.data.teamWork.split(',').map(i => Number(i)):[] + state.checkQualificationList = res.data.qualification ? res.data.qualification.split(',').map(i => Number(i)):[] + state.checkProductList = res.data.product ? res.data.product.split(',').map(i => Number(i)):[] + }else { + ElMessage.warning(res.message) + } +} +const onSubmit = async () => { + const valid = await busRef.value.validate(); + if(valid){ + if(title.value === '编辑'){ + const {...data} = JSON.parse(JSON.stringify(state.form)) + const res = await editQuality(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '编辑成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + } + } +} +const getPeopleList = async ()=> { + const queryParams = { + pageNum: 1, + pageSize: 9999, + companyId: state.form.companyId + } + const res = await getUser(queryParams) + if(res.code == 200){ + state.peopleList = res.data.list?res.data.list:[] + }else{ + ElMessage.warning(res.message) + } +}; +const changeCheck = (type) => { + switch (type) { + case 'trait': state.form.trait = state.checkTraitList.join(','); break; + case 'facility': state.form.facility = state.checkFacilityList.join(','); break; + case 'craft': state.form.craft = state.checkCraftList.join(','); break; + case 'develop': state.form.develop = state.checkDevelopList.join(','); break; + case 'teamWork': state.form.teamWork = state.checkTeamWorkList.join(','); break; + case 'qualification': state.form.qualification = state.checkQualificationList.join(','); if(!state.checkQualificationList.includes(8))state.form.otherQualifi = '' ;break; + case 'product': state.form.product = state.checkProductList.join(',');if(!state.checkProductList.includes(5))state.form.otherProduct = ''; break; + } + +} +const handleClose = () => { + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + emit("getList") + +} +const reset = () => { + state.form = { + id: '', + companyId: null, + supplierName: '', + supplierType: '', + user: '', + phone: '', + emil: '', + merito: '', + content: '', + } + state.companyList = [] +} +defineExpose({ + openDialog +}); + +</script> + +<style scoped lang="scss"> +.notice{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } + :deep(.el-checkbox-group) { + flex: 0 0 75%; + box-sizing: border-box; + padding: 5px 10px 5px 0; /* 上下间距+右侧留空 */ + margin-right: 0; + white-space: normal; /* 允许文本换行 */ + } + .custom-checkbox-group{ + display: flex; + flex-wrap: wrap; + align-items: center; /* 垂直居中 */ + + } + +} +</style> diff --git a/src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue b/src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue index f74e352..d318110 100644 --- a/src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue +++ b/src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue @@ -19,11 +19,14 @@ </el-option> </el-select> </el-form-item> - <el-form-item label="供应商名称:" prop="supplierName" > + <el-form-item label="供货单位:" prop="supplierName" > <el-input v-model="state.form.supplierName" :disabled="title === '查看'"/> </el-form-item> - <el-form-item label="供应商类型:" prop="supplierType" > - <el-input v-model="state.form.supplierType" :disabled="title === '查看'"/> + <el-form-item label="地址:" prop="supplierAddr" > + <el-input v-model="state.form.supplierAddr" :disabled="title === '查看'"/> + </el-form-item> + <el-form-item label="供应品名称:" prop="merito" > + <el-input v-model="state.form.merito" :disabled="title === '查看'"/> </el-form-item> <el-form-item label="联系人:" prop="user" > <el-input v-model="state.form.user" :disabled="title === '查看'"/> @@ -31,14 +34,8 @@ <el-form-item label="联系电话:" prop="phone" > <el-input v-model="state.form.phone" :disabled="title === '查看'"/> </el-form-item> - <el-form-item label="邮箱:" prop="emil" > - <el-input v-model="state.form.emil" :disabled="title === '查看'"/> - </el-form-item> - <el-form-item label="主营产品:" prop="merito" > - <el-input v-model="state.form.merito" :disabled="title === '查看'"/> - </el-form-item> - <el-form-item label="服务内容:" prop="content" > - <el-input v-model="state.form.content" :disabled="title === '查看'"/> + <el-form-item label="备注:" prop="remark" > + <el-input v-model="state.form.remark" :disabled="title === '查看'"/> </el-form-item> </el-form> <template #footer v-if="title !== '查看'"> @@ -78,38 +75,25 @@ } } } -const validateEmail = (rule, value, callback)=>{ - if(value === ''){ - callback(new Error('请输入邮箱')) - }else{ - if(!validEmail(value)){ - callback(new Error('邮箱格式有误')) - }else{ - callback() - } - } -} + const state = reactive({ form: { id: '', companyId: null, supplierName: '', - supplierType: '', + supplierAddr: '', user: '', phone: '', - emil: '', merito: '', - content: '', + remark: '', }, formRules:{ companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], supplierName: [{ required: true, message: '请输入供应商名称', trigger: 'blur' }], - supplierType:[{ required: true, message: '请输入供应商类型', trigger: 'blur' }], + supplierAddr:[{ required: true, message: '请输入地址', trigger: 'blur' }], user: [{ required: true, message: '请输入联系人', trigger: 'blur' }], phone: [{ required: true, validator: validatePhone, trigger: 'blur' }], - emil: [{ required: true, validator: validateEmail, trigger: 'blur' }], merito: [{ required: true, message: '请输入主营产品', trigger: 'blur' }], - content: [{ required: true, message: '请输入服务内容', trigger: 'blur' }], }, isAdmin: false, companyList: [] @@ -190,12 +174,11 @@ id: '', companyId: null, supplierName: '', - supplierType: '', + supplierAddr: '', user: '', phone: '', - emil: '', merito: '', - content: '', + remark: '', } state.companyList = [] } diff --git a/src/views/work/qualityInfo/supplierQuality/supplierList/index.vue b/src/views/work/qualityInfo/supplierQuality/supplierList/index.vue index f36fce3..74da243 100644 --- a/src/views/work/qualityInfo/supplierQuality/supplierList/index.vue +++ b/src/views/work/qualityInfo/supplierQuality/supplierList/index.vue @@ -24,19 +24,43 @@ <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button> <el-button plain @click="reset">重置</el-button> </el-form-item> + <el-form-item style="margin-left: 15px"> + <el-button + type="primary" + @click="exportData" + >导出</el-button> + </el-form-item> </el-form> </div> <!-- 表格数据 --> <el-table v-loading="loading" :data="dataList" :border="true" @selection-change="handleSelectionChange"> <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> - <el-table-column label="供应商名称" prop="supplierName" align="center" /> - <el-table-column label="供应商类型" prop="supplierType" align="center" /> + <el-table-column label="供货单位" prop="supplierName" align="center" /> + <el-table-column label="地址" prop="supplierAddr" align="center" /> + <el-table-column label="供应品名称" prop="merito" align="center" /> <el-table-column label="联系人" prop="user" align="center" /> <el-table-column label="联系电话" prop="phone" align="center" /> - <el-table-column label="邮箱" prop="emil" align="center" /> - <el-table-column label="主营产品" prop="merito" align="center" /> - <el-table-column label="服务内容" prop="content" align="center" /> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <el-table-column label="备注" prop="remark" align="center" /> + <el-table-column label="业绩评定表" align="center" class-name="small-padding fixed-width" width="160" > + <template #default="scope"> + <el-button link type="primary" @click="openPerformance('review',scope.row)">查看</el-button> + <el-button link type="primary" @click="openPerformance('edit',scope.row)">编辑</el-button> + <el-button link type="primary" @click = 'exportPerformance(scope.row)'>导出</el-button> + </template> + </el-table-column> + <el-table-column label="质量保证能力调查表" align="center" class-name="small-padding fixed-width" width="160" > + <template #default="scope"> + <el-button link type="primary" @click="openQuality('review',scope.row)">查看</el-button> + <el-button link type="primary" @click="openQuality('edit',scope.row)">编辑</el-button> + <el-button link type="primary" @click = 'exportQuality(scope.row)'>导出</el-button> + </template> + </el-table-column> + <el-table-column label="证书" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openCert('review',scope.row)">查看</el-button> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160" > <template #default="scope"> <el-button link type="primary" @click="openDialog('review',scope.row)" >查看</el-button> <el-button link type="primary" @click="openDialog('edit',scope.row)" >编辑</el-button> @@ -57,22 +81,31 @@ /> </div> <supplierDialog ref="noticeRef" @getList = "getList"></supplierDialog> + <performanceTable ref="performanceRef" @getList = "getList"></performanceTable> + <qualityDialog ref="qualityRef" @getList = "getList"></qualityDialog> + <certDialog ref="certRef" @getList = "getList"></certDialog> </div> </template> <script setup> import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue"; import supplierDialog from "./components/supplierDialog.vue" +import performanceTable from './components/performanceTableDialog.vue' +import qualityDialog from './components/qualityDialog.vue' +import certDialog from './components/certDialog.vue' import {ElMessage, ElMessageBox} from "element-plus"; import {getCompany} from "@/api/onlineEducation/company"; import Cookies from "js-cookie"; import {generateWordDocument} from "@/utils/exportWord"; import {delBasic, getBasic} from "@/api/companyInfo/basicInfo"; -import {delSupplier, getSupplierPage} from "@/api/supplier/supplierList"; - +import {delSupplierById, getPerformance, getQuality, getSupplierPage} from "@/api/supplier/supplierList"; const { proxy } = getCurrentInstance(); const loading = ref(false); const noticeRef = ref(); +const performanceRef = ref(); +const qualityRef = ref(); +const certRef = ref(); + const loadingCompany = ref(false) const choosedData = ref([]) const data = reactive({ @@ -82,7 +115,155 @@ companyId: null, }, companyList: [], - isAdmin: false + isAdmin: false, + verifyList:[{id: 1,label: '现场验证'},{id: 2,label: '入库验证'},{id: 3,label: '供方货源处验证'},], + opinionList:[{id: 1,label: '保留(≥80)'},{id: 2,label: '暂停,整改后再评价(≥65)'},{id: 3,label: '剔除(<65)'},], + traitList:[ + { + id: 1, + name: '成批生产' + }, + { + id: 2, + name: '流水线生产' + }, + { + id: 3, + name: '单台生产' + }, + { + id: 4, + name: '其他' + }, + ], + facilityList:[ + { + id: 1, + name: '齐全、良好' + }, + { + id: 2, + name: '基本齐全、尚可' + }, + { + id: 3, + name: '不全' + }, + { + id: 4, + name: '代理商' + }, + ], + craftList:[ + { + id: 1, + name: '齐备' + }, + { + id: 2, + name: '有一部分' + }, + { + id: 3, + name: '没有' + }, + { + id: 4, + name: '代理商' + }, + ], + developList:[ + { + id: 1, + name: '能自行设计开发新品' + }, + { + id: 2, + name: '只能开发简单产品' + }, + { + id: 3, + name: '没有自行开发能力,代理商' + }, + ], + teamWorkList:[ + { + id: 1, + name: '是外资企业' + }, + { + id: 2, + name: '是合资企业' + }, + { + id: 3, + name: '给企业提供产品' + }, + { + id: 4, + name: '无对外合作经验' + }, + { + id: 5, + name: '有对外合作经验,但不经常发生' + }, + ], + qualificationList:[ + { + id: 1, + name: '营业执照' + }, + { + id: 2, + name: '有效期内' + }, + { + id: 3, + name: '有效期外' + }, + { + id: 4, + name: '高新技术企业' + }, + { + id: 5, + name: '有效期内' + }, + { + id: 6, + name: '有效期外' + }, + { + id: 7, + name: '资质代理商' + }, + { + id: 8, + name: '其他资质情况:' + }, + ], + productList:[ + { + id: 1, + name: '通过产品认证' + }, + { + id: 2, + name: '没有产品认证' + }, + { + id: 3, + name: '通过质量体系认证' + }, + { + id: 4, + name: '没有体系认证' + }, + { + id: 5, + name: '其他认证(请指出具体内容):' + }, + ] }); const dataList = ref([]); const total = ref(0); @@ -102,6 +283,8 @@ if(data.isAdmin){ getCompanyList() } + + }); const getList = async () => { loading.value = true; @@ -112,7 +295,7 @@ }else{ ElMessage.warning(res.message) } - loading.value = false; + loading.value = false } const searchClick = () => { @@ -120,6 +303,15 @@ } const openDialog = (type, value) => { noticeRef.value.openDialog(type, value,data.companyList); +} +const openPerformance = (type, value) => { + performanceRef.value.openDialog(type, value); +} +const openQuality = (type,value) => { + qualityRef.value.openDialog(type, value); +} +const openCert = (type,value) => { + certRef.value.openDialog(type, value); } const selectValue = (val) => { data.companyList.forEach(item => { @@ -179,7 +371,7 @@ type: 'warning', }) .then( async() => { - const res = await delSupplier(val.id); + const res = await delSupplierById(val.id); if(res.code === 200){ ElMessage({ type: 'success', @@ -191,7 +383,269 @@ } }) } +const qualityPath = ref('/qualityExample.docx') +const exportQuality = async (val) => { + let state = {} + const param = { + supplierSureId: val.id + } + const res = await getQuality(param) + if(res.code == 200){ + state = res.data + state.productName = val.merito + if(state.otherQualifi){ + data.qualificationList.forEach((item) => { + if(item.id == 8){ + item.name = item.name+ state.otherQualifi + } + }) + } + if(state.otherProduct){ + data.productList.forEach((item) => { + if(item.id == 5){ + item.name = item.name+ state.otherProduct + } + }) + } + await handleCheckData(res.data) + state.traitList = data.traitList + state.facilityList = data.facilityList + state.craftList = data.craftList + const teamWorkData = formatCheckboxData(data.teamWorkList) + state.teamWorkList = teamWorkData + const developData = formatCheckboxData(data.developList) + state.developList = developData + const qualificationData = formatCheckboxData(data.qualificationList,'quality') + state.qualificationList = qualificationData + const productData = formatCheckboxData(data.productList) + state.productList = productData + state.chargeTime = state.chargeTime?state.chargeTime.substring(0,10):'' + try { + generateWordDocument(qualityPath.value, state, val.supplierName+'_供方质量保证能力调查表.docx'); + await setTableData() + } catch (error){ + ElMessage({ + type: 'warning', + message: '导出失败' + }); + } + }else{ + ElMessage.warning(res.message) + } +} +function formatCheckboxData(items,type) { + return items.reduce((rows, item, index) => { + if(type == 'quality'){ + if (index % 3 === 0) { + // 创建新行,添加第一个复选框 + rows.push({ check1: item }); + } else if (index % 3 === 1 && rows.length > 0) { + // 向当前行添加第二个复选框 + const currentRow = rows[rows.length - 1]; + currentRow.check2 = item; + } else if (index % 3 === 2 && rows.length > 0) { + // 向当前行添加第三个复选框 + const currentRow = rows[rows.length - 1]; + currentRow.check3 = item; + } + }else{ + if (index % 2 === 0) { + // 创建新行,添加第一个复选框 + rows.push({ check1: item }); + } else { + // 向最后一行添加第二个复选框 + const lastRow = rows[rows.length - 1]; + lastRow.check2 = item; + } + } + return rows; + }, []); +} +const handleCheckData = (val) =>{ + const idSetTrait = new Set(val.trait.split(',').map((i => Number(i)))) + data.traitList.forEach(item => { + if (idSetTrait.has(item.id)) { + item.checked = true; + } + }); + const idSetFacility = new Set(val.facility.split(',').map((i => Number(i)))) + data.facilityList.forEach(item => { + if (idSetFacility.has(item.id)) { + item.checked = true; + } + }); + const idSetCraft = new Set(val.craft.split(',').map((i => Number(i)))) + data.craftList.forEach(item => { + if (idSetCraft.has(item.id)) { + item.checked = true; + } + }); + const idSetDevelop = new Set(val.develop.split(',').map((i => Number(i)))) + data.developList.forEach(item => { + if (idSetDevelop.has(item.id)) { + item.checked = true; + } + }); + const idSetTeamWork = new Set(val.teamWork.split(',').map((i => Number(i)))) + data.teamWorkList.forEach(item => { + if (idSetTeamWork.has(item.id)) { + item.checked = true; + } + }); + const idSetQualification = new Set(val.qualification.split(',').map((i => Number(i)))) + data.qualificationList.forEach(item => { + if (idSetQualification.has(item.id)) { + item.checked = true; + } + }); + const idSetProduct = new Set(val.product.split(',').map((i => Number(i)))) + data.productList.forEach(item => { + if (idSetProduct.has(item.id)) { + item.checked = true; + } + }); +} + + + + + +const performancePath = ref('/performanceExample.docx') +const exportPerformance = async (val) => { + let state = {} + const param = { + supplierSureId: val.id + } + const res = await getPerformance(param) + if(res.code == 200){ + // if(!res.data.p1){ + // ElMessage.warning('暂无数据!') + // return + // } + state = res.data + state.tableData = [{name: '产品质量 p1', good: '', fine: '', middle: '', bad: ''}, + {name: '交货期 p2', good: '', fine: '', middle: '', bad: ''}, + {name: '履约能力 p3', good: '', fine: '', middle: '', bad: ''}, + {name: '价格 p4', good: '', fine: '', middle: '', bad: ''}, + {name: '售后服务 p5', good: '', fine: '', middle: '', bad: ''}, + {name: '资历 p6', good: '', fine: '', middle: '', bad: ''}, + ] + //更新表格字段名 + const p1Field = getMatchedField(res.data.p1) + if(p1Field){ + state.tableData[0][p1Field] = res.data.p1 + } + const p2Field = getMatchedField(res.data.p2) + if(p2Field){ + state.tableData[1][p2Field] = res.data.p2 + } + const p3Field = getMatchedField(res.data.p3) + if(p3Field){ + state.tableData[2][p3Field] = res.data.p3 + } + const p4Field = getMatchedField(res.data.p4) + if(p4Field){ + state.tableData[3][p4Field] = res.data.p4 + } + const p5Field = getMatchedField(res.data.p5) + if(p5Field){ + state.tableData[4][p5Field] = res.data.p5 + } + const p6Field = getMatchedField(res.data.p6) + if(p6Field){ + state.tableData[5][p6Field] = res.data.p6 + } + const sum = res.data.p1+res.data.p2+res.data.p3+res.data.p4+res.data.p5+res.data.p6 + state.tableData = state.tableData.map((i,index) => { + return { + ...i, + list: [{ + first: index == 0, + conclusion:'Σ(Pi)/6 ='+(sum/6).toFixed(2) + }] + } + }) + data.verifyList.forEach(i => { + i.checked = i.id != state.verify + }) + state.verifyList = data.verifyList + data.opinionList.forEach(i => { + i.checked = i.id != state.opinion + }) + state.opinionList = data.opinionList + state.reviewTime = state.reviewTime?state.reviewTime.substring(0,10):'' + state.checkTime = state.checkTime?state.checkTime.substring(0,10):'' + }else{ + ElMessage.warning(res.message) + } + try { + generateWordDocument(performancePath.value, state, val.supplierName+'_业绩评定表.docx'); + } catch (error){ + ElMessage({ + type: 'warning', + message: '导出失败' + }); + } + +} +const demo = ref([ + { + rage: '86-100', + field: 'good' + }, + { + rage: '71-85', + field: 'fine' + }, + { + rage: '60-70', + field: 'middle' + }, + { + rage: '0-59', + field: 'bad' + }, +]) +const getMatchedField = (num) => { + for (const item of demo.value) { + const [min, max] = item.rage.split('-').map(Number); + if (num >= min && num <= max) { + return item.field; // 返回匹配的字段名(如 "good") + } + } + return null; // 无匹配时返回 null +} +const exportData = () => { + startGeneration() +} +const templatePath = ref('/supplierExample.docx') +const startGeneration = async () => { + const supplierList = {} + supplierList.tableData = dataList.value.map((item,index) => { + return{ + ...item, + num: index+1 + } + }) + try { + generateWordDocument(templatePath.value, supplierList, '合格供方名录.docx'); + } catch (error){ + ElMessage({ + type: 'warning', + message: '导出失败' + }); + } +} +const setTableData = () => { + data.traitList=[{id: 1, name: '成批生产'}, {id: 2, name: '流水线生产'}, {id: 3, name: '单台生产'}, {id: 4, name: '其他'},] + data.facilityList=[{id: 1, name: '齐全、良好'}, {id: 2, name: '基本齐全、尚可'}, {id: 3, name: '不全'}, {id: 4, name: '代理商'},] + data.craftList=[{id: 1, name: '齐备'}, {id: 2, name: '有一部分'}, {id: 3, name: '没有'}, {id: 4, name: '代理商'},] + data.developList=[{id: 1, name: '能自行设计开发新品'}, {id: 2, name: '只能开发简单产品'}, {id: 3, name: '没有自行开发能力,代理商'},] + data.teamWorkList=[{id: 1, name: '是外资企业'}, {id: 2, name: '是合资企业'}, {id: 3, name: '给企业提供产品'}, {id: 4, name: '无对外合作经验'}, {id: 5, name: '有对外合作经验,但不经常发生'},] + data.qualificationList=[{id: 1, name: '营业执照'}, {id: 2, name: '有效期内'}, {id: 3, name: '有效期外'}, {id: 4, name: '高新技术企业'}, {id: 5, name: '有效期内'}, {id: 6, name: '有效期外'}, {id: 7, name: '资质代理商'}, {id: 8, name: '其他资质情况:'},] + data.productList=[{id: 1, name: '通过产品认证'}, {id: 2, name: '没有产品认证'}, {id: 3, name: '通过质量体系认证'}, {id: 4, name: '没有体系认证'}, {id: 5, name: '其他认证(请指出具体内容):'},] +} </script> <style lang="scss"> .pag-container{ -- Gitblit v1.9.2