yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessAutoApproveController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,115 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigPageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigSaveReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessAutoApproveConfigDO; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessAutoApproveService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; /** * BPM æµç¨å 审æ¹é ç½® Controller * * ç¨äºææµç¨æ§å¶ãæ¯å¦è·³è¿ OA 审æ¹ãï¼å¼å ³å¼å¯åï¼åæ®æäº¤æ¶æµç¨ç §å¸¸å®ä¾åï¼ * 使æäººå·¥å®¡æ ¸èç¹ç±å¼æèªå¨éè¿ï¼ä¸æ¸¸ä¸å¡å¨ä½ä¸åå½±åã * * @author è¶ çº§ç®¡çå */ @Tag(name = "管çåå° - BPM æµç¨å 审æ¹é ç½®") @RestController @RequestMapping("/bpm/process-auto-approve") @Validated public class BpmProcessAutoApproveController { @Resource private BpmProcessAutoApproveService processAutoApproveService; @PutMapping("/update-by-key") @Operation(summary = "ææµç¨å®ä¹ç Key 设置å 审æ¹å¼å ³", description = "ä¸åå¨åæ°å¢ãåå¨åæ´æ°ï¼ä¾æµç¨å表çè¡å å¼å ³ç´æ¥è°ç¨") @Parameter(name = "processDefinitionKey", description = "æµç¨å®ä¹ç Key", required = true, example = "purchase_request_approve") @Parameter(name = "autoApprove", description = "æ¯å¦å 审æ¹", required = true, example = "true") @Parameter(name = "remark", description = "夿³¨", example = "该æµç¨æä¸ä¸ OA") @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')") public CommonResult<Boolean> updateAutoApproveByKey(@RequestParam("processDefinitionKey") String processDefinitionKey, @RequestParam("autoApprove") Boolean autoApprove, @RequestParam(value = "remark", required = false) String remark) { processAutoApproveService.updateAutoApproveByKey(processDefinitionKey, autoApprove, remark); return success(true); } @PutMapping("/update-global") @Operation(summary = "è®¾ç½®å ¨å±å å®¡æ¹æ»å¼å ³", description = "å¼å¯åæææµç¨ä¸å¾å 审æ¹ï¼ä¼å äºåæµç¨èªå·±çå¼å ³ï¼ï¼å ³é忢å¤ä¸ºæåæµç¨èªå·±çå¼å ³å¤å®") @Parameter(name = "autoApprove", description = "æ¯å¦å¼å¯å ¨å±å 审æ¹", required = true, example = "true") @Parameter(name = "remark", description = "夿³¨", example = "å ¨é¨æµç¨æä¸ä¸ OA") @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')") public CommonResult<Boolean> updateGlobalAutoApprove(@RequestParam("autoApprove") Boolean autoApprove, @RequestParam(value = "remark", required = false) String remark) { processAutoApproveService.updateGlobalAutoApprove(autoApprove, remark); return success(true); } @GetMapping("/global") @Operation(summary = "è·å¾å ¨å±å å®¡æ¹æ»å¼å ³ç¶æ") @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:query')") public CommonResult<Boolean> getGlobalAutoApprove() { return success(processAutoApproveService.isGlobalAutoApprove()); } @GetMapping("/list") @Operation(summary = "è·å¾å ¨é¨å 审æ¹é ç½®", description = "ä¾åç«¯ä¸æ¬¡æ§æåãæµç¨ Key -> æ¯å¦å 审æ¹ãçæ å°") @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:query')") public CommonResult<List<BpmProcessAutoApproveConfigRespVO>> getConfigList() { List<BpmProcessAutoApproveConfigDO> list = processAutoApproveService.getConfigList(); return success(BeanUtils.toBean(list, BpmProcessAutoApproveConfigRespVO.class)); } @GetMapping("/page") @Operation(summary = "è·å¾å 审æ¹é ç½®å页") @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:query')") public CommonResult<PageResult<BpmProcessAutoApproveConfigRespVO>> getConfigPage( @Valid BpmProcessAutoApproveConfigPageReqVO pageReqVO) { PageResult<BpmProcessAutoApproveConfigDO> pageResult = processAutoApproveService.getConfigPage(pageReqVO); return success(BeanUtils.toBean(pageResult, BpmProcessAutoApproveConfigRespVO.class)); } @PostMapping("/create") @Operation(summary = "å建å 审æ¹é ç½®") @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')") public CommonResult<Long> createConfig(@Valid @RequestBody BpmProcessAutoApproveConfigSaveReqVO createReqVO) { return success(processAutoApproveService.createConfig(createReqVO)); } @PutMapping("/update") @Operation(summary = "æ´æ°å 审æ¹é ç½®") @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')") public CommonResult<Boolean> updateConfig(@Valid @RequestBody BpmProcessAutoApproveConfigSaveReqVO updateReqVO) { processAutoApproveService.updateConfig(updateReqVO); return success(true); } @DeleteMapping("/delete") @Operation(summary = "å é¤å 审æ¹é ç½®", description = "å é¤å该æµç¨æ¢å¤ä¸ºæ£å¸¸äººå·¥å®¡æ¹") @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('bpm:process-auto-approve:update')") public CommonResult<Boolean> deleteConfig(@RequestParam("id") Long id) { processAutoApproveService.deleteConfig(id); return success(true); } } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigPageReqVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Schema(description = "管çåå° - BPM æµç¨å 审æ¹é ç½®å页 Request VO") @Data public class BpmProcessAutoApproveConfigPageReqVO extends PageParam { @Schema(description = "æµç¨å®ä¹ç Key", example = "purchase_request_approve") private String processDefinitionKey; @Schema(description = "æ¯å¦å 审æ¹", example = "true") private Boolean autoApprove; } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigRespVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.LocalDateTime; @Schema(description = "管çåå° - BPM æµç¨å 审æ¹é ç½® Response VO") @Data public class BpmProcessAutoApproveConfigRespVO { @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; @Schema(description = "æµç¨å®ä¹ç Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "purchase_request_approve") private String processDefinitionKey; @Schema(description = "æ¯å¦å 审æ¹ï¼true-æäº¤åèªå¨éè¿ï¼false-æ£å¸¸äººå·¥å®¡æ¹", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") private Boolean autoApprove; @Schema(description = "夿³¨", example = "该æµç¨æä¸ä¸ OAï¼æäº¤åç´æ¥çæ") private String remark; @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/autoapprove/BpmProcessAutoApproveConfigSaveReqVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @Schema(description = "管çåå° - BPM æµç¨å 审æ¹é ç½®æ°å¢/ä¿®æ¹ Request VO") @Data public class BpmProcessAutoApproveConfigSaveReqVO { @Schema(description = "ç¼å·", example = "1024") private Long id; @Schema(description = "æµç¨å®ä¹ç Key", requiredMode = Schema.RequiredMode.REQUIRED, example = "purchase_request_approve") @NotEmpty(message = "æµç¨å®ä¹ç Key ä¸è½ä¸ºç©º") private String processDefinitionKey; @Schema(description = "æ¯å¦å 审æ¹ï¼true-æäº¤åèªå¨éè¿ï¼false-æ£å¸¸äººå·¥å®¡æ¹", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @NotNull(message = "æ¯å¦å 审æ¹ä¸è½ä¸ºç©º") private Boolean autoApprove; @Schema(description = "夿³¨", example = "该æµç¨æä¸ä¸ OAï¼æäº¤åç´æ¥çæ") private String remark; } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessAutoApproveConfigDO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,53 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.definition; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * BPM æµç¨å 审æ¹é ç½® DO * * ç¨äºæãæµç¨å®ä¹ Keyãæ§å¶è¯¥æµç¨æ¯å¦è·³è¿äººå·¥å®¡æ¹ï¼ * å¼å ³å¼å¯åï¼æµç¨å®ä¾ç §å¸¸å建ï¼ä½ææãäººå·¥å®¡æ ¸ãèç¹ä¼è¢«å¼æèªå¨éè¿ï¼ * ä¸å¡ä¾§çã审æ¹éè¿ãåè°ä¸ä¸æ¸¸å¨ä½ï¼çæéè´è®¢å / MPS / ä¾åºåæ¡£æ¡çï¼å ¨é¨ç §å¸¸æ§è¡ã * * 乿以æ Key è䏿¯ææµç¨å®ä¹ï¼å«çæ¬ï¼åå¨ï¼æµç¨æ¯æ¬¡éæ°åå¸é½ä¼äº§çæ°ç * processDefinitionIdï¼è¥å¼å ³ç»å¨çæ¬ä¸ï¼æ¹ä¸æ¬¡æµç¨å°±è¦éé 䏿¬¡å¼å ³ï¼å®¹ææ¼é ã * * @author è¶ çº§ç®¡çå */ @TableName("bpm_process_auto_approve_config") @KeySequence("bpm_process_auto_approve_config_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã @Data @Builder @NoArgsConstructor @AllArgsConstructor public class BpmProcessAutoApproveConfigDO extends BaseDO { /** * ç¼å· */ @TableId private Long id; /** * æµç¨å®ä¹ç Key */ private String processDefinitionKey; /** * æ¯å¦å å®¡æ¹ * * true - å 审æ¹ï¼æäº¤åç³»ç»èªå¨éè¿ï¼ä¸è¿å ¥äººå·¥å®¡æ¹ * false - æ£å¸¸äººå·¥å®¡æ¹ */ private Boolean autoApprove; /** * 夿³¨ */ private String remark; } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessAutoApproveConfigMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.definition; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigPageReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessAutoApproveConfigDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; /** * BPM æµç¨å 审æ¹é ç½® Mapper * * @author è¶ çº§ç®¡çå */ @Mapper public interface BpmProcessAutoApproveConfigMapper extends BaseMapperX<BpmProcessAutoApproveConfigDO> { default PageResult<BpmProcessAutoApproveConfigDO> selectPage(BpmProcessAutoApproveConfigPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessAutoApproveConfigDO>() .likeIfPresent(BpmProcessAutoApproveConfigDO::getProcessDefinitionKey, reqVO.getProcessDefinitionKey()) .eqIfPresent(BpmProcessAutoApproveConfigDO::getAutoApprove, reqVO.getAutoApprove()) .orderByDesc(BpmProcessAutoApproveConfigDO::getId)); } default BpmProcessAutoApproveConfigDO selectByProcessDefinitionKey(String processDefinitionKey) { return selectOne(BpmProcessAutoApproveConfigDO::getProcessDefinitionKey, processDefinitionKey); } /** * æå¤ä¸ªæµç¨ Key æ¹éæ¥è¯¢ï¼ç¨äºä¸æ¬¡æ¥åºãå ¨å±æ»å¼å ³ + 该æµç¨å¼å ³ã */ default List<BpmProcessAutoApproveConfigDO> selectListByKeys(Collection<String> processDefinitionKeys) { return selectList(new LambdaQueryWrapperX<BpmProcessAutoApproveConfigDO>() .in(BpmProcessAutoApproveConfigDO::getProcessDefinitionKey, processDefinitionKeys)); } } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
@@ -93,4 +93,8 @@ ErrorCode BUSINESS_ATTACH_NOT_EXISTS = new ErrorCode(1_009_015_000, "ä¸å¡éä»¶é ç½®ä¸åå¨"); ErrorCode BUSINESS_ATTACH_PROCESS_DEFINITION_KEY_DUPLICATE = new ErrorCode(1_009_015_001, "æµç¨å®ä¹ç Key({})å·²åå¨"); // ========== BPM æµç¨å 审æ¹é ç½® 1-009-016-000 ========== ErrorCode PROCESS_AUTO_APPROVE_CONFIG_NOT_EXISTS = new ErrorCode(1_009_016_000, "æµç¨å 审æ¹é ç½®ä¸åå¨"); ErrorCode PROCESS_AUTO_APPROVE_CONFIG_KEY_DUPLICATE = new ErrorCode(1_009_016_001, "æµç¨å®ä¹ç Key({})å·²åå¨å 审æ¹é ç½®ï¼è¯·å¿éå¤å建"); } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java
@@ -35,6 +35,7 @@ ASSIGN_EMPTY_REJECT("审æ¹äººä¸ºç©ºï¼èªå¨ä¸éè¿"), APPROVE_TYPE_AUTO_APPROVE("éäººå·¥å®¡æ ¸ï¼èªå¨éè¿"), APPROVE_TYPE_AUTO_REJECT("éäººå·¥å®¡æ ¸ï¼èªå¨ä¸éè¿"), PROCESS_AUTO_APPROVE("æµç¨å·²é ç½®å 审æ¹ï¼æäº¤åèªå¨éè¿"), // åºæ¯ï¼æµç¨å¼å¯äºå 审æ¹å¼å ³ï¼BpmProcessAutoApproveServiceï¼ CANCEL_BY_PROCESS_CLEAN("è¿ç¨æ¸ çèªå¨åæ¶"), CANCEL_BY_WITHDRAW("åä¸ä»»å¡æ¤åï¼ç³»ç»èªå¨åæ¶"), ; yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,106 @@ package cn.iocoder.yudao.module.bpm.service.definition; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigPageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigSaveReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessAutoApproveConfigDO; import jakarta.validation.Valid; import java.util.List; /** * BPM æµç¨å 审æ¹é ç½® Service æ¥å£ * * @author è¶ çº§ç®¡çå */ public interface BpmProcessAutoApproveService { /** * å ¨å±æ»å¼å ³å¨ä¸è¿°é 置表ä¸å ç¨çæµç¨ Key * * 该 Key ä¸å¯¹åºä»»ä½ç宿µç¨ï¼ä» ä½ä¸ºãæææµç¨ä¸å¾å 审æ¹ãçæ»é¸æ è®° */ String GLOBAL_KEY = "*"; /** * 夿æå®æµç¨æ¯å¦å¼å¯äºå å®¡æ¹ * * å¤å®é¡ºåºï¼å ¨å±æ»å¼å ³ä¼å ï¼å ¶æ¬¡ç该æµç¨èªå·±çå¼å ³ã * * 注æï¼æ¬æ¹æ³åªåçãå¼å ³æ¯å¦æå¼ãï¼ä¸å¤ææµç¨æ¯å¦å·²é¨ç½²ã * æµç¨æªé¨ç½²æ¶ï¼å建æµç¨å®ä¾é¶æ®µå°±ä¼æåº PROCESS_DEFINITION_NOT_EXISTSï¼èµ°ä¸å°æ¬æ¹æ³ã * * @param processDefinitionKey æµç¨å®ä¹ç Key * @return æ¯å¦å å®¡æ¹ */ boolean isAutoApprove(String processDefinitionKey); /** * æ¯å¦å¼å¯äºå ¨å±å å®¡æ¹æ»å¼å ³ * * @return æ¯å¦å¼å¯ */ boolean isGlobalAutoApprove(); /** * è®¾ç½®å ¨å±å å®¡æ¹æ»å¼å ³ * * å¼å¯åæææµç¨ä¸å¾å 审æ¹ï¼ä¼å äºåæµç¨èªå·±çå¼å ³ï¼ï¼ * å ³é忢å¤ä¸ºæåæµç¨èªå·±çå¼å ³å¤å®ã * * @param autoApprove æ¯å¦å¼å¯ * @param remark 夿³¨ */ void updateGlobalAutoApprove(Boolean autoApprove, String remark); /** * ææµç¨å®ä¹ç Key 设置å 审æ¹å¼å ³ï¼ä¸åå¨åæ°å¢ï¼åå¨åæ´æ°ï¼ * * ä¾ãæµç¨æ¨¡åãå表çè¡å å¼å ³ç´æ¥è°ç¨ï¼æ éå æ¥è¯¢é ç½®ç¼å·ã * * @param processDefinitionKey æµç¨å®ä¹ç Key * @param autoApprove æ¯å¦å å®¡æ¹ * @param remark 夿³¨ */ void updateAutoApproveByKey(String processDefinitionKey, Boolean autoApprove, String remark); /** * è·å¾å ¨é¨å 审æ¹é ç½® * * ä¾åç«¯ä¸æ¬¡æ§æåãæµç¨ Key -> æ¯å¦å 审æ¹ãçæ å°å ³ç³» * * @return é ç½®å表 */ List<BpmProcessAutoApproveConfigDO> getConfigList(); /** * è·å¾å 审æ¹é ç½®å页 * * @param pageReqVO å页æ¥è¯¢ * @return é ç½®å页 */ PageResult<BpmProcessAutoApproveConfigDO> getConfigPage(BpmProcessAutoApproveConfigPageReqVO pageReqVO); /** * å建å 审æ¹é ç½® * * @param createReqVO åå»ºä¿¡æ¯ * @return ç¼å· */ Long createConfig(@Valid BpmProcessAutoApproveConfigSaveReqVO createReqVO); /** * æ´æ°å 审æ¹é ç½® * * @param updateReqVO æ´æ°ä¿¡æ¯ */ void updateConfig(@Valid BpmProcessAutoApproveConfigSaveReqVO updateReqVO); /** * å é¤å 审æ¹é ç½® * * @param id ç¼å· */ void deleteConfig(Long id); } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessAutoApproveServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,133 @@ package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigPageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.autoapprove.BpmProcessAutoApproveConfigSaveReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessAutoApproveConfigDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessAutoApproveConfigMapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_AUTO_APPROVE_CONFIG_KEY_DUPLICATE; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_AUTO_APPROVE_CONFIG_NOT_EXISTS; /** * BPM æµç¨å 审æ¹é ç½® Service å®ç°ç±» * * @author è¶ çº§ç®¡çå */ @Slf4j @Service @Validated public class BpmProcessAutoApproveServiceImpl implements BpmProcessAutoApproveService { @Resource private BpmProcessAutoApproveConfigMapper bpmProcessAutoApproveConfigMapper; @Override public boolean isAutoApprove(String processDefinitionKey) { if (StrUtil.isBlank(processDefinitionKey)) { return false; } // 䏿¬¡æ¥åºãå ¨å±æ»å¼å ³ãä¸è¯¥æµç¨èªå·±çå¼å ³ï¼é¿å 两次æ¥è¯¢ List<BpmProcessAutoApproveConfigDO> configs = bpmProcessAutoApproveConfigMapper .selectListByKeys(List.of(GLOBAL_KEY, processDefinitionKey)); boolean globalOn = false; boolean processOn = false; for (BpmProcessAutoApproveConfigDO config : configs) { boolean on = Boolean.TRUE.equals(config.getAutoApprove()); if (GLOBAL_KEY.equals(config.getProcessDefinitionKey())) { globalOn = on; } else if (processDefinitionKey.equals(config.getProcessDefinitionKey())) { processOn = on; } } // å ¨å±æ»å¼å ³ä¼å ï¼å¼å¯åæææµç¨ä¸å¾å 审æ¹ï¼å¦åç该æµç¨èªå·±çå¼å ³ return globalOn || processOn; } @Override public boolean isGlobalAutoApprove() { BpmProcessAutoApproveConfigDO config = bpmProcessAutoApproveConfigMapper.selectByProcessDefinitionKey(GLOBAL_KEY); return config != null && Boolean.TRUE.equals(config.getAutoApprove()); } @Override public void updateGlobalAutoApprove(Boolean autoApprove, String remark) { updateAutoApproveByKey(GLOBAL_KEY, autoApprove, remark); } @Override public void updateAutoApproveByKey(String processDefinitionKey, Boolean autoApprove, String remark) { BpmProcessAutoApproveConfigDO config = bpmProcessAutoApproveConfigMapper.selectByProcessDefinitionKey(processDefinitionKey); if (config == null) { // 馿¬¡é ç½®ï¼æ°å¢ bpmProcessAutoApproveConfigMapper.insert(BpmProcessAutoApproveConfigDO.builder() .processDefinitionKey(processDefinitionKey) .autoApprove(autoApprove) .remark(remark) .build()); return; } // å·²æé ç½®ï¼æ´æ°å¼å ³ bpmProcessAutoApproveConfigMapper.updateById(BpmProcessAutoApproveConfigDO.builder() .id(config.getId()) .autoApprove(autoApprove) .remark(remark) .build()); } @Override public List<BpmProcessAutoApproveConfigDO> getConfigList() { return bpmProcessAutoApproveConfigMapper.selectList(); } @Override public PageResult<BpmProcessAutoApproveConfigDO> getConfigPage(BpmProcessAutoApproveConfigPageReqVO pageReqVO) { return bpmProcessAutoApproveConfigMapper.selectPage(pageReqVO); } @Override public Long createConfig(BpmProcessAutoApproveConfigSaveReqVO createReqVO) { validateProcessDefinitionKeyUnique(createReqVO); BpmProcessAutoApproveConfigDO config = BeanUtils.toBean(createReqVO, BpmProcessAutoApproveConfigDO.class); bpmProcessAutoApproveConfigMapper.insert(config); return config.getId(); } @Override public void updateConfig(BpmProcessAutoApproveConfigSaveReqVO updateReqVO) { validateConfigExists(updateReqVO.getId()); validateProcessDefinitionKeyUnique(updateReqVO); bpmProcessAutoApproveConfigMapper.updateById(BeanUtils.toBean(updateReqVO, BpmProcessAutoApproveConfigDO.class)); } @Override public void deleteConfig(Long id) { validateConfigExists(id); bpmProcessAutoApproveConfigMapper.deleteById(id); } private void validateProcessDefinitionKeyUnique(BpmProcessAutoApproveConfigSaveReqVO reqVO) { BpmProcessAutoApproveConfigDO config = bpmProcessAutoApproveConfigMapper.selectByProcessDefinitionKey(reqVO.getProcessDefinitionKey()); if (config == null || ObjUtil.equal(config.getId(), reqVO.getId())) { return; } throw exception(PROCESS_AUTO_APPROVE_CONFIG_KEY_DUPLICATE, reqVO.getProcessDefinitionKey()); } private void validateConfigExists(Long id) { if (bpmProcessAutoApproveConfigMapper.selectById(id) == null) { throw exception(PROCESS_AUTO_APPROVE_CONFIG_NOT_EXISTS); } } } yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -29,6 +29,7 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessAutoApproveService; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskTimeoutReqDTO; @@ -102,6 +103,8 @@ private BpmMessageService messageService; @Resource private BpmFormService formService; @Resource private BpmProcessAutoApproveService processAutoApproveService; @Resource private AdminUserApi adminUserApi; @@ -1400,6 +1403,10 @@ FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); Integer approveType = BpmnModelUtils.parseApproveType(userTaskElement); Integer assignEmptyHandlerType = BpmnModelUtils.parseAssignEmptyHandlerType(userTaskElement); // æµç¨çº§ãå 审æ¹ãå¼å ³ï¼ä» 对ãäººå·¥å®¡æ ¸ãèç¹çæã // éäººå·¥å®¡æ ¸çèç¹ï¼AUTO_APPROVE / AUTO_REJECTï¼æå ¶èªèº«ç设计å¨é ç½®ï¼ä¸åæ¬å¼å ³å½±åï¼é¿å 两å¤é ç½®äºç¸å¹²æ°ã boolean autoApproveEnabled = ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.USER.getType()) && processAutoApproveService.isAutoApprove(processInstance.getProcessDefinitionKey()); TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { /** @@ -1418,6 +1425,26 @@ && getTask(task.getId()) == null) { return; } // ç¹æ®æ åµé¶ï¼æµç¨å¼å¯äºãå 审æ¹ãå¼å ³ï¼äººå·¥å®¡æ ¸èç¹ç´æ¥èªå¨éè¿ // 说æï¼ä¸æ¹å¨ä¸å¡ä¾§ä»»ä½é»è¾ââä¸å¡ç §å¸¸æåæ®ç½®ä¸ºã审æ¹ä¸ãï¼éåèµ°ä¸æ£å¸¸å®¡æ¹éè¿ // å®å ¨ç¸åç approveTask æµç¨ï¼å æ¤ä¸å¡çå¬å¨ã审æ¹ççã以å䏿¸¸å¨ä½ // ï¼çæéè´è®¢å / MPS / ä¾åºåæ¡£æ¡ / æ¥å·¥äº§åºçï¼å ¨é¨ç §å¸¸æ§è¡ã if (autoApproveEnabled) { // å¹çä¿æ¤ï¼ä»»å¡å¯è½å·²è¢«æ¨è¿ï¼ä¾å¦ãå起人èç¹ãç±å¼æèªå¸¦ççç¥å è¡èªå¨éè¿ï¼ï¼ // æ¤æ¶ä»»å¡å·²ä¸åå¨ï¼ç´æ¥è·³è¿ï¼é¿å éå¤å®¡æ¹æ¥é Task autoApproveTask = getTask(task.getId()); if (autoApproveTask == null) { return; } // å¿ é¡»ä¼ å ¥ä»»å¡çå®é 审æ¹äººï¼approveTask 伿 ¡éªãæä½äººå¿ é¡»æ¯è¯¥ä»»å¡ç审æ¹äººãï¼ // ä¼ null ä» å¯¹ã审æ¹äººä¸ºç©ºãç任塿¾è¡ï¼å¦å伿ã该任å¡ç审æ¹äººä¸æ¯ä½ ã Long assigneeUserId = StrUtil.isNotBlank(autoApproveTask.getAssignee()) ? NumberUtils.parseLong(autoApproveTask.getAssignee()) : null; getSelf().approveTask(assigneeUserId, new BpmTaskApproveReqVO() .setId(autoApproveTask.getId()) .setReason(BpmReasonEnum.PROCESS_AUTO_APPROVE.getReason())); return; } // ç¹æ®æ åµä¸ï¼ãäººå·¥å®¡æ ¸ã审æ¹äººä¸ºç©ºï¼æ ¹æ®é ç½®æ¯å¦è¦èªå¨éè¿ãèªå¨æç» if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.USER.getType())) { // 妿æå®¡æ¹äººãæè æ¥æäººï¼å说æä¸æ»¡è¶³æ åµä¸ï¼ä¸èªå¨éè¿ãä¸èªå¨æç»