From fe88b085ed1f358543a32ef9873dc28b23a9e6b5 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期五, 01 八月 2025 16:57:48 +0800
Subject: [PATCH] 修改

---
 src/views/build/conpanyFunctionConsult/staffManage/staffdescribe/components/editDialog.vue        |  200 ++
 public/riskRecordExample.docx                                                                     |    0 
 src/views/build/conpanyFunctionConsult/riskManage/control/components/editDialog.vue               |  527 +++++
 src/views/build/conpanyFunctionConsult/staffManage/staffdescribe/index.vue                        |  277 +++
 public/evaluateExample.docx                                                                       |    0 
 src/api/environment/factors.js                                                                    |   72 
 src/views/build/conpanyFunctionConsult/environment/environmentalFactors/index.vue                 |  324 +++
 src/views/build/conpanyFunctionConsult/riskManage/control/index.vue                               |  335 +++
 public/riskControlExample.docx                                                                    |    0 
 src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue |  543 +++++
 src/views/build/conpanyFunctionConsult/riskManage/record/index.vue                                |  335 +++
 src/views/build/conpanyFunctionConsult/need/needIdentify/index.vue                                |  312 +++
 src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue                    |  406 ++++
 public/controlFactorExample.docx                                                                  |    0 
 public/needIdentifyExample.docx                                                                   |    0 
 public/environmentalFactorsExample.docx                                                           |    0 
 src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue       |  469 +++++
 src/views/build/conpanyFunctionConsult/riskManage/record/components/editDialog.vue                |  511 +++++
 src/views/build/conpanyFunctionConsult/need/needIdentify/components/editDialog.vue                |  458 +++++
 src/api/staffManage/staff.js                                                                      |   33 
 src/views/build/conpanyFunctionConsult/environment/controlFactors/index.vue                       |  329 +++
 src/views/build/conpanyFunctionConsult/need/evaluate/index.vue                                    |  312 +++
 22 files changed, 5,443 insertions(+), 0 deletions(-)

