Przeglądaj źródła

feat(qualityReportApproval): 新增质检报告审批组件及API

liujt 8 miesięcy temu
rodzic
commit
b122843a08

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

@@ -0,0 +1,23 @@
+import request from '@/utils/request';
+
+/**
+ * 质检报告基本信息
+ */
+export async function getDetail(id) {
+  const res = await request.get(`/qms/quality_work_order/queryInspectionReportData/${id}`, {});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 质检报告质检项列表信息
+ */
+export async function getListDetail(id) {
+  const res = await request.get(`/qms/quality_work_order/queryInspectionReportList/${id}`, {});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 216 - 0
src/views/bpm/handleTask/components/qualityReportApproval/detailDialog.vue

@@ -0,0 +1,216 @@
+<template>
+  <div class="quality-report-container">
+    <div class="title">
+      质检报告
+    </div>
+    
+    <!-- 质检报告表格 -->
+     <div style="display: flex; align-items: center; justify-content: space-between; font-size: 14px; margin-bottom: 10px;">
+        <div>
+            <span class="label">编号:</span>
+            <span class="value">{{ reportData.code }}</span>
+          </div>
+          <div>
+            <span class="label">报告单号:</span>
+            <span class="value">{{ reportData.reportNumber }}</span>
+        </div>
+     </div>
+    <table class="quality-report-table">
+      <tbody>
+        <tr>
+          <td class="label">检品名称:</td>
+          <td class="value">{{ reportData.productName }}</td>
+          <td class="label">批号/序列号:</td>
+          <td class="value"></td>
+        </tr>
+        <tr>
+          <td class="label">规格型号:</td>
+          <td class="value">{{ reportData.specification }}</td>
+          <td class="label">数量:</td>
+          <td class="value">{{ reportData.total }}</td>
+        </tr>
+        <tr>
+          <td class="label">请验日期:</td>
+          <td class="value">{{ reportData.pleaseVerifyDate }}</td>
+          <td class="label">请验部门:</td>
+          <td class="value">{{ reportData.pleaseVerifyDepartment }}</td>
+        </tr>
+        <tr>
+          <td class="label">报告日期:</td>
+          <td class="value">{{ reportData.reportDate }}</td>
+          <td class="label">有效期:</td>
+          <td class="value">{{ reportData.expirationDate }}</td>
+        </tr>
+        <tr>
+          <td class="label">检品来源:</td>
+          <td class="value">{{ reportData.source }}</td>
+          <td class="label">储存条件:</td>
+          <td class="value">{{ reportData.storageCondition }}</td>
+        </tr>
+        <tr>
+          <td class="label">检验依据:</td>
+          <td class="value" colspan="3">{{ reportData.inspectionBasis }}</td>
+        </tr>
+      </tbody>
+    </table>
+
+    <!-- 检验项目表格 -->
+    <table class="quality-report-table">
+      <thead>
+        <tr>
+          <th class="label">检验项目</th>
+          <th class="label">标准规定</th>
+          <th class="label">检验结果</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="item in reportDetail">
+          <td class="value">{{ item.item }}</td>
+          <td class="value">{{ item.standardRegulations }}</td>
+          <td class="value">{{ item.results }}</td>
+        </tr>
+      </tbody>
+    </table>
+
+    <!-- 结论表格 -->
+    <table class="quality-report-table">
+      <tbody>
+        <tr>
+          <td class="label">结论:</td>
+          <td class="value" colspan="3">{{ reportData.conclusion }}</td>
+        </tr>
+        <tr>
+          <td class="label">备注:</td>
+          <td class="value" colspan="3">{{ reportData.remarks }}</td>
+        </tr>
+      </tbody>
+    </table>
+
+    <div style="display: flex; align-items: center; justify-content: space-between; font-size: 14px; margin-top: 10px;">
+      <div>
+        <span class="label">检验员/日期:</span>
+        <span class="value">{{ reportData.inspector }}/{{ reportData.inspectionTime }}</span>
+      </div>
+      <div>
+        <span class="label">复核人/日期:</span>
+        <span class="value">{{ reportData.reviewer }}/{{ reportData.reviewTime }}</span>
+      </div>
+      <div>
+        <span class="label">审核人/日期:</span>
+        <span class="value">{{ reportData.checker }}/{{ reportData.approvedDate }}</span>
+      </div>
+    </div>
+
+    <!-- 签名表格 -->
+    <!-- <table class="quality-report-table">
+      <tbody>
+        <tr>
+          <td class="label">检验员/日期:</td>
+          <td class="value">{{ reportData.inspector }}/{{ reportData.inspectionTime }}</td>
+          <td class="label">复核人/日期:</td>
+          <td class="value">{{ reportData.reviewer }}/{{ reportData.reviewTime }}</td>
+        </tr>
+        <tr>
+          <td class="label">审核人/日期:</td>
+          <td class="value">{{ reportData.checker }}/{{ reportData.approvedDate }}</td>
+          <td class="label"></td>
+          <td class="value"></td>
+        </tr>
+      </tbody>
+    </table> -->
+  </div>
+</template>
+
+<script>
+import { getDetail, getListDetail } from '@/api/bpm/components/qualityReportApproval/qualityReportApproval';
+  export default {
+    props: {
+      taskDefinitionKey: {
+        type: String,
+        default: 'starter'
+      },
+      businessId: {
+        default: ''
+      },
+      isView: {
+        default: ''
+      }
+    },
+    data() {
+      return {
+        // 质检报告数据
+        reportData: {},
+        reportDetail: []
+      };
+    },
+    mounted() {
+      // 组件挂载时加载数据
+      this.loadReportData();
+      this.loadListDetail();
+    },
+    methods: {
+      // 可以根据需要添加数据加载方法
+      async loadReportData() {
+      //   // 从API获取质检报告数据
+        const detail = await getDetail(this.businessId);
+        this.reportData = detail;
+      },
+      async loadListDetail() {
+        const detail = await getListDetail(this.businessId);
+        this.reportDetail = detail;
+      }
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+  .quality-report-container {
+    padding: 20px;
+    background-color: #ffffff;
+    min-height: 100%;
+  }
+
+  .title {
+    font-size: 20px;
+    font-weight: 600;
+    text-align: center;
+    margin-bottom: 20px;
+    color: #333333;
+  }
+
+  .quality-report-table {
+    width: 100%;
+    border-collapse: collapse;
+    // margin-bottom: 20px;
+    font-size: 14px;
+  }
+
+  .quality-report-table td,
+  .quality-report-table th {
+    border: 1px solid #ddd;
+    padding: 8px;
+    text-align: left;
+  }
+
+  .quality-report-table th {
+    background-color: #f5f5f5;
+    font-weight: 600;
+    color: #333333;
+  }
+
+  .quality-report-table .label {
+    width: 120px;
+    background-color: #f9f9f9;
+    font-weight: 500;
+    color: #333333;
+  }
+
+  .quality-report-table .value {
+    color: #555555;
+    min-width: 150px;
+  }
+
+  .quality-report-table tr:hover {
+    background-color: #fafafa;
+  }
+</style>

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

@@ -0,0 +1,288 @@
+<template>
+  <el-col :span="16" :offset="6">
+    <el-form label-width="100px" ref="formRef" :model="form">
+      <el-form-item
+        v-if="taskDefinitionKey === 'deptLeaderAssign'"
+        label="采购部门"
+        prop="userId"
+        style="margin-bottom: 20px"
+      >
+        <deptSelect
+        
+          v-model="form.useDeptId"
+          @changeGroup="searchDeptNodeClick"
+        />
+      </el-form-item>
+      <el-form-item
+        v-if="taskDefinitionKey === 'deptLeaderAssign'"
+        label="采购员"
+        prop="userId"
+        style="margin-bottom: 20px"
+        :rules="{
+          required: true,
+          message: '请选择',
+          trigger: 'change'
+        }"
+      >
+        <el-select
+          v-model="form.userId"
+          clearable
+          style="width: 100%"
+          :filterable="true"
+        >
+          <el-option
+            v-for="item in userOptions"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="审批建议"
+        style="margin-bottom: 20px"
+        :rules="{
+          required: true,
+          message: '请选择',
+          trigger: 'change'
+        }"
+      >
+        <el-input
+          type="textarea"
+          v-model="form.reason"
+          placeholder="请输入审批建议"
+        />
+      </el-form-item>
+    </el-form>
+    <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
+      <el-button
+        icon="el-icon-edit-outline"
+        type="success"
+        size="mini"
+        @click="handleAudit(1)"
+        v-if="!['storeManagerApprove'].includes(taskDefinitionKey)"
+        >通过
+      </el-button>
+
+      <el-button
+        icon="el-icon-circle-close"
+        type="danger"
+        size="mini"
+        @click="rejectTask(0)"
+        >驳回
+      </el-button>
+
+      <!-- <el-button
+        icon="el-icon-circle-close"
+        type="danger"
+        size="mini"
+        @click="handleBackList"
+        >退回
+      </el-button> -->
+      <!-- <el-button
+        icon="el-icon-circle-close"
+        type="danger"
+        size="mini"
+        @click="handleAudit(0)"
+        v-if="taskDefinitionKey != 'productionSupervisorApprove1'"
+        >不通过
+      </el-button>
+      <el-button
+        icon="el-icon-edit-outline"
+        type="primary"
+        size="mini"
+        v-if="taskDefinitionKey != 'productionSupervisorApprove1'"
+        @click="handleUpdateAssignee"
+        >转办
+      </el-button> -->
+    </div>
+  </el-col>
+</template>
+
+<script>
+  import { approveTaskWithVariables, rejectTask,cancelTask } from '@/api/bpm/task';
+  import { listAllUserBind } from '@/api/system/organization';
+  import {
+    assign,
+    cancel,
+    UpdateInformation
+  } from '@/api/bpm/components/purchasingManage/purchasePlanManage';
+  import deptSelect from '@/components/CommomSelect/dept-select.vue';
+  import { getUserPage } from '@/api/system/organization';
+  import storageApi from '@/api/warehouseManagement';
+
+  // 流程实例的详情页,可用于审批
+  export default {
+    name: '',
+    components: {
+      deptSelect
+    },
+    props: {
+      businessId: {
+        default: ''
+      },
+      taskId: {
+        default: ''
+      },
+      id: {
+        default: ''
+      },
+      taskDefinitionKey: {
+        default: ''
+      }
+    },
+    data() {
+      return {
+        form: {
+          userId: '',
+          reason: '',
+          useDeptId: ''
+        },
+        userOptions: [],
+        isSaveLoading:false
+      };
+    },
+    created() {
+      this.userOptions = [];
+      listAllUserBind().then((data) => {
+        this.userOptions.push(...data);
+      });
+    },
+    methods: {
+      /** 处理转办审批人 */
+      handleUpdateAssignee() {
+        this.$emit('handleUpdateAssignee');
+      },
+      /** 退回 */
+      handleBackList() {
+        this.$emit('handleBackList');
+      },
+      searchDeptNodeClick(val) {
+        console.log(val, 'val');
+        getUserPage({
+          groupId: val,
+          size: 999
+        }).then((data) => {
+          this.userOptions = data.list;
+        });
+      },
+      async storeManagerApprove() {
+        let res = await this.getTableValue();
+        let storageData = res.returnStorageData;
+        if(!storageData){
+         return
+        }
+        storageData.isSkip = 1;
+        try {
+          this.isSaveLoading = true;
+          await storageApi.storage(storageData);
+          approveTaskWithVariables({
+            id: this.taskId,
+            reason: this.form.reason,
+            variables: {
+              pass: true
+            }
+          }).then((res) => {
+            if (res.code != '-1') {
+              this.$emit('handleAudit', {
+                status: 1,
+                title: '入库'
+              });
+            }
+            this.isSaveLoading = false;
+          });
+        } catch (error) {
+          this.isSaveLoading = false;
+          this.$message.error('保存失败');
+        }
+      },
+      async handleAudit(status) {
+        let userInfo = this.userOptions.find(
+          (item) => item.id == this.form.userId
+        );
+        //主管指派采购员
+        if (this.taskDefinitionKey === 'deptLeaderAssign') {
+          if (!this.form.userId) {
+            this.$message.warning(`请选择采购员!`);
+            return;
+          }
+          await assign({
+            userId: userInfo.id,
+            userName: userInfo.name,
+            id: this.taskId,
+            reason: this.form.reason,
+            businessId: this.businessId
+          });
+        }
+        // //采购员核对
+        // if (this.taskDefinitionKey === 'purchaserCheck') {
+        //   let arr = await this.getTableValue();
+        //   if (!arr) {
+        //     return;
+        //   }
+        //   await UpdateInformation(arr);
+        // }
+        let API = !!status ? approveTaskWithVariables : rejectTask;
+        API({
+          id: this.taskId,
+          reason: this.form.reason,
+          variables: {
+            userId: userInfo?.id,
+            pass: !!status
+          }
+        });
+        this.$emit('handleAudit', {
+          status,
+          title: status === 0 ? '驳回' : ''
+        });
+      },
+      rejectTask(status) {
+        rejectTask({
+          id: this.taskId,
+          reason: this.form.reason,
+          variables: {
+            pass: !!status
+          }
+        });
+        this.$emit('handleAudit', {
+          status,
+          title: status === 0 ? '驳回' : ''
+        });
+      },
+      getTableValue() {
+        return new Promise((resolve, reject) => {
+          this.$emit('getTableValue', async (data) => {
+            resolve(await data);
+          });
+        });
+      },
+      //更多
+      handleCommand(command) {
+        if (command === 'cancel') {
+          this.$confirm('是否确认作废?', {
+            type: 'warning',
+            cancelButtonText: '取消',
+            confirmButtonText: '确定'
+          })
+            .then(() => {
+              cancelTask({
+                id: this.id,
+                taskId: this.taskId,
+                reason: this.form.reason,
+                businessId: this.businessId
+              })
+                .then(() => {
+                  this.$emit('handleClose');
+                })
+                .catch(() => {
+                  this.$message.error('流程作废失败');
+                });
+            })
+            .catch(() => {});
+        }
+      }
+    }
+  };
+</script>
+
+<style lang="scss"></style>

+ 2 - 2
vue.config.js

@@ -42,8 +42,8 @@ module.exports = {
         // target: 'http://192.168.1.251:18186',
         // target: 'http://192.168.1.125:18086',
 
-        // target: 'http://192.168.1.251:18086',
-        target: 'http://192.168.1.116:18086', // 赵沙金
+        target: 'http://192.168.1.3:18086',
+        // target: 'http://192.168.1.116:18086', // 赵沙金
 
         changeOrigin: true, // 只有这个值为true的情况下 s才表示开启跨域
         pathRewrite: {