|
|
|
|
<template>
|
|
|
|
|
<div class="p-2">
|
|
|
|
|
<!-- 操作按钮区域 -->
|
|
|
|
|
<el-card shadow="never">
|
|
|
|
|
<div style="display: flex; justify-content: space-between">
|
|
|
|
|
<div>
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="approvalButtonShow"
|
|
|
|
|
:loading="buttonLoading"
|
|
|
|
|
type="primary"
|
|
|
|
|
@click="approvalVerifyOpen">
|
|
|
|
|
{{ currentStepName }}
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="workOrder?.wfDefinitionId"
|
|
|
|
|
type="primary"
|
|
|
|
|
@click="handleApprovalRecord">
|
|
|
|
|
流程进度
|
|
|
|
|
</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
<el-button @click="goBack()">返回</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<!-- 工单基本信息区域 -->
|
|
|
|
|
<el-card shadow="never" class="mb-[10px]">
|
|
|
|
|
<h4 class="form-header">工单基本信息</h4>
|
|
|
|
|
<el-form label-width="120px">
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="工单编号">
|
|
|
|
|
<el-input v-model="workOrder.billsLubeCode" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="工单状态">
|
|
|
|
|
<el-input v-model="workOrderStatusText" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="申请人">
|
|
|
|
|
<el-input v-model="workOrder.createBy" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<!-- 当前步骤处理区域 -->
|
|
|
|
|
<el-card shadow="never">
|
|
|
|
|
<h4 class="form-header">{{ currentStepTitle }}</h4>
|
|
|
|
|
<el-form
|
|
|
|
|
ref="processFormRef"
|
|
|
|
|
v-loading="loading"
|
|
|
|
|
:disabled="routeParams.type === 'view'"
|
|
|
|
|
:model="form"
|
|
|
|
|
:rules="rules"
|
|
|
|
|
label-width="120px">
|
|
|
|
|
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="润滑级别" prop="lubeLevel">
|
|
|
|
|
<el-select v-model="form.lubeLevel" placeholder="请选择润滑级别">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in lube_level"
|
|
|
|
|
: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="lubeGroup">
|
|
|
|
|
<el-input v-model="form.lubeGroup" placeholder="请输入润滑组别" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item label="润滑负责人" prop="lubeSupervisor">
|
|
|
|
|
<el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人" />
|
|
|
|
|
</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"
|
|
|
|
|
placeholder="请输入处理意见" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-form>
|
|
|
|
|
</el-card>
|
|
|
|
|
|
|
|
|
|
<!-- 审批组件 -->
|
|
|
|
|
<submitVerify
|
|
|
|
|
ref="submitVerifyRef"
|
|
|
|
|
:task-variables="taskVariables"
|
|
|
|
|
@submit-callback="submitCallback" />
|
|
|
|
|
|
|
|
|
|
<!-- 审批记录组件 -->
|
|
|
|
|
<approvalRecord ref="approvalRecordRef" />
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<script setup name="LubeWorkOrderProcess" lang="ts">
|
|
|
|
|
// 导入相关模块
|
|
|
|
|
import { getDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
|
|
|
|
|
import { addDmsBillsLubeInstanceActivity } from '@/api/dms/dmsBillsLubeInstanceActivity';
|
|
|
|
|
import { pageByTaskWait } from '@/api/workflow/task';
|
|
|
|
|
import SubmitVerify from '@/components/Process/submitVerify.vue';
|
|
|
|
|
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
|
|
|
|
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
const { lube_level } = toRefs<any>(proxy?.useDict('lube_level'));
|
|
|
|
|
const route = useRoute();
|
|
|
|
|
|
|
|
|
|
// 基础数据
|
|
|
|
|
const loading = ref(true);
|
|
|
|
|
const buttonLoading = ref(false);
|
|
|
|
|
const routeParams = ref<Record<string, any>>({});
|
|
|
|
|
const workOrder = ref<any>({});
|
|
|
|
|
const workOrderStatusText = ref('');
|
|
|
|
|
|
|
|
|
|
// 表单相关
|
|
|
|
|
const processFormRef = ref<ElFormInstance>();
|
|
|
|
|
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
|
|
|
|
|
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
|
|
|
|
|
|
|
|
|
|
// 当前任务信息
|
|
|
|
|
const currentTask = ref<any>(null);
|
|
|
|
|
const currentStepOrder = ref(1);
|
|
|
|
|
const taskVariables = ref<any>({});
|
|
|
|
|
|
|
|
|
|
// 表单数据
|
|
|
|
|
const initFormData = {
|
|
|
|
|
lubeInstanceId: undefined,
|
|
|
|
|
lubeLevel: undefined,
|
|
|
|
|
lubeGroup: undefined,
|
|
|
|
|
lubeSupervisor: undefined,
|
|
|
|
|
processHandleResolution: undefined,
|
|
|
|
|
processStepOrder: undefined
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const form = reactive({ ...initFormData });
|
|
|
|
|
|
|
|
|
|
// 表单验证规则
|
|
|
|
|
const rules = reactive({
|
|
|
|
|
lubeLevel: [{ required: true, message: '润滑级别不能为空', trigger: 'change' }],
|
|
|
|
|
lubeGroup: [{ required: true, message: '润滑组别不能为空', trigger: 'blur' }],
|
|
|
|
|
lubeSupervisor: [{ required: true, message: '润滑负责人不能为空', trigger: 'blur' }],
|
|
|
|
|
processHandleResolution: [{ required: false, message: '处理意见不能为空', trigger: 'blur' }]
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 计算属性
|
|
|
|
|
const needProcessResolution = computed(() => currentStepOrder.value > 1);
|
|
|
|
|
|
|
|
|
|
const currentStepName = computed(() => {
|
|
|
|
|
const stepNames = {
|
|
|
|
|
1: '工单创建',
|
|
|
|
|
2: '工单处理',
|
|
|
|
|
3: '工单完成'
|
|
|
|
|
};
|
|
|
|
|
return stepNames[currentStepOrder.value] || '处理工单';
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const currentStepTitle = computed(() => {
|
|
|
|
|
const stepTitles = {
|
|
|
|
|
1: '步骤1:工单创建(要求参数)',
|
|
|
|
|
2: '步骤2:工单处理(实际参数)',
|
|
|
|
|
3: '步骤3:工单完成确认'
|
|
|
|
|
};
|
|
|
|
|
return stepTitles[currentStepOrder.value] || '工单处理';
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const approvalButtonShow = computed(() => {
|
|
|
|
|
return routeParams.value.type === 'approval' && currentTask.value;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 初始化
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
routeParams.value = route.query;
|
|
|
|
|
loading.value = true;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 获取工单信息
|
|
|
|
|
await loadWorkOrderInfo();
|
|
|
|
|
|
|
|
|
|
// 获取当前任务信息
|
|
|
|
|
if (routeParams.value.type === 'approval') {
|
|
|
|
|
await loadCurrentTask();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化表单数据
|
|
|
|
|
initializeFormData();
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('初始化失败:', error);
|
|
|
|
|
proxy?.$modal.msgError('加载数据失败');
|
|
|
|
|
} finally {
|
|
|
|
|
loading.value = false;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 加载工单信息
|
|
|
|
|
const loadWorkOrderInfo = async () => {
|
|
|
|
|
// 从query参数获取businessId
|
|
|
|
|
const businessId = routeParams.value.id;
|
|
|
|
|
|
|
|
|
|
if (!businessId) {
|
|
|
|
|
proxy?.$modal.msgError('缺少工单ID参数');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const res = await getDmsBillsLubeInstance(businessId);
|
|
|
|
|
workOrder.value = res.data;
|
|
|
|
|
|
|
|
|
|
// 设置状态显示文本
|
|
|
|
|
workOrderStatusText.value = getStatusText(workOrder.value.status);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 加载当前任务信息
|
|
|
|
|
const loadCurrentTask = async () => {
|
|
|
|
|
// 从query参数获取businessId和taskId
|
|
|
|
|
const businessId = routeParams.value.id;
|
|
|
|
|
const taskId = routeParams.value.taskId;
|
|
|
|
|
|
|
|
|
|
// 通过taskId或businessId获取当前任务
|
|
|
|
|
const taskRes = await pageByTaskWait({
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
flowCode: 'Lube01'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
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 = () => {
|
|
|
|
|
// 基础信息从工单获取
|
|
|
|
|
form.lubeInstanceId = workOrder.value.lubeInstanceId;
|
|
|
|
|
form.processStepOrder = currentStepOrder.value;
|
|
|
|
|
|
|
|
|
|
if (currentStepOrder.value === 1) {
|
|
|
|
|
// 第一步:工单创建,表单为空等待用户填写
|
|
|
|
|
form.lubeLevel = workOrder.value.lubeLevel;
|
|
|
|
|
form.lubeGroup = workOrder.value.lubeGroup;
|
|
|
|
|
form.lubeSupervisor = workOrder.value.lubeSupervisor;
|
|
|
|
|
} else {
|
|
|
|
|
// 第二步、第三步:从工单基础信息预填充
|
|
|
|
|
form.lubeLevel = workOrder.value.lubeLevel;
|
|
|
|
|
form.lubeGroup = workOrder.value.lubeGroup;
|
|
|
|
|
form.lubeSupervisor = workOrder.value.lubeSupervisor;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 审批处理
|
|
|
|
|
const approvalVerifyOpen = async () => {
|
|
|
|
|
if (!processFormRef.value) return;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const valid = await processFormRef.value.validate();
|
|
|
|
|
if (valid) {
|
|
|
|
|
// 准备任务变量
|
|
|
|
|
taskVariables.value = {
|
|
|
|
|
entity: {
|
|
|
|
|
lubeInstanceId: form.lubeInstanceId,
|
|
|
|
|
lubeLevel: form.lubeLevel,
|
|
|
|
|
lubeGroup: form.lubeGroup,
|
|
|
|
|
lubeSupervisor: form.lubeSupervisor,
|
|
|
|
|
processHandleResolution: form.processHandleResolution || '',
|
|
|
|
|
processStepOrder: form.processStepOrder
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 直接使用传入的taskId进行审批
|
|
|
|
|
submitVerifyRef.value?.openDialog(routeParams.value.taskId);
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
proxy?.$modal.msgError('表单验证失败,请检查输入项');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 提交回调
|
|
|
|
|
const submitCallback = async () => {
|
|
|
|
|
try {
|
|
|
|
|
// 格式化当前时间为 YYYY-MM-DD HH:mm:ss
|
|
|
|
|
const getCurrentDateTime = () => {
|
|
|
|
|
const now = new Date();
|
|
|
|
|
const year = now.getFullYear();
|
|
|
|
|
const month = (now.getMonth() + 1).toString().padStart(2, '0');
|
|
|
|
|
const day = now.getDate().toString().padStart(2, '0');
|
|
|
|
|
const hours = now.getHours().toString().padStart(2, '0');
|
|
|
|
|
const minutes = now.getMinutes().toString().padStart(2, '0');
|
|
|
|
|
const seconds = now.getSeconds().toString().padStart(2, '0');
|
|
|
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 保存工单实例活动记录
|
|
|
|
|
await addDmsBillsLubeInstanceActivity({
|
|
|
|
|
lubeInstanceId: form.lubeInstanceId,
|
|
|
|
|
lubeLevel: form.lubeLevel,
|
|
|
|
|
lubeGroup: form.lubeGroup,
|
|
|
|
|
lubeSupervisor: form.lubeSupervisor,
|
|
|
|
|
processHandleResolution: form.processHandleResolution || '',
|
|
|
|
|
processStepOrder: form.processStepOrder,
|
|
|
|
|
handleTime: getCurrentDateTime()
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
proxy?.$modal.msgSuccess(`${currentStepName.value}完成`);
|
|
|
|
|
|
|
|
|
|
// 关闭页面返回
|
|
|
|
|
goBack();
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('保存业务数据失败:', error);
|
|
|
|
|
proxy?.$modal.msgError('保存业务数据失败');
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 审批记录
|
|
|
|
|
const handleApprovalRecord = () => {
|
|
|
|
|
approvalRecordRef.value?.init(routeParams.value.id);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 返回
|
|
|
|
|
const goBack = () => {
|
|
|
|
|
proxy?.$tab.closePage(proxy?.$route);
|
|
|
|
|
proxy?.$router.go(-1);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 工具函数
|
|
|
|
|
const getStatusText = (status: string) => {
|
|
|
|
|
const statusMap = {
|
|
|
|
|
'draft': '草稿',
|
|
|
|
|
'waiting': '待处理',
|
|
|
|
|
'processing': '处理中',
|
|
|
|
|
'completed': '已完成',
|
|
|
|
|
'cancel': '已取消'
|
|
|
|
|
};
|
|
|
|
|
return statusMap[status] || '未知状态';
|
|
|
|
|
};
|
|
|
|
|
</script>
|