change(api): 完善浦林成山最新数据查询接口

- 修复设备管理新增按钮点击事件绑定错误
- 移除入库单条码配置对话框及相关逻辑
- 新增设备管理报表相关API接口
- 在审批页面添加驳回按钮及相关逻辑
-重构故障工单处理页面为只读模式
master
zangch@mesnac.com 1 month ago
parent 954540adc7
commit be82fca30c

@ -2,6 +2,7 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { FaultTraceQuery, FaultTraceVO } from './types'; import { FaultTraceQuery, FaultTraceVO } from './types';
import { RealtimeAlarmQuery, RealtimeAlarmVO } from './types'; import { RealtimeAlarmQuery, RealtimeAlarmVO } from './types';
import { DowntimeReportQuery, DowntimeReportVO } from './types';
export function listFaultTrace(query: FaultTraceQuery) { export function listFaultTrace(query: FaultTraceQuery) {
@ -36,4 +37,150 @@ export function exportRealtimeAlarm(query: RealtimeAlarmQuery) {
data: query, data: query,
responseType: 'blob', responseType: 'blob',
}); });
} }
// 新增:停机统计
export function listDowntime(query: DowntimeReportQuery) {
return request({
url: '/dms/report/downtime/list',
method: 'get',
params: query,
});
}
export function exportDowntime(query: DowntimeReportQuery) {
return request({
url: '/dms/report/downtime/export',
method: 'post',
data: query,
responseType: 'blob',
});
}
// 查询设备利用率分析报表列表
export function listDeviceUtilization(query) {
return request({
url: '/dms/device/report/utilization/list',
method: 'get',
params: query
})
}
// 导出设备利用率分析报表
export function exportDeviceUtilization(query) {
return request({
url: '/dms/device/report/utilization/export',
method: 'post',
data: query
})
}
// 查询维护成本分析报表列表
export function listMaintenanceCost(query) {
return request({
url: '/dms/device/report/maintenanceCost/list',
method: 'get',
params: query
})
}
// 导出维护成本分析报表
export function exportMaintenanceCost(query) {
return request({
url: '/dms/device/report/maintenanceCost/export',
method: 'post',
data: query
})
}
// 查询设备健康分析报表列表
export function listDeviceHealth(query) {
return request({
url: '/dms/device/report/health/list',
method: 'get',
params: query
})
}
// 导出设备健康分析报表
export function exportDeviceHealth(query) {
return request({
url: '/dms/device/report/health/export',
method: 'post',
data: query
})
}
// 查询巡检执行效率报表列表
export function listInspectionEfficiency(query) {
return request({
url: '/dms/device/report/inspectionEfficiency/list',
method: 'get',
params: query
})
}
// 导出巡检执行效率报表
export function exportInspectionEfficiency(query) {
return request({
url: '/dms/device/report/inspectionEfficiency/export',
method: 'post',
data: query
})
}
// 查询润滑维护分析报表列表
export function listLubricationAnalysis(query) {
return request({
url: '/dms/device/report/lubricationAnalysis/list',
method: 'get',
params: query
})
}
// 导出润滑维护分析报表
export function exportLubricationAnalysis(query) {
return request({
url: '/dms/device/report/lubricationAnalysis/export',
method: 'post',
data: query
})
}
// 查询设备采购分析报表列表
export function listProcurementAnalysis(query) {
return request({
url: '/dms/device/report/procurementAnalysis/list',
method: 'get',
params: query
})
}
// 导出设备采购分析报表
export function exportProcurementAnalysis(query) {
return request({
url: '/dms/device/report/procurementAnalysis/export',
method: 'post',
data: query
})
}
// 查询设备生命周期报表列表
export function listDeviceLifecycle(query) {
return request({
url: '/dms/device/report/lifecycle/list',
method: 'get',
params: query
})
}
// 导出设备生命周期报表
export function exportDeviceLifecycle(query) {
return request({
url: '/dms/device/report/lifecycle/export',
method: 'post',
data: query
})
}

@ -47,6 +47,17 @@ export const getMixTraceDetail = (
}); });
}; };
/**
* 线
*/
export const getLatestCurve = (query: MixTraceQuery): AxiosPromise<MixTraceDetailVO> => {
return request({
url: '/mes/mixTrace/curve/latest',
method: 'get',
params: query
});
};
/** /**
* SPC6- * SPC6-
*/ */

