<template>
|
<div class="notice">
|
<el-dialog
|
v-model="dialogVisible"
|
:title="state.title"
|
width="50%"
|
: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="180px" >
|
<el-form-item v-if="state.isAdmin" label="企业:" prop="companyId">
|
<el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" 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-form-item label="评审表名称:" prop="reviewName">
|
<el-input v-model.trim="state.form.reviewName" :readonly="state.title =='查看'"></el-input>
|
</el-form-item>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="产品名称:" prop="productName">
|
<el-input v-model.trim="state.form.productName" :readonly="state.title =='查看'"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="申请部门:" prop="deptId">
|
<el-select
|
clearable
|
v-model="state.form.deptId"
|
:disabled="state.title =='查看'"
|
filterable
|
placeholder="选择部门"
|
style="width: 100%"
|
>
|
<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>
|
<el-col :span="12">
|
<el-form-item label="外包过程名称:" prop="outsourcedProcess">
|
<el-input v-model.trim="state.form.outsourcedProcess" :readonly="state.title =='查看'"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="部门负责人:" prop="deptLeaderId">
|
<el-select clearable v-model="state.form.deptLeaderId" :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-col>
|
</el-row>
|
<el-form-item label="是否为关键件、重要件:" prop="pieceType" >
|
<el-radio-group v-model="state.form.pieceType" :disabled="state.title === '查看'">
|
<el-radio :label="1">关键件</el-radio>
|
<el-radio :label="2">重要件</el-radio>
|
<el-radio :label="3">普通件</el-radio>
|
</el-radio-group>
|
</el-form-item>
|
<el-form-item label="过程重要性:" prop="processType" >
|
<el-radio-group v-model="state.form.processType" :disabled="state.title === '查看'">
|
<el-radio :label="1">关键</el-radio>
|
<el-radio :label="2">一般</el-radio>
|
</el-radio-group>
|
</el-form-item>
|
<el-form-item label="过程外包的必要性:" prop="necessity" >
|
<el-checkbox-group v-model="state.form.necessity">
|
<el-checkbox label="1">本单位没有能力满足产品实现需求</el-checkbox>
|
<el-checkbox label="2">生产急需,利用外部资源实现产品</el-checkbox>
|
<el-checkbox label="3">其他</el-checkbox>
|
</el-checkbox-group>
|
</el-form-item>
|
<el-form-item label="过程外包的可行性:" prop="feasibility" >
|
<el-checkbox-group v-model="state.form.feasibility">
|
<el-checkbox label="1" value="1">本单位可提供现成的图纸、技术资料</el-checkbox>
|
<el-checkbox label="2" value="2">本单位可提供合格的原材料</el-checkbox>
|
<el-checkbox label="3" value="3">本单位有能力对供方产品实现过程实施控制</el-checkbox>
|
<el-checkbox label="4" value="4">其他</el-checkbox>
|
</el-checkbox-group>
|
</el-form-item>
|
<el-form-item label="风险识别:" prop="riskRecognition" >
|
<el-checkbox-group v-model="state.form.riskRecognition">
|
<el-checkbox label="1" value="1">外包过程对我所产品质量有很大影响</el-checkbox>
|
<el-checkbox label="2" value="2">外包产品供货影响我所生产进度</el-checkbox>
|
<el-checkbox label="3" value="3">实施外包对我所经济效益有影响</el-checkbox>
|
<el-checkbox label="4" value="4">其他</el-checkbox>
|
</el-checkbox-group>
|
</el-form-item>
|
<el-form-item label="控制措施:"></el-form-item>
|
<el-form-item label="控制质量影响的措施:" prop="qualityMeasures" >
|
<el-checkbox-group v-model="state.form.qualityMeasures">
|
<el-checkbox label="1" value="1">进货检验</el-checkbox>
|
<el-checkbox label="2" value="2">我司到供方现场验证</el-checkbox>
|
<el-checkbox label="3" value="3">顾客到供方现场验证</el-checkbox>
|
</el-checkbox-group>
|
</el-form-item>
|
<el-form-item label="控制影响进度的措施:" prop="progressMeasures" >
|
<el-checkbox-group v-model="state.form.progressMeasures">
|
<el-checkbox label="1" value="1">与供方及时沟通</el-checkbox>
|
<el-checkbox label="2" value="2">要求供方列出进度计划</el-checkbox>
|
<el-checkbox label="3" value="3">纳入协同合作采取经济制约</el-checkbox>
|
</el-checkbox-group>
|
</el-form-item>
|
<el-form-item label="控制经济影响的措施:" prop="economicMeasure" >
|
<el-checkbox-group v-model="state.form.economicMeasure">
|
<el-checkbox label="1" value="1">我司财务预算</el-checkbox>
|
<el-checkbox label="2" value="2">在预算范围内外包</el-checkbox>
|
<el-checkbox label="3" value="3">与供方协商解决</el-checkbox>
|
</el-checkbox-group>
|
</el-form-item>
|
<el-form-item label="拟协作单位:" prop="outsourcedReviewSubsidiaryList">
|
<el-button
|
type="primary"
|
plain
|
icon="Plus"
|
@click="addLine"
|
style="margin-bottom: 10px"
|
v-if="state.title !=='查看'"
|
>新增</el-button>
|
</el-form-item>
|
|
<el-table :data="state.form.outsourcedReviewSubsidiaryList" class="customedTable" :border="true">
|
<el-table-column label="序号" type="index" width="80" align="center"></el-table-column>
|
<el-table-column label="拟协作单位名称" prop="assistName" align="center">
|
<template #default="scope">
|
<el-input
|
v-model.trim="scope.row.assistName"
|
size="large"
|
type="textarea"
|
style="width: 100%;"
|
clearable
|
:readonly="state.title =='查看'"
|
>
|
</el-input>
|
</template>
|
</el-table-column>
|
<el-table-column label="拟协作单位地址" prop="assistAddress" align="center">
|
<template #default="scope">
|
<el-input
|
v-model.trim="scope.row.assistAddress"
|
size="large"
|
type="textarea"
|
style="width: 100%;"
|
clearable
|
:readonly="state.title =='查看'"
|
>
|
</el-input>
|
</template>
|
</el-table-column>
|
<el-table-column label="电话" prop="phone" align="center">
|
<template #default="scope">
|
<el-input
|
v-model.trim="scope.row.phone"
|
size="large"
|
type="textarea"
|
style="width: 100%;"
|
clearable
|
:readonly="state.title =='查看'"
|
>
|
</el-input>
|
</template>
|
</el-table-column>
|
<el-table-column label="操作" align="center" width="70" v-if="state.title !=='查看'">
|
<template #default="scope">
|
<el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
<el-form-item label="评审意见及签署:" prop="outsourceType" >
|
<el-radio-group v-model="state.form.outsourceType" :disabled="state.title === '查看'">
|
<el-radio :label="1">可以外包</el-radio>
|
<el-radio :label="2">不可以外包,由部门采取措施解决。措施内容:</el-radio>
|
</el-radio-group>
|
</el-form-item>
|
<el-form-item prop="measure" v-if="state.form.outsourceType == 2">
|
<el-input
|
v-model.trim="state.form.measure"
|
size="large"
|
type="textarea"
|
style="width: 100%;"
|
clearable
|
:readonly="state.title =='查看'"
|
>
|
</el-input>
|
</el-form-item>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="申请部门:" prop="applyDept">
|
<el-input v-model.trim="state.form.applyDept" :readonly="state.title =='查看'"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item prop="applyDeptDate">
|
<el-date-picker
|
v-model="state.form.applyDeptDate"
|
type="date"
|
value-format="YYYY-MM-DD"
|
placeholder="请选择日期"
|
:disabled="state.title =='查看'"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="质检部:" prop="qualityInspection">
|
<el-input v-model.trim="state.form.qualityInspection" :readonly="state.title =='查看'"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item prop="qualityInspectionDate">
|
<el-date-picker
|
v-model="state.form.qualityInspectionDate"
|
type="date"
|
value-format="YYYY-MM-DD"
|
placeholder="请选择日期"
|
:disabled="state.title =='查看'"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="管理者代表:" prop="managementRepresentative">
|
<el-input v-model.trim="state.form.managementRepresentative" :readonly="state.title =='查看'"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item prop="managementRepresentativeDate">
|
<el-date-picker
|
v-model="state.form.managementRepresentativeDate"
|
type="date"
|
value-format="YYYY-MM-DD"
|
placeholder="请选择日期"
|
:disabled="state.title =='查看'"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-form-item label="批准意见:" prop="approvalOpinions">
|
<el-input
|
v-model.trim="state.form.approvalOpinions"
|
size="large"
|
type="textarea"
|
style="width: 100%"
|
:autosize="{minRows: 3}"
|
:readonly="state.title =='查看'"
|
>
|
</el-input>
|
</el-form-item>
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="主管领导:" prop="executive">
|
<el-input v-model.trim="state.form.executive" :readonly="state.title =='查看'"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item prop="executiveDate">
|
<el-date-picker
|
v-model="state.form.executiveDate"
|
type="date"
|
value-format="YYYY-MM-DD"
|
placeholder="请选择日期"
|
:disabled="state.title =='查看'"
|
/>
|
</el-form-item>
|
</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>
|
</div>
|
</template>
|
<script setup>
|
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
|
import {ElMessage} from "element-plus";
|
import {getToken} from "@/utils/auth";
|
import {
|
updateMaintenanceEvaluate,
|
getMaintenanceEvaluateDetail
|
} from "@/api/infrastructureMng/ledger";
|
|
import {listUser} from "@/api/system/user";
|
import {getOutsourcedReviewDetail, updateOutsourcedReview} from "@/api/outsourcingCooperate/outsourcingCooperate";
|
import {getDepart} from "@/api/orgStructure/depart";
|
|
const emit = defineEmits(["getList"]);
|
const dialogVisible = ref(false)
|
const superRef = ref()
|
const checkList = (rule, value, callback) => {
|
if (state.form.outsourcedReviewSubsidiaryList.length == 0) {
|
callback(new Error('协作单位数据不可为空'))
|
} else if(state.form.outsourcedReviewSubsidiaryList.length > 0 && state.form.outsourcedReviewSubsidiaryList.find(item=>item.assistName == '' || item.assistAddress == '' ||item.phone == '')){
|
callback(new Error('协作单位数据未完善'))
|
} else {
|
callback()
|
}
|
}
|
const state = reactive({
|
title: '',
|
form: {
|
id: null,
|
companyId: null,
|
reviewName: '',
|
productName: '',
|
deptId: null,
|
outsourcedProcess: '',
|
deptLeaderId: null,
|
deptName: '',
|
deptLeaderName: '',
|
pieceType: null,
|
processType: null,
|
necessity: [],
|
feasibility: [],
|
riskRecognition: [],
|
qualityMeasures: [],
|
progressMeasures: [],
|
economicMeasure: [],
|
outsourcedReviewSubsidiaryList: [],
|
delOutsourcedReviewSubsidiaryIds: [],
|
outsourceType: null,
|
measure: '',
|
applyDept: '',
|
applyDeptDate: '',
|
qualityInspection: '',
|
qualityInspectionDate: '',
|
managementRepresentative: '',
|
managementRepresentativeDate: '',
|
approvalOpinions: '',
|
executive: '',
|
executiveDate: '',
|
},
|
oldDeviceList: [],
|
formRules:{
|
companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
|
reviewName: [{ required: true, message: '请填写评审表名称', trigger: 'blur' }],
|
deptId: [{ required: true, message: '请选择申请部门', trigger: 'blur' }],
|
productName: [{ required: true, message: '请填写产品名称', trigger: 'blur' }],
|
outsourcedProcess: [{ required: true, message: '请填写外包过程名称', trigger: 'blur' }],
|
deptLeaderId: [{ required: true, message: '请选择部门负责人', trigger: 'blur' }],
|
pieceType: [{ required: true, message: '请选择是否为关键件、重要件', trigger: 'blur' }],
|
processType: [{ required: true, message: '请选择过程重要性', trigger: 'blur' }],
|
necessity: [{ required: true, message: '请选择过程外包必要性', trigger: 'blur' }],
|
feasibility: [{ required: true, message: '请选择过程外包可行性', trigger: 'blur' }],
|
riskRecognition: [{ required: true, message: '请选择风险识别', trigger: 'blur' }],
|
qualityMeasures: [{ required: true, message: '请选择控制措施', trigger: 'blur' }],
|
progressMeasures: [{ required: true, message: '请选择控制措施', trigger: 'blur' }],
|
economicMeasure: [{ required: true, message: '请选择控制措施', trigger: 'blur' }],
|
outsourcedReviewSubsidiaryList: [{ required: true, validator: checkList, trigger: 'blur' }],
|
outsourceType: [{ required: true, message: '请选择评审意见', trigger: 'blur' }],
|
measure: [{ required: true, message: '请填写措施内容', trigger: 'blur' }],
|
applyDept: [{ required: true, message: '请填写申请部门', trigger: 'blur' }],
|
applyDeptDate: [{ required: true, message: '请选择日期', trigger: 'blur' }],
|
qualityInspection: [{ required: true, message: '请填写质检部', trigger: 'blur' }],
|
qualityInspectionDate: [{ required: true, message: '请选择日期', trigger: 'blur' }],
|
managementRepresentative: [{ required: true, message: '请填写管理者代表', trigger: 'blur' }],
|
managementRepresentativeDate: [{ required: true, message: '请选择日期', trigger: 'blur' }],
|
executive: [{ required: true, message: '请填写主管领导', trigger: 'blur' }],
|
executiveDate: [{ required: true, message: '请选择日期', trigger: 'blur' }]
|
},
|
isAdmin: false,
|
companyList: [],
|
deptList: [],
|
userList: []
|
})
|
onMounted(() => {
|
|
});
|
|
const openDialog = async (type, value,companyId, isAdmin, companyList) => {
|
state.isAdmin = isAdmin
|
if(isAdmin){
|
state.companyList = companyList
|
}
|
await getDepartList(companyId)
|
await getUserList(companyId)
|
state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
|
state.form.companyId = companyId
|
if(state.title == '编辑'||state.title == '查看'){
|
await getInfo(value.id)
|
}
|
dialogVisible.value = true
|
}
|
|
const addLine = () => {
|
const obj = {
|
id: null,
|
reviewId: null,
|
assistName: '',
|
assistAddress: '',
|
phone: ''
|
}
|
state.form.outsourcedReviewSubsidiaryList.push(obj);
|
}
|
|
const handleDelete = (i) =>{
|
state.form.outsourcedReviewSubsidiaryList = state.form.outsourcedReviewSubsidiaryList.filter((item,index) => index != i)
|
}
|
|
const onSubmit = async () => {
|
const valid = await superRef.value.validate();
|
if(valid){
|
const data = JSON.parse(JSON.stringify(state.form))
|
console.log(data,'data')
|
data.delOutsourcedReviewSubsidiaryIds = state.oldDeviceList.filter(i =>!data.outsourcedReviewSubsidiaryList.some(item=>item.id == i.id)).map(i=>i.id)
|
data.necessity = data.necessity.join(',')
|
data.feasibility = data.feasibility.join(',')
|
data.riskRecognition = data.riskRecognition.join(',')
|
data.qualityMeasures = data.qualityMeasures.join(',')
|
data.progressMeasures = data.progressMeasures.join(',')
|
data.economicMeasure = data.economicMeasure.join(',')
|
data.deptName = state.deptList.find(i=>i.deptId == data.deptId)?.deptName
|
data.deptLeaderName = state.userList.find(i=>i.userId == data.deptLeaderId)?.name
|
if(data.outsourceType == 1){
|
data.measure = ''
|
}
|
if(state.title == '新增'){
|
delete data.id
|
const res = await updateOutsourcedReview(data)
|
if(res.code == 200){
|
ElMessage.success(res.message)
|
emit('getList')
|
handleClose()
|
dialogVisible.value = false;
|
}else{
|
ElMessage.warning(res.message)
|
}
|
}else{
|
const res = await updateOutsourcedReview(data)
|
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 getOutsourcedReviewDetail({id: id})
|
if(res.code == 200){
|
Object.keys(state.form).forEach(key => {
|
if (key in res.data) {
|
state.form[key] = res.data[key]
|
}
|
})
|
state.form.outsourcedReviewSubsidiaryList = res.data.outsourcedReviewSubsidiaryList?.map(item=>{
|
return {
|
id: item.id,
|
reviewId: item.reviewId,
|
assistName: item.assistName,
|
assistAddress: item.assistAddress,
|
phone: item.phone
|
}
|
})
|
state.oldDeviceList = state.form.outsourcedReviewSubsidiaryList
|
state.form.necessity = state.form.necessity.split(',')
|
state.form.feasibility = state.form.feasibility.split(',')
|
state.form.riskRecognition = state.form.riskRecognition.split(',')
|
state.form.qualityMeasures = state.form.qualityMeasures.split(',')
|
state.form.progressMeasures =state.form.progressMeasures.split(',')
|
state.form.economicMeasure = state.form.economicMeasure.split(',')
|
// state.form.applyDeptDate = state.form.applyDeptDate.substring(0,10)
|
// state.form.qualityInspectionDate = state.form.qualityInspectionDate.substring(0,10)
|
// state.form.managementRepresentativeDate = state.form.managementRepresentativeDate.substring(0,10)
|
// state.form.executiveDate = state.form.executiveDate.substring(0,10)
|
}else{
|
ElMessage.warning(res.message)
|
}
|
}
|
|
const getDeptList = async ()=>{
|
state.form.deptId = null
|
state.form.deptLeaderId = null
|
await getDepartList(state.form.companyId)
|
await getUserList(state.form.companyId)
|
}
|
|
const getDepartList = async (companyId)=> {
|
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 (companyId)=> {
|
const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId})
|
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
|
}
|
}):[]
|
}else{
|
ElMessage.warning(res.message)
|
}
|
}
|
|
const handleClose = () => {
|
state.form = {
|
id: null,
|
companyId: null,
|
reviewName: '',
|
productName: '',
|
deptId: '',
|
outsourcedProcess: '',
|
deptLeaderId: '',
|
deptName: '',
|
deptLeaderName: '',
|
pieceType: null,
|
processType: null,
|
necessity: [],
|
feasibility: [],
|
riskRecognition: [],
|
qualityMeasures: [],
|
progressMeasures: [],
|
economicMeasure: [],
|
outsourcedReviewSubsidiaryList: [],
|
delOutsourcedReviewSubsidiaryIds: [],
|
outsourceType: null,
|
measure: '',
|
applyDept: '',
|
applyDeptDate: '',
|
qualityInspection: '',
|
qualityInspectionDate: '',
|
managementRepresentative: '',
|
managementRepresentativeDate: '',
|
approvalOpinions: '',
|
executive: '',
|
executiveDate: '',
|
}
|
superRef.value.clearValidate();
|
superRef.value.resetFields()
|
dialogVisible.value = false;
|
}
|
|
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>
|
<style lang="scss">
|
.customedTable{
|
width: calc(100% - 150px);
|
margin-left: 150px;
|
margin-bottom: 30px;
|
.el-table__cell{
|
padding: 2px 0 !important;
|
font-size: 14px !important;
|
}
|
.cell{
|
padding: 0 2px !important;
|
font-size: 14px !important;
|
}
|
}
|
</style>
|