From bf21c15274f4213a70e3d01c01a316b8d37be7bb Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Fri, 23 Jun 2023 19:00:37 +0800 Subject: [PATCH] Initial commit --- .../com/atguigu/common/jwt/JwtHelper.java | 2 +- .../security/custom/LoginUserInfoHelper.java | 39 +++ .../filter/TokenAuthenticationFilter.java | 16 +- .../atguigu/auth/service/SysUserService.java | 2 +- .../auth/service/impl/SysUserServiceImpl.java | 2 +- .../service/impl/UserDetailsServiceImpl.java | 2 +- .../controller/OaProcessController.java | 8 +- .../OaProcessTemplateController.java | 2 +- .../controller/api/ProcessController.java | 69 +++++- .../process/mapper/OaProcessRecordMapper.java | 16 ++ .../mapper/xml/OaProcessRecordMapper.xml | 5 + .../service/OaProcessRecordService.java | 24 ++ .../process/service/OaProcessService.java | 26 ++ .../impl/OaProcessRecordServiceImpl.java | 47 ++++ .../service/impl/OaProcessServiceImpl.java | 233 +++++++++++++++++- .../impl/OaProcessTypeServiceImpl.java | 24 +- .../src/main/resources/application-dev.yml | 16 +- .../main/resources/process/leave.bpmn20.xml | 40 --- .../test/java/com/atguigu/code/CodeGet.java | 2 +- 19 files changed, 492 insertions(+), 83 deletions(-) create mode 100644 common/spring-security/src/main/java/com/atguigu/security/custom/LoginUserInfoHelper.java create mode 100644 service-oa/src/main/java/com/atguigu/process/mapper/OaProcessRecordMapper.java create mode 100644 service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessRecordMapper.xml create mode 100644 service-oa/src/main/java/com/atguigu/process/service/OaProcessRecordService.java create mode 100644 service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessRecordServiceImpl.java delete mode 100644 service-oa/src/main/resources/process/leave.bpmn20.xml diff --git a/common/common-util/src/main/java/com/atguigu/common/jwt/JwtHelper.java b/common/common-util/src/main/java/com/atguigu/common/jwt/JwtHelper.java index 4d01496..c3aa1d3 100644 --- a/common/common-util/src/main/java/com/atguigu/common/jwt/JwtHelper.java +++ b/common/common-util/src/main/java/com/atguigu/common/jwt/JwtHelper.java @@ -89,7 +89,7 @@ public class JwtHelper { * @param args */ public static void main(String[] args) { - String token = JwtHelper.createToken(1L, "admin"); + String token = JwtHelper.createToken(4L, "lisi"); System.out.println(token); String username = JwtHelper.getUsername(token); Long userId = JwtHelper.getUserId(token); diff --git a/common/spring-security/src/main/java/com/atguigu/security/custom/LoginUserInfoHelper.java b/common/spring-security/src/main/java/com/atguigu/security/custom/LoginUserInfoHelper.java new file mode 100644 index 0000000..3d679d8 --- /dev/null +++ b/common/spring-security/src/main/java/com/atguigu/security/custom/LoginUserInfoHelper.java @@ -0,0 +1,39 @@ +package com.atguigu.security.custom; + +/** + * ClassName: LoginUserInfoHelper + * Package: com.atguigu.security.custom + * 获取当前用户信息帮助类 + * + * @author yovinchen + * @Create 2023/6/23 09:24 + */ +public class LoginUserInfoHelper { + + private static ThreadLocal userId = new ThreadLocal(); + private static ThreadLocal username = new ThreadLocal(); + + public static Long getUserId() { + return userId.get(); + } + + public static void setUserId(Long _userId) { + userId.set(_userId); + } + + public static void removeUserId() { + userId.remove(); + } + + public static String getUsername() { + return username.get(); + } + + public static void setUsername(String _username) { + username.set(_username); + } + + public static void removeUsername() { + username.remove(); + } +} diff --git a/common/spring-security/src/main/java/com/atguigu/security/filter/TokenAuthenticationFilter.java b/common/spring-security/src/main/java/com/atguigu/security/filter/TokenAuthenticationFilter.java index d60425e..b87a28c 100644 --- a/common/spring-security/src/main/java/com/atguigu/security/filter/TokenAuthenticationFilter.java +++ b/common/spring-security/src/main/java/com/atguigu/security/filter/TokenAuthenticationFilter.java @@ -5,6 +5,7 @@ import com.atguigu.common.jwt.JwtHelper; import com.atguigu.common.result.Result; import com.atguigu.common.result.ResultCodeEnum; import com.atguigu.common.utils.ResponseUtil; +import com.atguigu.security.custom.LoginUserInfoHelper; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -60,12 +61,15 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { String token = request.getHeader("token"); logger.info("token:" + token); if (!StringUtils.isEmpty(token)) { - String useruame = JwtHelper.getUsername(token); - logger.info("useruame:" + useruame); + String username = JwtHelper.getUsername(token); + logger.info("username:" + username); //认证成功 - if (!StringUtils.isEmpty(useruame)) { + if (!StringUtils.isEmpty(username)) { + //当前用户信息放到 Thresdlocal 里面 + LoginUserInfoHelper.setUserId(JwtHelper.getUserId(token)); + LoginUserInfoHelper.setUsername(username); //通过username从reids中获取权限数据 - String authString = (String) redisTemplate.opsForValue().get(useruame); + String authString = (String) redisTemplate.opsForValue().get(username); //将redis中获取的字符串权限数据转换为 ArrayList if (!StringUtils.isEmpty(authString)) { List mapList = JSON.parseArray(authString, Map.class); @@ -74,9 +78,9 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { for (Map map : mapList) { authList.add(new SimpleGrantedAuthority((String) map.get("authority"))); } - return new UsernamePasswordAuthenticationToken(useruame, null, authList); + return new UsernamePasswordAuthenticationToken(username, null, authList); } else { - return new UsernamePasswordAuthenticationToken(useruame, null, new ArrayList<>()); + return new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); } } } 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 0a80652..6647ab9 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 @@ -27,5 +27,5 @@ public interface SysUserService extends IService { * @param username * @return */ - SysUser getByUsername(String username); + SysUser getUserByUsername(String username); } 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 a7f0cf2..46cf4c5 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 @@ -46,7 +46,7 @@ public class SysUserServiceImpl extends ServiceImpl impl * @return */ @Override - public SysUser getByUsername(String username) { + public SysUser getUserByUsername(String username) { return baseMapper.selectOne(new LambdaQueryWrapper().eq(SysUser::getUsername, username)); } } diff --git a/service-oa/src/main/java/com/atguigu/auth/service/impl/UserDetailsServiceImpl.java b/service-oa/src/main/java/com/atguigu/auth/service/impl/UserDetailsServiceImpl.java index 8bd4b15..2d7c543 100644 --- a/service-oa/src/main/java/com/atguigu/auth/service/impl/UserDetailsServiceImpl.java +++ b/service-oa/src/main/java/com/atguigu/auth/service/impl/UserDetailsServiceImpl.java @@ -32,7 +32,7 @@ public class UserDetailsServiceImpl implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - SysUser sysUser = sysUserService.getByUsername(username); + SysUser sysUser = sysUserService.getUserByUsername(username); if (null == sysUser) { throw new UsernameNotFoundException("用户名不存在!"); } diff --git a/service-oa/src/main/java/com/atguigu/process/controller/OaProcessController.java b/service-oa/src/main/java/com/atguigu/process/controller/OaProcessController.java index 30f70d9..a68ac1f 100644 --- a/service-oa/src/main/java/com/atguigu/process/controller/OaProcessController.java +++ b/service-oa/src/main/java/com/atguigu/process/controller/OaProcessController.java @@ -12,10 +12,7 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** *

@@ -28,7 +25,8 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "审批流管理") @RestController @RequestMapping(value = "/admin/process") -@SuppressWarnings({"unchecked", "rawtypes"}) +@CrossOrigin//跨域 +//@SuppressWarnings({"unchecked", "rawtypes"}) public class OaProcessController { @Autowired diff --git a/service-oa/src/main/java/com/atguigu/process/controller/OaProcessTemplateController.java b/service-oa/src/main/java/com/atguigu/process/controller/OaProcessTemplateController.java index c93ce9c..00191d2 100644 --- a/service-oa/src/main/java/com/atguigu/process/controller/OaProcessTemplateController.java +++ b/service-oa/src/main/java/com/atguigu/process/controller/OaProcessTemplateController.java @@ -44,7 +44,7 @@ public class OaProcessTemplateController { public static void main(String[] args) { try { String path = new File(ResourceUtils.getURL("classpath:").getPath()).getAbsolutePath(); - System.out.println("path = " + path); //E:\CodeLife\IdeaProject\guigu-oa\guigu-oa-parent\service-oa\target\classes + System.out.println("path=" + path); //E:\CodeLife\IdeaProject\guigu-oa\guigu-oa-parent\service-oa\target\classes } catch (FileNotFoundException e) { throw new RuntimeException(e); } 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 6615eef..e456036 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,17 +1,24 @@ package com.atguigu.process.controller.api; import com.atguigu.common.result.Result; +import com.atguigu.model.process.Process; +import com.atguigu.model.process.ProcessTemplate; 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.ProcessFormVo; +import com.atguigu.vo.process.ProcessVo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; /** * ClassName: ProcessController @@ -25,13 +32,53 @@ import java.util.List; @RestController @RequestMapping(value = "/admin/process") @CrossOrigin//跨域 -@SuppressWarnings({"unchecked", "rawtypes"}) +//@SuppressWarnings({"unchecked", "rawtypes"}) 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, + + @ApiParam(name = "limit", value = "每页记录数", required = true) @PathVariable Long limit) { + Page pageParam = new Page<>(page, limit); + IPage pageModel = oaProcessService.findPending(pageParam); + return Result.ok(pageModel); + } + + /** + * 启动流程 + * + * @param processFormVo + * @return + */ + @ApiOperation(value = "启动流程") + @PostMapping("/startUp") + public Result start(@RequestBody ProcessFormVo processFormVo) { + oaProcessService.startUp(processFormVo); + return Result.ok(); + } + + /** + * 获取审批模板 + * + * @param processTemplateId + * @return + */ + @ApiOperation(value = "获取审批模板") + @GetMapping("getProcessTemplate/{processTemplateId}") + public Result get(@PathVariable Long processTemplateId) { + ProcessTemplate processTemplate = oaProcessTemplateService.getById(processTemplateId); + return Result.ok(processTemplate); + } + /** * 查询所有审批分类和每一个分类所有审批模版 * @@ -44,5 +91,17 @@ public class ProcessController { return Result.ok(list); } + /** + * 查看审批详情信息 + * + * @param id + * @return + */ + @GetMapping("show/{id}") + public Result show(@PathVariable Long id) { + Map map = oaProcessService.show(id); + return Result.ok(map); + } + } diff --git a/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessRecordMapper.java b/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessRecordMapper.java new file mode 100644 index 0000000..b97be93 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessRecordMapper.java @@ -0,0 +1,16 @@ +package com.atguigu.process.mapper; + +import com.atguigu.model.process.ProcessRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 审批记录 Mapper 接口 + *

+ * + * @author yovinchen + * @since 2023-06-23 + */ +public interface OaProcessRecordMapper extends BaseMapper { + +} diff --git a/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessRecordMapper.xml b/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessRecordMapper.xml new file mode 100644 index 0000000..e153c90 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/service-oa/src/main/java/com/atguigu/process/service/OaProcessRecordService.java b/service-oa/src/main/java/com/atguigu/process/service/OaProcessRecordService.java new file mode 100644 index 0000000..c5dd44a --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/service/OaProcessRecordService.java @@ -0,0 +1,24 @@ +package com.atguigu.process.service; + +import com.atguigu.model.process.ProcessRecord; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 审批记录 服务类 + *

+ * + * @author yovinchen + * @since 2023-06-23 + */ +public interface OaProcessRecordService extends IService { + + /** + * 记录操作审批信息记录 + * + * @param processId + * @param status + * @param description + */ + void record(Long processId, Integer status, String description); +} 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 0a3d023..366c2cb 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,12 +1,15 @@ package com.atguigu.process.service; import com.atguigu.model.process.Process; +import com.atguigu.vo.process.ProcessFormVo; import com.atguigu.vo.process.ProcessQueryVo; import com.atguigu.vo.process.ProcessVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.Map; + /** *

* 审批类型 服务类 @@ -30,4 +33,27 @@ public interface OaProcessService extends IService { * 部署流程定义 */ void deployByZip(String deployPath); + + /** + * 启动流程 + * + * @param processFormVo + */ + void startUp(ProcessFormVo processFormVo); + + /** + * 查询待处理的任务列表 + * + * @param pageParam + * @return + */ + IPage findPending(Page pageParam); + + /** + * 查看审批详情信息 + * + * @param id + * @return + */ + Map show(Long id); } diff --git a/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessRecordServiceImpl.java b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessRecordServiceImpl.java new file mode 100644 index 0000000..37792c4 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessRecordServiceImpl.java @@ -0,0 +1,47 @@ +package com.atguigu.process.service.impl; + +import com.atguigu.auth.service.SysUserService; +import com.atguigu.model.process.ProcessRecord; +import com.atguigu.model.system.SysUser; +import com.atguigu.process.mapper.OaProcessRecordMapper; +import com.atguigu.process.service.OaProcessRecordService; +import com.atguigu.security.custom.LoginUserInfoHelper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + *

+ * 审批记录 服务实现类 + *

+ * + * @author yovinchen + * @since 2023-06-23 + */ +@Service +public class OaProcessRecordServiceImpl extends ServiceImpl implements OaProcessRecordService { + @Autowired + private SysUserService sysUserService; + + /** + * 记录操作审批信息记录 + * + * @param processId + * @param status + * @param description + */ + @Override + public void record(Long processId, Integer status, String description) { + Long userId = LoginUserInfoHelper.getUserId(); + SysUser sysUser = sysUserService.getById(userId); + + ProcessRecord processRecord = new ProcessRecord(); + processRecord.setProcessId(processId); + processRecord.setStatus(status); + processRecord.setDescription(description); + processRecord.setOperateUser(sysUser.getName()); + processRecord.setOperateUserId(userId); + + baseMapper.insert(processRecord); + } +} 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 418caea..da84fab 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 @@ -1,19 +1,43 @@ package com.atguigu.process.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.atguigu.auth.service.SysUserService; import com.atguigu.model.process.Process; +import com.atguigu.model.process.ProcessRecord; +import com.atguigu.model.process.ProcessTemplate; +import com.atguigu.model.system.SysUser; import com.atguigu.process.mapper.OaProcessMapper; +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.ProcessFormVo; import com.atguigu.vo.process.ProcessQueryVo; import com.atguigu.vo.process.ProcessVo; +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.engine.HistoryService; import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; import org.activiti.engine.repository.Deployment; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.activiti.engine.task.TaskQuery; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.io.InputStream; +import java.io.*; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.zip.ZipInputStream; /** @@ -27,10 +51,28 @@ import java.util.zip.ZipInputStream; @Service public class OaProcessServiceImpl extends ServiceImpl implements OaProcessService { - @Autowired private RepositoryService repositoryService; + @Autowired + private SysUserService sysUserService; + + @Autowired + private OaProcessTemplateService oaProcessTemplateService; + + @Autowired + private RuntimeService runtimeService; + + @Autowired + private TaskService taskService; + + @Autowired + private OaProcessRecordService oaProcessRecordService; + + @Autowired + private HistoryService historyService; + + /** * 获取分页列表 * @@ -52,17 +94,184 @@ public class OaProcessServiceImpl extends ServiceImpl */ @Override public void deployByZip(String deployPath) { - // 定义zip输入流 - InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(deployPath); - ZipInputStream zipInputStream = null; - if (inputStream != null) { - zipInputStream = new ZipInputStream(inputStream); - } - // 流程部署 - Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy(); - System.out.println("deployment.getId() = " + deployment.getId()); - System.out.println("deployment.getName() = " + deployment.getName()); + URL url = ClassLoader.getSystemResource(""); + System.out.println(url.getPath()); + File file = new File(url.getPath() + "/" + deployPath); + if (!file.exists()) { + throw new RuntimeException("文件不存在"); + } else { + InputStream inputStream = null; + ZipInputStream zipInputStream = null; + try { + inputStream = new FileInputStream(file); + zipInputStream = new ZipInputStream(inputStream); + Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy(); + System.out.println(deployment.getId()); + System.out.println(deployment.getName()); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } finally { + try { + inputStream.close(); + zipInputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + } + } + + /** + * 启动流程 + * + * @param processFormVo + */ + @Override + public void startUp(ProcessFormVo processFormVo) { + // 1 根据当前用户id获取用户信息 + SysUser sysUser = sysUserService.getById(LoginUserInfoHelper.getUserId()); + + // 2 根据审批模板id把模板信息查询 + ProcessTemplate processTemplate = oaProcessTemplateService.getById(processFormVo.getProcessTemplateId()); + + // 3 保存提交审批信息到业务表,oa_process + Process process = new Process(); + // processFormVo复制到process对象里面 + BeanUtils.copyProperties(processFormVo, process); + // 其他值 + process.setStatus(1); //审批中 + String workNo = System.currentTimeMillis() + ""; + process.setProcessCode(workNo); + process.setUserId(LoginUserInfoHelper.getUserId()); + process.setFormValues(processFormVo.getFormValues()); + process.setTitle(sysUser.getName() + "发起" + processTemplate.getName() + "申请"); + baseMapper.insert(process); + + + // 4 启动流程实例 - RuntimeService + // 4.1 流程定义key + String processDefinitionKey = processTemplate.getProcessDefinitionKey(); + + //4.2 业务key processId + String businessKey = String.valueOf(process.getId()); + + //4.3 流程参数 form表单json数据,转换map集合 + String formValues = processFormVo.getFormValues(); + JSONObject jsonObject = JSON.parseObject(formValues); + JSONObject formData = jsonObject.getJSONObject("formData"); + // 遍历formData得到的内容,封装map集合 + Map map = new HashMap<>(); + for (Map.Entry entry : formData.entrySet()) { + map.put(entry.getKey(), entry.getValue()); + } + Map variable = new HashMap<>(); + variable.put("data", map); + + // 启动流程实例 + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variable); + + // 5 查询下一个审批人 + // 审批人可能多个 + List taskList = this.getCurrentTaskList(processInstance.getId()); + List nameList = new ArrayList<>(); + for (Task task : taskList) { + String assigneeName = task.getAssignee(); + SysUser user = sysUserService.getUserByUsername(assigneeName); + String name = user.getName(); + nameList.add(name); + + // TODO 6 推送消息 + } + process.setProcessInstanceId(processInstance.getId()); + process.setDescription("等待" + StringUtils.join(nameList.toArray(), ",") + "审批"); + // 7 业务和流程关联 更新oa_process数据 + baseMapper.updateById(process); + + // 记录操作审批信息记录 + oaProcessRecordService.record(process.getId(), 1, "发起申请"); + } + + /** + * 查询待处理的列表 + * + * @param pageParam + * @return + */ + @Override + public IPage findPending(Page pageParam) { + TaskQuery query = taskService.createTaskQuery().taskAssignee(LoginUserInfoHelper.getUsername()).orderByTaskCreateTime().desc(); + int begin = (int) ((pageParam.getCurrent() - 1) * pageParam.getSize()); + int size = (int) pageParam.getSize(); + List taskList = query.listPage(begin, size); + List processVoList = new ArrayList<>(); + for (Task task : taskList) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); + String businessKey = processInstance.getBusinessKey(); + if (businessKey == null) { + continue; + } + Process process = baseMapper.selectById(Long.parseLong(businessKey)); + ProcessVo processVo = new ProcessVo(); + BeanUtils.copyProperties(process, processVo); + processVo.setTaskId(task.getId()); + processVoList.add(processVo); + } + IPage page = new Page<>(pageParam.getCurrent(), pageParam.getSize(), query.count()); + page.setRecords(processVoList); + return page; + } + + /** + * 查看审批详情信息 + * + * @param id + * @return + */ + @Override + public Map show(Long id) { + //1 根据流程id获取流程信息Process + Process process = baseMapper.selectById(id); + + //2 根据流程id获取流程记录信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ProcessRecord::getProcessId,id); + List processRecordList = oaProcessRecordService.list(wrapper); + + //3 根据模板id查询模板信息 + ProcessTemplate processTemplate = oaProcessTemplateService.getById(process.getProcessTemplateId()); + + //4 判断当前用户是否可以审批 + //可以看到信息不一定能审批,不能重复审批 + boolean isApprove = false; + List taskList = this.getCurrentTaskList(process.getProcessInstanceId()); + for(Task task : taskList) { + //判断任务审批人是否是当前用户 + String username = LoginUserInfoHelper.getUsername(); + if(task.getAssignee().equals(username)) { + isApprove = true; + } + } + + //5 查询数据封装到map集合,返回 + Map map = new HashMap<>(); + map.put("process", process); + map.put("processRecordList", processRecordList); + map.put("processTemplate", processTemplate); + map.put("isApprove", isApprove); + return map; + } + + /** + * 获取当前任务列表 + * + * @param id + * @return + */ + private List getCurrentTaskList(String id) { + List taskList = taskService.createTaskQuery().processInstanceId(id).list(); + return taskList; } } diff --git a/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTypeServiceImpl.java b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTypeServiceImpl.java index 8a34385..c79ad28 100644 --- a/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTypeServiceImpl.java +++ b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTypeServiceImpl.java @@ -1,9 +1,13 @@ package com.atguigu.process.service.impl; +import com.atguigu.model.process.ProcessTemplate; import com.atguigu.model.process.ProcessType; import com.atguigu.process.mapper.OaProcessTypeMapper; +import com.atguigu.process.service.OaProcessTemplateService; import com.atguigu.process.service.OaProcessTypeService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -19,6 +23,9 @@ import java.util.List; @Service public class OaProcessTypeServiceImpl extends ServiceImpl implements OaProcessTypeService { + @Autowired + private OaProcessTemplateService oaProcessTemplateService; + /** * 查询所有审批分类和每一个分类所有审批模版 * @@ -28,7 +35,22 @@ public class OaProcessTypeServiceImpl extends ServiceImpl findProcessType() { + // 1、 查询所有审批分类,返回list集合 + List processTypeList = baseMapper.selectList(null); - return null; + // 2、 遍历返回所有审批分类list集合 + for (ProcessType processType : processTypeList) { + // 3、 得到每个审批分类,根据审批分类id查询对应审批模板 + // 审批分类id + Long id = processType.getId(); + // 根据审批分类id查询对应审批模板 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProcessTemplate::getProcessTypeId, id); + List processTemplateList = oaProcessTemplateService.list(queryWrapper); + + // 4、 根据审批分类id查询对应审批模板数据(List)封装到每个审批分类对象里面 + processType.setProcessTemplateList(processTemplateList); + } + return processTypeList; } } diff --git a/service-oa/src/main/resources/application-dev.yml b/service-oa/src/main/resources/application-dev.yml index 3452798..bf8f972 100644 --- a/service-oa/src/main/resources/application-dev.yml +++ b/service-oa/src/main/resources/application-dev.yml @@ -10,21 +10,21 @@ spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver -# url: jdbc:mysql://43.143.164.194:3306/guigu-oa?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true -# username: admin -# password: admin - url: jdbc:mysql://localhost:3306/guigu-oa?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true - username: root - password: root + url: jdbc:mysql://43.143.164.194:3306/guigu-oa?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true + username: admin + password: admin +# url: jdbc:mysql://localhost:3306/guigu-oa?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true +# username: root +# password: root jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 redis: - host: localhost + host: 43.143.164.194 port: 6379 database: 0 timeout: 1800000 - password: + password: redis jedis: pool: max-active: 20 #最大连接数 diff --git a/service-oa/src/main/resources/process/leave.bpmn20.xml b/service-oa/src/main/resources/process/leave.bpmn20.xml deleted file mode 100644 index 78e0cfb..0000000 --- a/service-oa/src/main/resources/process/leave.bpmn20.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file 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 fa4d1a7..c01aff6 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,7 @@ public class CodeGet { // 5、策略配置 StrategyConfig strategy = new StrategyConfig(); - strategy.setInclude("oa_process"); + strategy.setInclude("oa_process_record"); //数据库表映射到实体的命名策略 strategy.setNaming(NamingStrategy.underline_to_camel); //数据库表字段映射到实体的命名策略