Merge remote-tracking branch 'origin/master'

master
夜笙歌 6 months ago
commit 1f5f365c45

@ -92,3 +92,39 @@ export function updateWfDefinitionIdById (repairInstanceId: string | number, wfD
} }
}); });
} }
/**
*
* @param repairInstanceId ID
* @param approveStatus 2-3-
* @param message
*/
export function approveWorkOrder(repairInstanceId: string | number, approveStatus: string, message?: string) {
return request({
url: '/dms/dmsBillsFaultInstance/approve',
method: 'post',
params: {
repairInstanceId,
approveStatus,
message
}
});
}
/**
*
* @param repairInstanceId ID
* @param confirmResult 1-
* @param confirmUser
*/
export function confirmRepairResult(repairInstanceId: string | number, confirmResult: string, confirmUser?: string) {
return request({
url: '/dms/dmsBillsFaultInstance/confirm',
method: 'post',
params: {
repairInstanceId,
confirmResult,
confirmUser
}
});
}

@ -52,3 +52,17 @@ export interface TaskOperationBo {
//意见或备注信息(可选) //意见或备注信息(可选)
message?: string; message?: string;
} }
// 工作流任务完成参数
export interface CompleteTaskBo {
//任务ID必填
taskId: string | number;
//处理意见
message?: string;
//工作流变量
variables?: Record<string, any>;
//跳转条件(互斥网关需要)
approveStatus?: string;
//业务实体数据
entity?: Record<string, any>;
}