@ -4,20 +4,7 @@
<el-card shadow="never"> <el-card shadow="never">
<div style="display: flex; justify-content: space-between"> <div style="display: flex; justify-content: space-between">
<div> <div>
<el-button <!-- 移除提交按钮Web端不再创建工单 -->
v-if="submitButtonShow"
:loading="buttonLoading"
type="info"
@click="submitForm('draft')">
暂存
</el-button>
<el-button
v-if="submitButtonShow"
:loading="buttonLoading"
type="primary"
@click="submitForm('submit')">
提交
</el-button>
<el-button <el-button
v-if="approvalButtonShow" v-if="approvalButtonShow"
:loading="buttonLoading" :loading="buttonLoading"
@ -52,7 +39,7 @@
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="工单编号"> <el-form-item label="工单编号">
<el-input v-model="workOrder.billsFaultCode" disabled /> <el-input :value="workOrder?.billsFaultCode || ''" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
@ -62,174 +49,108 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="申请人"> <el-form-item label="申请人">
<el-input v-model="workOrder.applyUser" disabled /> <el-input :value="workOrder?.applyUser || ''" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="设备编号"> <el-form-item label="设备编号">
<el-input v-model="workOrder.machineCode" disabled /> <el-input :value="workOrder?.machineCode || ''" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="设备名称"> <el-form-item label="设备名称">
<el-input v-model="workOrder.machineName" disabled /> <el-input :value="workOrder?.machineName || ''" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="申请时间"> <el-form-item label="申请时间">
<el-input v-model="workOrder.applyTime" disabled /> <el-input :value="workOrder?.applyTime || ''" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
</el-card> </el-card>
<!-- 当前步骤处理区域 --> <!-- PDA端创建的工单详情只读显示 -->
<el-card shadow="never"> <el-card shadow="never">
<h4 class="form-header">{{ currentStepTitle }}</h4> <h4 class="form-header">PDA端创建的工单详情只读</h4>
<el-form <el-form
ref="processFormRef" ref="processFormRef"
v-loading="loading" v-loading="loading"
:disabled="routeParams.type === 'view'"
:model="form" :model="form"
:rules="rules" :rules="rules"
label-width="120px"> label-width="120px">
<el-row> <el-row>
<!-- 第一步故障报修信息 --> <!-- 故障报修信息只读显示 -->
<template v-if="currentStepOrder === 1"> <el-col :span="8">
<el-col :span="8"> <el-form-item label="故障类型">
<el-form-item label="故障类型" prop="faultType"> <el-input v-model="form.faultType" disabled />
<el-select v-model="form.faultType" placeholder="请选择故障类型"> </el-form-item>
<el-option </el-col>
v-for="dict in activity_fault_type" <el-col :span="8">
:key="dict.value" <el-form-item label="维修类型">
:label="dict.label" <el-input v-model="form.repairType" disabled />
:value="dict.value"> </el-form-item>
</el-option> </el-col>
</el-select> <el-col :span="8">
</el-form-item> <el-form-item label="外协单位">
</el-col> <el-input v-model="outsourcingName" disabled />
<el-col :span="8"> </el-form-item>
<el-form-item label="维修类型" prop="repairType"> </el-col>
<el-select <el-col :span="24">
v-model="form.repairType" <el-form-item label="故障描述">
placeholder="请选择维修类型" <el-input
@change="updateOutsourcingValidation"> v-model="form.faultDescription"
<el-option type="textarea"
v-for="dict in fault_repair_type" :rows="3"
:key="dict.value" disabled />
:label="dict.label" </el-form-item>
:value="dict.value"> </el-col>
</el-option> <el-col :span="24">
</el-select> <el-form-item label="涉及操作">
</el-form-item> <el-input
</el-col> v-model="form.designOperations"
<el-col :span="8"> type="textarea"
<el-form-item label="外协单位" prop="outsourcingId"> :rows="2"
<el-input v-model="form.outsourcingId" placeholder="请输入外协单位" /> disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="故障描述" prop="faultDescription">
<el-input
v-model="form.faultDescription"
type="textarea"
:rows="3"
placeholder="请输入故障描述" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="涉及操作" prop="designOperations">
<el-input
v-model="form.designOperations"
type="textarea"
:rows="2"
placeholder="请输入涉及操作" />
</el-form-item>
</el-col>
</template>
<!-- 第二步维修处理 --> <!-- 维修处理信息只读显示 -->
<template v-if="currentStepOrder === 2"> <template v-if="form.repairer">
<el-col :span="8">
<el-form-item label="故障类型">
<el-input v-model="form.faultType" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="维修类型">
<el-input v-model="form.repairType" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="维修人" prop="repairer">
<el-input v-model="form.repairer" placeholder="请输入维修人" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="检查后的故障判断" prop="checkedFault">
<el-input
v-model="form.checkedFault"
type="textarea"
:rows="3"
placeholder="请输入检查后的故障判断" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="维修措施" prop="protectedMethod">
<el-input
v-model="form.protectedMethod"
type="textarea"
:rows="3"
placeholder="请输入维修措施" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="维修内容" prop="repairContent">
<el-input
v-model="form.repairContent"
type="textarea"
:rows="4"
placeholder="请输入维修内容" />
</el-form-item>
</el-col>
</template>
<!-- 第三步维修确认 -->
<template v-if="currentStepOrder === 3">
<el-col :span="8"> <el-col :span="8">
<el-form-item label="维修人"> <el-form-item label="维修人">
<el-input v-model="form.repairer" disabled /> <el-input v-model="form.repairer" disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="维修结果" prop="repairConfirm">
<el-select v-model="form.repairConfirm" placeholder="请选择维修结果">
<el-option
v-for="dict in fault_repair_confirm"
:key="dict.value"
:label="dict.label"
:value="dict.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="关联更换零部件" prop="componentsPartsId">
<el-input v-model="form.componentsPartsId" placeholder="请输入关联更换零部件内容" />
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="维修内容"> <el-form-item label="检查后的故障判断">
<el-input v-model="form.repairContent" type="textarea" :rows="3" disabled /> <el-input
v-model="form.checkedFault"
type="textarea"
:rows="3"
disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="维修措施"> <el-form-item label="维修措施">
<el-input v-model="form.protectedMethod" type="textarea" :rows="3" disabled /> <el-input
v-model="form.protectedMethod"
type="textarea"
:rows="3"
disabled />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="维修内容">
<el-input
v-model="form.repairContent"
type="textarea"
:rows="4"
disabled />
</el-form-item> </el-form-item>
</el-col> </el-col>
</template> </template>
@ -249,7 +170,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 处理意见除第一步外都需要 --> <!-- 处理意见审批时需要 -->
<el-col :span="24" v-if="needProcessResolution"> <el-col :span="24" v-if="needProcessResolution">
<el-form-item label="处理意见" prop="processHandleResolution"> <el-form-item label="处理意见" prop="processHandleResolution">
<el-input <el-input
@ -277,14 +198,13 @@
<script setup name="FaultWorkOrderProcess" lang="ts"> <script setup name="FaultWorkOrderProcess" lang="ts">
// //
import { ref, reactive, computed, onMounted, getCurrentInstance, toRefs, watch } from 'vue'; import { ref, reactive, computed, onMounted, getCurrentInstance, toRefs } from 'vue';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { ElMessageBox, type FormInstance } from 'element-plus';
import type { ComponentInternalInstance } from 'vue';
import { getDmsBillsFaultInstance, approveWorkOrder, confirmRepairResult } from '@/api/dms/dmsBillsFaultInstance'; import { getDmsBillsFaultInstance, approveWorkOrder, confirmRepairResult } from '@/api/dms/dmsBillsFaultInstance';
import { addDmsFaultInstanceActivity } from '@/api/dms/dmsFaultInstanceActivity';
import { pageByTaskWait } from '@/api/workflow/task';
import { getCurrentDateTime } from '@/utils/dateUtils';
import { getDmsBaseOutsourcingInfoList } from '@/api/dms/dmsBaseOutsourcingInfo'; import { getDmsBaseOutsourcingInfoList } from '@/api/dms/dmsBaseOutsourcingInfo';
import SubmitVerify from '@/components/Process/submitVerify.vue'; import SubmitVerify from '@/views/dms/dmsFaultInstanceActivity/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue'; import ApprovalRecord from '@/components/Process/approvalRecord.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@ -299,15 +219,14 @@ const routeParams = ref<Record<string, any>>({});
const workOrder = ref<any>({}); const workOrder = ref<any>({});
const workOrderStatusText = ref(''); const workOrderStatusText = ref('');
const outsourceList = ref<any[]>([]); const outsourceList = ref<any[]>([]);
const outsourcingName = ref('');
// //
const processFormRef = ref<ElFormInstance>(); const processFormRef = ref<FormInstance>();
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>(); const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>(); const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
// //
const currentTask = ref<any>(null);
const currentStepOrder = ref(1);
const taskVariables = ref<any>({}); const taskVariables = ref<any>({});
// //
@ -325,7 +244,6 @@ const initFormData = {
repairConfirm: undefined, repairConfirm: undefined,
componentsPartsId: undefined, componentsPartsId: undefined,
processHandleResolution: undefined, processHandleResolution: undefined,
processStepOrder: undefined,
approveStatus: undefined approveStatus: undefined
}; };
@ -333,68 +251,60 @@ const form = reactive({ ...initFormData });
// //
const rules = reactive({ const rules = reactive({
faultType: [{ required: true, message: '故障类型不能为空', trigger: 'change' }], approveStatus: [{ required: false, message: '审批状态不能为空', trigger: 'change' }],
faultDescription: [{ required: true, message: '故障描述不能为空', trigger: 'blur' }], processHandleResolution: [{ required: false, message: '处理意见不能为空', trigger: 'blur' }]
repairType: [{ required: true, message: '维修类型不能为空', trigger: 'change' }],
outsourcingId: [{ required: false, message: '外协单位不能为空', trigger: 'change' }],
repairer: [{ required: false, message: '维修人不能为空', trigger: 'blur' }],
checkedFault: [{ required: false, message: '检查后的故障判断不能为空', trigger: 'blur' }],
protectedMethod: [{ required: false, message: '维修措施不能为空', trigger: 'blur' }],
repairContent: [{ required: false, message: '维修内容不能为空', trigger: 'blur' }],
repairConfirm: [{ required: false, message: '维修结果不能为空', trigger: 'change' }],
processHandleResolution: [{ required: false, message: '处理意见不能为空', trigger: 'blur' }],
approveStatus: [{ required: false, message: '审批状态不能为空', trigger: 'change' }]
}); });
// //
const needProcessResolution = computed(() => currentStepOrder.value > 1); const needProcessResolution = computed(() => {
return isApprovalStage.value || confirmButtonShow.value;
const currentStepName = computed(() => {
const stepNames = {
1: '故障报修',
2: '维修处理',
3: '维修确认'
};
return stepNames[currentStepOrder.value] || '处理工单';
}); });
const currentStepTitle = computed(() => { const currentStepName = computed(() => {
const stepTitles = { if (workOrder.value?.approveStatus === '1') {
1: '步骤1故障报修要求参数', return '审批工单';
2: '步骤2维修处理实际参数', }
3: '步骤3维修确认' return '处理工单';
};
return stepTitles[currentStepOrder.value] || '工单处理';
}); });
const approvalButtonShow = computed(() => { const approvalButtonShow = computed(() => {
return routeParams.value.type === 'approval' && currentTask.value; // (1)
return workOrder.value?.approveStatus === '1';
}); });
const confirmButtonShow = computed(() => { const confirmButtonShow = computed(() => {
// //
// 1. confirm console.log('主管确认按钮显示条件检查:', {
// 2. (2)(0) billsStatus: workOrder.value?.billsStatus,
// 3. (2) - billsStatusType: typeof workOrder.value?.billsStatus,
return routeParams.value.type === 'confirm' || approveStatus: workOrder.value?.approveStatus,
(workOrder.value.billsStatus === '2' && approveStatusType: typeof workOrder.value?.approveStatus,
workOrder.value.repairConfirm === '0' && repairConfirm: workOrder.value?.repairConfirm,
workOrder.value.approveStatus === '2'); repairConfirmType: typeof workOrder.value?.repairConfirm
});
//
// (2) && (2) && (0)
// 使
const billsStatusMatches = String(workOrder.value?.billsStatus) === '2';
const approveStatusMatches = String(workOrder.value?.approveStatus) === '2';
const repairConfirmMatches = String(workOrder.value?.repairConfirm) === '0';
const shouldShow = billsStatusMatches && approveStatusMatches && repairConfirmMatches;
console.log('主管确认按钮显示结果:', {
billsStatusMatches,
approveStatusMatches,
repairConfirmMatches,
shouldShow
});
return shouldShow;
}); });
// //
const isApprovalStage = computed(() => { const isApprovalStage = computed(() => {
return routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1'; return workOrder.value?.approveStatus === '1';
});
//
const submitButtonShow = computed(() => {
return (
routeParams.value.type === 'add' ||
(routeParams.value.type === 'update' &&
workOrder.value.billsStatus &&
(workOrder.value.billsStatus === 'draft' || workOrder.value.billsStatus === 'cancel' || workOrder.value.billsStatus === 'back'))
);
}); });
// //
@ -409,192 +319,64 @@ onMounted(async () => {
// //
await getOutsourceList(); await getOutsourceList();
//
if (routeParams.value.type === 'approval') {
await loadCurrentTask();
}
// //
initializeFormData(); initializeFormData();
// //
if (routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1') { setDynamicValidationRules();
rules.approveStatus = [{ required: true, message: '审批状态不能为空', trigger: 'change' }];
}
//
updateOutsourcingValidation();
} catch (error) { } catch (error) {
console.error('初始化失败:', error); console.error('初始化失败:', error);
proxy?.$modal.msgError('加载数据失败'); (proxy as any)?.$modal.msgError('加载数据失败');
} finally { } finally {
loading.value = false; loading.value = false;
} }
}); });
//
watch(() => form.repairType, (newValue) => {
updateOutsourcingValidation();
//
if (newValue !== '2') {
form.outsourcingId = undefined;
}
});
// //
const loadWorkOrderInfo = async () => { const loadWorkOrderInfo = async () => {
// querybusinessId // querybusinessId
const businessId = routeParams.value.id; const businessId = routeParams.value.id;
if (!businessId) { if (!businessId) {
proxy?.$modal.msgError('缺少工单ID参数'); (proxy as any)?.$modal.msgError('缺少工单ID参数');
return; return;
} }
const res = await getDmsBillsFaultInstance(businessId); const res = await getDmsBillsFaultInstance(businessId);
workOrder.value = res.data; workOrder.value = res.data || {}; // null
// // -
workOrderStatusText.value = getStatusText(workOrder.value.billsStatus); workOrderStatusText.value = getStatusText(workOrder.value.billsStatus || '');
};
//
const loadCurrentTask = async () => {
// querybusinessIdtaskId
const businessId = routeParams.value.id;
const taskId = routeParams.value.taskId;
// taskIdbusinessId
const taskRes = await pageByTaskWait({
pageNum: 1,
pageSize: 10,
flowCode: 'Fault01' //
});
const tasks = taskRes.rows.filter(task =>
task.businessId === businessId || task.id === taskId
);
if (tasks.length > 0) {
currentTask.value = tasks[0];
//
const nodeName = currentTask.value.nodeName;
if (nodeName === '故障报修') {
currentStepOrder.value = 1;
} else if (nodeName === '维修处理') {
currentStepOrder.value = 2;
} else if (nodeName === '维修确认') {
currentStepOrder.value = 3;
}
//
if (needProcessResolution.value) {
rules.processHandleResolution = [
{ required: true, message: '处理意见不能为空', trigger: 'blur' }
];
}
}
}; };
// //
const initializeFormData = () => { const initializeFormData = () => {
// //
form.repairInstanceId = workOrder.value.repairInstanceId; form.repairInstanceId = workOrder.value?.repairInstanceId;
form.processStepOrder = currentStepOrder.value;
if (currentStepOrder.value === 1) { // undefined
// form.faultType = workOrder.value?.faultType || '';
form.faultType = workOrder.value.faultType; form.faultDescription = workOrder.value?.faultDescription || '';
form.faultDescription = workOrder.value.faultDescription; form.designOperations = workOrder.value?.designOperations || '';
form.designOperations = workOrder.value.designOperations; form.repairType = workOrder.value?.repairType || '';
form.repairType = workOrder.value.repairType; form.outsourcingId = workOrder.value?.outsourcingId || '';
form.outsourcingId = workOrder.value.outsourcingId; form.checkedFault = workOrder.value?.checkedFault || '';
} else { form.repairContent = workOrder.value?.repairContent || '';
// form.protectedMethod = workOrder.value?.protectedMethod || '';
form.faultType = workOrder.value.faultType; form.repairer = workOrder.value?.repairer || '';
form.faultDescription = workOrder.value.faultDescription; form.repairConfirm = workOrder.value?.repairConfirm || '';
form.designOperations = workOrder.value.designOperations; form.componentsPartsId = workOrder.value?.componentsPartsId || '';
form.repairType = workOrder.value.repairType;
form.outsourcingId = workOrder.value.outsourcingId; //
form.checkedFault = workOrder.value.checkedFault; if (form.outsourcingId && outsourceList.value.length > 0) {
form.repairContent = workOrder.value.repairContent; const outsourcing = outsourceList.value.find(item => item.outsourcingId === form.outsourcingId);
form.protectedMethod = workOrder.value.protectedMethod; outsourcingName.value = outsourcing?.outsourcingName || '';
form.repairer = workOrder.value.repairer;
form.repairConfirm = workOrder.value.repairConfirm;
form.componentsPartsId = workOrder.value.componentsPartsId;
} }
};
// //
const submitForm = async (status: string) => { if (routeParams.value.type === 'approval' && !form.approveStatus) {
if (!processFormRef.value) return; form.approveStatus = undefined; //
try {
const valid = await processFormRef.value.validate();
if (valid) {
buttonLoading.value = true;
if (status === 'draft') {
//
await addDmsFaultInstanceActivity({
repairInstanceId: form.repairInstanceId,
faultType: form.faultType,
faultDescription: form.faultDescription,
designOperations: form.designOperations,
repairType: form.repairType,
outsourcingId: form.outsourcingId,
checkedFault: form.checkedFault || '',
repairContent: form.repairContent || '',
protectedMethod: form.protectedMethod || '',
repairer: form.repairer || '',
repairConfirm: form.repairConfirm,
componentsPartsId: form.componentsPartsId,
processHandleResolution: form.processHandleResolution || '',
processStepOrder: form.processStepOrder,
handleTime: getCurrentDateTime()
});
proxy?.$modal.msgSuccess('暂存成功');
goBack();
} else {
//
//
taskVariables.value = {
entity: {
repairInstanceId: form.repairInstanceId,
faultType: form.faultType,
faultDescription: form.faultDescription,
designOperations: form.designOperations,
repairType: form.repairType,
outsourcingId: form.outsourcingId,
checkedFault: form.checkedFault || '',
repairContent: form.repairContent || '',
protectedMethod: form.protectedMethod || '',
repairer: form.repairer || '',
repairConfirm: form.repairConfirm,
componentsPartsId: form.componentsPartsId,
processHandleResolution: form.processHandleResolution || '',
processStepOrder: form.processStepOrder
}
};
//
if (routeParams.value.taskId) {
submitVerifyRef.value?.openDialog(routeParams.value.taskId);
} else {
//
proxy?.$modal.msgSuccess('提交成功');
goBack();
}
}
}
} catch (error) {
console.error('提交失败:', error);
proxy?.$modal.msgError('提交失败');
} finally {
buttonLoading.value = false;
} }
}; };
@ -605,118 +387,100 @@ const approvalVerifyOpen = async () => {
try { try {
const valid = await processFormRef.value.validate(); const valid = await processFormRef.value.validate();
if (valid) { if (valid) {
// await (proxy as any)?.$modal.confirm('是否确认提交审批?');
if (routeParams.value.type === 'approval' && !form.approveStatus) {
proxy?.$modal.msgError('请选择审批状态');
return;
}
// - SubmitVerifyWarm-Flow buttonLoading.value = true;
taskVariables.value = {
//
entity: {
repairInstanceId: form.repairInstanceId,
faultType: form.faultType,
faultDescription: form.faultDescription,
designOperations: form.designOperations,
repairType: form.repairType,
outsourcingId: form.outsourcingId,
checkedFault: form.checkedFault || '',
repairContent: form.repairContent || '',
protectedMethod: form.protectedMethod || '',
repairer: form.repairer || '',
repairConfirm: form.repairConfirm,
componentsPartsId: form.componentsPartsId,
processHandleResolution: form.processHandleResolution || '',
processStepOrder: form.processStepOrder
}
};
// //
if (routeParams.value.type === 'approval' && form.approveStatus) { const approveStatus = form.approveStatus;
// taskVariablesapproveStatus - SubmitVerify const message = form.processHandleResolution || '';
taskVariables.value.approveStatus = form.approveStatus;
console.log('设置审批状态变量:', form.approveStatus);
}
// await approveWorkOrder(form.repairInstanceId, approveStatus, message);
if (routeParams.value.type === 'confirm' && form.repairConfirm) {
// 01
const repairConfirmValue = form.repairConfirm === '1' ? '0' : '1';
taskVariables.value.repairConfirm = repairConfirmValue;
console.log('设置确认结果变量:', repairConfirmValue);
}
console.log('完整的工作流变量:', taskVariables.value); const statusText = approveStatus === '2' ? '通过' : '拒绝';
(proxy as any)?.$modal.msgSuccess(`审批${statusText}成功`);
// 使taskId //
submitVerifyRef.value?.openDialog(routeParams.value.taskId); goBack();
} }
} catch (error) { } catch (error: any) {
proxy?.$modal.msgError('表单验证失败,请检查输入项'); if (error !== 'cancel' && error !== 'close') {
console.error('审批失败:', error);
(proxy as any)?.$modal.msgError('审批失败:' + (error.message || '未知错误'));
}
} finally {
buttonLoading.value = false;
} }
}; };
// //
const submitCallback = async (approvalResult?: any) => { const submitCallback = async (approvalResult?: any) => {
try { try {
// if (routeParams.value.type === 'confirm') {
if (routeParams.value.type === 'approval') {
// 使
const approveStatus = form.approveStatus; // 使
const message = approvalResult?.message || form.processHandleResolution || '';
await approveWorkOrder(form.repairInstanceId, approveStatus, message);
const statusText = approveStatus === '2' ? '通过' : '拒绝';
proxy?.$modal.msgSuccess(`审批${statusText}成功`);
} else if (routeParams.value.type === 'confirm') {
// //
const confirmResult = form.repairConfirm || '1'; // const confirmResult = form.repairConfirm || '1'; //
await confirmRepairResult(form.repairInstanceId, confirmResult); await confirmRepairResult(form.repairInstanceId, confirmResult);
proxy?.$modal.msgSuccess('确认完成'); (proxy as any)?.$modal.msgSuccess('确认完成');
} else {
//
await addDmsFaultInstanceActivity({
repairInstanceId: form.repairInstanceId,
faultType: form.faultType,
faultDescription: form.faultDescription,
designOperations: form.designOperations,
repairType: form.repairType,
outsourcingId: form.outsourcingId,
checkedFault: form.checkedFault || '',
repairContent: form.repairContent || '',
protectedMethod: form.protectedMethod || '',
repairer: form.repairer || '',
repairConfirm: form.repairConfirm,
componentsPartsId: form.componentsPartsId,
processHandleResolution: form.processHandleResolution || '',
processStepOrder: form.processStepOrder,
handleTime: getCurrentDateTime()
});
proxy?.$modal.msgSuccess(`${currentStepName.value}完成`);
} }
// //
goBack(); goBack();
} catch (error: any) { } catch (error: any) {
console.error('操作失败:', error); console.error('操作失败:', error);
proxy?.$modal.msgError('操作失败:' + (error.message || '未知错误')); (proxy as any)?.$modal.msgError('操作失败:' + (error.message || '未知错误'));
} }
}; };
// //
const handleConfirm = async () => { const handleConfirm = async () => {
try { try {
// // 使
const result = await ElMessageBox.confirm(
'请选择维修结果确认方式:\n• 通过:维修通过,工单完成\n• 退回:维修不通过,返回维修环节重新维修',
'主管确认',
{
confirmButtonText: '通过',
cancelButtonText: '退回',
type: 'warning',
distinguishCancelAndClose: true
}
);
buttonLoading.value = true;
//
form.repairConfirm = '1'; // 1 form.repairConfirm = '1'; // 1
// //
await approvalVerifyOpen(); await confirmRepairResult(form.repairInstanceId, form.repairConfirm);
} catch (error: any) { (proxy as any)?.$modal.msgSuccess('确认通过完成');
if (error !== 'cancel' && error !== 'close') { goBack();
console.error('确认失败:', error);
proxy?.$modal.msgError('确认失败:' + (error.message || '未知错误')); } catch (action: any) {
if (action === 'cancel') {
// 退
try {
buttonLoading.value = true;
form.repairConfirm = '2'; // 2
await confirmRepairResult(form.repairInstanceId, form.repairConfirm);
(proxy as any)?.$modal.msgSuccess('退回维修环节完成');
goBack();
} catch (confirmError: any) {
console.error('退回操作失败:', confirmError);
(proxy as any)?.$modal.msgError('退回操作失败:' + (confirmError.message || '未知错误'));
} finally {
buttonLoading.value = false;
}
} else if (action === 'close') {
// ESC
console.log('用户取消了确认操作');
} else {
console.error('确认失败:', action);
(proxy as any)?.$modal.msgError('确认失败:' + (action.message || '未知错误'));
}
} finally {
if (form.repairConfirm === '1') {
buttonLoading.value = false;
} }
} }
}; };
@ -728,7 +492,7 @@ const handleApprovalRecord = () => {
// //
const goBack = () => { const goBack = () => {
proxy?.$tab.closePage(proxy?.$route); (proxy as any)?.$tab.closePage((proxy as any)?.$route);
router.go(-1); router.go(-1);
}; };
@ -742,14 +506,23 @@ const getOutsourceList = async () => {
} }
}; };
// //
const updateOutsourcingValidation = () => { const setDynamicValidationRules = () => {
if (form.repairType === '2') { //
// Object.keys(rules).forEach(key => {
rules.outsourcingId = [{ required: true, message: '外协单位不能为空', trigger: 'change' }]; rules[key] = [{ required: false, message: rules[key][0].message, trigger: rules[key][0].trigger }];
} else { });
//
rules.outsourcingId = [{ required: false, message: '外协单位不能为空', trigger: 'change' }]; //
if (workOrder.value?.approveStatus === '1') {
//
rules.approveStatus = [{ required: true, message: '审批状态不能为空', trigger: 'change' }];
rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }];
} else if (workOrder.value?.billsStatus === '2' &&
workOrder.value?.approveStatus === '2' &&
workOrder.value?.repairConfirm === '0') {
//
rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }];
} }
}; };

