From b1fa82e418973b910f9fe04f9afde02d14ea043e Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: Mon, 29 Sep 2025 15:02:49 +0800
Subject: [PATCH] 修改

---
 src/views/work/qualityManage/qualityInformationPage/internal/index.vue                                   |  235 +++
 src/views/build/conpanyFunctionConsult/riskManage/control/components/editDialog.vue                      |    4 
 src/views/work/procurementPlatform/warehouseManagement/monthlyInspectionRecord/components/editDialog.vue |   20 
 src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue        |    2 
 src/views/work/qualityManage/qualityInformationPage/external/components/editDialog.vue                   |  364 +++++
 src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue                           |    2 
 src/api/performanceAppraisal/index.js                                                                    |   34 
 public/continuousImprovementExample.docx                                                                 |    0 
 src/views/work/qualityManage/performanceAppraisal/components/editDialog.vue                              |  594 ++++++++
 src/views/build/conpanyFunctionConsult/riskManage/record/components/editDialog.vue                       |    4 
 src/api/internal/need.js                                                                                 |   34 
 src/views/build/conpanyFunctionConsult/need/needIdentify/components/editDialog.vue                       |    2 
 public/internalExample.docx                                                                              |    0 
 src/views/work/qualityManage/qualityInformationPage/internal/components/editDialog.vue                   |  541 +++++++
 src/views/work/financialMng/qualityFinancialAnalysis/components/editDialog.vue                           |  474 ++++++
 src/views/work/qualityManage/performanceAppraisal/index.vue                                              |  281 +++
 src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue            |    2 
 src/views/work/marketingManagement/customerList/need/components/editDialog.vue                           |   14 
 src/views/work/qualityManage/continuousImprovement/components/editDialog.vue                             |  449 ++++++
 src/views/work/qualityManage/continuousImprovement/index.vue                                             |  297 ++++
 public/performanceAppraisalExample.docx                                                                  |    0 
 src/views/work/financialMng/qualityFinancialAnalysis/index.vue                                           |  587 ++++++++
 public/externalExample.docx                                                                              |    0 
 public/qualityFinancialAnalysisExample.docx                                                              |    0 
 src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue        |    2 
 src/views/work/qualityManage/qualityInformationPage/external/index.vue                                   |  235 +++
 package.json                                                                                             |    8 
 src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue              |    2 
 src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue         |    2 
 src/api/external/index.js                                                                                |   34 
 30 files changed, 4,194 insertions(+), 29 deletions(-)

diff --git a/package.json b/package.json
index fcb5339..0884c4d 100644
--- a/package.json
+++ b/package.json
@@ -24,16 +24,22 @@
     "@wangeditor/plugin-upload-attachment": "^1.1.0",
     "angular-expressions": "^1.5.0",
     "axios": "0.27.2",
+    "buffer": "^6.0.3",
+    "docx": "^9.5.1",
     "docx-preview": "^0.3.5",
+    "docx-templates": "^4.14.1",
     "docxtemplater": "^3.65.1",
     "docxtemplater-image-module-free": "^1.1.1",
     "echarts": "5.4.0",
     "element-plus": "2.2.27",
-    "file-saver": "2.0.5",
+    "file-saver": "^2.0.5",
+    "fs-extra": "^11.3.0",
     "fuse.js": "6.6.2",
+    "html-docx-js": "^0.3.1",
     "html2canvas": "^1.4.1",
     "js-base64": "^3.7.5",
     "js-cookie": "3.0.1",
+    "jsdom": "^27.0.0",
     "jsencrypt": "3.3.1",
     "jspdf": "^3.0.1",
     "jszip-utils": "^0.1.0",
