yudao-module-aftersales/pom.xml
@@ -42,11 +42,6 @@ <artifactId>yudao-module-infra</artifactId> <version>${revision}</version> </dependency> <dependency> <groupId>cn.iocoder.boot</groupId> <artifactId>yudao-module-bpm</artifactId> <version>${revision}</version> </dependency> <!-- MDM ä¸»æ°æ®ç®¡ç API --> <dependency> yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/compensation/AfterSaleCompensationController.java
@@ -29,7 +29,6 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管çåå° - å®åèµä»/æå¡è¡¥å¿å") @RestController @@ -88,27 +87,27 @@ } @PutMapping("/submit") @Operation(summary = "æäº¤èµä»/æå¡è¡¥å¿å审æ¹") @Operation(summary = "æäº¤èµä»/æå¡è¡¥å¿å审æ¹ï¼æªæäº¤/å®¡æ ¸ä¸éè¿â审æ¹ä¸ï¼ï¼å®¡æ¹äººç±å®¡æ¹é ç½®ç»ä¸æå®") @Parameter(name = "id", description = "ç¼å·", required = true) @PreAuthorize("@ss.hasPermission('aftersales:compensation:submit')") public CommonResult<Boolean> submitCompensation(@RequestParam("id") Long id, @RequestParam("processDefinitionKey") String processDefinitionKey) { compensationService.submitCompensation(id, processDefinitionKey, getLoginUserId()); public CommonResult<Boolean> submitCompensation(@RequestParam("id") Long id) { compensationService.submitCompensation(id); return success(true); } @PutMapping("/audit") @Operation(summary = "审æ¹èµä»/æå¡è¡¥å¿åï¼éè¿/驳åï¼") @Operation(summary = "å®¡æ ¸èµä»/æå¡è¡¥å¿åï¼å®¡æ¹ä¸âå®¡æ ¸éè¿/å®¡æ ¸ä¸éè¿ï¼ï¼ä» 审æ¹äººæ¬äººå¯æä½") @PreAuthorize("@ss.hasPermission('aftersales:compensation:audit')") public CommonResult<Boolean> auditCompensation(@Valid @RequestBody AfterSaleCompensationAuditReqVO auditReqVO) { compensationService.auditCompensation(auditReqVO); compensationService.auditCompensation(auditReqVO.getId(), auditReqVO.getPass(), auditReqVO.getReviewRemark()); return success(true); } @GetMapping("/approve-process-list") @Operation(summary = "è·å¾èµä»/æå¡è¡¥å¿åå®¡æ¹æµç¨å®ä¹å表") @GetMapping("/approver-ids") @Operation(summary = "è·å¾å®¡æ¹äººç¼å·éåï¼ä¾åç«¯å¤ææ¯å¦å±ç¤ºå®¡æ ¸æé®") @PreAuthorize("@ss.hasPermission('aftersales:compensation:query')") public CommonResult<List<Map<String, Object>>> getCompensationApproveProcessDefinitionList() { return success(compensationService.getCompensationApproveProcessDefinitionList()); public CommonResult<Set<Long>> getApproverUserIds() { return success(compensationService.getCompensationApproverUserIds()); } // ========== å 鍿¹æ³ï¼æ¹éæ¼è£ å ³èåç§° ========== yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/compensation/vo/AfterSaleCompensationAuditReqVO.java
@@ -5,9 +5,9 @@ import lombok.Data; /** * å®åèµä»/æå¡è¡¥å¿å å®¡æ¹ Request VO * å®åèµä»/æå¡è¡¥å¿å å®¡æ ¸ Request VO */ @Schema(description = "å®åèµä»/æå¡è¡¥å¿å - å®¡æ¹ Request VO") @Schema(description = "å®åèµä»/æå¡è¡¥å¿å - å®¡æ ¸ Request VO") @Data public class AfterSaleCompensationAuditReqVO { @@ -15,11 +15,11 @@ @NotNull(message = "èµä»åç¼å·ä¸è½ä¸ºç©º") private Long id; @Schema(description = "审æ¹ç»æï¼20 éè¿ / 30 驳åï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") @NotNull(message = "审æ¹ç»æä¸è½ä¸ºç©º") private Integer auditStatus; @Schema(description = "æ¯å¦éè¿ï¼true=å®¡æ ¸éè¿ / false=å®¡æ ¸ä¸éè¿", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @NotNull(message = "è¯·éæ©å®¡æ ¸ç»æ") private Boolean pass; @Schema(description = "审æ¹å¤æ³¨", example = "åæèµä»") private String remark; @Schema(description = "å®¡æ ¸æè§ï¼éè¿æ¶éå¡« / ä¸éè¿æ¶å¿ å¡«ï¼", example = "éé¢é忬¡æ ¸å¯¹") private String reviewRemark; } yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/compensation/vo/AfterSaleCompensationRespVO.java
@@ -61,17 +61,17 @@ @Schema(description = "审æ¹ç¶æåç§°", example = "æªæäº¤") private String auditStatusName; @Schema(description = "å®¡æ¹æµç¨å®ä¾ç¼å·") private String processInstanceId; @Schema(description = "å®¡æ ¸äººç¨æ·ç¼å·", example = "1") private Long reviewerId; @Schema(description = "å®¡æ ¸äºº", example = "1") private Long auditUserId; @Schema(description = "å®¡æ ¸äººå§å", example = "æå·¥") private String reviewerName; @Schema(description = "å®¡æ ¸æ¶é´") private LocalDateTime auditTime; private LocalDateTime reviewTime; @Schema(description = "å®¡æ ¸å¤æ³¨") private String auditRemark; @Schema(description = "å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼", example = "éé¢é忬¡æ ¸å¯¹") private String reviewRemark; @Schema(description = "æ¯ä»ç¶æï¼è´¦å¡èå¨é¢çï¼") private Integer payStatus; yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/dataobject/compensation/AfterSaleCompensationDO.java
@@ -65,25 +65,33 @@ /** * 审æ¹ç¶æ * * åªç±ä¸å¡æµç¨é©±å¨ï¼ä¸æ¥ååç«¯ç´æ¥èµå¼ï¼å建æ¶åºå®ä¸ºæªæäº¤ï¼æäº¤å®¡æ¹å置为审æ¹ä¸ï¼ * å®¡æ ¸éè¿ / ä¸éè¿ç± * {@link cn.iocoder.yudao.module.aftersales.service.compensation.AfterSaleCompensationService#auditCompensation} * æ¨è¿ã * * æä¸¾ {@link AfterSaleCompensationAuditStatusEnum} */ private Integer auditStatus; /** * å®¡æ¹æµç¨å®ä¾ç¼å· * å®¡æ ¸äººç¨æ·ç¼å· * * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é ç½®ãæä¸å¡ç±»åç»ä¸é ç½®ï¼ä¸å¡ç¼ç compensation_approveï¼ï¼ * æäº¤æ¶ä¸æå®ï¼æ¤å¤è®°å½å®é æ§è¡å®¡æ ¸çç¨æ·ã */ private String processInstanceId; private Long reviewerId; /** * å®¡æ ¸äºº * å®¡æ ¸äººå§åï¼å®¡æ ¸æ¶åä½è®°å½ï¼é¿å å表å±ç¤ºåæ¥ç¨æ·ï¼ */ private Long auditUserId; private String reviewerName; /** * å®¡æ ¸æ¶é´ */ private LocalDateTime auditTime; private LocalDateTime reviewTime; /** * å®¡æ ¸å¤æ³¨ * å®¡æ ¸æè§ï¼å®¡æ ¸éè¿æ¶çæè§ / å®¡æ ¸ä¸éè¿æ¶çåå ï¼ */ private String auditRemark; private String reviewRemark; /** * æ¯ä»ç¶æï¼è´¦å¡èå¨é¢çï¼æ¥è´¢å¡å使ç¨ï¼ */ yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/mysql/compensation/AfterSaleCompensationMapper.java
@@ -5,7 +5,10 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.aftersales.controller.admin.compensation.vo.AfterSaleCompensationPageReqVO; import cn.iocoder.yudao.module.aftersales.dal.dataobject.compensation.AfterSaleCompensationDO; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.annotations.Mapper; import java.time.LocalDateTime; /** * å®åèµä»/æå¡è¡¥å¿å Mapper @@ -17,6 +20,49 @@ return selectOne(AfterSaleCompensationDO::getCompensationNo, compensationNo); } /** * æäº¤å®¡æ¹ï¼ç½®ä¸ºå®¡æ¹ä¸ï¼å¹¶æ¸ 空ä¸ä¸è½®å®¡æ ¸ç»æ * * ç¨ UpdateWrapper èé updateByIdï¼MyBatis-Plus é»è®¤çåæ®µæ´æ°çç¥ä¼å¿½ç¥ nullï¼ * ç´æ¥ updateById æ æ³æå®¡æ ¸ä¸éè¿åæ®ççå®¡æ ¸äººãå®¡æ ¸æ¶é´ãå®¡æ ¸æè§çæ£æ¸ 空ã * * @param id èµä»åç¼å· * @param status ç®æ ç¶æï¼å®¡æ¹ä¸ï¼ * @return å½±åè¡æ° */ default int submitAndResetAuditInfo(Long id, Integer status) { return update(null, new LambdaUpdateWrapper<AfterSaleCompensationDO>() .eq(AfterSaleCompensationDO::getId, id) .set(AfterSaleCompensationDO::getAuditStatus, status) .set(AfterSaleCompensationDO::getReviewerId, null) .set(AfterSaleCompensationDO::getReviewerName, null) .set(AfterSaleCompensationDO::getReviewTime, null) .set(AfterSaleCompensationDO::getReviewRemark, null)); } /** * å®¡æ ¸ï¼åå ¥å®¡æ ¸ç»æãå®¡æ ¸äººä¸å®¡æ ¸æè§ * * reviewRemark å 许为 nullï¼å®¡æ ¸éè¿æ¶æè§å¯éï¼ï¼æ åæ ·ä½¿ç¨ UpdateWrapper ç´åã * * @param id èµä»åç¼å· * @param status ç®æ ç¶æï¼å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ * @param reviewerId å®¡æ ¸äººç¼å· * @param reviewerName å®¡æ ¸äººå§å * @param reviewRemark å®¡æ ¸æè§ * @return å½±åè¡æ° */ default int auditCompensation(Long id, Integer status, Long reviewerId, String reviewerName, String reviewRemark) { return update(null, new LambdaUpdateWrapper<AfterSaleCompensationDO>() .eq(AfterSaleCompensationDO::getId, id) .set(AfterSaleCompensationDO::getAuditStatus, status) .set(AfterSaleCompensationDO::getReviewerId, reviewerId) .set(AfterSaleCompensationDO::getReviewerName, reviewerName) .set(AfterSaleCompensationDO::getReviewTime, LocalDateTime.now()) .set(AfterSaleCompensationDO::getReviewRemark, reviewRemark)); } default PageResult<AfterSaleCompensationDO> selectPage(AfterSaleCompensationPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX<AfterSaleCompensationDO>() .likeIfPresent(AfterSaleCompensationDO::getCompensationNo, reqVO.getCompensationNo()) yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/enums/ErrorCodeConstants.java
@@ -38,10 +38,10 @@ // ========== èµä»/æå¡è¡¥å¿å 1-022-004-000 ========== ErrorCode COMPENSATION_NOT_EXISTS = new ErrorCode(1_022_004_000, "èµä»/æå¡è¡¥å¿åä¸åå¨"); ErrorCode COMPENSATION_NO_EXISTS = new ErrorCode(1_022_004_001, "çæèµä»åå·éå¤ï¼è¯·éè¯"); ErrorCode COMPENSATION_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_022_004_002, "æäº¤èµä»å审æ¹å¤±è´¥ï¼åå ï¼èµä»å䏿¯èç¨¿ç¶æ"); ErrorCode COMPENSATION_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_022_004_003, "èµä»åå®¡æ¹æµç¨ä¸åå¨ææªæ¿æ´»ï¼è¯·æ£æ¥ BPM é ç½®"); ErrorCode COMPENSATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_022_004_004, "æ´æ°èµä»å审æ¹ç¶æå¤±è´¥ï¼åå ï¼èµä»åä¸å¤äºå®¡æ¹ä¸"); ErrorCode COMPENSATION_DELETE_FAIL_NOT_DRAFT = new ErrorCode(1_022_004_005, "èµä»å䏿¯èç¨¿ç¶æï¼æ æ³å é¤"); ErrorCode COMPENSATION_TICKET_NOT_EXISTS = new ErrorCode(1_022_004_006, "å ³èçå®åå·¥åä¸åå¨"); ErrorCode COMPENSATION_SUBMIT_FAIL_NOT_EDITABLE = new ErrorCode(1_022_004_002, "åªææªæäº¤æå®¡æ ¸ä¸éè¿ç¶æçèµä»åæè½æäº¤å®¡æ¹"); ErrorCode COMPENSATION_AUDIT_FAIL_NOT_PROCESS = new ErrorCode(1_022_004_003, "åªæå®¡æ¹ä¸ç¶æçèµä»åæè½å®¡æ ¸"); ErrorCode COMPENSATION_DELETE_FAIL_NOT_DRAFT = new ErrorCode(1_022_004_004, "èµä»å䏿¯èç¨¿ç¶æï¼æ æ³å é¤"); ErrorCode COMPENSATION_TICKET_NOT_EXISTS = new ErrorCode(1_022_004_005, "å ³èçå®åå·¥åä¸åå¨"); ErrorCode COMPENSATION_AUDIT_REJECT_REASON_REQUIRED = new ErrorCode(1_022_004_006, "å®¡æ ¸ä¸éè¿æ¶å¿ 须填åä¸éè¿åå "); } yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/AfterSaleCompensationService.java
@@ -1,13 +1,11 @@ package cn.iocoder.yudao.module.aftersales.service.compensation; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.aftersales.controller.admin.compensation.vo.AfterSaleCompensationAuditReqVO; import cn.iocoder.yudao.module.aftersales.controller.admin.compensation.vo.AfterSaleCompensationPageReqVO; import cn.iocoder.yudao.module.aftersales.controller.admin.compensation.vo.AfterSaleCompensationSaveReqVO; import cn.iocoder.yudao.module.aftersales.dal.dataobject.compensation.AfterSaleCompensationDO; import java.util.List; import java.util.Map; import java.util.Set; /** * å®åèµä»/æå¡è¡¥å¿å Service æ¥å£ @@ -25,23 +23,28 @@ PageResult<AfterSaleCompensationDO> getCompensationPage(AfterSaleCompensationPageReqVO pageReqVO); /** * æäº¤èµä»åå®¡æ¹ * æäº¤èµä»å审æ¹ï¼æªæäº¤ / å®¡æ ¸ä¸éè¿ â 审æ¹ä¸ï¼ * * 审æ¹äººç±ãç³»ç»ç®¡ç - 审æ¹é ç½®ãæä¸å¡ç±»å compensation_approve ç»ä¸æå®ï¼æäº¤æ¶ä¸é人ã * * @param id èµä»åç¼å· */ void submitCompensation(Long id, String processDefinitionKey, Long userId); void submitCompensation(Long id); /** * 审æ¹èµä»åï¼éè¿/驳åï¼ * è·å¾èµä»å审æ¹äººç¼å·éåï¼ä¾åç«¯å¤ææ¯å¦å±ç¤ºå®¡æ ¸æé® * * @return 审æ¹äººç¨æ·ç¼å·éå */ void auditCompensation(AfterSaleCompensationAuditReqVO auditReqVO); Set<Long> getCompensationApproverUserIds(); /** * æ´æ°èµä»å审æ¹ç¶æï¼BPM çå¬åè°ï¼ * å®¡æ ¸èµä»åï¼å®¡æ¹ä¸ â å®¡æ ¸éè¿ / å®¡æ ¸ä¸éè¿ï¼ * * @param id èµä»åç¼å· * @param pass æ¯å¦éè¿ * @param reviewRemark å®¡æ ¸æè§ï¼å®¡æ ¸ä¸éè¿æ¶å¿ å¡« */ void updateCompensationAuditStatus(Long id, Integer bpmResult); /** * è·å¾èµä»åå®¡æ¹æµç¨å®ä¹å表 */ List<Map<String, Object>> getCompensationApproveProcessDefinitionList(); void auditCompensation(Long id, Boolean pass, String reviewRemark); } yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/AfterSaleCompensationServiceImpl.java
@@ -1,43 +1,31 @@ package cn.iocoder.yudao.module.aftersales.service.compensation; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.RandomUtil; 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.aftersales.controller.admin.compensation.vo.AfterSaleCompensationAuditReqVO; import cn.iocoder.yudao.module.aftersales.controller.admin.compensation.vo.AfterSaleCompensationPageReqVO; import cn.iocoder.yudao.module.aftersales.controller.admin.compensation.vo.AfterSaleCompensationSaveReqVO; import cn.iocoder.yudao.module.aftersales.dal.dataobject.compensation.AfterSaleCompensationDO; import cn.iocoder.yudao.module.aftersales.dal.mysql.compensation.AfterSaleCompensationMapper; import cn.iocoder.yudao.module.aftersales.enums.AfterSaleCompensationAuditStatusEnum; import cn.iocoder.yudao.module.aftersales.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.repository.ProcessDefinition; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.aftersales.util.AfterSaleCompensationStatusUtils.convertBpmResultToAuditStatus; /** * å®åèµä»/æå¡è¡¥å¿å Service å®ç°ç±» @@ -47,22 +35,19 @@ @Slf4j public class AfterSaleCompensationServiceImpl implements AfterSaleCompensationService { private static final Integer AUDIT_DRAFT = 0; private static final Integer AUDIT_PASS = 20; /** * BPM èµä»å®¡æ¹åç±»ç¼ç * èµä»å审æ¹çä¸å¡ç±»åç¼ç * * ä¸ system_approval_config.biz_type 对åºï¼å®¡æ¹äººå¨ãç³»ç»ç®¡ç - 审æ¹é ç½®ãä¸ç»´æ¤ã */ private static final String COMPENSATION_APPROVE_CATEGORY_CODE = "compensation_approve"; private static final String COMPENSATION_APPROVE_BIZ_TYPE = "compensation_approve"; @Resource private AfterSaleCompensationMapper compensationMapper; @Resource private BpmProcessInstanceApi bpmProcessInstanceApi; private ApprovalConfigApi approvalConfigApi; @Resource private BpmCategoryService bpmCategoryService; @Resource private BpmProcessDefinitionService bpmProcessDefinitionService; private AdminUserApi adminUserApi; @Override @Transactional(rollbackFor = Exception.class) @@ -73,7 +58,7 @@ } AfterSaleCompensationDO entity = BeanUtils.toBean(createReqVO, AfterSaleCompensationDO.class, req -> req .setCompensationNo(compensationNo) .setAuditStatus(AUDIT_DRAFT)); .setAuditStatus(AfterSaleCompensationAuditStatusEnum.DRAFT.getStatus())); compensationMapper.insert(entity); return entity.getId(); } @@ -84,7 +69,7 @@ if (exists == null) { throw exception(ErrorCodeConstants.COMPENSATION_NOT_EXISTS); } if (ObjUtil.notEqual(exists.getAuditStatus(), AUDIT_DRAFT)) { if (ObjUtil.notEqual(exists.getAuditStatus(), AfterSaleCompensationAuditStatusEnum.DRAFT.getStatus())) { throw exception(ErrorCodeConstants.COMPENSATION_DELETE_FAIL_NOT_DRAFT); } AfterSaleCompensationDO entity = BeanUtils.toBean(updateReqVO, AfterSaleCompensationDO.class, req -> req @@ -100,7 +85,7 @@ if (exists == null) { throw exception(ErrorCodeConstants.COMPENSATION_NOT_EXISTS); } if (ObjUtil.notEqual(exists.getAuditStatus(), AUDIT_DRAFT)) { if (ObjUtil.notEqual(exists.getAuditStatus(), AfterSaleCompensationAuditStatusEnum.DRAFT.getStatus())) { throw exception(ErrorCodeConstants.COMPENSATION_DELETE_FAIL_NOT_DRAFT); } compensationMapper.deleteById(id); @@ -117,130 +102,75 @@ } @Override public void submitCompensation(Long id, String processDefinitionKey, Long userId) { // 1. æ ¡éªèµä»åæ¯å¦å¨èç¨¿ç¶æ AfterSaleCompensationDO compensation = compensationMapper.selectById(id); if (compensation == null) { throw exception(ErrorCodeConstants.COMPENSATION_NOT_EXISTS); } if (ObjUtil.notEqual(compensation.getAuditStatus(), AfterSaleCompensationAuditStatusEnum.DRAFT.getStatus())) { throw exception(ErrorCodeConstants.COMPENSATION_SUBMIT_FAIL_NOT_DRAFT); @Transactional(rollbackFor = Exception.class) public void submitCompensation(Long id) { // 1. æ ¡éªåå¨ + å¯æäº¤ç¶æï¼æªæäº¤ / å®¡æ ¸ä¸éè¿ï¼ AfterSaleCompensationDO compensation = validateCompensationExists(id); if (ObjUtil.notEqual(compensation.getAuditStatus(), AfterSaleCompensationAuditStatusEnum.DRAFT.getStatus()) && ObjUtil.notEqual(compensation.getAuditStatus(), AfterSaleCompensationAuditStatusEnum.REJECT.getStatus())) { throw exception(ErrorCodeConstants.COMPENSATION_SUBMIT_FAIL_NOT_EDITABLE); } // 2. æ ¡éªèµä»å®¡æ¹åç±»åæµç¨å®ä¹æ¯å¦åå¨ï¼ä¸ä¼ å ¥çæµç¨å®ä¹å¤äºæ¿æ´»ç¶æ validateCompensationApproveCategoryAndProcessDefinition(); ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); if (processDefinition == null) { throw exception(ErrorCodeConstants.COMPENSATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); } // 2. æ ¡éªå®¡æ¹é 置已å¯ç¨ä¸é ç½®äºææå®¡æ¹äººï¼æªé ç½®æ¶æåºå¸¦æç¡®æç¤ºçä¸å¡å¼å¸¸ï¼ approvalConfigApi.validateApprovalEnabledAndGetApprovers(COMPENSATION_APPROVE_BIZ_TYPE); // 3. å建èµä»å®¡æ¹æµç¨å®ä¾ String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(processDefinitionKey) .setBusinessKey(String.valueOf(id))); // 4. æ´æ°èµä»åæµç¨ç¼å·ä¸å®¡æ¹ç¶æ compensationMapper.updateById(new AfterSaleCompensationDO().setId(id).setProcessInstanceId(processInstanceId) .setAuditStatus(AfterSaleCompensationAuditStatusEnum.PROCESS.getStatus())); // 3. ç¶æç½®ä¸ºå®¡æ¹ä¸ï¼å¹¶æ¸ 空ä¸ä¸è½®å®¡æ ¸ç»æï¼é¿å æ®çãå®¡æ ¸ä¸éè¿ãçåå compensationMapper.submitAndResetAuditInfo(id, AfterSaleCompensationAuditStatusEnum.PROCESS.getStatus()); } @Override public void auditCompensation(AfterSaleCompensationAuditReqVO auditReqVO) { AfterSaleCompensationDO exists = compensationMapper.selectById(auditReqVO.getId()); if (exists == null) { throw exception(ErrorCodeConstants.COMPENSATION_NOT_EXISTS); } AfterSaleCompensationDO update = new AfterSaleCompensationDO(); update.setId(exists.getId()); update.setAuditStatus(auditReqVO.getAuditStatus()); update.setAuditUserId(getLoginUserId()); update.setAuditTime(LocalDateTime.now()); if (StrUtil.isNotBlank(auditReqVO.getRemark())) { update.setAuditRemark(auditReqVO.getRemark()); } compensationMapper.updateById(update); public Set<Long> getCompensationApproverUserIds() { return approvalConfigApi.getApproverUserIds(COMPENSATION_APPROVE_BIZ_TYPE); } @Override public void updateCompensationAuditStatus(Long id, Integer bpmResult) { // 1.1 æ ¡éªèµä»åæ¯å¦åå¨ AfterSaleCompensationDO compensation = compensationMapper.selectById(id); if (compensation == null) { throw exception(ErrorCodeConstants.COMPENSATION_NOT_EXISTS); } // 1.2 åªæå®¡æ¹ä¸ï¼å¯ä»¥æ´æ°å®¡æ¹ç»æ @Transactional(rollbackFor = Exception.class) public void auditCompensation(Long id, Boolean pass, String reviewRemark) { // 1. æ ¡éªåå¨ AfterSaleCompensationDO compensation = validateCompensationExists(id); // 2. æ ¡éªå¤äºå®¡æ¹ä¸ç¶æ if (ObjUtil.notEqual(compensation.getAuditStatus(), AfterSaleCompensationAuditStatusEnum.PROCESS.getStatus())) { log.error("[updateCompensationAuditStatus][compensation({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", compensation.getId(), bpmResult); throw exception(ErrorCodeConstants.COMPENSATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); throw exception(ErrorCodeConstants.COMPENSATION_AUDIT_FAIL_NOT_PROCESS); } // 3. æ ¡éªå½åç»å½ç¨æ·æ¯è¯¥ä¸å¡ç±»åç审æ¹äººï¼æç¾ï¼ä»»ä¸äººåå¯å®¡æ ¸ï¼ Long userId = getLoginUserId(); approvalConfigApi.validateApprover(COMPENSATION_APPROVE_BIZ_TYPE, userId); // 4. å®¡æ ¸ä¸éè¿ï¼å¿ 须填ååå ï¼ç¶æç½®ä¸ºå®¡æ ¸ä¸éè¿ï¼éåæäº¤äººä¿®æ¹åå¯éæ°æäº¤ if (!Boolean.TRUE.equals(pass)) { if (StrUtil.isBlank(reviewRemark)) { throw exception(ErrorCodeConstants.COMPENSATION_AUDIT_REJECT_REASON_REQUIRED); } compensationMapper.auditCompensation(id, AfterSaleCompensationAuditStatusEnum.REJECT.getStatus(), userId, getUserNickname(userId), reviewRemark); return; } // 5. å®¡æ ¸éè¿ï¼è®°å½å®¡æ ¸äººä¸å®¡æ ¸æè§ï¼ç¶æç½®ä¸ºå®¡æ ¸éè¿ compensationMapper.auditCompensation(id, AfterSaleCompensationAuditStatusEnum.APPROVE.getStatus(), userId, getUserNickname(userId), reviewRemark); // 6. å®¡æ ¸éè¿åçåç½®ä¸å¡é»è¾ï¼å½åèµä»å审æ¹éè¿åæ èªå¨çæä¸æ¸¸åæ®çå¨ä½ï¼ // æ¯ä»ç¶æï¼payStatusï¼å¾ åç»æ¥å ¥è´¢å¡æ¨¡åæ¶åèå¨ã } // 2. æ´æ°èµä»å审æ¹ç»æ Integer auditStatus = convertBpmResultToAuditStatus(bpmResult); compensationMapper.updateById(new AfterSaleCompensationDO().setId(id).setAuditStatus(auditStatus)); private AfterSaleCompensationDO validateCompensationExists(Long id) { AfterSaleCompensationDO compensation = compensationMapper.selectById(id); if (compensation == null) { throw exception(ErrorCodeConstants.COMPENSATION_NOT_EXISTS); } @Override public List<Map<String, Object>> getCompensationApproveProcessDefinitionList() { // 1. æ ¡éªèµä»å®¡æ¹åç±»åæµç¨å®ä¹æ¯å¦åå¨ validateCompensationApproveCategoryAndProcessDefinition(); // 2. è·ååç±»ä¸çæµç¨å®ä¹ä¿¡æ¯ List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService .getProcessDefinitionInfoListByCategory(COMPENSATION_APPROVE_CATEGORY_CODE); // 3. è·åæµç¨å®ä¹è¯¦æ Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); // 4. è¿æ»¤ï¼åªä¿çæ¿æ´»ç¶æï¼ä¸ç¸å key åªä¿çææ°çæ¬ Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); for (ProcessDefinition pd : processDefinitions) { if (pd.isSuspended()) { continue; } ProcessDefinition existing = latestVersionMap.get(pd.getKey()); if (existing == null || pd.getVersion() > existing.getVersion()) { latestVersionMap.put(pd.getKey(), pd); } } // 5. è¿åæµç¨å®ä¹å表 List<Map<String, Object>> result = new ArrayList<>(); for (ProcessDefinition pd : latestVersionMap.values()) { Map<String, Object> item = new HashMap<>(); item.put("id", pd.getId()); item.put("key", pd.getKey()); item.put("name", pd.getName()); item.put("version", pd.getVersion()); result.add(item); } return result; return compensation; } /** * æ ¡éª BPM èµä»å®¡æ¹åç±»åæµç¨å®ä¹æ¯å¦åå¨ * è·åç¨æ·æµç§° * * @param userId ç¨æ·ç¼å· * @return æµç§°ï¼ç¨æ·ä¸å卿¶è¿å null */ private void validateCompensationApproveCategoryAndProcessDefinition() { // 1. æ ¡éªåç±»æ¯å¦åå¨ Map<String, ?> categoryMap = bpmCategoryService.getCategoryMap(Collections.singletonList(COMPENSATION_APPROVE_CATEGORY_CODE)); if (!categoryMap.containsKey(COMPENSATION_APPROVE_CATEGORY_CODE)) { throw exception(ErrorCodeConstants.COMPENSATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); private String getUserNickname(Long userId) { if (userId == null) { return null; } // 2. æ ¡éªåç±»ä¸æ¯å¦æå¯ç¨çæµç¨å®ä¹ List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService .getProcessDefinitionInfoListByCategory(COMPENSATION_APPROVE_CATEGORY_CODE); if (CollUtil.isEmpty(definitionInfoList)) { throw exception(ErrorCodeConstants.COMPENSATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); } // 3. æ ¡éªæ¯å¦ææ¿æ´»ç¶æçæµç¨å®ä¹ Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); boolean hasActiveDefinition = processDefinitions.stream().anyMatch(pd -> !pd.isSuspended()); if (!hasActiveDefinition) { throw exception(ErrorCodeConstants.COMPENSATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); } AdminUserRespDTO user = adminUserApi.getUser(userId); return user == null ? null : user.getNickname(); } private String generateCompensationNo() { yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/compensation/listener/AfterSaleCompensationStatusListener.java
ÎļþÒÑɾ³ý yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/util/AfterSaleCompensationStatusUtils.java
ÎļþÒÑɾ³ý