## 乐学复购级差法宝券处理第一版;

This commit is contained in:
cabbage 2025-04-10 17:23:09 +08:00
parent 6a4b2ebaf0
commit de3caf9321
12 changed files with 212 additions and 153 deletions

View File

@ -32,7 +32,7 @@ public interface ISaOrderServiceApi {
* @Author: sui q * @Author: sui q
* @Date: 2022/11/2 16:30 * @Date: 2022/11/2 16:30
*/ */
R<List<SaOrderExt>> querySaOrderByDay(Date startDate, Date endDate); R<List<SaOrderExt>> listSaOrderByDay(Date startDate, Date endDate, String orderCode);
/** /**
* 查询时间范围内的所有订单按照订单时间排序,只能用于奖金结算 * 查询时间范围内的所有订单按照订单时间排序,只能用于奖金结算

View File

@ -653,15 +653,8 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
List<AcPickMemberLog> acPickMemberLogList = acPickServiceApi.queryPickMemberLog(specialOrderList).getData(); List<AcPickMemberLog> acPickMemberLogList = acPickServiceApi.queryPickMemberLog(specialOrderList).getData();
// key: 会员ID + 提货专区ID // key: 会员ID + 提货专区ID
Map<String, AcPickMemberLog> pickMemberLogMap = new HashMap<>(ComputeUtil.mapInitCapacity(acPickMemberLogList.size())); Map<String, AcPickMemberLog> pickMemberLogMap = new HashMap<>(ComputeUtil.mapInitCapacity(acPickMemberLogList.size()));
// key: 会员ID + 订单ID
Map<String, AcPickMemberLog> orderMemberMap = new HashMap<>(ComputeUtil.mapInitCapacity(acPickMemberLogList.size()));
if (CollectionUtil.isNotEmpty(acPickMemberLogList)) { if (CollectionUtil.isNotEmpty(acPickMemberLogList)) {
acPickMemberLogList.forEach(acPickMemberLog -> { acPickMemberLogList.forEach(acPickMemberLog -> pickMemberLogMap.put(acPickMemberLog.getPkMember().toString() + acPickMemberLog.getPkPick(), acPickMemberLog));
pickMemberLogMap.put(acPickMemberLog.getPkMember().toString() + acPickMemberLog.getPkId(), acPickMemberLog);
orderMemberMap.put(acPickMemberLog.getPkMember() + acPickMemberLog.getPickOrder(), acPickMemberLog);
}
);
leXueRangeParam.setAcPickMemberLogList(acPickMemberLogList); leXueRangeParam.setAcPickMemberLogList(acPickMemberLogList);
} }
@ -677,6 +670,14 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
}); });
List<AcPickExt> acPickExtList = new ArrayList<>(); List<AcPickExt> acPickExtList = new ArrayList<>();
for (SaOrderExt saOrderExt : specialOrderList) { for (SaOrderExt saOrderExt : specialOrderList) {
// 商品使用法宝券数量key: 商品IDvalue 法宝券数量
Map<Integer, Integer> productPickMap = new HashMap<>();
for (SaOrderItemsExt saOrderItemsExt : saOrderExt.getOrderItemsExtList()) {
if (null != saOrderItemsExt.getUsePick() && saOrderItemsExt.getUsePick() != 0) {
productPickMap.put(saOrderItemsExt.getPkWares(), saOrderItemsExt.getUsePick());
}
}
for (SaOrderItemsExt saOrderItemsExt : saOrderExt.getOrderItemsExtList()) { for (SaOrderItemsExt saOrderItemsExt : saOrderExt.getOrderItemsExtList()) {
if (EYesNo.YES.getIntValue() == saOrderItemsExt.getIsGift() if (EYesNo.YES.getIntValue() == saOrderItemsExt.getIsGift()
|| ComputeUtil.compareEqual(saOrderItemsExt.getPrice(), BigDecimal.ZERO) || ComputeUtil.compareEqual(saOrderItemsExt.getPrice(), BigDecimal.ZERO)
@ -694,108 +695,35 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
break; break;
} }
// 订单会员推荐人 // 当前订单明细使用了法宝券
Long pkParent = sourceMemberSettleExt.getPkParent(); Integer useNum = productPickMap.get(saOrderItemsExt.getPkWares());
// 订单会员等级
int gradeValue = sourceMemberSettleExt.getGradeValue();
// 订单是否使用法宝券true 使用了法宝券 if (null != useNum) {
boolean useFlag = null != orderMemberMap.get(saOrderExt.getPkMember() + saOrderExt.getOrderCode()) ? Boolean.TRUE : Boolean.FALSE; // 订单使用了法宝券
if (EGrade.S_VIP.getValue() == gradeValue && useFlag) { if (useNum.equals(saOrderItemsExt.getWaresQuantity())) {
// 下单会员是 V4 并且 使用了法宝券直接结束 // 法宝券和商品数量一致
break; this.usePick(specialmeberSettleExtMap, rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
} sourceMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
// 找不到父级了或者找到第一个svip直接跳出
boolean V1Flag = Boolean.TRUE;
boolean V2Flag = Boolean.TRUE;
boolean V3Flag = Boolean.TRUE;
while (true) {
CuMemberSettleExt targetMemberSettleExt = specialmeberSettleExtMap.get(pkParent);
if (null == targetMemberSettleExt) {
// 上面没有推荐人了直接结束
break;
}
if (useFlag) {
// 订单使用了法宝券查询大于当前会员的
if (gradeValue < targetMemberSettleExt.getGradeValue() && EGrade.MAKER.getValue() == targetMemberSettleExt.getGradeValue() && V2Flag && V3Flag) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V2 并且 V2 V3 都没有算过
AcPickExt acPickExt = calculateRangeBonus(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, sourceMemberSettleExt,
targetMemberSettleExt, cuMemberBonusRangeList);
if (null != acPickExt) {
acPickExtList.add(acPickExt);
}
pkParent = targetMemberSettleExt.getPkParent();
sourceMemberSettleExt = targetMemberSettleExt;
V2Flag = Boolean.FALSE;
} else if (gradeValue < targetMemberSettleExt.getGradeValue() && EGrade.VIP.getValue() == targetMemberSettleExt.getGradeValue() && V3Flag) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V3 并且 V3没有算过
AcPickExt acPickExt = calculateRangeBonus(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, sourceMemberSettleExt,
targetMemberSettleExt, cuMemberBonusRangeList);
if (null != acPickExt) {
acPickExtList.add(acPickExt);
}
pkParent = targetMemberSettleExt.getPkParent();
sourceMemberSettleExt = targetMemberSettleExt;
V3Flag = Boolean.FALSE;
} else if (gradeValue < targetMemberSettleExt.getGradeValue() && EGrade.S_VIP.getValue() == targetMemberSettleExt.getGradeValue()) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V4
AcPickExt acPickExt = calculateRangeBonus(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, sourceMemberSettleExt,
targetMemberSettleExt, cuMemberBonusRangeList);
if (null != acPickExt) {
acPickExtList.add(acPickExt);
}
break;
} else {
pkParent = targetMemberSettleExt.getPkParent();
sourceMemberSettleExt = targetMemberSettleExt;
}
} else { } else {
// 订单没有使用法宝券 // 法宝券和商品数量不一致需要拆分处理
if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.YOU_KE.getValue() == targetMemberSettleExt.getGradeValue() && V1Flag && V2Flag && V3Flag) { // 使用法宝券部分处理
// 订单会员等级小于推荐人等级 并且 推荐人是 V1 并且 V1 V2 V3 都没有算过 SaOrderItemsExt tmpItems1 = BeanUtil.copyProperties(saOrderItemsExt, SaOrderItemsExt.class);
AcPickExt acPickExt = calculateRangeBonus(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, sourceMemberSettleExt, tmpItems1.setWaresQuantity(useNum);
targetMemberSettleExt, cuMemberBonusRangeList); tmpItems1.setUsePick(useNum);
if (null != acPickExt) { this.usePick(specialmeberSettleExtMap, rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, tmpItems1,
acPickExtList.add(acPickExt); sourceMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
}
pkParent = targetMemberSettleExt.getPkParent(); // 未使用法宝券部分处理
sourceMemberSettleExt = targetMemberSettleExt; SaOrderItemsExt tmpItems2 = BeanUtil.copyProperties(saOrderItemsExt, SaOrderItemsExt.class);
V1Flag = Boolean.FALSE; tmpItems2.setWaresQuantity(saOrderItemsExt.getWaresQuantity() - useNum);
} else if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.MAKER.getValue() == targetMemberSettleExt.getGradeValue() && V2Flag && V3Flag) { tmpItems2.setUsePick(saOrderItemsExt.getWaresQuantity() - useNum);
// 订单会员等级小于推荐人等级 并且 推荐人是 V2 并且 V2 V3 都没有算过 this.notUsePick(specialmeberSettleExtMap, rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, tmpItems2,
AcPickExt acPickExt = calculateRangeBonus(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, sourceMemberSettleExt, sourceMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
targetMemberSettleExt, cuMemberBonusRangeList);
if (null != acPickExt) {
acPickExtList.add(acPickExt);
}
pkParent = targetMemberSettleExt.getPkParent();
sourceMemberSettleExt = targetMemberSettleExt;
V2Flag = Boolean.FALSE;
} else if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.VIP.getValue() == targetMemberSettleExt.getGradeValue() && V3Flag) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V3 并且 V3没有算过
AcPickExt acPickExt = calculateRangeBonus(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, sourceMemberSettleExt,
targetMemberSettleExt, cuMemberBonusRangeList);
if (null != acPickExt) {
acPickExtList.add(acPickExt);
}
pkParent = targetMemberSettleExt.getPkParent();
sourceMemberSettleExt = targetMemberSettleExt;
V3Flag = Boolean.FALSE;
} else if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.S_VIP.getValue() == targetMemberSettleExt.getGradeValue()) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V4
AcPickExt acPickExt = calculateRangeBonus(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, sourceMemberSettleExt,
targetMemberSettleExt, cuMemberBonusRangeList);
if (null != acPickExt) {
acPickExtList.add(acPickExt);
}
break;
} else {
pkParent = targetMemberSettleExt.getPkParent();
sourceMemberSettleExt = targetMemberSettleExt;
}
} }
} else {
// 没使用法宝券
this.notUsePick(specialmeberSettleExtMap, rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
sourceMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
} }
} }
} }
@ -805,6 +733,111 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
} }
} }
/**
* 使用法宝券处理
*/
private void usePick(Map<Long, CuMemberSettleExt> specialmeberSettleExtMap, Map<String, RangeDTO> rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period,
Map<Long, CuMemberBonus> cuMemberBonusMap, SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt, CuMemberSettleExt sourceMemberSettleExt,
List<CuMemberBonusRange> cuMemberBonusRangeList, List<AcPickExt> acPickExtList) {
// 订单会员推荐人
Long pkParent = sourceMemberSettleExt.getPkParent();
// 订单会员等级
int gradeValue = sourceMemberSettleExt.getGradeValue();
// 找不到父级了或者找到第一个svip直接跳出
boolean V2Flag = Boolean.TRUE;
boolean V3Flag = Boolean.TRUE;
while (true) {
CuMemberSettleExt targetMemberSettleExt = specialmeberSettleExtMap.get(pkParent);
if (null == targetMemberSettleExt) {
// 上面没有推荐人了直接结束
break;
}
// 法宝券和商品数量一致
if (gradeValue < targetMemberSettleExt.getGradeValue() && EGrade.MAKER.getValue() == targetMemberSettleExt.getGradeValue() && V2Flag && V3Flag) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V2 并且 V2 V3 都没有算过
this.handlePick(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
sourceMemberSettleExt, targetMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
V2Flag = Boolean.FALSE;
} else if (gradeValue < targetMemberSettleExt.getGradeValue() && EGrade.VIP.getValue() == targetMemberSettleExt.getGradeValue() && V3Flag) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V3 并且 V3没有算过
this.handlePick(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
sourceMemberSettleExt, targetMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
V3Flag = Boolean.FALSE;
} else if (gradeValue < targetMemberSettleExt.getGradeValue() && EGrade.S_VIP.getValue() == targetMemberSettleExt.getGradeValue()) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V4
this.handlePick(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
sourceMemberSettleExt, targetMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
break;
}
pkParent = targetMemberSettleExt.getPkParent();
sourceMemberSettleExt = targetMemberSettleExt;
}
}
/**
* 未使用法宝券处理
*/
private void notUsePick(Map<Long, CuMemberSettleExt> specialmeberSettleExtMap, Map<String, RangeDTO> rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period,
Map<Long, CuMemberBonus> cuMemberBonusMap, SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt, CuMemberSettleExt sourceMemberSettleExt,
List<CuMemberBonusRange> cuMemberBonusRangeList, List<AcPickExt> acPickExtList) {
// 订单会员推荐人
Long pkParent = sourceMemberSettleExt.getPkParent();
// 订单会员等级
int gradeValue = sourceMemberSettleExt.getGradeValue();
// 找不到父级了或者找到第一个svip直接跳出
boolean V1Flag = Boolean.TRUE;
boolean V2Flag = Boolean.TRUE;
boolean V3Flag = Boolean.TRUE;
while (true) {
CuMemberSettleExt targetMemberSettleExt = specialmeberSettleExtMap.get(pkParent);
if (null == targetMemberSettleExt) {
// 上面没有推荐人了直接结束
break;
}
// 法宝券和商品数量一致
if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.YOU_KE.getValue() == targetMemberSettleExt.getGradeValue() && V1Flag && V2Flag && V3Flag) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V1 并且 V1 V2 V3 都没有算过
this.handlePick(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
sourceMemberSettleExt, targetMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
V1Flag = Boolean.FALSE;
} else if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.MAKER.getValue() == targetMemberSettleExt.getGradeValue() && V2Flag && V3Flag) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V2 并且 V2 V3 都没有算过
this.handlePick(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
sourceMemberSettleExt, targetMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
V2Flag = Boolean.FALSE;
} else if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.VIP.getValue() == targetMemberSettleExt.getGradeValue() && V3Flag) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V3 并且 V3没有算过
this.handlePick(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
sourceMemberSettleExt, targetMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
V3Flag = Boolean.FALSE;
} else if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.S_VIP.getValue() == targetMemberSettleExt.getGradeValue()) {
// 订单会员等级小于推荐人等级 并且 推荐人是 V4
this.handlePick(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt,
sourceMemberSettleExt, targetMemberSettleExt, cuMemberBonusRangeList, acPickExtList);
break;
}
pkParent = targetMemberSettleExt.getPkParent();
sourceMemberSettleExt = targetMemberSettleExt;
}
}
/**
* 封装法宝券抵扣相关
*/
private void handlePick(Map<String, RangeDTO> rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period, Map<Long, CuMemberBonus> cuMemberBonusMap,
SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt, CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt targetMemberSettleExt,
List<CuMemberBonusRange> cuMemberBonusRangeList, List<AcPickExt> acPickExtList) {
AcPickExt acPickExt = calculateRangeBonus(rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, sourceMemberSettleExt,
targetMemberSettleExt, cuMemberBonusRangeList);
if (null != acPickExt) {
acPickExtList.add(acPickExt);
}
}
/** /**
* 计算封装乐学复购特殊级差法宝券返回扣除提货法宝券 * 计算封装乐学复购特殊级差法宝券返回扣除提货法宝券
* *
@ -821,14 +854,17 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
*/ */
private AcPickExt calculateRangeBonus(Map<String, RangeDTO> rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period, private AcPickExt calculateRangeBonus(Map<String, RangeDTO> rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period,
Map<Long, CuMemberBonus> cuMemberBonusMap, SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt, Map<Long, CuMemberBonus> cuMemberBonusMap, SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt,
CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt targetMemberSettleExt,
CuMemberSettleExt targetMemberSettleExt, List<CuMemberBonusRange> cuMemberBonusRangeList) { List<CuMemberBonusRange> cuMemberBonusRangeList) {
if (targetMemberSettleExt.getUsableQuantity() != null && targetMemberSettleExt.getUsableQuantity() > 0) { if (targetMemberSettleExt.getUsableQuantity() != null && targetMemberSettleExt.getUsableQuantity() > 0) {
// 扣减数量如果剩余法宝券 大于等于 商品数量则使用商品数量否则使用法宝券数量
int waresQuantity = targetMemberSettleExt.getUsableQuantity() >= saOrderItemsExt.getWaresQuantity() ? saOrderItemsExt.getWaresQuantity() : targetMemberSettleExt.getUsableQuantity();
CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt); CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt);
CuMemberBonusRange cuMemberBonusRange = getCuMemberBonusRange(bonusConfigDTO, saOrderExt, targetMemberSettleExt, cuMemberBonus); CuMemberBonusRange cuMemberBonusRange = getCuMemberBonusRange(bonusConfigDTO, saOrderExt, targetMemberSettleExt, cuMemberBonus);
cuMemberBonusRange.setCalAchieve(saOrderItemsExt.getAchievement()); cuMemberBonusRange.setCalAchieve(saOrderItemsExt.getAchievement());
cuMemberBonusRange.setCalValue(BigDecimal.ZERO); cuMemberBonusRange.setCalValue(BigDecimal.ZERO);
cuMemberBonusRange.setPretaxIncome(ComputeUtil.computeMultiply(BigDecimal.valueOf(saOrderItemsExt.getWaresQuantity()), cuMemberBonusRange.setPretaxIncome(ComputeUtil.computeMultiply(BigDecimal.valueOf(waresQuantity),
ComputeUtil.computeDivide(targetMemberSettleExt.getRetailPrice(), BigDecimal.valueOf(1)))); ComputeUtil.computeDivide(targetMemberSettleExt.getRetailPrice(), BigDecimal.valueOf(1))));
String key = targetMemberSettleExt.getPkSettleCountry().toString() + ERangeType.GRADE.getValue() + targetMemberSettleExt.getPkGrade(); String key = targetMemberSettleExt.getPkSettleCountry().toString() + ERangeType.GRADE.getValue() + targetMemberSettleExt.getPkGrade();
cuMemberBonusRange.setPkRange(rangeDtoMap.get(key).getPkRange()); cuMemberBonusRange.setPkRange(rangeDtoMap.get(key).getPkRange());
@ -846,13 +882,13 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle {
setPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusRange); setPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusRange);
} }
cuMemberBonusRangeList.add(cuMemberBonusRange); cuMemberBonusRangeList.add(cuMemberBonusRange);
targetMemberSettleExt.setUsableQuantity(targetMemberSettleExt.getUsableQuantity() - saOrderItemsExt.getWaresQuantity()); targetMemberSettleExt.setUsableQuantity(targetMemberSettleExt.getUsableQuantity() - waresQuantity);
AcPickExt acPickExt = new AcPickExt(); AcPickExt acPickExt = new AcPickExt();
acPickExt.setPkId(targetMemberSettleExt.getApPkId()); acPickExt.setPkId(targetMemberSettleExt.getApPkId());
acPickExt.setPkMember(targetMemberSettleExt.getPkMember()); acPickExt.setPkMember(targetMemberSettleExt.getPkMember());
acPickExt.setOrderCode(saOrderExt.getOrderCode()); acPickExt.setOrderCode(saOrderExt.getOrderCode());
acPickExt.setPickType(EPickType.COUPON.getValue()); acPickExt.setPickType(EPickType.COUPON.getValue());
acPickExt.setUsedQuantity(saOrderItemsExt.getWaresQuantity()); acPickExt.setUsedQuantity(waresQuantity);
acPickExt.setPkBaseConfig(0L); acPickExt.setPkBaseConfig(0L);
acPickExt.setPkDataId(targetMemberSettleExt.getPkDataId()); acPickExt.setPkDataId(targetMemberSettleExt.getPkDataId());
return acPickExt; return acPickExt;

