From de3caf9321c20e41059ebc913bbe6dcd454e3a75 Mon Sep 17 00:00:00 2001 From: cabbage <281119120@qq.com> Date: Thu, 10 Apr 2025 17:23:09 +0800 Subject: [PATCH] =?UTF-8?q?##=20=E4=B9=90=E5=AD=A6=E5=A4=8D=E8=B4=AD?= =?UTF-8?q?=E7=BA=A7=E5=B7=AE=E6=B3=95=E5=AE=9D=E5=88=B8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E7=89=88=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hzs/sale/order/ISaOrderServiceApi.java | 2 +- .../impl/BonusSettlePurchaseHandle.java | 260 ++++++++++-------- .../service/impl/BonusSettleServiceImpl.java | 5 +- .../impl/CuMemberBonusServiceImpl.java | 2 +- .../api/ApiOthSaOrderController.java | 1 + .../provider/SaOrderServiceProvider.java | 4 +- .../service/impl/SaOrderServiceImpl.java | 43 ++- .../mapper/sale/order/SaOrderMapper.xml | 2 + .../common/core/enums/ERepurchaseType.java | 7 +- .../domain/sale/order/SaOrderItems.java | 9 +- .../main/java/com/hzs/third/job/OrderJob.java | 2 +- .../job/controller/JobTestController.java | 28 +- 12 files changed, 212 insertions(+), 153 deletions(-) diff --git a/hzs-api/hzs-api-sale/src/main/java/com/hzs/sale/order/ISaOrderServiceApi.java b/hzs-api/hzs-api-sale/src/main/java/com/hzs/sale/order/ISaOrderServiceApi.java index 5fc8848e..8596efed 100644 --- a/hzs-api/hzs-api-sale/src/main/java/com/hzs/sale/order/ISaOrderServiceApi.java +++ b/hzs-api/hzs-api-sale/src/main/java/com/hzs/sale/order/ISaOrderServiceApi.java @@ -32,7 +32,7 @@ public interface ISaOrderServiceApi { * @Author: sui q * @Date: 2022/11/2 16:30 */ - R> querySaOrderByDay(Date startDate, Date endDate); + R> listSaOrderByDay(Date startDate, Date endDate, String orderCode); /** * 查询时间范围内的所有订单,按照订单时间排序,只能用于奖金结算 diff --git a/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettlePurchaseHandle.java b/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettlePurchaseHandle.java index 8914e81b..f66963f1 100644 --- a/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettlePurchaseHandle.java +++ b/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettlePurchaseHandle.java @@ -653,15 +653,8 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle { List acPickMemberLogList = acPickServiceApi.queryPickMemberLog(specialOrderList).getData(); // key: 会员ID + 提货专区ID Map pickMemberLogMap = new HashMap<>(ComputeUtil.mapInitCapacity(acPickMemberLogList.size())); - // key: 会员ID + 订单ID - Map orderMemberMap = new HashMap<>(ComputeUtil.mapInitCapacity(acPickMemberLogList.size())); if (CollectionUtil.isNotEmpty(acPickMemberLogList)) { - acPickMemberLogList.forEach(acPickMemberLog -> { - pickMemberLogMap.put(acPickMemberLog.getPkMember().toString() + acPickMemberLog.getPkId(), acPickMemberLog); - orderMemberMap.put(acPickMemberLog.getPkMember() + acPickMemberLog.getPickOrder(), acPickMemberLog); - } - ); - + acPickMemberLogList.forEach(acPickMemberLog -> pickMemberLogMap.put(acPickMemberLog.getPkMember().toString() + acPickMemberLog.getPkPick(), acPickMemberLog)); leXueRangeParam.setAcPickMemberLogList(acPickMemberLogList); } @@ -677,6 +670,14 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle { }); List acPickExtList = new ArrayList<>(); for (SaOrderExt saOrderExt : specialOrderList) { + // 商品使用法宝券数量(key: 商品ID,value: 法宝券数量) + Map 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()) { if (EYesNo.YES.getIntValue() == saOrderItemsExt.getIsGift() || ComputeUtil.compareEqual(saOrderItemsExt.getPrice(), BigDecimal.ZERO) @@ -694,108 +695,35 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle { break; } - // 订单会员推荐人 - Long pkParent = sourceMemberSettleExt.getPkParent(); - // 订单会员等级 - int gradeValue = sourceMemberSettleExt.getGradeValue(); + // 当前订单明细使用了法宝券 + Integer useNum = productPickMap.get(saOrderItemsExt.getPkWares()); - // 订单是否使用法宝券(true 使用了法宝券) - boolean useFlag = null != orderMemberMap.get(saOrderExt.getPkMember() + saOrderExt.getOrderCode()) ? Boolean.TRUE : Boolean.FALSE; - if (EGrade.S_VIP.getValue() == gradeValue && useFlag) { - // 下单会员是 V4 并且 使用了法宝券,直接结束 - break; - } - - // 找不到父级了或者找到第一个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; - } + if (null != useNum) { + // 订单使用了法宝券 + if (useNum.equals(saOrderItemsExt.getWaresQuantity())) { + // 法宝券和商品数量一致 + this.usePick(specialmeberSettleExtMap, rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, saOrderItemsExt, + sourceMemberSettleExt, cuMemberBonusRangeList, acPickExtList); } else { - // 订单没有使用法宝券 - if (gradeValue <= targetMemberSettleExt.getGradeValue() && EGrade.YOU_KE.getValue() == targetMemberSettleExt.getGradeValue() && V1Flag && V2Flag && V3Flag) { - // 订单会员等级小于推荐人等级 并且 推荐人是 V1 并且 V1 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; - V1Flag = Boolean.FALSE; - } else 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; - } + // 法宝券和商品数量不一致,需要拆分处理 + // 使用法宝券部分处理 + SaOrderItemsExt tmpItems1 = BeanUtil.copyProperties(saOrderItemsExt, SaOrderItemsExt.class); + tmpItems1.setWaresQuantity(useNum); + tmpItems1.setUsePick(useNum); + this.usePick(specialmeberSettleExtMap, rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, tmpItems1, + sourceMemberSettleExt, cuMemberBonusRangeList, acPickExtList); + + // 未使用法宝券部分处理 + SaOrderItemsExt tmpItems2 = BeanUtil.copyProperties(saOrderItemsExt, SaOrderItemsExt.class); + tmpItems2.setWaresQuantity(saOrderItemsExt.getWaresQuantity() - useNum); + tmpItems2.setUsePick(saOrderItemsExt.getWaresQuantity() - useNum); + this.notUsePick(specialmeberSettleExtMap, rangeDtoMap, bonusConfigDTO, period, cuMemberBonusMap, saOrderExt, tmpItems2, + sourceMemberSettleExt, cuMemberBonusRangeList, acPickExtList); } + } 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 specialmeberSettleExtMap, Map rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period, + Map cuMemberBonusMap, SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt, CuMemberSettleExt sourceMemberSettleExt, + List cuMemberBonusRangeList, List 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 specialmeberSettleExtMap, Map rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period, + Map cuMemberBonusMap, SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt, CuMemberSettleExt sourceMemberSettleExt, + List cuMemberBonusRangeList, List 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 rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period, Map cuMemberBonusMap, + SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt, CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt targetMemberSettleExt, + List cuMemberBonusRangeList, List 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 rangeDtoMap, BonusConfigDTO bonusConfigDTO, Integer period, Map cuMemberBonusMap, SaOrderExt saOrderExt, SaOrderItemsExt saOrderItemsExt, - CuMemberSettleExt sourceMemberSettleExt, - CuMemberSettleExt targetMemberSettleExt, List cuMemberBonusRangeList) { + CuMemberSettleExt sourceMemberSettleExt, CuMemberSettleExt targetMemberSettleExt, + List cuMemberBonusRangeList) { if (targetMemberSettleExt.getUsableQuantity() != null && targetMemberSettleExt.getUsableQuantity() > 0) { + // 扣减数量(如果剩余法宝券 大于等于 商品数量,则使用商品数量,否则使用法宝券数量) + int waresQuantity = targetMemberSettleExt.getUsableQuantity() >= saOrderItemsExt.getWaresQuantity() ? saOrderItemsExt.getWaresQuantity() : targetMemberSettleExt.getUsableQuantity(); + CuMemberBonus cuMemberBonus = getCuMemberBonus(period, cuMemberBonusMap, saOrderExt, targetMemberSettleExt); CuMemberBonusRange cuMemberBonusRange = getCuMemberBonusRange(bonusConfigDTO, saOrderExt, targetMemberSettleExt, cuMemberBonus); cuMemberBonusRange.setCalAchieve(saOrderItemsExt.getAchievement()); 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)))); String key = targetMemberSettleExt.getPkSettleCountry().toString() + ERangeType.GRADE.getValue() + targetMemberSettleExt.getPkGrade(); cuMemberBonusRange.setPkRange(rangeDtoMap.get(key).getPkRange()); @@ -846,13 +882,13 @@ public class BonusSettlePurchaseHandle extends BonusSettleHandle { setPurchaseTotal(bdBonusDeduct, cuMemberBonus, cuMemberBonusRange); } cuMemberBonusRangeList.add(cuMemberBonusRange); - targetMemberSettleExt.setUsableQuantity(targetMemberSettleExt.getUsableQuantity() - saOrderItemsExt.getWaresQuantity()); + targetMemberSettleExt.setUsableQuantity(targetMemberSettleExt.getUsableQuantity() - waresQuantity); AcPickExt acPickExt = new AcPickExt(); acPickExt.setPkId(targetMemberSettleExt.getApPkId()); acPickExt.setPkMember(targetMemberSettleExt.getPkMember()); acPickExt.setOrderCode(saOrderExt.getOrderCode()); acPickExt.setPickType(EPickType.COUPON.getValue()); - acPickExt.setUsedQuantity(saOrderItemsExt.getWaresQuantity()); + acPickExt.setUsedQuantity(waresQuantity); acPickExt.setPkBaseConfig(0L); acPickExt.setPkDataId(targetMemberSettleExt.getPkDataId()); return acPickExt; diff --git a/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java b/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java index 30008f49..38534cfa 100644 --- a/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java +++ b/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/BonusSettleServiceImpl.java @@ -426,7 +426,7 @@ public class BonusSettleServiceImpl implements IBonusSettleService { // 计算完奖衔回退业绩,最终根据新增进行回写 // cuMemberTreeService.updateCuMemberBackSettle(cuMemberAchieveHashMap, currentSettleTableName); //********************************重新考核*********************************/ - // TODO new 乐学没有分红、复购考核,这个位置需要去掉 + // TODO new 乐学没有分红、复购考核,这个位置需要去掉??? 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)); + // 乐享奖金 bonusSettleRangeHandle.calculateLeEnjoyBonusBySaOrder(cuMemberBonusMap, bonusConfigDTO, recordDetailVO, period, yesterdayPeriod, isSameMonth); // 计算新零售团队奖金 // bonusSettleRangeHandle.calculateRetailBonusBySaOrder(settleDate, cuMemberBonusMap, bonusConfigDTO, recordDetailVO, // period, yesterdayPeriod, retailOrderList, isSameMonth); - // suiqing 验证是否月奖,验证是否是结算月底那一天,月底那一天计算云代,判断是否为月底 + // 验证是否月奖,验证是否是结算月底那一天,月底那一天计算云代,判断是否为月底 //*********************************计算云代奖金、 复购券均分收益************************/ if (settleDate.endsWith("10")) { // 计算云代奖金 diff --git a/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java b/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java index b3dedc68..c1b73a97 100644 --- a/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java +++ b/hzs-business/hzs-business-bonus/src/main/java/com/hzs/bonus/bonus/service/impl/CuMemberBonusServiceImpl.java @@ -644,7 +644,7 @@ public class CuMemberBonusServiceImpl extends ServiceImpl saOrderExtList = saOrderServiceApi.querySaOrderByDay(startDate, settleEndDate).getData(); + List saOrderExtList = saOrderServiceApi.listSaOrderByDay(startDate, settleEndDate, "SO1744257643744907").getData(); bonusSettleService.calculateCuMemberBonus(settleDate, saOrderExtList); return Boolean.TRUE; } diff --git a/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/controller/api/ApiOthSaOrderController.java b/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/controller/api/ApiOthSaOrderController.java index 913aaffd..a701bd41 100644 --- a/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/controller/api/ApiOthSaOrderController.java +++ b/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/controller/api/ApiOthSaOrderController.java @@ -81,6 +81,7 @@ public class ApiOthSaOrderController extends ParentOrderController { // 商品预售数量不足 return AjaxResult.error(SaOrderMsgConstants.WARES_PRE_SALE_QUANTITY_LACK); } + if (orderParam.getSpecialArea() != EOrderType.REGISTER_ORDER.getValue() && orderParam.getSpecialArea() != EOrderType.SPECIAL_REGISTER_ORDER.getValue()) { convertShoppingCarToSku(orderParam); diff --git a/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/provider/SaOrderServiceProvider.java b/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/provider/SaOrderServiceProvider.java index 8c0d5145..15bb8a41 100644 --- a/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/provider/SaOrderServiceProvider.java +++ b/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/provider/SaOrderServiceProvider.java @@ -50,8 +50,8 @@ public class SaOrderServiceProvider implements ISaOrderServiceApi { private ISaOrderService saOrderService; @Override - public R> querySaOrderByDay(Date startDate, Date endDate) { - return R.ok(saOrderService.querySaOrderByTime(startDate, endDate, null)); + public R> listSaOrderByDay(Date startDate, Date endDate, String orderCode) { + return R.ok(saOrderService.querySaOrderByTime(startDate, endDate, orderCode)); } @Override diff --git a/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java b/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java index 295422c0..ab4f9ebe 100644 --- a/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java +++ b/hzs-business/hzs-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java @@ -326,11 +326,6 @@ public class SaOrderServiceImpl extends ServiceImpl impl return redisService.lockKeyOnce(key); } - @Override - public List queryMemberAccountByCondition(CuMemberAccount cuMemberAccount) { - return memberAccountServiceApi.queryMemberAccountByCondition(cuMemberAccount).getData(); - } - @Override public CuMemberAccountExt queryOrderSpendDetails(CuMemberAccountExt cuMemberAccount, SaOrder saOrder, List orderItemList) { BigDecimal payMoney = saOrder.getOrderAmount(); @@ -386,6 +381,11 @@ public class SaOrderServiceImpl extends ServiceImpl impl return cuMemberAccount; } + @Override + public List queryMemberAccountByCondition(CuMemberAccount cuMemberAccount) { + return memberAccountServiceApi.queryMemberAccountByCondition(cuMemberAccount).getData(); + } + private Boolean handleSaOrderAmount(SaOrder saOrder, List orderItemList, CuMemberAccountExt cuMemberAccount, BigDecimal payMoney, BigDecimal postage, List areaCurrencyDTOList) { @@ -511,7 +511,8 @@ public class SaOrderServiceImpl extends ServiceImpl impl */ private BigDecimal handleLeXueYiKaoCoupon(CuMemberAccountExt cuMemberAccount, SaOrder saOrder, BigDecimal payMoney, List saOrderItemsList) { // 乐学易考,特殊复购订单查询有没有代金券,有代金券的扣除一张券 - if (EOrderType.SPECIAL_REPURCHASE_ORDER.getValue() == saOrder.getOrderType() && CollectionUtil.isNotEmpty(saOrderItemsList)) { + if (EOrderType.SPECIAL_REPURCHASE_ORDER.getValue() == saOrder.getOrderType() + && CollectionUtil.isNotEmpty(saOrderItemsList)) { // 注意同一个商品只能用一次 Map> orderItemMap = new HashMap<>(); Set productIdSet = new HashSet<>(); @@ -530,6 +531,9 @@ public class SaOrderServiceImpl extends ServiceImpl impl List acPickExtList = iAcPickService.queryList(AcPickQueryParam.builder().pkMember(saOrder.getPkMember()).pickType(EPickType.COUPON.getValue()).build(), saOrder.getPkCountry()); // 查询提货专区是否有代金券 if (CollectionUtil.isNotEmpty(acPickExtList)) { + // 可用法宝券数据 + int pickQuantity = acPickExtList.get(0).getUsableQuantity(); + Map pickExtMap = new HashMap<>(ComputeUtil.mapInitCapacity(acPickExtList.size())); acPickExtList.forEach(acPickExt -> { if (acPickExt.getUsableQuantity() > 0) { @@ -552,10 +556,29 @@ public class SaOrderServiceImpl extends ServiceImpl impl for (SaOrderItems saOrderItems : orderItemMap.get(pkWares)) { if (productDtoMap.containsKey(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(); - cuMemberAccount.setPayAccount12(ComputeUtil.computeAdd(payAccount12, ComputeUtil.computeMultiply(productExt.getRetailPrice(), saOrderItems.getWaresQuantity()))); - for (int i = 0; i < saOrderItems.getWaresQuantity(); i++) { + if (pickQuantity >= saOrderItems.getWaresQuantity()) { + // 法宝券 >= 商品数量,直接使用商品数量 + 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())); } break; @@ -1065,7 +1088,7 @@ public class SaOrderServiceImpl extends ServiceImpl impl } } } - // 封闭保存订单数据 + // 封装保存订单数据 encapsulationSaOrder(saOrderExt); // 乐学注册、乐学升级订单处理法宝券 diff --git a/hzs-business/hzs-business-sale/src/main/resources/mapper/sale/order/SaOrderMapper.xml b/hzs-business/hzs-business-sale/src/main/resources/mapper/sale/order/SaOrderMapper.xml index 690d1c57..2efdb0fd 100644 --- a/hzs-business/hzs-business-sale/src/main/resources/mapper/sale/order/SaOrderMapper.xml +++ b/hzs-business/hzs-business-sale/src/main/resources/mapper/sale/order/SaOrderMapper.xml @@ -138,6 +138,7 @@ + @@ -240,6 +241,7 @@ st.specs_name, st.ass_achievement, st.is_maker_gift, + st.USE_PICK, 0 channel, sb.pk_order pk_bonus_order, bt.bonus_value pk_bonus_items, diff --git a/hzs-common/hzs-common-core/src/main/java/com/hzs/common/core/enums/ERepurchaseType.java b/hzs-common/hzs-common-core/src/main/java/com/hzs/common/core/enums/ERepurchaseType.java index 6cadb540..4bf417d7 100644 --- a/hzs-common/hzs-common-core/src/main/java/com/hzs/common/core/enums/ERepurchaseType.java +++ b/hzs-common/hzs-common-core/src/main/java/com/hzs/common/core/enums/ERepurchaseType.java @@ -1,11 +1,9 @@ package com.hzs.common.core.enums; - import com.hzs.common.core.constant.EnumsPrefixConstants; import lombok.AllArgsConstructor; import lombok.Getter; - /** * @Description: * @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 String label; + /** * 是否启用(0=是,1=否) -- 来源EYesNo */ diff --git a/hzs-common/hzs-common-domain/src/main/java/com/hzs/common/domain/sale/order/SaOrderItems.java b/hzs-common/hzs-common-domain/src/main/java/com/hzs/common/domain/sale/order/SaOrderItems.java index 9a07c60c..fc360756 100644 --- a/hzs-common/hzs-common-domain/src/main/java/com/hzs/common/domain/sale/order/SaOrderItems.java +++ b/hzs-common/hzs-common-domain/src/main/java/com/hzs/common/domain/sale/order/SaOrderItems.java @@ -9,9 +9,7 @@ import org.apache.ibatis.type.JdbcType; import java.math.BigDecimal; /** - *