diff --git a/public/controlFactorExample.docx b/public/controlFactorExample.docx
new file mode 100644
index 0000000..5136b54
--- /dev/null
+++ b/public/controlFactorExample.docx
Binary files differ
diff --git a/public/environmentalFactorsExample.docx b/public/environmentalFactorsExample.docx
new file mode 100644
index 0000000..df01771
--- /dev/null
+++ b/public/environmentalFactorsExample.docx
Binary files differ
diff --git a/public/evaluateExample.docx b/public/evaluateExample.docx
new file mode 100644
index 0000000..4385b68
--- /dev/null
+++ b/public/evaluateExample.docx
Binary files differ
diff --git a/public/needIdentifyExample.docx b/public/needIdentifyExample.docx
new file mode 100644
index 0000000..2df35ac
--- /dev/null
+++ b/public/needIdentifyExample.docx
Binary files differ
diff --git a/public/riskControlExample.docx b/public/riskControlExample.docx
new file mode 100644
index 0000000..23e400f
--- /dev/null
+++ b/public/riskControlExample.docx
Binary files differ
diff --git a/public/riskRecordExample.docx b/public/riskRecordExample.docx
new file mode 100644
index 0000000..9480cbd
--- /dev/null
+++ b/public/riskRecordExample.docx
Binary files differ
diff --git a/src/api/environment/factors.js b/src/api/environment/factors.js
new file mode 100644
index 0000000..6166149
--- /dev/null
+++ b/src/api/environment/factors.js
@@ -0,0 +1,72 @@
+import request from '@/utils/request'
+
+
+export function getDiscern(params) {
+    return request({
+        url: '/composite/factor/discern/list',
+        method: 'get',
+        params: params
+    })
+}
+export function getDiscernAll(params) {
+    return request({
+        url: '/composite/factor/discern/listAll',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addDiscern(data) {
+    return request({
+        url: '/composite/factor/discern/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editDiscern(params) {
+    return request({
+        url: `/composite/factor/discern/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delDiscern(data) {
+    return request({
+        url: `/composite/factor/discern/deleted?factorDiscrenId=${data}`,
+        method: 'get'
+    })
+}
+
+//控制
+export function getControl(params) {
+    return request({
+        url: '/composite/factor/control/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addControl(data) {
+    return request({
+        url: '/composite/factor/control/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editControl(params) {
+    return request({
+        url: `/composite/factor/control/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delControl(data) {
+    return request({
+        url: `/composite/factor/control/deleted?factorControlId=${data}`,
+        method: 'get'
+    })
+}
diff --git a/src/api/staffManage/staff.js b/src/api/staffManage/staff.js
index da52611..410505e 100644
--- a/src/api/staffManage/staff.js
+++ b/src/api/staffManage/staff.js
@@ -118,3 +118,36 @@
         params: params
     })
 }
+
+//岗位职务说明
+export function getJob(params) {
+    return request({
+        url: '/system/user/position/jobList',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addJob(data) {
+    return request({
+        url: '/system/user/position/savejob',
+        method: 'post',
+        data: data
+    })
+}
+
+export function updateJob(data) {
+    return request({
+        url: '/system/user/position/updatejob',
+        method: 'post',
+        data: data
+    })
+}
+
+export function delJob(params) {
+    return request({
+        url: '/system/user/position/deletedjob',
+        method: 'get',
+        params: params
+    })
+}
diff --git a/src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue
new file mode 100644
index 0000000..75dfcf8
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/environment/controlFactors/components/editDialog.vue
@@ -0,0 +1,469 @@
+<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="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="内外部环境要素识别表:" prop="factorDiscernId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.factorDiscernId"
+                  placeholder="请选择"
+                  style="width: 100%"
+                  filterable
+                  @change="changeFactor"
+                  :reserve-keyword="false"
+              >
+                <el-option
+                    v-for="item in state.factorDiscernList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="编号:" prop="number" >
+              <el-input v-model="state.form.number" :disabled="title === '查看'" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="外部环境:" prop="outEnvironment" >
+              <div style="display: flex;width: 100%;margin-top: 5px">
+                <el-table :data="state.form.outEnvironment" :border="true" >
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="环境因素" prop="factorName" align="center" >
+                  </el-table-column>
+                  <el-table-column label="环境因素现状" prop="factorMess" align="center" >
+                  </el-table-column>
+                  <el-table-column label="环境影响(正面/负面)" prop="influence" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.influence'" :rules="state.rules.influence">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.influence" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="监视(方法)" prop="monitorMethod" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.monitorMethod'" :rules="state.rules.monitorMethod">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.monitorMethod" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="评审(结论)" prop="review" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.review'" :rules="state.rules.review">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.review" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="应对措施" prop="solutions" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.solutions'" :rules="state.rules.solutions">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.solutions" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="结果" prop="result" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.result'" :rules="state.rules.result">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.result" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="内部环境:" prop="inEnvironment" >
+              <div style="display: flex;width: 100%;">
+                <el-table :data="state.form.inEnvironment" :border="true" >
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="环境因素" prop="factorName" align="center" >
+                  </el-table-column>
+                  <el-table-column label="环境因素现状" prop="factorMess" align="center" >
+                  </el-table-column>
+                  <el-table-column label="环境影响(正面/负面)" prop="influence" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'inEnvironment.' + '[' + $index + ']' + '.influence'" :rules="state.rules.influence">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.influence" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="监视(方法)" prop="monitorMethod" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'inEnvironment.' + '[' + $index + ']' + '.monitorMethod'" :rules="state.rules.monitorMethod">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.monitorMethod" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="评审(结论)" prop="review" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'inEnvironment.' + '[' + $index + ']' + '.review'" :rules="state.rules.review">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.review" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="应对措施" prop="solutions" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'inEnvironment.' + '[' + $index + ']' + '.solutions'" :rules="state.rules.solutions">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.solutions" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="结果" prop="result" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'inEnvironment.' + '[' + $index + ']' + '.result'" :rules="state.rules.result">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.result" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="监视和评审频次:" prop="frequency" >
+              <el-input  :disabled="title === '查看'" type="textarea" :rows="1" v-model="state.form.frequency" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="编制:" prop="fictionId" >
+              <el-select clearable v-model="state.form.fictionId" :disabled="title =='查看'" filterable  style="width: 100%">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="审核:" prop="checkId" >
+              <el-select clearable v-model="state.form.checkId" :disabled="title =='查看'" filterable  style="width: 100%">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="批准:" prop="ratifyId" >
+              <el-select clearable v-model="state.form.ratifyId" :disabled="title =='查看'" filterable  style="width: 100%">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer v-if="title !== '查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {onMounted, reactive, ref, toRefs} from 'vue'
+import Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+import {addControl, editControl, getControl, getDiscernAll} from "@/api/environment/factors";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    factorDiscernId: null,
+    number: '',
+    frequency: '',
+    fictionId: null,
+    checkId: null,
+    ratifyId: null,
+    outEnvironment:[],
+    inEnvironment: [],
+    factorContents: []
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    factorDiscernId: [{ required: true, message: '请选择内外部环境要素识别表', trigger: 'blur' }],
+    number: [{ required: true, message: '请输入编号', trigger: 'blur' }],
+    frequency: [{ required: true, message: '请输入监视和评审频次', trigger: 'blur' }],
+    fictionId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
+    ratifyId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    influence: [{required: true, message: "", trigger: "blur"}],
+    monitorMethod: [{required: true, message: "", trigger: "blur"}],
+    result: [{required: true, message: "", trigger: "blur"}],
+    review: [{required: true, message: "", trigger: "blur"}],
+    solutions: [{required: true, message: "", trigger: "blur"}],
+  },
+  peopleList: [],
+  isAdmin: false,
+  companyList: [],
+  factorDiscernList: []
+
+
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    state.form.outEnvironment = state.form.factorContents.filter(i => i.type == 1)
+    state.form.inEnvironment = state.form.factorContents.filter(i => i.type == 2)
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  await getFactorList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+const getFactorList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const res = await getDiscernAll({companyId:state.form.companyId  });
+  if(res.code === 200){
+    state.factorDiscernList = res.data.map(item => {
+      return {
+        ...item,
+        name: item.year + '年度' + item.deptName + '内外部环境要素识别'
+      }
+    })
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+const onSubmit = async () => {
+  if(state.form.outEnvironment.length <= 0 ){
+    ElMessage.warning('外部环境不能为空')
+    return
+  }
+  if(state.form.inEnvironment.length <= 0 ){
+    ElMessage.warning('内部环境不能为空')
+    return
+  }
+  state.form.outEnvironment = state.form.outEnvironment.map(item => {
+    return{
+      ...item,
+      type: 1
+    }
+  })
+  state.form.inEnvironment = state.form.inEnvironment.map(item => {
+    return{
+      ...item,
+      type: 2
+    }
+  })
+  state.form.factorContents = state.form.outEnvironment.concat( state.form.inEnvironment)
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      console.log('sta',state.form)
+      const {id,outEnvironment,inEnvironment, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addControl(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 {outEnvironment,inEnvironment,...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editControl(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: '',
+    companyId: null,
+    factorDiscernId: null,
+    number: '',
+    frequency: '',
+    fictionId: null,
+    checkId: null,
+    ratifyId: null,
+    outEnvironment:[],
+    inEnvironment: [],
+    factorContents: []
+  }
+
+  state.peopleList = []
+  state.companyList = []
+  state.factorDiscernList = []
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 9999,
+    companyId: state.form.companyId
+  }
+  const res = await getUser(queryParams)
+  if(res.code == 200){
+    state.peopleList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+
+
+
+const selectValueCom = (val) => {
+  state.form.outEnvironment = []
+  state.form.inEnvironment = []
+  state.factorDiscernList = []
+  state.form.factorDiscernId = null
+  state.form.fictionId = null
+  state.form.checkId = null
+  state.form.ratifyId = null
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+
+  getFactorList()
+  getPeopleList()
+
+}
+
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+
+const changeFactor = (val) => {
+  let factorContents = []
+  state.factorDiscernList.forEach(i => {
+    if(i.id == val){
+      factorContents = i.factorContents
+    }
+  })
+  state.form.outEnvironment = factorContents.filter(i => i.type == 1)
+  state.form.inEnvironment = factorContents.filter(i => i.type == 2)
+}
+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/environment/controlFactors/index.vue b/src/views/build/conpanyFunctionConsult/environment/controlFactors/index.vue
new file mode 100644
index 0000000..bc061ee
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/environment/controlFactors/index.vue
@@ -0,0 +1,329 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.year"
+              placeholder="请选择年份"
+              style="width: 240px"
+              filterable
+              allow-create
+              default-first-option
+              :reserve-keyword="false"
+              @change="handleChangeNum"
+          >
+            <el-option
+                v-for="item in data.yearList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.label"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+        <el-form-item style="margin-left: 15px">
+          <el-button
+              type="primary"
+              @click="exportData"
+          >导出</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true"  @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="名称" prop="companyName" align="center" width="350">
+        <template #default="scope">
+          <div>{{scope.row.year}}年度{{scope.row.deptName}}内外部环境因素识别与控制表</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="部门" prop="deptName" align="center"  />
+      <el-table-column label="年份" prop="year" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delTable, getTable} from "@/api/qualityObjectives/table";
+import {delControl, getControl} from "@/api/environment/factors";
+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'
+    },
+  ],
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getControl(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/controlFactorExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  data.forEach(item => {
+    item.factorContents = item.factorContents.map((item,index) => {
+      return {
+        ...item,
+        num: index + 1
+      }
+    })
+    const datax = idGroupToTree(item.factorContents)
+    item.tableList = datax.map((item,index) => {
+      return {
+        ...item,
+        fileList: item.children.map((f,findex) => {
+          return{
+            ...f,
+            first: findex == 0,
+            typeName: item.type == 1 ? '外部环境' : '内部环境',
+            frequency: item.frequency
+          }
+        })
+      }
+    })
+    console.log(' item.tableList', item.tableList)
+    try {
+      generateWordDocument(templatePath.value, item, item.companyName + `_${item.year}年内、外部环境因素识别与控制表.docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+function idGroupToTree(data) {
+  const groups = data.reduce((map, item) => {
+    map.has(item.type) || map.set(item.type, []);
+    map.get(item.type).push(item);
+    return map;
+  }, new Map());
+  return Array.from(groups).map(([type, items]) => ({
+    type,
+    children: items
+  }));
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delControl(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    data.queryParams.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!data.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    data.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue
new file mode 100644
index 0000000..a0c3418
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/components/editDialog.vue
@@ -0,0 +1,543 @@
+<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-position="right" >
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="年份:" prop="year" >
+              <el-select
+                  v-model="state.form.year"
+                  placeholder="请选择年份"
+                  :disabled="title == '查看'"
+                  style="width: 100%"
+                  filterable
+                  allow-create
+                  default-first-option
+                  :reserve-keyword="false"
+                  @change="handleChangeNum"
+              >
+                <el-option
+                    v-for="item in state.yearList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.label"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="部门名称:" prop="deptId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.deptId"
+                  placeholder="请选择部门"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.deptList"
+                    :key="item.deptId"
+                    :label="item.deptName"
+                    :value="item.deptId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="外部环境:"  >
+              <div style="display: flex;width: 100%;margin-top: 5px">
+                <el-table :data="state.form.outEnvironment" :border="true">
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="环境因素" prop="factorName" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.factorName'" :rules="state.rules.factorName">
+                        <el-select
+                            :disabled="title === '查看'"
+                            v-model="row.factorName"
+                            placeholder="请选择环境因素"
+                            style="width: 240px"
+                        >
+                          <el-option
+                              v-for="item in state.outReasonList"
+                              :key="item.id"
+                              :label="item.name"
+                              :value="item.name"
+                          />
+                        </el-select>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="主要内容" prop="factorMess" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.factorMess'" :rules="state.rules.factorMess">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.factorMess" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="备注" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.remark" placeholder="请输入"></el-input>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center" width="120" v-if="title !== '查看'" >
+                    <template #default="scope">
+                      <el-button link type="danger"  @click="delOutTable(scope.row)" >删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <el-button
+                    :disabled="title === '查看'"
+                    type="primary"
+                    @click="addOutTable"
+                    style="margin-left: 10px"
+                >新增</el-button>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="内部环境:"  >
+              <div style="display: flex;width: 100%;">
+                <el-table :data="state.form.inEnvironment" :border="true" >
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="环境因素" prop="factorName" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'inEnvironment.' + '[' + $index + ']' + '.factorName'" :rules="state.rules.factorName">
+                        <el-select
+                            :disabled="title === '查看'"
+                            v-model="row.factorName"
+                            placeholder="请选择环境因素"
+                            style="width: 240px"
+                        >
+                          <el-option
+                              v-for="item in state.inReasonList"
+                              :key="item.id"
+                              :label="item.name"
+                              :value="item.name"
+                          />
+                        </el-select>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="主要内容" prop="factorMess" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'inEnvironment.' + '[' + $index + ']' + '.factorMess'" :rules="state.rules.factorMess">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.factorMess" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="备注" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.remark" placeholder="请输入"></el-input>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center" width="120" v-if="title !== '查看'" >
+                    <template #default="scope">
+                      <el-button link type="danger"  @click="delInTable(scope.row)" >删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <el-button
+                    :disabled="title === '查看'"
+                    type="primary"
+                    @click="addInTable"
+                    style="margin-left: 10px"
+                >新增</el-button>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="编制:" prop="fictionId" >
+              <el-select clearable v-model="state.form.fictionId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="审核:" prop="checkId" >
+              <el-select clearable v-model="state.form.checkId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="批准:" prop="ratifyId" >
+              <el-select clearable v-model="state.form.ratifyId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="fictionTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.fictionTime"
+                  type="date"
+                  placeholder="请选择日期"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer v-if="title !== '查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {onMounted, reactive, ref, toRefs} from 'vue'
+import Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+import {addDiscern, editDiscern} from "@/api/environment/factors";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    deptId: null,
+    year: '',
+    fictionId: null,
+    checkId: null,
+    ratifyId: null,
+    fictionTime: null,
+    factorContents: [],
+    outEnvironment:[],
+    inEnvironment: [],
+
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    deptId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+    year: [{ required: true, message: '请选择年份', trigger: 'blur' }],
+    fictionId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
+    ratifyId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    fictionTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    factorName: [{required: true, message: "", trigger: "blur"}],
+    factorMess: [{required: true, message: "", trigger: "blur"}],
+
+  },
+  peopleList: [],
+  isAdmin: false,
+  companyList: [],
+  deptList: [],
+
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+  outReasonList:[
+    {
+      id: 1,
+      name: '政治经济因素'
+    },
+    {
+      id: 2,
+      name: '法律法规因素'
+    },
+    {
+      id: 3,
+      name: '宏观政策因素'
+    },
+    {
+      id: 4,
+      name: '文化氛围'
+    },
+  ],
+  inReasonList:[
+    {
+      id: 1,
+      name: '公司价值观'
+    },
+    {
+      id: 2,
+      name: '企业文化'
+    },
+    {
+      id: 3,
+      name: '过程能力'
+    },
+    {
+      id: 4,
+      name: '制度流程因素'
+    },
+  ],
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    state.form.outEnvironment = state.form.factorContents.filter(i => i.type == 1)
+    state.form.inEnvironment = state.form.factorContents.filter(i => i.type == 2)
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  await getDeptList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+
+const getDeptList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const onSubmit = async () => {
+
+  if(state.form.outEnvironment.length <= 0 ){
+    ElMessage.warning('外部环境不能为空')
+    return
+  }
+  if(state.form.inEnvironment.length <= 0 ){
+    ElMessage.warning('内部环境不能为空')
+    return
+  }
+  state.form.outEnvironment = state.form.outEnvironment.map(item => {
+    return{
+      ...item,
+      type: 1
+    }
+  })
+  state.form.inEnvironment = state.form.inEnvironment.map(item => {
+    return{
+      ...item,
+      type: 2
+    }
+  })
+  state.form.factorContents = state.form.outEnvironment.concat( state.form.inEnvironment)
+  console.log('in',state.form )
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      console.log('sta',state.form)
+      const {id,outEnvironment,inEnvironment, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addDiscern(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 {outEnvironment,inEnvironment,...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editDiscern(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: '',
+    companyId: null,
+    deptId: null,
+    year: '',
+    fictionId: null,
+    checkId: null,
+    ratifyId: null,
+    fictionTime: null,
+    factorContents: [],
+    outEnvironment: [],
+    inEnvironment:[]
+  }
+  state.peopleList = []
+  state.companyList = []
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 9999,
+    companyId: state.form.companyId
+  }
+  const res = await getUser(queryParams)
+  if(res.code == 200){
+    state.peopleList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+
+
+
+const selectValueCom = (val) => {
+  state.form.fictionId = null
+  state.form.checkId = null
+  state.form.ratifyId = null
+  state.form.deptId = null
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+  getDeptList()
+  getPeopleList()
+}
+
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+const addOutTable = () => {
+    state.form.outEnvironment.push({})
+}
+const delOutTable = (val) => {
+  state.form.outEnvironment = state.form.outEnvironment.filter(item=> item != val)
+}
+const addInTable = () => {
+  state.form.inEnvironment.push({})
+}
+const delInTable = (val) => {
+  state.form.inEnvironment = state.form.inEnvironment.filter(item=> item != val)
+}
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/index.vue b/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/index.vue
new file mode 100644
index 0000000..dc09cb7
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/environment/environmentalFactors/index.vue
@@ -0,0 +1,324 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.year"
+              placeholder="请选择年份"
+              style="width: 240px"
+              filterable
+              allow-create
+              default-first-option
+              :reserve-keyword="false"
+              @change="handleChangeNum"
+          >
+            <el-option
+                v-for="item in data.yearList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.label"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+        <el-form-item style="margin-left: 15px">
+          <el-button
+              type="primary"
+              @click="exportData"
+          >导出</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true"  @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="名称" prop="companyName" align="center"  width="350">
+        <template #default="scope">
+          <span>{{scope.row.year}}年度{{scope.row.deptName}}内外部环境要素识别表</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="部门" prop="deptName" align="center"  />
+      <el-table-column label="年份" prop="year" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delTable, getTable} from "@/api/qualityObjectives/table";
+import {delDiscern, getDiscern} from "@/api/environment/factors";
+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'
+    },
+  ],
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getDiscern(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/environmentalFactorsExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  data.forEach(item => {
+    item.fictionTime = item.fictionTime.substring(0,10)
+    console.log('u',item)
+    const datax = idGroupToTree(item.factorContents)
+    item.tableList = datax.map((item,index) => {
+      return {
+        ...item,
+        fileList: item.children.map((f,findex) => {
+          return{
+            ...f,
+            first: findex == 0,
+            typeName: f.type == 1 ? '外部环境' : '内部环境'
+          }
+        })
+      }
+    })
+    console.log(' item.tableList', item.tableList)
+    try {
+      generateWordDocument(templatePath.value, item, item.companyName+`_${item.year}年内、外部环境要素识别表.docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+function idGroupToTree(data) {
+  const groups = data.reduce((map, item) => {
+    map.has(item.type) || map.set(item.type, []);
+    map.get(item.type).push(item);
+    return map;
+  }, new Map());
+  return Array.from(groups).map(([type, items]) => ({
+    type,
+    children: items
+  }));
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delDiscern(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    data.queryParams.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!data.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    data.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue
new file mode 100644
index 0000000..b73e826
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/need/evaluate/components/editDialog.vue
@@ -0,0 +1,406 @@
+<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-position="right" label-width="130">
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="相关方期望或要求识别表:" prop="year" >
+              <el-select
+                  v-model="state.form.year"
+                  placeholder="请选择"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="item in state.yearList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.label"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="相关方期望或要求识别表:" prop="outEnvironment" >
+              <div style="display: flex;width: 100%;">
+                <el-table :data="state.form.outEnvironment" :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="期望或要求" prop="message" align="center"  />
+                  <el-table-column label="应对措施" prop="message" align="center"  />
+                  <el-table-column label="评价结果" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.content'" :rules="state.rules.out.content">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.content" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center" width="120" v-if="title !== '查看'" >
+                    <template #default="scope">
+                      <el-button link type="danger"  @click="delTable(scope.row)" >删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <el-button
+                    :disabled="title === '查看'"
+                    type="primary"
+                    @click="addTableData"
+                    style="margin-left: 10px"
+                >新增</el-button>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="评价人:" prop="compilationId" >
+              <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="确认人:" prop="ratifyId" >
+              <el-select clearable v-model="state.form.ratifyId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="dateTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.dateTime"
+                  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 {getDept, 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 selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    departId: null,
+    year: '',
+    compilationId: null,
+    checkId: null,
+    ratifyId: null,
+    dateTime: null,
+    outEnvironment:[],
+    inEnvironment: []
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    departId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+    year: [{ required: true, message: '请选择年份', trigger: 'blur' }],
+    compilationId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
+    ratifyId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    dateTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    out: {
+      reason: [{required: true, message: "", trigger: "blur"}],
+      content: [{required: true, message: "", trigger: "blur"}],
+    },
+    in: {
+      reason: [{required: true, message: "", trigger: "blur"}],
+      content: [{required: true, message: "", trigger: "blur"}],
+    },
+  },
+  peopleList: [],
+  isAdmin: false,
+  companyList: [],
+  deptList: [],
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+  outReasonList:[
+    {
+      id: 1,
+      name: '政治经济因素'
+    },
+    {
+      id: 2,
+      name: '法律法规因素'
+    },
+    {
+      id: 3,
+      name: '宏观政策因素'
+    },
+    {
+      id: 4,
+      name: '文化氛围'
+    },
+  ],
+  inReasonList:[
+    {
+      id: 1,
+      name: '公司价值观'
+    },
+    {
+      id: 2,
+      name: '企业文化'
+    },
+    {
+      id: 3,
+      name: '过程能力'
+    },
+    {
+      id: 4,
+      name: '制度流程因素'
+    },
+  ],
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  await getDeptList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+
+const getDeptList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      console.log('sta',state.form)
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await 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: '',
+
+    fictionId : '',
+    fictionName: '',
+    fictionTime:'',
+    checkId :'',
+    checkName: '',
+    checkTime:'',
+    ratifyId:'',
+    ratifyName: '',
+    ratifyTime: '',
+    outEnvironment:[],
+  }
+  state.peopleList = []
+  state.companyList = []
+  state.qualityList = []
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 9999,
+    companyId: state.form.companyId
+  }
+  const res = await getUser(queryParams)
+  if(res.code == 200){
+    state.peopleList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+
+
+
+const selectValueCom = (val) => {
+  state.form.compilationId = null
+  state.form.checkId = null
+  state.form.ratifyId = null
+  state.form.departId = null
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+  getDeptList()
+  getPeopleList()
+}
+
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+const addTableData = () => {
+    state.form.outEnvironment.push({})
+}
+const delTable = (val) => {
+  state.form.outEnvironment = state.form.outEnvironment.filter(item=> item != val)
+}
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/need/evaluate/index.vue b/src/views/build/conpanyFunctionConsult/need/evaluate/index.vue
new file mode 100644
index 0000000..e913efe
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/need/evaluate/index.vue
@@ -0,0 +1,312 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.year"
+              placeholder="请选择年份"
+              style="width: 240px"
+              filterable
+              allow-create
+              default-first-option
+              :reserve-keyword="false"
+              @change="handleChangeNum"
+          >
+            <el-option
+                v-for="item in data.yearList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.label"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+        <el-form-item style="margin-left: 15px">
+          <el-button
+              type="primary"
+              @click="exportData"
+          >导出</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true"  @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="名称" prop="companyName" align="center"  />
+      <el-table-column label="部门" prop="departName" align="center"  />
+      <el-table-column label="年份" prop="year" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {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'
+    },
+  ],
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  // const res = await getTable(data.queryParams);
+  // if(res.code === 200){
+  //   dataList.value = res.data.list
+  //   total.value = res.data.total
+  // }else{
+  //   ElMessage.warning(res.message)
+  // }
+  dataList.value = [
+    {}
+  ]
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/evaluateExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  let name = ''
+  data.forEach(item => {
+    item.tableList =[
+      {
+        num: 1
+      }
+    ]
+    try {
+      generateWordDocument(templatePath.value, item, `_相关方期望或要求评价表.docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+function idGroupToTree(data) {
+  const groups = data.reduce((map, item) => {
+    map.has(item.type) || map.set(item.type, []);
+    map.get(item.type).push(item);
+    return map;
+  }, new Map());
+  return Array.from(groups).map(([type, items]) => ({
+    type,
+    children: items
+  }));
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await 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.label === 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/need/needIdentify/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/need/needIdentify/components/editDialog.vue
new file mode 100644
index 0000000..10cf0c4
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/need/needIdentify/components/editDialog.vue
@@ -0,0 +1,458 @@
+<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-position="right" label-width="130">
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="年份:" prop="year" >
+              <el-select
+                  v-model="state.form.year"
+                  placeholder="请选择年份"
+                  style="width: 100%"
+                  filterable
+                  allow-create
+                  default-first-option
+                  :reserve-keyword="false"
+                  @change="handleChangeNum"
+              >
+                <el-option
+                    v-for="item in state.yearList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.label"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="部门名称:" prop="departId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.departId"
+                  placeholder="请选择部门"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.deptList"
+                    :key="item.deptId"
+                    :label="item.deptName"
+                    :value="item.deptId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="相关方期望或要求识别表:" prop="outEnvironment" >
+              <div style="display: flex;width: 100%;">
+                <el-table :data="state.form.outEnvironment" :border="true" >
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="相关方" prop="content" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.content'" :rules="state.rules.out.content">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.content" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="期望或要求" prop="content" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.content'" :rules="state.rules.out.content">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.content" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="应对措施" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.remark" placeholder="请输入"></el-input>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center" width="120" v-if="title !== '查看'" >
+                    <template #default="scope">
+                      <el-button link type="danger"  @click="delTable(scope.row)" >删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <el-button
+                    :disabled="title === '查看'"
+                    type="primary"
+                    @click="addTableData"
+                    style="margin-left: 10px"
+                >新增</el-button>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="监测频率:" prop="compilationId" >
+              <el-input style="width: 240px" :disabled="title === '查看'"  v-model="state.form.compilationId" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="编制:" prop="compilationId" >
+              <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="审核:" prop="checkId" >
+              <el-select clearable v-model="state.form.checkId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="批准:" prop="ratifyId" >
+              <el-select clearable v-model="state.form.ratifyId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="日期:" prop="dateTime" >
+              <el-date-picker
+                  :disabled="title === '查看'"
+                  v-model="state.form.dateTime"
+                  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 {getDept, 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 selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    departId: null,
+    year: '',
+    compilationId: null,
+    checkId: null,
+    ratifyId: null,
+    dateTime: null,
+    outEnvironment:[],
+    inEnvironment: []
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    departId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+    year: [{ required: true, message: '请选择年份', trigger: 'blur' }],
+    compilationId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
+    ratifyId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    dateTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    out: {
+      reason: [{required: true, message: "", trigger: "blur"}],
+      content: [{required: true, message: "", trigger: "blur"}],
+    },
+    in: {
+      reason: [{required: true, message: "", trigger: "blur"}],
+      content: [{required: true, message: "", trigger: "blur"}],
+    },
+  },
+  peopleList: [],
+  isAdmin: false,
+  companyList: [],
+  deptList: [],
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+  outReasonList:[
+    {
+      id: 1,
+      name: '政治经济因素'
+    },
+    {
+      id: 2,
+      name: '法律法规因素'
+    },
+    {
+      id: 3,
+      name: '宏观政策因素'
+    },
+    {
+      id: 4,
+      name: '文化氛围'
+    },
+  ],
+  inReasonList:[
+    {
+      id: 1,
+      name: '公司价值观'
+    },
+    {
+      id: 2,
+      name: '企业文化'
+    },
+    {
+      id: 3,
+      name: '过程能力'
+    },
+    {
+      id: 4,
+      name: '制度流程因素'
+    },
+  ],
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  await getDeptList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+
+const getDeptList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      console.log('sta',state.form)
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await 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: '',
+
+    fictionId : '',
+    fictionName: '',
+    fictionTime:'',
+    checkId :'',
+    checkName: '',
+    checkTime:'',
+    ratifyId:'',
+    ratifyName: '',
+    ratifyTime: '',
+    outEnvironment:[],
+  }
+  state.peopleList = []
+  state.companyList = []
+  state.qualityList = []
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 9999,
+    companyId: state.form.companyId
+  }
+  const res = await getUser(queryParams)
+  if(res.code == 200){
+    state.peopleList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+
+
+
+const selectValueCom = (val) => {
+  state.form.compilationId = null
+  state.form.checkId = null
+  state.form.ratifyId = null
+  state.form.departId = null
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+  getDeptList()
+  getPeopleList()
+}
+
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+const addTableData = () => {
+    state.form.outEnvironment.push({})
+}
+const delTable = (val) => {
+  state.form.outEnvironment = state.form.outEnvironment.filter(item=> item != val)
+}
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/need/needIdentify/index.vue b/src/views/build/conpanyFunctionConsult/need/needIdentify/index.vue
new file mode 100644
index 0000000..9909657
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/need/needIdentify/index.vue
@@ -0,0 +1,312 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.year"
+              placeholder="请选择年份"
+              style="width: 240px"
+              filterable
+              allow-create
+              default-first-option
+              :reserve-keyword="false"
+              @change="handleChangeNum"
+          >
+            <el-option
+                v-for="item in data.yearList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.label"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+        <el-form-item style="margin-left: 15px">
+          <el-button
+              type="primary"
+              @click="exportData"
+          >导出</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true"  @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="名称" prop="companyName" align="center"  />
+      <el-table-column label="部门" prop="departName" align="center"  />
+      <el-table-column label="年份" prop="year" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {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'
+    },
+  ],
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  // const res = await getTable(data.queryParams);
+  // if(res.code === 200){
+  //   dataList.value = res.data.list
+  //   total.value = res.data.total
+  // }else{
+  //   ElMessage.warning(res.message)
+  // }
+  dataList.value = [
+    {}
+  ]
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/needIdentifyExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  let name = ''
+  data.forEach(item => {
+    item.tableList =[
+      {
+        num: 1
+      }
+    ]
+    try {
+      generateWordDocument(templatePath.value, item, `_相关方期望和需求识别.docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+function idGroupToTree(data) {
+  const groups = data.reduce((map, item) => {
+    map.has(item.type) || map.set(item.type, []);
+    map.get(item.type).push(item);
+    return map;
+  }, new Map());
+  return Array.from(groups).map(([type, items]) => ({
+    type,
+    children: items
+  }));
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await 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.label === 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/riskManage/control/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/riskManage/control/components/editDialog.vue
new file mode 100644
index 0000000..eff87b8
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/riskManage/control/components/editDialog.vue
@@ -0,0 +1,527 @@
+<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-position="right" label-width="130">
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="年份:" prop="year" >
+              <el-select
+                  v-model="state.form.year"
+                  placeholder="请选择年份"
+                  style="width: 100%"
+                  filterable
+                  allow-create
+                  default-first-option
+                  :reserve-keyword="false"
+                  @change="handleChangeNum"
+              >
+                <el-option
+                    v-for="item in state.yearList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.label"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="部门名称:" prop="departId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.departId"
+                  placeholder="请选择部门"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.deptList"
+                    :key="item.deptId"
+                    :label="item.deptName"
+                    :value="item.deptId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="文件编号:" prop="departId" >
+              <el-input  :disabled="title === '查看'"  v-model="state.form.content" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="风险管理控制:" prop="outEnvironment" >
+              <div style="display: flex;width: 100%;">
+                <el-table :data="state.form.outEnvironment" :border="true" >
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="质量管理活动/流程/项目管理过程" prop="content" align="center" >
+                    <template #default="{row,$index}">
+                      <el-form-item :prop="'outEnvironment.' + '[' + $index + ']' + '.content'" :rules="state.rules.out.content">
+                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="row.remark" placeholder="请输入"></el-input>
+                      </el-form-item>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险识别-潜在的风险事件" prop="content" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险识别-风险发生的后果" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险评估-严重度" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险评估-发生频率" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险评估-RPN" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险评估-风险等级" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险对应措施-预防措施" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险对应措施-责任人" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center" width="120" v-if="title !== '查看'" >
+                    <template #default="scope">
+                      <el-button link type="primary"  @click="addObject(scope.row)" >添加</el-button>
+                      <el-button link type="danger"  @click="delObject(scope.row)" >删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <el-button
+                    :disabled="title === '查看'"
+                    type="primary"
+                    @click="addTableData"
+                    style="margin-left: 10px"
+                >新增</el-button>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="编制:" prop="compilationId" >
+              <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="审核:" prop="checkId" >
+              <el-select clearable v-model="state.form.checkId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="批准:" prop="ratifyId" >
+              <el-select clearable v-model="state.form.ratifyId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer v-if="title !== '查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {onMounted, reactive, ref, toRefs} from 'vue'
+import Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    departId: null,
+    year: '',
+    compilationId: null,
+    checkId: null,
+    ratifyId: null,
+    dateTime: null,
+    outEnvironment:[],
+    inEnvironment: []
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    departId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+    year: [{ required: true, message: '请选择年份', trigger: 'blur' }],
+    compilationId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
+    ratifyId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    dateTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    out: {
+      reason: [{required: true, message: "", trigger: "blur"}],
+      content: [{required: true, message: "", trigger: "blur"}],
+    },
+    in: {
+      reason: [{required: true, message: "", trigger: "blur"}],
+      content: [{required: true, message: "", trigger: "blur"}],
+    },
+    num:[{required: true, message: "", trigger: "blur"}],
+  },
+  peopleList: [],
+  isAdmin: false,
+  companyList: [],
+  deptList: [],
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+  outReasonList:[
+    {
+      id: 1,
+      name: '政治经济因素'
+    },
+    {
+      id: 2,
+      name: '法律法规因素'
+    },
+    {
+      id: 3,
+      name: '宏观政策因素'
+    },
+    {
+      id: 4,
+      name: '文化氛围'
+    },
+  ],
+  inReasonList:[
+    {
+      id: 1,
+      name: '公司价值观'
+    },
+    {
+      id: 2,
+      name: '企业文化'
+    },
+    {
+      id: 3,
+      name: '过程能力'
+    },
+    {
+      id: 4,
+      name: '制度流程因素'
+    },
+  ],
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  await getDeptList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+
+const getDeptList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      console.log('sta',state.form)
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await 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: '',
+
+    fictionId : '',
+    fictionName: '',
+    fictionTime:'',
+    checkId :'',
+    checkName: '',
+    checkTime:'',
+    ratifyId:'',
+    ratifyName: '',
+    ratifyTime: '',
+    outEnvironment:[],
+  }
+  state.peopleList = []
+  state.companyList = []
+  state.qualityList = []
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 9999,
+    companyId: state.form.companyId
+  }
+  const res = await getUser(queryParams)
+  if(res.code == 200){
+    state.peopleList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+
+
+
+const selectValueCom = (val) => {
+  state.form.compilationId = null
+  state.form.checkId = null
+  state.form.ratifyId = null
+  state.form.departId = null
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+  getDeptList()
+  getPeopleList()
+}
+
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+const addTableData = () => {
+    state.form.outEnvironment.push({mess: [{id: null}]})
+
+}
+const addObject = (val) => {
+  state.form.outEnvironment.forEach(item => {
+    if(item.id == val.id){
+      item.mess.push({id: item.id})
+    }
+  })
+
+}
+const delObject = (val) => {
+  state.form.outEnvironment.forEach(item => {
+    if(item.id == val.id){
+      if(item.mess.length == 1){
+        ElMessage.warning('至少保留一组数据')
+        return
+      }
+      item.mess.pop()
+    }
+  })
+}
+
+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/riskManage/control/index.vue b/src/views/build/conpanyFunctionConsult/riskManage/control/index.vue
new file mode 100644
index 0000000..dff4b58
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/riskManage/control/index.vue
@@ -0,0 +1,335 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.year"
+              placeholder="请选择年份"
+              style="width: 240px"
+              filterable
+              allow-create
+              default-first-option
+              :reserve-keyword="false"
+              @change="handleChangeNum"
+          >
+            <el-option
+                v-for="item in data.yearList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.label"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+        <el-form-item style="margin-left: 15px">
+          <el-button
+              type="primary"
+              @click="exportData"
+          >导出</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true"  @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="名称" prop="companyName" align="center"  />
+      <el-table-column label="部门" prop="departName" align="center"  />
+      <el-table-column label="年份" prop="year" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {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'
+    },
+  ],
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  // const res = await getTable(data.queryParams);
+  // if(res.code === 200){
+  //   dataList.value = res.data.list
+  //   total.value = res.data.total
+  // }else{
+  //   ElMessage.warning(res.message)
+  // }
+  dataList.value = [
+    {}
+  ]
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/riskControlExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  let name = ''
+  data.forEach(item => {
+    item.tableList =[
+      {
+        flow: 'xxx',
+        mess: [
+          {
+            first:true,
+            flow: 'xxx',
+            event: 'xxxxxx'
+          },
+          {
+            first:false,
+            flow: 'xxx',
+            event: '2222'
+          },
+        ]
+      },
+      {
+        flow: '444444',
+        mess: [
+          {
+            first:true,
+            flow: '444444',
+            event: 'gg'
+          },
+
+        ]
+      }
+    ]
+    try {
+      generateWordDocument(templatePath.value, item, `_相关方期望和需求识别.docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+function idGroupToTree(data) {
+  const groups = data.reduce((map, item) => {
+    map.has(item.type) || map.set(item.type, []);
+    map.get(item.type).push(item);
+    return map;
+  }, new Map());
+  return Array.from(groups).map(([type, items]) => ({
+    type,
+    children: items
+  }));
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await 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.label === 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/riskManage/record/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/riskManage/record/components/editDialog.vue
new file mode 100644
index 0000000..fd179d9
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/riskManage/record/components/editDialog.vue
@@ -0,0 +1,511 @@
+<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-position="right" label-width="130">
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="风险管理控制:" prop="departId" >
+              <el-select
+                  :disabled="title === '查看'"
+                  v-model="state.form.departId"
+                  placeholder="请选择"
+                  style="width: 240px"
+              >
+                <el-option
+                    v-for="item in state.deptList"
+                    :key="item.deptId"
+                    :label="item.deptName"
+                    :value="item.deptId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="风险管理分析监视记录:" prop="outEnvironment" >
+              <div style="display: flex;width: 100%;">
+                <el-table :data="state.form.outEnvironment" :border="true" >
+                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
+                  <el-table-column label="质量管理活动/流程/项目管理过程" prop="content" align="center" />
+                  <el-table-column label="风险识别-潜在的风险事件" prop="content" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险识别-风险发生的后果" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险评估-严重度" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险评估-发生频率" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险评估-RPN" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险评估-风险等级" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险对应措施-预防措施" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="风险对应措施-责任人" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="监视-监视时间" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="监视-评价结果" prop="remark" align="center" >
+                    <template  #default="{row,$index}">
+                      <div v-for="(i,index) in row.mess" :key="index">
+                        <el-form-item :prop="'outEnvironment.' + '[' + $index + '].' +'mess.' + '[' + index + ']' + '.num'" :rules="state.rules.num">
+                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" v-model="i.num" placeholder="请输入"></el-input>
+                        </el-form-item>
+                      </div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center" width="120" v-if="title !== '查看'" >
+                    <template #default="scope">
+                      <el-button link type="primary"  @click="addObject(scope.row)" >添加</el-button>
+                      <el-button link type="danger"  @click="delObject(scope.row)" >删除</el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <el-button
+                    :disabled="title === '查看'"
+                    type="primary"
+                    @click="addTableData"
+                    style="margin-left: 10px"
+                >新增</el-button>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="编制:" prop="compilationId" >
+              <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="审核:" prop="checkId" >
+              <el-select clearable v-model="state.form.checkId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="批准:" prop="ratifyId" >
+              <el-select clearable v-model="state.form.ratifyId" :disabled="title =='查看'" filterable  style="width: 240px">
+                <el-option
+                    v-for="item in state.peopleList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer v-if="title !== '查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {onMounted, reactive, ref, toRefs} from 'vue'
+import Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    departId: null,
+    year: '',
+    compilationId: null,
+    checkId: null,
+    ratifyId: null,
+    dateTime: null,
+    outEnvironment:[],
+    inEnvironment: []
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    departId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+    year: [{ required: true, message: '请选择年份', trigger: 'blur' }],
+    compilationId: [{ required: true, message: '请选择编制人', trigger: 'blur' }],
+    ratifyId: [{ required: true, message: '请选择批准人', trigger: 'blur' }],
+    checkId: [{ required: true, message: '请选择审核人', trigger: 'blur' }],
+    dateTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
+    out: {
+      reason: [{required: true, message: "", trigger: "blur"}],
+      content: [{required: true, message: "", trigger: "blur"}],
+    },
+    in: {
+      reason: [{required: true, message: "", trigger: "blur"}],
+      content: [{required: true, message: "", trigger: "blur"}],
+    },
+    num:[{required: true, message: "", trigger: "blur"}],
+  },
+  peopleList: [],
+  isAdmin: false,
+  companyList: [],
+  deptList: [],
+  yearList: [
+    {
+      value: 1,
+      label: '2025'
+    },
+    {
+      value: 2,
+      label: '2024'
+    },
+    {
+      value: 3,
+      label: '2023'
+    },
+    {
+      value: 4,
+      label: '2022'
+    },
+    {
+      value: 5,
+      label: '2021'
+    },
+  ],
+  outReasonList:[
+    {
+      id: 1,
+      name: '政治经济因素'
+    },
+    {
+      id: 2,
+      name: '法律法规因素'
+    },
+    {
+      id: 3,
+      name: '宏观政策因素'
+    },
+    {
+      id: 4,
+      name: '文化氛围'
+    },
+  ],
+  inReasonList:[
+    {
+      id: 1,
+      name: '公司价值观'
+    },
+    {
+      id: 2,
+      name: '企业文化'
+    },
+    {
+      id: 3,
+      name: '过程能力'
+    },
+    {
+      id: 4,
+      name: '制度流程因素'
+    },
+  ],
+})
+
+onMounted(() => {
+
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(state.isAdmin){
+    state.form.companyId = value.companyId
+    state.form.companyName = value.companyName
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  await getDeptList()
+  await getPeopleList()
+  dialogVisible.value = true;
+}
+
+const getDeptList = async () => {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getDept(param)
+  if(res.code === 200){
+    state.deptList = res.data
+  }
+}
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      console.log('sta',state.form)
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await 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: '',
+
+    fictionId : '',
+    fictionName: '',
+    fictionTime:'',
+    checkId :'',
+    checkName: '',
+    checkTime:'',
+    ratifyId:'',
+    ratifyName: '',
+    ratifyTime: '',
+    outEnvironment:[],
+  }
+  state.peopleList = []
+  state.companyList = []
+  state.qualityList = []
+}
+const getPeopleList = async ()=> {
+  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+    return
+  }
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 9999,
+    companyId: state.form.companyId
+  }
+  const res = await getUser(queryParams)
+  if(res.code == 200){
+    state.peopleList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+
+
+
+const selectValueCom = (val) => {
+  state.form.compilationId = null
+  state.form.checkId = null
+  state.form.ratifyId = null
+  state.form.departId = null
+  state.companyList.forEach(item => {
+    if(item.name === val){
+      state.form.companyId = item.id
+    }
+  })
+  getDeptList()
+  getPeopleList()
+}
+
+const handleChangeNum = (value) => {
+  if (!/^\d+$/.test(value)) { // 验证是否为数字
+    ElMessage.warning('只能输入数字')
+    state.form.year = '' // 重置选择,避免非法值被添加到options中
+  } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项
+    state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
+  }
+}
+const addTableData = () => {
+    state.form.outEnvironment.push({mess: [{id: null}]})
+
+}
+const addObject = (val) => {
+  state.form.outEnvironment.forEach(item => {
+    if(item.id == val.id){
+      item.mess.push({id: item.id})
+    }
+  })
+
+}
+const delObject = (val) => {
+  state.form.outEnvironment.forEach(item => {
+    if(item.id == val.id){
+      if(item.mess.length == 1){
+        ElMessage.warning('至少保留一组数据')
+        return
+      }
+      item.mess.pop()
+    }
+  })
+}
+
+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/riskManage/record/index.vue b/src/views/build/conpanyFunctionConsult/riskManage/record/index.vue
new file mode 100644
index 0000000..443df68
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/riskManage/record/index.vue
@@ -0,0 +1,335 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份:" style="margin-left: 20px">
+          <el-select
+              v-model="data.queryParams.year"
+              placeholder="请选择年份"
+              style="width: 240px"
+              filterable
+              allow-create
+              default-first-option
+              :reserve-keyword="false"
+              @change="handleChangeNum"
+          >
+            <el-option
+                v-for="item in data.yearList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.label"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+        <el-form-item style="margin-left: 15px">
+          <el-button
+              type="primary"
+              @click="exportData"
+          >导出</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true"  @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="名称" prop="companyName" align="center"  />
+      <el-table-column label="部门" prop="departName" align="center"  />
+      <el-table-column label="年份" prop="year" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {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'
+    },
+  ],
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  // const res = await getTable(data.queryParams);
+  // if(res.code === 200){
+  //   dataList.value = res.data.list
+  //   total.value = res.data.total
+  // }else{
+  //   ElMessage.warning(res.message)
+  // }
+  dataList.value = [
+    {}
+  ]
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+const handleClose = () => {
+  data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      year: '',
+      type: ''
+    }
+  }
+  getList();
+
+}
+const exportData = () => {
+  if(choosedData.value && choosedData.value.length === 0){
+    ElMessage.warning('请选择需要导出的数据')
+  }else {
+    startGeneration()
+  }
+}
+const templatePath = ref('/riskRecordExample.docx')
+const startGeneration = async () => {
+  const data = JSON.parse(JSON.stringify(choosedData.value))
+  let name = ''
+  data.forEach(item => {
+    item.tableList =[
+      {
+        flow: 'xxx',
+        mess: [
+          {
+            first:true,
+            flow: 'xxx',
+            event: 'xxxxxx'
+          },
+          {
+            first:false,
+            flow: 'xxx',
+            event: '2222'
+          },
+        ]
+      },
+      {
+        flow: '444444',
+        mess: [
+          {
+            first:true,
+            flow: '444444',
+            event: 'gg'
+          },
+
+        ]
+      }
+    ]
+    try {
+      generateWordDocument(templatePath.value, item, `_相关方期望和需求识别.docx`);
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  })
+}
+function idGroupToTree(data) {
+  const groups = data.reduce((map, item) => {
+    map.has(item.type) || map.set(item.type, []);
+    map.get(item.type).push(item);
+    return map;
+  }, new Map());
+  return Array.from(groups).map(([type, items]) => ({
+    type,
+    children: items
+  }));
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await 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.label === 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/staffManage/staffdescribe/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffdescribe/components/editDialog.vue
new file mode 100644
index 0000000..7a9fae6
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/staffManage/staffdescribe/components/editDialog.vue
@@ -0,0 +1,200 @@
+<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.formRules" label-position="top" label-width="150px" >
+        <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+          <el-select v-model="state.form.companyId" filterable placeholder="请选择" clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin">
+            <el-option
+                v-for="item in state.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="岗位名称" prop="positionName" >
+          <el-input v-model="state.form.positionName" :disabled="title === '查看'"/>
+        </el-form-item>
+        <el-form-item label="1.直属上级" prop="superiors" >
+          <el-input v-model="state.form.superiors" :rows="4" type="textarea" :disabled="title === '查看'"/>
+        </el-form-item>
+        <el-form-item label="2.直属下级" prop="subordinate" >
+          <el-input v-model="state.form.subordinate" :rows="4" type="textarea" :disabled="title === '查看'"/>
+        </el-form-item>
+        <el-form-item label="3.岗位性质" prop="nature">
+          <el-input v-model="state.form.nature" :rows="4" type="textarea" :disabled="title === '查看'"/>
+        </el-form-item>
+        <el-form-item label="4.管理权限" prop="permission">
+          <el-input v-model="state.form.permission" :rows="4" type="textarea" :disabled="title === '查看'"/>
+        </el-form-item>
+        <el-form-item label="5.任职要求" prop="requirements">
+          <el-input v-model="state.form.requirements" :rows="4" type="textarea" :disabled="title === '查看'"/>
+        </el-form-item>
+        <el-form-item label="6.岗位职责" prop="duty">
+          <el-input v-model="state.form.duty" :rows="4" type="textarea" :disabled="title === '查看'"/>
+        </el-form-item>
+
+      </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 Editor from "@/components/Editor/index.vue";
+import {ElMessage} from "element-plus";
+import {addNotice} from "@/api/backManage/notice";
+import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate";
+import {addCompany, checkName, distributeCompany, editCompany, getCompany} from "@/api/onlineEducation/company";
+import {verifyPhone} from "@/utils/validate";
+import {addBasic, editBasic} from "@/api/companyInfo/basicInfo";
+import Cookies from "js-cookie";
+import {addJob, updateJob} from "@/api/staffManage/staff";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    positionName: '',
+    superiors: '',
+    subordinate: '',
+    nature: '',
+    permission: '',
+    requirements: '',
+    duty: '',
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    positionName: [{ required: true, message: '请输入岗位名称', trigger: 'blur' }],
+    superiors:[{ required: true, message: '请输入直属上级', trigger: 'blur' }],
+    subordinate: [{ required: true, message: '请输入直属下级', trigger: 'blur' }],
+    nature: [{ required: true, message: '请输入岗位性质', trigger: 'blur' }],
+    permission: [{ required: true, message: '请输入管理权限', trigger: 'blur' }],
+    requirements: [{ required: true, message: '请输入任职要求', trigger: 'blur' }],
+    duty: [{ required: true, message: '请输入岗位职责', trigger: 'blur' }],
+
+  },
+  isAdmin: false,
+  companyList: []
+})
+
+onMounted(() => {
+
+})
+const openDialog = async (type, value,companyList) => {
+
+
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  if(state.isAdmin){
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+  }
+  dialogVisible.value = true;
+}
+
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(!state.isAdmin){
+    const userInfo = JSON.parse(Cookies.get('userInfo'))
+    state.form.companyId = userInfo.companyId
+  }
+  if(valid){
+    if(title.value === '新增'){
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addJob(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 updateJob(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: '',
+    companyId: null,
+    positionName: '',
+    superiors: '',
+    subordinate: '',
+    nature: '',
+    permission: '',
+    requirements: '',
+    duty: '',
+
+  }
+  state.companyList = []
+}
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/staffManage/staffdescribe/index.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffdescribe/index.vue
new file mode 100644
index 0000000..ae23658
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/staffManage/staffdescribe/index.vue
@@ -0,0 +1,277 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" filterable placeholder="请选择" clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true"  @selection-change="handleSelectionChange">
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="企业名称" prop="companyName" align="center"  />
+      <el-table-column label="岗位名称" prop="positionName" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" >编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delBasic, getBasic, uploadInBasic} from "@/api/companyInfo/basicInfo";
+import {delJob, getJob, uploadTemplate} from "@/api/staffManage/staff";
+import {Download, Upload} from "@element-plus/icons-vue";
+
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const checkFiles = (rule, value, callback) => {
+  if (state.exportFileList.length == 0) {
+    callback(new Error('请上传导入文件'))
+  } else {
+    callback()
+  }
+}
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false
+});
+const state = reactive({
+  form: {
+    id: null,
+    filePath: '',
+    companyId: null
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    filePath: [{ required: true, validator: checkFiles, trigger: 'blur' }]
+  },
+  exportFileList: [],
+})
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getJob(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    // data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    companyId: '',
+    pageNum: 1,
+    pageSize: 10,
+  }
+  choosedData.value = []
+  data.companyList = [];
+  getList();
+  getCompanyList()
+}
+
+
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delJob({id:val.id});
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const exportInData = () => {
+  data.exportDialog = true
+
+}
+const handleCloseExport = () => {
+  getList()
+  state.exportFileList = []
+  data.exportDialog = false
+}
+const beforeUpload = (file) => {
+  state.exportFileList = [...state.exportFileList, file]
+  state.exportFileList = state.exportFileList.slice(-1)
+  return false;
+}
+const downloadFileTable = () => {
+  const filePath = '/basicExample.xlsx';
+  const link = document.createElement('a');
+  link.href = filePath;
+  link.download = filePath.substr(filePath.lastIndexOf('/') + 1);
+  link.click();
+}
+const fileBinaryList = ref([])
+const handleChange = (file, files) => {
+  fileBinaryList.value = files;
+};
+const onUpload = async () => {
+  if(state.exportFileList.length == 0){
+    ElMessage({
+      type: 'warning',
+      message: '请先上传表格文件'
+    });
+    return
+  }else{
+    const formData = new FormData();
+    fileBinaryList.value.forEach((file) => {
+      formData.append('file', file.raw)
+    })
+    console.log('form',formData)
+    uploadInBasic(formData).then(async (res) => {
+      if(res.code == 200){
+        ElMessage({
+          type: 'success',
+          message: '导入成功'
+        });
+        state.exportFileList = []
+        data.exportDialog = false
+        await getList()
+      }else{
+        ElMessage({
+          type: 'error',
+          message: res.message
+        });
+      }
+    }).catch(async () =>{
+      state.exportFileList = []
+      data.exportDialog = false
+      await getList()
+    })
+  }
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>

--
Gitblit v1.9.2