From bf0bcfa2d01658741d4afac7f21938bcae337b81 Mon Sep 17 00:00:00 2001 From: Yo Vinchen <2982554722@qq.com> Date: Sun, 25 Jun 2023 18:23:08 +0800 Subject: [PATCH] Initial commit --- .../auth/controller/SysUserController.java | 14 ++ .../atguigu/auth/service/SysUserService.java | 9 + .../auth/service/impl/SysUserServiceImpl.java | 18 ++ .../controller/api/ProcessController.java | 46 +++++ .../process/service/OaProcessService.java | 24 +++ .../service/impl/OaProcessServiceImpl.java | 175 +++++++++++++++++- .../test/java/com/atguigu/code/CodeGet.java | 6 +- 7 files changed, 287 insertions(+), 5 deletions(-) diff --git a/service-oa/src/main/java/com/atguigu/auth/controller/SysUserController.java b/service-oa/src/main/java/com/atguigu/auth/controller/SysUserController.java index 614829d..23a7ecc 100644 --- a/service-oa/src/main/java/com/atguigu/auth/controller/SysUserController.java +++ b/service-oa/src/main/java/com/atguigu/auth/controller/SysUserController.java @@ -15,6 +15,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import java.util.Map; + /** *

* 用户表 前端控制器 @@ -25,6 +27,7 @@ import org.springframework.web.bind.annotation.*; */ @Api(tags = "用户管理接口") @RestController +@CrossOrigin @RequestMapping("/admin/system/sysUser") public class SysUserController { @@ -139,5 +142,16 @@ public class SysUserController { sysUserService.removeById(id); return Result.ok(); } + + /** + * 获取当前用户 + * + * @return + */ + @GetMapping("getCurrentUser") + public Result getCurrentUser() { + Map map = sysUserService.getCurrentUser(); + return Result.ok(map); + } } diff --git a/service-oa/src/main/java/com/atguigu/auth/service/SysUserService.java b/service-oa/src/main/java/com/atguigu/auth/service/SysUserService.java index 6647ab9..dddeec6 100644 --- a/service-oa/src/main/java/com/atguigu/auth/service/SysUserService.java +++ b/service-oa/src/main/java/com/atguigu/auth/service/SysUserService.java @@ -3,6 +3,8 @@ package com.atguigu.auth.service; import com.atguigu.model.system.SysUser; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.Map; + /** *

* 用户表 服务类 @@ -28,4 +30,11 @@ public interface SysUserService extends IService { * @return */ SysUser getUserByUsername(String username); + + /** + * 获取当前用户 + * + * @return + */ + Map getCurrentUser(); } diff --git a/service-oa/src/main/java/com/atguigu/auth/service/impl/SysUserServiceImpl.java b/service-oa/src/main/java/com/atguigu/auth/service/impl/SysUserServiceImpl.java index 46cf4c5..19e9388 100644 --- a/service-oa/src/main/java/com/atguigu/auth/service/impl/SysUserServiceImpl.java +++ b/service-oa/src/main/java/com/atguigu/auth/service/impl/SysUserServiceImpl.java @@ -3,11 +3,15 @@ package com.atguigu.auth.service.impl; import com.atguigu.auth.mapper.SysUserMapper; import com.atguigu.auth.service.SysUserService; import com.atguigu.model.system.SysUser; +import com.atguigu.security.custom.LoginUserInfoHelper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; +import java.util.Map; + /** *

* 用户表 服务实现类 @@ -49,4 +53,18 @@ public class SysUserServiceImpl extends ServiceImpl impl public SysUser getUserByUsername(String username) { return baseMapper.selectOne(new LambdaQueryWrapper().eq(SysUser::getUsername, username)); } + + /** + * 获取当前用户 + * + * @return + */ + @Override + public Map getCurrentUser() { + SysUser sysUser = baseMapper.selectById(LoginUserInfoHelper.getUserId()); + HashMap map = new HashMap<>(); + map.put("name", sysUser.getName()); + map.put("phone", sysUser.getPhone()); + return map; + } } diff --git a/service-oa/src/main/java/com/atguigu/process/controller/api/ProcessController.java b/service-oa/src/main/java/com/atguigu/process/controller/api/ProcessController.java index e456036..c37b949 100644 --- a/service-oa/src/main/java/com/atguigu/process/controller/api/ProcessController.java +++ b/service-oa/src/main/java/com/atguigu/process/controller/api/ProcessController.java @@ -1,5 +1,6 @@ package com.atguigu.process.controller.api; +import com.atguigu.auth.service.SysUserService; import com.atguigu.common.result.Result; import com.atguigu.model.process.Process; import com.atguigu.model.process.ProcessTemplate; @@ -7,6 +8,7 @@ import com.atguigu.model.process.ProcessType; import com.atguigu.process.service.OaProcessService; import com.atguigu.process.service.OaProcessTemplateService; import com.atguigu.process.service.OaProcessTypeService; +import com.atguigu.vo.process.ApprovalVo; import com.atguigu.vo.process.ProcessFormVo; import com.atguigu.vo.process.ProcessVo; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -37,12 +39,15 @@ public class ProcessController { @Autowired private OaProcessTypeService oaProcessTypeService; + @Autowired private OaProcessTemplateService oaProcessTemplateService; + @Autowired private OaProcessService oaProcessService; + @ApiOperation(value = "待处理") @GetMapping("/findPending/{page}/{limit}") public Result findPending(@ApiParam(name = "page", value = "当前页码", required = true) @PathVariable Long page, @@ -103,5 +108,46 @@ public class ProcessController { return Result.ok(map); } + /** + * 审批 + * + * @param approvalVo + * @return + */ + @ApiOperation(value = "审批") + @PostMapping("approve") + public Result approve(@RequestBody ApprovalVo approvalVo) { + oaProcessService.approve(approvalVo); + return Result.ok(); + } + /** + * 分页查询已处理 + * + * @param page + * @param limit + * @return + */ + @ApiOperation(value = "已处理") + @GetMapping("/findProcessed/{page}/{limit}") + public Result findProcessed(@ApiParam(name = "page", value = "当前页码", required = true) @PathVariable Long page, @ApiParam(name = "limit", value = "每页记录数", required = true) @PathVariable Long limit) { + Page pageParam = new Page<>(page, limit); + IPage pageModel = oaProcessService.findProcessed(pageParam); + return Result.ok(pageModel); + } + + /** + * 分页查询已发起 + * + * @param page + * @param limit + * @return + */ + @ApiOperation(value = "已发起") + @GetMapping("/findStarted/{page}/{limit}") + public Result findStarted(@ApiParam(name = "page", value = "当前页码", required = true) @PathVariable Long page, @ApiParam(name = "limit", value = "每页记录数", required = true) @PathVariable Long limit) { + Page pageParam = new Page<>(page, limit); + IPage pageModel = oaProcessService.findStarted(pageParam); + return Result.ok(pageModel); + } } diff --git a/service-oa/src/main/java/com/atguigu/process/service/OaProcessService.java b/service-oa/src/main/java/com/atguigu/process/service/OaProcessService.java index 366c2cb..b8e6b4c 100644 --- a/service-oa/src/main/java/com/atguigu/process/service/OaProcessService.java +++ b/service-oa/src/main/java/com/atguigu/process/service/OaProcessService.java @@ -1,6 +1,7 @@ package com.atguigu.process.service; import com.atguigu.model.process.Process; +import com.atguigu.vo.process.ApprovalVo; import com.atguigu.vo.process.ProcessFormVo; import com.atguigu.vo.process.ProcessQueryVo; import com.atguigu.vo.process.ProcessVo; @@ -56,4 +57,27 @@ public interface OaProcessService extends IService { * @return */ Map show(Long id); + + /** + * 审批 + * + * @param approvalVo + */ + void approve(ApprovalVo approvalVo); + + /** + * 分页查询已处理 + * + * @param pageParam + * @return + */ + IPage findProcessed(Page pageParam); + + /** + * 分页查询已发起 + * + * @param pageParam + * @return + */ + IPage findStarted(Page pageParam); } diff --git a/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessServiceImpl.java b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessServiceImpl.java index da84fab..818500b 100644 --- a/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessServiceImpl.java +++ b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessServiceImpl.java @@ -12,6 +12,7 @@ import com.atguigu.process.service.OaProcessRecordService; import com.atguigu.process.service.OaProcessService; import com.atguigu.process.service.OaProcessTemplateService; import com.atguigu.security.custom.LoginUserInfoHelper; +import com.atguigu.vo.process.ApprovalVo; import com.atguigu.vo.process.ProcessFormVo; import com.atguigu.vo.process.ProcessQueryVo; import com.atguigu.vo.process.ProcessVo; @@ -19,10 +20,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.activiti.bpmn.model.BpmnModel; +import org.activiti.bpmn.model.EndEvent; +import org.activiti.bpmn.model.FlowNode; +import org.activiti.bpmn.model.SequenceFlow; import org.activiti.engine.HistoryService; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.history.HistoricTaskInstanceQuery; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; @@ -31,6 +38,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.io.*; import java.net.URL; @@ -236,7 +244,7 @@ public class OaProcessServiceImpl extends ServiceImpl //2 根据流程id获取流程记录信息 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(ProcessRecord::getProcessId,id); + wrapper.eq(ProcessRecord::getProcessId, id); List processRecordList = oaProcessRecordService.list(wrapper); //3 根据模板id查询模板信息 @@ -246,16 +254,16 @@ public class OaProcessServiceImpl extends ServiceImpl //可以看到信息不一定能审批,不能重复审批 boolean isApprove = false; List taskList = this.getCurrentTaskList(process.getProcessInstanceId()); - for(Task task : taskList) { + for (Task task : taskList) { //判断任务审批人是否是当前用户 String username = LoginUserInfoHelper.getUsername(); - if(task.getAssignee().equals(username)) { + if (task.getAssignee().equals(username)) { isApprove = true; } } //5 查询数据封装到map集合,返回 - Map map = new HashMap<>(); + Map map = new HashMap<>(); map.put("process", process); map.put("processRecordList", processRecordList); map.put("processTemplate", processTemplate); @@ -263,6 +271,165 @@ public class OaProcessServiceImpl extends ServiceImpl return map; } + /** + * 审批 + * + * @param approvalVo + */ + @Override + public void approve(ApprovalVo approvalVo) { + //1 从approvalVo获取任务id,根据任务id获取流程变量 + String taskId = approvalVo.getTaskId(); + Map variables = taskService.getVariables(taskId); + for (Map.Entry entry : variables.entrySet()) { + System.out.println(entry.getKey()); + System.out.println(entry.getValue()); + } + + //2 判断审批状态值 + if (approvalVo.getStatus() == 1) { + //2.1 状态值 =1 审批通过 + Map variable = new HashMap<>(); + taskService.complete(taskId, variable); + } else { + //2.2 状态值 = -1 驳回,流程直接结束 + this.endTask(taskId); + } + + //3 记录审批相关过程信息 oa_process_record + String description = approvalVo.getStatus().intValue() == 1 ? "已通过" : "驳回"; + oaProcessRecordService.record(approvalVo.getProcessId(), approvalVo.getStatus(), description); + + //4 查询下一个审批人,更新流程表记录 process表记录 + Process process = baseMapper.selectById(approvalVo.getProcessId()); + //查询任务 + List taskList = this.getCurrentTaskList(process.getProcessInstanceId()); + if (!CollectionUtils.isEmpty(taskList)) { + List assignList = new ArrayList<>(); + for (Task task : taskList) { + String assignee = task.getAssignee(); + SysUser sysUser = sysUserService.getUserByUsername(assignee); + assignList.add(sysUser.getName()); + + //TODO 公众号消息推送 + } + //更新process流程信息 + process.setDescription("等待" + StringUtils.join(assignList.toArray(), ",") + "审批"); + process.setStatus(1); + } else { + if (approvalVo.getStatus().intValue() == 1) { + process.setDescription("审批完成(通过)"); + process.setStatus(2); + } else { + process.setDescription("审批完成(驳回)"); + process.setStatus(-1); + } + } + baseMapper.updateById(process); + } + + /** + * 分页查询已处理 + * + * @param pageParam + * @return + */ + //已处理 + @Override + public IPage findProcessed(Page pageParam) { + //封装查询条件 + HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery().taskAssignee(LoginUserInfoHelper.getUsername()).finished().orderByTaskCreateTime().desc(); + + //调用方法条件分页查询,返回list集合 + // 开始位置 和 每页显示记录数 + int begin = (int) ((pageParam.getCurrent() - 1) * pageParam.getSize()); + int size = (int) pageParam.getSize(); + List list = query.listPage(begin, size); + long totalCount = query.count(); + + //遍历返回list集合,封装List + List processVoList = new ArrayList<>(); + for (HistoricTaskInstance item : list) { + //流程实例id + String processInstanceId = item.getProcessInstanceId(); + //根据流程实例id查询获取process信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Process::getProcessInstanceId, processInstanceId); + Process process = baseMapper.selectOne(wrapper); + // process -- processVo + ProcessVo processVo = new ProcessVo(); + BeanUtils.copyProperties(process, processVo); + processVo.setTaskId("0"); + //放到list + processVoList.add(processVo); + } + + //IPage封装分页查询所有数据,返回 + IPage pageModel = new Page(pageParam.getCurrent(), pageParam.getSize(), totalCount); + pageModel.setRecords(processVoList); + return pageModel; + } + + /** + * 分页查询已发起 + * + * @param pageParam + * @return + */ + @Override + public IPage findStarted(Page pageParam) { + ProcessQueryVo processQueryVo = new ProcessQueryVo(); + processQueryVo.setUserId(LoginUserInfoHelper.getUserId()); + IPage pageModel = baseMapper.selectPage(pageParam, processQueryVo); + for (ProcessVo item : pageModel.getRecords()) { + item.setTaskId("0"); + } + return pageModel; + } + + /** + * 结束流程 + * + * @param taskId + */ + private void endTask(String taskId) { + //1 根据任务id获取任务对象 Task + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + + //2 获取流程定义模型 BpmnModel + BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); + + //3 获取结束流向节点 + List endEventList = bpmnModel.getMainProcess().findFlowElementsOfType(EndEvent.class); + if (CollectionUtils.isEmpty(endEventList)) { + return; + } + FlowNode endFlowNode = (FlowNode) endEventList.get(0); + + //4 当前流向节点 + FlowNode currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey()); + + // 临时保存当前活动的原始方向 + List originalSequenceFlowList = new ArrayList<>(); + originalSequenceFlowList.addAll(currentFlowNode.getOutgoingFlows()); + //5 清理当前流动方向 + currentFlowNode.getOutgoingFlows().clear(); + + //6 创建新流向 + SequenceFlow newSequenceFlow = new SequenceFlow(); + newSequenceFlow.setId("newSequenceFlow"); + newSequenceFlow.setSourceFlowElement(currentFlowNode); + newSequenceFlow.setTargetFlowElement(endFlowNode); + + //7 当前节点指向新方向 + List newSequenceFlowList = new ArrayList(); + newSequenceFlowList.add(newSequenceFlow); + currentFlowNode.setOutgoingFlows(newSequenceFlowList); + + //8 完成当前任务 + taskService.complete(task.getId()); + } + /** * 获取当前任务列表 * diff --git a/service-oa/src/test/java/com/atguigu/code/CodeGet.java b/service-oa/src/test/java/com/atguigu/code/CodeGet.java index c01aff6..63d3b5f 100644 --- a/service-oa/src/test/java/com/atguigu/code/CodeGet.java +++ b/service-oa/src/test/java/com/atguigu/code/CodeGet.java @@ -47,7 +47,11 @@ public class CodeGet { // 5、策略配置 StrategyConfig strategy = new StrategyConfig(); - strategy.setInclude("oa_process_record"); + strategy.setInclude("wechat_menu"); + + //去掉前缀 + strategy.setTablePrefix("wechat_"); + //数据库表映射到实体的命名策略 strategy.setNaming(NamingStrategy.underline_to_camel); //数据库表字段映射到实体的命名策略