Browse Source

fix:不合格处置优化调整

liziliang 4 days ago
parent
commit
276f69b192

+ 8 - 0
src/api/unqualified/index.ts

@@ -38,6 +38,14 @@ export function dealFeedback(data: object) {
   });
 }
 
+export function saveBack(data: object) {
+  return request({
+    url: "/api/v1/unqualified/tempSave",
+    method: "post",
+    data,
+  });
+}
+
 export function updateUnqualifiedData(data: object) {
   return request({
     url: "/api/v1/unqualified/update",

+ 8 - 0
src/components/Upload/FilesUpload.vue

@@ -105,6 +105,14 @@ const fileNameList = useVModel(props, "fileNameList", emit); //多文件上传
 
 // el-upload 绑定的值
 const fileList = ref<UploadUserFile[]>([]);
+const setFileList = (data: any) => {
+  fileList.value = data;
+}
+
+defineExpose({
+  setFileList,
+});
+
 
 const handleChange = async (uploadFile: UploadFile) => {
   if (uploadFile.size! > props.size * 1048 * 1048) {

+ 49 - 21
src/views/unqualified/DetailCom.vue

@@ -50,42 +50,53 @@
               {{ item.content }}
             </div>
             <div class="sale-bottom">
-              <div class="desc" v-if="index === 0">
+              <div class="desc" v-if="item.title.includes('不合格现象(质量问题)描述')">
                 填表人:{{ item[`user`] }}
               </div>
-              <div class="desc" v-if="index === 0">
+              <div class="desc" v-if="item.title.includes('不合格现象(质量问题)描述')">
                 检验人员:{{ item[`user1`] }}
               </div>
-              <div class="desc" v-if="index === 1">
+              <div class="desc" v-if="item.title.includes('分析处置要求')">
                 技术人员:{{ item[`user1`] }}
               </div>
-              <div class="desc" v-if="index === 1">
+              <div class="desc" v-if="item.title.includes('分析处置要求')">
                 联系电话:{{ item[`phone`] }}
               </div>
-              <div class="desc" v-if="index === 1 && saleModel.auditType === '1'">
+              <div class="desc" v-if="item.title.includes('分析处置要求') && saleModel.auditType === '1'">
                 责任部门:{{ item[`user2`] }}
               </div>
-              <div class="desc" v-if="index === 1 && saleModel.auditType === '2'">
+              <div class="desc" v-if="item.title.includes('分析处置要求') && saleModel.auditType === '2'">
+                责任部门:{{ item[`user`] }}
+              </div>
+              <div class="desc" v-if="item.title.includes('原因分析') && saleModel.auditType === '1' ">
+                分析单位:{{ item[`company`] }}
+              </div>
+              <div class="desc" v-if="item.title.includes('原因分析') && saleModel.auditType === '2' ">
                 责任部门:{{ item[`user`] }}
               </div>
-              <div class="desc" v-if="index === 2 && saleModel.auditType === '1' ">分析单位:{{ item[`company`] }}</div>
-              <div class="desc" v-if="index === 2 && saleModel.auditType === '2' ">责任部门:{{ item[`user`] }}</div>
 
-              <div class="desc" v-if="index === 3 && saleModel.auditType === '1' ">责任部门:{{ item[`users`] }}</div>
-              <div class="desc" v-if="index === 3 && saleModel.auditType === '2' ">责任部门:{{ item[`user`] }}</div>
+              <div class="desc" v-if="item.title.includes('采取的措施') && saleModel.auditType === '1' ">
+                责任部门:{{ item[`users`] }}
+              </div>
+              <div class="desc" v-if="item.title.includes('采取的措施') && saleModel.auditType === '2' ">
+                责任部门:{{ item[`user`] }}
+              </div>
 
-              <div class="desc" v-if="index === 4 && saleModel.auditType === '1' ">责任部门:{{ item[`user`] }}</div>
-              <div class="desc" v-if="index === 4 && saleModel.auditType === '2' ">责任部门:{{ item[`user`] }}</div>
+              <div class="desc" v-if="item.title.includes('措施落实') && saleModel.auditType === '1' ">
+                责任部门:{{ item[`user`] }}
+              </div>
+              <div class="desc" v-if="item.title.includes('措施落实') && saleModel.auditType === '2' ">
+                责任部门:{{ item[`user`] }}
+              </div>
 
-              <div class="desc" v-if="index === 5">签字:{{ item[`user`] }}</div>
-              <div class="desc" v-if="index === 6">签字:{{ item[`user`] }}</div>
+              <div class="desc" v-if="item.title.includes('不合格品评审(审理)处置意见')">签字:{{ item[`user`] }}</div>
+              <div class="desc" v-if="item.title.includes('组长(或分管领导)审批意见')">签字:{{ item[`user`] }}</div>
               <div class="desc">时间: {{ item.time }}</div>
               <el-button
-                v-if="item.fileUrl"
+                v-if="item.fileUrl && !isPrinting"
                 link
                 type="primary"
                 size="small"
-                class="no-print"
                 @click="handleDownload(item)"
               >下载附件
               </el-button
@@ -114,8 +125,8 @@
               <div class="desc" v-if="item.title.includes('原因分析') && saleModel.auditType === '2' ">责任部门:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
               <div class="desc" v-if="item.title.includes('采取的措施')">责任部门:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
               <div class="desc" v-if="item.title.includes('措施落实') ">责任部门:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
-              <div class="desc" v-if="item.title.includes('不合格品评审(审理)处置意见') ">签字:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
-              <div class="desc" v-if="item.title.includes('组长(或分管领导)审批意见') ">签字:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
+              <div class="desc" v-if="item.title.includes('不合格品评审(审理)处置意见') ">签字:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
+              <div class="desc" v-if="item.title.includes('组长(或分管领导)审批意见') ">签字:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
               <div class="desc">时间: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
             </div>
           </div>
@@ -134,6 +145,9 @@ const date = new Date();
 const now = date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日";
 const contentArray = ref([]);
 const contentArray2 = ref([]);
+defineProps({
+  isPrinting: Boolean
+});
 const refreshView = (row) => {
   saleModel.value = row;
   contentArray.value = [];
@@ -185,11 +199,25 @@ const refreshView = (row) => {
       {title: "不合格品评审(审理)处置意见:"},
       {title: "组长(或分管领导)审批意见:"}
     ];
+    // nextTick(() => {
+    //   // 5. 执行切片逻辑
+    //   contentArray2.value = contentArray2.value.slice(contentArray.value.length);
+    //   console.log("dfdfdfdf", contentArray2.value)
+    // });
+
     nextTick(() => {
-      // 5. 执行切片逻辑
-      contentArray2.value = contentArray2.value.slice(contentArray.value.length);
-      console.log("dfdfdfdf", contentArray2.value)
+      // 获取 contentArray 中所有的 title
+      const existingTitles = contentArray.value.map(item => item.title);
+      // 过滤掉 contentArray2 中已存在的 title
+      contentArray2.value = contentArray2.value.filter(
+        item => !existingTitles.includes(item.title)
+      );
+      console.log("过滤后的 contentArray2:", contentArray2.value);
     });
+  } else {
+    if (row.auditType === '1') {
+      contentArray.value = [contentArray.value[0]];
+    }
   }
 };
 

+ 12 - 2
src/views/unqualified/detail.vue

@@ -1,11 +1,13 @@
 <template>
   <el-drawer v-model="drawerVisible" size="1000">
     <template #header>
-      <div><el-button type="primary" v-print="'#print'">打印</el-button></div>
+      <div>
+        <el-button type="primary" @click="handlePrint">打印</el-button>
+      </div>
     </template>
 
     <div id="print">
-      <DetailCom ref="detailComRef"></DetailCom>
+      <DetailCom ref="detailComRef" :is-printing="isPrinting"></DetailCom>
     </div>
   </el-drawer>
 </template>
@@ -15,7 +17,15 @@ import DetailCom from "@/views/unqualified/DetailCom.vue";
 
 const drawerVisible = ref(false);
 const detailComRef = ref(null);
+const isPrinting = ref(false);
 
+const handlePrint = () => {
+  isPrinting.value = true;
+  nextTick(() => {
+    window.print();
+    isPrinting.value = false;
+  });
+};
 const showDrawer = (row) => {
   drawerVisible.value = true;
 

+ 170 - 28
src/views/unqualified/handle20.vue

@@ -1,6 +1,6 @@
 <template>
 
-  <el-drawer v-model="drawerVisible" size="1000">
+  <el-drawer v-model="drawerVisible" size="1000" @close="handClose">
     <div>
       <DetailCom ref="detailComRef"></DetailCom>
     </div>
@@ -21,19 +21,20 @@
           />
         </el-form-item>
         <el-form-item label="技术人员" prop="user1">
-          <el-tree-select v-model="remark.user1" :data="userList" filterable />
+          <el-tree-select v-model="remark.user1" :data="userList" filterable clearable/>
         </el-form-item>
         <el-form-item label="联系电话" prop="phone">
-          <el-input v-model="remark.phone" />
+          <el-input v-model="remark.phone"/>
         </el-form-item>
         <el-form-item label="责任部门" prop="user2">
-          <el-tree-select v-model="remark.user2" :data="userList" filterable />
+          <el-tree-select v-model="remark.user2" :data="userList" filterable clearable/>
         </el-form-item>
         <el-form-item label="附件" prop="fileUrl">
           <FilesUpload
             v-model:src="remark.fileUrl"
             :generate-pdf="false"
             v-model:file-name-list="fileNameList"
+            ref="load"
           />
         </el-form-item>
       </div>
@@ -46,13 +47,14 @@
           />
         </el-form-item>
         <el-form-item label="分析单位:" prop="company">
-          <el-input v-model="remark.company" />
+          <el-input v-model="remark.company"/>
         </el-form-item>
         <el-form-item label="附件" prop="fileUrl1">
           <FilesUpload
             v-model:src="remark.fileUrl1"
             :generate-pdf="false"
             v-model:file-name-list="fileNameList1"
+            ref="load1"
           />
         </el-form-item>
       </div>
@@ -74,13 +76,14 @@
           <!--          default-first-option-->
           <!--          placeholder="输入后按回车键可自定义输入"-->
           <!--        />-->
-          <el-input v-model="remark.users" />
+          <el-input v-model="remark.users"/>
         </el-form-item>
         <el-form-item label="附件" prop="fileUrl2">
           <FilesUpload
             v-model:src="remark.fileUrl2"
             :generate-pdf="false"
             v-model:file-name-list="fileNameList2"
+            ref="load2"
           />
         </el-form-item>
       </div>
@@ -102,13 +105,14 @@
           <!--          default-first-option-->
           <!--          placeholder="输入后按回车键可自定义输入"-->
           <!--        />-->
-          <el-input v-model="remark.user5" />
+          <el-input v-model="remark.user5"/>
         </el-form-item>
         <el-form-item label="附件" prop="fileUrl3">
           <FilesUpload
             v-model:src="remark.fileUrl3"
             :generate-pdf="false"
             v-model:file-name-list="fileNameList3"
+            ref="load3"
           />
         </el-form-item>
       </div>
@@ -135,8 +139,8 @@
 
     <template #footer>
       <div class="drawer-bottom">
-        <el-button @click="cancelClick">暂存</el-button>
-        <el-button @click="cancelClick">取消</el-button>
+        <el-button type="primary" @click="saveClick">暂存</el-button>
+        <el-button type="info" @click="cancelClick">取消</el-button>
         <el-button type="primary" @click="confirmClick">提交</el-button>
       </div>
     </template>
@@ -145,22 +149,68 @@
 
 <script setup>
 import DetailCom from "@/views/unqualified/DetailCom.vue";
-import { dealFeedback } from "@/api/unqualified/index";
-import { getUserTree } from "@/api/user/index";
-import { useUserStore } from "@/store";
+import {dealFeedback, saveBack} from "@/api/unqualified/index";
+import {getUserTree} from "@/api/user/index";
+import {useUserStore} from "@/store";
 import FilesUpload from "@/components/Upload/FilesUpload.vue";
+import {ElMessage} from "element-plus";
+
 const drawerVisible = ref(false);
 const detailComRef = ref(null);
 const saleModel = ref({});
 const userStore = useUserStore();
 const dutyDept = ref("");
+const load = ref(null)
+const load1 = ref(null)
+const load2 = ref(null)
+const load3 = ref(null)
 const showDrawer = (row) => {
+  console.log(row, "ioio")
   row.isEdit = '是';
   drawerVisible.value = true;
   saleModel.value = row;
   dutyDept.value = JSON.parse(row.remark2).user2;
   nextTick(() => {
     detailComRef.value && detailComRef.value.refreshView(row);
+    if (row.remark2) {
+      remark.content2 = JSON.parse(row.remark2).content ? JSON.parse(row.remark2).content : "";
+      remark.user1 = JSON.parse(row.remark2).user1 ? JSON.parse(row.remark2).user1 : "";
+      remark.user2 = JSON.parse(row.remark2).user2 ? JSON.parse(row.remark2).user2 : "";
+      remark.phone = JSON.parse(row.remark2).phone ? JSON.parse(row.remark2).phone : "";
+      remark.fileUrl = JSON.parse(row.remark2).fileUrl ? JSON.parse(row.remark2).fileUrl : "";
+      fileNameList.value = JSON.parse(row.remark2).fileName ? [JSON.parse(row.remark2).fileName] : [];
+      if (JSON.parse(row.remark2).fileName) {
+        load.value?.setFileList([{name: JSON.parse(row.remark2).fileName}])
+      }
+    }
+
+    if (row.remark3) {
+      remark.content3 = JSON.parse(row.remark3).content ? JSON.parse(row.remark3).content : "";
+      remark.company = JSON.parse(row.remark3).company ? JSON.parse(row.remark3).company : "";
+      remark.fileUrl1 = JSON.parse(row.remark3).fileUrl ? JSON.parse(row.remark3).fileUrl : "";
+      fileNameList1.value = JSON.parse(row.remark3).fileName ? [JSON.parse(row.remark3).fileName] : [];
+      if (JSON.parse(row.remark3).fileName) {
+        load1.value?.setFileList([{name: JSON.parse(row.remark3).fileName}])
+      }
+    }
+    if (row.remark4) {
+      remark.content4 = JSON.parse(row.remark4).content ? JSON.parse(row.remark4).content : "";
+      remark.users = JSON.parse(row.remark4).users ? JSON.parse(row.remark4).users : "";
+      remark.fileUrl2 = JSON.parse(row.remark4).fileUrl ? JSON.parse(row.remark4).fileUrl : "";
+      fileNameList2.value = JSON.parse(row.remark4).fileName ? [JSON.parse(row.remark4).fileName] : [];
+      if (JSON.parse(row.remark4).fileName) {
+        load2.value?.setFileList([{name: JSON.parse(row.remark4).fileName}])
+      }
+    }
+    if (row.remark5) {
+      remark.content5 = JSON.parse(row.remark5).content ? JSON.parse(row.remark5).content : "";
+      remark.user5 = JSON.parse(row.remark5).user ? JSON.parse(row.remark5).user : "";
+      remark.fileUrl3 = JSON.parse(row.remark5).fileUrl ? JSON.parse(row.remark5).fileUrl : "";
+      fileNameList3.value = JSON.parse(row.remark5).fileName ? [JSON.parse(row.remark5).fileName] : [];
+      if (JSON.parse(row.remark5).fileName) {
+        load3.value?.setFileList([{name: JSON.parse(row.remark5).fileName}])
+      }
+    }
   });
   getUserInfo();
 };
@@ -172,28 +222,28 @@ const disabledDate = (time) => {
 };
 const rules1 = {
   content2: [
-    { required: true, message: "请输入分析处置要求", trigger: "blur" },
-    { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
+    {required: true, message: "请输入分析处置要求", trigger: "blur"},
+    {min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur"},
   ],
   content3: [
-    { required: true, message: "请输入原因分析", trigger: "blur" },
-    { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
+    {required: true, message: "请输入原因分析", trigger: "blur"},
+    {min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur"},
   ],
   content4: [
-    { required: true, message: "请输入采取的措施", trigger: "blur" },
-    { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
+    {required: true, message: "请输入采取的措施", trigger: "blur"},
+    {min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur"},
   ],
   content5: [
-    { required: true, message: "请输入措施落实", trigger: "blur" },
-    { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
+    {required: true, message: "请输入措施落实", trigger: "blur"},
+    {min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur"},
   ],
-  users: [{ required: true, message: "请选择人员", trigger: "blur" }],
-  user1: [{ required: true, message: "请选择人员", trigger: "blur" }],
-  user2: [{ required: true, message: "请选择人员", trigger: "blur" }],
-  user5: [{ required: true, message: "请选择人员", trigger: "blur" }],
+  users: [{required: true, message: "请选择人员", trigger: "blur"}],
+  user1: [{required: true, message: "请选择人员", trigger: "blur"}],
+  user2: [{required: true, message: "请选择人员", trigger: "blur"}],
+  user5: [{required: true, message: "请选择人员", trigger: "blur"}],
   phone: [
-    { required: true, message: "请输入电话", trigger: "blur" },
-    { min: 11, max: 11, message: "长度在11个字符", trigger: "blur" },
+    {required: true, message: "请输入电话", trigger: "blur"},
+    {min: 11, max: 11, message: "长度在11个字符", trigger: "blur"},
   ],
   company: [{required: true, message: "请输入责任部门", trigger: "change"}],
   nextRemarkUser: [
@@ -201,7 +251,7 @@ const rules1 = {
   ],
 };
 
-defineExpose({ showDrawer });
+defineExpose({showDrawer});
 
 const remarkRef = ref(null);
 
@@ -225,8 +275,8 @@ const fileNameList3 = ref([]);
 
 const cancelClick = () => {
   drawerVisible.value = false;
-
   remarkRef.value.resetFields();
+  feedBackEmit("finish");
 };
 
 const feedBackEmit = defineEmits(["finish"]);
@@ -314,6 +364,98 @@ const confirmClick = () => {
     }
   });
 };
+const handClose = () => {
+  feedBackEmit("finish");
+}
+const saveClick = () => {
+  const date = new Date();
+  const now = date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日";
+  remark.user = userStore.user.username;
+  // remarkRef.value.validate((valid) => {
+  remark.nextRemarkUser = Array.isArray(remark.nextRemarkUser)
+    ? remark.nextRemarkUser.join(",")
+    : "";
+  // if (valid) {
+  let remark2Copy = ""
+  if (remark.content2 || remark.user1 || remark.user2 || remark.phone) {
+    remark2Copy = {
+      content: remark.content2,
+      user: remark.user,
+      time: now,
+      user1: remark.user1,
+      user2: remark.user2,
+      phone: remark.phone,
+      state: remark.state,
+      fileUrl: remark.fileUrl,
+      fileName: fileNameList.value?.length > 0 ? fileNameList.value[0] : "",
+      isSave: true,
+    };
+  }
+  let remark3 = ""
+  if (remark.content3 || remark.company) {
+    remark3 = {
+      content: remark.content3,
+      company: remark.company,
+      time: now,
+      fileUrl: remark.fileUrl1,
+      fileName: fileNameList1.value?.length > 0 ? fileNameList1.value[0] : "",
+    };
+  }
+  let remark4 = ""
+  if (remark.content4 || remark.users) {
+    remark4 = {
+      content: remark.content4,
+      users: Array.isArray(remark.users)
+        ? remark.users.join(",")
+        : remark.users,
+      time: now,
+      fileUrl: remark.fileUrl2,
+      fileName: fileNameList2.value?.length > 0 ? fileNameList2.value[0] : "",
+    };
+  }
+  let remark5 = ""
+  if (remark.content5 || remark.user5) {
+    remark5 = {
+      content: remark.content5,
+      user: remark.user5,
+      time: now,
+      fileUrl: remark.fileUrl3,
+      fileName: fileNameList3.value?.length > 0 ? fileNameList3.value[0] : "",
+    };
+  }
+
+  let remark6 = ""
+  if (remark.nextRemarkUser) {
+    remark6 = {
+      content: "",
+      user: remark.nextRemarkUser,
+    };
+  }
+
+
+  let p = {
+    id: saleModel.value.id,
+    // remark1: JSON.stringify(remark1),
+    remark2: remark2Copy ? JSON.stringify(remark2Copy) : "",
+    remark3: remark3 ? JSON.stringify(remark3) : "",
+    remark4: remark4 ? JSON.stringify(remark4) : "",
+    remark5: remark5 ? JSON.stringify(remark5) : "",
+    currentUserName: remark.nextRemarkUser,
+    remark6: remark6 ? JSON.stringify(remark6) : "",
+    state: remark.state,
+    step: 1, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
+  };
+  saveBack(p).then((res) => {
+    if (res.data) {
+      feedBackEmit("finish");
+      ElMessage.success("保存成功");
+    }
+  });
+  // } else {
+  //   return false;
+  // }
+  // });
+};
 </script>
 
 <style scoped lang="scss">

+ 4 - 2
src/views/unqualified/index.vue

@@ -269,7 +269,7 @@ const handle5Ref = ref(null);
 const handle6Ref = ref(null);
 const handle7Ref = ref(null);
 const handle = (row) => {
-  if (row.remark2 && !JSON.parse(row.remark2).content) {
+  if (row.remark2 && (!JSON.parse(row.remark2).content || JSON.parse(row.remark2).isSave)) {
     if (row.auditType == "1") {
       if (row.remark1 && !JSON.parse(row.remark1).user1) {
         handle2Ref.value && handle2Ref.value.showDrawer(row);
@@ -301,7 +301,9 @@ const handle = (row) => {
 // 详情
 const detailRef = ref(null);
 const toDetail = (row) => {
-  detailRef.value && detailRef.value.showDrawer(row); // 详情
+  getData();
+  // 详情
+  detailRef.value && detailRef.value.showDrawer(row);
 };
 const getTextByAuditType = (state) => {
   if (state) {