From a390dbc5239ac26f093c6670c12cfd6a49ca6037 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期四, 20 十一月 2025 15:06:47 +0800
Subject: [PATCH] 修改
---
src/views/work/selfProblems/internalAudit/innerReviewSheet/components/editDialog.vue | 506 +++++++++++++++++++++++++++++++++++--------------------
1 files changed, 318 insertions(+), 188 deletions(-)
diff --git a/src/views/work/selfProblems/internalAudit/innerReviewSheet/components/editDialog.vue b/src/views/work/selfProblems/internalAudit/innerReviewSheet/components/editDialog.vue
index b7e802e..90db55c 100644
--- a/src/views/work/selfProblems/internalAudit/innerReviewSheet/components/editDialog.vue
+++ b/src/views/work/selfProblems/internalAudit/innerReviewSheet/components/editDialog.vue
@@ -3,14 +3,14 @@
<el-dialog
v-model="dialogVisible"
:title="state.title"
- width="700px"
+ width="950px"
:before-close="handleClose"
:close-on-press-escape="false"
:close-on-click-modal="false"
>
- <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
- <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
- <el-select v-model="state.form.companyId" placeholder="请选择" clearable @change="getDeptList">
+ <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" >
+ <el-form-item v-if="state.isAdmin" label="单位:" prop="companyId">
+ <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title=='编辑'" style="width: 100%" clearable @change="getDeptList">
<el-option
v-for="item in state.companyList"
:key="item.id"
@@ -19,72 +19,136 @@
</el-option>
</el-select>
</el-form-item>
- <el-form-item label="受审核部门:" prop="deptId">
- <el-select
- clearable
- v-model="state.form.deptId"
- :disabled="state.title =='查看'"
- filterable
- placeholder="选择受审核部门"
- style="width: 100%"
- @change="getCaluses"
- >
- <el-option
- v-for="item in state.deptList"
- :key="item.deptId"
- :label="item.deptName"
- :value="item.deptId"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="受审核人:" prop="internalAuditCheckPeople">
- <el-select clearable v-model="state.form.internalAuditCheckPeople" :disabled="state.title =='查看'" value-key="userId" filterable multiple placeholder="受审核人" style="width: 100%">
- <el-option
- v-for="item in state.userList"
- :key="item.userId"
- :label="item.name"
- :value="item"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="内审员:" prop="auditId">
- <el-select clearable v-model="state.form.auditId" :disabled="state.title =='查看'" filterable placeholder="内审员" style="width: 100%">
- <el-option
- v-for="item in state.userList"
- :key="item.userId"
- :label="item.name"
- :value="item.userId"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="内审时间:" prop="auditDate">
- <el-date-picker
- v-model="state.form.auditDate"
- type="datetime"
- value-format="YYYY-MM-DD HH:mm:ss"
- placeholder="请选择内审时间"
- />
- </el-form-item>
- <el-form-item label="对应认证标准条款(过程):" prop="caluseNum">
- <el-input v-model.trim="state.form.caluseNum" type="textarea" readonly :autosize="{ minRows: 2 }"></el-input>
- </el-form-item>
- <el-form-item label="检查内容:" prop="caluseContent">
- <el-input v-model.trim="state.form.caluseContent" type="textarea" readonly :autosize="{ minRows: 2 }"></el-input>
- </el-form-item>
- <el-form-item label="检查记录:" prop="checkRecord">
- <el-input v-model.trim="state.form.checkRecord" type="textarea" :readonly="state.title =='查看'" :autosize="{ minRows: 2 }"></el-input>
- </el-form-item>
- <el-form-item label="不符合标记:" prop="inconsistent">
- <el-input v-model.trim="state.form.inconsistent" type="textarea" :readonly="state.title =='查看'" :autosize="{ minRows: 2 }"></el-input>
- </el-form-item>
-<!-- <el-form-item label="文件:" prop="filePath">-->
-<!-- <el-upload accept=".doc,.docx" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >-->
-<!-- <el-button type="primary">点击上传</el-button>-->
-<!-- <template #tip>-->
-<!-- <div class="el-upload__tip">支持上传.doc、.docx格式文档,尺寸小于5M,最多可上传1张</div>-->
-<!-- </template>-->
-<!-- </el-upload>-->
-<!-- </el-form-item>-->
+ <el-row :gutter="24">
+ <el-col :span="8">
+ <el-form-item label="受审核部门:" prop="deptId">
+ <el-select
+ clearable
+ v-model="state.form.deptId"
+ :disabled="state.title =='查看'"
+ filterable
+ placeholder="选择受审核部门"
+ style="width: 100%"
+ @change="getCaluses"
+ >
+ <el-option
+ v-for="item in state.deptList"
+ :key="item.deptId"
+ :label="item.deptName"
+ :value="item.deptId"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="审核员:" prop="personId">
+ <el-select clearable v-model="state.form.personId" :disabled="state.title =='查看'" filterable placeholder="内审员" style="width: 100%">
+ <el-option
+ v-for="item in state.interUserList"
+ :key="item.personId"
+ :label="item.personName"
+ :value="item.personId"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="内审时间:" prop="checkTime">
+ <el-date-picker
+ v-model="state.form.checkTime"
+ type="datetime"
+ value-format="YYYY-MM-DD HH:mm:ss"
+ placeholder="请选择内审时间"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <div style="display: flex;align-items: center">
+ <span style="font-size: 15px;font-weight: 700;margin-right: 10px" >内审检查表:</span>
+ <el-button type="primary" :disabled="state.title === '查看'" @click="addTableData">新增</el-button>
+ </div>
+ <el-table style="margin-top: 15px;margin-bottom: 20px" :data="state.form.checkCatalogues" :border="true">
+ <el-table-column label="适用条款" align="center">
+ <el-table-column label="体系标准款项" prop="number" align="center"></el-table-column>
+ <el-table-column label="标题" prop="mess" align="center"></el-table-column>
+ </el-table-column>
+ <el-table-column label="审核要点" prop="pointKey" align="center" width="180">
+ <template #default="{row,$index}">
+ <div v-for="(i,index) in row.checkContents" :key="index">
+ <el-form-item :prop="'checkCatalogues.' + '[' + $index + '].' +'checkContents.' + '[' + index + ']' + '.pointKey'" :rules="state.formRules.pointKey">
+ <el-input style="margin-top: 10px" :disabled="state.title === '查看'" type="textarea" :rows="4" v-model="i.pointKey" placeholder="请输入"></el-input>
+ </el-form-item>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="审核发现" prop="find" align="center" width="180">
+ <template #default="{row,$index}">
+ <div v-for="(i,index) in row.checkContents" :key="index">
+ <el-form-item :prop="'checkCatalogues.' + '[' + $index + '].' +'checkContents.' + '[' + index + ']' + '.find'" :rules="state.formRules.find">
+ <el-input style="margin-top: 10px" :disabled="state.title === '查看'" type="textarea" :rows="4" v-model="i.find" placeholder="请输入"></el-input>
+ </el-form-item>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="审核结果" align="center" >
+ <el-table-column label="符合" prop="conform" align="center" width="90">
+ <template #default="{row,$index}">
+ <div v-for="(i,index) in row.checkContents" :key="index">
+ <el-form-item :prop="'checkCatalogues.' + '[' + $index + '].' +'checkContents.' + '[' + index + ']' + '.result'" :rules="state.formRules.result">
+ <el-radio
+ style="height: 100px"
+ v-model="i.result"
+ :label="1"
+ :disabled="state.title === '查看'"
+ > </el-radio>
+ </el-form-item>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="轻微不符合" prop="minor" align="center" width="90">
+ <template #default="{row,$index}">
+ <div v-for="(i,index) in row.checkContents" :key="index">
+ <el-form-item :prop="'checkCatalogues.' + '[' + $index + '].' +'checkContents.' + '[' + index + ']' + '.result'" :rules="state.formRules.result">
+ <el-radio
+ style="height: 100px"
+ v-model="i.result"
+ :label="2"
+ :disabled="state.title === '查看'"
+ ></el-radio>
+ </el-form-item>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="严重不符合" prop="serious" align="center" width="90">
+ <template #default="{row,$index}">
+ <div v-for="(i,index) in row.checkContents" :key="index">
+ <el-form-item :prop="'checkCatalogues.' + '[' + $index + '].' +'checkContents.' + '[' + index + ']' + '.result'" :rules="state.formRules.result">
+ <el-radio
+ style="height: 100px"
+ v-model="i.result"
+ :label="3"
+ :disabled="state.title === '查看'"
+ ></el-radio>
+ </el-form-item>
+ </div>
+ </template>
+ </el-table-column>
+
+ </el-table-column>
+ <el-table-column label="操作" align="center" width="120" v-if="state.title !== '查看'" >
+ <template #default="scope">
+ <el-button link type="primary" @click="addObject(scope.row,scope.$index)" >添加</el-button>
+ <el-button link type="danger" @click="delObject(scope.row,scope.$index)" >删除</el-button>
+ </template>
+ </el-table-column>
+
+ </el-table>
+ </el-col>
+ </el-row>
</el-form>
<template #footer v-if="state.title !='查看'">
<span class="dialog-footer">
@@ -93,11 +157,39 @@
</span>
</template>
</el-dialog>
+ <el-dialog
+ v-model="state.showDialog"
+ title=""
+ width="500"
+ :before-close="handleCloseDialog"
+ >
+ <el-form :model="state.termForm" size="default" ref="termRef" :rules="state.rules" >
+ <el-form-item label="体系标准款项:" prop="id">
+ <el-tree-select
+ v-model="state.termForm.id"
+ :data="state.menuOptions"
+ :props="{ value: 'id', label: 'name', children: 'children' }"
+ value-key="id"
+ placeholder="体系标准款项"
+ check-strictly
+ style="width: 100%"
+ @node-click="handleTreeSelect"
+ />
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="handleCloseDialog" size="default">取 消</el-button>
+ <el-button type="primary" @click="onSubmitTerm" size="default" v-preReClick>确认</el-button>
+ </span>
+ </template>
+ </el-dialog>
+
</div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
-import {ElMessage} from "element-plus";
+import {ElMessage, ElTooltip} from "element-plus";
import {Base64} from "js-base64"
import {getToken} from "@/utils/auth";
import {
@@ -106,94 +198,117 @@
} from "@/api/innerReview/meetingReview";
import {getDepart} from "@/api/orgStructure/depart";
import {listUser} from "@/api/system/user";
+import {getPersonPage} from "@/api/selfProblems/nameList";
+import {getCatalogue} from "@/api/qualityManage/catalog";
+import Cookies from "js-cookie";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
const superRef = ref()
-const checkFiles = (rule, value, callback) => {
- if (state.fileList.length == 0) {
- callback(new Error('请上传文件'))
- } else {
- callback()
- }
-}
+const termRef = ref()
+
const state = reactive({
title: '',
form: {
id: null,
deptId: null,
- internalAuditCheckPeople:[],
- auditId: null,
- auditDate: '',
- caluseNum: '',
- caluseContent: '',
- checkRecord: '',
- inconsistent: '',
- companyId: null
+ personId: null,
+ checkTime: '',
+ companyId: null,
+ checkCatalogues: []
+ },
+ showDialog:false,
+ termForm: {
+ id: null,
+ mess: '',
+ number: ''
},
formRules:{
companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
deptId: [{ required: true, message: '请选择受审核部门', trigger: 'blur' }],
internalAuditCheckPeople: [{ required: true, message: '请选择受审核人', trigger: 'blur' }],
- auditId: [{ required: true, message: '请选择内审员', trigger: 'blur' }],
- auditDate: [{ required: true, message: '请选择内审时间', trigger: 'blur' }],
- checkRecord: [{ required: true, message: '请填写检查记录', trigger: 'blur' }]
+ personId: [{ required: true, message: '请选择内审员', trigger: 'blur' }],
+ checkTime: [{ required: true, message: '请选择内审时间', trigger: 'blur' }],
+ checkRecord: [{ required: true, message: '请填写检查记录', trigger: 'blur' }],
+ pointKey: [{ required: true, message: '', trigger: 'blur' }],
+ find: [{ required: true, message: '', trigger: 'blur' }],
+ result: [{ required: true, message: '', trigger: 'blur' }],
+
+
+ },
+ rules: {
+ id: [{ required: true, message: '请选择体系标准款项', trigger: 'blur' }]
},
isAdmin: false,
companyList: [],
deptList: [],
userList: [],
- uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
- header: {
- Authorization: getToken()
- },
- fileLimit: 1,
- fileList: []
+ interUserList: [],
+ menuOptions: []
})
+const props = {
+ checkStrictly: true,
+ value: 'id',
+ label: 'mess'
+
+}
onMounted(() => {
});
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
state.isAdmin = isAdmin
- if(isAdmin){
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ state.form.companyId = userInfo.companyId
+ if(state.isAdmin){
+ state.form.companyId = value.companyId
state.companyList = companyList
}
- await getUserList(companyId)
- await getDepartList(companyId)
state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
- state.form.companyId = companyId
if(state.title == '编辑'||state.title == '查看'){
Object.keys(state.form).forEach(key => {
if (key in value) {
state.form[key] = value[key]
}
})
- await getInfo(value.id)
-
- // if(value.filePath) {
- // const obj = {
- // url: value.filePath,
- // name: '模板文件'
- // }
- // state.fileList = [obj]
- // }
}
+ await getUserList()
+ await getDepartList(state.form.companyId)
+ await getCatalogList()
dialogVisible.value = true
}
+const getCatalogList = async() => {
+ state.menuOptions = [];
+ const param = {
+ type: 1,
+ number: 4
+ }
+ const res = await getCatalogue(param)
+ if(res.code == 200){
+ state.menuOptions =await handleTree(res.data.data);
+ }else{
+ ElMessage.warning(res.message)
+ }
+}
+const handleTree = (val) => {
+ const traverse = (nodes, currentPath = '') => {
+ nodes.forEach((node, index) => {
+ node.name = `${node.number} ${node.mess}`;
+ // 递归处理子节点(传递当前序号路径)
+ if (node.children && node.children.length) {
+ traverse(node.children, node.number);
+ }
+ });
+ };
+ traverse(val); // 从根节点开始遍历
+ return val;
+}
const onSubmit = async () => {
const valid = await superRef.value.validate();
if(valid){
- state.form.internalAuditCheckPeople = state.form.internalAuditCheckPeople.map(item=>{
- return {
- id: item.id || null,
- auditUserId: item.userId,
- companyId: item.companyId || null,
- auditUserName: item.name
- }
- })
+ console.log('f',state.form)
if(state.title == '新增'){
const {id,...data} = state.form
const res = await addInternalAuditCheck(data)
@@ -225,7 +340,7 @@
state.form.internalAuditCheckPeople = res.data.internalAuditCheckPeople?.map(item=>{
return {
id: item.id,
- auditId: item.auditId,
+ personId: item.personId,
userId: item.auditUserId,
name: item.auditUserName,
companyId: item.companyId
@@ -238,15 +353,15 @@
const getDeptList = async ()=>{
state.form.deptId = null
- state.form.internalAuditCheckPeople = []
- state.form.auditId = null
- state.form.caluseNum = ''
- state.form.caluseContent = ''
+ state.form.personId = null
await getDepartList(state.form.companyId)
- await getUserList(state.form.companyId)
+ await getUserList()
}
const getDepartList = async (companyId)=> {
+ if(state.isAdmin && (companyId == 0 || companyId == null)){
+ return
+ }
const params = {
companyId: companyId
}
@@ -258,8 +373,11 @@
}
}
-const getUserList = async (companyId,deptId)=> {
- const res = await listUser({pageIndex: 1,pageSize: 999, companyId: companyId,deptId: deptId})
+const getUserList = async ()=> {
+ if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+ return
+ }
+ const res = await getPersonPage({companyId: state.form.companyId,pageNum: 1,pageSize: 999})
if(res.code == 200){
state.userList = res.data.list?res.data.list.map(item=>{
const user = item.id
@@ -269,87 +387,89 @@
userId: user
}
}):[]
+ state.interUserList = state.userList
+ // if(state.form.deptId){
+ // state.interUserList = state.userList.filter(i=>i.deptId == state.form.deptId)
+ // }else{
+ // state.interUserList = state.userList
+ // }
}else{
ElMessage.warning(res.message)
}
}
-const getCaluses = async (value)=>{
- await getUserList(state.form.companyId,value)
- const deptCaluses = state.deptList.find(i=>i.deptId == state.form.deptId)?.caluseVO1List
- if(deptCaluses && Array.isArray(deptCaluses)){
- state.form.caluseNum = deptCaluses.map(i=>i.clauseNum).join('、')
- state.form.caluseContent = deptCaluses.map(i=>i.content).join(';\n')
- }
+const getCaluses = async ()=>{
+ state.form.personId = null
+ await getUserList()
}
-// const handleAvatarSuccess = (res, uploadFile) => {
-// if(res.code == 200){
-// state.form.filePath = res.data.path
-// state.form.format = '.' + res.data.filename.split('.')[1]
-// }else{
-// state.fileList = []
-// ElMessage({
-// type: 'warning',
-// message: '文件上传失败'
-// })
-// }
-// }
-//
-// const showTip =()=>{
-// ElMessage({
-// type: 'warning',
-// message: '超出文件上传数量'
-// });
-// }
-// const picSize = async (rawFile) => {
-// if(rawFile.size / 1024 / 1024 > 5){
-// ElMessage({
-// type: 'warning',
-// message: '文件大小不能超过5M'
-// });
-// return false
-// }
-// };
-// const handleRemove = async (file, uploadFiles) => {
-// let path = state.form.filePath;
-// await delPic({path: path}).then(res => {
-// if(res.code == 200){
-// // ElMessage({
-// // type: 'success',
-// // message: '文件已删除'
-// // })
-// state.form.filePath = ''
-// state.form.format = ''
-// }else{
-// ElMessage({
-// type: 'warning',
-// message: res.message
-// })
-// }
-// }).catch(() => {
-// state.form.imgUrl = ''
-// });
-// }
const handleClose = () => {
state.form = {
id: null,
deptId: null,
- internalAuditCheckPeople:[],
- auditId: null,
- auditDate: '',
- caluseNum: '',
- caluseContent: '',
- checkRecord: '',
- inconsistent: '',
- companyId: null
+ personId: null,
+ checkTime: '',
+ companyId: null,
+ checkCatalogues: []
}
- state.fileList = []
+
superRef.value.clearValidate();
superRef.value.resetFields()
dialogVisible.value = false;
}
+const addTableData = () => {
+ state.termForm = {
+ id: null,
+ mess: '',
+ number: ''
+ }
+ state.showDialog = true
+ // state.form.checkCatalogues.push({checkContents: [{}]})
+}
+const addObject = (val,itemIndex) => {
+ state.form.checkCatalogues.forEach((item,index) => {
+ if(index == itemIndex){
+ item.checkContents.push({})
+ }
+ })
+}
+const delObject = (val,itemIndex) => {
+ state.form.checkCatalogues.forEach((item,index) => {
+ if(index == itemIndex){
+ if(item.checkContents.length == 1){
+ state.form.checkCatalogues.splice(index,1)
+ }else {
+ item.checkContents.pop()
+ }
+ }
+ })
+}
+const handleCloseDialog = () => {
+ state.termForm = {
+ id: null,
+ mess: '',
+ number: ''
+ }
+ state.showDialog = false
+}
+const onSubmitTerm = async () =>{
+ const valid = await termRef.value.validate();
+ if(valid){
+ state.form.checkCatalogues.push({
+ checkContents: [{}],
+ catalogueId:state.termForm.id,
+ number: state.termForm.number,
+ mess: state.termForm.mess})
+ state.showDialog = false
+ }
+}
+const handleTreeSelect = (node) => {
+ state.termForm.id = node.id
+ state.termForm.number = node.number
+ state.termForm.mess = node.mess
+
+};
defineExpose({
openDialog
});
@@ -366,5 +486,15 @@
flex-direction: column;
align-items: flex-start;
}
+ :deep(.el-radio__label) {
+ display: none !important; /* !important提高优先级,确保生效 */
+ }
+ :deep(.el-form-item__content){
+ display: inline;
+ }
+ :deep(.el-cascader-menu__list) {
+ max-width: 400px !important;
+ }
+
}
</style>
--
Gitblit v1.9.2