View File

@ -426,7 +426,7 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
// 计算完奖衔回退业绩最终根据新增进行回写 // 计算完奖衔回退业绩最终根据新增进行回写
// cuMemberTreeService.updateCuMemberBackSettle(cuMemberAchieveHashMap, currentSettleTableName); // cuMemberTreeService.updateCuMemberBackSettle(cuMemberAchieveHashMap, currentSettleTableName);
//********************************重新考核*********************************/ //********************************重新考核*********************************/
// TODO new 乐学没有分红复购考核这个位置需要去掉 // TODO new 乐学没有分红复购考核这个位置需要去掉
cuMemberAssessService.retryCalculationAssess(DateUtils.parseStringToDate(settleDate), Boolean.TRUE); cuMemberAssessService.retryCalculationAssess(DateUtils.parseStringToDate(settleDate), Boolean.TRUE);
//*********************************计算奖金********************************/ //*********************************计算奖金********************************/
// 首购订单 注册+升级 直推奖量奖领导奖注册报单服务费 // 首购订单 注册+升级 直推奖量奖领导奖注册报单服务费
@ -448,12 +448,13 @@ public class BonusSettleServiceImpl implements IBonusSettleService {
// 计算乐享订单奖金按照订单进行日结 // 计算乐享订单奖金按照订单进行日结
// 增加判断是否相同月相同月的话昨天的考核结果更新到今天 // 增加判断是否相同月相同月的话昨天的考核结果更新到今天
Boolean isSameMonth = DateUtils.getMonth(settleDate).equals(DateUtils.getMonth(yesterday)); Boolean isSameMonth = DateUtils.getMonth(settleDate).equals(DateUtils.getMonth(yesterday));
// 乐享奖金
bonusSettleRangeHandle.calculateLeEnjoyBonusBySaOrder(cuMemberBonusMap, bonusConfigDTO, recordDetailVO, bonusSettleRangeHandle.calculateLeEnjoyBonusBySaOrder(cuMemberBonusMap, bonusConfigDTO, recordDetailVO,
period, yesterdayPeriod, isSameMonth); period, yesterdayPeriod, isSameMonth);
// 计算新零售团队奖金 // 计算新零售团队奖金
// bonusSettleRangeHandle.calculateRetailBonusBySaOrder(settleDate, cuMemberBonusMap, bonusConfigDTO, recordDetailVO, // bonusSettleRangeHandle.calculateRetailBonusBySaOrder(settleDate, cuMemberBonusMap, bonusConfigDTO, recordDetailVO,
// period, yesterdayPeriod, retailOrderList, isSameMonth); // period, yesterdayPeriod, retailOrderList, isSameMonth);
// suiqing 验证是否月奖验证是否是结算月底那一天月底那一天计算云代判断是否为月底 // 验证是否月奖验证是否是结算月底那一天月底那一天计算云代判断是否为月底
//*********************************计算云代奖金、 复购券均分收益************************/ //*********************************计算云代奖金、 复购券均分收益************************/
if (settleDate.endsWith("10")) { if (settleDate.endsWith("10")) {
// 计算云代奖金 // 计算云代奖金

View File

@ -644,7 +644,7 @@ public class CuMemberBonusServiceImpl extends ServiceImpl<CuMemberBonusMapper, C
cuMemberTreeService.createCuMemberTree(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, DateUtils.beforeDate(1, ChronoUnit.DAYS))); cuMemberTreeService.createCuMemberTree(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, DateUtils.beforeDate(1, ChronoUnit.DAYS)));
log.info("初始化表完成"); log.info("初始化表完成");
// 奖金结算 // 奖金结算
List<SaOrderExt> saOrderExtList = saOrderServiceApi.querySaOrderByDay(startDate, settleEndDate).getData(); List<SaOrderExt> saOrderExtList = saOrderServiceApi.listSaOrderByDay(startDate, settleEndDate, "SO1744257643744907").getData();
bonusSettleService.calculateCuMemberBonus(settleDate, saOrderExtList); bonusSettleService.calculateCuMemberBonus(settleDate, saOrderExtList);
return Boolean.TRUE; return Boolean.TRUE;
} }

