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.

550 lines
22 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">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<!-- <el-form-item label="主键标识" prop="maintInstanceId">
<el-input v-model="queryParams.maintInstanceId" placeholder="请输入主键标识" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="保养计划" prop="planMaintId">
<el-input v-model="queryParams.planMaintId" placeholder="请输入保养计划" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="流程定义" prop="wfDefinitionId">
<el-input v-model="queryParams.wfDefinitionId" placeholder="请输入流程定义" clearable @keyup.enter="handleQuery" />
</el-form-item>-->
<el-form-item label="保养单号" prop="billsMaintCode">
<el-input v-model="queryParams.billsMaintCode" placeholder="请输入保养单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="保养组别" prop="maintGroup">
<el-input v-model="queryParams.maintGroup" placeholder="请输入保养组别" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="保养负责人" prop="maintSupervisor">
<el-input v-model="queryParams.maintSupervisor" placeholder="请输入保养负责人" clearable @keyup.enter="handleQuery" />
</el-form-item>-->
<el-form-item label="保养级别" prop="maintLevel">
<el-select v-model="queryParams.maintLevel" placeholder="请选择保养级别" clearable >
<el-option v-for="dict in maint_level" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="计划保养时间" prop="planBeginTime" label-width="100px">
<el-date-picker clearable
v-model="queryParams.planBeginTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择计划保养时间"
/>
</el-form-item>
<!-- <el-form-item label="实际开始时间" prop="realBeginTime">
<el-date-picker clearable
v-model="queryParams.realBeginTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择实际开始时间"
/>
</el-form-item>
<el-form-item label="计划完成时间" prop="planEndTime">
<el-date-picker clearable
v-model="queryParams.planEndTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择计划完成时间"
/>
</el-form-item>
<el-form-item label="实际完成时间" prop="realEndTime">
<el-date-picker clearable
v-model="queryParams.realEndTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择实际完成时间"
/>
</el-form-item>-->
<el-form-item label="保养状态" prop="maintStatus">
<el-select v-model="queryParams.maintStatus" placeholder="请选择保养状态" clearable >
<el-option v-for="dict in maint_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<!-- <el-form-item label="保养完成率" prop="maintCompRate">
<el-input v-model="queryParams.maintCompRate" placeholder="请输入保养完成率" clearable @keyup.enter="handleQuery" />
</el-form-item>-->
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['dms:dmsBillsMaintInstance:add']">新增</el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['dms:dmsBillsMaintInstance:edit']">修改</el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['dms:dmsBillsMaintInstance:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['dms:dmsBillsMaintInstance:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="dmsBillsMaintInstanceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键标识" align="center" prop="maintInstanceId" v-if="columns[0].visible"/>
<el-table-column label="保养计划" align="center" prop="planMaintId" v-if="columns[2].visible"/>
<el-table-column label="流程定义" align="center" prop="wfDefinitionId" v-if="columns[3].visible"/>
<el-table-column label="保养单号" align="center" prop="billsMaintCode" v-if="columns[4].visible"/>
<el-table-column label="保养组别" align="center" prop="maintGroup" v-if="columns[5].visible"/>
<el-table-column label="保养负责人" align="center" prop="maintSupervisor" v-if="columns[6].visible" width="100" />
<el-table-column label="保养级别" align="center" prop="maintLevel" v-if="columns[7].visible">
<template #default="scope">
<dict-tag :options="maint_level" :value="scope.row.maintLevel"/>
</template>
</el-table-column>
<el-table-column label="计划保养时间" align="center" prop="planBeginTime" width="180" v-if="columns[8].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.planBeginTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="实际开始时间" align="center" prop="realBeginTime" width="180" v-if="columns[9].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.realBeginTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="计划完成时间" align="center" prop="planEndTime" width="180" v-if="columns[10].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.planEndTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="实际完成时间" align="center" prop="realEndTime" width="180" v-if="columns[11].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.realEndTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="保养状态" align="center" prop="maintStatus" v-if="columns[12].visible">
<template #default="scope">
<dict-tag :options="maint_status" :value="scope.row.maintStatus"/>
</template>
</el-table-column>
<!-- <el-table-column label="保养完成率" align="center" prop="maintCompRate" v-if="columns[13].visible" width="100" /> -->
<el-table-column label="备注" align="center" prop="remark" v-if="columns[13].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-button link type="primary" icon="View" @click="handleShowDetail(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:edit']"></el-button>
</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">
<!-- <el-form-item label="主键标识" prop="maintInstanceId">
<el-input v-model="form.maintInstanceId" placeholder="请输入主键标识" />
</el-form-item>-->
<el-form-item label="保养计划" prop="planMaintId">
<!-- <el-input v-model="form.planMaintId" placeholder="请输入保养计划" />-->
</el-form-item>
<el-form-item label="流程定义" prop="wfDefinitionId">
<!-- <el-input v-model="form.wfDefinitionId" placeholder="请输入流程定义" />-->
</el-form-item>
<el-form-item label="保养单号" prop="billsMaintCode">
<el-input v-model="form.billsMaintCode" placeholder="请输入保养单号" />
</el-form-item>
<el-form-item label="保养组别" prop="maintGroup">
<el-input v-model="form.maintGroup" placeholder="请输入保养组别" />
</el-form-item>
<el-form-item label="保养负责人" prop="maintSupervisor">
<el-input v-model="form.maintSupervisor" placeholder="请输入保养负责人" />
</el-form-item>
<el-form-item label="保养级别" prop="maintLevel">
<el-select v-model="form.maintLevel" placeholder="请选择保养级别">
<el-option
v-for="dict in maint_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="计划保养时间" prop="planBeginTime">
<el-date-picker clearable
v-model="form.planBeginTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择计划保养时间">
</el-date-picker>
</el-form-item>
<el-form-item label="实际开始时间" prop="realBeginTime">
<el-date-picker clearable
v-model="form.realBeginTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择实际开始时间">
</el-date-picker>
</el-form-item>
<el-form-item label="计划完成时间" prop="planEndTime">
<el-date-picker clearable
v-model="form.planEndTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择计划完成时间">
</el-date-picker>
</el-form-item>
<el-form-item label="实际完成时间" prop="realEndTime">
<el-date-picker clearable
v-model="form.realEndTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择实际完成时间">
</el-date-picker>
</el-form-item>
<el-form-item label="保养状态" prop="maintStatus">
<el-select v-model="form.maintStatus" placeholder="请选择保养状态">
<el-option
v-for="dict in maint_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="保养完成率" prop="maintCompRate">
<el-input v-model="form.maintCompRate" placeholder="请输入保养完成率" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="DmsBillsMaintInstance" lang="ts">
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 { 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'));
const dmsBillsMaintInstanceList = ref<DmsBillsMaintInstanceVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const dmsBillsMaintInstanceFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
// 列显隐信息
const columns = ref<FieldOption[]>([
{ key: 0, label: `主键标识`, visible: false },
{ key: 1, label: `租户编号`, visible: false },
{ key: 2, label: `保养计划`, visible: true },
{ key: 3, label: `流程定义`, visible: false },
{ key: 4, label: `保养单号`, visible: true },
{ key: 5, label: `保养组别`, visible: true },
{ key: 6, label: `保养负责人`, visible: false },
{ key: 7, label: `保养级别`, visible: true },
{ key: 8, label: `计划保养时间`, visible: true },
{ key: 9, label: `实际开始时间`, visible: true },
{ key: 10, label: `计划完成时间`, visible: true },
{ key: 11, label: `实际完成时间`, visible: true },
{ key: 12, label: `保养状态`, visible: true },
// { key: 13, label: `保养完成率`, visible: true },
{ key: 13, label: `备注`, visible: true },
// { key: 15, label: `创建部门`, visible: false },
// { key: 16, label: `创建人`, visible: false },
// { key: 17, label: `创建时间`, visible: false },
// { key: 18, label: `更新人`, visible: false },
// { key: 19, label: `更新时间`, visible: false },
]);
const initFormData: DmsBillsMaintInstanceForm = {
maintInstanceId: undefined,
planMaintId: undefined,
wfDefinitionId: undefined,
billsMaintCode: undefined,
maintGroup: undefined,
maintSupervisor: undefined,
maintLevel: undefined,
planBeginTime: undefined,
realBeginTime: undefined,
planEndTime: undefined,
realEndTime: undefined,
maintStatus: undefined,
maintCompRate: undefined,
remark: undefined,
}
const data = reactive<PageData<DmsBillsMaintInstanceForm, DmsBillsMaintInstanceQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
maintInstanceId: undefined,
planMaintId: undefined,
wfDefinitionId: undefined,
billsMaintCode: undefined,
maintGroup: undefined,
maintSupervisor: undefined,
maintLevel: undefined,
planBeginTime: undefined,
realBeginTime: undefined,
planEndTime: undefined,
realEndTime: undefined,
maintStatus: undefined,
maintCompRate: undefined,
params: {
}
},
rules: {
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询保养工单列表 */
const getList = async () => {
loading.value = true;
const res = await listDmsBillsMaintInstance(queryParams.value);
dmsBillsMaintInstanceList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
dmsBillsMaintInstanceFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: DmsBillsMaintInstanceVO[]) => {
ids.value = selection.map(item => item.maintInstanceId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 提交按钮 */
const submitForm = () => {
dmsBillsMaintInstanceFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.maintInstanceId) {
await updateDmsBillsMaintInstance(form.value).finally(() => buttonLoading.value = false);
} else {
await addDmsBillsMaintInstance(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: DmsBillsMaintInstanceVO) => {
const _maintInstanceIds = row?.maintInstanceId || ids.value;
await proxy?.$modal.confirm('是否确认删除保养工单编号为"' + _maintInstanceIds + '"的数据项?').finally(() => loading.value = false);
await delDmsBillsMaintInstance(_maintInstanceIds);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('dms/dmsBillsMaintInstance/export', {
...queryParams.value
}, `dmsBillsMaintInstance_${new Date().getTime()}.xlsx`)
}
/** 新增按钮操作 */
const handleAdd = () => {
proxy.$tab.closePage(proxy.$route);
proxy.$router.push({
path: `/dms/maint/maintEdit/index`,
query: {
type: 'add'
}
});
};
/** 修改按钮操作 */
const handleUpdate = (row?: DmsBillsMaintInstanceVO) => {
proxy.$tab.closePage(proxy.$route);
proxy.$router.push({
path: `/workflow/leaveEdit/index`,
query: {
id: row.maintInstanceId,
type: 'update'
}
});
};
/** 查看按钮操作 */
const handleView = (row?: DmsBillsMaintInstanceVO) => {
proxy.$tab.closePage(proxy.$route);
proxy.$router.push({
path: `/workflow/leaveEdit/index`,
query: {
id: row.maintInstanceId,
type: 'view'
}
});
};
// 启动工单工作流
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();
});
</script>