diff --git a/public/continuousImprovementExample.docx b/public/continuousImprovementExample.docx
new file mode 100644
index 0000000..0f8c346
--- /dev/null
+++ b/public/continuousImprovementExample.docx
Binary files differ
diff --git a/public/externalExample.docx b/public/externalExample.docx
new file mode 100644
index 0000000..209ed84
--- /dev/null
+++ b/public/externalExample.docx
Binary files differ
diff --git a/public/internalExample.docx b/public/internalExample.docx
new file mode 100644
index 0000000..65bdf3d
--- /dev/null
+++ b/public/internalExample.docx
Binary files differ
diff --git a/public/performanceAppraisalExample.docx b/public/performanceAppraisalExample.docx
new file mode 100644
index 0000000..ab9e9fe
--- /dev/null
+++ b/public/performanceAppraisalExample.docx
Binary files differ
diff --git a/public/qualityFinancialAnalysisExample.docx b/public/qualityFinancialAnalysisExample.docx
new file mode 100644
index 0000000..257e67c
--- /dev/null
+++ b/public/qualityFinancialAnalysisExample.docx
Binary files differ
diff --git a/src/api/external/index.js b/src/api/external/index.js
new file mode 100644
index 0000000..016afe8
--- /dev/null
+++ b/src/api/external/index.js
@@ -0,0 +1,34 @@
+import request from "@/utils/request";
+
+export function getEnternal(params) {
+    return request({
+        url: '/quality/information/exterior/list',
+        method: 'get',
+        params: params
+    })
+}
+
+
+export function addEnternal(data) {
+    return request({
+        url: '/quality/information/exterior/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editEnternal(params) {
+    return request({
+        url: `/quality/information/exterior/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delEnternal(data) {
+    return request({
+        url: `/quality/information/exterior/deleted?exteriorId=${data}`,
+        method: 'get'
+    })
+}
+
diff --git a/src/api/internal/need.js b/src/api/internal/need.js
new file mode 100644
index 0000000..903878f
--- /dev/null
+++ b/src/api/internal/need.js
@@ -0,0 +1,34 @@
+import request from "@/utils/request";
+
+export function getInternal(params) {
+    return request({
+        url: '/quality/information/inside/list',
+        method: 'get',
+        params: params
+    })
+}
+
+
+export function addInternal(data) {
+    return request({
+        url: '/quality/information/inside/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editInternal(params) {
+    return request({
+        url: `/quality/information/inside/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delInternal(data) {
+    return request({
+        url: `/quality/information/inside/deleted?insideId=${data}`,
+        method: 'get'
+    })
+}
+
diff --git a/src/api/performanceAppraisal/index.js b/src/api/performanceAppraisal/index.js
new file mode 100644
index 0000000..1f20135
--- /dev/null
+++ b/src/api/performanceAppraisal/index.js
@@ -0,0 +1,34 @@
+import request from "@/utils/request";
+
+export function getEvaluation(params) {
+    return request({
+        url: '/performance/evaluation/list',
+        method: 'get',
+        params: params
+    })
+}
+
+
+export function addEvaluation(data) {
+    return request({
+        url: '/performance/evaluation/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editEvaluation(params) {
+    return request({
+        url: `/performance/evaluation/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delEvaluation(data) {
+    return request({
+        url: `/performance/evaluation/deleted?evaluationId=${data}`,
+        method: 'get'
+    })
+}
+
diff --git a/src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue
index 9762eac..269267a 100644
--- a/src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="900px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
diff --git a/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue
index 797d866..2dc0c60 100644
--- a/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="900px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
diff --git a/src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue
index 7df5408..6416380 100644
--- a/src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="900px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
diff --git a/src/views/build/conpanyFunctionConsult/need/needIdentify/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/need/needIdentify/components/editDialog.vue
index 15d9c3c..3ef6053 100644
--- a/src/views/build/conpanyFunctionConsult/need/needIdentify/components/editDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/need/needIdentify/components/editDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="900px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue
index f9085ba..186bb25 100644
--- a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="900px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue
index e262473..b8add55 100644
--- a/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="900px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue
index 3e55bd9..8d467be 100644
--- a/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="900px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
diff --git a/src/views/build/conpanyFunctionConsult/riskManage/control/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/riskManage/control/components/editDialog.vue
index 3f17d50..1516904 100644
--- a/src/views/build/conpanyFunctionConsult/riskManage/control/components/editDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/riskManage/control/components/editDialog.vue
@@ -3,12 +3,12 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="1220px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
     >
-      <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules"  label-position="right" label-width="130">
+      <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules"  label-position="top" label-width="130">
         <el-row :gutter="24">
           <el-col :span="24">
             <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
diff --git a/src/views/build/conpanyFunctionConsult/riskManage/record/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/riskManage/record/components/editDialog.vue
index b6ae8c2..eb236ca 100644
--- a/src/views/build/conpanyFunctionConsult/riskManage/record/components/editDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/riskManage/record/components/editDialog.vue
@@ -3,12 +3,12 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="50%"
+        width="1250px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
     >
-      <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules"  label-position="right" label-width="130">
+      <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules"  label-position="top" label-width="130">
         <el-row :gutter="24">
           <el-col :span="24">
             <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
diff --git a/src/views/work/financialMng/qualityFinancialAnalysis/components/editDialog.vue b/src/views/work/financialMng/qualityFinancialAnalysis/components/editDialog.vue
new file mode 100644
index 0000000..7bbd541
--- /dev/null
+++ b/src/views/work/financialMng/qualityFinancialAnalysis/components/editDialog.vue
@@ -0,0 +1,474 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="750px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules" label-position="top" label-width="120px" >
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="年份:" prop="year" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.year"
+                  filterable
+                  allow-create
+                  default-first-option
+                  :reserve-keyword="false"
+                  placeholder="请选择年份"
+                  @change="handleChangeNum"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="item in state.yearList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.label"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="一 、基本情况:" prop="method" >
+              <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="二 、综合分析:" v-if="showEditor"  required>
+              <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.form.policy" ></t-editor>
+            </el-form-item>
+            <el-form-item label="二 、综合分析:" v-else>
+              <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" >
+                <div class="ql-editor">
+                  <div class="reviewTable" v-html="state.form.policy"  @click="showFile($event)"></div>
+                </div>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="三 、内外部损失:" prop="method" >
+              <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="四 、纠正措施:" prop="method" >
+              <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="五 、分析的结果:" prop="method" >
+              <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="六 、改进建议:" prop="method" >
+              <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="部门:" prop="leadId" >
+              <el-select clearable v-model="state.form.leadId" :disabled="title =='查看'" filterable  style="width: 100%">
+                <el-option
+                    v-for="item in state.userList"
+                    :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="leadTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.leadTime"
+                  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 {onMounted, reactive, ref, toRefs} from 'vue'
+import Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {addObjective, editObject, getDept} from "@/api/qualityObjectives/object";
+import {listUser} from "@/api/system/user";
+import TEditor from "@/components/Tinymce/Tinymce.vue";
+import axios from "axios";
+import {getToken} from "@/utils/auth";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const toolbar = ref('  undo redo | table')
+const myEditor = ref();
+const showEditor = ref(true);
+const state = reactive({
+  form: {
+    id: '',
+    year: '',
+    num: '',
+    type: '',
+    departId: '',
+    method: '',
+    compilationId:'',
+    compilationTime:'',
+    qualityId: '',
+    qualityTime:'',
+    leadId:'',
+    leadTime: '',
+    qualityTargets:[],
+
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    year: [{ required: true, message: '请输入年份', trigger: 'blur' }],
+    num: [{ required: true, message: '请输入序号', trigger: 'blur' }],
+    type: [{ required: true, message: '请选择级别', trigger: 'blur' }],
+    method: [{ required: true, message: '请输入目标测量方法', trigger: 'blur' }],
+    compilationId: [{ required: true, message: '请选择编制人员', trigger: 'blur' }],
+    compilationTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    qualityId: [{ required: true, message: '请选择质量管理部人员', trigger: 'blur' }],
+    qualityTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    leadId: [{ required: true, message: '请选择公司分管领导', trigger: 'blur' }],
+    leadTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    departId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+    objName: [{required: true, message: "质量目标不能为空", trigger: "blur"}],
+  },
+  isAdmin: false,
+  companyList: [],
+  deptList: [],
+  peopleList: [],
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+  levelList: [
+    {
+      value: 1,
+      label: '公司级'
+    },
+    {
+      value: 2,
+      label: '部门级'
+    },
+  ]
+})
+
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.companyList = companyList
+    state.form.companyId = null
+  }
+  showEditor.value = false
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    state.form.compilationBy = state.form.compilationId
+    state.form.leadBy = state.form.leadId
+    state.form.qualityBy = state.form.qualityId
+
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  if(type === 'review') {
+    showEditor.value = false
+  }
+  if(type === 'edit' || type === 'add') {
+    showEditor.value = true;
+  }
+  await getDeptList()
+  await   getPeopleList()
+  dialogVisible.value = true;
+}
+const addObject = () => {
+  state.form.qualityTargets.push({})
+}
+const getDeptList = async () => {
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const onSubmit = async () => {
+  state.form.policy = tinyMCE.activeEditor.getContent();
+console.log('1',state.form.policy)
+  const valid = await busRef.value.validate()
+  if(valid){
+    // if(title.value === '新增'){
+    //   console.log('sta',state.form)
+    //   const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+    //   const res = await addObjective(data)
+    //   if(res.code === 200){
+    //     ElMessage({
+    //       type: 'success',
+    //       message: '新增成功'
+    //     });
+    //   }else{
+    //     ElMessage.warning(res.message)
+    //   }
+    //   emit("getList")
+    //   busRef.value.clearValidate();
+    //   reset();
+    //   dialogVisible.value = false;
+    // }else if(title.value === '编辑'){
+    //   const {...data} = JSON.parse(JSON.stringify(state.form))
+    //   if(data.qualityTargets && data.qualityTargets.length == 0){
+    //     ElMessage.warning('请填写质量目标')
+    //     return
+    //   }
+    //   const res = await editObject(data)
+    //   if(res.code === 200){
+    //     ElMessage({
+    //       type: 'success',
+    //       message: '编辑成功'
+    //     });
+    //   }else{
+    //     ElMessage.warning(res.message)
+    //   }
+    //   emit("getList")
+    //   busRef.value.clearValidate();
+    //   reset();
+    //   dialogVisible.value = false;
+    // }
+  }
+}
+
+const handleClose = () => {
+  busRef.value.clearValidate();
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+
+}
+const reset = () => {
+  state.form = {
+    id: '',
+    year: '',
+    num: '',
+    type: '',
+    departId: '',
+    method: '',
+    compilationBy:'',
+    compilationTime:'',
+    qualityBy: '',
+    qualityTime:'',
+    leadBy:'',
+    leadTime: '',
+    qualityTargets:[],
+  }
+  state.peopleList = []
+  state.companyList = []
+
+}
+const handleDelete = (val) => {
+  state.form.qualityTargets = state.form.qualityTargets.filter(item=> item != val)
+}
+
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 9999,
+    companyId: state.form.companyId
+  }
+  const res = await getUser(queryParams)
+  if(res.code == 200){
+    state.userList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+
+const selectValue = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.compilationBy = item.id
+    }
+  })
+}
+
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+const selectValueCom = (val) => {
+  state.form.leadId = null
+  state.form.qualityId = null
+  state.form.compilationId = null
+  state.form.leadName = null
+  state.form.qualityName = null
+  state.form.compilationName = null
+  state.form.departId = null
+  state.companyList.forEach(item => {
+    if(item.id === val){
+      state.form.companyName = item.name
+    }
+  })
+  getDeptList()
+  getPeopleList()
+}
+const changeLevel = () => {
+  // state.form.companyName = ''
+  state.form.departId = null
+}
+const getCompanyList = async (val)=>{
+  if(val){
+    const queryParams = {
+      name: val
+    }
+    const res = await getCompany(queryParams)
+    if (res.code == 200) {
+      state.companyList = res.data.list
+
+    } else {
+      ElMessage.warning(res.message)
+    }
+  }else {
+    const queryParams = {
+      pageSize: 999,
+      pageNum: 1,
+    }
+    const res = await getCompany(queryParams)
+    if (res.code == 200) {
+      state.companyList = res.data.list
+    } else {
+      ElMessage.warning(res.message)
+    }
+  }
+}
+const showFile = (e) => {
+  if(e.target.nodeName === 'A'){
+    console.log("e",e)
+    e.preventDefault();
+    const file = {
+      fileUrl: e.target.href,
+      fileName: e.target.innerHTML
+    }
+    axios.get( file.fileUrl,{
+          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", file.fileName);
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+      } else {
+        this.$message.error('获取文件失败')
+      }
+      // handleClose();
+    })
+  }
+}
+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/financialMng/qualityFinancialAnalysis/index.vue b/src/views/work/financialMng/qualityFinancialAnalysis/index.vue
new file mode 100644
index 0000000..9f0f77c
--- /dev/null
+++ b/src/views/work/financialMng/qualityFinancialAnalysis/index.vue
@@ -0,0 +1,587 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份:" style="margin-left: 20px">
+          <!--            <el-input v-model="data.queryParams.year" placeholder="请输入年份"></el-input>-->
+          <el-select
+              v-model="data.queryParams.year"
+              placeholder="请选择年份"
+              style="width: 240px"
+              filterable
+              allow-create
+              default-first-option
+              :reserve-keyword="false"
+              @change="handleChangeNum"
+          >
+            <el-option
+                v-for="item in data.yearList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.label"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <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="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="名称" prop="year" align="center"  >
+        <template #default="scope">
+          <span>年质量经济性分析报告</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="目标测量方法" prop="method" 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="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('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>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delObject, getObjectPage} from "@/api/qualityObjectives/object";
+import { Document, Paragraph, TextRun, Table, TableRow, TableCell,BorderStyle , Packer, AlignmentType, HeadingLevel } from "docx";
+import { saveAs } from "file-saver";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null,
+    year: '',
+    type: ''
+  },
+  companyList: [],
+  isAdmin: false,
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+  levelList: [
+    {
+      value: 1,
+      label: '公司级'
+    },
+    {
+      value: 2,
+      label: '部门级'
+    },
+  ]
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  // loading.value = true;
+  // const res = await getObjectPage(data.queryParams);
+  // if(res.code === 200){
+  //   dataList.value = res.data.list
+  //   total.value = res.data.total
+  // }else{
+  //   ElMessage.warning(res.message)
+  // }
+  // loading.value = false;
+  dataList.value = [{}]
+
+}
+
+const searchClick = () => {
+  getList();
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    // data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+
+const templatePath = ref('/qualityFinancialAnalysisExample.docx')
+const startGeneration = async () => {
+  let name = ''
+  choosedData.value.forEach(item => {
+    // 执行导出
+    createQualityEconomicReport(item).catch(console.error);
+  })
+}
+
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delObject(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    data.queryParams.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!data.yearList.some(option => option.label == value)) { // 确保不是已存在的选项
+    data.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+
+
+function processHtmlTable(htmlTable) {
+  const docxRows = [];
+
+  htmlTable.querySelectorAll("tr").forEach(htmlRow => {
+    const cells = [];
+    let colIndex = 0;
+
+    htmlRow.querySelectorAll("th, td").forEach(htmlCell => {
+      // 处理合并单元格
+      const colspan = parseInt(htmlCell.getAttribute('colspan')) || 1;
+      const rowspan = parseInt(htmlCell.getAttribute('rowspan')) || 1;
+
+      // 处理单元格内容(包括空格的转换)
+      const cellText = htmlCell.innerHTML === '&nbsp;' ? ' ' : htmlCell.textContent;
+
+      // 创建Word表格单元格
+      cells.push(
+          new TableCell({
+            children: [
+              new Paragraph({
+                children: [new TextRun(cellText)],
+              })
+            ],
+            columnSpan: colspan,
+            rowSpan: rowspan,
+            margins: { top: 100, bottom: 100, left: 100, right: 100 },
+            borders: {
+              top: { style: BorderStyle.SINGLE, size: 4, color: "000000" },
+              bottom: { style: BorderStyle.SINGLE, size: 4, color: "000000" },
+              left: { style: BorderStyle.SINGLE, size: 4, color: "000000" },
+              right: { style: BorderStyle.SINGLE, size: 4, color: "000000" }
+            }
+          })
+      );
+
+      colIndex += colspan;
+    });
+
+    docxRows.push(new TableRow({ children: cells }));
+  });
+
+  return docxRows;
+}
+function convertHtmlToDocx(htmlString) {
+  const parser = new DOMParser();
+  const doc = parser.parseFromString(htmlString, "text/html");
+  const elements = [];
+
+  Array.from(doc.body.childNodes).forEach(node => {
+    if (node.nodeType === Node.ELEMENT_NODE) {
+      const tagName = node.tagName.toUpperCase();
+
+      if (tagName === 'TABLE') {
+        elements.push(new Table({
+          rows: processHtmlTable(node),
+          width: { size: 100, type: "pct" },  // 宽度100%
+          margins: { top: 400, bottom: 400 },
+          layout: "fixed",  // 固定布局
+          borders: {
+            top: { style: BorderStyle.SINGLE, size: 4, color: "000000" },
+            bottom: { style: BorderStyle.SINGLE, size: 4, color: "000000" },
+            left: { style: BorderStyle.SINGLE, size: 4, color: "000000" },
+            right: { style: BorderStyle.SINGLE, size: 4, color: "000000" },
+            insideHorizontal: { style: BorderStyle.SINGLE, size: 4, color: "000000" },
+            insideVertical: { style: BorderStyle.SINGLE, size: 4, color: "000000" }
+          }
+        }));
+      } else if (tagName === 'P') {
+        elements.push(new Paragraph({
+          text: node.textContent,
+          spacing: { after: 200 }
+        }));
+      }
+    }
+  });
+
+  return elements;
+}
+
+// 2. 示例HTML表格数据
+const sampleTableHTML = `
+b
+`;
+// 3. 创建完整报告文档
+async function createQualityEconomicReport(data) {
+  data = {
+    time: 'xx',
+    basicInfo: 'x'
+  }
+  const doc = new Document({
+    sections: [{
+      properties: {},
+      children: [
+        // 报告标题
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: "质量经济性分析报告",
+              font: "宋体",
+              size: 26,
+              bold: true,
+              color: "000000"
+            })
+          ],
+          heading: HeadingLevel.HEADING_1,
+          alignment: AlignmentType.CENTER,
+          spacing: { after: 300 }
+        }),
+
+        // 报告时间范围
+        new Paragraph({
+          text: data.time,
+          alignment: AlignmentType.CENTER,
+          indent: { left: 3700 },
+          spacing: { after: 500 }
+        }),
+
+        // 1. 基本情况
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: "一、基本情况",
+              font: "宋体",
+              size: 22,
+              bold: true,
+              color: "000000"
+            })
+          ],
+          heading: HeadingLevel.HEADING_1,
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 100 }
+        }),
+        //基本情况内容
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: data.basicInfo, // 替换为实际内容
+              font: "宋体", // 与标题一致
+              size: 20, // 小四号(20 half-points)
+              bold: false, // 常规
+              color: "000000" // 纯黑
+            })
+          ],
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 300 } // 和下一段的间距
+        }),
+        // 二、综合分析
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: "二、综合分析",
+              font: "宋体",
+              size: 22,
+              bold: true,
+              color: "000000"
+            })
+          ],
+          heading: HeadingLevel.HEADING_1,
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 100 }
+        }),
+        // 二、综合分析内容
+        ...convertHtmlToDocx(data.sampleTableHTML),
+        new Paragraph({
+          children: [
+          ],
+          heading: HeadingLevel.HEADING_1,
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 100 }
+        }),
+
+
+        // 三、内外部损失
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: "三、内外部损失",
+              font: "宋体",
+              size: 22,
+              bold: true,
+              color: "000000"
+            })
+          ],
+          heading: HeadingLevel.HEADING_1,
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 100 }
+        }),
+        //内外部损失内容
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: data.lose, // 替换为实际内容
+              font: "宋体", // 与标题一致
+              size: 20, // 小四号(20 half-points)
+              bold: false, // 常规
+              color: "000000" // 纯黑
+            })
+          ],
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 300 } // 和下一段的间距
+        }),
+
+        // 四、纠正措施
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: "四、纠正措施",
+              font: "宋体",
+              size: 22,
+              bold: true,
+              color: "000000"
+            })
+          ],
+          heading: HeadingLevel.HEADING_1,
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 100 }
+        }),
+        //纠正措施内容
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: data.action, // 替换为实际内容
+              font: "宋体", // 与标题一致
+              size: 20, // 小四号(20 half-points)
+              bold: false, // 常规
+              color: "000000" // 纯黑
+            })
+          ],
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 300 } // 和下一段的间距
+        }),
+
+        // 二、改进建议
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: "五、改进建议",
+              font: "宋体",
+              size: 22,
+              bold: true,
+              color: "000000"
+            })
+          ],
+          heading: HeadingLevel.HEADING_1,
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 100 }
+        }),
+        //改进建议内容
+        new Paragraph({
+          children: [
+            new TextRun({
+              text: data.suggest, // 替换为实际内容
+              font: "宋体", // 与标题一致
+              size: 20, // 小四号(20 half-points)
+              bold: false, // 常规
+              color: "000000" // 纯黑
+            })
+          ],
+          alignment: AlignmentType.LEFT,
+          spacing: { after: 300 } // 和下一段的间距
+        }),
+
+        // 10. 综合部落款
+        new Paragraph({
+          text: data.deptName,
+          alignment: AlignmentType.RIGHT,
+          spacing: { before: 1200 }
+        }),
+
+        // 11. 日期落款
+        new Paragraph({
+          text: data.lastTime,
+          alignment: AlignmentType.RIGHT,
+          spacing: { before: 200 }
+        })
+      ]
+    }]
+  });
+  // 导出文件
+  const blob = await Packer.toBlob(doc);
+  saveAs(blob, "质量经济性分析报告.docx");
+}
+
+
+
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/work/marketingManagement/customerList/need/components/editDialog.vue b/src/views/work/marketingManagement/customerList/need/components/editDialog.vue
index b2d66ac..41206f1 100644
--- a/src/views/work/marketingManagement/customerList/need/components/editDialog.vue
+++ b/src/views/work/marketingManagement/customerList/need/components/editDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="800px"
+        width="1150px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
@@ -42,14 +42,14 @@
               <div style="display: flex;width: 100%;">
                 <el-table :data="state.form.customerRecordNeeds" :border="true" >
                   <el-table-column type="index" label="序号"  align="center"></el-table-column>
-                  <el-table-column label="顾客名称" prop="customerName" align="center" width="150">
+                  <el-table-column label="顾客名称" prop="customerName" align="center" >
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.customerName">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.customerName" placeholder="请输入"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="顾客需求" prop="customerNeed" align="center" width="150">
+                  <el-table-column label="顾客需求" prop="customerNeed" align="center" >
                     <template #default="{row,$index}">
                       <div v-for="(i,index) in row.expectContentMesses" :key="index">
                         <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + '].' +'expectContentMesses.' + '[' + index + ']' + '.customerNeed'" :rules="state.rules.customerNeed">
@@ -71,7 +71,7 @@
                       </div>
                     </template>
                   </el-table-column>
-                  <el-table-column label="登记人" prop="registrantId" align="center" width="150">
+                  <el-table-column label="登记人" prop="registrantId" align="center" >
                     <template #default="{row,$index}">
                       <div v-for="(i,index) in row.expectContentMesses" :key="index">
                         <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + '].' +'expectContentMesses.' + '[' + index + ']' + '.registrantId'" :rules="state.rules.registrantId">
@@ -87,7 +87,7 @@
                       </div>
                     </template>
                   </el-table-column>
-                  <el-table-column label="处理部门" prop="disposeId" align="center" width="150">
+                  <el-table-column label="处理部门" prop="disposeId" align="center" >
                     <template #default="{row,$index}">
                       <div v-for="(i,index) in row.expectContentMesses" :key="index">
                         <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + '].' +'expectContentMesses.' + '[' + index + ']' + '.disposeId'" :rules="state.rules.disposeId">
@@ -108,7 +108,7 @@
                       </div>
                     </template>
                   </el-table-column>
-                  <el-table-column label="处理结果" prop="disposeMess" align="center" width="150">
+                  <el-table-column label="处理结果" prop="disposeMess" align="center" >
                     <template #default="{row,$index}">
                       <div v-for="(i,index) in row.expectContentMesses" :key="index">
                         <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + '].' +'expectContentMesses.' + '[' + index + ']' + '.disposeMess'" :rules="state.rules.disposeMess">
@@ -117,7 +117,7 @@
                       </div>
                     </template>
                   </el-table-column>
-                  <el-table-column label="备注" prop="remark" align="center" width="150">
+                  <el-table-column label="备注" prop="remark" align="center" >
                     <template #default="{row,$index}">
                       <div v-for="(i,index) in row.expectContentMesses" :key="index">
                         <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + '].' +'expectContentMesses.' + '[' + index + ']' + '.remark'" :rules="state.rules.remark">
diff --git a/src/views/work/procurementPlatform/warehouseManagement/monthlyInspectionRecord/components/editDialog.vue b/src/views/work/procurementPlatform/warehouseManagement/monthlyInspectionRecord/components/editDialog.vue
index 11d9b70..1cd97cc 100644
--- a/src/views/work/procurementPlatform/warehouseManagement/monthlyInspectionRecord/components/editDialog.vue
+++ b/src/views/work/procurementPlatform/warehouseManagement/monthlyInspectionRecord/components/editDialog.vue
@@ -3,7 +3,7 @@
     <el-dialog
         v-model="dialogVisible"
         :title="title"
-        width="850px"
+        width="1200px"
         :before-close="handleClose"
         :close-on-press-escape="false"
         :close-on-click-modal="false"
@@ -42,7 +42,7 @@
               <div style="display: flex;width: 100%;">
                 <el-table :data="state.form.inspectionMesses" :border="true" >
                   <el-table-column type="index" label="序号"  align="center"></el-table-column>
-                  <el-table-column label="时间" prop="monthlyTime" align="center" width="150">
+                  <el-table-column label="时间" prop="monthlyTime" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'monthlyTime'" :rules="state.rules.monthlyTime">
                         <el-date-picker
@@ -56,56 +56,56 @@
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="检查人" prop="checkUser" align="center" width="150">
+                  <el-table-column label="检查人" prop="checkUser" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'checkUser'" :rules="state.rules.checkUser">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.checkUser" placeholder="请输入"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="防护" prop="entrench" align="center" width="150">
+                  <el-table-column label="防护" prop="entrench" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'entrench'" :rules="state.rules.entrench">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.entrench" placeholder="请输入"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="标识" prop="identification" align="center" width="150">
+                  <el-table-column label="标识" prop="identification" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'identification'" :rules="state.rules.identification">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.identification" placeholder="请输入"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="摆放" prop="place" align="center" width="150">
+                  <el-table-column label="摆放" prop="place" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'place'" :rules="state.rules.place">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.place" placeholder="请输入"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="清洁" prop="clean" align="center" width="150">
+                  <el-table-column label="清洁" prop="clean" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'clean'" :rules="state.rules.clean">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.clean" placeholder="请输入"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="安全" prop="safety" align="center" width="150">
+                  <el-table-column label="安全" prop="safety" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'safety'" :rules="state.rules.safety">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.safety" placeholder="请输入"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="环境" prop="environment" align="center" width="150">
+                  <el-table-column label="环境" prop="environment" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'environment'" :rules="state.rules.environment">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.environment" placeholder="请输入"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="帐务卡一致性" prop="consistency" align="center" width="150">
+                  <el-table-column label="帐务卡一致性" prop="consistency" align="center" width="100">
                     <template  #default="{row,$index}">
                       <el-form-item :prop="'inspectionMesses.' + '[' + $index + ']' + 'consistency'" :rules="state.rules.consistency">
                         <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.consistency" placeholder="请输入"></el-input>
diff --git a/src/views/work/qualityManage/continuousImprovement/components/editDialog.vue b/src/views/work/qualityManage/continuousImprovement/components/editDialog.vue
new file mode 100644
index 0000000..9c935a7
--- /dev/null
+++ b/src/views/work/qualityManage/continuousImprovement/components/editDialog.vue
@@ -0,0 +1,449 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="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.rules"  label-position="right" label-width="130">
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="年份:" prop="year" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.year"
+                  filterable
+                  allow-create
+                  default-first-option
+                  :reserve-keyword="false"
+                  placeholder="请选择年份"
+                  @change="handleChangeNum"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="item in state.yearList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.label"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="年度质量体系改进计划:" prop="customerRecordNeeds" >
+              <el-button
+                  :disabled="title === '查看'"
+                  type="primary"
+                  @click="addTableData"
+                  style="margin-left: 10px;margin-bottom: 10px"
+              >新增</el-button>
+              <div style="display: flex;width: 100%;">
+                <el-table :data="state.form.customerRecordNeeds" :border="true" >
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="改 进 项" prop="customerName" align="center" width="120">
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.customerName">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.customerName" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="具体措施" prop="customerNeed" align="center" width="120">
+                    <template #default="{row,$index}">
+
+                        <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.customerNeed">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.customerNeed" placeholder="请输入"></el-input>
+                        </el-form-item>
+
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="责任部门" prop="disposeId" align="center" width="120">
+                    <template #default="{row,$index}">
+
+                        <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.disposeId">
+                          <el-select
+                              :disabled="title === '查看'"
+                              v-model="row.disposeId"
+                              placeholder="请选择部门"
+                              style="width: 240px;margin-bottom: 5px"
+                          >
+                            <el-option
+                                v-for="item in state.deptList"
+                                :key="item.deptId"
+                                :label="item.deptName"
+                                :value="item.deptId"
+                            />'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'
+                          </el-select>
+                        </el-form-item>
+
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="完成时间" prop="disposeMess" align="center" width="120">
+                    <template #default="{row,$index}">
+                        <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.disposeMess">
+                          <el-date-picker
+                              v-model="row.calibrationTime"
+                              type="date"
+                              value-format="YYYY-MM-DD"
+                              placeholder="完成时间"
+                              :disabled="state.title =='查看'"
+                              style="width: 100%"
+                          />
+                        </el-form-item>
+
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="跟踪验证" prop="remark" align="center" width="120">
+                    <template #default="{row,$index}">
+                        <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.remark">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.remark" placeholder="请输入"></el-input>
+                        </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center"  v-if="title !== '查看'" >
+                    <template #default="scope">
+<!--                      <el-button link type="primary"  @click="addObject(scope.row,scope.$index)" >添加</el-button>-->
+                      <el-button link type="danger"  @click="delObject(scope.row,scope.$index)" >删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="编制:" prop="compilationId" >
+              <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable  style="width: 200px">
+                <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-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="审核:" prop="compilationId" >
+              <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable  style="width: 200px">
+                <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-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="批准:" prop="compilationId" >
+              <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable  style="width: 200px">
+                <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-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 Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+import {addNeedDiscren, editNeedDiscren} from "@/api/need/need";
+import {addCustomerNeed, editCustomerNeed} from "@/api/customerNeed";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    recordName: null,
+    customerRecordNeeds:[],
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    recordName: [{ required: true, message: '请输入记录名称', trigger: 'blur' }],
+    customerName: [{required: true, message: "", trigger: "blur"}],
+    customerNeed: [{required: true, message: "", trigger: "blur"}],
+    needSource: [{required: true, message: "", trigger: "blur"}],
+    registrantId: [{required: true, message: "", trigger: "blur"}],
+    disposeId: [{required: true, message: "", trigger: "blur"}],
+    disposeMess: [{required: true, message: "", trigger: "blur"}],
+    customerRecordNeeds:[{ required: true, message: '请填写需求登记列表', trigger: 'blur' }],
+  },
+  peopleList: [],
+  isAdmin: false,
+  companyList: [],
+  deptList: [],
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+    state.form.customerRecordNeeds.forEach(item => {
+      item.customerName =  item.customerName
+      const obj = {
+        recordId: state.form.id,
+        customerNeed: item.customerNeed,
+        disposeId: item.disposeId,
+        disposeMess: item.disposeMess,
+        needSource: item.needSource?.split(','),
+        registrantId: item.registrantId,
+        remark: item.remark,
+      }
+      item.expectContentMesses=[obj]
+    })
+    console.log('xx',state.form)
+
+  }
+  await getDeptList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+const onSubmit = async () => {
+  let dataDemo = JSON.parse(JSON.stringify(state.form))
+  let flag = false
+  for (const i of dataDemo.customerRecordNeeds) {
+    if(!i.expectContentMesses[0].needSource || i.expectContentMesses[0].needSource.length ==0){
+      ElMessage.warning('请完善需求来源')
+      flag = true
+      return
+    }
+  }
+  if(flag) return
+  let dataArr = []
+  dataArr = dataDemo.customerRecordNeeds.map(item => {
+    return {
+      customerName: item.customerName,
+      customerNeed: item.expectContentMesses[0].customerNeed,
+      disposeId: item.expectContentMesses[0].disposeId,
+      disposeMess: item.expectContentMesses[0].disposeMess,
+      needSource: item.expectContentMesses[0].needSource?.join(','),
+      registrantId: item.expectContentMesses[0].registrantId,
+      remark: item.expectContentMesses[0].remark,
+    }
+  })
+  dataDemo.customerRecordNeeds = dataArr
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      const {id, ...data} = dataDemo
+      const res = await addCustomerNeed(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑'){
+      const {...data} = dataDemo
+      data.customerRecordNeeds.forEach(i => {
+        i.recordId = data.id
+      })
+      const res = await editCustomerNeed(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }
+  }
+}
+const getDeptList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  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 handleClose = () => {
+  busRef.value.clearValidate();
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+
+}
+const reset = () => {
+  state.form = {
+    id: '',
+    companyId: null,
+    recordName: null,
+    customerRecordNeeds:[],
+  }
+  state.companyList = []
+}
+
+const selectValueCom = (val) => {
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+  getDeptList()
+  getPeopleList()
+}
+
+
+const addTableData = () => {
+  state.form.customerRecordNeeds.push({})
+}
+const addObject = (val,itemIndex) => {
+  state.form.customerRecordNeeds.forEach((item,index) => {
+    if(index == itemIndex){
+      item.expectContentMesses.push({})
+    }
+  })
+}
+const delObject = (val,itemIndex) => {
+  state.form.customerRecordNeeds = state.form.customerRecordNeeds.filter(item=> item != val)
+}
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+
+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/qualityManage/continuousImprovement/index.vue b/src/views/work/qualityManage/continuousImprovement/index.vue
new file mode 100644
index 0000000..ad02ac4
--- /dev/null
+++ b/src/views/work/qualityManage/continuousImprovement/index.vue
@@ -0,0 +1,297 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.year"
+              placeholder="请选择年份"
+              style="width: 240px"
+              filterable
+              allow-create
+              default-first-option
+              :reserve-keyword="false"
+              @change="handleChangeNum"
+          >
+            <el-option
+                v-for="item in data.yearList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.label"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <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="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="企业名称" prop="companyName" align="center" v-if="data.isAdmin" />
+      <el-table-column label="名称"  align="center">
+        <template #default="scope">
+          <span>{{scope.row.recordName}}</span>
+        </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>
+          <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>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delTable, getTable} from "@/api/qualityObjectives/table";
+import {delNeedDiscren, getNeedDiscren} from "@/api/need/need";
+import {delCustomerNeed, getCustomerNeed} from "@/api/customerNeed";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const deptRef = ref()
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false,
+  dialogVisible: false,
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  // loading.value = true;
+  // const res = await getCustomerNeed(data.queryParams);
+  // if(res.code === 200){
+  //   dataList.value = res.data.list
+  //   total.value = res.data.total
+  // }else{
+  //   ElMessage.warning(res.message)
+  // }
+  // loading.value = false;
+  dataList.value = [{}]
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/continuousImprovementExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  data.forEach(item => {
+
+    // item.tableData = item.customerRecordNeeds.map((i,index) => {
+    //   return{
+    //     ...i,
+    //     expectContentMesses: i.expectContentMesses.map((q,qindex) => {
+    //       return{
+    //         ...q,
+    //         first: qindex == 0,
+    //         num: index+1,
+    //       }
+    //     })
+    //   }
+    // })
+    console.log('xxx',item.tableData)
+    try {
+      generateWordDocument(templatePath.value, item, item.companyName + `_顾客需求登记表.docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delCustomerNeed(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          await getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/work/qualityManage/performanceAppraisal/components/editDialog.vue b/src/views/work/qualityManage/performanceAppraisal/components/editDialog.vue
new file mode 100644
index 0000000..cd3139d
--- /dev/null
+++ b/src/views/work/qualityManage/performanceAppraisal/components/editDialog.vue
@@ -0,0 +1,594 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="1000px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules"  label-position="top" >
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="绩效评价表名称:" prop="evaluateName" >
+              <el-input style="margin-bottom: 15px" :disabled="title === '查看'" placeholder="绩效评价表名称" v-model="state.form.evaluateName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="表单编号:" prop="number" >
+              <el-input style="margin-bottom: 15px" :disabled="title === '查看'" placeholder="表单编号" v-model="state.form.number"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="绩效监测及分析评价表:" prop="types" >
+              <el-button
+                  :disabled="title === '查看'"
+                  type="primary"
+                  @click="addContentTable"
+                  style="margin-bottom: 10px;display: flex;align-items: flex-end"
+              >新增</el-button>
+              <div style="display: flex;width: 100%;">
+                <el-table :data="state.form.types" :border="true" >
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="内部/外部" prop="type" align="center" width="100">
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'types.' + '[' + $index + ']' + 'type'" :rules="state.rules.type">
+                        <el-select v-model="row.type" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看'">
+                          <el-option
+                              v-for="item in state.inOrOutList"
+                              :key="item.id"
+                              :label="item.name"
+                              :value="item.id">
+                          </el-option>
+                        </el-select>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="需交流的事项和内容" prop="content" align="center" >
+                    <template #default="{row,$index}">
+                      <div v-for="(i,index) in row.analyses" :key="index">
+                        <el-form-item :prop="'types.' + '[' + $index + '].' +'analyses.' + '[' + index + ']' + '.content'" :rules="state.rules.content">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.content" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="交流和监测目的" prop="purpose" align="center" width="140">
+                    <template #default="{row,$index}">
+                      <div v-for="(i,index) in row.analyses" :key="index">
+                        <el-form-item :prop="'types.' + '[' + $index + '].' +'analyses.' + '[' + index + ']' + '.purpose'" :rules="state.rules.purpose">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.purpose" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="交流监测时机" prop="opportunity" align="center" >
+                    <template #default="{row,$index}">
+                      <div v-for="(i,index) in row.analyses" :key="index">
+                        <el-form-item :prop="'types.' + '[' + $index + '].' +'analyses.' + '[' + index + ']' + '.opportunity'" :rules="state.rules.opportunity">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.opportunity" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="交流监测范围/对象" prop="scope" align="center" >
+                    <template #default="{row,$index}">
+                      <div v-for="(i,index) in row.analyses" :key="index">
+                        <el-form-item :prop="'types.' + '[' + $index + '].' +'analyses.' + '[' + index + ']' + '.scope'" :rules="state.rules.scope">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.scope" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="交流方式及取得绩效" prop="score" align="center" >
+                    <template #default="{row,$index}">
+                      <div v-for="(i,index) in row.analyses" :key="index">
+                        <el-form-item :prop="'types.' + '[' + $index + '].' +'analyses.' + '[' + index + ']' + '.score'" :rules="state.rules.score">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.score" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="责任部门" prop="deptId" align="center" >
+                    <template #default="{row,$index}">
+                      <div v-for="(i,index) in row.analyses" :key="index">
+                        <el-form-item :prop="'types.' + '[' + $index + '].' +'analyses.' + '[' + index + ']' + '.deptId'">
+                          <el-select
+                              clearable
+                              :disabled="title === '查看'"
+                              v-model="i.deptId"
+                              placeholder="请选择部门"
+                              style="width: 240px;margin-bottom: 5px"
+                          >
+                            <el-option
+                                v-for="item in state.deptList"
+                                :key="item.deptId"
+                                :label="item.deptName"
+                                :value="item.deptId"
+                            />
+                          </el-select>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center"  v-if="title !== '查看'" >
+                    <template #default="scope">
+                      <el-button link type="primary"  @click="addObject(scope.row,scope.$index)" >添加</el-button>
+                      <el-button link type="danger"  @click="delContent(scope.row,scope.$index)" >删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="内容:" prop="content" >
+              <el-input style="margin-bottom: 15px" :disabled="title === '查看'" type="textarea" :rows="10" placeholder="内容" v-model="state.form.content"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="编制:" prop="fictionId" >
+              <el-select clearable v-model="state.form.fictionId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <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="fictionTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.fictionTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </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: 240px">
+                <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="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </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 Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+import {addNeedEvaluate, editNeedEvaluate, getNeedEvaluateAll} from "@/api/need/need";
+import {addEvaluation, editEvaluation} from "@/api/performanceAppraisal";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    evaluateName: "",
+    number: "",
+    fictionId: null,
+    fictionTime: "",
+    checkId: null,
+    checkTime: "",
+    content:
+        '一、主要问题:\n' +
+        '1、按GJB9001C-2017标准建立体系\t\n' +
+        '2、提高人员质量意识\n' +
+        '3、减少不合格品\n' +
+        '4、提高维修人员能力\n' +
+        '\n' +
+        '二、主要绩效:\n' +
+        '1、2023年内取得军标证书\n' +
+        '2、提高人员质量意识,保证工作质量\n' +
+        '3、通过质量管理,不断减少不合格品,减少内外部故障\n' +
+        '4、通过技能培训,提高维修人员能力\n' +
+        '\n' +
+        '三、改进项目:\n' +
+        '1、邀请资深老师对GJB9001C-2017标准进行培训,并建立、运行质量管理体系;\n' +
+        '2、质量意识是体现在基层每一个员工身上,但更集中在组织的管理层的工作岗位中。 质量意识是自上而下的,上行下效才能齐头并进;因此要不断培训,告诉员工应该怎么做,更应该告诉自己应该如何做,以身做责来提高质量意识。\n' +
+        '3、不合格品是生产的产品中不符合质量标准的产品,它包括废品、返修品和超差利用品三类产品。 加强不合格品管理,一方面能降低生产成本,提高企业的经济效益;另一方面,对保证产品质量,生产用户满意的产品。\n' +
+        '4、通过技能培训不断提高员工技能,并提高职工对自身价值的认识,对工作目标有了更好的理解,为公司创造更大价值。\n',
+    types:[
+      {
+        type: 2,
+        analyses: [
+          {
+            content: "按GJB9001C-2017标准建立体系",
+            purpose: "2023年内取得军标证书",
+            opportunity: "取得证书后",
+            scope: "顾客及用船部队",
+            score: "面谈、走访,获得认可",
+            deptId: null
+          }
+        ]
+      },
+      {
+        type: 1,
+        analyses: [
+
+          {
+            content: "不断提高人员质量意识",
+            purpose: "提高人员质量意识,保证工作质量",
+            opportunity: "每季度",
+            scope: "全体员工",
+            score: "培训",
+            deptId: null
+          },
+          {
+            content: "加强管理,减少不合格品",
+            purpose: "通过质量管理,不断减少不合格品,减少内外部故障",
+            opportunity: "每季度",
+            scope: "生产操作岗",
+            score: "培训、实操",
+            deptId: null
+          },
+          {
+            content: "提高维修人员能力",
+            purpose: "通过技能培训,提高维修人员能力",
+            opportunity: "每半年",
+            scope: "生产操作岗",
+            score: "培训、实操",
+            deptId: null
+          },
+
+        ]
+      },
+    ]
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    evaluateName: [{ required: true, message: '请输入绩效评价表名称', trigger: 'blur' }],
+    number: [{ required: true, message: '请输入编号', trigger: 'blur' }],
+    content: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+    fictionId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
+    fictionTime: [{ required: true, message: '请选择编制日期', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    checkTime: [{ required: true, message: '请选择审核人日期', trigger: 'blur' }],
+    types: [{ required: true, message: '请填写绩效评价表', trigger: 'blur' }],
+    purpose: [{ required: true, message: '', trigger: 'blur' }],
+    opportunity: [{ required: true, message: '', trigger: 'blur' }],
+    scope: [{ required: true, message: '', trigger: 'blur' }],
+    score: [{ required: true, message: '', trigger: 'blur' }],
+
+  },
+  peopleList: [],
+  isAdmin: false,
+  companyList: [],
+  needList: [],
+  inOrOutList: [
+    {
+      id: 1,
+      name: '内部'
+    },
+    {
+      id: 2,
+      name: '外部'
+    },
+
+  ]
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    state.form.confirmId = Number(state.form.confirmId)
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+
+  await getDeptList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+
+const getDeptList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      console.log('sta',state.form)
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addEvaluation(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑'){
+      const {...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editEvaluation(data)
+      data.types.forEach(item => {
+        item.evaluationId = state.form.id
+      })
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }
+  }
+}
+
+const handleClose = () => {
+  busRef.value.clearValidate();
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+
+}
+const reset = () => {
+  state.form = {
+    id: '',
+    companyId: null,
+    evaluateName: "",
+    number: "",
+    fictionId: null,
+    fictionTime: "",
+    checkId: null,
+    checkTime: "",
+    content:
+        '一、主要问题:\n' +
+        '1、按GJB9001C-2017标准建立体系\t\n' +
+        '2、提高人员质量意识\n' +
+        '3、减少不合格品\n' +
+        '4、提高维修人员能力\n' +
+        '\n' +
+        '二、主要绩效:\n' +
+        '1、2023年内取得军标证书\n' +
+        '2、提高人员质量意识,保证工作质量\n' +
+        '3、通过质量管理,不断减少不合格品,减少内外部故障\n' +
+        '4、通过技能培训,提高维修人员能力\n' +
+        '\n' +
+        '三、改进项目:\n' +
+        '1、邀请资深老师对GJB9001C-2017标准进行培训,并建立、运行质量管理体系;\n' +
+        '2、质量意识是体现在基层每一个员工身上,但更集中在组织的管理层的工作岗位中。 质量意识是自上而下的,上行下效才能齐头并进;因此要不断培训,告诉员工应该怎么做,更应该告诉自己应该如何做,以身做责来提高质量意识。\n' +
+        '3、不合格品是生产的产品中不符合质量标准的产品,它包括废品、返修品和超差利用品三类产品。 加强不合格品管理,一方面能降低生产成本,提高企业的经济效益;另一方面,对保证产品质量,生产用户满意的产品。\n' +
+        '4、通过技能培训不断提高员工技能,并提高职工对自身价值的认识,对工作目标有了更好的理解,为公司创造更大价值。\n',
+    types:[
+      {
+        type: 2,
+        analyses: [
+          {
+            content: "按GJB9001C-2017标准建立体系",
+            purpose: "2023年内取得军标证书",
+            opportunity: "取得证书后",
+            scope: "顾客及用船部队",
+            score: "面谈、走访,获得认可",
+            deptId: null
+          }
+        ]
+      },
+      {
+        type: 1,
+        analyses: [
+
+          {
+            content: "不断提高人员质量意识",
+            purpose: "提高人员质量意识,保证工作质量",
+            opportunity: "每季度",
+            scope: "全体员工",
+            score: "培训",
+            deptId: null
+          },
+          {
+            content: "加强管理,减少不合格品",
+            purpose: "通过质量管理,不断减少不合格品,减少内外部故障",
+            opportunity: "每季度",
+            scope: "生产操作岗",
+            score: "培训、实操",
+            deptId: null
+          },
+          {
+            content: "提高维修人员能力",
+            purpose: "通过技能培训,提高维修人员能力",
+            opportunity: "每半年",
+            scope: "生产操作岗",
+            score: "培训、实操",
+            deptId: null
+          },
+
+        ]
+      },
+    ]
+  }
+  state.peopleList = []
+  state.companyList = []
+  state.needList = []
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  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 changeDiscren = (val) => {
+  state.needList.forEach(item => {
+    if(item.id == val){
+      state.form.expectContents = item.expectContents
+    }
+  })
+}
+const addContentTable = () => {
+  state.form.types.push({analyses: [{}]})
+}
+const addObject = (val,itemIndex) => {
+  state.form.types.forEach((item,index) => {
+    if(index == itemIndex){
+      item.analyses.push({})
+    }
+  })
+}
+const delContent = (val,itemIndex) => {
+  state.form.types.forEach((item,index) => {
+    if(index == itemIndex){
+      if(item.analyses.length == 1){
+        state.form.types.splice(index,1)
+      }else {
+        item.analyses.pop()
+      }
+    }
+  })
+}
+
+
+const selectValueCom = (val) => {
+  state.form.fictionId = null
+  state.form.checkId = null
+  state.form.types.forEach(item => {
+    item.analyses.forEach(i =>{
+      i.deptId = null
+    })
+  })
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+  getDeptList()
+  getPeopleList()
+}
+
+const addTableData = () => {
+    state.form.outEnvironment.push({})
+}
+const delTable = (val) => {
+  state.form.outEnvironment = state.form.outEnvironment.filter(item=> item != val)
+}
+
+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/qualityManage/performanceAppraisal/index.vue b/src/views/work/qualityManage/performanceAppraisal/index.vue
new file mode 100644
index 0000000..f0cc324
--- /dev/null
+++ b/src/views/work/qualityManage/performanceAppraisal/index.vue
@@ -0,0 +1,281 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item  v-if="data.isAdmin">
+          <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="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="企业名称" prop="companyName" align="center" width="250"  v-if="data.isAdmin" />
+      <el-table-column label="绩效评价表"  prop="evaluateName" align="center"></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>
+          <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>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delTable, getTable} from "@/api/qualityObjectives/table";
+import {delNeedEvaluate, getNeedEvaluate} from "@/api/need/need";
+import {delEvaluation, getEvaluation} from "@/api/performanceAppraisal";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const deptRef = ref()
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null,
+    year: '',
+    type: ''
+  },
+  companyList: [],
+  isAdmin: false,
+  dialogVisible: false,
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getEvaluation(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list.map(item => {
+      return {
+        ...item,
+        types: item.types.map(i => {
+          return {
+            ...i,
+            analyses: i.analyses.map(x => {
+              return {
+                ...x,
+                deptId: x.deptId ? x.deptId : null
+              }
+            })
+          }
+        })
+      }
+    })
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/performanceAppraisalExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  data.forEach(item => {
+    item.tableList = item.types.map((i,index) => {
+      return{
+        ...i,
+        analyses: i.analyses.map((q,qindex) => {
+          return{
+            ...q,
+            typeName: i.type == 1? '内部':'外部',
+            first: qindex == 0,
+          }
+        })
+      }
+    })
+    try {
+      generateWordDocument(templatePath.value, item, item.companyName +`_${item.evaluateName}.docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+function idGroupToTree(data) {
+  const groups = data.reduce((map, item) => {
+    map.has(item.type) || map.set(item.type, []);
+    map.get(item.type).push(item);
+    return map;
+  }, new Map());
+  return Array.from(groups).map(([type, items]) => ({
+    type,
+    children: items
+  }));
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delEvaluation(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          await getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/work/qualityManage/qualityInformationPage/external/components/editDialog.vue b/src/views/work/qualityManage/qualityInformationPage/external/components/editDialog.vue
new file mode 100644
index 0000000..6c4307e
--- /dev/null
+++ b/src/views/work/qualityManage/qualityInformationPage/external/components/editDialog.vue
@@ -0,0 +1,364 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="850px"
+        :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="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="反馈单名称:" prop="feedFrom" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.feedFrom" placeholder="反馈单名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="编号:" prop="number" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.number" placeholder="编号"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="产品名称:" prop="productName" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.productName" placeholder="产品名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="制造号:" prop="makeNum" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.makeNum" placeholder="制造号"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="提供单位:" prop="offerUnit" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.offerUnit" placeholder="提供单位"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="型号:" prop="model" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.model" placeholder="型号"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="提供方式:" prop="offerMethod" >
+                <el-checkbox-group v-model="state.form.offerMethod" style="display: flex" :disabled="title === '查看'">
+                  <el-checkbox label="1" value="1" style="width: 25px;" >信函</el-checkbox>
+                  <el-checkbox label="2" value="2" style="width: 25px;">电话</el-checkbox>
+                  <el-checkbox label="3" value="3" style="width: 20px;">走访</el-checkbox>
+                </el-checkbox-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="提供日期:" prop="offerTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.offerTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="公司编号:" prop="comNum" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.comNum" placeholder="公司编号"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="反馈质量问题概述:" prop="feedInformation" >
+              <el-input  :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.feedInformation" placeholder=""></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="责任单位拟办意见:" prop="dutyMess" >
+              <el-input  :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.dutyMess" placeholder=""></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="综合办公室签名:" prop="generalSign" >
+              <el-input  :disabled="title === '查看'"  v-model="state.form.generalSign" placeholder="综合办公室签名"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="generalTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.generalTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="计划处意见:" prop="planMess" >
+              <el-input  :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.planMess" placeholder=""></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="生产技术部签名:" prop="productSign" >
+              <el-input  :disabled="title === '查看'"  v-model="state.form.productSign" placeholder="生产技术部签名"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="productTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.productTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="处置结果:" prop="disposeMess" >
+              <el-input  :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.disposeMess" placeholder=""></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="处置人签名:" prop="disposeSign" >
+              <el-input  :disabled="title === '查看'"  v-model="state.form.disposeSign" placeholder="处置人签名"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="disposeTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.disposeTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </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 {reactive, ref, toRefs} from 'vue'
+import {ElMessage, ElMessageBox} from "element-plus";
+import {verifyPhone} from "@/utils/validate";
+import Cookies from "js-cookie";
+import {addCustomer, editCustomer} from "@/api/customerList";
+import {getDept} from "@/api/qualityObjectives/object";
+import {getUser} from "@/api/onlineEducation/user";
+import {addEnternal, editEnternal} from "@/api/external";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const state = reactive({
+  form: {
+    id: '',
+    feedFrom: "",
+    number: "",
+    productName: "",
+    makeNum: "",
+    offerUnit: "",
+    offerTime: "",
+    offerMethod:[],
+    model: "",
+    comNum: "",
+    feedInformation: "",
+    dutyMess: "",
+    generalSign: "",
+    generalTime: "",
+    planMess: "",
+    productSign: "",
+    productTime: "",
+    disposeMess: "",
+    disposeSign: "",
+    disposeTime: ""
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    feedFrom: [{ required: true, message: '请输入反馈单名称', trigger: 'blur' }],
+    number: [{ required: true, message: '请输入编号', trigger: 'blur' }],
+    productName: [{ required: true, message: '请输入产品名称', trigger: 'blur' }],
+    makeNum: [{ required: true, message: '请输入制造号', trigger: 'blur' }],
+    offerUnit: [{ required: true, message: '请输入提供单位', trigger: 'blur' }],
+    offerTime: [{ required: true, message: '请输入提供日期', trigger: 'blur' }],
+    offerMethod: [{ required: true, message: '请输入提供方式', trigger: 'blur' }],
+    model: [{ required: true, message: '请输入型号', trigger: 'blur' }],
+    comNum: [{ required: true, message: '请输入公司编号', trigger: 'blur' }],
+    feedInformation: [{ required: true, message: '请输入反馈信息描述', trigger: 'blur' }],
+    dutyMess: [{ required: true, message: '请输入责任单位意见', trigger: 'blur' }],
+    generalSign: [{ required: true, message: '请输入综合办公室签名', trigger: 'blur' }],
+    generalTime: [{ required: true, message: '请选择签名日期', trigger: 'blur' }],
+    planMess: [{ required: true, message: '请输入计划意见', trigger: 'blur' }],
+    productSign: [{ required: true, message: '请输入生产技术部签名', trigger: 'blur' }],
+    productTime: [{ required: true, message: '请选择生产技术部签名日期', trigger: 'blur' }],
+    disposeMess:[{ required: true, message: '请输入处置结果', trigger: 'blur' }],
+    disposeSign: [{ required: true, message: '请输入处置人签名', trigger: 'blur' }],
+    disposeTime: [{ required: true, message: '请选择处置人签名日期', trigger: 'blur' }]
+
+  },
+  companyList: [],
+  isAdmin: false,
+  deptList: [],
+  peopleList: [],
+})
+
+
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    state.form.offerMethod = state.form.offerMethod.split(',')
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+
+  dialogVisible.value = true;
+}
+
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(!state.isAdmin){
+    const userInfo = JSON.parse(Cookies.get('userInfo'))
+    state.form.companyId = userInfo.companyId
+  }
+  if(valid){
+    state.form.offerMethod = state.form.offerMethod.join(',')
+    if(title.value === '新增'){
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addEnternal(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑'){
+      const {...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editEnternal(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }
+  }
+}
+
+const handleClose = () => {
+  busRef.value.clearValidate();
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+
+}
+
+const reset = () => {
+  state.form = {
+    id: '',
+    feedFrom: "",
+    number: "",
+    productName: "",
+    makeNum: "",
+    offerUnit: "",
+    offerTime: "",
+    offerMethod: [],
+    model: "",
+    comNum: "",
+    feedInformation: "",
+    dutyMess: "",
+    generalSign: "",
+    generalTime: "",
+    planMess: "",
+    productSign: "",
+    productTime: "",
+    disposeMess: "",
+    disposeSign: "",
+    disposeTime: ""
+  }
+  state.companyList = []
+}
+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/qualityManage/qualityInformationPage/external/index.vue b/src/views/work/qualityManage/qualityInformationPage/external/index.vue
new file mode 100644
index 0000000..911d075
--- /dev/null
+++ b/src/views/work/qualityManage/qualityInformationPage/external/index.vue
@@ -0,0 +1,235 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <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="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="企业名称" prop="companyName" align="center" v-if="data.isAdmin" />
+      <el-table-column label="反馈单名称"  align="center">
+        <template #default="scope">
+          <span>{{scope.row.feedFrom}}</span>
+        </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>
+          <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>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delEnternal, getEnternal} from "@/api/external";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const deptRef = ref()
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false,
+  dialogVisible: false,
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getEnternal(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/externalExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  data.forEach(item => {
+    try {
+      item.isLetter = item.offerMethod?.split(',').includes('1')
+      item.isPhone = item.offerMethod?.split(',').includes('2')
+      item.isVisit = item.offerMethod?.split(',').includes('3')
+      generateWordDocument(templatePath.value, item, item.companyName + `_质量信息反馈单(公司外).docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delEnternal(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          await getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/work/qualityManage/qualityInformationPage/internal/components/editDialog.vue b/src/views/work/qualityManage/qualityInformationPage/internal/components/editDialog.vue
new file mode 100644
index 0000000..02f2832
--- /dev/null
+++ b/src/views/work/qualityManage/qualityInformationPage/internal/components/editDialog.vue
@@ -0,0 +1,541 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="850px"
+        :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="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin"  @change="selectValueCom" >
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="反馈单名称:" prop="feedForm" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.feedForm" placeholder="反馈单名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="编号:" prop="number" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.number" placeholder="编号"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="产品名称:" prop="productName" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.productName" placeholder="产品名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="产品型号:" prop="productModel" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.productModel" placeholder="产品型号"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="产品公司编号:" prop="productNumber" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.productNumber" placeholder="产品公司编号"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="责任单位:" prop="dutyUnitId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.dutyUnitId"
+                  placeholder="请选择部门"
+                  style="width: 240px;margin-bottom: 5px"
+              >
+                <el-option
+                    v-for="item in state.deptList"
+                    :key="item.deptId"
+                    :label="item.deptName"
+                    :value="item.deptId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="产品件号:" prop="partNum" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.partNum" placeholder="产品件号"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="反馈单位:" prop="feedUnitId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.feedUnitId"
+                  placeholder="请选择部门"
+                  style="width: 240px;margin-bottom: 5px"
+              >
+                <el-option
+                    v-for="item in state.deptList"
+                    :key="item.deptId"
+                    :label="item.deptName"
+                    :value="item.deptId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="反馈人:" prop="feedUserId" >
+              <el-select clearable v-model="state.form.feedUserId" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px">
+                <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="8">
+            <el-form-item label="反馈日期:" prop="feedTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.feedTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="反馈质量问题概述:" prop="feedQuestion" >
+              <el-input  :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.feedQuestion" placeholder=""></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="处置情况概述:" prop="dispose" >
+              <el-input  :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.dispose" placeholder=""></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="处置人:" prop="disposeId" >
+              <el-select clearable v-model="state.form.disposeId" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px">
+                <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="disposeTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.disposeTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="检验员:" prop="checkOutId" >
+              <el-select clearable v-model="state.form.checkOutId" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px">
+                <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="checkOutTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.checkOutTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="反馈单位复查人:" prop="reviewId" >
+              <el-select clearable v-model="state.form.reviewId" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px">
+                <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="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="返工工时:" prop="rework" >
+              <el-input  :disabled="title === '查看'" @input="state.form.rework= state.form.rework.replace(/[^\d.]/g, '') .replace(/\.+/g, '.').replace(/^\./, '0.').replace(/^(\d*\.?\d{0,2}).*/, '$1')" v-model="state.form.rework" placeholder="返工工时"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="器材消耗:" prop="equipment" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.equipment" placeholder="器材消耗"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="延误生产工时:" prop="delay" >
+              <el-input  :disabled="title === '查看'" @input="state.form.delay= state.form.delay.replace(/[^\d.]/g, '') .replace(/\.+/g, '.').replace(/^\./, '0.').replace(/^(\d*\.?\d{0,2}).*/, '$1')" v-model="state.form.delay" placeholder="延误生产工时"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="其他质量损伤:" prop="damage" >
+              <el-input  :disabled="title === '查看'" v-model="state.form.damage" placeholder="其他质量损伤"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="检验组长:" prop="teamId" >
+              <el-select clearable v-model="state.form.teamId" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px">
+                <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="teamTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.teamTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="责任单位领导:" prop="dutyLeaderId" >
+              <el-select clearable v-model="state.form.dutyLeaderId" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px">
+                <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="dutyLeaderTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.dutyLeaderTime"
+                  type="date"
+                  placeholder="请选择日期"
+                  value-format="YYYY-MM-DD"
+              />
+            </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 {reactive, ref, toRefs} from 'vue'
+import {ElMessage, ElMessageBox} from "element-plus";
+import {verifyPhone} from "@/utils/validate";
+import Cookies from "js-cookie";
+import {addCustomer, editCustomer} from "@/api/customerList";
+import {getDept} from "@/api/qualityObjectives/object";
+import {getUser} from "@/api/onlineEducation/user";
+import {addInternal, editInternal} from "@/api/internal/need";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const state = reactive({
+  form: {
+    id: '',
+    companyId: '',
+    feedForm: "",
+    number: "",
+    productName: "",
+    productModel: "",
+    productNumber: "",
+    dutyUnitId: null,
+    partNum: "",
+    feedUnitId: null,
+    feedUserId: null,
+    feedTime: "",
+    feedQuestion: "",
+    disposeId: null,
+    disposeTime: "",
+    checkOutId: null,
+    checkOutTime: "",
+    reviewId: null,
+    reviewTime: "",
+    rework: "",
+    equipment: "",
+    delay: "",
+    damage: "",
+    teamId: null,
+    teamTime: "",
+    dutyLeaderId: null,
+    dutyLeaderTime: ""
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    feedForm: [{ required: true, message: '请输入反馈单名称', trigger: 'blur' }],
+    number: [{ required: true, message: '请输入编号', trigger: 'blur' }],
+    productName: [{ required: true, message: '请输入产品名称', trigger: 'blur' }],
+    productModel:[{ required: true, message: '请输入产品型号', trigger: 'blur' }],
+    productNumber: [{ required: true, message: '请输入产品公司编号', trigger: 'blur' }],
+    dutyUnitId: [{ required: true, message: '请输入责任单位', trigger: 'blur' }],
+    partNum: [{ required: true, message: '请输入产品件号', trigger: 'blur' }],
+    feedUnitId: [{ required: true, message: '请输入反馈单位', trigger: 'blur' }],
+    feedUserId: [{ required: true, message: '请选择反馈人', trigger: 'blur' }],
+    feedTime: [{ required: true, message: '请选择反馈日期', trigger: 'blur' }],
+    feedQuestion: [{ required: true, message: '请输入反馈问题描述', trigger: 'blur' }],
+    disposeId: [{ required: true, message: '请选择处置人', trigger: 'blur' }],
+    disposeTime: [{ required: true, message: '请选择处置人日期', trigger: 'blur' }],
+    checkOutId: [{ required: true, message: '请选择检验人', trigger: 'blur' }],
+    checkOutTime: [{ required: true, message: '请选择检验人日期', trigger: 'blur' }],
+    reviewId: [{ required: true, message: '请选择反馈单位复查人', trigger: 'blur' }],
+    reviewTime: [{ required: true, message: '请选择反馈单位复查人日期', trigger: 'blur' }],
+    rework: [{ required: true, message: '请输入返工工时', trigger: 'blur' }],
+    equipment: [{ required: true, message: '请输入器材消耗', trigger: 'blur' }],
+    delay: [{ required: true, message: '请输入延误工时', trigger: 'blur' }],
+    damage: [{ required: true, message: '请输入其他质量损伤', trigger: 'blur' }],
+    teamId: [{ required: true, message: '请选择检验组长', trigger: 'blur' }],
+    teamTime: [{ required: true, message: '请选择检验组长日期', trigger: 'blur' }],
+    dutyLeaderId: [{ required: true, message: '请选择责任单位领导', trigger: 'blur' }],
+    dutyLeaderTime: [{ required: true, message: '请选择责任单位领导日期', trigger: 'blur' }]
+  },
+  companyList: [],
+  isAdmin: false,
+  deptList: [],
+  peopleList: [],
+})
+
+
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  await getDeptList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+const getDeptList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  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 onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(!state.isAdmin){
+    const userInfo = JSON.parse(Cookies.get('userInfo'))
+    state.form.companyId = userInfo.companyId
+  }
+  if(valid){
+    if(title.value === '新增'){
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addInternal(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑'){
+      const {...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editInternal(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }
+  }
+}
+
+const handleClose = () => {
+  busRef.value.clearValidate();
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+
+}
+const selectValueCom = (val) => {
+  state.form.dutyUnitId = null
+  state.form.feedUnitId = null
+  state.form.feedUserId = null
+  state.form.disposeId = null
+  state.form.checkOutId = null
+  state.form.reviewId = null
+  state.form.dutyLeaderId = null
+  state.form.teamId = null
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+  getPeopleList()
+  getDeptList()
+}
+
+const reset = () => {
+  state.form = {
+    id: '',
+    companyId: '',
+    feedForm: "",
+    number: "",
+    productName: "",
+    productModel: "",
+    productNumber: "",
+    dutyUnitId: null,
+    partNum: "",
+    feedUnitId: null,
+    feedUserId: null,
+    feedTime: "",
+    feedQuestion: "",
+    disposeId: null,
+    disposeTime: "",
+    checkOutId: null,
+    checkOutTime: "",
+    reviewId: null,
+    reviewTime: "",
+    rework: "",
+    equipment: "",
+    delay: "",
+    damage: "",
+    teamId: null,
+    teamTime: "",
+    dutyLeaderId: null,
+    dutyLeaderTime: ""
+  }
+  state.companyList = []
+}
+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/qualityManage/qualityInformationPage/internal/index.vue b/src/views/work/qualityManage/qualityInformationPage/internal/index.vue
new file mode 100644
index 0000000..23d2b59
--- /dev/null
+++ b/src/views/work/qualityManage/qualityInformationPage/internal/index.vue
@@ -0,0 +1,235 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <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="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="企业名称" prop="companyName" align="center" v-if="data.isAdmin" />
+      <el-table-column label="反馈单名称"  align="center">
+        <template #default="scope">
+          <span>{{scope.row.feedForm}}</span>
+        </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>
+          <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>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delTable, getTable} from "@/api/qualityObjectives/table";
+import {delNeedDiscren, getNeedDiscren} from "@/api/need/need";
+import {delCustomerNeed, getCustomerNeed} from "@/api/customerNeed";
+import {delInternal, getInternal} from "@/api/internal/need";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const deptRef = ref()
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false,
+  dialogVisible: false,
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getInternal(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/internalExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  data.forEach(item => {
+    try {
+      generateWordDocument(templatePath.value, item, item.companyName + `_质量信息反馈单(公司内).docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delInternal(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          await getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>

--
Gitblit v1.9.2