From 1858cbc6286823b7f422eeb69e6db0ad2fec3a08 Mon Sep 17 00:00:00 2001 From: zhangheng Date: Mon, 20 Oct 2025 11:17:09 +0800 Subject: [PATCH] =?UTF-8?q?##=20=E5=8A=A0=E8=B4=AD=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E6=8A=A5=E5=8D=95=E8=B5=A0=E9=80=81=E9=83=A8=E5=88=86bug?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hzs/sale/order/ISaOrderServiceApi.java | 1 - .../AcDeclarationGiftConfigController.java | 3 +- .../param/AcDeclarationProductParam.java | 3 + .../AcDeclarationGiftConfigServiceImpl.java | 111 ++++++++------ .../provider/AcTourismServiceProvider.java | 144 +++++++++++++++++- .../provider/SaOrderServiceProvider.java | 106 ------------- .../activity/add/AcAddUpgradeConfigMapper.xml | 1 + .../main/java/com/hzs/third/job/OrderJob.java | 15 -- 8 files changed, 215 insertions(+), 169 deletions(-) diff --git a/bd-api/bd-api-sale/src/main/java/com/hzs/sale/order/ISaOrderServiceApi.java b/bd-api/bd-api-sale/src/main/java/com/hzs/sale/order/ISaOrderServiceApi.java index e269c790..4e93ec4a 100644 --- a/bd-api/bd-api-sale/src/main/java/com/hzs/sale/order/ISaOrderServiceApi.java +++ b/bd-api/bd-api-sale/src/main/java/com/hzs/sale/order/ISaOrderServiceApi.java @@ -147,6 +147,5 @@ public interface ISaOrderServiceApi { */ List singleItemStat(SingleItemStatParamDTO singleItemStatParamDTO); - R autoPushDeclaration(); } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/controller/manage/AcDeclarationGiftConfigController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/controller/manage/AcDeclarationGiftConfigController.java index 6efc7a5c..d190a1d6 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/controller/manage/AcDeclarationGiftConfigController.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/controller/manage/AcDeclarationGiftConfigController.java @@ -18,6 +18,7 @@ import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.security.service.UserTokenService; import com.hzs.common.security.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; @@ -51,7 +52,7 @@ public class AcDeclarationGiftConfigController extends BaseController { */ @Log(module = EOperationModule.AC_DECLARATION_GIFT_SAVE, business = EOperationBusiness.AC_DECLARATION_GIFT_SAVE, method = EOperationMethod.INSERT, remark = "报单赠送添加") @PostMapping("/save") - public AjaxResult declarationConfigSave(@RequestBody AcDeclarationParam acDeclarationParam) { + public AjaxResult declarationConfigSave(@RequestBody @Validated AcDeclarationParam acDeclarationParam) { acDeclarationParam.setPkCountry(SecurityUtils.getPkCountry()); acDeclarationParam.setPkMember(SecurityUtils.getUserId()); acDeclarationParam.setLoginUser(userTokenService.getLoginUser()); diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/param/AcDeclarationProductParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/param/AcDeclarationProductParam.java index 533930de..f8fc1583 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/param/AcDeclarationProductParam.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/param/AcDeclarationProductParam.java @@ -6,6 +6,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; + @Data @AllArgsConstructor @NoArgsConstructor @@ -32,6 +34,7 @@ public class AcDeclarationProductParam { * 产品规格(逗号分隔) */ @Excel(name = "产品规格") + @NotNull(message = "产品规格不能为空") private String specsName; /** diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/service/impl/AcDeclarationGiftConfigServiceImpl.java b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/service/impl/AcDeclarationGiftConfigServiceImpl.java index 91a9a105..83bef513 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/service/impl/AcDeclarationGiftConfigServiceImpl.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/service/impl/AcDeclarationGiftConfigServiceImpl.java @@ -26,6 +26,7 @@ import com.hzs.common.core.constant.CountryConstants; import com.hzs.common.core.enums.EActType; import com.hzs.common.core.enums.EApprovalBusiness; import com.hzs.common.core.enums.EControlType; +import com.hzs.common.core.enums.ERegistrationAuthority; import com.hzs.common.core.utils.StringUtils; import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.domain.activity.base.AcBaseConfig; @@ -33,6 +34,8 @@ import com.hzs.common.domain.activity.base.AcGoalMemberConfig; import com.hzs.common.domain.activity.pick.AcPick; import com.hzs.common.security.utils.SecurityUtils; import com.hzs.sale.product.service.IBdProductService; +import com.hzs.sale.wares.service.IBdWaresGradeService; +import com.hzs.system.config.IGradeServiceApi; import com.hzs.system.sys.dto.LoginUser; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -71,6 +74,8 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl list = baseMapper.selectList(new LambdaQueryWrapper() - .eq(AcDeclarationGiftConfig::getPkBaseId,pkId) - .eq(AcDeclarationGiftConfig::getDelFlag,0)); + .eq(AcDeclarationGiftConfig::getPkBaseId, pkId) + .eq(AcDeclarationGiftConfig::getDelFlag, 0)); ArrayList acDeclarationConfigParams = new ArrayList<>(); - list.forEach(item->{ + list.forEach(item -> { AcDeclarationConfigParam acDeclarationConfigParam = BeanUtil.copyProperties(item, AcDeclarationConfigParam.class); List declarationConfigParams = iAcDeclarationGiftDetailService.listByPKRuleId(item.getPkId()); acDeclarationConfigParam.setAcDeclarationProductParamList(declarationConfigParams); @@ -94,13 +99,14 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl acDeclarationConfigParams) { + private String validateDuplicateConfig(AcDeclarationParam acDeclarationParam) { + List acDeclarationConfigParams = acDeclarationParam.getAcDeclarationConfigParams(); + // 获取当前时间还有效的报单赠送活动 - List validBaseConfigs = iAcBaseConfigService.list( - new LambdaQueryWrapper() - .le(AcBaseConfig::getActStartDate, new Date()) - .ge(AcBaseConfig::getActEndDate, new Date()) - .eq(AcBaseConfig::getActType, EActType.DECLARATION_GIFT.getValue()) - .eq(AcBaseConfig::getDelFlag, 0) - ); - - if (CollectionUtils.isEmpty(validBaseConfigs)) { - log.info("当前没有有效的报单赠送活动,可以直接添加新配置"); - // 可以直接执行新增 - return null; + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.le(AcBaseConfig::getActStartDate, new Date()) + .ge(AcBaseConfig::getActEndDate, new Date()) + .eq(AcBaseConfig::getActType, EActType.DECLARATION_GIFT.getValue()) + .eq(AcBaseConfig::getDelFlag, 0); + if (acDeclarationParam.getActivityParam().getPkId() != null) { + queryWrapper.ne(AcBaseConfig::getPkId, acDeclarationParam.getActivityParam().getPkId()); } + List validBaseConfigs = iAcBaseConfigService.list(queryWrapper); - // 获取报单赠送详情配置 - List baseIds = validBaseConfigs.stream() - .map(AcBaseConfig::getPkId) + // 先把新增组合转换成List + List newComboList = acDeclarationConfigParams.stream() + .filter(Objects::nonNull) + .map(cfg -> ERegistrationAuthority.getEnumByValue(cfg.getRegisterAuthority()).getLabel() + + "_" + iGradeServiceApi.getGrade(cfg.getSpecifyLevel()).getData().getGradeName()) .collect(Collectors.toList()); - List existingConfigs = iAcDeclarationGiftConfigService.list( - new LambdaQueryWrapper() - .in(AcDeclarationGiftConfig::getPkBaseId, baseIds) - .eq(AcDeclarationGiftConfig::getDelFlag, 0) - ); + // 校验新增组合内部是否有重复 + Map newCountMap = newComboList.stream() + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); - // 获取报单赠送报单等级和指定等级组合 - Set existingComboSet = existingConfigs.stream() - .map(cfg -> cfg.getRegisterAuthority() + "_" + cfg.getSpecifyLevel()) + Set internalDuplicates = newCountMap.entrySet().stream() + .filter(entry -> entry.getValue() > 1) + .map(Map.Entry::getKey) .collect(Collectors.toSet()); - // 当前配置活动数据报单等级和指定等级组合 - Set newComboSet = acDeclarationConfigParams.stream() - .filter(Objects::nonNull) - .map(cfg -> cfg.getRegisterAuthority() + "_" + cfg.getSpecifyLevel()) - .collect(Collectors.toSet()); - - // 判断是否有重复值,有重复值不允许添加 - Set duplicates = newComboSet.stream() - .filter(existingComboSet::contains) - .collect(Collectors.toSet()); - - if (!duplicates.isEmpty()) { - return "新增活动配置中存在重复的报单等级+指定等级组合: " + duplicates; + if (!internalDuplicates.isEmpty()) { + return "新增活动配置内部存在重复的报单等级+指定等级组合: " + internalDuplicates; } + + // 校验新增组合是否与已有数据库组合重复 + if (!CollectionUtils.isEmpty(validBaseConfigs)) { + List baseIds = validBaseConfigs.stream() + .map(AcBaseConfig::getPkId) + .collect(Collectors.toList()); + + List existingConfigs = iAcDeclarationGiftConfigService.list( + new LambdaQueryWrapper() + .in(AcDeclarationGiftConfig::getPkBaseId, baseIds) + .eq(AcDeclarationGiftConfig::getDelFlag, 0) + ); + + Set existingComboSet = existingConfigs.stream() + .map(cfg -> ERegistrationAuthority.getEnumByValue(cfg.getRegisterAuthority()).getLabel() + + "_" + iGradeServiceApi.getGrade(cfg.getSpecifyLevel()).getData().getGradeName()) + .collect(Collectors.toSet()); + + Set dbDuplicates = newComboList.stream() + .filter(existingComboSet::contains) + .collect(Collectors.toSet()); + + if (!dbDuplicates.isEmpty()) { + return "新增活动配置中存在与已有活动重复的报单等级+指定等级组合: " + dbDuplicates; + } + } + return null; + } @Override + @Transactional(rollbackFor = Exception.class) public String updateConfig(AcDeclarationParam acDeclarationParam) { LoginUser loginUser = acDeclarationParam.getLoginUser(); if (loginUser == null) { log.error("登录用户信息为空"); return "登录用户信息为空"; } - String validated = validateDuplicateConfig(acDeclarationParam.getAcDeclarationConfigParams()); + String validated = validateDuplicateConfig(acDeclarationParam); if (validated != null) { return validated; } @@ -188,6 +210,7 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl() .eq(AcDeclarationGiftDetail::getPkBaseId, pkId)); // 添加加购活动配置 - saveDeclarationConfig(acDeclarationConfigParams,baseConfig); + saveDeclarationConfig(acDeclarationConfigParams, baseConfig); } } @@ -267,6 +289,7 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl handleTourismData() { @@ -37,9 +67,13 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi { } @Override + @Transactional(rollbackFor = Exception.class) public R handleDeclarationData() { try { - iAcDeclarationGiftConfigService.handleDeclarationData(); + R del = saOrderPushDel(); + if (del.isSuccess()) { + iAcDeclarationGiftConfigService.handleDeclarationData(); + } return R.ok(); } catch (Exception e) { log.error("报单赠送更新提货列表异常", e); @@ -47,4 +81,110 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi { return R.fail(); } + private R saOrderPushDel() { + // 获取所属国家 + Integer pkCountry = CountryConstants.CHINA_COUNTRY; + // 获取 record 表最后一条数据 + AcDeclarationGiftRecord lastRecord = iAcDeclarationGiftRecordService.selectLastRecord(); + + // 默认查 7 天前的数据 + int daysAgo = 7; + + // 如果上次记录不是昨天(表示有漏数据) + if (lastRecord != null) { + LocalDate lastDate = lastRecord.getCreationTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + + LocalDate today = LocalDate.now(); + long diff = ChronoUnit.DAYS.between(lastDate, today); + + if (diff > 1) { + // 有漏跑天数,就加上差值 + daysAgo = (int) (7 + (diff - 1)); + log.info("检测到漏跑 {} 天,将查询 {} 天前的订单", diff - 1, daysAgo); + } + } + + // 获取目标日期(SYSDATE - daysAgo) + Date targetDate = java.sql.Date.valueOf(LocalDate.now().minusDays(7)); + log.info("处理日期: {}", targetDate); + + // 查询订单 + List orderList = iSaOrderService.list(new LambdaQueryWrapper() + .in(SaOrder::getOrderType, 1, 2, 4, 5) + .apply("TRUNC(PAY_TIME) = TRUNC(SYSDATE - {0})", daysAgo) + .eq(SaOrder::getOrderStatus, 1) + .eq(SaOrder::getDelFlag, 0)); + log.info("{}天无有效订单,处理结束", daysAgo); + // 获取所有7天前有效的报单赠送活动 + List acBaseConfigList = iAcBaseConfigService.list(new LambdaQueryWrapper() + .le(AcBaseConfig::getActStartDate, targetDate) + .ge(AcBaseConfig::getActEndDate, targetDate) + .eq(AcBaseConfig::getActType, 32) + .eq(AcBaseConfig::getDelFlag, 0)); + if (acBaseConfigList.isEmpty()) { + log.info("{}天前无有效报单赠送活动,处理结束", daysAgo); + return R.ok(); + } + // 报单赠送活动主键集合 + List declarationBaseIds = acBaseConfigList.stream().map(AcBaseConfig::getPkId).collect(Collectors.toList()); + // 查询所有报单赠送活动数据 + List declarationGiftConfigs = iAcDeclarationGiftConfigService.list(new LambdaQueryWrapper() + .in(AcDeclarationGiftConfig::getPkBaseId, declarationBaseIds) + .eq(AcDeclarationGiftConfig::getDelFlag, 0)); + Map configMap = declarationGiftConfigs.stream() + .collect(Collectors.toMap( + cfg -> cfg.getRegisterAuthority() + "_" + cfg.getSpecifyLevel(), + Function.identity(), + (a, b) -> b + )); + + orderList.forEach(order -> { + // 查看是否有重复订单 + int count = iAcDeclarationGiftRecordService.count(new LambdaQueryWrapper() + .eq(AcDeclarationGiftRecord::getOrderCode, order.getOrderCode()) + .eq(AcDeclarationGiftRecord::getDelFlag, 0)); + if (count > 0) { + log.warn("当前订单已同步至报单明细{}", order.getOrderCode()); + return; + } + // 查询会员信息 + R memberResult = iMemberServiceApi.getMember(order.getPkCreator()); + CuMember member = memberResult.getData(); + + if (member == null) { + log.warn("会员信息不存在, orderId={}", order.getPkId()); + return; + } + + // 组合 key 匹配活动配置 + String key = member.getRegisterAuthority() + "_" + member.getPkSettleGrade(); + AcDeclarationGiftConfig matchedConfig = configMap.get(key); + + if (matchedConfig == null) { + log.info("未找到匹配的报单赠送配置, 会员id={}, 注册权限={}, 结算等级={}", + member.getPkId(), member.getRegisterAuthority(), member.getPkSettleGrade()); + return; + } + + AcDeclarationGiftRecord record = AcDeclarationGiftRecord.builder() + .pkRuleId(matchedConfig.getPkId()) + .pkBaseId(matchedConfig.getPkBaseId()) + .orderCode(order.getOrderCode()) + .syncStatus(0) + .build(); + record.setCreationTime(new Date()); + record.setDelFlag(0); + record.setPkCreator(member.getPkId()); + record.setPkCountry(pkCountry); + // 插入数据库 + iAcDeclarationGiftRecordService.save(record); + + log.info("成功插入报单赠送记录 -> memberId={}, ruleId={}", + member.getPkId(), matchedConfig.getPkId()); + }); + return R.ok(); + } + } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/provider/SaOrderServiceProvider.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/provider/SaOrderServiceProvider.java index 45fcd4d0..96ba4614 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/provider/SaOrderServiceProvider.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/provider/SaOrderServiceProvider.java @@ -206,112 +206,6 @@ public class SaOrderServiceProvider implements ISaOrderServiceApi { return singleItemStatVoList.stream().map(a -> BeanUtil.copyProperties(a, SingleItemStatDTO.class)).collect(Collectors.toList()); } - @Override - @Transactional(rollbackFor = Exception.class) - public R autoPushDeclaration() { - // 获取所属国家 - Integer pkCountry = CountryConstants.CHINA_COUNTRY; - // 获取 record 表最后一条数据 - AcDeclarationGiftRecord lastRecord = iAcDeclarationGiftRecordService.selectLastRecord(); - // 默认查 7 天前的数据 - int daysAgo = 7; - - // 如果上次记录不是昨天(表示有漏数据) - if (lastRecord != null) { - LocalDate lastDate = lastRecord.getCreationTime().toInstant() - .atZone(ZoneId.systemDefault()) - .toLocalDate(); - - LocalDate today = LocalDate.now(); - long diff = ChronoUnit.DAYS.between(lastDate, today); - - if (diff > 1) { - // 有漏跑天数,就加上差值 - daysAgo = (int) (7 + (diff - 1)); - log.info("检测到漏跑 {} 天,将查询 {} 天前的订单", diff - 1, daysAgo); - } - } - - // 获取目标日期(SYSDATE - daysAgo) - Date targetDate = java.sql.Date.valueOf(LocalDate.now().minusDays(7)); - log.info("处理日期: {}", targetDate); - - // 查询订单 - List orderList = iSaOrderService.list(new LambdaQueryWrapper() - .in(SaOrder::getOrderType, 1, 2, 4, 5) - .apply("TRUNC(PAY_TIME) = TRUNC(SYSDATE - {0})", daysAgo) - .eq(SaOrder::getOrderStatus, 1) - .eq(SaOrder::getDelFlag, 0)); - log.info("{}天无有效订单,处理结束",daysAgo); - // 获取所有7天前有效的报单赠送活动 - List acBaseConfigList = iAcBaseConfigService.list(new LambdaQueryWrapper() - .le(AcBaseConfig::getActStartDate, targetDate) - .ge(AcBaseConfig::getActEndDate, targetDate) - .eq(AcBaseConfig::getActType, 32) - .eq(AcBaseConfig::getDelFlag, 0)); - if (acBaseConfigList.isEmpty()) { - log.info("{}天前无有效报单赠送活动,处理结束",daysAgo); - return R.ok(); - } - // 报单赠送活动主键集合 - List declarationBaseIds = acBaseConfigList.stream().map(AcBaseConfig::getPkId).collect(Collectors.toList()); - // 查询所有报单赠送活动数据 - List declarationGiftConfigs = iAcDeclarationGiftConfigService.list(new LambdaQueryWrapper() - .in(AcDeclarationGiftConfig::getPkBaseId, declarationBaseIds) - .eq(AcDeclarationGiftConfig::getDelFlag, 0)); - Map configMap = declarationGiftConfigs.stream() - .collect(Collectors.toMap( - cfg -> cfg.getRegisterAuthority() + "_" + cfg.getSpecifyLevel(), - Function.identity(), - (a, b) -> b - )); - - orderList.forEach(order -> { - // 查看是否有重复订单 - int count = iAcDeclarationGiftRecordService.count(new LambdaQueryWrapper() - .eq(AcDeclarationGiftRecord::getOrderCode, order.getOrderCode()) - .eq(AcDeclarationGiftRecord::getDelFlag, 0)); - if (count > 0) { - log.warn("当前订单已同步至报单明细{}",order.getOrderCode()); - return; - } - // 查询会员信息 - R memberResult = iMemberServiceApi.getMember(order.getPkCreator()); - CuMember member = memberResult.getData(); - - if (member == null) { - log.warn("会员信息不存在, orderId={}", order.getPkId()); - return; - } - - // 组合 key 匹配活动配置 - String key = member.getRegisterAuthority() + "_" + member.getPkSettleGrade(); - AcDeclarationGiftConfig matchedConfig = configMap.get(key); - - if (matchedConfig == null) { - log.info("未找到匹配的报单赠送配置, 会员id={}, 注册权限={}, 结算等级={}", - member.getPkId(), member.getRegisterAuthority(), member.getPkSettleGrade()); - return; - } - - AcDeclarationGiftRecord record = AcDeclarationGiftRecord.builder() - .pkRuleId(matchedConfig.getPkId()) - .pkBaseId(matchedConfig.getPkBaseId()) - .orderCode(order.getOrderCode()) - .syncStatus(0) - .build(); - record.setCreationTime(new Date()); - record.setDelFlag(0); - record.setPkCreator(member.getPkId()); - record.setPkCountry(pkCountry); - // 插入数据库 - iAcDeclarationGiftRecordService.save(record); - - log.info("成功插入报单赠送记录 -> memberId={}, ruleId={}", - member.getPkId(), matchedConfig.getPkId()); - }); - return R.ok(); - } } diff --git a/bd-business/bd-business-sale/src/main/resources/mapper/activity/add/AcAddUpgradeConfigMapper.xml b/bd-business/bd-business-sale/src/main/resources/mapper/activity/add/AcAddUpgradeConfigMapper.xml index e8bbc8bd..d86083a9 100644 --- a/bd-business/bd-business-sale/src/main/resources/mapper/activity/add/AcAddUpgradeConfigMapper.xml +++ b/bd-business/bd-business-sale/src/main/resources/mapper/activity/add/AcAddUpgradeConfigMapper.xml @@ -44,6 +44,7 @@ LEFT JOIN BD_GRADE bgg ON aauc.UPGRADE_LEVEL = bgg.PK_ID WHERE aauc.PK_BASE_ID = #{pkId} AND aauc.DEL_FLAG = 0 + AND aauc.ORDER_TYPE = #{orderType}