feat(transaction): 重构分账逻辑
- 移除商户、代理、达人分账中的冗余参数 - 优化分账明细的创建和插入逻辑 - 更新雪片算法生成唯一标识 -调整易生支付请求参数生成方式 - 移除未使用的字段和方法
This commit is contained in:
parent
65f99d7a44
commit
cc5a87ab76
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -97,12 +97,6 @@ public class SysTenant extends BaseEntity {
|
||||
@Schema(description = "联系人手机号")
|
||||
private String contactPhone;
|
||||
|
||||
|
||||
/**
|
||||
* 分账比例
|
||||
*/
|
||||
private BigDecimal divideRate;
|
||||
|
||||
/**
|
||||
* 是否承担手续费
|
||||
*/
|
||||
|
@ -31,6 +31,11 @@ public class SysTenantPackage extends BaseEntity {
|
||||
*/
|
||||
private String packageName;
|
||||
|
||||
/**
|
||||
* 适用租户类型 2->商家,3->代理,5->达人
|
||||
*/
|
||||
private Integer tenantType;
|
||||
|
||||
/**
|
||||
* 关联菜单id
|
||||
*/
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -37,6 +37,11 @@ public class SysTenantPackageVo implements Serializable {
|
||||
@ExcelProperty(value = "套餐名称")
|
||||
private String packageName;
|
||||
|
||||
/**
|
||||
* 适用租户类型 2->商家,3->代理,5->达人
|
||||
*/
|
||||
private Integer tenantType;
|
||||
|
||||
/**
|
||||
* 关联菜单id
|
||||
*/
|
||||
|
@ -165,13 +165,6 @@ public class SysTenantVo implements Serializable {
|
||||
@Schema(description = "分账是否承担手续费")
|
||||
private Integer bearFeeFlag;
|
||||
|
||||
/**
|
||||
* 分账比例
|
||||
*/
|
||||
@Schema(description = "分账比例")
|
||||
private BigDecimal divideRate;
|
||||
|
||||
|
||||
/**
|
||||
* 创建部门
|
||||
*/
|
||||
|
@ -28,7 +28,7 @@ public interface ISysTenantPackageService {
|
||||
/**
|
||||
* 查询租户套餐已启用列表
|
||||
*/
|
||||
List<SysTenantPackageVo> selectList();
|
||||
List<SysTenantPackageVo> selectList(Integer tenantType);
|
||||
|
||||
/**
|
||||
* 查询租户套餐列表
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -15,6 +15,11 @@ import lombok.NoArgsConstructor;
|
||||
@Builder
|
||||
public class SeparateItemBO {
|
||||
|
||||
/**
|
||||
* 分账明细id
|
||||
*/
|
||||
private Long divideDetailId;
|
||||
|
||||
|
||||
/**
|
||||
* 分账子单流水号
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -79,7 +79,6 @@ public class DivideDetail extends BaseAudit {
|
||||
/**
|
||||
* 账户类型 1 平台 2 商户 3 代理人
|
||||
* */
|
||||
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user