* 销售订单-明细表 - *

* * @author hzs * @since 2022-08-31 @@ -208,4 +206,11 @@ public class SaOrderItems extends BaseEntity { */ @TableField(exist = false) private Long skuId; + + /** + * 使用多少法宝券 + */ + @TableField("USE_PICK") + private Integer usePick; + } diff --git a/hzs-third/src/main/java/com/hzs/third/job/OrderJob.java b/hzs-third/src/main/java/com/hzs/third/job/OrderJob.java index f9c3ae43..38c72741 100644 --- a/hzs-third/src/main/java/com/hzs/third/job/OrderJob.java +++ b/hzs-third/src/main/java/com/hzs/third/job/OrderJob.java @@ -64,7 +64,7 @@ public class OrderJob { public void sendOrderAchieveMsg() { Date startDate = DateUtils.currentDate(); Date endDate = DateUtils.afterDate(1, ChronoUnit.DAYS); - List saOrderExtList = orderServiceApi.querySaOrderByDay(startDate, endDate).getData(); + List saOrderExtList = orderServiceApi.listSaOrderByDay(startDate, endDate, null).getData(); if (CollectionUtil.isNotEmpty(saOrderExtList)) { BigDecimal registerAchieve = BigDecimal.ZERO; BigDecimal updateAchieve = BigDecimal.ZERO; diff --git a/hzs-third/src/main/java/com/hzs/third/job/controller/JobTestController.java b/hzs-third/src/main/java/com/hzs/third/job/controller/JobTestController.java index d8855c92..cdf27b5b 100644 --- a/hzs-third/src/main/java/com/hzs/third/job/controller/JobTestController.java +++ b/hzs-third/src/main/java/com/hzs/third/job/controller/JobTestController.java @@ -4,8 +4,9 @@ import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; 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.utils.DateUtils; import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.system.base.IAreaServiceApi; 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.RestController; +import java.time.temporal.ChronoUnit; import java.util.*; /** @@ -31,25 +33,17 @@ import java.util.*; @RequestMapping("/job-test") public class JobTestController { - @DubboReference - IAcTourismServiceApi iAcTourismServiceApi; @DubboReference IAreaServiceApi iAreaServiceApi; - /** - * 测试旅游活动定时任务 - * - * @return - */ - @GetMapping("/test-tourism") - public AjaxResult testTourism() { - R resultR = iAcTourismServiceApi.handleTourismData(); - if (resultR.isSuccess()) { - log.info("测试 旅游活动更新积分 执行成功"); - } else { - log.error("测试 旅游活动更新积分 执行失败"); - } - log.info("================处理完成=================="); + @DubboReference + IMemberSettleBonusApi memberBonusSettleApi; + + @GetMapping("/test") + public AjaxResult test() { + Date startDate = DateUtils.beforeDate(1, ChronoUnit.DAYS, DateUtils.currentDate()); + log.info("开始进行奖金结算"); + memberBonusSettleApi.autoCalculateBonus(startDate); return AjaxResult.success(); }