[fix]优化分账逻辑
This commit is contained in:
parent
9b33dbde98
commit
d2d8c6ee40
@ -19,16 +19,22 @@ import java.math.BigDecimal;
|
||||
@Schema(description="会员账户表 查询 对象")
|
||||
@Data
|
||||
public class MemberAccountBO extends BaseBO {
|
||||
@Schema(description ="积分余额 精确匹配")
|
||||
private BigDecimal integralBalance;
|
||||
|
||||
@Schema(description ="历史总共积分 精确匹配")
|
||||
private BigDecimal totalIntegralBalance;
|
||||
|
||||
|
||||
@Schema(description ="ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 账户类型 1 用户 2 商家 3 代理 4 平台
|
||||
*/
|
||||
private Integer type;
|
||||
|
||||
@Schema(description ="MEMBER_ID")
|
||||
private Long memberId;
|
||||
|
||||
@Schema(description ="积分余额")
|
||||
private BigDecimal integral;
|
||||
|
||||
@Schema(description ="钱包")
|
||||
private BigDecimal wallet;
|
||||
@ -36,17 +42,17 @@ public class MemberAccountBO extends BaseBO {
|
||||
@Schema(description ="营收")
|
||||
private BigDecimal revenue;
|
||||
|
||||
private String phone;
|
||||
|
||||
private String name;
|
||||
|
||||
@Schema(description ="余额")
|
||||
private BigDecimal moneyBalance;
|
||||
public LambdaQueryWrapper<MemberAccount> toWrapper() {
|
||||
LambdaQueryWrapper<MemberAccount> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(getIntegralBalance() != null,MemberAccount::getIntegralBalance, integralBalance);
|
||||
queryWrapper.eq(getTotalIntegralBalance() != null,MemberAccount::getTotalIntegralBalance, totalIntegralBalance);
|
||||
queryWrapper.eq(getMemberId() != null,MemberAccount::getMemberId, memberId)
|
||||
;
|
||||
return queryWrapper;
|
||||
return new LambdaQueryWrapper<MemberAccount>()
|
||||
.eq(MemberAccount::getId, id)
|
||||
.eq(MemberAccount::getType, type)
|
||||
.eq(MemberAccount::getMemberId, id);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -21,26 +21,29 @@ import java.math.BigDecimal;
|
||||
@Builder(toBuilder = true)
|
||||
public class MemberAccount extends BaseAudit {
|
||||
|
||||
|
||||
@Excel(name = "ID")
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Long id;
|
||||
|
||||
@Schema(description ="MEMBER_ID")
|
||||
@TableId(value="member_id")
|
||||
private Long memberId;
|
||||
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 账户类型 1 用户 2 商家 3 代理 4 平台
|
||||
*/
|
||||
private Integer type;
|
||||
|
||||
@Schema(description ="积分余额")
|
||||
private BigDecimal integralBalance;
|
||||
|
||||
@Schema(description ="历史总共积分")
|
||||
private BigDecimal totalIntegralBalance;
|
||||
|
||||
|
||||
@Schema(description ="余额")
|
||||
private BigDecimal moneyBalance;
|
||||
|
||||
private BigDecimal integral;
|
||||
|
||||
@Schema(description ="钱包")
|
||||
private BigDecimal wallet;
|
||||
private BigDecimal wallet ;
|
||||
|
||||
@Schema(description ="营收")
|
||||
private BigDecimal revenue;
|
||||
private BigDecimal revenue ;
|
||||
|
||||
|
||||
}
|
||||
|
@ -16,16 +16,8 @@ public class MemberAccountVO {
|
||||
/** MEMBER_ID */
|
||||
private Long memberId;
|
||||
/** 积分余额 */
|
||||
@Excel(name = "积分余额")
|
||||
private BigDecimal integralBalance;
|
||||
/** 历史总共积分 */
|
||||
@Excel(name = "历史总共积分")
|
||||
private BigDecimal totalIntegralBalance;
|
||||
|
||||
|
||||
@Schema(description ="余额")
|
||||
@Excel(name = "余额")
|
||||
private BigDecimal moneyBalance;
|
||||
@Excel(name = "积分")
|
||||
private BigDecimal integral ;
|
||||
|
||||
|
||||
@Schema(description ="钱包")
|
||||
@ -35,4 +27,13 @@ public class MemberAccountVO {
|
||||
@Schema(description ="营收")
|
||||
@Excel(name = "营收")
|
||||
private BigDecimal revenue;
|
||||
|
||||
@Schema(description ="id")
|
||||
private Long id;
|
||||
|
||||
@Schema(description ="name")
|
||||
private String name;
|
||||
|
||||
@Schema(description ="phone")
|
||||
private String phone;
|
||||
}
|
||||
|
@ -13,15 +13,5 @@ import java.util.List;
|
||||
* @author zcc
|
||||
*/
|
||||
public interface MemberAccountMapper extends BaseMapper<MemberAccount> {
|
||||
/**
|
||||
* 查询会员账户表列表
|
||||
*
|
||||
* @param memberAccount 会员账户表
|
||||
* @return 会员账户表集合
|
||||
*/
|
||||
List<MemberAccount> selectByEntity(MemberAccount memberAccount);
|
||||
|
||||
int updateIntegralBalance(@Param("amount") BigDecimal amount, @Param("memberId") Long memberId);
|
||||
|
||||
int updateIntegral(@Param("useIntegral") BigDecimal useIntegral, @Param("memberId") Long memberId);
|
||||
}
|
||||
|
||||
|
@ -35,17 +35,7 @@ public class MemberAccountServiceImpl extends ServiceImpl<MemberAccountMapper,Me
|
||||
* @return 会员账户表
|
||||
*/
|
||||
public IPage<MemberAccount> selectList(MemberAccountBO query, IPage page) {
|
||||
|
||||
QueryWrapper<MemberAccount> qw = new QueryWrapper<>();
|
||||
BigDecimal integralBalance = query.getIntegralBalance();
|
||||
if (integralBalance != null) {
|
||||
qw.eq("integral_balance", integralBalance);
|
||||
}
|
||||
BigDecimal totalIntegralBalance = query.getTotalIntegralBalance();
|
||||
if (totalIntegralBalance != null) {
|
||||
qw.eq("total_integral_balance", totalIntegralBalance);
|
||||
}
|
||||
return baseMapper.selectPage(page,qw);
|
||||
return baseMapper.selectPage(page,query.toWrapper());
|
||||
}
|
||||
|
||||
|
||||
|
@ -3,32 +3,4 @@
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.wzj.soopin.member.mapper.MemberAccountMapper">
|
||||
|
||||
<resultMap type="MemberAccount" id="MemberAccountResult">
|
||||
<result property="memberId" column="member_id"/>
|
||||
<result property="integralBalance" column="integral_balance"/>
|
||||
<result property="totalIntegralBalance" column="total_integral_balance"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectMemberAccountVo">
|
||||
select member_id, integral_balance, total_integral_balance, update_time, create_time from ums_member_account
|
||||
</sql>
|
||||
<update id="updateIntegralBalance">
|
||||
update ums_member_account set integral_balance = integral_balance + #{amount},total_integral_balance = total_integral_balance + #{amount},update_time = now()
|
||||
where member_id = #{memberId}
|
||||
</update>
|
||||
<update id="updateIntegral">
|
||||
update ums_member_account set integral_balance = integral_balance - #{useIntegral},update_time = now()
|
||||
where member_id = #{memberId}
|
||||
</update>
|
||||
|
||||
<select id="selectByEntity" parameterType="MemberAccount" resultMap="MemberAccountResult">
|
||||
<include refid="selectMemberAccountVo"/>
|
||||
<where>
|
||||
<if test="integralBalance != null "> and integral_balance = #{integralBalance}</if>
|
||||
<if test="totalIntegralBalance != null "> and total_integral_balance = #{totalIntegralBalance}</if>
|
||||
</where>
|
||||
</select>
|
||||
</mapper>
|
||||
|
@ -178,6 +178,7 @@ public class Order extends BaseAudit {
|
||||
@Schema(description = "提现状态:1->等待转账;2->转帐中;3->转账成功;4->转账失败")
|
||||
private Integer withdrawStatus;
|
||||
|
||||
|
||||
@Schema(description = "配送方式 1->到店核销;2->自提;3->配送;")
|
||||
private Integer distribution;
|
||||
|
||||
|
@ -129,4 +129,6 @@ public class SysTenant extends BaseEntity {
|
||||
* 入驻时间
|
||||
*/
|
||||
private LocalDateTime joinTime;
|
||||
|
||||
private Long accountId;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ public class DivideRuleController {
|
||||
@Log(title = "修改", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/update")
|
||||
public R update(@RequestBody DivideRuleBO bo) {
|
||||
service.save(convert.toPo(bo));
|
||||
service.updateById(convert.toPo(bo));
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,9 @@ public enum DivideRuleDetailType {
|
||||
/**
|
||||
* 代理
|
||||
*/
|
||||
PROXY(3, "代理");
|
||||
PROXY(3, "代理"),
|
||||
|
||||
REFERENCE(4, "推广"),;
|
||||
|
||||
private int value;
|
||||
private String desc;
|
||||
@ -32,4 +34,13 @@ public enum DivideRuleDetailType {
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public static DivideRuleDetailType getEnum(int value) {
|
||||
for (DivideRuleDetailType type : DivideRuleDetailType.values()) {
|
||||
if (type.getValue() == value) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,10 @@ package com.wzj.soopin.transaction.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.wzj.soopin.member.domain.po.Member;
|
||||
import com.wzj.soopin.member.domain.po.MemberAccount;
|
||||
import com.wzj.soopin.member.service.IMemberAccountService;
|
||||
import com.wzj.soopin.member.service.IMemberService;
|
||||
import com.wzj.soopin.order.domain.entity.Order;
|
||||
import com.wzj.soopin.order.service.OrderItemService;
|
||||
import com.wzj.soopin.order.service.OrderService;
|
||||
@ -25,6 +29,8 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.service.ConfigService;
|
||||
import org.dromara.system.domain.vo.SysTenantVo;
|
||||
import org.dromara.system.service.ISysTenantService;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@ -63,6 +69,12 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> impleme
|
||||
|
||||
private final IYishengService yishengService;
|
||||
|
||||
private final IMemberAccountService accountService;
|
||||
|
||||
private final ISysTenantService sysTenantService;
|
||||
|
||||
private final IMemberService memberService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean save(DivideBO bo) {
|
||||
@ -168,12 +180,15 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> impleme
|
||||
.build();
|
||||
super.save(divide);
|
||||
|
||||
//生成分账明细信息
|
||||
List<DivideDetail> details = saveDetails(order, divide.getId(), totalFee, totalAmount, rule);
|
||||
|
||||
//同步订单状态
|
||||
syncOrderStatus(order);
|
||||
|
||||
//同步易生支付
|
||||
syncYisheng(details);
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -228,13 +243,19 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> impleme
|
||||
if (item.getType() == DivideRuleDetailType.PLATFORM.getValue()) {
|
||||
account = getPlatformAccount();
|
||||
} else if (item.getType() == DivideRuleDetailType.PROXY.getValue()) {
|
||||
account = getProxyAccount();
|
||||
account = getProxyAccount(Long.valueOf(order.getTenantId()));
|
||||
} else if (item.getType() == DivideRuleDetailType.SELLER.getValue()) {
|
||||
account = getSellerAccount();
|
||||
account = getSellerAccount(Long.valueOf(order.getTenantId()));
|
||||
} else if (item.getType() == DivideRuleDetailType.REFERENCE.getValue()) {
|
||||
account = getReferenceAccount(order.getMemberId());
|
||||
}
|
||||
if (account == null) {
|
||||
detail.setAccountId(Long.parseLong(account.get("accountId")));
|
||||
detail.setAccountName(account.get("accountName"));
|
||||
return detail;
|
||||
} else {
|
||||
throw new ServiceException(StringUtils.format("%s未找到分账账户", DivideRuleDetailType.getEnum(item.getType())));
|
||||
}
|
||||
}).collect(Collectors.toList());
|
||||
detailMapper.insertBatch(details);
|
||||
return details;
|
||||
@ -247,17 +268,75 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> impleme
|
||||
}};
|
||||
}
|
||||
|
||||
private Map<String, String> getProxyAccount() {
|
||||
/**
|
||||
* 获取达人的账户信息
|
||||
*
|
||||
* @param memberId
|
||||
* @return
|
||||
*/
|
||||
private Map<String, String> getReferenceAccount(Long memberId) {
|
||||
Member member = memberService.getById(memberId);
|
||||
if (member == null) {
|
||||
return null;
|
||||
}
|
||||
//推广人
|
||||
Long inviteUserId = member.getSpreadUid();
|
||||
if (inviteUserId == null) {
|
||||
return null;
|
||||
}
|
||||
MemberAccount account = accountService.getMemberAccount(inviteUserId);
|
||||
if (account == null) {
|
||||
return null;
|
||||
}
|
||||
return new HashMap<>() {{
|
||||
put("account", "123456");
|
||||
put("name", "代理");
|
||||
put("accountId", account.getId() + "");
|
||||
put("accountName", account.getName());
|
||||
}};
|
||||
}
|
||||
|
||||
private Map<String, String> getSellerAccount() {
|
||||
/**
|
||||
* 获取代理的账户信息
|
||||
*
|
||||
* @param sellerId
|
||||
* @return
|
||||
*/
|
||||
private Map<String, String> getProxyAccount(Long sellerId) {
|
||||
SysTenantVo tenant = sysTenantService.queryById(sellerId);
|
||||
Long inviteUserId = tenant.getInviteUserId();
|
||||
if (inviteUserId != null) {
|
||||
return null;
|
||||
}
|
||||
MemberAccount account = accountService.getMemberAccount(inviteUserId);
|
||||
|
||||
if (account == null) {
|
||||
return null;
|
||||
}
|
||||
return new HashMap<>() {{
|
||||
put("account", "123456");
|
||||
put("name", "卖家");
|
||||
put("accountId", account.getId() + "");
|
||||
put("accountName", account.getName());
|
||||
}};
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取商家的账户信息
|
||||
*
|
||||
* @param sellerId
|
||||
* @return
|
||||
*/
|
||||
private Map<String, String> getSellerAccount(Long sellerId) {
|
||||
|
||||
SysTenantVo tenant = sysTenantService.queryById(sellerId);
|
||||
if (tenant != null) {
|
||||
return null;
|
||||
}
|
||||
MemberAccount account = accountService.getMemberAccount(tenant.getId());
|
||||
|
||||
if (account == null) {
|
||||
return null;
|
||||
}
|
||||
return new HashMap<>() {{
|
||||
put("accountId", account.getId() + "");
|
||||
put("accountName", account.getName());
|
||||
}};
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ public class WithdrawServiceImpl extends ServiceImpl<WithdrawMapper, Withdraw> i
|
||||
throw new RuntimeException("用户不存在");
|
||||
}
|
||||
//检查当前用于的账户余额是否充足
|
||||
BigDecimal balance = memberAccount.getMoneyBalance();
|
||||
BigDecimal balance = memberAccount.getWallet();
|
||||
|
||||
if (balance.compareTo(withdraw.getMoney()) < 0) {
|
||||
throw new RuntimeException("用户余额不足");
|
||||
@ -104,7 +104,7 @@ public class WithdrawServiceImpl extends ServiceImpl<WithdrawMapper, Withdraw> i
|
||||
//// TODO: 2025/6/21 测试的时候用计算的 测试完用易生的
|
||||
BigDecimal finalBalance = balance.subtract(withdraw.getMoney());
|
||||
yishengAccountVO = yishengService.getYishengAccount(withdraw.getMemberId());
|
||||
memberAccountService.updateById(memberAccount.toBuilder().moneyBalance(balance.subtract(finalBalance)).build());
|
||||
memberAccountService.updateById(memberAccount.toBuilder().wallet(balance.subtract(finalBalance)).build());
|
||||
//生成账户变动记录bh
|
||||
MemberAccountChangeRecord memberAccountChangeRecord = MemberAccountChangeRecord.builder()
|
||||
.memberId(withdraw.getMemberId())
|
||||
|
Loading…
x
Reference in New Issue
Block a user