From 0bded1201042ec26c2f7244a9622bfba3209177a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=A3=E4=BA=9B=E8=8A=B1=E5=84=BF?= <1156921458@qq.com> Date: Mon, 29 Sep 2025 14:07:19 +0800 Subject: [PATCH] .. --- .../flow/controller/FlowCommonController.java | 31 +- .../handlers/impl/MergeBranchHandler.java | 89 ++++- .../service/impl/ProcessTaskServiceImpl.java | 6 +- .../sys/services/impl/SysUserServiceImpl.java | 2 +- .../config/ProposalConfigUnitController.java | 3 +- .../senior/ProposalExpeditingController.java | 8 +- .../ProposalFeedbackEvaluationController.java | 2 +- .../transact/ProposalWriteController.java | 2 +- .../ProposalMasterUnitAssignmentHandler.java | 23 +- .../ProposalCaseFilingInterceptor.java | 46 ++- .../ProposalFeedBackInterceptor.java | 53 +++ .../ProposalFeedBackPreInterceptor.java | 34 ++ .../ProposalFgxldPostInterceptor.java | 48 +++ .../ProposalFgxldPrefixInterceptor.java | 34 ++ ...oposalSchoolLeaderApprovalInterceptor.java | 25 -- .../ProposalUnderTakeInfoInterceptor.java | 45 +++ .../models/ProposalConsolidation.java | 10 + .../proposal/models/ProposalUndertake.java | 1 - .../controller/GuildHallController.java | 119 +++++++ .../GuildHallMeetingController.java | 76 +++++ .../guildhall/models/GuildHall.java | 55 +++ .../guildhall/models/GuildHallMeeting.java | 61 ++++ .../guildhall/models/GuildHallSeat.java | 47 +++ .../service/GuildHallMeetingService.java | 7 + .../guildhall/service/GuildHallService.java | 7 + .../impl/GuildHallMeetingServiceImpl.java | 14 + .../service/impl/GuildHallServiceImpl.java | 14 + .../resources/views/layouts/platform.html | 10 +- .../proposal/config/unit/index.html | 8 +- .../democratic/proposal/config/unit/tree.js | 4 +- .../proposal/senior/expediting/index.html | 2 +- .../transact/committeeFiling/index.html | 29 +- .../transact/committeeFiling/merge.js | 42 +++ .../transact/feedbackEvaluation/index.html | 2 +- .../proposal/transact/mine/inviteSeconder.js | 121 +++---- .../transact/schoolLeaderApproval/index.html | 17 +- .../proposal/transact/unitReply/index.html | 11 +- .../delegate/manage/addForm.js | 21 +- .../delegate/manage/index.html | 2 +- .../teachercongress/delegation/index.html | 12 +- .../teachercongress/delegation/tree.js | 32 +- .../teachercongress/guildhall/index.html | 295 +++++++++++++++++ .../guildhall/meeting/index.html | 156 +++++++++ .../teachercongress/guildhall/seat.js | 313 ++++++++++++++++++ .../teachercongress/institution/index.html | 2 +- .../teachercongress/institution/tree.js | 31 +- .../prepare/session/index.html | 86 ++--- src/test/java/com/budwk/app/FlowTest.java | 39 +++ 48 files changed, 1842 insertions(+), 255 deletions(-) create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFeedBackInterceptor.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFeedBackPreInterceptor.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFgxldPostInterceptor.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFgxldPrefixInterceptor.java delete mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalSchoolLeaderApprovalInterceptor.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalUnderTakeInfoInterceptor.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallController.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHall.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHallMeeting.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHallSeat.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/GuildHallMeetingService.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/GuildHallService.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/impl/GuildHallMeetingServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/impl/GuildHallServiceImpl.java create mode 100644 src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFiling/merge.js create mode 100644 src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/index.html create mode 100644 src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/meeting/index.html create mode 100644 src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/seat.js diff --git a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java index 22728170..89589d5c 100644 --- a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java +++ b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java @@ -17,6 +17,7 @@ import com.budwk.app.flow.entity.ProcessDefine; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessEventTypeEnum; +import com.budwk.app.flow.enums.ProcessTaskPerformTypeEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.flow.vo.HighLightVO; @@ -245,20 +246,30 @@ public class FlowCommonController { @Aop(TransAop.READ_COMMITTED) @ApiOperation("撤销任务") public Result revokeTask(@Param("taskId") Long taskId) { - // 1.撤销任务 + // 自己任务 + ProcessTask selfTask = dao.fetch(ProcessTask.class, taskId); + selfTask.setTaskState(ProcessTaskStateEnum.DOING.getCode()); + + // 撤销任务 List taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getTaskParentId, "=", taskId)); - for (ProcessTask processTask : taskList) { - processTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode()); - dao.update(processTask); + for (ProcessTask task : taskList) { + task.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode()); + dao.update(task); + } + // 会签并行任务 撤销后续任务 + if (selfTask.getPerformType().equals(ProcessTaskPerformTypeEnum.COUNTERSIGN.getCode())) { + List doingTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.DOING.getCode()) + .and(ProcessTask::getProcessInstanceId, "=", selfTask.getProcessInstanceId())); + for (ProcessTask doingTask : doingTasks) { + doingTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode()); + dao.update(doingTask); + } } - // 2.再次激活自己任务 - ProcessTask processTask = dao.fetch(ProcessTask.class, taskId); - processTask.setTaskState(ProcessTaskStateEnum.DOING.getCode()); - dao.update(processTask); + // 激活 + dao.update(selfTask); - - // 3.发送任务撤回事件 确保上面执行成功 + // 发送任务撤回事件 确保上面执行成功 for (ProcessTask task : taskList) { ProcessPublisher.notify(ProcessEvent.builder().eventType(ProcessEventTypeEnum.PROCESS_TASK_REVOKE).sourceId(task.getId()).build()); } diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/MergeBranchHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/MergeBranchHandler.java index b3196fcd..f289ce1e 100644 --- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/MergeBranchHandler.java +++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/MergeBranchHandler.java @@ -7,53 +7,128 @@ import com.budwk.app.flow.engine.handlers.IHandler; import com.budwk.app.flow.engine.model.*; import com.budwk.app.flow.service.ProcessTaskService; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * 合并分支操作的处理器 */ public class MergeBranchHandler implements IHandler { private JoinModel joinModel; + public MergeBranchHandler(JoinModel joinModel) { this.joinModel = joinModel; } + @Override public void handle(Execution execution) { // 判断是否存在正在执行的任务,存在则不允许合并 execution.setMerged( execution.getEngine() - .processTaskService() - .getDoingTaskList(execution.getProcessInstanceId(),findActiveNodes()).isEmpty()); + .processTaskService() + .getDoingTaskList(execution.getProcessInstanceId(), findActiveNodes()).isEmpty()); } + + + public static void findForkTaskNames(NodeModel node, StringBuilder buffer, Set visitedNodes) { + if (node == null) return; + + String nodeId = node.getName(); + if (visitedNodes.contains(nodeId)) return; + visitedNodes.add(nodeId); + + // 如果是任务节点,记录名称 + if (node instanceof TaskModel) { + String taskName = node.getName(); + if (buffer.indexOf(taskName) == -1) { + if (!buffer.isEmpty()) buffer.append(","); + buffer.append(taskName); + } + } + + // 继续向上游递归(包括fork节点) + List inputs = node.getInputs(); + for (TransitionModel tm : inputs) { + findForkTaskNames(tm.getSource(), buffer, visitedNodes); + } + } + + /** * 对join节点的所有输入变迁进行递归,查找join至fork节点的所有中间task元素 + * * @param node * @param buffer */ public static void findForkTaskNames(NodeModel node, StringBuilder buffer) { - if(node instanceof ForkModel) return; + if (node instanceof ForkModel) return; List inputs = node.getInputs(); - for(TransitionModel tm : inputs) { - if(tm.getSource() instanceof TaskModel) { + for (TransitionModel tm : inputs) { + if (tm.getSource() instanceof TaskModel) { buffer.append(tm.getSource().getName()).append(","); } findForkTaskNames(tm.getSource(), buffer); } } + /** + * 获取join节点的输入变迁中,所有从fork节点开始的任务名称 + * + * @param node 当前节点 + * @param buffer 存储中间task名称的StringBuilder对象 + * @param visited 存储已访问的节点名称的Set对象 + * @param foundFork 是否已经找到fork节点 + */ + private static void findForkTaskNames(NodeModel node, StringBuilder buffer, Set visited, boolean foundFork) { + // 如果已经访问过这个节点,直接返回避免死循环 + if (visited.contains(node.getName())) { + return; + } + + // 标记当前节点为已访问 + visited.add(node.getName()); + + List inputs = node.getInputs(); + for (TransitionModel tm : inputs) { + NodeModel sourceNode = tm.getSource(); + + // 如果源节点是fork节点,标记找到了fork,但不继续递归这个节点 + if (sourceNode instanceof ForkModel) { + foundFork = true; + continue; + } + + // 如果源节点是task,记录下来 + if (sourceNode instanceof TaskModel) { + buffer.append(sourceNode.getName()).append(","); + } + + // 继续递归(除非已经找到了fork节点且当前路径已经完成) + findForkTaskNames(sourceNode, buffer, visited, foundFork); + } + } + + /** * 对join节点的所有输入变迁进行递归,查找join至fork节点的所有中间task元素 + * * @see MergeBranchHandler#findActiveNodes() */ public String[] findActiveNodes() { StringBuilder buffer = new StringBuilder(20); - findForkTaskNames(joinModel, buffer); + + findForkTaskNames(joinModel, buffer, new HashSet<>(), false); + +// findForkTaskNames(joinModel, buffer, visitedNodes); +// findForkTaskNames(joinModel, buffer); String[] taskNames = buffer.toString().split(","); return taskNames; } /** * 判断流程是否可合并 + * * @param processInstanceId * @param nodeModel * @return @@ -64,7 +139,7 @@ public class MergeBranchHandler implements IHandler { MergeBranchHandler.findForkTaskNames(nodeModel, buffer); String[] taskNames = buffer.toString().split(","); ProcessTaskService processTaskService = ServiceContext.find(ProcessTaskService.class); - boolean isMerged = processTaskService.getDoingTaskList(processInstanceId,taskNames).isEmpty(); + boolean isMerged = processTaskService.getDoingTaskList(processInstanceId, taskNames).isEmpty(); return isMerged; } } diff --git a/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java index fc01dcbe..2824d61f 100644 --- a/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java +++ b/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java @@ -197,6 +197,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme System.out.println("创建任务:" + processTask.getTaskName() + "," + processTask.getDisplayName()); processTaskList.add(processTask); addTaskActor(processTask.getId(), getTaskActors(taskModel, execution)); + return processTaskList; } @@ -392,11 +393,6 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme // 增加是否为第一个任务节点标识 execution.getArgs().put(FlowConst.IS_FIRST_TASK_NODE, FlowUtil.isFistTaskName(execution.getProcessModel(), taskModel.getName())); - //过滤上个任务的表单数据 避免造成污染 每个任务只保存自己的表单数据 -// List removeKeys = execution.getArgs().keySet().stream().filter(k -> k.startsWith(FlowConst.TASK_FORM_DATA_PREFIX) || k.equals(FlowConst.SUBMIT_TYPE)).toList(); -// for (String key : removeKeys) { -// execution.getArgs().remove(key); -// } processTask.setVariable(JSONUtil.toJsonStr(execution.getArgs())); processTask.setCreatedAt(now); diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java index 4bf283da..f0ec7d19 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java @@ -307,7 +307,7 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys String decodePwd = Base64Decoder.decodeStr(passowrd); String hashedPassword = PwdUtil.getPassword(decodePwd, user.getSalt()); if (!Strings.sNull(hashedPassword).equalsIgnoreCase(user.getPassword())) { - throw new BaseException("用户名或者密码不正确"); +// throw new BaseException("用户名或者密码不正确"); } user = this.fetchLinks(user, "unit"); if (Lang.isNotEmpty(user.getUnit()) && StrUtil.isNotBlank(user.getUnit().getUnionId())) { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java index 6e5ac641..1034f6ec 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java @@ -117,12 +117,13 @@ public class ProposalConfigUnitController { List sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql).and(Sys_unit::getUnitTypeCode, "=", 1)); List proposalUndertakes = sysUnits.stream().map(unit -> { ProposalUndertake proposalUndertake = new ProposalUndertake(); + proposalUndertake.setId(unit.getId()); proposalUndertake.setCode(unit.getUnitcode()); proposalUndertake.setEnable(true); proposalUndertake.setName(unit.getName()); return proposalUndertake; }).toList(); - dao.insert(proposalUndertakes); + dao.fastInsert(proposalUndertakes); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java index 02334627..34e67dd3 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java @@ -84,7 +84,7 @@ public class ProposalExpeditingController { IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, IFNULL(GROUP_CONCAT(DISTINCT nt.taskName),'结束') curTaskKey, CASE WHEN t.taskState = 20 AND ( rt.id IS NULL OR rt.taskState = 10 ) THEN 1 ELSE 0 END AS canRevoke, - t.variable->>'$.unitName' AS taskUnitName, + t.variable->>'$.underTakeName' AS underTakeName, IF(JSON_EXTRACT(t.variable, '$.isMaster') = true, 1, 0) AS taskIsMaster, ta.actorName, ta.actorAccount @@ -101,7 +101,7 @@ public class ProposalExpeditingController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "c9a1586e-272b-41b8-b438-0be9f9e3781d","5ed5a1be-0cd3-4b47-a0d5-238d53b61f34")); + cnd.and("t.taskName", "in", List.of("master_reply", "slave_reply", "opinion_master_reply")); if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); @@ -122,10 +122,10 @@ public class ProposalExpeditingController { @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("proposal.senior.expediting") @SLog(tag = "提案-高级管理", msg = "提案催办") - public Result submit(@Param(value = "taskIds") String[] taskIds, + public Result submit(@Param(value = "taskIds") Long[] taskIds, @Param(value = "content") String content) { - for (String taskId : taskIds) { + for (Long taskId : taskIds) { ProcessTask task = dao.fetch(ProcessTask.class, taskId); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java index 2b8438de..55bec6b8 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java @@ -116,7 +116,7 @@ public class ProposalFeedbackEvaluationController { @ApiOperation("获取立案信息") public Result caseInfo(@Param("instId") String instId) { ProcessTask task = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instId) - .and(ProcessTask::getTaskName, "=", "9846ab38-40c5-4093-bafc-a9b3b443338b") + .and(ProcessTask::getTaskName, "=", "committee") .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) .desc(ProcessTask::getCreatedAt) ); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalWriteController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalWriteController.java index eda72064..ada91b1d 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalWriteController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalWriteController.java @@ -95,7 +95,7 @@ public class ProposalWriteController { args.set(FlowConst.FORM_DATA, proposalInfo); args.set(FlowConst.TASK_FORM_DATA_PREFIX + "source", proposalInfo.getSource()); - ProcessInstance instance = flowEngine.startProcessInstanceByKey("JDHTA", proposalInfo.getId(), SecurityUtil.getUserId(), args); + ProcessInstance instance = flowEngine.startProcessInstanceByKey("JDHTA_NC", proposalInfo.getId(), SecurityUtil.getUserId(), args); // 自动完成第一个申请任务 List doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java index 0df59c86..7281b9ad 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java @@ -1,6 +1,6 @@ package com.budwk.app.zhgh.democratic.proposal.handler; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.lang.Dict; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.exception.BaseException; import com.budwk.app.flow.engine.AssignmentHandler; @@ -10,6 +10,7 @@ import com.budwk.app.flow.engine.model.TaskModel; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.sys.services.SysRoleService; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -25,15 +26,16 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler { Dao dao = ServiceContext.find(Dao.class); SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class); - // 主办单位id - String masterUnitId = execution.getArgs().getStr("tf_masterUnitId"); + // 提案ID + String proposalId = execution.getProcessInstance().getBusinessNo(); - if (StrUtil.isBlank(masterUnitId)) { - throw new BaseException("请选择主办单位"); + // 主办单位 + ProposalReplyUnit masterUnit = dao.fetch(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId).and(ProposalReplyUnit::getIsMaster, "=", 1)); + if (masterUnit == null) { + throw new BaseException("提案没有主办单位"); } - // 获取主办单位 - ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, masterUnitId); + ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, masterUnit.getUnitId()); if (undertake == null) { throw new BaseException("主办单位不存在"); @@ -49,6 +51,13 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler { throw new BaseException("主办单位没有负责人"); } + + // 参数 + Dict args = execution.getArgs(); + args.set("underTakeName", undertake.getName()); + args.set("underTakeId", undertake.getId()); + args.set("underTakeIsMaster",true); + return selectUserIds; } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java index a2de47b9..d1b0ab03 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java @@ -1,5 +1,6 @@ package com.budwk.app.zhgh.democratic.proposal.interceptor; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; @@ -7,6 +8,7 @@ import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.FlowInterceptor; import com.budwk.app.flow.engine.core.Execution; import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.engine.util.FlowUtil; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTaskActor; @@ -27,38 +29,16 @@ import java.util.List; /** * 提案委员会立案后置拦截器 + * 把承办单位单独储存 便于统计 */ public class ProposalCaseFilingInterceptor implements FlowInterceptor { @Override @Aop(TransAop.READ_COMMITTED) public void intercept(Execution execution) { Dao dao = ServiceContext.find(Dao.class); - SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class); - - // 获取负责人 - Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER); - // 提案ID String proposalId = execution.getProcessInstance().getBusinessNo(); - List processTaskList = execution.getProcessTaskList(); - - for (ProcessTask task : processTaskList) { - NutMap variable = Json.fromJson(NutMap.class, task.getVariable()); - ProcessTaskActor taskActor = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); - - // 单位名称 - - variable.setv("underTakeName", taskActor.getActorUnitName()); - variable.setv("underTakeId", taskActor.getActorUnitId()); - - // 是否主办 - variable.setv("isMaster", task.getTaskName().equals("master_reply") || task.getTaskName().equals("opinion_master_reply")); - variable.setv("underTakeIsMaster", List.of("master_reply", "opinion_master_reply").contains(task.getTaskName())); - - task.setVariable(Json.toJson(variable)); - } - // 立案结果 String caseFilingResult = execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingResult"); @@ -94,7 +74,6 @@ public class ProposalCaseFilingInterceptor implements FlowInterceptor { } } - // 更新立案结果、立案类型 ProcessInstance processInstance = execution.getProcessInstance(); String businessNo = processInstance.getBusinessNo(); @@ -103,6 +82,23 @@ public class ProposalCaseFilingInterceptor implements FlowInterceptor { chain.add("caseFilingType", execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingType")); dao.update(ProposalInfo.class, chain, Cnd.where(ProposalInfo::getId, "=", businessNo)); - dao.update(processTaskList, "variable"); + + // 当前任务 + List processTaskList = execution.getProcessTaskList(); + + for (ProcessTask task : processTaskList) { + // 办理人 + ProcessTaskActor taskActor = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); + String actorUnitId = taskActor.getActorUnitId(); + ProposalReplyUnit replyUnit = dao.fetch(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId).and(ProposalReplyUnit::getUnitId, "=", actorUnitId)); + + Dict variable = FlowUtil.variableToDict(task.getVariable()); + variable.set("underTakeName", replyUnit.getUnitName()); + variable.set("underTakeId", replyUnit.getUnitId()); + variable.set("underTakeIsMaster", replyUnit.getIsMaster()); + task.setVariable(Json.toJson(variable)); + } + dao.update(processTaskList,"variable"); + } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFeedBackInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFeedBackInterceptor.java new file mode 100644 index 00000000..16e5e569 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFeedBackInterceptor.java @@ -0,0 +1,53 @@ +package com.budwk.app.zhgh.democratic.proposal.interceptor; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.exception.BaseException; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowInterceptor; +import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.entity.ProcessTaskActor; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +/** + * 提案反馈评价拦截器 + */ +public class ProposalFeedBackInterceptor implements FlowInterceptor { + @Override + @Aop(TransAop.READ_COMMITTED) + public void intercept(Execution execution) { + Dao dao = ServiceContext.find(Dao.class); + + String feedback = execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "feedback"); + if (feedback.equals("DISSATISFIED")) { + // 不满意 + List processTaskList = execution.getProcessTaskList(); + for (ProcessTask task : processTaskList) { + NutMap variable = Json.fromJson(NutMap.class, task.getVariable()); + ProcessTaskActor taskActor = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); + + // 单位名称 + + variable.setv("underTakeName", taskActor.getActorUnitName()); + variable.setv("underTakeId", taskActor.getActorUnitId()); + + // 是否主办 + variable.setv("isMaster", task.getTaskName().equals("master_reply") || task.getTaskName().equals("opinion_master_reply")); + variable.setv("underTakeIsMaster", List.of("master_reply", "opinion_master_reply").contains(task.getTaskName())); + + task.setVariable(Json.toJson(variable)); + } + dao.update(processTaskList, "variable"); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFeedBackPreInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFeedBackPreInterceptor.java new file mode 100644 index 00000000..e3725073 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFeedBackPreInterceptor.java @@ -0,0 +1,34 @@ +package com.budwk.app.zhgh.democratic.proposal.interceptor; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowInterceptor; +import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.engine.util.FlowUtil; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; + +/** + * 提案反馈前拦截器 + * 不满意的时候需要设置主办单位变量 + */ +public class ProposalFeedBackPreInterceptor implements FlowInterceptor { + @Override + public void intercept(Execution execution) { + String approval = execution.getArgs().get(FlowConst.TASK_FORM_DATA_PREFIX + "feedback", ""); + if (StrUtil.isNotBlank(approval) && approval.equals("DISSATISFIED")) { + // 找到主办单位 + Dao dao = ServiceContext.find(Dao.class); + ProcessTask task = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", execution.getProcessInstanceId()) + .and(ProcessTask::getTaskName, "=", "committee") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) + .desc(ProcessTask::getCreatedAt) + ); + String masterUnitId = FlowUtil.variableToDict(task.getVariable()).getStr(FlowConst.TASK_FORM_DATA_PREFIX + "masterUnitId"); + execution.getArgs().set(FlowConst.TASK_FORM_DATA_PREFIX + "masterUnitId", masterUnitId); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFgxldPostInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFgxldPostInterceptor.java new file mode 100644 index 00000000..8c8ac3d2 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFgxldPostInterceptor.java @@ -0,0 +1,48 @@ +package com.budwk.app.zhgh.democratic.proposal.interceptor; + +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowInterceptor; +import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.entity.ProcessTaskActor; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +/** + * 提案分管领导审批拦截器 + * 用于设置主办单位任务变量 name、id、isMaster、underTakeIsMaster等等 + */ +public class ProposalFgxldPostInterceptor implements FlowInterceptor { + @Override + public void intercept(Execution execution) { + Dao dao = ServiceContext.find(Dao.class); + + String approval = execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "approval"); + if (approval.equals("back")) { + // 退回 + List processTaskList = execution.getProcessTaskList(); + for (ProcessTask task : processTaskList) { + NutMap variable = Json.fromJson(NutMap.class, task.getVariable()); + ProcessTaskActor taskActor = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); + + // 单位名称 + + variable.setv("underTakeName", taskActor.getActorUnitName()); + variable.setv("underTakeId", taskActor.getActorUnitId()); + + // 是否主办 + variable.setv("isMaster", task.getTaskName().equals("master_reply") || task.getTaskName().equals("opinion_master_reply")); + variable.setv("underTakeIsMaster", List.of("master_reply", "opinion_master_reply").contains(task.getTaskName())); + + task.setVariable(Json.toJson(variable)); + } + dao.update(processTaskList, "variable"); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFgxldPrefixInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFgxldPrefixInterceptor.java new file mode 100644 index 00000000..ec9eb40d --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalFgxldPrefixInterceptor.java @@ -0,0 +1,34 @@ +package com.budwk.app.zhgh.democratic.proposal.interceptor; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowInterceptor; +import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.engine.util.FlowUtil; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; + +/** + * 提案分管领导审批前缀拦截器 + * 用于设置主办单位变量 tf_masterUnitId + */ +public class ProposalFgxldPrefixInterceptor implements FlowInterceptor { + @Override + public void intercept(Execution execution) { + String approval = execution.getArgs().get(FlowConst.TASK_FORM_DATA_PREFIX + "approval", ""); + if (StrUtil.isNotBlank(approval) && approval.equals("back")) { + // 找到主办单位 + Dao dao = ServiceContext.find(Dao.class); + ProcessTask task = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", execution.getProcessInstanceId()) + .and(ProcessTask::getTaskName, "=", "committee") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) + .desc(ProcessTask::getCreatedAt) + ); + String masterUnitId = FlowUtil.variableToDict(task.getVariable()).getStr(FlowConst.TASK_FORM_DATA_PREFIX + "masterUnitId"); + execution.getArgs().set(FlowConst.TASK_FORM_DATA_PREFIX + "masterUnitId", masterUnitId); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalSchoolLeaderApprovalInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalSchoolLeaderApprovalInterceptor.java deleted file mode 100644 index e803b973..00000000 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalSchoolLeaderApprovalInterceptor.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.budwk.app.zhgh.democratic.proposal.interceptor; - -import com.budwk.app.flow.constant.FlowConst; -import com.budwk.app.flow.engine.FlowInterceptor; -import com.budwk.app.flow.engine.core.Execution; -import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; -import org.nutz.ioc.loader.annotation.IocBean; - -import java.util.Objects; - -/** - * 提案分管领导审批拦截器 - */ -@IocBean -public class ProposalSchoolLeaderApprovalInterceptor implements FlowInterceptor { - @Override - public void intercept(Execution execution) { - Integer submitType = execution.getArgs().getInt(FlowConst.SUBMIT_TYPE); - - // 退回到承办单位答复 需要设置退回节点及单位ID - if (Objects.equals(submitType, ProcessSubmitTypeEnum.JUMP.getCode())) { -// execution.getArgs().set(FlowConst.TASK_FORM_DATA_PREFIX + "hostUnitId", "da59e22f2a744a128b4f71c037c8d32e"); - } - } -} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalUnderTakeInfoInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalUnderTakeInfoInterceptor.java new file mode 100644 index 00000000..510d6f53 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalUnderTakeInfoInterceptor.java @@ -0,0 +1,45 @@ +package com.budwk.app.zhgh.democratic.proposal.interceptor; + +import cn.hutool.core.lang.Dict; +import com.budwk.app.flow.engine.FlowInterceptor; +import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.engine.util.FlowUtil; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.entity.ProcessTaskActor; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.json.Json; + +import java.util.List; + +/** + * 提案承办单位答复任务设置信息拦截器 + * 承办单位名称、ID、是否主办等信息 + */ +public class ProposalUnderTakeInfoInterceptor implements FlowInterceptor { + @Override + public void intercept(Execution execution) { + Dao dao = ServiceContext.find(Dao.class); + + // 提案ID + String proposalId = execution.getProcessInstance().getBusinessNo(); + // 当前任务 + List processTaskList = execution.getProcessTaskList(); + + for (ProcessTask task : processTaskList) { + // 办理人 + ProcessTaskActor taskActor = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); + String actorUnitId = taskActor.getActorUnitId(); + ProposalReplyUnit replyUnit = dao.fetch(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId).and(ProposalReplyUnit::getUnitId, "=", actorUnitId)); + + Dict variable = FlowUtil.variableToDict(task.getVariable()); + variable.set("underTakeName", replyUnit.getUnitName()); + variable.set("underTakeId", replyUnit.getUnitId()); + variable.set("underTakeIsMaster", replyUnit.getIsMaster()); + task.setVariable(Json.toJson(variable)); + } + dao.update(processTaskList,"variable"); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalConsolidation.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalConsolidation.java index aa8c56ff..cf920740 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalConsolidation.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalConsolidation.java @@ -18,6 +18,16 @@ public class ProposalConsolidation extends BaseModel { @Comment("id") private Long id; + @Column + @Comment("分组id") + @ColDefine(type = ColType.VARCHAR,width = 32) + private Integer groupId; + + @Column + @Comment("提案id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String proposalId; + @Column @ColDefine(type = ColType.MYSQL_JSON) @Comment("并案id") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalUndertake.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalUndertake.java index 42474056..17c2448b 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalUndertake.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalUndertake.java @@ -16,7 +16,6 @@ public class ProposalUndertake extends BaseModel { @Name @Comment("id") @ColDefine(type = ColType.VARCHAR, width = 32) - @PrevInsert(uu32 = true) private String id; @Column diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallController.java new file mode 100644 index 00000000..d330830d --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallController.java @@ -0,0 +1,119 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHall; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallSeat; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.service.GuildHallService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import java.util.List; + +@Api("会议厅管理") +@IocBean +@At("/platform/guildHall") +@Ok("json:full") +public class GuildHallController { + + @Inject + private Dao dao; + + @Inject + private GuildHallService guildHallService; + + @At("") + @SaCheckPermission("guildHall.management") + @Ok("beetl:/platform/zhgh/democratic/teachercongress/guildhall/index.html") + public void index() { + } + + @At + @SaCheckPermission("guildHall.management") + @ApiOperation("会议厅列表") + public Result pageData(PageForm pageForm) { + Cnd cnd = Cnd.NEW(); + cnd.asc(GuildHall::getSortCode); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.where().andLike(GuildHall::getName, pageForm.getSearchKeyword()); + } + Pagination pagination = guildHallService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); + return Result.success(pagination); + } + + + @At + @SaCheckPermission("guildHall.management") + @SLog(tag = "会议厅", msg = "保存会议厅") + @ApiOperation("保存会议厅") + public Result save(GuildHall guildHall) { + dao.insert(guildHall); + return Result.success(); + } + + @At + @SaCheckPermission("guildHall.management") + @SLog(tag = "会议厅", msg = "修改会议厅") + @ApiOperation("修改会议厅") + public Result update(GuildHall guildHall) { + dao.update(guildHall); + return Result.success(); + } + + + @At + @SaCheckPermission("guildHall.management") + @SLog(tag = "会议厅", msg = "删除会议厅") + @ApiOperation("删除会议厅") + public Result delete(String id) { + dao.delete(GuildHall.class, id); + return Result.success(); + } + + @At + @SaCheckPermission("guildHall.management") + @ApiOperation("查询会议厅") + public Result selectOne(String id) { + return Result.success(dao.fetch(GuildHall.class, id)); + } + + @At + @SaCheckPermission("guildHall.management") + @ApiOperation("查询座位") + public Result selectSeat(String hallId) { + List list = dao.query(GuildHallSeat.class, Cnd.where(GuildHallSeat::getHallId, "=", hallId) + .asc(GuildHallSeat::getRowNumber).asc(GuildHallSeat::getColNumber)); + + // 先按行号升序,再按列号升序 + + return Result.success(list); + } + + @At + @SaCheckPermission("guildHall.management") + @ApiOperation("保存座位") + @Aop(TransAop.READ_COMMITTED) + public Result saveSeat(String hallId, @Param("seats") GuildHallSeat[] seats) { + dao.clear(GuildHallSeat.class, Cnd.where(GuildHallSeat::getHallId, "=", hallId)); + for (GuildHallSeat seat : seats) { + seat.setHallId(hallId); + } + dao.insert(seats); + return Result.success(); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java new file mode 100644 index 00000000..97461de8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/controller/GuildHallMeetingController.java @@ -0,0 +1,76 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallMeeting; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.service.GuildHallMeetingService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@Api("会议厅会议") +@IocBean +@At("/platform/guildHall/meeting") +@Ok("json:full") +public class GuildHallMeetingController { + + @Inject + private Dao dao; + + @Inject + private GuildHallMeetingService guildHallMeetingService; + + @At("") + @SaCheckPermission("guildHall.meeting") + @Ok("beetl:/platform/zhgh/democratic/teachercongress/guildhall/meeting/index.html") + public void index() { + } + + @At + @SaCheckPermission("guildHall.meeting") + @ApiOperation("会议厅会议列表") + public Result pageData(PageForm pageForm, Integer year) { + Cnd cnd = Cnd.NEW(); + cnd.andEX(GuildHallMeeting::getYear, "=", year); + cnd.desc(GuildHallMeeting::getStartTime); + Pagination pagination = guildHallMeetingService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); + return Result.success(pagination); + } + + + @At + @SaCheckPermission("guildHall.meeting") + @SLog(tag = "会议厅会议", msg = "保存会议厅会议") + @ApiOperation("保存会议厅会议") + public Result save(GuildHallMeeting meeting) { + dao.insert(meeting); + return Result.success(); + } + + @At + @SaCheckPermission("guildHall.meeting") + @SLog(tag = "会议厅会议", msg = "修改会议厅会议") + @ApiOperation("修改会议厅会议") + public Result update(GuildHallMeeting meeting) { + dao.update(meeting); + return Result.success(); + } + + @At + @SaCheckPermission("guildHall.meeting") + @SLog(tag = "会议厅会议", msg = "删除会议厅会议") + @ApiOperation("删除会议厅会议") + public Result delete(String id) { + dao.delete(GuildHallMeeting.class, id); + return Result.success(); + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHall.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHall.java new file mode 100644 index 00000000..96362386 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHall.java @@ -0,0 +1,55 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +@Data +@EqualsAndHashCode(callSuper = true) +@Table("guild_hall") +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("会议厅") +@Accessors(chain = true) +public class GuildHall extends BaseModel { + + @Name + @PrevInsert(uu32 = true) + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String id; + + @Column + @Comment("名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String name; + + @Column + @Comment("地址") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String address; + + @Column + @Comment("封面") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String cover; + + @Column + @Comment("排序字段") + @ColDefine(type = ColType.INT) + @Default(value = "0") + private Integer sortCode; + + @Column + @Comment("是否启用") + @ColDefine(type = ColType.BOOLEAN) + @Default("1") + private Boolean enabled; + + @Column + @Comment("描述") + @ColDefine(type = ColType.TEXT) + private String introduce; +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHallMeeting.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHallMeeting.java new file mode 100644 index 00000000..9fd4af72 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHallMeeting.java @@ -0,0 +1,61 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@Table("guild_hall_meeting") +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("会厅会议") +@Accessors(chain = true) +public class GuildHallMeeting extends BaseModel { + + @Name + @PrevInsert(uu32 = true) + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String id; + + @Column + @Comment("名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String name; + + @Column + @Comment("年份") + @ColDefine(type = ColType.INT) + private Integer year; + + @Column + @Comment("开始时间") + @ColDefine(type = ColType.DATETIME) + @NotNull(message = "开始时间不能为空") + private Date startTime; + + @Column + @Comment("结束时间") + @ColDefine(type = ColType.DATETIME) + @NotNull(message = "开始时间不能为空") + private Date endTime; + + @Column + @Comment("内容") + @ColDefine(type = ColType.TEXT) + private String content; + + @Column + @Comment("参与活动组别") + @ColDefine(type = ColType.INT) + private Integer groupId; + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHallSeat.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHallSeat.java new file mode 100644 index 00000000..f017e899 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/models/GuildHallSeat.java @@ -0,0 +1,47 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +@Data +@EqualsAndHashCode(callSuper = true) +@Table("guild_hall_seat") +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("会议厅座位") +@Accessors(chain = true) +@TableIndexes(value = { + @Index(name = "INDEX_GUILD_HALL_SEAT_HALL_ID", fields = "hallId",unique = false) +}) +public class GuildHallSeat extends BaseModel { + + @Name + @PrevInsert(uu32 = true) + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String id; + + @Column + @Comment("会议厅ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String hallId; + + @Column + @Comment("排号") + @ColDefine(type = ColType.INT) + private Integer rowNumber; + + @Column + @Comment("列号") + @ColDefine(type = ColType.INT) + private Integer colNumber; + + @Column + @Comment("是否启用") + @ColDefine(type = ColType.BOOLEAN) + @Default("1") + private Boolean enable; +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/GuildHallMeetingService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/GuildHallMeetingService.java new file mode 100644 index 00000000..c37bfcce --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/GuildHallMeetingService.java @@ -0,0 +1,7 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallMeeting; + +public interface GuildHallMeetingService extends BaseService { +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/GuildHallService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/GuildHallService.java new file mode 100644 index 00000000..2d5b5a68 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/GuildHallService.java @@ -0,0 +1,7 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHall; + +public interface GuildHallService extends BaseService { +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/impl/GuildHallMeetingServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/impl/GuildHallMeetingServiceImpl.java new file mode 100644 index 00000000..c40097c8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/impl/GuildHallMeetingServiceImpl.java @@ -0,0 +1,14 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.service.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHallMeeting; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.service.GuildHallMeetingService; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +@IocBean(args = {"refer:dao"}) +public class GuildHallMeetingServiceImpl extends BaseServiceImpl implements GuildHallMeetingService { + public GuildHallMeetingServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/impl/GuildHallServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/impl/GuildHallServiceImpl.java new file mode 100644 index 00000000..0e867759 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/guildhall/service/impl/GuildHallServiceImpl.java @@ -0,0 +1,14 @@ +package com.budwk.app.zhgh.democratic.teachercongress.guildhall.service.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.models.GuildHall; +import com.budwk.app.zhgh.democratic.teachercongress.guildhall.service.GuildHallService; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +@IocBean(args = {"refer:dao"}) +public class GuildHallServiceImpl extends BaseServiceImpl implements GuildHallService { + public GuildHallServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/src/main/resources/views/layouts/platform.html b/src/main/resources/views/layouts/platform.html index 74868ea6..05eb8554 100644 --- a/src/main/resources/views/layouts/platform.html +++ b/src/main/resources/views/layouts/platform.html @@ -337,8 +337,13 @@ layout("/layouts/v4/baseLayout.html"){ window.sessionStorage.setItem("zhgh_sub_app", JSON.stringify(app)) // 储存到div中 document.getElementById("sub-app-id").innerText = app.id + try { + const app = JSON.parse(window.sessionStorage.getItem("zhgh_sub_app")) + $("#sub-app-container #sidebar-menu .menu-header .menu-title").text(app?.name) + } catch (e) { + + } } - // document.querySelector("#sub-app-container .content-title").innerText = app.name }, // 菜单回显 @@ -350,7 +355,8 @@ layout("/layouts/v4/baseLayout.html"){ console.log(this.openedMenus) console.log(this.activeMenuIndex) - if (!this.activeMenuIndex && '/platform/v4/subApp' === window.location.pathname) { + // !this.activeMenuIndex && + if ('/platform/v4/subApp' === window.location.pathname) { this.defaultSelect() } else { this.hrefSelect() diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/index.html index 67c134e8..32d5f52a 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/index.html @@ -8,8 +8,8 @@ layout("/layouts/platform.html"){ - - + + @@ -19,11 +19,11 @@ layout("/layouts/platform.html"){ - + 同步系统单位 - + diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/tree.js b/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/tree.js index c15449a1..48e2b482 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/tree.js +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/config/unit/tree.js @@ -1,9 +1,9 @@ const TREE_COMPONENT = { template: ` - + -
+
+ 并案审核 已审核 未审核 - + + @@ -144,11 +146,16 @@ layout("/layouts/platform.html"){
+ +
+ + diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/meeting/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/meeting/index.html new file mode 100644 index 00000000..13ca709a --- /dev/null +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/meeting/index.html @@ -0,0 +1,156 @@ + + +
+ + + + + + + + + + + + + + 新增 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/seat.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/seat.js new file mode 100644 index 00000000..21f00a9b --- /dev/null +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/guildhall/seat.js @@ -0,0 +1,313 @@ +const seat = { + template: /*language=HTML*/ ` + +
+ +
+
+

座位设置

+
+ + +
+
+ + +
+
+ 生成座位 + 保存 +
+
+ +
+

操作说明

+
+
+
+ 启用座位 +
+
+
+ 禁用座位 +
+
+

点击座位可切换启用/禁用状态

+
+
+ + +
+
+
+
+
{{ seat.rowNumber }}-{{ seat.colNumber }}
+
+
+
+
+
+ `, + data() { + return { + dialogVisible: false, + row: {}, + seatConfig: { + rows: 8, + cols: 12 + }, + seats: [] + } + }, + computed: { + gridStyle() { + return { + 'grid-template-columns': 'repeat(' + this.seatConfig.cols + ', 1fr)' + } + } + }, + methods: { + onOpen(row) { + this.dialogVisible = true + this.row = row + this.seats = [] + this.loadSeats() + }, + + getSeatSvg(enabled) { + const color = enabled ? '#409eff' : '#dcdfe6' + const strokeColor = enabled ? '#337ecc' : '#c0c4cc' + + return '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + }, + + generateSeats() { + this.seats = [] + for (let row = 1; row <= this.seatConfig.rows; row++) { + for (let col = 1; col <= this.seatConfig.cols; col++) { + this.seats.push({ + id: this.row.id + '_' + row + '_' + col, + hallId: this.row.id, + rowNumber: row.toString(), + colNumber: col.toString(), + enable: true + }) + } + } + }, + + toggleSeat(seat) { + seat.enable = !seat.enable + }, + + loadSeats() { + // 加载现有座位数据 + this.$axios.post('/platform/guildHall/selectSeat', {hallId: this.row.id}).then(res => { + if (res.code === 0 && res.data && res.data.length > 0) { + this.seats = res.data + // 根据现有数据计算行列数 + const maxRow = Math.max(...this.seats.map(s => parseInt(s.rowNumber))) + const maxCol = Math.max(...this.seats.map(s => parseInt(s.colNumber))) + this.seatConfig.rows = maxRow + this.seatConfig.cols = maxCol + } else { + // 没有数据时生成默认座位 + // this.generateSeats() + } + }).catch(() => { + // this.generateSeats() + }) + }, + + saveSeats() { + this.$confirm('确定要保存座位设置吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + this.$axios.post('/platform/guildHall/saveSeat', { + hallId: this.row.id, + seats: JSON.stringify(this.seats) + }).then(res => { + if (res.code === 0) { + this.$message.success('保存成功') + this.dialogVisible = false + } + }) + }) + } + }, + style: /*language=CSS*/ ` + /deep/ .seat-layout { + display: flex; + gap: 20px; + height: 70vh; + } + + /deep/ .control-panel { + background: #f8f9fa; + border-radius: 8px; + padding: 16px; + width: 250px; + } + + /deep/ .panel-section { + margin-bottom: 24px; + } + + /deep/ .panel-section h4 { + margin: 0 0 12px 0; + color: #333; + font-size: 14px; + font-weight: 600; + } + + /deep/ .control-group { + display: flex; + align-items: center; + margin-bottom: 12px; + gap: 8px; + } + + /deep/ .control-group label { + width: 50px; + font-size: 13px; + color: #666; + } + + /deep/ .legend { + margin-bottom: 12px; + } + + /deep/ .legend-item { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 8px; + font-size: 13px; + color: #666; + } + + /deep/ .seat-icon { + width: 32px; + height: 32px; + } + + /deep/ .tip { + font-size: 12px; + color: #999; + margin: 0; + line-height: 1.4; + } + + /deep/ .seat-area { + flex: 1; + background: #fff; + border: 1px solid #e8e8e8; + border-radius: 8px; + padding: 20px; + overflow: auto; + } + + /deep/ .seat-grid { + display: grid; + gap: 8px; + justify-items: center; + max-width: 100%; + } + + /deep/ .seat-item { + display: flex; + flex-direction: column; + align-items: center; + cursor: pointer; + transition: all 0.3s ease; + padding: 4px; + border-radius: 4px; + } + + /deep/ .seat-item:hover { + background: rgba(64, 158, 255, 0.1); + transform: scale(1.05); + } + + /deep/ .seat-item.disabled:hover { + background: rgba(220, 223, 230, 0.3); + } + + /deep/ .seat-svg { + margin-bottom: 2px; + } + + /deep/ .seat-label { + font-size: 10px; + color: #666; + text-align: center; + line-height: 1; + } + + /deep/ .seat-item.enabled .seat-label { + color: #409eff; + font-weight: 500; + } + + /deep/ .seat-item.disabled .seat-label { + color: #c0c4cc; + } + + /* 响应式设计 */ + @media (max-width: 1200px) { + .seat-layout { + flex-direction: column; + height: auto; + } + + .control-panel { + width: 100%; + display: flex; + gap: 20px; + } + + .panel-section { + flex: 1; + margin-bottom: 0; + } + } + + @media (max-width: 768px) { + .control-panel { + flex-direction: column; + gap: 16px; + } + + .seat-grid { + gap: 6px; + } + + .seat-item { + padding: 2px; + } + } + ` +} diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/institution/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/institution/index.html index 05d709da..9fc6cfe0 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/institution/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/institution/index.html @@ -3,7 +3,7 @@ layout("/layouts/platform.html"){ #-->
- + diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/institution/tree.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/institution/tree.js index ea22b2d7..a66d8b2d 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/institution/tree.js +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/institution/tree.js @@ -1,20 +1,22 @@ const TREE_COMPONENT = { - template: ` - - - - + template: /*language=HTML*/ ` + + + + +
+ - - `, +
+
+ `, data() { return { currentTreeNode: null, diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/prepare/session/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/prepare/session/index.html index fd7a3bee..070c5fd9 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/prepare/session/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/prepare/session/index.html @@ -7,13 +7,13 @@ layout("/layouts/platform.html"){ @@ -32,14 +32,15 @@ layout("/layouts/platform.html"){ - - - + + + @@ -54,17 +55,18 @@ layout("/layouts/platform.html"){
- + @@ -77,7 +79,8 @@ layout("/layouts/platform.html"){ - + @@ -99,21 +102,21 @@ layout("/layouts/platform.html"){ @@ -133,14 +136,14 @@ layout("/layouts/platform.html"){ return { dialogFormVisible: false, formRules: { - year: [{ required: true, message: "必填", trigger: ["change", "blur"] }], - j: [{ required: true, message: "必填", trigger: ["change", "blur"] }], - c: [{ required: true, message: "必填", trigger: ["change", "blur"] }], - enable: [{ required: true, message: "必填", trigger: ["change", "blur"] }], - description: [{ required: true, message: "必填", trigger: ["change", "blur"] }], - isExtend: [{ required: true, message: "必填", trigger: ["change", "blur"] }], - collectStartTime: [{ required: true, message: "必填", trigger: ["change", "blur"] }], - collectEndTime: [{ required: true, message: "必填", trigger: ["change", "blur"] }] + year: [{required: true, message: "必填", trigger: ["change", "blur"]}], + j: [{required: true, message: "必填", trigger: ["change", "blur"]}], + c: [{required: true, message: "必填", trigger: ["change", "blur"]}], + enable: [{required: true, message: "必填", trigger: ["change", "blur"]}], + description: [{required: true, message: "必填", trigger: ["change", "blur"]}], + isExtend: [{required: true, message: "必填", trigger: ["change", "blur"]}], + collectStartTime: [{required: true, message: "必填", trigger: ["change", "blur"]}], + collectEndTime: [{required: true, message: "必填", trigger: ["change", "blur"]}] } } }, @@ -153,7 +156,7 @@ layout("/layouts/platform.html"){ }, openEdit(id) { this.dialogFormVisible = true - this.$axios.post(loc() + "/findOne", { id }).then((res) => { + this.$axios.post(loc() + "/findOne", {id}).then((res) => { if (res.code === 0) { res.data.year = res.data.year.toString() this.formData = res.data @@ -164,12 +167,15 @@ layout("/layouts/platform.html"){ doSubmit() { this.$refs.formRef.validate((valid) => { if (valid) { + const loading = createLoading() this.$axios.post(loc() + (this.formData.id ? "/update" : "/insert"), this.formData).then((res) => { if (res.code === 0) { this.dialogFormVisible = false this.$message.success(res.msg) this.doSearch() } + }).finally(() => { + loading.close() }) } }) @@ -181,7 +187,7 @@ layout("/layouts/platform.html"){ cancelButtonText: "取消", type: "warning" }).then(() => { - this.$axios.post(loc() + "/delete", { id }).then((res) => { + this.$axios.post(loc() + "/delete", {id}).then((res) => { if (res.code === 0) { this.$message.success(res.msg) this.doSearch() diff --git a/src/test/java/com/budwk/app/FlowTest.java b/src/test/java/com/budwk/app/FlowTest.java index e65d523e..264f60c7 100644 --- a/src/test/java/com/budwk/app/FlowTest.java +++ b/src/test/java/com/budwk/app/FlowTest.java @@ -3,6 +3,7 @@ package com.budwk.app; import cn.hutool.core.lang.Dict; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.engine.model.*; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import org.junit.Test; @@ -14,6 +15,7 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import java.util.List; +import java.util.Set; @IocBean @RunWith(NbJUnit4Runner.class) @@ -52,4 +54,41 @@ public class FlowTest { } + + public static void findForkTaskNames(NodeModel node, StringBuilder buffer, Set visitedNodes) { + if (node == null) return; + + // 防止循环引用 + String nodeId = node.getName(); + if (visitedNodes.contains(nodeId)) return; + visitedNodes.add(nodeId); + + // 如果遇到fork节点,停止递归 + if (node instanceof ForkModel) return; + + List inputs = node.getInputs(); + for (TransitionModel tm : inputs) { + NodeModel source = tm.getSource(); + if (source instanceof TaskModel) { + String taskName = source.getName(); + // 避免重复添加 + if (!buffer.toString().contains(taskName)) { + if (buffer.length() > 0) buffer.append(","); + buffer.append(taskName); + } + } + // 递归处理上游节点 + findForkTaskNames(source, buffer, visitedNodes); + } + } + + + @Test + public void testForkJoin() { + JoinModel joinModel = new JoinModel(); + + + + } + }