## Opt - 重写左右区结余逻辑

This commit is contained in:
sangelxiu1 2025-10-22 14:09:35 +08:00
parent adceb77c33
commit 31b4a4aeb7
4 changed files with 124 additions and 1 deletions

View File

@ -2,6 +2,7 @@ package com.hzs.bonus.achieve.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.bonus.achieve.param.MemberAchieveParam;
import com.hzs.bonus.achieve.vo.CuMemberSettleVO;
import com.hzs.common.domain.member.achieve.CuMemberAchieve;
import com.hzs.common.domain.member.achieve.ext.CuMemberAchieveExt;
import com.hzs.bonus.achieve.param.MonthAchieveParam;
@ -166,6 +167,16 @@ public interface CuMemberAchieveMapper extends BaseMapper<CuMemberAchieve> {
void compensationBalanceAmount(@Param("targetTable") String targetTable, @Param("sourceTable") String sourceTable,
@Param("period") Integer period, @Param("achieve") MemberAchieveParam memberAchieveParam);
List<CuMemberSettleVO> getParentMemberList(@Param("targetTable") String targetTable, @Param("sourceTable") String sourceTable,
@Param("period") Integer period, @Param("pkMember") Long pkMember);
/**
* 批量更新会员结算表的余额信息
* @param targetTable 目标表名
* @param settleList 结算对象列表
* @return 更新的记录数
*/
int batchUpdateBalance(@Param("targetTable") String targetTable, @Param("settleList") List<CuMemberSettleVO> settleList);
/**
* 根据每日日业绩开始更新会员业绩 新增业绩累计业绩新増金额累计金额
*

View File

@ -1,11 +1,15 @@
package com.hzs.bonus.achieve.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hzs.bonus.achieve.service.ICuMemberAchieveService;
import com.hzs.bonus.achieve.service.ICuMemberSettlePeriodService;
import com.hzs.bonus.achieve.service.ICuMemberTreeService;
import com.hzs.bonus.achieve.vo.CuMemberSettleVO;
import com.hzs.common.core.constant.*;
import com.hzs.common.core.enums.EOrderType;
import com.hzs.common.core.enums.EPlaceDept;
import com.hzs.common.core.utils.DateUtils;
import com.hzs.common.domain.member.achieve.CuMemberAchieve;
import com.hzs.common.domain.member.achieve.CuMemberSettlePeriod;
@ -189,9 +193,62 @@ public class CuMemberAchieveServiceImpl extends ServiceImpl<CuMemberAchieveMappe
String targetTable = TableNameConstants.CU_MEMBER_SETTLE + settlePeriod;
baseMapper.chargeBackSaOrder(targetTable, sourceTable, period, cuMemberAchieve);
// baseMapper.compensationBalanceAmount(targetTable, sourceTable, period, cuMemberAchieve);
processBalance(targetTable, sourceTable, period, saOrder, cuMemberAchieve);
}
return Boolean.TRUE;
}
public void processBalance(String targetTable, String sourceTable, Integer period, SaOrder saOrder, MemberAchieveParam cuMemberAchieve){
// 1. 拿本人上网体()
List<CuMemberSettleVO> memberSettleVOList = baseMapper.getParentMemberList(targetTable, sourceTable, period, saOrder.getPkMember());
CuMemberSettleVO baseSettleVO = memberSettleVOList.stream().findFirst().orElse(null);
if(ObjectUtil.isEmpty(baseSettleVO)){
return;
}
BigDecimal pendingPV = cuMemberAchieve.getNewPv();
// 排除本人的上级网体修改列表
List<CuMemberSettleVO> updateMemberSettleVOList = new ArrayList<>();
for (int i1 = 1; i1 < memberSettleVOList.size(); i1++) {
CuMemberSettleVO nowSettleVO = memberSettleVOList.get(i1);
CuMemberSettleVO updateVO = CuMemberSettleVO.builder()
.pkMember(nowSettleVO.getPkMember())
.period(nowSettleVO.getPeriod())
.aBalance(BigDecimal.ZERO)
.bBalance(BigDecimal.ZERO)
.build();
updateMemberSettleVOList.add(updateVO);
assert baseSettleVO != null;
if(EPlaceDept.LEFT_DEPT.getValue() == baseSettleVO.getPlaceDep()){
BigDecimal aBalance = nowSettleVO.getABalance();
BigDecimal result = aBalance.subtract(pendingPV);
if (result.compareTo(BigDecimal.ZERO) >= 0) {
// 如果结果大于等于0直接设置aBalance
updateVO.setABalance(result);
} else {
// 如果结果小于0aBalance设为0bBalance设为差额绝对值
updateVO.setABalance(BigDecimal.ZERO);
updateVO.setBBalance(result.abs());
}
// }else if(EPlaceDept.RIGHT_DEPT.getValue() == baseSettleVO.getPlaceDep()){
} else {
BigDecimal bBalance = nowSettleVO.getBBalance();
BigDecimal result = bBalance.subtract(pendingPV);
if (result.compareTo(BigDecimal.ZERO) >= 0) {
// 如果结果大于等于0直接设置bBalance
updateVO.setBBalance(result);
} else {
// 如果结果小于0bBalance设为0aBalance设为差额绝对值
updateVO.setBBalance(BigDecimal.ZERO);
updateVO.setABalance(result.abs());
}
}
baseSettleVO = nowSettleVO;
}
if(CollUtil.isNotEmpty(updateMemberSettleVOList)){
baseMapper.batchUpdateBalance(targetTable, updateMemberSettleVOList);
}
}
}

View File

@ -0,0 +1,25 @@
package com.hzs.bonus.achieve.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CuMemberSettleVO implements Serializable {
private Integer level;
private Long pkMember;
private Long pkParent;
private Integer placeDep;
private String memberCode;
private String memberName;
private Integer period;
private BigDecimal aBalance;
private BigDecimal bBalance;
}

View File

@ -1322,5 +1322,35 @@
#{item.pkSourceMember}
</foreach>
</select>
<select id="getParentMemberList" resultType="com.hzs.bonus.achieve.vo.CuMemberSettleVO">
SELECT
*
FROM
(
SELECT LEVEL
,
cm.*
FROM
${targetTable} cm START WITH cm.pk_member = #{pkMember} CONNECT BY cm.PK_MEMBER = PRIOR cm.PK_PARENT
ORDER BY
LEVEL
)
</select>
<update id="batchUpdateBalance">
MERGE INTO ${targetTable} t
USING (
SELECT
<foreach collection="settleList" item="vo" separator="UNION ALL SELECT" open="" close="">
#{vo.pkMember} as pk_member,
#{vo.period} as period,
#{vo.aBalance} as a_balance,
#{vo.bBalance} as b_balance
</foreach>
) s
ON (t.pk_member = s.pk_member AND t.period = s.period)
WHEN MATCHED THEN
UPDATE SET
t.a_balance = s.a_balance,
t.b_balance = s.b_balance
</update>
</mapper>