<template> <div class="processApproval"> <div class="left-card"> <div class="top"> <div class="commons-title title">流程标题</div> <!-- <SendSubscribe ref="makeDom" v-if="flowForm.flowKey == 'subscribe_flow'" ></SendSubscribe> <SendPurchase ref="makeDom" v-else-if="flowForm.flowKey == 'purchase_flow'" :queryData="queryData.data" ></SendPurchase> --> </div> <div class="bottom"> <div class="commons-title title">处理意见</div> <el-form :model="flowForm" :rules="flowRules" ref="flowFormDom"> <el-form-item prop="remark" label-width="0px" label=""> <el-input type="textarea" placeholder="请输入" v-model="flowForm.remark" > </el-input> </el-form-item> <el-form-item> <el-button @click="handleSubmit"> ceshi </el-button> </el-form-item> </el-form> </div> </div> <div class="right-card"> <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> <el-tab-pane label="审批记录" name="first"> <ul class="flow-chart"> <li v-for="item in recordList" :key="item.id"> <div class="left-icon"> <i class="iconfont icon-iconm_daick"></i> <i class="iconfont icon-iconm_daohzj right-btm-status"></i> </div> <div class="right-conetnt"> <div class="name"> 发起人:{{ item.processedUser }} <!-- <span>2022-11-11 00:00:00</span> --> </div> <div class="remark"> <div class="label">{{ item.nodeName }}</div> {{ item.remark }} </div> </div> <div class="line"></div> </li> </ul> </el-tab-pane> <el-tab-pane label="决策辅助" name="second">决策辅助</el-tab-pane> </el-tabs> </div> <el-dialog title="下一处理人" width="400" v-model="dialogVisible"> <el-form :model="flowForm"> <el-form-item prop="remark" label="处理人"> <el-select v-model="flowForm.handleUserId" placeholder="请选择" filterable style="width: 100%" > <el-option v-for="item in nextHandleUser" :label="item.name" :value="item.id" > </el-option> </el-select> </el-form-item> <el-form-item> <div style="width: 100%; text-align: center"> <el-button type="primary" @click="handleSelectUser">提交 </el-button> </div> </el-form-item> </el-form> </el-dialog> </div> </template> <script setup> import { useRouter, useRoute } from "vue-router"; // //申购发起 // import SendSubscribe from "@/components/WDLY/process/SendSubscribe"; // //采购发起 // import SendPurchase from "@/components/WDLY/process/SendPurchase"; //请款发起 import SendFunds from "@/components/WDLY/process/SendFunds"; //退货 import ReturnGood from "@/components/WDLY/process/ReturnGood"; // 消息提示 import { ElMessage, ElMessageBox } from "element-plus"; const router = useRouter(); const route = useRoute(); // tab切换逻辑 const activeName = ref("first"); const handleClick = (tab, event) => { }; // 意见表单 const flowForm = reactive({ flowKey: "", handleUserId: "", remark: "", data: {}, }); const flowRules = reactive({ remark: [{ required: true, message: "请输入处理意见", trigger: "blur" }], }); //组件实例 const { proxy } = getCurrentInstance(); const makeDom = ref(null); const flowFormDom = ref(null); let dialogVisible = ref(false); const nextHandleUser = ref([]); const handleSelectUser = () => { if (!flowForm.handleUserId) { return ElMessage({ message: "请选择下一节点处理人!", type: "info", }); } handleSubmit(); }; const handleResult = (res) => { if (res !== null && res.success) { skipPage(); } else { dialogVisible.value = true; nextHandleUser.value = res.userList; } }; // 提交逻辑 const handleSubmit = async () => { try { // 调用发起组件的提交事件 const flag = await makeDom.value.handleSubmit(); if (flag) { flowFormDom.value.validate((vaild) => { if (vaild) { const data = { ...makeDom.value.submitData }; if (flowForm.flowKey == "subscribe_flow") { data.subscribeDetailList = data.subscribeDetailList.map((x) => ({ bussinessId: x.bussinessId, count: x.count, remark: x.remark, })); const victoriatouristJson = { planArrivalTime: data.planArrivalTime, receiptWarehouseId: data.receiptWarehouseId, }; data.victoriatouristJson = JSON.stringify(victoriatouristJson); } else if (flowForm.flowKey == "purchase_flow") { data.purchaseDetailList = data.purchaseDetailList.map((x) => ({ bussinessId: x.bussinessId, subscribeDetailId: x.id, count: x.count, price: x.price, amount: x.amount, })); const victoriatouristJson = { isAgreement: data.isAgreement, paymentMethod: data.paymentMethod, otherFeeList: data.otherFeeList, }; data.victoriatouristJson = JSON.stringify(victoriatouristJson); } else if (flowForm.flowKey == "30") { } else if (flowForm.flowKey == "40") { } proxy .post("/flowProcess/initiate", { ...flowForm, data, }) .then((res) => { handleResult(res); }); } }); } } catch (err) { console.log("数据未填完整!", err); } }; // 页面跳转 const skipPage = () => { ElMessage({ message: "操作成功!", type: "success", }); if (flowForm.flowKey == "subscribe_flow") { router.replace({ path: "/WDLY/purchaseManage/subscribe_wdly", }); } else if (flowForm.flowKey == "purchase_flow") { router.replace({ path: "/WDLY/purchaseManage/purchase_wdly", }); } else if (flowForm.flowKey == "30") { router.replace({ path: "/finance/fundManage/funds", }); } }; let queryData = reactive({ data: {}, }); // 记录 const recordList = ref([]); const getRecords = () => { proxy .post("/flowExample/getFlowNode", { flowKey: flowForm.flowKey, }) .then((res) => { recordList.value = res; }); }; onMounted(() => { queryData.data = { ...route.query }; flowForm.flowKey = route.query.flowKey; getRecords(); }); </script> <style lang="scss" scoped> .processApproval { display: flex; justify-content: space-between; margin-top: 20px; padding: 0 20px; height: calc(100vh - 130px); .left-card { background: #fff; border-radius: 4px; padding: 20px; flex: 1; margin-right: 20px; display: flex; flex-direction: column; .top { flex: 1; overflow-y: auto; background: #fff; } .bottom { height: 155px; background: #fff; } } .right-card { background: #fff; border-radius: 4px; padding: 0 20px 20px; width: 400px; box-sizing: border-box; .flow-chart { overflow: auto; padding: 0; margin: 0; li { margin: 0; padding: 0 0 20px; list-style: none; display: flex; justify-content: space-between; position: relative; .right-conetnt { flex: 1; .name { font-size: 12px; color: #333; margin-bottom: 10px; span { color: #999; float: right; } } .remark { padding: 10px; color: #666666; font-size: 12px; background: #f1f1f1; border-radius: 2px; .label { color: #39c55a; margin-bottom: 10px; } } } .left-icon { width: 40px; height: 40px; text-align: center; line-height: 40px; background: #0084ff; border-radius: 10px; color: #fff; font-size: 20px; position: relative; margin-right: 27px; z-index: 2; .right-btm-status { position: absolute; bottom: 0px; right: -10px; height: 20px; width: 20px; line-height: 16px; border-radius: 10px; background: #39c55a; border: 2px solid #fff; font-size: 12px; box-sizing: border-box; } } } li::before { content: ""; position: absolute; top: 0; left: 20px; width: 2px; height: 100%; background: #ddd; z-index: 1; } li:last-child::before { display: none; } } } } </style>