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.

503 lines
21 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="inspectInstanceId">
<el-input v-model="queryParams.inspectInstanceId" placeholder="请输入主键标识" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="计划" prop="planInspectId">
<el-input v-model="queryParams.planInspectId" 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="inspectType">
<el-select v-model="queryParams.inspectType" placeholder="请选择检查类型" clearable >
<el-option v-for="dict in inspect_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<!-- <el-form-item label="巡检线路" prop="inspectRouteId">
<el-input v-model="queryParams.inspectRouteId" placeholder="请输入巡检线路" clearable @keyup.enter="handleQuery" />
</el-form-item>-->
<el-form-item label="巡检编号" prop="billsInspectCode">
<el-input v-model="queryParams.billsInspectCode" placeholder="请输入巡检编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="计划开始时间" prop="planBeginTime">
<el-date-picker clearable
v-model="queryParams.planBeginTime"
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="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="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="inspectStatus">
<el-select v-model="queryParams.inspectStatus" placeholder="请选择巡检状态" clearable >
<el-option v-for="dict in dms_inspect_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</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:dmsBillsInspectInstance:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['dms:dmsBillsInspectInstance:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['dms:dmsBillsInspectInstance:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['dms:dmsBillsInspectInstance: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="dmsBillsInspectInstanceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键标识" align="center" prop="inspectInstanceId" v-if="columns[0].visible"/>
<el-table-column label="计划" align="center" prop="planInspectId" 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="inspectType" v-if="columns[4].visible">
<template #default="scope">
<dict-tag :options="inspect_type" :value="scope.row.inspectType"/>
</template>
</el-table-column>
<el-table-column label="巡检线路" align="center" prop="inspectRouteId" v-if="columns[5].visible"/>
<el-table-column label="巡检编号" align="center" prop="billsInspectCode" v-if="columns[6].visible"/>
<el-table-column label="计划开始时间" align="center" prop="planBeginTime" width="180" v-if="columns[7].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="planEndTime" width="180" v-if="columns[8].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="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="realEndTime" width="180" v-if="columns[10].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="inspectStatus" v-if="columns[11].visible">
<template #default="scope">
<dict-tag :options="dms_inspect_status" :value="scope.row.inspectStatus"/>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" v-if="columns[12].visible"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<!-- <el-tooltip content="修改" placement="top">-->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dms:dmsBillsInspectInstance:edit']"></el-button>-->
<!-- </el-tooltip>-->
<!-- <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" v-if="!scope.row.wfDefinitionId">
<el-button link type="success" icon="View" @click="handleStartWorkflow(scope.row)">
</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="dmsBillsInspectInstanceFormRef" :model="form" :rules="rules" label-width="120px">
<!-- <el-form-item label="主键标识" prop="inspectInstanceId">
<el-input v-model="form.inspectInstanceId" placeholder="请输入主键标识" />
</el-form-item>-->
<el-form-item label="计划" prop="planInspectId">
<!-- <el-input v-model="form.planInspectId" 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="inspectType">
<el-select v-model="form.inspectType" placeholder="请选择检查类型">
<el-option
v-for="dict in inspect_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="巡检线路" prop="inspectRouteId">
<!-- <el-input v-model="form.inspectRouteId" placeholder="请输入巡检线路" />-->
</el-form-item>
<el-form-item label="巡检编号" prop="billsInspectCode">
<el-input v-model="form.billsInspectCode" placeholder="请输入巡检编号" />
</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="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="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="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="inspectStatus">
<el-select v-model="form.inspectStatus" placeholder="请选择巡检状态">
<el-option
v-for="dict in dms_inspect_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</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="DmsBillsInspectInstance" lang="ts">
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'));
const dmsBillsInspectInstanceList = ref<DmsBillsInspectInstanceVO[]>([]);
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 dmsBillsInspectInstanceFormRef = 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: false },
{ key: 3, label: `流程定义`, visible: false },
{ key: 4, label: `检查类型`, visible: true },
{ key: 5, label: `巡检线路`, visible: true },
{ key: 6, label: `巡检编号`, visible: true },
{ 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: false },
{ key: 14, label: `创建人`, visible: false },
{ key: 15, label: `创建时间`, visible: false },
{ key: 16, label: `更新人`, visible: false },
{ key: 17, label: `更新时间`, visible: false },
]);
const initFormData: DmsBillsInspectInstanceForm = {
inspectInstanceId: undefined,
planInspectId: undefined,
wfDefinitionId: undefined,
inspectType: undefined,
inspectRouteId: undefined,
billsInspectCode: undefined,
planBeginTime: undefined,
planEndTime: undefined,
realBeginTime: undefined,
realEndTime: undefined,
inspectStatus: undefined,
remark: undefined,
}
const data = reactive<PageData<DmsBillsInspectInstanceForm, DmsBillsInspectInstanceQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
inspectInstanceId: undefined,
planInspectId: undefined,
wfDefinitionId: undefined,
inspectType: undefined,
inspectRouteId: undefined,
billsInspectCode: undefined,
planBeginTime: undefined,
planEndTime: undefined,
realBeginTime: undefined,
realEndTime: undefined,
inspectStatus: undefined,
params: {
}
},
rules: {
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询点巡检工单列表 */
const getList = async () => {
loading.value = true;
const res = await listDmsBillsInspectInstance(queryParams.value);
dmsBillsInspectInstanceList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
dmsBillsInspectInstanceFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: DmsBillsInspectInstanceVO[]) => {
ids.value = selection.map(item => item.inspectInstanceId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加点巡检工单";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: DmsBillsInspectInstanceVO) => {
reset();
const _inspectInstanceId = row?.inspectInstanceId || ids.value[0]
const res = await getDmsBillsInspectInstance(_inspectInstanceId);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改点巡检工单";
}
/** 提交按钮 */
const submitForm = () => {
dmsBillsInspectInstanceFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.inspectInstanceId) {
await updateDmsBillsInspectInstance(form.value).finally(() => buttonLoading.value = false);
} else {
await addDmsBillsInspectInstance(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: DmsBillsInspectInstanceVO) => {
const _inspectInstanceIds = row?.inspectInstanceId || ids.value;
await proxy?.$modal.confirm('是否确认删除点巡检工单编号为"' + _inspectInstanceIds + '"的数据项?').finally(() => loading.value = false);
await delDmsBillsInspectInstance(_inspectInstanceIds);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('dms/dmsBillsInspectInstance/export', {
...queryParams.value
}, `dmsBillsInspectInstance_${new Date().getTime()}.xlsx`)
}
const router = useRouter();
// 启动工单工作流
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();
});
</script>