You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

440 lines
13 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="p-2">
<!-- 操作按钮区域 -->
<el-card shadow="never">
<div style="display: flex; justify-content: space-between">
<div>
<el-button
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
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 { ref, reactive, computed, onMounted, getCurrentInstance, toRefs } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { getDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
import { addDmsBillsLubeInstanceActivity } from '@/api/dms/dmsBillsLubeInstanceActivity';
import { pageByTaskWait } from '@/api/workflow/task';
import { getCurrentDateTime } from '@/utils/dateUtils';
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 router = useRouter();
// 基础数据
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;
});
// 新增:提交按钮显示控制逻辑
const submitButtonShow = computed(() => {
return (
routeParams.value.type === 'add' ||
(routeParams.value.type === 'update' &&
workOrder.value.status &&
(workOrder.value.status === 'draft' || workOrder.value.status === 'cancel' || workOrder.value.status === 'back'))
);
});
// 初始化
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 submitForm = async (status: string) => {
if (!processFormRef.value) return;
try {
const valid = await processFormRef.value.validate();
if (valid) {
buttonLoading.value = true;
if (status === 'draft') {
// 暂存逻辑
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('暂存成功');
goBack();
} else {
// 提交逻辑
// 准备任务变量
taskVariables.value = {
entity: {
lubeInstanceId: form.lubeInstanceId,
lubeLevel: form.lubeLevel,
lubeGroup: form.lubeGroup,
lubeSupervisor: form.lubeSupervisor,
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;
}
};
// 审批处理
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 {
// 保存工单实例活动记录
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);
router.go(-1);
};
// 工具函数
const getStatusText = (status: string) => {
const statusMap = {
'draft': '草稿',
'waiting': '待处理',
'processing': '处理中',
'completed': '已完成',
'cancel': '已取消'
};
return statusMap[status] || '未知状态';
};
</script>