From f0454e79847d4bb3a09fbbf53c0ea73902908077 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期五, 20 六月 2025 17:12:38 +0800
Subject: [PATCH] 修改

---
 src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue                |  412 +++++++++
 public/objectCompanyExample.docx                                                                             |    0 
 public/tableDeptExample.docx                                                                                 |    0 
 src/api/qualityObjectives/reportsituation.js                                                                 |   37 
 public/tableCompanyExample.docx                                                                              |    0 
 src/api/qualityObjectives/table.js                                                                           |   43 +
 src/api/qualityObjectives/object.js                                                                          |   51 +
 src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/components/stationCompanyDialog.vue |  344 ++++++++
 src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue                           |  419 +++++++++
 src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue            |  232 +++-
 src/views/build/conpanyFunctionConsult/qualityObjectives/table/index.vue                                     |  379 ++++++++
 public/stationDeptExample.docx                                                                               |    0 
 public/objectDeptExample.docx                                                                                |    0 
 src/utils/exportWord.js                                                                                      |    1 
 src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue                                 |  167 ++-
 public/stationCompanyExample.docx                                                                            |    0 
 src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue             |  424 ++++++++++
 17 files changed, 2,358 insertions(+), 151 deletions(-)

diff --git a/public/objectCompanyExample.docx b/public/objectCompanyExample.docx
index 51785de..9ff0234 100644
--- a/public/objectCompanyExample.docx
+++ b/public/objectCompanyExample.docx
Binary files differ
diff --git a/public/objectDeptExample.docx b/public/objectDeptExample.docx
index 1066bc1..237c980 100644
--- a/public/objectDeptExample.docx
+++ b/public/objectDeptExample.docx
Binary files differ
diff --git a/public/stationCompanyExample.docx b/public/stationCompanyExample.docx
new file mode 100644
index 0000000..c845c03
--- /dev/null
+++ b/public/stationCompanyExample.docx
Binary files differ
diff --git a/public/stationDeptExample.docx b/public/stationDeptExample.docx
new file mode 100644
index 0000000..abd5436
--- /dev/null
+++ b/public/stationDeptExample.docx
Binary files differ
diff --git a/public/tableCompanyExample.docx b/public/tableCompanyExample.docx
new file mode 100644
index 0000000..32d7ab7
--- /dev/null
+++ b/public/tableCompanyExample.docx
Binary files differ
diff --git a/public/tableDeptExample.docx b/public/tableDeptExample.docx
new file mode 100644
index 0000000..e93c8d4
--- /dev/null
+++ b/public/tableDeptExample.docx
Binary files differ
diff --git a/src/api/qualityObjectives/object.js b/src/api/qualityObjectives/object.js
new file mode 100644
index 0000000..53cffa4
--- /dev/null
+++ b/src/api/qualityObjectives/object.js
@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+
+export function getObjectPage(params) {
+    return request({
+        url: '/quality-target/policy/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getObject(params) {
+    return request({
+        url: '/quality-target/policy/listAll',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getDept(params) {
+    return request({
+        url: '/system/dept/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addObjective(data) {
+    return request({
+        url: '/quality-target/policy/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editObject(params) {
+    return request({
+        url: `/quality-target/policy/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delObject(data) {
+    return request({
+        url: `/quality-target/policy/deleted?qualityId=${data}`,
+        method: 'get'
+    })
+}
+
+
diff --git a/src/api/qualityObjectives/reportsituation.js b/src/api/qualityObjectives/reportsituation.js
new file mode 100644
index 0000000..0c21a62
--- /dev/null
+++ b/src/api/qualityObjectives/reportsituation.js
@@ -0,0 +1,37 @@
+import request from '@/utils/request'
+
+
+export function getReport(params) {
+    return request({
+        url: '/quality-target/accomplish/list',
+        method: 'get',
+        params: params
+    })
+}
+
+
+
+export function addReport(data) {
+    return request({
+        url: '/quality-target/accomplish/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editReport(params) {
+    return request({
+        url: `/quality-target/accomplish/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delReport(data) {
+    return request({
+        url: `/quality-target/accomplish/deleted?qualityAccomplishId=${data}`,
+        method: 'get'
+    })
+}
+
+
diff --git a/src/api/qualityObjectives/table.js b/src/api/qualityObjectives/table.js
new file mode 100644
index 0000000..2f5b41f
--- /dev/null
+++ b/src/api/qualityObjectives/table.js
@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+
+
+export function getTable(params) {
+    return request({
+        url: '/quality-target/decompose/list',
+        method: 'get',
+        params: params
+    })
+}
+export function getTargetById(params) {
+    return request({
+        url: '/quality-target/target/list',
+        method: 'get',
+        params: params
+    })
+}
+
+
+export function addTable(data) {
+    return request({
+        url: '/quality-target/decompose/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editTable(params) {
+    return request({
+        url: `/quality-target/decompose/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delTable(data) {
+    return request({
+        url: `/quality-target/decompose/deleted?qualityDecomposeId=${data}`,
+        method: 'get'
+    })
+}
+
+
diff --git a/src/utils/exportWord.js b/src/utils/exportWord.js
index 3ba3d7b..e0ee5c1 100644
--- a/src/utils/exportWord.js
+++ b/src/utils/exportWord.js
@@ -30,6 +30,7 @@
                     linebreaks: true,
                 });
 
+
                 // 设置模板中的占位符数据
                 doc.setData(data);
 
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue
index e8d2b7d..9b37946 100644
--- a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue
@@ -8,35 +8,43 @@
         :close-on-press-escape="false"
         :close-on-click-modal="false"
     >
-      <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules"  label-width="120px" >
+      <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules"  label-width="120px" >
         <el-row :gutter="24">
           <el-col :span="12">
-            <el-form-item label="年份:" prop="creditCode" >
+            <el-form-item label="年份:" prop="year" >
+<!--              <el-input v-model="state.form.year" placeholder="请输入年份"></el-input>-->
               <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.value"
+                    :value="item.label"
                 />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="序号:" prop="creditCode" >
-              <el-input v-model="state.form.code" placeholder="请输入序号" style="width: 100%"></el-input>
+            <el-form-item label="序号:" prop="num" >
+              <el-input :disabled="title === '查看'" v-model="state.form.num" placeholder="请输入序号" style="width: 100%"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="24">
           <el-col :span="12">
-            <el-form-item label="质量目标级别:" prop="creditCode" >
+            <el-form-item label="质量目标级别:" prop="type" >
               <el-select
-                  v-model="state.form.level"
+                  :disabled="title === '查看'"
+                  v-model="state.form.type"
                   placeholder="请选择质量目标级别"
                   style="width: 100%"
               >
@@ -50,20 +58,22 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="公司名称:" prop="creditCode" v-if="state.form.level == 1">
-              <el-input v-model="state.form.companyName" disabled></el-input>
+            <el-form-item label="公司名称:" prop="creditCode" v-if="state.form.type == 1">
+              <el-input  v-model="state.form.companyName" disabled></el-input>
             </el-form-item>
-            <el-form-item label="部门名称:" prop="creditCode" v-else-if="state.form.level == 2">
+            <el-form-item  label="部门名称:" prop="departId" v-else-if="state.form.type == 2">
+<!--              <el-cascader v-model="state.form.departId" :options="state.deptList"  />-->
               <el-select
-                  v-model="state.form.dept"
+                  :disabled="title === '查看'"
+                  v-model="state.form.departId"
                   placeholder="请选择部门"
                   style="width: 240px"
               >
                 <el-option
                     v-for="item in state.deptList"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
+                    :key="item.deptId"
+                    :label="item.deptName"
+                    :value="item.deptId"
                 />
               </el-select>
             </el-form-item>
@@ -71,24 +81,25 @@
         </el-row>
         <el-row :gutter="24">
           <el-col :span="24">
-            <el-form-item :label= "state.form.level==1 ? '公司质量目标' :state.form.level==2 ?'部门质量目标':'质量目标'" >
-              <div style="display: flex;width: 100%">
-                <el-table :data="state.form.objectList" :border="true">
+            <el-form-item required :label= "state.form.type==1 ? '公司质量目标' :state.form.type==2 ?'部门质量目标':'质量目标'" >
+              <div style="display: flex;width: 100%;margin-top: 5px">
+                <el-table :data="state.form.qualityTargets" :border="true">
                   <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
                   <el-table-column label="目标" align="center"  >
                     <template #default="{row,$index}">
-                      <el-form-item :prop="'objectList.' + '[' + $index + ']' + '.objName'" :rules="state.rules.objName">
-                        <el-input  v-model.number="row.objName" placeholder="请输入质量目标"></el-input>
+                      <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.message'" :rules="state.rules.message">
+                        <el-input :disabled="title === '查看'" type="textarea" v-model="row.message" placeholder="请输入质量目标"></el-input>
                       </el-form-item>
                     </template>
                   </el-table-column>
-                  <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+                  <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-if="title !== '查看'" >
                     <template #default="scope" >
                       <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
                     </template>
                   </el-table-column>
                 </el-table>
                 <el-button
+                    :disabled="title === '查看'"
                     style="margin-left: 20px"
                     type="primary"
                     @click="addObject"
@@ -100,15 +111,16 @@
         <el-row :gutter="24">
           <el-col :span="24">
             <el-form-item label="目标测量方法:" prop="method" >
-              <el-input v-model="state.form.method" :rows="4" type="textarea" placeholder="请输入目标测量方法"/>
+              <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" v-if="state.form.level == 2">
+        <el-row :gutter="24" v-if="state.form.type == 2">
           <el-col :span="12">
-            <el-form-item label="编制:" prop="creditCode" >
+            <el-form-item label="编制:" prop="compilationName" >
               <el-select
-                  v-model="state.form.peopleName"
+                  :disabled="title === '查看'"
+                  v-model="state.form.compilationName"
                   filterable
                   remote
                   @change="selectValue"
@@ -128,9 +140,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="日期:" prop="creditCode" >
+            <el-form-item label="日期:" prop="compilationTime" >
               <el-date-picker
-                  v-model="value1"
+                  :disabled="title === '查看'"
+                  v-model="state.form.compilationTime"
                   type="date"
                   placeholder="请选择日期"
               />
@@ -139,12 +152,13 @@
         </el-row>
         <el-row :gutter="24" >
           <el-col :span="12">
-            <el-form-item label="质量管理部:" prop="creditCode" >
+            <el-form-item label="质量管理部:" prop="qualityName" >
               <el-select
-                  v-model="state.form.peopleName2"
+                  :disabled="title === '查看'"
+                  v-model="state.form.qualityName"
                   filterable
                   remote
-                  @change="selectValue"
+                  @change="selectValue1"
                   reserve-keyword
                   placeholder="请输入人员名称"
                   remote-show-suffix
@@ -161,9 +175,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="日期:" prop="creditCode" >
+            <el-form-item label="日期:" prop="qualityTime" >
               <el-date-picker
-                  v-model="value1"
+                  :disabled="title === '查看'"
+                  v-model="state.form.qualityTime"
                   type="date"
                   placeholder="请选择日期"
               />
@@ -172,12 +187,13 @@
         </el-row>
         <el-row :gutter="24">
           <el-col :span="12">
-            <el-form-item label="公司分管领导:" prop="creditCode" >
+            <el-form-item label="公司分管领导:" prop="leadName" >
               <el-select
-                  v-model="state.form.peopleName3"
+                  :disabled="title === '查看'"
+                  v-model="state.form.leadName"
                   filterable
                   remote
-                  @change="selectValue"
+                  @change="selectValue2"
                   reserve-keyword
                   placeholder="请输入人员名称"
                   remote-show-suffix
@@ -194,9 +210,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="日期:" prop="creditCode" >
+            <el-form-item label="日期:" prop="leadTime" >
               <el-date-picker
-                  v-model="value1"
+                  :disabled="title === '查看'"
+                  v-model="state.form.leadTime"
                   type="date"
                   placeholder="请选择日期"
               />
@@ -204,7 +221,7 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
+      <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>
@@ -219,6 +236,7 @@
 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";
 
 const dialogVisible = ref(false);
 const title = ref("");
@@ -229,28 +247,56 @@
 const state = reactive({
   form: {
     id: '',
-    objectList:[],
+    year: '',
+    num: '',
+    type: '',
+    departId: '',
+    method: '',
+    compilationBy:'',
+    compilationTime:'',
+    qualityBy: '',
+    qualityTime:'',
+    leadBy:'',
+    leadTime: '',
+    qualityTargets:[],
 
   },
   rules: {
-    objName: [
-      {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' }],
+    compilationName: [{ required: true, message: '请选择编制人员', trigger: 'blur' }],
+    compilationTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    qualityName: [{ required: true, message: '请选择质量管理部人员', trigger: 'blur' }],
+    qualityTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    leadName: [{ required: true, message: '请选择公司分管领导', trigger: 'blur' }],
+    leadTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    departId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+    objName: [{required: true, message: "质量目标不能为空", trigger: "blur"}],
   },
   deptList: [],
   peopleList: [],
   yearList: [
     {
       value: 1,
-      label: '2025年'
+      label: '2025'
     },
     {
       value: 2,
-      label: '2024年'
+      label: '2024'
     },
     {
       value: 3,
-      label: '2023年'
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
     },
   ],
   levelList: [
@@ -265,52 +311,56 @@
   ]
 })
 
-onMounted(() => {
+const openDialog = async (type, value) => {
   const userInfo = JSON.parse(Cookies.get('userInfo'))
   state.form.companyName = userInfo.companyName
   state.form.companyId = userInfo.companyId
-
-});
-const openDialog = async (type, value) => {
+  await getDeptList()
   title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
-  if(type === 'edit' || type === 'view') {
+  if(type === 'edit' || type === 'review') {
     state.form = JSON.parse(JSON.stringify(value));
   }
   dialogVisible.value = true;
 }
 const addObject = () => {
-  state.form.objectList.push({})
+  state.form.qualityTargets.push({})
+}
+const getDeptList = async () => {
+  const res = await getDept()
+  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 addCompany(data)
-      // if(res.code === 200){
-      //   ElMessage({
-      //     type: 'success',
-      //     message: '新增成功'
-      //   });
-      // }else{
-      //   ElMessage.warning(res.message)
-      // }
+      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))
-      // const res = await editCompany(data)
-      // if(res.code === 200){
-      //   ElMessage({
-      //     type: 'success',
-      //     message: '编辑成功'
-      //   });
-      // }else{
-      //   ElMessage.warning(res.message)
-      // }
+      const {...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editObject(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
       emit("getList")
       busRef.value.clearValidate();
       reset();
@@ -329,12 +379,24 @@
 const reset = () => {
   state.form = {
     id: '',
-
+    year: '',
+    num: '',
+    type: '',
+    departId: '',
+    method: '',
+    compilationBy:'',
+    compilationTime:'',
+    qualityBy: '',
+    qualityTime:'',
+    leadBy:'',
+    leadTime: '',
+    qualityTargets:[],
   }
-  state.form.objectList=[]
+  state.peopleList = []
+
 }
 const handleDelete = (val) => {
-  state.form.objectList = state.form.objectList.filter(item=> item != val)
+  state.form.qualityTargets = state.form.qualityTargets.filter(item=> item != val)
 }
 const getPeopleList = async (val)=>{
   if(val != ""){
@@ -353,10 +415,32 @@
 const selectValue = (val) => {
   state.peopleList.forEach(item => {
     if(item.name === val){
-      state.form.peopleId = item.id
+      state.form.compilationBy = item.id
     }
   })
 }
+const selectValue1 = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.qualityBy = item.id
+    }
+  })
+}
+const selectValue2 = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.leadBy = item.id
+    }
+  })
+}
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.value === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
 
 defineExpose({
   openDialog
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue
index a4f69ec..f663890 100644
--- a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue
@@ -2,8 +2,7 @@
   <div class="app-container">
     <div style="margin-bottom: 10px">
       <el-form style="display: flex;flex-wrap: wrap;">
-<!--        v-if="!data.isAdmin"-->
-          <el-form-item >
+          <el-form-item v-if="!data.isAdmin">
             <el-button
                 type="primary"
                 plain
@@ -33,22 +32,28 @@
             </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.value"
+                  :value="item.label"
               />
             </el-select>
           </el-form-item>
           <el-form-item label="目标级别:" style="margin-left: 20px">
             <el-select
-                v-model="data.queryParams.level"
+                v-model="data.queryParams.type"
                 placeholder="请选择目标级别"
                 style="width: 240px"
             >
@@ -60,7 +65,7 @@
               />
             </el-select>
           </el-form-item>
-          <el-form-item v-if="data.isAdmin">
+          <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>
@@ -79,11 +84,26 @@
       <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
       <el-table-column label="企业名称" prop="companyName" align="center"  />
       <el-table-column label="年份" prop="year" align="center"  />
-      <el-table-column label="质量目标级别" prop="level" align="center"  />
-      <el-table-column label="部门名称" prop="name" align="center"  />
-      <el-table-column label="质量目标" prop="name" align="center"  />
-      <el-table-column label="目标测量方法" prop="name" align="center"  />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+      <el-table-column label="质量目标级别" prop="type" align="center"  >
+        <template #default="scope">
+          {{scope.row.type == 1 ? '公司级' : '部门级'}}
+        </template>
+      </el-table-column>
+      <el-table-column label="部门名称" prop="name" align="center"  >
+        <template #default="scope">
+          <div v-if="scope.row.type == 1">{{scope.row.companyName}}</div>
+          <div v-else>{{scope.row.departName}}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="质量目标" prop="name" align="center">
+        <template #default="scope">
+          <div v-for="(item,index) in scope.row.qualityTargets">
+            <span>{{index + 1}}、{{item.message}}</span>
+          </div>
+        </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>
@@ -114,6 +134,7 @@
 import {getCompany} from "@/api/onlineEducation/company";
 import Cookies from "js-cookie";
 import {generateWordDocument} from "@/utils/exportWord";
+import {delObject, getObjectPage} from "@/api/qualityObjectives/object";
 const { proxy } = getCurrentInstance();
 const loading = ref(false);
 const noticeRef = ref();
@@ -125,22 +146,30 @@
     pageSize: 10,
     companyId: null,
     year: '',
-    level: ''
+    type: ''
   },
   companyList: [],
   isAdmin: false,
   yearList: [
     {
       value: 1,
-      label: '2025年'
+      label: '2025'
     },
     {
       value: 2,
-      label: '2024年'
+      label: '2024'
     },
     {
       value: 3,
-      label: '2023年'
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
     },
   ],
   levelList: [
@@ -163,43 +192,19 @@
   const userInfo = JSON.parse(Cookies.get('userInfo'))
   console.log("userInfo",userInfo)
   data.isAdmin = userInfo.userType === 0;
+  data.queryParams.companyId = userInfo.companyId
   getList();
 });
 const getList = async () => {
-  dataList.value = [
-    {
-      id: 1,
-      level: 1,
-      object: 'xxxx',
-      method:'方法',
-      people2: '秦',
-      date2:'2015-8-1',
-      people3: '秦',
-      date3:'2015-8-1'
-    },
-    {
-      id: 2,
-      level: 2,
-      object: 'xxxxfg ',
-      deptName: '质量管理部',
-      method:'方法',
-      people1: '秦',
-      date1:'2015-8-1',
-      people2: '秦',
-      date2:'2015-8-1',
-      people3: '秦',
-      date3:'2015-8-1'
-    },
-  ]
-  // loading.value = true;
-  // const res = await getCom(data.queryParams);
-  // if(res.code === 200){
-  //   dataList.value = res.data.list
-  //   total.value = res.data.total
-  // }else{
-  //   ElMessage.warning(res.message)
-  // }
-  // loading.value = false;
+  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;
 
 }
 
@@ -245,13 +250,25 @@
 
 /** 重置新增的表单以及其他数据  */
 function reset() {
-  data.queryParams = {
-    companyId: '',
-    pageNum: 1,
-    pageSize: 10,
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
   }
-  choosedData.value = []
-  data.companyList = [];
   getList();
 }
 const exportData = () => {
@@ -263,18 +280,27 @@
 }
 const templatePath = ref('')
 const startGeneration = async () => {
+  let name = ''
   choosedData.value.forEach(item => {
-    if(item.level == 1){
+    console.log('111',item)
+    name = ''
+    item.message = ''
+    if(item.type == 1){
       templatePath.value = '/objectCompanyExample.docx'
+      name = item.companyName
     }else {
       templatePath.value = '/objectDeptExample.docx'
+      name = item.departName
     }
     const now = new Date()
     const year = now.getFullYear()
     const month = (now.getMonth() +1).toString().padStart(2, '0');
     item.nowDate = year + '-' + month
+    item.qualityTargets.forEach((i,index) => {
+      item.message += index+1 +'、' + i.message + '\n'
+    })
     try {
-      generateWordDocument(templatePath.value, item, '质量目标.docx');
+      generateWordDocument(templatePath.value, item, name+'_质量目标.docx');
     } catch (error){
       ElMessage({
         type: 'warning',
@@ -297,19 +323,26 @@
         type: 'warning',
       })
       .then( async() => {
-        // const res = await delNotice(val);
-        // if(res.code === 200){
-        //   ElMessage({
-        //     type: 'success',
-        //     message: '删除成功'
-        //   });
-        //   getList();
-        // }else{
-        //   ElMessage.warning(res.message)
-        // }
+        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.value === value)) { // 确保不是已存在的选项
+    data.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
 </script>
 <style lang="scss">
 .pag-container{
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/components/stationCompanyDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/components/stationCompanyDialog.vue
new file mode 100644
index 0000000..c941030
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/components/stationCompanyDialog.vue
@@ -0,0 +1,344 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="50%"
+        :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-width="120" >
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="质量目标:" prop="qualityId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.qualityId"
+                  placeholder="请选择质量目标"
+                  style="width: 100%"
+                  @change="chooseQuality"
+              >
+                <el-option
+                    v-for="item in state.qualityList"
+                    :key="item.id"
+                    :label="item.message"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="序号:" prop="serial" >
+              <el-input :disabled="title === '查看'" v-model="state.form.serial" placeholder="请输入序号" style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="考核时机:" prop="frequency" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.frequency"
+                  placeholder="请选择年份"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.frequencyList"
+                    :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="state.type == 1 ? '公司质量目标:' : '部门质量目标:'" required>
+              <el-input disabled type="textarea" v-model="state.message" :rows="4"  style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item :label="state.type == 1 ? '公司质量目标完成情况:' : '部门质量目标完成情况:'" prop="accomplish" >
+              <el-input :disabled="title === '查看'" type="textarea" v-model="state.form.accomplish" :rows="4"  style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="未完成质量目标的原因分析及制定的纠正措施:" prop="measure" >
+              <el-input :disabled="title === '查看'" type="textarea" v-model="state.form.measure" :rows="4"  style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="对质量管理体系的改进建议:" prop="opinion" >
+              <el-input :disabled="title === '查看'" type="textarea" v-model="state.form.opinion" :rows="4"  style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item :label="state.type == 1 ? '公司负责人:' : '部门负责人:'" prop="chargeName" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.chargeName"
+                  filterable
+                  remote
+                  @change="selectValue"
+                  reserve-keyword
+                  placeholder="请输入人员名称"
+                  remote-show-suffix
+                  :remote-method="getPeopleList"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="chargeTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.chargeTime"
+                  type="date"
+                  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 {getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+import {addReport, editReport} from "@/api/qualityObjectives/reportsituation";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    qualityId: '',
+    serial: '',
+    frequency: '',
+    accomplish : '',
+    measure: '',
+    opinion:'',
+    chargeId :'',
+    chargeName: '',
+    chargeTime:'',
+    qualityTargets:[],
+  },
+  rules: {
+    qualityId: [{ required: true, message: '请选择质量目标', trigger: 'blur' }],
+    serial: [{ required: true, message: '请输入序号', trigger: 'blur' }],
+    chargeName: [{ required: true, message: '请选择负责人', trigger: 'blur' }],
+    chargeTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    accomplish:[{ required: true, message: '请输入质量目标完成情况', trigger: 'blur' }],
+    frequency:[{ required: true, message: '请选择考核时机', trigger: 'blur' }],
+  },
+  objectList: [],
+  qualityList: [],
+  peopleList: [],
+  type: null,
+  frequencyList: [
+    {
+      value: 1,
+      label: '月'
+    },
+    {
+      value: 2,
+      label: '季度'
+    },
+    {
+      value: 3,
+      label: '年终'
+    },
+    {
+      value: 4,
+      label: '年底'
+    },
+  ],
+  message: ''
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, isCom, value) => {
+
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  state.type = isCom == 'company' ? 1 : 2
+  await getQualityList()
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    chooseQuality(state.form.qualityId)
+  }
+  dialogVisible.value = true;
+}
+
+const getQualityList = async () => {
+  const res = await getObject({companyId:state.form.companyId,type: state.type });
+  if(res.code === 200){
+    state.qualityList = res.data.data.map(item => {
+      return {
+        ...item,
+        message: item.qualityTargets.map((i,index) => {
+          return  i.message
+        }).join(';')
+      }
+    })
+
+  }else{
+    ElMessage.warning(res.message)
+  }
+
+}
+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 addReport(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 editReport(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: '',
+    qualityId: '',
+    serial: '',
+    accomplish : '',
+    measure: '',
+    opinion:'',
+    chargeId :'',
+    chargeName: '',
+    chargeTime:'',
+    frequency:'',
+    qualityTargets:[],
+  }
+  state.peopleList = []
+  state.message = ''
+}
+const getPeopleList = async (val)=>{
+  if(val != ""){
+    const queryParams = {
+      name: val
+    }
+    const res = await getUser(queryParams)
+    if (res.code == 200) {
+      state.peopleList = res.data.list
+
+    } else {
+      ElMessage.warning(res.message)
+    }
+  }
+}
+const selectValue = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.chargeId = item.id
+    }
+  })
+}
+
+const chooseQuality = async (val) => {
+  state.message = ''
+  const res = await getTargetById({qualityId: val})
+  if(res.code == 200){
+    state.form.qualityTargets = res.data
+    res.data.forEach((i,index) => {
+      state.message += index+1 +'、' + i.message + '\n'
+    })
+
+  }else {
+    ElMessage.warning(res.message)
+  }
+  console.log('val',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/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue
index 762e8b7..1d6162e 100644
--- a/src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue
@@ -1,11 +1,420 @@
-<script setup>
-
-</script>
-
 <template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item v-if="!data.isAdmin">
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openAddDialog"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.companyName"
+              filterable
+              remote
+              @change="selectValue"
+              reserve-keyword
+              placeholder="请输入企业名称"
+              remote-show-suffix
+              :remote-method="getCompanyList"
+              :loading="loadingCompany"
+              style="width: 240px"
+          >
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+            />
+          </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 label="目标级别:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.type"
+              placeholder="请选择目标级别"
+              style="width: 240px"
+          >
+            <el-option
+                v-for="item in data.levelList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+            />
+          </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"  />
+      <el-table-column label="年份" prop="year" align="center"  />
+      <el-table-column label="质量目标级别" prop="type" align="center"  >
+        <template #default="scope">
+          {{scope.row.type == 1 ? '公司级' : '部门级'}}
+        </template>
+      </el-table-column>
+      <el-table-column label="部门名称" prop="name" align="center"  >
+        <template #default="scope">
+          <div v-if="scope.row.type == 1">{{scope.row.companyName}}</div>
+          <div v-else>{{scope.row.departName}}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="质量目标"  align="center"  >
+        <template #default="scope">
+          <div v-for="i in scope.row.message">{{i}}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="质量目标完成情况" align="center"  >
+        <template #default="scope">
+          <div v-html="scope.row.accomplishMessage"></div>
+        </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="scope.row.type == 1?openDialog('review','company',scope.row):openDialog('review','dept',scope.row) " >查看</el-button>
+          <el-button link type="primary"  @click="scope.row.type == 1?openDialog('edit','company',scope.row):openDialog('edit','dept',scope.row)  " >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <el-dialog
+        v-model="data.dialogVisible"
+        width="500px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <div style="margin: 10px;display: flex;flex-direction: column;align-items: center;justify-content: center">
+        <span style="font-size: 24px;font-weight: 600">新增质量目标完成情况</span>
+        <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 30px;width: 80%">
+          <el-button type="primary" @click="openDialog('add','company',{})">公司级质量目标完成情况</el-button>
+          <el-button type="primary" @click="openDialog('add','dept',{})">部门级质量目标完成情况</el-button>
+        </div>
+      </div>
+
+    </el-dialog>
+    <stationCompanyDialog ref="noticeRef" @getList = "getList"></stationCompanyDialog>
+  </div>
 </template>
 
-<style scoped lang="scss">
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import stationCompanyDialog from "./components/stationCompanyDialog.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 {delReport, getReport} from "@/api/qualityObjectives/reportsituation";
+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,
+  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: '部门级'
+    },
+  ],
+  frequencyList: [
+    {
+      value: 1,
+      label: '月'
+    },
+    {
+      value: 2,
+      label: '季度'
+    },
+    {
+      value: 3,
+      label: '年终'
+    },
+    {
+      value: 4,
+      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;
+  data.queryParams.companyId = userInfo.companyId
+  getList();
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getReport(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list.map(item =>{
+      return {
+        ...item,
+        message: item.qualityTargets.map((i,index) => {
+          return index+1 +'、' + i.message + '\n'
+        }),
+        accomplishMessage:item.accomplish.replace(/\n/g, '<br>')
+      }
+    })
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openAddDialog = () => {
+  data.dialogVisible = true
+}
+const openDialog = (type,isCom, value) => {
+  noticeRef.value.openDialog(type, isCom,value);
+}
+const openDeptDialog = (type, value) => {
+  deptRef.value.openDialog(type, value);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async (val)=>{
+  if(val != ""){
+    loadingCompany.value = true;
+    const queryParams = {
+      name: val
+    }
+    const res = await getCompany(queryParams)
+    if (res.code == 200) {
+      loadingCompany.value = false;
+      data.companyList = 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 = [];
+  }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('')
+const startGeneration = async () => {
+  const frequencyList =   JSON.parse(JSON.stringify(data.frequencyList))
+  const dataList = JSON.parse(JSON.stringify(choosedData.value))
+  let name = ''
+  let message = ''
+  dataList.forEach(item => {
+    name = ''
+    message = ''
+    console.log('item',item)
+    if(item.type == 1){
+      templatePath.value = '/stationCompanyExample.docx'
+      name = item.companyName
+    }else {
+      templatePath.value = '/stationDeptExample.docx'
+      name = item.departName
+    }
+    const now = new Date()
+    const year = now.getFullYear()
+    const month = (now.getMonth() +1).toString().padStart(2, '0');
+    item.nowDate = year + '-' + month
+    item.year = year
+    item.qualityTargets.forEach((i,index) => {
+      message += index+1 +'、' + i.message + '\n'
+    })
+    item.message = message
+    frequencyList.forEach(i => {
+      i.checked = i.label !== item.frequency
+    })
+    item.typeList = frequencyList
+    try {
+      generateWordDocument(templatePath.value, item, name+'_质量目标完成情况报告.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 delReport(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.value === value)) { // 确保不是已存在的选项
+    data.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
 </style>
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue
new file mode 100644
index 0000000..761114b
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableCompanyDialog.vue
@@ -0,0 +1,424 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="50%"
+        :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"    >
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="质量目标:" prop="qualityId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.qualityId"
+                  placeholder="请选择质量目标"
+                  style="width: 100%"
+                  @change="chooseQuality"
+              >
+                <el-option
+                    v-for="item in state.qualityList"
+                    :key="item.id"
+                    :label="item.message"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="编号:" prop="number" >
+              <el-input :disabled="title === '查看'" v-model="state.form.number" placeholder="请输入编号" style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="序号:" prop="serial" >
+              <el-input :disabled="title === '查看'" v-model="state.form.serial" placeholder="请输入序号" style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <span style="font-size: 15px;font-weight: 700;" >公司级质量目标分解表:</span>
+              <el-table style="margin-top: 10px;margin-bottom: 20px" :data="state.form.qualityTargets" :border="true">
+                <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                <el-table-column label="目标项目" prop="message" align="center"  />
+                <el-table-column label="目标值" align="center"  >
+                  <template #default="{row,$index}">
+                    <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.num'" :rules="state.rules.num">
+                      <el-input :disabled="title === '查看'" type="textarea" v-model="row.num" placeholder="请输入"></el-input>
+                    </el-form-item>
+                  </template>
+                </el-table-column>
+                <el-table-column label="实施措施及需要的资源" align="center"  width="180">
+                  <template #default="{row,$index}">
+                    <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.method'" :rules="state.rules.method">
+                      <el-input :disabled="title === '查看'"  type="textarea" v-model="row.method" placeholder="请输入"></el-input>
+                    </el-form-item>
+                  </template>
+                </el-table-column>
+                <el-table-column label="计算/统计方法" align="center"  >
+                  <template #default="{row,$index}">
+                    <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.calculate'" :rules="state.rules.calculate">
+                      <el-input :disabled="title === '查看'"  type="textarea" v-model="row.calculate" placeholder="请输入"></el-input>
+                    </el-form-item>
+                  </template>
+                </el-table-column>
+                <el-table-column label="数据源" align="center"  >
+                  <template #default="{row,$index}">
+                    <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.dataSource'" :rules="state.rules.dataSource">
+                      <el-input :disabled="title === '查看'"  type="textarea" v-model="row.dataSource" placeholder="请输入"></el-input>
+                    </el-form-item>
+                  </template>
+                </el-table-column>
+                <el-table-column label="提供部门" align="center"  >
+                  <template #default="{row,$index}">
+                    <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.departName'" :rules="state.rules.departName">
+                      <el-input :disabled="title === '查看'"  type="textarea" v-model="row.departName" placeholder="请输入"></el-input>
+                    </el-form-item>
+                  </template>
+                </el-table-column>
+                <el-table-column label="考核频次" align="center"  >
+                  <template #default="{row,$index}">
+                    <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.frequency'" :rules="state.rules.frequency">
+                      <el-input :disabled="title === '查看'"  type="textarea" v-model="row.frequency" placeholder="请输入"></el-input>
+                    </el-form-item>
+                  </template>
+                </el-table-column>
+              </el-table>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="拟制:" prop="fictionName" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.fictionName"
+                  filterable
+                  remote
+                  @change="selectValue"
+                  reserve-keyword
+                  placeholder="请输入人员名称"
+                  remote-show-suffix
+                  :remote-method="getPeopleList"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                />
+              </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="请选择日期"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24" >
+          <el-col :span="12">
+            <el-form-item label="审核:" prop="checkName" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.checkName"
+                  filterable
+                  remote
+                  @change="selectValue1"
+                  reserve-keyword
+                  placeholder="请输入人员名称"
+                  remote-show-suffix
+                  :remote-method="getPeopleList"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="checkTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.checkTime"
+                  type="date"
+                  placeholder="请选择日期"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="批准:" prop="ratifyName" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.ratifyName"
+                  filterable
+                  remote
+                  @change="selectValue2"
+                  reserve-keyword
+                  placeholder="请输入人员名称"
+                  remote-show-suffix
+                  :remote-method="getPeopleList"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="ratifyTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.ratifyTime"
+                  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 {getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    qualityId: '',
+    number: '',
+    serial: '',
+    fictionId : '',
+    fictionName: '',
+    fictionTime:'',
+    checkId :'',
+    checkName: '',
+    checkTime:'',
+    ratifyId:'',
+    ratifyName: '',
+    ratifyTime: '',
+    qualityTargets:[],
+  },
+  rules: {
+    qualityId: [{ required: true, message: '请选择质量目标', trigger: 'blur' }],
+    number: [{ required: true, message: '请输入编号', trigger: 'blur' }],
+    serial: [{ required: true, message: '请输入序号', trigger: 'blur' }],
+    fictionName: [{ required: true, message: '请选择拟制', trigger: 'blur' }],
+    ratifyName: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+    checkName: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    checkTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    ratifyTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    fictionTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    num: [{required: true, message: "", trigger: "blur"}],
+    method: [{required: true, message: "", trigger: "blur"}],
+    calculate: [{required: true, message: "", trigger: "blur"}],
+    dataSource: [{required: true, message: "", trigger: "blur"}],
+    departName: [{required: true, message: "", trigger: "blur"}],
+    frequency: [{required: true, message: "", trigger: "blur"}],
+  },
+  objectList: [],
+  qualityList: [],
+  peopleList: [],
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  await getQualityList()
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+  }
+  dialogVisible.value = true;
+}
+
+const getQualityList = async () => {
+  const res = await getObject({companyId:state.form.companyId,type: 1 });
+  if(res.code === 200){
+    state.qualityList = res.data.data.map(item => {
+      return {
+        ...item,
+        message: item.qualityTargets.map((i,index) => {
+          return  i.message
+        }).join(';')
+      }
+    })
+  }else{
+    ElMessage.warning(res.message)
+  }
+
+}
+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 addTable(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 editTable(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: '',
+    qualityId: '',
+    number: '',
+    serial: '',
+    fictionId : '',
+    fictionName: '',
+    fictionTime:'',
+    checkId :'',
+    checkName: '',
+    checkTime:'',
+    ratifyId:'',
+    ratifyName: '',
+    ratifyTime: '',
+    qualityTargets:[],
+  }
+  state.peopleList = []
+}
+const getPeopleList = async (val)=>{
+  if(val != ""){
+    const queryParams = {
+      name: val
+    }
+    const res = await getUser(queryParams)
+    if (res.code == 200) {
+      state.peopleList = res.data.list
+
+    } else {
+      ElMessage.warning(res.message)
+    }
+  }
+}
+const selectValue = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.fictionId = item.id
+    }
+  })
+}
+const selectValue1 = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.checkId  = item.id
+    }
+  })
+}
+const selectValue2 = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.ratifyId = item.id
+    }
+  })
+}
+
+const chooseQuality = async (val) => {
+  const res = await getTargetById({qualityId: val})
+  if(res.code == 200){
+    state.form.qualityTargets = res.data
+
+  }else {
+    ElMessage.warning(res.message)
+  }
+  console.log('val',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/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue
new file mode 100644
index 0000000..971aab0
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/components/tableDeptDialog.vue
@@ -0,0 +1,412 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="50%"
+        :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"    >
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="质量目标:" prop="qualityId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.qualityId"
+                  placeholder="请选择质量目标"
+                  style="width: 100%"
+                  @change="chooseQuality"
+              >
+                <el-option
+                    v-for="item in state.qualityList"
+                    :key="item.id"
+                    :label="item.message"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="编号:" prop="number" >
+              <el-input :disabled="title === '查看'" v-model="state.form.number" placeholder="请输入编号" style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <span style="font-size: 15px;font-weight: 700;" >公司级质量目标分解表:</span>
+            <el-table style="margin-top: 10px;margin-bottom: 20px" :data="state.form.qualityTargets" :border="true">
+              <el-table-column type="index" label="序号"  align="center"></el-table-column>
+              <el-table-column label="目标项目" prop="message" align="center"  />
+              <el-table-column label="目标展开" align="center"  >
+                <template #default="{row,$index}">
+                  <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.method'" :rules="state.rules.method">
+                    <el-input :disabled="title === '查看'" type="textarea" v-model="row.method" placeholder="请输入"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="实施对策" align="center"  >
+                <template #default="{row,$index}">
+                  <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.calculate'" :rules="state.rules.calculate">
+                    <el-input :disabled="title === '查看'"  type="textarea" v-model="row.calculate" placeholder="请输入"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="责任人" align="center"  >
+                <template #default="{row,$index}">
+                  <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.dutyName'" :rules="state.rules.dutyName">
+                    <el-input :disabled="title === '查看'"  type="textarea" v-model="row.dutyName" placeholder="请输入"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="考核时机" align="center"  >
+                <template #default="{row,$index}">
+                  <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.frequency'" :rules="state.rules.frequency">
+                    <el-input :disabled="title === '查看'"  type="textarea" v-model="row.frequency" placeholder="请输入"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="备注" align="center"  >
+                <template #default="{row,$index}">
+                  <el-form-item :prop="'qualityTargets.' + '[' + $index + ']' + '.remark'">
+                    <el-input :disabled="title === '查看'"  type="textarea" v-model="row.remark" placeholder="请输入"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="编制:" prop="fictionName" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.fictionName"
+                  filterable
+                  remote
+                  @change="selectValue"
+                  reserve-keyword
+                  placeholder="请输入人员名称"
+                  remote-show-suffix
+                  :remote-method="getPeopleList"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                />
+              </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="请选择日期"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24" >
+          <el-col :span="12">
+            <el-form-item label="审核:" prop="checkName" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.checkName"
+                  filterable
+                  remote
+                  @change="selectValue1"
+                  reserve-keyword
+                  placeholder="请输入人员名称"
+                  remote-show-suffix
+                  :remote-method="getPeopleList"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="checkTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.checkTime"
+                  type="date"
+                  placeholder="请选择日期"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="批准(公司分管领导):" prop="ratifyName" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.ratifyName"
+                  filterable
+                  remote
+                  @change="selectValue2"
+                  reserve-keyword
+                  placeholder="请输入人员名称"
+                  remote-show-suffix
+                  :remote-method="getPeopleList"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="ratifyTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.ratifyTime"
+                  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 {getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    qualityId: '',
+    number: '',
+    serial: '',
+    fictionId : '',
+    fictionName: '',
+    fictionTime:'',
+    checkId :'',
+    checkName: '',
+    checkTime:'',
+    ratifyId:'',
+    ratifyName: '',
+    ratifyTime: '',
+    qualityTargets:[],
+  },
+  rules: {
+    qualityId: [{ required: true, message: '请选择质量目标', trigger: 'blur' }],
+    number: [{ required: true, message: '请输入编号', trigger: 'blur' }],
+    serial: [{ required: true, message: '请输入序号', trigger: 'blur' }],
+    fictionName: [{ required: true, message: '请选择拟制', trigger: 'blur' }],
+    ratifyName: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+    checkName: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    checkTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    ratifyTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    fictionTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    dutyName: [{required: true, message: "", trigger: "blur"}],
+    method: [{required: true, message: "", trigger: "blur"}],
+    calculate: [{required: true, message: "", trigger: "blur"}],
+    dataSource: [{required: true, message: "", trigger: "blur"}],
+    departName: [{required: true, message: "", trigger: "blur"}],
+    frequency: [{required: true, message: "", trigger: "blur"}],
+  },
+  objectList: [],
+  qualityList: [],
+  peopleList: [],
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  await getQualityList()
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+  }
+  dialogVisible.value = true;
+}
+
+const getQualityList = async () => {
+  const res = await getObject({companyId:state.form.companyId,type: 2 });
+  if(res.code === 200){
+    state.qualityList = res.data.data.map(item => {
+      return {
+        ...item,
+        message: item.qualityTargets.map((i,index) => {
+          return  i.message
+        }).join(';')
+      }
+    })
+  }else{
+    ElMessage.warning(res.message)
+  }
+
+}
+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 addTable(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 editTable(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: '',
+    qualityId: '',
+    number: '',
+    serial: '',
+    fictionId : '',
+    fictionName: '',
+    fictionTime:'',
+    checkId :'',
+    checkName: '',
+    checkTime:'',
+    ratifyId:'',
+    ratifyName: '',
+    ratifyTime: '',
+    qualityTargets:[],
+  }
+  state.peopleList = []
+}
+const getPeopleList = async (val)=>{
+  if(val != ""){
+    const queryParams = {
+      name: val
+    }
+    const res = await getUser(queryParams)
+    if (res.code == 200) {
+      state.peopleList = res.data.list
+
+    } else {
+      ElMessage.warning(res.message)
+    }
+  }
+}
+const selectValue = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.fictionId = item.id
+    }
+  })
+}
+const selectValue1 = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.checkId  = item.id
+    }
+  })
+}
+const selectValue2 = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.ratifyId = item.id
+    }
+  })
+}
+
+const chooseQuality = async (val) => {
+  const res = await getTargetById({qualityId: val})
+  if(res.code == 200){
+    state.form.qualityTargets = res.data
+
+  }else {
+    ElMessage.warning(res.message)
+  }
+  console.log('val',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/build/conpanyFunctionConsult/qualityObjectives/table/index.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/index.vue
index 762e8b7..5ea28e2 100644
--- a/src/views/build/conpanyFunctionConsult/qualityObjectives/table/index.vue
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/index.vue
@@ -1,11 +1,380 @@
-<script setup>
-
-</script>
-
 <template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item v-if="!data.isAdmin">
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openAddDialog"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.companyName"
+              filterable
+              remote
+              @change="selectValue"
+              reserve-keyword
+              placeholder="请输入企业名称"
+              remote-show-suffix
+              :remote-method="getCompanyList"
+              :loading="loadingCompany"
+              style="width: 240px"
+          >
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+            />
+          </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 label="目标级别:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.type"
+              placeholder="请选择目标级别"
+              style="width: 240px"
+          >
+            <el-option
+                v-for="item in data.levelList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+            />
+          </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"  />
+      <el-table-column label="年份" prop="year" align="center"  />
+      <el-table-column label="质量目标级别" prop="type" align="center"  >
+        <template #default="scope">
+          {{scope.row.type == 1 ? '公司级' : '部门级'}}
+        </template>
+      </el-table-column>
+      <el-table-column label="部门名称" prop="name" align="center"  >
+        <template #default="scope">
+          <div v-if="scope.row.type == 1">{{scope.row.companyName}}</div>
+          <div v-else>{{scope.row.departName}}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="目标分解表" prop="name" align="center"  >
+        <template #default="scope">
+          <div v-if="scope.row.type == 1">{{scope.row.year}}公司级质量目标分解表</div>
+          <div v-else>{{scope.row.year}}{{scope.row.departName}}质量目标分解表</div>
+        </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="scope.row.type == 1?openDialog('review',scope.row):openDeptDialog('review',scope.row) " >查看</el-button>
+          <el-button link type="primary"  @click="scope.row.type == 1?openDialog('edit',scope.row):openDeptDialog('edit',scope.row)  " >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <el-dialog
+        v-model="data.dialogVisible"
+        width="500px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <div style="margin: 10px;display: flex;flex-direction: column;align-items: center;justify-content: center">
+        <span style="font-size: 24px;font-weight: 600">新增质量目标分解表</span>
+        <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 30px;width: 80%">
+          <el-button type="primary" @click="openDialog('add',{})">公司级质量目标分解表</el-button>
+          <el-button type="primary" @click="openDeptDialog('add',{})">部门级质量目标分解表</el-button>
+        </div>
+      </div>
+
+    </el-dialog>
+    <tableCompanyDialog ref="noticeRef" @getList = "getList"></tableCompanyDialog>
+    <tableDeptDialog ref="deptRef" @getList = "getList"></tableDeptDialog>
+  </div>
 </template>
 
-<style scoped lang="scss">
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import tableCompanyDialog from "./components/tableCompanyDialog.vue"
+import tableDeptDialog from "./components/tableDeptDialog.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";
+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,
+  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;
+  data.queryParams.companyId = userInfo.companyId
+  getList();
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getTable(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 openAddDialog = () => {
+  data.dialogVisible = true
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value);
+}
+const openDeptDialog = (type, value) => {
+  deptRef.value.openDialog(type, value);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async (val)=>{
+  if(val != ""){
+    loadingCompany.value = true;
+    const queryParams = {
+      name: val
+    }
+    const res = await getCompany(queryParams)
+    if (res.code == 200) {
+      loadingCompany.value = false;
+      data.companyList = 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 = [];
+  }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('')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  let name = ''
+  data.forEach(item => {
+    name = ''
+    console.log('item',item)
+    if(item.type == 1){
+      templatePath.value = '/tableCompanyExample.docx'
+      name = item.companyName
+    }else {
+      templatePath.value = '/tableDeptExample.docx'
+      name = item.departName
+    }
+    const now = new Date()
+    const year = now.getFullYear()
+    const month = (now.getMonth() +1).toString().padStart(2, '0');
+    item.nowDate = year + '-' + month
+    item.year = year
+    item.tableData = item.qualityTargets
+    try {
+      generateWordDocument(templatePath.value, item, name+'_质量目标分解表.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 delTable(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.value === value)) { // 确保不是已存在的选项
+    data.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
 </style>

--
Gitblit v1.9.2