You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

315 lines
12 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="p-2">
<el-card shadow="never" class="mb-[10px]">
<div style="display: flex; justify-content: space-between">
<div>
<el-button type="primary" @click="handleApprovalRecord"></el-button>
<el-button type="success" :loading="approvalButtonLoading" @click="handleApprove"></el-button>
<el-button type="danger" :loading="rejectButtonLoading" @click="handleReject"></el-button>
</div>
<div>
<el-button @click="goBack()"></el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mb-[10px]">
<h4>不合格品主表信息</h4>
<el-form :model="approvalForm" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="不合格检测单号">
<el-input v-model="approvalForm.unqualifiedReviewNo" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="质检单号">
<el-input v-model="approvalForm.inspectionNo" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="检测类型">
<el-input v-model="approvalForm.typeName" readonly />
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item label="生产日期">
<el-input :value="parseTime(approvalForm.productionDate, '{y}-{m}-{d}')" readonly />
</el-form-item>
</el-col> -->
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="派工单号">
<el-input v-model="approvalForm.workOrderNo" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工序名称">
<el-input v-model="approvalForm.processName" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="物料名称">
<el-input v-model="approvalForm.materialName" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物料编码">
<el-input v-model="approvalForm.materialCode" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<!-- <el-col :span="12">
<el-form-item label="物料规格">
<el-input v-model="approvalForm.materialSpec" readonly />
</el-form-item>
</el-col> -->
<el-col :span="12">
<el-form-item label="供应商名称">
<el-input v-model="approvalForm.supplierName" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="供应商编码">
<el-input v-model="approvalForm.supplierCode" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="质检数量">
<el-input v-model="approvalForm.inspectionQty" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="批次号">
<el-input v-model="approvalForm.batchNo" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="质检人">
<el-input v-model="approvalForm.inspector" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<!-- <el-col :span="12">
<el-form-item label="评审人">
<el-input v-model="approvalForm.reviewer" readonly />
</el-form-item>
</el-col> -->
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="评审开始时间">
<el-input :value="parseTime(approvalForm.reviewStartTime, '{y}-{m}-{d} {h}:{i}:{s}')" readonly />
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item label="评审结束时间">
<el-input :value="parseTime(approvalForm.reviewEndTime, '{y}-{m}-{d} {h}:{i}:{s}')" readonly />
</el-form-item>
</el-col> -->
</el-row>
<el-form-item label="处置类型">
<el-tag v-if="approvalForm.reviewResult" :type="getDispositionTypeTag(approvalForm.reviewResult) as any">
{{ getDispositionTypeName(approvalForm.reviewResult) }}
</el-tag>
<span v-else>待评审</span>
</el-form-item>
<!-- <el-form-item label="备注">
<el-input v-model="approvalForm.remark" type="textarea" :rows="3" readonly />
</el-form-item> -->
<!-- <el-form-item label="审批意见" prop="comment">
<el-input
v-model="approvalForm.comment"
type="textarea"
:rows="4"
placeholder="请输入审批意见"
:maxlength="500"
show-word-limit
/>
</el-form-item> -->
</el-form>
</el-card>
<el-card shadow="never" class="mt-4">
<h4>不合格品子表明细</h4>
<el-table v-loading="detailLoading" :data="detailRecordList" border>
<el-table-column type="index" label="序号" width="55" align="center"/>
<el-table-column label="检测项编码" align="center" prop="itemCode" />
<el-table-column label="检测名称" align="center" prop="itemName" />
<el-table-column label="检测位置" align="center" prop="inspectionPosition" />
<el-table-column label="检测方法" align="center" prop="inspectionMethod">
<template #default="scope">
<dict-tag v-if="scope.row.inspectionMethod != null" :options="qc_methond" :value="scope.row.inspectionMethod" />
</template>
</el-table-column>
<el-table-column label="检测方式" align="center" prop="detectType">
<template #default="scope">
<dict-tag v-if="scope.row.detectType != null" :options="detect_type" :value="scope.row.detectType" />
</template>
</el-table-column>
<el-table-column label="检测结果" align="center" prop="detectResult">
<template #default="scope">
<dict-tag v-if="scope.row.detectResult != null" :options="qc_result" :value="scope.row.detectResult"/>
</template>
</el-table-column>
<el-table-column label="检测值" align="center" prop="detectValue" />
<el-table-column label="控制上限" align="center" prop="upperLimit" />
<el-table-column label="控制下限" align="center" prop="lowerLimit" />
<el-table-column label="规格检测值" align="center" prop="specInspectionValue" />
<el-table-column label="规格上限" align="center" prop="specUpper" />
<el-table-column label="规格下限" align="center" prop="specLower" />
<el-table-column label="检查项说明" align="center" prop="description" :show-overflow-tooltip="true"/>
</el-table>
<pagination v-show="detailTotal > 0" :total="detailTotal" v-model:page="detailQueryParams.pageNum" v-model:limit="detailQueryParams.pageSize" @pagination="getDetailList" />
</el-card>
<!-- 审批记录组件 -->
<approvalRecord ref="approvalRecordRef" />
</div>
</template>
<script setup name="QcUnqualifiedApproval" lang="ts">
import { ref, reactive, onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { getQcUnqualifiedReview, completeTask } from '@/api/qms/qcUnqualifiedReview';
import { listQcUnqualifiedRecord } from '@/api/qms/qcUnqualifiedRecord';
import { QcUnqualifiedReviewVO } from '@/api/qms/qcUnqualifiedReview/types';
import { QcUnqualifiedRecordVO, QcUnqualifiedRecordQuery } from '@/api/qms/qcUnqualifiedRecord/types';
import { parseTime } from '@/utils/ruoyi';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import { getCurrentInstance, toRefs } from 'vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { review_result, qc_methond, detect_type, qc_result } = toRefs<any>(proxy?.useDict('review_result', 'qc_methond', 'detect_type', 'qc_result'));
const router = useRouter();
const route = useRoute();
const approvalForm = ref<QcUnqualifiedReviewVO>({} as QcUnqualifiedReviewVO);
const detailRecordList = ref<QcUnqualifiedRecordVO[]>([]);
const detailLoading = ref(false);
const detailTotal = ref(0);
const approvalButtonLoading = ref(false);
const rejectButtonLoading = ref(false);
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const detailQueryParams = ref<QcUnqualifiedRecordQuery>({
pageNum: 1,
pageSize: 10,
reviewId: undefined
});
// 加载数据
const loadData = async () => {
const businessId = route.query.id as string;
const taskId = route.query.taskId as string;
if (!businessId || !taskId) {
proxy?.$modal.msgError('缺少参数');
return;
}
try {
const res = await getQcUnqualifiedReview(businessId);
approvalForm.value = { ...res.data, taskId, comment: '' };
detailQueryParams.value.reviewId = businessId;
await getDetailList();
} catch (error) {
proxy?.$modal.msgError('加载数据失败');
}
};
const getDetailList = async () => {
detailLoading.value = true;
try {
const res = await listQcUnqualifiedRecord(detailQueryParams.value);
detailRecordList.value = res.rows;
detailTotal.value = res.total;
} catch (error) {
proxy?.$modal.msgError('加载子表明细失败');
} finally {
detailLoading.value = false;
}
};
/** 审批通过 */
const handleApprove = async () => {
approvalButtonLoading.value = true;
try {
const reviewIdValue = approvalForm.value.reviewId;
await completeTask({
reviewId: reviewIdValue
});
proxy?.$modal.msgSuccess('审批通过');
goBack();
} catch (error) {
proxy?.$modal.msgError('审批失败');
} finally {
approvalButtonLoading.value = false;
}
};
/** 审批不通过 */
const handleReject = async () => {
try {
await proxy?.$modal.confirm('确认要驳回此审批吗?');
} catch {
return; // 用户取消
}
rejectButtonLoading.value = true;
try {
const reviewIdValue = approvalForm.value.reviewId;
// TODO: 调用驳回接口,需要后端提供 rejectTask 接口
// await rejectTask({ reviewId: reviewIdValue });
proxy?.$modal.msgWarning('驳回功能待后端实现 rejectTask 接口');
// goBack();
} catch (error) {
proxy?.$modal.msgError('驳回失败');
} finally {
rejectButtonLoading.value = false;
}
};
/** 查看流程记录 */
const handleApprovalRecord = () => {
approvalRecordRef.value?.init(approvalForm.value.reviewId);
};
const getDispositionTypeName = (value: string | undefined) => {
return review_result.value.find(item => item.value === value)?.label || '未知';
};
const getDispositionTypeTag = (value: string | undefined): string | undefined => {
// 自定义tag样式el-tag 的 type 只接受 primary/success/info/warning/danger 或 undefined
const tagMap: Record<string, string> = {
'0': 'danger',
'1': 'warning',
'2': 'info',
'3': 'success',
'4': 'primary'
};
return value ? tagMap[value] : undefined;
};
const goBack = () => {
router.go(-1);
};
onMounted(() => {
loadData();
});
</script>