Răsfoiți Sursa

Merge branch 'master' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-wt

liujt 1 lună în urmă
părinte
comite
2a5c51efa0

+ 8 - 0
src/api/bpm/components/qualityReportApproval/qualityReportApproval.js

@@ -142,3 +142,11 @@ export async function updateData(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+// 详情
+export async function getGroupById(id) {
+  const res = await request.get(`/main/group/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 59 - 37
src/views/bpm/handleTask/components/qualityReportApproval/detailDialog.vue

@@ -28,7 +28,14 @@
         ></component>
       </div>
 
-      <div v-html="template" v-show="activeComp === 'main'"> </div>
+      <component
+        :is="form.reportTemplateCode"
+        ref="templateRef"
+        v-show="activeComp == 'main'"
+        :key="form.reportTemplateCode"
+        :view="view"
+      ></component>
+      <!-- <div v-html="template" v-show="activeComp === 'main'"> </div> -->
       <unqualifiedProduct
         ref="unqualifiedProductRef"
         v-show="activeComp == 'unqualifiedList'"
@@ -134,12 +141,18 @@
     getDetailById,
     getList,
     getCertifiById,
+    getGroupById,
     getById
   } from '@/api/bpm/components/qualityReportApproval/qualityReportApproval';
   import { enterprisePage } from '@/api/bpm/components/contractManage/contractBook.js';
   import { fileGetByIdsAPI } from '@/components/addDoc/api/index.js';
   import browse from '@/components/jimureport/browse.vue';
-  import inspection_report3 from './inspection_report3.vue';
+  import inspection_report1 from './template/inspection_report1.vue';
+  import inspection_report2 from './template/inspection_report2.vue';
+  import inspection_report3 from './template/inspection_report3.vue';
+  import inspection_report5 from './template/inspection_report5.vue';
+  import inspection_report6 from './template/inspection_report6.vue';
+  import inspection_report4 from './template/inspection_report4.vue';
   import unqualifiedProduct from './unqualifiedProduct.vue';
   import { getJmPrintViewUrl } from '@/components/jimureport/api.js';
   import { getToken } from '@/utils/token-util';
@@ -164,12 +177,29 @@
       },
       businessType: {
         default: ''
+      },
+      deptName: {
+        default: ''
+      },
+      fromUser: {
+        default: ''
+      },
+      createTime: {
+        default: ''
+      },
+      deptId: {
+        default: ''
       }
     },
     components: {
       browse,
       unqualifiedProduct,
-      inspection_report3
+      inspection_report1,
+      inspection_report2,
+      inspection_report3,
+      inspection_report4,
+      inspection_report5,
+      inspection_report6
     },
     data() {
       return {
@@ -188,7 +218,7 @@
           ...defForm
         },
         inspectionItems: [],
-        form: {},
+        form: { reportTemplateCode: '' },
         tabOptions: [
           { key: 'main', name: '报告' },
           { key: 'unqualifiedList', name: '不良品台账' }
@@ -231,7 +261,13 @@
               inspectImage.push(...item.inspectImage);
             }
           });
-          // console.log(inspectImage, 'inspectImage');
+
+          //  feedbackDepartment: '',
+          //         feedbackPerson: '',
+          //         feedbackDate: '',
+          //         deptHeadPerson: '',
+          //         deptHeadDate: '',
+
           try {
             if (inspectImage.length) {
               vehiclePhotoUrl = await fileGetByIdsAPI(inspectImage);
@@ -246,6 +282,8 @@
           });
 
           this.activeComp = 'unqualifiedHtml';
+          const depData = await getGroupById(this.deptId);
+          console.log(depData, 'depData');
           this.$nextTick(() => {
             if (data.contentText) {
               data.contentText = JSON.parse(data.contentText);
@@ -262,6 +300,11 @@
                     modelType: data.modelType,
                     batchNo: data.batchNo,
                     total: data.quantity,
+                    feedbackDepartment: this.deptName,
+                    feedbackPerson: this.fromUser,
+                    feedbackDate: this.createTime,
+                    deptHeadDate: this.createTime,
+                    deptHeadPerson: depData?.data?.managerFirst[0]?.name,
                     sampleMeasureUnit: data.measureUnit,
                     vehiclePhotoUrl: vehiclePhotoUrl?.map(
                       (item) => item.storagePath[0]?.storePath
@@ -285,36 +328,15 @@
 
         if (detail.data.reportTemplateJson?.template) {
           this.template = detail.data.reportTemplateJson.template;
-
+          console.log(detail.data, 'detail.data');
           this.inspectionItems = detail.data.reportTemplateJson.inspectionItems;
           this.basicInfoData = detail.data.reportTemplateJson?.basicInfoData;
-          if (this.businessType?.includes('检测报告单')) {
-            this.$nextTick(() => {
-              const table = document.querySelector('.inspection-items-table');
-              console.log(table, 'table');
-              if (!table) return;
-
-              // 获取表格主体内的所有行
-              const rows = table.querySelectorAll('tbody tr');
-              for (let row of rows) {
-                const cells = row.querySelectorAll('td');
-                // 遍历当前行的每个 td
-                for (let i = 0; i < cells.length; i++) {
-                  if (cells[i].textContent.trim() === '结论') {
-                    // 找到了“结论”所在的 td,取它后面的兄弟 td
-                    const nextTd = cells[i].nextElementSibling;
-                    if (nextTd) {
-                      // 保存原文本(可选)
-                      const originalText = nextTd.textContent.trim();
-                      // 替换内容为 input,并设置 id
-                      nextTd.innerHTML = `<input class="el-input__inner" style="width: 100%" id="conclusionInput" type="text" value="${originalText}" />`;
-                    }
-                    return; // 找到后结束循环
-                  }
-                }
-              }
-            });
-          }
+          this.$nextTick(() => {
+            this.$refs.templateRef.init(
+              this.basicInfoData,
+              this.inspectionItems
+            );
+          });
         } else {
           this.tabOptions = this.tabOptions.filter(
             (item) => item.key != 'main'
@@ -391,6 +413,7 @@
         }
       },
       async getTableValue() {
+        this.view = true;
         let unqualifiedProducts = this.$refs.unqualifiedProductRef.getValue();
         let contentText = null;
         if (this.businessType?.includes('不良品处置')) {
@@ -399,8 +422,7 @@
         if (unqualifiedProducts == 'isNodisposeType') {
           return unqualifiedProducts;
         }
-        this.basicInfoData.conclusion =
-          document.getElementById('conclusionInput')?.value;
+        const printSection = document.getElementById('printSection');
         const params = {
           id: this.form.id,
           type: 0,
@@ -410,8 +432,8 @@
           contentText: contentText,
           unqualifiedProducts,
           reportTemplateJson: {
-            template: this.template,
-            basicInfoData: this.basicInfoData,
+            template: printSection?.innerHTML || this.template,
+            basicInfoData: this.$refs.templateRef?.getValue(),
             inspectionItems: this.inspectionItems
           }
         };

+ 11 - 0
src/views/bpm/handleTask/components/qualityReportApproval/submit.vue

@@ -66,6 +66,8 @@
     generateReport,
     updateData
   } from '@/api/bpm/components/qualityReportApproval/qualityReportApproval';
+  import dayjs from 'dayjs';
+
   // 流程实例的详情页,可用于审批
   export default {
     name: '',
@@ -119,12 +121,21 @@
           if (this.businessType?.includes('检测报告单')) {
             await generateReport(data);
           } else {
+            let userInfo = this.$store.state.user.info;
+            console.log(data, 'data');
+            data.contentText.basicInfoData.remarks.push({
+              department: userInfo?.groupName,
+              opinion: this.form.reason,
+              sign: userInfo?.name,
+              date: dayjs().format('YYYY-MM-DD')
+            });
             await updateData({
               ...data.unqualifiedProducts,
               contentText: data.contentText
             });
           }
         }
+        // return;
         let API = !!status ? approveTaskWithVariables : rejectTask;
         await API({
           id: this.taskId,

+ 360 - 0
src/views/bpm/handleTask/components/qualityReportApproval/template/inspection_report1.vue

@@ -0,0 +1,360 @@
+<template>
+  <div id="printSection" style="padding: 20px; background-color: white">
+    <h1
+      style="
+        text-align: center;
+        font-size: 24px;
+        margin-bottom: 20px;
+        font-weight: bold;
+      "
+      >检测报告</h1
+    >
+
+    <!-- 编号和报告单号 -->
+    <div style="margin-bottom: 20px">
+      <el-row>
+        <el-col :span="12">
+          <div style="display: flex; align-items: center">
+            <span style="font-weight: bold; margin-right: 10px">编号:</span>
+            <span style="flex: 1">{{ basicInfoData.code }}</span>
+          </div>
+        </el-col>
+        <el-col :span="12">
+          <div style="display: flex; align-items: center">
+            <span style="font-weight: bold; margin-right: 10px">报告单号:</span>
+            <span style="flex: 1">
+              <div v-if="isView">
+                {{ basicInfoData.reportNumber }}
+              </div>
+              <div v-else>
+                <el-input
+                  v-model="basicInfoData.reportNumber"
+                  placeholder="请输入报告编号"
+                ></el-input>
+              </div>
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 基本信息表格 -->
+    <table
+      class="basic-info-table"
+      style="width: 100%; border-collapse: collapse; border: 1px solid #ccc"
+    >
+      <tbody>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检品名称</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.productName
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >批号/序列号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.batchNo
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >规格型号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.specification }}/{{ basicInfoData.modelType }}</td
+          >
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >数量</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.total
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >请验日期</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.pleaseVerifyDate
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >请验部门</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.pleaseVerifyDepartment
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >报告日期</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.reportDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.reportDate }}</div>
+          </td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >有效期</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.expirationDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.expirationDate || '/' }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >来源</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.source"
+                placeholder="请输入来源"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.source }}</div>
+          </td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >储存条件</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.storageCondition"
+                placeholder="请输入储存条件"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.storageCondition }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验依据</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" colspan="3">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.inspectionBasis"
+                placeholder="请输入检验依据"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.inspectionBasis }}</div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+
+    <!-- 检验项目表格 -->
+    <table
+      class="inspection-items-table"
+      style="
+        width: 100%;
+        border-collapse: collapse;
+        border: 1px solid #ccc;
+        margin-bottom: 20px;
+      "
+    >
+      <thead>
+        <tr>
+          <th style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验项目</th
+          >
+          <th style="border: 1px solid #ccc; padding: 8px">标准规定</th>
+          <th style="border: 1px solid #ccc; padding: 8px; width: 150px"
+            >检测内容</th
+          >
+          <th style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验结果</th
+          >
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(item, index) in inspectionItems" :key="index">
+          <td
+            style="
+              width: 150px;
+              border: 1px solid #ccc;
+              padding: 8px;
+              min-height: 37px;
+            "
+            >{{ item.item }}</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.standardRegulations
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px; width: 150px">{{
+            item.qualityResultContent
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px">{{
+            item.results
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >结论</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" :colspan="2">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.conclusion"
+                placeholder="请输入结论"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.conclusion || '' }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >备注</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" :colspan="2">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.remarks"
+                placeholder="请输入备注"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.remarks || '' }}</div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <!-- 签名区域 -->
+    <div style="margin-top: 20px">
+      <el-row :gutter="20" style="display: flex; align-items: center">
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >检验员/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.inspector"
+                  placeholder="请输入检验员"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.inspectionTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.inspector || '' }} /
+                {{ basicInfoData.inspectionTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >复核人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.reviewer"
+                  placeholder="请输入复核人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.reviewTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.reviewer || '' }} /
+                {{ basicInfoData.reviewTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >审核人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.checker"
+                  placeholder="请输入审核人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.approvedDate"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.checker || '' }} /
+                {{ basicInfoData.approvedDate || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'QualityReport',
+    props: {
+      isView: {
+        type: Boolean,
+        default: false
+      }
+    },
+
+    components: {},
+    data() {
+      return {
+        // 基本信息数据
+        basicInfoData: {},
+
+        // 检验项目
+        inspectionItems: []
+      };
+    },
+    created() {},
+    methods: {
+      /* 打开质检报告 */
+      async init(basicInfoData, inspectionItems) {
+        this.$set(this, 'basicInfoData', basicInfoData);
+        this.$set(this, 'inspectionItems', inspectionItems);
+      },
+
+      /* 保存编辑 */
+      getValue() {
+        return this.basicInfoData;
+      }
+    }
+  };
+</script>

+ 381 - 0
src/views/bpm/handleTask/components/qualityReportApproval/template/inspection_report2.vue

@@ -0,0 +1,381 @@
+<template>
+  <div id="printSection" style="padding: 20px; background-color: white">
+    <h2 style="text-align: center; font-size: 24px; margin-bottom: 10px"
+      >{{ basicInfoData.groupName||'湖南特瑞精密医疗器器械有限公司' }}</h2
+    >
+    <h1
+      style="
+        text-align: center;
+        font-size: 24px;
+        margin-bottom: 20px;
+        font-weight: bold;
+      "
+      >成品检验报告</h1
+    >
+
+    <!-- 编号和报告单号 -->
+    <div style="margin-bottom: 5px">
+      <el-row style="display: flex">
+        <el-col :span="12" style="width: 50%">
+          <div style="display: flex; align-items: center">
+            <span style="font-weight: bold; margin-right: 10px">报告编号:</span>
+            <span style="flex: 1">{{ basicInfoData.code }}</span>
+          </div>
+        </el-col>
+        <el-col :span="12" style="width: 50%">
+          <div
+            style="
+              display: flex;
+              align-items: center;
+              justify-content: flex-end;
+            "
+          >
+            <span style="font-weight: bold; margin-right: 10px">表单编号:</span>
+
+            <span >
+              {{ basicInfoData.reportNumber }}
+            </span>
+            <!-- <span v-else>
+              <el-input
+                v-model="basicInfoData.reportNumber"
+                placeholder="请输入报告编号"
+              ></el-input>
+            </span> -->
+            <span style="font-weight: bold; margin-left: 3px">
+              <span> 版本:</span>
+
+              <span >
+                {{ basicInfoData.version }}
+              </span>
+              <!-- <span v-else>
+                <el-input
+                  style="width: 120px"
+                  v-model="basicInfoData.version"
+                  placeholder="请输入版本"
+                ></el-input>
+              </span> -->
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 基本信息表格 -->
+    <table
+      class="basic-info-table"
+      style="width: 100%; border-collapse: collapse; border: 1px solid #ccc"
+    >
+      <tbody>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >产品名称</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.productName
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >生产批号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.batchNo
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >规格型号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.specification }}/{{ basicInfoData.modelType }}</td
+          >
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >灭菌批号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            ><span style="flex: 1">
+              <div v-if="isView">
+                {{ basicInfoData.reportNumber1 }}
+              </div>
+              <div v-else>
+                <el-input
+                  v-model="basicInfoData.reportNumber1"
+                  placeholder="请输入报告编号"
+                ></el-input>
+              </div> </span
+          ></td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >产品数量</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.total }}{{ basicInfoData.sampleMeasureUnit }}</td
+          >
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >抽检数量</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.sampleQuantity
+            }}{{ basicInfoData.sampleMeasureUnit }}</td
+          >
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >包装规格</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.packingSpecification
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >生产日期</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.manufactureTime"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.manufactureTime }}</div></td
+          >
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >有效期</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.expirationDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.expirationDate || '/' }}</div>
+          </td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >报告日期</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.reportDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.reportDate }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验依据</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" colspan="3">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.inspectionBasis"
+                placeholder="请输入检验依据"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.inspectionBasis }}</div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+
+    <!-- 检验项目表格 -->
+    <table
+      class="inspection-items-table"
+      style="
+        width: 100%;
+        border-collapse: collapse;
+        border: 1px solid #ccc;
+        margin-bottom: 20px;
+      "
+    >
+      <thead>
+        <tr>
+          <th style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验项目</th
+          >
+          <th style="border: 1px solid #ccc; padding: 8px">标准要求</th>
+          <th style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验结果</th
+          >
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(item, index) in inspectionItems" :key="index">
+          <td
+            style="
+              width: 150px;
+              border: 1px solid #ccc;
+              padding: 8px;
+              min-height: 37px;
+            "
+            >{{ item.item }}</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.standardRegulations
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px">{{
+            item.results
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >结论</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" :colspan="2">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.conclusion"
+                placeholder="请输入结论"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.conclusion || '' }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >备注</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" :colspan="2">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.remarks"
+                placeholder="请输入备注"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.remarks || '' }}</div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <!-- 签名区域 -->
+    <div style="margin-top: 20px">
+      <el-row :gutter="20" style="display: flex; align-items: center">
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >检验员/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.inspector"
+                  placeholder="请输入检验员"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.inspectionTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.inspector || '' }} /
+                {{ basicInfoData.inspectionTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >复核人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.reviewer"
+                  placeholder="请输入复核人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.reviewTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.reviewer || '' }} /
+                {{ basicInfoData.reviewTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >审核人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.checker"
+                  placeholder="请输入审核人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.approvedDate"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.checker || '' }} /
+                {{ basicInfoData.approvedDate || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'QualityReport',
+    props: {
+      isView: {
+        type: Boolean,
+        default: false
+      }
+    },
+
+    data() {
+      return {
+        // 基本信息数据
+        basicInfoData: {},
+
+        // 检验项目
+        inspectionItems: []
+      };
+    },
+
+    methods: {
+      /* 打开质检报告 */
+      async init(basicInfoData, inspectionItems) {
+        this.$set(this, 'basicInfoData', basicInfoData);
+        this.$set(this, 'inspectionItems', inspectionItems);
+      },
+
+      /* 保存编辑 */
+      getValue() {
+        return this.basicInfoData;
+      }
+    }
+  };
+</script>

+ 28 - 43
src/views/bpm/handleTask/components/qualityReportApproval/inspection_report3.vue → src/views/bpm/handleTask/components/qualityReportApproval/template/inspection_report3.vue

@@ -1,6 +1,6 @@
 <template>
   <div
-    id="printSection"
+    id="printSection1"
     style="
       padding: 20px;
       background-color: white;
@@ -358,7 +358,17 @@
           </tr>
           <tr
             ><td colspan="6">
-              <div style="height: 80px"> 质量部QA确认: </div>
+              <div style="height: 80px; display: flex; flex-direction: column">
+                质量部QA确认:
+
+                <el-input
+                  type="textarea"
+                  v-model="basicInfoData.qaRemark"
+                  placeholder=" "
+                  v-if="!isView"
+                ></el-input>
+                <div v-else>{{ basicInfoData.qaRemark || '' }}</div>
+              </div>
               <div
                 style="
                   display: flex;
@@ -399,6 +409,13 @@
             ><td colspan="6">
               <div style="height: 80px"
                 >委托方意见(仅适用于受托不合格品处置):
+                <el-input
+                  type="textarea"
+                  v-model="basicInfoData.consignorRemark"
+                  placeholder=" "
+                  v-if="!isView"
+                ></el-input>
+                <div v-else>{{ basicInfoData.consignorRemark || '' }}</div>
               </div>
               <div
                 style="
@@ -436,7 +453,7 @@
               </div>
             </td></tr
           >
-          <tr align="center"
+          <tr align="center" v-if="!isView"
             ><td colspan="6"
               ><span style="font-weight: 800; font-size: 15px"
                 >不合格评审</span
@@ -451,41 +468,13 @@
           </tr>
           <tr align="center" v-for="value in basicInfoData.remarks">
             <td style="width: 300px">
-              <el-input
-                v-if="!isView"
-                v-model="value.department"
-                placeholder="请输入部门"
-                style="width: 100%"
-              ></el-input>
-              <span v-else>{{ value.department }}</span>
+              <span>{{ value.department }}</span>
             </td>
             <td colspan="3">
-              <el-input
-                v-if="!isView"
-                v-model="value.opinion"
-                placeholder="请输入意见"
-                style="width: 100%"
-              ></el-input>
-              <span v-else>{{ value.opinion }}</span>
+              <span>{{ value.opinion }}</span>
             </td>
             <td>
-              <div v-if="!isView" style="display: flex; align-items: center">
-                <el-input
-                  v-model="value.sign"
-                  placeholder="请输入签字人"
-                  style="width: 140px"
-                ></el-input>
-                <el-date-picker
-                  v-model="value.date"
-                  type="date"
-                  value-format="yyyy-MM-dd"
-                  placeholder="选择日期"
-                  style="width: 160px"
-                />
-              </div>
-              <div v-else
-                >{{ value.sign || '' }} / {{ value.date || '' }}</div
-              ></td
+              <div>{{ value.sign || '' }} / {{ value.date || '' }}</div></td
             >
           </tr>
         </tbody>
@@ -599,7 +588,7 @@
                 <el-checkbox
                   v-model="basicInfoData.correctiveActionChecked"
                 ></el-checkbox>
-                ,编号:
+                是,编号:
                 <template v-if="!isView">
                   <input
                     v-model="basicInfoData.correctiveActionNo"
@@ -1166,17 +1155,13 @@
           // 质量部QA确认
           qaPerson: '',
           qaDate: '',
+          qaRemark: '',
           // 委托方意见
           consignorPerson: '',
           consignorDate: '',
+          consignorRemark: '',
           // 评审意见表格(5行)
-          remarks: [
-            { department: '', opinion: '', sign: '', date: '' },
-            { department: '', opinion: '', sign: '', date: '' },
-            { department: '', opinion: '', sign: '', date: '' },
-            { department: '', opinion: '', sign: '', date: '' },
-            { department: '', opinion: '', sign: '', date: '' }
-          ],
+          remarks: [],
           // 管代审批
           managementApprovalList: [],
           managementOtherText: '',
@@ -1235,7 +1220,7 @@
         this.isView = true;
         return new Promise((resolve, reject) => {
           this.$nextTick(() => {
-            const printSection = document.getElementById('printSection');
+            const printSection = document.getElementById('printSection1');
             resolve({
               basicInfoData: this.basicInfoData,
               html: printSection.innerHTML

+ 354 - 0
src/views/bpm/handleTask/components/qualityReportApproval/template/inspection_report4.vue

@@ -0,0 +1,354 @@
+<template>
+  <div id="printSection" style="padding: 20px; background-color: white">
+    <h1
+      style="
+        text-align: center;
+        font-size: 24px;
+        margin-bottom: 20px;
+        font-weight: bold;
+      "
+      >检测报告</h1
+    >
+
+    <!-- 编号和报告单号 -->
+    <div style="margin-bottom: 20px">
+      <el-row>
+        <el-col :span="12">
+          <div style="display: flex; align-items: center">
+            <span style="font-weight: bold; margin-right: 10px">编号:</span>
+            <span style="flex: 1">{{ basicInfoData.code }}</span>
+          </div>
+        </el-col>
+        <el-col :span="12">
+          <div style="display: flex; align-items: center">
+            <span style="font-weight: bold; margin-right: 10px">报告单号:</span>
+            <span style="flex: 1">
+              <div v-if="isView">
+                {{ basicInfoData.reportNumber }}
+              </div>
+              <div v-else>
+                <el-input
+                  v-model="basicInfoData.reportNumber"
+                  placeholder="请输入报告编号"
+                ></el-input>
+              </div>
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 基本信息表格 -->
+    <table
+      class="basic-info-table"
+      style="width: 100%; border-collapse: collapse; border: 1px solid #ccc"
+    >
+      <tbody>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检品名称</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.productName
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >批号/序列号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.batchNo
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >规格型号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.specification }}/{{ basicInfoData.modelType }}</td
+          >
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >产品数量</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.total }}{{ basicInfoData.sampleMeasureUnit }}</td
+          >
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >样品来源</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.source"
+                placeholder="请输入来源"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.source }}</div>
+          </td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px">
+            样品数量</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.sampleQuantity
+            }}{{ basicInfoData.sampleMeasureUnit }}</td
+          >
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >请验日期</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.pleaseVerifyDate
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >请验部门</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.pleaseVerifyDepartment
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >报告日期</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" >
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.reportDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.reportDate }}</div>
+          </td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >储存条件</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.storageCondition"
+                placeholder="请输入储存条件"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.storageCondition }}</div>
+          </td>
+        </tr>
+
+        <tr>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验依据</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" colspan="3">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.inspectionBasis"
+                placeholder="请输入检验依据"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.inspectionBasis }}</div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+
+    <!-- 检验项目表格 -->
+    <table
+      class="inspection-items-table"
+      style="
+        width: 100%;
+        border-collapse: collapse;
+        border: 1px solid #ccc;
+        margin-bottom: 20px;
+      "
+    >
+      <thead>
+        <tr>
+          <th style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验项目</th
+          >
+          <th style="border: 1px solid #ccc; padding: 8px">标准规定</th>
+          <th style="border: 1px solid #ccc; padding: 8px; width: 150px"
+            >检测内容</th
+          >
+          <th style="width: 150px; border: 1px solid #ccc; padding: 8px"
+            >检验结果</th
+          >
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(item, index) in inspectionItems" :key="index">
+          <td
+            style="
+              width: 150px;
+              border: 1px solid #ccc;
+              padding: 8px;
+              min-height: 37px;
+            "
+            >{{ item.item }}</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.standardRegulations
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px; width: 150px">{{
+            item.qualityResultContent
+          }}</td>
+          <td style="width: 150px; border: 1px solid #ccc; padding: 8px">{{
+            item.results
+          }}</td>
+        </tr>
+        <tr>
+          <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >结论</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" :colspan="2">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.conclusion"
+                placeholder="请输入结论"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.conclusion || '' }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >备注</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" :colspan="2">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.remarks"
+                placeholder="请输入备注"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.remarks || '' }}</div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <!-- 签名区域 -->
+    <div style="margin-top: 20px">
+      <el-row :gutter="20" style="display: flex; align-items: center">
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >检验员/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.inspector"
+                  placeholder="请输入检验员"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.inspectionTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.inspector || '' }} /
+                {{ basicInfoData.inspectionTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >复核人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.reviewer"
+                  placeholder="请输入复核人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.reviewTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.reviewer || '' }} /
+                {{ basicInfoData.reviewTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >审核人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.checker"
+                  placeholder="请输入审核人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.approvedDate"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.checker || '' }} /
+                {{ basicInfoData.approvedDate || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'QualityReport',
+    props: {
+      isView: {
+        type: Boolean,
+        default: false
+      }
+    },
+
+    components: {},
+    data() {
+      return {
+        // 基本信息数据
+        basicInfoData: {},
+
+        // 检验项目
+        inspectionItems: []
+      };
+    },
+    created() {},
+    methods: {
+      /* 打开质检报告 */
+      async init(basicInfoData, inspectionItems) {
+        this.$set(this, 'basicInfoData', basicInfoData);
+        this.$set(this, 'inspectionItems', inspectionItems);
+      },
+
+      /* 保存编辑 */
+      getValue() {
+        return this.basicInfoData;
+      }
+    }
+  };
+</script>

+ 407 - 0
src/views/bpm/handleTask/components/qualityReportApproval/template/inspection_report5.vue

@@ -0,0 +1,407 @@
+<template>
+  <div id="printSection" style="padding: 20px; background-color: white">
+    <h2 style="text-align: center; font-size: 24px; margin-bottom: 10px">{{
+      basicInfoData.groupName || '湖南特瑞精密医疗器器械有限公司'
+    }}</h2>
+    <h1
+      style="
+        text-align: center;
+        font-size: 24px;
+        margin-bottom: 20px;
+        font-weight: bold;
+      "
+      >来料/半成品检验报告单</h1
+    >
+
+    <!-- 编号和报告单号 -->
+    <div style="margin-bottom: 5px">
+      <el-row style="display: flex">
+        <el-col :span="12" style="width: 50%">
+          <div style="display: flex; align-items: center">
+            <span style="font-weight: bold; margin-right: 10px">报告编号:</span>
+            <span style="flex: 1">{{ basicInfoData.code }}</span>
+          </div>
+        </el-col>
+        <el-col :span="12" style="width: 50%">
+          <div
+            style="
+              display: flex;
+              align-items: center;
+              justify-content: flex-end;
+            "
+          >
+            <span style="font-weight: bold; margin-right: 10px">表单编号:</span>
+
+            <span>
+              {{ basicInfoData.reportNumber }}
+            </span>
+            <!-- <span v-else>
+              <el-input
+                v-model="basicInfoData.reportNumber"
+                placeholder="请输入报告编号"
+              ></el-input>
+            </span> -->
+            <span style="font-weight: bold; margin-left: 3px">
+              <span> 版本:</span>
+
+              <span>
+                {{ basicInfoData.version }}
+              </span>
+              <!-- <span v-else>
+                <el-input
+                  style="width: 120px"
+                  v-model="basicInfoData.version"
+                  placeholder="请输入版本"
+                ></el-input>
+              </span> -->
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 基本信息表格 -->
+    <table
+      class="basic-info-table"
+      style="width: 100%; border-collapse: collapse; border: 1px solid #ccc"
+    >
+      <tbody>
+        <tr>
+          <td style="width: 90px; border: 1px solid #ccc; padding: 8px"
+            >品 名</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.productName
+          }}</td>
+          <td style="width: 90px; border: 1px solid #ccc; padding: 8px"
+            >规格型号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.specification }}/{{ basicInfoData.modelType }}</td
+          >
+        </tr>
+        <tr>
+          <td style="border: 1px solid #ccc; padding: 8px">来料/半成品批号</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.batchNo
+          }}</td>
+
+          <td style="border: 1px solid #ccc; padding: 8px">数量</td>
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.total }}{{ basicInfoData.sampleMeasureUnit }}</td
+          >
+        </tr>
+        <tr>
+          <td style="border: 1px solid #ccc; padding: 8px">供应商名称</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.supplierName
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">抽检数量</td>
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.sampleQuantity
+            }}{{ basicInfoData.sampleMeasureUnit }}</td
+          >
+        </tr>
+        <tr>
+          <td style="border: 1px solid #ccc; padding: 8px">检验日期</td>
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.pleaseVerifyDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.manufactureTime }}</div></td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">报告日期</td>
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.reportDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.reportDate }}</div>
+          </td>
+        </tr>
+
+        <tr>
+          <td style="border: 1px solid #ccc; padding: 8px">检验依据</td>
+          <td style="border: 1px solid #ccc; padding: 8px" colspan="3">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.inspectionBasis"
+                placeholder="请输入检验依据"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.inspectionBasis }}</div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+
+    <!-- 检验项目表格 -->
+    <table
+      class="inspection-items-table"
+      style="
+        width: 100%;
+        border-collapse: collapse;
+        border: 1px solid #ccc;
+        margin-bottom: 20px;
+      "
+    >
+      <thead>
+        <tr>
+          <th style="width: 100px; border: 1px solid #ccc; padding: 8px"
+            >检验项目</th
+          >
+          <th style="border: 1px solid #ccc; padding: 8px">标准规定</th>
+          <th style="border: 1px solid #ccc; padding: 8px">检验工具及编号</th>
+          <th style="border: 1px solid #ccc; padding: 8px; width: 90px"
+            >检测内容</th
+          >
+          <th style="width: 80px; border: 1px solid #ccc; padding: 8px"
+            >检验结果</th
+          >
+          <th style="width: 100px; border: 1px solid #ccc; padding: 8px"
+            >备注</th
+          >
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(item, index) in inspectionItems" :key="index">
+          <td style="border: 1px solid #ccc; padding: 8px; min-height: 37px">{{
+            item.item
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.standardRegulations
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.toolList?.map((item) => item.name + ' ' + item.code).join(',')
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.qualityResultContent
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.results
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-input v-model="item.remark" placeholder="请输入"></el-input>
+            </div>
+            <div v-else>{{ item.remark }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >结论</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" :colspan="4">
+            <div style="display: flex; align-items: center">
+              <div v-if="!isView">
+                <el-checkbox
+                  label="符合规定"
+                  :true-label="'符合'"
+                  v-model="basicInfoData.qualityResultsStr"
+                  :false-label="'不符合'"
+                ></el-checkbox>
+                <el-checkbox
+                  label="不符合规定:"
+                  :true-label="'不符合'"
+                  v-model="basicInfoData.qualityResultsStr"
+                  :false-label="'符合'"
+                ></el-checkbox>
+              </div>
+              <div v-else style="display: flex; align-items: center">
+                <span
+                  style="
+                    position: relative;
+                    display: inline-block;
+                    width: 14px;
+                    height: 14px;
+                    box-sizing: border-box;
+                    border: 1px solid #000;
+                    margin-right: 4px;
+                  "
+                >
+                  <span
+                    v-if="basicInfoData.qualityResultsStr === '符合'"
+                    style="
+                      position: absolute;
+                      left: 3px;
+                      top: 1px;
+                      width: 4px;
+                      height: 8px;
+                      border: solid #000;
+                      border-width: 0 2px 2px 0;
+                      transform: rotate(45deg);
+                    "
+                  ></span>
+                </span>
+                <span style="margin-right: 12px">符合规定</span>
+                <span
+                  style="
+                    position: relative;
+                    display: inline-block;
+                    width: 14px;
+                    height: 14px;
+                    box-sizing: border-box;
+                    border: 1px solid #000;
+                    margin-right: 4px;
+                  "
+                >
+                  <span
+                    v-if="basicInfoData.qualityResultsStr === '不符合'"
+                    style="
+                      position: absolute;
+                      left: 3px;
+                      top: 1px;
+                      width: 4px;
+                      height: 8px;
+                      border: solid #000;
+                      border-width: 0 2px 2px 0;
+                      transform: rotate(45deg);
+                    "
+                  ></span>
+                </span>
+                <span>不符合规定:</span>
+              </div>
+              <el-input
+                style="flex: 1"
+                v-if="!isView"
+                v-model="basicInfoData.qualityResultsStrRemark"
+                placeholder="请输入"
+              ></el-input>
+              <div v-else>{{ basicInfoData.qualityResultsStrRemark }}</div></div
+            >
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <!-- 签名区域 -->
+    <div style="margin-top: 20px">
+      <el-row :gutter="20" style="display: flex; align-items: center">
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >检验人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.inspector"
+                  placeholder="请输入检验人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.inspectionTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.inspector || '' }} /
+                {{ basicInfoData.inspectionTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >复核人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.reviewer"
+                  placeholder="请输入复核人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.reviewTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.reviewer || '' }} /
+                {{ basicInfoData.reviewTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >批准人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.checker"
+                  placeholder="请输入批准人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.approvedDate"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.checker || '' }} /
+                {{ basicInfoData.approvedDate || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'QualityReport',
+    props: {
+      isView: {
+        type: Boolean,
+        default: false
+      }
+    },
+
+    data() {
+      return {
+        // 基本信息数据
+        basicInfoData: {},
+
+        // 检验项目
+        inspectionItems: []
+      };
+    },
+
+    methods: {
+      /* 打开质检报告 */
+      async init(basicInfoData, inspectionItems) {
+        this.$set(this, 'basicInfoData', basicInfoData);
+        this.$set(this, 'inspectionItems', inspectionItems);
+      },
+
+      /* 保存编辑 */
+      getValue() {
+        return this.basicInfoData;
+      }
+    }
+  };
+</script>

+ 400 - 0
src/views/bpm/handleTask/components/qualityReportApproval/template/inspection_report6.vue

@@ -0,0 +1,400 @@
+<template>
+  <div id="printSection" style="padding: 20px; background-color: white">
+    <h2 style="text-align: center; font-size: 24px; margin-bottom: 10px">{{
+      basicInfoData.groupName || '湖南特瑞精密医疗器器械有限公司'
+    }}</h2>
+    <h1
+      style="
+        text-align: center;
+        font-size: 24px;
+        margin-bottom: 20px;
+        font-weight: bold;
+      "
+      >自制品检验报告单</h1
+    >
+
+    <!-- 编号和报告单号 -->
+    <div style="margin-bottom: 5px">
+      <el-row style="display: flex">
+        <el-col :span="12" style="width: 50%">
+          <div style="display: flex; align-items: center">
+            <span style="font-weight: bold; margin-right: 10px">报告编号:</span>
+            <span style="flex: 1">{{ basicInfoData.code }}</span>
+          </div>
+        </el-col>
+        <el-col :span="12" style="width: 50%">
+          <div
+            style="
+              display: flex;
+              align-items: center;
+              justify-content: flex-end;
+            "
+          >
+            <span style="font-weight: bold; margin-right: 10px">表单编号:</span>
+
+            <span >
+              {{ basicInfoData.reportNumber }}
+            </span>
+            <!-- <span v-else>
+              <el-input
+                v-model="basicInfoData.reportNumber"
+                placeholder="请输入报告编号"
+              ></el-input>
+            </span> -->
+            <span style="font-weight: bold; margin-left: 3px">
+              <span> 版本:</span>
+
+              <span>
+                {{ basicInfoData.version }}
+              </span>
+              <!-- <span v-else>
+                <el-input
+                  style="width: 120px"
+                  v-model="basicInfoData.version"
+                  placeholder="请输入版本"
+                ></el-input>
+              </span> -->
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 基本信息表格 -->
+    <table
+      class="basic-info-table"
+      style="width: 100%; border-collapse: collapse; border: 1px solid #ccc"
+    >
+      <tbody>
+        <tr>
+          <td style="width: 90px; border: 1px solid #ccc; padding: 8px"
+            >品 名</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.productName
+          }}</td>
+          <td style="width: 90px; border: 1px solid #ccc; padding: 8px"
+            >规格型号</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.specification }}/{{ basicInfoData.modelType }}</td
+          >
+        </tr>
+        <tr>
+          <td style="border: 1px solid #ccc; padding: 8px">自制品批号</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            basicInfoData.batchNo
+          }}</td>
+
+          <td style="border: 1px solid #ccc; padding: 8px">数量</td>
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.total }}{{ basicInfoData.sampleMeasureUnit }}</td
+          >
+        </tr>
+        <tr>
+          <td style="border: 1px solid #ccc; padding: 8px">检验日期</td>
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.pleaseVerifyDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.manufactureTime }}</div></td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px">报告日期</td>
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-date-picker
+                v-model="basicInfoData.reportDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期"
+              />
+            </div>
+            <div v-else>{{ basicInfoData.reportDate }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="border: 1px solid #ccc; padding: 8px">检验依据</td>
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-input
+                v-model="basicInfoData.inspectionBasis"
+                placeholder="请输入检验依据"
+              ></el-input>
+            </div>
+            <div v-else>{{ basicInfoData.inspectionBasis }}</div>
+          </td>
+          <td style="border: 1px solid #ccc; padding: 8px">抽检数量</td>
+          <td style="border: 1px solid #ccc; padding: 8px"
+            >{{ basicInfoData.sampleQuantity
+            }}{{ basicInfoData.sampleMeasureUnit }}</td
+          >
+        </tr>
+      </tbody>
+    </table>
+
+    <!-- 检验项目表格 -->
+    <table
+      class="inspection-items-table"
+      style="
+        width: 100%;
+        border-collapse: collapse;
+        border: 1px solid #ccc;
+        margin-bottom: 20px;
+      "
+    >
+      <thead>
+        <tr>
+          <th style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >检验项目</th
+          >
+          <th style="border: 1px solid #ccc; padding: 8px">标准规定</th>
+          <th style="border: 1px solid #ccc; padding: 8px">检验工具及编号</th>
+          <th style="border: 1px solid #ccc; padding: 8px; width: 90px"
+            >检测内容</th
+          >
+          <th style="width: 80px; border: 1px solid #ccc; padding: 8px"
+            >检验结果</th
+          >
+          <th style="width: 100px; border: 1px solid #ccc; padding: 8px"
+            >备注</th
+          >
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(item, index) in inspectionItems" :key="index">
+          <td style="border: 1px solid #ccc; padding: 8px; min-height: 37px">{{
+            item.item
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.standardRegulations
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.toolList?.map((item) => item.name + ' ' + item.code).join(',')
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.qualityResultContent
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">{{
+            item.results
+          }}</td>
+          <td style="border: 1px solid #ccc; padding: 8px">
+            <div v-if="!isView">
+              <el-input v-model="item.remark" placeholder="请输入"></el-input>
+            </div>
+            <div v-else>{{ item.remark }}</div>
+          </td>
+        </tr>
+        <tr>
+          <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
+            >结论</td
+          >
+          <td style="border: 1px solid #ccc; padding: 8px" :colspan="4">
+            <div style="display: flex; align-items: center">
+              <div v-if="!isView">
+                <el-checkbox
+                  label="符合规定"
+                  :true-label="'符合'"
+                  v-model="basicInfoData.qualityResultsStr"
+                  :false-label="'不符合'"
+                ></el-checkbox>
+                <el-checkbox
+                  label="不符合规定:"
+                  :true-label="'不符合'"
+                  v-model="basicInfoData.qualityResultsStr"
+                  :false-label="'符合'"
+                ></el-checkbox>
+              </div>
+              <div v-else style="display: flex; align-items: center">
+                <span
+                  style="
+                    position: relative;
+                    display: inline-block;
+                    width: 14px;
+                    height: 14px;
+                    box-sizing: border-box;
+                    border: 1px solid #000;
+                    margin-right: 4px;
+                  "
+                >
+                  <span
+                    v-if="basicInfoData.qualityResultsStr === '符合'"
+                    style="
+                      position: absolute;
+                      left: 3px;
+                      top: 1px;
+                      width: 4px;
+                      height: 8px;
+                      border: solid #000;
+                      border-width: 0 2px 2px 0;
+                      transform: rotate(45deg);
+                    "
+                  ></span>
+                </span>
+                <span style="margin-right: 12px">符合规定</span>
+                <span
+                  style="
+                    position: relative;
+                    display: inline-block;
+                    width: 14px;
+                    height: 14px;
+                    box-sizing: border-box;
+                    border: 1px solid #000;
+                    margin-right: 4px;
+                  "
+                >
+                  <span
+                    v-if="basicInfoData.qualityResultsStr === '不符合'"
+                    style="
+                      position: absolute;
+                      left: 3px;
+                      top: 1px;
+                      width: 4px;
+                      height: 8px;
+                      border: solid #000;
+                      border-width: 0 2px 2px 0;
+                      transform: rotate(45deg);
+                    "
+                  ></span>
+                </span>
+                <span>不符合规定:</span>
+              </div>
+              <el-input
+                style="flex: 1"
+                v-if="!isView"
+                v-model="basicInfoData.qualityResultsStrRemark"
+                placeholder="请输入"
+              ></el-input>
+              <div v-else>{{ basicInfoData.qualityResultsStrRemark }}</div></div
+            >
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <!-- 签名区域 -->
+    <div style="margin-top: 20px">
+      <el-row :gutter="20" style="display: flex; align-items: center">
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >检验人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.inspector"
+                  placeholder="请输入检验人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.inspectionTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.inspector || '' }} /
+                {{ basicInfoData.inspectionTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >复核人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.reviewer"
+                  placeholder="请输入复核人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.reviewTime"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.reviewer || '' }} /
+                {{ basicInfoData.reviewTime || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="display: flex; align-items: center; margin-bottom: 10px">
+            <span style="font-weight: bold; min-width: 100px"
+              >批准人/日期:</span
+            >
+            <span style="flex: 1">
+              <div v-if="!isView" style="display: flex; align-items: center">
+                <el-input
+                  v-model="basicInfoData.checker"
+                  placeholder="请输入批准人"
+                  style="width: 140px"
+                ></el-input>
+                <el-date-picker
+                  v-model="basicInfoData.approvedDate"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="选择日期"
+                  style="width: 160px"
+                />
+              </div>
+              <div v-else
+                >{{ basicInfoData.checker || '' }} /
+                {{ basicInfoData.approvedDate || '' }}</div
+              >
+            </span>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'QualityReport',
+    props: {
+      isView: {
+        type: Boolean,
+        default: false
+      }
+    },
+
+    data() {
+      return {
+        // 基本信息数据
+        basicInfoData: {},
+
+        // 检验项目
+        inspectionItems: []
+      };
+    },
+
+    methods: {
+      /* 打开质检报告 */
+      async init(basicInfoData, inspectionItems) {
+        this.$set(this, 'basicInfoData', basicInfoData);
+        this.$set(this, 'inspectionItems', inspectionItems);
+      },
+
+      /* 保存编辑 */
+      getValue() {
+        return this.basicInfoData;
+      }
+    }
+  };
+</script>

+ 4 - 0
src/views/bpm/handleTask/index.vue

@@ -27,6 +27,10 @@
             :businessType="listData?.businessType"
             :processDefinitionId="processInstance.processDefinition.id"
             :taskDefinitionKey="listData?.taskDefinitionKey"
+            :fromUser="processInstance.startUser?.nickname"
+            :deptName="processInstance.startUser?.deptName"
+            :deptId="processInstance.startUser?.deptId"
+            :createTime="processInstance.createTime"
             @activeCompChange="activeCompChange"
             @handleClose="handleClose"
             ref="bziRef"

+ 2 - 0
src/views/bpm/stockManagement/storage.vue

@@ -1841,6 +1841,8 @@
 
                 return {
                   index: this.productList.length + index,
+                  purchaseReceiveProductId:
+                    filtersItem.purchaseReceiveProductId,
                   categoryId: item.id, // 物品id
                   categoryName: item.name, // 物品名称
                   categoryCode: item.code, // 物品编码

+ 1 - 1
vue.config.js

@@ -38,7 +38,7 @@ module.exports = {
         // target: 'http://124.71.68.31:50001', // 测试环境
         // target: 'http://124.71.68.31:50001',
         // target: 'http://192.168.1.105:18086',
-        target: 'http://192.168.1.251:18086',
+        target: 'http://localhost:18086',
         // target: 'http://192.168.1.116:18086',
         // target: 'http://192.168.1.3:18086',
         // target: 'http://192.168.1.251:18186',