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