update 报工页面优化加首检、报工记录、添加质检记录页面

master
yinq 3 weeks ago
parent 2a4a8ea760
commit b4243dac46

@ -398,6 +398,9 @@ export interface QcInspectionMainQuery extends PageQuery {
* *
*/ */
params?: any; params?: any;
planDetailId?: number;
} }

@ -112,7 +112,7 @@
</el-button> </el-button>
<el-button <el-button
type='primary' type='primary'
:disabled='!currentWorkOrder' :disabled='!currentWorkOrder || hasPendingInspection'
@click='handleFirstInspection' @click='handleFirstInspection'
> >
首检 首检
@ -127,6 +127,8 @@ import { listPlanInfo, updatePlanInfo, stopPlanInfo, resumePlanInfo, reportPlanI
import { PlanInfoVO, PlanInfoQuery } from '@/api/mes/planInfo/types'; import { PlanInfoVO, PlanInfoQuery } from '@/api/mes/planInfo/types';
import { getProdProductPlanDetailList, listProductPlanDetail } from '@/api/mes/productPlanDetail'; import { getProdProductPlanDetailList, listProductPlanDetail } from '@/api/mes/productPlanDetail';
import { ProductPlanDetailQuery } from '@/api/mes/productPlanDetail/types'; import { ProductPlanDetailQuery } from '@/api/mes/productPlanDetail/types';
import { listQcInspectionMain } from '@/api/qms/QcInspectionMain';
import { QcInspectionMainQuery } from '@/api/qms/QcInspectionMain/types';
import { parseTime } from '@/utils/ruoyi'; import { parseTime } from '@/utils/ruoyi';
const { proxy } = getCurrentInstance() as any; const { proxy } = getCurrentInstance() as any;
@ -141,6 +143,7 @@ const emit = defineEmits<{
const loading = ref(false); const loading = ref(false);
const currentWorkOrder = ref<PlanInfoVO | null>(null); const currentWorkOrder = ref<PlanInfoVO | null>(null);
const hasPendingInspection = ref(false); //
const reportForm = ref({ const reportForm = ref({
reportQuantity: 0, reportQuantity: 0,
@ -166,6 +169,29 @@ const getStatusText = (status: string) => {
return statusMap[status] || '未知'; return statusMap[status] || '未知';
}; };
//
const checkInspectionTask = async (planCode: string, planDetailId: string | number) => {
try {
const query: QcInspectionMainQuery = {
pageNum: 1,
pageSize: 1,
inspectionType: 0, //
status: 0, //
planDetailId: planDetailId
};
const res = await listQcInspectionMain(query);
const inspectionList = res.rows || [];
//
//
hasPendingInspection.value = inspectionList.length > 0;
} catch (error) {
console.error('查询首检任务状态失败:', error);
hasPendingInspection.value = false;
}
};
// //
const getCurrentWorkOrder = async () => { const getCurrentWorkOrder = async () => {
loading.value = true; loading.value = true;
@ -184,12 +210,26 @@ const getCurrentWorkOrder = async () => {
const res = await listPlanInfo(query as PlanInfoQuery); const res = await listPlanInfo(query as PlanInfoQuery);
if (res.rows && res.rows.length > 0) { if (res.rows && res.rows.length > 0) {
currentWorkOrder.value = res.rows[0]; currentWorkOrder.value = res.rows[0];
//
const detailRes = await getProdProductPlanDetailList({ planId: currentWorkOrder.value.planId });
const detailList = detailRes.data || [];
if (detailList && detailList.length > 0) {
const firstDetail = detailList[detailList.length - 1];
//
await checkInspectionTask(currentWorkOrder.value.planCode, firstDetail.planDetailId);
} else {
hasPendingInspection.value = false;
}
} else { } else {
currentWorkOrder.value = null; currentWorkOrder.value = null;
hasPendingInspection.value = false;
} }
} catch (error) { } catch (error) {
console.error('获取当前工单失败:', error); console.error('获取当前工单失败:', error);
currentWorkOrder.value = null; currentWorkOrder.value = null;
hasPendingInspection.value = false;
} finally { } finally {
loading.value = false; loading.value = false;
} }
@ -319,9 +359,7 @@ const handleFirstInspection = async () => {
if (!currentWorkOrder.value) return; if (!currentWorkOrder.value) return;
try { try {
await proxy?.$modal.confirm('确认生成首检任务?'); //
loading.value = true;
const detailRes = await getProdProductPlanDetailList({ planId: currentWorkOrder.value.planId }); const detailRes = await getProdProductPlanDetailList({ planId: currentWorkOrder.value.planId });
const detailList = detailRes.data || []; const detailList = detailRes.data || [];
@ -330,9 +368,21 @@ const handleFirstInspection = async () => {
proxy?.$modal.msgWarning('本工单尚未生成生产信息,无法进行首检'); proxy?.$modal.msgWarning('本工单尚未生成生产信息,无法进行首检');
return; return;
} }
const firstDetail = detailList[detailList.length - 1]; const firstDetail = detailList[detailList.length - 1];
const planDetailId = firstDetail.planDetailId; const planDetailId = firstDetail.planDetailId;
//
await checkInspectionTask(currentWorkOrder.value.planCode, planDetailId);
if (hasPendingInspection.value) {
proxy?.$modal.msgWarning('已存在未处理的首检任务,无法重复生成');
return;
}
await proxy?.$modal.confirm('确认生成首检任务?');
loading.value = true;
// //
const inspectionData = { const inspectionData = {
planDetailId: planDetailId, planDetailId: planDetailId,
@ -342,9 +392,11 @@ const handleFirstInspection = async () => {
await generateInspectionTask(inspectionData); await generateInspectionTask(inspectionData);
proxy?.$modal.msgSuccess('首检任务生成成功'); proxy?.$modal.msgSuccess('首检任务生成成功');
//
await checkInspectionTask(currentWorkOrder.value.planCode, planDetailId);
} catch (error: any) { } catch (error: any) {
if (error !== 'cancel') { if (error !== 'cancel') {
proxy?.$modal.msgError('首检任务生成失败');
console.error('首检任务生成失败:', error); console.error('首检任务生成失败:', error);
} }
} finally { } finally {

@ -0,0 +1,144 @@
<template>
<div class='inspection-record'>
<el-card shadow='never'>
<template #header>
<div class='card-header'>
<span>质检记录</span>
<el-button type='primary' icon='Refresh' @click='getList'>刷新</el-button>
</div>
</template>
<el-table
v-loading='loading'
:data='recordList'
border
stripe
style='width: 100%'
>
<el-table-column label='序号' align='center' type='index' width='55' />
<el-table-column label='检测单号' align='center' prop='inspectionNo' />
<el-table-column label='模板名称' align='center' prop='templateName' />
<el-table-column label='物料编码' align='center' prop='materialCode' />
<el-table-column label='物料名称' align='center' prop='materialName' show-overflow-tooltip />
<el-table-column label='工序名称' align='center' prop='processName' />
<el-table-column label='工位名称' align='center' prop='stationName' />
<el-table-column label='质检数量' align='center' prop='inspectionQty' />
<el-table-column label='合格数' align='center' prop='qualifiedQty' />
<el-table-column label='不合格数' align='center' prop='unqualifiedQty' />
<el-table-column label='质检结果' align='center' prop='result'>
<template #default='scope'>
<dict-tag :options='qc_result' :value='scope.row.result' />
</template>
</el-table-column>
<el-table-column label='车间' align='center' prop='workshop' />
<el-table-column label='检测类别' align='center' prop='typeName' />
<el-table-column label='单据状态' align='center' prop='status'>
<template #default='scope'>
<dict-tag :options='qc_status' :value='scope.row.status' />
</template>
</el-table-column>
<el-table-column label='检测人员' align='center' prop='inspector' />
<el-table-column label='班次' align='center' prop='shift' />
<el-table-column label='班组' align='center' prop='team' />
<el-table-column label='检验时间' align='center' prop='inspectionStartTime' width='180'>
<template #default='scope'>
<span>{{ parseTime(scope.row.inspectionStartTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label='检验结束时间' align='center' prop='inspectionEndTime' width='180'>
<template #default='scope'>
<span>{{ parseTime(scope.row.inspectionEndTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label='业务来源单号' align='center' prop='productionOrder' />
<el-table-column label='批次号' align='center' prop='batchNo' />
<el-table-column label='条码号' align='center' prop='barcode' />
<el-table-column label='供应商名称' align='center' prop='supplierName' />
<el-table-column label='备注' align='center' prop='remark' show-overflow-tooltip />
</el-table>
<pagination
v-show='total > 0'
:total='total'
v-model:page='queryParams.pageNum'
v-model:limit='queryParams.pageSize'
@pagination='getList'
/>
</el-card>
</div>
</template>
<script setup name='InspectionRecord' lang='ts'>
import { ref, onMounted, getCurrentInstance, toRefs } from 'vue';
import { listQcInspectionMain } from '@/api/qms/QcInspectionMain';
import { QcInspectionMainVO, QcInspectionMainQuery } from '@/api/qms/QcInspectionMain/types';
import { parseTime } from '@/utils/ruoyi';
const { proxy } = getCurrentInstance() as any;
const { qc_result, qc_status } = toRefs<any>(proxy?.useDict('qc_result', 'qc_status'));
const props = defineProps<{
workstationId?: string | number;
workstation?: string;
}>();
const loading = ref(false);
const recordList = ref<QcInspectionMainVO[]>([]);
const total = ref(0);
const queryParams = ref<QcInspectionMainQuery>({
pageNum: 1,
pageSize: 10
});
//
const getList = async () => {
loading.value = true;
try {
const query: QcInspectionMainQuery = {
...queryParams.value
};
//
if (props.workstation) {
query.stationName = props.workstation;
}
const res = await listQcInspectionMain(query);
recordList.value = res.rows || [];
total.value = res.total || 0;
} catch (error) {
console.error('获取质检记录失败:', error);
recordList.value = [];
total.value = 0;
} finally {
loading.value = false;
}
};
//
const refresh = () => {
getList();
};
defineExpose({
refresh
});
onMounted(() => {
getList();
});
</script>
<style scoped lang='scss'>
.inspection-record {
width: 100%;
height: 100%;
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
}
</style>

@ -14,12 +14,13 @@
<el-table-column label='产品名称' prop='materialName' width='200' align='center' show-overflow-tooltip /> <el-table-column label='产品名称' prop='materialName' width='200' align='center' show-overflow-tooltip />
<el-table-column label='工序名称' prop='processName' width='150' align='center' /> <el-table-column label='工序名称' prop='processName' width='150' align='center' />
<el-table-column label='计划数量' prop='planAmount' width='100' align='center' /> <el-table-column label='计划数量' prop='planAmount' width='100' align='center' />
<el-table-column label='已报工数量' prop='completeAmount' width='100' align='center' />
<el-table-column label='排产日期' prop='planBeginTime' width='150' align='center'> <el-table-column label='排产日期' prop='planBeginTime' width='150' align='center'>
<template #default='scope'> <template #default='scope'>
<span>{{ parseTime(scope.row.planBeginTime, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.planBeginTime, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label='计划状态' prop='planStatus' width='100' align='center'> <el-table-column label='工单状态' prop='planStatus' width='100' align='center'>
<template #default='scope'> <template #default='scope'>
<dict-tag :options='mes_plan_status' :value='scope.row.planStatus' /> <dict-tag :options='mes_plan_status' :value='scope.row.planStatus' />
</template> </template>

@ -18,7 +18,7 @@
<el-table-column label='工单号' prop='planCode' width='150' align='center' /> <el-table-column label='工单号' prop='planCode' width='150' align='center' />
<el-table-column label='产品名称' prop='materialName' width='200' align='center' show-overflow-tooltip /> <el-table-column label='产品名称' prop='materialName' width='200' align='center' show-overflow-tooltip />
<el-table-column label='工序名称' prop='processName' width='150' align='center' /> <el-table-column label='工序名称' prop='processName' width='150' align='center' />
<el-table-column label='工位' prop='workstation' width='120' align='center' /> <el-table-column label='工位' prop='stationName' width='120' align='center' />
<el-table-column label='报工数量' prop='reportQuantity' width='100' align='center' /> <el-table-column label='报工数量' prop='reportQuantity' width='100' align='center' />
<el-table-column label='不良数量' prop='remainingAmount' width='100' align='center' /> <el-table-column label='不良数量' prop='remainingAmount' width='100' align='center' />
<el-table-column label='报工时间' prop='reportTime' width='180' align='center'> <el-table-column label='报工时间' prop='reportTime' width='180' align='center'>
@ -50,7 +50,7 @@ import { PlanInfoQuery } from '@/api/mes/planInfo/types';
import { parseTime } from '@/utils/ruoyi'; import { parseTime } from '@/utils/ruoyi';
const props = defineProps<{ const props = defineProps<{
workstationId?: string | number; workstationId?: number;
}>(); }>();
const loading = ref(false); const loading = ref(false);
@ -59,7 +59,8 @@ const total = ref(0);
const queryParams = ref<ProductPlanDetailQuery>({ const queryParams = ref<ProductPlanDetailQuery>({
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10,
stationId: props.workstationId
}); });
// //
@ -83,9 +84,9 @@ const getList = async () => {
processName: (item as any).processName || '-', processName: (item as any).processName || '-',
reportQuantity: item.completeAmount || 0, reportQuantity: item.completeAmount || 0,
remainingAmount: (item as any).remainingAmount || 0, remainingAmount: (item as any).remainingAmount || 0,
reportTime: item.realBeginTime || item.realEndTime || '', reportTime: item.realBeginTime,
reportUser: item.userName || '-', reportUser: item.reportUser ,
workstation: (item as any).workstationName || '-', stationName: (item as any).stationName || '-',
remark: item.remark || '-' remark: item.remark || '-'
})); }));

@ -17,19 +17,14 @@
:disabled='activeTab !== "pending"' :disabled='activeTab !== "pending"'
filterable filterable
clearable clearable
:filter-method='filterWorkstation'
@change='handleWorkstationChange' @change='handleWorkstationChange'
> >
<el-option <el-option
v-for='item in filteredWorkstationList' v-for='item in filteredWorkstationList'
:key='item.stationId' :key='item.stationId'
:label='item.stationName || item.stationCode' :label='item.stationName'
:value='item.stationId' :value='item.stationId'
> >
<span>{{ item.stationName || item.stationCode }}</span>
<span v-if='item.stationCode && item.stationName' style='font-size: 13px; margin-left: 8px;'>
({{ item.stationCode }})
</span>
</el-option> </el-option>
</el-select> </el-select>
</span> </span>
@ -52,6 +47,7 @@
<el-tab-pane label='待处理任务' name='pending' /> <el-tab-pane label='待处理任务' name='pending' />
<el-tab-pane label='当前任务' name='current' /> <el-tab-pane label='当前任务' name='current' />
<el-tab-pane label='报工记录' name='record' /> <el-tab-pane label='报工记录' name='record' />
<el-tab-pane label='质检记录' name='inspection' />
<el-tab-pane label='工艺文件查看' name='document' /> <el-tab-pane label='工艺文件查看' name='document' />
</el-tabs> </el-tabs>
</div> </div>
@ -67,6 +63,9 @@
<div v-show='activeTab === "record"' class='tab-content'> <div v-show='activeTab === "record"' class='tab-content'>
<WorkReportRecord ref='recordRef' :workstationId='workstationId' /> <WorkReportRecord ref='recordRef' :workstationId='workstationId' />
</div> </div>
<div v-show='activeTab === "inspection"' class='tab-content'>
<InspectionRecord ref='inspectionRef' :workstation='workstation' />
</div>
<div v-show='activeTab === "document"' class='tab-content'> <div v-show='activeTab === "document"' class='tab-content'>
<ProcessDocuments ref='documentRef' :workstationId='workstationId' /> <ProcessDocuments ref='documentRef' :workstationId='workstationId' />
</div> </div>
@ -91,6 +90,7 @@ import { ArrowLeft, Menu } from '@element-plus/icons-vue';
import PendingTasks from './components/PendingTasks.vue'; import PendingTasks from './components/PendingTasks.vue';
import CurrentTask from './components/CurrentTask.vue'; import CurrentTask from './components/CurrentTask.vue';
import WorkReportRecord from './components/WorkReportRecord.vue'; import WorkReportRecord from './components/WorkReportRecord.vue';
import InspectionRecord from './components/InspectionRecord.vue';
import ProcessDocuments from './components/ProcessDocuments.vue'; import ProcessDocuments from './components/ProcessDocuments.vue';
import { parseTime } from '@/utils/ruoyi'; import { parseTime } from '@/utils/ruoyi';
import useUserStore from '@/store/modules/user'; import useUserStore from '@/store/modules/user';
@ -107,11 +107,12 @@ const activeTab = ref('pending');
const pendingTasksRef = ref(); const pendingTasksRef = ref();
const currentTaskRef = ref(); const currentTaskRef = ref();
const recordRef = ref(); const recordRef = ref();
const inspectionRef = ref();
const documentRef = ref(); const documentRef = ref();
// //
const productionLine = ref('DJ01'); const productionLine = ref('DJ01');
const workstation = ref('DJ01-01'); // const workstation = ref(''); //
const workstationId = ref<string | number>(''); // ID const workstationId = ref<string | number>(''); // ID
const currentShift = ref('白班'); const currentShift = ref('白班');
const workstationList = ref<BaseStationInfoVO[]>([]); const workstationList = ref<BaseStationInfoVO[]>([]);
@ -146,6 +147,9 @@ const handleTabChange = (tabName: string) => {
} else if (tabName === 'record') { } else if (tabName === 'record') {
// //
recordRef.value?.refresh?.(); recordRef.value?.refresh?.();
} else if (tabName === 'inspection') {
//
inspectionRef.value?.refresh?.();
} }
}; };
@ -159,13 +163,13 @@ const getWorkstationList = async () => {
filteredWorkstationList.value = data; filteredWorkstationList.value = data;
// //
if (data.length > 0) { if (data.length > 0) {
const foundWorkstation = data.find(item => item.stationCode === workstation.value); const foundWorkstation = data.find(item => item.stationName === workstation.value);
if (foundWorkstation) { if (foundWorkstation) {
// IDwatch // IDwatch
workstationId.value = foundWorkstation.stationId; workstationId.value = foundWorkstation.stationId;
} else { } else {
// watch // watch
workstation.value = data[0].stationCode; workstation.value = data[0].stationName;
workstationId.value = data[0].stationId; workstationId.value = data[0].stationId;
} }
} }
@ -175,21 +179,6 @@ const getWorkstationList = async () => {
} }
}; };
//
const filterWorkstation = (query: string) => {
workstationSearchText.value = query;
if (!query) {
filteredWorkstationList.value = workstationList.value;
return;
}
const lowerQuery = query.toLowerCase();
filteredWorkstationList.value = workstationList.value.filter(item => {
const stationName = (item.stationName || '').toLowerCase();
const stationCode = (item.stationCode || '').toLowerCase();
return stationName.includes(lowerQuery) || stationCode.includes(lowerQuery);
});
};
// //
const refreshAllData = () => { const refreshAllData = () => {
// //
@ -198,6 +187,8 @@ const refreshAllData = () => {
currentTaskRef.value?.refresh?.(); currentTaskRef.value?.refresh?.();
// //
recordRef.value?.refresh?.(); recordRef.value?.refresh?.();
//
inspectionRef.value?.refresh?.();
// //
documentRef.value?.refresh?.(); documentRef.value?.refresh?.();
}; };
@ -207,7 +198,7 @@ const handleWorkstationChange = (stationId: string | number) => {
// ID // ID
const selectedWorkstation = workstationList.value.find(item => item.stationId === stationId); const selectedWorkstation = workstationList.value.find(item => item.stationId === stationId);
if (selectedWorkstation) { if (selectedWorkstation) {
workstation.value = selectedWorkstation.stationCode; workstation.value = selectedWorkstation.stationName;
} }
// IDwatch // IDwatch
workstationId.value = stationId; workstationId.value = stationId;

Loading…
Cancel
Save