feat(transaction): 重构分账逻辑

- 移除商户、代理、达人分账中的冗余参数
- 优化分账明细的创建和插入逻辑
- 更新雪片算法生成唯一标识
-调整易生支付请求参数生成方式
- 移除未使用的字段和方法
This commit is contained in:
huk 2025-09-11 09:46:26 +08:00
parent 65f99d7a44
commit cc5a87ab76
14 changed files with 129 additions and 105 deletions

View File

@ -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<List<SysTenantPackageVo>> selectList() {
return R.ok(tenantPackageService.selectList());
@GetMapping("/selectList/{tenantType}")
public R<List<SysTenantPackageVo>> selectList(@PathVariable("tenantType") Integer tenantType) {
return R.ok(tenantPackageService.selectList(tenantType));
}
/**

View File

@ -97,12 +97,6 @@ public class SysTenant extends BaseEntity {
@Schema(description = "联系人手机号")
private String contactPhone;
/**
* 分账比例
*/
private BigDecimal divideRate;
/**
* 是否承担手续费
*/

View File

@ -31,6 +31,11 @@ public class SysTenantPackage extends BaseEntity {
*/
private String packageName;
/**
* 适用租户类型 2->商家,3->代理,5->达人
*/
private Integer tenantType;
/**
* 关联菜单id
*/

View File

@ -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
*/

View File

@ -37,6 +37,11 @@ public class SysTenantPackageVo implements Serializable {
@ExcelProperty(value = "套餐名称")
private String packageName;
/**
* 适用租户类型 2->商家,3->代理,5->达人
*/
private Integer tenantType;
/**
* 关联菜单id
*/

View File

@ -165,13 +165,6 @@ public class SysTenantVo implements Serializable {
@Schema(description = "分账是否承担手续费")
private Integer bearFeeFlag;
/**
* 分账比例
*/
@Schema(description = "分账比例")
private BigDecimal divideRate;
/**
* 创建部门
*/

View File

@ -28,7 +28,7 @@ public interface ISysTenantPackageService {
/**
* 查询租户套餐已启用列表
*/
List<SysTenantPackageVo> selectList();
List<SysTenantPackageVo> selectList(Integer tenantType);
/**
* 查询租户套餐列表

View File

@ -57,9 +57,10 @@ public class SysTenantPackageServiceImpl implements ISysTenantPackageService {
}
@Override
public List<SysTenantPackageVo> selectList() {
public List<SysTenantPackageVo> selectList(Integer tenantType) {
return baseMapper.selectVoList(new LambdaQueryWrapper<SysTenantPackage>()
.eq(SysTenantPackage::getStatus, SystemConstants.NORMAL));
.eq(SysTenantPackage::getStatus, SystemConstants.NORMAL)
.eq(SysTenantPackage::getTenantType, tenantType));
}
/**

View File

@ -15,6 +15,11 @@ import lombok.NoArgsConstructor;
@Builder
public class SeparateItemBO {
/**
* 分账明细id
*/
private Long divideDetailId;
/**
* 分账子单流水号

View File

@ -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;
}
}

View File

@ -79,7 +79,6 @@ public class DivideDetail extends BaseAudit {
/**
* 账户类型 1 平台 2 商户 3 代理人
* */
private Integer type;
/**

View File

@ -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;

View File

@ -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<DivideMapper, Divide> implements IDivideService {
private final DivideDetailMapper detailMapper;
private final DivideDetailConvert detailConvert;
private final DivideConvert divideConvert;
@ -97,6 +96,7 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> impleme
private final UserMemberService userMemberService;
private final EasypayConfig easypayConfig;
private final DivideDetailMapper divideDetailMapper;
@Override
@ -119,7 +119,7 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> 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<DivideMapper, Divide> impleme
@Transactional(rollbackFor = Exception.class)
public boolean removeById(Serializable id) {
// 根据主分账记录的 ID 删除对应的分账明细
boolean detailRemoveResult = detailMapper.delete(new QueryWrapper<DivideDetail>().lambda().eq(DivideDetail::getDivideId, id)) > 0;
boolean detailRemoveResult = divideDetailMapper.delete(new QueryWrapper<DivideDetail>().lambda().eq(DivideDetail::getDivideId, id)) > 0;
if (!detailRemoveResult) {
log.error("分账明细信息删除失败,分账记录 ID: {}", id);
return false;
@ -153,8 +153,8 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> impleme
if (divide == null) {
return null;
}
detailMapper.selectByDivideId(divideId);
List<DivideDetail> detailList = detailMapper.selectByDivideId(divideId);
divideDetailMapper.selectByDivideId(divideId);
List<DivideDetail> detailList = divideDetailMapper.selectByDivideId(divideId);
divide.setDetails(detailConvert.toVO(detailList));
return divide;
}
@ -177,7 +177,7 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> 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<DivideMapper, Divide> 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<DivideDetail> detailList = new ArrayList<>();
List<SeparateItemBO> separateItemBOList = new ArrayList<>();
// 从租户信息得到商户的分账比例,先分给商户
Sku sku = skuMapper.selectById(orderItem.getSkuId());
@ -216,30 +215,26 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> 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<DivideMapper, Divide> 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<DivideMapper, Divide> 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<DivideDetail> detailList,
List<SeparateItemBO> separateItemBOList) {
private void divideSeller(Order order, BigDecimal totalAmount, DivideRuleDetailVO ruleDetailVO, Long divideId, SysTenantVo tenant, List<SeparateItemBO> 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<DivideDetail> detailList, List<SeparateItemBO> separateItemBOList) {
private void divideProxy(Order order, BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, Long createDept, List<SeparateItemBO> 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<DivideMapper, Divide> 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<DivideDetail> detailList, List<SeparateItemBO> separateItemBOList) {
private void divideReference(Order order, BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, Long memberId, List<SeparateItemBO> 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<DivideMapper, Divide> 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<DivideDetail> detailList, List<SeparateItemBO> separateItemBOList) {
/**
* 平台分账
*
* @param order
* @param totalAmount
* @param rule
* @param divideId
* @param separateItemBOList
*/
private void dividePlatform(Order order, BigDecimal totalAmount, DivideRuleDetailVO rule, Long divideId, List<SeparateItemBO> 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<DivideMapper, Divide> 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

View File

@ -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();