|
|
|
@ -25,6 +25,13 @@
|
|
|
|
|
@click="approvalVerifyOpen">
|
|
|
|
|
{{ currentStepName }}
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="confirmButtonShow"
|
|
|
|
|
:loading="buttonLoading"
|
|
|
|
|
type="success"
|
|
|
|
|
@click="handleConfirm">
|
|
|
|
|
主管确认
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="workOrder?.wfDefinitionId"
|
|
|
|
|
type="primary"
|
|
|
|
@ -107,7 +114,10 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="维修类型" prop="repairType">
|
|
|
|
|
<el-select v-model="form.repairType" placeholder="请选择维修类型">
|
|
|
|
|
<el-select
|
|
|
|
|
v-model="form.repairType"
|
|
|
|
|
placeholder="请选择维修类型"
|
|
|
|
|
@change="updateOutsourcingValidation">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in fault_repair_type"
|
|
|
|
|
:key="dict.value"
|
|
|
|
@ -224,13 +234,28 @@
|
|
|
|
|
</el-col>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<!-- 审批状态选择:仅在审批阶段显示 -->
|
|
|
|
|
<el-col :span="8" v-if="isApprovalStage">
|
|
|
|
|
<el-form-item label="审批状态" prop="approveStatus">
|
|
|
|
|
<el-select v-model="form.approveStatus" placeholder="请选择审批状态">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in dms_approve_status"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.label"
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
:disabled="dict.value === '1'">
|
|
|
|
|
</el-option>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
|
|
|
|
|
<!-- 处理意见:除第一步外都需要 -->
|
|
|
|
|
<el-col :span="24" v-if="needProcessResolution">
|
|
|
|
|
<el-form-item label="处理意见" prop="processHandleResolution">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="form.processHandleResolution"
|
|
|
|
|
type="textarea"
|
|
|
|
|
:rows="3"
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="form.processHandleResolution"
|
|
|
|
|
type="textarea"
|
|
|
|
|
:rows="3"
|
|
|
|
|
placeholder="请输入处理意见" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
@ -252,17 +277,18 @@
|
|
|
|
|
|
|
|
|
|
<script setup name="FaultWorkOrderProcess" lang="ts">
|
|
|
|
|
// 导入相关模块
|
|
|
|
|
import { ref, reactive, computed, onMounted, getCurrentInstance, toRefs } from 'vue';
|
|
|
|
|
import { ref, reactive, computed, onMounted, getCurrentInstance, toRefs, watch } from 'vue';
|
|
|
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
|
|
|
import { getDmsBillsFaultInstance } 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 SubmitVerify from '@/components/Process/submitVerify.vue';
|
|
|
|
|
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
|
|
|
|
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
const { fault_repair_type, activity_fault_type, fault_repair_confirm } = toRefs<any>(proxy?.useDict('fault_repair_type', 'activity_fault_type', 'fault_repair_confirm'));
|
|
|
|
|
const { fault_repair_type, activity_fault_type, fault_repair_confirm, dms_approve_status } = toRefs<any>(proxy?.useDict('fault_repair_type', 'activity_fault_type', 'fault_repair_confirm', 'dms_approve_status'));
|
|
|
|
|
const route = useRoute();
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
|
|
|
|
@ -272,6 +298,7 @@ const buttonLoading = ref(false);
|
|
|
|
|
const routeParams = ref<Record<string, any>>({});
|
|
|
|
|
const workOrder = ref<any>({});
|
|
|
|
|
const workOrderStatusText = ref('');
|
|
|
|
|
const outsourceList = ref<any[]>([]);
|
|
|
|
|
|
|
|
|
|
// 表单相关
|
|
|
|
|
const processFormRef = ref<ElFormInstance>();
|
|
|
|
@ -297,8 +324,9 @@ const initFormData = {
|
|
|
|
|
repairer: undefined,
|
|
|
|
|
repairConfirm: undefined,
|
|
|
|
|
componentsPartsId: undefined,
|
|
|
|
|
processHandleResolution: undefined,
|
|
|
|
|
processStepOrder: undefined
|
|
|
|
|
processHandleResolution: undefined,
|
|
|
|
|
processStepOrder: undefined,
|
|
|
|
|
approveStatus: undefined
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const form = reactive({ ...initFormData });
|
|
|
|
@ -308,12 +336,14 @@ const rules = reactive({
|
|
|
|
|
faultType: [{ required: true, message: '故障类型不能为空', trigger: 'change' }],
|
|
|
|
|
faultDescription: [{ required: true, 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' }]
|
|
|
|
|
processHandleResolution: [{ required: false, message: '处理意见不能为空', trigger: 'blur' }],
|
|
|
|
|
approveStatus: [{ required: false, message: '审批状态不能为空', trigger: 'change' }]
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 计算属性
|
|
|
|
@ -341,6 +371,22 @@ const approvalButtonShow = computed(() => {
|
|
|
|
|
return routeParams.value.type === 'approval' && currentTask.value;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const confirmButtonShow = computed(() => {
|
|
|
|
|
// 显示确认按钮的条件:
|
|
|
|
|
// 1. 页面类型是confirm
|
|
|
|
|
// 2. 或者工单状态为维修完成(2)且确认状态为待确认(0)
|
|
|
|
|
// 3. 且审批状态为审批成功(2) - 只有审批通过的工单才能进行确认
|
|
|
|
|
return routeParams.value.type === 'confirm' ||
|
|
|
|
|
(workOrder.value.billsStatus === '2' &&
|
|
|
|
|
workOrder.value.repairConfirm === '0' &&
|
|
|
|
|
workOrder.value.approveStatus === '2');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 是否为审批阶段
|
|
|
|
|
const isApprovalStage = computed(() => {
|
|
|
|
|
return routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1';
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 提交按钮显示控制逻辑
|
|
|
|
|
const submitButtonShow = computed(() => {
|
|
|
|
|
return (
|
|
|
|
@ -355,19 +401,30 @@ const submitButtonShow = computed(() => {
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
routeParams.value = route.query;
|
|
|
|
|
loading.value = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 获取工单信息
|
|
|
|
|
await loadWorkOrderInfo();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取外协单位列表
|
|
|
|
|
await getOutsourceList();
|
|
|
|
|
|
|
|
|
|
// 获取当前任务信息
|
|
|
|
|
if (routeParams.value.type === 'approval') {
|
|
|
|
|
await loadCurrentTask();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化表单数据
|
|
|
|
|
initializeFormData();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化表单数据
|
|
|
|
|
initializeFormData();
|
|
|
|
|
|
|
|
|
|
// 设置审批阶段的表单验证规则
|
|
|
|
|
if (routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1') {
|
|
|
|
|
rules.approveStatus = [{ required: true, message: '审批状态不能为空', trigger: 'change' }];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置外协单位验证规则
|
|
|
|
|
updateOutsourcingValidation();
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('初始化失败:', error);
|
|
|
|
|
proxy?.$modal.msgError('加载数据失败');
|
|
|
|
@ -376,6 +433,15 @@ onMounted(async () => {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 监听维修类型变化,动态更新外协单位验证规则
|
|
|
|
|
watch(() => form.repairType, (newValue) => {
|
|
|
|
|
updateOutsourcingValidation();
|
|
|
|
|
// 如果从外协类型改为其他类型,清空外协单位选择
|
|
|
|
|
if (newValue !== '2') {
|
|
|
|
|
form.outsourcingId = undefined;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 加载工单信息
|
|
|
|
|
const loadWorkOrderInfo = async () => {
|
|
|
|
|
// 从query参数获取businessId
|
|
|
|
@ -539,8 +605,15 @@ const approvalVerifyOpen = async () => {
|
|
|
|
|
try {
|
|
|
|
|
const valid = await processFormRef.value.validate();
|
|
|
|
|
if (valid) {
|
|
|
|
|
// 准备任务变量
|
|
|
|
|
// 检查审批状态
|
|
|
|
|
if (routeParams.value.type === 'approval' && !form.approveStatus) {
|
|
|
|
|
proxy?.$modal.msgError('请选择审批状态');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 准备工作流变量 - 确保变量结构符合SubmitVerify和Warm-Flow要求
|
|
|
|
|
taskVariables.value = {
|
|
|
|
|
// 业务实体数据
|
|
|
|
|
entity: {
|
|
|
|
|
repairInstanceId: form.repairInstanceId,
|
|
|
|
|
faultType: form.faultType,
|
|
|
|
@ -559,6 +632,23 @@ const approvalVerifyOpen = async () => {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 如果是审批阶段,设置跳转条件变量
|
|
|
|
|
if (routeParams.value.type === 'approval' && form.approveStatus) {
|
|
|
|
|
// 直接在taskVariables根级别设置approveStatus - 这是SubmitVerify期望的格式
|
|
|
|
|
taskVariables.value.approveStatus = form.approveStatus;
|
|
|
|
|
console.log('设置审批状态变量:', form.approveStatus);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果是确认阶段,设置确认结果变量
|
|
|
|
|
if (routeParams.value.type === 'confirm' && form.repairConfirm) {
|
|
|
|
|
// 确认通过传0,确认不通过传1
|
|
|
|
|
const repairConfirmValue = form.repairConfirm === '1' ? '0' : '1';
|
|
|
|
|
taskVariables.value.repairConfirm = repairConfirmValue;
|
|
|
|
|
console.log('设置确认结果变量:', repairConfirmValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log('完整的工作流变量:', taskVariables.value);
|
|
|
|
|
|
|
|
|
|
// 直接使用传入的taskId进行审批
|
|
|
|
|
submitVerifyRef.value?.openDialog(routeParams.value.taskId);
|
|
|
|
|
}
|
|
|
|
@ -568,8 +658,23 @@ const approvalVerifyOpen = async () => {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 提交回调
|
|
|
|
|
const submitCallback = async () => {
|
|
|
|
|
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') {
|
|
|
|
|
// 主管确认逻辑
|
|
|
|
|
const confirmResult = form.repairConfirm || '1'; // 默认确认通过
|
|
|
|
|
await confirmRepairResult(form.repairInstanceId, confirmResult);
|
|
|
|
|
proxy?.$modal.msgSuccess('确认完成');
|
|
|
|
|
} else {
|
|
|
|
|
// 保存工单实例活动记录
|
|
|
|
|
await addDmsFaultInstanceActivity({
|
|
|
|
|
repairInstanceId: form.repairInstanceId,
|
|
|
|
@ -590,12 +695,29 @@ const submitCallback = async () => {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
proxy?.$modal.msgSuccess(`${currentStepName.value}完成`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 关闭页面返回
|
|
|
|
|
goBack();
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('保存业务数据失败:', error);
|
|
|
|
|
proxy?.$modal.msgError('保存业务数据失败');
|
|
|
|
|
} catch (error: any) {
|
|
|
|
|
console.error('操作失败:', error);
|
|
|
|
|
proxy?.$modal.msgError('操作失败:' + (error.message || '未知错误'));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 主管确认处理
|
|
|
|
|
const handleConfirm = async () => {
|
|
|
|
|
try {
|
|
|
|
|
// 设置确认结果
|
|
|
|
|
form.repairConfirm = '1'; // 1表示确认通过
|
|
|
|
|
|
|
|
|
|
// 调用审批处理方法(实际上是工作流处理)
|
|
|
|
|
await approvalVerifyOpen();
|
|
|
|
|
} catch (error: any) {
|
|
|
|
|
if (error !== 'cancel' && error !== 'close') {
|
|
|
|
|
console.error('确认失败:', error);
|
|
|
|
|
proxy?.$modal.msgError('确认失败:' + (error.message || '未知错误'));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -610,6 +732,27 @@ const goBack = () => {
|
|
|
|
|
router.go(-1);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 获取外协单位列表
|
|
|
|
|
const getOutsourceList = async () => {
|
|
|
|
|
try {
|
|
|
|
|
const res = await getDmsBaseOutsourcingInfoList(null);
|
|
|
|
|
outsourceList.value = res.data;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('获取外协单位列表失败:', error);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 更新外协单位验证规则
|
|
|
|
|
const updateOutsourcingValidation = () => {
|
|
|
|
|
if (form.repairType === '2') {
|
|
|
|
|
// 维修类型为外协时,外协单位为必填
|
|
|
|
|
rules.outsourcingId = [{ required: true, message: '外协单位不能为空', trigger: 'change' }];
|
|
|
|
|
} else {
|
|
|
|
|
// 其他情况下,外协单位不是必填
|
|
|
|
|
rules.outsourcingId = [{ required: false, message: '外协单位不能为空', trigger: 'change' }];
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 工具函数
|
|
|
|
|
const getStatusText = (status: string) => {
|
|
|
|
|
const statusMap = {
|
|
|
|
|