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