From ec6263b10477dec6ab5cbd73fccb9077a1d50b82 Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Thu, 15 Jun 2023 23:31:25 +0800 Subject: [PATCH] Initial commit --- .../common/config/mp/MybatisPlusConfig.java | 2 +- .../com/atguigu/vo/system/AssginMenuVo.java | 1 - .../{auth => }/ServiceAuthApplication.java | 3 +- .../OaProcessTemplateController.java | 80 ++++++ .../controller/OaProcessTypeController.java | 102 +++++++ .../mapper/OaProcessTemplateMapper.java | 16 ++ .../process/mapper/OaProcessTypeMapper.java | 16 ++ .../mapper/xml/OaProcessTemplateMapper.xml | 5 + .../mapper/xml/OaProcessTypeMapper.xml | 5 + .../service/OaProcessTemplateService.java | 25 ++ .../process/service/OaProcessTypeService.java | 16 ++ .../impl/OaProcessTemplateServiceImpl.java | 61 +++++ .../impl/OaProcessTypeServiceImpl.java | 20 ++ .../src/main/resources/application-dev.yml | 9 +- .../main/resources/process/leave.bpmn20.xml | 40 +++ .../src/main/resources/process/leave.png | Bin 0 -> 6498 bytes .../resources/process/leave001.bpmn20.xml | 72 +++++ .../src/main/resources/process/leave001.png | Bin 0 -> 19480 bytes .../resources/process/overtime.bpmn20.xml | 40 +++ .../src/main/resources/process/overtime.png | Bin 0 -> 8071 bytes .../resources/process/overtime001.bpmn20.xml | 65 +++++ .../main/resources/process/overtime001.png | Bin 0 -> 17846 bytes .../resources/process/overtime01.bpmn20.xml | 40 +++ .../resources/process/overtime02.bpmn20.xml | 52 ++++ .../resources/process/overtime04.bpmn20.xml | 40 +++ .../main/resources/process/qingjia.bpmn20.xml | 40 --- .../src/main/resources/process/qingjia.png | Bin 7646 -> 0 bytes .../atguigu/auth/activti/MyTaskListener.java | 25 ++ .../com/atguigu/auth/activti/ProcessTest.java | 51 ++-- .../auth/activti/ProcessTestDome001.java | 137 ++++++++++ .../auth/activti/ProcessTestDome002.java | 126 +++++++++ .../auth/activti/ProcessTestDome1.java | 188 +++++++++++++ .../auth/activti/ProcessTestDome2.java | 251 ++++++++++++++++++ .../auth/activti/ProcessTestDome3.java | 138 ++++++++++ .../com/atguigu/auth/activti/UserBean.java | 25 ++ .../test/java/com/atguigu/code/CodeGet.java | 4 +- .../test/java/com/atguigu/process/Test.java | 37 +++ 37 files changed, 1662 insertions(+), 70 deletions(-) rename service-oa/src/main/java/com/atguigu/{auth => }/ServiceAuthApplication.java (89%) create mode 100644 service-oa/src/main/java/com/atguigu/process/controller/OaProcessTemplateController.java create mode 100644 service-oa/src/main/java/com/atguigu/process/controller/OaProcessTypeController.java create mode 100644 service-oa/src/main/java/com/atguigu/process/mapper/OaProcessTemplateMapper.java create mode 100644 service-oa/src/main/java/com/atguigu/process/mapper/OaProcessTypeMapper.java create mode 100644 service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessTemplateMapper.xml create mode 100644 service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessTypeMapper.xml create mode 100644 service-oa/src/main/java/com/atguigu/process/service/OaProcessTemplateService.java create mode 100644 service-oa/src/main/java/com/atguigu/process/service/OaProcessTypeService.java create mode 100644 service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTemplateServiceImpl.java create mode 100644 service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTypeServiceImpl.java create mode 100644 service-oa/src/main/resources/process/leave.bpmn20.xml create mode 100644 service-oa/src/main/resources/process/leave.png create mode 100644 service-oa/src/main/resources/process/leave001.bpmn20.xml create mode 100644 service-oa/src/main/resources/process/leave001.png create mode 100644 service-oa/src/main/resources/process/overtime.bpmn20.xml create mode 100644 service-oa/src/main/resources/process/overtime.png create mode 100644 service-oa/src/main/resources/process/overtime001.bpmn20.xml create mode 100644 service-oa/src/main/resources/process/overtime001.png create mode 100644 service-oa/src/main/resources/process/overtime01.bpmn20.xml create mode 100644 service-oa/src/main/resources/process/overtime02.bpmn20.xml create mode 100644 service-oa/src/main/resources/process/overtime04.bpmn20.xml delete mode 100644 service-oa/src/main/resources/process/qingjia.bpmn20.xml delete mode 100644 service-oa/src/main/resources/process/qingjia.png create mode 100644 service-oa/src/test/java/com/atguigu/auth/activti/MyTaskListener.java create mode 100644 service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome001.java create mode 100644 service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome002.java create mode 100644 service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome1.java create mode 100644 service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome2.java create mode 100644 service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome3.java create mode 100644 service-oa/src/test/java/com/atguigu/auth/activti/UserBean.java create mode 100644 service-oa/src/test/java/com/atguigu/process/Test.java diff --git a/common/service-util/src/main/java/com/atguigu/common/config/mp/MybatisPlusConfig.java b/common/service-util/src/main/java/com/atguigu/common/config/mp/MybatisPlusConfig.java index a506151..27e47a6 100644 --- a/common/service-util/src/main/java/com/atguigu/common/config/mp/MybatisPlusConfig.java +++ b/common/service-util/src/main/java/com/atguigu/common/config/mp/MybatisPlusConfig.java @@ -17,7 +17,7 @@ import org.springframework.context.annotation.Configuration; */ @Configuration -@MapperScan("com.atguigu.auth.mapper") +@MapperScan(basePackages = {"com.atguigu.auth.mapper","com.atguigu.process.mapper"}) public class MybatisPlusConfig { /** diff --git a/model/src/main/java/com/atguigu/vo/system/AssginMenuVo.java b/model/src/main/java/com/atguigu/vo/system/AssginMenuVo.java index e9e91c8..fadb1c4 100644 --- a/model/src/main/java/com/atguigu/vo/system/AssginMenuVo.java +++ b/model/src/main/java/com/atguigu/vo/system/AssginMenuVo.java @@ -1,6 +1,5 @@ package com.atguigu.vo.system; - import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/service-oa/src/main/java/com/atguigu/auth/ServiceAuthApplication.java b/service-oa/src/main/java/com/atguigu/ServiceAuthApplication.java similarity index 89% rename from service-oa/src/main/java/com/atguigu/auth/ServiceAuthApplication.java rename to service-oa/src/main/java/com/atguigu/ServiceAuthApplication.java index 9d86453..faad331 100644 --- a/service-oa/src/main/java/com/atguigu/auth/ServiceAuthApplication.java +++ b/service-oa/src/main/java/com/atguigu/ServiceAuthApplication.java @@ -1,4 +1,4 @@ -package com.atguigu.auth; +package com.atguigu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -12,7 +12,6 @@ import org.springframework.context.annotation.ComponentScan; * @Create 2023/6/1 23:03 */ @SpringBootApplication -@ComponentScan("com.atguigu") public class ServiceAuthApplication { public static void main(String[] args) { SpringApplication.run(ServiceAuthApplication.class, args); 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 new file mode 100644 index 0000000..80fe18c --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/controller/OaProcessTemplateController.java @@ -0,0 +1,80 @@ +package com.atguigu.process.controller; + + +import com.atguigu.common.result.Result; +import com.atguigu.model.process.ProcessTemplate; +import com.atguigu.process.service.OaProcessTemplateService; +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 org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 审批模板 前端控制器 + *

+ * + * @author yovinchen + * @since 2023-06-15 + */ +@Api(value = "审批模板管理", tags = "审批模板管理") +@RestController +@RequestMapping(value = "/admin/process/processTemplate") +public class OaProcessTemplateController { + + @Autowired + private OaProcessTemplateService processTemplateService; + + /**分页查询审批模板 + * + * @param page + * @param pageSize + * @return + */ + @ApiOperation("获取分页查询审批模板数据") + @GetMapping("{page}/{pageSize}") + public Result index(@PathVariable Long page, @PathVariable Long pageSize) { + Page pageInfo = new Page<>(page, pageSize); + //分页查询审批模板,把审批类型对应名称查询 + IPage pageModel = + processTemplateService.selectPageProcessTemplate(pageInfo); + return Result.ok(pageModel); + } + + @PreAuthorize("hasAuthority('bnt.processTemplate.list')") + @ApiOperation(value = "获取") + @GetMapping("get/{id}") + public Result get(@PathVariable Long id) { + ProcessTemplate processTemplate = processTemplateService.getById(id); + return Result.ok(processTemplate); + } + + @PreAuthorize("hasAuthority('bnt.processTemplate.templateSet')") + @ApiOperation(value = "新增") + @PostMapping("save") + public Result save(@RequestBody ProcessTemplate processTemplate) { + processTemplateService.save(processTemplate); + return Result.ok(); + } + + @PreAuthorize("hasAuthority('bnt.processTemplate.templateSet')") + @ApiOperation(value = "修改") + @PutMapping("update") + public Result updateById(@RequestBody ProcessTemplate processTemplate) { + processTemplateService.updateById(processTemplate); + return Result.ok(); + } + + @PreAuthorize("hasAuthority('bnt.processTemplate.remove')") + @ApiOperation(value = "删除") + @DeleteMapping("remove/{id}") + public Result remove(@PathVariable Long id) { + processTemplateService.removeById(id); + return Result.ok(); + } + +} + diff --git a/service-oa/src/main/java/com/atguigu/process/controller/OaProcessTypeController.java b/service-oa/src/main/java/com/atguigu/process/controller/OaProcessTypeController.java new file mode 100644 index 0000000..2d39f24 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/controller/OaProcessTypeController.java @@ -0,0 +1,102 @@ +package com.atguigu.process.controller; + + +import com.atguigu.common.result.Result; +import com.atguigu.model.process.ProcessType; +import com.atguigu.process.service.OaProcessTypeService; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +/** + * 审批类型 前端控制器 + * + * @author yovinchen + * @since 2023-06-15 + */ +@Api(value = "审批类型", tags = "审批类型") +@RestController +@RequestMapping(value = "/admin/process/processType") +@SuppressWarnings({"unchecked", "rawtypes"}) +public class OaProcessTypeController { + + @Autowired + private OaProcessTypeService processTypeService; + + /** + * 分页查询 + * + * @param page + * @param pageSize + * @return + */ + @ApiOperation(value = "获取分页列表") + @GetMapping("{page}/{pageSize}") + public Result index(@PathVariable Long page, @PathVariable Long pageSize) { + + Page pageInfo = new Page<>(page, pageSize); + Page pageModel = processTypeService.page(pageInfo); + + return Result.ok(pageModel); + } + + /** + * 获取 + * + * @param id + * @return + */ + @PreAuthorize("hasAuthority('bnt.processType.list')") + @ApiOperation(value = "获取") + @GetMapping("get/{id}") + public Result get(@PathVariable Long id) { + ProcessType processType = processTypeService.getById(id); + return Result.ok(processType); + } + + /** + * 新增 + * + * @param processType + * @return + */ + @PreAuthorize("hasAuthority('bnt.processType.add')") + @ApiOperation(value = "新增") + @PostMapping("save") + public Result save(@RequestBody ProcessType processType) { + processTypeService.save(processType); + return Result.ok(); + } + + /** + * 修改 + * + * @param processType + * @return + */ + @PreAuthorize("hasAuthority('bnt.processType.update')") + @ApiOperation(value = "修改") + @PutMapping("update") + public Result updateById(@RequestBody ProcessType processType) { + processTypeService.updateById(processType); + return Result.ok(); + } + + /** + * 删除 + * + * @param id + * @return + */ + @ApiOperation(value = "删除") + @DeleteMapping("remove/{id}") + public Result remove(@PathVariable Long id) { + processTypeService.removeById(id); + return Result.ok(); + } + +} + diff --git a/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessTemplateMapper.java b/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessTemplateMapper.java new file mode 100644 index 0000000..dfa0537 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessTemplateMapper.java @@ -0,0 +1,16 @@ +package com.atguigu.process.mapper; + +import com.atguigu.model.process.ProcessTemplate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 审批模板 Mapper 接口 + *

+ * + * @author yovinchen + * @since 2023-06-15 + */ +public interface OaProcessTemplateMapper extends BaseMapper { + +} diff --git a/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessTypeMapper.java b/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessTypeMapper.java new file mode 100644 index 0000000..5c42ef1 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/mapper/OaProcessTypeMapper.java @@ -0,0 +1,16 @@ +package com.atguigu.process.mapper; + +import com.atguigu.model.process.ProcessType; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 审批类型 Mapper 接口 + *

+ * + * @author yovinchen + * @since 2023-06-15 + */ +public interface OaProcessTypeMapper extends BaseMapper { + +} diff --git a/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessTemplateMapper.xml b/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessTemplateMapper.xml new file mode 100644 index 0000000..5d3d778 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessTypeMapper.xml b/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessTypeMapper.xml new file mode 100644 index 0000000..1024a31 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/mapper/xml/OaProcessTypeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/service-oa/src/main/java/com/atguigu/process/service/OaProcessTemplateService.java b/service-oa/src/main/java/com/atguigu/process/service/OaProcessTemplateService.java new file mode 100644 index 0000000..191abc9 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/service/OaProcessTemplateService.java @@ -0,0 +1,25 @@ +package com.atguigu.process.service; + +import com.atguigu.model.process.ProcessTemplate; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 审批模板 服务类 + *

+ * + * @author yovinchen + * @since 2023-06-15 + */ +public interface OaProcessTemplateService extends IService { + + /** + * 分页查询审批模板,把审批类型对应名称查询 + * + * @param pageInfo + * @return + */ + IPage selectPageProcessTemplate(Page pageInfo); +} diff --git a/service-oa/src/main/java/com/atguigu/process/service/OaProcessTypeService.java b/service-oa/src/main/java/com/atguigu/process/service/OaProcessTypeService.java new file mode 100644 index 0000000..5ef2dd6 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/service/OaProcessTypeService.java @@ -0,0 +1,16 @@ +package com.atguigu.process.service; + +import com.atguigu.model.process.ProcessType; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 审批类型 服务类 + *

+ * + * @author yovinchen + * @since 2023-06-15 + */ +public interface OaProcessTypeService extends IService { + +} diff --git a/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTemplateServiceImpl.java b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTemplateServiceImpl.java new file mode 100644 index 0000000..a97a233 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTemplateServiceImpl.java @@ -0,0 +1,61 @@ +package com.atguigu.process.service.impl; + +import com.atguigu.model.process.ProcessTemplate; +import com.atguigu.model.process.ProcessType; +import com.atguigu.process.mapper.OaProcessTemplateMapper; +import com.atguigu.process.service.OaProcessTemplateService; +import com.atguigu.process.service.OaProcessTypeService; +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.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Optional; + +/** + *

+ * 审批模板 服务实现类 + *

+ * + * @author yovinchen + * @since 2023-06-15 + */ +@Service +public class OaProcessTemplateServiceImpl extends ServiceImpl implements OaProcessTemplateService { + + + @Resource + private OaProcessTypeService oaprocessTypeService; + + /** + * 分页查询审批模板,把审批类型对应名称查询 + * + * @param pageInfo + * @return + */ + @Override + public IPage selectPageProcessTemplate(Page pageInfo) { + // 调用mapper的方法实现分页查询 + Page processTemplatePage = baseMapper.selectPage(pageInfo, null); + // 第一步分页查询返回分页数据,从分页数据获取列表List集合 + List processTemplateList = processTemplatePage.getRecords(); + // 遍历list集合 +// for (ProcessTemplate processTemplate : processTemplateList) { +// //得到每个对象的审批类型id +// Long processTypeId = processTemplate.getProcessTypeId(); +// // 根据审批类型d,查询获取对应名称 +// ProcessType processType = oaprocessTypeService.getOne(new LambdaQueryWrapper().eq(ProcessType::getId, processTypeId)); +// if (processType == null) { +// continue; +// } +// // 完成最终封装 +// processTemplate.setProcessTypeName(processType.getName()); +// } + processTemplateList.forEach(processTemplate -> Optional.ofNullable(oaprocessTypeService.getOne(new LambdaQueryWrapper().eq(ProcessType::getId, processTemplate.getProcessTypeId()))).ifPresent(processType -> processTemplate.setProcessTypeName(processType.getName()))); + + return processTemplatePage; + } +} 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 new file mode 100644 index 0000000..ef07789 --- /dev/null +++ b/service-oa/src/main/java/com/atguigu/process/service/impl/OaProcessTypeServiceImpl.java @@ -0,0 +1,20 @@ +package com.atguigu.process.service.impl; + +import com.atguigu.model.process.ProcessType; +import com.atguigu.process.mapper.OaProcessTypeMapper; +import com.atguigu.process.service.OaProcessTypeService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 审批类型 服务实现类 + *

+ * + * @author yovinchen + * @since 2023-06-15 + */ +@Service +public class OaProcessTypeServiceImpl extends ServiceImpl implements OaProcessTypeService { + +} diff --git a/service-oa/src/main/resources/application-dev.yml b/service-oa/src/main/resources/application-dev.yml index ce4adfd..c9c3f5f 100644 --- a/service-oa/src/main/resources/application-dev.yml +++ b/service-oa/src/main/resources/application-dev.yml @@ -10,9 +10,12 @@ 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://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 diff --git a/service-oa/src/main/resources/process/leave.bpmn20.xml b/service-oa/src/main/resources/process/leave.bpmn20.xml new file mode 100644 index 0000000..78e0cfb --- /dev/null +++ b/service-oa/src/main/resources/process/leave.bpmn20.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/service-oa/src/main/resources/process/leave.png b/service-oa/src/main/resources/process/leave.png new file mode 100644 index 0000000000000000000000000000000000000000..339e80f2189317451fc903bbb806bcf20accf932 GIT binary patch literal 6498 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 YDQaB$w?drOPKKzZu6w`Y-ji4V1%if6N&o-= literal 0 HcmV?d00001 diff --git a/service-oa/src/main/resources/process/leave001.bpmn20.xml b/service-oa/src/main/resources/process/leave001.bpmn20.xml new file mode 100644 index 0000000..c43e5ae --- /dev/null +++ b/service-oa/src/main/resources/process/leave001.bpmn20.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/service-oa/src/main/resources/process/leave001.png b/service-oa/src/main/resources/process/leave001.png new file mode 100644 index 0000000000000000000000000000000000000000..d207935e3bdb6a4b257a72f56eb119f14a6efb4b GIT binary patch literal 19480 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 KxvX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/service-oa/src/main/resources/process/overtime.png b/service-oa/src/main/resources/process/overtime.png new file mode 100644 index 0000000000000000000000000000000000000000..44f76f235e86051b8c34c161a632ec1610801c87 GIT binary patch literal 8071 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/service-oa/src/main/resources/process/overtime001.png b/service-oa/src/main/resources/process/overtime001.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e68c518f39d9b3a6406f805eb7ed2f1dfa4ec8 GIT binary patch literal 17846 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/service-oa/src/main/resources/process/overtime02.bpmn20.xml b/service-oa/src/main/resources/process/overtime02.bpmn20.xml new file mode 100644 index 0000000..fba580f --- /dev/null +++ b/service-oa/src/main/resources/process/overtime02.bpmn20.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/service-oa/src/main/resources/process/overtime04.bpmn20.xml b/service-oa/src/main/resources/process/overtime04.bpmn20.xml new file mode 100644 index 0000000..6a0773c --- /dev/null +++ b/service-oa/src/main/resources/process/overtime04.bpmn20.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/service-oa/src/main/resources/process/qingjia.bpmn20.xml b/service-oa/src/main/resources/process/qingjia.bpmn20.xml deleted file mode 100644 index 64ca3e2..0000000 --- a/service-oa/src/main/resources/process/qingjia.bpmn20.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/service-oa/src/main/resources/process/qingjia.png b/service-oa/src/main/resources/process/qingjia.png deleted file mode 100644 index b9a75574f2ae46de18ea3beb092c7c05d17d608e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7646 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 diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/MyTaskListener.java b/service-oa/src/test/java/com/atguigu/auth/activti/MyTaskListener.java new file mode 100644 index 0000000..c7d40b0 --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/auth/activti/MyTaskListener.java @@ -0,0 +1,25 @@ +package com.atguigu.auth.activti; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +/** + * ClassName: MyTaskListener + * Package: com.atguigu.auth.activti + * + * @author yovinchen + * @Create 2023/6/12 15:12 + */ +public class MyTaskListener implements TaskListener { + + @Override + public void notify(DelegateTask delegateTask) { + if (delegateTask.getName().equals("经理审批")) { + //这里指定任务负责人 + delegateTask.setAssignee("Jack1"); + } else if (delegateTask.getName().equals("人事审批")) { + //这里指定任务负责人 + delegateTask.setAssignee("Jack2"); + } + } +} diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTest.java b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTest.java index bf6e25b..e8bf974 100644 --- a/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTest.java +++ b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTest.java @@ -29,18 +29,27 @@ import java.util.List; @SpringBootTest public class ProcessTest { + /** + * 流程定义 + */ @Autowired private RepositoryService repositoryService; - + /** + * 流程实例 + */ @Autowired private RuntimeService runtimeService; - + /** + * 流程任务 + */ @Autowired private TaskService taskService; - + /** + * 相关操作历史 + */ @Autowired private HistoryService historyService; @@ -49,7 +58,7 @@ public class ProcessTest { */ @Test public void SingleSuspendProcessInstance() { - String processInstanceId = "8bdff984-ab53-11ed-9b17-f8e43b734677"; + String processInstanceId = "ce1f3cc0-08cf-11ee-b8cb-e645a9a03302"; ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); //获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的 boolean suspended = processInstance.isSuspended(); @@ -67,17 +76,17 @@ public class ProcessTest { */ @Test public void suspendProcessInstance() { - ProcessDefinition qingjia = repositoryService.createProcessDefinitionQuery().processDefinitionKey("qingjia").singleResult(); + ProcessDefinition leave = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave").singleResult(); // 获取到当前流程定义是否为暂停状态 suspended方法为true是暂停的,suspended方法为false是运行的 - boolean suspended = qingjia.isSuspended(); + boolean suspended = leave.isSuspended(); if (suspended) { // 暂定,那就可以激活 // 参数1:流程定义的id 参数2:是否激活 参数3:时间点 - repositoryService.activateProcessDefinitionById(qingjia.getId(), true, null); - System.out.println("流程定义:" + qingjia.getId() + "激活"); + repositoryService.activateProcessDefinitionById(leave.getId(), true, null); + System.out.println("流程定义:" + leave.getId() + "激活"); } else { - repositoryService.suspendProcessDefinitionById(qingjia.getId(), true, null); - System.out.println("流程定义:" + qingjia.getId() + "挂起"); + repositoryService.suspendProcessDefinitionById(leave.getId(), true, null); + System.out.println("流程定义:" + leave.getId() + "挂起"); } } @@ -89,7 +98,7 @@ public class ProcessTest { String businessKey = "1"; // 启动流程实例,指定业务标识businessKey,也就是请假申请单id ProcessInstance processInstance = runtimeService. - startProcessInstanceByKey("qingjia", businessKey); + startProcessInstanceByKey("leave", businessKey); // 输出 System.out.println("业务id:" + processInstance.getBusinessKey()); } @@ -99,7 +108,7 @@ public class ProcessTest { */ public void deleteDeployment() { //部署id - String deploymentId = "5b997a98-0868-11ee-9ba7-6294623ad4e1"; + String deploymentId = "ce1f3cc0-08cf-11ee-b8cb-e645a9a03302"; //删除流程定义,如果该流程定义已有流程实例启动则删除时出错 repositoryService.deleteDeployment(deploymentId); //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式 @@ -117,11 +126,11 @@ public class ProcessTest { .list(); //输出流程定义信息 for (ProcessDefinition processDefinition : definitionList) { - System.out.println("流程定义 id=" + processDefinition.getId()); - System.out.println("流程定义 name=" + processDefinition.getName()); - System.out.println("流程定义 key=" + processDefinition.getKey()); - System.out.println("流程定义 Version=" + processDefinition.getVersion()); - System.out.println("流程部署ID =" + processDefinition.getDeploymentId()); + System.out.println("流程定义 id= " + processDefinition.getId()); + System.out.println("流程定义 name= " + processDefinition.getName()); + System.out.println("流程定义 key= " + processDefinition.getKey()); + System.out.println("流程定义 Version= " + processDefinition.getVersion()); + System.out.println("流程部署ID = " + processDefinition.getDeploymentId()); } } @@ -145,8 +154,8 @@ public class ProcessTest { */ @Test public void completTask() { - Task task = taskService.createTaskQuery().taskAssignee("zhangsan") //要查询的负责人 - .singleResult();//返回一条 + //要查询的负责人 + Task task = taskService.createTaskQuery().taskAssignee("zhangsan").singleResult();//返回一条 //完成任务,参数:任务id taskService.complete(task.getId()); @@ -175,7 +184,7 @@ public class ProcessTest { @Test public void startUpProcess() { //创建流程实例,我们需要知道流程定义的key - ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("qingjia"); + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave"); //输出实例的相关信息 System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); System.out.println("流程实例id:" + processInstance.getId()); @@ -188,7 +197,7 @@ public class ProcessTest { @Test public void deployProcess() { // 流程部署 - Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/qingjia.bpmn20.xml").addClasspathResource("process/qingjia.png").name("请假申请流程").deploy(); + Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/leave.bpmn20.xml").addClasspathResource("process/leave.png").name("请假申请流程").deploy(); System.out.println(deploy.getId()); System.out.println(deploy.getName()); } diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome001.java b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome001.java new file mode 100644 index 0000000..b5fcdd8 --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome001.java @@ -0,0 +1,137 @@ +package com.atguigu.auth.activti; + +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.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * ClassName: ProcessTestDome001 + * Package: com.atguigu.auth.activti + * + * @author yovinchen + * @Create 2023/6/13 16:38 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class ProcessTestDome001 { + + + /** + * 流程定义 + */ + @Autowired + private RepositoryService repositoryService; + + /** + * 流程实例 + */ + @Autowired + private RuntimeService runtimeService; + + /** + * 流程任务 + */ + @Autowired + private TaskService taskService; + + /** + * 相关操作历史 + */ + @Autowired + private HistoryService historyService; + + /** + * 1.部署流程定义 + */ + @Test + public void deployProcess() { + Deployment deployment = repositoryService.createDeployment() + .addClasspathResource("process/overtime001.bpmn20.xml").name("请假申请流程001").deploy(); + System.out.println(deployment.getId()); + System.out.println(deployment.getName()); + } + + /** + * 2.启动流程实例 + */ + @Test + public void startProcessInstance() { + Map map = new HashMap<>(); + //设置请假天数 + map.put("day", "3"); + + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime001", map); + System.out.println(processInstance.getProcessDefinitionId()); + System.out.println(processInstance.getId()); + } + + //3 查询个人的代办任务--zhaoliu + @Test + public void findTaskList() { + +// String assign = "zhaoliu"; + String assign = "gousheng"; + List list = taskService.createTaskQuery().taskAssignee(assign).list(); + for (Task task : list) { + System.out.println("流程实例id:" + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } + +// 流程实例id:0b64992c-09ca-11ee-89e6-2aee215b35b7 +// 任务id:0b675853-09ca-11ee-89e6-2aee215b35b7 +// 任务负责人:gousheng +// 任务名称:General manager approval +// 流程实例id:99e01586-09c9-11ee-b45a-2aee215b35b7 +// 任务id:99e2ad9b-09c9-11ee-b45a-2aee215b35b7 +// 任务负责人:gousheng +// 任务名称:General manager approval +// 流程实例id:a1ef91c6-09ca-11ee-a1d9-2aee215b35b7 +// 任务id:a1f202cd-09ca-11ee-a1d9-2aee215b35b7 +// 任务负责人:gousheng +// 任务名称:General manager approval +// 流程实例id:ffa761de-09c9-11ee-a564-2aee215b35b7 +// 任务id:ffaa4815-09c9-11ee-a564-2aee215b35b7 +// 任务负责人:gousheng +// 任务名称:General manager approval + /** + * 删除流程定义 + */ + public void deleteDeployment() { + //部署id + String deploymentId = "ffa761de-09c9-11ee-a564-2aee215b35b7"; + //删除流程定义,如果该流程定义已有流程实例启动则删除时出错 + repositoryService.deleteDeployment(deploymentId); + //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式 + repositoryService.deleteDeployment(deploymentId, true); + } + + /** + * 完成任务 + */ + @Test + public void completeTask() { + Task task = taskService.createTaskQuery() +// .taskAssignee("zhaoliu") + .taskAssignee("gousheng") + .singleResult();//返回一条 + + //完成任务,参数:任务id + taskService.complete(task.getId()); + } +} diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome002.java b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome002.java new file mode 100644 index 0000000..b6c75fd --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome002.java @@ -0,0 +1,126 @@ +package com.atguigu.auth.activti; + +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.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * ClassName: ProcessTestDome002 + * Package: com.atguigu.auth.activti + * + * @author yovinchen + * @Create 2023/6/13 16:50 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class ProcessTestDome002 { + + + /** + * 流程定义 + */ + @Autowired + private RepositoryService repositoryService; + + /** + * 流程实例 + */ + @Autowired + private RuntimeService runtimeService; + + /** + * 流程任务 + */ + @Autowired + private TaskService taskService; + + /** + * 相关操作历史 + */ + @Autowired + private HistoryService historyService; + + /** + * 1.部署流程定义 + */ + @Test + public void deployProcess() { + Deployment deployment = repositoryService.createDeployment() + .addClasspathResource("process/leave001.bpmn20.xml").name("请假申请流程002").deploy(); + System.out.println(deployment.getId()); + System.out.println(deployment.getName()); + } + + /** + * 2.启动流程实例 + */ + @Test + public void startProcessInstance() { + Map map = new HashMap<>(); + //设置请假天数 + map.put("day", "3"); + + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave001", map); + System.out.println(processInstance.getProcessDefinitionId()); + System.out.println(processInstance.getId()); + } + + //3 查询个人的代办任务--zhaoliu + @Test + public void findTaskList() { + +// String assign = "wang5"; + +// 流程实例id:851c5a11-09cc-11ee-a8fc-2aee215b35b7 +// 任务id:85200399-09cc-11ee-a8fc-2aee215b35b7 +// 任务负责人:wang5 +// 任务名称:Department manager approval + +// String assign = "gouwa"; + +// 流程实例id:851c5a11-09cc-11ee-a8fc-2aee215b35b7 +// 任务id:8520039b-09cc-11ee-a8fc-2aee215b35b7 + + String assign = "xiaoli"; + +// 流程实例id:851c5a11-09cc-11ee-a8fc-2aee215b35b7 +// 任务id:d3756b55-09cc-11ee-9240-2aee215b35b7 +// 任务负责人:xiaoli +// 任务名称:Personnel record + + List list = taskService.createTaskQuery().taskAssignee(assign).list(); + for (Task task : list) { + System.out.println("流程实例id:" + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } + + /** + * 完成任务 + */ + @Test + public void completeTask() { + Task task = taskService.createTaskQuery() + .taskAssignee("wang5") + .taskAssignee("gouwa") + .singleResult();//返回一条 + + //完成任务,参数:任务id + taskService.complete(task.getId()); + } +} diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome1.java b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome1.java new file mode 100644 index 0000000..37833d0 --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome1.java @@ -0,0 +1,188 @@ +package com.atguigu.auth.activti; + +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.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * ClassName: ProcessTestDome1 + * Package: com.atguigu.auth.activti + * + * @author yovinchen + * @Create 2023/6/12 11:38 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class ProcessTestDome1 { + + + /** + * 流程定义 + */ + @Autowired + private RepositoryService repositoryService; + + /** + * 流程实例 + */ + @Autowired + private RuntimeService runtimeService; + + /** + * 流程任务 + */ + @Autowired + private TaskService taskService; + + /** + * 相关操作历史 + */ + @Autowired + private HistoryService historyService; + + //----------------------------------------- 监听器分配任务----------------------------------- + + /** + * 部署流程定义 + */ + @Test + public void deployProcess02() { + Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/overtime02.bpmn20.xml").name("加班申请流程02").deploy(); + System.out.println("deploy.getId() = " + deploy.getId()); + System.out.println("deploy.getName() = " + deploy.getName()); + } + + /** + * 启动流程实例 + */ + @Test + public void startProcessInstance02() { + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime02"); + System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId()); + System.out.println("processInstance.getId() = " + processInstance.getId()); + } + + + /** + * 查询个人的代办任务--Jack1 + */ + @Test + public void findTaskList02() { + String assign = "Jack1"; + List list = taskService.createTaskQuery().taskAssignee(assign).list(); + for (Task task : list) { + System.out.println("task.getProcessInstanceId() = " + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } + +//-----------------------uel-method--------------------------------- + + /** + * 部署流程定义 + */ + @Test + public void deployProcess01() { + // 流程部署 + Deployment deploy = repositoryService.createDeployment() + .addClasspathResource("process/overtime01.bpmn20.xml") + .name("加班申请流程01") + .deploy(); + System.out.println(deploy.getId()); + System.out.println(deploy.getName()); + } + + /** + * 启动流程实例 + */ + @Test + public void startUpProcess02() { + //创建流程实例,我们需要知道流程定义的key + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime01"); + //输出实例的相关信息 + System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); + System.out.println("流程实例id:" + processInstance.getId()); + } + + /** + * 查询个人的代办任务--Mac + */ + @Test + public void findTaskList01() { + String assign = "Mac"; + List list = taskService.createTaskQuery() + .taskAssignee(assign).list(); + for (Task task : list) { + System.out.println("task.getProcessInstanceId() = " + task.getProcessInstanceId()); // abb9c7c4-bb20-11ed-b608-005056c00001 + System.out.println("任务id:" + task.getId()); // abbd4a38-bb20-11ed-b608-005056c00001 + System.out.println("任务负责人:" + task.getAssignee()); // LiLei + System.out.println("任务名称:" + task.getName()); // 经理审批 + } + } + +//---------------------------------uel-value--------------------------------------- + + /** + * 部署流程定义 + */ + @Test + public void deployProcess() { + // 流程部署 + Deployment deploy = repositoryService.createDeployment() + .addClasspathResource("process/overtime.bpmn20.xml") + .name("加班申请流程") + .deploy(); + System.out.println(deploy.getId()); + System.out.println(deploy.getName()); + } + + /** + * 启动流程实例 + */ + @Test + public void startUpProcess() { + Map map = new HashMap<>(); + map.put("assignee1", "Lucy"); + map.put("assignee2", "Mack"); + //创建流程实例,我们需要知道流程定义的key + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime", map); + //输出实例的相关信息 + System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); + System.out.println("流程实例id:" + processInstance.getId()); + } + + + /** + * 查询当前个人待执行的任务 + */ + @Test + public void findPendingTaskList() { + //任务负责人 + String assignee = "zhangsan"; + List list = taskService.createTaskQuery().taskAssignee(assignee)//只查询该任务负责人的任务 + .list(); + for (Task task : list) { + System.out.println("流程实例id:" + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } + + +} diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome2.java b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome2.java new file mode 100644 index 0000000..4928824 --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome2.java @@ -0,0 +1,251 @@ +package com.atguigu.auth.activti; + +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.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * ClassName: ProcessTestDome2 + * Package: com.atguigu.auth.activti + * + * @author yovinchen + * @Create 2023/6/12 20:38 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class ProcessTestDome2 { + + + /** + * 流程定义 + */ + @Autowired + private RepositoryService repositoryService; + + /** + * 流程实例 + */ + @Autowired + private RuntimeService runtimeService; + + /** + * 流程任务 + */ + @Autowired + private TaskService taskService; + + /** + * 相关操作历史 + */ + @Autowired + private HistoryService historyService; + +// /** +// * 部署流程定义 +// */ +// @Test +// public void deployProcess02() { +// Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/overtime.bpmn20.xml").name("加班申请流程02").deploy(); +// System.out.println("deploy.getId() = " + deploy.getId()); +// System.out.println("deploy.getName() = " + deploy.getName()); +// } +// +// /** +// * 启动流程实例 +// */ +// @Test +// public void startProcessInstance02() { +// ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime02"); +// System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId()); +// System.out.println("processInstance.getId() = " + processInstance.getId()); +// } +// +// +// /** +// * 查询个人的代办任务--Jack1 +// */ +// @Test +// public void findTaskList02() { +// String assign = "Jack1"; +// List list = taskService.createTaskQuery().taskAssignee(assign).list(); +// for (Task task : list) { +// System.out.println("task.getProcessInstanceId() = " + task.getProcessInstanceId()); +// System.out.println("任务id:" + task.getId()); +// System.out.println("任务负责人:" + task.getAssignee()); +// System.out.println("任务名称:" + task.getName()); +// } +// } +// +////-----------------------uel-method--------------------------------- +// +// /** +// * 部署流程定义 +// */ +// @Test +// public void deployProcess01() { +// // 流程部署 +// Deployment deploy = repositoryService.createDeployment() +// .addClasspathResource("process/overtime01.bpmn20.xml") +// .name("加班申请流程01") +// .deploy(); +// System.out.println(deploy.getId()); +// System.out.println(deploy.getName()); +// } +// +// /** +// * 启动流程实例 +// */ +// @Test +// public void startUpProcess02() { +// //创建流程实例,我们需要知道流程定义的key +// ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime01"); +// //输出实例的相关信息 +// System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); +// System.out.println("流程实例id:" + processInstance.getId()); +// } +// +// /** +// * 查询个人的代办任务--Mac +// */ +// @Test +// public void findTaskList01() { +// String assign = "Mac"; +// List list = taskService.createTaskQuery() +// .taskAssignee(assign).list(); +// for (Task task : list) { +// System.out.println("task.getProcessInstanceId() = " + task.getProcessInstanceId()); // abb9c7c4-bb20-11ed-b608-005056c00001 +// System.out.println("任务id:" + task.getId()); // abbd4a38-bb20-11ed-b608-005056c00001 +// System.out.println("任务负责人:" + task.getAssignee()); // LiLei +// System.out.println("任务名称:" + task.getName()); // 经理审批 +// } +// } +// +////---------------------------------uel-value--------------------------------------- + + /** + * 部署流程定义 + */ + @Test + public void deployProcess() { + // 流程部署 + Deployment deploy = repositoryService.createDeployment() + .addClasspathResource("process/overtime.bpmn20.xml") + .name("加班申请流程") + .deploy(); + System.out.println(deploy.getId()); + System.out.println(deploy.getName()); + } + + /** + * 启动流程实例 + */ + @Test + public void startUpProcess() { + Map map = new HashMap<>(); + map.put("assignee1", "Lucy01"); + map.put("assignee2", "Mack01"); + //创建流程实例,我们需要知道流程定义的key + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime", map); + //输出实例的相关信息 + System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); + System.out.println("流程实例id:" + processInstance.getId()); + } + + + /** + * 查询当前个人待执行的任务 + */ + @Test + public void findPendingTaskList() { + //任务负责人 + String assignee = "Lucy01"; + List list = taskService.createTaskQuery().taskAssignee(assignee)//只查询该任务负责人的任务 + .list(); + for (Task task : list) { + System.out.println("流程实例id:" + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } +//--------------------------------------------------------------------------------- + + /** + * 部署流程定义 + */ + @Test + public void deployProcess03() { + // 流程部署 + Deployment deploy = repositoryService.createDeployment() + .addClasspathResource("process/overtime.bpmn20.xml") + .name("加班申请流程") + .deploy(); + System.out.println(deploy.getId()); + System.out.println(deploy.getName()); + } + + /** + * 启动流程实例 + */ + @Test + public void startUpProcess03() { + Map map = new HashMap<>(); + map.put("assignee1", "Lucy03"); +// map.put("assignee2", "Mack01"); + //创建流程实例,我们需要知道流程定义的key + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime", map); + //输出实例的相关信息 + System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); + System.out.println("流程实例id:" + processInstance.getId()); + } + + + @Test + public void completTask() { + Task task = taskService.createTaskQuery() + .taskAssignee("Lucy03") //要查询的负责人 + .singleResult();//返回一条 + + Map variables = new HashMap<>(); + variables.put("assignee2", "zhao"); + //完成任务,参数:任务id + taskService.complete(task.getId(), variables); + } + + /** + * 查询当前个人待执行的任务 + *

+ * 流程实例id:245a58e7-0923-11ee-8637-b60fbe4e0138 + * 任务id:29c9f30a-0923-11ee-abdf-b60fbe4e0138 + * 任务负责人:zhao + * 任务名称:Personnel approval + */ + @Test + public void findPendingTaskList03() { + //任务负责人 + String assignee = "zhao"; + List list = taskService.createTaskQuery().taskAssignee(assignee)//只查询该任务负责人的任务 + .list(); + for (Task task : list) { + System.out.println("流程实例id:" + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } + + +} diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome3.java b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome3.java new file mode 100644 index 0000000..069a069 --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTestDome3.java @@ -0,0 +1,138 @@ +package com.atguigu.auth.activti; + +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.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * ClassName: ProcessTestDome3 + * Package: com.atguigu.auth.activti + * + * @author yovinchen + * @Create 2023/6/12 20:38 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class ProcessTestDome3 { + + + /** + * 流程定义 + */ + @Autowired + private RepositoryService repositoryService; + + /** + * 流程实例 + */ + @Autowired + private RuntimeService runtimeService; + + /** + * 流程任务 + */ + @Autowired + private TaskService taskService; + + /** + * 相关操作历史 + */ + @Autowired + private HistoryService historyService; + + /** + * 1.部署流程定义和启动流程实例 + */ + @Test + public void deployProcess03() { + // 流程部署 + Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/overtime04.bpmn20.xml").name("加班申请流程04").deploy(); + System.out.println(deploy.getId()); + System.out.println(deploy.getName()); + + Map map = new HashMap<>(); +// map.put("assignee1", "Lucy03"); +// map.put("assignee2", "Mack01"); + //创建流程实例,我们需要知道流程定义的key + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("overtime04", map); + //输出实例的相关信息 + System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); + System.out.println("流程实例id:" + processInstance.getId()); + } + + /** + * 2.查询组任务 + */ + @Test + public void findGroupTaskList() { + List list = taskService.createTaskQuery() + .taskCandidateUser("tom01") + .list(); + for (Task task : list) { + System.out.println("----------------------------"); + System.out.println("流程实例id:" + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } + + /** + * 3.拾取组任务 + */ + @Test + public void claimTask() { + //拾取任务,即使该用户不是候选人也能拾取(建议拾取时校验是否有资格) + //校验该用户有没有拾取任务的资格 + Task task = taskService.createTaskQuery() + .taskCandidateUser("tom01")//根据候选人查询 + .singleResult(); + if (task != null) { + //拾取任务 + taskService.claim(task.getId(), "tom01"); + System.out.println("任务拾取成功"); + } + } + + /** + * 4.查询个人代办任务 + */ + @Test + public void findGroupPendingTaskList() { + //任务负责人 + String assignee = "tom01"; + List list = taskService.createTaskQuery() + .taskAssignee(assignee)//只查询该任务负责人的任务 + .list(); + for (Task task : list) { + System.out.println("流程实例id:" + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } + + /** + * 5.办理个人任务 + */ + @Test + public void completGroupTask() { + Task task = taskService.createTaskQuery() + .taskAssignee("tom01") //要查询的负责人 + .singleResult();//返回一条 + taskService.complete(task.getId()); + } +} diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/UserBean.java b/service-oa/src/test/java/com/atguigu/auth/activti/UserBean.java new file mode 100644 index 0000000..75c3643 --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/auth/activti/UserBean.java @@ -0,0 +1,25 @@ +package com.atguigu.auth.activti; + +import org.springframework.stereotype.Component; + +/** + * ClassName: UserBean + * Package: com.atguigu.auth.activti + * + * @author yovinchen + * @Create 2023/6/12 14:52 + */ + +@Component +public class UserBean { + + public String getUsername(int id) { + if (id == 1) { + return "Mac"; + } + if (id == 2) { + return "Lila"; + } + return "admin"; + } +} 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 a622a92..4be8cab 100644 --- a/service-oa/src/test/java/com/atguigu/code/CodeGet.java +++ b/service-oa/src/test/java/com/atguigu/code/CodeGet.java @@ -38,7 +38,7 @@ public class CodeGet { // 4、包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.atguigu"); - pc.setModuleName("auth"); //模块名 + pc.setModuleName("process"); //模块名 pc.setController("controller"); pc.setService("service"); pc.setMapper("mapper"); @@ -47,7 +47,7 @@ public class CodeGet { // 5、策略配置 StrategyConfig strategy = new StrategyConfig(); - strategy.setInclude("sys_menu","sys_role_menu"); + strategy.setInclude("oa_process_type","oa_process_template"); //数据库表映射到实体的命名策略 strategy.setNaming(NamingStrategy.underline_to_camel); //数据库表字段映射到实体的命名策略 diff --git a/service-oa/src/test/java/com/atguigu/process/Test.java b/service-oa/src/test/java/com/atguigu/process/Test.java new file mode 100644 index 0000000..4d40368 --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/process/Test.java @@ -0,0 +1,37 @@ +package com.atguigu.process; + +import com.atguigu.common.result.Result; +import com.atguigu.model.process.ProcessTemplate; +import com.atguigu.model.system.SysRole; +import com.atguigu.process.service.OaProcessTemplateService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +/** + * ClassName: Test + * Package: com.atguigu.process + * + * @author yovinchen + * @Create 2023/6/15 18:32 + */ +@SpringBootTest +public class Test { + + @Autowired + private OaProcessTemplateService processTemplateService; + @org.junit.jupiter.api.Test + public void getPage() { + Page pageInfo = new Page<>(1, 10); + //分页查询审批模板,把审批类型对应名称查询 + IPage pageModel = + processTemplateService.selectPageProcessTemplate(pageInfo); + + } +}