diff --git a/_doc/Task.md b/_doc/Task.md index 6ebd144b..12810ce2 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -14,12 +14,12 @@ - [x] 分账查询 - [x] 分账完结 - [x] 分账同步 -- [ ] 保存分账同步记录 +- [x] 保存分账同步记录 - [ ] SDK支持分账相关接口 - [ ] 分账回调处理 - [x] 分账通知发送功能 - [x] 分账支持手动和自动分账两种 -- [ ] 金额过小不进行分账, 增加新状态, 金额小于0.01元直接忽略 +- [x] 金额过小不进行分账, 增加新状态, 金额小于0.01元直接忽略 - [x] 优化签名注解和上下文初始化注解切面 - [x] 对账差异单, 数据不一致处理异常, 本地待对账订单类型记录错误 - [x] 订单超时任务注册任务错误,id改为订单号 diff --git a/daxpay-single-sdk/pom.xml b/daxpay-single-sdk/pom.xml index 5f96d421..37b97fed 100644 --- a/daxpay-single-sdk/pom.xml +++ b/daxpay-single-sdk/pom.xml @@ -45,7 +45,7 @@ 1.8 UTF-8 1.2.7 - 5.8.25 + 5.8.27 1.18.30 4.13.2 diff --git a/daxpay-single-sdk/src/main/java/cn/daxpay/single/sdk/model/allocation/AllocReceiverModel.java b/daxpay-single-sdk/src/main/java/cn/daxpay/single/sdk/model/allocation/AllocReceiverModel.java index 090c47e2..419e9f1d 100644 --- a/daxpay-single-sdk/src/main/java/cn/daxpay/single/sdk/model/allocation/AllocReceiverModel.java +++ b/daxpay-single-sdk/src/main/java/cn/daxpay/single/sdk/model/allocation/AllocReceiverModel.java @@ -18,9 +18,6 @@ public class AllocReceiverModel { /** 分账接收方编号, 需要保证唯一 */ private String receiverNo; - /** 账号别名 */ - private String name; - /** * 所属通道 * @see PayChannelEnum diff --git a/daxpay-single-sdk/src/main/java/cn/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java b/daxpay-single-sdk/src/main/java/cn/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java index 209667ba..eacbd39f 100644 --- a/daxpay-single-sdk/src/main/java/cn/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java +++ b/daxpay-single-sdk/src/main/java/cn/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java @@ -25,9 +25,6 @@ public class AllocReceiverAddParam extends DaxPayRequest /** 接收者编号 */ private String receiverNo; - /** 账号别名 */ - private String name; - /** * 所属通道 * @see PayChannelEnum diff --git a/daxpay-single-sdk/src/test/java/cn/daxpay/single/sdk/allocation/AllocationReceiverTest.java b/daxpay-single-sdk/src/test/java/cn/daxpay/single/sdk/allocation/AllocationReceiverTest.java index ec7efae1..d531d508 100644 --- a/daxpay-single-sdk/src/test/java/cn/daxpay/single/sdk/allocation/AllocationReceiverTest.java +++ b/daxpay-single-sdk/src/test/java/cn/daxpay/single/sdk/allocation/AllocationReceiverTest.java @@ -44,7 +44,6 @@ public class AllocationReceiverTest { param.setRelationType("user"); param.setRelationName("测试"); param.setReceiverNo("123456"); - param.setName("测试"); param.setReceiverType("user"); param.setReceiverAccount("123456"); DaxPayResult execute = DaxPayKit.execute(param); diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/PayOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/PayOrderController.java index 2ca28b91..90eb6a66 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/PayOrderController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/PayOrderController.java @@ -15,7 +15,7 @@ import cn.daxpay.single.service.core.order.pay.service.PayOrderQueryService; import cn.daxpay.single.service.core.payment.allocation.service.AllocationService; import cn.daxpay.single.service.core.payment.close.service.PayCloseService; import cn.daxpay.single.service.core.payment.sync.service.PaySyncService; -import cn.daxpay.single.service.dto.order.pay.PayOrderDetailDto; +import cn.daxpay.single.service.dto.order.pay.PayOrderInfoDto; import cn.daxpay.single.service.dto.order.pay.PayOrderDto; import cn.daxpay.single.service.dto.order.pay.PayOrderExtraDto; import cn.daxpay.single.service.param.order.PayOrderQuery; @@ -63,11 +63,11 @@ public class PayOrderController { @Operation(summary = "查询订单详情") @GetMapping("/findByOrderNo") - public ResResult findByOrderNo(String orderNo){ + public ResResult findByOrderNo(String orderNo){ PayOrderDto order = queryService.findByOrderNo(orderNo) .map(PayOrder::toDto) .orElseThrow(() -> new DataNotExistException("支付订单不存在")); - PayOrderDetailDto detailDto=new PayOrderDetailDto(); + PayOrderInfoDto detailDto=new PayOrderInfoDto(); detailDto.setPayOrder(order); detailDto.setPayOrderExtra(payOrderExtraService.findById(order.getId())); return Res.ok(detailDto); diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/code/AllocDetailResultEnum.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/code/AllocDetailResultEnum.java index 3d3662a3..867eaf7e 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/code/AllocDetailResultEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/code/AllocDetailResultEnum.java @@ -15,6 +15,8 @@ public enum AllocDetailResultEnum { PENDING("pending", "待分账"), SUCCESS("success", "分账成功"), FAIL("fail", "分账失败"), + /** 金额为0时不进行分账 */ + IGNORE("ignore", "忽略分账"), ; private final String code; diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/code/AllocOrderStatusEnum.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/code/AllocOrderStatusEnum.java index 3d06d0c3..f7efa97a 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/code/AllocOrderStatusEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/code/AllocOrderStatusEnum.java @@ -17,6 +17,8 @@ public enum AllocOrderStatusEnum { ALLOCATION_FAILED("allocation_failed", "分账失败"), FINISH("finish", "完结"), FINISH_FAILED("finish_failed", "完结失败"), + /** 忽略, 如果金额为0, 不进行分账 */ + IGNORE("ignore", "忽略"), ; final String code; diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverAddParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverAddParam.java index 345c45b4..045265b2 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverAddParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverAddParam.java @@ -9,6 +9,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import javax.validation.constraints.NotEmpty; + /** * 分账接收者添加参数 * @author xxm @@ -21,17 +23,15 @@ import lombok.experimental.Accessors; public class AllocReceiverAddParam extends PaymentCommonParam { @Schema(description = "接收者编号, 需要保证唯一") + @NotEmpty(message = "接收者编号必填") private String receiverNo; - /** 账号别名 */ - @Schema(description = "账号别名") - private String name; - /** * 所属通道 * @see PayChannelEnum */ @Schema(description = "所属通道") + @NotEmpty(message = "所属通道必填") private String channel; /** @@ -39,10 +39,12 @@ public class AllocReceiverAddParam extends PaymentCommonParam { * @see AllocReceiverTypeEnum */ @Schema(description = "分账接收方类型") + @NotEmpty(message = "分账接收方类型必填") private String receiverType; /** 接收方账号 */ @Schema(description = "接收方账号") + @NotEmpty(message = "接收方账号必填") private String receiverAccount; /** 接收方姓名 */ @@ -54,6 +56,7 @@ public class AllocReceiverAddParam extends PaymentCommonParam { * @see AllocRelationTypeEnum */ @Schema(description = "分账关系类型") + @NotEmpty(message = "分账关系类型必填") private String relationType; /** 关系名称 关系类型为自定义是填写 */ diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverParam.java index 432d613c..15901f54 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverParam.java @@ -4,6 +4,9 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; + /** * 分账接收方列表 * @author xxm @@ -16,9 +19,12 @@ public class AllocReceiverParam { /** 分账接收方编号 */ @Schema(description = "分账接收方编号") + @NotEmpty(message = "分账接收方编号必填") private String receiverNo; /** 分账金额 */ @Schema(description = "分账金额") + @NotEmpty(message = "分账金额必填") + @Min(value = 1,message = "分账金额至少为0.01元") private Integer amount; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverRemoveParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverRemoveParam.java index d6c41b6d..06f21e6d 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverRemoveParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocReceiverRemoveParam.java @@ -6,6 +6,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import javax.validation.constraints.NotEmpty; + /** * 分账接收者删除参数 * @author xxm @@ -18,6 +20,7 @@ import lombok.experimental.Accessors; public class AllocReceiverRemoveParam extends PaymentCommonParam { @Schema(description = "接收者编号") + @NotEmpty(message = "接收者编号必填") private String receiverNo; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocationParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocationParam.java index 535672b1..d24544ef 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocationParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/AllocationParam.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.Valid; import javax.validation.constraints.NotBlank; import java.util.List; @@ -43,6 +44,7 @@ public class AllocationParam extends PaymentCommonParam { /** 分账接收方列表 */ @Schema(description = "分账接收方列表") + @Valid private List receivers; /** 是否不启用异步通知 */ diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/QueryAllocReceiverParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/QueryAllocReceiverParam.java index 55567e8b..2106f00f 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/QueryAllocReceiverParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/allocation/QueryAllocReceiverParam.java @@ -6,6 +6,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import javax.validation.constraints.NotEmpty; + /** * 查询分账接收者参数 * @author xxm @@ -19,5 +21,6 @@ public class QueryAllocReceiverParam extends PaymentCommonParam { /** 所属通道 */ @Schema(description = "所属通道") + @NotEmpty(message = "所属通道必填") private String channel; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/allocation/AllocReceiverResult.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/allocation/AllocReceiverResult.java index 720856db..15b8738e 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/allocation/AllocReceiverResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/allocation/AllocReceiverResult.java @@ -20,9 +20,6 @@ public class AllocReceiverResult { /** 分账接收方编号, 需要保证唯一 */ private String receiverNo; - /** 账号别名 */ - private String name; - /** * 所属通道 * @see PayChannelEnum diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/annotation/PaymentSign.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/annotation/PaymentSign.java index 755d8906..95967ecb 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/annotation/PaymentSign.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/annotation/PaymentSign.java @@ -3,7 +3,7 @@ package cn.daxpay.single.service.annotation; import java.lang.annotation.*; /** - * 支付签名标识 + * 支付校验签名标识 * 支付方法至少有一个参数,并且需要签名支付参数需要放在第一位 * 返回对象必须为 ResResult 格式 * @author xxm diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/wechat/service/WeChatPayAllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/wechat/service/WeChatPayAllocationService.java index d676b351..23d3e9eb 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/wechat/service/WeChatPayAllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/wechat/service/WeChatPayAllocationService.java @@ -58,15 +58,17 @@ public class WeChatPayAllocationService { } String finalDescription = description; orderDetails.sort(Comparator.comparing(MpIdEntity::getId)); - List list = orderDetails.stream().map(o->{ - AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); - return ReceiverModel.builder() - .type(receiverTypeEnum.getOutCode()) - .account(o.getReceiverAccount()) - .amount(o.getAmount()) - .description(finalDescription) - .build(); - }).collect(Collectors.toList()); + List list = orderDetails.stream() + .filter(o-> Objects.equals(o.getResult(), AllocDetailResultEnum.PENDING.getCode())) + .map(o->{ + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); + return ReceiverModel.builder() + .type(receiverTypeEnum.getOutCode()) + .account(o.getReceiverAccount()) + .amount(o.getAmount()) + .description(finalDescription) + .build(); + }).collect(Collectors.toList()); Map params = ProfitSharingModel.builder() .mch_id(config.getWxMchId()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/allocation/service/AllocationOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/allocation/service/AllocationOrderService.java index 661f09b5..c8f34345 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/allocation/service/AllocationOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/allocation/service/AllocationOrderService.java @@ -40,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -104,6 +105,14 @@ public class AllocationOrderService { return allocationOrderDetailManager.findById(id).map(AllocationOrderDetail::toDto).orElseThrow(() -> new DataNotExistException("分账订单明细不存在")); } + /** + * 查询扩展订单信息 + */ + public AllocationOrderExtraDto findExtraById(Long id) { + return allocationOrderExtraManager.findById(id).map(AllocationOrderExtra::toDto) + .orElseThrow(() -> new DataNotExistException("未找到")); + } + /** * 生成分账订单, 根据分账组创建 @@ -113,11 +122,15 @@ public class AllocationOrderService { // 订单明细 List details = receiversByGroups.stream() .map(o -> { - // 计算分账金额, 小数不分直接舍弃, 防止分账金额超过上限 + // 计算分账金额, 小数部分直接舍弃, 防止分账金额超过上限 Integer rate = o.getRate(); - Integer amount = payOrder.getAmount() * rate / 10000; - AllocationOrderDetail detail = new AllocationOrderDetail(); - detail.setReceiverNo(o.getReceiverNo()) + // 等同于 payOrder.getAmount() * rate / 10000; + int amount = BigDecimal.valueOf(payOrder.getAmount()) + .multiply(BigDecimal.valueOf(rate)) + .divide(BigDecimal.valueOf(10000), 0, RoundingMode.DOWN).intValue(); + + AllocationOrderDetail detail = new AllocationOrderDetail() + .setReceiverNo(o.getReceiverNo()) .setReceiverId(o.getId()) .setAmount(amount) .setResult(AllocDetailResultEnum.PENDING.getCode()) @@ -125,6 +138,12 @@ public class AllocationOrderService { .setReceiverType(o.getReceiverType()) .setReceiverName(o.getReceiverName()) .setReceiverAccount(o.getReceiverAccount()); + // 如果金额为0, 设置为分账失败, 不参与分账 + if (amount == 0){ + detail.setResult(AllocDetailResultEnum.IGNORE.getCode()) + .setErrorMsg("分账比例有误或金额太小, 无法进行分账") + .setFinishTime(LocalDateTime.now()); + } return detail; }) .collect(Collectors.toList()); @@ -186,7 +205,6 @@ public class AllocationOrderService { long allocId = IdUtil.getSnowflakeNextId(); // 分账明细设置ID details.forEach(o -> o.setAllocationId(allocId)); - // 求分账的总额 Integer sumAmount = details.stream() .map(AllocationOrderDetail::getAmount) @@ -204,6 +222,14 @@ public class AllocationOrderService { .setDescription(param.getDescription()) .setStatus(AllocOrderStatusEnum.ALLOCATION_PROCESSING.getCode()) .setAmount(sumAmount); + // 如果分账订单金额为0, 设置为忽略状态 + if (sumAmount == 0){ + allocationOrder.setStatus(AllocOrderStatusEnum.IGNORE.getCode()) + .setFinishTime(LocalDateTime.now()) + .setResult(AllocOrderStatusEnum.ALLOCATION_FAILED.getCode()) + .setErrorMsg("分账比例有误或金额太小, 无法进行分账"); + } + allocationOrder.setId(allocId); // 分账订单扩展 NoticeLocal noticeInfo = PaymentContextLocal.get().getNoticeInfo(); @@ -220,13 +246,5 @@ public class AllocationOrderService { allocationOrderManager.save(allocationOrder); return new OrderAndDetail().setOrder(allocationOrder).setDetails(details); } - - /** - * 查询扩展订单信息 - */ - public AllocationOrderExtraDto findExtraById(Long id) { - return allocationOrderExtraManager.findById(id).map(AllocationOrderExtra::toDto) - .orElseThrow(() -> new DataNotExistException("未找到")); - } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/entity/AllocationReceiver.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/entity/AllocationReceiver.java index b2536be5..7f3020bb 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/entity/AllocationReceiver.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/entity/AllocationReceiver.java @@ -33,10 +33,6 @@ public class AllocationReceiver extends MpBaseEntity implements EntityBaseFuncti @DbColumn(comment = "分账接收方编号") private String receiverNo; - /** 账号别名 */ - @DbColumn(comment = "账号别名") - private String name; - /** * 所属通道 * @see PayChannelEnum diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationGroupService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationGroupService.java index 82424496..c84bc588 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationGroupService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationGroupService.java @@ -78,7 +78,6 @@ public class AllocationGroupService { AllocationReceiver receiver = receiverMap.get(o.getReceiverId()); return new AllocationGroupReceiverResult() .setId(o.getId()) - .setName(receiver.getName()) .setReceiverId(receiver.getId()) .setReceiverNo(receiver.getReceiverNo()) .setReceiverAccount(receiver.getReceiverAccount()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationService.java index d3c46b4d..a775e218 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationService.java @@ -97,30 +97,24 @@ public class AllocationService { throw new RepetitiveOperationException("分账发起处理中,请勿重复操作"); } try { - // 创建分账单和明细并保存, 同时更新支付订单状态 使用事务 - OrderAndDetail orderAndDetail; - // 判断是否传输了分账接收方列表 - if (CollUtil.isNotEmpty(param.getReceivers())) { - orderAndDetail = allocationOrderService.createAndUpdate(param, payOrder); - } else if (Objects.nonNull(param.getGroupNo())){ - // 指定分账组 - AllocationGroup allocationGroup = groupManager.findByGroupNo(param.getGroupNo()).orElseThrow(() -> new DataNotExistException("未查询到分账组")); - List receiversByGroups = allocationGroupService.findReceiversByGroups(allocationGroup.getId()); - orderAndDetail = allocationOrderService.createAndUpdate(param ,payOrder, receiversByGroups); - } else { - // 默认分账组 - AllocationGroup allocationGroup = groupManager.findDefaultGroup(payOrder.getChannel()).orElseThrow(() -> new PayFailureException("未查询到默认分账组")); - List receiversByGroups = allocationGroupService.findReceiversByGroups(allocationGroup.getId()); - orderAndDetail = allocationOrderService.createAndUpdate(param ,payOrder, receiversByGroups); - } - // 创建分账策略并初始化 - AbsAllocationStrategy allocationStrategy = AllocationFactory.create(payOrder.getChannel()); + // 构建分账订单相关信息 + OrderAndDetail orderAndDetail = this.createAlloc(param, payOrder); + // 检查是否需要进行分账 AllocationOrder order = orderAndDetail.getOrder(); List details = orderAndDetail.getDetails(); + // 无需进行分账, + if (Objects.equals(order.getStatus(),AllocOrderStatusEnum.IGNORE.getCode())){ + return new AllocationResult() + .setAllocationNo(order.getAllocationNo()) + .setStatus(order.getStatus()); + } + + // 创建分账策略并初始化 + AbsAllocationStrategy allocationStrategy = AllocationFactory.create(payOrder.getChannel()); allocationStrategy.initParam(order, details); - // 分账预处理 - allocationStrategy.doBeforeHandler(); try { + // 分账预处理 + allocationStrategy.doBeforeHandler(); // 分账处理 allocationStrategy.allocation(); // 执行中 @@ -276,4 +270,27 @@ public class AllocationService { result.setDetails(details); return result; } + + /** + * 构建分账订单相关信息 + */ + private OrderAndDetail createAlloc(AllocationParam param, PayOrder payOrder){ + // 创建分账单和明细并保存, 同时更新支付订单状态 使用事务 + OrderAndDetail orderAndDetail; + // 判断是否传输了分账接收方列表 + if (CollUtil.isNotEmpty(param.getReceivers())) { + orderAndDetail = allocationOrderService.createAndUpdate(param, payOrder); + } else if (Objects.nonNull(param.getGroupNo())){ + // 指定分账组 + AllocationGroup allocationGroup = groupManager.findByGroupNo(param.getGroupNo()).orElseThrow(() -> new DataNotExistException("未查询到分账组")); + List receiversByGroups = allocationGroupService.findReceiversByGroups(allocationGroup.getId()); + orderAndDetail = allocationOrderService.createAndUpdate(param ,payOrder, receiversByGroups); + } else { + // 默认分账组 + AllocationGroup allocationGroup = groupManager.findDefaultGroup(payOrder.getChannel()).orElseThrow(() -> new PayFailureException("未查询到默认分账组")); + List receiversByGroups = allocationGroupService.findReceiversByGroups(allocationGroup.getId()); + orderAndDetail = allocationOrderService.createAndUpdate(param ,payOrder, receiversByGroups); + } + return orderAndDetail; + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationSyncService.java index 4bab7d3c..c4dd9308 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/service/AllocationSyncService.java @@ -66,6 +66,12 @@ public class AllocationSyncService { allocationOrder = allocationOrderManager.findByAllocationNo(param.getBizAllocationNo()) .orElseThrow(() -> new DataNotExistException("分账单不存在")); } + // 如果类型为忽略, 不进行同步处理 + if (Objects.equals(allocationOrder.getStatus(), AllocOrderStatusEnum.IGNORE.getCode())){ + return new AllocSyncResult(); + } + + // 调用同步逻辑 this.sync(allocationOrder); return new AllocSyncResult(); } @@ -85,6 +91,7 @@ public class AllocationSyncService { allocationStrategy.initParam(allocationOrder, detailList); // 分账完结预处理 allocationStrategy.doBeforeHandler(); + // 执行同步操作, 分账明细的状态变更会在这个里面 AllocRemoteSyncResult allocRemoteSyncResult = allocationStrategy.doSync(); // 保存分账同步记录 this.saveRecord(allocationOrder, allocRemoteSyncResult,null,null); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/strategy/allocation/AliPayAllocationStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/strategy/allocation/AliPayAllocationStrategy.java index fc5908e2..1aa55744 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/strategy/allocation/AliPayAllocationStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/strategy/allocation/AliPayAllocationStrategy.java @@ -50,7 +50,7 @@ public class AliPayAllocationStrategy extends AbsAllocationStrategy { this.aliPayConfig = aliPayConfigService.getConfig(); // 判断是否支持分账 if (Objects.equals(aliPayConfig.getAllocation(),false)){ - throw new PayFailureException("微信支付配置不支持分账"); + throw new PayFailureException("支付宝支付配置不支持分账"); } aliPayConfigService.initConfig(this.aliPayConfig); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/strategy/allocation/WeChatPayAllocationStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/strategy/allocation/WeChatPayAllocationStrategy.java index 9468dd21..039c0593 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/strategy/allocation/WeChatPayAllocationStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/allocation/strategy/allocation/WeChatPayAllocationStrategy.java @@ -51,6 +51,10 @@ public class WeChatPayAllocationStrategy extends AbsAllocationStrategy { if (Objects.equals(weChatPayConfig.getAllocation(),false)){ throw new PayFailureException("微信支付配置不支持分账"); } + // 如果分账金额为0, 不发起分账 + if (getAllocationOrder().getAmount() == 0){ + throw new PayFailureException("微信订单的分账比例不正确或订单金额太小, 无法进行分账"); + } } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/allocation/AllocationGroupReceiverResult.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/allocation/AllocationGroupReceiverResult.java index 9aaa90bb..66187540 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/allocation/AllocationGroupReceiverResult.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/allocation/AllocationGroupReceiverResult.java @@ -26,9 +26,6 @@ public class AllocationGroupReceiverResult { @Schema(description = "接收方编号") private String receiverNo; - @Schema(description = "接收方账号别名") - private String name; - @Schema(description = "分账比例(万分之多少)") private Integer rate; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/allocation/AllocationOrderInfoDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/allocation/AllocationOrderInfoDto.java new file mode 100644 index 00000000..15cb8c87 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/allocation/AllocationOrderInfoDto.java @@ -0,0 +1,16 @@ +package cn.daxpay.single.service.dto.order.allocation; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * + * @author xxm + * @since 2024/5/29 + */ +@Data +@Accessors(chain = true) +@Schema(title = "") +public class AllocationOrderInfoDto { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/pay/PayOrderDetailDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/pay/PayOrderInfoDto.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/pay/PayOrderDetailDto.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/pay/PayOrderInfoDto.java index 1cdb8b79..e7ad6ab1 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/pay/PayOrderDetailDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/pay/PayOrderInfoDto.java @@ -10,7 +10,7 @@ import lombok.Data; */ @Data @Schema(title = "支付订单和扩展信息") -public class PayOrderDetailDto { +public class PayOrderInfoDto { @Schema(description = "支付订单") private PayOrderDto payOrder; @Schema(description = "支付订单扩展信息") diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/param/allocation/receiver/AllocationReceiverQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/param/allocation/receiver/AllocationReceiverQuery.java index d68f03a7..4a0d81e2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/param/allocation/receiver/AllocationReceiverQuery.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/param/allocation/receiver/AllocationReceiverQuery.java @@ -16,10 +16,6 @@ import lombok.Setter; @Setter public class AllocationReceiverQuery { - @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) - @Schema(description = "账号别名") - private String name; - @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) @Schema(description = "接收方编号") private String receiverNo; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/task/AllocationAutoStartTask.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/task/AllocationAutoStartTask.java index 87750c3b..11cb2b51 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/task/AllocationAutoStartTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/task/AllocationAutoStartTask.java @@ -25,7 +25,7 @@ public class AllocationAutoStartTask implements Job { private final AllocationService allocationService; @Override - public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + public void execute(JobExecutionContext jobExecutionContext) { for (PayOrder payOrder : payOrderManager.findAutoAllocation()) { AllocationParam param = new AllocationParam(); param.setBizAllocationNo(OrderNoGenerateUtil.allocation()); @@ -35,8 +35,6 @@ public class AllocationAutoStartTask implements Job { log.warn("自动分账失败, 支付订单号: {}", payOrder.getOrderNo()); log.warn("自动分账失败:{}", e.getMessage()); } - } - } }