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