|
@@ -0,0 +1,437 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <div style="margin-top: 10px; padding: 0 20px">
|
|
|
|
|
+ <el-form
|
|
|
|
|
+ ref="formRef"
|
|
|
|
|
+ :model="form"
|
|
|
|
|
+ :rules="rules"
|
|
|
|
|
+ label-width="100px"
|
|
|
|
|
+ disabled
|
|
|
|
|
+ >
|
|
|
|
|
+ <header-title title="基本信息"></header-title>
|
|
|
|
|
+
|
|
|
|
|
+ <el-row :gutter="10">
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <el-form-item label="放行单编码">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="form.code"
|
|
|
|
|
+ placeholder="系统自动生成"
|
|
|
|
|
+ disabled
|
|
|
|
|
+ ></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <el-form-item label="放行单名称" prop="name">
|
|
|
|
|
+ <el-input v-model="form.name" placeholder="请输入"></el-input>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+
|
|
|
|
|
+ <header-title title="物品清单"> </header-title>
|
|
|
|
|
+
|
|
|
|
|
+ <ele-pro-table
|
|
|
|
|
+ ref="table"
|
|
|
|
|
+ row-key="userId"
|
|
|
|
|
+ :columns="ordersColumns"
|
|
|
|
|
+ :datasource="form.orders"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template v-slot:action="{ row }">
|
|
|
|
|
+ <el-link icon="el-icon-edit" type="primary" :underline="false"
|
|
|
|
|
+ >详情</el-link
|
|
|
|
|
+ >
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </ele-pro-table>
|
|
|
|
|
+
|
|
|
|
|
+ <header-title title="生产放行规则"> </header-title>
|
|
|
|
|
+
|
|
|
|
|
+ <ele-pro-table
|
|
|
|
|
+ ref="scTable"
|
|
|
|
|
+ row-key="id"
|
|
|
|
|
+ :columns="detailsColumns"
|
|
|
|
|
+ :datasource="scDetails"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template v-slot:isPass="{ row }">
|
|
|
|
|
+ <el-radio-group v-model="row.isPass">
|
|
|
|
|
+ <el-radio :label="1">是</el-radio>
|
|
|
|
|
+ <el-radio :label="2">否</el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-slot:remark="{ row }">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ type="textarea"
|
|
|
|
|
+ v-model="row.remark"
|
|
|
|
|
+ placeholder="请输入备注"
|
|
|
|
|
+ :rows="1"
|
|
|
|
|
+ ></el-input>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </ele-pro-table>
|
|
|
|
|
+
|
|
|
|
|
+ <table
|
|
|
|
|
+ class="detail-table"
|
|
|
|
|
+ key="first-table"
|
|
|
|
|
+ style="width: 500px; margin: 15px 0"
|
|
|
|
|
+ >
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>结论</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <el-radio-group v-model="form.workConclution">
|
|
|
|
|
+ <el-radio :label="0">不符合规定</el-radio>
|
|
|
|
|
+ <el-radio :label="1">符合规定</el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>验收人</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <div class="mask-box">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="form.workCheckUserName"
|
|
|
|
|
+ placeholder="请输选择验收人"
|
|
|
|
|
+ readonly
|
|
|
|
|
+ ></el-input>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>验收时间</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <el-date-picker
|
|
|
|
|
+ v-model="form.workCheckTime"
|
|
|
|
|
+ type="datetime"
|
|
|
|
|
+ placeholder="选择日期时间"
|
|
|
|
|
+ style="width: 100%"
|
|
|
|
|
+ value-format="yyyy-MM-dd HH:mm:ss"
|
|
|
|
|
+ ></el-date-picker>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </table>
|
|
|
|
|
+
|
|
|
|
|
+ <header-title title="质检放行规则"></header-title>
|
|
|
|
|
+
|
|
|
|
|
+ <ele-pro-table
|
|
|
|
|
+ ref="zjTable"
|
|
|
|
|
+ row-key="id"
|
|
|
|
|
+ :columns="detailsColumns"
|
|
|
|
|
+ :datasource="zjDetails"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template v-slot:isPass="{ row }">
|
|
|
|
|
+ <el-radio-group v-model="row.isPass">
|
|
|
|
|
+ <el-radio :label="1">是</el-radio>
|
|
|
|
|
+ <el-radio :label="2">否</el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-slot:remark="{ row }">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ type="textarea"
|
|
|
|
|
+ v-model="row.remark"
|
|
|
|
|
+ placeholder="请输入备注"
|
|
|
|
|
+ :rows="1"
|
|
|
|
|
+ ></el-input>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </ele-pro-table>
|
|
|
|
|
+
|
|
|
|
|
+ <table
|
|
|
|
|
+ class="detail-table"
|
|
|
|
|
+ key="tow"
|
|
|
|
|
+ style="width: 500px; margin: 15px 0"
|
|
|
|
|
+ >
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>结论</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <el-radio-group v-model="form.qualityConclution">
|
|
|
|
|
+ <el-radio :label="0">不符合规定</el-radio>
|
|
|
|
|
+ <el-radio :label="1">符合规定</el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>验收人</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <div class="mask-box" @click="openSelectUser(1)">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="form.qualityCheckUserName"
|
|
|
|
|
+ placeholder="请输选择验收人"
|
|
|
|
|
+ readonly
|
|
|
|
|
+ ></el-input>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>验收时间</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <el-date-picker
|
|
|
|
|
+ v-model="form.qualityCheckTime"
|
|
|
|
|
+ type="datetime"
|
|
|
|
|
+ placeholder="选择日期时间"
|
|
|
|
|
+ style="width: 100%"
|
|
|
|
|
+ value-format="yyyy-MM-dd HH:mm:ss"
|
|
|
|
|
+ ></el-date-picker>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </table>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script>
|
|
|
|
|
+ import dictMixins from '@/mixins/dictMixins';
|
|
|
|
|
+ import { checklisttemplateGetById } from '@/api/checklisttemplate/index';
|
|
|
|
|
+ import { checklistrecordGetById } from '@/api/checklistrecord/index';
|
|
|
|
|
+
|
|
|
|
|
+ export default {
|
|
|
|
|
+ mixins: [dictMixins],
|
|
|
|
|
+ components: {},
|
|
|
|
|
+ props: {
|
|
|
|
|
+ // 业务id
|
|
|
|
|
+ businessId: {
|
|
|
|
|
+ default: ''
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ mounted() {
|
|
|
|
|
+ console.log('this.businessId', this.businessId);
|
|
|
|
|
+ this.getCheckDetails(this.businessId);
|
|
|
|
|
+ },
|
|
|
|
|
+ data() {
|
|
|
|
|
+ const formBaseData = {
|
|
|
|
|
+ id: null,
|
|
|
|
|
+ approvalStatus: null,
|
|
|
|
|
+ checklistType: 0,
|
|
|
|
|
+ code: '',
|
|
|
|
|
+ createUserName: '',
|
|
|
|
|
+ details: [],
|
|
|
|
|
+ name: '',
|
|
|
|
|
+ orders: [],
|
|
|
|
|
+ processInstanceId: '',
|
|
|
|
|
+ qualityCheckTime: '',
|
|
|
|
|
+ qualityCheckUserId: null,
|
|
|
|
|
+ qualityCheckUserName: '',
|
|
|
|
|
+ qualityConclution: null,
|
|
|
|
|
+ templateId: 0,
|
|
|
|
|
+ templateName: '',
|
|
|
|
|
+ workCheckTime: '',
|
|
|
|
|
+ workCheckUserId: null,
|
|
|
|
|
+ workCheckUserName: '',
|
|
|
|
|
+ workConclution: null
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ return {
|
|
|
|
|
+ visible: false,
|
|
|
|
|
+ title: '放行申请单',
|
|
|
|
|
+ formBaseData,
|
|
|
|
|
+ form: JSON.parse(JSON.stringify(formBaseData)),
|
|
|
|
|
+ rules: {
|
|
|
|
|
+ name: [
|
|
|
|
|
+ { required: true, message: '请输入放行单名称', trigger: 'blur' },
|
|
|
|
|
+ { required: true, message: '请输入放行单名称', trigger: 'change' }
|
|
|
|
|
+ ]
|
|
|
|
|
+ },
|
|
|
|
|
+ // 类型 add / edit / detail
|
|
|
|
|
+ type: '',
|
|
|
|
|
+ // 生产工单查询条件
|
|
|
|
|
+ workOrderWhere: {
|
|
|
|
|
+ statusList: ['6']
|
|
|
|
|
+ },
|
|
|
|
|
+ loading: false,
|
|
|
|
|
+ butLoading: false,
|
|
|
|
|
+ tabOptions: [
|
|
|
|
|
+ { key: 'main', name: '放行单详情' },
|
|
|
|
|
+ { key: 'bpm', name: '流程详情' }
|
|
|
|
|
+ ],
|
|
|
|
|
+ // 当前选项
|
|
|
|
|
+ activeComp: 'main',
|
|
|
|
|
+ showSelectUser: false,
|
|
|
|
|
+ // 0 生产验收人 1 质检验收人
|
|
|
|
|
+ selectUserType: 0
|
|
|
|
|
+ };
|
|
|
|
|
+ },
|
|
|
|
|
+ watch: {
|
|
|
|
|
+ 'form.details': {
|
|
|
|
|
+ handler(details) {
|
|
|
|
|
+ console.log('details', details);
|
|
|
|
|
+ // 区分生产放行规则 质检放行规则
|
|
|
|
|
+ // 根据 审核结果修改 结论
|
|
|
|
|
+ const scDetails = details.filter((item) => item.checkType == 1);
|
|
|
|
|
+ const zjDetails = details.filter((item) => item.checkType == 2);
|
|
|
|
|
+
|
|
|
|
|
+ // 当workConclution全为1 则为1 否则为0
|
|
|
|
|
+ if (scDetails.length > 0) {
|
|
|
|
|
+ const allPass = scDetails
|
|
|
|
|
+ .map((item) => item.isPass)
|
|
|
|
|
+ .every((val) => val === 1);
|
|
|
|
|
+ this.form.workConclution = allPass ? 1 : 0;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.form.workConclution = null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (zjDetails.length > 0) {
|
|
|
|
|
+ const allPass = zjDetails
|
|
|
|
|
+ .map((item) => item.isPass)
|
|
|
|
|
+ .every((val) => val == 1);
|
|
|
|
|
+ this.form.qualityConclution = allPass ? 1 : 0;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.form.qualityConclution = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ deep: true
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ computed: {
|
|
|
|
|
+ ordersColumns() {
|
|
|
|
|
+ return [
|
|
|
|
|
+ {
|
|
|
|
|
+ width: 55,
|
|
|
|
|
+ type: 'index',
|
|
|
|
|
+ columnKey: 'index',
|
|
|
|
|
+ label: '序号',
|
|
|
|
|
+ align: 'center'
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'batchNo',
|
|
|
|
|
+ label: '批次号',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'productCode',
|
|
|
|
|
+ label: '产品编码',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'productName',
|
|
|
|
|
+ label: '产品名称',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'workOrderCode',
|
|
|
|
|
+ label: '生产工单号',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'formingNum',
|
|
|
|
|
+ label: '数量',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'specification',
|
|
|
|
|
+ label: '规格',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'productModel',
|
|
|
|
|
+ label: '型号',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '操作',
|
|
|
|
|
+ columnKey: 'action',
|
|
|
|
|
+ slot: 'action',
|
|
|
|
|
+ minWidth: 120
|
|
|
|
|
+ }
|
|
|
|
|
+ ];
|
|
|
|
|
+ },
|
|
|
|
|
+ // 生产放行规则
|
|
|
|
|
+ scDetails() {
|
|
|
|
|
+ return this.form.details.filter((item) => item.checkType == 1);
|
|
|
|
|
+ },
|
|
|
|
|
+ // 质检放行规则
|
|
|
|
|
+ zjDetails() {
|
|
|
|
|
+ return this.form.details.filter((item) => item.checkType == 2);
|
|
|
|
|
+ },
|
|
|
|
|
+ detailsColumns() {
|
|
|
|
|
+ return [
|
|
|
|
|
+ {
|
|
|
|
|
+ width: 55,
|
|
|
|
|
+ type: 'index',
|
|
|
|
|
+ columnKey: 'index',
|
|
|
|
|
+ label: '序号',
|
|
|
|
|
+ align: 'center'
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'mainIndicatorName',
|
|
|
|
|
+ label: '指标名称',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'isPass',
|
|
|
|
|
+ label: '审核结果',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ slot: 'isPass',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ prop: 'remark',
|
|
|
|
|
+ label: '备注',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ slot: 'remark',
|
|
|
|
|
+ minWidth: 110,
|
|
|
|
|
+ showOverflowTooltip: true
|
|
|
|
|
+ }
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ methods: {
|
|
|
|
|
+ // 获取放行单详情
|
|
|
|
|
+ async getCheckDetails(id) {
|
|
|
|
|
+ this.loading = true;
|
|
|
|
|
+ try {
|
|
|
|
|
+ const data = await checklistrecordGetById(id);
|
|
|
|
|
+ this.$util.assignObject(this.form, data);
|
|
|
|
|
+ console.log('this.form', this.form);
|
|
|
|
|
+ this.loading = false;
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ this.loading = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style scoped lang="scss">
|
|
|
|
|
+ .detail-table {
|
|
|
|
|
+ border: 1px solid #ebeef5;
|
|
|
|
|
+ // 实线边框
|
|
|
|
|
+ border-collapse: collapse;
|
|
|
|
|
+
|
|
|
|
|
+ td {
|
|
|
|
|
+ border: none;
|
|
|
|
|
+ padding: 10px 15px;
|
|
|
|
|
+ border: 1px solid #ebeef5;
|
|
|
|
|
+
|
|
|
|
|
+ &:first-child {
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ background: #f5f7fa;
|
|
|
|
|
+ width: 130px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .mask-box {
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ &::after {
|
|
|
|
|
+ content: '';
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ background: rgba(0, 0, 0, 0);
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+</style>
|