From 9b998490450d23422bd9769522c42c4952db0263 Mon Sep 17 00:00:00 2001 From: 祖安之光 <11848914+light-of-zuan@user.noreply.gitee.com> Date: 星期一, 18 八月 2025 16:51:01 +0800 Subject: [PATCH] 修改新增 --- src/views/work/qualityInfo/outsourcingCooperate/outsourcedProcessReview/components/editDialog.vue | 603 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 603 insertions(+), 0 deletions(-) diff --git a/src/views/work/qualityInfo/outsourcingCooperate/outsourcedProcessReview/components/editDialog.vue b/src/views/work/qualityInfo/outsourcingCooperate/outsourcedProcessReview/components/editDialog.vue new file mode 100644 index 0000000..26f5958 --- /dev/null +++ b/src/views/work/qualityInfo/outsourcingCooperate/outsourcedProcessReview/components/editDialog.vue @@ -0,0 +1,603 @@ +<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> -- Gitblit v1.9.2