<template>
|
<div class="notice">
|
<el-dialog
|
v-model="dialogVisible"
|
:title="state.title"
|
width="1480px"
|
: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" >
|
<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"
|
:label="item.name"
|
:value="item.id">
|
</el-option>
|
</el-select>
|
</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="startTime">
|
<el-date-picker
|
:disabled="state.title =='查看'"
|
v-model="checkTime"
|
type="datetimerange"
|
range-separator="至"
|
start-placeholder="开始日期"
|
end-placeholder="结束日期"
|
format="YYYY-MM-DD HH:mm:ss"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
style="width: 100%;"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
|
</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" width="110"></el-table-column>
|
<el-table-column label="标题" prop="mess" align="center" width="150"></el-table-column>
|
</el-table-column>
|
<el-table-column label="审核要点" prop="pointKey" align="left" header-align="center" width="430">
|
<template #default="{row,$index}">
|
<el-form-item :prop="'checkCatalogues.' + '[' + $index + ']' + '.pointKey'" :rules="state.formRules.pointKey">
|
<div v-if="showEditor" >
|
<t-editor style="width: 100%;" :height="300" ref="myEditor" :toolbar="toolbar"
|
:value="row.pointKey" @input="inputPonit($event,$index)"></t-editor>
|
</div>
|
<div v-else >
|
<div class="reviewTable" v-html="row.pointKey" ></div>
|
</div>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column label="审核发现" prop="find" align="left" header-align="center">
|
<template #default="{row,$index}">
|
<el-form-item :prop="'checkCatalogues.' + '[' + $index + ']' + '.find'" :rules="state.formRules.find">
|
<div v-if="showEditor" >
|
<t-editor style="width: 100%;" :height="300" ref="myEditor" :toolbar="toolbar"
|
:value="row.find" @input="inputFind($event,$index)"></t-editor>
|
</div>
|
<div v-else >
|
<div class="reviewTable" v-html="row.find" ></div>
|
</div>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column label="审核结果" align="center" >
|
<!-- <el-table-column label="符合" prop="conform" align="center" width="70">-->
|
<!-- <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 + ']' + '.result'" :rules="state.formRules.result">
|
<el-checkbox
|
style="height: 100px"
|
v-model="row.result"
|
:disabled="state.title === '查看'"
|
/>
|
<!-- <el-radio-->
|
<!-- style="height: 100px"-->
|
<!-- v-model="row.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">
|
<el-button @click="handleClose" size="default">取 消</el-button>
|
<el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button>
|
</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-select clearable v-model="state.termForm.id" filterable placeholder="体系标准款项" @change="handleTreeSelect" style="width: 100%">
|
<el-option
|
v-for="item in state.menuOptions"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id"
|
/>
|
</el-select>
|
</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, ElTooltip} from "element-plus";
|
import {Base64} from "js-base64"
|
import {getToken} from "@/utils/auth";
|
import {
|
addInternalAuditCheck, getInternalAuditCheckInfo,
|
updateInternalAuditCheck
|
} from "@/api/innerReview/meetingReview";
|
import {getDepart, getSysClause} 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";
|
import {getUser} from "@/api/onlineEducation/user";
|
import TEditor from "@/components/Tinymce/Tinymce.vue";
|
|
const emit = defineEmits(["getList"]);
|
const dialogVisible = ref(false)
|
const superRef = ref()
|
const termRef = ref()
|
const myEditor = ref();
|
const isReview = ref(false);
|
const showEditor = ref(true);
|
const toolbar = ref('fontsizeselect | undo redo')
|
const checkTime = ref([])
|
const validateFieldsReview = (rule, value, callback) =>{
|
if (checkTime.value && checkTime.value.length >0 ) {
|
callback();
|
} else {
|
callback(new Error('请选择时间'));
|
}
|
}
|
const state = reactive({
|
title: '',
|
form: {
|
id: null,
|
deptId: null,
|
personId: null,
|
startTime: '',
|
endTime:'',
|
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' }],
|
personId: [{ required: true, message: '请选择内审员', trigger: 'blur' }],
|
// checkTime: [{ required: true, message: '请选择内审时间', trigger: 'blur' }],
|
startTime: [{ required: true,validator: validateFieldsReview, 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: [],
|
interUserList: [],
|
menuOptions: []
|
})
|
const props = {
|
checkStrictly: true,
|
value: 'id',
|
label: 'mess'
|
|
}
|
onMounted(() => {
|
|
});
|
|
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
|
state.isAdmin = isAdmin
|
const userInfo = JSON.parse(Cookies.get('userInfo'))
|
state.form.companyId = userInfo.companyId
|
if(state.isAdmin){
|
state.form.companyId = value.companyId
|
state.companyList = companyList
|
}
|
showEditor.value = false
|
state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
|
if(state.title == '编辑'||state.title == '查看'){
|
Object.keys(state.form).forEach(key => {
|
if (key in value) {
|
state.form[key] = value[key]
|
}
|
})
|
checkTime.value = [state.form.startTime,state.form.endTime]
|
state.form.checkCatalogues = state.form.checkCatalogues.map(item => {
|
return {
|
...item,
|
result: item.result == 2 ? true:false
|
}
|
})
|
console.log('1',state.form)
|
}
|
if (state.title == '查看') {
|
showEditor.value = false
|
|
}
|
if (type === 'edit' || type === 'add') {
|
showEditor.value = true;
|
}
|
await getUserList()
|
await getDepartList(state.form.companyId)
|
await getCatalogList()
|
dialogVisible.value = true
|
}
|
|
const getCatalogList = async() => {
|
state.menuOptions = [];
|
const res = await getSysClause()
|
if(res.code == 200){
|
state.menuOptions = res.data.map(i=>{
|
return {
|
id:i.id,
|
clauseNum: i.clauseNum,
|
content: i.name,
|
name: i.clauseNum + ' '+i.name
|
}
|
})
|
}else{
|
ElMessage.warning(res.message)
|
}
|
// 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 () => {
|
console.log('f',state.form)
|
state.form.checkCatalogues = state.form.checkCatalogues.map(item => {
|
return {
|
...item,
|
result: item.result ? 2:1
|
}
|
})
|
state.form.startTime = checkTime.value[0]
|
state.form.endTime = checkTime.value[1]
|
const valid = await superRef.value.validate();
|
if(valid){
|
console.log('f',state.form)
|
if(state.title == '新增'){
|
const {id,...data} = state.form
|
const res = await addInternalAuditCheck(data)
|
if(res.code == 200){
|
ElMessage.success(res.message)
|
emit('getList')
|
handleClose()
|
dialogVisible.value = false;
|
}else{
|
ElMessage.warning(res.message)
|
}
|
}else{
|
const res = await updateInternalAuditCheck(state.form)
|
if(res.code == 200){
|
ElMessage.success(res.message)
|
emit('getList')
|
handleClose()
|
dialogVisible.value = false;
|
}else{
|
ElMessage.warning(res.message)
|
}
|
}
|
}
|
}
|
|
const getInfo = async (id)=> {
|
const res = await getInternalAuditCheckInfo({id: id})
|
if(res.code == 200){
|
state.form.internalAuditCheckPeople = res.data.internalAuditCheckPeople?.map(item=>{
|
return {
|
id: item.id,
|
personId: item.personId,
|
userId: item.auditUserId,
|
name: item.auditUserName,
|
companyId: item.companyId
|
}
|
})
|
}else{
|
ElMessage.warning(res.message)
|
}
|
}
|
|
const getDeptList = async ()=>{
|
state.form.deptId = null
|
state.form.personId = null
|
await getDepartList(state.form.companyId)
|
await getUserList()
|
}
|
|
const getDepartList = async (companyId)=> {
|
if(state.isAdmin && (companyId == 0 || companyId == null)){
|
return
|
}
|
const params = {
|
companyId: companyId
|
}
|
const res = await getDepart(params)
|
if(res.code == 200){
|
state.deptList = res.data
|
}else{
|
ElMessage.warning(res.message)
|
}
|
}
|
|
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
|
const {id, ...data} = item
|
return {
|
...data,
|
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 ()=>{
|
state.form.personId = null
|
await getUserList()
|
}
|
|
const handleClose = () => {
|
state.form = {
|
id: null,
|
deptId: null,
|
personId: null,
|
startTime: '',
|
endTime:'',
|
companyId: null,
|
checkCatalogues: []
|
}
|
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({
|
catalogueId:state.termForm.id,
|
number: state.termForm.number,
|
mess: state.termForm.mess})
|
state.showDialog = false
|
}
|
|
}
|
const handleTreeSelect = (node) => {
|
state.menuOptions.forEach(item => {
|
if(item.id == node){
|
state.termForm.id = node
|
state.termForm.number = item.clauseNum
|
state.termForm.mess = item.name
|
}
|
})
|
|
|
};
|
const inputFind = (val,index)=> {
|
state.form.checkCatalogues[index].find = val
|
}
|
const inputPonit = (val,index)=> {
|
state.form.checkCatalogues[index].pointKey = 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;
|
}
|
: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>
|