|
|
|
@ -52,7 +52,7 @@
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="工单编号">
|
|
|
|
|
<el-input v-model="workOrder.billsFaultCode" disabled />
|
|
|
|
|
<el-input :value="workOrder?.billsFaultCode || ''" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
@ -62,24 +62,24 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="申请人">
|
|
|
|
|
<el-input v-model="workOrder.applyUser" disabled />
|
|
|
|
|
<el-input :value="workOrder?.applyUser || ''" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="设备编号">
|
|
|
|
|
<el-input v-model="workOrder.machineCode" disabled />
|
|
|
|
|
<el-input :value="workOrder?.machineCode || ''" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="设备名称">
|
|
|
|
|
<el-input v-model="workOrder.machineName" disabled />
|
|
|
|
|
<el-input :value="workOrder?.machineName || ''" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="申请时间">
|
|
|
|
|
<el-input v-model="workOrder.applyTime" disabled />
|
|
|
|
|
<el-input :value="workOrder?.applyTime || ''" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
@ -333,9 +333,9 @@ const form = reactive({ ...initFormData });
|
|
|
|
|
|
|
|
|
|
// 表单验证规则
|
|
|
|
|
const rules = reactive({
|
|
|
|
|
faultType: [{ required: true, message: '故障类型不能为空', trigger: 'change' }],
|
|
|
|
|
faultDescription: [{ required: true, message: '故障描述不能为空', trigger: 'blur' }],
|
|
|
|
|
repairType: [{ required: true, message: '维修类型不能为空', trigger: 'change' }],
|
|
|
|
|
faultType: [{ required: false, message: '故障类型不能为空', trigger: 'change' }],
|
|
|
|
|
faultDescription: [{ required: false, message: '故障描述不能为空', trigger: 'blur' }],
|
|
|
|
|
repairType: [{ required: false, message: '维修类型不能为空', trigger: 'change' }],
|
|
|
|
|
outsourcingId: [{ required: false, message: '外协单位不能为空', trigger: 'change' }],
|
|
|
|
|
repairer: [{ required: false, message: '维修人不能为空', trigger: 'blur' }],
|
|
|
|
|
checkedFault: [{ required: false, message: '检查后的故障判断不能为空', trigger: 'blur' }],
|
|
|
|
@ -377,14 +377,14 @@ const confirmButtonShow = computed(() => {
|
|
|
|
|
// 2. 或者工单状态为维修完成(2)且确认状态为待确认(0)
|
|
|
|
|
// 3. 且审批状态为审批成功(2) - 只有审批通过的工单才能进行确认
|
|
|
|
|
return routeParams.value.type === 'confirm' ||
|
|
|
|
|
(workOrder.value.billsStatus === '2' &&
|
|
|
|
|
workOrder.value.repairConfirm === '0' &&
|
|
|
|
|
workOrder.value.approveStatus === '2');
|
|
|
|
|
(workOrder.value?.billsStatus === '2' &&
|
|
|
|
|
workOrder.value?.repairConfirm === '0' &&
|
|
|
|
|
workOrder.value?.approveStatus === '2');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 是否为审批阶段
|
|
|
|
|
const isApprovalStage = computed(() => {
|
|
|
|
|
return routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1';
|
|
|
|
|
return routeParams.value.type === 'approval' && workOrder.value?.approveStatus === '1';
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 提交按钮显示控制逻辑
|
|
|
|
@ -392,7 +392,7 @@ const submitButtonShow = computed(() => {
|
|
|
|
|
return (
|
|
|
|
|
routeParams.value.type === 'add' ||
|
|
|
|
|
(routeParams.value.type === 'update' &&
|
|
|
|
|
workOrder.value.billsStatus &&
|
|
|
|
|
workOrder.value?.billsStatus &&
|
|
|
|
|
(workOrder.value.billsStatus === 'draft' || workOrder.value.billsStatus === 'cancel' || workOrder.value.billsStatus === 'back'))
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
@ -417,13 +417,8 @@ onMounted(async () => {
|
|
|
|
|
// 初始化表单数据
|
|
|
|
|
initializeFormData();
|
|
|
|
|
|
|
|
|
|
// 设置审批阶段的表单验证规则
|
|
|
|
|
if (routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1') {
|
|
|
|
|
rules.approveStatus = [{ required: true, message: '审批状态不能为空', trigger: 'change' }];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置外协单位验证规则
|
|
|
|
|
updateOutsourcingValidation();
|
|
|
|
|
// 动态设置表单验证规则
|
|
|
|
|
setDynamicValidationRules();
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('初始化失败:', error);
|
|
|
|
@ -453,10 +448,10 @@ const loadWorkOrderInfo = async () => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 || '');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 加载当前任务信息
|
|
|
|
@ -501,29 +496,25 @@ const loadCurrentTask = async () => {
|
|
|
|
|
// 初始化表单数据
|
|
|
|
|
const initializeFormData = () => {
|
|
|
|
|
// 基础信息从工单获取
|
|
|
|
|
form.repairInstanceId = workOrder.value.repairInstanceId;
|
|
|
|
|
form.repairInstanceId = workOrder.value?.repairInstanceId;
|
|
|
|
|
form.processStepOrder = currentStepOrder.value;
|
|
|
|
|
|
|
|
|
|
if (currentStepOrder.value === 1) {
|
|
|
|
|
// 第一步:故障报修,表单为空等待用户填写
|
|
|
|
|
form.faultType = workOrder.value.faultType;
|
|
|
|
|
form.faultDescription = workOrder.value.faultDescription;
|
|
|
|
|
form.designOperations = workOrder.value.designOperations;
|
|
|
|
|
form.repairType = workOrder.value.repairType;
|
|
|
|
|
form.outsourcingId = workOrder.value.outsourcingId;
|
|
|
|
|
} else {
|
|
|
|
|
// 第二步、第三步:从工单基础信息预填充
|
|
|
|
|
form.faultType = workOrder.value.faultType;
|
|
|
|
|
form.faultDescription = workOrder.value.faultDescription;
|
|
|
|
|
form.designOperations = workOrder.value.designOperations;
|
|
|
|
|
form.repairType = workOrder.value.repairType;
|
|
|
|
|
form.outsourcingId = workOrder.value.outsourcingId;
|
|
|
|
|
form.checkedFault = workOrder.value.checkedFault;
|
|
|
|
|
form.repairContent = workOrder.value.repairContent;
|
|
|
|
|
form.protectedMethod = workOrder.value.protectedMethod;
|
|
|
|
|
form.repairer = workOrder.value.repairer;
|
|
|
|
|
form.repairConfirm = workOrder.value.repairConfirm;
|
|
|
|
|
form.componentsPartsId = workOrder.value.componentsPartsId;
|
|
|
|
|
// 处理所有字段,确保没有undefined值
|
|
|
|
|
form.faultType = workOrder.value?.faultType || '';
|
|
|
|
|
form.faultDescription = workOrder.value?.faultDescription || '';
|
|
|
|
|
form.designOperations = workOrder.value?.designOperations || '';
|
|
|
|
|
form.repairType = workOrder.value?.repairType || '';
|
|
|
|
|
form.outsourcingId = workOrder.value?.outsourcingId || '';
|
|
|
|
|
form.checkedFault = workOrder.value?.checkedFault || '';
|
|
|
|
|
form.repairContent = workOrder.value?.repairContent || '';
|
|
|
|
|
form.protectedMethod = workOrder.value?.protectedMethod || '';
|
|
|
|
|
form.repairer = workOrder.value?.repairer || '';
|
|
|
|
|
form.repairConfirm = workOrder.value?.repairConfirm || '';
|
|
|
|
|
form.componentsPartsId = workOrder.value?.componentsPartsId || '';
|
|
|
|
|
|
|
|
|
|
// 如果是审批阶段,设置默认审批状态
|
|
|
|
|
if (routeParams.value.type === 'approval' && !form.approveStatus) {
|
|
|
|
|
form.approveStatus = undefined; // 保持未选择状态,让用户必须选择
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -605,76 +596,36 @@ const approvalVerifyOpen = async () => {
|
|
|
|
|
try {
|
|
|
|
|
const valid = await processFormRef.value.validate();
|
|
|
|
|
if (valid) {
|
|
|
|
|
// 检查审批状态
|
|
|
|
|
if (routeParams.value.type === 'approval' && !form.approveStatus) {
|
|
|
|
|
proxy?.$modal.msgError('请选择审批状态');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
await proxy?.$modal.confirm('是否确认提交审批?');
|
|
|
|
|
|
|
|
|
|
buttonLoading.value = true;
|
|
|
|
|
|
|
|
|
|
// 直接调用后端审批接口,后端会在同一事务中处理业务状态更新和工作流推进
|
|
|
|
|
const approveStatus = form.approveStatus;
|
|
|
|
|
const message = form.processHandleResolution || '';
|
|
|
|
|
|
|
|
|
|
// 准备工作流变量 - 符合Warm-Flow和submitVerify组件的期望格式
|
|
|
|
|
taskVariables.value = {
|
|
|
|
|
// 工作流变量 - 用于互斥网关条件判断
|
|
|
|
|
variables: {},
|
|
|
|
|
// 业务实体数据
|
|
|
|
|
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) {
|
|
|
|
|
// 将approveStatus转换为数字放在variables中,供Warm-Flow互斥网关使用
|
|
|
|
|
taskVariables.value.variables.approveStatus = parseInt(form.approveStatus);
|
|
|
|
|
// 同时在根级别设置字符串格式,兼容submitVerify组件
|
|
|
|
|
taskVariables.value.approveStatus = form.approveStatus;
|
|
|
|
|
console.log('设置审批状态变量:', parseInt(form.approveStatus));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果是确认阶段,设置确认结果变量
|
|
|
|
|
if (routeParams.value.type === 'confirm' && form.repairConfirm) {
|
|
|
|
|
// 确认通过传0,确认不通过传1
|
|
|
|
|
const repairConfirmValue = form.repairConfirm === '1' ? 0 : 1;
|
|
|
|
|
taskVariables.value.variables.repairConfirm = repairConfirmValue;
|
|
|
|
|
taskVariables.value.repairConfirm = repairConfirmValue.toString();
|
|
|
|
|
console.log('设置确认结果变量:', repairConfirmValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log('完整的工作流变量:', taskVariables.value);
|
|
|
|
|
|
|
|
|
|
// 直接使用传入的taskId进行审批
|
|
|
|
|
submitVerifyRef.value?.openDialog(routeParams.value.taskId);
|
|
|
|
|
await approveWorkOrder(form.repairInstanceId, approveStatus, message);
|
|
|
|
|
|
|
|
|
|
const statusText = approveStatus === '2' ? '通过' : '拒绝';
|
|
|
|
|
proxy?.$modal.msgSuccess(`审批${statusText}成功`);
|
|
|
|
|
|
|
|
|
|
// 关闭页面返回
|
|
|
|
|
goBack();
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
proxy?.$modal.msgError('表单验证失败,请检查输入项');
|
|
|
|
|
} catch (error: any) {
|
|
|
|
|
if (error !== 'cancel' && error !== 'close') {
|
|
|
|
|
console.error('审批失败:', error);
|
|
|
|
|
proxy?.$modal.msgError('审批失败:' + (error.message || '未知错误'));
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
buttonLoading.value = false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 提交回调
|
|
|
|
|
const submitCallback = async (approvalResult?: any) => {
|
|
|
|
|
try {
|
|
|
|
|
// 如果是审批类型,调用审批接口
|
|
|
|
|
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') {
|
|
|
|
|
if (routeParams.value.type === 'confirm') {
|
|
|
|
|
// 主管确认逻辑
|
|
|
|
|
const confirmResult = form.repairConfirm || '1'; // 默认确认通过
|
|
|
|
|
await confirmRepairResult(form.repairInstanceId, confirmResult);
|
|
|
|
@ -749,15 +700,61 @@ const getOutsourceList = async () => {
|
|
|
|
|
|
|
|
|
|
// 更新外协单位验证规则
|
|
|
|
|
const updateOutsourcingValidation = () => {
|
|
|
|
|
if (form.repairType === '2') {
|
|
|
|
|
// 维修类型为外协时,外协单位为必填
|
|
|
|
|
// 只有在非审批阶段且维修类型为外协时才设置为必填
|
|
|
|
|
if (routeParams.value.type !== 'approval' && form.repairType === '2') {
|
|
|
|
|
rules.outsourcingId = [{ required: true, message: '外协单位不能为空', trigger: 'change' }];
|
|
|
|
|
} else {
|
|
|
|
|
// 其他情况下,外协单位不是必填
|
|
|
|
|
rules.outsourcingId = [{ required: false, message: '外协单位不能为空', trigger: 'change' }];
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 动态设置表单验证规则
|
|
|
|
|
const setDynamicValidationRules = () => {
|
|
|
|
|
// 重置所有规则为非必填
|
|
|
|
|
Object.keys(rules).forEach(key => {
|
|
|
|
|
rules[key] = [{ required: false, message: rules[key][0].message, trigger: rules[key][0].trigger }];
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 根据页面类型和步骤设置验证规则
|
|
|
|
|
if (routeParams.value.type === 'approval') {
|
|
|
|
|
// 审批阶段只需要审批状态和处理意见
|
|
|
|
|
rules.approveStatus = [{ required: true, message: '审批状态不能为空', trigger: 'change' }];
|
|
|
|
|
if (needProcessResolution.value) {
|
|
|
|
|
rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }];
|
|
|
|
|
}
|
|
|
|
|
} else if (routeParams.value.type === 'confirm') {
|
|
|
|
|
// 确认阶段只需要确认结果和处理意见
|
|
|
|
|
rules.repairConfirm = [{ required: true, message: '维修结果不能为空', trigger: 'change' }];
|
|
|
|
|
rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }];
|
|
|
|
|
} else {
|
|
|
|
|
// 新增或编辑模式,根据当前步骤设置验证规则
|
|
|
|
|
if (currentStepOrder.value === 1) {
|
|
|
|
|
// 第一步:故障报修
|
|
|
|
|
rules.faultType = [{ required: true, message: '故障类型不能为空', trigger: 'change' }];
|
|
|
|
|
rules.faultDescription = [{ required: true, message: '故障描述不能为空', trigger: 'blur' }];
|
|
|
|
|
rules.repairType = [{ required: true, message: '维修类型不能为空', trigger: 'change' }];
|
|
|
|
|
} else if (currentStepOrder.value === 2) {
|
|
|
|
|
// 第二步:维修处理
|
|
|
|
|
rules.repairer = [{ required: true, message: '维修人不能为空', trigger: 'blur' }];
|
|
|
|
|
rules.checkedFault = [{ required: true, message: '检查后的故障判断不能为空', trigger: 'blur' }];
|
|
|
|
|
rules.protectedMethod = [{ required: true, message: '维修措施不能为空', trigger: 'blur' }];
|
|
|
|
|
rules.repairContent = [{ required: true, message: '维修内容不能为空', trigger: 'blur' }];
|
|
|
|
|
if (needProcessResolution.value) {
|
|
|
|
|
rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }];
|
|
|
|
|
}
|
|
|
|
|
} else if (currentStepOrder.value === 3) {
|
|
|
|
|
// 第三步:维修确认
|
|
|
|
|
rules.repairConfirm = [{ required: true, message: '维修结果不能为空', trigger: 'change' }];
|
|
|
|
|
if (needProcessResolution.value) {
|
|
|
|
|
rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新外协单位验证规则
|
|
|
|
|
updateOutsourcingValidation();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 工具函数
|
|
|
|
|
const getStatusText = (status: string) => {
|
|
|
|
|
const statusMap = {
|
|
|
|
|