feat(dms): 添加工单工作流启动和处理功能

- 在工单列表页面添加启动工作流按钮
- 新增工单活动页面,支持暂存和提交功能
- 优化工作流任务查询逻辑,支持按业务ID或任务ID查询
- 新增日期工具函数,用于获取当前日期时间
master
zch 2 weeks ago
parent fb53bec3f3
commit 61eb5ee00e

@ -75,3 +75,21 @@ export function getDmsBillsMaintInstanceList (query) {
params: query
});
};
/**
* ID
* @param maintInstanceId ID
* @param wfDefinitionId ID
* @return truefalse
*/
export function updateWfDefinitionIdById (maintInstanceId: string | number, wfDefinitionId: string | number) {
return request({
url: '/dms/dmsBillsMaintInstance/updateWfDefinitionIdById',
method: 'post',
params: {
maintInstanceId,
wfDefinitionId
}
});
};

@ -354,6 +354,36 @@ export const dynamicRoutes: RouteRecordRaw[] = [
]
},
{
path: '/dms/dmsMaintInstanceActivity',
component: Layout,
hidden: true,
permissions: ['dms:dmsBillsMaintInstance:add'],
children: [
{
path: 'index',
component: () => import('@/views/dms/dmsMaintInstanceActivity/index.vue'),
name: 'dmsMaintInstanceActivity',
meta: { title: '保养工单明细', activeMenu: '/dms/dmsBillsMaintInstance', icon: '' }
}
]
},
{
path: '/dms/dmsBillsInspectInstanceActivity',
component: Layout,
hidden: true,
permissions: ['dms:dmsBillsInspectInstance:add'],
children: [
{
path: 'index',
component: () => import('@/views/dms/dmsBillsInspectInstanceActivity/index.vue'),
name: 'dmsBillsInspectInstanceActivity',
meta: { title: '点巡检工单明细', activeMenu: '/dms/dmsBillsInspectInstance', icon: '' }
}
]
},
{
path: '/dms/dmsPlanMaintDetail',
component: Layout,
@ -426,36 +456,6 @@ export const dynamicRoutes: RouteRecordRaw[] = [
]
},
// {
// path: '/dms/dmsMaintInstanceActivity',
// component: Layout,
// hidden: true,
// permissions: ['dms:dmsBillsMaintInstance:add'],
// children: [
// {
// path: 'index',
// component: () => import('@/views/dms/dmsMaintInstanceActivity/index.vue'),
// name: 'dmsMaintInstanceActivity',
// meta: { title: '保养工单明细', activeMenu: '/dms/dmsBillsMaintInstance', icon: '' }
// }
// ]
// },
//
// {
// path: '/dms/dmsBillsInspectInstanceActivity',
// component: Layout,
// hidden: true,
// permissions: ['dms:dmsBillsInspectInstanceActivity:add'],
// children: [
// {
// path: 'index',
// component: () => import('@/views/dms/dmsBillsInspectInstanceActivity/index.vue'),
// name: 'dmsBillsInspectInstanceActivity',
// meta: { title: '点巡检工单明细', activeMenu: '/dms/dmsBillsInspectInstanceActivity', icon: '' }
// }
// ]
// },
];

