diff --git a/src/main/java/com/budwk/app/base/constant/RoleConstant.java b/src/main/java/com/budwk/app/base/constant/RoleConstant.java index c5231a4a..ff9d81d7 100644 --- a/src/main/java/com/budwk/app/base/constant/RoleConstant.java +++ b/src/main/java/com/budwk/app/base/constant/RoleConstant.java @@ -50,6 +50,7 @@ RoleConstant { TEACHER_CONGRESS_DELEGATE_SPECIALLY_INVITE("教代会特邀代表"), TEACHER_CONGRESS_DELEGATION_HEAD("教代会代表团团长"), TEACHER_CONGRESS_VICE_DELEGATION_HEAD("教代会代表团副团长"), + TEACHER_CONGRESS_DELEGATION_CONTACT("教代会代表团联络人"), PROPOSAL_COMMITTEE_DIRECTOR("提案委员会主任"), PROPOSAL_COMMITTEE_DEPUTY_DIRECTOR("提案委员会副主任"), 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 733fb9de..22728170 100644 --- a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java +++ b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java @@ -236,46 +236,6 @@ public class FlowCommonController { @Aop(TransAop.READ_COMMITTED) public Result executeTask(@Param("data") String param) { Dict args = Json.fromJson(Dict.class, param); -// Long processTaskId = args.getLong(FlowConst.PROCESS_TASK_ID_KEY); -// String operator = SecurityUtil.getUserId(); -// args.remove(FlowConst.PROCESS_TASK_ID_KEY); -// Integer submitType = args.getInt(FlowConst.SUBMIT_TYPE); -// if (submitType == null) { -// submitType = ProcessSubmitTypeEnum.AGREE.getCode(); -// } -// args.put(FlowConst.SUBMIT_TYPE, submitType); -// -// // 设置办理人信息到表单参数 -// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "userName", SecurityUtil.getUserUsername()); -// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "loginName", SecurityUtil.getUserLoginname()); -// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitId", SecurityUtil.getUnitId()); -// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitName", SecurityUtil.getUnitId()); -// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unionId", SecurityUtil.getUnionId()); -// -// if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK.getCode())) { -// // 退回上一个节点 -// flowEngine.executeAndJumpTask(processTaskId, operator, args, null); -// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.REJECT.getCode())) { -// // 拒绝,跳转到结束节点 -// flowEngine.executeAndJumpToEnd(processTaskId, operator, args); -// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.JUMP.getCode())) { -// // 跳转到指定节点 -// String taskName = args.getStr(FlowConst.TASK_NAME); -// flowEngine.executeAndJumpTask(processTaskId, operator, args, taskName); -// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode())) { -// // 退回发起人 -// flowEngine.executeAndJumpToFirstTaskNode(processTaskId, operator, args); -// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.COUNTERSIGN_DISAGREE.getCode())) { -// // 会签不同意,追加不同意标识 -// args.put(FlowConst.COUNTERSIGN_DISAGREE_FLAG, 1); -// flowEngine.executeProcessTask(processTaskId, operator, args); -// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.RE_APPLY.getCode())) { -// // 重新提交 -// flowEngine.executeProcessTask(processTaskId, operator, args); -// } else { -// // 默认执行 -// flowEngine.executeProcessTask(processTaskId, operator, args); -// } flowCommonService.executeTask(args); return Result.success(); } @@ -330,7 +290,7 @@ public class FlowCommonController { @At("/surrogate") @SaCheckLogin - @ApiOperation("代理") + @ApiOperation("委托") public Result surrogate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) { flowEngine.processTaskService().addTaskActor(taskId, Arrays.asList(actorIds)); return Result.success(); @@ -338,11 +298,9 @@ public class FlowCommonController { @At("/addCandidate") @SaCheckLogin - @ApiOperation("代理") + @ApiOperation("加签") public Result addCandidate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) { flowEngine.processTaskService().addCandidateActor(taskId, Arrays.asList(actorIds)); return Result.success(); } - - } diff --git a/src/main/java/com/budwk/app/flow/engine/cfg/Configuration.java b/src/main/java/com/budwk/app/flow/engine/cfg/Configuration.java index 5fe4d0db..beea775e 100644 --- a/src/main/java/com/budwk/app/flow/engine/cfg/Configuration.java +++ b/src/main/java/com/budwk/app/flow/engine/cfg/Configuration.java @@ -9,8 +9,6 @@ import com.budwk.app.flow.engine.parser.impl.*; /** * * 流程引擎配置类 - * @author mldong - * @date 2022/6/12 */ public class Configuration { public Configuration() { diff --git a/src/main/java/com/budwk/app/flow/engine/core/Execution.java b/src/main/java/com/budwk/app/flow/engine/core/Execution.java index 64c434bb..c3525926 100644 --- a/src/main/java/com/budwk/app/flow/engine/core/Execution.java +++ b/src/main/java/com/budwk/app/flow/engine/core/Execution.java @@ -16,8 +16,6 @@ import java.util.stream.Collectors; /** * * 执行对象参数 - * @author mldong - * @date 2023/4/25 */ @Data public class Execution { diff --git a/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java b/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java index 324f0b74..c70a34ce 100644 --- a/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java +++ b/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java @@ -27,9 +27,6 @@ import java.util.List; /** * 工作流引擎实现 - * - * @author mldong - * @date 2023/5/29 */ public class FlowEngineImpl implements FlowEngine { protected Configuration configuration; diff --git a/src/main/java/com/budwk/app/flow/engine/core/ServiceContext.java b/src/main/java/com/budwk/app/flow/engine/core/ServiceContext.java index 64cdf2cf..381cc1e7 100644 --- a/src/main/java/com/budwk/app/flow/engine/core/ServiceContext.java +++ b/src/main/java/com/budwk/app/flow/engine/core/ServiceContext.java @@ -8,8 +8,6 @@ import java.util.List; /** * * 单例服务上下文 - * @author mldong - * @date 2022/6/12 */ public class ServiceContext { private static Context context; diff --git a/src/main/java/com/budwk/app/flow/engine/event/ProcessEvent.java b/src/main/java/com/budwk/app/flow/engine/event/ProcessEvent.java index bb6ae2de..3d317db0 100644 --- a/src/main/java/com/budwk/app/flow/engine/event/ProcessEvent.java +++ b/src/main/java/com/budwk/app/flow/engine/event/ProcessEvent.java @@ -6,8 +6,6 @@ import lombok.Data; /** * 流程开始事件 - * @author mldong - * @date 2023/12/5 */ @Data @Builder diff --git a/src/main/java/com/budwk/app/flow/engine/event/ProcessEventListener.java b/src/main/java/com/budwk/app/flow/engine/event/ProcessEventListener.java index c28bec11..38de77b4 100644 --- a/src/main/java/com/budwk/app/flow/engine/event/ProcessEventListener.java +++ b/src/main/java/com/budwk/app/flow/engine/event/ProcessEventListener.java @@ -2,8 +2,6 @@ package com.budwk.app.flow.engine.event; /** * 流程事件监听接口 - * @author mldong - * @date 2023/12/5 */ public interface ProcessEventListener { void onEvent(ProcessEvent event); diff --git a/src/main/java/com/budwk/app/flow/engine/event/ProcessPublisher.java b/src/main/java/com/budwk/app/flow/engine/event/ProcessPublisher.java index 7bced1ee..7665dad0 100644 --- a/src/main/java/com/budwk/app/flow/engine/event/ProcessPublisher.java +++ b/src/main/java/com/budwk/app/flow/engine/event/ProcessPublisher.java @@ -6,8 +6,6 @@ import java.util.List; /** * 流程事件发布者类 - * @author mldong - * @date 2023/12/5 */ public class ProcessPublisher { // 事件通知方法 diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/IHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/IHandler.java index b66fa287..da6a9a78 100644 --- a/src/main/java/com/budwk/app/flow/engine/handlers/IHandler.java +++ b/src/main/java/com/budwk/app/flow/engine/handlers/IHandler.java @@ -5,8 +5,6 @@ import com.budwk.app.flow.engine.core.Execution; /** * 流程各模型操作处理接口 - * @author mldong - * @date 2023/5/17 */ public interface IHandler { /** diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java index 14089e7b..6d222013 100644 --- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java +++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java @@ -16,8 +16,6 @@ import java.util.stream.Collectors; /** * 会签任务处理,用于判断会签任务是否可通过 * - * @author mldong - * @date 2023/11/24 */ public class CountersignHandler implements IHandler { private TaskModel taskModel; diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CreateTaskHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CreateTaskHandler.java index 4b32ee6b..74515aba 100644 --- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CreateTaskHandler.java +++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CreateTaskHandler.java @@ -16,8 +16,6 @@ import java.util.List; /** * 创建任务处理器 - * @author mldong - * @date 2023/5/16 */ public class CreateTaskHandler implements IHandler { private TaskModel taskModel; diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/EndProcessHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/EndProcessHandler.java index 689b81c5..d9d50b18 100644 --- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/EndProcessHandler.java +++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/EndProcessHandler.java @@ -14,10 +14,7 @@ import com.budwk.app.flow.enums.ProcessEventTypeEnum; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; /** - * * 结束流程实例的处理器 - * @author mldong - * @date 2023/5/29 */ public class EndProcessHandler implements IHandler { private EndModel endModel; 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 6beb2861..b3196fcd 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 @@ -11,8 +11,6 @@ import java.util.List; /** * 合并分支操作的处理器 - * @author mldong - * @date 2023/5/21 */ public class MergeBranchHandler implements IHandler { private JoinModel joinModel; diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/StartSubProcessHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/StartSubProcessHandler.java index 8d213b6d..756b9db1 100644 --- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/StartSubProcessHandler.java +++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/StartSubProcessHandler.java @@ -9,9 +9,6 @@ import com.budwk.app.flow.entity.ProcessDefine; /** * 启动子流程处理类 - * - * @author mldong - * @date 2023/12/7 */ public class StartSubProcessHandler implements IHandler { private SubProcessModel model; diff --git a/src/main/java/com/budwk/app/flow/engine/impl/SimpleContext.java b/src/main/java/com/budwk/app/flow/engine/impl/SimpleContext.java index 074754bd..aae8cba8 100644 --- a/src/main/java/com/budwk/app/flow/engine/impl/SimpleContext.java +++ b/src/main/java/com/budwk/app/flow/engine/impl/SimpleContext.java @@ -12,8 +12,6 @@ import java.util.Map; /** * * 简单的上下文发现实现类 - * @author mldong - * @date 2023/4/26 */ public class SimpleContext implements Context { private Dict dict = Dict.create(); diff --git a/src/main/java/com/budwk/app/flow/engine/impl/SurrogateInterceptor.java b/src/main/java/com/budwk/app/flow/engine/impl/SurrogateInterceptor.java index ad02e5fa..7779e8ea 100644 --- a/src/main/java/com/budwk/app/flow/engine/impl/SurrogateInterceptor.java +++ b/src/main/java/com/budwk/app/flow/engine/impl/SurrogateInterceptor.java @@ -16,8 +16,6 @@ import java.util.List; /** * 任务拦截器,处理代理人 * - * @author mldong - * @date 2023/12/6 */ @IocBean public class SurrogateInterceptor implements FlowInterceptor { diff --git a/src/main/java/com/budwk/app/flow/engine/util/FlowUtil.java b/src/main/java/com/budwk/app/flow/engine/util/FlowUtil.java index 192ea31e..cc7af134 100644 --- a/src/main/java/com/budwk/app/flow/engine/util/FlowUtil.java +++ b/src/main/java/com/budwk/app/flow/engine/util/FlowUtil.java @@ -14,6 +14,7 @@ import com.budwk.app.sys.views.View_user; import org.dromara.warm.flow.core.exception.FlowException; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.lang.util.NutMap; import java.util.Date; import java.util.HashMap; @@ -22,8 +23,6 @@ import java.util.concurrent.atomic.AtomicBoolean; /** * 流程工具 * - * @author mldong - * @date 2023/10/7 */ public class FlowUtil { private FlowUtil() { @@ -83,6 +82,19 @@ public class FlowUtil { return Dict.create(); } + /** + * 参数转字典 + * + * @param variable + * @return + */ + public static NutMap variableToNutMap(String variable) { + if (JSONUtil.isTypeJSON(variable)) { + return NutMap.WRAP(JSONUtil.parseObj(variable)); + } + return NutMap.NEW(); + } + /** * 判断是否为第一个任务节点 * diff --git a/src/main/java/com/budwk/app/flow/entity/ProcessTask.java b/src/main/java/com/budwk/app/flow/entity/ProcessTask.java index 0c0c7584..072cadfc 100644 --- a/src/main/java/com/budwk/app/flow/entity/ProcessTask.java +++ b/src/main/java/com/budwk/app/flow/entity/ProcessTask.java @@ -15,9 +15,6 @@ import java.util.Date; *

* 流程任务 *

- * - * @author mldong - * @since 2023-09-26 */ @Getter @Setter @@ -25,7 +22,6 @@ import java.util.Date; @Comment("流程任务") public class ProcessTask extends BaseModel { - @Comment("主键") @Id private Long id; diff --git a/src/main/java/com/budwk/app/flow/entity/ProcessTaskActor.java b/src/main/java/com/budwk/app/flow/entity/ProcessTaskActor.java index 0c1d3756..9324166b 100644 --- a/src/main/java/com/budwk/app/flow/entity/ProcessTaskActor.java +++ b/src/main/java/com/budwk/app/flow/entity/ProcessTaskActor.java @@ -12,9 +12,6 @@ import org.nutz.dao.entity.annotation.Table; *

* 流程任务和参与人关系 *

- * - * @author mldong - * @since 2023-09-26 */ @EqualsAndHashCode(callSuper = true) @Data diff --git a/src/main/java/com/budwk/app/flow/enums/ProcessTaskStateEnum.java b/src/main/java/com/budwk/app/flow/enums/ProcessTaskStateEnum.java index b9b01ea7..85e933fa 100644 --- a/src/main/java/com/budwk/app/flow/enums/ProcessTaskStateEnum.java +++ b/src/main/java/com/budwk/app/flow/enums/ProcessTaskStateEnum.java @@ -8,13 +8,13 @@ import lombok.Getter; @Getter public enum ProcessTaskStateEnum { - DOING(10,"进行中"), + DOING(10, "进行中"), FINISHED(20, "已完成"), WITHDRAW(30, "已撤回"), INTERRUPT(40, "强行终止"), - PENDING(50,"挂起"), - ABANDON(99,"已废弃") - ; + PENDING(50, "挂起"), + TRANSFER(60, "已转办"), + ABANDON(99, "已废弃"); private final Integer code; private final String message; diff --git a/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java b/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java index f92e552e..1c1fcc46 100644 --- a/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java +++ b/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java @@ -17,9 +17,6 @@ import java.util.List; *

* 流程实例 服务类 *

- * - * @author mldong - * @since 2023-09-26 */ public interface ProcessInstanceService extends BaseService { /** diff --git a/src/main/java/com/budwk/app/flow/service/ProcessSurrogateService.java b/src/main/java/com/budwk/app/flow/service/ProcessSurrogateService.java index 7054ee63..269555d6 100644 --- a/src/main/java/com/budwk/app/flow/service/ProcessSurrogateService.java +++ b/src/main/java/com/budwk/app/flow/service/ProcessSurrogateService.java @@ -28,12 +28,6 @@ public interface ProcessSurrogateService extends BaseService { */ boolean update(ProcessSurrogate param); - /** - * 自定义分页查询流程委托代理 - * @param param - * @return - */ -// CommonPage page(ProcessSurrogatePageParam param); /** * 通过id查询 * @param id diff --git a/src/main/java/com/budwk/app/flow/service/ProcessTaskActorService.java b/src/main/java/com/budwk/app/flow/service/ProcessTaskActorService.java index c3859739..88cffd7b 100644 --- a/src/main/java/com/budwk/app/flow/service/ProcessTaskActorService.java +++ b/src/main/java/com/budwk/app/flow/service/ProcessTaskActorService.java @@ -9,9 +9,6 @@ import com.budwk.app.flow.vo.ProcessTaskActorVO; *

* 流程任务和参与人关系 服务类 *

- * - * @author mldong - * @since 2023-09-26 */ public interface ProcessTaskActorService extends BaseService { /** @@ -28,12 +25,6 @@ public interface ProcessTaskActorService extends BaseService { */ boolean update(ProcessTaskActor param); - /** - * 自定义分页查询流程任务和参与人关系 - * @param param - * @return - */ -// CommonPage page(ProcessTaskActorPageParam param); /** * 通过id查询 * @param id diff --git a/src/main/java/com/budwk/app/flow/service/ProcessTaskService.java b/src/main/java/com/budwk/app/flow/service/ProcessTaskService.java index 53889111..ab9402cd 100644 --- a/src/main/java/com/budwk/app/flow/service/ProcessTaskService.java +++ b/src/main/java/com/budwk/app/flow/service/ProcessTaskService.java @@ -11,77 +11,82 @@ import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.vo.ProcessTaskVO; import java.util.List; -import java.util.Map; /** *

* 流程任务 服务类 *

- * - * @author mldong - * @since 2023-09-26 */ public interface ProcessTaskService extends BaseService { /** - * 添加流程任务 - * @param param - * @return - */ + * 添加流程任务 + * + * @param param + * @return + */ boolean save(ProcessTask param); /** - * 更新流程任务 - * @param param - * @return - */ + * 更新流程任务 + * + * @param param + * @return + */ boolean update(ProcessTask param); /** - * 通过id查询 - * @param id - * @return - */ + * 通过id查询 + * + * @param id + * @return + */ ProcessTaskVO findById(Long id); /** * 保存流程任务 + * * @param processTask */ void saveProcessTask(ProcessTask processTask); /** * 更新流程任务 + * * @param processTask */ void updateProcessTask(ProcessTask processTask); /** * 根据流程实例ID获取正在进行的任务 + * * @param processInstanceId 流程实例ID - * @param taskNames 任务名称 + * @param taskNames 任务名称 * @return */ List getDoingTaskList(Long processInstanceId, String[] taskNames); /** * 根据流程实例ID获取已完成的任务 + * * @param processInstanceId 流程实例ID - * @param taskNames 任务名称 + * @param taskNames 任务名称 * @return */ List getDoneTaskList(Long processInstanceId, String[] taskNames); /** * 将流程任务修改为已完成 + * * @param processTaskId - * @param operator 任务处理人 + * @param operator 任务处理人 * @param args */ void finishProcessTask(Long processTaskId, String operator, Dict args); /** * 废弃任务 + * * @param processTaskId * @param operator * @param args @@ -90,6 +95,7 @@ public interface ProcessTaskService extends BaseService { /** * 根据任务模型和流程执行对象创建任务 + * * @param taskModel * @param execution * @return @@ -98,6 +104,7 @@ public interface ProcessTaskService extends BaseService { /** * 通过id获取流程任务 + * * @param id * @return */ @@ -105,27 +112,32 @@ public interface ProcessTaskService extends BaseService { /** * 向指定的任务id添加参与者 + * * @param processTaskId 任务id - * @param actors 参与者 + * @param actors 参与者 */ void addTaskActor(Long processTaskId, List actors); /** * 向指定的任务id添加参与者 + * * @param processTaskId 流程任务id - * @param actors 参与者 + * @param actors 参与者 */ void addCandidateActor(Long processTaskId, List actors); /** * 向指定任务移除参与者 + * * @param processTaskId 任务id - * @param actors 参与者 + * @param actors 参与者 */ void removeTaskActor(Long processTaskId, List actors); + /** * 根据taskId、operator,判断操作人operator是否允许执行任务 - * @param task 任务对象 + * + * @param task 任务对象 * @param operator 操作人 * @return boolean 是否允许操作 */ @@ -133,6 +145,7 @@ public interface ProcessTaskService extends BaseService { /** * 根据任务ID获取参与者ID + * * @param processTaskId * @return */ @@ -140,7 +153,8 @@ public interface ProcessTaskService extends BaseService { /** * 根据当前任务对象驳回至上一步处理 - * @param model 流程定义模型,用以获取上一步模型对象 + * + * @param model 流程定义模型,用以获取上一步模型对象 * @param currentTask 当前任务对象 * @return Task 任务对象 */ @@ -148,6 +162,7 @@ public interface ProcessTaskService extends BaseService { /** * 获取可跳转的任务节点名称 + * * @param processInstanceId * @return */ @@ -155,6 +170,7 @@ public interface ProcessTaskService extends BaseService { /** * 创建会签任务 + * * @param taskModel * @param execution * @return @@ -163,16 +179,26 @@ public interface ProcessTaskService extends BaseService { /** * 根据执行对象、自定义节点模型创建历史任务记录 + * * @param execution 执行对象 - * @param model 自定义节点模型 + * @param model 自定义节点模型 * @return 历史任务 */ ProcessTask history(Execution execution, CustomModel model); /** * 根据流程实例ID获取最新的进行中的任务 + * * @param processInstanceId * @return */ ProcessTaskVO latest(Long processInstanceId); + + /** + * 转办任务 + * + * @param taskId 任务ID + * @param transferUserId 转办用户ID + */ + void transfer(Long taskId, String transferUserId); } 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 35d5e627..fc01dcbe 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 @@ -211,7 +211,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme if (CollectionUtil.isEmpty(actors)) return; List dbActors = getTaskActors(processTaskId); List newActors = actors.stream().filter(actor -> !dbActors.contains(actor)).toList(); - Sql sql = Sqls.create("select id,username,loginname,unitName from vw_user where id in (@ids)"); + Sql sql = Sqls.create("select id,username,loginname,unitName,unitId from vw_user where id in (@ids)"); sql.setParam("ids", newActors); List list = listMap(sql); @@ -222,19 +222,11 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme processTaskActor.setActorName(actor.getString("username")); processTaskActor.setActorAccount(actor.getString("loginname")); processTaskActor.setActorUnitName(actor.getString("unitName")); + processTaskActor.setActorUnitId(actor.getString("unitId")); processTaskActor.setCreatedAt(System.currentTimeMillis()); System.out.println(StrUtil.format("给任务:{},添加参与者:{}", processTaskId, actor.toString())); insert(processTaskActor); } - -// actors.stream().filter(actor -> !dbActors.contains(actor)).forEach(actor -> { -// ProcessTaskActor processTaskActor = new ProcessTaskActor(); -// processTaskActor.setProcessTaskId(processTaskId); -// processTaskActor.setActorId(actor); -// processTaskActor.setCreatedAt(System.currentTimeMillis()); -// System.out.println(StrUtil.format("给任务:{},添加参与者:{}", processTaskId, actor)); -// insert(processTaskActor); -// }); } @Override @@ -465,6 +457,41 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme return findById(processTaskList.get(0).getId()); } + @Override + @Aop(TransAop.READ_COMMITTED) + public void transfer(Long taskId, String transferUserId) { + // 设置原任务状态为已转办 + ProcessTask task = fetch(taskId); + task.setTaskState(ProcessTaskStateEnum.TRANSFER.getCode()); + Dict variable = FlowUtil.variableToDict(task.getVariable()); + variable.put(FlowConst.TASK_FORM_DATA_PREFIX + "transferUserId", transferUserId); + task.setVariable(JSONUtil.toJsonStr(variable)); + updateIgnoreNull(task); + + // 创建转办任务 + ProcessTask newTask = BeanUtil.copyProperties(task, ProcessTask.class, "id"); + newTask.setTaskParentId(taskId); + newTask.setId(null); + newTask.setCreatedAt(null); + newTask.setUpdatedAt(null); + newTask.setCreatedBy(null); + newTask.setUpdatedBy(null); + variable.put(FlowConst.TASK_FORM_DATA_PREFIX + "transferUserId", null); + newTask.setVariable(JSONUtil.toJsonStr(variable)); + newTask.setTaskState(ProcessTaskStateEnum.DOING.getCode()); + dao().insert(newTask); + + // 创建转办任务参与者 + addTaskActor(newTask.getId(), List.of(transferUserId)); + + // 发布流程任务开始事件 + List processTaskList = List.of(task); + processTaskList.forEach(processTask -> { + ProcessPublisher.notify(ProcessEvent.builder().eventType(ProcessEventTypeEnum.PROCESS_TASK_START).sourceId(processTask.getId()).build()); + }); + + } + /** * 根据Task模型的assignee、assignmentHandler属性以及运行时数据,确定参与者 * diff --git a/src/main/java/com/budwk/app/flow/vo/ProcessTaskVO.java b/src/main/java/com/budwk/app/flow/vo/ProcessTaskVO.java index 5accdfbc..d962cdda 100644 --- a/src/main/java/com/budwk/app/flow/vo/ProcessTaskVO.java +++ b/src/main/java/com/budwk/app/flow/vo/ProcessTaskVO.java @@ -1,5 +1,6 @@ package com.budwk.app.flow.vo; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; @@ -78,6 +79,7 @@ public class ProcessTaskVO extends ProcessTask { this.taskFormData.put(key,ext.get(key)); this.taskFormData.put(key.replaceAll(FlowConst.TASK_FORM_DATA_PREFIX,""),ext.get(key)); }); + this.taskFormData.put("finishTimeForDocx", DateUtil.format(getFinishTime(),"yyyy年MM月dd日")); return taskFormData; } diff --git a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java index 7123fbaf..764f3c90 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java @@ -5,7 +5,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; -import com.budwk.app.base.constant.RedisConstant; +import cn.hutool.json.JSONObject; import com.budwk.app.base.result.Result; import com.budwk.app.sys.models.Sys_home_activity; import com.budwk.app.sys.models.Sys_menu; @@ -35,8 +35,6 @@ import org.nutz.log.Logs; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; -import org.nutz.plugins.wkcache.annotation.CacheDefaults; -import org.nutz.plugins.wkcache.annotation.CacheResult; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -172,6 +170,22 @@ public class SysHomeController { return Result.success(sysMenus); } + @At + @SaCheckLogin + @ApiOperation("获取收藏应用") + @Ok("json") + public Result listFavorite(@Param(value = "platform", df = "PC") String platform) { + List list = sysMenuService.query(Cnd.where(Sys_menu::getId, "in", Sqls.create("select appId from sys_user_favorite_app where userId = @userId").setParam("userId", SecurityUtil.getUserId())) + .and(Sys_menu::getDisabled, "=", 0) + .and(Sys_menu::getShowit, "=", 1) + .and(Sys_menu::getPlatform, "=", platform) + ); + List menus = sysUserService.getMenus(SecurityUtil.getUserId()); + List allMenuIds = menus.stream().map(Sys_menu::getId).toList(); + List sysMenus = list.stream().filter(m -> allMenuIds.contains(m.getId())).sorted(Comparator.comparingInt(Sys_menu::getLocation)).toList(); + return Result.success(sysMenus); + } + @At @SaCheckLogin @@ -240,43 +254,76 @@ public class SysHomeController { @SaCheckLogin @ApiOperation("获取新闻") @Ok("json") - @CacheDefaults(cacheName = RedisConstant.PLATFORM_REDIS_WKCACHE_PREFIX + "web_news", isHash = true) - @CacheResult(cacheKey = "news", ignoreNull = true, cacheLiveTime = 60 * 60 * 24) +// @CacheDefaults(cacheName = RedisConstant.PLATFORM_REDIS_WKCACHE_PREFIX + "web_news", isHash = true) +// @CacheResult(cacheKey = "news", ignoreNull = true, cacheLiveTime = 60 * 60 * 24) public Result getNews() { // 定义要爬取的URL - String domain = "http://nsdgh.njnu.edu.cn"; + String domain = "https://cdgh.ncu.edu.cn/"; try { // 使用Jsoup连接到URL并获取页面内容 - Document document = Jsoup.connect(domain).get(); - List results = new ArrayList<>(); + Document doc = Jsoup.connect(domain).get(); - // 最新新闻 - Element newsElement = document.getElementById("news"); - // 获取所有li元素下的a标签 - Elements links = newsElement.select("li a"); - List list = links.stream().map(a -> { - NutMap map = new NutMap(); - map.put("href", domain + "/" + a.attr("href")); - map.put("text", a.text()); - return map; - }).toList(); - results.add(NutMap.NEW().addv("label", "最新新闻").addv("value", list)); + JSONObject root = new JSONObject(); - // 通知公告 - Elements newsSections = document.select("div.news1"); - for (Element section : newsSections) { - String category = section.selectFirst("h6").ownText(); // 获取"通知公告"或"分工会" - Elements items = section.select("li a"); - List list1 = items.stream().map(a -> { - NutMap map = new NutMap(); - map.put("href", domain + "/" + a.attr("href")); - map.put("text", a.text()); - return map; - }).toList(); - results.add(NutMap.NEW().addv("label", category).addv("value", list1)); + // 1. 新闻快讯(来自 .list1) + List newsArray = new ArrayList<>(); + Elements newsItems = doc.select(".group1 .list1 li"); + for (Element item : newsItems) { + String date = item.select(".date").text().trim(); + Element link = item.select("a.text").first(); + String title = link.select(".title").text().trim(); + String url = link.attr("href").trim(); + + JSONObject node = new JSONObject(); + node.set("title", title); + node.set("date", date); + node.set("url", domain + url); + newsArray.add(node); } + root.set("news", newsArray); - return Result.success(results); + // 2. 通知公告(来自 .list2) + List noticesArray = new ArrayList<>(); + Elements noticeItems = doc.select(".group2 .list2 li"); + for (Element item : noticeItems) { + String date = item.select(".date").text().trim(); + Element link = item.select("a.title").first(); + String title = link.text().trim(); + String url = link.attr("href").trim(); + JSONObject node = new JSONObject(); + node.set("title", title); + node.set("date", date); + node.set("url", domain + url); + noticesArray.add(node); + } + root.set("notices", noticesArray); + + // 3. 基层风采(来自 .pic-list1) + List grassrootsArray = new ArrayList<>(); + Elements grassrootsItems = doc.select(".group3 .pic-list1 li"); + for (Element item : grassrootsItems) { + Element link = item.select("a.img-scale").first(); + String date = link.select(".date").text().trim(); + String title = link.select(".title").text().trim(); + String url = link.attr("href").trim(); + String summary = link.select(".info").text().trim(); + + String imageUrl = ""; + Element img = link.select("img").first(); + if (img != null) { + imageUrl = img.attr("src").trim(); + } + + JSONObject node = new JSONObject(); + node.set("title", title); + node.set("date", date); + node.set("url", domain + url); + node.set("summary", summary); + node.set("image", domain + imageUrl); + grassrootsArray.add(node); + } + root.set("grassroots", grassrootsArray); + return Result.success(root); } catch (Exception e) { log.error(e); return Result.success(); diff --git a/src/main/java/com/budwk/app/sys/services/SysRoleService.java b/src/main/java/com/budwk/app/sys/services/SysRoleService.java index 7371e05c..f8cb5d87 100644 --- a/src/main/java/com/budwk/app/sys/services/SysRoleService.java +++ b/src/main/java/com/budwk/app/sys/services/SysRoleService.java @@ -114,6 +114,11 @@ public interface SysRoleService extends BaseService { */ Sys_role getByCode(String code); + /** + * 通过枚举获取角色 + * @param roleConstant + * @return + */ Sys_role getByCode(RoleConstant roleConstant); /** 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 1009764f..6e5ac641 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 @@ -114,7 +114,7 @@ public class ProposalConfigUnitController { @SLog(tag = "提案", msg = "承办单位同步系统单位") public Result syncSysUnit() { Sql sql = Sqls.create("select code from proposal_undertake"); - List sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql).and(Sys_unit::getUnitLevel, "=", 2)); + 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.setCode(unit.getUnitcode()); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java index b2ee782e..8a16d65c 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java @@ -133,8 +133,8 @@ public class ProposalDashboardController { ins.variable instanceVariable, ins.processDefineId instanceProcessDefineId, t.displayName curTaskName, - JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName, - caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames FROM proposal_info info LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) @@ -143,8 +143,7 @@ public class ProposalDashboardController { LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id - LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id - LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime + LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 $condition """); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/export/ProposalExportComprehensiveController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/export/ProposalExportComprehensiveController.java index 21609f7f..d008cc05 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/export/ProposalExportComprehensiveController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/export/ProposalExportComprehensiveController.java @@ -21,22 +21,12 @@ import org.nutz.mvc.annotation.Param; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -/** - * @version 1.0 - * @Author zzr - * @name:ProposalExportComprehensiveController - * @Date 2024/10/10 9:52 - * @注释 - */ @Slf4j @IocBean @Ok("json:full") @At("/platform/proposal/export/comprehensive") public class ProposalExportComprehensiveController { - @Inject - private BaseService baseService; - @Inject private ProposalExportService proposalExportService; @@ -62,8 +52,8 @@ public class ProposalExportComprehensiveController { ins.variable instanceVariable, ins.processDefineId instanceProcessDefineId, t.displayName curTaskName, - JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName, - caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames FROM proposal_info info LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) @@ -72,16 +62,15 @@ public class ProposalExportComprehensiveController { LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id - LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id - LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id $condition """); Cnd cnd = Cnd.NEW(); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); cnd.groupBy("info.id"); sql.setCondition(cnd); - Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class); + Pagination pagination = proposalExportService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(), sql); return Result.success(pagination); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java index 7e233ae2..ba78e8c8 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java @@ -59,8 +59,8 @@ public class ProposalQueryComprehensiveController { ins.variable instanceVariable, ins.processDefineId instanceProcessDefineId, t.displayName curTaskName, - JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName, - caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames FROM proposal_info info LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) @@ -69,9 +69,8 @@ public class ProposalQueryComprehensiveController { LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id - LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id - LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id $condition """); Cnd cnd = Cnd.NEW(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryHistoryController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryHistoryController.java index 00363d62..bef552b4 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryHistoryController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryHistoryController.java @@ -52,8 +52,8 @@ public class ProposalQueryHistoryController { ins.variable instanceVariable, ins.processDefineId instanceProcessDefineId, t.displayName curTaskName, - JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName, - caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames FROM proposal_info info LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) @@ -62,9 +62,8 @@ public class ProposalQueryHistoryController { LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id - LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id - LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id $condition """); Cnd cnd = Cnd.NEW(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java index 5c8f090f..c4d7cc88 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java @@ -2,26 +2,24 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query; import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.result.Result; -import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.engine.util.FlowUtil; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessTaskStateEnum; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import lombok.extern.slf4j.Slf4j; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.json.Json; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -47,111 +45,90 @@ public class ProposalQueryUnitReplyController { @At @SaCheckPermission("proposal.query.unitReply") public Result data(String sessionId, String undertakeUnitId) { - List infos = dao.query(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId)); - List infoIds = infos.stream().map(v -> v.getId()).toList(); - List instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", infoIds)); - List instIds = instances.stream().map(v -> v.getId()).toList(); + // 提案配置 协办是否需要答复 + ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class, Cnd.NEW()); + boolean slaveNeedReply = proposalConfig.getSlaveUnitNeedReply(); - // 立案任务记录 - List caseTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) - .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) - .and(ProcessTask::getTaskName, "=", "9846ab38-40c5-4093-bafc-a9b3b443338b")); + // 当前届次所有的提案ID + Sql sql = Sqls.create("select id from proposal_info where sessionId = @sessionId").setParam("sessionId", sessionId); + sql.setCallback(Sqls.callback.strList()); + dao.execute(sql); + List proposalIds = sql.getList(String.class); - // 主办任务记录 - List masterUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) - .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode())) - .and(ProcessTask::getTaskName, "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "5ed5a1be-0cd3-4b47-a0d5-238d53b61f34"))); - - // 协办任务记录 - List slaveUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) - .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode())) - .and(ProcessTask::getTaskName, "=", "c9a1586e-272b-41b8-b438-0be9f9e3781d")); + if(proposalIds.isEmpty()){ + return Result.success().addData(Map.of("tableData", Collections.EMPTY_LIST, "slaveNeedReply", slaveNeedReply)); + } - //该届次所有涉及到的承办单位 - List underTakeIds = caseTasks.stream().map(v -> { - NutMap variable = Json.fromJson(NutMap.class, v.getVariable()); - String hostUnitId = variable.getString("tf_hostUnitId"); - List helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class); - List list = new ArrayList<>(); - list.add(hostUnitId); - list.addAll(helpUnitIds); - return list; - }) - .flatMap(List::stream) - .distinct() - .toList(); + // 关联所有的实例ID + Sql instSql = Sqls.create("select id from wf_process_instance where businessNo in (@proposalIds)"); + instSql.setParam("proposalIds", proposalIds); + instSql.setCallback(Sqls.callback.strList()); + dao.execute(instSql); + List instIds = instSql.getList(String.class); + // 提案委员会立案分配的承办单位 + Cnd cnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds); + cnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId); + List replyUnits = dao.query(ProposalReplyUnit.class, cnd); - List undertakes = dao.query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", underTakeIds)); - Map undertakeMap = undertakes.stream().collect(Collectors.toMap(ProposalUndertake::getId, v -> v)); + // 承办单位答复记录 + List replyTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds).and(ProcessTask::getTaskName, "in", List.of("master_reply", "slave_reply", "opinion_master_reply")).and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode()))); + // 承办单位 List tableData = new ArrayList<>(); - for (String underTakeId : underTakeIds) { + replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((k, v) -> { NutMap tableRow = NutMap.NEW(); - tableRow.put("id", underTakeId); - if(undertakeMap.get(underTakeId) == null){ - continue; - } - tableRow.put("name", undertakeMap.get(underTakeId).getName()); + tableRow.put("id", k); + v.stream().findAny().ifPresent(item -> { + tableRow.put("unitName", item.getUnitName()); + tableRow.put("unitCode", item.getUnitCode()); + }); - //找出承办提案总数 - long sum = caseTasks.stream() - .filter(v -> { - NutMap variable = Json.fromJson(NutMap.class, v.getVariable()); - if (variable == null) { - return false; - } + // 提案总数 + tableRow.put("sum", v.size()); + // 主办提案数 + tableRow.put("masterSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && unit.getIsMaster()).count()); + // 协办提案数 + tableRow.put("slaveSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && !unit.getIsMaster()).count()); - String hostUnitId = variable.getString("tf_hostUnitId"); - List helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class); + // 主办提案已答复数 + long masterReplySum = replyTasks.stream().filter(x -> + FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k) + && FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster") + && x.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode()) + ).map(ProcessTask::getProcessInstanceId).distinct().count(); - boolean isHost = underTakeId != null && underTakeId.equals(hostUnitId); - boolean isHelper = helpUnitIds != null && helpUnitIds.contains(underTakeId); + // 主办提案未答复数 + long masterNoReplySum = replyTasks.stream().filter(x -> + FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k) + && FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster") + && x.getTaskState().equals(ProcessTaskStateEnum.DOING.getCode()) + ).map(ProcessTask::getProcessInstanceId).distinct().count(); - return isHost || isHelper; - }) - .map(ProcessTask::getProcessInstanceId) - .distinct() - .count(); + // 协办提案已答复数 + long slaveReplySum = replyTasks.stream().filter(x -> + FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k) + && !FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster") + && x.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode()) + ).map(ProcessTask::getProcessInstanceId).distinct().count(); - // 主办提案数量 - long hostSum = masterUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count(); - // 主办已答复的数量 - long hostReplySum = masterUnitTasks.stream().filter(v -> Objects.equals(v.getTaskState(), ProcessTaskStateEnum.FINISHED.getCode())).map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count(); - // 主办未答复的数量 - long hostNoReplySum = hostSum - hostReplySum; + // 协办提案未答复数 + long slaveNoReplySum = replyTasks.stream().filter(x -> + FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k) + && !FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster") + && x.getTaskState().equals(ProcessTaskStateEnum.DOING.getCode()) + ).map(ProcessTask::getProcessInstanceId).distinct().count(); + tableRow.put("masterReplySum", masterReplySum); + tableRow.put("masterNoReplySum", masterNoReplySum); + tableRow.put("slaveReplySum", slaveReplySum); + tableRow.put("slaveNoReplySum", slaveNoReplySum); - // 协办提案数量 - long slaveSum = slaveUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && !variable.getBoolean("isMaster")).count(); - - tableRow.put("sum", sum); - tableRow.put("hostSum", hostSum); - tableRow.put("hostReplySum", hostReplySum); - tableRow.put("hostNoReplySum", hostNoReplySum); - tableRow.put("slaveSum", slaveSum); - -// if (slaveNeedReply) { -// //协办提案数量 -// long helpSum = underTakeTasks.stream().filter(v -> v.getCreateVariable().getStr("underTakeId").equals(underTakeId) && !v.getCreateVariable().getBool("isMaster", false)).map(BpmProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size(); -// //协办已答复的数量 -// long helpReplySum = underTakeTasks.stream().filter(v -> v.getCreateVariable().getStr("underTakeId").equals(underTakeId) && !v.getCreateVariable().getBool("isMaster", false) && v.getTaskStatus().equals(BpmProcessTaskStatusEnum.COMPLETE.name())).map(BpmProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size(); -// //协办未答复的数量 -// long helpNoReplySum = helpSum - helpReplySum; -// tableRow.put("helpSum", helpSum); -// tableRow.put("helpReplySum", helpReplySum); -// tableRow.put("helpNoReplySum", helpNoReplySum); -// } else { -// //不需要协办答复 计算出提案总数即可 -// int helpSum = caseUnitTasks.stream() -// .filter(v -> v.getExtVariable().getBeanList("helpUnitIds", String.class).contains(underTakeId)) -// .map(BpmProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size(); -// tableRow.put("helpSum", helpSum); -// } tableData.add(tableRow); - } - return Result.success().addData(Map.of("tableData", tableData, "slaveNeedReply", false)); + }); + + return Result.success().addData(Map.of("tableData", tableData, "slaveNeedReply", slaveNeedReply)); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java index 0df1aca2..b1909122 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java @@ -29,8 +29,6 @@ import javax.validation.Valid; @Api(tags = "提案年度报告") public class ProposalQueryYearReportController { - @Inject - private BaseService baseService; @Inject private ProposalCommonService proposalCommonService; @@ -51,13 +49,14 @@ public class ProposalQueryYearReportController { type.name AS typeName, tcs.fullName AS sessionName, tcd.`name` AS delegationName, - inst.processInstanceNodeId, - inst.processInstanceNodeCode, - inst.processInstanceNodeName, - inst.processInstanceTaskIds, - inst.processInstanceStatus, - JSON_UNQUOTE(JSON_EXTRACT(caseUnitTasks.extVariable, '$.hostUnit')) AS masterUnderTakeName, - JSON_EXTRACT(caseUnitTasks.extVariable, '$.helpUnits') AS slaveUnderTakeNames + ins.id AS instanceId, + ins.businessNo, + ins.state instanceState, + ins.variable instanceVariable, + ins.processDefineId instanceProcessDefineId, + t.displayName curTaskName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames FROM proposal_info info LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) @@ -65,26 +64,16 @@ public class ProposalQueryYearReportController { LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName - LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id - LEFT JOIN ( - SELECT - processInstanceId, - MAX(endOn) AS maxEndOn - FROM - bpm_process_task - WHERE - processTaskNodeCode = 70 AND taskStatus = 'COMPLETE' - GROUP BY - processInstanceId - ) latestTasks ON latestTasks.processInstanceId = inst.id - LEFT JOIN bpm_process_task caseUnitTasks ON caseUnitTasks.processInstanceId = inst.id AND caseUnitTasks.processTaskNodeCode = 70 AND caseUnitTasks.taskStatus = 'COMPLETE' AND caseUnitTasks.endOn = latestTasks.maxEndOn + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id $condition """); Cnd cnd = Cnd.NEW(); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); cnd.groupBy("info.id"); sql.setCondition(cnd); - Pagination pagination = baseService.listPageVO(pageForm,sql, ProposalInfoPageVO.class); + Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(),sql); return Result.success(pagination); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java index beb8a3a0..8bfd4b08 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java @@ -2,26 +2,26 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query; import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.result.Result; +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.enums.ProcessTaskStateEnum; import com.budwk.app.sys.models.Sys_dict; import com.budwk.app.sys.services.SysDictService; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; import io.swagger.annotations.Api; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.json.Json; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @IocBean @@ -44,98 +44,72 @@ public class ProposalUnderTakeSatisfactionController { @At @SaCheckPermission("proposal.query.underTake.satisfaction") - public Result data(String sessionId){ - List infos = dao.query(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId)); - List infoIds = infos.stream().map(v -> v.getId()).toList(); - List instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", infoIds)); - List instIds = instances.stream().map(v -> v.getId()).toList(); + public Result data(String sessionId, String undertakeUnitId) { + List feedbackCodes = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK"); - // 立案任务记录 - List caseTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) - .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) - .and(ProcessTask::getTaskName, "=", "9846ab38-40c5-4093-bafc-a9b3b443338b")); - - // 主办任务记录 - List masterUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) - .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode())) - .and(ProcessTask::getTaskName, "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "5ed5a1be-0cd3-4b47-a0d5-238d53b61f34"))); - - // 协办任务记录 - List slaveUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) - .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode())) - .and(ProcessTask::getTaskName, "=", "c9a1586e-272b-41b8-b438-0be9f9e3781d")); - - - // 所有承办单位任务记录 - List allUnitTasks = new ArrayList<>(); - allUnitTasks.addAll(masterUnitTasks); - allUnitTasks.addAll(slaveUnitTasks); - - - //该届次所有涉及到的承办单位 - List underTakeIds = caseTasks.stream().map(v -> { - NutMap variable = Json.fromJson(NutMap.class, v.getVariable()); - String hostUnitId = variable.getString("tf_hostUnitId"); - List helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class); - List list = new ArrayList<>(); - list.add(hostUnitId); - list.addAll(helpUnitIds); - return list; - }) - .flatMap(List::stream) - .distinct() - .toList(); - - - List undertakes = dao.query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", underTakeIds)); - Map undertakeMap = undertakes.stream().collect(Collectors.toMap(ProposalUndertake::getId, v -> v)); - - List tableData = new ArrayList<>(); - - // 反馈评分 - List proposalFeedback = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK"); - - for (String underTakeId : underTakeIds) { - NutMap tableRow = NutMap.NEW(); - tableRow.put("id", underTakeId); - if (undertakeMap.get(underTakeId) == null) { - continue; - } - tableRow.put("name", undertakeMap.get(underTakeId).getName()); - - //找出承办提案总数 - long sum = caseTasks.stream() - .filter(v -> { - NutMap variable = Json.fromJson(NutMap.class, v.getVariable()); - if (variable == null) { - return false; - } - - String hostUnitId = variable.getString("tf_hostUnitId"); - List helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class); - - boolean isHost = underTakeId != null && underTakeId.equals(hostUnitId); - boolean isHelper = helpUnitIds != null && helpUnitIds.contains(underTakeId); - - return isHost || isHelper; - }) - .map(ProcessTask::getProcessInstanceId) - .distinct() - .count(); - - // 主办提案数量 - long hostSum = masterUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count(); - - // 协办提案数量 - long slaveSum = slaveUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && !variable.getBoolean("isMaster")).count(); - - // 满意 -// allUnitTasks + // 当前届次所有的提案ID + Sql sql = Sqls.create("select id from proposal_info where sessionId = @sessionId").setParam("sessionId", sessionId); + sql.setCallback(Sqls.callback.strList()); + dao.execute(sql); + List proposalIds = sql.getList(String.class); + if (proposalIds.isEmpty()) { + return Result.success(Collections.EMPTY_LIST); } + // 关联所有的实例ID + Sql instSql = Sqls.create("select id from wf_process_instance where businessNo in (@proposalIds)"); + instSql.setParam("proposalIds", proposalIds); + instSql.setCallback(Sqls.callback.strList()); + dao.execute(instSql); + List instIds = instSql.getList(String.class); - return Result.success(); + // 提案委员会立案分配的承办单位 + Cnd cnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds); + cnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId); + List replyUnits = dao.query(ProposalReplyUnit.class, cnd); + + // 反馈评分记录 +// List feedbackTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) +// .and(ProcessTask::getTaskName, "=", "feedback") +// .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())); + + // 承办单位 + List tableData = new ArrayList<>(); + + replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((k, v) -> { + NutMap tableRow = NutMap.NEW(); + tableRow.put("id", k); + v.stream().findAny().ifPresent(item -> { + tableRow.put("unitName", item.getUnitName()); + tableRow.put("unitCode", item.getUnitCode()); + }); + + // 提案总数 + tableRow.put("sum", v.size()); + // 主办提案数 + tableRow.put("masterSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && unit.getIsMaster()).count()); + // 协办提案数 + tableRow.put("slaveSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && !unit.getIsMaster()).count()); + + // 该单位负责的提案 + List thisUnitProposalIds = v.stream().map(ProposalReplyUnit::getProposalId).toList(); + List instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", thisUnitProposalIds)); + List thisUnitInstIds = instances.stream().map(ProcessInstance::getId).toList(); + + // 反馈评分记录 + List feedbackTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", thisUnitInstIds) + .and(ProcessTask::getTaskName, "=", "feedback") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())); + + for (Sys_dict code : feedbackCodes) { + long count = feedbackTasks.stream().filter(task -> FlowUtil.variableToNutMap(task.getVariable()).getString("tf_feedback", "").equals(code.getCode())).map(ProcessTask::getProcessInstanceId).distinct().count(); + tableRow.put(code.getCode(), count); + } + tableData.add(tableRow); + }); + + return Result.success(tableData); } 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 5bd994cd..02334627 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 @@ -85,7 +85,9 @@ public class ProposalExpeditingController { 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, - IF(JSON_EXTRACT(t.variable, '$.isMaster') = true, 1, 0) AS taskIsMaster + IF(JSON_EXTRACT(t.variable, '$.isMaster') = true, 1, 0) AS taskIsMaster, + ta.actorName, + ta.actorAccount FROM wf_process_task t LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorDeleteController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorDeleteController.java index 0bae8d69..ad467563 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorDeleteController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorDeleteController.java @@ -5,13 +5,8 @@ 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.result.Result; -import com.budwk.app.base.service.BaseService; -import com.budwk.app.bpm.service.BpmService; import com.budwk.app.flow.engine.FlowEngine; -import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalSeconded; import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java index 3b74ce67..45d0659a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java @@ -78,7 +78,7 @@ public class ProposalCommitteeFilingController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "=", "9846ab38-40c5-4093-bafc-a9b3b443338b"); + cnd.and("t.taskName", "=", "committee"); if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java index 7104e70c..eb57d6b9 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java @@ -105,7 +105,7 @@ public class ProposalDelegationController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "=", "93d5ba64-8220-4e62-9783-83422f474b36"); + cnd.and("t.taskName", "=", "delegation"); if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); 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 10a5a11a..2b8438de 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 @@ -92,7 +92,7 @@ public class ProposalFeedbackEvaluationController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "=", "013a7cf9-20dd-4188-a196-53fd595448e5"); + cnd.and("t.taskName", "=", "feedback"); if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java index 46288613..0b273ebb 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java @@ -12,7 +12,6 @@ import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; -import com.budwk.app.flow.entity.ProcessTaskActor; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.service.FlowCommonService; @@ -21,6 +20,7 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInviteSeconderVO; import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; @@ -42,6 +42,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import java.util.Date; import java.util.List; @IocBean @@ -123,7 +124,7 @@ public class ProposalMineController { @At @SaCheckPermission("proposal.mine") @Aop(TransAop.READ_COMMITTED) - public Result selectOne(@Valid String id){ + public Result selectOne(@Valid String id) { Sql sql = Sqls.create(""" SELECT info.*, @@ -189,22 +190,26 @@ public class ProposalMineController { String delegationId, boolean isInvite) { // 查询已经邀请的附议人 - ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", proposalId)); - - // 查询最新一次的邀请附议人任务 - ProcessTask inviteTask = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) - .and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819") - .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) - .desc(ProcessTask::getCreatedAt)); - - List taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) - .and(ProcessTask::getTaskName, "=", "74458b33-ad6e-46c4-b8d9-1aa897142b25") - .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) - .and(ProcessTask::getId, ">", inviteTask.getId()) - ); + List seconds = dao.query(ProposalSecond.class, Cnd.where(ProposalSecond::getProposalId, "=", proposalId)); - List taskActors = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "in", taskList.stream().map(ProcessTask::getId).toList())); +// // 查询已经邀请的附议人 +// ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", proposalId)); +// +// // 查询最新一次的邀请附议人任务 +// ProcessTask inviteTask = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) +// .and(ProcessTask::getTaskName, "=", "invite") +// .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) +// .desc(ProcessTask::getCreatedAt)); +// +// List taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) +// .and(ProcessTask::getTaskName, "=", "second") +// .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) +// .and(ProcessTask::getId, ">", inviteTask.getId()) +// ); +// +// +// List taskActors = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "in", taskList.stream().map(ProcessTask::getId).toList())); Sql sql = Sqls.create(""" SELECT @@ -213,6 +218,7 @@ public class ProposalMineController { t1.sex, t1.unitName, t1.unionName, + t1.mobile, t2.NAME AS delegationName FROM teacher_congress_delegate t1 @@ -225,9 +231,9 @@ public class ProposalMineController { cnd.and("t1.loginName", "!=", SecurityUtil.getUserLoginname()); if (isInvite) { - cnd.and("t1.loginName", "in", taskActors.stream().map(ProcessTaskActor::getActorAccount).toList()); + cnd.and("t1.loginName", "in", seconds.stream().map(ProposalSecond::getLoginName).toList()); } else { - cnd.andEX("t1.loginName", "not in", taskActors.stream().map(ProcessTaskActor::getActorAccount).toList()); + cnd.andEX("t1.loginName", "not in", seconds.stream().map(ProposalSecond::getLoginName).toList()); } if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { @@ -239,59 +245,6 @@ public class ProposalMineController { sql.setCondition(cnd); Pagination pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInviteSeconderVO.class); return Result.success(pagination); - - -// if (isInvite) { -// // 先执行条件过滤再手动分页 -// List pageList = voList; -// if (StrUtil.isNotBlank(delegationId)) { -// pageList = voList.stream().filter(vo -> vo.getDelegationId().equals(delegationId)).toList(); -// } -// if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { -// pageList = voList.stream().filter(vo -> (vo.getLoginName().contains(pageForm.getSearchKeyword()) || vo.getUserName().contains(pageForm.getSearchKeyword()))).toList(); -// } -// -// pageList = pageList.stream() -// .skip((long) (pageForm.getPageNumber() - 1) * pageForm.getPageSize()).limit(pageForm.getPageSize()).toList(); -// -// Pagination pagination = new Pagination<>(); -// pagination.setList(pageList); -// pagination.setPageNo(pageForm.getPageNumber()); -// pagination.setPageSize(pageForm.getPageSize()); -// pagination.setTotalCount(voList.size()); -// return Result.success(pagination); -// } else { -// // 查询可邀请的附议人 -// Sql sql = Sqls.create(""" -// SELECT -// t1.loginName, -// t1.userName, -// t1.sex, -// t1.unitName, -// t1.unionName, -// t2.NAME AS delegationName -// FROM -// teacher_congress_delegate t1 -// LEFT JOIN teacher_congress_delegation t2 ON t2.id = t1.delegationId -// $condition -// """); -// Cnd cnd = Cnd.where("t1.sessionId", "=", sessionId); -// cnd.andEX("t1.delegationId", "=", delegationId); -// cnd.and("t1.roleId", "=", "72e24b5b4c4f4e90a6641e6af8487e42"); -// cnd.and("t1.loginName", "!=", SecurityUtil.getUserLoginname()); -// // 过滤到已邀请的附议人 -// cnd.and("t1.loginName", "not in", voList.stream().map(ProposalInviteSeconderVO::getLoginName).toList()); -// -// if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { -// SqlExpressionGroup seg = new SqlExpressionGroup(); -// seg.orLike("t1.loginName", pageForm.getSearchKeyword()); -// seg.orLike("t1.userName", pageForm.getSearchKeyword()); -// cnd.and(seg); -// } -// sql.setCondition(cnd); -// Pagination pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInviteSeconderVO.class); -// return Result.success(pagination); -// } } @At @@ -304,12 +257,13 @@ public class ProposalMineController { // 查询最新一次的邀请附议人任务 ProcessTask inviteTask = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) - .and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819") + .and(ProcessTask::getTaskName, "=", "invite") .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) .desc(ProcessTask::getCreatedAt)); + // 已完成附议的代表 List taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) - .and(ProcessTask::getTaskName, "=", "74458b33-ad6e-46c4-b8d9-1aa897142b25") + .and(ProcessTask::getTaskName, "=", "second") .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) .and(ProcessTask::getId, ">", inviteTask.getId()) ); @@ -330,7 +284,7 @@ public class ProposalMineController { t1.sex, t1.unitName, t1.unionName, - t1.delegationId, + t1.mobile, t2.NAME AS delegationName FROM teacher_congress_delegate t1 @@ -344,7 +298,7 @@ public class ProposalMineController { // 获取正在执行的任务(邀请附议人||提案附议) List doingTaskList = flowEngine.processTaskService().getDoingTaskList(processInstance.getId(), null); - if (doingTaskList.stream().anyMatch(task -> task.getTaskName().equals("85b7b9bd-d706-48cb-99a1-ef1370fb1819"))) { + if (doingTaskList.stream().anyMatch(task -> task.getTaskName().equals("invite"))) { // 完成邀请任务并添加附议人 for (ProcessTask task : doingTaskList) { Dict args = Dict.create(); @@ -366,6 +320,22 @@ public class ProposalMineController { dao.update(inviteTask, "variable"); } + // 储存到提案附议表 + List secondeds = list.stream().map(item -> { + ProposalSecond seconded = new ProposalSecond(); + seconded.setProposalId(proposalId); + seconded.setSeconderId(item.getString("userId")); + seconded.setUserName(item.getString("userName")); + seconded.setLoginName(item.getString("loginName")); + seconded.setUnitName(item.getString("unitName")); + seconded.setUnionName(item.getString("unionName")); + seconded.setDelegationName(item.getString("delegationName")); + seconded.setMobile(item.getString("mobile")); + seconded.setInviteTime(new Date()); + return seconded; + }).toList(); + dao.insert(secondeds); + return Result.success(); } @@ -378,8 +348,8 @@ public class ProposalMineController { String measures = HtmlUtil.cleanHtmlTag(StrUtil.nullToDefault(info.getMeasures(), "")); String brief = HtmlUtil.cleanHtmlTag(StrUtil.nullToDefault(info.getBrief(), "")); - if (StrUtil.isBlank(info.getSessionId()) || StrUtil.isBlank(info.getDelegationId()) - || StrUtil.isBlank(info.getName()) + if (StrUtil.isBlank(info.getSessionId()) + || StrUtil.isBlank(info.getDelegationId()) || StrUtil.isBlank(info.getName()) || StrUtil.isBlank(info.getBrief()) || StrUtil.isBlank(measures) diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java index 79e1fa11..95e3dda1 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java @@ -97,7 +97,7 @@ public class ProposalSchoolLeaderApprovalController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "=", "04ecf80c-a9d0-4986-8aac-231758d6a7af"); + cnd.and("t.taskName", "=", "school_leader"); if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java index a096301b..0d6c7261 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java @@ -1,36 +1,28 @@ package com.budwk.app.zhgh.democratic.proposal.controller.transact; import cn.dev33.satoken.annotation.SaCheckPermission; -import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; -import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; -import com.budwk.app.bpm.param.BpmTaskApprovalParam; import com.budwk.app.bpm.service.BpmService; import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; -import org.nutz.dao.util.cri.Static; -import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; -import org.nutz.mvc.annotation.Param; import javax.validation.Valid; import java.util.List; @@ -107,9 +99,9 @@ public class ProposalSecondedController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "=", "74458b33-ad6e-46c4-b8d9-1aa897142b25"); + cnd.and("t.taskName", "=", "second"); - if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ + if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); } @@ -122,7 +114,11 @@ public class ProposalSecondedController { cnd.groupBy("t.id"); cnd.desc("t.createdAt"); sql.setCondition(cnd); - Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(), sql); + Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + List list = pagination.getList(NutMap.class); + for (NutMap row : list) { +// String instanceId = row.getString("instanceId"); + } return Result.success(pagination); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java index 026e7719..bbc33505 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java @@ -5,23 +5,31 @@ import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.flow.service.ProcessTaskService; +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.sys.services.SysUserService; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; -import com.budwk.app.zhgh.democratic.proposal.service.ProposalUnderTakeReplyService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; import javax.validation.Valid; import java.util.List; @@ -37,7 +45,13 @@ public class ProposalUnderTakeReplyController { @Inject private ProposalCommonService proposalCommonService; @Inject - private ProposalUnderTakeReplyService proposalUnderTakeReplyService; + private FlowCommonService flowCommonService; + @Inject + private ProcessTaskService processTaskService; + @Inject + private SysRoleService sysRoleService; + @Inject + private SysUserService sysUserService; @At("") @Ok("beetl:/platform/zhgh/democratic/proposal/transact/unitReply/index.html") @@ -78,8 +92,10 @@ public class ProposalUnderTakeReplyController { 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, - IF(JSON_EXTRACT(t.variable, '$.isMaster') = true, 1, 0) AS taskIsMaster + t.variable->>'$.underTakeName' AS underTakeName, + IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0) AS underTakeIsMaster, + t.variable->>'$.tf_transferUserId' AS tf_transferUserId, + transferUser.username AS transferUserName FROM wf_process_task t LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId @@ -90,17 +106,18 @@ public class ProposalUnderTakeReplyController { LEFT JOIN proposal_type type on type.id = info.typeId LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId + LEFT JOIN sys_user transferUser on transferUser.id = t.variable->>'$.tf_transferUserId' $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())); } if (approval) { - cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.TRANSFER.getCode())); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } @@ -113,12 +130,12 @@ public class ProposalUnderTakeReplyController { List list = pagination.getList(); for (NutMap row : list) { if (row.getInt("taskIsMaster") == 1) { - boolean b = Stream.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "c9a1586e-272b-41b8-b438-0be9f9e3781d", "04ecf80c-a9d0-4986-8aac-231758d6a7af") + boolean b = Stream.of("master_reply", "slave_reply", "school_leader") .anyMatch(a -> row.getString("curTaskKey").contains(a)); - row.setv("canRevoke",b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode()); - }else{ - boolean b = Stream.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "c9a1586e-272b-41b8-b438-0be9f9e3781d").anyMatch(a -> row.getString("curTaskKey").contains(a)); - row.setv("canRevoke",b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode()); + row.setv("canRevoke", b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode()); + } else { + boolean b = Stream.of("master_reply", "slave_reply").anyMatch(a -> row.getString("curTaskKey").contains(a)); + row.setv("canRevoke", b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode()); } } pagination.setList(list); @@ -126,4 +143,46 @@ public class ProposalUnderTakeReplyController { return Result.success(pagination); } + @At + @SaCheckPermission("proposal.unitReply") + @ApiOperation("查询本单位可转办用户") + public Result selectViceUser(@Param("keyword") @Valid String keyword) { + Sql sql = Sqls.create("select id,loginname,username from vw_user $condition"); + Cnd cnd = Cnd.NEW(); + cnd.andEX("unitId", "=", SecurityUtil.getUnitId()); + cnd.andEX("id", "!=", SecurityUtil.getUserId()); + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.orLike("username", keyword); + seg.orLike("loginname", keyword); + cnd.and(seg); + sql.setCondition(cnd); + + sql.setParam("unitId", SecurityUtil.getUnitId()); + sql.setParam("userId", SecurityUtil.getUserId()); + Pagination pagination = proposalCommonService.listPageMap(1, 10, sql); + return Result.success(pagination.getList()); + } + + @At + @SaCheckPermission("proposal.unitReply") + @ApiOperation("转办") + @Aop(TransAop.READ_COMMITTED) + public Result transfer(@Param("taskId") @Valid Long taskId, @Param("userId") @Valid String userId) { + // 此处设置转办用户的角色即可 + Sys_role proxyRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_PROXY); + int count = sysRoleService.dao().count(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", userId).and(Sys_user_role::getRoleId, "=", proxyRole.getId())); + if (count == 0) { + // 添加转办用户的角色 + Sys_user_role userRole = new Sys_user_role(); + userRole.setUserId(userId); + userRole.setRoleId(proxyRole.getId()); + sysRoleService.insert(userRole); + sysUserService.clearCache(); + sysRoleService.clearCache(); + } + + processTaskService.transfer(taskId, userId); + return Result.success(); + } + } 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 aef0cdaf..0df59c86 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 @@ -26,14 +26,14 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler { SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class); // 主办单位id - String hostUnitId = execution.getArgs().getStr("tf_hostUnitId"); + String masterUnitId = execution.getArgs().getStr("tf_masterUnitId"); - if (StrUtil.isBlank(hostUnitId)) { + if (StrUtil.isBlank(masterUnitId)) { throw new BaseException("请选择主办单位"); } // 获取主办单位 - ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, hostUnitId); + ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, masterUnitId); if (undertake == null) { throw new BaseException("主办单位不存在"); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalSlaveUnitAssignmentHandler.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalSlaveUnitAssignmentHandler.java index f52aca2d..bb1c732f 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalSlaveUnitAssignmentHandler.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalSlaveUnitAssignmentHandler.java @@ -38,7 +38,7 @@ public class ProposalSlaveUnitAssignmentHandler implements AssignmentHandler { SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class); // 协办单位id - List helpUnitIds = (List) execution.getArgs().get("tf_helpUnitIds"); + List helpUnitIds = (List) execution.getArgs().get("tf_slaveUnitIds"); if (helpUnitIds != null && !helpUnitIds.isEmpty()) { Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER); 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 70d009f7..a2de47b9 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,8 @@ package com.budwk.app.zhgh.democratic.proposal.interceptor; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.FlowInterceptor; import com.budwk.app.flow.engine.core.Execution; @@ -7,7 +10,11 @@ import com.budwk.app.flow.engine.core.ServiceContext; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTaskActor; +import com.budwk.app.sys.models.Sys_role; +import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; @@ -26,28 +33,75 @@ public class ProposalCaseFilingInterceptor implements FlowInterceptor { @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("unitName", taskActor.getActorUnitName()); - variable.setv("unitId", taskActor.getActorUnitId()); + + variable.setv("underTakeName", taskActor.getActorUnitName()); + variable.setv("underTakeId", taskActor.getActorUnitId()); // 是否主办 - variable.setv("isMaster", task.getTaskName().equals("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0")); + 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"); + + // 储存承办单位 + if (StrUtil.isNotBlank(caseFilingResult) && List.of("CONFIRM_FILING", "SUGGESTION").contains(caseFilingResult)) { + // 删除原来的记录 + dao.clear(ProposalReplyUnit.class,Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId)); + + // 主办单位 + String masterUnitId = execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "masterUnitId"); + ProposalUndertake masterUnit = dao.fetch(ProposalUndertake.class, masterUnitId); + ProposalReplyUnit masterReplyUnit = new ProposalReplyUnit(); + masterReplyUnit.setProposalId(proposalId); + masterReplyUnit.setUnitId(masterUnit.getId()); + masterReplyUnit.setUnitCode(masterUnit.getCode()); + masterReplyUnit.setUnitName(masterUnit.getName()); + masterReplyUnit.setIsMaster(true); + dao.insert(masterReplyUnit); + + // 协办单位 + List helpUnitIds = (List) execution.getArgs().getObj(FlowConst.TASK_FORM_DATA_PREFIX + "slaveUnitIds"); + if(ObjectUtil.isNotEmpty(helpUnitIds)){ + for (String helpUnitId : helpUnitIds) { + ProposalUndertake helpUnit = dao.fetch(ProposalUndertake.class, helpUnitId); + ProposalReplyUnit helpReplyUnit = new ProposalReplyUnit(); + helpReplyUnit.setProposalId(proposalId); + helpReplyUnit.setUnitId(helpUnit.getId()); + helpReplyUnit.setUnitCode(helpUnit.getCode()); + helpReplyUnit.setUnitName(helpUnit.getName()); + helpReplyUnit.setIsMaster(false); + dao.insert(helpReplyUnit); + } + } + } + + + // 更新立案结果、立案类型 ProcessInstance processInstance = execution.getProcessInstance(); String businessNo = processInstance.getBusinessNo(); - dao.update(ProposalInfo.class, Chain.make("caseFilingResult", execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingResult")), Cnd.where(ProposalInfo::getId, "=", businessNo)); + + Chain chain = Chain.make("caseFilingResult", execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingResult")); + 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"); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalInfo.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalInfo.java index e8671894..94235067 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalInfo.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalInfo.java @@ -18,7 +18,7 @@ import java.util.List; @TableMeta("{'mysql-charset':'utf8mb4'}") @Comment("提案信息") @TableIndexes({ - @Index(name = "INDEX_PROPOSAL_INFO_SESSION_CODE", fields = {"sessionId","code"}) + @Index(name = "INDEX_PROPOSAL_INFO_SESSION_CODE", fields = {"sessionId", "code"}) }) public class ProposalInfo extends BaseModel { @@ -55,6 +55,11 @@ public class ProposalInfo extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 32) private String caseFilingResult; + @Column + @Comment("立案类型(重点、普通提案)") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String caseFilingType; + @Column @Comment("教代会ID") @ColDefine(type = ColType.VARCHAR, width = 32) diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReply.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReply.java deleted file mode 100644 index 897d3c91..00000000 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReply.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.budwk.app.zhgh.democratic.proposal.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) -@Accessors(chain = true) -@Table("proposal_reply_unit") -@TableMeta("{'mysql-charset':'utf8mb4'}") -@Comment("提案答复表") -public class ProposalReply extends BaseModel { - - @Name - @Comment("ID") - @ColDefine(type = ColType.VARCHAR, width = 32) - @PrevInsert(uu32 = true) - private String id; - - @Column - @Comment("提案ID") - @ColDefine(type = ColType.VARCHAR, width = 32) - private String proposalId; - - @Column - @Comment("承办单位ID") - @ColDefine(type = ColType.VARCHAR, width = 32) - private String unitId; - - @Column - @Comment("承办单位code") - @ColDefine(type = ColType.VARCHAR, width = 50) - private String unitCode; - - @Column - @Comment("承办单位名称") - @ColDefine(type = ColType.VARCHAR, width = 255) - private String unitName; - - @Column - @Comment("是否主办单位") - @ColDefine(type = ColType.BOOLEAN) - @Default("0") - private Boolean isMaster; - - @Column - @Comment("是否答复") - @ColDefine(type = ColType.BOOLEAN) - @Default("0") - private Boolean isReply; -} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSeconded.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSecond.java similarity index 77% rename from src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSeconded.java rename to src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSecond.java index fe4df1c5..46080d51 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSeconded.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSecond.java @@ -11,10 +11,10 @@ import java.util.Date; @Data @EqualsAndHashCode(callSuper = true) -@Table("proposal_seconded") +@Table("proposal_second") @TableMeta("{'mysql-charset':'utf8mb4'}") @Comment("提案附议信息") -public class ProposalSeconded extends BaseModel { +public class ProposalSecond extends BaseModel { @Name @Comment("ID") @@ -35,22 +35,32 @@ public class ProposalSeconded extends BaseModel { @Column @Comment("附议人姓名") @ColDefine(type = ColType.VARCHAR, width = 100) - private String seconderName; + private String userName; @Column @Comment("附议人工号") @ColDefine(type = ColType.VARCHAR, width = 100) - private String seconderLoginName; + private String loginName; @Column @Comment("附议人单位") @ColDefine(type = ColType.VARCHAR, width = 255) - private String seconderUnitName; + private String unitName; + + @Column + @Comment("附议人分工会") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String unionName; + + @Column + @Comment("附议人代表团") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String delegationName; @Column @Comment("附议人手机号") @ColDefine(type = ColType.VARCHAR, width = 32) - private String seconderMobile; + private String mobile; @Column @Comment("附议时间") @@ -62,11 +72,6 @@ public class ProposalSeconded extends BaseModel { @ColDefine(type = ColType.DATETIME) private Date inviteTime; - @Column - @Comment("附议人签字id") - @ColDefine(type = ColType.VARCHAR, width = 32) - private String seconderSignId; - @Column @Comment("附议结果") @ColDefine(type = ColType.BOOLEAN) diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java index 75376971..2bc7b9ed 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java @@ -1,15 +1,9 @@ package com.budwk.app.zhgh.democratic.proposal.service; import com.budwk.app.base.service.BaseService; -import com.budwk.app.bpm.param.BpmTaskApprovalParam; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalSeconded; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond; -public interface ProposalSecondedService extends BaseService { +public interface ProposalSecondedService extends BaseService { - /** - * 附议 - * @param approvalParam - */ - void approval(BpmTaskApprovalParam approvalParam); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java index 90d9b39d..c93f9785 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java @@ -15,6 +15,11 @@ public interface ProposalCommonService extends BaseService { */ NutMap info(String id); + /** + * 导出word + * @param id + * @param response + */ void exportProposalAsDocx(String id, HttpServletResponse response); /** diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java index ab2bcab7..edd918ab 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java @@ -4,28 +4,24 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HtmlUtil; import cn.hutool.json.JSONObject; -import com.budwk.app.base.constant.BpmProcessConstant; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; -import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; -import com.budwk.app.bpm.models.BpmProcessInstance; -import com.budwk.app.bpm.models.BpmProcessTask; -import com.budwk.app.bpm.service.BpmService; -import com.budwk.app.bpm.vo.BpmProcessTaskVo; -import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo; import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowEngine; +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.enums.ProcessInstanceStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.flow.vo.ProcessTaskVO; +import com.budwk.app.sys.models.Sys_dict; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_user; import com.budwk.app.sys.models.Sys_user_role; +import com.budwk.app.sys.services.SysDictService; import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.base.Globals; @@ -34,10 +30,7 @@ import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; -import com.deepoove.poi.data.AttachmentRenderData; -import com.deepoove.poi.data.Attachments; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; -import com.deepoove.poi.policy.AttachmentRenderPolicy; import lombok.extern.slf4j.Slf4j; import org.ddr.poi.html.HtmlRenderPolicy; import org.nutz.dao.Cnd; @@ -68,9 +61,11 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp @Inject private SysRoleService sysRoleService; @Inject - private BpmService bpmService; - @Inject private SysOfficeTemplateUtil sysOfficeTemplateUtil; + @Inject + private FlowEngine flowEngine; + @Inject + private SysDictService sysDictService; public ProposalCommonServiceImpl(Dao dao) { super(dao); @@ -101,59 +96,11 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp WHERE info.id = @id """).setParam("id", id); - NutMap nutMap = (NutMap) dao().execute(sql.setCallback(Sqls.callback.map())).getResult(); - -// List nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.PROPOSAL, id); -// nutMap.put("nodeTasks", nodeTasks); -// -// //查询附议人信息 -// BpmProcessInstance bpmProcessInstance = dao().fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", id)); -// BpmProcessTask lastestWriteTask = dao().fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId()) -// .and(BpmProcessTask::getTaskStatus, "=", BpmProcessTaskStatusEnum.COMPLETE.name()) -// .and(BpmProcessTask::getProcessTaskNodeCode, "in", List.of(10, 40, 61)) -// .and(BpmProcessTask::getDelFlag, "=", 0) -// .desc(BpmProcessTask::getEndOn) -// ); -// -// if (ObjectUtil.isNotEmpty(lastestWriteTask)) { -// String lastestWriteTaskId = lastestWriteTask.getId(); -// List seconderTasks = dao().query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getPrevTaskId, "=", lastestWriteTaskId) -// .and(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId()) -// .and(BpmProcessTask::getTaskStatus, "!=", BpmProcessTaskStatusEnum.REVOKE.name()) -// .and(BpmProcessTask::getDelFlag, "=", 0) -// .asc(BpmProcessTask::getCreatedOn) -// ); -// nutMap.put("seconders", seconderTasks); -// } -// -// //查询并案的提案 -// List consolidationProposalIds = getConsolidation(id); -// List otherProposalIds = consolidationProposalIds.stream().filter(proposalId -> !proposalId.equals(id)).toList(); -// if (ObjectUtil.isNotEmpty(otherProposalIds)) { -// Sql otherProposalSql = Sqls.create(""" -// SELECT -// info.id, -// info.name, -// info.code, -// info.createUserName, -// type.name AS typeName, -// tcs.fullName AS sessionName, -// tcd.`name` AS delegationName -// FROM -// proposal_info info -// LEFT JOIN proposal_type type on type.id = info.typeId -// LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId -// LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId -// WHERE info.id in (@otherProposalIds) -// """).setParam("otherProposalIds", otherProposalIds); -// List consolidationProposals = listMap(otherProposalSql); -// nutMap.put("consolidationProposals", consolidationProposals); -// nutMap.put("isConsolidation", true); -// } else { -// nutMap.put("consolidationProposals", null); -// nutMap.put("isConsolidation", false); -// } - return nutMap; + NutMap info = (NutMap) dao().execute(sql.setCallback(Sqls.callback.map())).getResult(); + if (StrUtil.isNotBlank(info.getString("suggestUnits"))) { + info.put("suggestUnits", String.join(",", Json.fromJson(ArrayList.class, info.getString("suggestUnits")))); + } + return info; } @Override @@ -175,8 +122,6 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp if (id == null || id.isEmpty()) { throw new BaseException("提案信息不存在"); } - // 查询提案信息 - HashMap docData = new HashMap<>(); //基本信息 Sql sql = Sqls.create(""" @@ -186,6 +131,8 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp info.brief, info.measures, info.createUserName, + DATE_FORMAT(info.createTime, '%Y年%m月%d日') AS createTime, + info.unitName, tcde.unitName, tcde.mobile, type.name AS typeName, @@ -201,26 +148,41 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp """).setParam("id", id); sql.setCallback(Sqls.callback.map()); execute(sql); - NutMap info = (NutMap) sql.getResult(); + NutMap docData = (NutMap) sql.getResult(); //处理下富文本 - String brief = info.getString("brief"); - String measures = info.getString("measures"); - info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief)); - info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(measures)); + String brief = docData.getString("brief"); + String measures = docData.getString("measures"); + docData.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief)); + docData.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(measures)); - docData.put("info", info); + List feedBackDict = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK"); + Map feedBackMap = feedBackDict.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName)); + + + // 流程实例 + ProcessInstance processInstance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id)); + + List doneTaskVos = new ArrayList<>(); + List doneTaskList = flowEngine.processTaskService().getDoneTaskList(processInstance.getId(), null); + for (ProcessTask doneTask : doneTaskList) { + ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId()); + doneTaskVos.add(taskVO); + } + + // 按任务节点分组 + Map> taskGroups = doneTaskVos.stream().collect(Collectors.groupingBy(ProcessTaskVO::getDisplayName)); + docData.putAll(taskGroups); LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true); - AttachmentRenderPolicy attachmentRenderPolicy = new AttachmentRenderPolicy(); Configure config = Configure.builder() .bind("seconders", policy) - .bind("info.brief", htmlRenderPolicy) - .bind("info.measures", htmlRenderPolicy) - .bind("zbdf.opinion", htmlRenderPolicy) - .bind("attachment", attachmentRenderPolicy) + .bind("提案附议", policy) + .bind("brief", htmlRenderPolicy) + .bind("measures", htmlRenderPolicy) + .bind("taskFormData.tf_opinion", htmlRenderPolicy) .build(); try { @@ -243,15 +205,13 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp SELECT info.name, info.code, - info.excerpt, - info.brief, info.measures, info.createUserName, - tcde.unitName, - tcde.mobile, type.name AS typeName, tcs.fullName AS sessionName, - tcd.`name` AS delegationName + tcd.`name` AS delegationName, + tcs.j, + tcs.c FROM proposal_info info LEFT JOIN proposal_type type on type.id = info.typeId @@ -263,80 +223,46 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp sql.setCallback(Sqls.callback.map()); execute(sql); NutMap info = (NutMap) sql.getResult(); -// String brief = info.getString("brief"); -// info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief)); - String excerpt = StrUtil.blankToDefault(info.getString("excerpt"),""); - info.put("excerpt", HtmlUtil.cleanHtmlTag(excerpt)); + // 获取流程实例 + ProcessInstance processInstance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id)); - docData.put("info", info); + // 主办办理情况 + ProcessTask masterUnitReplyTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) + .and(ProcessTask::getTaskName, "in", List.of("master_reply", "opinion_master_reply")) + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) + .desc(ProcessTask::getFinishTime) + ); + if (masterUnitReplyTask != null) { + // 办理解决情况 + String implementState = FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("tf_implementState"); + info.put(implementState, "√"); + // 承办单位名称 + info.put("underTakeName",FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("underTakeName")); + } - //审批记录 - List nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.PROPOSAL, id); - //委员会确认承办单位 - nodeTasks.stream().filter(v -> v.getNodeCode() == 70) - .flatMap(v -> v.getTasks().stream()) - .max(Comparator.comparing(BpmProcessTaskVo::getEndOn)) - .ifPresent(v -> { - HashMap committeeConfirm = new HashMap<>(); - committeeConfirm.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日")); - committeeConfirm.put("user", v.getActualOwnerUserName()); - if (ObjectUtil.isNotEmpty(v.getExtVariable())) { - committeeConfirm.put("opinion", v.getExtVariable().getStr("approvalOpinion")); - committeeConfirm.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature"))); - committeeConfirm.put("hostUnit", v.getExtVariable().getStr("hostUnit")); - if (ObjectUtil.isNotEmpty(v.getExtVariable().getBeanList("helpUnits", String.class))) { - committeeConfirm.put("helpUnits", String.join("、", v.getExtVariable().getBeanList("helpUnits", String.class))); - } - } - docData.put("wyhConfirm", committeeConfirm); - }); - - //主办单位答复 - nodeTasks.stream().filter(v -> v.getNodeCode() == 80) - .flatMap(v -> v.getTasks().stream()) - .filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && v1.getCreateVariable().getBool("isMaster")) - .max(Comparator.comparing(BpmProcessTaskVo::getEndOn)) - .ifPresent(v -> { - HashMap masterUnderTakeReply = new HashMap<>(); - masterUnderTakeReply.put("name", v.getCreateVariable().getStr("underTakeName")); - masterUnderTakeReply.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日")); - masterUnderTakeReply.put("user", v.getActualOwnerUserName()); - if (ObjectUtil.isNotEmpty(v.getExtVariable())) { - masterUnderTakeReply.put("opinion", v.getExtVariable().getStr("approvalOpinion")); - masterUnderTakeReply.put("implementState", v.getExtVariable().getStr("implementState")); - masterUnderTakeReply.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature"))); - } - docData.put("zbdf", masterUnderTakeReply); - }); - //反馈评分 - nodeTasks.stream().filter(v -> v.getNodeCode() == 100) - .flatMap(v -> v.getTasks().stream()) - .max(Comparator.comparing(BpmProcessTaskVo::getEndOn)) - .ifPresent(v -> { - HashMap feedbackScore = new HashMap<>(); - feedbackScore.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日")); - feedbackScore.put("user", v.getActualOwnerUserName()); - if (ObjectUtil.isNotEmpty(v.getExtVariable())) { - feedbackScore.put("opinion", v.getExtVariable().getStr("approvalOpinion")); - String feedBackScore = v.getExtVariable().getStr("feedBackScore", ""); - feedbackScore.put("manyi", feedBackScore.equals("满意") ? "√" : ""); - feedbackScore.put("jibenmanyi", feedBackScore.equals("基本满意") ? "√" : ""); - feedbackScore.put("bumanyi", feedBackScore.equals("不满意") ? "√" : ""); - } - docData.put("fk", feedbackScore); - }); + // 反馈评价 + ProcessTask feedbackTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) + .and(ProcessTask::getTaskName, "=", "feedback") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) + .desc(ProcessTask::getFinishTime) + ); + if (feedbackTask != null) { + info.put(FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback"), "√"); + info.put("tf_feedback", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback")); + info.put("tf_opinion", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_opinion")); + info.put("tf_phone", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_phone")); + info.put("tf_address", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_address")); + info.put("tf_postcode", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_postcode")); + } HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true); - Configure config = Configure.builder() - .bind("info.excerpt", htmlRenderPolicy) - .bind("zbdf.opinion", htmlRenderPolicy) - .build(); + Configure config = Configure.builder().build(); try { - XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal_feedback"), config).render(docData).writeAndClose(byteArrayOutputStream); + XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal_feedback"), config).render(info).writeAndClose(byteArrayOutputStream); } catch (IOException e) { log.error("提案导出失败{},提案id:{}", e.getMessage(), id); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java index 01076f66..fb07496d 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java @@ -10,6 +10,7 @@ import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; import com.budwk.app.flow.constant.FlowConst; +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.enums.ProcessTaskStateEnum; @@ -38,7 +39,6 @@ import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -186,8 +186,8 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp // 添加序号,去除富文本,获取附议人 for (int i = 0; i < list.size(); i++) { list.get(i).put("index", i + 1); - list.get(i).put("brief",HtmlUtil.cleanHtmlTag(list.get(i).getString("brief"))); - list.get(i).put("measures",HtmlUtil.cleanHtmlTag(list.get(i).getString("measures"))); + list.get(i).put("brief", HtmlUtil.cleanHtmlTag(list.get(i).getString("brief"))); + list.get(i).put("measures", HtmlUtil.cleanHtmlTag(list.get(i).getString("measures"))); // 流程实例 ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", list.get(i).getString("id"))); @@ -203,7 +203,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp if (inviteTask != null) { NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable()); List seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class); - list.get(i).put("secondedUserNames", seconders.stream().map(v->v.getString("userName")).collect(Collectors.joining(","))); + list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(","))); } } @@ -352,6 +352,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp $condition """); Cnd cnd = Cnd.NEW(); + cnd.groupBy("info.id"); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); sql.setCondition(cnd); List list = listMap(sql); @@ -385,13 +386,15 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp SELECT info.name, info.code, + DATE_FORMAT(info.createTime, '%Y年%m月%d日') AS createTime, + info.suggestUnits, info.researchFindings, info.brief, info.measures, info.createUserName, + type.name AS typeName, tcde.unitName, tcde.mobile, - type.name AS typeName, tcs.j, tcs.c, tcs.fullName AS sessionName, @@ -412,8 +415,10 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("brief"))); info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("measures"))); - // 添加高校信息 - info.put("schoolName", Globals.AppName); + // 处理建议承办单位 + if(StrUtil.isNotBlank(info.getString("suggestUnits"))){ + info.put("suggestUnits", String.join("、", Json.fromJsonAsList(String.class, info.getString("suggestUnits")))); + } // 创建docData,直接复用info中的数据 HashMap docData = new HashMap<>(info); @@ -425,7 +430,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp // 查询附议人信息 ProcessTask inviteTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId()) - .and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819") + .and(ProcessTask::getTaskName, "=", "invite") .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) .desc(ProcessTask::getCreatedAt)); @@ -434,9 +439,24 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable()); if (variable != null) { List seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class); - docData.put("seconders", seconders != null ? seconders : Collections.emptyList()); + if(seconders != null){ + String secondersNames = seconders.stream().map(seconder -> seconder.getString("userName")).collect(Collectors.joining("、")); + docData.put("secondersNames", secondersNames); + } } } + + // 委员会立案信息 + ProcessTask caseTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId()) + .and(ProcessTask::getTaskName, "=", "committee") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) + .desc(ProcessTask::getCreatedAt) + ); + if (caseTask != null) { + String opinion = FlowUtil.variableToDict(caseTask.getVariable()).getStr("tf_opinion"); + docData.put("committeeOpinion", opinion); + } + } // 配置渲染策略 @@ -469,13 +489,13 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp info.name FROM proposal_info info - LEFT JOIN proposal_type type on type.id = info.typeId LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName $condition """); Cnd cnd = Cnd.NEW(); + cnd.groupBy("info.id"); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); sql.setCondition(cnd); List list = listMap(sql); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java index b9c5cd13..e6d64742 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java @@ -1,113 +1,21 @@ package com.budwk.app.zhgh.democratic.proposal.service.impl; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.service.impl.BaseServiceImpl; -import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; -import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum; -import com.budwk.app.bpm.models.BpmProcessTask; -import com.budwk.app.bpm.param.BpmTaskApprovalParam; -import com.budwk.app.bpm.service.BpmService; -import com.budwk.app.sys.models.Sys_user_role; -import com.budwk.app.sys.services.SysMsgService; import com.budwk.app.web.controllers.open.commons.service.CommonService; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalSeconded; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond; import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService; -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 java.util.ArrayList; -import java.util.List; -import java.util.Map; - @IocBean(args = {"refer:dao"}) -public class ProposalSecondedServiceImpl extends BaseServiceImpl implements ProposalSecondedService { +public class ProposalSecondedServiceImpl extends BaseServiceImpl implements ProposalSecondedService { @Inject private CommonService commonService; - @Inject - private BpmService bpmService; - @Inject - private SysMsgService sysMsgService; public ProposalSecondedServiceImpl(Dao dao) { super(dao); } - @Override - @Aop(TransAop.READ_COMMITTED) - public void approval(BpmTaskApprovalParam approvalParam) { - approvalParam.getBpmTaskApprovalTypeEnum(); - // 将审批参数转换为Map - Map variables = BeanUtil.beanToMap(approvalParam); - - // 获取提案配置中的最少附议人数 - ProposalConfig proposalConfig = dao().fetch(ProposalConfig.class, Cnd.NEW()); - Integer seconderNum = proposalConfig.getSeconderNum(); - - //团长接收人 - List assignments = new ArrayList<>(); - - ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, approvalParam.getProcessInstanceBusinessId()); - BpmProcessTask processTask = dao().fetch(BpmProcessTask.class, approvalParam.getProcessInstanceTaskId()); - - //查询其他人是否附议完成 - List otherTasks = dao().query(BpmProcessTask.class, - Cnd.where(BpmProcessTask::getProcessInstanceId, "=", approvalParam.getProcessInstanceId()) - .and(BpmProcessTask::getId, "!=", approvalParam.getProcessInstanceTaskId()) - .and(BpmProcessTask::getPrevTaskId, "=", processTask.getPrevTaskId()) - .and(BpmProcessTask::getDelFlag, "=", 0)); - boolean otherTaskAllComplete = otherTasks.stream().allMatch(v -> v.getTaskStatus().equals(BpmProcessTaskStatusEnum.COMPLETE.name()) || v.getTaskStatus().equals(BpmProcessTaskStatusEnum.REVOKE.name())); - boolean finish = otherTaskAllComplete && otherTasks.size() + 1 >= seconderNum; - - variables.put("finish", finish); - - if (finish) { - //查询团长 - assignments.add(commonService.findUserLoginNameByRoleCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD, Cnd.where(Sys_user_role::getTcSessionId, "=", proposalInfo.getSessionId()).and(Sys_user_role::getTcDelegationId, "=", proposalInfo.getDelegationId()))); - } - bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), BpmTaskApprovalTypeEnum.DYNAMIC, variables, assignments); - - if (finish) { - for (String assignment : assignments) { - String template = "{}代表的提案《{}》已经完成附议,请您登陆智慧校园下的暖心工会系统进行审批,感谢您对教代会提案工作的大力支持!"; - String content = StrUtil.format(template, proposalInfo.getCreateUserName(), proposalInfo.getName()); - sysMsgService.sendMsg(assignment, "团长审核", content, proposalInfo.getCreateUserId()); - } - } - - //查询已完成任务同意的数量 -// List tasks = dao().query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", approvalParam.getProcessInstanceId()).and(BpmProcessTask::getTaskStatus, "=", BpmProcessTaskStatusEnum.COMPLETE.name()).and(BpmProcessTask::getPrevTaskId, "=", processTask.getPrevTaskId()).and(BpmProcessTask::getDelFlag, "=", 0)); -// long agreeCount = tasks.stream().filter(v -> v.getExtVariable().getStr("bpmTaskApprovalType").equals(BpmTaskApprovalTypeEnum.PASS.name())).count(); -// if (approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)) { -// agreeCount = agreeCount + 1; -// } -// -// ProposalConfig proposalConfig = dao().fetch(ProposalConfig.class, Cnd.NEW()); -// Integer seconderNum = proposalConfig.getSeconderNum(); -// variables.put("finish", agreeCount == seconderNum); -// -// if (agreeCount == seconderNum) { -// //查询团长 -// assignments.add(commonService.findUserLoginNameByRoleCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD, Cnd.where(Sys_user_role::getTcSessionId, "=", proposalInfo.getSessionId()).and(Sys_user_role::getTcDelegationId, "=", proposalInfo.getDelegationId()))); -// } -// bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), BpmTaskApprovalTypeEnum.DYNAMIC, variables, assignments); -// -// -// if (agreeCount == seconderNum) { -// for (String assignment : assignments) { -// String template = "{}代表的提案《{}》已经完成附议,请您登陆智慧校园下的暖心工会系统进行审批,感谢您对教代会提案工作的大力支持!"; -// String content = StrUtil.format(template, proposalInfo.getCreateUserName(), proposalInfo.getName()); -// sysMsgService.sendMsg(assignment, "团长审核", content, proposalInfo.getCreateUserId()); -// } -// } - - } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java index 27f7f2b8..b449b7c4 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java @@ -7,6 +7,7 @@ import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; @@ -74,12 +75,15 @@ public class TeacherCongressDelegationController { public Result pageData(@Valid @ApiParam(value = "分页表单") PageForm pageForm, @Valid @ApiParam(value = "届次ID") String sessionId) { Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); Sys_role role2 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD); + Sys_role role3 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT); + Sql sql = Sqls.create(""" SELECT tcd.*, tcs.fullName as sessionName, GROUP_CONCAT(u.username,u.loginname) as delegationHead, - GROUP_CONCAT(u2.username,u2.loginname) as viceDelegationHead + GROUP_CONCAT(u2.username,u2.loginname) as viceDelegationHead, + GROUP_CONCAT(u3.username,u3.loginname) as delegationContact FROM teacher_congress_delegation tcd LEFT JOIN teacher_congress_session tcs ON tcs.id = tcd.sessionId @@ -87,9 +91,12 @@ public class TeacherCongressDelegationController { LEFT JOIN sys_user u ON u.id = sur.userId LEFT JOIN sys_user_role sur2 ON sur2.tcDelegationId = tcd.id AND sur2.roleId = @roleId2 LEFT JOIN sys_user u2 ON u2.id = sur2.userId + LEFT JOIN sys_user_role sur3 ON sur3.tcDelegationId = tcd.id AND sur3.roleId = @roleId3 + LEFT JOIN sys_user u3 ON u3.id = sur3.userId $condition"""); sql.setParam("roleId", role.getId()); sql.setParam("roleId2", role2.getId()); + sql.setParam("roleId3", role3.getId()); Cnd cnd = Cnd.NEW(); cnd.and("tcd.sessionId", "=", sessionId); cnd.asc("tcd.code"); @@ -268,8 +275,12 @@ public class TeacherCongressDelegationController { Sys_role role = null; if (type.equals(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD.name())) { role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); - } else { + } else if (type.equals(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD.name())) { role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD); + } else if (type.equals(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT.name())) { + role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT); + } else { + throw new BaseException("参数错误"); } Record record = dao.fetch("sys_user_role", Cnd.where("tcSessionId", "=", sessionId).and("tcDelegationId", "=", delegationId).and("roleId", "=", role.getId())); @@ -298,31 +309,32 @@ public class TeacherCongressDelegationController { /** * 设置团长 * - * @param delegationId - * @param sessionId - * @param userId + * @param delegationId 代表团ID + * @param sessionId 届次ID + * @param userId 团长id + * @param viceUserId 副团长id + * @param contactUserId 联络人 * @return */ @At @SaCheckPermission("tc.delegation") @Aop(TransAop.READ_COMMITTED) - public Result insertHead(@Valid String delegationId, @Valid String sessionId, @Valid String userId, String viceUserId) { + public Result insertHead(@Valid String delegationId, @Valid String sessionId, @Valid String userId, @Valid String viceUserId, String contactUserId) { // 团长 Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); - dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId) - .and(Sys_user_role::getTcSessionId, "=", sessionId) - .and(Sys_user_role::getRoleId, "=", role.getId()) - ); + dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId).and(Sys_user_role::getTcSessionId, "=", sessionId).and(Sys_user_role::getRoleId, "=", role.getId())); dao.insert("sys_user_role", Chain.make("userId", userId).add("roleId", role.getId()).add("tcDelegationId", delegationId).add("tcSessionId", sessionId)); // 副团长 Sys_role role2 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD); - dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId) - .and(Sys_user_role::getTcSessionId, "=", sessionId) - .and(Sys_user_role::getRoleId, "=", role2.getId()) - ); + dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId).and(Sys_user_role::getTcSessionId, "=", sessionId).and(Sys_user_role::getRoleId, "=", role2.getId())); dao.insert("sys_user_role", Chain.make("userId", viceUserId).add("roleId", role2.getId()).add("tcDelegationId", delegationId).add("tcSessionId", sessionId)); + // 联络人 + Sys_role role3 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT); + dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId).and(Sys_user_role::getTcSessionId, "=", sessionId).and(Sys_user_role::getRoleId, "=", role3.getId())); + dao.insert("sys_user_role", Chain.make("userId", contactUserId).add("roleId", role3.getId()).add("tcDelegationId", delegationId).add("tcSessionId", sessionId)); + sysUserService.clearCache(); return Result.success(); } @@ -340,11 +352,7 @@ public class TeacherCongressDelegationController { public Result deleteHead(@Valid String delegationId, @Valid String sessionId, @Valid String userId) { Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); //先删除角色 - dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId) - .and(Sys_user_role::getTcSessionId, "=", sessionId) - .and(Sys_user_role::getRoleId, "=", role.getId()) - .and(Sys_user_role::getUserId, "=", userId) - ); + dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId).and(Sys_user_role::getTcSessionId, "=", sessionId).and(Sys_user_role::getRoleId, "=", role.getId()).and(Sys_user_role::getUserId, "=", userId)); sysUserService.clearCache(); return Result.success(); } diff --git a/src/main/resources/views/layouts/v4/home.html b/src/main/resources/views/layouts/v4/home.html index ec359bec..b8a6a8f2 100644 --- a/src/main/resources/views/layouts/v4/home.html +++ b/src/main/resources/views/layouts/v4/home.html @@ -12,8 +12,9 @@ layout("/layouts/v4/baseLayout.html"){ .oa-main-content { margin: 0 auto; padding-bottom: 20px; - background: url(/assets/platform/img/v4/home-bg.png); + /*background: url(/assets/platform/img/v4/home-bg.png);*/ background-size: cover; + background: #ffffff; } /* 背景图和搜索统计区域容器 */ @@ -319,7 +320,7 @@ layout("/layouts/v4/baseLayout.html"){ /* 右侧活动列表 */ .oa-activity-content { /*padding: 20px;*/ - background: #ffffff; + /*background: #ffffff;*/ max-height: 410px; display: flex; flex-direction: column; @@ -482,7 +483,7 @@ layout("/layouts/v4/baseLayout.html"){ /* box2 - 系统通知公告 */ .oa-box-2-section { display: grid; - grid-template-columns: 1fr 400px; + grid-template-columns: 1fr 450px; gap: 30px; border-radius: 6px; width: 1500px; @@ -491,7 +492,7 @@ layout("/layouts/v4/baseLayout.html"){ } .oa-box-2-section-act { - background: #ffffff; + /*background: #ffffff;*/ } @@ -500,7 +501,7 @@ layout("/layouts/v4/baseLayout.html"){ justify-content: space-between; align-items: center; padding: 20px; - background: #ffffff; + /*background: #ffffff;*/ color: #000; } @@ -537,6 +538,49 @@ layout("/layouts/v4/baseLayout.html"){ flex-shrink: 0; } + /* 工会活动独立样式 */ + .oa-activity-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px; + /*background: #ffffff;*/ + color: #000; + } + + .oa-activity-header-content { + display: flex; + align-items: center; + gap: 12px; + position: relative; + } + + .oa-activity-header-content::after { + content: ''; + position: absolute; + bottom: -10px; + left: 0; + right: 0; + height: 2px; + background-color: var(--color-primary); + } + + .oa-activity-header-icon { + font-size: 24px; + color: var(--color-primary); + } + + .oa-activity-header-title { + font-size: 20px; + font-weight: 600; + margin: 0; + color: var(--color-primary); + } + + .oa-activity-header-more { + flex-shrink: 0; + } + .oa-header-more-btn { background: transparent; border: none; @@ -568,7 +612,7 @@ layout("/layouts/v4/baseLayout.html"){ .oa-notice-content { padding: 20px; - background: #ffffff; + /*background: #ffffff;*/ max-height: 400px; overflow-y: auto; scrollbar-width: none; /* Firefox */ @@ -588,7 +632,7 @@ layout("/layouts/v4/baseLayout.html"){ display: flex; align-items: flex-start; padding: 15px 20px; - background: #ffffff; + /*background: #ffffff;*/ border-bottom: 1px solid #e8e8e8; transition: all 0.2s ease; cursor: pointer; @@ -625,7 +669,76 @@ layout("/layouts/v4/baseLayout.html"){ border-radius: 6px; } - .oa-notice-item-content { + .oa-notice-item-desc { + font-size: 14px; + color: #666; + line-height: 1.5; + margin-bottom: 8px; + display: flex; + align-items: center; + } + + /* 工会活动 */ + .oa-activity-content { + padding: 20px; + /*background: #ffffff;*/ + max-height: 400px; + overflow-y: auto; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + } + + .oa-activity-content::-webkit-scrollbar { + display: none; /* Chrome, Safari and Opera */ + } + + .oa-activity-list { + display: grid; + gap: 15px; + } + + .oa-activity-item { + display: flex; + align-items: flex-start; + padding: 15px 20px; + /*background: #ffffff;*/ + border-bottom: 1px solid #e8e8e8; + transition: all 0.2s ease; + cursor: pointer; + } + + .oa-activity-item:hover { + background: #f5f5f5; + } + + .oa-activity-item:last-child { + border-bottom: none; + } + + .oa-activity-item-icon { + width: 16px; + height: 16px; + color: #666; + margin-right: 12px; + margin-top: 2px; + flex-shrink: 0; + } + + .oa-activity-item-img { + width: 300px; + height: 150px; + flex-shrink: 0; + margin-right: 12px; + } + + .oa-activity-item-img img { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 6px; + } + + .oa-activity-item-content { flex: 1; min-width: 0; height: 150px; @@ -635,7 +748,7 @@ layout("/layouts/v4/baseLayout.html"){ /*padding: 10px 0;*/ } - .oa-notice-item-title { + .oa-activity-item-title { font-size: 16px; font-weight: 500; color: #333; @@ -647,7 +760,7 @@ layout("/layouts/v4/baseLayout.html"){ overflow: hidden; } - .oa-notice-item-desc { + .oa-activity-item-desc { font-size: 14px; color: #666; line-height: 1.5; @@ -657,6 +770,23 @@ layout("/layouts/v4/baseLayout.html"){ gap: 8px; } + .oa-activity-item-desc i { + /*color: var(--color-primary);*/ + font-size: 14px; + flex-shrink: 0; + } + + .oa-activity-item-detail { + margin-top: auto; + } + + .oa-activity-item-date { + margin-left: 15px; + flex-shrink: 0; + white-space: nowrap; + font-size: 16px; + } + .oa-notice-item-desc i { /*color: var(--color-primary);*/ font-size: 14px; @@ -687,17 +817,544 @@ layout("/layouts/v4/baseLayout.html"){ transform: translateX(2px); } + /* 扩展工会活动样式 */ + .oa-extended-activities-wrapper { + width: 100%; + background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); + padding: 60px 0; + margin: 40px 0; + } + + .oa-extended-activities-section { + max-width: 1500px; + margin: 0 auto; + padding: 0 20px; + } + + .oa-extended-activities-header { + text-align: center; + margin-bottom: 50px; + } + + .oa-extended-activities-header-content { + display: inline-block; + } + + .oa-extended-activities-header-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 60px; + height: 60px; + background: var(--color-primary); + border-radius: 50%; + margin: 0 auto 20px; + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); + } + + .oa-extended-activities-header-icon i { + font-size: 28px; + color: white; + } + + .oa-extended-activities-header-title { + font-size: 36px; + font-weight: 700; + color: #2c3e50; + margin: 0 0 10px 0; + letter-spacing: 1px; + } + + .oa-extended-activities-header-subtitle { + font-size: 16px; + color: #7f8c8d; + margin: 0; + font-weight: 400; + } + + .oa-extended-activities-content { + position: relative; + } + + .oa-extended-activities-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + gap: 30px; + padding: 20px 0; + } + + .oa-extended-activity-card { + background: white; + border-radius: 16px; + overflow: hidden; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + cursor: pointer; + position: relative; + } + + .oa-extended-activity-card:hover { + transform: translateY(-8px); + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15); + } + + .oa-extended-activity-card-image { + position: relative; + height: 200px; + overflow: hidden; + } + + .oa-extended-activity-card-image img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.3s ease; + } + + .oa-extended-activity-card:hover .oa-extended-activity-card-image img { + transform: scale(1.05); + } + + .oa-extended-activity-card-overlay { + position: absolute; + top: 15px; + right: 15px; + } + + .oa-extended-activity-card-status { + padding: 6px 12px; + border-radius: 20px; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + } + + .oa-extended-activity-card-status.active { + background: #27ae60; + color: white; + } + + .oa-extended-activity-card-status.upcoming { + background: #f39c12; + color: white; + } + + .oa-extended-activity-card-status.ended { + background: #95a5a6; + color: white; + } + + .oa-extended-activity-card-content { + padding: 25px; + } + + .oa-extended-activity-card-title { + font-size: 20px; + font-weight: 600; + color: #2c3e50; + margin: 0 0 15px 0; + line-height: 1.3; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + } + + .oa-extended-activity-card-meta { + display: flex; + flex-direction: column; + gap: 8px; + margin-bottom: 15px; + } + + .oa-extended-activity-card-date, + .oa-extended-activity-card-location { + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + color: #7f8c8d; + } + + .oa-extended-activity-card-date i, + .oa-extended-activity-card-location i { + color: var(--color-primary); + width: 16px; + } + + .oa-extended-activity-card-description { + font-size: 14px; + color: #7f8c8d; + line-height: 1.5; + margin: 0 0 20px 0; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + } + + .oa-extended-activity-card-footer { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 15px; + border-top: 1px solid #ecf0f1; + } + + .oa-extended-activity-card-participants { + display: flex; + align-items: center; + gap: 6px; + font-size: 14px; + color: #7f8c8d; + } + + .oa-extended-activity-card-participants i { + color: var(--color-primary); + } + + .oa-extended-activity-card-btn { + background: var(--color-primary); + color: white; + border: none; + padding: 8px 16px; + border-radius: 20px; + font-size: 12px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + gap: 6px; + } + + .oa-extended-activity-card-btn:hover { + background: #2980b9; + transform: translateY(-1px); + } + + .oa-extended-activities-empty { + text-align: center; + padding: 60px 20px; + } + + .oa-extended-activities-empty-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 80px; + height: 80px; + background: #ecf0f1; + border-radius: 50%; + margin: 0 auto 20px; + } + + .oa-extended-activities-empty-icon i { + font-size: 36px; + color: #bdc3c7; + } + + .oa-extended-activities-empty-title { + font-size: 24px; + font-weight: 600; + color: #7f8c8d; + margin: 0 0 10px 0; + } + + .oa-extended-activities-empty-desc { + font-size: 16px; + color: #95a5a6; + line-height: 1.5; + margin: 0; + } + + /* 响应式设计 */ + @media (max-width: 768px) { + .oa-extended-activities-wrapper { + padding: 40px 0; + margin: 20px 0; + } + + .oa-extended-activities-section { + padding: 0 15px; + } + + .oa-extended-activities-header-title { + font-size: 28px; + } + + .oa-extended-activities-grid { + grid-template-columns: 1fr; + gap: 20px; + } + + .oa-extended-activity-card-content { + padding: 20px; + } + + .oa-extended-activity-card-footer { + flex-direction: column; + gap: 15px; + align-items: stretch; + } + + .oa-extended-activity-card-btn { + justify-content: center; + } + } + + @media (max-width: 480px) { + .oa-extended-activities-header-title { + font-size: 24px; + } + + .oa-extended-activity-card-image { + height: 160px; + } + + .oa-extended-activity-card-content { + padding: 15px; + } + } + .oa-notice-item-date { - margin-left: 15px; flex-shrink: 0; white-space: nowrap; font-size: 16px; } + /* 工会网站新闻样式 */ + .oa-box-3-section { + width: 1500px; + margin: 30px auto 0; + } + + .oa-box-3-news-notices { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + margin-bottom: 20px; + } + + .oa-grassroots-wrapper { + width: 100%; + background-image: url('https://cdgh.ncu.edu.cn/images/index_bg2.png'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + } + + .oa-box-3-grassroots { + display: grid; + grid-template-columns: 1fr; + } + + .oa-grassroots-list { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 20px; + } + + .oa-grassroots-item { + display: flex; + flex-direction: column; + padding: 16px; + /*background: #ffffff;*/ + border: none; + /*border-radius: 8px;*/ + border-bottom: 3px solid transparent; + transition: all 0.3s ease; + cursor: pointer; + height: auto; + } + + .oa-grassroots-item:hover { + background: #ffffff; + border-bottom-color: var(--color-primary); + transform: translateY(-4px); + box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15); + } + + .oa-grassroots-item-date { + font-size: 20px; + /*color: var(--color-primary);*/ + font-weight: bold; + white-space: nowrap; + text-align: left; + margin-bottom: 8px; + transition: opacity 0.3s ease; + } + + .oa-grassroots-item-title { + font-size: 16px; + font-weight: 600; + /*color: var(--color-primary);*/ + margin-bottom: 12px; + line-height: 1.4; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + height: 44.8px; + } + + .oa-grassroots-item-image { + width: 100%; + height: 180px; + margin: 0 0 16px 0; + border-radius: 8px; + overflow: hidden; + background: #f5f5f5; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + transition: transform 0.3s ease; + } + + .oa-grassroots-item-image img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.3s ease; + } + + .oa-grassroots-item-image-placeholder { + color: #ccc; + font-size: 24px; + } + + .oa-grassroots-item-summary { + font-size: 14px; + color: #666; + line-height: 1.6; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + text-align: justify; + margin-bottom: 12px; + } + + .oa-news-section, + .oa-notices-section, + .oa-grassroots-section { + /*background: #ffffff;*/ + border-radius: 8px; + overflow: hidden; + } + + .oa-grassroots-section { + width: 1500px; + margin: 0 auto; + } + + + .oa-news-content, + .oa-notices-content { + padding: 20px; + /*background: #ffffff;*/ + /*max-height: 400px;*/ + /*overflow-y: auto;*/ + /*scrollbar-width: none;*/ + /*-ms-overflow-style: none;*/ + } + + .oa-grassroots-content { + padding: 20px; + /*background: #ffffff;*/ + min-height: 500px; + } + + .oa-news-content::-webkit-scrollbar, + .oa-notices-content::-webkit-scrollbar { + display: none; + } + + .oa-news-list, .oa-notices-list { + display: flex; + flex-direction: column; + gap: 12px; + } + + .oa-news-item, + .oa-notice-item { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 12px 16px; + /*background: #ffffff;*/ + border-bottom: 1px solid #e8e8e8; + transition: all 0.2s ease; + cursor: pointer; + } + + .oa-news-item:hover, .oa-notice-item:hover { + background: #f5f5f5; + transform: translateX(5px); + } + + .oa-news-item:hover .oa-news-item-title, + .oa-notice-item:hover .oa-notice-item-title { + color: var(--color-primary); + text-decoration: underline; + text-decoration-color: var(--color-primary); + } + + .oa-news-item:hover .oa-news-item-date, + .oa-notice-item:hover .oa-notice-item-date { + color: var(--color-primary); + } + + .oa-news-item:last-child, + .oa-notice-item:last-child { + border-bottom: none; + } + + .oa-news-item-content, + .oa-notice-item-content { + flex: 1; + min-width: 0; + } + + .oa-news-item-title, + .oa-notice-item-title { + font-size: 14px; + font-weight: 500; + color: #333; + margin-bottom: 6px; + line-height: 1.4; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .oa-news-item-date, + .oa-notice-item-date { + font-size: 14px; + color: #999; + white-space: nowrap; + font-weight: bold; + } + + .oa-news-item-arrow, + .oa-notice-item-arrow { + margin-left: 12px; + flex-shrink: 0; + color: #ccc; + font-size: 14px; + } + + .oa-news-item:hover .oa-news-item-arrow, + .oa-notice-item:hover .oa-notice-item-arrow { + color: var(--color-primary); + } + /*推荐服务*/ .oa-box-2-section-recommend { padding: 20px; - background: #ffffff; + /*background: #ffffff;*/ } .oa-recommend-tabs { @@ -767,16 +1424,19 @@ layout("/layouts/v4/baseLayout.html"){ align-items: center; text-align: center; padding: 20px 16px; - background: #f8f9fa; + /* background: #f8f9fa; */ border-radius: 8px; transition: all 0.2s ease; cursor: pointer; + min-height: 120px; + width: 100%; + box-sizing: border-box; + min-width: 0; } .oa-recommend-item:hover { background: #e9ecef; transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .oa-recommend-item-icon { @@ -798,6 +1458,8 @@ layout("/layouts/v4/baseLayout.html"){ .oa-recommend-item-info { flex: 1; + width: 100%; + min-width: 0; } .oa-recommend-item-info h4 { @@ -805,13 +1467,10 @@ layout("/layouts/v4/baseLayout.html"){ font-size: 16px; font-weight: 500; color: #333; - } - - .oa-recommend-item-info p { - margin: 0; - font-size: 14px; - color: #666; - line-height: 1.4; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; } /* 空数据提示样式 */ @@ -950,7 +1609,7 @@ layout("/layouts/v4/baseLayout.html"){ - 个人主页 + 个人中心 @@ -995,59 +1654,59 @@ layout("/layouts/v4/baseLayout.html"){ - +
-
-
-
+
+
+
-

工会活动

+

工会活动

-
+
-
-
-
+
+
- -
+
-
-
{{ notice.name }}
-
+
+
{{ notice.name }}
+
开始时间:{{ formatDate(notice.startDate) }}
-
+
结束时间:{{ formatDate(notice.endDate) }}
-
+
立即前往
- +
-
暂无通知公告
-
当前没有可显示的通知公告内容
请稍后再来查看
+
暂无工会活动
+
当前没有可显示的工会活动内容
请稍后再来查看
@@ -1068,13 +1727,22 @@ layout("/layouts/v4/baseLayout.html"){ 推荐应用 +
-
+
- +
@@ -1088,14 +1756,17 @@ layout("/layouts/v4/baseLayout.html"){
暂无推荐服务
-
当前没有可用的推荐服务
请联系管理员添加服务内容
+
当前没有可用的推荐服务
请联系管理员添加服务内容 +
-
+
- +
@@ -1109,13 +1780,222 @@ layout("/layouts/v4/baseLayout.html"){
暂无推荐应用
-
当前没有可用的推荐应用
请联系管理员添加应用内容
+
当前没有可用的推荐应用
请联系管理员添加应用内容 +
+
+
+
+
+
+
+ + + +
+
+

{{ item.name }}

+
+
+
+
+
+ +
+
暂无收藏内容
+
您还没有收藏任何内容
快去收藏您喜欢的服务和应用吧 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+
+ +
+

新闻动态

+
+
+
+
+
+
+
{{ news.date }}
+
{{ news.title }}
+
+
+ +
+
+
+
+
+ +
+
暂无新闻动态
+
当前没有可用的新闻内容
+
+
+
+ + +
+
+
+
+ +
+

通知公告

+
+
+
+
+
+
+
{{ notice.date }}
+
{{ notice.title }}
+
+
+ +
+
+
+
+
+ +
+
暂无通知公告
+
当前没有可用的通知内容
+
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+

基层动态

+
+
+
+
+
+
{{ item.date }}
+
{{ item.title }}
+
+ +
+ +
+
+
{{ item.summary }}
+
+
+
+
+ +
+
暂无基层动态
+
当前没有可用的基层动态内容
+
+
+
+
+
+
@@ -1137,131 +2017,15 @@ layout("/layouts/v4/baseLayout.html"){ }, activityList: [], noticeList: [], - recommendServices: [ - { - id: 1, - name: "人事服务", - description: "员工信息管理、考勤统计、薪资查询", - icon: "fa fa-users", - picIcon: "/static/assets/platform/images/service-hr.png" - }, - { - id: 2, - name: "财务服务", - description: "报销申请、费用审批、财务报表", - icon: "fa fa-calculator" - }, - { - id: 3, - name: "IT服务", - description: "设备申请、故障报修、系统支持", - icon: "fa fa-laptop", - picIcon: "/static/assets/platform/images/service-it.png" - }, - { - id: 4, - name: "行政服务", - description: "会议室预订、办公用品申请、车辆管理", - icon: "fa fa-building" - }, - { - id: 5, - name: "培训服务", - description: "员工培训、技能提升、证书管理", - icon: "fa fa-graduation-cap" - }, - { - id: 6, - name: "法务服务", - description: "合同审核、法律咨询、风险评估", - icon: "fa fa-gavel" - }, - { - id: 7, - name: "采购服务", - description: "供应商管理、采购申请、合同管理", - icon: "fa fa-shopping-cart" - }, - { - id: 8, - name: "质量服务", - description: "质量检测、标准制定、改进建议", - icon: "fa fa-check-circle" - }, - { - id: 9, - name: "安全服务", - description: "安全培训、风险评估、应急预案" - }, - { - id: 10, - name: "客服服务", - description: "客户咨询、投诉处理、满意度调查", - icon: "fa fa-headphones" - } - ], - recommendApps: [ - { - id: 1, - name: "移动办公", - description: "随时随地处理工作事务", - icon: "fa fa-mobile", - picIcon: "/static/assets/platform/images/app-mobile.png" - }, - { - id: 2, - name: "项目管理", - description: "高效协作,项目进度一目了然", - icon: "fa fa-tasks" - }, - { - id: 3, - name: "文档中心", - description: "企业知识库,文档共享平台", - picIcon: "/static/assets/platform/images/app-docs.png" - }, - { - id: 4, - name: "视频会议", - description: "高清视频通话,远程协作无障碍", - icon: "fa fa-video-camera" - }, - { - id: 5, - name: "邮件系统", - description: "企业邮箱,高效沟通协作", - icon: "fa fa-envelope" - }, - { - id: 6, - name: "考勤打卡", - description: "智能考勤,工时统计管理" - }, - { - id: 7, - name: "报销系统", - description: "便捷报销,财务审批流程", - icon: "fa fa-credit-card" - }, - { - id: 8, - name: "通讯录", - description: "企业通讯录,联系人管理", - icon: "fa fa-address-book" - }, - { - id: 9, - name: "日程管理", - description: "日程安排,时间管理助手", - icon: "fa fa-calendar" - }, - { - id: 10, - name: "数据分析", - description: "数据可视化,业务分析报表", - icon: "fa fa-bar-chart" - } - ] + recommendServices: [], + favoriteItems: [], + recommendApps: [], + + // 工会网站新闻 + websiteNews: {}, + + // 扩展工会活动数据 + extendedActivities: [] } }, computed: { @@ -1287,6 +2051,8 @@ layout("/layouts/v4/baseLayout.html"){ this.getStatistics() this.getRecommendService() this.getRecommendApp() + this.getFavorite() + this.getWebSiteNews() }, methods: { performSearch() { @@ -1361,8 +2127,6 @@ layout("/layouts/v4/baseLayout.html"){ // 查询推荐服务 async getRecommendService() { - - this.$axios.post('/platform/home/listRecommendService', {platform: "PC"}).then(res => { if (res.code === 0) { this.recommendServices = res.data @@ -1379,9 +2143,19 @@ layout("/layouts/v4/baseLayout.html"){ }) }, + // 获取我的收藏 + async getFavorite() { + this.$axios.post('/platform/home/listFavorite', {platform: "PC"}).then(res => { + if (res.code === 0) { + this.favoriteItems = res.data + } + }) + }, + + // 推荐服务点击事件 openService(service) { - window.open(service.href) + window.open(service.href, "_blank") }, // 推荐应用点击事件 @@ -1390,6 +2164,76 @@ layout("/layouts/v4/baseLayout.html"){ window.sessionStorage.setItem("zhgh_sub_app", JSON.stringify(app)) // 新标签页打开 window.open("/platform/v4/subApp?appId=" + app.id, "_blank") + }, + + // 收藏项目点击事件 + openFavorite(item) { + if (item.href) { + this.openService(item) + } else if (!item.parentId) { + this.openApp(item) + } + }, + + // 获取工会网站新闻 + getWebSiteNews() { + this.$axios.post('/platform/home/getNews').then(res => { + if (res.code === 0) { + this.websiteNews = res.data + } + }) + }, + + // 打开新闻/通知/基层动态 + openNews(item) { + if (item.url) { + // 如果是相对路径,添加基础URL + const baseUrl = 'https://gh.ncu.edu.cn/' + const fullUrl = item.url.startsWith('http') ? item.url : baseUrl + item.url + window.open(fullUrl, '_blank') + } + }, + + // 获取活动状态样式类 + getActivityStatus(activity) { + const now = new Date() + const startDate = new Date(activity.startDate) + const endDate = new Date(activity.endDate) + + if (now < startDate) { + return 'upcoming' + } else if (now >= startDate && now <= endDate) { + return 'active' + } else { + return 'ended' + } + }, + + // 获取活动状态文本 + getActivityStatusText(activity) { + const status = this.getActivityStatus(activity) + switch (status) { + case 'upcoming': + return '即将开始' + case 'active': + return '进行中' + case 'ended': + return '已结束' + default: + return '未知' + } + }, + + // 查看扩展活动详情 + viewExtendedActivity(activity) { + // 复用现有的活动查看逻辑 + this.viewNotice(activity) + }, + + // 参与活动 + joinActivity(activity) { + // 复用现有的活动参与逻辑 + this.openActivity(activity) } } diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/common/info.js b/src/main/resources/views/platform/zhgh/democratic/proposal/common/info.js index b98b9212..6b6ebc05 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/common/info.js +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/common/info.js @@ -79,46 +79,76 @@ const PROPOSAL_INFO = { @@ -111,7 +111,8 @@ layout("/layouts/platform.html"){ this.showApprovalForm = true this.formData = { processTaskId: row.taskId, - taskName: row.curTaskName + taskName: row.curTaskName, + tf_opinion: "同意该提案" } this.$refs.proposalInfoRef.onOpen(row) }) diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/unitReply/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/unitReply/index.html index 75bc8c76..58cf5b91 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/unitReply/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/unitReply/index.html @@ -2,12 +2,62 @@ layout("/layouts/platform.html"){ #--> + +
- @@ -57,25 +107,40 @@ layout("/layouts/platform.html"){ - - + + + + - + + + + + + @@ -88,14 +153,16 @@ layout("/layouts/platform.html"){
{{formData.taskName}}
- + - + - {{item.label}} + + {{item.label}} + + v-if="supportCandidate && formData.underTakeIsMaster"> @@ -119,6 +186,49 @@ layout("/layouts/platform.html"){
+ + + +
+
+
+ + {{ transferForm.code }} +
+
+ + {{ transferForm.name }} +
+
+ + {{ transferForm.delegationName }} +
+
+
+ + + + + + + + + + 取消 + 提交 + +
+