diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/approval/aspect/ApprovalAspect.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/approval/aspect/ApprovalAspect.java index 9c021e2..e507dd5 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/approval/aspect/ApprovalAspect.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/approval/aspect/ApprovalAspect.java @@ -10,6 +10,7 @@ import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; +import org.checkerframework.checker.nullness.qual.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.DefaultParameterNameDiscoverer; @@ -22,6 +23,8 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; /** * 审批切面 @@ -80,28 +83,61 @@ public class ApprovalAspect { if (businessIdObj == null) { throw new ServiceException("无法解析业务ID,表达式:" + annotation.businessIdExpr()); } - String businessId = String.valueOf(businessIdObj); // 6. 解析业务数据 Object businessDataObj = parseExpression(annotation.businessDataExpr(), joinPoint, result, Object.class); - String businessData = JSON.toJSONString(businessDataObj); - // 7. 创建审批实例 + // 7. 判断是否为批量操作(数组或集合) + List businessIds = copeCollId(businessIdObj); + + // 8. 为每个业务ID创建审批实例 try { - ApprovalInstance instance = approvalEngineService.createApprovalInstance( - annotation.businessType(), businessId, businessData); - - log.info("自动创建审批实例成功,业务类型:{},业务ID:{},实例编号:{}", - annotation.businessType(), businessId, instance.getInstanceCode()); + for (String businessId : businessIds) { + String businessData = JSON.toJSONString(businessDataObj); + ApprovalInstance instance = approvalEngineService.createApprovalInstance( + annotation.businessType(), businessId, businessData); + + log.info("自动创建审批实例成功,业务类型:{},业务ID:{},实例编号:{}", + annotation.businessType(), businessId, instance.getInstanceCode()); + } } catch (Exception e) { - log.error("创建审批实例失败,业务类型:{},业务ID:{}", - annotation.businessType(), businessId, e); + log.error("创建审批实例失败,业务类型:{},业务IDs:{}", annotation.businessType(), businessIds, e); throw new ServiceException("创建审批实例失败:" + e.getMessage()); } return result; } + /** + * 处理参数ID, 多个 or 1个的情况 + * @param businessIdObj 业务 ID + * @return 处理后的集合 + */ + private static @NonNull List copeCollId(Object businessIdObj) { + List businessIds = new ArrayList<>(); + if (businessIdObj.getClass().isArray()) { + // 处理数组情况 + Object[] idArray = (Object[]) businessIdObj; + for (Object id : idArray) { + if (id != null) { + businessIds.add(String.valueOf(id)); + } + } + } else if (businessIdObj instanceof java.util.Collection) { + // 处理集合情况 + java.util.Collection idCollection = (java.util.Collection) businessIdObj; + for (Object id : idCollection) { + if (id != null) { + businessIds.add(String.valueOf(id)); + } + } + } else { + // 单 ID 情况 + businessIds.add(String.valueOf(businessIdObj)); + } + return businessIds; + } + /** * 创建SpEL上下文 */