@ -49,7 +49,7 @@
</el-button-group> </el-button-group>
</div> </div>
<div class="toolbar-right"> <div class="toolbar-right">
<el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['dms:dmsBaseMachineInfo:add']"> <el-button type="primary" icon="Plus" @clicknv="handleAdd" v-hasPermi="['dms:dmsBaseMachineInfo:add']">
新增设备 新增设备
</el-button> </el-button>
<el-button type="success" icon="Edit" :disabled="single" @click="handleUpdate()" <el-button type="success" icon="Edit" :disabled="single" @click="handleUpdate()"

@ -4,6 +4,8 @@
<div style="display: flex; justify-content: space-between"> <div style="display: flex; justify-content: space-between">
<div> <div>
<el-button type="primary" @click="handleApprovalRecord"></el-button> <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>
<div> <div>
<el-button @click="goBack()"></el-button> <el-button @click="goBack()"></el-button>
@ -118,9 +120,10 @@
</el-col> --> </el-col> -->
</el-row> </el-row>
<el-form-item label="处置类型"> <el-form-item label="处置类型">
<el-tag :type="getDispositionTypeTag(approvalForm.reviewResult)"> <el-tag v-if="approvalForm.reviewResult" :type="getDispositionTypeTag(approvalForm.reviewResult) as any">
{{ getDispositionTypeName(approvalForm.reviewResult) }} {{ getDispositionTypeName(approvalForm.reviewResult) }}
</el-tag> </el-tag>
<span v-else></span>
</el-form-item> </el-form-item>
<!-- <el-form-item label="备注"> <!-- <el-form-item label="备注">
<el-input v-model="approvalForm.remark" type="textarea" :rows="3" readonly /> <el-input v-model="approvalForm.remark" type="textarea" :rows="3" readonly />
@ -147,17 +150,17 @@
<el-table-column label="检测位置" align="center" prop="inspectionPosition" /> <el-table-column label="检测位置" align="center" prop="inspectionPosition" />
<el-table-column label="检测方法" align="center" prop="inspectionMethod"> <el-table-column label="检测方法" align="center" prop="inspectionMethod">
<template #default="scope"> <template #default="scope">
<dict-tag :options="qc_methond" :value="scope.row.inspectionMethod" /> <dict-tag v-if="scope.row.inspectionMethod != null" :options="qc_methond" :value="scope.row.inspectionMethod" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="检测方式" align="center" prop="detectType"> <el-table-column label="检测方式" align="center" prop="detectType">
<template #default="scope"> <template #default="scope">
<dict-tag :options="detect_type" :value="scope.row.detectType" /> <dict-tag v-if="scope.row.detectType != null" :options="detect_type" :value="scope.row.detectType" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="检测结果" align="center" prop="detectResult"> <el-table-column label="检测结果" align="center" prop="detectResult">
<template #default="scope"> <template #default="scope">
<dict-tag :options="qc_result" :value="scope.row.detectResult"/> <dict-tag v-if="scope.row.detectResult != null" :options="qc_result" :value="scope.row.detectResult"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="检测值" align="center" prop="detectValue" /> <el-table-column label="检测值" align="center" prop="detectValue" />
@ -171,11 +174,6 @@
<pagination v-show="detailTotal > 0" :total="detailTotal" v-model:page="detailQueryParams.pageNum" v-model:limit="detailQueryParams.pageSize" @pagination="getDetailList" /> <pagination v-show="detailTotal > 0" :total="detailTotal" v-model:page="detailQueryParams.pageNum" v-model:limit="detailQueryParams.pageSize" @pagination="getDetailList" />
</el-card> </el-card>
<el-card shadow="never" class="mt-4">
<div class="dialog-footer text-center">
<el-button type="primary" :loading="approvalButtonLoading" @click="handleApprove"></el-button>
</div>
</el-card>
<!-- 审批记录组件 --> <!-- 审批记录组件 -->
<approvalRecord ref="approvalRecordRef" /> <approvalRecord ref="approvalRecordRef" />
@ -203,6 +201,7 @@ const detailRecordList = ref<QcUnqualifiedRecordVO[]>([]);
const detailLoading = ref(false); const detailLoading = ref(false);
const detailTotal = ref(0); const detailTotal = ref(0);
const approvalButtonLoading = ref(false); const approvalButtonLoading = ref(false);
const rejectButtonLoading = ref(false);
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>(); const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
@ -247,17 +246,11 @@ const getDetailList = async () => {
/** 审批通过 */ /** 审批通过 */
const handleApprove = async () => { const handleApprove = async () => {
// if (!approvalForm.value.comment || approvalForm.value.comment.length < 5) {
// proxy?.$modal.msgError('5');
// return;
// }
approvalButtonLoading.value = true; approvalButtonLoading.value = true;
try { try {
console.log(approvalForm.value); const reviewIdValue = approvalForm.value.reviewId;
const reviewIdValue = approvalForm.value.reviewId;
await completeTask({ await completeTask({
reviewId: reviewIdValue reviewId: reviewIdValue
}); });
proxy?.$modal.msgSuccess('审批通过'); proxy?.$modal.msgSuccess('审批通过');
goBack(); goBack();
@ -268,6 +261,28 @@ const handleApprove = async () => {
} }
}; };
/** 审批不通过 */
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 = () => { const handleApprovalRecord = () => {
approvalRecordRef.value?.init(approvalForm.value.reviewId); approvalRecordRef.value?.init(approvalForm.value.reviewId);
@ -277,16 +292,16 @@ const getDispositionTypeName = (value: string | undefined) => {
return review_result.value.find(item => item.value === value)?.label || '未知'; return review_result.value.find(item => item.value === value)?.label || '未知';
}; };
const getDispositionTypeTag = (value: string | undefined) => { const getDispositionTypeTag = (value: string | undefined): string | undefined => {
// tag // tagel-tag type primary/success/info/warning/danger undefined
const tagMap = { const tagMap: Record<string, string> = {
'0': 'danger', '0': 'danger',
'1': 'warning', '1': 'warning',
'2': 'info', '2': 'info',
'3': 'success', '3': 'success',
'4': 'primary' '4': 'primary'
}; };
return tagMap[value || ''] || ''; return value ? tagMap[value] : undefined;
}; };
const goBack = () => { const goBack = () => {

@ -536,9 +536,9 @@
</el-form-item> </el-form-item>
<el-form-item> <!-- <el-form-item>
<el-button @click="batchConfigVisible = true">配置条码</el-button> <el-button @click="batchConfigVisible = true">配置条码</el-button>
</el-form-item> </el-form-item>-->
<el-form-item label="已包数量" prop="printedNum"> <el-form-item label="已包数量" prop="printedNum">
@ -605,15 +605,7 @@
</el-dialog> </el-dialog>
<el-dialog v-model="batchConfigVisible" title="条码配置" width="40%"> <!-- 条码配置对话框已移除 -->
<el-select v-model="selectedComponents" multiple placeholder="选择并排序组成部分">
<el-option v-for="comp in batchComponents" :key="comp" :label="comp" :value="comp" />
</el-select>
<template #footer>
<el-button @click="batchConfigVisible = false">取消</el-button>
<el-button type="primary" @click="saveBatchConfig"></el-button>
</template>
</el-dialog>
<!-- 添加物料信息对话框 --> <!-- 添加物料信息对话框 -->
<el-dialog title="选择物料信息" v-model="materialOpen" width='1200px' append-to-body> <el-dialog title="选择物料信息" v-model="materialOpen" width='1200px' append-to-body>
@ -840,34 +832,14 @@ const submitForm = async() => {
} }
} }
childrenTableInfoForm.value.batchCode = generateBatchCode(childrenTableInfoForm.value) childrenTableInfoForm.value.batchCode = '' // 使
await updateInstockDetail(childrenTableInfoForm.value) await updateInstockDetail(childrenTableInfoForm.value)
getChildrenTable({instockId: partntTableSelectCell.value.instockId}) getChildrenTable({instockId: partntTableSelectCell.value.instockId})
childrenTableInfoVisible.value = false childrenTableInfoVisible.value = false
} }
// // 使 index.vue
const batchConfigVisible = ref(false)
const batchComponents = ref(['当前时间', '入库单号', '物料编码']) //
const selectedComponents = ref([]) //
onMounted(() => {
const saved = localStorage.getItem('batchCodeConfig')
if (saved) selectedComponents.value = JSON.parse(saved)
})
const saveBatchConfig = () => {
localStorage.setItem('batchCodeConfig', JSON.stringify(selectedComponents.value))
batchConfigVisible.value = false
}
const generateBatchCode = (form) => {
if (!selectedComponents.value.length) return '' //
return selectedComponents.value.map(comp => {
if (comp === '当前时间') return new Date().toISOString().slice(0,10).replace(/-/g, '')
if (comp === '入库单号') return form.instockCode
if (comp === '物料编码') return form.materialCode
return ''
}).join('')
}
// //
let mategoryOptions = ref([]); let mategoryOptions = ref([]);

Loading…
Cancel
Save