@ -66,9 +66,11 @@
<el-option v-for="dict in bills_status" :key="dict.value" :label="dict.label" :value="dict.value"/> <el-option v-for="dict in bills_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="审批状态" prop="approveStatus"> <el-form-item label="审批状态" prop="approveStatus">
<el-input v-model="queryParams.approveStatus" placeholder="请输入审批状态" clearable @keyup.enter="handleQuery" /> <el-select v-model="queryParams.approveStatus" placeholder="请选择审批状态" clearable >
</el-form-item>--> <el-option v-for="dict in dms_approve_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="确认状态" prop="repairConfirm"> <el-form-item label="确认状态" prop="repairConfirm">
<el-select v-model="queryParams.repairConfirm" placeholder="请选择确认状态" clearable > <el-select v-model="queryParams.repairConfirm" placeholder="请选择确认状态" clearable >
<el-option v-for="dict in repair_confirm" :key="dict.value" :label="dict.label" :value="dict.value"/> <el-option v-for="dict in repair_confirm" :key="dict.value" :label="dict.label" :value="dict.value"/>
@ -153,7 +155,11 @@
<dict-tag :options="bills_status" :value="scope.row.billsStatus"/> <dict-tag :options="bills_status" :value="scope.row.billsStatus"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="审批状态" align="center" prop="approveStatus" v-if="columns[14].visible"/> <el-table-column label="审批状态" align="center" prop="approveStatus" v-if="columns[14].visible">
<template #default="scope">
<dict-tag :options="dms_approve_status" :value="scope.row.approveStatus"/>
</template>
</el-table-column>
<el-table-column label="确认状态" align="center" prop="repairConfirm" v-if="columns[15].visible"> <el-table-column label="确认状态" align="center" prop="repairConfirm" v-if="columns[15].visible">
<template #default="scope"> <template #default="scope">
<dict-tag :options="repair_confirm" :value="scope.row.repairConfirm"/> <dict-tag :options="repair_confirm" :value="scope.row.repairConfirm"/>
@ -174,6 +180,16 @@
</el-button> </el-button>
</el-tooltip> </el-tooltip>
<!-- 处理工单按钮根据工单状态跳转到相应的处理页面 -->
<el-tooltip content="处理工单" placement="top" v-if="needProcessButton(scope.row)">
<el-button link type="primary" icon="Operation" @click="handleProcess(scope.row)"></el-button>
</el-tooltip>
<!-- 查看工单进度按钮 -->
<el-tooltip content="查看进度" placement="top" v-if="scope.row.wfDefinitionId">
<el-button link type="info" icon="View" @click="handleWorkflowProgress(scope.row)"></el-button>
</el-tooltip>
<el-tooltip content="修改" placement="top"> <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dms:dmsBillsFaultInstance:edit']"></el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dms:dmsBillsFaultInstance:edit']"></el-button>
</el-tooltip> </el-tooltip>
@ -324,7 +340,7 @@
</template> </template>
<script setup name="DmsBillsFaultInstance" lang="ts"> <script setup name="DmsBillsFaultInstance" lang="ts">
import { listDmsBillsFaultInstance, getDmsBillsFaultInstance, delDmsBillsFaultInstance, addDmsBillsFaultInstance, updateDmsBillsFaultInstance, updateWfDefinitionIdById } from '@/api/dms/dmsBillsFaultInstance'; import { listDmsBillsFaultInstance, getDmsBillsFaultInstance, delDmsBillsFaultInstance, addDmsBillsFaultInstance, updateDmsBillsFaultInstance, updateWfDefinitionIdById, approveWorkOrder, confirmRepairResult } from '@/api/dms/dmsBillsFaultInstance';
import { DmsBillsFaultInstanceVO, DmsBillsFaultInstanceQuery, DmsBillsFaultInstanceForm } from '@/api/dms/dmsBillsFaultInstance/types'; import { DmsBillsFaultInstanceVO, DmsBillsFaultInstanceQuery, DmsBillsFaultInstanceForm } from '@/api/dms/dmsBillsFaultInstance/types';
import {getDmsBaseMachineInfoList} from "@/api/dms/dmsBaseMachineInfo"; import {getDmsBaseMachineInfoList} from "@/api/dms/dmsBaseMachineInfo";
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
@ -332,7 +348,7 @@ import { startWorkFlow } from '@/api/workflow/task'
import SubmitVerify from '@/components/Process/submitVerify.vue' import SubmitVerify from '@/components/Process/submitVerify.vue'
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { repair_confirm, active_flag, fault_source_type, bills_status, instance_type } = toRefs<any>(proxy?.useDict('repair_confirm', 'active_flag', 'fault_source_type', 'bills_status', 'instance_type')); const { repair_confirm, active_flag, fault_source_type, bills_status, instance_type, dms_approve_status } = toRefs<any>(proxy?.useDict('repair_confirm', 'active_flag', 'fault_source_type', 'bills_status', 'instance_type', 'dms_approve_status'));
const dmsBillsFaultInstanceList = ref<DmsBillsFaultInstanceVO[]>([]); const dmsBillsFaultInstanceList = ref<DmsBillsFaultInstanceVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
@ -658,12 +674,48 @@ const submitCallback = async () => {
// //
await getList(); await getList();
proxy?.$modal.msgSuccess('工单创建节点处理完成,工作流已流转到下一步'); proxy?.$modal.msgSuccess('工单创建节点处理完成,工作流已流转到下一步');
} catch (error) { } catch (error: any) {
console.error('刷新列表失败:', error); console.error('刷新列表失败:', error);
proxy?.$modal.msgError('刷新列表失败'); proxy?.$modal.msgError('刷新列表失败');
} }
}; };
//
const needProcessButton = (row: DmsBillsFaultInstanceVO) => {
// (1)
if (row.approveStatus === '1') {
return true;
}
// (2)(0)(2)
if (row.billsStatus === '2' && row.repairConfirm === '0' && row.approveStatus === '2') {
return true;
}
return false;
};
// dmsFaultInstanceActivity
const handleProcess = (row: DmsBillsFaultInstanceVO) => {
let processType = '';
//
if (row.approveStatus === '1') {
processType = 'approval'; //
} else if (row.billsStatus === '2' && row.repairConfirm === '0' && row.approveStatus === '2') {
processType = 'confirm'; //
}
if (processType) {
router.push({
path: '/dms/dmsFaultInstanceActivity',
query: {
type: processType,
id: row.repairInstanceId,
taskId: row.wfDefinitionId
}
});
}
};
onMounted(() => { onMounted(() => {
getDeviceList(); getDeviceList();
getList(); getList();

@ -25,6 +25,13 @@
@click="approvalVerifyOpen"> @click="approvalVerifyOpen">
{{ currentStepName }} {{ currentStepName }}
</el-button> </el-button>
<el-button
v-if="confirmButtonShow"
:loading="buttonLoading"
type="success"
@click="handleConfirm">
主管确认
</el-button>
<el-button <el-button
v-if="workOrder?.wfDefinitionId" v-if="workOrder?.wfDefinitionId"
type="primary" type="primary"
@ -107,7 +114,10 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="维修类型" prop="repairType"> <el-form-item label="维修类型" prop="repairType">
<el-select v-model="form.repairType" placeholder="请选择维修类型"> <el-select
v-model="form.repairType"
placeholder="请选择维修类型"
@change="updateOutsourcingValidation">
<el-option <el-option
v-for="dict in fault_repair_type" v-for="dict in fault_repair_type"
:key="dict.value" :key="dict.value"
@ -224,6 +234,21 @@
</el-col> </el-col>
</template> </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-col :span="24" v-if="needProcessResolution">
<el-form-item label="处理意见" prop="processHandleResolution"> <el-form-item label="处理意见" prop="processHandleResolution">
@ -252,17 +277,18 @@
<script setup name="FaultWorkOrderProcess" lang="ts"> <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 { 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 { addDmsFaultInstanceActivity } from '@/api/dms/dmsFaultInstanceActivity';
import { pageByTaskWait } from '@/api/workflow/task'; import { pageByTaskWait } from '@/api/workflow/task';
import { getCurrentDateTime } from '@/utils/dateUtils'; import { getCurrentDateTime } from '@/utils/dateUtils';
import { getDmsBaseOutsourcingInfoList } from '@/api/dms/dmsBaseOutsourcingInfo';
import SubmitVerify from '@/components/Process/submitVerify.vue'; import SubmitVerify from '@/components/Process/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;
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 route = useRoute();
const router = useRouter(); const router = useRouter();
@ -272,6 +298,7 @@ const buttonLoading = ref(false);
const routeParams = ref<Record<string, any>>({}); 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 processFormRef = ref<ElFormInstance>(); const processFormRef = ref<ElFormInstance>();
@ -298,7 +325,8 @@ const initFormData = {
repairConfirm: undefined, repairConfirm: undefined,
componentsPartsId: undefined, componentsPartsId: undefined,
processHandleResolution: undefined, processHandleResolution: undefined,
processStepOrder: undefined processStepOrder: undefined,
approveStatus: undefined
}; };
const form = reactive({ ...initFormData }); const form = reactive({ ...initFormData });
@ -308,12 +336,14 @@ const rules = reactive({
faultType: [{ required: true, message: '故障类型不能为空', trigger: 'change' }], faultType: [{ required: true, message: '故障类型不能为空', trigger: 'change' }],
faultDescription: [{ required: true, message: '故障描述不能为空', trigger: 'blur' }], faultDescription: [{ required: true, message: '故障描述不能为空', trigger: 'blur' }],
repairType: [{ required: true, message: '维修类型不能为空', trigger: 'change' }], repairType: [{ required: true, message: '维修类型不能为空', trigger: 'change' }],
outsourcingId: [{ required: false, message: '外协单位不能为空', trigger: 'change' }],
repairer: [{ required: false, message: '维修人不能为空', trigger: 'blur' }], repairer: [{ required: false, message: '维修人不能为空', trigger: 'blur' }],
checkedFault: [{ required: false, message: '检查后的故障判断不能为空', trigger: 'blur' }], checkedFault: [{ required: false, message: '检查后的故障判断不能为空', trigger: 'blur' }],
protectedMethod: [{ required: false, message: '维修措施不能为空', trigger: 'blur' }], protectedMethod: [{ required: false, message: '维修措施不能为空', trigger: 'blur' }],
repairContent: [{ required: false, message: '维修内容不能为空', trigger: 'blur' }], repairContent: [{ required: false, message: '维修内容不能为空', trigger: 'blur' }],
repairConfirm: [{ required: false, message: '维修结果不能为空', trigger: 'change' }], 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; 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(() => { const submitButtonShow = computed(() => {
return ( return (
@ -360,6 +406,9 @@ onMounted(async () => {
// //
await loadWorkOrderInfo(); await loadWorkOrderInfo();
//
await getOutsourceList();
// //
if (routeParams.value.type === 'approval') { if (routeParams.value.type === 'approval') {
await loadCurrentTask(); await loadCurrentTask();
@ -368,6 +417,14 @@ onMounted(async () => {
// //
initializeFormData(); initializeFormData();
//
if (routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1') {
rules.approveStatus = [{ required: true, message: '审批状态不能为空', trigger: 'change' }];
}
//
updateOutsourcingValidation();
} catch (error) { } catch (error) {
console.error('初始化失败:', error); console.error('初始化失败:', error);
proxy?.$modal.msgError('加载数据失败'); proxy?.$modal.msgError('加载数据失败');
@ -376,6 +433,15 @@ onMounted(async () => {
} }
}); });
//
watch(() => form.repairType, (newValue) => {
updateOutsourcingValidation();
//
if (newValue !== '2') {
form.outsourcingId = undefined;
}
});
// //
const loadWorkOrderInfo = async () => { const loadWorkOrderInfo = async () => {
// querybusinessId // querybusinessId
@ -539,8 +605,15 @@ const approvalVerifyOpen = async () => {
try { try {
const valid = await processFormRef.value.validate(); const valid = await processFormRef.value.validate();
if (valid) { if (valid) {
// //
if (routeParams.value.type === 'approval' && !form.approveStatus) {
proxy?.$modal.msgError('请选择审批状态');
return;
}
// - SubmitVerifyWarm-Flow
taskVariables.value = { taskVariables.value = {
//
entity: { entity: {
repairInstanceId: form.repairInstanceId, repairInstanceId: form.repairInstanceId,
faultType: form.faultType, faultType: form.faultType,
@ -559,6 +632,23 @@ const approvalVerifyOpen = async () => {
} }
}; };
//
if (routeParams.value.type === 'approval' && form.approveStatus) {
// taskVariablesapproveStatus - SubmitVerify
taskVariables.value.approveStatus = form.approveStatus;
console.log('设置审批状态变量:', form.approveStatus);
}
//
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);
// 使taskId // 使taskId
submitVerifyRef.value?.openDialog(routeParams.value.taskId); submitVerifyRef.value?.openDialog(routeParams.value.taskId);
} }
@ -568,8 +658,23 @@ const approvalVerifyOpen = async () => {
}; };
// //
const submitCallback = async () => { const submitCallback = async (approvalResult?: any) => {
try { 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({ await addDmsFaultInstanceActivity({
repairInstanceId: form.repairInstanceId, repairInstanceId: form.repairInstanceId,
@ -590,12 +695,29 @@ const submitCallback = async () => {
}); });
proxy?.$modal.msgSuccess(`${currentStepName.value}完成`); proxy?.$modal.msgSuccess(`${currentStepName.value}完成`);
}
// //
goBack(); goBack();
} catch (error) { } catch (error: any) {
console.error('保存业务数据失败:', error); console.error('操作失败:', error);
proxy?.$modal.msgError('保存业务数据失败'); 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); 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 getStatusText = (status: string) => {
const statusMap = { const statusMap = {

Loading…
Cancel
Save