yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
@@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO; import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; import cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderSourceTypeEnum; import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi; import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO; @@ -40,7 +41,9 @@ import java.util.Map; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -170,6 +173,23 @@ return success(purchaseOrderService.confirmReceipt(id)); } @PostMapping("/reverse-approve") @Operation(summary = "å审æ¹ï¼åååå ¬å·²åä»»å¡ä¸æ¤åå·²å®¡æ ¸è®¢åï¼ç´æ¥éæ°è¿å ¥å¾ å审æ¹ï¼") @Parameter(name = "processInstanceId", description = "æµç¨å®ä¾ç¼å·", required = true) @PreAuthorize("@ss.hasPermission('erp:purchase-order:update-status')") public CommonResult<Boolean> reverseApprove(@RequestParam("processInstanceId") String processInstanceId) { // 1. æ ¹æ®æµç¨å®ä¾ç¼å·æ¾å°éè´è®¢å ErpPurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrderByProcessInstanceId(processInstanceId); if (purchaseOrder == null) { throw exception(PURCHASE_ORDER_NOT_EXISTS); } // 2. åå®¡æ ¸ï¼å·²å®¡æ ¸ -> æªå®¡æ ¸ï¼å«å ¥åº/éè´§æ ¡éªï¼ purchaseOrderService.updatePurchaseOrderStatus(purchaseOrder.getId(), ErpAuditStatus.PROCESS.getStatus()); // 3. èªå¨éæ°æäº¤å®¡æ¹ -> 订åç´æ¥åå°åååå ¬å¾ åä»»å¡ purchaseOrderService.submitPurchaseOrder(purchaseOrder.getId(), "purchase_order_approve", getLoginUserId()); return success(true); } private PageResult<ErpPurchaseOrderRespVO> buildPurchaseOrderVOPageResult(PageResult<ErpPurchaseOrderDO> pageResult) { if (CollUtil.isEmpty(pageResult.getList())) { return PageResult.empty(pageResult.getTotal()); yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java
@@ -74,6 +74,10 @@ return selectOne(ErpPurchaseOrderDO::getNo, no); } default ErpPurchaseOrderDO selectByProcessInstanceId(String processInstanceId) { return selectOne(ErpPurchaseOrderDO::getProcessInstanceId, processInstanceId); } default List<ErpPurchaseOrderDO> selectList(Long supplierId, Integer status) { return selectList(new LambdaQueryWrapperX<ErpPurchaseOrderDO>() .eqIfPresent(ErpPurchaseOrderDO::getSupplierId, supplierId) yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpAuditStatus.java
@@ -20,7 +20,8 @@ PROCESS(10, "æªå®¡æ ¸"), // æªå®¡æ ¸/è稿 APPROVING(15, "审æ¹ä¸"), // 审æ¹ä¸ APPROVE(20, "å·²å®¡æ ¸"), // å®¡æ ¸éè¿ CANCEL(30, "å·²ä½åº"); // å·²ä½åº/å·²æ¤é CANCEL(30, "å·²ä½åº"), // å·²ä½åº/å·²æ¤é REJECT(35, "已驳å"); // 审æ¹è¢«é©³å public static final Integer[] ARRAYS = Arrays.stream(values()).map(ErpAuditStatus::getStatus).toArray(Integer[]::new); yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderService.java
@@ -98,6 +98,14 @@ ErpPurchaseOrderDO getPurchaseOrder(Long id); /** * æ ¹æ® BPM æµç¨å®ä¾ç¼å·æ¥è¯¢éè´è®¢åï¼ç¨äºåååå ¬å审æ¹ï¼ * * @param processInstanceId æµç¨å®ä¾ç¼å· * @return éè´è®¢å */ ErpPurchaseOrderDO getPurchaseOrderByProcessInstanceId(String processInstanceId); /** * æ ¡éªéè´è®¢åï¼å·²ç»å®¡æ ¸éè¿ * * @param id ç¼å· yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -41,6 +41,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; /** @@ -56,7 +57,11 @@ /** * BPM éè´è®¢å审æ¹åç±»ç¼ç */ private static final String PURCHASE_ORDER_APPROVE_CATEGORY_CODE = "purchase_request_approve"; private static final String PURCHASE_ORDER_APPROVE_CATEGORY_CODE = "purchase_order_approve"; /** * BPM éè´è®¢åå®¡æ¹æµç¨å®ä¹ Keyï¼å建订ååèªå¨æäº¤å°åååå ¬å®¡æ¹ï¼ */ private static final String PURCHASE_ORDER_APPROVE_PROCESS_DEFINITION_KEY = "purchase_order_approve"; @Resource private ErpPurchaseOrderMapper purchaseOrderMapper; @@ -119,6 +124,10 @@ // 2.3 ç»å®éä»¶ storageAttachmentApi.bindAttachments("file", "erp_purchase_order", purchaseOrder.getId(), createReqVO.getBlobIds()); // 3. å建åèªå¨æäº¤å®¡æ¹å°åååå ¬ï¼å®¡æ¹å¨åååå ¬å®æï¼ä¸å¨æ¬é¡µé¢å®¡æ¹ï¼ submitPurchaseOrder(purchaseOrder.getId(), PURCHASE_ORDER_APPROVE_PROCESS_DEFINITION_KEY, getLoginUserId()); return purchaseOrder.getId(); } @@ -288,7 +297,7 @@ if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult)) { return ErpAuditStatus.APPROVE.getStatus(); } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult)) { return ErpAuditStatus.PROCESS.getStatus(); return ErpAuditStatus.REJECT.getStatus(); } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult)) { return ErpAuditStatus.CANCEL.getStatus(); } @@ -406,6 +415,11 @@ } @Override public ErpPurchaseOrderDO getPurchaseOrderByProcessInstanceId(String processInstanceId) { return purchaseOrderMapper.selectByProcessInstanceId(processInstanceId); } @Override public ErpPurchaseOrderDO validatePurchaseOrder(Long id) { ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrderExists(id); if (ObjectUtil.notEqual(purchaseOrder.getStatus(), ErpAuditStatus.APPROVE.getStatus())) { yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/listener/ErpPurchaseOrderStatusListener.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,54 @@ package cn.iocoder.yudao.module.erp.service.purchase.listener; import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener; import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** * éè´è®¢å审æ¹ç¶æçå¬å¨ * * çå¬ BPM æµç¨å®ä¾ç¶æåæ´äºä»¶ï¼æ´æ°éè´è®¢åç审æ¹ç¶æï¼åååå ¬å®¡æ¹åååï¼ * * @author è¶ çº§ç®¡çå */ @Component @Slf4j public class ErpPurchaseOrderStatusListener extends BpmProcessInstanceStatusEventListener { /** * éè´è®¢åå®¡æ¹æµç¨å®ä¹ Key */ private static final String PROCESS_DEFINITION_KEY = "purchase_order_approve"; @Resource private ErpPurchaseOrderService purchaseOrderService; @Override protected String getProcessDefinitionKey() { return PROCESS_DEFINITION_KEY; } @Override protected void onEvent(BpmProcessInstanceStatusEvent event) { Long orderId; try { orderId = Long.parseLong(event.getBusinessKey()); } catch (NumberFormatException e) { log.warn("[onEvent] businessKey({}) 䏿¯ææçéè´è®¢åç¼å·", event.getBusinessKey()); return; } log.info("[onEvent] æ¶å°BPM审æ¹äºä»¶ï¼orderId={}, status={}", orderId, event.getStatus()); try { purchaseOrderService.updatePurchaseOrderAuditStatus(orderId, event.getStatus()); log.info("[onEvent] éè´è®¢å({}) 审æ¹ç¶ææ´æ°å®æ", orderId); } catch (Exception e) { log.error("[onEvent] æ´æ°éè´è®¢å审æ¹ç¶æå¤±è´¥ï¼orderId={}", orderId, e); } } }