diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysTenantPackageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysTenantPackageController.java index 151cb0de0..1e0764b67 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysTenantPackageController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysTenantPackageController.java @@ -51,13 +51,14 @@ public class SysTenantPackageController extends BaseController { } /** - * 查询租户套餐下拉选列表 + * 查询适用租户类型的租户套餐下拉选列表 + * @param tenantType 适用租户类型 2->商家,3->代理,5->达人 */ // @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) // @SaCheckPermission("system:tenantPackage:list") - @GetMapping("/selectList") - public R> selectList() { - return R.ok(tenantPackageService.selectList()); + @GetMapping("/selectList/{tenantType}") + public R> selectList(@PathVariable("tenantType") Integer tenantType) { + return R.ok(tenantPackageService.selectList(tenantType)); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java index 3ca6e4217..4d005a4a1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java @@ -97,12 +97,6 @@ public class SysTenant extends BaseEntity { @Schema(description = "联系人手机号") private String contactPhone; - - /** - * 分账比例 - */ - private BigDecimal divideRate; - /** * 是否承担手续费 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java index 5f58e3eca..cc25a96a5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java @@ -31,6 +31,11 @@ public class SysTenantPackage extends BaseEntity { */ private String packageName; + /** + * 适用租户类型 2->商家,3->代理,5->达人 + */ + private Integer tenantType; + /** * 关联菜单id */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java index eecbc9f53..6c6e5df80 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java @@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; import org.dromara.common.mybatis.core.domain.BaseEntity; +import software.amazon.awssdk.services.s3.endpoints.internal.Value; /** * 租户套餐业务对象 sys_tenant_package @@ -34,6 +35,12 @@ public class SysTenantPackageBo extends BaseEntity { @NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class }) private String packageName; + /** + * 适用租户类型 2->商家,3->代理,5->达人 + */ + @NotBlank(message = "适用租户类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tenantType; + /** * 关联菜单id */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java index 070334b41..8c1227f95 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java @@ -37,6 +37,11 @@ public class SysTenantPackageVo implements Serializable { @ExcelProperty(value = "套餐名称") private String packageName; + /** + * 适用租户类型 2->商家,3->代理,5->达人 + */ + private Integer tenantType; + /** * 关联菜单id */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java index effd6af9d..7d44ea928 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java @@ -165,13 +165,6 @@ public class SysTenantVo implements Serializable { @Schema(description = "分账是否承担手续费") private Integer bearFeeFlag; - /** - * 分账比例 - */ - @Schema(description = "分账比例") - private BigDecimal divideRate; - - /** * 创建部门 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java index d060b68cd..0db58e208 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java @@ -28,7 +28,7 @@ public interface ISysTenantPackageService { /** * 查询租户套餐已启用列表 */ - List selectList(); + List selectList(Integer tenantType); /** * 查询租户套餐列表 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java index 8d69e96ea..7d036b782 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -57,9 +57,10 @@ public class SysTenantPackageServiceImpl implements ISysTenantPackageService { } @Override - public List selectList() { + public List selectList(Integer tenantType) { return baseMapper.selectVoList(new LambdaQueryWrapper() - .eq(SysTenantPackage::getStatus, SystemConstants.NORMAL)); + .eq(SysTenantPackage::getStatus, SystemConstants.NORMAL) + .eq(SysTenantPackage::getTenantType, tenantType)); } /** diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/SeparateItemBO.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/SeparateItemBO.java index ecb28803f..807c751e2 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/SeparateItemBO.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/SeparateItemBO.java @@ -15,6 +15,11 @@ import lombok.NoArgsConstructor; @Builder public class SeparateItemBO { + /** + * 分账明细id + */ + private Long divideDetailId; + /** * 分账子单流水号 diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/easypay/trade/jsapi/req/SeparateInfo.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/easypay/trade/jsapi/req/SeparateInfo.java index 77e9ec070..6c45adbaf 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/easypay/trade/jsapi/req/SeparateInfo.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/bo/easypay/trade/jsapi/req/SeparateInfo.java @@ -47,14 +47,6 @@ public class SeparateInfo { @Builder public static class SeparateOrderDetailList { - /** - * 分账订单标题 - */ - private String body; - /** - * 分账D0标识,D0需提前开通 - */ - private DelaySettleFlag isD0; /** * 分账收款方商户号,可以商户号或分账接收方编号 */ @@ -73,9 +65,5 @@ public class SeparateInfo { */ private String separateTrade; - /** - * 分账订单描述 - */ - private String subject; } } diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/po/DivideDetail.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/po/DivideDetail.java index c8d9db867..5467e89df 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/po/DivideDetail.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/domain/po/DivideDetail.java @@ -79,7 +79,6 @@ public class DivideDetail extends BaseAudit { /** * 账户类型 1 平台 2 商户 3 代理人 * */ - private Integer type; /** diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/DivideRuleServiceImpl.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/DivideRuleServiceImpl.java index a47a3da6b..6d78fe477 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/DivideRuleServiceImpl.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/DivideRuleServiceImpl.java @@ -23,7 +23,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; -import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.stream.Collectors; diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/DivideServiceImpl.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/DivideServiceImpl.java index aae9dbbb3..e54765ef2 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/DivideServiceImpl.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/DivideServiceImpl.java @@ -4,10 +4,10 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.StrBuilder; import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.wzj.soopin.content.mapper.UserMemberMapper; import com.wzj.soopin.content.service.UserMemberService; import com.wzj.soopin.goods.domain.entity.Sku; import com.wzj.soopin.goods.mapper.SkuMapper; @@ -38,15 +38,16 @@ import com.wzj.soopin.transaction.service.IDivideRuleService; import com.wzj.soopin.transaction.service.IDivideService; import com.wzj.soopin.transaction.service.IEasypayService; import com.wzj.soopin.transaction.service.PayOrderService; +import com.wzj.soopin.transaction.util.SnowFlake; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.enums.TenantType; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysTenant; import org.dromara.system.domain.SysTenantExtend; import org.dromara.system.domain.vo.SysTenantVo; import org.dromara.system.mapper.SysTenantExtendMapper; -import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysTenantService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -70,8 +71,6 @@ import static com.wzj.soopin.transaction.constans.EasypayConstants.TRACE_PREFIX; @Slf4j public class DivideServiceImpl extends ServiceImpl implements IDivideService { - private final DivideDetailMapper detailMapper; - private final DivideDetailConvert detailConvert; private final DivideConvert divideConvert; @@ -97,6 +96,7 @@ public class DivideServiceImpl extends ServiceImpl impleme private final UserMemberService userMemberService; private final EasypayConfig easypayConfig; + private final DivideDetailMapper divideDetailMapper; @Override @@ -119,7 +119,7 @@ public class DivideServiceImpl extends ServiceImpl impleme .map(detailConvert::toPo) .toList(); - boolean detailResult = detailMapper.insertBatch(detailEntities); + boolean detailResult = divideDetailMapper.insertBatch(detailEntities); if (!detailResult) { throw new ServiceException("分账主信息保存失败,DivideBO: {}"); } @@ -131,7 +131,7 @@ public class DivideServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = Exception.class) public boolean removeById(Serializable id) { // 根据主分账记录的 ID 删除对应的分账明细 - boolean detailRemoveResult = detailMapper.delete(new QueryWrapper().lambda().eq(DivideDetail::getDivideId, id)) > 0; + boolean detailRemoveResult = divideDetailMapper.delete(new QueryWrapper().lambda().eq(DivideDetail::getDivideId, id)) > 0; if (!detailRemoveResult) { log.error("分账明细信息删除失败,分账记录 ID: {}", id); return false; @@ -153,8 +153,8 @@ public class DivideServiceImpl extends ServiceImpl impleme if (divide == null) { return null; } - detailMapper.selectByDivideId(divideId); - List detailList = detailMapper.selectByDivideId(divideId); + divideDetailMapper.selectByDivideId(divideId); + List detailList = divideDetailMapper.selectByDivideId(divideId); divide.setDetails(detailConvert.toVO(detailList)); return divide; } @@ -177,7 +177,7 @@ public class DivideServiceImpl extends ServiceImpl impleme Order order = orderService.getById(orderId); Assert.notNull(order, () -> new ServiceException("订单不存在")); Assert.isTrue(Objects.equals(order.getStatus(), OrderStatusEnum.PAID.getValue()), () -> new ServiceException("订单未支付")); - PayOrder payOrder = payOrderService.getById(order.getPayId()); + PayOrder payOrder = TenantHelper.ignore(() -> payOrderService.getById(order.getPayId())); Assert.notNull(payOrder, () -> new ServiceException("支付单不存在")); Assert.isTrue(payOrder.getTransState() == TransState.PAID.getCode(), () -> new ServiceException("订单未支付")); Assert.isFalse(this.exists(Wrappers.lambdaQuery(Divide.class).eq(Divide::getOrderId, orderId)), () -> new ServiceException("已存在分账记录,无需再次分账")); @@ -200,13 +200,12 @@ public class DivideServiceImpl extends ServiceImpl impleme .orderSn(order.getOrderSn()) .orderItemId(orderItemId) .orderItemMoney(totalAmount) - .separateBatchTrace(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + .separateBatchTrace(StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString()) .status(DivideStatus.PENDING.getCode()) .build(); super.save(divide); } Long divideId = divide.getId(); - List detailList = new ArrayList<>(); List separateItemBOList = new ArrayList<>(); // 从租户信息得到商户的分账比例,先分给商户 Sku sku = skuMapper.selectById(orderItem.getSkuId()); @@ -216,30 +215,26 @@ public class DivideServiceImpl extends ServiceImpl impleme .filter(item -> item.getType() == TenantType.MERCHANT.getType()) .findFirst() .ifPresent(ruleDetailVO -> { - DivideDetail sellerDivideDetail = divideSeller(totalAmount, ruleDetailVO, divideId, merchantTenant, detailList, separateItemBOList); - detailList.add(sellerDivideDetail); + divideSeller(order, totalAmount, ruleDetailVO, divideId, merchantTenant, separateItemBOList); }); // 商户分完后分给代理和达人,最后剩余都给平台 rule.getDetails().stream() .filter(item -> item.getType() == TenantType.AGENT.getType()) .findFirst() .ifPresent(ruleDetailVO -> { - DivideDetail divideProxy = divideProxy(totalAmount, ruleDetailVO, divideId, merchantTenant.getCreateDept(), detailList, separateItemBOList); - detailList.add(divideProxy); + divideProxy(order, totalAmount, ruleDetailVO, divideId, merchantTenant.getCreateDept(), separateItemBOList); }); rule.getDetails().stream() .filter(item -> item.getType() == TenantType.REFERENCE.getType()) .findFirst() .ifPresent(ruleDetailVO -> { - DivideDetail divideReference = divideReference(totalAmount, ruleDetailVO, divideId, order.getMemberId(), detailList, separateItemBOList); - detailList.add(divideReference); + divideReference(order, totalAmount, ruleDetailVO, divideId, order.getMemberId(), separateItemBOList); }); rule.getDetails().stream() .filter(item -> item.getType() == TenantType.PLATFORM.getType()) .findFirst() .ifPresent(ruleDetailVO -> { - DivideDetail dividePlatform = dividePlatform(totalAmount, ruleDetailVO, divideId, detailList, separateItemBOList); - detailList.add(dividePlatform); + dividePlatform(order, totalAmount, ruleDetailVO, divideId, separateItemBOList); }); // 调用易生支付实时分账 SeparateApplyBO separateApplyBO = SeparateApplyBO.builder() @@ -252,6 +247,8 @@ public class DivideServiceImpl extends ServiceImpl impleme .separateBatchTrace(String.valueOf(divide.getId())) .separateItemBOList(separateItemBOList) .build(); +// String sss = "{\"divideId\":1965718953028759554,\"orderId\":1965688269369024513,\"payId\":1965688289677844482,\"separateBatchTrace\":\"1965718953028759554\",\"separateItemBOList\":[{\"divideDetailId\":1965718953473355777,\"receiveMchtCode\":\"KK0000000000985\",\"sepaFeeRatio\":95,\"sepaRatio\":95,\"separateTrade\":\"WZJ_1965718953460236288\"},{\"divideDetailId\":1965718953515298817,\"receiveMchtCode\":\"631000000003325\",\"sepaFeeRatio\":5,\"sepaRatio\":5,\"separateTrade\":\"WZJ_1965718953514762240\"}],\"transDate\":\"2025-09-10 16:06:33\",\"transSumAmt\":100,\"transSumCount\":2}"; +// separateApplyBO = JSONObject.parseObject(sss, SeparateApplyBO.class); easypayService.separateApply(separateApplyBO); } } @@ -259,62 +256,69 @@ public class DivideServiceImpl extends ServiceImpl impleme /** * 商户分账 * + * @param order * @param totalAmount 总金额 * @param ruleDetailVO 分账规则详情 * @param divideId 分账总表id * @param tenant 商户所属租户 - * @param detailList 分账详情 * @param separateItemBOList 分账请求详情项 */ - private DivideDetail divideSeller(BigDecimal totalAmount, DivideRuleDetailVO ruleDetailVO, Long divideId, SysTenantVo tenant, - List detailList, - List separateItemBOList) { + private void divideSeller(Order order, BigDecimal totalAmount, DivideRuleDetailVO ruleDetailVO, Long divideId, SysTenantVo tenant, List separateItemBOList) { //获取商户的账户信息 String mchtCode = getMchtCode(tenant.getTenantId()); + // TODO 商户的分账百分比占比值从模板中获取,联调易生暂时写死 + int divideRate = 95; //计算商户的分账金额 - BigDecimal divideRate = tenant.getDivideRate(); - //计算商户的分账金额 - BigDecimal sellerAmount = totalAmount.multiply(divideRate).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP); + BigDecimal sellerAmount = totalAmount.multiply(BigDecimal.valueOf(divideRate)).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP); + String separateTrade = StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString(); //生成商户的分账明细 - DivideDetail sellerDetail = DivideDetail.builder() + DivideDetail divideDetail = DivideDetail.builder() + .separateTrade(separateTrade) .divideId(divideId) + .ruleDetailId(ruleDetailVO.getId()) + .orderId(order.getId()) + .orderSn(order.getOrderSn()) .accountCode(mchtCode) .money(sellerAmount) - .moneyPercent(divideRate.intValue()) + .moneyPercent(divideRate) .feePercent(ruleDetailVO.getFeePercent()) .type(DivideRuleDetailType.SELLER.getValue()) .status(DivideStatus.PENDING.getCode()) .build(); - detailMapper.insert(sellerDetail); - detailList.add(sellerDetail); - separateItemBOList.add(SeparateItemBO.builder() - .separateTrade(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + divideDetailMapper.insert(divideDetail); + SeparateItemBO separateItemBO = SeparateItemBO.builder() + .divideDetailId(divideDetail.getId()) + .separateTrade(separateTrade) .receiveMchtCode(mchtCode) - .sepaRatio(divideRate.longValue()) + .sepaRatio((long) divideRate) .sepaFeeRatio(Long.valueOf(ruleDetailVO.getFeePercent())) - .build()); - return sellerDetail; + .build(); + separateItemBOList.add(separateItemBO); } /** * 代理商分账 * + * @param order * @param totalAmount 总金额 * @param rule 代理商的分账规则详情 * @param divideId 分账总表id * @param createDept 创建该商铺租户的部门,用于获取代理商的租户 - * @param detailList * @param separateItemBOList - * @return */ - private DivideDetail divideProxy(BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, Long createDept, List detailList, List separateItemBOList) { + private void divideProxy(Order order, BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, Long createDept, List separateItemBOList) { //获取代理人的账户信息 SysTenant proxyTenant = sysTenantService.queryByDeptId(createDept); String mchtCode = getMchtCode(proxyTenant.getTenantId()); //计算代理人的分账金额 BigDecimal proxyAmount = BigDecimal.valueOf(rule.getMoneyPercent()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).multiply(totalAmount); - DivideDetail proxyDetail = DivideDetail.builder() + String separateTrade = StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString(); + DivideDetail divideDetail = DivideDetail.builder() + .separateTrade(separateTrade) .divideId(divideId) + .ruleDetailId(rule.getId()) + .orderId(order.getId()) + .orderSn(order.getOrderSn()) .accountCode(mchtCode) .money(proxyAmount) .moneyPercent(rule.getMoneyPercent()) @@ -322,35 +326,40 @@ public class DivideServiceImpl extends ServiceImpl impleme .type(DivideRuleDetailType.PROXY.getValue()) .status(DivideStatus.PENDING.getCode()) .build(); - detailMapper.insert(proxyDetail); - detailList.add(proxyDetail); - separateItemBOList.add(SeparateItemBO.builder() - .separateTrade(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + divideDetailMapper.insert(divideDetail); + SeparateItemBO separateItemBO = SeparateItemBO.builder() + .divideDetailId(divideDetail.getId()) + .separateTrade(separateTrade) .receiveMchtCode(mchtCode) .sepaRatio(Long.valueOf(rule.getMoneyPercent())) .sepaFeeRatio(Long.valueOf(rule.getFeePercent())) - .build()); - return proxyDetail; + .build(); + separateItemBOList.add(separateItemBO); + } /** * 达人分账 * + * @param order * @param totalAmount * @param rule * @param divideId * @param memberId - * @param detailList * @param separateItemBOList - * @return */ - private DivideDetail divideReference(BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, Long memberId, List detailList, List separateItemBOList) { + private void divideReference(Order order, BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, Long memberId, List separateItemBOList) { //获取达人的账户信息 String mchtCode = getMchtCodeByMemberId(memberId); //计算达人的分账金额 BigDecimal referencAmount = BigDecimal.valueOf(rule.getMoneyPercent()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).multiply(totalAmount); - DivideDetail referenceDetail = DivideDetail.builder() + String separateTrade = StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString(); + DivideDetail divideDetail = DivideDetail.builder() + .separateTrade(separateTrade) .divideId(divideId) + .ruleDetailId(rule.getId()) + .orderId(order.getId()) + .orderSn(order.getOrderSn()) .accountCode(mchtCode) .money(referencAmount) .moneyPercent(rule.getMoneyPercent()) @@ -358,25 +367,40 @@ public class DivideServiceImpl extends ServiceImpl impleme .type(DivideRuleDetailType.REFERENCE.getValue()) .status(DivideStatus.PENDING.getCode()) .build(); - detailMapper.insert(referenceDetail); - detailList.add(referenceDetail); - separateItemBOList.add(SeparateItemBO.builder() - .separateTrade(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + divideDetailMapper.insert(divideDetail); + SeparateItemBO separateItemBO = SeparateItemBO.builder() + .divideDetailId(divideDetail.getId()) + .separateTrade(separateTrade) .receiveMchtCode(mchtCode) .sepaRatio(Long.valueOf(rule.getMoneyPercent())) .sepaFeeRatio(Long.valueOf(rule.getFeePercent())) - .build()); - return referenceDetail; + .build(); + separateItemBOList.add(separateItemBO); + } - private DivideDetail dividePlatform(BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, List detailList, List separateItemBOList) { + /** + * 平台分账 + * + * @param order + * @param totalAmount + * @param rule + * @param divideId + * @param separateItemBOList + */ + private void dividePlatform(Order order, BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, List separateItemBOList) { //获取平台的账户信息 String mchtCode = easypayConfig.getMchtCode(); //计算平台的分账金额 BigDecimal platformAmount = BigDecimal.valueOf(rule.getMoneyPercent()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).multiply(totalAmount); - DivideDetail platformDetail = DivideDetail.builder() + String separateTrade = StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString(); + DivideDetail divideDetail = DivideDetail.builder() + .separateTrade(separateTrade) .divideId(divideId) + .ruleDetailId(rule.getId()) + .orderId(order.getId()) + .orderSn(order.getOrderSn()) .accountCode(mchtCode) .money(platformAmount) .moneyPercent(rule.getMoneyPercent()) @@ -384,15 +408,15 @@ public class DivideServiceImpl extends ServiceImpl impleme .type(DivideRuleDetailType.PLATFORM.getValue()) .status(DivideStatus.PENDING.getCode()) .build(); - detailMapper.insert(platformDetail); - detailList.add(platformDetail); - separateItemBOList.add(SeparateItemBO.builder() - .separateTrade(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + divideDetailMapper.insert(divideDetail); + SeparateItemBO separateItemBO = SeparateItemBO.builder() + .divideDetailId(divideDetail.getId()) + .separateTrade(separateTrade) .receiveMchtCode(mchtCode) .sepaRatio(Long.valueOf(rule.getMoneyPercent())) .sepaFeeRatio(Long.valueOf(rule.getFeePercent())) - .build()); - return platformDetail; + .build(); + separateItemBOList.add(separateItemBO); } @Override diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/EasypayServiceImpl.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/EasypayServiceImpl.java index 672fc2b69..60afd5150 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/EasypayServiceImpl.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/EasypayServiceImpl.java @@ -56,10 +56,12 @@ import com.wzj.soopin.transaction.enums.DivideRuleStatus; import com.wzj.soopin.transaction.enums.DivideStatus; import com.wzj.soopin.transaction.enums.TransState; import com.wzj.soopin.transaction.enums.easypay.*; +import com.wzj.soopin.transaction.mapper.DivideDetailMapper; import com.wzj.soopin.transaction.mapper.DivideMapper; import com.wzj.soopin.transaction.mapper.DivideRuleMapper; import com.wzj.soopin.transaction.mapper.PayOrderMapper; import com.wzj.soopin.transaction.service.IEasypayService; +import com.wzj.soopin.transaction.util.SnowFlake; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.enums.FormatsType; @@ -103,8 +105,7 @@ public class EasypayServiceImpl implements IEasypayService { private final DivideMapper divideMapper; - private final DivideRuleMapper divideRuleMapper; - private final ConfigService configService; + private final DivideDetailMapper divideDetailMapper; /** @@ -409,7 +410,7 @@ public class EasypayServiceImpl implements IEasypayService { .reqInfo(ReqInfo.builder().mchtCode(easypayConfig.getMchtCode()).build()) .payInfo(PayInfo.builder().transDate(DateUtils.parseDateToStr(FormatsType.YYYYMMDD, new Date())).build()) .reqOrderInfo(TradeQueryReqBody.ReqOrderInfo.builder() - .orgTrace(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + .orgTrace(StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString()) .oriOrgTrace(String.valueOf(order.getPayId())) .oriTransDate(DateUtils.parseDateToStr(FormatsType.YYYYMMDD, payOrder.getStartTransDate())) .build()) @@ -530,7 +531,7 @@ public class EasypayServiceImpl implements IEasypayService { .reqInfo(ReqInfo.builder().mchtCode(easypayConfig.getMchtCode()).build()) .payInfo(PayInfo.builder().transDate(DateUtils.parseDateToStr(FormatsType.YYYYMMDD, new Date())).build()) .reqOrderInfo(RefundReqOrderInfo.builder() - .orgTrace(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + .orgTrace(StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString()) .oriOrgTrace(String.valueOf(order.getPayId())) .oriTransDate(DateUtils.parseDateToStr(FormatsType.YYYYMMDD, payOrder.getEndTransDate())) .refundAmount(payOrder.getTransAmount()) @@ -594,7 +595,7 @@ public class EasypayServiceImpl implements IEasypayService { .reqInfo(ReqInfo.builder().mchtCode(easypayConfig.getMchtCode()).build()) .payInfo(PayInfo.builder().transDate(DateUtils.parseDateToStr(FormatsType.YYYYMMDD, new Date())).build()) .reqOrderInfo(RefundReqOrderInfo.builder() - .orgTrace(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + .orgTrace(StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString()) .oriOrgTrace(String.valueOf(order.getPayId())) .oriTransDate(DateUtils.parseDateToStr(FormatsType.YYYYMMDD, payOrder.getEndTransDate())) .refundAmount(payOrder.getTransAmount()) @@ -666,6 +667,7 @@ public class EasypayServiceImpl implements IEasypayService { .body(JSON.toJSONString(easyRequest)) .execute() .body(); +// String body = "{\"rspBody\":{\"respStateInfo\":{\"respDesc\":\"结算域处理成功\",\"transStatusDesc\":\"成功\",\"transState\":\"0\",\"respCode\":\"000000\"},\"respOrderInfo\":{\"separateBatchTrace\":\"1965718953028759554\",\"batchNum\":2,\"separateRespInfoList\":[{\"sepaStatusDesc\":\"分账成功\",\"separateTrade\":\"WZJ_1965718953460236288\",\"sepaFeeRatio\":950000,\"sepaTransAmount\":95,\"sepaPlatStlmAmount\":95,\"sepaStatus\":\"0\",\"sepaStlmAmount\":94,\"sepaRatio\":950000,\"receiveMchtCode\":\"KK0000000000985\"},{\"sepaStatusDesc\":\"分账成功\",\"separateTrade\":\"WZJ_1965718953514762240\",\"sepaFeeRatio\":50000,\"sepaTransAmount\":5,\"sepaPlatStlmAmount\":5,\"sepaStatus\":\"0\",\"sepaStlmAmount\":5,\"sepaRatio\":50000,\"receiveMchtCode\":\"631000000003325\"}],\"productTrace\":\"YQ20250910174300269926\",\"batchTransAmount\":100}},\"rspHeader\":{\"easyPayCertificateId\":\"00000000\",\"rspCode\":\"000000\",\"rspInfo\":\"SUCCESS\"},\"rspSign\":\"VqMb/QGAW1JfL7iAT2HoUP9hbyDah8StIAUJCG9IFvpUC8vSGSBsRIMb/sKUFkBh2oYmNDXkZeD/NRhy1vc8Fe1uZZQAwTUo77fect7FcfxnoYFUHmTrEhekJaozObU8Ks3v2WJ2XDDIk7m4D0uX0dm5cZ25ml4xGf67Y+HN6n0ZF31ESFz9hPARDflumSFAcYf0Inw/3oybU0OBUkLDtT+Mi3cLVShdLmtzvcf6cR2p8k3jUpbyd+eDtQ8FPnkhQP8QmnkDF944VmARlexrS+BqBt5XtcXyL5qLXpj0wm0/ps9mK7c2ZWJt5pjgYTi5w4h0TL9JuEFoVESg33Otkg==\"}"; log.debug("调用易生请求分账接口响应:{}", body); EasyPayResponse easyPayResponse = JSONObject.parseObject(body, EasyPayResponse.class); if (StrUtil.equals(RSP_HEADER_OK, easyPayResponse.getRspHeader().getRspCode())) { @@ -704,7 +706,7 @@ public class EasypayServiceImpl implements IEasypayService { String separateTrade = separateRespInfo.getSeparateTrade(); SeparateItemBO separateItemBO = separateItemBOMap.get(separateTrade); DivideDetail divideDetail = DivideDetail.builder() - .id(Long.valueOf(separateItemBO.getSeparateTrade())) + .id(separateItemBO.getDivideDetailId()) .separateTrade(separateRespInfo.getSeparateTrade()) .build(); divideDetail.setMoney(BigDecimal.valueOf(separateRespInfo.getSepaTransAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); @@ -720,6 +722,7 @@ public class EasypayServiceImpl implements IEasypayService { } updateDetailList.add(divideDetail); }); + divideDetailMapper.updateBatchById(updateDetailList); long itemOkCount = updateDetailList.stream().filter(item -> item.getStatus() == DivideStatus.SUCCESS.getCode()) .count(); long totalSeparate = separateRespInfoList.stream().mapToLong(SeparateRespInfoList::getSepaTransAmount).sum(); @@ -788,7 +791,7 @@ public class EasypayServiceImpl implements IEasypayService { PayAccInfo payAccInfo = PayAccInfo.builder().build(); BeanUtil.copyProperties(merchantAddBO, payAccInfo); MerchantAddApplyReqBody merchantAddApplyReqBody = MerchantAddApplyReqBody.builder() - .applyInfo(ApplyInfo.builder().applyNo(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()).build()) + .applyInfo(ApplyInfo.builder().applyNo(StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString()).build()) .merchantInfo(MerchantInfo.builder().mchtName(merchantAddBO.getMchtName()).build()) .pictureList(PictureList.buildPictureList(merchantAddBO.getFrontIdCard(), merchantAddBO.getBackIdCard())) .payAccInfo(payAccInfo) @@ -832,7 +835,7 @@ public class EasypayServiceImpl implements IEasypayService { public void merchantBinding(String mchtCode) { EasyPayRequestHeader reqHeader = generateEasyPayRequestHeader(); MerchantBindingReqBody merchantBindingReqBody = MerchantBindingReqBody.builder() - .applyNo(StrBuilder.create(TRACE_PREFIX).append(System.currentTimeMillis()).append(RandomUtil.randomString(4)).toString()) + .applyNo(StrBuilder.create(TRACE_PREFIX).append(SnowFlake.getIdStr()).toString()) .customerCode(mchtCode) .mchtCode(easypayConfig.getMchtCode()) .build();