lxzn-boot-base-core/pom.xml
@@ -98,8 +98,8 @@ <!-- sqlserver--> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version>${sqljdbc4.version}</version> <artifactId>mssql-jdbc</artifactId> <version>${mssql-jdbc.version}</version> <scope>runtime</scope> </dependency> <!-- oracleé©±å¨ --> @@ -221,4 +221,4 @@ </dependency> </dependencies> </project> </project> lxzn-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java
@@ -132,7 +132,7 @@ .apiInfo(apiInfo()) .select() //æ¤å è·¯å¾ä¸çç±»ï¼æçææ¥å£ææ¡£ .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.activiti")) .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.flowable")) //å äºApiOperation注解çç±»ï¼æçææ¥å£ææ¡£ .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) @@ -141,7 +141,7 @@ .securitySchemes(Collections.singletonList(securityScheme())) .securityContexts(securityContexts()) .globalOperationParameters(setHeaderToken()) .groupName("Activiti模å"); .groupName("Flowable模å"); } /*** lxzn-module-activiti/pom.xml
ÎļþÒÑɾ³ý lxzn-module-activiti/src/main/java/org/activiti/engine/impl/AbstractQuery.java
ÎļþÒÑɾ³ý lxzn-module-activiti/src/main/java/org/activiti/engine/impl/cfg/ProcessEngineConfigurationImpl.java
ÎļþÒÑɾ³ý lxzn-module-activiti/src/main/java/org/activiti/engine/impl/db/DbSqlSession.java
ÎļþÒÑɾ³ý lxzn-module-activiti/src/main/java/org/activiti/engine/impl/db/DbSqlSessionFactory.java
ÎļþÒÑɾ³ý lxzn-module-dnc/pom.xml
@@ -22,8 +22,8 @@ </dependency> <dependency> <groupId>org.jeecgframework.boot</groupId> <artifactId>lxzn-module-activiti</artifactId> <version>3.4.3</version> <artifactId>lxzn-module-flowable</artifactId> <version>${jeecgboot.version}</version> </dependency> <dependency> <groupId>org.graylog2</groupId> lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/controller/ActivitiDefinitionController.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/controller/ActivitiSignExamineController.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/controller/AssignFileStreamController.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/entity/ActivitiDefinition.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/entity/ActivitiSignExamine.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/entity/AssignFileStream.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/entity/ToEquipmentTask.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/ext/ActTaskExt.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/ext/AssignFileStreamExt.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/mapper/ActivitiDefinitionMapper.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/mapper/ActivitiSignExamineMapper.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/mapper/AssignFileStreamMapper.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/mapper/ToEquipmentTaskMapper.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/mapper/xml/AssignFileStreamMapper.xml
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/request/ActivitiDefinitionRequest.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/request/ApproveBatchRequest.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/request/AssignFileRequest.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/request/AssignFileStreamQueryRequest.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/request/TaskRequest.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/service/IActivitiDefinitionService.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/service/IActivitiSignExamineService.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/service/IAssignFileStreamService.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/service/IToEquipmentTaskService.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/service/impl/ActivitiDefinitionServiceImpl.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/service/impl/ActivitiSignExamineServiceimpl.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/service/impl/AssignFileStreamServiceImpl.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/activiti/service/impl/ToEquipmentTaskServiceImpl.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DepartmentController.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/DeviceGroupController.java
@@ -80,27 +80,27 @@ return new QueryListResponseResult<>(CommonCode.SUCCESS, list); } @AutoLog(value = "设å¤åç»è¡¨-ç»åç»åé é¨é¨æé") @ApiOperation(value = "设å¤åç»è¡¨-ç»åç»åé é¨é¨æé", notes = "设å¤åç»è¡¨-ç»åç»åé é¨é¨æé") @PostMapping("/assign/add/depart/{groupId}/{relativeFlag}") public ResponseResult assignAddDepartment(@PathVariable("groupId") String groupId, @PathVariable("relativeFlag") Integer relativeFlag, @RequestBody String[] departmentIds) { boolean b = deviceGroupService.assignAddDepartment(groupId, relativeFlag, departmentIds); if(b) { return new ResponseResult(CommonCode.SUCCESS); } return new ResponseResult(CommonCode.FAIL); } @AutoLog(value = "设å¤åç»è¡¨-ç§»é¤åç»åé é¨é¨æé") @ApiOperation(value = "设å¤åç»è¡¨-ç§»é¤åç»åé é¨é¨æé", notes = "设å¤åç»è¡¨-ç§»é¤åç»åé é¨é¨æé") @PostMapping("/assign/remove/depart/{groupId}/{relativeFlag}") public ResponseResult assignRemoveDepartment(@PathVariable("groupId") String groupId, @PathVariable("relativeFlag") Integer relativeFlag, @RequestBody String[] departmentIds) { boolean b = deviceGroupService.assignRemoveDepartment(groupId, relativeFlag, departmentIds); if(b) { return new ResponseResult(CommonCode.SUCCESS); } return new ResponseResult(CommonCode.FAIL); } // @AutoLog(value = "设å¤åç»è¡¨-ç»åç»åé é¨é¨æé") // @ApiOperation(value = "设å¤åç»è¡¨-ç»åç»åé é¨é¨æé", notes = "设å¤åç»è¡¨-ç»åç»åé é¨é¨æé") // @PostMapping("/assign/add/depart/{groupId}/{relativeFlag}") // public ResponseResult assignAddDepartment(@PathVariable("groupId") String groupId, @PathVariable("relativeFlag") Integer relativeFlag, @RequestBody String[] departmentIds) { // boolean b = deviceGroupService.assignAddDepartment(groupId, relativeFlag, departmentIds); // if(b) { // return new ResponseResult(CommonCode.SUCCESS); // } // return new ResponseResult(CommonCode.FAIL); // } // // @AutoLog(value = "设å¤åç»è¡¨-ç§»é¤åç»åé é¨é¨æé") // @ApiOperation(value = "设å¤åç»è¡¨-ç§»é¤åç»åé é¨é¨æé", notes = "设å¤åç»è¡¨-ç§»é¤åç»åé é¨é¨æé") // @PostMapping("/assign/remove/depart/{groupId}/{relativeFlag}") // public ResponseResult assignRemoveDepartment(@PathVariable("groupId") String groupId, @PathVariable("relativeFlag") Integer relativeFlag, @RequestBody String[] departmentIds) { // boolean b = deviceGroupService.assignRemoveDepartment(groupId, relativeFlag, departmentIds); // if(b) { // return new ResponseResult(CommonCode.SUCCESS); // } // return new ResponseResult(CommonCode.FAIL); // } } lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/UserPermButtonController.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDepartmentService.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDeviceGroupService.java
@@ -108,23 +108,23 @@ */ List<Department> getDepartNonPermsList(String groupId); /** * ç»åç»åé é¨é¨æé * @param groupId * @param relativeFlag * @param departmentIds * @return */ boolean assignAddDepartment(String groupId, Integer relativeFlag, String[] departmentIds); /** * ç§»é¤åç»åé é¨é¨æé * @param groupId * @param relativeFlag * @param departmentIds * @return */ boolean assignRemoveDepartment(String groupId, Integer relativeFlag, String[] departmentIds); // /** // * ç»åç»åé é¨é¨æé // * @param groupId // * @param relativeFlag // * @param departmentIds // * @return // */ // boolean assignAddDepartment(String groupId, Integer relativeFlag, String[] departmentIds); // // /** // * ç§»é¤åç»åé é¨é¨æé // * @param groupId // * @param relativeFlag // * @param departmentIds // * @return // */ // boolean assignRemoveDepartment(String groupId, Integer relativeFlag, String[] departmentIds); /** * ç»åç»åé é¨é¨æé lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IUserPermButtonService.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DepartmentServiceImpl.java
ÎļþÒÑɾ³ý lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DeviceGroupServiceImpl.java
@@ -39,8 +39,6 @@ @Autowired private IDeviceGroupDepartService deviceGroupDepartService; @Autowired private IDepartmentService departmentService; @Autowired @Lazy private IDeviceInfoService deviceInfoService; @Autowired @@ -375,83 +373,83 @@ return deviceGroupDepartService.getDepartNonPermsByGroupId(groupId); } @Override @Transactional(rollbackFor = {Exception.class}) public boolean assignAddDepartment(String groupId, Integer relativeFlag, String[] departmentIds) { if(!ValidateUtil.validateString(groupId) || !ValidateUtil.validateInteger(relativeFlag) || departmentIds == null || departmentIds.length < 1) ExceptionCast.cast(CommonCode.INVALID_PARAM); List<String> ids = new ArrayList<>(departmentIds.length); Collections.addAll(ids, departmentIds); Collection<Department> departmentList = departmentService.listByIds(ids); if(departmentList == null || departmentList.isEmpty() || departmentList.size() != departmentIds.length) ExceptionCast.cast(CommonCode.INVALID_PARAM); DeviceGroup deviceGroup = super.getById(groupId); if(deviceGroup == null) ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_NOT_EXIST); boolean b1 = deviceInfoService.checkDevicePerm(1, deviceGroup.getGroupId()); if(!b1) { ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); } b1 = assignAddDepartment(deviceGroup, departmentList); if(!b1) { ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); } if(relativeFlag == 1) { //è·ååç»ä¸ææçååç» List<DeviceGroup> childrenList = getChildrenByParentId(deviceGroup.getGroupId()); if(childrenList != null && !childrenList.isEmpty()) { childrenList.forEach(item -> { boolean b = deviceInfoService.checkDevicePerm(1, item.getGroupId()); if(b) { b = assignAddDepartment(item, departmentList); if(!b) { ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); } } }); } } return true; } @Override @Transactional(rollbackFor = {Exception.class}) public boolean assignRemoveDepartment(String groupId, Integer relativeFlag, String[] departmentIds) { if(!ValidateUtil.validateString(groupId) || !ValidateUtil.validateInteger(relativeFlag) || departmentIds == null || departmentIds.length < 1) ExceptionCast.cast(CommonCode.INVALID_PARAM); List<String> ids = new ArrayList<>(departmentIds.length); Collections.addAll(ids, departmentIds); Collection<Department> departmentList = departmentService.listByIds(ids); if(departmentList == null || departmentList.isEmpty() || departmentList.size() != departmentIds.length) ExceptionCast.cast(CommonCode.INVALID_PARAM); DeviceGroup deviceGroup = super.getById(groupId); if(deviceGroup == null) ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_NOT_EXIST); boolean b1 = deviceInfoService.checkDevicePerm(1, deviceGroup.getGroupId()); if(!b1) { ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); } b1 = assignRemoveDepartment(deviceGroup, departmentList); if(!b1) { ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); } if(relativeFlag == 1) { //è·ååç»ä¸ææçååç» List<DeviceGroup> childrenList = getChildrenByParentId(deviceGroup.getGroupId()); if(childrenList != null && !childrenList.isEmpty()) { childrenList.forEach(item -> { boolean b = deviceInfoService.checkDevicePerm(1, item.getGroupId()); if(b) { b = assignRemoveDepartment(item, departmentList); if(!b) { ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); } } }); } } return true; } // @Override // @Transactional(rollbackFor = {Exception.class}) // public boolean assignAddDepartment(String groupId, Integer relativeFlag, String[] departmentIds) { // if(!ValidateUtil.validateString(groupId) || !ValidateUtil.validateInteger(relativeFlag) || departmentIds == null || departmentIds.length < 1) // ExceptionCast.cast(CommonCode.INVALID_PARAM); // List<String> ids = new ArrayList<>(departmentIds.length); // Collections.addAll(ids, departmentIds); // Collection<Department> departmentList = departmentService.listByIds(ids); // if(departmentList == null || departmentList.isEmpty() || departmentList.size() != departmentIds.length) // ExceptionCast.cast(CommonCode.INVALID_PARAM); // DeviceGroup deviceGroup = super.getById(groupId); // if(deviceGroup == null) // ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_NOT_EXIST); // boolean b1 = deviceInfoService.checkDevicePerm(1, deviceGroup.getGroupId()); // if(!b1) { // ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); // } // b1 = assignAddDepartment(deviceGroup, departmentList); // if(!b1) { // ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); // } // if(relativeFlag == 1) { // //è·ååç»ä¸ææçååç» // List<DeviceGroup> childrenList = getChildrenByParentId(deviceGroup.getGroupId()); // if(childrenList != null && !childrenList.isEmpty()) { // childrenList.forEach(item -> { // boolean b = deviceInfoService.checkDevicePerm(1, item.getGroupId()); // if(b) { // b = assignAddDepartment(item, departmentList); // if(!b) { // ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); // } // } // }); // } // } // return true; // } // // @Override // @Transactional(rollbackFor = {Exception.class}) // public boolean assignRemoveDepartment(String groupId, Integer relativeFlag, String[] departmentIds) { // if(!ValidateUtil.validateString(groupId) || !ValidateUtil.validateInteger(relativeFlag) || departmentIds == null || departmentIds.length < 1) // ExceptionCast.cast(CommonCode.INVALID_PARAM); // List<String> ids = new ArrayList<>(departmentIds.length); // Collections.addAll(ids, departmentIds); // Collection<Department> departmentList = departmentService.listByIds(ids); // if(departmentList == null || departmentList.isEmpty() || departmentList.size() != departmentIds.length) // ExceptionCast.cast(CommonCode.INVALID_PARAM); // DeviceGroup deviceGroup = super.getById(groupId); // if(deviceGroup == null) // ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_NOT_EXIST); // boolean b1 = deviceInfoService.checkDevicePerm(1, deviceGroup.getGroupId()); // if(!b1) { // ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); // } // b1 = assignRemoveDepartment(deviceGroup, departmentList); // if(!b1) { // ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); // } // if(relativeFlag == 1) { // //è·ååç»ä¸ææçååç» // List<DeviceGroup> childrenList = getChildrenByParentId(deviceGroup.getGroupId()); // if(childrenList != null && !childrenList.isEmpty()) { // childrenList.forEach(item -> { // boolean b = deviceInfoService.checkDevicePerm(1, item.getGroupId()); // if(b) { // b = assignRemoveDepartment(item, departmentList); // if(!b) { // ExceptionCast.cast(DeviceGroupCode.DEVICE_GROUP_PERM_ERROR); // } // } // }); // } // } // return true; // } @Override @Transactional(rollbackFor = {Exception.class}) lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/UserPermButtonServiceImpl.java
ÎļþÒÑɾ³ý lxzn-module-flowable/pom.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>lxzn-boot-parent</artifactId> <groupId>org.jeecgframework.boot</groupId> <version>3.4.3</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>lxzn-module-flowable</artifactId> <dependencies> <!--ä¿æç¬ç«ï¼åªå¼å ¥jeecgåºç¡æ¨¡å --> <dependency> <groupId>org.jeecgframework.boot</groupId> <artifactId>lxzn-boot-base-core</artifactId> </dependency> <!--=======================================flow模åç¬ç«===================================--> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-engine</artifactId> <scope>compile</scope> <version>6.4.0</version> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter-basic</artifactId> <version>6.4.0</version> </dependency> <!--表达å¼è§£æå·¥å ·--> <dependency> <groupId>org.eweb4j</groupId> <artifactId>fel</artifactId> <version>0.8</version> </dependency> <!--xmlè§£æå ï¼å¦æé¡¹ç®ä¸å·²æï¼å¼èµ·å²çªï¼å¯æ³¨é--> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.12.0</version> </dependency> </dependencies> </project> lxzn-module-flowable/src/main/java/org/jeecg/JeecgFlowableCloudApplication.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package org.jeecg;//package org.jeecg; // //import org.springframework.boot.SpringApplication; //import org.springframework.boot.autoconfigure.SpringBootApplication; //import org.springframework.cloud.openfeign.EnableFeignClients; // //@SpringBootApplication //@EnableFeignClients //public class JeecgFlowableCloudApplication { // // public static void main(String[] args) { // SpringApplication.run(JeecgDemoCloudApplication.class, args); // } //} lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/entity/FlowMyBusiness.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,113 @@ package org.jeecg.modules.flowable.apithird.business.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; import java.util.Map; /** * @Description: æµç¨ä¸å¡æ©å±è¡¨ * @Author: jeecg-boot * @Date: 2021-11-25 * @Version: V1.0 */ @Data @TableName("flow_my_business") @Accessors(chain = true) @EqualsAndHashCode(callSuper = false) @ApiModel(value="flow_my_business对象", description="æµç¨ä¸å¡æ©å±è¡¨") public class FlowMyBusiness implements Serializable { private static final long serialVersionUID = 1L; /**主é®ID*/ @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "主é®ID") private String id; /**å建人*/ @ApiModelProperty(value = "å建人") private String createBy; /**å建æ¶é´*/ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") @DateTimeFormat(pattern="yyyy-MM-dd") @ApiModelProperty(value = "å建æ¶é´") private Date createTime; /**ä¿®æ¹äºº*/ @ApiModelProperty(value = "ä¿®æ¹äºº") private String updateBy; /**ä¿®æ¹æ¶é´*/ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") @DateTimeFormat(pattern="yyyy-MM-dd") @ApiModelProperty(value = "ä¿®æ¹æ¶é´") private Date updateTime; /**æµç¨å®ä¹key ä¸ä¸ªkey伿å¤ä¸ªçæ¬çid*/ @Excel(name = "æµç¨å®ä¹key ä¸ä¸ªkey伿å¤ä¸ªçæ¬çid", width = 15) @ApiModelProperty(value = "æµç¨å®ä¹key ä¸ä¸ªkey伿å¤ä¸ªçæ¬çid") private String processDefinitionKey; /**æµç¨å®ä¹id ä¸ä¸ªæµç¨å®ä¹å¯ä¸*/ @Excel(name = "æµç¨å®ä¹id ä¸ä¸ªæµç¨å®ä¹å¯ä¸", width = 15) @ApiModelProperty(value = "æµç¨å®ä¹id ä¸ä¸ªæµç¨å®ä¹å¯ä¸") private String processDefinitionId; /**æµç¨ä¸å¡å®ä¾id ä¸ä¸ªæµç¨ä¸å¡å¯ä¸ï¼æ¬è¡¨ä¸ä¹å¯ä¸*/ @Excel(name = "æµç¨ä¸å¡å®ä¾id ä¸ä¸ªæµç¨ä¸å¡å¯ä¸ï¼æ¬è¡¨ä¸ä¹å¯ä¸", width = 15) @ApiModelProperty(value = "æµç¨ä¸å¡å®ä¾id ä¸ä¸ªæµç¨ä¸å¡å¯ä¸ï¼æ¬è¡¨ä¸ä¹å¯ä¸") private String processInstanceId; /**æµç¨ä¸å¡ç®è¦æè¿°*/ @Excel(name = "æµç¨ä¸å¡ç®è¦æè¿°", width = 15) @ApiModelProperty(value = "æµç¨ä¸å¡ç®è¦æè¿°") private String title; /**ä¸å¡è¡¨idï¼ç论å¯ä¸*/ @Excel(name = "ä¸å¡è¡¨idï¼ç论å¯ä¸", width = 15) @ApiModelProperty(value = "ä¸å¡è¡¨idï¼ç论å¯ä¸") private String dataId; /**ä¸å¡ç±»åï¼ç¨æ¥è·åspring容å¨éçæå¡å¯¹è±¡*/ @Excel(name = "ä¸å¡ç±»åï¼ç¨æ¥è·åspring容å¨éçæå¡å¯¹è±¡", width = 15) @ApiModelProperty(value = "ä¸å¡ç±»åï¼ç¨æ¥è·åspring容å¨éçæå¡å¯¹è±¡") private String serviceImplName; /**ç³è¯·äºº*/ @Excel(name = "ç³è¯·äºº", width = 15) @ApiModelProperty(value = "ç³è¯·äºº") private String proposer; /**æµç¨ç¶æè¯´æï¼æï¼å¯å¨ æ¤å 驳å 审æ¹ä¸ 审æ¹éè¿ å®¡æ¹å¼å¸¸*/ @Excel(name = "æµç¨ç¶æè¯´æï¼æï¼å¯å¨ æ¤å 驳å 审æ¹ä¸ 审æ¹éè¿ å®¡æ¹å¼å¸¸", width = 15) @ApiModelProperty(value = "æµç¨ç¶æè¯´æï¼æï¼å¯å¨ æ¤å 驳å 审æ¹ä¸ 审æ¹éè¿ å®¡æ¹å¼å¸¸") private String actStatus; /**å½åçèç¹å®ä¾ä¸çId*/ @Excel(name = "å½åçèç¹Id", width = 15) @ApiModelProperty(value = "å½åçèç¹Id") private String taskId; /**å½åçèç¹*/ @Excel(name = "å½åçèç¹", width = 15) @ApiModelProperty(value = "å½åçèç¹") private String taskName; /**å½åçèç¹å®ä¹ä¸çId*/ @Excel(name = "å½åçèç¹", width = 15) @ApiModelProperty(value = "å½åçèç¹") private String taskNameId; /**å½åçèç¹å¯ä»¥å¤ççç¨æ·åï¼ä¸ºusernameçéåjsonå符串*/ @Excel(name = "å½åçèç¹å¯ä»¥å¤ççç¨æ·å", width = 15) @ApiModelProperty(value = "å½åçèç¹å¯ä»¥å¤ççç¨æ·å") private String todoUsers; /**å¤çè¿ç人,为usernameçéåjsonå符串*/ @Excel(name = "å¤çè¿ç人", width = 15) @ApiModelProperty(value = "å¤çè¿ç人") private String doneUsers; /**å½åä»»å¡èç¹çä¼å 级 æµç¨å®ä¹çæ¶åæå¡«*/ @Excel(name = "å½åä»»å¡èç¹çä¼å 级 æµç¨å®ä¹çæ¶åæå¡«", width = 15) @ApiModelProperty(value = "å½åä»»å¡èç¹çä¼å 级 æµç¨å®ä¹çæ¶åæå¡«") private String priority; /**æµç¨åé*/ @TableField(exist = false) private Map<String,Object> values; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/entity/FlowMyBusinessDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,100 @@ package org.jeecg.modules.flowable.apithird.business.entity; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.jeecgframework.poi.excel.annotation.Excel; import java.io.Serializable; import java.util.Map; /** * @Description: æµç¨ä¸å¡æ©å±è¡¨ * @Author: jeecg-boot * @Date: 2021-11-25 * @Version: V1.0 */ @Data @Accessors(chain = true) @EqualsAndHashCode(callSuper = false) @ApiModel(value="flow_my_business对象", description="æµç¨ä¸å¡æ©å±è¡¨") public class FlowMyBusinessDto implements Serializable { private static final long serialVersionUID = 1L; /**æµç¨å®ä¹key ä¸ä¸ªkey伿å¤ä¸ªçæ¬çid*/ @TableField(exist = false) @Excel(name = "æµç¨å®ä¹key ä¸ä¸ªkey伿å¤ä¸ªçæ¬çid", width = 15) @ApiModelProperty(value = "æµç¨å®ä¹key ä¸ä¸ªkey伿å¤ä¸ªçæ¬çid") private String processDefinitionKey; /**æµç¨å®ä¹id ä¸ä¸ªæµç¨å®ä¹å¯ä¸*/ @TableField(exist = false) @Excel(name = "æµç¨å®ä¹id ä¸ä¸ªæµç¨å®ä¹å¯ä¸", width = 15) @ApiModelProperty(value = "æµç¨å®ä¹id ä¸ä¸ªæµç¨å®ä¹å¯ä¸") private String processDefinitionId; /**æµç¨ä¸å¡å®ä¾id ä¸ä¸ªæµç¨ä¸å¡å¯ä¸ï¼æ¬è¡¨ä¸ä¹å¯ä¸*/ @TableField(exist = false) @Excel(name = "æµç¨ä¸å¡å®ä¾id ä¸ä¸ªæµç¨ä¸å¡å¯ä¸ï¼æ¬è¡¨ä¸ä¹å¯ä¸", width = 15) @ApiModelProperty(value = "æµç¨ä¸å¡å®ä¾id ä¸ä¸ªæµç¨ä¸å¡å¯ä¸ï¼æ¬è¡¨ä¸ä¹å¯ä¸") private String processInstanceId; /**æµç¨ä¸å¡ç®è¦æè¿°*/ @TableField(exist = false) @Excel(name = "æµç¨ä¸å¡ç®è¦æè¿°", width = 15) @ApiModelProperty(value = "æµç¨ä¸å¡ç®è¦æè¿°") private String title; /**ä¸å¡è¡¨idï¼ç论å¯ä¸*/ @TableField(exist = false) @Excel(name = "ä¸å¡è¡¨idï¼ç论å¯ä¸", width = 15) @ApiModelProperty(value = "ä¸å¡è¡¨idï¼ç论å¯ä¸") private String dataId; /**ä¸å¡ç±»åï¼ç¨æ¥è·åspring容å¨éçæå¡å¯¹è±¡*/ @TableField(exist = false) @Excel(name = "ä¸å¡ç±»åï¼ç¨æ¥è·åspring容å¨éçæå¡å¯¹è±¡", width = 15) @ApiModelProperty(value = "ä¸å¡ç±»åï¼ç¨æ¥è·åspring容å¨éçæå¡å¯¹è±¡") private String serviceImplName; /**ç³è¯·äºº*/ @TableField(exist = false) @Excel(name = "ç³è¯·äºº", width = 15) @ApiModelProperty(value = "ç³è¯·äºº") private String proposer; /**æµç¨ç¶æè¯´æï¼æï¼å¯å¨ æ¤å 驳å 审æ¹ä¸ 审æ¹éè¿ å®¡æ¹å¼å¸¸*/ @TableField(exist = false) @Excel(name = "æµç¨ç¶æè¯´æï¼æï¼å¯å¨ æ¤å 驳å 审æ¹ä¸ 审æ¹éè¿ å®¡æ¹å¼å¸¸", width = 15) @ApiModelProperty(value = "æµç¨ç¶æè¯´æï¼æï¼å¯å¨ æ¤å 驳å 审æ¹ä¸ 审æ¹éè¿ å®¡æ¹å¼å¸¸") private String actStatus; /**å½åçèç¹å®ä¾ä¸çId*/ @TableField(exist = false) @Excel(name = "å½åçèç¹Id", width = 15) @ApiModelProperty(value = "å½åçèç¹Id") private String taskId; /**å½åçèç¹*/ @TableField(exist = false) @Excel(name = "å½åçèç¹", width = 15) @ApiModelProperty(value = "å½åçèç¹") private String taskName; /**å½åçèç¹å®ä¹ä¸çId*/ @TableField(exist = false) @Excel(name = "å½åçèç¹", width = 15) @ApiModelProperty(value = "å½åçèç¹") private String taskNameId; /**å½åçèç¹å¯ä»¥å¤ççç¨æ·åï¼ä¸ºusernameçéåjsonå符串*/ @TableField(exist = false) @Excel(name = "å½åçèç¹å¯ä»¥å¤ççç¨æ·å", width = 15) @ApiModelProperty(value = "å½åçèç¹å¯ä»¥å¤ççç¨æ·å") private String todoUsers; /**å¤çè¿ç人,为usernameçéåjsonå符串*/ @TableField(exist = false) @Excel(name = "å¤çè¿ç人", width = 15) @ApiModelProperty(value = "å¤çè¿ç人") private String doneUsers; /**å½åä»»å¡èç¹çä¼å 级 æµç¨å®ä¹çæ¶åæå¡«*/ @TableField(exist = false) @Excel(name = "å½åä»»å¡èç¹çä¼å 级 æµç¨å®ä¹çæ¶åæå¡«", width = 15) @ApiModelProperty(value = "å½åä»»å¡èç¹çä¼å 级 æµç¨å®ä¹çæ¶åæå¡«") private String priority; /**æµç¨åé*/ @TableField(exist = false) private Map<String,Object> values; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/FlowMyBusinessMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package org.jeecg.modules.flowable.apithird.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; /** * @Description: æµç¨ä¸å¡æ©å±è¡¨ * @Author: jeecg-boot * @Date: 2021-11-25 * @Version: V1.0 */ public interface FlowMyBusinessMapper extends BaseMapper<FlowMyBusiness> { } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.jeecg.modules.flowable.apithird.business.mapper.FlowMyBusinessMapper"> </mapper> lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/service/IFlowMyBusinessService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package org.jeecg.modules.flowable.apithird.business.service; import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; /** * @Description: æµç¨ä¸å¡æ©å±è¡¨ * @Author: jeecg-boot * @Date: 2021-11-25 * @Version: V1.0 */ public interface IFlowMyBusinessService extends IService<FlowMyBusiness> { } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/service/impl/FlowMyBusinessServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package org.jeecg.modules.flowable.apithird.business.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; import org.jeecg.modules.flowable.apithird.business.mapper.FlowMyBusinessMapper; import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService; import org.springframework.stereotype.Service; /** * @Description: æµç¨ä¸å¡æ©å±è¡¨ * @Author: jeecg-boot * @Date: 2021-11-25 * @Version: V1.0 */ @Service public class FlowMyBusinessServiceImpl extends ServiceImpl<FlowMyBusinessMapper, FlowMyBusiness> implements IFlowMyBusinessService { public FlowMyBusiness getByDataId(String dataId) { LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId,dataId) ; //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = this.getOne(flowMyBusinessLambdaQueryWrapper); return business; } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/common/constant/ProcessConstants.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,77 @@ package org.jeecg.modules.flowable.apithird.common.constant; /** * æµç¨å¸¸éä¿¡æ¯ * */ public class ProcessConstants { /** * 约å®çå¼å§èç¹æ è®°å */ public static final String START_NODE = "start"; /** * å¨ææ°æ® */ public static final String DATA_TYPE = "dynamic"; /** * å个审æ¹äºº */ public static final String USER_TYPE_ASSIGNEE = "assignee"; /** * åé人 */ public static final String USER_TYPE_USERS = "candidateUsers"; /** * 审æ¹ç» */ public static final String USER_TYPE_ROUPS = "candidateGroups"; /** * å个审æ¹äºº */ public static final String PROCESS_APPROVAL = "approval"; /** * ä¼ç¾äººå */ public static final String PROCESS_MULTI_INSTANCE_USER = "userList"; /** * nameapace */ public static final String NAMASPASE = "http://flowable.org/bpmn"; /** * ä¼ç¾èç¹ */ public static final String PROCESS_MULTI_INSTANCE = "multiInstance"; /** * èªå®ä¹å±æ§ dataType */ public static final String PROCESS_CUSTOM_DATA_TYPE = "dataType"; /** * èªå®ä¹å±æ§ userType */ public static final String PROCESS_CUSTOM_USER_TYPE = "userType"; /** * åå§å人å */ public static final String PROCESS_INITIATOR = "INITIATOR"; /** * æµç¨è·³è¿ */ public static final String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/common/enums/FlowComment.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package org.jeecg.modules.flowable.apithird.common.enums; /** * æµç¨æè§ç±»å * */ public enum FlowComment { /** * 说æ */ NORMAL("1", "æ£å¸¸æè§"), REBACK("2", "éåæè§"), REJECT("3", "驳åæè§"), DELEGATE("4", "å§æ´¾æè§"), ASSIGN("5", "转åæè§"), STOP("6", "ç»æ¢æµç¨"); /** * ç±»å */ private final String type; /** * 说æ */ private final String remark; FlowComment(String type, String remark) { this.type = type; this.remark = remark; } public String getType() { return type; } public String getRemark() { return remark; } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/common/exception/CustomException.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package org.jeecg.modules.flowable.apithird.common.exception; /** * èªå®ä¹å¼å¸¸ * */ public class CustomException extends RuntimeException { private static final long serialVersionUID = 1L; private Integer code; private String message; public CustomException(String message) { this.message = message; } public CustomException(String message, Integer code) { this.message = message; this.code = code; } public CustomException(String message, Throwable e) { super(message, e); this.message = message; } @Override public String getMessage() { return message; } public Integer getCode() { return code; } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/entity/ActStatus.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package org.jeecg.modules.flowable.apithird.entity; /** * @author PanMeiCheng * @version 1.0 * @date 2021/11/26 */ public interface ActStatus { //å¯å¨ æ¤å 驳å 审æ¹ä¸ 审æ¹éè¿ å®¡æ¹å¼å¸¸ //æ¬æµç¨ä¸åºæå¯å¨ç¶æï¼å¯å¨å³è¿å ¥å®¡æ¹ï¼ç¬¬ä¸ä¸ªèç¹å°±æ¯å起人èç¹ï¼æªæ¹ä¾¿ä¸å¡åºåï¼è®¾å®ä¸ºâå¯å¨âç¶æ String start = "å¯å¨"; String recall = "æ¤å"; String reject = "驳å"; String doing = "审æ¹ä¸"; String pass = "审æ¹éè¿"; String err = "审æ¹å¼å¸¸"; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/entity/FlowBeforeParams.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package org.jeecg.modules.flowable.apithird.entity; import lombok.Data; import java.util.List; import java.util.Map; /** *æµç¨è¿è¡ä¹åä»ä¸å¡å±è·åçç¸å ³åæ° *@author PanMeiCheng *@date 2021/12/3 *@version 1.0 */ @Data public class FlowBeforeParams { /**æå®ä¸ä¸ªèç¹çåé人ï¼ç¨æ·åusername*/ List<String> candidateUsernames; /**æµç¨åé*/ Map<String,Object> values; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/entity/SysCategory.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package org.jeecg.modules.flowable.apithird.entity; import lombok.Data; /** *æµç¨åç±» *@author PanMeiCheng *@date 2021/11/25 *@version 1.0 */ @Data public class SysCategory { private static final long serialVersionUID = 1L; /** * id */ private String id; /** * åç±»åç§° */ private String name; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/entity/SysRole.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package org.jeecg.modules.flowable.apithird.entity; import lombok.Data; /** * è§è² * @author pmc */ @Data public class SysRole { private static final long serialVersionUID = 1L; /** * id */ private String id; /** * è§è²åç§° */ private String roleName; /** * è§è²ç¼ç */ private String roleCode; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/entity/SysUser.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,138 @@ package org.jeecg.modules.flowable.apithird.entity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; /** * ç¨æ·å¯¹è±¡ <br/> * //todo ææ¶æ¯æç¨äºjeecgï¼å¦éè¿ç§»å ¶ä»æ¡æ¶ï¼éè¦æ¹å¨ * @author pmc */ @Data public class SysUser { private static final long serialVersionUID = 1L; /** * id */ private String id; /** * ç»å½è´¦å· */ private String username; /** * çå®å§å */ private String realname; /** * å¯ç */ private String password; /** * md5å¯ç ç */ private String salt; /** * 头å */ private String avatar; /** * çæ¥ */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; /** * æ§å«ï¼1ï¼ç· 2ï¼å¥³ï¼ */ private Integer sex; /** * çµåé®ä»¶ */ private String email; /** * çµè¯ */ private String phone; /** * é¨é¨code(å½åéæ©ç»å½é¨é¨) */ private String orgCode; /**é¨é¨åç§°*/ private transient String orgCodeTxt; /** * ç¶æ(1ï¼æ£å¸¸ 2ï¼å»ç» ï¼ */ private Integer status; /** * å é¤ç¶æï¼0ï¼æ£å¸¸ï¼1å·²å é¤ï¼ */ private Integer delFlag; /** * å·¥å·ï¼å¯ä¸é® */ private String workNo; /** * èå¡ï¼å ³èèå¡è¡¨ */ private String post; /** * 座æºå· */ private String telephone; /** * å建人 */ private String createBy; /** * å建æ¶é´ */ private Date createTime; /** * æ´æ°äºº */ private String updateBy; /** * æ´æ°æ¶é´ */ private Date updateTime; /** * 忥工使µå¼æ1忥0ä¸åæ¥ */ private Integer activitiSync; /** * 身份ï¼0 æ®éæå 1 ä¸çº§ï¼ */ private Integer userIdentity; /** * è´è´£é¨é¨ */ private String departIds; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/service/FlowCallBackServiceI.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,46 @@ package org.jeecg.modules.flowable.apithird.service; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; import java.util.List; import java.util.Map; /** * ä¸å¡å±å®ç°æ¥å£æ¹æ³ï¼ç¨äºæµç¨å¤çåçåè° * @author PanMeiCheng * @version 1.0 * @date 2021/11/26 */ public interface FlowCallBackServiceI { /** * æµç¨å¤ç宿åçåè° * @param business éé¢å 嫿µç¨è¿è¡çç°ç¶ä¿¡æ¯ï¼ä¸å¡å±å¯æ ¹æ®å ¶ä¿¡æ¯å¤æï¼ä¹¦åå¢å¼ºä¸å¡é»è¾ç代ç ï¼<br/> * 1ãæ¯å¦å°å ¶ä¸å ³é®ä¿¡æ¯åå ¥ä¸å¡è¡¨ï¼å³å¯å表ä¸å¡æä½,å¦åéè¦å ³èflow_my_business表è·åæµç¨ä¿¡æ¯<br/> * 2ãæ¯å¦å¨æµç¨è¿è¡å°æä¸ªèç¹æ¶(business.taskId)ï¼éè¦ç¹å«è¿è¡æäºä¸å¡é»è¾æä½çç<br/> */ void afterFlowHandle(FlowMyBusiness business); /** * æ ¹æ®ä¸å¡idè¿åä¸å¡è¡¨åæ°æ®<br/> * @param dataId * @return */ Object getBusinessDataById(String dataId); /** * è¿åå½åèç¹çæµç¨åé * @param taskNameId èç¹å®ä¹id * @param values åç«¯ä¼ å ¥çåéï¼éé¢å å«dataId * @return */ Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values); /** * è¿åå½åèç¹çåé人username * @param taskNameId èç¹å®ä¹id * @param values åç«¯ä¼ å ¥çåéï¼éé¢å å«dataId * @return */ List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values); } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/service/FlowCommonService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,86 @@ package org.jeecg.modules.flowable.apithird.service; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl; import org.jeecg.modules.flowable.apithird.common.exception.CustomException; import org.jeecg.modules.flowable.service.impl.FlowInstanceServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** *ä¸å¡æ¨¡åè°ç¨APIçéå *@author PanMeiCheng *@date 2021/11/22 *@version 1.0 */ @Service public class FlowCommonService { @Autowired FlowMyBusinessServiceImpl flowMyBusinessService; @Autowired FlowInstanceServiceImpl flowInstanceService; /** * åå§çææä¿®æ¹ä¸å¡ä¸æµç¨çå ³èä¿¡æ¯<br/> * å½ä¸å¡æ¨¡åæ°å¢ä¸æ¡æ°æ®åè°ç¨ï¼æ¤æ¶ä¸å¡æ°æ®å ³èä¸ä¸ªæµç¨å®ä¹ï¼ä»¥å¤åç»æµç¨ä½¿ç¨ * @return æ¯å¦æå * @param title å¿ å¡«ãæµç¨ä¸å¡ç®è¦æè¿°ãä¾ï¼2021å¹´11æ26æ¥xxxxxç³è¯· * @param dataId å¿ å¡«ãä¸å¡æ°æ®Idï¼å¦ææ¯ä¸å¯¹å¤ä¸å¡å ³ç³»ï¼ä¼ å ¥ä¸»è¡¨çæ°æ®Id * @param serviceImplName å¿ å¡«ãä¸å¡serviceæ³¨å ¥spring容å¨çåç§°ã * ä¾å¦ï¼@Service("demoService")åä¼ å ¥ demoService * @param processDefinitionKey å¿ å¡«ãæµç¨å®ä¹Keyï¼ä¼ å ¥æ¤å¼ï¼æªæ¥å¯å¨ç伿¯è¯¥ç±»æµç¨çææ°ä¸ä¸ªçæ¬ * @param processDefinitionId éå¡«ãæµç¨å®ä¹Idï¼ä¼ å ¥æ¤å¼ï¼æªæ¥å¯å¨ç为æå®çæ¬çæµç¨ */ public boolean initActBusiness(String title,String dataId, String serviceImplName, String processDefinitionKey, String processDefinitionId){ boolean hasBlank = StrUtil.hasBlank(title,dataId, serviceImplName, processDefinitionKey); if (hasBlank) throw new CustomException("æµç¨å ³é®åæ°æªå¡«å®å ¨ï¼dataId, serviceImplName, processDefinitionKey"); LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId, dataId) ; FlowMyBusiness flowMyBusiness = new FlowMyBusiness(); FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); if (business!=null){ flowMyBusiness = business; } else { flowMyBusiness.setId(IdUtil.fastSimpleUUID()); } if (processDefinitionId==null){ // ä»¥ä¾¿æ´æ°æµç¨ processDefinitionId = ""; } flowMyBusiness.setTitle(title) .setDataId(dataId) .setServiceImplName(serviceImplName) .setProcessDefinitionKey(processDefinitionKey) .setProcessDefinitionId(processDefinitionId) ; if (business!=null){ return flowMyBusinessService.updateById(flowMyBusiness); } else { return flowMyBusinessService.save(flowMyBusiness); } } /** * å 餿µç¨ * @param dataId * @return */ public boolean delActBusiness(String dataId){ boolean hasBlank = StrUtil.hasBlank(dataId); if (hasBlank) throw new CustomException("æµç¨å ³é®åæ°æªå¡«å®å ¨ï¼dataId"); LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessQueryWrapper.eq(FlowMyBusiness::getDataId,dataId); FlowMyBusiness one = flowMyBusinessService.getOne(flowMyBusinessQueryWrapper); if (one.getProcessInstanceId()!=null){ try { flowInstanceService.delete(one.getProcessInstanceId(),"å 餿µç¨"); } catch (Exception e) { e.printStackTrace(); } } return flowMyBusinessService.remove(flowMyBusinessQueryWrapper); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/service/IFlowThirdService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,56 @@ package org.jeecg.modules.flowable.apithird.service; import org.jeecg.modules.flowable.apithird.entity.SysCategory; import org.jeecg.modules.flowable.apithird.entity.SysRole; import org.jeecg.modules.flowable.apithird.entity.SysUser; import java.util.List; /** * ä¸å¡å±éå®ç°çæ¥å£å®ä¹<br/> * æ¯æå·¥ä½æµæ¨¡åä¸ä¸å¡çå ³è * @author pmc */ public interface IFlowThirdService { /** * è·åå½åç»å½ç¨æ· * * @return å½åç»å½ç¨æ·ä¿¡æ¯ */ public SysUser getLoginUser(); /** * ææç¨æ· * @return */ List<SysUser> getAllUser(); /** * éè¿è§è²idè·åç¨æ· * @return */ List<SysUser> getUsersByRoleId(String roleId); /** * æ ¹æ®ç¨æ·usernameæ¥è¯¢ç¨æ·ä¿¡æ¯ * @param username * @return */ SysUser getUserByUsername(String username); /** * è·åææè§è² * @return */ public List<SysRole> getAllRole(); /** * è·åæææµç¨åç±» * @return */ List<SysCategory> getAllCategory(); /** * éè¿ç¨æ·è´¦å·æ¥è¯¢é¨é¨ name * @param username * @return é¨é¨ name */ List<String> getDepartNamesByUsername(String username); } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/config/MyDefaultProcessDiagramCanvas.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,92 @@ package org.jeecg.modules.flowable.config; import org.flowable.bpmn.model.AssociationDirection; import org.flowable.image.impl.DefaultProcessDiagramCanvas; import java.awt.*; import java.awt.geom.Line2D; import java.awt.geom.RoundRectangle2D; /** * ä¸äºé ç½® */ public class MyDefaultProcessDiagramCanvas extends DefaultProcessDiagramCanvas { //设置é«äº®çº¿çé¢è² è¿éæè®¾ç½®æç»¿è² protected static Color HIGHLIGHT_SEQUENCEFLOW_COLOR = Color.GREEN; public MyDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); } public MyDefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) { super(width, height, minX, minY, imageType); } /** * ç»çº¿é¢è²è®¾ç½® */ @Override public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); g.setPaint(CONNECTION_COLOR); if (connectionType.equals("association")) { g.setStroke(ASSOCIATION_STROKE); } else if (highLighted) { //设置线çé¢è² g.setPaint(originalPaint); g.setStroke(HIGHLIGHT_FLOW_STROKE); } for (int i = 1; i < xPoints.length; i++) { Integer sourceX = xPoints[i - 1]; Integer sourceY = yPoints[i - 1]; Integer targetX = xPoints[i]; Integer targetY = yPoints[i]; Line2D.Double line = new Line2D.Double(sourceX, sourceY, targetX, targetY); g.draw(line); } if (isDefault) { Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); drawDefaultSequenceFlowIndicator(line, scaleFactor); } if (conditional) { Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); drawConditionalSequenceFlowIndicator(line, scaleFactor); } if (associationDirection == AssociationDirection.ONE || associationDirection == AssociationDirection.BOTH) { Line2D.Double line = new Line2D.Double(xPoints[xPoints.length - 2], yPoints[xPoints.length - 2], xPoints[xPoints.length - 1], yPoints[xPoints.length - 1]); drawArrowHead(line, scaleFactor); } if (associationDirection == AssociationDirection.BOTH) { Line2D.Double line = new Line2D.Double(xPoints[1], yPoints[1], xPoints[0], yPoints[0]); drawArrowHead(line, scaleFactor); } g.setPaint(originalPaint); g.setStroke(originalStroke); } /** * é«äº®èç¹è®¾ç½® */ @Override public void drawHighLight(int x, int y, int width, int height) { Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); //设置é«äº®èç¹çé¢è² g.setPaint(HIGHLIGHT_COLOR); g.setStroke(THICK_TASK_BORDER_STROKE); RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); g.draw(rect); g.setPaint(originalPaint); g.setStroke(originalStroke); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/controller/FlowDefinitionController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,243 @@ package org.jeecg.modules.flowable.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.flowable.apithird.entity.SysCategory; import org.jeecg.modules.flowable.apithird.entity.SysRole; import org.jeecg.modules.flowable.apithird.entity.SysUser; import org.jeecg.modules.flowable.apithird.service.IFlowThirdService; import org.jeecg.modules.flowable.domain.dto.FlowProcDefDto; import org.jeecg.modules.flowable.domain.dto.FlowSaveXmlVo; import org.jeecg.modules.flowable.service.IFlowDefinitionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; /** * <p> * 工使µç¨å®ä¹ * </p> * */ @Slf4j @Api(tags = "æµç¨å®ä¹") @RestController @RequestMapping("/flowable/definition") public class FlowDefinitionController { @Autowired private IFlowDefinitionService flowDefinitionService; @Autowired private IFlowThirdService iFlowThirdService; @GetMapping(value = "/list") @ApiOperation(value = "æµç¨å®ä¹å表", response = FlowProcDefDto.class) public Result list(@ApiParam(value = "å½å页ç ", required = true) @RequestParam Integer pageNum, @ApiParam(value = "æ¯é¡µæ¡æ°", required = true) @RequestParam Integer pageSize, FlowProcDefDto flowProcDefDto ) { return Result.OK(flowDefinitionService.list(pageNum, pageSize,flowProcDefDto)); } @ApiOperation(value = "å¯¼å ¥æµç¨æä»¶", notes = "ä¸ä¼ bpmn20çxmlæä»¶") @PostMapping("/import") public Result importFile(@RequestParam(required = false) String name, @RequestParam(required = false) String category, MultipartFile file) { InputStream in = null; try { in = file.getInputStream(); flowDefinitionService.importFile(name, category, in); } catch (Exception e) { log.error("å¯¼å ¥å¤±è´¥:", e); return Result.OK(e.getMessage()); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { log.error("å ³éè¾å ¥æµåºé", e); } } return Result.OK("å¯¼å ¥æå"); } @ApiOperation(value = "读åxmlæä»¶") @GetMapping("/readXml/{deployId}") public Result readXml(@ApiParam(value = "æµç¨å®ä¹id") @PathVariable(value = "deployId") String deployId) { try { return flowDefinitionService.readXml(deployId); } catch (Exception e) { return Result.error("å è½½xmlæä»¶å¼å¸¸"); } } @ApiOperation(value = "读åxmlæä»¶") @GetMapping("/readXmlByDataId/{dataId}") public Result readXmlByDataId(@ApiParam(value = "æµç¨å®ä¹id") @PathVariable(value = "dataId") String dataId) { try { return flowDefinitionService.readXmlByDataId(dataId); } catch (Exception e) { return Result.error("å è½½xmlæä»¶å¼å¸¸"); } } @ApiOperation(value = "读åå¾çæä»¶") @GetMapping("/readImage/{deployId}") public void readImage(@ApiParam(value = "æµç¨å®ä¹id") @PathVariable(value = "deployId") String deployId, HttpServletResponse response) { OutputStream os = null; BufferedImage image = null; try { image = ImageIO.read(flowDefinitionService.readImage(deployId)); response.setContentType("image/png"); os = response.getOutputStream(); if (image != null) { ImageIO.write(image, "png", os); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (os != null) { os.flush(); os.close(); } } catch (IOException e) { e.printStackTrace(); } } } @ApiOperation(value = "读åå¾çæä»¶") @GetMapping("/readImageByDataId/{dataId}") public void readImageByDataId(@ApiParam(value = "æµç¨æ°æ®ä¸å¡id") @PathVariable(value = "dataId") String dataId, HttpServletResponse response) { OutputStream os = null; BufferedImage image = null; try { image = ImageIO.read(flowDefinitionService.readImageByDataId(dataId)); response.setContentType("image/png"); os = response.getOutputStream(); if (image != null) { ImageIO.write(image, "png", os); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (os != null) { os.flush(); os.close(); } } catch (IOException e) { e.printStackTrace(); } } } @ApiOperation(value = "ä¿åæµç¨è®¾è®¡å¨å çxmlæä»¶") @PostMapping("/save") public Result save(@RequestBody FlowSaveXmlVo vo) { InputStream in = null; try { in = new ByteArrayInputStream(vo.getXml().getBytes(StandardCharsets.UTF_8)); flowDefinitionService.importFile(vo.getName(), vo.getCategory(), in); } catch (Exception e) { log.error("å¯¼å ¥å¤±è´¥:", e); return Result.OK(e.getMessage()); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { log.error("å ³éè¾å ¥æµåºé", e); } } return Result.OK("å¯¼å ¥æå"); } @ApiOperation(value = "æ ¹æ®æµç¨å®ä¹idå¯å¨æµç¨å®ä¾") @PostMapping("/startByProcDefId/{procDefId}") public Result startByProcDefId(@ApiParam(value = "æµç¨å®ä¹id") @PathVariable(value = "procDefId") String procDefId, @ApiParam(value = "åééå,json对象") @RequestBody Map<String, Object> variables) { return flowDefinitionService.startProcessInstanceById(procDefId, variables); } @ApiOperation(value = "æ ¹æ®æµç¨å®ä¹keyå¯å¨æµç¨å®ä¾") @PostMapping("/startByProcDefKey/{procDefKey}") public Result startByProcDefKey(@ApiParam(value = "æµç¨å®ä¹id") @PathVariable(value = "procDefKey") String procDefKey, @ApiParam(value = "åééå,json对象") @RequestBody Map<String, Object> variables) { return flowDefinitionService.startProcessInstanceByKey(procDefKey, variables); } @ApiOperation(value = "æ ¹æ®æ°æ®Idå¯å¨æµç¨å®ä¾") @PostMapping("/startByDataId/{dataId}") public Result startByDataId(@ApiParam(value = "æµç¨å®ä¹id") @PathVariable(value = "dataId") String dataId, @ApiParam(value = "åééå,json对象") @RequestBody Map<String, Object> variables) { variables.put("dataId",dataId); return flowDefinitionService.startProcessInstanceByDataId(dataId, variables); } @ApiOperation(value = "æ¿æ´»ææèµ·æµç¨å®ä¹") @PutMapping(value = "/updateState") public Result updateState(@ApiParam(value = "1:æ¿æ´»,2:æèµ·", required = true) @RequestParam Integer state, @ApiParam(value = "æµç¨é¨ç½²ID", required = true) @RequestParam String deployId) { flowDefinitionService.updateState(state, deployId); return Result.OK("æä½æå"); } @ApiOperation(value = "å 餿µç¨") @DeleteMapping(value = "/delete") public Result delete(@ApiParam(value = "æµç¨é¨ç½²ID", required = true) @RequestParam String deployId) { flowDefinitionService.delete(deployId); return Result.OK(); } @ApiOperation(value = "æå®æµç¨åç人åå表") @GetMapping("/userList") public Result userList(SysUser user) { List<SysUser> list = iFlowThirdService.getAllUser(); return Result.OK(list); } @ApiOperation(value = "æå®æµç¨åçç»å表") @GetMapping("/roleList") public Result roleList(SysRole role) { List<SysRole> list = iFlowThirdService.getAllRole(); return Result.OK(list); } @ApiOperation(value = "æå®æµç¨åçç»å表") @GetMapping("/categoryList") public Result categoryList(SysCategory category) { List<SysCategory> list = iFlowThirdService.getAllCategory(); return Result.OK(list); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/controller/FlowInstanceController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,63 @@ package org.jeecg.modules.flowable.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.flowable.service.IFlowInstanceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * <p>工使µæµç¨å®ä¾ç®¡ç<p> */ @Slf4j @Api(tags = "工使µæµç¨å®ä¾ç®¡ç") @RestController @RequestMapping("/flowable/instance") public class FlowInstanceController { @Autowired private IFlowInstanceService flowInstanceService; /*@ApiOperation(value = "æ ¹æ®æµç¨å®ä¹idå¯å¨æµç¨å®ä¾") @PostMapping("/startBy/{procDefId}") public Result startById(@ApiParam(value = "æµç¨å®ä¹id") @PathVariable(value = "procDefId") String procDefId, @ApiParam(value = "åééå,json对象") @RequestBody Map<String, Object> variables) { return flowInstanceService.startProcessInstanceById(procDefId, variables); }*/ @ApiOperation(value = "æ¿æ´»ææèµ·æµç¨å®ä¾") @PostMapping(value = "/updateState") public Result updateState(@ApiParam(value = "1:æ¿æ´»,2:æèµ·", required = true) @RequestParam Integer state, @ApiParam(value = "æµç¨å®ä¾ID", required = true) @RequestParam String instanceId) { flowInstanceService.updateState(state,instanceId); return Result.OK(); } /*@ApiOperation("ç»ææµç¨å®ä¾") @PostMapping(value = "/stopProcessInstance") public Result stopProcessInstance(@RequestBody FlowTaskVo flowTaskVo) { flowInstanceService.stopProcessInstance(flowTaskVo); return Result.OK(); }*/ @ApiOperation(value = "å 餿µç¨å®ä¾") @DeleteMapping(value = "/delete") public Result delete(@ApiParam(value = "æµç¨å®ä¾ID", required = true) @RequestParam String instanceId, @ApiParam(value = "å é¤åå ") @RequestParam(required = false) String deleteReason) { flowInstanceService.delete(instanceId,deleteReason); return Result.OK(); } @ApiOperation(value = "å 餿µç¨å®ä¾") @PostMapping(value = "/deleteByDataId") public Result deleteByDataId(@ApiParam(value = "æµç¨å®ä¾å ³èä¸å¡ID", required = true) @RequestParam String dataId, @ApiParam(value = "å é¤åå ") @RequestParam(required = false) String deleteReason) { flowInstanceService.deleteByDataId(dataId,deleteReason); return Result.OK(); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/controller/FlowTaskController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,219 @@ package org.jeecg.modules.flowable.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.flowable.domain.dto.FlowTaskDto; import org.jeecg.modules.flowable.domain.vo.FlowTaskVo; import org.jeecg.modules.flowable.service.IFlowTaskService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * <p>工使µä»»å¡ç®¡ç<p> * */ @Slf4j @Api(tags = "工使µæµç¨ä»»å¡ç®¡ç") @RestController @RequestMapping("/flowable/task") public class FlowTaskController { @Autowired private IFlowTaskService flowTaskService; @ApiOperation(value = "æåèµ·çæµç¨", response = FlowTaskDto.class) @GetMapping(value = "/myProcess") public Result myProcess(@ApiParam(value = "å½å页ç ", required = true) @RequestParam Integer pageNum, @ApiParam(value = "æ¯é¡µæ¡æ°", required = true) @RequestParam Integer pageSize) { return flowTaskService.myProcess(pageNum, pageSize); } @ApiOperation(value = "åæ¶ç³è¯·", response = FlowTaskDto.class) @PostMapping(value = "/stopProcess") public Result stopProcess(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.stopProcess(flowTaskVo); } @ApiOperation(value = "æ¤åæµç¨", response = FlowTaskDto.class) @PostMapping(value = "/revokeProcess") public Result revokeProcess(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.revokeProcess(flowTaskVo); } @ApiOperation(value = "è·åå¾ åå表", response = FlowTaskDto.class) @GetMapping(value = "/todoList") public Result todoList(@ApiParam(value = "å½å页ç ", required = true) @RequestParam Integer pageNum, @ApiParam(value = "æ¯é¡µæ¡æ°", required = true) @RequestParam Integer pageSize) { return flowTaskService.todoList(pageNum, pageSize); } @ApiOperation(value = "è·åå·²åä»»å¡", response = FlowTaskDto.class) @GetMapping(value = "/finishedList") public Result finishedList(@ApiParam(value = "å½å页ç ", required = true) @RequestParam Integer pageNum, @ApiParam(value = "æ¯é¡µæ¡æ°", required = true) @RequestParam Integer pageSize) { return flowTaskService.finishedList(pageNum, pageSize); } @ApiOperation(value = "æµç¨å岿µè½¬è®°å½", response = FlowTaskDto.class) @GetMapping(value = "/flowRecord") public Result flowRecord(String dataId) { return flowTaskService.flowRecord(dataId); } @ApiOperation(value = "è·åæµç¨åé", response = FlowTaskDto.class) @GetMapping(value = "/processVariables/{taskId}") public Result processVariables(@ApiParam(value = "æµç¨ä»»å¡Id") @PathVariable(value = "taskId") String taskId) { return flowTaskService.processVariables(taskId); } @ApiOperation(value = "审æ¹ä»»å¡") @PostMapping(value = "/complete") public Result complete(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.complete(flowTaskVo); } @ApiOperation(value = "审æ¹ä»»å¡") @PostMapping(value = "/completeByDateId") public Result completeByDateId(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.completeByDateId(flowTaskVo); } @ApiOperation(value = "驳åä»»å¡") @PostMapping(value = "/reject") public Result taskReject(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.taskReject(flowTaskVo); return Result.OK(); } @ApiOperation(value = "驳åä»»å¡") @PostMapping(value = "/taskRejectByDataId") public Result taskRejectByDataId(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.taskRejectByDataId(flowTaskVo); return Result.OK(); } @ApiOperation(value = "éåä»»å¡") @PostMapping(value = "/return") public Result taskReturn(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.taskReturn(flowTaskVo); return Result.OK(); } @ApiOperation(value = "éåä»»å¡") @PostMapping(value = "/taskReturnByDataId") public Result taskReturnByDataId(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.taskReturnByDataId(flowTaskVo); return Result.OK(); } @ApiOperation(value = "è·åææå¯åéçèç¹") @PostMapping(value = "/returnList") public Result findReturnTaskList(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.findReturnTaskList(flowTaskVo); } @ApiOperation(value = "è·åææå¯åéçèç¹") @PostMapping(value = "/findReturnTaskListByDataId") public Result findReturnTaskListByDataId(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.findReturnTaskListByDataId(flowTaskVo); } @ApiOperation(value = "å é¤ä»»å¡") @DeleteMapping(value = "/delete") public Result delete(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.deleteTask(flowTaskVo); return Result.OK(); } @ApiOperation(value = "认é¢/ç¾æ¶ä»»å¡") @PostMapping(value = "/claim") public Result claim(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.claim(flowTaskVo); return Result.OK(); } @ApiOperation(value = "åæ¶è®¤é¢/ç¾æ¶ä»»å¡") @PostMapping(value = "/unClaim") public Result unClaim(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.unClaim(flowTaskVo); return Result.OK(); } @ApiOperation(value = "å§æ´¾ä»»å¡") @PostMapping(value = "/delegate") public Result delegate(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.delegateTask(flowTaskVo); return Result.OK(); } @ApiOperation(value = "转åä»»å¡") @PostMapping(value = "/assign") public Result assign(@RequestBody FlowTaskVo flowTaskVo) { flowTaskService.assignTask(flowTaskVo); return Result.OK(); } @ApiOperation(value = "è·åä¸ä¸èç¹") @PostMapping(value = "/nextFlowNode") public Result getNextFlowNode(@RequestBody FlowTaskVo flowTaskVo) { return flowTaskService.getNextFlowNode(flowTaskVo); } /** * çææµç¨å¾ * * @param processId ä»»å¡ID */ @RequestMapping("/diagram/{processId}") public void genProcessDiagram(HttpServletResponse response, @PathVariable("processId") String processId) { InputStream inputStream = flowTaskService.diagram(processId); OutputStream os = null; BufferedImage image = null; try { image = ImageIO.read(inputStream); response.setContentType("image/png"); os = response.getOutputStream(); if (image != null) { ImageIO.write(image, "png", os); } }catch (Exception e) { e.printStackTrace(); }finally { try { if (os != null) { os.flush(); os.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * çææµç¨å¾ * * @param procInsId ä»»å¡ID */ @RequestMapping("/flowViewer/{procInsId}") public Result getFlowViewer(@PathVariable("procInsId") String procInsId) { return Result.OK(flowTaskService.getFlowViewer(procInsId)); } /** * çææµç¨å¾ * * @param dataId 任塿°æ®ID */ @RequestMapping("/flowViewerByDataId/{dataId}") public Result getFlowViewerByDataId(@PathVariable("dataId") String dataId) { return Result.OK(flowTaskService.getFlowViewerByDataId(dataId)); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowCommentDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package org.jeecg.modules.flowable.domain.dto; import lombok.Builder; import lombok.Data; import java.io.Serializable; /** * åºç¡å¸¸é */ @Data @Builder public class FlowCommentDto implements Serializable { /** * æè§ç±»å« 0 æ£å¸¸æè§ 1 éåæè§ 2 驳åæè§ */ private String type; /** * æè§å 容 */ private String comment; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowNextDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package org.jeecg.modules.flowable.domain.dto; import lombok.Data; import org.flowable.bpmn.model.UserTask; import org.jeecg.modules.flowable.apithird.entity.SysUser; import java.io.Serializable; import java.util.List; /** * 人åãç» */ @Data public class FlowNextDto implements Serializable { /** * èç¹å¯¹è±¡ */ private UserTask userTask; /** * å¾ å人å */ private List<SysUser> userList; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowProcDefDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,56 @@ package org.jeecg.modules.flowable.domain.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.Date; /** * <p>æµç¨å®ä¹<p> */ @Data @AllArgsConstructor @NoArgsConstructor @ApiModel("æµç¨å®ä¹") public class FlowProcDefDto implements Serializable { @ApiModelProperty("æµç¨id") private String id; @ApiModelProperty("æµç¨åç§°") private String name; @ApiModelProperty("æµç¨key") private String key; @ApiModelProperty("æµç¨åç±»") private String category; @ApiModelProperty("é 置表ååç§°") private String formName; @ApiModelProperty("é 置表åid") private Long formId; @ApiModelProperty("çæ¬") private int version; @ApiModelProperty("é¨ç½²ID") private String deploymentId; @ApiModelProperty("æµç¨å®ä¹ç¶æ: 1:æ¿æ´» , 2:䏿¢") private int suspensionState; @ApiModelProperty("æµç¨å®ä¹æ¯å¦ææ°çæ¬") private int isLastVersion; @ApiModelProperty("é¨ç½²æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date deploymentTime; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowSaveXmlVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package org.jeecg.modules.flowable.domain.dto; import lombok.Data; import java.io.Serializable; /** * æµç¨è§èxml */ @Data public class FlowSaveXmlVo implements Serializable { /** * æµç¨åç§° */ private String name; /** * æµç¨åç±» */ private String category; /** * xml æä»¶ */ private String xml; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,95 @@ package org.jeecg.modules.flowable.domain.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.util.Date; /** * <p>工使µä»»å¡<p> * */ @Getter @Setter @ApiModel("工使µä»»å¡ç¸å ³-è¿ååæ°") public class FlowTaskDto implements Serializable { @ApiModelProperty("ä»»å¡ç¼å·") private String taskId; @ApiModelProperty("ä»»å¡åç§°") private String taskName; @ApiModelProperty("ä»»å¡Key") private String taskDefKey; @ApiModelProperty("任塿§è¡äººId") private String assigneeId; @ApiModelProperty("é¨é¨åç§°") private String deptName; @ApiModelProperty("æµç¨å起人é¨é¨åç§°") private String startDeptName; @ApiModelProperty("任塿§è¡äººåç§°") private String assigneeName; @ApiModelProperty("æµç¨å起人Id") private String startUserId; @ApiModelProperty("æµç¨å起人åç§°") private String startUserName; @ApiModelProperty("æµç¨ç±»å") private String category; @ApiModelProperty("æµç¨åéä¿¡æ¯") private Object procVars; @ApiModelProperty("å±é¨åéä¿¡æ¯") private Object taskLocalVars; @ApiModelProperty("æµç¨é¨ç½²ç¼å·") private String deployId; @ApiModelProperty("æµç¨ID") private String procDefId; @ApiModelProperty("æµç¨key") private String procDefKey; @ApiModelProperty("æµç¨å®ä¹åç§°") private String procDefName; @ApiModelProperty("æµç¨å®ä¹å 置使ç¨çæ¬") private int procDefVersion; @ApiModelProperty("æµç¨å®ä¾ID") private String procInsId; @ApiModelProperty("å岿µç¨å®ä¾ID") private String hisProcInsId; @ApiModelProperty("ä»»å¡èæ¶") private String duration; @ApiModelProperty("任塿è§") private FlowCommentDto comment; @ApiModelProperty("åéæ§è¡äºº") private String candidate; @ApiModelProperty("ä»»å¡å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; @ApiModelProperty("ä»»å¡å®ææ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date finishTime; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowViewerDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package org.jeecg.modules.flowable.domain.dto; import lombok.Data; import java.io.Serializable; /** */ @Data public class FlowViewerDto implements Serializable { private String key; private boolean completed; private boolean back; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowTaskVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package org.jeecg.modules.flowable.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; import java.util.Map; /** * <p>æµç¨ä»»å¡<p> * */ @Data @ApiModel("工使µä»»å¡ç¸å ³--请æ±åæ°") public class FlowTaskVo { @ApiModelProperty("æ°æ®Id") private String dataId; @ApiModelProperty("ä»»å¡Id") private String taskId; @ApiModelProperty("ç¨æ·Id") private String userId; @ApiModelProperty("任塿è§") private String comment; @ApiModelProperty("æµç¨å®ä¾Id") private String instanceId; @ApiModelProperty("èç¹") private String targetKey; @ApiModelProperty("æµç¨åéä¿¡æ¯") private Map<String, Object> values; @ApiModelProperty("审æ¹äºº") private String assignee; @ApiModelProperty("åé人") private List<String> candidateUsers; @ApiModelProperty("审æ¹ç»") private List<String> candidateGroups; private String xiugaiId; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/factory/FlowServiceFactory.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package org.jeecg.modules.flowable.factory; import lombok.Getter; import org.flowable.engine.*; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * flowable å¼ææ³¨å ¥å°è£ */ @Component @Getter public class FlowServiceFactory { @Resource protected RepositoryService repositoryService; @Resource protected RuntimeService runtimeService; @Resource protected IdentityService identityService; @Resource protected TaskService taskService; @Resource protected FormService formService; @Resource protected HistoryService historyService; @Resource protected ManagementService managementService; @Qualifier("processEngine") @Resource protected ProcessEngine processEngine; } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/flow/CustomProcessDiagramCanvas.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,369 @@ package org.jeecg.modules.flowable.flow; import org.flowable.bpmn.model.AssociationDirection; import org.flowable.bpmn.model.GraphicInfo; import org.flowable.image.impl.DefaultProcessDiagramCanvas; import org.flowable.image.util.ReflectUtil; import javax.imageio.ImageIO; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.text.AttributedCharacterIterator; import java.text.AttributedString; /** * åºç¡é ç½® */ public class CustomProcessDiagramCanvas extends DefaultProcessDiagramCanvas { //å®ä¹èµ°è¿æµç¨è¿çº¿é¢è²ä¸ºç»¿è² protected static Color HIGHLIGHT_SequenceFlow_COLOR = Color.GREEN; //设置æªèµ°è¿æµç¨çè¿æ¥çº¿é¢è² protected static Color CONNECTION_COLOR = Color.BLACK; //设置flowsè¿æ¥çº¿åä½é¢è²red protected static Color LABEL_COLOR = new Color(0, 0, 0); //é«äº®æ¾ç¤ºtaskæ¡é¢è² protected static Color HIGHLIGHT_COLOR = Color.GREEN; protected static Color HIGHLIGHT_COLOR1 = Color.RED; public CustomProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { super(width, height, minX, minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); this.initialize(imageType); } /** * éåç»å¶è¿çº¿çæ¹å¼,设置ç»å¶é¢è² * @param xPoints * @param yPoints * @param conditional * @param isDefault * @param connectionType * @param associationDirection * @param highLighted * @param scaleFactor */ @Override public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { Paint originalPaint = this.g.getPaint(); Stroke originalStroke = this.g.getStroke(); this.g.setPaint(CONNECTION_COLOR); if (connectionType.equals("association")) { this.g.setStroke(ASSOCIATION_STROKE); } else if (highLighted) { this.g.setPaint(HIGHLIGHT_SequenceFlow_COLOR); this.g.setStroke(HIGHLIGHT_FLOW_STROKE); } for (int i = 1; i < xPoints.length; ++i) { Integer sourceX = xPoints[i - 1]; Integer sourceY = yPoints[i - 1]; Integer targetX = xPoints[i]; Integer targetY = yPoints[i]; java.awt.geom.Line2D.Double line = new java.awt.geom.Line2D.Double((double) sourceX, (double) sourceY, (double) targetX, (double) targetY); this.g.draw(line); } java.awt.geom.Line2D.Double line; if (isDefault) { line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]); this.drawDefaultSequenceFlowIndicator(line, scaleFactor); } if (conditional) { line = new java.awt.geom.Line2D.Double((double) xPoints[0], (double) yPoints[0], (double) xPoints[1], (double) yPoints[1]); this.drawConditionalSequenceFlowIndicator(line, scaleFactor); } if (associationDirection.equals(AssociationDirection.ONE) || associationDirection.equals(AssociationDirection.BOTH)) { line = new java.awt.geom.Line2D.Double((double) xPoints[xPoints.length - 2], (double) yPoints[xPoints.length - 2], (double) xPoints[xPoints.length - 1], (double) yPoints[xPoints.length - 1]); this.drawArrowHead(line, scaleFactor); } if (associationDirection.equals(AssociationDirection.BOTH)) { line = new java.awt.geom.Line2D.Double((double) xPoints[1], (double) yPoints[1], (double) xPoints[0], (double) yPoints[0]); this.drawArrowHead(line, scaleFactor); } this.g.setPaint(originalPaint); this.g.setStroke(originalStroke); } /** * 设置åä½å¤§å°å¾æ é¢è² * @param imageType */ @Override public void initialize(String imageType) { if ("png".equalsIgnoreCase(imageType)) { this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 2); } else { this.processDiagram = new BufferedImage(this.canvasWidth, this.canvasHeight, 1); } this.g = this.processDiagram.createGraphics(); if (!"png".equalsIgnoreCase(imageType)) { this.g.setBackground(new Color(255, 255, 255, 0)); this.g.clearRect(0, 0, this.canvasWidth, this.canvasHeight); } this.g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //ä¿®æ¹å¾æ é¢è²ï¼ä¿®æ¹å¾æ åä½å¤§å° this.g.setPaint(Color.black); Font font = new Font(this.activityFontName, 10, 14); this.g.setFont(font); this.fontMetrics = this.g.getFontMetrics(); //ä¿®æ¹è¿æ¥çº¿åä½å¤§å° LABEL_FONT = new Font(this.labelFontName, 10, 15); ANNOTATION_FONT = new Font(this.annotationFontName, 0, 11); try { USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/userTask.png", this.customClassLoader)); SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/scriptTask.png", this.customClassLoader)); SERVICETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/serviceTask.png", this.customClassLoader)); RECEIVETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/receiveTask.png", this.customClassLoader)); SENDTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/sendTask.png", this.customClassLoader)); MANUALTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/manualTask.png", this.customClassLoader)); BUSINESS_RULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/businessRuleTask.png", this.customClassLoader)); SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/shellTask.png", this.customClassLoader)); DMN_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/dmnTask.png", this.customClassLoader)); CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/camelTask.png", this.customClassLoader)); MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/muleTask.png", this.customClassLoader)); HTTP_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/httpTask.png", this.customClassLoader)); TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/timer.png", this.customClassLoader)); COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate-throw.png", this.customClassLoader)); COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/compensate.png", this.customClassLoader)); ERROR_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error-throw.png", this.customClassLoader)); ERROR_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/error.png", this.customClassLoader)); MESSAGE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message-throw.png", this.customClassLoader)); MESSAGE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/message.png", this.customClassLoader)); SIGNAL_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal-throw.png", this.customClassLoader)); SIGNAL_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/flowable/icons/signal.png", this.customClassLoader)); } catch (IOException var4) { LOGGER.warn("Could not load image for process diagram creation: {}", var4.getMessage()); } } /** * è®¾ç½®è¿æ¥çº¿åä½ * @param text * @param graphicInfo * @param centered */ @Override public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered) { float interline = 1.0f; // text if (text != null && text.length() > 0) { Paint originalPaint = g.getPaint(); Font originalFont = g.getFont(); g.setPaint(LABEL_COLOR); g.setFont(LABEL_FONT); int wrapWidth = 100; int textY = (int) graphicInfo.getY(); // TODO: use drawMultilineText() AttributedString as = new AttributedString(text); as.addAttribute(TextAttribute.FOREGROUND, g.getPaint()); as.addAttribute(TextAttribute.FONT, g.getFont()); AttributedCharacterIterator aci = as.getIterator(); FontRenderContext frc = new FontRenderContext(null, true, false); LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); while (lbm.getPosition() < text.length()) { TextLayout tl = lbm.nextLayout(wrapWidth); textY += tl.getAscent(); Rectangle2D bb = tl.getBounds(); double tX = graphicInfo.getX(); if (centered) { tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2); } tl.draw(g, (float) tX, textY); textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent(); } // restore originals g.setFont(originalFont); g.setPaint(originalPaint); } } /** * é«äº®æ¾ç¤ºtaskæ¡å®æç * @param x * @param y * @param width * @param height */ @Override public void drawHighLight(int x, int y, int width, int height) { Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); g.setPaint(HIGHLIGHT_COLOR); g.setStroke(THICK_TASK_BORDER_STROKE); RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); g.draw(rect); g.setPaint(originalPaint); g.setStroke(originalStroke); } /** * èªå®ä¹taskæ¡å½åçä½ç½® * @param x * @param y * @param width * @param height */ public void drawHighLightNow(int x, int y, int width, int height) { Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); g.setPaint(HIGHLIGHT_COLOR1); g.setStroke(THICK_TASK_BORDER_STROKE); RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); g.draw(rect); g.setPaint(originalPaint); g.setStroke(originalStroke); } /** * èªå®ä¹ç»æèç¹ * @param x * @param y * @param width * @param height */ public void drawHighLightEnd(int x, int y, int width, int height) { Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); g.setPaint(HIGHLIGHT_COLOR); g.setStroke(THICK_TASK_BORDER_STROKE); RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20); g.draw(rect); g.setPaint(originalPaint); g.setStroke(originalStroke); } /** * taskæ¡èªå®ä¹æå * @param name * @param graphicInfo * @param thickBorder * @param scaleFactor */ @Override protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder, double scaleFactor) { Paint originalPaint = g.getPaint(); int x = (int) graphicInfo.getX(); int y = (int) graphicInfo.getY(); int width = (int) graphicInfo.getWidth(); int height = (int) graphicInfo.getHeight(); // Create a new gradient paint for every task box, gradient depends on x and y and is not relative g.setPaint(TASK_BOX_COLOR); int arcR = 6; if (thickBorder) { arcR = 3; } // shape RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR); g.fill(rect); g.setPaint(TASK_BORDER_COLOR); if (thickBorder) { Stroke originalStroke = g.getStroke(); g.setStroke(THICK_TASK_BORDER_STROKE); g.draw(rect); g.setStroke(originalStroke); } else { g.draw(rect); } g.setPaint(originalPaint); // text if (scaleFactor == 1.0 && name != null && name.length() > 0) { int boxWidth = width - (2 * TEXT_PADDING); int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; int boxX = x + width / 2 - boxWidth / 2; int boxY = y + height / 2 - boxHeight / 2 + ICON_PADDING + ICON_PADDING - 2 - 2; drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight); } } protected static Color EVENT_COLOR = new Color(255, 255, 255); /** * éåå¼å§äºä»¶ * @param graphicInfo * @param image * @param scaleFactor */ @Override public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) { Paint originalPaint = g.getPaint(); g.setPaint(EVENT_COLOR); Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); g.fill(circle); g.setPaint(EVENT_BORDER_COLOR); g.draw(circle); g.setPaint(originalPaint); if (image != null) { // calculate coordinates to center image int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / (2 * scaleFactor))); int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / (2 * scaleFactor))); g.drawImage(image, imageX, imageY, (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null); } } /** * éåç»æäºä»¶ * @param graphicInfo * @param scaleFactor */ @Override public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) { Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); g.setPaint(EVENT_COLOR); Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); g.fill(circle); g.setPaint(EVENT_BORDER_COLOR); // g.setPaint(HIGHLIGHT_COLOR); if (scaleFactor == 1.0) { g.setStroke(END_EVENT_STROKE); } else { g.setStroke(new BasicStroke(2.0f)); } g.draw(circle); g.setStroke(originalStroke); g.setPaint(originalPaint); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/flow/CustomProcessDiagramGenerator.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,402 @@ package org.jeecg.modules.flowable.flow; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; import org.flowable.image.impl.DefaultProcessDiagramCanvas; import org.flowable.image.impl.DefaultProcessDiagramGenerator; import java.util.Iterator; import java.util.List; /** */ public class CustomProcessDiagramGenerator extends DefaultProcessDiagramGenerator { @Override protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, List<String> highLightedActivities, List<String> highLightedFlows, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor, boolean drawSequenceFlowNameWithNoLabelDI) { this.prepareBpmnModel(bpmnModel); DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); Iterator var13 = bpmnModel.getPools().iterator(); while (var13.hasNext()) { Pool process = (Pool) var13.next(); GraphicInfo subProcesses = bpmnModel.getGraphicInfo(process.getId()); processDiagramCanvas.drawPoolOrLane(process.getName(), subProcesses, scaleFactor); } var13 = bpmnModel.getProcesses().iterator(); Process process1; Iterator subProcesses1; while (var13.hasNext()) { process1 = (Process) var13.next(); subProcesses1 = process1.getLanes().iterator(); while (subProcesses1.hasNext()) { Lane artifact = (Lane) subProcesses1.next(); GraphicInfo subProcess = bpmnModel.getGraphicInfo(artifact.getId()); processDiagramCanvas.drawPoolOrLane(artifact.getName(), subProcess, scaleFactor); } } var13 = bpmnModel.getProcesses().iterator(); while (var13.hasNext()) { process1 = (Process) var13.next(); subProcesses1 = process1.findFlowElementsOfType(FlowNode.class).iterator(); while (subProcesses1.hasNext()) { FlowNode artifact1 = (FlowNode) subProcesses1.next(); if (!this.isPartOfCollapsedSubProcess(artifact1, bpmnModel)) { this.drawActivity(processDiagramCanvas, bpmnModel, artifact1, highLightedActivities, highLightedFlows, scaleFactor, Boolean.valueOf(drawSequenceFlowNameWithNoLabelDI)); } } } var13 = bpmnModel.getProcesses().iterator(); label75: while (true) { List subProcesses2; do { if (!var13.hasNext()) { return processDiagramCanvas; } process1 = (Process) var13.next(); subProcesses1 = process1.getArtifacts().iterator(); while (subProcesses1.hasNext()) { Artifact artifact2 = (Artifact) subProcesses1.next(); this.drawArtifact(processDiagramCanvas, bpmnModel, artifact2); } subProcesses2 = process1.findFlowElementsOfType(SubProcess.class, true); } while (subProcesses2 == null); Iterator artifact3 = subProcesses2.iterator(); while (true) { GraphicInfo graphicInfo; SubProcess subProcess1; do { do { if (!artifact3.hasNext()) { continue label75; } subProcess1 = (SubProcess) artifact3.next(); graphicInfo = bpmnModel.getGraphicInfo(subProcess1.getId()); } while (graphicInfo != null && graphicInfo.getExpanded() != null && !graphicInfo.getExpanded().booleanValue()); } while (this.isPartOfCollapsedSubProcess(subProcess1, bpmnModel)); Iterator var19 = subProcess1.getArtifacts().iterator(); while (var19.hasNext()) { Artifact subProcessArtifact = (Artifact) var19.next(); this.drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); } } } } protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { double minX = 1.7976931348623157E308D; double maxX = 0.0D; double minY = 1.7976931348623157E308D; double maxY = 0.0D; GraphicInfo nrOfLanes; for (Iterator flowNodes = bpmnModel.getPools().iterator(); flowNodes.hasNext(); maxY = nrOfLanes.getY() + nrOfLanes.getHeight()) { Pool artifacts = (Pool) flowNodes.next(); nrOfLanes = bpmnModel.getGraphicInfo(artifacts.getId()); minX = nrOfLanes.getX(); maxX = nrOfLanes.getX() + nrOfLanes.getWidth(); minY = nrOfLanes.getY(); } List var23 = gatherAllFlowNodes(bpmnModel); Iterator var24 = var23.iterator(); label155: while (var24.hasNext()) { FlowNode var26 = (FlowNode) var24.next(); GraphicInfo artifact = bpmnModel.getGraphicInfo(var26.getId()); if (artifact.getX() + artifact.getWidth() > maxX) { maxX = artifact.getX() + artifact.getWidth(); } if (artifact.getX() < minX) { minX = artifact.getX(); } if (artifact.getY() + artifact.getHeight() > maxY) { maxY = artifact.getY() + artifact.getHeight(); } if (artifact.getY() < minY) { minY = artifact.getY(); } Iterator process = var26.getOutgoingFlows().iterator(); while (true) { List l; do { if (!process.hasNext()) { continue label155; } SequenceFlow graphicInfoList = (SequenceFlow) process.next(); l = bpmnModel.getFlowLocationGraphicInfo(graphicInfoList.getId()); } while (l == null); Iterator graphicInfo = l.iterator(); while (graphicInfo.hasNext()) { GraphicInfo graphicInfo1 = (GraphicInfo) graphicInfo.next(); if (graphicInfo1.getX() > maxX) { maxX = graphicInfo1.getX(); } if (graphicInfo1.getX() < minX) { minX = graphicInfo1.getX(); } if (graphicInfo1.getY() > maxY) { maxY = graphicInfo1.getY(); } if (graphicInfo1.getY() < minY) { minY = graphicInfo1.getY(); } } } } List var25 = gatherAllArtifacts(bpmnModel); Iterator var27 = var25.iterator(); GraphicInfo var37; while (var27.hasNext()) { Artifact var29 = (Artifact) var27.next(); GraphicInfo var31 = bpmnModel.getGraphicInfo(var29.getId()); if (var31 != null) { if (var31.getX() + var31.getWidth() > maxX) { maxX = var31.getX() + var31.getWidth(); } if (var31.getX() < minX) { minX = var31.getX(); } if (var31.getY() + var31.getHeight() > maxY) { maxY = var31.getY() + var31.getHeight(); } if (var31.getY() < minY) { minY = var31.getY(); } } List var33 = bpmnModel.getFlowLocationGraphicInfo(var29.getId()); if (var33 != null) { Iterator var35 = var33.iterator(); while (var35.hasNext()) { var37 = (GraphicInfo) var35.next(); if (var37.getX() > maxX) { maxX = var37.getX(); } if (var37.getX() < minX) { minX = var37.getX(); } if (var37.getY() > maxY) { maxY = var37.getY(); } if (var37.getY() < minY) { minY = var37.getY(); } } } } int var28 = 0; Iterator var30 = bpmnModel.getProcesses().iterator(); while (var30.hasNext()) { Process var32 = (Process) var30.next(); Iterator var34 = var32.getLanes().iterator(); while (var34.hasNext()) { Lane var36 = (Lane) var34.next(); ++var28; var37 = bpmnModel.getGraphicInfo(var36.getId()); if (var37.getX() + var37.getWidth() > maxX) { maxX = var37.getX() + var37.getWidth(); } if (var37.getX() < minX) { minX = var37.getX(); } if (var37.getY() + var37.getHeight() > maxY) { maxY = var37.getY() + var37.getHeight(); } if (var37.getY() < minY) { minY = var37.getY(); } } } if (var23.isEmpty() && bpmnModel.getPools().isEmpty() && var28 == 0) { minX = 0.0D; minY = 0.0D; } return new CustomProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10, (int) minX, (int) minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); } private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); } private static void drawHighLightNow(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { processDiagramCanvas.drawHighLightNow((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); } private static void drawHighLightEnd(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) { processDiagramCanvas.drawHighLightEnd((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight()); } @Override protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode, List<String> highLightedActivities, List<String> highLightedFlows, double scaleFactor, Boolean drawSequenceFlowNameWithNoLabelDI) { DefaultProcessDiagramGenerator.ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass()); if (drawInstruction != null) { drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode); // Gather info on the multi instance marker boolean multiInstanceSequential = false; boolean multiInstanceParallel = false; boolean collapsed = false; if (flowNode instanceof Activity) { Activity activity = (Activity) flowNode; MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics(); if (multiInstanceLoopCharacteristics != null) { multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential(); multiInstanceParallel = !multiInstanceSequential; } } // Gather info on the collapsed marker GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); if (flowNode instanceof SubProcess) { collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded(); } else if (flowNode instanceof CallActivity) { collapsed = true; } if (scaleFactor == 1.0) { // Actually draw the markers processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), multiInstanceSequential, multiInstanceParallel, collapsed); } // Draw highlighted activities if (highLightedActivities.contains(flowNode.getId())) { if (highLightedActivities.get(highLightedActivities.size() - 1).equals(flowNode.getId()) && !"endenv".equals(flowNode.getId())) { if ((flowNode.getId().contains("Event_"))) { drawHighLightEnd((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); } else { drawHighLightNow((CustomProcessDiagramCanvas) processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); } } else { drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId())); } } } // Outgoing transitions of activity for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) { boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId())); String defaultFlow = null; if (flowNode instanceof Activity) { defaultFlow = ((Activity) flowNode).getDefaultFlow(); } else if (flowNode instanceof Gateway) { defaultFlow = ((Gateway) flowNode).getDefaultFlow(); } boolean isDefault = false; if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) { isDefault = true; } boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway); String sourceRef = sequenceFlow.getSourceRef(); String targetRef = sequenceFlow.getTargetRef(); FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef); FlowElement targetElement = bpmnModel.getFlowElement(targetRef); List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId()); if (graphicInfoList != null && graphicInfoList.size() > 0) { graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList); int xPoints[] = new int[graphicInfoList.size()]; int yPoints[] = new int[graphicInfoList.size()]; for (int i = 1; i < graphicInfoList.size(); i++) { GraphicInfo graphicInfo = graphicInfoList.get(i); GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1); if (i == 1) { xPoints[0] = (int) previousGraphicInfo.getX(); yPoints[0] = (int) previousGraphicInfo.getY(); } xPoints[i] = (int) graphicInfo.getX(); yPoints[i] = (int) graphicInfo.getY(); } processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor); // Draw sequenceflow label GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId()); if (labelGraphicInfo != null) { processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false); } else { if (drawSequenceFlowNameWithNoLabelDI) { GraphicInfo lineCenter = getLineCenter(graphicInfoList); processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false); } } } } // Nested elements if (flowNode instanceof FlowElementsContainer) { for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) { if (nestedFlowElement instanceof FlowNode && !isPartOfCollapsedSubProcess(nestedFlowElement, bpmnModel)) { drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, highLightedActivities, highLightedFlows, scaleFactor, drawSequenceFlowNameWithNoLabelDI); } } } } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/flow/FindNextNodeUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,235 @@ package org.jeecg.modules.flowable.flow; import com.google.common.collect.Maps; import com.greenpineyu.fel.FelEngine; import com.greenpineyu.fel.FelEngineImpl; import com.greenpineyu.fel.context.FelContext; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.ProcessDefinition; import java.util.*; /** */ public class FindNextNodeUtil { /** * è·åä¸ä¸æ¥éª¤çç¨æ·ä»»å¡ * * @param repositoryService * @param map * @return */ public static List<UserTask> getNextUserTasks(RepositoryService repositoryService, org.flowable.task.api.Task task, Map<String, Object> map) { List<UserTask> data = new ArrayList<>(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); Process mainProcess = bpmnModel.getMainProcess(); Collection<FlowElement> flowElements = mainProcess.getFlowElements(); String key = task.getTaskDefinitionKey(); FlowElement flowElement = bpmnModel.getFlowElement(key); next(flowElements, flowElement, map, data); return data; } public static void next(Collection<FlowElement> flowElements, FlowElement flowElement, Map<String, Object> map, List<UserTask> nextUser) { //妿æ¯ç»æèç¹ if (flowElement instanceof EndEvent) { //妿æ¯åä»»å¡çç»æèç¹ if (getSubProcess(flowElements, flowElement) != null) { flowElement = getSubProcess(flowElements, flowElement); } } //è·åTaskçåºçº¿ä¿¡æ¯--å¯ä»¥æ¥æå¤ä¸ª List<SequenceFlow> outGoingFlows = null; if (flowElement instanceof Task) { outGoingFlows = ((Task) flowElement).getOutgoingFlows(); } else if (flowElement instanceof Gateway) { outGoingFlows = ((Gateway) flowElement).getOutgoingFlows(); } else if (flowElement instanceof StartEvent) { outGoingFlows = ((StartEvent) flowElement).getOutgoingFlows(); } else if (flowElement instanceof SubProcess) { outGoingFlows = ((SubProcess) flowElement).getOutgoingFlows(); } else if (flowElement instanceof CallActivity) { outGoingFlows = ((CallActivity) flowElement).getOutgoingFlows(); } if (outGoingFlows != null && outGoingFlows.size() > 0) { //éåææçåºçº¿--æ¾å°å¯ä»¥æ£ç¡®æ§è¡çé£ä¸æ¡ for (SequenceFlow sequenceFlow : outGoingFlows) { //1.æè¡¨è¾¾å¼ï¼ä¸ä¸ºtrue //2.æ è¡¨è¾¾å¼ String expression = sequenceFlow.getConditionExpression(); if (expression == null ||Boolean.parseBoolean( String.valueOf( result(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))))) { //åºçº¿çä¸ä¸èç¹ String nextFlowElementID = sequenceFlow.getTargetRef(); if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) { continue; } //æ¥è¯¢ä¸ä¸èç¹çä¿¡æ¯ FlowElement nextFlowElement = getFlowElementById(nextFlowElementID, flowElements); //è°ç¨æµç¨ if (nextFlowElement instanceof CallActivity) { CallActivity ca = (CallActivity) nextFlowElement; if (ca.getLoopCharacteristics() != null) { UserTask userTask = new UserTask(); userTask.setId(ca.getId()); userTask.setId(ca.getId()); userTask.setLoopCharacteristics(ca.getLoopCharacteristics()); userTask.setName(ca.getName()); nextUser.add(userTask); } next(flowElements, nextFlowElement, map, nextUser); } //ç¨æ·ä»»å¡ if (nextFlowElement instanceof UserTask) { nextUser.add((UserTask) nextFlowElement); } //æä»ç½å ³ else if (nextFlowElement instanceof ExclusiveGateway) { next(flowElements, nextFlowElement, map, nextUser); } //å¹¶è¡ç½å ³ else if (nextFlowElement instanceof ParallelGateway) { next(flowElements, nextFlowElement, map, nextUser); } //æ¥æ¶ä»»å¡ else if (nextFlowElement instanceof ReceiveTask) { next(flowElements, nextFlowElement, map, nextUser); } //æå¡ä»»å¡ else if (nextFlowElement instanceof ServiceTask) { next(flowElements, nextFlowElement, map, nextUser); } //åä»»å¡çèµ·ç¹ else if (nextFlowElement instanceof StartEvent) { next(flowElements, nextFlowElement, map, nextUser); } //ç»æèç¹ else if (nextFlowElement instanceof EndEvent) { next(flowElements, nextFlowElement, map, nextUser); } } } } } /** * 夿æ¯å¦æ¯å¤å®ä¾åæµç¨å¹¶ä¸éè¦è®¾ç½®éåç±»ååé */ public static boolean checkSubProcess(String Id, Collection<FlowElement> flowElements, List<UserTask> nextUser) { for (FlowElement flowElement1 : flowElements) { if (flowElement1 instanceof SubProcess && flowElement1.getId().equals(Id)) { SubProcess sp = (SubProcess) flowElement1; if (sp.getLoopCharacteristics() != null) { String inputDataItem = sp.getLoopCharacteristics().getInputDataItem(); UserTask userTask = new UserTask(); userTask.setId(sp.getId()); userTask.setLoopCharacteristics(sp.getLoopCharacteristics()); userTask.setName(sp.getName()); nextUser.add(userTask); return true; } } } return false; } /** * æ¥è¯¢ä¸ä¸ªèç¹çæ¯å¦åä»»å¡ä¸çèç¹ï¼å¦ææ¯ï¼è¿ååä»»å¡ * * @param flowElements å ¨æµç¨çèç¹éå * @param flowElement å½åèç¹ * @return */ public static FlowElement getSubProcess(Collection<FlowElement> flowElements, FlowElement flowElement) { for (FlowElement flowElement1 : flowElements) { if (flowElement1 instanceof SubProcess) { for (FlowElement flowElement2 : ((SubProcess) flowElement1).getFlowElements()) { if (flowElement.equals(flowElement2)) { return flowElement1; } } } } return null; } /** * æ ¹æ®IDæ¥è¯¢æµç¨èç¹å¯¹è±¡, 妿æ¯åä»»å¡ï¼åè¿ååä»»å¡çå¼å§èç¹ * * @param Id èç¹ID * @param flowElements æµç¨èç¹éå * @return */ public static FlowElement getFlowElementById(String Id, Collection<FlowElement> flowElements) { for (FlowElement flowElement : flowElements) { if (flowElement.getId().equals(Id)) { //妿æ¯åä»»å¡ï¼åæ¥è¯¢åºåä»»å¡çå¼å§èç¹ if (flowElement instanceof SubProcess) { return getStartFlowElement(((SubProcess) flowElement).getFlowElements()); } return flowElement; } if (flowElement instanceof SubProcess) { FlowElement flowElement1 = getFlowElementById(Id, ((SubProcess) flowElement).getFlowElements()); if (flowElement1 != null) { return flowElement1; } } } return null; } /** * è¿åæµç¨çå¼å§èç¹ * * @param flowElements èç¹éå * @description: */ public static FlowElement getStartFlowElement(Collection<FlowElement> flowElements) { for (FlowElement flowElement : flowElements) { if (flowElement instanceof StartEvent) { return flowElement; } } return null; } /** * æ ¡éªelè¡¨è¾¾ç¤ºä¾ * * @param map * @param expression * @return */ public static Object result(Map<String, Object> map, String expression) { FelEngine fel = new FelEngineImpl(); FelContext ctx = fel.getContext(); for (Map.Entry<String, Object> entry : map.entrySet()) { ctx.set(entry.getKey(), entry.getValue()); } Object result = fel.eval(expression); return result; } public static void main(String[] args) { HashMap<String, Object> objectObjectHashMap = Maps.newHashMap(); objectObjectHashMap.put("a",100); objectObjectHashMap.put("b",200); objectObjectHashMap.put("c","abc"); Object result = result(objectObjectHashMap, "a!=00&&b=='200'&&c=='abc'"); System.out.println(result); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/flow/FlowableConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package org.jeecg.modules.flowable.flow; import org.flowable.spring.SpringProcessEngineConfiguration; import org.flowable.spring.boot.EngineConfigurationConfigurer; import org.springframework.context.annotation.Configuration; /** */ @Configuration public class FlowableConfig implements EngineConfigurationConfigurer<SpringProcessEngineConfiguration> { @Override public void configure(SpringProcessEngineConfiguration engineConfiguration) { engineConfiguration.setActivityFontName("å®ä½"); engineConfiguration.setLabelFontName("å®ä½"); engineConfiguration.setAnnotationFontName("å®ä½"); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/flow/FlowableUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,587 @@ package org.jeecg.modules.flowable.flow; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.*; import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; import org.flowable.task.api.history.HistoricTaskInstance; import java.util.*; /** */ @Slf4j public class FlowableUtils { /** * æ ¹æ®èç¹ï¼è·åå ¥å£è¿çº¿ * @param source * @return */ public static List<SequenceFlow> getElementIncomingFlows(FlowElement source) { List<SequenceFlow> sequenceFlows = null; if (source instanceof FlowNode) { sequenceFlows = ((FlowNode) source).getIncomingFlows(); } else if (source instanceof Gateway) { sequenceFlows = ((Gateway) source).getIncomingFlows(); } else if (source instanceof SubProcess) { sequenceFlows = ((SubProcess) source).getIncomingFlows(); } else if (source instanceof StartEvent) { sequenceFlows = ((StartEvent) source).getIncomingFlows(); } else if (source instanceof EndEvent) { sequenceFlows = ((EndEvent) source).getIncomingFlows(); } return sequenceFlows; } /** * æ ¹æ®èç¹ï¼è·ååºå£è¿çº¿ * @param source * @return */ public static List<SequenceFlow> getElementOutgoingFlows(FlowElement source) { List<SequenceFlow> sequenceFlows = null; if (source instanceof FlowNode) { sequenceFlows = ((FlowNode) source).getOutgoingFlows(); } else if (source instanceof Gateway) { sequenceFlows = ((Gateway) source).getOutgoingFlows(); } else if (source instanceof SubProcess) { sequenceFlows = ((SubProcess) source).getOutgoingFlows(); } else if (source instanceof StartEvent) { sequenceFlows = ((StartEvent) source).getOutgoingFlows(); } else if (source instanceof EndEvent) { sequenceFlows = ((EndEvent) source).getOutgoingFlows(); } return sequenceFlows; } /** * è·åå ¨é¨èç¹å表ï¼å å«åæµç¨èç¹ * @param flowElements * @param allElements * @return */ public static Collection<FlowElement> getAllElements(Collection<FlowElement> flowElements, Collection<FlowElement> allElements) { allElements = allElements == null ? new ArrayList<>() : allElements; for (FlowElement flowElement : flowElements) { allElements.add(flowElement); if (flowElement instanceof SubProcess) { // ç»§ç»æ·±å ¥åæµç¨ï¼è¿ä¸æ¥è·ååæµç¨ allElements = FlowableUtils.getAllElements(((SubProcess) flowElement).getFlowElements(), allElements); } } return allElements; } /** * è¿ä»£è·åç¶çº§ä»»å¡èç¹å表ï¼ååæ¾ * @param source èµ·å§èç¹ * @param hasSequenceFlow å·²ç»ç»è¿çè¿çº¿ç IDï¼ç¨äºå¤æçº¿è·¯æ¯å¦éå¤ * @param userTaskList å·²æ¾å°çç¨æ·ä»»å¡èç¹ * @return */ public static List<UserTask> iteratorFindParentUserTasks(FlowElement source, Set<String> hasSequenceFlow, List<UserTask> userTaskList) { userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; // å¦æè¯¥èç¹ä¸ºå¼å§èç¹ï¼ä¸åå¨ä¸çº§åèç¹ï¼å顺çä¸çº§åèç¹ç»§ç»è¿ä»£ if (source instanceof StartEvent && source.getSubProcess() != null) { userTaskList = iteratorFindParentUserTasks(source.getSubProcess(), hasSequenceFlow, userTaskList); } // æ ¹æ®ç±»åï¼è·åå ¥å£è¿çº¿ List<SequenceFlow> sequenceFlows = getElementIncomingFlows(source); if (sequenceFlows != null) { // å¾ªç¯æ¾å°ç®æ å ç´ for (SequenceFlow sequenceFlow: sequenceFlows) { // 妿åç°è¿çº¿éå¤ï¼è¯´æå¾ªç¯äºï¼è·³è¿è¿ä¸ªå¾ªç¯ if (hasSequenceFlow.contains(sequenceFlow.getId())) { continue; } // æ·»å å·²ç»èµ°è¿çè¿çº¿ hasSequenceFlow.add(sequenceFlow.getId()); // ç±»åä¸ºç¨æ·èç¹ï¼åæ°å¢ç¶çº§èç¹ if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { userTaskList.add((UserTask) sequenceFlow.getSourceFlowElement()); continue; } // ç±»åä¸ºåæµç¨ï¼åæ·»å åæµç¨å¼å§èç¹åºå£å¤ç¸è¿çèç¹ if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { // è·ååæµç¨ç¨æ·ä»»å¡èç¹ List<UserTask> childUserTaskList = findChildProcessUserTasks((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, null); // 妿æ¾å°èç¹ï¼å说æè¯¥çº¿è·¯æ¾å°èç¹ï¼ä¸ç»§ç»å䏿¾ï¼åä¹ç»§ç» if (childUserTaskList != null && childUserTaskList.size() > 0) { userTaskList.addAll(childUserTaskList); continue; } } // ç»§ç»è¿ä»£ userTaskList = iteratorFindParentUserTasks(sequenceFlow.getSourceFlowElement(), hasSequenceFlow, userTaskList); } } return userTaskList; } /** * æ ¹æ®æ£å¨è¿è¡çä»»å¡èç¹ï¼è¿ä»£è·åå级任å¡èç¹å表ï¼ååæ¾ * @param source èµ·å§èç¹ * @param runTaskKeyList æ£å¨è¿è¡çä»»å¡ Keyï¼ç¨äºæ ¡éªä»»å¡èç¹æ¯å¦æ¯æ£å¨è¿è¡çèç¹ * @param hasSequenceFlow å·²ç»ç»è¿çè¿çº¿ç IDï¼ç¨äºå¤æçº¿è·¯æ¯å¦éå¤ * @param userTaskList éè¦æ¤åçç¨æ·ä»»å¡å表 * @return */ public static List<UserTask> iteratorFindChildUserTasks(FlowElement source, List<String> runTaskKeyList, Set<String> hasSequenceFlow, List<UserTask> userTaskList) { hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; // å¦æè¯¥èç¹ä¸ºå¼å§èç¹ï¼ä¸åå¨ä¸çº§åèç¹ï¼å顺çä¸çº§åèç¹ç»§ç»è¿ä»£ if (source instanceof EndEvent && source.getSubProcess() != null) { userTaskList = iteratorFindChildUserTasks(source.getSubProcess(), runTaskKeyList, hasSequenceFlow, userTaskList); } // æ ¹æ®ç±»åï¼è·ååºå£è¿çº¿ List<SequenceFlow> sequenceFlows = getElementOutgoingFlows(source); if (sequenceFlows != null) { // å¾ªç¯æ¾å°ç®æ å ç´ for (SequenceFlow sequenceFlow: sequenceFlows) { // 妿åç°è¿çº¿éå¤ï¼è¯´æå¾ªç¯äºï¼è·³è¿è¿ä¸ªå¾ªç¯ if (hasSequenceFlow.contains(sequenceFlow.getId())) { continue; } // æ·»å å·²ç»èµ°è¿çè¿çº¿ hasSequenceFlow.add(sequenceFlow.getId()); // å¦æä¸ºç¨æ·ä»»å¡ç±»åï¼ä¸ä»»å¡èç¹ç Key æ£å¨è¿è¡çä»»å¡ä¸åå¨ï¼æ·»å if (sequenceFlow.getTargetFlowElement() instanceof UserTask && runTaskKeyList.contains((sequenceFlow.getTargetFlowElement()).getId())) { userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); continue; } // 妿èç¹ä¸ºåæµç¨èç¹æ åµï¼åä»èç¹ä¸ç第ä¸ä¸ªèç¹å¼å§è·å if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { List<UserTask> childUserTaskList = iteratorFindChildUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), runTaskKeyList, hasSequenceFlow, null); // 妿æ¾å°èç¹ï¼å说æè¯¥çº¿è·¯æ¾å°èç¹ï¼ä¸ç»§ç»å䏿¾ï¼åä¹ç»§ç» if (childUserTaskList != null && childUserTaskList.size() > 0) { userTaskList.addAll(childUserTaskList); continue; } } // ç»§ç»è¿ä»£ userTaskList = iteratorFindChildUserTasks(sequenceFlow.getTargetFlowElement(), runTaskKeyList, hasSequenceFlow, userTaskList); } } return userTaskList; } /** * è¿ä»£è·ååæµç¨ç¨æ·ä»»å¡èç¹ * @param source èµ·å§èç¹ * @param hasSequenceFlow å·²ç»ç»è¿çè¿çº¿ç IDï¼ç¨äºå¤æçº¿è·¯æ¯å¦éå¤ * @param userTaskList éè¦æ¤åçç¨æ·ä»»å¡å表 * @return */ public static List<UserTask> findChildProcessUserTasks(FlowElement source, Set<String> hasSequenceFlow, List<UserTask> userTaskList) { hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList; // æ ¹æ®ç±»åï¼è·ååºå£è¿çº¿ List<SequenceFlow> sequenceFlows = getElementOutgoingFlows(source); if (sequenceFlows != null) { // å¾ªç¯æ¾å°ç®æ å ç´ for (SequenceFlow sequenceFlow: sequenceFlows) { // 妿åç°è¿çº¿éå¤ï¼è¯´æå¾ªç¯äºï¼è·³è¿è¿ä¸ªå¾ªç¯ if (hasSequenceFlow.contains(sequenceFlow.getId())) { continue; } // æ·»å å·²ç»èµ°è¿çè¿çº¿ hasSequenceFlow.add(sequenceFlow.getId()); // å¦æä¸ºç¨æ·ä»»å¡ç±»åï¼ä¸ä»»å¡èç¹ç Key æ£å¨è¿è¡çä»»å¡ä¸åå¨ï¼æ·»å if (sequenceFlow.getTargetFlowElement() instanceof UserTask) { userTaskList.add((UserTask) sequenceFlow.getTargetFlowElement()); continue; } // 妿èç¹ä¸ºåæµç¨èç¹æ åµï¼åä»èç¹ä¸ç第ä¸ä¸ªèç¹å¼å§è·å if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { List<UserTask> childUserTaskList = findChildProcessUserTasks((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, null); // 妿æ¾å°èç¹ï¼å说æè¯¥çº¿è·¯æ¾å°èç¹ï¼ä¸ç»§ç»å䏿¾ï¼åä¹ç»§ç» if (childUserTaskList != null && childUserTaskList.size() > 0) { userTaskList.addAll(childUserTaskList); continue; } } // ç»§ç»è¿ä»£ userTaskList = findChildProcessUserTasks(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, userTaskList); } } return userTaskList; } /** * ä»ååå寻路ï¼è·åææè线路ä¸çç¹ * @param source èµ·å§èç¹ * @param passRoads å·²ç»ç»è¿çç¹éå * @param hasSequenceFlow å·²ç»ç»è¿çè¿çº¿ç IDï¼ç¨äºå¤æçº¿è·¯æ¯å¦éå¤ * @param targets ç®æ è线路ç»ç¹ * @param dirtyRoads ç¡®å®ä¸ºèæ°æ®çç¹ï¼å 为ä¸éè¦éå¤ï¼å æ¤ä½¿ç¨ set åå¨ * @return */ public static Set<String> iteratorFindDirtyRoads(FlowElement source, List<String> passRoads, Set<String> hasSequenceFlow, List<String> targets, Set<String> dirtyRoads) { passRoads = passRoads == null ? new ArrayList<>() : passRoads; dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; // å¦æè¯¥èç¹ä¸ºå¼å§èç¹ï¼ä¸åå¨ä¸çº§åèç¹ï¼å顺çä¸çº§åèç¹ç»§ç»è¿ä»£ if (source instanceof StartEvent && source.getSubProcess() != null) { dirtyRoads = iteratorFindDirtyRoads(source.getSubProcess(), passRoads, hasSequenceFlow, targets, dirtyRoads); } // æ ¹æ®ç±»åï¼è·åå ¥å£è¿çº¿ List<SequenceFlow> sequenceFlows = getElementIncomingFlows(source); if (sequenceFlows != null) { // å¾ªç¯æ¾å°ç®æ å ç´ for (SequenceFlow sequenceFlow: sequenceFlows) { // 妿åç°è¿çº¿éå¤ï¼è¯´æå¾ªç¯äºï¼è·³è¿è¿ä¸ªå¾ªç¯ if (hasSequenceFlow.contains(sequenceFlow.getId())) { continue; } // æ·»å å·²ç»èµ°è¿çè¿çº¿ hasSequenceFlow.add(sequenceFlow.getId()); // æ°å¢ç»è¿ç路线 passRoads.add(sequenceFlow.getSourceFlowElement().getId()); // 妿æ¤ç¹ä¸ºç®æ ç¹ï¼ç¡®å®ç»è¿ç路线为èçº¿è·¯ï¼æ·»å ç¹å°è线路ä¸ï¼ç¶åæ¾ä¸ä¸ªè¿çº¿ if (targets.contains(sequenceFlow.getSourceFlowElement().getId())) { dirtyRoads.addAll(passRoads); continue; } // å¦æè¯¥èç¹ä¸ºå¼å§èç¹ï¼ä¸åå¨ä¸çº§åèç¹ï¼å顺çä¸çº§åèç¹ç»§ç»è¿ä»£ if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { dirtyRoads = findChildProcessAllDirtyRoad((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, dirtyRoads); // æ¯å¦åå¨åæµç¨ä¸ï¼true æ¯ï¼false å¦ Boolean isInChildProcess = dirtyTargetInChildProcess((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, targets, null); if (isInChildProcess) { // å·²å¨åæµç¨ä¸æ¾å°ï¼è¯¥è·¯çº¿ç»æ continue; } } // ç»§ç»è¿ä»£ dirtyRoads = iteratorFindDirtyRoads(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, targets, dirtyRoads); } } return dirtyRoads; } /** * è¿ä»£è·ååæµç¨è路线 * 说æï¼åå¦åéçç¹å°±æ¯åæµç¨ï¼é£ä¹ä¹è¯å®ä¼åéå°åæµç¨æåçç¨æ·ä»»å¡èç¹ï¼å æ¤åæµç¨ä¸çèç¹å ¨æ¯è路线 * @param source èµ·å§èç¹ * @param hasSequenceFlow å·²ç»ç»è¿çè¿çº¿ç IDï¼ç¨äºå¤æçº¿è·¯æ¯å¦éå¤ * @param dirtyRoads ç¡®å®ä¸ºèæ°æ®çç¹ï¼å 为ä¸éè¦éå¤ï¼å æ¤ä½¿ç¨ set åå¨ * @return */ public static Set<String> findChildProcessAllDirtyRoad(FlowElement source, Set<String> hasSequenceFlow, Set<String> dirtyRoads) { hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; dirtyRoads = dirtyRoads == null ? new HashSet<>() : dirtyRoads; // æ ¹æ®ç±»åï¼è·ååºå£è¿çº¿ List<SequenceFlow> sequenceFlows = getElementOutgoingFlows(source); if (sequenceFlows != null) { // å¾ªç¯æ¾å°ç®æ å ç´ for (SequenceFlow sequenceFlow: sequenceFlows) { // 妿åç°è¿çº¿éå¤ï¼è¯´æå¾ªç¯äºï¼è·³è¿è¿ä¸ªå¾ªç¯ if (hasSequenceFlow.contains(sequenceFlow.getId())) { continue; } // æ·»å å·²ç»èµ°è¿çè¿çº¿ hasSequenceFlow.add(sequenceFlow.getId()); // æ·»å è路线 dirtyRoads.add(sequenceFlow.getTargetFlowElement().getId()); // 妿èç¹ä¸ºåæµç¨èç¹æ åµï¼åä»èç¹ä¸ç第ä¸ä¸ªèç¹å¼å§è·å if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { dirtyRoads = findChildProcessAllDirtyRoad((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, dirtyRoads); } // ç»§ç»è¿ä»£ dirtyRoads = findChildProcessAllDirtyRoad(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, dirtyRoads); } } return dirtyRoads; } /** * 夿èè·¯çº¿ç»æèç¹æ¯å¦å¨åæµç¨ä¸ * @param source èµ·å§èç¹ * @param hasSequenceFlow å·²ç»ç»è¿çè¿çº¿ç IDï¼ç¨äºå¤æçº¿è·¯æ¯å¦éå¤ * @param targets 夿è路线èç¹æ¯å¦åå¨åæµç¨ä¸ï¼åªè¦åå¨ä¸ä¸ªï¼è¯´æè路线åªå°åæµç¨ä¸ºæ¢ * @param inChildProcess æ¯å¦åå¨åæµç¨ä¸ï¼true æ¯ï¼false å¦ * @return */ public static Boolean dirtyTargetInChildProcess(FlowElement source, Set<String> hasSequenceFlow, List<String> targets, Boolean inChildProcess) { hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; inChildProcess = inChildProcess == null ? false : inChildProcess; // æ ¹æ®ç±»åï¼è·ååºå£è¿çº¿ List<SequenceFlow> sequenceFlows = getElementOutgoingFlows(source); if (sequenceFlows != null && !inChildProcess) { // å¾ªç¯æ¾å°ç®æ å ç´ for (SequenceFlow sequenceFlow: sequenceFlows) { // 妿åç°è¿çº¿éå¤ï¼è¯´æå¾ªç¯äºï¼è·³è¿è¿ä¸ªå¾ªç¯ if (hasSequenceFlow.contains(sequenceFlow.getId())) { continue; } // æ·»å å·²ç»èµ°è¿çè¿çº¿ hasSequenceFlow.add(sequenceFlow.getId()); // 妿åç°ç®æ ç¹å¨åæµç¨ä¸åå¨ï¼è¯´æåªå°åæµç¨ä¸ºæ¢ if (targets.contains(sequenceFlow.getTargetFlowElement().getId())) { inChildProcess = true; break; } // 妿èç¹ä¸ºåæµç¨èç¹æ åµï¼åä»èç¹ä¸ç第ä¸ä¸ªèç¹å¼å§è·å if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { inChildProcess = dirtyTargetInChildProcess((FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements().toArray()[0]), hasSequenceFlow, targets, inChildProcess); } // ç»§ç»è¿ä»£ inChildProcess = dirtyTargetInChildProcess(sequenceFlow.getTargetFlowElement(), hasSequenceFlow, targets, inChildProcess); } } return inChildProcess; } /** * è¿ä»£ä»åååæ«æï¼å¤æç®æ èç¹ç¸å¯¹äºå½åèç¹æ¯å¦æ¯ä¸²è¡ * ä¸åå¨ç´æ¥åéå°åæµç¨ä¸çæ åµï¼ä½åå¨ä»åæµç¨åºå»å°ç¶æµç¨æ åµ * @param source èµ·å§èç¹ * @param isSequential æ¯å¦ä¸²è¡ * @param hasSequenceFlow å·²ç»ç»è¿çè¿çº¿ç IDï¼ç¨äºå¤æçº¿è·¯æ¯å¦éå¤ * @param targetKsy ç®æ èç¹ * @return */ public static Boolean iteratorCheckSequentialReferTarget(FlowElement source, String targetKsy, Set<String> hasSequenceFlow, Boolean isSequential) { isSequential = isSequential == null ? true : isSequential; hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; // å¦æè¯¥èç¹ä¸ºå¼å§èç¹ï¼ä¸åå¨ä¸çº§åèç¹ï¼å顺çä¸çº§åèç¹ç»§ç»è¿ä»£ if (source instanceof StartEvent && source.getSubProcess() != null) { isSequential = iteratorCheckSequentialReferTarget(source.getSubProcess(), targetKsy, hasSequenceFlow, isSequential); } // æ ¹æ®ç±»åï¼è·åå ¥å£è¿çº¿ List<SequenceFlow> sequenceFlows = getElementIncomingFlows(source); if (sequenceFlows != null) { // å¾ªç¯æ¾å°ç®æ å ç´ for (SequenceFlow sequenceFlow: sequenceFlows) { // 妿åç°è¿çº¿éå¤ï¼è¯´æå¾ªç¯äºï¼è·³è¿è¿ä¸ªå¾ªç¯ if (hasSequenceFlow.contains(sequenceFlow.getId())) { continue; } // æ·»å å·²ç»èµ°è¿çè¿çº¿ hasSequenceFlow.add(sequenceFlow.getId()); // å¦æç®æ èç¹å·²è¢«å¤æä¸ºå¹¶è¡ï¼åé¢é½ä¸éè¦æ§è¡ï¼ç´æ¥è¿å if (isSequential == false) { break; } // è¿æ¡çº¿è·¯åå¨ç®æ èç¹ï¼è¿æ¡çº¿è·¯å®æï¼è¿å ¥ä¸ä¸ªçº¿è·¯ if (targetKsy.equals(sequenceFlow.getSourceFlowElement().getId())) { continue; } if (sequenceFlow.getSourceFlowElement() instanceof StartEvent) { isSequential = false; break; } // å¦å就继ç»è¿ä»£ isSequential = iteratorCheckSequentialReferTarget(sequenceFlow.getSourceFlowElement(), targetKsy, hasSequenceFlow, isSequential); } } return isSequential; } /** * ä»ååå寻路ï¼è·åå°è¾¾èç¹çææè·¯çº¿ * ä¸åå¨ç´æ¥åéå°åæµç¨ï¼ä½æ¯åå¨åéå°ç¶çº§æµç¨çæ åµ * @param source èµ·å§èç¹ * @param passRoads å·²ç»ç»è¿çç¹éå * @param roads 路线 * @return */ public static List<List<UserTask>> findRoad(FlowElement source, List<UserTask> passRoads, Set<String> hasSequenceFlow, List<List<UserTask>> roads) { passRoads = passRoads == null ? new ArrayList<>() : passRoads; roads = roads == null ? new ArrayList<>() : roads; hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow; // å¦æè¯¥èç¹ä¸ºå¼å§èç¹ï¼ä¸åå¨ä¸çº§åèç¹ï¼å顺çä¸çº§åèç¹ç»§ç»è¿ä»£ if (source instanceof StartEvent && source.getSubProcess() != null) { roads = findRoad(source.getSubProcess(), passRoads, hasSequenceFlow, roads); } // æ ¹æ®ç±»åï¼è·åå ¥å£è¿çº¿ List<SequenceFlow> sequenceFlows = getElementIncomingFlows(source); if (sequenceFlows != null && sequenceFlows.size() != 0) { for (SequenceFlow sequenceFlow: sequenceFlows) { // 妿åç°è¿çº¿éå¤ï¼è¯´æå¾ªç¯äºï¼è·³è¿è¿ä¸ªå¾ªç¯ if (hasSequenceFlow.contains(sequenceFlow.getId())) { continue; } // æ·»å å·²ç»èµ°è¿çè¿çº¿ hasSequenceFlow.add(sequenceFlow.getId()); // æ·»å ç»è¿è·¯çº¿ if (sequenceFlow.getSourceFlowElement() instanceof UserTask) { passRoads.add((UserTask) sequenceFlow.getSourceFlowElement()); } // ç»§ç»è¿ä»£ roads = findRoad(sequenceFlow.getSourceFlowElement(), passRoads, hasSequenceFlow, roads); } } else { // æ·»å 路线 roads.add(passRoads); } return roads; } /** * åå²èç¹æ°æ®æ¸ æ´ï¼æ¸ æ´æå忻坼è´çèæ°æ® * @param allElements å ¨é¨èç¹ä¿¡æ¯ * @param historicTaskInstanceList åå²ä»»å¡å®ä¾ä¿¡æ¯ï¼æ°æ®éç¨å¼å§æ¶é´ååº * @return */ public static List<String> historicTaskInstanceClean(Collection<FlowElement> allElements, List<HistoricTaskInstance> historicTaskInstanceList) { // ä¼ç¾èç¹æ¶é List<String> multiTask = new ArrayList<>(); allElements.forEach(flowElement -> { if (flowElement instanceof UserTask) { // å¦æè¯¥èç¹çè¡ä¸ºä¸ºä¼ç¾è¡ä¸ºï¼è¯´æè¯¥èç¹ä¸ºä¼ç¾èç¹ if (((UserTask) flowElement).getBehavior() instanceof ParallelMultiInstanceBehavior || ((UserTask) flowElement).getBehavior() instanceof SequentialMultiInstanceBehavior) { multiTask.add(flowElement.getId()); } } }); // å¾ªç¯æ¾å ¥æ ï¼æ LIFOï¼åè¿å åº Stack<HistoricTaskInstance> stack = new Stack<>(); historicTaskInstanceList.forEach(item -> stack.push(item)); // æ¸ æ´åçåå²ä»»å¡å®ä¾ List<String> lastHistoricTaskInstanceList = new ArrayList<>(); // ç½å ³åå¨å¯è½åªèµ°äºé¨å忝æ åµï¼ä¸è¿åå¨è·³è½¬åºå¼æ°æ®ä»¥åå ¶ä»åæ¯æ°æ®çå¹²æ°ï¼å æ¤éè¦å¯¹åå²èç¹æ°æ®è¿è¡æ¸ æ´ // 临æ¶ç¨æ·ä»»å¡ key StringBuilder userTaskKey = null; // 临æ¶è¢«å æçä»»å¡ keyï¼åå¨å¹¶è¡æ åµ List<String> deleteKeyList = new ArrayList<>(); // 临æ¶èæ°æ®çº¿è·¯ List<Set<String>> dirtyDataLineList = new ArrayList<>(); // ç±æä¸ªç¹è·³å°ä¼ç¾ç¹,æ¤æ¶åºç°å¤ä¸ªä¼ç¾å®ä¾å¯¹åº 1 个跳转æ åµï¼éè¦æè¿äºè¿ç»èæ°æ®é½æ¾å° // ä¼ç¾ç¹æ®å¤ç䏿 int multiIndex = -1; // ä¼ç¾ç¹æ®å¤ç key StringBuilder multiKey = null; // ä¼ç¾ç¹æ®å¤çæä½æ è¯ boolean multiOpera = false; while (!stack.empty()) { // ä»è¿éå¼å§ userTaskKey é½è¿æ¯ä¸ä¸ªæ ç key // æ¯å¦æ¯èæ°æ®çº¿è·¯ä¸çç¹ final boolean[] isDirtyData = {false}; for (Set<String> oldDirtyDataLine : dirtyDataLineList) { if (oldDirtyDataLine.contains(stack.peek().getTaskDefinitionKey())) { isDirtyData[0] = true; } } // å é¤åå ä¸ä¸ºç©ºï¼è¯´æä»è¿æ¡æ°æ®å¼å§åè·³æè åéç // MI_ENDï¼ä¼ç¾å®æåï¼å ¶ä»æªç¾å°èç¹çå é¤åå ï¼ä¸å¨å¤çèå´å if (stack.peek().getDeleteReason() != null && !stack.peek().getDeleteReason().equals("MI_END")) { // å¯ä»¥ç解为èçº¿è·¯èµ·ç¹ String dirtyPoint = ""; if (stack.peek().getDeleteReason().indexOf("Change activity to ") >= 0) { dirtyPoint = stack.peek().getDeleteReason().replace("Change activity to ", ""); } // ä¼ç¾åéå é¤åå æç¹ä¸å if (stack.peek().getDeleteReason().indexOf("Change parent activity to ") >= 0) { dirtyPoint = stack.peek().getDeleteReason().replace("Change parent activity to ", ""); } FlowElement dirtyTask = null; // è·ååæ´èç¹ç对åºçå ¥å£å¤è¿çº¿ // 妿æ¯ç½å ³å¹¶è¡åéæ åµï¼ä¼åæä¸¤æ¡èæ°æ®è·¯çº¿ï¼ææä¸æ · for (FlowElement flowElement : allElements) { if (flowElement.getId().equals(stack.peek().getTaskDefinitionKey())) { dirtyTask = flowElement; } } // è·åèæ°æ®çº¿è·¯ Set<String> dirtyDataLine = FlowableUtils.iteratorFindDirtyRoads(dirtyTask, null, null, Arrays.asList(dirtyPoint.split(",")), null); // èªå·±æ¬èº«ä¹æ¯è线路ä¸çç¹ï¼å è¿å» dirtyDataLine.add(stack.peek().getTaskDefinitionKey()); log.info(stack.peek().getTaskDefinitionKey() + "ç¹è路线éåï¼" + dirtyDataLine); // æ¯å ¨æ°çéè¦æ·»å çè线路 boolean isNewDirtyData = true; for (int i = 0; i < dirtyDataLineList.size(); i++) { // 妿åç°ä»çä¸ä¸ªèç¹å¨è线路å ï¼è¯´æè¿ä¸ªç¹å¯è½æ¯å¹¶è¡çèç¹ï¼æè è¿ç»é©³å // è¿æ¶ï¼é½ä»¥ä¹åçè线路èç¹ä¸ºæ åï¼åªéåå¹¶è线路å³å¯ï¼ä¹å°±æ¯è·¯çº¿è¡¥å ¨ if (dirtyDataLineList.get(i).contains(userTaskKey.toString())) { isNewDirtyData = false; dirtyDataLineList.get(i).addAll(dirtyDataLine); } } // å·²ç¡®å®æ¶å ¨æ°çè线路 if (isNewDirtyData) { // deleteKey åä¸è·¯çº¿é©³åå°å¹¶è¡ï¼è¿ç§åæ¶çæå¤ä¸ªæ°å®ä¾è®°å½æ åµï¼è¿æ¶ deleteKey å ¶å®æ¯ç±å¤ä¸ªå¼ç»æ // æç §é»è¾ï¼åéåç«å»çæçå®ä¾è®°å½å°±æ¯åéçè®°å½ // è³äºé©³åæçæç Keyï¼ç´æ¥ä»å é¤åå ä¸è·åï¼å 为åå¨é©³åå°å¹¶è¡çæ åµ deleteKeyList.add(dirtyPoint + ","); dirtyDataLineList.add(dirtyDataLine); } // æ·»å åï¼ç°å¨è¿ä¸ªç¹åæè线路ä¸çç¹äº isDirtyData[0] = true; } // 妿䏿¯è线路ä¸çç¹ï¼è¯´ææ¯æææ°æ®ï¼æ·»å åå²å®ä¾ Key if (!isDirtyData[0]) { lastHistoricTaskInstanceList.add(stack.peek().getTaskDefinitionKey()); } // æ ¡éªè线路æ¯å¦ç»æ for (int i = 0; i < deleteKeyList.size(); i ++) { // 妿åç°èæ°æ®å±äºä¼ç¾ï¼è®°å½ä¸ä¸æ ä¸å¯¹åº Keyï¼ä»¥å¤åç»æ¯å¯¹ï¼ä¼ç¾èæ°æ®èç´å¼å§ if (multiKey == null && multiTask.contains(stack.peek().getTaskDefinitionKey()) && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) { multiIndex = i; multiKey = new StringBuilder(stack.peek().getTaskDefinitionKey()); } // ä¼ç¾èæ°æ®å¤çï¼èç¹éåä¼ç¾æ¸ 空 // 妿å¨ä¼ç¾èæ°æ®èç´ä¸åç° Keyæ¹åï¼è¯´æä¼ç¾èæ°æ®å¨ä¸ä¸ªèç¹å°±ç»æäºï¼å¯ä»¥æä¼ç¾èæ°æ®å æ if (multiKey != null && !multiKey.toString().equals(stack.peek().getTaskDefinitionKey())) { deleteKeyList.set(multiIndex , deleteKeyList.get(multiIndex).replace(stack.peek().getTaskDefinitionKey() + ",", "")); multiKey = null; // ç»æè¿è¡ä¸æ ¡éªå é¤ multiOpera = true; } // å ¶ä»èæ°æ®å¤ç // åç°è¯¥è·¯çº¿æå䏿¡èæ°æ®ï¼è¯´æè¿æ¡èæ°æ®çº¿è·¯å¤çå®äºï¼å é¤èæ°æ®ä¿¡æ¯ // èæ°æ®äº§ççæ°å®ä¾ä¸æ¯å¦å å«è¿æ¡æ°æ® if (multiKey == null && deleteKeyList.get(i).contains(stack.peek().getTaskDefinitionKey())) { // å é¤å¹é å°çé¨å deleteKeyList.set(i , deleteKeyList.get(i).replace(stack.peek().getTaskDefinitionKey() + ",", "")); } // 妿æ¯ç»ä¸çå ç´ é½ä»¥å¹é è¿ï¼è¯´æèæ°æ®ç»æ if ("".equals(deleteKeyList.get(i))) { // åæ¶å é¤èæ°æ® deleteKeyList.remove(i); dirtyDataLineList.remove(i); break; } } // ä¼ç¾æ°æ®å¤çéè¦å¨å¾ªç¯å¤å¤çï¼å¦åå¯è½å¯¼è´æº¢åº // ä¼ç¾çæ°æ®è¯å®æ¯ä¹åæ¾è¿å»çæä»¥ç论ä¸ä¸ä¼æº¢åºï¼ä½è¿æ¯æ ¡éªä¸ if (multiOpera && deleteKeyList.size() > multiIndex && "".equals(deleteKeyList.get(multiIndex))) { // åæ¶å é¤èæ°æ® deleteKeyList.remove(multiIndex); dirtyDataLineList.remove(multiIndex); multiIndex = -1; multiOpera = false; } // pop() æ¹æ³ä¸ peek() æ¹æ³ä¸åï¼å¨è¿åå¼çåæ¶ï¼ä¼æå¼ä»æ ä¸ç§»é¤ // ä¿åæ°ç userTaskKey å¨ä¸ä¸ªå¾ªç¯ä¸ä½¿ç¨ userTaskKey = new StringBuilder(stack.pop().getTaskDefinitionKey()); } log.info("æ¸ æ´åçåå²èç¹æ°æ®ï¼" + lastHistoricTaskInstanceList); return lastHistoricTaskInstanceList; } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/listener/UserTaskListener.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package org.jeecg.modules.flowable.listener; import org.flowable.engine.delegate.TaskListener; import org.flowable.task.service.delegate.DelegateTask; import org.springframework.stereotype.Component; /** */ public class UserTaskListener implements TaskListener{ @Override public void notify(DelegateTask delegateTask) { } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowDefinitionService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,97 @@ package org.jeecg.modules.flowable.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.flowable.domain.dto.FlowProcDefDto; import java.io.IOException; import java.io.InputStream; import java.util.Map; /** */ public interface IFlowDefinitionService { boolean exist(String processDefinitionKey); /** * æµç¨å®ä¹å表 * * @param pageNum å½å页ç * @param pageSize æ¯é¡µæ¡æ° * @param flowProcDefDto * @return æµç¨å®ä¹å页åè¡¨æ°æ® */ Page<FlowProcDefDto> list(Integer pageNum, Integer pageSize, FlowProcDefDto flowProcDefDto); /** * å¯¼å ¥æµç¨æä»¶ * * @param name * @param category * @param in */ void importFile(String name, String category, InputStream in); /** * 读åxml * @param deployId * @return */ Result readXml(String deployId) throws IOException; Result readXmlByDataId(String dataId) throws IOException; /** * æ ¹æ®æµç¨å®ä¹Keyå¯å¨æµç¨å®ä¾ *å¯å¨ææ°ä¸ä¸ªçæ¬ * @param procDefKey * @param variables * @return */ Result startProcessInstanceByKey(String procDefKey, Map<String, Object> variables); /** * æ ¹æ®æµç¨å®ä¹IDå¯å¨æµç¨å®ä¾ * * @param procDefId * @param variables * @return */ Result startProcessInstanceById(String procDefId, Map<String, Object> variables); /** * æ ¹æ®æµç¨å ³èçæ°æ®IDå¯å¨æµç¨å®ä¾ * @param dataId * @param variables * @return */ Result startProcessInstanceByDataId(String dataId, Map<String, Object> variables); /** * æ¿æ´»ææèµ·æµç¨å®ä¹ * * @param state ç¶æ * @param deployId æµç¨é¨ç½²ID */ void updateState(Integer state, String deployId); /** * å 餿µç¨å®ä¹ * * @param deployId æµç¨é¨ç½²ID act_ge_bytearray è¡¨ä¸ deployment_idå¼ */ void delete(String deployId); /** * 读åå¾çæä»¶ * @param deployId * @return */ InputStream readImage(String deployId); InputStream readImageByDataId(String dataId); } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowInstanceService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,58 @@ package org.jeecg.modules.flowable.service; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.task.api.Task; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.flowable.domain.vo.FlowTaskVo; import java.util.List; import java.util.Map; /** */ public interface IFlowInstanceService { List<Task> queryListByInstanceId(String instanceId); /** * ç»ææµç¨å®ä¾ * * @param vo */ void stopProcessInstance(FlowTaskVo vo); /** * æ¿æ´»ææèµ·æµç¨å®ä¾ * * @param state ç¶æ * @param instanceId æµç¨å®ä¾ID */ void updateState(Integer state, String instanceId); /** * å 餿µç¨å®ä¾ID * * @param instanceId æµç¨å®ä¾ID * @param deleteReason å é¤åå */ void delete(String instanceId, String deleteReason); void deleteByDataId(String dataId, String deleteReason); /** * æ ¹æ®å®ä¾IDæ¥è¯¢åå²å®ä¾æ°æ® * * @param processInstanceId * @return */ HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId); /** * æ ¹æ®æµç¨å®ä¹IDå¯å¨æµç¨å®ä¾ * * @param procDefId æµç¨å®ä¹Id * @param variables æµç¨åé * @return */ Result startProcessInstanceById(String procDefId, Map<String, Object> variables); } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowTaskService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,172 @@ package org.jeecg.modules.flowable.service; import com.baomidou.mybatisplus.core.metadata.IPage; import org.flowable.task.api.Task; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.flowable.domain.dto.FlowViewerDto; import org.jeecg.modules.flowable.domain.vo.FlowTaskVo; import java.io.InputStream; import java.util.List; /** */ public interface IFlowTaskService { /** * 审æ¹ä»»å¡ * * @param task 请æ±å®ä½åæ° */ Result complete(FlowTaskVo task); Result completeByDateId(FlowTaskVo flowTaskVo); /** * 驳åä»»å¡ * * @param flowTaskVo */ void taskReject(FlowTaskVo flowTaskVo); void taskRejectByDataId(FlowTaskVo flowTaskVo); /** * éåä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ void taskReturn(FlowTaskVo flowTaskVo); void taskReturnByDataId(FlowTaskVo flowTaskVo); /** * è·åææå¯åéçèç¹ * * @param flowTaskVo * @return */ Result findReturnTaskList(FlowTaskVo flowTaskVo); Result findReturnTaskListByDataId(FlowTaskVo flowTaskVo); /** * å é¤ä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ void deleteTask(FlowTaskVo flowTaskVo); /** * 认é¢/ç¾æ¶ä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ void claim(FlowTaskVo flowTaskVo); /** * åæ¶è®¤é¢/ç¾æ¶ä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ void unClaim(FlowTaskVo flowTaskVo); /** * å§æ´¾ä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ void delegateTask(FlowTaskVo flowTaskVo); /** * 转åä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ void assignTask(FlowTaskVo flowTaskVo); /** * æåèµ·çæµç¨ * @param pageNum * @param pageSize * @return */ Result myProcess(Integer pageNum, Integer pageSize); /** * åæ¶ç³è¯· * @param flowTaskVo * @return */ Result stopProcess(FlowTaskVo flowTaskVo); /** * æ¤åæµç¨ * @param flowTaskVo * @return */ Result revokeProcess(FlowTaskVo flowTaskVo); /** * 代åä»»å¡å表 * * @param pageNum å½å页ç * @param pageSize æ¯é¡µæ¡æ° * @return */ Result todoList(Integer pageNum, Integer pageSize); /** * å·²åä»»å¡å表 * * @param pageNum å½å页ç * @param pageSize æ¯é¡µæ¡æ° * @return */ Result finishedList(Integer pageNum, Integer pageSize); /** * æµç¨å岿µè½¬è®°å½ * * @param procInsId æµç¨å®ä¾Id * @return */ Result flowRecord(String dataId); /** * æ ¹æ®ä»»å¡IDæ¥è¯¢æè½½ç表åä¿¡æ¯ * * @param taskId ä»»å¡Id * @return */ Task getTaskForm(String taskId); /** * è·åæµç¨è¿ç¨å¾ * @param processId * @return */ InputStream diagram(String processId); /** * è·åæµç¨æ§è¡è¿ç¨ * @param procInsId * @return */ List<FlowViewerDto> getFlowViewer(String procInsId); List<FlowViewerDto> getFlowViewerByDataId(String dataId); /** * è·åæµç¨åé * @param taskId * @return */ Result processVariables(String taskId); /** * è·åä¸ä¸èç¹ * @param flowTaskVo ä»»å¡ * @return */ Result getNextFlowNode(FlowTaskVo flowTaskVo); } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowDefinitionServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,406 @@ package org.jeecg.modules.flowable.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.commons.io.IOUtils; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.ProcessEngineConfiguration; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinitionQuery; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.image.ProcessDiagramGenerator; import org.flowable.image.impl.DefaultProcessDiagramGenerator; import org.flowable.task.api.Task; import org.jeecg.common.api.vo.Result; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl; import org.jeecg.modules.flowable.apithird.entity.ActStatus; import org.jeecg.modules.flowable.apithird.entity.SysUser; import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI; import org.jeecg.modules.flowable.apithird.service.IFlowThirdService; import org.jeecg.modules.flowable.apithird.common.constant.ProcessConstants; import org.jeecg.modules.flowable.apithird.common.enums.FlowComment; import org.jeecg.modules.flowable.domain.dto.FlowNextDto; import org.jeecg.modules.flowable.domain.dto.FlowProcDefDto; import org.jeecg.modules.flowable.factory.FlowServiceFactory; import org.jeecg.modules.flowable.service.IFlowDefinitionService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; /** * æµç¨å®ä¹ * */ @Service public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFlowDefinitionService { @Autowired IFlowThirdService iFlowThirdService; @Autowired FlowMyBusinessServiceImpl flowMyBusinessService; @Autowired FlowTaskServiceImpl flowTaskService; private static final String BPMN_FILE_SUFFIX = ".bpmn"; @Override public boolean exist(String processDefinitionKey) { ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery().processDefinitionKey(processDefinitionKey); long count = processDefinitionQuery.count(); return count > 0 ? true : false; } /** * æµç¨å®ä¹å表 * * @param pageNum å½å页ç * @param pageSize æ¯é¡µæ¡æ° * @param flowProcDefDto * @return æµç¨å®ä¹å页åè¡¨æ°æ® */ @Override public Page<FlowProcDefDto> list(Integer pageNum, Integer pageSize, FlowProcDefDto flowProcDefDto) { Page<FlowProcDefDto> page = new Page<>(); // æµç¨å®ä¹åè¡¨æ°æ®æ¥è¯¢ ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); processDefinitionQuery //.processDefinitionId("cs:5:15e953ed-4d09-11ec-85b8-e884a5deddfc") .orderByProcessDefinitionKey().asc().orderByProcessDefinitionVersion().desc(); /*=====åæ°=====*/ if (StrUtil.isNotBlank(flowProcDefDto.getName())){ processDefinitionQuery.processDefinitionNameLike("%"+flowProcDefDto.getName()+"%"); } if (StrUtil.isNotBlank(flowProcDefDto.getCategory())){ processDefinitionQuery.processDefinitionCategory(flowProcDefDto.getCategory()); } if (flowProcDefDto.getSuspensionState() == 1){ processDefinitionQuery.active(); } if (StrUtil.isNotBlank(flowProcDefDto.getKey())){ processDefinitionQuery.processDefinitionKey(flowProcDefDto.getKey()); } if (flowProcDefDto.getIsLastVersion() == 1){ processDefinitionQuery.latestVersion(); } /*============*/ page.setTotal(processDefinitionQuery.count()); List<ProcessDefinition> processDefinitionList = processDefinitionQuery.listPage((pageNum - 1) * pageSize, pageSize); List<FlowProcDefDto> dataList = new ArrayList<>(); for (ProcessDefinition processDefinition : processDefinitionList) { String deploymentId = processDefinition.getDeploymentId(); Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult(); FlowProcDefDto reProcDef = new FlowProcDefDto(); BeanUtils.copyProperties(processDefinition, reProcDef); // æµç¨å®ä¹æ¶é´ reProcDef.setDeploymentTime(deployment.getDeploymentTime()); dataList.add(reProcDef); } page.setRecords(dataList); return page; } /** * å¯¼å ¥æµç¨æä»¶ * * @param name * @param category * @param in */ @Override public void importFile(String name, String category, InputStream in) { Deployment deploy = repositoryService.createDeployment().addInputStream(name + BPMN_FILE_SUFFIX, in).name(name).category(category).deploy(); ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult(); repositoryService.setProcessDefinitionCategory(definition.getId(), category); } /** * 读åxml * * @param deployId * @return */ @Override public Result readXml(String deployId) throws IOException { ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); InputStream inputStream = repositoryService.getResourceAsStream(definition.getDeploymentId(), definition.getResourceName()); String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()); return Result.OK("", result); } @Override public Result readXmlByDataId(String dataId) throws IOException { LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId,dataId) ; //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().processDefinitionId(business.getProcessDefinitionId()).singleResult(); InputStream inputStream = repositoryService.getResourceAsStream(definition.getDeploymentId(), definition.getResourceName()); String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()); return Result.OK("", result); } /** * 读åxml æ ¹æ®ä¸å¡Id * * @param dataId * @return */ @Override public InputStream readImageByDataId(String dataId) { FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); String processId = business.getProcessInstanceId(); ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); //æµç¨èµ°å®ç æ¾ç¤ºå ¨å¾ if (pi == null) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(business.getProcessDefinitionId()).singleResult(); return this.readImage(processDefinition.getDeploymentId()); } List<HistoricActivityInstance> historyProcess = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId).list(); List<String> activityIds = new ArrayList<>(); List<String> flows = new ArrayList<>(); //è·åæµç¨å¾ BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId()); for (HistoricActivityInstance hi : historyProcess) { String activityType = hi.getActivityType(); if (activityType.equals("sequenceFlow") || activityType.equals("exclusiveGateway")) { flows.add(hi.getActivityId()); } else if (activityType.equals("userTask") || activityType.equals("startEvent")) { activityIds.add(hi.getActivityId()); } } List<Task> tasks = taskService.createTaskQuery().processInstanceId(processId).list(); for (Task task : tasks) { activityIds.add(task.getTaskDefinitionKey()); } ProcessEngineConfiguration engConf = processEngine.getProcessEngineConfiguration(); //å®ä¹æµç¨ç»å¸çæå¨ ProcessDiagramGenerator processDiagramGenerator = engConf.getProcessDiagramGenerator(); InputStream in = processDiagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engConf.getActivityFontName(), engConf.getLabelFontName(), engConf.getAnnotationFontName(), engConf.getClassLoader(), 1.0, true); return in; } /** * 读åxml * * @param deployId * @return */ @Override public InputStream readImage(String deployId) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); //è·å¾å¾çæµ DefaultProcessDiagramGenerator diagramGenerator = new DefaultProcessDiagramGenerator(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); //è¾åºä¸ºå¾ç return diagramGenerator.generateDiagram( bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), "å®ä½", "å®ä½", "å®ä½", null, 1.0, false); } /** * æ ¹æ®æµç¨å®ä¹IDå¯å¨æµç¨å®ä¾ * * @param procDefKey æµç¨å®ä¹Id * @param variables æµç¨åé * @return */ @Override public Result startProcessInstanceByKey(String procDefKey, Map<String, Object> variables) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey(procDefKey) .latestVersion().singleResult(); return startProcessInstanceById(processDefinition.getId(),variables); } /** * æ ¹æ®æµç¨å®ä¹IDå¯å¨æµç¨å®ä¾ * * @param procDefId æµç¨å®ä¹Id * @param variables æµç¨åé * @return */ @Override @Transactional public Result startProcessInstanceById(String procDefId, Map<String, Object> variables) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(procDefId) .singleResult(); if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { return Result.error("æµç¨å·²è¢«æèµ·,è¯·å æ¿æ´»æµç¨"); } // variables.put("skip", true); // variables.put(ProcessConstants.FLOWABLE_SKIP_EXPRESSION_ENABLED, true); // 设置æµç¨å起人Idå°æµç¨ä¸ SysUser sysUser = iFlowThirdService.getLoginUser(); identityService.setAuthenticatedUserId(sysUser.getUsername()); variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUsername()); ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); // ç»ç¬¬ä¸æ¥ç³è¯·äººèç¹è®¾ç½®ä»»å¡æ§è¡äººåæè§ Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult(); if (Objects.nonNull(task)) { taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getRealname() + "åèµ·æµç¨ç³è¯·"); taskService.setAssignee(task.getId(), sysUser.getUsername()); //taskService.complete(task.getId(), variables); } //设置ææç³è¯·äºº /*======================todo å¯å¨ä¹å åè°ä»¥åå ³é®æ°æ®ä¿å======================*/ //ä¸å¡æ°æ®id String dataId = variables.get("dataId").toString(); //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); //è®¾ç½®æ°æ® FlowNextDto nextFlowNode = flowTaskService.getNextFlowNode(task.getId(), variables); taskService.complete(task.getId(), variables); //ä¸ä¸ä¸ªå®ä¾èç¹ å¤å®ä¾ä¼æ¯ä¸ä¸ªlist,éæåä¸ä¸ªå³å¯ æ°ç»ä¸å®ä¹Keyæ¯ä¸è´ç //Task task2 = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult(); List<Task> task2List = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().list(); Task task2 = null; if(task2List.size()>0) task2 = task2List.get(0); String doneUsers = business.getDoneUsers(); // å¤çè¿æµç¨ç人 JSONArray doneUserList = new JSONArray(); if (StrUtil.isNotBlank(doneUsers)){ doneUserList = JSON.parseArray(doneUsers); } if (!doneUserList.contains(sysUser.getUsername())){ doneUserList.add(sysUser.getUsername()); } if (nextFlowNode!=null){ //**æä¸ä¸ä¸ªèç¹ UserTask nextTask = nextFlowNode.getUserTask(); //è½å¤å¤çä¸ä¸ªèç¹çåé人 List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); //spring容å¨ç±»å String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), variables); if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ // å é¤åéå for (Task task2One : task2List) { for (String oldUser : collect_username) { taskService.deleteCandidateUser(task2One.getId(),oldUser); } } // ä¸å¡å±ææå®åé人ï¼è¦ç for (Task task2One : task2List) { for (String newUser : beforeParamsCandidateUsernames) { taskService.addCandidateUser(task2One.getId(),newUser); } } business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); } business.setProcessDefinitionId(procDefId) .setProcessInstanceId(processInstance.getProcessInstanceId()) .setActStatus(ActStatus.start) .setProposer(sysUser.getUsername()) .setTaskId(task2.getId()) .setTaskName(nextTask.getName()) .setTaskNameId(nextTask.getId()) .setPriority(nextTask.getPriority()) .setDoneUsers(doneUserList.toJSONString()) .setTodoUsers(JSON.toJSONString(collect_username)) ; } else { // **没æä¸ä¸ä¸ªèç¹ï¼æµç¨å·²ç»ç»æäº business.setProcessDefinitionId(procDefId) .setProcessInstanceId(processInstance.getProcessInstanceId()) .setActStatus(ActStatus.pass) .setProposer(sysUser.getUsername()) .setDoneUsers(doneUserList.toJSONString()) ; } flowMyBusinessService.updateById(business); //spring容å¨ç±»å String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± business.setValues(variables); if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business); return Result.OK("æµç¨å¯å¨æå"); } @Override public Result startProcessInstanceByDataId(String dataId, Map<String, Object> variables) { LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId, dataId) ; FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); if (business==null){ return Result.error("æªæ¾å°dataIdï¼"+dataId); } if (StrUtil.isNotBlank(business.getProcessDefinitionId())){ return this.startProcessInstanceById(business.getProcessDefinitionId(),variables); } return this.startProcessInstanceByKey(business.getProcessDefinitionKey(),variables); } /** * æ¿æ´»ææèµ·æµç¨å®ä¹ * * @param state ç¶æ æ¿æ´»1 æèµ·2 * @param deployId æµç¨é¨ç½²ID */ @Override public void updateState(Integer state, String deployId) { ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().deploymentId(deployId).singleResult(); // æ¿æ´» if (state == 1) { repositoryService.activateProcessDefinitionById(procDef.getId(), true, null); } // æèµ· if (state == 2) { repositoryService.suspendProcessDefinitionById(procDef.getId(), true, null); } } /** * å 餿µç¨å®ä¹ * * @param deployId æµç¨é¨ç½²ID act_ge_bytearray è¡¨ä¸ deployment_idå¼ */ @Override public void delete(String deployId) { // true å 许级èå é¤ ,ä¸è®¾ç½®ä¼å¯¼è´æ°æ®åºå¤é®å ³èå¼å¸¸ repositoryService.deleteDeployment(deployId, true); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowInstanceServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,187 @@ package org.jeecg.modules.flowable.service.impl; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.shiro.SecurityUtils; import org.flowable.common.engine.api.FlowableObjectNotFoundException; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl; import org.jeecg.modules.flowable.apithird.entity.ActStatus; import org.jeecg.modules.flowable.apithird.entity.SysUser; import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI; import org.jeecg.modules.flowable.apithird.service.IFlowThirdService; import org.jeecg.modules.flowable.apithird.common.exception.CustomException; import org.jeecg.modules.flowable.domain.vo.FlowTaskVo; import org.jeecg.modules.flowable.factory.FlowServiceFactory; import org.jeecg.modules.flowable.service.IFlowInstanceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; import java.util.Objects; /** * <p>工使µæµç¨å®ä¾ç®¡ç<p> * */ @Service @Slf4j public class FlowInstanceServiceImpl extends FlowServiceFactory implements IFlowInstanceService { @Autowired IFlowThirdService iFlowThirdService; @Autowired FlowMyBusinessServiceImpl flowMyBusinessService; @Override public List<Task> queryListByInstanceId(String instanceId) { List<Task> list = taskService.createTaskQuery().processInstanceId(instanceId).active().list(); return list; } /** * ç»ææµç¨å®ä¾ * * @param vo */ @Override public void stopProcessInstance(FlowTaskVo vo) { String taskId = vo.getTaskId(); } /** * æ¿æ´»ææèµ·æµç¨å®ä¾ * * @param state ç¶æ * @param instanceId æµç¨å®ä¾ID */ @Override public void updateState(Integer state, String instanceId) { // æ¿æ´» if (state == 1) { runtimeService.activateProcessInstanceById(instanceId); } // æèµ· if (state == 2) { runtimeService.suspendProcessInstanceById(instanceId); } } /** * å 餿µç¨å®ä¾ID * * @param instanceId æµç¨å®ä¾ID * @param deleteReason å é¤åå */ @Override @Transactional(rollbackFor = Exception.class) public void delete(String instanceId, String deleteReason) { List<Task> task = taskService.createTaskQuery().processInstanceId(instanceId).list(); if (CollectionUtils.isEmpty(task)) { throw new CustomException("æµç¨æªå¯å¨æå·²æ§è¡å®æï¼åæ¶ç³è¯·å¤±è´¥"); } // æ¥è¯¢å岿°æ® HistoricProcessInstance historicProcessInstance = getHistoricProcessInstanceById(instanceId); if (historicProcessInstance.getEndTime() != null) { historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); return; } // å 餿µç¨å®ä¾ runtimeService.deleteProcessInstance(instanceId, deleteReason); // å é¤å岿µç¨å®ä¾ historyService.deleteHistoricProcessInstance(instanceId); /*======================æ¤åå é¤ åè°ä»¥åå ³é®æ°æ®ä¿å======================*/ LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getProcessInstanceId,instanceId) ; //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); //è®¾ç½®æ°æ® String doneUsers = business.getDoneUsers(); SysUser sysUser = iFlowThirdService.getLoginUser(); // å¤çè¿æµç¨ç人 JSONArray doneUserList = new JSONArray(); if (StrUtil.isNotBlank(doneUsers)){ doneUserList = JSON.parseArray(doneUsers); } if (!doneUserList.contains(sysUser.getUsername())){ doneUserList.add(sysUser.getUsername()); } business .setActStatus(ActStatus.recall) .setTaskId("") .setTaskName("å·²æ¤å") .setPriority("") .setDoneUsers(doneUserList.toJSONString()) .setTodoUsers("") ; flowMyBusinessService.updateById(business); //spring容å¨ç±»å String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business); } @Override public void deleteByDataId(String dataId, String deleteReason) { LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId, dataId) ; //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); this.delete(business.getProcessInstanceId(),deleteReason); } /** * æ ¹æ®å®ä¾IDæ¥è¯¢åå²å®ä¾æ°æ® * * @param processInstanceId * @return */ @Override public HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); if (Objects.isNull(historicProcessInstance)) { throw new FlowableObjectNotFoundException("æµç¨å®ä¾ä¸åå¨: " + processInstanceId); } return historicProcessInstance; } /** * æ ¹æ®æµç¨å®ä¹IDå¯å¨æµç¨å®ä¾ * * @param procDefId æµç¨å®ä¹Id * @param variables æµç¨åé * @return */ @Override public Result startProcessInstanceById(String procDefId, Map<String, Object> variables) { // 设置æµç¨å起人Idå°æµç¨ä¸ LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String username = user.getUsername(); // identityService.setAuthenticatedUserId(userId.toString()); variables.put("initiator",username); variables.put("_FLOWABLE_SKIP_EXPRESSION_ENABLED", true); ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); processInstance.getProcessInstanceId(); return Result.OK("æµç¨å¯å¨æå"); } } lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,1429 @@ package org.jeecg.modules.flowable.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; import org.flowable.common.engine.api.FlowableException; import org.flowable.common.engine.api.FlowableObjectNotFoundException; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.ProcessEngineConfiguration; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.Execution; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.task.Comment; import org.flowable.identitylink.api.IdentityLinkType; import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.image.ProcessDiagramGenerator; import org.flowable.task.api.DelegationState; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness; import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl; import org.jeecg.modules.flowable.apithird.entity.ActStatus; import org.jeecg.modules.flowable.apithird.entity.SysUser; import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI; import org.jeecg.modules.flowable.apithird.service.IFlowThirdService; import org.jeecg.modules.flowable.apithird.common.constant.ProcessConstants; import org.jeecg.modules.flowable.apithird.common.enums.FlowComment; import org.jeecg.modules.flowable.apithird.common.exception.CustomException; import org.jeecg.modules.flowable.domain.dto.FlowCommentDto; import org.jeecg.modules.flowable.domain.dto.FlowNextDto; import org.jeecg.modules.flowable.domain.dto.FlowTaskDto; import org.jeecg.modules.flowable.domain.dto.FlowViewerDto; import org.jeecg.modules.flowable.domain.vo.FlowTaskVo; import org.jeecg.modules.flowable.factory.FlowServiceFactory; import org.jeecg.modules.flowable.flow.CustomProcessDiagramGenerator; import org.jeecg.modules.flowable.flow.FindNextNodeUtil; import org.jeecg.modules.flowable.flow.FlowableUtils; import org.jeecg.modules.flowable.service.IFlowTaskService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.InputStream; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; /** **/ @Service @Slf4j @Transactional public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTaskService { @Resource private IFlowThirdService iFlowThirdService; @Autowired FlowMyBusinessServiceImpl flowMyBusinessService; /** * å®æä»»å¡ * * @param taskVo 请æ±å®ä½åæ° */ @Transactional(rollbackFor = Exception.class) @Override public Result complete(FlowTaskVo taskVo) { Task task = taskService.createTaskQuery().taskId(taskVo.getTaskId()).singleResult(); if (Objects.isNull(task)){ return Result.error("ä»»å¡ä¸åå¨"); } if(StringUtils.isNotEmpty(taskVo.getComment())){ task.setDescription(taskVo.getComment()); taskService.saveTask(task); } SysUser loginUser = iFlowThirdService.getLoginUser(); if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment()); //taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues()); } else { System.out.println("taskVo.getTaskId()--->taskVo.getInstanceId()--->FlowComment.NORMAL.getType()--->taskVo.getComment()"+taskVo.getTaskId() + "---" + taskVo.getInstanceId() + "---" + FlowComment.NORMAL.getType() + "---"+taskVo.getComment() ); taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment()); taskService.setAssignee(taskVo.getTaskId(), loginUser.getUsername()); //taskService.complete(taskVo.getTaskId(), taskVo.getValues()); } /*======================审æ¹éè¿ åè°ä»¥åå ³é®æ°æ®ä¿å======================*/ //ä¸å¡æ°æ®id String dataId = taskVo.getDataId(); //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); //spring容å¨ç±»å String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); // æµç¨åé Map<String, Object> flowBeforeParamsValues = flowCallBackService.flowValuesOfTask(business.getTaskNameId(),taskVo.getValues()); //è®¾ç½®æ°æ® Map<String, Object> values = taskVo.getValues(); if (MapUtil.isNotEmpty(flowBeforeParamsValues)){ // ä¸å¡å±æè®¾ç½®åéï¼ä½¿ç¨ä¸å¡å±çåé values = flowBeforeParamsValues; } FlowNextDto nextFlowNode = this.getNextFlowNode(task.getId(), values); //ä¸ä¸ä¸ªå®ä¾èç¹ if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.resolveTask(taskVo.getTaskId(), values); } else { taskService.complete(taskVo.getTaskId(), values); } List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); Task task2 = null; if (CollUtil.isNotEmpty(task2List)){ task2 = task2List.get(0); } // ä¸ä¸ªèç¹åé人 List<String> beforeParamsCandidateUsernames = Lists.newArrayList(); if(task2!=null){ beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(),taskVo.getValues()); } List<String> candidateUsers = taskVo.getCandidateUsers(); if (CollUtil.isNotEmpty(candidateUsers)){ // åç«¯ä¼ å ¥åé人 è¦ç beforeParamsCandidateUsernames = candidateUsers; } String doneUsers = business.getDoneUsers(); // å¤çè¿æµç¨ç人 JSONArray doneUserList = new JSONArray(); if (StrUtil.isNotBlank(doneUsers)){ doneUserList = JSON.parseArray(doneUsers); } if (!doneUserList.contains(loginUser.getUsername())){ doneUserList.add(loginUser.getUsername()); } if (task2!=null && task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())){ // * å½åèç¹æ¯ä¼ç¾èç¹ï¼æ²¡æèµ°å® business.setActStatus(ActStatus.doing) .setTaskId(task2.getId()) .setDoneUsers(doneUserList.toJSONString()) ; String todoUsersStr = business.getTodoUsers(); JSONArray todosArr = JSON.parseArray(todoUsersStr); // å é¤åéå for (Task task2One : task2List) { for (Object oldUser : todosArr) { taskService.deleteCandidateUser(task2One.getId(),oldUser.toString()); } } // éå if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ beforeParamsCandidateUsernames.remove(loginUser.getUsername()); // ä¸å¡å±ææå®åé人ï¼è¦ç for (Task task2One : task2List) { for (String newUser : beforeParamsCandidateUsernames) { taskService.addCandidateUser(task2One.getId(),newUser); } } business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); } else { todosArr.remove(loginUser.getUsername()); for (Task task2One : task2List) { for (Object oldUser : todosArr) { taskService.addCandidateUser(task2One.getId(),oldUser.toString()); } } business.setTodoUsers(todosArr.toJSONString()); } } else { // * ä¸ä¸èç¹æ¯ä¼ç¾èç¹ æ æ®éç¨æ·èç¹ï¼é»è¾ä¸è´ if (nextFlowNode!=null){ //**æä¸ä¸ä¸ªèç¹ UserTask nextTask = nextFlowNode.getUserTask(); //è½å¤å¤çä¸ä¸ªèç¹çåé人 List<SysUser> nextFlowNodeUserList = nextFlowNode.getUserList(); List<String> collect_username = nextFlowNodeUserList.stream().map(SysUser::getUsername).collect(Collectors.toList()); if (CollUtil.isNotEmpty(candidateUsers)){ // åç«¯ä¼ å ¥åé人 collect_username = candidateUsers; } business.setActStatus(ActStatus.doing) .setTaskId(task2.getId()) .setTaskNameId(nextTask.getId()) .setTaskName(nextTask.getName()) .setPriority(nextTask.getPriority()) .setDoneUsers(doneUserList.toJSONString()) .setTodoUsers(JSON.toJSONString(collect_username)) ; // å é¤åéå for (Task task2One : task2List) { for (String oldUser : collect_username) { taskService.deleteCandidateUser(task2One.getId(),oldUser); } } if (CollUtil.isEmpty(candidateUsers)&&CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ // å端没æä¼ å ¥åé人 && ä¸å¡å±ææå®åé人ï¼è¦ç for (Task task2One : task2List) { for (String newUser : beforeParamsCandidateUsernames) { taskService.addCandidateUser(task2One.getId(),newUser); } } business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); } else { for (Task task2One : task2List) { for (String oldUser : collect_username) { taskService.addCandidateUser(task2One.getId(),oldUser); } } } } else { // **没æä¸ä¸ä¸ªèç¹ï¼æµç¨å·²ç»ç»æäº business.setActStatus(ActStatus.pass) .setDoneUsers(doneUserList.toJSONString()) .setTodoUsers("") .setTaskId("") .setTaskNameId("") .setTaskName("") ; } } flowMyBusinessService.updateById(business); // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± business.setValues(values); if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business); return Result.OK(); } @Override @Transactional(rollbackFor = Exception.class) public Result completeByDateId(FlowTaskVo flowTaskVo){ return this.complete(flowTaskVo); } @Override public void taskRejectByDataId(FlowTaskVo flowTaskVo){ FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); flowTaskVo.setTaskId(business.getTaskId()); this.taskReject(flowTaskVo); } /** * 驳åä»»å¡ * * @param flowTaskVo */ @Override public void taskReject(FlowTaskVo flowTaskVo) { if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { throw new CustomException("ä»»å¡å¤äºæèµ·ç¶æ"); } // å½åä»»å¡ task Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); // è·åæµç¨å®ä¹ä¿¡æ¯ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); // è·åææèç¹ä¿¡æ¯ Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); // è·åå ¨é¨èç¹å表ï¼å å«åèç¹ Collection<FlowElement> allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); // è·åå½åä»»å¡èç¹å ç´ FlowElement source = null; if (allElements != null) { for (FlowElement flowElement : allElements) { // ç±»åä¸ºç¨æ·èç¹ if (flowElement.getId().equals(task.getTaskDefinitionKey())) { // è·åèç¹ä¿¡æ¯ source = flowElement; } } } // ç®çè·åææè·³è½¬å°çèç¹ targetIds // è·åå½åèç¹çææç¶çº§ç¨æ·ä»»å¡èç¹ // 深度ä¼å ç®æ³ææ³ï¼å»¶è¾¹è¿ä»£æ·±å ¥ List<UserTask> parentUserTaskList = FlowableUtils.iteratorFindParentUserTasks(source, null, null); if (parentUserTaskList == null || parentUserTaskList.size() == 0) { throw new CustomException("å½åèç¹ä¸ºåå§ä»»å¡èç¹ï¼ä¸è½é©³å"); } // è·åæ´»å¨ ID å³èç¹ Key List<String> parentUserTaskKeyList = new ArrayList<>(); parentUserTaskList.forEach(item -> parentUserTaskKeyList.add(item.getId())); // è·åå ¨é¨åå²èç¹æ´»å¨å®ä¾ï¼å³å·²ç»èµ°è¿çèç¹åå²ï¼æ°æ®éç¨å¼å§æ¶é´ååº List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().processInstanceId(task.getProcessInstanceId()).orderByHistoricTaskInstanceStartTime().asc().list(); // æ°æ®æ¸ æ´ï¼å°åæ»å¯¼è´çèæ°æ®æ¸ æ´æ List<String> lastHistoricTaskInstanceList = FlowableUtils.historicTaskInstanceClean(allElements, historicTaskInstanceList); // æ¤æ¶åå²ä»»å¡å®ä¾ä¸ºååºï¼è·åæåèµ°çèç¹ List<String> targetIds = new ArrayList<>(); // 循ç¯ç»ææ è¯ï¼éå°å½åç®æ èç¹çæ¬¡æ° int number = 0; StringBuilder parentHistoricTaskKey = new StringBuilder(); for (String historicTaskInstanceKey : lastHistoricTaskInstanceList) { // å½ä¼ç¾æ¶åä¼åºç°ç¹æ®çï¼è¿ç»é½æ¯åä¸ä¸ªèç¹å岿°æ®çæ åµï¼è¿ç§æ¶åè·³è¿ if (parentHistoricTaskKey.toString().equals(historicTaskInstanceKey)) { continue; } parentHistoricTaskKey = new StringBuilder(historicTaskInstanceKey); if (historicTaskInstanceKey.equals(task.getTaskDefinitionKey())) { number++; } // 卿°æ®æ¸ æ´åï¼åå²èç¹å°±æ¯å¯ä¸ä¸æ¡ä»èµ·å§å°å½åèç¹çåå²è®°å½ï¼çè®ºä¸æ¯ä¸ªç¹åªä¼åºç°ä¸æ¬¡ // 卿µç¨ä¸å¦æåºç°å¾ªç¯ï¼é£ä¹æ¯æ¬¡å¾ªç¯ä¸é´çç¹ä¹åªä¼åºç°ä¸æ¬¡ï¼ååºç°å°±æ¯ä¸æ¬¡å¾ªç¯ // number == 1ï¼ç¬¬ä¸æ¬¡éå°å½åèç¹ // number == 2ï¼ç¬¬äºæ¬¡éå°ï¼ä»£è¡¨æå䏿¬¡ç循ç¯èå´ if (number == 2) { break; } // 妿å½ååå²èç¹ï¼å±äºç¶çº§çèç¹ï¼è¯´ææå䏿¬¡ç»è¿äºè¿ä¸ªç¹ï¼éè¦éåè¿ä¸ªç¹ if (parentUserTaskKeyList.contains(historicTaskInstanceKey)) { targetIds.add(historicTaskInstanceKey); } } // ç®çè·åææéè¦è¢«è·³è½¬çèç¹ currentIds // åå ¶ä¸ä¸ä¸ªç¶çº§ä»»å¡ï¼å 为åç»è¦ä¹åå¨å ¬å ±ç½å ³ï¼è¦ä¹å°±æ¯ä¸²è¡å ¬å ±çº¿è·¯ UserTask oneUserTask = parentUserTaskList.get(0); // è·åæææ£å¸¸è¿è¡çä»»å¡èç¹ Keyï¼è¿äºä»»å¡ä¸è½ç´æ¥ä½¿ç¨ï¼éè¦æ¾åºå ¶ä¸éè¦æ¤åçä»»å¡ List<Task> runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); List<String> runTaskKeyList = new ArrayList<>(); runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); // é驳åä»»å¡å表 List<String> currentIds = new ArrayList<>(); // éè¿ç¶çº§ç½å ³çåºå£è¿çº¿ï¼ç»å runTaskList æ¯å¯¹ï¼è·åéè¦æ¤åçä»»å¡ List<UserTask> currentUserTaskList = FlowableUtils.iteratorFindChildUserTasks(oneUserTask, runTaskKeyList, null, null); currentUserTaskList.forEach(item -> currentIds.add(item.getId())); // è§å®ï¼å¹¶è¡ç½å ³ä¹åèç¹å¿ é¡»éåå¨å¯ä¸ç¨æ·ä»»å¡èç¹ï¼å¦æåºç°å¤ä¸ªä»»å¡èç¹ï¼åå¹¶è¡ç½å ³èç¹é»è®¤ä¸ºç»æèç¹ï¼åå 为ä¸èèå¤å¯¹å¤æ åµ if (targetIds.size() > 1 && currentIds.size() > 1) { throw new CustomException("ä»»å¡åºç°å¤å¯¹å¤æ åµï¼æ æ³æ¤å"); } // 循ç¯è·åé£äºéè¦è¢«æ¤åçèç¹çIDï¼ç¨æ¥è®¾ç½®é©³ååå List<String> currentTaskIds = new ArrayList<>(); currentIds.forEach(currentId -> runTaskList.forEach(runTask -> { if (currentId.equals(runTask.getTaskDefinitionKey())) { currentTaskIds.add(runTask.getId()); } })); // 设置驳åæè§ currentTaskIds.forEach(item -> taskService.addComment(item, task.getProcessInstanceId(), FlowComment.REJECT.getType(), flowTaskVo.getComment())); SysUser loginUser = iFlowThirdService.getLoginUser(); try { // 设置å¤ç人 taskService.setAssignee(task.getId(), loginUser.getUsername()); // 妿ç¶çº§ä»»å¡å¤äº 1 个ï¼è¯´æå½åèç¹ä¸æ¯å¹¶è¡èç¹ï¼åå 为ä¸èèå¤å¯¹å¤æ åµ if (targetIds.size() > 1) { // 1 对 å¤ä»»å¡è·³è½¬ï¼currentIds å½åèç¹(1)ï¼targetIds 跳转å°çèç¹(å¤) runtimeService.createChangeActivityStateBuilder() .processInstanceId(task.getProcessInstanceId()). moveSingleActivityIdToActivityIds(currentIds.get(0), targetIds).changeState(); } // 妿ç¶çº§ä»»å¡åªæä¸ä¸ªï¼å æ¤å½åä»»å¡å¯è½ä¸ºç½å ³ä¸çä»»å¡ if (targetIds.size() == 1) { // 1 对 1 æ å¤ å¯¹ 1 æ åµï¼currentIds å½åè¦è·³è½¬çèç¹å表(1æå¤)ï¼targetIds.get(0) 跳转å°çèç¹(1) runtimeService.createChangeActivityStateBuilder() .processInstanceId(task.getProcessInstanceId()) .moveActivityIdsToSingleActivityId(currentIds, targetIds.get(0)).changeState(); } /*======================驳å åè°ä»¥åå ³é®æ°æ®ä¿å======================*/ //ä¸å¡æ°æ®id String dataId = flowTaskVo.getDataId(); if (dataId==null) return; //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); // 驳åå°äºä¸ä¸ä¸ªèç¹çå¾ å¤ç List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); Task task2 = task2List.get(0); //spring容å¨ç±»å String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); Map<String, Object> values = flowTaskVo.getValues(); if (values ==null){ values = MapUtil.newHashMap(); values.put("dataId",dataId); } else { values.put("dataId",dataId); } List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(task2.getTaskDefinitionKey(), values); //è®¾ç½®æ°æ® String doneUsers = business.getDoneUsers(); // å¤çè¿æµç¨ç人 JSONArray doneUserList = new JSONArray(); if (StrUtil.isNotBlank(doneUsers)){ doneUserList = JSON.parseArray(doneUsers); } if (!doneUserList.contains(loginUser.getUsername())){ doneUserList.add(loginUser.getUsername()); } business.setActStatus(ActStatus.reject) .setTaskId(task2.getId()) .setTaskNameId(task2.getTaskDefinitionKey()) .setTaskName(task2.getName()) .setDoneUsers(doneUserList.toJSONString()) ; FlowElement targetElement = null; if (allElements != null) { for (FlowElement flowElement : allElements) { // ç±»åä¸ºç¨æ·èç¹ if (flowElement.getId().equals(task2.getTaskDefinitionKey())) { // è·åèç¹ä¿¡æ¯ targetElement = flowElement; } } } if (targetElement!=null){ UserTask targetTask = (UserTask) targetElement; business.setPriority(targetTask.getPriority()); if (StrUtil.equals(business.getTaskNameId(),ProcessConstants.START_NODE)){ // å¼å§èç¹ã设置å¤ç人为ç³è¯·äºº business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer()))); taskService.setAssignee(business.getTaskId(),business.getProposer()); } else { List<SysUser> sysUserFromTask = getSysUserFromTask(targetTask); List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); // å端åå ¥çåé人 List<String> candidateUsers = flowTaskVo.getCandidateUsers(); if (CollUtil.isNotEmpty(candidateUsers)){ collect_username = candidateUsers; } business.setTodoUsers(JSON.toJSONString(collect_username)); // å é¤åéå for (Task task2One : task2List) { for (String oldUser : collect_username) { taskService.deleteCandidateUser(task2One.getId(),oldUser); } } if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ if (CollUtil.isNotEmpty(candidateUsers)){ beforeParamsCandidateUsernames = candidateUsers; } // ä¸å¡å±ææå®åé人ï¼è¦ç for (Task task2One : task2List) { for (String newUser : beforeParamsCandidateUsernames) { taskService.addCandidateUser(task2One.getId(), newUser); } } business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); } else { for (Task task2One : task2List) { for (String oldUser : collect_username) { taskService.addCandidateUser(task2One.getId(), oldUser); } } } } } flowMyBusinessService.updateById(business); // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± business.setValues(values); if (flowCallBackService!=null) flowCallBackService.afterFlowHandle(business); } catch (FlowableObjectNotFoundException e) { throw new CustomException("æªæ¾å°æµç¨å®ä¾ï¼æµç¨å¯è½å·²åçåå"); } catch (FlowableException e) { throw new CustomException("æ æ³åæ¶æå¼å§æ´»å¨"); } } @Override public void taskReturnByDataId(FlowTaskVo flowTaskVo){ //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); flowTaskVo.setTaskId(business.getTaskId()); taskReturn(flowTaskVo); } /** * éåä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ @Transactional(rollbackFor = Exception.class) @Override public void taskReturn(FlowTaskVo flowTaskVo) { if (taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult().isSuspended()) { throw new CustomException("ä»»å¡å¤äºæèµ·ç¶æ"); } // å½åä»»å¡ task Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); // è·åæµç¨å®ä¹ä¿¡æ¯ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); // è·åææèç¹ä¿¡æ¯ Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); // è·åå ¨é¨èç¹å表ï¼å å«åèç¹ Collection<FlowElement> allElements = FlowableUtils.getAllElements(process.getFlowElements(), null); // è·åå½åä»»å¡èç¹å ç´ FlowElement source = null; // è·å跳转çèç¹å ç´ FlowElement target = null; if (allElements != null) { for (FlowElement flowElement : allElements) { // å½åä»»å¡èç¹å ç´ if (flowElement.getId().equals(task.getTaskDefinitionKey())) { source = flowElement; } // 跳转çèç¹å ç´ if (flowElement.getId().equals(flowTaskVo.getTargetKey())) { target = flowElement; } } } // ä»å½åèç¹ååæ«æ // 妿åå¨è·¯çº¿ä¸ä¸åå¨ç®æ èç¹ï¼è¯´æç®æ èç¹æ¯å¨ç½å ³ä¸æéåä¸è·¯çº¿ä¸ï¼ä¸å¯è·³è½¬ // å¦åç®æ èç¹ç¸å¯¹äºå½åèç¹ï¼å±äºä¸²è¡ Boolean isSequential = FlowableUtils.iteratorCheckSequentialReferTarget(source, flowTaskVo.getTargetKey(), null, null); if (!isSequential) { throw new CustomException("å½åèç¹ç¸å¯¹äºç®æ èç¹ï¼ä¸å±äºä¸²è¡å ³ç³»ï¼æ æ³åé"); } // è·åæææ£å¸¸è¿è¡çä»»å¡èç¹ Keyï¼è¿äºä»»å¡ä¸è½ç´æ¥ä½¿ç¨ï¼éè¦æ¾åºå ¶ä¸éè¦æ¤åçä»»å¡ List<Task> runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); List<String> runTaskKeyList = new ArrayList<>(); runTaskList.forEach(item -> runTaskKeyList.add(item.getTaskDefinitionKey())); // ééåä»»å¡å表 List<String> currentIds = new ArrayList<>(); // éè¿ç¶çº§ç½å ³çåºå£è¿çº¿ï¼ç»å runTaskList æ¯å¯¹ï¼è·åéè¦æ¤åçä»»å¡ List<UserTask> currentUserTaskList = FlowableUtils.iteratorFindChildUserTasks(target, runTaskKeyList, null, null); currentUserTaskList.forEach(item -> { currentIds.add(item.getId()); }); // 循ç¯è·åé£äºéè¦è¢«æ¤åçèç¹çIDï¼ç¨æ¥è®¾ç½®é©³ååå List<String> currentTaskIds = new ArrayList<>(); currentIds.forEach(currentId -> runTaskList.forEach(runTask -> { if (currentId.equals(runTask.getTaskDefinitionKey())) { currentTaskIds.add(runTask.getId()); } })); // 设置åéæè§ for (String currentTaskId : currentTaskIds) { taskService.addComment(currentTaskId, task.getProcessInstanceId(), FlowComment.REBACK.getType(), flowTaskVo.getComment()); } SysUser loginUser = iFlowThirdService.getLoginUser(); try { // 设置å¤ç人 taskService.setAssignee(task.getId(), loginUser.getUsername()); // 1 对 1 æ å¤ å¯¹ 1 æ åµï¼currentIds å½åè¦è·³è½¬çèç¹å表(1æå¤)ï¼targetKey 跳转å°çèç¹(1) runtimeService.createChangeActivityStateBuilder() .processInstanceId(task.getProcessInstanceId()) .moveActivityIdsToSingleActivityId(currentIds, flowTaskVo.getTargetKey()).changeState(); /*======================éå åè°ä»¥åå ³é®æ°æ®ä¿å======================*/ //ä¸å¡æ°æ®id String dataId = flowTaskVo.getDataId(); if (dataId==null) return; //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); //spring容å¨ç±»å String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); //è®¾ç½®æ°æ® String doneUsers = business.getDoneUsers(); // å¤çè¿æµç¨ç人 JSONArray doneUserList = new JSONArray(); if (StrUtil.isNotBlank(doneUsers)){ doneUserList = JSON.parseArray(doneUsers); } if (!doneUserList.contains(loginUser.getUsername())){ doneUserList.add(loginUser.getUsername()); } //**跳转å°ç®æ èç¹ List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list(); Task targetTask = task2List.get(0); business.setActStatus(ActStatus.reject) .setTaskId(targetTask.getId()) .setTaskNameId(targetTask.getTaskDefinitionKey()) .setTaskName(targetTask.getName()) .setPriority(targetTask.getPriority()+"") .setDoneUsers(doneUserList.toJSONString()) ; if (target!=null){ UserTask target2 = (UserTask) target; business.setPriority(target2.getPriority()); if (StrUtil.equals(business.getTaskNameId(),ProcessConstants.START_NODE)){ // å¼å§èç¹ã设置å¤ç人为ç³è¯·äºº business.setTodoUsers(JSON.toJSONString(Lists.newArrayList(business.getProposer()))); taskService.setAssignee(business.getTaskId(),business.getProposer()); } else { List<SysUser> sysUserFromTask = getSysUserFromTask(target2); List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); List<String> candidateUsers = flowTaskVo.getCandidateUsers(); if (CollUtil.isNotEmpty(candidateUsers)){ collect_username = candidateUsers; } business.setTodoUsers(JSON.toJSONString(collect_username)); // å é¤åéå for (Task task2One : task2List) { for (String oldUser : collect_username) { taskService.deleteCandidateUser(task2One.getId(),oldUser); } } Map<String, Object> values = flowTaskVo.getValues(); if (values==null){ values = MapUtil.newHashMap(); values.put("dataId",dataId); } else { values.put("dataId",dataId); } List<String> beforeParamsCandidateUsernames = flowCallBackService.flowCandidateUsernamesOfTask(targetTask.getTaskDefinitionKey(), values); if (CollUtil.isNotEmpty(beforeParamsCandidateUsernames)){ if (CollUtil.isNotEmpty(candidateUsers)){ beforeParamsCandidateUsernames = candidateUsers; } // ä¸å¡å±ææå®åé人ï¼è¦ç for (Task task2One : task2List) { for (String newUser : beforeParamsCandidateUsernames) { taskService.addCandidateUser(task2One.getId(),newUser); } } business.setTodoUsers(JSON.toJSONString(beforeParamsCandidateUsernames)); } else { for (Task task2One : task2List) { for (String oldUser : collect_username) { taskService.addCandidateUser(task2One.getId(), oldUser); } } } } } flowMyBusinessService.updateById(business); // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± business.setValues(flowTaskVo.getValues()); if (flowCallBackService!=null) flowCallBackService.afterFlowHandle(business); } catch (FlowableObjectNotFoundException e) { throw new CustomException("æªæ¾å°æµç¨å®ä¾ï¼æµç¨å¯è½å·²åçåå"); } catch (FlowableException e) { throw new CustomException("æ æ³åæ¶æå¼å§æ´»å¨"); } } @Override public Result findReturnTaskListByDataId(FlowTaskVo flowTaskVo) { FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId()); flowTaskVo.setTaskId(business.getTaskId()); return findReturnTaskList(flowTaskVo); } /** * è·åææå¯åéçèç¹ * * @param flowTaskVo * @return */ @Override public Result findReturnTaskList(FlowTaskVo flowTaskVo) { // å½åä»»å¡ task Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); // è·åæµç¨å®ä¹ä¿¡æ¯ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult(); // è·åææèç¹ä¿¡æ¯ï¼æä¸èèåæµç¨æ åµ Process process = repositoryService.getBpmnModel(processDefinition.getId()).getProcesses().get(0); Collection<FlowElement> flowElements = process.getFlowElements(); // è·åå½åä»»å¡èç¹å ç´ UserTask source = null; if (flowElements != null) { for (FlowElement flowElement : flowElements) { // ç±»åä¸ºç¨æ·èç¹ if (flowElement.getId().equals(task.getTaskDefinitionKey())) { source = (UserTask) flowElement; } } } // è·åèç¹çææè·¯çº¿ List<List<UserTask>> roads = FlowableUtils.findRoad(source, null, null, null); // å¯åéçèç¹å表 List<UserTask> userTaskList = new ArrayList<>(); for (List<UserTask> road : roads) { if (userTaskList.size() == 0) { // è¿æ²¡æå¯åéèç¹ç´æ¥æ·»å userTaskList = road; } else { // 妿已æåéèç¹ï¼åæ¯å¯¹å交éé¨å userTaskList.retainAll(road); } } return Result.OK(userTaskList); } /** * å é¤ä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ @Override public void deleteTask(FlowTaskVo flowTaskVo) { // todo å¾ ç¡®è®¤å é¤ä»»å¡æ¯ç©çå é¤ä»»å¡ è¿æ¯é»è¾å é¤ï¼è®©è¿ä¸ªä»»å¡ç´æ¥éè¿ï¼ taskService.deleteTask(flowTaskVo.getTaskId(),flowTaskVo.getComment()); } /** * 认é¢/ç¾æ¶ä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ @Override @Transactional(rollbackFor = Exception.class) public void claim(FlowTaskVo flowTaskVo) { taskService.claim(flowTaskVo.getTaskId(), flowTaskVo.getUserId()); } /** * åæ¶è®¤é¢/ç¾æ¶ä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ @Override @Transactional(rollbackFor = Exception.class) public void unClaim(FlowTaskVo flowTaskVo) { taskService.unclaim(flowTaskVo.getTaskId()); } /** * å§æ´¾ä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ @Override @Transactional(rollbackFor = Exception.class) public void delegateTask(FlowTaskVo flowTaskVo) { taskService.delegateTask(flowTaskVo.getTaskId(), flowTaskVo.getAssignee()); } /** * 转åä»»å¡ * * @param flowTaskVo 请æ±å®ä½åæ° */ @Override @Transactional(rollbackFor = Exception.class) public void assignTask(FlowTaskVo flowTaskVo) { taskService.setAssignee(flowTaskVo.getTaskId(),flowTaskVo.getAssignee()); } /** * æåèµ·çæµç¨ * * @param pageNum * @param pageSize * @return */ @Override public Result myProcess(Integer pageNum, Integer pageSize) { Page<FlowTaskDto> page = new Page<>(); String username = iFlowThirdService.getLoginUser().getUsername(); HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() .startedBy(username) .orderByProcessInstanceStartTime() .desc(); List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage((pageNum - 1)*pageSize, pageSize); page.setTotal(historicProcessInstanceQuery.count()); List<FlowTaskDto> flowList = new ArrayList<>(); for (HistoricProcessInstance hisIns : historicProcessInstances) { FlowTaskDto flowTask = new FlowTaskDto(); flowTask.setCreateTime(hisIns.getStartTime()); flowTask.setFinishTime(hisIns.getEndTime()); flowTask.setProcInsId(hisIns.getId()); // 计ç®èæ¶ if (Objects.nonNull(hisIns.getEndTime())) { long time = hisIns.getEndTime().getTime() - hisIns.getStartTime().getTime(); flowTask.setDuration(getDate(time)); } else { long time = System.currentTimeMillis() - hisIns.getStartTime().getTime(); flowTask.setDuration(getDate(time)); } // æµç¨å®ä¹ä¿¡æ¯ ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(hisIns.getProcessDefinitionId()) .singleResult(); flowTask.setDeployId(pd.getDeploymentId()); flowTask.setProcDefName(pd.getName()); flowTask.setProcDefVersion(pd.getVersion()); flowTask.setCategory(pd.getCategory()); flowTask.setProcDefVersion(pd.getVersion()); // å½åæå¤æµç¨ todo: æ¬å°å¯å¨æ¾å¼ä»¥ä¸æ³¨é List<Task> taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).list(); if (CollectionUtils.isNotEmpty(taskList)) { flowTask.setTaskId(taskList.get(0).getId()); } else { List<HistoricTaskInstance> historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(hisIns.getId()).orderByHistoricTaskInstanceEndTime().desc().list(); flowTask.setTaskId(historicTaskInstance.get(0).getId()); } flowList.add(flowTask); } page.setRecords(flowList); return Result.OK(page); } /** * åæ¶ç³è¯· * * @param flowTaskVo * @return */ @Override public Result stopProcess(FlowTaskVo flowTaskVo) { List<Task> task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).list(); if (CollectionUtils.isEmpty(task)) { throw new CustomException("æµç¨æªå¯å¨æå·²æ§è¡å®æï¼åæ¶ç³è¯·å¤±è´¥"); } SysUser loginUser = iFlowThirdService.getLoginUser(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(flowTaskVo.getInstanceId()).singleResult(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()); if (Objects.nonNull(bpmnModel)) { Process process = bpmnModel.getMainProcess(); List<EndEvent> endNodes = process.findFlowElementsOfType(EndEvent.class, false); if (CollectionUtils.isNotEmpty(endNodes)) { Authentication.setAuthenticatedUserId(loginUser.getUsername()); taskService.addComment(task.get(0).getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(), StringUtils.isBlank(flowTaskVo.getComment()) ? "åæ¶ç³è¯·" : flowTaskVo.getComment()); String endId = endNodes.get(0).getId(); List<Execution> executions = runtimeService.createExecutionQuery().parentId(processInstance.getProcessInstanceId()).list(); List<String> executionIds = new ArrayList<>(); executions.forEach(execution -> executionIds.add(execution.getId())); runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, endId).changeState(); } } return Result.OK(); } /** * æ¤åæµç¨ todo ç®ååå¨é误 * * @param flowTaskVo * @return */ @Override public Result revokeProcess(FlowTaskVo flowTaskVo) { Task task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).singleResult(); if (task == null) { throw new CustomException("æµç¨æªå¯å¨æå·²æ§è¡å®æï¼æ æ³æ¤å"); } LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .orderByTaskCreateTime() .asc() .list(); String myTaskId = null; HistoricTaskInstance myTask = null; for (HistoricTaskInstance hti : htiList) { if (loginUser.getUsername().toString().equals(hti.getAssignee())) { myTaskId = hti.getId(); myTask = hti; break; } } if (null == myTaskId) { throw new CustomException("该任å¡éå½åç¨æ·æäº¤ï¼æ æ³æ¤å"); } String processDefinitionId = myTask.getProcessDefinitionId(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); //åé // Map<String, VariableInstance> variables = runtimeService.getVariableInstances(currentTask.getExecutionId()); String myActivityId = null; List<HistoricActivityInstance> haiList = historyService.createHistoricActivityInstanceQuery() .executionId(myTask.getExecutionId()).finished().list(); for (HistoricActivityInstance hai : haiList) { if (myTaskId.equals(hai.getTaskId())) { myActivityId = hai.getActivityId(); break; } } FlowNode myFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId); Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult(); String activityId = execution.getActivityId(); FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId); //è®°å½åæ´»å¨æ¹å List<SequenceFlow> oriSequenceFlows = new ArrayList<>(flowNode.getOutgoingFlows()); return Result.OK(); } /** * 代åä»»å¡å表 * * @param pageNum å½å页ç * @param pageSize æ¯é¡µæ¡æ° * @return */ @Override public Result todoList(Integer pageNum, Integer pageSize) { Page<FlowTaskDto> page = new Page<>(); String username = iFlowThirdService.getLoginUser().getUsername(); TaskQuery taskQuery = taskService.createTaskQuery() .active() .includeProcessVariables() .taskAssignee(username) .orderByTaskCreateTime().desc(); page.setTotal(taskQuery.count()); List<Task> taskList = taskQuery.listPage((pageNum - 1)*pageSize, pageSize); List<FlowTaskDto> flowList = new ArrayList<>(); for (Task task : taskList) { FlowTaskDto flowTask = new FlowTaskDto(); // å½åæµç¨ä¿¡æ¯ flowTask.setTaskId(task.getId()); flowTask.setTaskDefKey(task.getTaskDefinitionKey()); flowTask.setCreateTime(task.getCreateTime()); flowTask.setProcDefId(task.getProcessDefinitionId()); flowTask.setTaskName(task.getName()); // æµç¨å®ä¹ä¿¡æ¯ ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(task.getProcessDefinitionId()) .singleResult(); flowTask.setDeployId(pd.getDeploymentId()); flowTask.setProcDefName(pd.getName()); flowTask.setProcDefVersion(pd.getVersion()); flowTask.setProcInsId(task.getProcessInstanceId()); // æµç¨åèµ·äººä¿¡æ¯ HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId()); List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); flowTask.setStartUserId(startUser.getUsername()); flowTask.setStartUserName(startUser.getRealname()); flowTask.setStartDeptName(CollUtil.join(departNamesByUsername,"ï¼")); flowList.add(flowTask); } page.setRecords(flowList); return Result.OK(page); } /** * å·²åä»»å¡å表 * * @param pageNum å½å页ç * @param pageSize æ¯é¡µæ¡æ° * @return */ @Override public Result finishedList(Integer pageNum, Integer pageSize) { Page<FlowTaskDto> page = new Page<>(); String username = iFlowThirdService.getLoginUser().getUsername(); HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery() .includeProcessVariables() .finished() .taskAssignee(username) .orderByHistoricTaskInstanceEndTime() .desc(); List<HistoricTaskInstance> historicTaskInstanceList = taskInstanceQuery.listPage((pageNum - 1)*pageSize, pageSize); List<FlowTaskDto> hisTaskList = Lists.newArrayList(); for (HistoricTaskInstance histTask : historicTaskInstanceList) { FlowTaskDto flowTask = new FlowTaskDto(); // å½åæµç¨ä¿¡æ¯ flowTask.setTaskId(histTask.getId()); // 审æ¹äººåä¿¡æ¯ flowTask.setCreateTime(histTask.getCreateTime()); flowTask.setFinishTime(histTask.getEndTime()); flowTask.setDuration(getDate(histTask.getDurationInMillis())); flowTask.setProcDefId(histTask.getProcessDefinitionId()); flowTask.setTaskDefKey(histTask.getTaskDefinitionKey()); flowTask.setTaskName(histTask.getName()); // æµç¨å®ä¹ä¿¡æ¯ ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(histTask.getProcessDefinitionId()) .singleResult(); flowTask.setDeployId(pd.getDeploymentId()); flowTask.setProcDefName(pd.getName()); flowTask.setProcDefVersion(pd.getVersion()); flowTask.setProcInsId(histTask.getProcessInstanceId()); flowTask.setHisProcInsId(histTask.getProcessInstanceId()); // æµç¨åèµ·äººä¿¡æ¯ HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(histTask.getProcessInstanceId()) .singleResult(); SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId()); flowTask.setStartUserId(startUser.getUsername()); flowTask.setStartUserName(startUser.getRealname()); List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId()); flowTask.setStartDeptName(CollUtil.join(departNamesByUsername,"ï¼")); hisTaskList.add(flowTask); } page.setTotal(hisTaskList.size()); page.setRecords(hisTaskList); // Map<String, Object> result = new HashMap<>(); // result.put("result",page); // result.put("finished",true); return Result.OK(page); } private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); } /** * æµç¨å岿µè½¬è®°å½ * * @param dataId æµç¨æ°æ®Id * @return */ @Override public Result flowRecord(String dataId) { FlowMyBusiness business = flowMyBusinessService.getByDataId(dataId); String procInsId = business.getProcessInstanceId(); Map<String, Object> map = new HashMap<String, Object>(); if (StringUtils.isNotBlank(procInsId)) { List<HistoricActivityInstance> list = historyService .createHistoricActivityInstanceQuery() .processInstanceId(procInsId) .orderByHistoricActivityInstanceStartTime() .desc().list(); List<FlowTaskDto> hisFlowList = new ArrayList<>(); for (HistoricActivityInstance histIns : list) { if (StringUtils.isNotBlank(histIns.getTaskId())) { FlowTaskDto flowTask = new FlowTaskDto(); flowTask.setTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setTaskDefKey(histIns.getActivityId()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); if (StringUtils.isNotBlank(histIns.getAssignee())) { SysUser sysUser = iFlowThirdService.getUserByUsername(histIns.getAssignee()); flowTask.setAssigneeId(sysUser.getUsername()); flowTask.setAssigneeName(sysUser.getRealname()); List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(histIns.getAssignee()); flowTask.setDeptName(CollUtil.join(departNamesByUsername,"ï¼")); if (StrUtil.equals(histIns.getActivityId(),ProcessConstants.START_NODE)){ // å¼å§èç¹ï¼æåé人设置为å起人ï¼è¿ä¸ªå¼å·²è¢«å ¶ä»å°æ¹è®¾ç½®è¿ï¼ä¸å®é åç人ä¸è´å³å¯ flowTask.setCandidate(sysUser.getRealname()); } } // å±ç¤ºå®¡æ¹äººå List<HistoricIdentityLink> linksForTask = historyService.getHistoricIdentityLinksForTask(histIns.getTaskId()); StringBuilder stringBuilder = new StringBuilder(); for (HistoricIdentityLink identityLink : linksForTask) { if (IdentityLinkType.CANDIDATE.equals(identityLink.getType())) { if (StringUtils.isNotBlank(identityLink.getUserId())) { SysUser sysUser = iFlowThirdService.getUserByUsername(identityLink.getUserId()); stringBuilder.append(sysUser.getRealname()).append(","); } /*å·²ç»å ¨é¨è®¾ç½®å° CANDIDATE äºï¼ä¸æ¿ç»äº*/ /*if (StringUtils.isNotBlank(identityLink.getGroupId())) { List<SysRole> allRole = iFlowThirdService.getAllRole(); SysRole sysRole = allRole.stream().filter(o -> StringUtils.equals(identityLink.getGroupId(), o.getId())).findAny().orElse(new SysRole()); stringBuilder.append(sysRole.getRoleName()).append(","); }*/ } } if (StringUtils.isNotBlank(stringBuilder)) { flowTask.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1)); } flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // è·åæè§è¯è®ºå 容 List<Comment> commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); hisFlowList.add(flowTask); } } map.put("flowList", hisFlowList); } // è·ååå§å表å String serviceImplName = business.getServiceImplName(); FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName); // æµç¨å¤çå®åï¼è¿è¡åè°ä¸å¡å± if (flowCallBackService!=null){ Object businessDataById = flowCallBackService.getBusinessDataById(dataId); map.put("formData",businessDataById); } return Result.OK(map); } /** * æ ¹æ®ä»»å¡IDæ¥è¯¢æè½½ç表åä¿¡æ¯ * * @param taskId ä»»å¡Id * @return */ @Override public Task getTaskForm(String taskId) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); return task; } /** * è·åæµç¨è¿ç¨å¾ * * @param processId * @return */ @Override public InputStream diagram(String processId) { String processDefinitionId; // è·åå½åçæµç¨å®ä¾ ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); // 妿æµç¨å·²ç»ç»æï¼åå¾å°ç»æèç¹ if (Objects.isNull(processInstance)) { HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult(); processDefinitionId = pi.getProcessDefinitionId(); } else {// 妿æµç¨æ²¡æç»æï¼ååå½åæ´»å¨èç¹ // æ ¹æ®æµç¨å®ä¾IDè·å¾å½åå¤äºæ´»å¨ç¶æçActivityIdåé ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); processDefinitionId = pi.getProcessDefinitionId(); } // è·å¾æ´»å¨çèç¹ List<HistoricActivityInstance> highLightedFlowList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).orderByHistoricActivityInstanceStartTime().asc().list(); List<String> highLightedFlows = new ArrayList<>(); List<String> highLightedNodes = new ArrayList<>(); //é«äº®çº¿ for (HistoricActivityInstance tempActivity : highLightedFlowList) { if ("sequenceFlow".equals(tempActivity.getActivityType())) { //é«äº®çº¿ highLightedFlows.add(tempActivity.getActivityId()); } else { //é«äº®èç¹ highLightedNodes.add(tempActivity.getActivityId()); } } //è·åæµç¨å¾ BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); ProcessEngineConfiguration configuration = processEngine.getProcessEngineConfiguration(); //è·åèªå®ä¹å¾ççæå¨ ProcessDiagramGenerator diagramGenerator = new CustomProcessDiagramGenerator(); InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodes, highLightedFlows, configuration.getActivityFontName(), configuration.getLabelFontName(), configuration.getAnnotationFontName(), configuration.getClassLoader(), 1.0, true); return in; } /** * è·åæµç¨æ§è¡è¿ç¨ * * @param procInsId * @return */ @Override public List<FlowViewerDto> getFlowViewer(String procInsId) { List<FlowViewerDto> flowViewerList = new ArrayList<>(); FlowViewerDto flowViewerDto; // è·å¾æ´»å¨çèç¹ List<HistoricActivityInstance> hisActIns = historyService.createHistoricActivityInstanceQuery() .processInstanceId(procInsId) .orderByHistoricActivityInstanceStartTime() .asc().list(); for (HistoricActivityInstance activityInstance : hisActIns) { if (!"sequenceFlow".equals(activityInstance.getActivityType())) { flowViewerDto = new FlowViewerDto(); flowViewerDto.setKey(activityInstance.getActivityId()); flowViewerDto.setCompleted(!Objects.isNull(activityInstance.getEndTime())); for (FlowViewerDto viewerDto : flowViewerList) { String key = viewerDto.getKey(); if (key.equals(flowViewerDto.getKey())){ // éå¤å é¤å颿´æ° flowViewerList.remove(viewerDto); break; } } flowViewerList.add(flowViewerDto); } } return flowViewerList; } @Override public List<FlowViewerDto> getFlowViewerByDataId(String dataId) { LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId,dataId) ; //妿ä¿åæ°æ®åæªè°ç¨å¿ è°çFlowCommonService.initActBusinessæ¹æ³ï¼å°±ä¼æé®é¢ FlowMyBusiness business = flowMyBusinessService.getOne(flowMyBusinessLambdaQueryWrapper); // 1.æ§è¡è¿çæ¥éª¤ List<FlowViewerDto> flowViewers = this.getFlowViewer(business.getProcessInstanceId()); // 2.è·åææèç¹ä¿¡æ¯ï¼æ ¹æ®ææèç¹ æé¡ºåº åæ§è¡è¿çæ¯è¾ï¼é©³åçèç¹å°±è¢«è·³è¿ Process process = repositoryService.getBpmnModel(business.getProcessDefinitionId()).getProcesses().get(0); List<FlowElement> flowElements = Lists.newArrayList(process.getFlowElements()); // è·åå½åä»»å¡èç¹å ç´ List<FlowViewerDto> reflowViewers = Lists.newArrayList(); // *顺åºçKey List<String> orderKeys = Lists.newArrayList(); if (flowElements != null) { for (FlowElement flowElement : flowElements) { try { // å¼å§èç¹ StartEvent stev = (StartEvent) flowElement; //第ä¸ä¸ªkeyèç¹ï¼ String firstKey = stev.getId(); orderKeys.add(firstKey); //顺åºè·åèç¹ this.appendKeys(orderKeys, firstKey,flowElements); } catch (Exception e) { break; } } for (String key : orderKeys) { Optional<FlowViewerDto> any = flowViewers.stream().filter(o -> StrUtil.equals(o.getKey(), key)).findAny(); if(any.isPresent()){ FlowViewerDto viewerDto = any.get(); reflowViewers.add(viewerDto); if (!viewerDto.isCompleted()){ // 已尿£å¨çå¾ æ§è¡çèç¹ï¼åé¢çä¸è¦äº break; } } } } for (FlowViewerDto flowViewer : flowViewers) { boolean present = reflowViewers.stream().filter(o -> StrUtil.equals(o.getKey(), flowViewer.getKey())).findAny().isPresent(); flowViewer.setBack(!present); } //return reflowViewers; return flowViewers; } /** * é¡ºåºæ½åèç¹ * @param orderKeys å®¹å¨ * @param sourceKey æº * @param flowElements ææçèç¹å¯¹è±¡ */ private void appendKeys(List<String> orderKeys, String sourceKey, List<FlowElement> flowElements) { for (FlowElement flowElement : flowElements) { try { SequenceFlow sf = (SequenceFlow) flowElement; String sourceRef = sf.getSourceRef(); String targetRef = sf.getTargetRef(); if (sourceKey.equals(sourceRef)&&targetRef!=null){ orderKeys.add(targetRef); this.appendKeys(orderKeys,targetRef,flowElements); } } catch (Exception e) { continue; } } } /** * è·åæµç¨åé * * @param taskId * @return */ @Override public Result processVariables(String taskId) { // æµç¨åé HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().includeProcessVariables().finished().taskId(taskId).singleResult(); if (Objects.nonNull(historicTaskInstance)) { return Result.OK(historicTaskInstance.getProcessVariables()); } else { Map<String, Object> variables = taskService.getVariables(taskId); return Result.OK(variables); } } /** * è·åä¸ä¸èç¹ * * @param flowTaskVo ä»»å¡ * @return */ @Override public Result getNextFlowNode(FlowTaskVo flowTaskVo) { // todo ä¼¼ä¹é»è¾æªåå®ï¼å¾ æ£æ¥ FlowNextDto flowNextDto = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getValues()); if (flowNextDto==null) { return Result.OK("æµç¨å·²å®ç»", null); } return Result.OK(flowNextDto); } /** * è·åä¸ä¸ä¸ªèç¹ä¿¡æ¯,æµç¨å®ä¹ä¸çèç¹ä¿¡æ¯ * @param taskId å½åèç¹id * @param values æµç¨åé * @return 妿è¿ånullï¼è¡¨ç¤ºæ²¡æä¸ä¸ä¸ªèç¹ï¼æµç¨ç»æ */ public FlowNextDto getNextFlowNode(String taskId, Map<String, Object> values) { //å½åèç¹ Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); if (Objects.nonNull(task)) { // ä¸ä¸ªä»»å¡èç¹ List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values); if (CollectionUtils.isNotEmpty(nextUserTask)) { FlowNextDto flowNextDto = new FlowNextDto(); for (UserTask userTask : nextUserTask) { flowNextDto.setUserTask(userTask); //å¾ å人å List<SysUser> sysUserFromTask = this.getSysUserFromTask(userTask); flowNextDto.setUserList(sysUserFromTask); MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); if (Objects.nonNull(multiInstance)) { // ä¼ç¾ å¤å®ä¾ String collectionString = multiInstance.getInputDataItem(); Object colObj = values.get(collectionString); List<String> userNameList = null; if(colObj!=null){ userNameList = (List) colObj; } if (CollUtil.isNotEmpty(userNameList)){ // å¾ å人åä»åéä¸è·å å¦åå°±æ¯èç¹ä¸é ç½®çç¨æ· sysUserFromTask List<SysUser> userList = Lists.newArrayList(); for (String username : userNameList) { SysUser userByUsername = iFlowThirdService.getUserByUsername(username); if (userByUsername==null){ throw new CustomException(username + " ç¨æ·åæªæ¾å°"); } else { userList.add(userByUsername); } } flowNextDto.setUserList(userList); } else { // åé䏿²¡æä¼ å ¥ï¼åå ¥èç¹ä¸é ç½®çç¨æ· List<String> collect_username = sysUserFromTask.stream().map(SysUser::getUsername).collect(Collectors.toList()); values.put(collectionString,collect_username); } } else { // todo 读åèªå®ä¹èç¹å±æ§åäºå¥ï¼ //String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE); String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE); } } return flowNextDto; } } return null; } public List<SysUser> getSysUserFromTask(UserTask userTask) { String assignee = userTask.getAssignee(); if (StrUtil.isNotBlank(assignee)){ // æå®å人 SysUser userByUsername = iFlowThirdService.getUserByUsername(assignee); return Lists.newArrayList(userByUsername); } List<String> candidateUsers = userTask.getCandidateUsers(); if (CollUtil.isNotEmpty(candidateUsers)){ // æå®å¤äºº List<SysUser> list = iFlowThirdService.getAllUser(); return list.stream().filter(o->candidateUsers.contains(o.getUsername())).collect(Collectors.toList()); } List<String> candidateGroups = userTask.getCandidateGroups(); if (CollUtil.isNotEmpty(candidateGroups)){ // æå®å¤ç» List<SysUser> userList = Lists.newArrayList(); for (String candidateGroup : candidateGroups) { List<SysUser> usersByRoleId = iFlowThirdService.getUsersByRoleId(candidateGroup); userList.addAll(usersByRoleId); } return userList; } return Lists.newArrayList(); } /** * æµç¨å®ææ¶é´å¤ç * * @param ms * @return */ private String getDate(long ms) { long day = ms / (24 * 60 * 60 * 1000); long hour = (ms / (60 * 60 * 1000) - day * 24); long minute = ((ms / (60 * 1000)) - day * 24 * 60 - hour * 60); long second = (ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); if (day > 0) { return day + "天" + hour + "å°æ¶" + minute + "åé"; } if (hour > 0) { return hour + "å°æ¶" + minute + "åé"; } if (minute > 0) { return minute + "åé"; } if (second > 0) { return second + "ç§"; } else { return 0 + "ç§"; } } } lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/business/entity/FlowMyBusiness.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/business/entity/FlowMyBusinessDto.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/business/mapper/FlowMyBusinessMapper.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.jeecg.modules.flowable.apithird.business.mapper.FlowMyBusinessMapper"> </mapper> lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/business/service/IFlowMyBusinessService.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/business/service/impl/FlowMyBusinessServiceImpl.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/common/constant/ProcessConstants.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/common/enums/FlowComment.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/common/exception/CustomException.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/entity/ActStatus.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/entity/FlowBeforeParams.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/entity/SysCategory.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/entity/SysRole.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/entity/SysUser.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/service/FlowCallBackServiceI.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/service/FlowCommonService.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/apithird/service/IFlowThirdService.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/config/MyDefaultProcessDiagramCanvas.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/controller/FlowDefinitionController.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/controller/FlowInstanceController.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/controller/FlowTaskController.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/domain/dto/FlowCommentDto$FlowCommentDtoBuilder.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/domain/dto/FlowCommentDto.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/domain/dto/FlowNextDto.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/domain/dto/FlowProcDefDto.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/domain/dto/FlowSaveXmlVo.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/domain/dto/FlowViewerDto.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/domain/vo/FlowTaskVo.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/factory/FlowServiceFactory.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/flow/CustomProcessDiagramCanvas.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/flow/CustomProcessDiagramGenerator.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/flow/FindNextNodeUtil.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/flow/FlowableConfig.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/flow/FlowableUtils.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/listener/UserTaskListener.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/service/IFlowDefinitionService.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/service/IFlowInstanceService.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/service/IFlowTaskService.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/service/impl/FlowDefinitionServiceImpl.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/service/impl/FlowInstanceServiceImpl.classBinary files differ
lxzn-module-flowable/target/classes/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.classBinary files differ
lxzn-module-system/lxzn-system-biz/pom.xml
@@ -34,11 +34,17 @@ <groupId>org.jeecgframework.jimureport</groupId> <artifactId>jimureport-spring-boot-starter</artifactId> </dependency> <!-- ç§¯æ¨æ¥è¡¨ mongo redis æ¯æå <dependency> <groupId>org.jeecgframework.jimureport</groupId> <artifactId>jimureport-nosql-starter</artifactId> </dependency>--> <dependency> <groupId>org.jeecgframework.boot</groupId> <artifactId>lxzn-module-flowable</artifactId> <version>3.4.3</version> <scope>compile</scope> </dependency> <!-- ç§¯æ¨æ¥è¡¨ mongo redis æ¯æå <dependency> <groupId>org.jeecgframework.jimureport</groupId> <artifactId>jimureport-nosql-starter</artifactId> </dependency>--> </dependencies> </project> lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/flow/FlowThirdServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,112 @@ package org.jeecg.modules.flow; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import org.apache.shiro.SecurityUtils; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.flowable.apithird.entity.SysCategory; import org.jeecg.modules.flowable.apithird.entity.SysRole; import org.jeecg.modules.flowable.apithird.entity.SysUser; import org.jeecg.modules.flowable.apithird.service.IFlowThirdService; import org.jeecg.modules.system.service.impl.SysRoleServiceImpl; import org.jeecg.modules.system.service.impl.SysUserServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * flowable模åå¿ éå®ç°ç±» *@author PanMeiCheng *@date 2021/11/22 *@version 1.0 */ @Service public class FlowThirdServiceImpl implements IFlowThirdService { @Autowired ISysBaseAPI sysBaseAPI; @Autowired SysUserServiceImpl sysUserService; @Autowired SysRoleServiceImpl sysRoleService; @Override public SysUser getLoginUser() { LoginUser sysUser = null; SysUser copyProperties = null; try { sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); System.out.println( ); copyProperties = BeanUtil.copyProperties(sysUser, SysUser.class); } catch (Exception e) { //e.printStackTrace(); } return copyProperties; } @Override public List<SysUser> getAllUser() { List<org.jeecg.modules.system.entity.SysUser> list = sysUserService.list(); List<SysUser> userList = list.stream().map(o -> BeanUtil.copyProperties(o, SysUser.class)).collect(Collectors.toList()); return userList; } @Override public List<SysUser> getUsersByRoleId(String roleId) { Page<org.jeecg.modules.system.entity.SysUser> page = new Page<>(1,Integer.MAX_VALUE); IPage<org.jeecg.modules.system.entity.SysUser> userByRoleId = sysUserService.getUserByRoleId(page, roleId, null); List<org.jeecg.modules.system.entity.SysUser> records = userByRoleId.getRecords(); List<SysUser> userList = records.stream().map(o -> BeanUtil.copyProperties(o, SysUser.class)).collect(Collectors.toList()); return userList; } @Override public SysUser getUserByUsername(String username) { LoginUser userByName = sysBaseAPI.getUserByName(username); return userByName==null?null:BeanUtil.copyProperties(userByName, SysUser.class); } @Override public List<SysRole> getAllRole() { List<org.jeecg.modules.system.entity.SysRole> list = sysRoleService.list(); List<SysRole> roleList = list.stream().map(o -> BeanUtil.copyProperties(o, SysRole.class)).collect(Collectors.toList()); return roleList; } @Override public List<SysCategory> getAllCategory() { // todo è·åæµç¨å类信æ¯ï¼æ¤å¤ä¸ºä¾å SysCategory category1 = new SysCategory(); category1.setId("drApproval"); category1.setName("å¯¼å ¥å®¡æ¹æµç¨"); SysCategory category2 = new SysCategory(); category2.setId("ggApproval"); category2.setName("è®¾è®¡æ´æ¹åæµç¨"); SysCategory category3 = new SysCategory(); category3.setId("jjApproval"); category3.setName("æºå å·¥èºè§ç¨æµç¨"); SysCategory category4 = new SysCategory(); category4.setId("lsApproval"); category4.setName("临æ¶å·¥èºè§ç¨æµç¨"); SysCategory category5 = new SysCategory(); category5.setId("fxApproval"); category5.setName("è¿ä¿®å·¥èºè§ç¨æµç¨"); SysCategory category6 = new SysCategory(); category6.setId("jjggApproval"); category6.setName("æºå æ´æ¹åæµç¨"); ArrayList<SysCategory> sysCategories = Lists.newArrayList(category1,category2,category3,category4,category5,category6); return sysCategories; } @Override public List<String> getDepartNamesByUsername(String username) { List<String> departNamesByUsername = sysBaseAPI.getDepartNamesByUsername(username); return departNamesByUsername; } } lxzn-module-system/lxzn-system-start/pom.xml
@@ -30,10 +30,10 @@ <artifactId>lxzn-module-dnc</artifactId> <version>${jeecgboot.version}</version> </dependency> <!-- activiti 模å --> <!-- flowable 模å --> <dependency> <groupId>org.jeecgframework.boot</groupId> <artifactId>lxzn-module-activiti</artifactId> <artifactId>lxzn-module-flowable</artifactId> <version>${jeecgboot.version}</version> </dependency> lxzn-module-system/lxzn-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java
@@ -1,7 +1,6 @@ package org.jeecg; import lombok.extern.slf4j.Slf4j; import org.activiti.spring.boot.SecurityAutoConfiguration; import org.jeecg.common.util.oConvertUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration; @@ -20,8 +19,7 @@ * æ¥éæé: æªéæmongoæ¥éï¼å¯ä»¥æå¼å¯å¨ç±»ä¸é¢ç注é exclude={MongoAutoConfiguration.class} */ @Slf4j @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class, SecurityAutoConfiguration.class, @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class}) //@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class}) public class JeecgSystemApplication extends SpringBootServletInitializer { lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
@@ -126,7 +126,7 @@ connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 datasource: master: url: jdbc:sqlserver://192.168.1.118:1433;databasename=LXZN_TEST_HANGYU url: jdbc:sqlserver://192.168.1.118:1433;databasename=LXZN_TEST_HANGYU;nullCatalogMeansCurrent=true username: sa password: 123 driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver @@ -136,22 +136,26 @@ host: 127.0.0.1 port: 6379 password: 123456 activiti: #1.flaseï¼é»è®¤å¼ãactivitiå¨å¯å¨æ¶ï¼å¯¹æ¯æ°æ®åºè¡¨ä¸ä¿åççæ¬ï¼å¦ææ²¡æè¡¨æè çæ¬ä¸å¹é ï¼å°æåºå¼å¸¸ #2.trueï¼ activitiä¼å¯¹æ°æ®åºä¸ææè¡¨è¿è¡æ´æ°æä½ãå¦æè¡¨ä¸åå¨ï¼åèªå¨å建 #3.create_dropï¼ å¨activitiå¯å¨æ¶å建表ï¼å¨å ³éæ¶å é¤è¡¨ï¼å¿ é¡»æå¨å ³éå¼æï¼æè½å é¤è¡¨ï¼ #4.drop-createï¼ å¨activitiå¯å¨æ¶å é¤åæ¥çæ§è¡¨ï¼ç¶åå¨å建æ°è¡¨ï¼ä¸éè¦æå¨å ³éå¼æï¼ database-schema-update: true # æ£æµåå²ä¿¡æ¯è¡¨æ¯å¦åå¨ï¼activiti7é»è®¤ä¸çæåå²ä¿¡æ¯è¡¨ï¼å¼å¯åå²è¡¨ db-history-used: true # åå²è®°å½åå¨ç级 history-level: full check-process-definitions: true #卿µç¨å¼æå¯å¨å°±æ¿æ´»AsyncExecutor,弿¥ true false å ³é ï¼åè®°å ³éï¼ async-executor-activate: false async-executor-enabled: true activiti: enable: false # true å¯ç¨å®¡æ¹ false ä¸å¯ç¨å®¡æ¹ # activiti: # #1.flaseï¼é»è®¤å¼ãactivitiå¨å¯å¨æ¶ï¼å¯¹æ¯æ°æ®åºè¡¨ä¸ä¿åççæ¬ï¼å¦ææ²¡æè¡¨æè çæ¬ä¸å¹é ï¼å°æåºå¼å¸¸ # #2.trueï¼ activitiä¼å¯¹æ°æ®åºä¸ææè¡¨è¿è¡æ´æ°æä½ãå¦æè¡¨ä¸åå¨ï¼åèªå¨å建 # #3.create_dropï¼ å¨activitiå¯å¨æ¶å建表ï¼å¨å ³éæ¶å é¤è¡¨ï¼å¿ é¡»æå¨å ³éå¼æï¼æè½å é¤è¡¨ï¼ # #4.drop-createï¼ å¨activitiå¯å¨æ¶å é¤åæ¥çæ§è¡¨ï¼ç¶åå¨å建æ°è¡¨ï¼ä¸éè¦æå¨å ³éå¼æï¼ # database-schema-update: true # # æ£æµåå²ä¿¡æ¯è¡¨æ¯å¦åå¨ï¼activiti7é»è®¤ä¸çæåå²ä¿¡æ¯è¡¨ï¼å¼å¯åå²è¡¨ # db-history-used: true # # åå²è®°å½åå¨ç级 # history-level: full # check-process-definitions: true # #卿µç¨å¼æå¯å¨å°±æ¿æ´»AsyncExecutor,弿¥ true false å ³é ï¼åè®°å ³éï¼ # async-executor-activate: false # async-executor-enabled: true flowable: #å ³é宿¶ä»»å¡JOB async-executor-activate: false database-schema-update: true #activiti: # enable: false # true å¯ç¨å®¡æ¹ false ä¸å¯ç¨å®¡æ¹ #mybatis plus 设置 mybatis-plus: mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml pom.xml
@@ -31,7 +31,7 @@ <!-- æ°æ®åºé©±å¨ --> <postgresql.version>42.2.25</postgresql.version> <ojdbc6.version>11.2.0.3</ojdbc6.version> <sqljdbc4.version>4.0</sqljdbc4.version> <mssql-jdbc.version>8.4.1.jre8</mssql-jdbc.version> <mysql-connector-java.version>8.0.27</mysql-connector-java.version> <hutool.version>5.3.8</hutool.version> @@ -66,7 +66,7 @@ <module>lxzn-module-system</module> <module>lxzn-module-mdc</module> <module>lxzn-module-dnc</module> <module>lxzn-module-activiti</module> <module>lxzn-module-flowable</module> </modules> <repositories>