yinq 1 month ago
commit 1c461e8304

@ -7,7 +7,7 @@
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite serve --mode development", "dev": "vite serve --mode development",
"build:prod": "node --max_old_space_size=9012 node_modules/vite/bin/vite.js build --mode production", "build:prod": "node --max_old_space_size=8192 node_modules/vite/bin/vite.js build --mode production",
"build:dev": "vite build --mode development", "build:dev": "vite build --mode development",
"preview": "vite preview", "preview": "vite preview",
"lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ", "lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ",

@ -122,6 +122,11 @@ export interface DmsBillsInspectInstanceForm extends BaseEntity {
*/ */
remark?: string; remark?: string;
/**
* draft稿 waiting processing completed cancel back退
*/
status?: string;
} }
export interface DmsBillsInspectInstanceQuery extends PageQuery { export interface DmsBillsInspectInstanceQuery extends PageQuery {

@ -141,6 +141,16 @@ export interface DmsBillsLubeInstanceForm extends BaseEntity {
*/ */
planLubeCode?: string; planLubeCode?: string;
/**
* draft稿 waiting processing completed cancel back退
*/
status?: string;
createBy?: string;
createTime?: string;
} }
export interface DmsBillsLubeInstanceQuery extends PageQuery { export interface DmsBillsLubeInstanceQuery extends PageQuery {
@ -214,6 +224,10 @@ export interface DmsBillsLubeInstanceQuery extends PageQuery {
* *
*/ */
planLubeCode?: string; planLubeCode?: string;
createBy?: string;
createTime?: string;
} }

@ -15,11 +15,11 @@
<el-option v-for="dict in instance_type" :key="dict.value" :label="dict.label" :value="dict.value"/> <el-option v-for="dict in instance_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="报修来源类型" prop="faultSourceType"> <!-- <el-form-item label="报修来源类型" prop="faultSourceType" label-width="100px">
<el-select v-model="queryParams.faultSourceType" placeholder="请选择报修来源类型" clearable > <el-select v-model="queryParams.faultSourceType" placeholder="请选择报修来源类型" clearable >
<el-option v-for="dict in fault_source_type" :key="dict.value" :label="dict.label" :value="dict.value"/> <el-option v-for="dict in fault_source_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select> </el-select>
</el-form-item> </el-form-item>-->
<!-- <el-form-item label="报修来源ID" prop="faultSourceId"> <!-- <el-form-item label="报修来源ID" prop="faultSourceId">
<el-input v-model="queryParams.faultSourceId" placeholder="请输入报修来源ID" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.faultSourceId" placeholder="请输入报修来源ID" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>

@ -0,0 +1,522 @@
<template>
<div class="p-2">
<!-- 工单信息区域 -->
<h4 class="form-header h4">工单信息</h4>
<el-card shadow="never" class="mb-[10px]">
<el-form label-width="120px">
<el-row>
<el-col :span="8" :offset="2">
<el-form-item label="工单编号">
<el-input v-model="billsInfo.billsLubeCode" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="工单状态">
<el-input v-model="billsStatusCheck" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请人">
<el-input v-model="billsInfo.createBy" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请时间">
<el-input v-model="billsInfo.createTime" disabled />
</el-form-item>
</el-col>
<el-col :span="16" :offset="2">
<el-form-item label="备注">
<el-input v-model="billsInfo.remark" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<!-- 流程步骤展示区域 -->
<el-card shadow="never" class="mb-[10px]">
<el-form ref="stepFormRef" :model="form" label-width="100px">
<!-- 第一步 -->
<!-- <h4 class="form-header h4" v-if="wfProcessActivityList.length > 0">
{{wfProcessActivityList[0]?.processActivityName}}
</h4> -->
<h4 class="form-header h4" v-if="dmsBillsLubeInstanceActivityList.length > 0">1</h4>
<el-row v-if="dmsBillsLubeInstanceActivityList.length > 0">
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="form.lubeLevel" placeholder="润滑级别" disabled>
<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="请输入润滑组别" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 中间步骤 (已处理的后续节点) -->
<template v-for="(activity) in dmsBillsLubeInstanceActivityList" :key="activity.instanceActivityId">
<div v-if="activity.processStepOrder && activity.processStepOrder > 1">
<h4 class="form-header h4">{{ `已处理节点:步骤${activity.processStepOrder}` }}</h4>
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别">
<el-select
v-model="activity.lubeLevel"
placeholder="润滑级别"
disabled>
<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="润滑组别">
<el-input
v-model="activity.lubeGroup"
disabled
placeholder="润滑组别">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人">
<el-input
v-model="activity.lubeSupervisor"
disabled
placeholder="润滑负责人">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见">
<el-input
v-model="activity.processHandleResolution"
disabled
placeholder="处理意见">
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</template>
<!-- 当前步骤表单 (用于提交新节点) -->
<div v-if="isUpdate">
<!-- <h4 class="form-header h4" v-if="wfProcessActivityList.length > dmsBillsLubeInstanceActivityList.length">
{{wfProcessActivityList[dmsBillsLubeInstanceActivityList.length]?.processActivityName}}
</h4> -->
<h4 class="form-header h4">当前处理节点步骤{{ nextStepOrder }}</h4>
<el-form ref="nextStepFormRef" :model="nextStepForm" :rules="nextStepFormRules" label-width="100px">
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="nextStepForm.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="nextStepForm.lubeGroup" placeholder="润滑组别"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="nextStepForm.lubeSupervisor" placeholder="润滑负责人"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见" prop="processHandleResolution">
<el-input v-model="nextStepForm.processHandleResolution" placeholder="处理意见"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="text-center mt-4">
<el-button type="primary" @click="submitForm"> </el-button>
</el-col>
</el-row>
</el-form>
</div>
</el-form>
</el-card>
<!-- 润滑计划详情区域 -->
<el-card shadow="never">
<h4 class="form-header h4 text-center">润滑计划详细信息</h4>
<el-table v-loading="loading" :data="planLubeDetail">
<el-table-column label="计划ID" align="center" prop="planLubeId" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="润滑部位" align="center" prop="lubeStationName" />
<el-table-column label="润滑标准" align="center" prop="lubeStandardCode" />
<el-table-column label="操作描述" align="center" prop="operationDescription" />
</el-table>
</el-card>
</div>
</template>
<script setup name="DmsBillsLubeInstanceActivity" lang="ts">
import { ref, reactive, toRefs, getCurrentInstance, onMounted, computed } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import type { FormInstance, FormRules } from 'element-plus'; // FormInstance FormRules
import {
listDmsBillsLubeInstanceActivity,
addDmsBillsLubeInstanceActivity
// getDmsBillsLubeInstanceActivity, //
} from '@/api/dms/dmsBillsLubeInstanceActivity';
import {
DmsBillsLubeInstanceActivityVO,
DmsBillsLubeInstanceActivityForm
} from '@/api/dms/dmsBillsLubeInstanceActivity/types';
import { listDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
// import { getDmsPlanLubeDetail } from '@/api/dms/dmsPlanLubeDetail'; // 使API
import { getDmsPlanLubeDetail } from '@/api/dms/dmsPlanLubeDetail'; // API
// import { getDmsBillsLubeInstanceActivity } from '@/api/dms/dmsBillsLubeInstanceActivity'; //
// import { useUserStore } from '@/store/modules/user'; //
import {DmsPlanLubeDetailVO} from "@/api/dms/dmsPlanLubeDetail/types";
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
// useDict 'dms_lube_status' billsStatusCheck
// Vue 3 billsStatusCheck 使 lube_level
// dms_lube_status proxy?.useDict('lube_level', 'process_handle_status', 'dms_lube_status');
const { lube_level, process_handle_status } = toRefs<any>(proxy?.useDict('lube_level', 'process_handle_status'));
const route = useRoute();
// const router = useRouter(); //
// const userStore = useUserStore(); //
//
const stepFormRef = ref<FormInstance>(); // ref
const nextStepFormRef = ref<FormInstance>(); // ref
//
const loading = ref(true);
const dmsBillsLubeInstanceActivityList = ref<DmsBillsLubeInstanceActivityVO[]>([]);
// const wfProcessActivityList = ref<any[]>([]); //
const billsInfo = ref<any>({}); // dmsBillsLubeInstanceList[0]
const planLubeDetail = ref<DmsPlanLubeDetailVO[]>([]);
const billsStatusCheck = ref(''); //
const isUpdate = ref(true); //
const planLubeId = ref(''); // ID
// const currentStepOrder = ref(0); // Vue3disabled
const lubeInstanceId = route.params.lubeInstanceId as string; //
//
const nextStepOrder = computed(() => {
return dmsBillsLubeInstanceActivityList.value.length + 1;
});
// (wfProcessActivityList)
// const canSubmitNext = computed(() => {
// return dmsBillsLubeInstanceActivityList.value.length < wfProcessActivityList.value.length;
// });
// ()
const form = reactive<Partial<DmsBillsLubeInstanceActivityForm>>({ // 使 Partial
// instanceActivityId: undefined, //
// lubeInstanceId: undefined, //
// wfDefinitionId: undefined, //
// wfNodeId: undefined, //
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
// processHandleResolution: undefined, //
// processHandleStatus: undefined, //
// processStepOrder: undefined, //
// startTime: undefined, //
// endTime: undefined, //
// handleUserId: undefined, //
// handleBy: undefined, //
// handleTime: undefined, //
// transferUserId: undefined, //
// attr1: undefined, //
remark: undefined, //
});
// ()
const nextStepForm = reactive<DmsBillsLubeInstanceActivityForm>({
instanceActivityId: undefined, //
lubeInstanceId: lubeInstanceId, //
// wfDefinitionId: undefined, //
// wfNodeId: undefined, //
// processActivityId: undefined, //
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: undefined,
processHandleStatus: undefined, //
processStepOrder: undefined, // getList
startTime: undefined, //
endTime: undefined, //
handleUserId: undefined, // store
handleBy: undefined, // store
handleTime: undefined, //
transferUserId: undefined,
attr1: undefined,
remark: undefined,
// wfLength: undefined, //
});
//
const nextStepFormRules = reactive<FormRules>({
lubeLevel: [{ required: true, message: "润滑级别不能为空", trigger: "change" }],
lubeGroup: [{ required: true, message: "润滑组别不能为空", trigger: "blur" }],
lubeSupervisor: [{ required: true, message: "润滑负责人不能为空", trigger: "blur" }],
processHandleResolution: [{ required: true, message: "处理意见不能为空", trigger: "blur" }],
});
//
const queryParams = reactive({
pageNum: 1,
pageSize: 50, //
lubeInstanceId: lubeInstanceId,
});
//
onMounted(() => {
//
if(route.name === 'childDmsBillsLubeInstanceActivity') {
isUpdate.value = true;
} else if(route.name === 'selectChildDmsBillsLubeInstanceActivity') {
isUpdate.value = false;
}
//
getDmsBillsLubeInstance();
//
getList();
});
// ( getDmsBillsLubeInstance)
const getDmsBillsLubeInstance = async () => {
try {
// queryParams.lubeInstanceId = lubeInstanceId; // queryParamslubeInstanceId
const res = await listDmsBillsLubeInstance(queryParams); // queryParams reactive .value
if (res.rows && res.rows.length > 0) {
billsInfo.value = res.rows[0];
// planLubeId
const lubeIdFromServer = res.rows[0].planLubeId;
planLubeId.value = typeof lubeIdFromServer === 'number' ? String(lubeIdFromServer) : lubeIdFromServer;
// ()
// 使 dms_lube_status Vue3使 lube_level
// useDict Vue3
if (lube_level.value && billsInfo.value.lubeStatus !== undefined) {
const statusItem = lube_level.value.find((item: any) => String(item.value) === String(billsInfo.value.lubeStatus));
billsStatusCheck.value = statusItem ? statusItem.label : '未知状态';
} else {
billsStatusCheck.value = '未知状态';
}
// ( getWfprocessActivity)
// getWfprocessActivity(res.rows[0].wfProcessId || 106); //
// ( selectDmsBillsLubeDetail)
if (planLubeId.value) {
getPlanLubeDetailData(); // API
}
} else {
proxy?.$modal.msgError("未查询到工单信息");
}
} catch (error) {
console.error('获取工单实例数据失败', error);
proxy?.$modal.msgError("获取工单实例数据失败");
}
};
// ( getWfprocessActivity)
// const getWfprocessActivity = async (wfProcessId: number) => {
// // (wfProcessActivityList)
// // dmsBillsLubeInstanceActivityList 'name'
// //
// // try {
// // const res = await listWfprocessactivity({ wfProcessId }); // API
// // wfProcessActivityList.value = res.rows;
// //
// // //
// // if (dmsBillsLubeInstanceActivityList.value.length > 0 && wfProcessActivityList.value.length > 0) {
// // dmsBillsLubeInstanceActivityList.value.forEach(activity => {
// // const matchedProcess = wfProcessActivityList.value.find(
// // process => process.processActivityOrder === activity.processStepOrder
// // );
// // if (matchedProcess) {
// // activity.name = matchedProcess.processActivityName;
// // }
// // });
// // }
// //
// // // ( checkUserPermission )
// // checkUserPermission();
// // } catch (error) {
// // console.error('', error);
// // }
// };
// ( selectDmsBillsLubeDetail)
const getPlanLubeDetailData = async () => { // API
if (!planLubeId.value) return;
loading.value = true; //
try {
const res = await getDmsPlanLubeDetail(planLubeId.value); // 使 planLubeId.value
// res.rows 使
planLubeDetail.value = res && res.rows ? [res.rows] : [];
} catch (error) {
console.error('获取润滑计划详情失败', error);
proxy?.$modal.msgError("获取润滑计划详情失败");
} finally {
// loading.value = false; // loading getList
}
};
// ( getList)
const getList = async () => {
loading.value = true;
try {
const res = await listDmsBillsLubeInstanceActivity(queryParams); // queryParams reactive
dmsBillsLubeInstanceActivityList.value = res.rows;
// ()
if (res.rows && res.rows.length > 0) {
Object.assign(form, {
lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor,
lubeLevel: res.rows[0].lubeLevel,
remark: res.rows[0].remark // form
});
// ()
const lastActivity = res.rows[res.rows.length - 1];
Object.assign(nextStepForm, {
lubeGroup: lastActivity.lubeGroup,
lubeSupervisor: lastActivity.lubeSupervisor,
lubeLevel: lastActivity.lubeLevel,
processHandleResolution: null, //
remark: '' //
// processStepOrder 使 nextStepOrder.value
});
// currentStepOrder.value = res.rows.length + 1; // Vue3disabled
} else {
// nextStepForm
Object.assign(nextStepForm, { //
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: null,
remark: ''
});
}
// getWfprocessActivity 便
// listWfprocessactivity(this.queryParamWfProcessActivity).then(response=>{
// this.wfProcessActivityList = response.rows;
// this.getselectUserIdByRepairInstanceId(); //
// });
// ( getselectUserIdByRepairInstanceId)
// checkUserPermission();
} catch (error) {
console.error('获取工单实例节点数据失败', error);
proxy?.$modal.msgError("获取工单实例节点数据失败");
} finally {
loading.value = false;
}
};
// ( checkUserPermission getselectUserIdByRepairInstanceId)
// const checkUserPermission = async () => {
// //
// // wfProcessActivityList API ( selectUserIdByDmsBillsLubeInstanceActivityId)
// // API/
// // if (dmsBillsLubeInstanceActivityList.value.length === wfProcessActivityList.value.length) { // wfProcessActivityList
// // try {
// // const hasPermission = await getDmsBillsLubeInstanceActivity( // API
// // lubeInstanceId,
// // userStore.userId // userStore
// // );
// //
// // if (!hasPermission) {
// // proxy?.$modal.alert("");
// // //
// // // proxy?.$store.dispatch("tagsView/delView", route); // Vuex store dispatch
// // //
// // // router.replace({ path: "/dms/deviceLube/dmsBillsLubeInstance" }); // router
// // }
// // } catch (error) {
// // console.error('', error);
// // }
// // }
// };
// ( submitForm)
const submitForm = async () => {
if (!nextStepFormRef.value) return;
await nextStepFormRef.value.validate(async (valid) => {
if (valid) {
try {
//
nextStepForm.processStepOrder = nextStepOrder.value;
nextStepForm.lubeInstanceId = lubeInstanceId; // lubeInstanceId
// ()
// if (wfProcessActivityList.value.length > 0) {
// const currentProcess = wfProcessActivityList.value.find(
// process => process.processActivityOrder === nextStepOrder.value
// );
// if (currentProcess) {
// nextStepForm.processActivityId = currentProcess.processActivityId;
// }
// }
// nextStepForm.wfLength = wfProcessActivityList.value.length;
//
await addDmsBillsLubeInstanceActivity(nextStepForm);
proxy?.$modal.msgSuccess("提交成功");
//
await getList(); //
// nextStepForm
// nextStepFormRef.value.resetFields(); //
} catch (error) {
console.error('提交失败', error);
proxy?.$modal.msgError("提交失败,请检查数据或联系管理员");
}
} else {
proxy?.$modal.msgError("表单校验失败,请检查输入项");
}
});
};
</script>
<style scoped>
.form-header {
font-size: 15px;
color: #409eff;
border-bottom: 1px solid #ddd;
margin: 8px 0 15px;
padding-bottom: 10px;
}
</style>

@ -0,0 +1,450 @@
<template>
<div class="p-2">
<!-- 工单信息区域 -->
<h4 class="form-header h4">工单信息</h4>
<el-card shadow="never" class="mb-[10px]">
<el-form label-width="120px">
<el-row>
<el-col :span="8" :offset="2">
<el-form-item label="工单编号">
<el-input v-model="billsInfo.billsLubeCode" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="工单状态">
<el-input v-model="billsStatusCheck" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请人">
<el-input v-model="billsInfo.createBy" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请时间">
<el-input v-model="billsInfo.createTime" disabled />
</el-form-item>
</el-col>
<el-col :span="16" :offset="2">
<el-form-item label="备注">
<el-input v-model="billsInfo.remark" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<!-- 流程步骤展示区域 -->
<el-card shadow="never" class="mb-[10px]">
<el-form ref="stepFormRef" :model="form" label-width="100px">
<!-- 第一步 -->
<h4 class="form-header h4" v-if="dmsBillsLubeInstanceActivityList.length > 0">1</h4>
<el-row v-if="dmsBillsLubeInstanceActivityList.length > 0">
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="form.lubeLevel" placeholder="润滑级别" disabled>
<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="请输入润滑组别" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 中间步骤 (已处理的后续节点) -->
<template v-for="(activity) in dmsBillsLubeInstanceActivityList" :key="activity.instanceActivityId">
<div v-if="activity.processStepOrder && activity.processStepOrder > 1">
<h4 class="form-header h4">{{ `已处理节点:步骤${activity.processStepOrder}` }}</h4>
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别">
<el-select
v-model="activity.lubeLevel"
placeholder="润滑级别"
disabled>
<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="润滑组别">
<el-input
v-model="activity.lubeGroup"
disabled
placeholder="润滑组别">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人">
<el-input
v-model="activity.lubeSupervisor"
disabled
placeholder="润滑负责人">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见">
<el-input
v-model="activity.processHandleResolution"
disabled
placeholder="处理意见">
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</template>
<!-- 当前步骤表单 (用于提交新节点) -->
<div v-if="isUpdate">
<h4 class="form-header h4">当前处理节点步骤{{ nextStepOrder }}</h4>
<el-form ref="nextStepFormRef" :model="nextStepForm" :rules="nextStepFormRules" label-width="100px">
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="nextStepForm.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="nextStepForm.lubeGroup" placeholder="润滑组别"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="nextStepForm.lubeSupervisor" placeholder="润滑负责人"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见" prop="processHandleResolution">
<el-input v-model="nextStepForm.processHandleResolution" placeholder="处理意见"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="text-center mt-4">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button v-if="billsInfo && billsInfo.lubeInstanceId !== null && billsInfo.status !== 'draft'" type='primary'
@click='handleApprovalRecord'>
流程进度
</el-button>
</el-col>
</el-row>
</el-form>
</div>
</el-form>
</el-card>
<!-- 润滑计划详情区域 -->
<el-card shadow="never">
<h4 class="form-header h4 text-center">润滑计划详细信息</h4>
<el-table v-loading="loading" :data="planLubeDetail">
<el-table-column label="计划ID" align="center" prop="planLubeId" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="润滑部位" align="center" prop="lubeStationName" />
<el-table-column label="润滑标准" align="center" prop="lubeStandardCode" />
<el-table-column label="操作描述" align="center" prop="operationDescription" />
</el-table>
</el-card>
<!-- 提交组件 -->
<submitVerify ref='submitVerifyRef' :task-variables='taskVariables' @submit-callback='submitCallback' />
<!-- 审批记录 -->
<approvalRecord ref='approvalRecordRef' />
</div>
</template>
<script setup name="DmsBillsLubeInstanceActivity" lang="ts">
import { ref, reactive, toRefs, getCurrentInstance, onMounted, computed } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import type { FormInstance, FormRules } from 'element-plus'; // FormInstance FormRules
import {
listDmsBillsLubeInstanceActivity,
addDmsBillsLubeInstanceActivity
} from '@/api/dms/dmsBillsLubeInstanceActivity';
import {
DmsBillsLubeInstanceActivityVO,
DmsBillsLubeInstanceActivityForm
} from '@/api/dms/dmsBillsLubeInstanceActivity/types';
import { listDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
import { getDmsPlanLubeDetail } from '@/api/dms/dmsPlanLubeDetail';
import {DmsPlanLubeDetailVO} from "@/api/dms/dmsPlanLubeDetail/types";
// API
import { startWorkFlow } from '@/api/workflow/task';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { lube_level, process_handle_status } = toRefs<any>(proxy?.useDict('lube_level', 'process_handle_status'));
const route = useRoute();
//
const stepFormRef = ref<FormInstance>(); // ref
const nextStepFormRef = ref<FormInstance>(); // ref
//
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const taskVariables = ref<Record<string, any>>({});
const submitFormData = ref<StartProcessBo>({
businessId: '',
flowCode: 'lubeProcess', // lubeProcess
variables: {}
});
//
const loading = ref(true);
const dmsBillsLubeInstanceActivityList = ref<DmsBillsLubeInstanceActivityVO[]>([]);
const billsInfo = ref<any>({}); //
const planLubeDetail = ref<DmsPlanLubeDetailVO[]>([]);
const billsStatusCheck = ref(''); //
const isUpdate = ref(true); //
const planLubeId = ref(''); // ID
const lubeInstanceId = route.params.lubeInstanceId as string; //
const buttonLoading = ref(false);
//
const nextStepOrder = computed(() => {
return dmsBillsLubeInstanceActivityList.value.length + 1;
});
// ()
const form = reactive<Partial<DmsBillsLubeInstanceActivityForm>>({
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
remark: undefined,
});
// ()
const nextStepForm = reactive<DmsBillsLubeInstanceActivityForm>({
instanceActivityId: undefined,
lubeInstanceId: lubeInstanceId,
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: undefined,
processHandleStatus: undefined,
processStepOrder: undefined,
startTime: undefined,
endTime: undefined,
handleUserId: undefined,
handleBy: undefined,
handleTime: undefined,
transferUserId: undefined,
attr1: undefined,
remark: undefined,
});
//
const nextStepFormRules = reactive<FormRules>({
lubeLevel: [{ required: true, message: "润滑级别不能为空", trigger: "change" }],
lubeGroup: [{ required: true, message: "润滑组别不能为空", trigger: "blur" }],
lubeSupervisor: [{ required: true, message: "润滑负责人不能为空", trigger: "blur" }],
processHandleResolution: [{ required: true, message: "处理意见不能为空", trigger: "blur" }],
});
//
const queryParams = reactive({
pageNum: 1,
pageSize: 50,
lubeInstanceId: lubeInstanceId,
});
//
onMounted(() => {
//
if(route.name === 'childDmsBillsLubeInstanceActivity') {
isUpdate.value = true;
} else if(route.name === 'selectChildDmsBillsLubeInstanceActivity') {
isUpdate.value = false;
}
//
getDmsBillsLubeInstance();
//
getList();
});
//
const getDmsBillsLubeInstance = async () => {
try {
const res = await listDmsBillsLubeInstance(queryParams);
if (res.rows && res.rows.length > 0) {
billsInfo.value = res.rows[0];
// planLubeId
const lubeIdFromServer = res.rows[0].planLubeId;
planLubeId.value = typeof lubeIdFromServer === 'number' ? String(lubeIdFromServer) : lubeIdFromServer;
//
if (lube_level.value && billsInfo.value.lubeStatus !== undefined) {
const statusItem = lube_level.value.find((item: any) => String(item.value) === String(billsInfo.value.lubeStatus));
billsStatusCheck.value = statusItem ? statusItem.label : '未知状态';
} else {
billsStatusCheck.value = '未知状态';
}
//
if (planLubeId.value) {
getPlanLubeDetailData();
}
} else {
proxy?.$modal.msgError("未查询到工单信息");
}
} catch (error) {
console.error('获取工单实例数据失败', error);
proxy?.$modal.msgError("获取工单实例数据失败");
}
};
//
const getPlanLubeDetailData = async () => {
if (!planLubeId.value) return;
loading.value = true;
try {
const res = await getDmsPlanLubeDetail(planLubeId.value);
planLubeDetail.value = res && res.rows ? [res.rows] : [];
} catch (error) {
console.error('获取润滑计划详情失败', error);
proxy?.$modal.msgError("获取润滑计划详情失败");
}
};
//
const getList = async () => {
loading.value = true;
try {
const res = await listDmsBillsLubeInstanceActivity(queryParams);
dmsBillsLubeInstanceActivityList.value = res.rows;
// ()
if (res.rows && res.rows.length > 0) {
Object.assign(form, {
lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor,
lubeLevel: res.rows[0].lubeLevel,
remark: res.rows[0].remark
});
// ()
const lastActivity = res.rows[res.rows.length - 1];
Object.assign(nextStepForm, {
lubeGroup: lastActivity.lubeGroup,
lubeSupervisor: lastActivity.lubeSupervisor,
lubeLevel: lastActivity.lubeLevel,
processHandleResolution: null,
remark: ''
});
} else {
// nextStepForm
Object.assign(nextStepForm, {
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: null,
remark: ''
});
}
} catch (error) {
console.error('获取工单实例节点数据失败', error);
proxy?.$modal.msgError("获取工单实例节点数据失败");
} finally {
loading.value = false;
}
};
//
const submitForm = async () => {
if (!nextStepFormRef.value) return;
await nextStepFormRef.value.validate(async (valid) => {
if (valid) {
try {
buttonLoading.value = true;
//
nextStepForm.processStepOrder = nextStepOrder.value;
nextStepForm.lubeInstanceId = lubeInstanceId;
//
const res = await addDmsBillsLubeInstanceActivity(nextStepForm);
//
await handleStartWorkFlow(res.data);
} catch (error) {
console.error('提交失败', error);
proxy?.$modal.msgError("提交失败,请检查数据或联系管理员");
buttonLoading.value = false;
}
} else {
proxy?.$modal.msgError("表单校验失败,请检查输入项");
}
});
};
//
const handleStartWorkFlow = async (data: any) => {
try {
submitFormData.value.businessId = lubeInstanceId;
//
taskVariables.value = {
data: data
};
submitFormData.value.variables = taskVariables.value;
const resp = await startWorkFlow(submitFormData.value);
if (submitVerifyRef.value) {
buttonLoading.value = false;
submitVerifyRef.value.openDialog(resp.data.taskId);
}
} finally {
buttonLoading.value = false;
}
};
//
const handleApprovalRecord = () => {
approvalRecordRef.value.init(lubeInstanceId);
};
//
const submitCallback = async () => {
await getList(); //
proxy?.$modal.msgSuccess("操作成功");
};
</script>
<style scoped>
.form-header {
font-size: 15px;
color: #409eff;
border-bottom: 1px solid #ddd;
margin: 8px 0 15px;
padding-bottom: 10px;
}
</style>

@ -0,0 +1,476 @@
<template>
<div class="p-2">
<!-- 工单信息区域 -->
<h4 class="form-header h4">工单信息</h4>
<el-card shadow="never" class="mb-[10px]">
<el-form label-width="120px">
<el-row>
<el-col :span="8" :offset="2">
<el-form-item label="工单编号">
<el-input v-model="billsInfo.billsLubeCode" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="工单状态">
<el-input v-model="billsStatusCheck" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请人">
<el-input v-model="billsInfo.createBy" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请时间">
<el-input v-model="billsInfo.createTime" disabled />
</el-form-item>
</el-col>
<el-col :span="16" :offset="2">
<el-form-item label="备注">
<el-input v-model="billsInfo.remark" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<!-- 流程步骤展示区域 -->
<el-card shadow="never" class="mb-[10px]">
<el-form ref="stepFormRef" :model="form" label-width="100px">
<!-- 第一步 -->
<h4 class="form-header h4" v-if="dmsBillsLubeInstanceActivityList.length > 0">1</h4>
<el-row v-if="dmsBillsLubeInstanceActivityList.length > 0">
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="form.lubeLevel" placeholder="润滑级别" disabled>
<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="请输入润滑组别" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 中间步骤 (已处理的后续节点) -->
<template v-for="(activity) in dmsBillsLubeInstanceActivityList" :key="activity.instanceActivityId">
<div v-if="activity.processStepOrder && activity.processStepOrder > 1">
<h4 class="form-header h4">{{ `已处理节点:步骤${activity.processStepOrder}(实际参数)` }}</h4>
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别">
<el-select
v-model="activity.lubeLevel"
placeholder="润滑级别"
disabled>
<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="润滑组别">
<el-input
v-model="activity.lubeGroup"
disabled
placeholder="润滑组别">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人">
<el-input
v-model="activity.lubeSupervisor"
disabled
placeholder="润滑负责人">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见">
<el-input
v-model="activity.processHandleResolution"
disabled
placeholder="处理意见">
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</template>
<!-- 当前步骤表单 (用于提交新节点) -->
<div v-if="isUpdate">
<h4 class="form-header h4">当前处理节点步骤{{ nextStepOrder }}{{ nextStepOrder === 2 ? '(实际参数)' : '' }}</h4>
<el-form ref="nextStepFormRef" :model="nextStepForm" :rules="nextStepFormRules" label-width="100px">
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="nextStepForm.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="nextStepForm.lubeGroup" placeholder="润滑组别"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="nextStepForm.lubeSupervisor" placeholder="润滑负责人"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="nextStepOrder > 1">
<el-form-item label="处理意见" prop="processHandleResolution">
<el-input v-model="nextStepForm.processHandleResolution" placeholder="处理意见"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="text-center mt-4">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button v-if="billsInfo && billsInfo.lubeInstanceId !== null && billsInfo.status !== 'draft'" type='primary'
@click='handleApprovalRecord'>
流程进度
</el-button>
</el-col>
</el-row>
</el-form>
</div>
</el-form>
</el-card>
<!-- 润滑计划详情区域 -->
<el-card shadow="never">
<h4 class="form-header h4 text-center">润滑计划详细信息</h4>
<el-table v-loading="loading" :data="planLubeDetail">
<el-table-column label="计划ID" align="center" prop="planLubeId" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="润滑部位" align="center" prop="lubeStationName" />
<el-table-column label="润滑标准" align="center" prop="lubeStandardCode" />
<el-table-column label="操作描述" align="center" prop="operationDescription" />
</el-table>
</el-card>
<!-- 提交组件 -->
<submitVerify ref='submitVerifyRef' :task-variables="taskVariables as any" @submit-callback='submitCallback' />
<!-- 审批记录 -->
<approvalRecord ref='approvalRecordRef' />
</div>
</template>
<script setup name="DmsBillsLubeInstanceActivity" lang="ts">
import { ref, reactive, toRefs, getCurrentInstance, onMounted, computed } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import type { FormInstance, FormRules } from 'element-plus'; // FormInstance FormRules
import {
listDmsBillsLubeInstanceActivity,
addDmsBillsLubeInstanceActivity
} from '@/api/dms/dmsBillsLubeInstanceActivity';
import {
DmsBillsLubeInstanceActivityVO,
DmsBillsLubeInstanceActivityForm
} from '@/api/dms/dmsBillsLubeInstanceActivity/types';
import { listDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
import { getDmsPlanLubeDetail } from '@/api/dms/dmsPlanLubeDetail';
import {DmsPlanLubeDetailVO} from "@/api/dms/dmsPlanLubeDetail/types";
// API
import { startWorkFlow } from '@/api/workflow/task';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { lube_level, process_handle_status } = toRefs<any>(proxy?.useDict('lube_level', 'process_handle_status'));
const route = useRoute();
//
const stepFormRef = ref<FormInstance>(); // ref
const nextStepFormRef = ref<FormInstance>(); // ref
//
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const taskVariables = ref<any>({});
const submitFormData = ref<StartProcessBo>({
businessId: '',
flowCode: 'lubeProcess', // lubeProcess
variables: {}
});
//
const loading = ref(true);
const dmsBillsLubeInstanceActivityList = ref<DmsBillsLubeInstanceActivityVO[]>([]);
const billsInfo = ref<any>({}); //
const planLubeDetail = ref<DmsPlanLubeDetailVO[]>([]);
const billsStatusCheck = ref(''); //
const isUpdate = ref(true); //
const planLubeId = ref(''); // ID
const lubeInstanceId = route.params.lubeInstanceId as string; //
const buttonLoading = ref(false);
//
const nextStepOrder = computed(() => {
return dmsBillsLubeInstanceActivityList.value.length + 1;
});
// ()
const form = reactive<Partial<DmsBillsLubeInstanceActivityForm>>({
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
remark: undefined,
});
// ()
const nextStepForm = reactive<DmsBillsLubeInstanceActivityForm>({
instanceActivityId: undefined,
lubeInstanceId: lubeInstanceId,
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: undefined,
processHandleStatus: undefined,
processStepOrder: undefined,
startTime: undefined,
endTime: undefined,
handleUserId: undefined,
handleBy: undefined,
handleTime: undefined,
transferUserId: undefined,
attr1: undefined,
remark: undefined,
});
//
const nextStepFormRules = reactive<FormRules>({
lubeLevel: [{ required: true, message: "润滑级别不能为空", trigger: "change" }],
lubeGroup: [{ required: true, message: "润滑组别不能为空", trigger: "blur" }],
lubeSupervisor: [{ required: true, message: "润滑负责人不能为空", trigger: "blur" }],
//
processHandleResolution: [{ required: nextStepOrder.value > 1, message: "处理意见不能为空", trigger: "blur" }],
});
//
const queryParams = reactive({
pageNum: 1,
pageSize: 50,
lubeInstanceId: lubeInstanceId,
});
//
onMounted(() => {
//
if(route.name === 'childDmsBillsLubeInstanceActivity') {
isUpdate.value = true;
} else if(route.name === 'selectChildDmsBillsLubeInstanceActivity') {
isUpdate.value = false;
}
//
getDmsBillsLubeInstance();
//
getList();
});
//
const getDmsBillsLubeInstance = async () => {
try {
const res = await listDmsBillsLubeInstance(queryParams);
if (res.rows && res.rows.length > 0) {
billsInfo.value = res.rows[0];
// planLubeId
const lubeIdFromServer = res.rows[0].planLubeId;
planLubeId.value = typeof lubeIdFromServer === 'number' ? String(lubeIdFromServer) : lubeIdFromServer;
//
if (lube_level.value && billsInfo.value.lubeStatus !== undefined) {
const statusItem = lube_level.value.find((item: any) => String(item.value) === String(billsInfo.value.lubeStatus));
billsStatusCheck.value = statusItem ? statusItem.label : '未知状态';
} else {
billsStatusCheck.value = '未知状态';
}
//
if (planLubeId.value) {
getPlanLubeDetailData();
}
} else {
proxy?.$modal.msgError("未查询到工单信息");
}
} catch (error) {
console.error('获取工单实例数据失败', error);
proxy?.$modal.msgError("获取工单实例数据失败");
}
};
//
const getPlanLubeDetailData = async () => {
if (!planLubeId.value) return;
loading.value = true;
try {
const res = await getDmsPlanLubeDetail(planLubeId.value);
planLubeDetail.value = res && res.rows ? [res.rows] : [];
} catch (error) {
console.error('获取润滑计划详情失败', error);
proxy?.$modal.msgError("获取润滑计划详情失败");
}
};
//
const getList = async () => {
loading.value = true;
try {
const res = await listDmsBillsLubeInstanceActivity(queryParams);
dmsBillsLubeInstanceActivityList.value = res.rows;
// ()
if (res.rows && res.rows.length > 0) {
Object.assign(form, {
lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor,
lubeLevel: res.rows[0].lubeLevel,
remark: res.rows[0].remark
});
//
if (nextStepOrder.value === 2) {
//
Object.assign(nextStepForm, {
lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor,
lubeLevel: res.rows[0].lubeLevel,
processHandleResolution: null, //
remark: ''
});
} else if (nextStepOrder.value > 2) {
// 使
const lastActivity = res.rows[res.rows.length - 1];
Object.assign(nextStepForm, {
lubeGroup: lastActivity.lubeGroup,
lubeSupervisor: lastActivity.lubeSupervisor,
lubeLevel: lastActivity.lubeLevel,
processHandleResolution: null, //
remark: ''
});
}
} else {
// nextStepForm
Object.assign(nextStepForm, {
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: null,
remark: ''
});
}
//
nextStepFormRules.processHandleResolution = [{
required: nextStepOrder.value > 1,
message: "处理意见不能为空",
trigger: "blur"
}];
} catch (error) {
console.error('获取工单实例节点数据失败', error);
proxy?.$modal.msgError("获取工单实例节点数据失败");
} finally {
loading.value = false;
}
};
//
const submitForm = async () => {
if (!nextStepFormRef.value) return;
await nextStepFormRef.value.validate(async (valid) => {
if (valid) {
try {
buttonLoading.value = true;
//
nextStepForm.processStepOrder = nextStepOrder.value;
nextStepForm.lubeInstanceId = lubeInstanceId;
//
if (nextStepOrder.value === 1) {
nextStepForm.processHandleResolution = null;
}
//
const res = await addDmsBillsLubeInstanceActivity(nextStepForm);
//
await handleStartWorkFlow(res.data);
} catch (error) {
console.error('提交失败', error);
proxy?.$modal.msgError("提交失败,请检查数据或联系管理员");
buttonLoading.value = false;
}
} else {
proxy?.$modal.msgError("表单校验失败,请检查输入项");
}
});
};
//
const handleStartWorkFlow = async (data: any) => {
try {
submitFormData.value.businessId = lubeInstanceId;
//
taskVariables.value = {
data: data
};
submitFormData.value.variables = taskVariables.value;
const resp = await startWorkFlow(submitFormData.value);
if (submitVerifyRef.value) {
buttonLoading.value = false;
submitVerifyRef.value.openDialog(resp.data.taskId);
}
} finally {
buttonLoading.value = false;
}
};
//
const handleApprovalRecord = () => {
approvalRecordRef.value.init(lubeInstanceId);
};
//
const submitCallback = async () => {
await getList(); //
proxy?.$modal.msgSuccess("操作成功");
};
</script>
<style scoped>
.form-header {
font-size: 15px;
color: #409eff;
border-bottom: 1px solid #ddd;
margin: 8px 0 15px;
padding-bottom: 10px;
}
</style>

@ -4,49 +4,75 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<!-- <el-form-item label="主键标识" prop="billsLubeDetailId"> <el-form-item label="润滑工单实例节点ID" prop="instanceActivityId">
<el-input v-model="queryParams.billsLubeDetailId" placeholder="请输入主键标识" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.instanceActivityId" placeholder="请输入润滑工单实例节点ID" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="润滑工单" prop="lubeInstanceId"> <el-form-item label="润滑工单实例ID关联dms_bills_lube_instance的lube_instance_id" prop="lubeInstanceId">
<el-input v-model="queryParams.lubeInstanceId" placeholder="请输入润滑工单" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.lubeInstanceId" placeholder="请输入润滑工单实例ID关联dms_bills_lube_instance的lube_instance_id" clearable @keyup.enter="handleQuery" />
</el-form-item>--> </el-form-item>
<!-- <el-form-item label="设备" prop="machineId"> <el-form-item label="流程定义ID,关联wf_definition_config的id" prop="wfDefinitionId">
<el-input v-model="queryParams.machineId" placeholder="请输入设备" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.wfDefinitionId" placeholder="请输入流程定义ID,关联wf_definition_config的id" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="润滑部位" prop="lubeStationId"> <el-form-item label="工单流程节点ID" prop="wfNodeId">
<el-input v-model="queryParams.lubeStationId" placeholder="请输入润滑部位" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.wfNodeId" placeholder="请输入工单流程节点ID" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="润滑标准" prop="lubeStandardId"> <el-form-item label="润滑组别;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" prop="lubeGroup">
<el-input v-model="queryParams.lubeStandardId" placeholder="请输入润滑标准" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.lubeGroup" placeholder="请输入润滑组别;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="操作描述" prop="operationDescription"> <el-form-item label="润滑负责人;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" prop="lubeSupervisor">
<el-input v-model="queryParams.operationDescription" placeholder="请输入操作描述" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.lubeSupervisor" placeholder="请输入润滑负责人;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" clearable @keyup.enter="handleQuery" />
</el-form-item>--> </el-form-item>
<el-form-item label="润滑状态" prop="maintStatus"> <el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="queryParams.maintStatus" placeholder="请选择润滑状态" clearable > <el-select v-model="queryParams.lubeLevel" placeholder="请选择润滑级别" clearable >
<el-option v-for="dict in lube_status" :key="dict.value" :label="dict.label" :value="dict.value"/> <el-option v-for="dict in lube_level" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="润滑开始时间" prop="beginTime" label-width="100px"> <el-form-item label="处理意见;第1步不显示从第2步只显示此字段" prop="processHandleResolution">
<el-input v-model="queryParams.processHandleResolution" placeholder="请输入处理意见;第1步不显示从第2步只显示此字段" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="状态(0已结束 1执行中 2待接取 3已转发" prop="processHandleStatus">
<el-select v-model="queryParams.processHandleStatus" placeholder="请选择状态(0已结束 1执行中 2待接取 3已转发" clearable >
<el-option v-for="dict in process_handle_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="工单流程步骤顺序" prop="processStepOrder">
<el-input v-model="queryParams.processStepOrder" placeholder="请输入工单流程步骤顺序" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="执行开始时间" prop="startTime">
<el-date-picker clearable <el-date-picker clearable
v-model="queryParams.beginTime" v-model="queryParams.startTime"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="请选择润滑开始时间" placeholder="请选择执行开始时间"
/> />
</el-form-item> </el-form-item>
<!-- <el-form-item label="润滑结束时间" prop="endTime"> <el-form-item label="执行结束时间" prop="endTime">
<el-date-picker clearable <el-date-picker clearable
v-model="queryParams.endTime" v-model="queryParams.endTime"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="请选择润滑结束时间" placeholder="请选择执行结束时间"
/> />
</el-form-item>--> </el-form-item>
<el-form-item label="激活标识" prop="activeFlag"> <el-form-item label="处理人ID" prop="handleUserId">
<el-select v-model="queryParams.activeFlag" placeholder="请选择激活标识" clearable > <el-input v-model="queryParams.handleUserId" placeholder="请输入处理人ID" clearable @keyup.enter="handleQuery" />
<el-option v-for="dict in active_flag" :key="dict.value" :label="dict.label" :value="dict.value"/> </el-form-item>
</el-select> <el-form-item label="处理人" prop="handleBy">
<el-input v-model="queryParams.handleBy" placeholder="请输入处理人" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="处理时间" prop="handleTime">
<el-date-picker clearable
v-model="queryParams.handleTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择处理时间"
/>
</el-form-item>
<el-form-item label="转单人用户id或转发协助用户id" prop="transferUserId">
<el-input v-model="queryParams.transferUserId" placeholder="请输入转单人用户id或转发协助用户id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="用户预留1" prop="attr1">
<el-input v-model="queryParams.attr1" placeholder="请输入用户预留1" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"></el-button> <el-button type="primary" icon="Search" @click="handleQuery"></el-button>
@ -61,57 +87,68 @@
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['dms:dmsBillsLubeDetail:add']"></el-button> <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['dms:dmsBillsLubeInstanceActivity:add']"></el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['dms:dmsBillsLubeDetail:edit']"></el-button> <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['dms:dmsBillsLubeInstanceActivity:edit']"></el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['dms:dmsBillsLubeDetail:remove']"></el-button> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['dms:dmsBillsLubeInstanceActivity:remove']"></el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['dms:dmsBillsLubeDetail:export']"></el-button> <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['dms:dmsBillsLubeInstanceActivity:export']"></el-button>
</el-col> </el-col>
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
</template> </template>
<el-table v-loading="loading" :data="dmsBillsLubeDetailList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="dmsBillsLubeInstanceActivityList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键标识" align="center" prop="billsLubeDetailId" v-if="columns[0].visible"/> <el-table-column label="润滑工单实例节点ID" align="center" prop="instanceActivityId" v-if="columns[0].visible"/>
<el-table-column label="润滑工单" align="center" prop="lubeInstanceId" v-if="columns[2].visible"/> <el-table-column label="润滑工单实例ID关联dms_bills_lube_instance的lube_instance_id" align="center" prop="lubeInstanceId" v-if="columns[2].visible"/>
<el-table-column label="设备" align="center" prop="machineId" v-if="columns[3].visible"/> <el-table-column label="流程定义ID,关联wf_definition_config的id" align="center" prop="wfDefinitionId" v-if="columns[3].visible"/>
<el-table-column label="润滑部位" align="center" prop="lubeStationId" v-if="columns[4].visible"/> <el-table-column label="工单流程节点ID" align="center" prop="wfNodeId" v-if="columns[4].visible"/>
<el-table-column label="润滑标准" align="center" prop="lubeStandardId" v-if="columns[5].visible"/> <el-table-column label="润滑组别;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" align="center" prop="lubeGroup" v-if="columns[5].visible"/>
<el-table-column label="操作描述" align="center" prop="operationDescription" v-if="columns[6].visible"/> <el-table-column label="润滑负责人;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" align="center" prop="lubeSupervisor" v-if="columns[6].visible"/>
<el-table-column label="润滑状态" align="center" prop="maintStatus" v-if="columns[7].visible"> <el-table-column label="润滑级别" align="center" prop="lubeLevel" v-if="columns[7].visible">
<template #default="scope"> <template #default="scope">
<dict-tag :options="lube_status" :value="scope.row.maintStatus"/> <dict-tag :options="lube_level" :value="scope.row.lubeLevel"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="润滑开始时间" align="center" prop="beginTime" width="180" v-if="columns[8].visible"> <el-table-column label="处理意见;第1步不显示从第2步只显示此字段" align="center" prop="processHandleResolution" v-if="columns[8].visible"/>
<el-table-column label="状态(0已结束 1执行中 2待接取 3已转发" align="center" prop="processHandleStatus" v-if="columns[9].visible">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.beginTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> <dict-tag :options="process_handle_status" :value="scope.row.processHandleStatus"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="润滑结束时间" align="center" prop="endTime" width="180" v-if="columns[9].visible"> <el-table-column label="工单流程步骤顺序" align="center" prop="processStepOrder" v-if="columns[10].visible"/>
<el-table-column label="执行开始时间" align="center" prop="startTime" width="180" v-if="columns[11].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="执行结束时间" align="center" prop="endTime" width="180" v-if="columns[12].visible">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="激活标识" align="center" prop="activeFlag" v-if="columns[10].visible"> <el-table-column label="处理人ID" align="center" prop="handleUserId" v-if="columns[13].visible"/>
<el-table-column label="处理人" align="center" prop="handleBy" v-if="columns[14].visible"/>
<el-table-column label="处理时间" align="center" prop="handleTime" width="180" v-if="columns[15].visible">
<template #default="scope"> <template #default="scope">
<dict-tag :options="active_flag" :value="scope.row.activeFlag"/> <span>{{ parseTime(scope.row.handleTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注" align="center" prop="remark" v-if="columns[11].visible"/> <el-table-column label="转单人用户id或转发协助用户id" align="center" prop="transferUserId" v-if="columns[16].visible"/>
<el-table-column label="用户预留1" align="center" prop="attr1" v-if="columns[17].visible"/>
<el-table-column label="备注" align="center" prop="remark" v-if="columns[18].visible"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dms:dmsBillsLubeDetail:edit']"></el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstanceActivity:edit']"></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip content="删除" placement="top"> <el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dms:dmsBillsLubeDetail:remove']"></el-button> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstanceActivity:remove']"></el-button>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@ -119,62 +156,88 @@
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card> </el-card>
<!-- 添加或修改润滑工单明细对话框 --> <!-- 添加或修改润滑工单实例节点对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="dmsBillsLubeDetailFormRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="dmsBillsLubeInstanceActivityFormRef" :model="form" :rules="rules" label-width="80px">
<!-- <el-form-item label="主键标识" prop="billsLubeDetailId"> <el-form-item label="润滑工单实例节点ID" prop="instanceActivityId">
<el-input v-model="form.billsLubeDetailId" placeholder="请输入主键标识" /> <el-input v-model="form.instanceActivityId" placeholder="请输入润滑工单实例节点ID" />
</el-form-item>-->
<el-form-item label="润滑工单" prop="lubeInstanceId">
<!-- <el-input v-model="form.lubeInstanceId" placeholder="请输入润滑工单" />-->
</el-form-item> </el-form-item>
<el-form-item label="设备" prop="machineId"> <el-form-item label="润滑工单实例ID关联dms_bills_lube_instance的lube_instance_id" prop="lubeInstanceId">
<!-- <el-input v-model="form.machineId" placeholder="请输入设备" />--> <el-input v-model="form.lubeInstanceId" placeholder="请输入润滑工单实例ID关联dms_bills_lube_instance的lube_instance_id" />
</el-form-item> </el-form-item>
<el-form-item label="润滑部位" prop="lubeStationId"> <el-form-item label="流程定义ID,关联wf_definition_config的id" prop="wfDefinitionId">
<!-- <el-input v-model="form.lubeStationId" placeholder="请输入润滑部位" />--> <el-input v-model="form.wfDefinitionId" placeholder="请输入流程定义ID,关联wf_definition_config的id" />
</el-form-item> </el-form-item>
<el-form-item label="润滑标准" prop="lubeStandardId"> <el-form-item label="工单流程节点ID" prop="wfNodeId">
<!-- <el-input v-model="form.lubeStandardId" placeholder="请输入润滑标准" />--> <el-input v-model="form.wfNodeId" placeholder="请输入工单流程节点ID" />
</el-form-item> </el-form-item>
<el-form-item label="操作描述" prop="operationDescription"> <el-form-item label="润滑组别;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" prop="lubeGroup">
<el-input v-model="form.operationDescription" placeholder="请输入操作描述" /> <el-input v-model="form.lubeGroup" placeholder="请输入润滑组别;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" />
</el-form-item> </el-form-item>
<el-form-item label="润滑状态" prop="maintStatus"> <el-form-item label="润滑负责人;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" prop="lubeSupervisor">
<el-select v-model="form.maintStatus" placeholder="请选择润滑状态"> <el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的" />
</el-form-item>
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="form.lubeLevel" placeholder="请选择润滑级别">
<el-option <el-option
v-for="dict in lube_status" v-for="dict in lube_level"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value" :value="dict.value"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="润滑开始时间" prop="beginTime"> <el-form-item label="处理意见;第1步不显示从第2步只显示此字段" prop="processHandleResolution">
<el-input v-model="form.processHandleResolution" placeholder="请输入处理意见;第1步不显示从第2步只显示此字段" />
</el-form-item>
<el-form-item label="状态(0已结束 1执行中 2待接取 3已转发" prop="processHandleStatus">
<el-select v-model="form.processHandleStatus" placeholder="请选择状态(0已结束 1执行中 2待接取 3已转发">
<el-option
v-for="dict in process_handle_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="工单流程步骤顺序" prop="processStepOrder">
<el-input v-model="form.processStepOrder" placeholder="请输入工单流程步骤顺序" />
</el-form-item>
<el-form-item label="执行开始时间" prop="startTime">
<el-date-picker clearable <el-date-picker clearable
v-model="form.beginTime" v-model="form.startTime"
type="datetime" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择润滑开始时间"> placeholder="请选择执行开始时间">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="润滑结束时间" prop="endTime"> <el-form-item label="执行结束时间" prop="endTime">
<el-date-picker clearable <el-date-picker clearable
v-model="form.endTime" v-model="form.endTime"
type="datetime" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择润滑结束时间"> placeholder="请选择执行结束时间">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="激活标识" prop="activeFlag"> <el-form-item label="处理人ID" prop="handleUserId">
<el-select v-model="form.activeFlag" placeholder="请选择激活标识"> <el-input v-model="form.handleUserId" placeholder="请输入处理人ID" />
<el-option </el-form-item>
v-for="dict in active_flag" <el-form-item label="处理人" prop="handleBy">
:key="dict.value" <el-input v-model="form.handleBy" placeholder="请输入处理人" />
:label="dict.label" </el-form-item>
:value="dict.value" <el-form-item label="处理时间" prop="handleTime">
></el-option> <el-date-picker clearable
</el-select> v-model="form.handleTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择处理时间">
</el-date-picker>
</el-form-item>
<el-form-item label="转单人用户id或转发协助用户id" prop="transferUserId">
<el-input v-model="form.transferUserId" placeholder="请输入转单人用户id或转发协助用户id" />
</el-form-item>
<el-form-item label="用户预留1" prop="attr1">
<el-input v-model="form.attr1" placeholder="请输入用户预留1" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" /> <el-input v-model="form.remark" placeholder="请输入备注" />
@ -190,14 +253,14 @@
</div> </div>
</template> </template>
<script setup name="DmsBillsLubeDetail" lang="ts"> <script setup name="DmsBillsLubeInstanceActivity" lang="ts">
import { listDmsBillsLubeDetail, getDmsBillsLubeDetail, delDmsBillsLubeDetail, addDmsBillsLubeDetail, updateDmsBillsLubeDetail } from '@/api/dms/dmsBillsLubeDetail'; import { listDmsBillsLubeInstanceActivity, getDmsBillsLubeInstanceActivity, delDmsBillsLubeInstanceActivity, addDmsBillsLubeInstanceActivity, updateDmsBillsLubeInstanceActivity } from '@/api/dms/dmsBillsLubeInstanceActivity';
import { DmsBillsLubeDetailVO, DmsBillsLubeDetailQuery, DmsBillsLubeDetailForm } from '@/api/dms/dmsBillsLubeDetail/types'; import { DmsBillsLubeInstanceActivityVO, DmsBillsLubeInstanceActivityQuery, DmsBillsLubeInstanceActivityForm } from '@/api/dms/dmsBillsLubeInstanceActivity/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { active_flag, lube_status } = toRefs<any>(proxy?.useDict('active_flag', 'lube_status')); const { lube_level, process_handle_status } = toRefs<any>(proxy?.useDict('lube_level', 'process_handle_status'));
const dmsBillsLubeDetailList = ref<DmsBillsLubeDetailVO[]>([]); const dmsBillsLubeInstanceActivityList = ref<DmsBillsLubeInstanceActivityVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
@ -207,7 +270,7 @@ const multiple = ref(true);
const total = ref(0); const total = ref(0);
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const dmsBillsLubeDetailFormRef = ref<ElFormInstance>(); const dmsBillsLubeInstanceActivityFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
@ -216,70 +279,88 @@ const dialog = reactive<DialogOption>({
// //
const columns = ref<FieldOption[]>([ const columns = ref<FieldOption[]>([
{ key: 0, label: `主键标识`, visible: false }, { key: 0, label: `润滑工单实例节点ID`, visible: true },
{ key: 1, label: `租户编号`, visible: false }, { key: 1, label: `租户编号`, visible: true },
{ key: 2, label: `润滑工单`, visible: true }, { key: 2, label: `润滑工单实例ID关联dms_bills_lube_instance的lube_instance_id`, visible: true },
{ key: 3, label: `设备`, visible: true }, { key: 3, label: `流程定义ID,关联wf_definition_config的id`, visible: true },
{ key: 4, label: `润滑部位`, visible: true }, { key: 4, label: `工单流程节点ID`, visible: true },
{ key: 5, label: `润滑标准`, visible: true }, { key: 5, label: `润滑组别;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的`, visible: true },
{ key: 6, label: `操作描述`, visible: true }, { key: 6, label: `润滑负责人;最后一步自动复制第1步的可在第2步修改修改保存后为第2步的记录第1步为要求的第2步为实际的`, visible: true },
{ key: 7, label: `润滑状态`, visible: true }, { key: 7, label: `润滑级别`, visible: true },
{ key: 8, label: `润滑开始时间`, visible: true }, { key: 8, label: `处理意见;第1步不显示从第2步只显示此字段`, visible: true },
{ key: 9, label: `润滑结束时间`, visible: true }, { key: 9, label: `状态(0已结束 1执行中 2待接取 3已转发`, visible: true },
{ key: 10, label: `激活标识`, visible: true }, { key: 10, label: `工单流程步骤顺序`, visible: true },
{ key: 11, label: `备注`, visible: true }, { key: 11, label: `执行开始时间`, visible: true },
{ key: 12, label: `创建部门`, visible: false }, { key: 12, label: `执行结束时间`, visible: true },
{ key: 13, label: `创建人`, visible: false }, { key: 13, label: `处理人ID`, visible: true },
{ key: 14, label: `创建时间`, visible: false }, { key: 14, label: `处理人`, visible: true },
{ key: 15, label: `更新人`, visible: false }, { key: 15, label: `处理时间`, visible: true },
{ key: 16, label: `更新时间`, visible: false }, { key: 16, label: `转单人用户id或转发协助用户id`, visible: true },
{ key: 17, label: `用户预留1`, visible: true },
{ key: 18, label: `备注`, visible: true },
{ key: 19, label: `创建部门`, visible: true },
{ key: 20, label: `创建人`, visible: true },
{ key: 21, label: `创建时间`, visible: true },
{ key: 22, label: `更新人`, visible: true },
{ key: 23, label: `更新时间`, visible: true },
]); ]);
const initFormData: DmsBillsLubeDetailForm = { const initFormData: DmsBillsLubeInstanceActivityForm = {
billsLubeDetailId: undefined, instanceActivityId: undefined,
lubeInstanceId: undefined, lubeInstanceId: undefined,
machineId: undefined, wfDefinitionId: undefined,
lubeStationId: undefined, wfNodeId: undefined,
lubeStandardId: undefined, lubeGroup: undefined,
operationDescription: undefined, lubeSupervisor: undefined,
maintStatus: undefined, lubeLevel: undefined,
beginTime: undefined, processHandleResolution: undefined,
processHandleStatus: undefined,
processStepOrder: undefined,
startTime: undefined,
endTime: undefined, endTime: undefined,
activeFlag: undefined, handleUserId: undefined,
handleBy: undefined,
handleTime: undefined,
transferUserId: undefined,
attr1: undefined,
remark: undefined, remark: undefined,
} }
const data = reactive<PageData<DmsBillsLubeDetailForm, DmsBillsLubeDetailQuery>>({ const data = reactive<PageData<DmsBillsLubeInstanceActivityForm, DmsBillsLubeInstanceActivityQuery>>({
form: {...initFormData}, form: {...initFormData},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
billsLubeDetailId: undefined, instanceActivityId: undefined,
lubeInstanceId: undefined, lubeInstanceId: undefined,
machineId: undefined, wfDefinitionId: undefined,
lubeStationId: undefined, wfNodeId: undefined,
lubeStandardId: undefined, lubeGroup: undefined,
operationDescription: undefined, lubeSupervisor: undefined,
maintStatus: undefined, lubeLevel: undefined,
beginTime: undefined, processHandleResolution: undefined,
processHandleStatus: undefined,
processStepOrder: undefined,
startTime: undefined,
endTime: undefined, endTime: undefined,
activeFlag: undefined, handleUserId: undefined,
handleBy: undefined,
handleTime: undefined,
transferUserId: undefined,
attr1: undefined,
params: { params: {
} }
}, },
rules: { rules: {
activeFlag: [
{ required: true, message: "激活标识不能为空", trigger: "change" }
],
} }
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询润滑工单明细列表 */ /** 查询润滑工单实例节点列表 */
const getList = async () => { const getList = async () => {
loading.value = true; loading.value = true;
const res = await listDmsBillsLubeDetail(queryParams.value); const res = await listDmsBillsLubeInstanceActivity(queryParams.value);
dmsBillsLubeDetailList.value = res.rows; dmsBillsLubeInstanceActivityList.value = res.rows;
total.value = res.total; total.value = res.total;
loading.value = false; loading.value = false;
} }
@ -293,7 +374,7 @@ const cancel = () => {
/** 表单重置 */ /** 表单重置 */
const reset = () => { const reset = () => {
form.value = {...initFormData}; form.value = {...initFormData};
dmsBillsLubeDetailFormRef.value?.resetFields(); dmsBillsLubeInstanceActivityFormRef.value?.resetFields();
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
@ -309,8 +390,8 @@ const resetQuery = () => {
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
const handleSelectionChange = (selection: DmsBillsLubeDetailVO[]) => { const handleSelectionChange = (selection: DmsBillsLubeInstanceActivityVO[]) => {
ids.value = selection.map(item => item.billsLubeDetailId); ids.value = selection.map(item => item.instanceActivityId);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
@ -319,28 +400,28 @@ const handleSelectionChange = (selection: DmsBillsLubeDetailVO[]) => {
const handleAdd = () => { const handleAdd = () => {
reset(); reset();
dialog.visible = true; dialog.visible = true;
dialog.title = "添加润滑工单明细"; dialog.title = "添加润滑工单实例节点";
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
const handleUpdate = async (row?: DmsBillsLubeDetailVO) => { const handleUpdate = async (row?: DmsBillsLubeInstanceActivityVO) => {
reset(); reset();
const _billsLubeDetailId = row?.billsLubeDetailId || ids.value[0] const _instanceActivityId = row?.instanceActivityId || ids.value[0]
const res = await getDmsBillsLubeDetail(_billsLubeDetailId); const res = await getDmsBillsLubeInstanceActivity(_instanceActivityId);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
dialog.visible = true; dialog.visible = true;
dialog.title = "修改润滑工单明细"; dialog.title = "修改润滑工单实例节点";
} }
/** 提交按钮 */ /** 提交按钮 */
const submitForm = () => { const submitForm = () => {
dmsBillsLubeDetailFormRef.value?.validate(async (valid: boolean) => { dmsBillsLubeInstanceActivityFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
buttonLoading.value = true; buttonLoading.value = true;
if (form.value.billsLubeDetailId) { if (form.value.instanceActivityId) {
await updateDmsBillsLubeDetail(form.value).finally(() => buttonLoading.value = false); await updateDmsBillsLubeInstanceActivity(form.value).finally(() => buttonLoading.value = false);
} else { } else {
await addDmsBillsLubeDetail(form.value).finally(() => buttonLoading.value = false); await addDmsBillsLubeInstanceActivity(form.value).finally(() => buttonLoading.value = false);
} }
proxy?.$modal.msgSuccess("操作成功"); proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false; dialog.visible = false;
@ -350,19 +431,19 @@ const submitForm = () => {
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (row?: DmsBillsLubeDetailVO) => { const handleDelete = async (row?: DmsBillsLubeInstanceActivityVO) => {
const _billsLubeDetailIds = row?.billsLubeDetailId || ids.value; const _instanceActivityIds = row?.instanceActivityId || ids.value;
await proxy?.$modal.confirm('是否确认删除润滑工单明细编号为"' + _billsLubeDetailIds + '"的数据项?').finally(() => loading.value = false); await proxy?.$modal.confirm('是否确认删除润滑工单实例节点编号为"' + _instanceActivityIds + '"的数据项?').finally(() => loading.value = false);
await delDmsBillsLubeDetail(_billsLubeDetailIds); await delDmsBillsLubeInstanceActivity(_instanceActivityIds);
proxy?.$modal.msgSuccess("删除成功"); proxy?.$modal.msgSuccess("删除成功");
await getList(); await getList();
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
const handleExport = () => { const handleExport = () => {
proxy?.download('dms/dmsBillsLubeDetail/export', { proxy?.download('dms/dmsBillsLubeInstanceActivity/export', {
...queryParams.value ...queryParams.value
}, `dmsBillsLubeDetail_${new Date().getTime()}.xlsx`) }, `dmsBillsLubeInstanceActivity_${new Date().getTime()}.xlsx`)
} }
onMounted(() => { onMounted(() => {

@ -0,0 +1,475 @@
<template>
<div class="p-2">
<!-- 工单信息区域 -->
<h4 class="form-header h4">工单信息</h4>
<el-card shadow="never" class="mb-[10px]">
<el-form label-width="120px">
<el-row>
<el-col :span="8" :offset="2">
<el-form-item label="工单编号">
<el-input v-model="billsInfo.billsLubeCode" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="工单状态">
<el-input v-model="billsStatusCheck" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请人">
<el-input v-model="billsInfo.createBy" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请时间">
<el-input v-model="billsInfo.createTime" disabled />
</el-form-item>
</el-col>
<el-col :span="16" :offset="2">
<el-form-item label="备注">
<el-input v-model="billsInfo.remark" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<!-- 流程步骤展示区域 -->
<el-card shadow="never" class="mb-[10px]">
<el-form ref="stepFormRef" :model="form" label-width="100px">
<!-- 第一步 -->
<h4 class="form-header h4" v-if="dmsBillsLubeInstanceActivityList.length > 0">1</h4>
<el-row v-if="dmsBillsLubeInstanceActivityList.length > 0">
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="form.lubeLevel" placeholder="润滑级别" disabled>
<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="请输入润滑组别" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 中间步骤 (已处理的后续节点) -->
<template v-for="(activity) in dmsBillsLubeInstanceActivityList" :key="activity.instanceActivityId">
<div v-if="activity.processStepOrder && activity.processStepOrder > 1">
<h4 class="form-header h4">{{ `已处理节点:步骤${activity.processStepOrder}(实际参数)` }}</h4>
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别">
<el-select
v-model="activity.lubeLevel"
placeholder="润滑级别"
disabled>
<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="润滑组别">
<el-input
v-model="activity.lubeGroup"
disabled
placeholder="润滑组别">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人">
<el-input
v-model="activity.lubeSupervisor"
disabled
placeholder="润滑负责人">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见">
<el-input
v-model="activity.processHandleResolution"
disabled
placeholder="处理意见">
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</template>
<!-- 当前步骤表单 (用于提交新节点) -->
<div v-if="isUpdate">
<h4 class="form-header h4">当前处理节点步骤{{ nextStepOrder }}{{ nextStepOrder === 2 ? '(实际参数)' : '' }}</h4>
<el-form ref="nextStepFormRef" :model="nextStepForm" :rules="nextStepFormRules" label-width="100px">
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="nextStepForm.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="nextStepForm.lubeGroup" placeholder="润滑组别"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="nextStepForm.lubeSupervisor" placeholder="润滑负责人"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="nextStepOrder > 1">
<el-form-item label="处理意见" prop="processHandleResolution">
<el-input v-model="nextStepForm.processHandleResolution" placeholder="处理意见"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="text-center mt-4">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button v-if="billsInfo && billsInfo.lubeInstanceId !== null && billsInfo.status !== 'draft'" type='primary'
@click='handleApprovalRecord'>
流程进度
</el-button>
</el-col>
</el-row>
</el-form>
</div>
</el-form>
</el-card>
<!-- 润滑计划详情区域 -->
<el-card shadow="never">
<h4 class="form-header h4 text-center">润滑计划详细信息</h4>
<el-table v-loading="loading" :data="planLubeDetail">
<el-table-column label="计划ID" align="center" prop="planLubeId" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="润滑部位" align="center" prop="lubeStationName" />
<el-table-column label="润滑标准" align="center" prop="lubeStandardCode" />
<el-table-column label="操作描述" align="center" prop="operationDescription" />
</el-table>
</el-card>
<!-- 提交组件 -->
<submitVerify ref='submitVerifyRef' :task-variables="taskVariables as any" @submit-callback='submitCallback' />
<!-- 审批记录 -->
<approvalRecord ref='approvalRecordRef' />
</div>
</template>
<script setup name="DmsBillsLubeInstanceActivity" lang="ts">
import { ref, reactive, toRefs, getCurrentInstance, onMounted, computed } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import type { FormInstance, FormRules } from 'element-plus'; // FormInstance FormRules
import {
listDmsBillsLubeInstanceActivity,
addDmsBillsLubeInstanceActivity
} from '@/api/dms/dmsBillsLubeInstanceActivity';
import {
DmsBillsLubeInstanceActivityVO,
DmsBillsLubeInstanceActivityForm
} from '@/api/dms/dmsBillsLubeInstanceActivity/types';
import { listDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
import { getDmsPlanLubeDetail } from '@/api/dms/dmsPlanLubeDetail';
import {DmsPlanLubeDetailVO} from "@/api/dms/dmsPlanLubeDetail/types";
// API
import { startWorkFlow } from '@/api/workflow/task';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { lube_level, process_handle_status } = toRefs<any>(proxy?.useDict('lube_level', 'process_handle_status'));
const route = useRoute();
//
const stepFormRef = ref<FormInstance>(); // ref
const nextStepFormRef = ref<FormInstance>(); // ref
//
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const taskVariables = ref<any>({});
const submitFormData = ref<StartProcessBo>({
businessId: '',
flowCode: 'lubeProcess', // lubeProcess
variables: {}
});
//
const loading = ref(true);
const dmsBillsLubeInstanceActivityList = ref<DmsBillsLubeInstanceActivityVO[]>([]);
const billsInfo = ref<any>({}); //
const planLubeDetail = ref<DmsPlanLubeDetailVO[]>([]);
const billsStatusCheck = ref(''); //
const isUpdate = ref(true); //
const planLubeId = ref(''); // ID
const lubeInstanceId = route.params.lubeInstanceId as string; //
const buttonLoading = ref(false);
//
const nextStepOrder = computed(() => {
return dmsBillsLubeInstanceActivityList.value.length + 1;
});
// ()
const form = reactive<Partial<DmsBillsLubeInstanceActivityForm>>({
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
remark: undefined,
});
// ()
const nextStepForm = reactive<DmsBillsLubeInstanceActivityForm>({
instanceActivityId: undefined,
lubeInstanceId: lubeInstanceId,
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: undefined,
processHandleStatus: undefined,
processStepOrder: undefined,
startTime: undefined,
endTime: undefined,
handleUserId: undefined,
handleBy: undefined,
handleTime: undefined,
transferUserId: undefined,
attr1: undefined,
remark: undefined,
});
//
const nextStepFormRules = reactive<FormRules>({
lubeLevel: [{ required: true, message: "润滑级别不能为空", trigger: "change" }],
lubeGroup: [{ required: true, message: "润滑组别不能为空", trigger: "blur" }],
lubeSupervisor: [{ required: true, message: "润滑负责人不能为空", trigger: "blur" }],
//
processHandleResolution: [{ required: nextStepOrder.value > 1, message: "处理意见不能为空", trigger: "blur" }],
});
//
const queryParams = reactive({
pageNum: 1,
pageSize: 50,
lubeInstanceId: lubeInstanceId,
});
//
onMounted(() => {
//
if(route.name === 'childDmsBillsLubeInstanceActivity') {
isUpdate.value = true;
} else if(route.name === 'selectChildDmsBillsLubeInstanceActivity') {
isUpdate.value = false;
}
//
getDmsBillsLubeInstance();
//
getList();
});
//
const getDmsBillsLubeInstance = async () => {
try {
const res = await listDmsBillsLubeInstance(queryParams);
if (res.rows && res.rows.length > 0) {
billsInfo.value = res.rows[0];
// planLubeId
const lubeIdFromServer = res.rows[0].planLubeId;
planLubeId.value = typeof lubeIdFromServer === 'number' ? String(lubeIdFromServer) : lubeIdFromServer;
//
if (lube_level.value && billsInfo.value.lubeStatus !== undefined) {
const statusItem = lube_level.value.find((item: any) => String(item.value) === String(billsInfo.value.lubeStatus));
billsStatusCheck.value = statusItem ? statusItem.label : '未知状态';
} else {
billsStatusCheck.value = '未知状态';
}
//
if (planLubeId.value) {
getPlanLubeDetailData();
}
} else {
proxy?.$modal.msgError("未查询到工单信息");
}
} catch (error) {
console.error('获取工单实例数据失败', error);
proxy?.$modal.msgError("获取工单实例数据失败");
}
};
//
const getPlanLubeDetailData = async () => {
if (!planLubeId.value) return;
loading.value = true;
try {
const res = await getDmsPlanLubeDetail(planLubeId.value);
planLubeDetail.value = res && res.rows ? [res.rows] : [];
} catch (error) {
console.error('获取润滑计划详情失败', error);
proxy?.$modal.msgError("获取润滑计划详情失败");
}
};
//
const getList = async () => {
loading.value = true;
try {
const res = await listDmsBillsLubeInstanceActivity(queryParams);
dmsBillsLubeInstanceActivityList.value = res.rows;
// ()
if (res.rows && res.rows.length > 0) {
Object.assign(form, {
lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor,
lubeLevel: res.rows[0].lubeLevel,
remark: res.rows[0].remark
});
//
if (nextStepOrder.value === 2) {
//
Object.assign(nextStepForm, {
lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor,
lubeLevel: res.rows[0].lubeLevel,
processHandleResolution: null, //
remark: ''
});
} else if (nextStepOrder.value > 2) {
// 使
const lastActivity = res.rows[res.rows.length - 1];
Object.assign(nextStepForm, {
lubeGroup: lastActivity.lubeGroup,
lubeSupervisor: lastActivity.lubeSupervisor,
lubeLevel: lastActivity.lubeLevel,
processHandleResolution: null, //
remark: ''
});
}
} else {
// nextStepForm
Object.assign(nextStepForm, {
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: null,
remark: ''
});
}
//
nextStepFormRules.processHandleResolution = [{
required: nextStepOrder.value > 1,
message: "处理意见不能为空",
trigger: "blur"
}];
} catch (error) {
console.error('获取工单实例节点数据失败', error);
proxy?.$modal.msgError("获取工单实例节点数据失败");
} finally {
loading.value = false;
}
};
//
const submitForm = async () => {
if (!nextStepFormRef.value) return;
await nextStepFormRef.value.validate(async (valid) => {
if (valid) {
try {
buttonLoading.value = true;
//
nextStepForm.processStepOrder = nextStepOrder.value;
nextStepForm.lubeInstanceId = lubeInstanceId;
//
if (nextStepOrder.value === 1) {
nextStepForm.processHandleResolution = null;
}
//
const res = await addDmsBillsLubeInstanceActivity(nextStepForm);
//
await handleStartWorkFlow(res.data);
} catch (error) {
console.error('提交失败', error);
proxy?.$modal.msgError("提交失败,请检查数据或联系管理员");
buttonLoading.value = false;
}
} else {
proxy?.$modal.msgError("表单校验失败,请检查输入项");
}
});
};
//
const handleStartWorkFlow = async (data: any) => {
try {
submitFormData.value.businessId = lubeInstanceId;
//
taskVariables.value = {
data: data
};
submitFormData.value.variables = taskVariables.value;
const resp = await startWorkFlow(submitFormData.value);
if (submitVerifyRef.value) {
buttonLoading.value = false;
submitVerifyRef.value.openDialog(resp.data.taskId);
}
} finally {
buttonLoading.value = false;
}
};
//
const handleApprovalRecord = () => {
approvalRecordRef.value.init(lubeInstanceId);
};
//
const submitCallback = async () => {
await getList(); //
proxy?.$modal.msgSuccess("操作成功");
};
</script>
<style scoped>
.form-header {
font-size: 15px;
color: #409eff;
border-bottom: 1px solid #ddd;
margin: 8px 0 15px;
padding-bottom: 10px;
}
</style>

@ -36,93 +36,89 @@
<!-- 流程步骤展示区域 --> <!-- 流程步骤展示区域 -->
<el-card shadow="never" class="mb-[10px]"> <el-card shadow="never" class="mb-[10px]">
<el-row> <el-form ref="stepFormRef" :model="form" label-width="100px">
<el-form ref="stepFormRef" :model="form" label-width="100px"> <!-- 第一步 -->
<!-- 第一步 --> <h4 class="form-header h4" v-if="dmsBillsLubeInstanceActivityList.length > 0">1</h4>
<h4 class="form-header h4" v-if="wfProcessActivityList.length > 0"> <el-row v-if="dmsBillsLubeInstanceActivityList.length > 0">
{{wfProcessActivityList[0]?.processActivityName}} <el-col :span="8">
</h4> <el-form-item label="润滑级别" prop="lubeLevel">
<el-row v-if="dmsBillsLubeInstanceActivityList.length > 0"> <el-select v-model="form.lubeLevel" placeholder="润滑级别" disabled>
<el-col :span="8"> <el-option
<el-form-item label="润滑级别" prop="lubeLevel"> v-for="dict in lube_level"
<el-select v-model="form.lubeLevel" placeholder="润滑级别" disabled> :key="dict.value"
<el-option :label="dict.label"
v-for="dict in lube_level" :value="dict.value">
:key="dict.value" </el-option>
:label="dict.label" </el-select>
:value="dict.value"> </el-form-item>
</el-option> </el-col>
</el-select> <el-col :span="8">
</el-form-item> <el-form-item label="润滑组别" prop="lubeGroup">
</el-col> <el-input v-model="form.lubeGroup" placeholder="请输入润滑组别" disabled />
<el-col :span="8"> </el-form-item>
<el-form-item label="润滑组别" prop="lubeGroup"> </el-col>
<el-input v-model="form.lubeGroup" placeholder="请输入润滑组别" disabled /> <el-col :span="8">
</el-form-item> <el-form-item label="润滑负责人" prop="lubeSupervisor">
</el-col> <el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人" disabled />
<el-col :span="8"> </el-form-item>
<el-form-item label="润滑负责人" prop="lubeSupervisor"> </el-col>
<el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人" disabled /> </el-row>
</el-form-item>
</el-col>
</el-row>
<!-- 中间步骤 --> <!-- 中间步骤 (已处理的后续节点) -->
<template v-for="(activity, index) in dmsBillsLubeInstanceActivityList" :key="activity.instanceActivityId"> <template v-for="(activity) in dmsBillsLubeInstanceActivityList" :key="activity.instanceActivityId">
<div v-if="activity.processStepOrder != 1"> <div v-if="activity.processStepOrder && activity.processStepOrder > 1">
<h4 class="form-header h4">{{activity.name || '流程节点'}}</h4> <h4 class="form-header h4">{{ `已处理节点:步骤${activity.processStepOrder}(实际参数)` }}</h4>
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="润滑级别"> <el-form-item label="润滑级别">
<el-select <el-select
v-model="activity.lubeLevel" v-model="activity.lubeLevel"
placeholder="润滑级别" placeholder="润滑级别"
:disabled="activity.processStepOrder != currentStepOrder"> disabled>
<el-option <el-option
v-for="dict in lube_level" v-for="dict in lube_level"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value"> :value="dict.value">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="润滑组别"> <el-form-item label="润滑组别">
<el-input <el-input
v-model="activity.lubeGroup" v-model="activity.lubeGroup"
:disabled="activity.processStepOrder != currentStepOrder" disabled
placeholder="润滑组别"> placeholder="润滑组别">
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="润滑负责人"> <el-form-item label="润滑负责人">
<el-input <el-input
v-model="activity.lubeSupervisor" v-model="activity.lubeSupervisor"
:disabled="activity.processStepOrder != currentStepOrder" disabled
placeholder="润滑负责人"> placeholder="润滑负责人">
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="处理意见"> <el-form-item label="处理意见">
<el-input <el-input
v-model="activity.processHandleResolution" v-model="activity.processHandleResolution"
:disabled="activity.processStepOrder != currentStepOrder" disabled
placeholder="处理意见"> placeholder="处理意见">
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
</template> </template>
<!-- 当前步骤表单 --> <!-- 当前步骤表单 (用于提交新节点) -->
<div v-if="canSubmitNext && isUpdate"> <div v-if="isUpdate">
<h4 class="form-header h4" v-if="wfProcessActivityList.length > dmsBillsLubeInstanceActivityList.length"> <h4 class="form-header h4">当前处理节点步骤{{ nextStepOrder }}{{ nextStepOrder === 2 ? '(实际参数)' : '' }}</h4>
{{wfProcessActivityList[dmsBillsLubeInstanceActivityList.length]?.processActivityName}} <el-form ref="nextStepFormRef" :model="nextStepForm" :rules="nextStepFormRules" label-width="100px">
</h4>
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel"> <el-form-item label="润滑级别" prop="lubeLevel">
@ -137,27 +133,31 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="润滑组别"> <el-form-item label="润滑组别" prop="lubeGroup">
<el-input v-model="nextStepForm.lubeGroup" placeholder="润滑组别"></el-input> <el-input v-model="nextStepForm.lubeGroup" placeholder="润滑组别"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="润滑负责人"> <el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="nextStepForm.lubeSupervisor" placeholder="润滑负责人"></el-input> <el-input v-model="nextStepForm.lubeSupervisor" placeholder="润滑负责人"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24" v-if="nextStepOrder > 1">
<el-form-item label="处理意见"> <el-form-item label="处理意见" prop="processHandleResolution">
<el-input v-model="nextStepForm.processHandleResolution" placeholder="处理意见"></el-input> <el-input v-model="nextStepForm.processHandleResolution" placeholder="处理意见"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" class="text-center mt-4"> <el-col :span="24" class="text-center mt-4">
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
<el-button v-if="billsInfo && billsInfo.lubeInstanceId !== null && billsInfo.status !== 'draft'" type='primary'
@click='handleApprovalRecord'>
流程进度
</el-button>
</el-col> </el-col>
</el-row> </el-row>
</div> </el-form>
</el-form> </div>
</el-row> </el-form>
</el-card> </el-card>
<!-- 润滑计划详情区域 --> <!-- 润滑计划详情区域 -->
@ -171,13 +171,18 @@
<el-table-column label="操作描述" align="center" prop="operationDescription" /> <el-table-column label="操作描述" align="center" prop="operationDescription" />
</el-table> </el-table>
</el-card> </el-card>
<!-- 提交组件 -->
<submitVerify ref='submitVerifyRef' :task-variables="taskVariables as any" @submit-callback='submitCallback' />
<!-- 审批记录 -->
<approvalRecord ref='approvalRecordRef' />
</div> </div>
</template> </template>
<script setup name="DmsBillsLubeInstanceActivity" lang="ts"> <script setup name="DmsBillsLubeInstanceActivity" lang="ts">
import { ref, reactive, toRefs, getCurrentInstance, onMounted, computed } from 'vue'; import { ref, reactive, toRefs, getCurrentInstance, onMounted, computed } from 'vue';
import { ElFormInstance } from 'element-plus';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import type { FormInstance, FormRules } from 'element-plus'; // FormInstance FormRules
import { import {
listDmsBillsLubeInstanceActivity, listDmsBillsLubeInstanceActivity,
addDmsBillsLubeInstanceActivity addDmsBillsLubeInstanceActivity
@ -186,71 +191,61 @@ import {
DmsBillsLubeInstanceActivityVO, DmsBillsLubeInstanceActivityVO,
DmsBillsLubeInstanceActivityForm DmsBillsLubeInstanceActivityForm
} from '@/api/dms/dmsBillsLubeInstanceActivity/types'; } from '@/api/dms/dmsBillsLubeInstanceActivity/types';
import { listDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance'; import { getDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
// import { listWfprocessactivity } from '@/api/system/common/wfprocessactivity'; import { getDmsPlanLubeDetail } from '@/api/dms/dmsPlanLubeDetail';
// import { selectPlanLubeDetailByPlanLubeId } from '@/api/dms/dmsPlanLubeDetail'; import {DmsPlanLubeDetailVO} from "@/api/dms/dmsPlanLubeDetail/types";
// import { selectUserIdByDmsBillsLubeInstanceActivityId } from '@/api/dms/dmsBillsLubeInstanceActivity'; // API
import { useUserStore } from '@/store/modules/user'; import { startWorkFlow } from '@/api/workflow/task';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { lube_level, process_handle_status } = toRefs<any>(proxy?.useDict('lube_level', 'process_handle_status')); const { lube_level, process_handle_status } = toRefs<any>(proxy?.useDict('lube_level', 'process_handle_status'));
const route = useRoute(); const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
// //
const stepFormRef = ref<ElFormInstance>(); const stepFormRef = ref<FormInstance>(); // ref
const nextStepFormRef = ref<FormInstance>(); // ref
//
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const taskVariables = ref<any>({});
const submitFormData = ref<StartProcessBo>({
businessId: '',
flowCode: 'Lube01',
variables: {}
});
// //
const loading = ref(true); const loading = ref(true);
const dmsBillsLubeInstanceActivityList = ref<DmsBillsLubeInstanceActivityVO[]>([]); const dmsBillsLubeInstanceActivityList = ref<DmsBillsLubeInstanceActivityVO[]>([]);
const wfProcessActivityList = ref<any[]>([]); const billsInfo = ref<any>({}); //
const billsInfo = ref<any>({}); const planLubeDetail = ref<DmsPlanLubeDetailVO[]>([]);
const planLubeDetail = ref<any[]>([]); const billsStatusCheck = ref(''); //
const billsStatusCheck = ref(''); const isUpdate = ref(true); //
const isUpdate = ref(true); const planLubeId = ref(''); // ID
const planLubeId = ref(''); const lubeInstanceId = route.params.lubeInstanceId as string; //
const currentStepOrder = ref(0); const buttonLoading = ref(false);
const lubeInstanceId = route.params.lubeInstanceId as string;
// //
const nextStepOrder = computed(() => { const nextStepOrder = computed(() => {
return dmsBillsLubeInstanceActivityList.value.length + 1; return dmsBillsLubeInstanceActivityList.value.length + 1;
}); });
// // ()
const canSubmitNext = computed(() => { const form = reactive<Partial<DmsBillsLubeInstanceActivityForm>>({
return dmsBillsLubeInstanceActivityList.value.length < wfProcessActivityList.value.length;
});
//
const form = reactive<DmsBillsLubeInstanceActivityForm>({
instanceActivityId: undefined,
lubeInstanceId: lubeInstanceId,
wfDefinitionId: undefined,
wfNodeId: undefined,
lubeGroup: undefined, lubeGroup: undefined,
lubeSupervisor: undefined, lubeSupervisor: undefined,
lubeLevel: undefined, lubeLevel: undefined,
processHandleResolution: undefined,
processHandleStatus: undefined,
processStepOrder: undefined,
startTime: undefined,
endTime: undefined,
handleUserId: undefined,
handleBy: undefined,
handleTime: undefined,
transferUserId: undefined,
attr1: undefined,
remark: undefined, remark: undefined,
}); });
// // ()
const nextStepForm = reactive<DmsBillsLubeInstanceActivityForm>({ const nextStepForm = reactive<DmsBillsLubeInstanceActivityForm>({
instanceActivityId: undefined, instanceActivityId: undefined,
lubeInstanceId: lubeInstanceId, lubeInstanceId: lubeInstanceId,
wfDefinitionId: undefined,
wfNodeId: undefined,
lubeGroup: undefined, lubeGroup: undefined,
lubeSupervisor: undefined, lubeSupervisor: undefined,
lubeLevel: undefined, lubeLevel: undefined,
@ -267,6 +262,15 @@ const nextStepForm = reactive<DmsBillsLubeInstanceActivityForm>({
remark: undefined, remark: undefined,
}); });
//
const nextStepFormRules = reactive<FormRules>({
lubeLevel: [{ required: true, message: "润滑级别不能为空", trigger: "change" }],
lubeGroup: [{ required: true, message: "润滑组别不能为空", trigger: "blur" }],
lubeSupervisor: [{ required: true, message: "润滑负责人不能为空", trigger: "blur" }],
//
processHandleResolution: [{ required: nextStepOrder.value > 1, message: "处理意见不能为空", trigger: "blur" }],
});
// //
const queryParams = reactive({ const queryParams = reactive({
pageNum: 1, pageNum: 1,
@ -284,72 +288,49 @@ onMounted(() => {
} }
// //
getDmsBillsLubeInstance(); dmsBillsLubeInstance();
// //
getList(); getList();
}); });
// //
const getDmsBillsLubeInstance = async () => { const dmsBillsLubeInstance = async () => {
try {
const res = await listDmsBillsLubeInstance({ lubeInstanceId });
if (res.rows && res.rows.length > 0) {
billsInfo.value = res.rows[0];
planLubeId.value = res.rows[0].planLubeId;
// // const res = await listDmsBillsLubeInstance(queryParams);
//billsInfo.value = res.rows[0];
const _lubeInstanceId = lubeInstanceId;
const res = await getDmsBillsLubeInstance(_lubeInstanceId);
billsInfo.value = res.data;
// planLubeId
// const lubeIdFromServer = res.rows[0].planLubeId;
const lubeIdFromServer = res.data.planLubeId;
planLubeId.value = typeof lubeIdFromServer === 'number' ? String(lubeIdFromServer) : lubeIdFromServer;
//
if (lube_level.value && billsInfo.value.lubeStatus !== undefined) { if (lube_level.value && billsInfo.value.lubeStatus !== undefined) {
const statusItem = lube_level.value.find((item: any) => item.value == billsInfo.value.lubeStatus); const statusItem = lube_level.value.find((item: any) => String(item.value) === String(billsInfo.value.lubeStatus));
billsStatusCheck.value = statusItem ? statusItem.label : '未知状态'; billsStatusCheck.value = statusItem ? statusItem.label : '未知状态';
} else {
billsStatusCheck.value = '未知状态';
} }
//
getWfprocessActivity(res.rows[0].wfProcessId || 106);
// //
if (planLubeId.value) { if (planLubeId.value) {
getPlanLubeDetail(); getPlanLubeDetailData();
} }
}
} catch (error) {
console.error('获取工单实例数据失败', error);
}
};
//
const getWfprocessActivity = async (wfProcessId: number) => {
try {
// const res = await listWfprocessactivity({ wfProcessId });
wfProcessActivityList.value = res.rows;
//
if (dmsBillsLubeInstanceActivityList.value.length > 0) {
dmsBillsLubeInstanceActivityList.value.forEach(activity => {
const matchedProcess = wfProcessActivityList.value.find(
process => process.processActivityOrder === activity.processStepOrder
);
if (matchedProcess) {
activity.name = matchedProcess.processActivityName;
}
});
}
//
checkUserPermission();
} catch (error) {
console.error('获取流程定义失败', error);
}
}; };
// //
const getPlanLubeDetail = async () => { const getPlanLubeDetailData = async () => {
if (!planLubeId.value) return;
loading.value = true;
try { try {
const res = await selectPlanLubeDetailByPlanLubeId(planLubeId.value); const res = await getDmsPlanLubeDetail(planLubeId.value);
planLubeDetail.value = res.rows; planLubeDetail.value = res && res.rows ? [res.rows] : [];
} catch (error) { } catch (error) {
console.error('获取润滑计划详情失败', error); console.error('获取润滑计划详情失败', error);
} finally { proxy?.$modal.msgError("获取润滑计划详情失败");
loading.value = false;
} }
}; };
@ -360,8 +341,8 @@ const getList = async () => {
const res = await listDmsBillsLubeInstanceActivity(queryParams); const res = await listDmsBillsLubeInstanceActivity(queryParams);
dmsBillsLubeInstanceActivityList.value = res.rows; dmsBillsLubeInstanceActivityList.value = res.rows;
// // ()
if (res.rows.length > 0) { if (res.rows && res.rows.length > 0) {
Object.assign(form, { Object.assign(form, {
lubeGroup: res.rows[0].lubeGroup, lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor, lubeSupervisor: res.rows[0].lubeSupervisor,
@ -369,80 +350,114 @@ const getList = async () => {
remark: res.rows[0].remark remark: res.rows[0].remark
}); });
// //
const lastActivity = res.rows[res.rows.length - 1]; if (nextStepOrder.value === 2) {
//
Object.assign(nextStepForm, {
lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor,
lubeLevel: res.rows[0].lubeLevel,
processHandleResolution: null, //
remark: ''
});
} else if (nextStepOrder.value > 2) {
// 使
const lastActivity = res.rows[res.rows.length - 1];
Object.assign(nextStepForm, {
lubeGroup: lastActivity.lubeGroup,
lubeSupervisor: lastActivity.lubeSupervisor,
lubeLevel: lastActivity.lubeLevel,
processHandleResolution: null, //
remark: ''
});
}
} else {
// nextStepForm
Object.assign(nextStepForm, { Object.assign(nextStepForm, {
lubeGroup: lastActivity.lubeGroup, lubeGroup: undefined,
lubeSupervisor: lastActivity.lubeSupervisor, lubeSupervisor: undefined,
lubeLevel: lastActivity.lubeLevel, lubeLevel: undefined,
processStepOrder: res.rows.length + 1, processHandleResolution: null,
processHandleResolution: null remark: ''
}); });
currentStepOrder.value = res.rows.length + 1;
} }
//
nextStepFormRules.processHandleResolution = [{
required: nextStepOrder.value > 1,
message: "处理意见不能为空",
trigger: "blur"
}];
} catch (error) { } catch (error) {
console.error('获取工单实例节点数据失败', error); console.error('获取工单实例节点数据失败', error);
proxy?.$modal.msgError("获取工单实例节点数据失败");
} finally { } finally {
loading.value = false; loading.value = false;
} }
}; };
// //
const checkUserPermission = async () => { const submitForm = async () => {
if (dmsBillsLubeInstanceActivityList.value.length === wfProcessActivityList.value.length) { if (!nextStepFormRef.value) return;
try { await nextStepFormRef.value.validate(async (valid) => {
const hasPermission = await selectUserIdByDmsBillsLubeInstanceActivityId( if (valid) {
lubeInstanceId, try {
userStore.userId buttonLoading.value = true;
); //
nextStepForm.processStepOrder = nextStepOrder.value;
nextStepForm.lubeInstanceId = lubeInstanceId;
if (!hasPermission) { //
proxy?.$modal.alert("您没有权限处理此工单"); if (nextStepOrder.value === 1) {
// nextStepForm.processHandleResolution = null;
proxy?.$store.dispatch("tagsView/delView", route); }
//
router.replace({ path: "/dms/deviceLube/dmsBillsLubeInstance" }); //
const res = await addDmsBillsLubeInstanceActivity(nextStepForm);
//
await handleStartWorkFlow(res.data);
} catch (error) {
console.error('提交失败', error);
proxy?.$modal.msgError("提交失败,请检查数据或联系管理员");
buttonLoading.value = false;
} }
} catch (error) { } else {
console.error('检查权限失败', error); proxy?.$modal.msgError("表单校验失败,请检查输入项");
} }
});
};
//
const handleStartWorkFlow = async (data: any) => {
try {
submitFormData.value.businessId = lubeInstanceId;
//
taskVariables.value = {
entity: data
};
submitFormData.value.variables = taskVariables.value;
const resp = await startWorkFlow(submitFormData.value);
if (submitVerifyRef.value) {
buttonLoading.value = false;
submitVerifyRef.value.openDialog(resp.data.taskId);
}
} finally {
buttonLoading.value = false;
} }
}; };
// //
const submitForm = async () => { const handleApprovalRecord = () => {
try { approvalRecordRef.value.init(lubeInstanceId);
// };
if (!nextStepForm.processHandleResolution) {
proxy?.$modal.msgError("请填写处理意见");
return;
}
// ID //
if (wfProcessActivityList.value.length > 0) { const submitCallback = async () => {
const currentProcess = wfProcessActivityList.value.find( await getList(); //
process => process.processActivityOrder === nextStepOrder.value proxy?.$modal.msgSuccess("操作成功");
);
if (currentProcess) {
nextStepForm.processActivityId = currentProcess.processActivityId;
}
}
//
nextStepForm.processStepOrder = nextStepOrder.value;
nextStepForm.wfLength = wfProcessActivityList.value.length;
//
await addDmsBillsLubeInstanceActivity(nextStepForm);
proxy?.$modal.msgSuccess("提交成功");
//
await getList();
} catch (error) {
console.error('提交失败', error);
proxy?.$modal.msgError("提交失败");
}
}; };
</script> </script>

@ -0,0 +1,563 @@
<template>
<div class="p-2">
<!-- 顶部操作按钮区域 -->
<el-card shadow="never" class="mb-[10px]">
<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">
审批
</el-button>
<el-button v-if="billsInfo.billsLubeInstanceId && billsInfo.lubeStatus !== 'draft'" type="primary"
@click="handleApprovalRecord">
流程进度
</el-button>
</div>
<div>
<el-button style="float: right" @click="goBack()"></el-button>
</div>
</div>
</el-card>
<!-- 工单信息区域 -->
<h4 class="form-header h4">工单信息</h4>
<el-card shadow="never" class="mb-[10px]">
<el-form label-width="120px">
<el-row>
<el-col :span="8" :offset="2">
<el-form-item label="工单编号">
<el-input v-model="billsInfo.billsLubeCode" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="工单状态">
<el-input v-model="billsStatusCheck" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请人">
<el-input v-model="billsInfo.createBy" disabled />
</el-form-item>
</el-col>
<el-col :span="8" :offset="2">
<el-form-item label="申请时间">
<el-input v-model="billsInfo.createTime" disabled />
</el-form-item>
</el-col>
<el-col :span="16" :offset="2">
<el-form-item label="备注">
<el-input v-model="billsInfo.remark" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<!-- 流程步骤展示区域 -->
<el-card shadow="never" class="mb-[10px]">
<el-form ref="stepFormRef" :model="form" label-width="100px">
<!-- 第一步 -->
<h4 class="form-header h4" v-if="dmsBillsLubeInstanceActivityList.length > 0">1</h4>
<el-row v-if="dmsBillsLubeInstanceActivityList.length > 0">
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="form.lubeLevel" placeholder="润滑级别" disabled>
<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="请输入润滑组别" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="form.lubeSupervisor" placeholder="请输入润滑负责人" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 中间步骤 (已处理的后续节点) -->
<template v-for="(activity) in dmsBillsLubeInstanceActivityList" :key="activity.instanceActivityId">
<div v-if="activity.processStepOrder && activity.processStepOrder > 1">
<h4 class="form-header h4">{{ `已处理节点:步骤${activity.processStepOrder}` }}</h4>
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别">
<el-select
v-model="activity.lubeLevel"
placeholder="润滑级别"
disabled>
<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="润滑组别">
<el-input
v-model="activity.lubeGroup"
disabled
placeholder="润滑组别">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人">
<el-input
v-model="activity.lubeSupervisor"
disabled
placeholder="润滑负责人">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见">
<el-input
v-model="activity.processHandleResolution"
disabled
placeholder="处理意见">
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</template>
<!-- 当前步骤表单 (用于提交新节点) -->
<div v-if="isUpdate">
<h4 class="form-header h4">当前处理节点步骤{{ nextStepOrder }}</h4>
<el-form ref="nextStepFormRef" :model="nextStepForm" :rules="nextStepFormRules" label-width="100px">
<el-row>
<el-col :span="8">
<el-form-item label="润滑级别" prop="lubeLevel">
<el-select v-model="nextStepForm.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="nextStepForm.lubeGroup" placeholder="润滑组别"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="润滑负责人" prop="lubeSupervisor">
<el-input v-model="nextStepForm.lubeSupervisor" placeholder="润滑负责人"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见" prop="processHandleResolution">
<el-input v-model="nextStepForm.processHandleResolution" placeholder="处理意见"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="text-center mt-4">
<el-button type="primary" @click="submitNextStep"> </el-button>
</el-col>
</el-row>
</el-form>
</div>
</el-form>
</el-card>
<!-- 润滑计划详情区域 -->
<el-card shadow="never">
<h4 class="form-header h4 text-center">润滑计划详细信息</h4>
<el-table v-loading="loading" :data="planLubeDetail">
<el-table-column label="计划ID" align="center" prop="planLubeId" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="润滑部位" align="center" prop="lubeStationName" />
<el-table-column label="润滑标准" align="center" prop="lubeStandardCode" />
<el-table-column label="操作描述" align="center" prop="operationDescription" />
</el-table>
</el-card>
<!-- 提交组件 -->
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
<!-- 审批记录 -->
<approvalRecord ref="approvalRecordRef" />
<el-dialog v-model="dialogVisible.visible" :title="dialogVisible.title" :before-close="handleClose" width="500">
<el-select v-model="flowCode" placeholder="Select" style="width: 240px">
<el-option v-for="item in flowCodeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose"></el-button>
<el-button type="primary" @click="submitFlow()"></el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="DmsBillsLubeInstanceActivity" lang="ts">
import { ref, reactive, toRefs, getCurrentInstance, onMounted, computed } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import type { FormInstance, FormRules } from 'element-plus';
import { startWorkFlow } from '@/api/workflow/task';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import { AxiosResponse } from 'axios';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
import {
listDmsBillsLubeInstanceActivity,
addDmsBillsLubeInstanceActivity
} from '@/api/dms/dmsBillsLubeInstanceActivity';
import {
DmsBillsLubeInstanceActivityVO,
DmsBillsLubeInstanceActivityForm
} from '@/api/dms/dmsBillsLubeInstanceActivity/types';
import { listDmsBillsLubeInstance, updateDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
import { getDmsPlanLubeDetail } from '@/api/dms/dmsPlanLubeDetail';
import { DmsPlanLubeDetailVO } from "@/api/dms/dmsPlanLubeDetail/types";
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { lube_level, process_handle_status } = toRefs<any>(proxy?.useDict('lube_level', 'process_handle_status'));
const route = useRoute();
const router = useRouter();
//
const stepFormRef = ref<FormInstance>();
const nextStepFormRef = ref<FormInstance>();
//
const loading = ref(true);
const buttonLoading = ref(false);
const dmsBillsLubeInstanceActivityList = ref<DmsBillsLubeInstanceActivityVO[]>([]);
const billsInfo = ref<any>({});
const planLubeDetail = ref<DmsPlanLubeDetailVO[]>([]);
const billsStatusCheck = ref('');
const isUpdate = ref(true);
const planLubeId = ref('');
const lubeInstanceId = route.params.lubeInstanceId as string;
//
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const routeParams = ref<Record<string, any>>({});
const flowCodeOptions = [
{
value: 'planlube',
label: '润滑工单申请'
}
];
const flowCode = ref<string>('');
const dialogVisible = reactive<DialogOption>({
visible: false,
title: '流程定义'
});
const submitFormData = ref<StartProcessBo>({
businessId: '',
flowCode: '',
variables: {}
});
const taskVariables = ref<Record<string, any>>({});
//
const nextStepOrder = computed(() => {
return dmsBillsLubeInstanceActivityList.value.length + 1;
});
// ()
const form = reactive<Partial<DmsBillsLubeInstanceActivityForm>>({
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
remark: undefined,
});
// ()
const nextStepForm = reactive<DmsBillsLubeInstanceActivityForm>({
instanceActivityId: undefined,
lubeInstanceId: lubeInstanceId,
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: undefined,
processHandleStatus: undefined,
processStepOrder: undefined,
startTime: undefined,
endTime: undefined,
handleUserId: undefined,
handleBy: undefined,
handleTime: undefined,
transferUserId: undefined,
attr1: undefined,
remark: undefined,
});
//
const nextStepFormRules = reactive<FormRules>({
lubeLevel: [{ required: true, message: "润滑级别不能为空", trigger: "change" }],
lubeGroup: [{ required: true, message: "润滑组别不能为空", trigger: "blur" }],
lubeSupervisor: [{ required: true, message: "润滑负责人不能为空", trigger: "blur" }],
processHandleResolution: [{ required: true, message: "处理意见不能为空", trigger: "blur" }],
});
//
const queryParams = reactive({
pageNum: 1,
pageSize: 50,
lubeInstanceId: lubeInstanceId,
});
//
onMounted(() => {
//
routeParams.value = proxy.$route.query;
if(route.name === 'childDmsBillsLubeInstanceActivity') {
isUpdate.value = true;
} else if(route.name === 'selectChildDmsBillsLubeInstanceActivity') {
isUpdate.value = false;
}
//
getDmsBillsLubeInstance();
//
getList();
});
//
const getDmsBillsLubeInstance = async () => {
try {
const res = await listDmsBillsLubeInstance(queryParams);
if (res.rows && res.rows.length > 0) {
billsInfo.value = res.rows[0];
// planLubeId
const lubeIdFromServer = res.rows[0].planLubeId;
planLubeId.value = typeof lubeIdFromServer === 'number' ? String(lubeIdFromServer) : lubeIdFromServer;
//
if (lube_level.value && billsInfo.value.lubeStatus !== undefined) {
const statusItem = lube_level.value.find((item: any) => String(item.value) === String(billsInfo.value.lubeStatus));
billsStatusCheck.value = statusItem ? statusItem.label : '未知状态';
} else {
billsStatusCheck.value = '未知状态';
}
//
if (planLubeId.value) {
getPlanLubeDetailData();
}
} else {
proxy?.$modal.msgError("未查询到工单信息");
}
} catch (error) {
console.error('获取工单实例数据失败', error);
proxy?.$modal.msgError("获取工单实例数据失败");
}
};
//
const getPlanLubeDetailData = async () => {
if (!planLubeId.value) return;
loading.value = true;
try {
const res = await getDmsPlanLubeDetail(planLubeId.value);
planLubeDetail.value = res && res.rows ? [res.rows] : [];
} catch (error) {
console.error('获取润滑计划详情失败', error);
proxy?.$modal.msgError("获取润滑计划详情失败");
} finally {
loading.value = false;
}
};
//
const getList = async () => {
loading.value = true;
try {
const res = await listDmsBillsLubeInstanceActivity(queryParams);
dmsBillsLubeInstanceActivityList.value = res.rows;
// ()
if (res.rows && res.rows.length > 0) {
Object.assign(form, {
lubeGroup: res.rows[0].lubeGroup,
lubeSupervisor: res.rows[0].lubeSupervisor,
lubeLevel: res.rows[0].lubeLevel,
remark: res.rows[0].remark
});
// ()
const lastActivity = res.rows[res.rows.length - 1];
Object.assign(nextStepForm, {
lubeGroup: lastActivity.lubeGroup,
lubeSupervisor: lastActivity.lubeSupervisor,
lubeLevel: lastActivity.lubeLevel,
processHandleResolution: null,
remark: ''
});
} else {
// nextStepForm
Object.assign(nextStepForm, {
lubeGroup: undefined,
lubeSupervisor: undefined,
lubeLevel: undefined,
processHandleResolution: null,
remark: ''
});
}
} catch (error) {
console.error('获取工单实例节点数据失败', error);
proxy?.$modal.msgError("获取工单实例节点数据失败");
} finally {
loading.value = false;
}
};
//
const submitNextStep = async () => {
if (!nextStepFormRef.value) return;
await nextStepFormRef.value.validate(async (valid: boolean) => {
if (valid) {
try {
loading.value = true;
//
nextStepForm.processStepOrder = nextStepOrder.value;
//
await addDmsBillsLubeInstanceActivity(nextStepForm);
proxy?.$modal.msgSuccess("提交成功");
//
await getList();
//
Object.assign(nextStepForm, {
processHandleResolution: null,
remark: ''
});
} catch (error) {
console.error('提交节点失败', error);
proxy?.$modal.msgError("提交失败");
} finally {
loading.value = false;
}
}
});
};
//
const handleClose = () => {
dialogVisible.visible = false;
flowCode.value = '';
buttonLoading.value = false;
};
//
const submitForm = (status: string) => {
try {
buttonLoading.value = true;
if (status === 'draft') {
//
buttonLoading.value = false;
proxy?.$modal.msgSuccess('暂存成功');
goBack();
} else {
//
if ((billsInfo.value.status === 'draft' && (flowCode.value === '' || flowCode.value === null)) || routeParams.value.type === 'add') {
flowCode.value = flowCodeOptions[0].value;
dialogVisible.visible = true;
return;
}
//
if (flowCode.value === '' || flowCode.value === null) {
flowCode.value = 'xx';
}
handleStartWorkFlow(billsInfo.value);
}
} finally {
buttonLoading.value = false;
}
};
const submitFlow = async () => {
handleStartWorkFlow(billsInfo.value);
dialogVisible.visible = false;
};
//
const handleStartWorkFlow = async (data: any): Promise<void> => {
try {
submitFormData.value.flowCode = flowCode.value;
submitFormData.value.businessId = data.lubeInstanceId;
//
taskVariables.value = {
data: data
};
submitFormData.value.variables = taskVariables.value;
const resp = await startWorkFlow(submitFormData.value);
if (submitVerifyRef.value) {
buttonLoading.value = false;
submitVerifyRef.value.openDialog(resp.data.taskId);
}
} finally {
buttonLoading.value = false;
}
};
//
const handleApprovalRecord = (): void => {
approvalRecordRef.value?.init(billsInfo.value.lubeInstanceId);
};
//
const submitCallback = async () => {
await proxy.$tab.closePage(proxy.$route);
goBack();
// void
};
//
const goBack = () => {
proxy.$tab.closePage(proxy.$route);
proxy.$router.go(-1);
};
//
const approvalVerifyOpen = async () => {
submitVerifyRef.value?.openDialog(routeParams.value.taskId);
};
//
const submitButtonShow = computed(() => {
return (
routeParams.value.type === 'add' ||
(routeParams.value.type === 'update' &&
billsInfo.value.status &&
(billsInfo.value.status === 'draft' || billsInfo.value.status === 'cancel' || billsInfo.value.status === 'back'))
);
});
//
const approvalButtonShow = computed(() => {
return routeParams.value.type === 'approval' && billsInfo.value.status && billsInfo.value.status === 'waiting';
});
</script>

@ -4,20 +4,20 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="主键标识" prop="instanceFileId"> <!-- <el-form-item label="主键标识" prop="instanceFileId">
<el-input v-model="queryParams.instanceFileId" placeholder="请输入主键标识" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.instanceFileId" placeholder="请输入主键标识" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>-->
<el-form-item label="关联类型(1维修前2维修后)" prop="targetType"> <el-form-item label="关联类型" prop="targetType">
<el-select v-model="queryParams.targetType" placeholder="请选择关联类型(1维修前2维修后)" clearable > <el-select v-model="queryParams.targetType" placeholder="请选择关联类型" clearable >
<el-option v-for="dict in target_type" :key="dict.value" :label="dict.label" :value="dict.value"/> <el-option v-for="dict in target_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" prop="targetId"> <!-- <el-form-item label="关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" prop="targetId">
<el-input v-model="queryParams.targetId" placeholder="请输入关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.targetId" placeholder="请输入关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>-->
<el-form-item label="故障文件地址,一般是图片" prop="filePath"> <!-- <el-form-item label="故障文件地址,一般是图片" prop="filePath">
<el-input v-model="queryParams.filePath" placeholder="请输入故障文件地址,一般是图片" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.filePath" placeholder="请输入故障文件地址,一般是图片" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>-->
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"></el-button> <el-button type="primary" icon="Search" @click="handleQuery"></el-button>
<el-button icon="Refresh" @click="resetQuery"></el-button> <el-button icon="Refresh" @click="resetQuery"></el-button>
@ -49,13 +49,14 @@
<el-table v-loading="loading" :data="dmsInstanceFileList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="dmsInstanceFileList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键标识" align="center" prop="instanceFileId" v-if="columns[0].visible"/> <el-table-column label="主键标识" align="center" prop="instanceFileId" v-if="columns[0].visible"/>
<el-table-column label="关联类型(1维修前2维修后)" align="center" prop="targetType" v-if="columns[2].visible"> <el-table-column label="关联类型" align="center" prop="targetType" v-if="columns[2].visible">
<template #default="scope"> <template #default="scope">
<dict-tag :options="target_type" :value="scope.row.targetType"/> <dict-tag :options="target_type" :value="scope.row.targetType"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" align="center" prop="targetId" v-if="columns[3].visible"/> <!-- <el-table-column label="关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" align="center" prop="targetId" v-if="columns[3].visible"/>-->
<el-table-column label="故障文件地址,一般是图片" align="center" prop="filePath" v-if="columns[4].visible"/> <el-table-column label="关联节点" align="center" prop="targetId" v-if="columns[3].visible"/>
<el-table-column label="故障文件地址" align="center" prop="filePath" v-if="columns[4].visible"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <el-tooltip content="修改" placement="top">
@ -73,10 +74,10 @@
<!-- 添加或修改维修工单文件对话框 --> <!-- 添加或修改维修工单文件对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="dmsInstanceFileFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="dmsInstanceFileFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="主键标识" prop="instanceFileId"> <!-- <el-form-item label="主键标识" prop="instanceFileId">
<el-input v-model="form.instanceFileId" placeholder="请输入主键标识" /> <el-input v-model="form.instanceFileId" placeholder="请输入主键标识" />
</el-form-item> </el-form-item>-->
<el-form-item label="关联类型(1维修前2维修后)" prop="targetType"> <el-form-item label="关联类型" prop="targetType">
<el-radio-group v-model="form.targetType"> <el-radio-group v-model="form.targetType">
<el-radio <el-radio
v-for="dict in target_type" v-for="dict in target_type"
@ -85,6 +86,9 @@
>{{dict.label}}</el-radio> >{{dict.label}}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- <el-form-item label="关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" prop="targetId">
<el-input v-model="form.targetId" placeholder="请输入关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" />
</el-form-item>-->
<el-form-item label="关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" prop="targetId"> <el-form-item label="关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" prop="targetId">
<el-input v-model="form.targetId" placeholder="请输入关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" /> <el-input v-model="form.targetId" placeholder="请输入关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID" />
</el-form-item> </el-form-item>
@ -128,16 +132,16 @@ const dialog = reactive<DialogOption>({
// //
const columns = ref<FieldOption[]>([ const columns = ref<FieldOption[]>([
{ key: 0, label: `主键标识`, visible: true }, { key: 0, label: `主键标识`, visible: false },
{ key: 1, label: `租户编号`, visible: true }, { key: 1, label: `租户编号`, visible: false },
{ key: 2, label: `关联类型(1维修前2维修后)`, visible: true }, { key: 2, label: `关联类型`, visible: true },
{ key: 3, label: `关联类型为1时关联维修工单实例节点主键关联类型为2时关联维修记录ID`, visible: true }, { key: 3, label: `关联`, visible: false },
{ key: 4, label: `故障文件地址,一般是图片`, visible: true }, { key: 4, label: `故障文件地址`, visible: true },
{ key: 5, label: `创建部门`, visible: true }, { key: 5, label: `创建部门`, visible: false },
{ key: 6, label: `创建人`, visible: true }, { key: 6, label: `创建人`, visible: false },
{ key: 7, label: `创建时间`, visible: true }, { key: 7, label: `创建时间`, visible: false },
{ key: 8, label: `更新人`, visible: true }, { key: 8, label: `更新人`, visible: false },
{ key: 9, label: `更新时间`, visible: true }, { key: 9, label: `更新时间`, visible: false },
]); ]);
const initFormData: DmsInstanceFileForm = { const initFormData: DmsInstanceFileForm = {

@ -3,8 +3,8 @@
<el-row :gutter="20"> <el-row :gutter="20">
<!-- 生产bom树 --> <!-- 生产bom树 -->
<el-col :lg="6" :xs="24" style="" v-loading="treeLoading"> <el-col :lg="6" :xs="24" style="" v-loading="treeLoading">
<el-card shadow="hover"> <el-card shadow="hover" style="height: calc(100vh - 120px);overflow:auto;">
<el-input v-model="materialName" placeholder="请输入物料名称" prefix-icon="Search" clearable/> <el-input v-model="materialName" placeholder="请输入物料名称" prefix-icon="Search" clearable />
<el-tree <el-tree
ref="materialBomTreeRef" ref="materialBomTreeRef"
class="mt-2" class="mt-2"
@ -18,55 +18,86 @@
@node-click="handleNodeClick" @node-click="handleNodeClick"
> >
<template #default="{ node, data }"> <template #default="{ node, data }">
<el-tooltip :content="`${data.label}`"> <div style="width: 100%">
<div class="custom-tree-node"> <el-tooltip :content="`${data.label}`" style="width: 100%">
<span>{{ node.label }}</span> <div class="custom-tree-node"
</div> style="display: inline-block;vertical-align: top;max-width: 80%;overflow: hidden;">
</el-tooltip> <span
:style="{backgroundColor:getColor(data)?.[0],color:getColor(data)?.[1],verticalAlign: 'center'}">{{ node.label
}}</span>
</div>
</el-tooltip>
<el-button type="primary" link @click="fun(data)"
style=" vertical-align: top; ">
上传
</el-button>
</div>
</template> </template>
</el-tree> </el-tree>
</el-card> </el-card>
</el-col> </el-col>
<el-col :lg="18" :xs="24" v-loading="loading"> <el-col :lg="18" :xs="24" v-loading="loading">
<div> <el-divider content-position="left">父级物料</el-divider>
<el-divider content-position="left">父级物料</el-divider> <el-card shadow="hover">
<template #header>
<el-row :gutter="10">
<el-col :span="1.5">
<el-button v-has-permi="['mes:materialBom:add']" type="primary" plain icon="Plus"
@click="addNewMaterialBomVersion()" :loading="btnLoading"
:disabled="addNewMaterialBomVersionBtnDisabled">{{ addNewMaterialBomVersionBtnText }}
</el-button>
</el-col>
</el-row>
</template>
<el-form ref="parentMaterialBomFormRef" label-width="120px" :model="parentForm" :rules="parentRules"> <el-form ref="parentMaterialBomFormRef" label-width="120px" :model="parentForm" :rules="parentRules">
<el-row> <el-row :gutter="20">
<el-form-item label='父物料ID' prop='parentId' v-if="false"> <el-form-item label='父物料ID' prop='parentId' v-if="false">
<el-input v-model='parentForm.parentId' placeholder='' style="width:360px"/> <el-input v-model='parentForm.parentId' placeholder='' style="width:360px" />
</el-form-item> </el-form-item>
<el-form-item label='父物料类型ID' prop='parentMaterialTypeId' v-if="false"> <el-form-item label='父物料类型ID' prop='parentMaterialTypeId' v-if="false">
<el-input v-model='parentForm.parentMaterialTypeId' placeholder='' style="width:360px"/> <el-input v-model='parentForm.parentMaterialTypeId' placeholder='' style="width:360px" />
</el-form-item>
<el-form-item label='状态' prop='activeFlag' style="width:260px">
<el-select v-model='parentForm.activeFlag' disabled>
<el-option v-for='dict in material_bom_active_flag' :key='dict.value' :label='dict.label'
:value='dict.value' />
</el-select>
</el-form-item>
<el-form-item label="BOM版本" prop='materialBomVersion'>
<el-input v-model='parentForm.materialBomVersion' placeholder='' style="width:260px" disabled />
</el-form-item> </el-form-item>
<el-form-item label='父物料名称' prop='parentMaterialName'> <el-form-item label='父物料名称' prop='parentMaterialName'>
<el-input v-model='parentForm.parentMaterialName' placeholder='请点击检索物料' <el-input v-model='parentForm.parentMaterialName' placeholder='请点击检索物料'
@click='handleMaterialSelect(parentForm,SELECT_MATERIAL_MODEL.PARENT_SELECT)' @click='handleMaterialSelect(parentForm,SELECT_MATERIAL_MODEL.PARENT_SELECT)'
style="width:260px" @change="getList" suffix-icon="Search" readonly style="width:260px" @change="getList" suffix-icon="Search" readonly
:disabled="parentMaterialDisabled"/> :disabled="parentMaterialDisabled" />
</el-form-item> </el-form-item>
<el-form-item label="父物料类型名称" prop='parentMaterialTypeName'> <el-form-item label="父物料类型名称" prop='parentMaterialTypeName'>
<el-input v-model='parentForm.parentMaterialTypeName' placeholder='' style="width:260px" readonly/> <el-input v-model='parentForm.parentMaterialTypeName' placeholder='' style="width:260px" readonly />
</el-form-item> </el-form-item>
<el-form-item label="BOM版本" prop='materialBomVersion' :model="parentForm"> <!-- <el-form-item label="BOM版本" prop='materialBomVersion' :model="parentForm">-->
<el-select v-model="parentForm.materialBomVersion" <!-- <el-select v-model="parentForm.materialBomVersion"-->
placeholder="请选择" style="width:200px"> <!-- placeholder="请选择" style="width:200px">-->
<el-option <!-- <el-option-->
v-for="item in materialBomVersionOptions" <!-- v-for="item in materialBomVersionOptions"-->
:key="item.materialBomVersion" <!-- :key="item.materialBomVersion"-->
:label="item.materialBomVersion" <!-- :label="item.materialBomVersion"-->
:value="item.materialBomVersion" <!-- :value="item.materialBomVersion"-->
></el-option> <!-- ></el-option>-->
</el-select> <!-- </el-select>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item label='父物料数量' prop='parentStandardAmount'> <el-form-item label='父物料数量' prop='parentStandardAmount'>
<el-input-number v-model='parentForm.parentStandardAmount' :precision="2" :step="1" <el-input-number v-model='parentForm.parentStandardAmount' :precision="2" :step="1"
placeholder='请输入父物料数量' placeholder='请输入父物料数量'
style="width:200px"/> style="width:200px" />
</el-form-item> </el-form-item>
<el-form-item label='单位' prop='parentUnitId'> <el-form-item label='单位' prop='parentUnitId'>
@ -80,10 +111,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="BOM说明" prop='materialBomDesc'>
<el-input v-model='parentForm.materialBomDesc' placeholder='' style="width:360px" type="textarea" />
</el-form-item>
</el-row> </el-row>
</el-form> </el-form>
</div> </el-card>
<el-divider content-position="left">子级物料</el-divider> <el-divider content-position="left">子级物料</el-divider>
@ -105,29 +139,29 @@
</template> </template>
<el-table :data="materialBomList" @selection-change="handleSelectionChange"> <el-table :data="materialBomList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center"/> <el-table-column type="selection" width="50" align="center" />
<el-table-column type="index" width="50" align="center" label="序号"/> <el-table-column type="index" width="50" align="center" label="序号" />
<el-table-column v-if="columns[0].visible" key="materialBomId" label="生产BOM_ID" align="center" <el-table-column v-if="columns[0].visible" key="materialBomId" label="生产BOM_ID" align="center"
prop="materialBomId"/> prop="materialBomId" />
<el-table-column v-if="columns[1].visible" key="materialTypeCode" label="子物料类型编号" align="center" <el-table-column v-if="columns[1].visible" key="materialTypeCode" label="子物料类型编号" align="center"
prop="materialTypeCode" :show-overflow-tooltip="true"/> prop="materialTypeCode" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[2].visible" key="materialTypeName" label="子物料类型名称" align="center" <el-table-column v-if="columns[2].visible" key="materialTypeName" label="子物料类型名称" align="center"
prop="materialTypeName" :show-overflow-tooltip="true" w/> prop="materialTypeName" :show-overflow-tooltip="true" w />
<el-table-column v-if="columns[4].visible" key="materialId" label="子物料ID" align="center" <el-table-column v-if="columns[4].visible" key="materialId" label="子物料ID" align="center"
prop="materialId" :show-overflow-tooltip="true"/> prop="materialId" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[5].visible" key="materialName" label="子物料名称" align="center" <el-table-column v-if="columns[5].visible" key="materialName" label="子物料名称" align="center"
prop="materialName" :show-overflow-tooltip="true"> prop="materialName" :show-overflow-tooltip="true">
<template #default='scope'> <template #default='scope'>
<el-input v-model='scope.row.materialName' placeholder='请点击检索物料' <el-input v-model='scope.row.materialName' placeholder='请点击检索物料'
@click='handleMaterialSelect(scope.row,SELECT_MATERIAL_MODEL.CHILD_SELECT)' @click='handleMaterialSelect(scope.row,SELECT_MATERIAL_MODEL.CHILD_SELECT)'
suffix-icon="Search" readonly/> suffix-icon="Search" readonly />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="columns[6].visible" key="standardAmount" label="子物料数量" align="center" <el-table-column v-if="columns[6].visible" key="standardAmount" label="子物料数量" align="center"
prop="standardAmount" :show-overflow-tooltip="true" width="220px"> prop="standardAmount" :show-overflow-tooltip="true" width="220px">
<template #default='scope'> <template #default='scope'>
<el-input-number v-model='scope.row.standardAmount' :precision="2" :step="1" <el-input-number v-model='scope.row.standardAmount' :precision="2" :step="1"
placeholder='请输入数量' style="width:180px"/> placeholder='请输入数量' style="width:180px" />
</template> </template>
</el-table-column> </el-table-column>
@ -190,18 +224,18 @@
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label='子物料ID' prop='materialId' v-if="false"> <el-form-item label='子物料ID' prop='materialId' v-if="false">
<el-input v-model='form.materialId' placeholder='' style="width:360px"/> <el-input v-model='form.materialId' placeholder='' style="width:360px" />
</el-form-item> </el-form-item>
<el-form-item label='子物料名称' prop='materialName'> <el-form-item label='子物料名称' prop='materialName'>
<el-input v-model='form.materialName' placeholder='请点击检索物料' <el-input v-model='form.materialName' placeholder='请点击检索物料'
@click='handleMaterialSelect(form,SELECT_MATERIAL_MODEL.DIALOG_CHILD_SELECT)' @click='handleMaterialSelect(form,SELECT_MATERIAL_MODEL.DIALOG_CHILD_SELECT)'
style="width:360px"/> style="width:360px" />
</el-form-item> </el-form-item>
<el-form-item label='子物料数量' prop='standardAmount'> <el-form-item label='子物料数量' prop='standardAmount'>
<el-input-number v-model='form.standardAmount' :precision="2" :step="1" placeholder='请输入子物料数量' <el-input-number v-model='form.standardAmount' :precision="2" :step="1" placeholder='请输入子物料数量'
style="width:360px"/> style="width:360px" />
</el-form-item> </el-form-item>
<el-form-item label='子物料单位' prop='unitId'> <el-form-item label='子物料单位' prop='unitId'>
@ -243,23 +277,28 @@ import {
materialBomTreeSelect, materialBomTreeSelect,
listMaterialBomJoinStructure, listMaterialBomJoinStructure,
addBatchMaterialBom, addBatchMaterialBom,
getUnitInfoList, getMaterialBomVersionList, getParentMaterialBom, deleteMaterialBoms getUnitInfoList, getMaterialBomVersionList, getParentMaterialBom, deleteMaterialBoms,
} from "@/api/mes/materialBom"; selectNextMaterialBomVersion
} from '@/api/mes/materialBom';
import {MaterialBomVO, MaterialBomForm, MaterialBomQuery} from '@/api/mes/materialBom/types'; import { MaterialBomVO, MaterialBomForm, MaterialBomQuery } from '@/api/mes/materialBom/types';
import {BaseMaterialTypeVO} from '@/api/mes/baseMaterialType/types'; import { BaseMaterialTypeVO } from '@/api/mes/baseMaterialType/types';
import MaterialSelect from '@/views/mes/baseMaterialInfo/addMaterial.vue'; import MaterialSelect from '@/views/mes/baseMaterialInfo/addMaterial.vue';
import {to} from 'await-to-js'; import { to } from 'await-to-js';
import {nextTick} from "vue"; import { nextTick } from 'vue';
import {MaterialBomVersionVO} from "@/api/mes/materialBomVersion/types"; import { MaterialBomVersionVO } from '@/api/mes/materialBomVersion/types';
import {BaseMeasurementUnitInfoVO} from "@/api/mes/baseMeasurementUnitInfo/types"; import { BaseMeasurementUnitInfoVO } from '@/api/mes/baseMeasurementUnitInfo/types';
import {BaseStructureBomTreeVO} from "@/api/mes/baseStructureBom/types"; import { BaseStructureBomTreeVO } from '@/api/mes/baseStructureBom/types';
const materialTypeId = ref(0);//使 const materialTypeId = ref(0);//使
const router = useRouter(); const router = useRouter();
const {proxy} = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { material_bom_active_flag } = toRefs<any>(proxy?.useDict('material_bom_active_flag'));
const materialBomList = ref<MaterialBomVO[]>(); const materialBomList = ref<MaterialBomVO[]>();
const saveMaterialBomList = ref<MaterialBomVO[]>([]); const saveMaterialBomList = ref<MaterialBomVO[]>([]);
const treeLoading = ref(false); const treeLoading = ref(false);
@ -293,18 +332,31 @@ const SELECT_MATERIAL_MODEL = ref({
PARENT_SELECT: '1',// PARENT_SELECT: '1',//
CHILD_SELECT: '2',// CHILD_SELECT: '2',//
DIALOG_CHILD_SELECT: '3'// DIALOG_CHILD_SELECT: '3'//
}) });
const MATERIAL_BOM_ACTIVE_FLAG = ref({
ACTIVE: '1',//
HISTORY: '2',//
DESIGN: '3'//
});
const addNewMaterialBomVersionBtnText = ref('新增中');
const addNewMaterialBomVersionBtnDisabled = ref(true);
const publishBtnDisplay = ref(false);
const initialMaterialBomVersion = ref('01');
// //
const columns = ref<FieldOption[]>([ const columns = ref<FieldOption[]>([
{key: 0, label: `生产BOM_ID`, visible: false, children: []}, { key: 0, label: `生产BOM_ID`, visible: false, children: [] },
{key: 1, label: `子物料类型编号`, visible: true, children: []}, { key: 1, label: `子物料类型编号`, visible: true, children: [] },
{key: 2, label: `子物料类型名称`, visible: true, children: []}, { key: 2, label: `子物料类型名称`, visible: true, children: [] },
{key: 3, label: `BOM版本`, visible: false, children: []}, { key: 3, label: `BOM版本`, visible: false, children: [] },
{key: 4, label: `子物料ID`, visible: false, children: []}, { key: 4, label: `子物料ID`, visible: false, children: [] },
{key: 5, label: `子物料名称`, visible: true, children: []}, { key: 5, label: `子物料名称`, visible: true, children: [] },
{key: 6, label: `子物料数量`, visible: true, children: []}, { key: 6, label: `子物料数量`, visible: true, children: [] },
{key: 7, label: `子物料单位`, visible: true, children: []} { key: 7, label: `子物料单位`, visible: true, children: [] }
]); ]);
const materialBomTreeRef = ref<ElTreeInstance>(); const materialBomTreeRef = ref<ElTreeInstance>();
@ -338,9 +390,9 @@ const initParentFormData: MaterialBomForm = {
assembleTime: undefined, assembleTime: undefined,
materialClassfication: undefined, materialClassfication: undefined,
attachId: undefined, attachId: undefined,
activeFlag: '1', activeFlag: undefined,
remark: undefined, remark: undefined,
materialTypeName: undefined, materialTypeName: undefined
}; };
const initFormData: MaterialBomForm = { const initFormData: MaterialBomForm = {
@ -362,14 +414,14 @@ const initFormData: MaterialBomForm = {
assembleTime: undefined, assembleTime: undefined,
materialClassfication: undefined, materialClassfication: undefined,
attachId: undefined, attachId: undefined,
activeFlag: '1', activeFlag: undefined,
remark: undefined, remark: undefined,
materialTypeName: undefined, materialTypeName: undefined
}; };
const data = reactive<PageData<MaterialBomForm, MaterialBomQuery>>({ const data = reactive<PageData<MaterialBomForm, MaterialBomQuery>>({
form: {...initFormData}, form: { ...initFormData },
parentForm: {...initParentFormData}, parentForm: { ...initParentFormData },
queryParams: { queryParams: {
materialBomId: undefined, materialBomId: undefined,
parentId: undefined, parentId: undefined,
@ -382,31 +434,31 @@ const data = reactive<PageData<MaterialBomForm, MaterialBomQuery>>({
}, },
rules: { rules: {
materialTypeId: [ materialTypeId: [
{required: true, message: "物料类型不能为空", trigger: "blur"} { required: true, message: '物料类型不能为空', trigger: 'blur' }
], ],
materialBomVersion: [ materialBomVersion: [
{required: true, message: "BOM版本不能为空", trigger: "blur"} { required: true, message: 'BOM版本不能为空', trigger: 'blur' }
], ],
materialName: [ materialName: [
{required: true, message: "物料名称不能为空", trigger: "blur"} { required: true, message: '物料名称不能为空', trigger: 'blur' }
], ],
standardAmount: [ standardAmount: [
{required: true, message: "子物料数量不能为空", trigger: "blur"} { required: true, message: '子物料数量不能为空', trigger: 'blur' }
] ]
}, },
parentRules: { parentRules: {
parentMaterialName: [ parentMaterialName: [
{required: true, message: "父物料名称不能为空", trigger: "blur"} { required: true, message: '父物料名称不能为空', trigger: 'blur' }
], ],
materialBomVersion: [ materialBomVersion: [
{required: true, message: "BOM版本不能为空", trigger: "blur"} { required: true, message: 'BOM版本不能为空', trigger: 'blur' }
], ],
parentStandardAmount: [ parentStandardAmount: [
{required: true, message: "父物料数量不能为空", trigger: "blur"} { required: true, message: '父物料数量不能为空', trigger: 'blur' }
], ],
parentUnitId: [ parentUnitId: [
{required: true, message: "父物料单位不能为空", trigger: "blur"} { required: true, message: '父物料单位不能为空', trigger: 'blur' }
] ]
} }
@ -421,9 +473,9 @@ const parentQueryParams = ref({
materialName: undefined, materialName: undefined,
materialBomVersion: undefined, materialBomVersion: undefined,
params: {} params: {}
}) });
const {queryParams, form, rules, parentForm, parentRules} = toRefs(data); const { queryParams, form, rules, parentForm, parentRules } = toRefs(data);
/** 通过条件过滤节点 */ /** 通过条件过滤节点 */
const filterNode = (value: string, data: any) => { const filterNode = (value: string, data: any) => {
@ -452,7 +504,7 @@ const getTreeSelect = async () => {
id: virtualTopNodeId,//materialBomId id: virtualTopNodeId,//materialBomId
parentId: -1, parentId: -1,
materialId: 0, materialId: 0,
label: "生产BOM", label: '生产BOM',
children: res.data children: res.data
}; };
materialBomOptions.value.push(initialTree); materialBomOptions.value.push(initialTree);
@ -460,14 +512,14 @@ const getTreeSelect = async () => {
// materialBomOptions.value = res.data; // materialBomOptions.value = res.data;
if (!focusKeyNode.value) {//focus if (!focusKeyNode.value) {//focus
focusKeyNode.value = {treeKey: virtualTopNodeId}; focusKeyNode.value = { treeKey: virtualTopNodeId };
} else { } else {
const clickNode = findObjectByTreeKey(materialBomOptions.value, focusKeyNode.value.treeKey) const clickNode = findObjectByTreeKey(materialBomOptions.value, focusKeyNode.value.treeKey);
if (!clickNode) { if (!clickNode) {
focusKeyNode.value = undefined; focusKeyNode.value = undefined;
focusKeyNode.value = {treeKey: virtualTopNodeId}; focusKeyNode.value = { treeKey: virtualTopNodeId };
} }
// if (!allTreeKeys || allTreeKeys.length <= 0) { // if (!allTreeKeys || allTreeKeys.length <= 0) {
// focusKeyNode.value = { // focusKeyNode.value = {
// treeKey: virtualTopNodeId, // treeKey: virtualTopNodeId,
@ -482,9 +534,9 @@ const getTreeSelect = async () => {
// const focusKeyNodeIndex = materialBomOptions.value.findIndex((optionItem) => focusKeyNode.value.treeKey === optionItem.treeKey);//children // const focusKeyNodeIndex = materialBomOptions.value.findIndex((optionItem) => focusKeyNode.value.treeKey === optionItem.treeKey);//children
} }
nextTick(function () { nextTick(function() {
materialBomTreeRef.value?.setCurrentKey(focusKeyNode.value.treeKey, true); materialBomTreeRef.value?.setCurrentKey(focusKeyNode.value.treeKey, true);
}) });
loading.value = false; loading.value = false;
treeLoading.value = false; treeLoading.value = false;
@ -495,6 +547,16 @@ const getTreeSelect = async () => {
// materialTypeOptions.value[0].children.push(dd); // materialTypeOptions.value[0].children.push(dd);
}; };
/** 查询生产bom列表 */
const getNextMaterialBomVersion = async () => {
//
// loading.value = true;
const res = await selectNextMaterialBomVersion(parentForm.value.parentId);
parentForm.value.materialBomVersion = res.data;
// materialBomList.value = res.data;
// loading.value = false;
};
/** 查询生产bom列表 */ /** 查询生产bom列表 */
const getList = async () => { const getList = async () => {
//BOM //BOM
@ -507,17 +569,21 @@ const getList = async () => {
const resetParentQueryParams = () => { const resetParentQueryParams = () => {
parentQueryParams.value.parentId = undefined;//materialId parentQueryParams.value.parentId = undefined;//materialId
parentQueryParams.value.materialBomVersion = undefined; parentQueryParams.value.materialBomVersion = undefined;
} };
const resetQueryParams = () => { const resetQueryParams = () => {
queryParams.value.parentId = undefined;//materialid queryParams.value.parentId = undefined;//materialid
queryParams.value.parentMaterialTypeId = undefined; queryParams.value.parentMaterialTypeId = undefined;
} };
/** 节点单击事件 */ /** 节点单击事件 */
const handleNodeClick = (data: MaterialBomVO) => { const handleNodeClick = (data: MaterialBomVO) => {
materialBomList.value = []; materialBomList.value = [];
parentMaterialDisabled.value = true; parentMaterialDisabled.value = true;
publishBtnDisplay.value = false;
addNewMaterialBomVersionBtnDisabled.value = true;
btnLoading.value = true;
resetParentForm(); resetParentForm();
resetQueryParams(); resetQueryParams();
resetParentQueryParams(); resetParentQueryParams();
@ -526,27 +592,39 @@ const handleNodeClick = (data: MaterialBomVO) => {
parentQueryParams.value.parentId = data.materialId;//materialId parentQueryParams.value.parentId = data.materialId;//materialId
parentQueryParams.value.materialBomVersion = data.materialBomVersion; parentQueryParams.value.materialBomVersion = data.materialBomVersion;
getParentMaterialBomInfo(); getParentMaterialBomInfo();
queryParams.value.parentId = data.materialId;
queryParams.value.parentMaterialTypeId = data.materialTypeId;
queryParams.value.materialBomVersion = data.materialBomVersion
handleQuery();
} else { } else {
if (materialBomVersionOptions.value.length > 0) { parentForm.value.activeFlag = MATERIAL_BOM_ACTIVE_FLAG.value.DESIGN;
parentForm.value.materialBomVersion = materialBomVersionOptions.value[0].materialBomVersion; handleBtnStatus();
queryParams.value.materialBomVersion = materialBomVersionOptions.value[0].materialBomVersion; btnLoading.value = false;
} // if (materialBomVersionOptions.value.length > 0) {
// parentForm.value.materialBomVersion = materialBomVersionOptions.value[0].materialBomVersion;
// queryParams.value.materialBomVersion = materialBomVersionOptions.value[0].materialBomVersion;
// }
} }
parentMaterialDisabled.value = focusKeyNode.value.treeKey != -1; parentMaterialDisabled.value = focusKeyNode.value.treeKey != -1;
}; };
const handleBtnStatus = () => {
if (parentForm.value.materialBomVersion && parentForm.value.materialBomVersion !== '') {
addNewMaterialBomVersionBtnDisabled.value = false;
addNewMaterialBomVersionBtnText.value = '新增版本';
publishBtnDisplay.value = parentForm.value.activeFlag !== MATERIAL_BOM_ACTIVE_FLAG.value.ACTIVE;
} else {
addNewMaterialBomVersionBtnDisabled.value = true;
addNewMaterialBomVersionBtnText.value = '新增中';
publishBtnDisplay.value = false;
}
};
const clickDisplay = () => { const clickDisplay = () => {
if (queryParams.value.parentId === 0) { if (queryParams.value.parentId === 0) {
parentFormDisplay.value = false; parentFormDisplay.value = false;
childTableTitle.value = "顶级物料"; childTableTitle.value = '顶级物料';
} else { } else {
parentFormDisplay.value = true; parentFormDisplay.value = true;
childTableTitle.value = "子级物料"; childTableTitle.value = '子级物料';
} }
}; };
@ -588,7 +666,7 @@ const handleDelete = async (row?: MaterialBomVO) => {
}); });
// alert(JSON.stringify(toDeleteMaterialBoms.value)) // alert(JSON.stringify(toDeleteMaterialBoms.value))
if (toDeleteMaterialBoms.value.length > 0) { if (toDeleteMaterialBoms.value.length > 0) {
await deleteMaterialBoms(toDeleteMaterialBoms.value) await deleteMaterialBoms(toDeleteMaterialBoms.value);
await getTreeSelect(); await getTreeSelect();
} }
@ -619,7 +697,7 @@ const handleSelectionChange = (selection: MaterialBomVO[]) => {
/** 重置操作表单 */ /** 重置操作表单 */
const reset = () => { const reset = () => {
form.value = {...initFormData}; form.value = { ...initFormData };
materialBomFormRef.value?.resetFields(); materialBomFormRef.value?.resetFields();
}; };
/** 取消按钮 */ /** 取消按钮 */
@ -734,7 +812,7 @@ const handleMaterialSelect = (row, selectMode) => {
} else if (selectMode === SELECT_MATERIAL_MODEL.value.CHILD_SELECT) {//materialTypeId } else if (selectMode === SELECT_MATERIAL_MODEL.value.CHILD_SELECT) {//materialTypeId
materialTypeId.value = row.materialTypeId; materialTypeId.value = row.materialTypeId;
} else { } else {
materialTypeId.value = undefined materialTypeId.value = undefined;
} }
materialOpen.value = true; materialOpen.value = true;
}; };
@ -746,14 +824,15 @@ const submitMaterialForm = () => {
// //
if (globalSelectMode.value === SELECT_MATERIAL_MODEL.value.PARENT_SELECT) { if (globalSelectMode.value === SELECT_MATERIAL_MODEL.value.PARENT_SELECT) {
editedRow.value.materialBomVersion = undefined;
editedRow.value.parentId = selectedRow.materialId; editedRow.value.parentId = selectedRow.materialId;
editedRow.value.parentMaterialName = selectedRow.materialName; editedRow.value.parentMaterialName = selectedRow.materialName;
editedRow.value.parentMaterialTypeId = selectedRow.materialTypeId; editedRow.value.parentMaterialTypeId = selectedRow.materialTypeId;
editedRow.value.parentMaterialTypeName = selectedRow.matrialTypeName; editedRow.value.parentMaterialTypeName = selectedRow.matrialTypeName;
queryParams.value.parentId = selectedRow.materialId; queryParams.value.parentId = selectedRow.materialId;
queryParams.value.parentMaterialTypeId = selectedRow.materialTypeId; queryParams.value.parentMaterialTypeId = selectedRow.materialTypeId;
getNextMaterialBomVersion();
// alert(JSON.stringify(queryParams.value)) // alert(JSON.stringify(queryParams.value))
getList(); getList();
} else { } else {
@ -787,9 +866,12 @@ const submitBatchSaveMaterialBoms = async () => {
item.parentId = parentForm.value.parentId; item.parentId = parentForm.value.parentId;
item.parentUnitId = parentForm.value.parentUnitId; item.parentUnitId = parentForm.value.parentUnitId;
item.materialBomVersion = parentForm.value.materialBomVersion;
item.parentStandardAmount = parentForm.value.parentStandardAmount; item.parentStandardAmount = parentForm.value.parentStandardAmount;
item.parentMaterialTypeId = parentForm.value.parentMaterialTypeId; item.parentMaterialTypeId = parentForm.value.parentMaterialTypeId;
item.materialBomDesc = parentForm.value.materialBomDesc;
item.materialBomVersion = parentForm.value.materialBomVersion;
item.activeFlag = parentForm.value.activeFlag;
saveMaterialBomList.value.push(item); saveMaterialBomList.value.push(item);
} }
} }
@ -801,7 +883,9 @@ const submitBatchSaveMaterialBoms = async () => {
await addBatchMaterialBom(saveMaterialBomList.value); await addBatchMaterialBom(saveMaterialBomList.value);
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
focusKeyNode.value.treeKey = parentForm.value.parentId + "-" + parentForm.value.materialBomVersion; focusKeyNode.value.treeKey = parentForm.value.parentId + '-' + parentForm.value.materialBomVersion;
focusKeyNode.value.materialId = parentForm.value.parentId;
focusKeyNode.value.materialTypeId = parentForm.value.parentMaterialTypeId;
focusKeyNode.value.materialBomVersion = parentForm.value.materialBomVersion; focusKeyNode.value.materialBomVersion = parentForm.value.materialBomVersion;
focusKeyNode.value.parentUnitId = parentForm.value.parentUnitId; focusKeyNode.value.parentUnitId = parentForm.value.parentUnitId;
focusKeyNode.value.parentStandardAmount = parentForm.value.parentStandardAmount; focusKeyNode.value.parentStandardAmount = parentForm.value.parentStandardAmount;
@ -817,13 +901,13 @@ const submitBatchSaveMaterialBoms = async () => {
} }
} }
}); });
} };
/** 初始化单位数据 */ /** 初始化单位数据 */
const initUnitInfoData = async () => { const initUnitInfoData = async () => {
if (unitInfoOptions.value === undefined || unitInfoOptions.value.length <= 0) { if (unitInfoOptions.value === undefined || unitInfoOptions.value.length <= 0) {
const {data} = await getUnitInfoList(); const { data } = await getUnitInfoList();
// alert(JSON.stringify(data)) // alert(JSON.stringify(data))
unitInfoOptions.value = data; unitInfoOptions.value = data;
} }
@ -833,7 +917,7 @@ const initUnitInfoData = async () => {
const initMaterialBomVersionData = async () => { const initMaterialBomVersionData = async () => {
// alert(JSON.stringify(getMaterialBomVersionList)) // alert(JSON.stringify(getMaterialBomVersionList))
if (materialBomVersionOptions.value === undefined || materialBomVersionOptions.value.length <= 0) { if (materialBomVersionOptions.value === undefined || materialBomVersionOptions.value.length <= 0) {
const {data} = await getMaterialBomVersionList(); const { data } = await getMaterialBomVersionList();
materialBomVersionOptions.value = data; materialBomVersionOptions.value = data;
if (materialBomVersionOptions.value.length > 0) { if (materialBomVersionOptions.value.length > 0) {
@ -849,7 +933,18 @@ const initMaterialBomVersionData = async () => {
const getParentMaterialBomInfo = async () => { const getParentMaterialBomInfo = async () => {
const res = await getParentMaterialBom(parentQueryParams.value); const res = await getParentMaterialBom(parentQueryParams.value);
parentForm.value = res.data; parentForm.value = res.data;
handleBtnStatus();
if (!parentForm.value.materialBomVersion || parentForm.value.materialBomVersion === '') {
parentForm.value.materialBomVersion = initialMaterialBomVersion.value;
parentForm.value.activeFlag = MATERIAL_BOM_ACTIVE_FLAG.value.DESIGN;
}
queryParams.value.parentId = parentForm.value.parentId;
queryParams.value.parentMaterialTypeId = parentForm.value.parentMaterialTypeId;
queryParams.value.materialBomVersion = parentForm.value.materialBomVersion;
handleQuery();
btnLoading.value = false;
}; };
@ -862,8 +957,19 @@ const findObjectByTreeKey = (list, targetTreeKey) => {
} }
} }
return null; return null;
} };
/** 基于当前父级物料和版本新增物料bom版本 */
const addNewMaterialBomVersion = async () => {
loading.value = true;
parentForm.value.activeFlag = MATERIAL_BOM_ACTIVE_FLAG.value.DESIGN;
await getNextMaterialBomVersion();
materialBomList.value.forEach(childMaterialBom => {
childMaterialBom.materialBomId = undefined;
});
loading.value = false;
console.log(materialBomList);
};
// const getClickNode = (obj) => { // const getClickNode = (obj) => {
// // id,focusid // // id,focusid
@ -880,6 +986,22 @@ const findObjectByTreeKey = (list, targetTreeKey) => {
// } // }
// //
// } // }
const getColor = (e) => {
if (e.materialBomVersion === '01') {
return ['#ff0000', '#fff'];
}
if (e.materialBomVersion === '02') {
return ['#00ff00', '#000'];
}
if (e.materialBomVersion === '03') {
return ['#0000ff', '#fff'];
}
};
</script> </script>
<style lang="scss" scoped></style> <style lang="less" scoped>
:deep(.el-tree-node__content) {
width: 100%;
}
</style>

Loading…
Cancel
Save