View File

@ -81,6 +81,7 @@ public class ApiOthSaOrderController extends ParentOrderController {
// 商品预售数量不足 // 商品预售数量不足
return AjaxResult.error(SaOrderMsgConstants.WARES_PRE_SALE_QUANTITY_LACK); return AjaxResult.error(SaOrderMsgConstants.WARES_PRE_SALE_QUANTITY_LACK);
} }
if (orderParam.getSpecialArea() != EOrderType.REGISTER_ORDER.getValue() && if (orderParam.getSpecialArea() != EOrderType.REGISTER_ORDER.getValue() &&
orderParam.getSpecialArea() != EOrderType.SPECIAL_REGISTER_ORDER.getValue()) { orderParam.getSpecialArea() != EOrderType.SPECIAL_REGISTER_ORDER.getValue()) {
convertShoppingCarToSku(orderParam); convertShoppingCarToSku(orderParam);

View File

@ -50,8 +50,8 @@ public class SaOrderServiceProvider implements ISaOrderServiceApi {
private ISaOrderService saOrderService; private ISaOrderService saOrderService;
@Override @Override
public R<List<SaOrderExt>> querySaOrderByDay(Date startDate, Date endDate) { public R<List<SaOrderExt>> listSaOrderByDay(Date startDate, Date endDate, String orderCode) {
return R.ok(saOrderService.querySaOrderByTime(startDate, endDate, null)); return R.ok(saOrderService.querySaOrderByTime(startDate, endDate, orderCode));
} }
@Override @Override

View File

@ -326,11 +326,6 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
return redisService.lockKeyOnce(key); return redisService.lockKeyOnce(key);
} }
@Override
public List<CuMemberAccountExt> queryMemberAccountByCondition(CuMemberAccount cuMemberAccount) {
return memberAccountServiceApi.queryMemberAccountByCondition(cuMemberAccount).getData();
}
@Override @Override
public CuMemberAccountExt queryOrderSpendDetails(CuMemberAccountExt cuMemberAccount, SaOrder saOrder, List<SaOrderItems> orderItemList) { public CuMemberAccountExt queryOrderSpendDetails(CuMemberAccountExt cuMemberAccount, SaOrder saOrder, List<SaOrderItems> orderItemList) {
BigDecimal payMoney = saOrder.getOrderAmount(); BigDecimal payMoney = saOrder.getOrderAmount();
@ -386,6 +381,11 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
return cuMemberAccount; return cuMemberAccount;
} }
@Override
public List<CuMemberAccountExt> queryMemberAccountByCondition(CuMemberAccount cuMemberAccount) {
return memberAccountServiceApi.queryMemberAccountByCondition(cuMemberAccount).getData();
}
private Boolean handleSaOrderAmount(SaOrder saOrder, List<SaOrderItems> orderItemList, private Boolean handleSaOrderAmount(SaOrder saOrder, List<SaOrderItems> orderItemList,
CuMemberAccountExt cuMemberAccount, BigDecimal payMoney, BigDecimal postage, CuMemberAccountExt cuMemberAccount, BigDecimal payMoney, BigDecimal postage,
List<AreaCurrencyDTO> areaCurrencyDTOList) { List<AreaCurrencyDTO> areaCurrencyDTOList) {
@ -511,7 +511,8 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
*/ */
private BigDecimal handleLeXueYiKaoCoupon(CuMemberAccountExt cuMemberAccount, SaOrder saOrder, BigDecimal payMoney, List<SaOrderItems> saOrderItemsList) { private BigDecimal handleLeXueYiKaoCoupon(CuMemberAccountExt cuMemberAccount, SaOrder saOrder, BigDecimal payMoney, List<SaOrderItems> saOrderItemsList) {
// 乐学易考特殊复购订单查询有没有代金券有代金券的扣除一张券 // 乐学易考特殊复购订单查询有没有代金券有代金券的扣除一张券
if (EOrderType.SPECIAL_REPURCHASE_ORDER.getValue() == saOrder.getOrderType() && CollectionUtil.isNotEmpty(saOrderItemsList)) { if (EOrderType.SPECIAL_REPURCHASE_ORDER.getValue() == saOrder.getOrderType()
&& CollectionUtil.isNotEmpty(saOrderItemsList)) {
// 注意同一个商品只能用一次 // 注意同一个商品只能用一次
Map<Integer, List<SaOrderItems>> orderItemMap = new HashMap<>(); Map<Integer, List<SaOrderItems>> orderItemMap = new HashMap<>();
Set<Integer> productIdSet = new HashSet<>(); Set<Integer> productIdSet = new HashSet<>();
@ -530,6 +531,9 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
List<AcPickExt> acPickExtList = iAcPickService.queryList(AcPickQueryParam.builder().pkMember(saOrder.getPkMember()).pickType(EPickType.COUPON.getValue()).build(), saOrder.getPkCountry()); List<AcPickExt> acPickExtList = iAcPickService.queryList(AcPickQueryParam.builder().pkMember(saOrder.getPkMember()).pickType(EPickType.COUPON.getValue()).build(), saOrder.getPkCountry());
// 查询提货专区是否有代金券 // 查询提货专区是否有代金券
if (CollectionUtil.isNotEmpty(acPickExtList)) { if (CollectionUtil.isNotEmpty(acPickExtList)) {
// 可用法宝券数据
int pickQuantity = acPickExtList.get(0).getUsableQuantity();
Map<BigDecimal, AcPickExt> pickExtMap = new HashMap<>(ComputeUtil.mapInitCapacity(acPickExtList.size())); Map<BigDecimal, AcPickExt> pickExtMap = new HashMap<>(ComputeUtil.mapInitCapacity(acPickExtList.size()));
acPickExtList.forEach(acPickExt -> { acPickExtList.forEach(acPickExt -> {
if (acPickExt.getUsableQuantity() > 0) { if (acPickExt.getUsableQuantity() > 0) {
@ -552,10 +556,29 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
for (SaOrderItems saOrderItems : orderItemMap.get(pkWares)) { for (SaOrderItems saOrderItems : orderItemMap.get(pkWares)) {
if (productDtoMap.containsKey(saOrderItems.getPkProduct())) { if (productDtoMap.containsKey(saOrderItems.getPkProduct())) {
BdProductExt productExt = productDtoMap.get(saOrderItems.getPkProduct()); BdProductExt productExt = productDtoMap.get(saOrderItems.getPkProduct());
payMoney = ComputeUtil.computeSubtract(payMoney, ComputeUtil.computeMultiply(productExt.getRetailPrice(), saOrderItems.getWaresQuantity()));
// 当前明细使用法宝券数量
int useQuantity;
// TODO new 实际能抵扣多少需要判断是否有足够的法宝券
BigDecimal payAccount12 = cuMemberAccount.getPayAccount12() == null ? BigDecimal.ZERO : cuMemberAccount.getPayAccount12(); BigDecimal payAccount12 = cuMemberAccount.getPayAccount12() == null ? BigDecimal.ZERO : cuMemberAccount.getPayAccount12();
cuMemberAccount.setPayAccount12(ComputeUtil.computeAdd(payAccount12, ComputeUtil.computeMultiply(productExt.getRetailPrice(), saOrderItems.getWaresQuantity()))); if (pickQuantity >= saOrderItems.getWaresQuantity()) {
for (int i = 0; i < saOrderItems.getWaresQuantity(); i++) { // 法宝券 >= 商品数量直接使用商品数量
payMoney = ComputeUtil.computeSubtract(payMoney, ComputeUtil.computeMultiply(productExt.getRetailPrice(), saOrderItems.getWaresQuantity()));
cuMemberAccount.setPayAccount12(ComputeUtil.computeAdd(payAccount12, ComputeUtil.computeMultiply(productExt.getRetailPrice(), saOrderItems.getWaresQuantity())));
useQuantity = saOrderItems.getWaresQuantity();
pickQuantity -= saOrderItems.getWaresQuantity();
} else {
// 法宝券 < 商品数量直接使用法宝券数量
payMoney = ComputeUtil.computeSubtract(payMoney, ComputeUtil.computeMultiply(productExt.getRetailPrice(), pickQuantity));
cuMemberAccount.setPayAccount12(ComputeUtil.computeAdd(payAccount12, ComputeUtil.computeMultiply(productExt.getRetailPrice(), pickQuantity)));
useQuantity = pickQuantity;
pickQuantity = 0;
}
saOrderItems.setUsePick(useQuantity);
for (int i = 0; i < useQuantity; i++) {
pickExtList.add(pickExtMap.get(productExt.getRetailPrice())); pickExtList.add(pickExtMap.get(productExt.getRetailPrice()));
} }
break; break;
@ -1065,7 +1088,7 @@ public class SaOrderServiceImpl extends ServiceImpl<SaOrderMapper, SaOrder> impl
} }
} }
} }
// 保存订单数据 // 保存订单数据
encapsulationSaOrder(saOrderExt); encapsulationSaOrder(saOrderExt);
// 乐学注册乐学升级订单处理法宝券 // 乐学注册乐学升级订单处理法宝券

View File

@ -138,6 +138,7 @@
<result column="WARES_CODE" property="waresCode"/> <result column="WARES_CODE" property="waresCode"/>
<result column="MAKER_INCOME" property="makerIncome"/> <result column="MAKER_INCOME" property="makerIncome"/>
<result column="ITEM_PK_STOREHOUSE" property="pkStorehouse"/> <result column="ITEM_PK_STOREHOUSE" property="pkStorehouse"/>
<result column="USE_PICK" property="usePick"/>
</collection> </collection>
<collection property="orderBonusList" ofType="com.hzs.common.domain.sale.order.SaOrderBonus"> <collection property="orderBonusList" ofType="com.hzs.common.domain.sale.order.SaOrderBonus">
<result column="PK_BONUS_ORDER" property="pkOrder"/> <result column="PK_BONUS_ORDER" property="pkOrder"/>
@ -240,6 +241,7 @@
st.specs_name, st.specs_name,
st.ass_achievement, st.ass_achievement,
st.is_maker_gift, st.is_maker_gift,
st.USE_PICK,
0 channel, 0 channel,
sb.pk_order pk_bonus_order, sb.pk_order pk_bonus_order,
bt.bonus_value pk_bonus_items, bt.bonus_value pk_bonus_items,

View File

@ -1,11 +1,9 @@
package com.hzs.common.core.enums; package com.hzs.common.core.enums;
import com.hzs.common.core.constant.EnumsPrefixConstants; import com.hzs.common.core.constant.EnumsPrefixConstants;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
/** /**
* @Description: * @Description:
* @Author: yuhui * @Author: yuhui
@ -27,12 +25,11 @@ public enum ERepurchaseType {
/** /**
* 有这个复购的时候消耗代金券 单价数量一致可以消耗 * 有这个复购的时候消耗代金券 单价数量一致可以消耗
*/ */
LE_XUE_REPURCHASE(3, "乐学复购", 0, EnumsPrefixConstants.REPURCHASE_TYPE + "1") LE_XUE_REPURCHASE(3, "乐学复购", 0, EnumsPrefixConstants.REPURCHASE_TYPE + "1");
;
private final int value; private final int value;
private final String label; private final String label;
/** /**
* 是否启用0=,1= -- 来源EYesNo * 是否启用0=,1= -- 来源EYesNo
*/ */

View File

@ -9,9 +9,7 @@ import org.apache.ibatis.type.JdbcType;
import java.math.BigDecimal; import java.math.BigDecimal;
/** /**
* <p>
* 销售订单-明细表 * 销售订单-明细表
* </p>
* *
* @author hzs * @author hzs
* @since 2022-08-31 * @since 2022-08-31
@ -208,4 +206,11 @@ public class SaOrderItems extends BaseEntity {
*/ */
@TableField(exist = false) @TableField(exist = false)
private Long skuId; private Long skuId;
/**
* 使用多少法宝券
*/
@TableField("USE_PICK")
private Integer usePick;
} }

View File

@ -64,7 +64,7 @@ public class OrderJob {
public void sendOrderAchieveMsg() { public void sendOrderAchieveMsg() {
Date startDate = DateUtils.currentDate(); Date startDate = DateUtils.currentDate();
Date endDate = DateUtils.afterDate(1, ChronoUnit.DAYS); Date endDate = DateUtils.afterDate(1, ChronoUnit.DAYS);
List<SaOrderExt> saOrderExtList = orderServiceApi.querySaOrderByDay(startDate, endDate).getData(); List<SaOrderExt> saOrderExtList = orderServiceApi.listSaOrderByDay(startDate, endDate, null).getData();
if (CollectionUtil.isNotEmpty(saOrderExtList)) { if (CollectionUtil.isNotEmpty(saOrderExtList)) {
BigDecimal registerAchieve = BigDecimal.ZERO; BigDecimal registerAchieve = BigDecimal.ZERO;
BigDecimal updateAchieve = BigDecimal.ZERO; BigDecimal updateAchieve = BigDecimal.ZERO;

View File

@ -4,8 +4,9 @@ import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.hzs.activity.tourism.IAcTourismServiceApi; import com.hzs.bonus.settle.IMemberSettleBonusApi;
import com.hzs.common.core.domain.R; import com.hzs.common.core.domain.R;
import com.hzs.common.core.utils.DateUtils;
import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.core.web.domain.AjaxResult;
import com.hzs.system.base.IAreaServiceApi; import com.hzs.system.base.IAreaServiceApi;
import com.hzs.system.base.dto.AreaDTO; import com.hzs.system.base.dto.AreaDTO;
@ -17,6 +18,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
/** /**
@ -31,25 +33,17 @@ import java.util.*;
@RequestMapping("/job-test") @RequestMapping("/job-test")
public class JobTestController { public class JobTestController {
@DubboReference
IAcTourismServiceApi iAcTourismServiceApi;
@DubboReference @DubboReference
IAreaServiceApi iAreaServiceApi; IAreaServiceApi iAreaServiceApi;
/** @DubboReference
* 测试旅游活动定时任务 IMemberSettleBonusApi memberBonusSettleApi;
*
* @return @GetMapping("/test")
*/ public AjaxResult test() {
@GetMapping("/test-tourism") Date startDate = DateUtils.beforeDate(1, ChronoUnit.DAYS, DateUtils.currentDate());
public AjaxResult testTourism() { log.info("开始进行奖金结算");
R resultR = iAcTourismServiceApi.handleTourismData(); memberBonusSettleApi.autoCalculateBonus(startDate);
if (resultR.isSuccess()) {
log.info("测试 旅游活动更新积分 执行成功");
} else {
log.error("测试 旅游活动更新积分 执行失败");
}
log.info("================处理完成==================");
return AjaxResult.success(); return AjaxResult.success();
} }