@ -0,0 +1,42 @@
/**
*
*/
/**
* YYYY-MM-DD HH:mm:ss
* @returns {string}
*/
export const getCurrentDateTime = (): string => {
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}`;
};
/**
* YYYY-MM-DD
* @param date
* @returns {string}
*/
export const formatDate = (date: Date = new Date()): string => {
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return `${year}-${month}-${day}`;
};
/**
* HH:mm:ss
* @param date
* @returns {string}
*/
export const formatTime = (date: Date = new Date()): string => {
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const seconds = date.getSeconds().toString().padStart(2, '0');
return `${hours}:${minutes}:${seconds}`;
};

@ -135,8 +135,10 @@
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dms:dmsBillsInspectInstance:remove']"></el-button>-->
<!-- </el-tooltip>-->
<el-tooltip content="详情" placement="top">
<el-button link type="primary" icon="View" @click="handleShowDetail(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:edit']"></el-button>
<!-- 启动工单按钮 -->
<el-tooltip content="启动工单" placement="top" v-if="!scope.row.wfDefinitionId">
<el-button link type="success" icon="View" @click="handleStartWorkflow(scope.row)">
</el-button>
</el-tooltip>
</template>
</el-table-column>
@ -144,6 +146,13 @@
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 工作流处理组件 -->
<submitVerify
ref="submitVerifyRef"
:task-variables="taskVariables"
@submit-callback="submitCallback" />
<!-- 添加或修改点巡检工单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="dmsBillsInspectInstanceFormRef" :model="form" :rules="rules" label-width="120px">
@ -229,8 +238,11 @@
</template>
<script setup name="DmsBillsInspectInstance" lang="ts">
import { listDmsBillsInspectInstance, getDmsBillsInspectInstance, delDmsBillsInspectInstance, addDmsBillsInspectInstance, updateDmsBillsInspectInstance } from '@/api/dms/dmsBillsInspectInstance';
import { listDmsBillsInspectInstance, getDmsBillsInspectInstance, delDmsBillsInspectInstance, addDmsBillsInspectInstance, updateDmsBillsInspectInstance, updateWfDefinitionIdById } from '@/api/dms/dmsBillsInspectInstance';
import { DmsBillsInspectInstanceVO, DmsBillsInspectInstanceQuery, DmsBillsInspectInstanceForm } from '@/api/dms/dmsBillsInspectInstance/types';
import { useRouter } from 'vue-router';
import { startWorkFlow } from '@/api/workflow/task'
import SubmitVerify from '@/components/Process/submitVerify.vue'
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { inspect_type, dms_inspect_status } = toRefs<any>(proxy?.useDict('inspect_type', 'dms_inspect_status'));
@ -404,9 +416,85 @@ const handleExport = () => {
}
const router = useRouter();
const handleShowDetail = (row: DmsBillsInspectInstanceVO) => {
router.push('/dms/dmsBillsInspectInstanceActivity/index/' + row.inspectInstanceId)
//
const handleStartWorkflow = async (row: DmsBillsInspectInstanceVO) => {
try {
const confirmResult = await proxy?.$modal.confirm(
`确认启动巡检工单"${row.billsInspectCode}"的工作流?`
);
if (confirmResult) {
buttonLoading.value = true;
//
const workflowData = {
businessId: row.inspectInstanceId,
flowCode: 'Inspect01',
variables: {
inspectInstanceId: row.inspectInstanceId,
billsInspectCode: row.billsInspectCode,
inspectType: row.inspectType
}
};
const workflowRes = await startWorkFlow(workflowData);
//
if (!workflowRes || !workflowRes.data || !workflowRes.data.taskId) {
throw new Error('工作流启动失败未获取到有效的taskId');
}
await updateWfDefinitionIdById(row.inspectInstanceId, workflowRes.data.taskId);
//
taskVariables.value = {
entity: {
inspectInstanceId: row.inspectInstanceId,
inspectType: row.inspectType,
inspectRouteId: row.inspectRouteId,
billsInspectCode: row.billsInspectCode,
processStepOrder: 1
}
};
proxy?.$modal.msgSuccess('工单工作流启动成功');
//
if (submitVerifyRef.value && workflowRes.data.taskId) {
submitVerifyRef.value.openDialog(workflowRes.data.taskId);
}
}
} catch (error) {
console.error('启动工作流失败:', error);
proxy?.$modal.msgError('启动工作流失败: ' + (error.message || '未知错误'));
} finally {
buttonLoading.value = false;
}
};
//
const handleWorkflowProgress = (row: DmsBillsInspectInstanceVO) => {
//
router.push({
path: '/workflow/process/record',
query: { businessId: row.inspectInstanceId }
});
};
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const taskVariables = ref<any>({});
// -
const submitCallback = async () => {
try {
//
await getList();
proxy?.$modal.msgSuccess('工单创建节点处理完成,工作流已流转到下一步');
} catch (error) {
console.error('刷新列表失败:', error);
proxy?.$modal.msgError('刷新列表失败');
}
};
onMounted(() => {
getList();

@ -4,6 +4,20 @@
<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"
@ -112,7 +126,8 @@ import {
DmsBillsInspectInstanceActivityForm
} from '@/api/dms/dmsBillsInspectInstanceActivity/types';
import { getDmsBillsInspectInstance } from '@/api/dms/dmsBillsInspectInstance';
import { getCurrentTask } from '@/api/workflow/task';
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';
@ -121,30 +136,32 @@ const { inspect_status } = toRefs<any>(proxy?.useDict('inspect_status'));
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<FormInstance>();
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
//
const loading = ref(false);
const buttonLoading = ref(false);
const workOrder = ref<any>({});
const workOrderStatusText = ref('');
//
const currentTask = ref<any>(null);
const taskVariables = ref<any>({});
//
const routeParams = computed(() => route.query);
//
const form = reactive<Partial<DmsBillsInspectInstanceActivityForm>>({
inspectInstanceId: routeParams.value.id,
const initFormData = {
inspectInstanceId: undefined,
inspectRouteId: undefined,
deviceAmount: undefined,
performer: undefined,
processHandleResolution: undefined
});
};
const form = reactive<Partial<DmsBillsInspectInstanceActivityForm>>({ ...initFormData });
//
const rules = reactive<FormRules>({
@ -173,9 +190,21 @@ const needProcessResolution = computed(() => {
return routeParams.value.type === 'approval';
});
//
const submitButtonShow = computed(() => {
return (
routeParams.value.type === 'add' ||
(routeParams.value.type === 'update' &&
workOrder.value.inspectStatus &&
(workOrder.value.inspectStatus === 'draft' || workOrder.value.inspectStatus === 'cancel' || workOrder.value.inspectStatus === 'back'))
);
});
//
onMounted(async () => {
routeParams.value = route.query;
loading.value = true;
try {
//
await loadWorkOrderInfo();
@ -219,10 +248,29 @@ const loadWorkOrderInfo = async () => {
//
const loadCurrentTask = async () => {
try {
const businessId = routeParams.value.id;
const taskId = routeParams.value.taskId;
if (taskId) {
const res = await getCurrentTask(taskId);
currentTask.value = res.data;
// taskIdbusinessId
const taskRes = await pageByTaskWait({
pageNum: 1,
pageSize: 10,
flowCode: 'Inspect01' //
});
const tasks = taskRes.rows.filter(task =>
task.businessId === businessId || task.id === taskId
);
if (tasks.length > 0) {
currentTask.value = tasks[0];
//
if (needProcessResolution.value) {
rules.processHandleResolution = [
{ required: true, message: '处理意见不能为空', trigger: 'blur' }
];
}
}
} catch (error) {
console.error('获取任务信息失败:', error);
@ -236,10 +284,58 @@ const initializeFormData = () => {
form.inspectRouteId = workOrder.value.inspectRouteId;
form.deviceAmount = workOrder.value.deviceAmount;
form.performer = workOrder.value.performer;
};
//
if (routeParams.value.type === 'approval') {
rules.processHandleResolution = [{ required: true, message: "处理意见不能为空", trigger: "blur" }];
//
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 addDmsBillsInspectInstanceActivity({
inspectInstanceId: form.inspectInstanceId,
inspectRouteId: form.inspectRouteId,
deviceAmount: form.deviceAmount,
performer: form.performer,
processHandleResolution: form.processHandleResolution || '',
handleTime: getCurrentDateTime()
});
proxy?.$modal.msgSuccess('暂存成功');
goBack();
} else {
//
//
taskVariables.value = {
entity: {
inspectInstanceId: form.inspectInstanceId,
inspectRouteId: form.inspectRouteId,
deviceAmount: form.deviceAmount,
performer: form.performer,
processHandleResolution: form.processHandleResolution || ''
}
};
//
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;
}
};
@ -265,7 +361,7 @@ const approvalVerifyOpen = async () => {
submitVerifyRef.value?.openDialog(routeParams.value.taskId);
}
} catch (error) {
proxy?.$modal.msgError('表单验证失败');
proxy?.$modal.msgError('表单验证失败,请检查输入项');
}
};
@ -278,17 +374,6 @@ const handleApprovalRecord = () => {
const submitCallback = async () => {
try {
//
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 addDmsBillsInspectInstanceActivity({
inspectInstanceId: form.inspectInstanceId,
inspectRouteId: form.inspectRouteId,
@ -311,7 +396,7 @@ const submitCallback = async () => {
//
const goBack = () => {
proxy?.$tab.closePage(proxy?.$route);
proxy?.$router.go(-1);
router.go(-1);
};
</script>

@ -4,6 +4,20 @@
<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"
@ -109,15 +123,19 @@
</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);
@ -181,6 +199,16 @@ 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;
@ -281,6 +309,61 @@ const initializeFormData = () => {
}
};
//
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;
@ -311,18 +394,6 @@ const approvalVerifyOpen = async () => {
//
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,
@ -352,7 +423,7 @@ const handleApprovalRecord = () => {
//
const goBack = () => {
proxy?.$tab.closePage(proxy?.$route);
proxy?.$router.go(-1);
router.go(-1);
};
//

@ -137,21 +137,33 @@
<el-table-column label="备注" align="center" prop="remark" v-if="columns[14].visible"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<!-- 启动工单按钮 -->
<el-tooltip content="启动工单" placement="top" v-if="!scope.row.wfDefinitionId">
<el-button link type="success" icon="View" @click="handleStartWorkflow(scope.row)">
</el-button>
</el-tooltip>
<!-- <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dms:dmsBillsMaintInstance:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dms:dmsBillsMaintInstance:remove']"></el-button>
</el-tooltip>-->
<el-tooltip content="详情" placement="top">
<!-- <el-tooltip content="详情" placement="top">
<el-button link type="primary" icon="View" @click="handleShowDetail(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:edit']"></el-button>
</el-tooltip>
</el-tooltip>-->
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 工作流处理组件 -->
<submitVerify
ref="submitVerifyRef"
:task-variables="taskVariables"
@submit-callback="submitCallback" />
<!-- 添加或修改保养工单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="dmsBillsMaintInstanceFormRef" :model="form" :rules="rules" label-width="80px">
@ -243,10 +255,18 @@
</template>
<script setup name="DmsBillsMaintInstance" lang="ts">
import { listDmsBillsMaintInstance, getDmsBillsMaintInstance, delDmsBillsMaintInstance, addDmsBillsMaintInstance, updateDmsBillsMaintInstance } from '@/api/dms/dmsBillsMaintInstance';
import {
listDmsBillsMaintInstance,
getDmsBillsMaintInstance,
delDmsBillsMaintInstance,
addDmsBillsMaintInstance,
updateDmsBillsMaintInstance,
updateWfDefinitionIdById
} from '@/api/dms/dmsBillsMaintInstance';
import { DmsBillsMaintInstanceVO, DmsBillsMaintInstanceQuery, DmsBillsMaintInstanceForm } from '@/api/dms/dmsBillsMaintInstance/types';
import {useRouter} from "vue-router";
import {DmsBillsLubeInstanceVO} from "@/api/dms/dmsBillsLubeInstance/types";
import { useRouter } from 'vue-router';
import { startWorkFlow } from '@/api/workflow/task';
import SubmitVerify from '@/components/Process/submitVerify.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { maint_status, maint_level } = toRefs<any>(proxy?.useDict('maint_status', 'maint_level'));
@ -375,23 +395,6 @@ const handleSelectionChange = (selection: DmsBillsMaintInstanceVO[]) => {
multiple.value = !selection.length;
}
/** 新增按钮操作 */
// const handleAdd = () => {
// reset();
// dialog.visible = true;
// dialog.title = "";
// }
/** 修改按钮操作 */
// const handleUpdate = async (row?: DmsBillsMaintInstanceVO) => {
// reset();
// const _maintInstanceId = row?.maintInstanceId || ids.value[0]
// const res = await getDmsBillsMaintInstance(_maintInstanceId);
// Object.assign(form.value, res.data);
// dialog.visible = true;
// dialog.title = "";
// }
/** 提交按钮 */
const submitForm = () => {
dmsBillsMaintInstanceFormRef.value?.validate(async (valid: boolean) => {
@ -460,10 +463,85 @@ const handleView = (row?: DmsBillsMaintInstanceVO) => {
});
};
const router = useRouter();
const handleShowDetail = (row: DmsBillsMaintInstanceVO) => {
router.push('/dms/dmsMaintInstanceActivity/index/' + row.maintInstanceId);
//
const handleStartWorkflow = async (row: DmsBillsMaintInstanceVO) => {
try {
const confirmResult = await proxy?.$modal.confirm(
`确认启动保养工单"${row.billsMaintCode}"的工作流?`
);
if (confirmResult) {
buttonLoading.value = true;
//
const workflowData = {
businessId: row.maintInstanceId,
flowCode: 'Maint01',
variables: {
maintInstanceId: row.maintInstanceId,
billsMaintCode: row.billsMaintCode,
maintLevel: row.maintLevel
}
};
const workflowRes = await startWorkFlow(workflowData);
//
if (!workflowRes || !workflowRes.data || !workflowRes.data.taskId) {
throw new Error('工作流启动失败未获取到有效的taskId');
}
await updateWfDefinitionIdById(row.maintInstanceId, workflowRes.data.taskId);
//
taskVariables.value = {
entity: {
maintInstanceId: row.maintInstanceId,
maintLevel: row.maintLevel,
maintGroup: row.maintGroup,
maintSupervisor: row.maintSupervisor
}
};
proxy?.$modal.msgSuccess('工单工作流启动成功');
//
if (submitVerifyRef.value && workflowRes.data.taskId) {
submitVerifyRef.value.openDialog(workflowRes.data.taskId);
}
}
} catch (error) {
console.error('启动工作流失败:', error);
proxy?.$modal.msgError('启动工作流失败: ' + (error.message || '未知错误'));
} finally {
buttonLoading.value = false;
}
};
//
const handleWorkflowProgress = (row: DmsBillsMaintInstanceVO) => {
//
router.push({
path: '/workflow/process/record',
query: { businessId: row.maintInstanceId }
});
};
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const taskVariables = ref<any>({});
// -
const submitCallback = async () => {
try {
//
await getList();
proxy?.$modal.msgSuccess('工单创建节点处理完成,工作流已流转到下一步');
} catch (error) {
console.error('刷新列表失败:', error);
proxy?.$modal.msgError('刷新列表失败');
}
};
const router = useRouter();
onMounted(() => {
getList();

@ -4,6 +4,20 @@
<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"
@ -120,7 +134,8 @@ import {
DmsMaintInstanceActivityForm
} from '@/api/dms/dmsMaintInstanceActivity/types';
import { getDmsBillsMaintInstance } from '@/api/dms/dmsBillsMaintInstance';
import { getCurrentTask } from '@/api/workflow/task';
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';
@ -129,30 +144,32 @@ const { maint_level } = toRefs<any>(proxy?.useDict('maint_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<FormInstance>();
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
//
const loading = ref(false);
const buttonLoading = ref(false);
const workOrder = ref<any>({});
const workOrderStatusText = ref('');
//
const currentTask = ref<any>(null);
const taskVariables = ref<any>({});
//
const routeParams = computed(() => route.query);
//
const form = reactive<Partial<DmsMaintInstanceActivityForm>>({
maintInstanceId: routeParams.value.id,
const initFormData = {
maintInstanceId: undefined,
maintLevel: undefined,
maintGroup: undefined,
maintSupervisor: undefined,
processHandleResolution: undefined
});
};
const form = reactive<Partial<DmsMaintInstanceActivityForm>>({ ...initFormData });
//
const rules = reactive<FormRules>({
@ -181,9 +198,21 @@ const needProcessResolution = computed(() => {
return routeParams.value.type === 'approval';
});
//
const submitButtonShow = computed(() => {
return (
routeParams.value.type === 'add' ||
(routeParams.value.type === 'update' &&
workOrder.value.maintStatus &&
(workOrder.value.maintStatus === 'draft' || workOrder.value.maintStatus === 'cancel' || workOrder.value.maintStatus === 'back'))
);
});
//
onMounted(async () => {
routeParams.value = route.query;
loading.value = true;
try {
//
await loadWorkOrderInfo();
@ -227,10 +256,29 @@ const loadWorkOrderInfo = async () => {
//
const loadCurrentTask = async () => {
try {
const businessId = routeParams.value.id;
const taskId = routeParams.value.taskId;
if (taskId) {
const res = await getCurrentTask(taskId);
currentTask.value = res.data;
// taskIdbusinessId
const taskRes = await pageByTaskWait({
pageNum: 1,
pageSize: 10,
flowCode: 'Maint01' //
});
const tasks = taskRes.rows.filter(task =>
task.businessId === businessId || task.id === taskId
);
if (tasks.length > 0) {
currentTask.value = tasks[0];
//
if (needProcessResolution.value) {
rules.processHandleResolution = [
{ required: true, message: '处理意见不能为空', trigger: 'blur' }
];
}
}
} catch (error) {
console.error('获取任务信息失败:', error);
@ -244,10 +292,58 @@ const initializeFormData = () => {
form.maintLevel = workOrder.value.maintLevel;
form.maintGroup = workOrder.value.maintGroup;
form.maintSupervisor = workOrder.value.maintSupervisor;
};
//
if (routeParams.value.type === 'approval') {
rules.processHandleResolution = [{ required: true, message: "处理意见不能为空", trigger: "blur" }];
//
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 addDmsMaintInstanceActivity({
maintInstanceId: form.maintInstanceId,
maintLevel: form.maintLevel,
maintGroup: form.maintGroup,
maintSupervisor: form.maintSupervisor,
processHandleResolution: form.processHandleResolution || '',
handleTime: getCurrentDateTime()
});
proxy?.$modal.msgSuccess('暂存成功');
goBack();
} else {
//
//
taskVariables.value = {
entity: {
maintInstanceId: form.maintInstanceId,
maintLevel: form.maintLevel,
maintGroup: form.maintGroup,
maintSupervisor: form.maintSupervisor,
processHandleResolution: form.processHandleResolution || ''
}
};
//
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;
}
};
@ -273,7 +369,7 @@ const approvalVerifyOpen = async () => {
submitVerifyRef.value?.openDialog(routeParams.value.taskId);
}
} catch (error) {
proxy?.$modal.msgError('表单验证失败');
proxy?.$modal.msgError('表单验证失败,请检查输入项');
}
};
@ -286,17 +382,6 @@ const handleApprovalRecord = () => {
const submitCallback = async () => {
try {
//
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 addDmsMaintInstanceActivity({
maintInstanceId: form.maintInstanceId,
maintLevel: form.maintLevel,
@ -319,7 +404,7 @@ const submitCallback = async () => {
//
const goBack = () => {
proxy?.$tab.closePage(proxy?.$route);
proxy?.$router.go(-1);
router.go(-1);
};
</script>

@ -204,19 +204,19 @@
</el-form-item>
</el-col>
</el-row>
<el-form-item label="定时计划" prop="cronExpression">
<el-input
v-model="form.cronExpression"
readonly
placeholder="只能点击右侧生成器">
<template #append>
<el-button type="primary" @click="handleShowCron">
生成计划表达式
<i class="el-icon-time el-icon--right"></i>
</el-button>
</template>
</el-input>
</el-form-item>
<!-- <el-form-item label="定时计划" prop="cronExpression">-->
<!-- <el-input-->
<!-- v-model="form.cronExpression"-->
<!-- readonly-->
<!-- placeholder="只能点击右侧生成器">-->
<!-- <template #append>-->
<!-- <el-button type="primary" @click="handleShowCron">-->
<!-- 生成计划表达式-->
<!-- <i class="el-icon-time el-icon&#45;&#45;right"></i>-->
<!-- </el-button>-->
<!-- </template>-->
<!-- </el-input>-->
<!-- </el-form-item>-->
<el-form-item label="激活标识" prop="activeFlag">
<el-radio-group v-model="form.activeFlag">
<el-radio

Loading…
Cancel
Save