From a0180bb24931913b41f822e78a01524110571035 Mon Sep 17 00:00:00 2001 From: zhangheng Date: Wed, 29 Oct 2025 16:30:01 +0800 Subject: [PATCH] =?UTF-8?q?##=20=E6=8A=A5=E5=8D=95=E8=B5=A0=E9=80=81?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6,?= =?UTF-8?q?=E6=8A=A5=E5=8D=95=E8=B5=A0=E9=80=81=E8=AE=A2=E5=8D=95=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hzs/member/base/IMemberServiceApi.java | 2 + .../base/provider/MemberServiceProvider.java | 10 +- .../member/base/service/ICuMemberService.java | 6 +- .../service/impl/CuMemberServiceImpl.java | 6 + .../param/AcDeclarationDetailParam.java | 6 + .../AcDeclarationGiftConfigServiceImpl.java | 23 +-- .../provider/AcTourismServiceProvider.java | 135 ++++++++++++++---- 7 files changed, 145 insertions(+), 43 deletions(-) diff --git a/bd-api/bd-api-member/src/main/java/com/hzs/member/base/IMemberServiceApi.java b/bd-api/bd-api-member/src/main/java/com/hzs/member/base/IMemberServiceApi.java index f2fd998b..90e1410f 100644 --- a/bd-api/bd-api-member/src/main/java/com/hzs/member/base/IMemberServiceApi.java +++ b/bd-api/bd-api-member/src/main/java/com/hzs/member/base/IMemberServiceApi.java @@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; /** * 会员服务接口 @@ -443,4 +444,5 @@ public interface IMemberServiceApi { R> memberRegionMap(Date settleDate); + R> getMemberByIds(Set memberIds); } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/provider/MemberServiceProvider.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/provider/MemberServiceProvider.java index 4415b48c..92d16ac9 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/provider/MemberServiceProvider.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/provider/MemberServiceProvider.java @@ -36,10 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 会员涉及dubbo服务 @@ -520,4 +517,9 @@ public class MemberServiceProvider implements IMemberServiceApi { return R.ok(resultMap); } + @Override + public R> getMemberByIds(Set memberIds) { + return R.ok(iCuMemberService.getMemberByIds(memberIds)); + } + } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberService.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberService.java index de14ce42..53cca057 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberService.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/ICuMemberService.java @@ -23,10 +23,7 @@ import com.hzs.member.share.param.ShareRegisterParam; import com.hzs.system.sys.dto.ApprovalBusinessResultDTO; import java.math.BigDecimal; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 会员 服务类 @@ -1029,4 +1026,5 @@ public interface ICuMemberService extends IService { */ void clearZeroMember(); + List getMemberByIds(Set memberIds); } diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberServiceImpl.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberServiceImpl.java index 9db6f7e2..ebf98131 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberServiceImpl.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberServiceImpl.java @@ -3771,4 +3771,10 @@ public class CuMemberServiceImpl extends ServiceImpl i baseMapper.clearZeroMember(); } + @Override + public List getMemberByIds(Set memberIds) { + return baseMapper.selectList(new LambdaQueryWrapper() + .in(CuMember::getPkId, memberIds)); + } + } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/param/AcDeclarationDetailParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/param/AcDeclarationDetailParam.java index f2a498ef..473bf01e 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/param/AcDeclarationDetailParam.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/declaration/param/AcDeclarationDetailParam.java @@ -2,6 +2,7 @@ package com.hzs.activity.declaration.param; import com.fasterxml.jackson.annotation.JsonFormat; import com.hzs.activity.add.param.AcAddUpgradeConfigParam; +import com.hzs.common.domain.activity.base.AcBaseAuthority; import com.hzs.common.domain.activity.base.AcBaseConfig; import com.hzs.common.domain.activity.base.AcGoalMemberConfig; import lombok.AllArgsConstructor; @@ -108,6 +109,11 @@ public class AcDeclarationDetailParam implements Serializable { */ private List goalMemberConfigList; + /** + * 权限配置列表 + */ + private List authorityList; + /** * 是否强制弹框 0 是 1 否 */ 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 0976a436..7e5609c6 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 @@ -2,6 +2,7 @@ package com.hzs.activity.declaration.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.nacos.client.naming.utils.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -18,14 +19,11 @@ import com.hzs.activity.declaration.service.IAcDeclarationGiftConfigService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hzs.activity.declaration.service.IAcDeclarationGiftDetailService; import com.hzs.activity.recommend.param.AcRecommendParam; -import com.hzs.common.core.enums.EDelFlag; +import com.hzs.common.core.enums.*; import com.hzs.common.domain.activity.base.AcBaseAuthority; import com.hzs.common.domain.activity.declaration.AcDeclarationGiftConfig; import com.hzs.common.domain.activity.declaration.AcDeclarationGiftDetail; 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.ERegistrationAuthority; import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.domain.activity.base.AcBaseConfig; import com.hzs.common.security.utils.SecurityUtils; @@ -82,13 +80,17 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl acDeclarationConfigParams = new ArrayList<>(); + ArrayList acBaseAuthorities = new ArrayList<>(); list.forEach(item -> { AcDeclarationConfigParam acDeclarationConfigParam = BeanUtil.copyProperties(item, AcDeclarationConfigParam.class); List declarationConfigParams = iAcDeclarationGiftDetailService.listByPKRuleId(item.getPkId()); + // 添加商品详情 acDeclarationConfigParam.setAcDeclarationProductParamList(declarationConfigParams); acDeclarationConfigParams.add(acDeclarationConfigParam); + // 添加权限列表 + acBaseAuthorities.addAll(iAcBaseAuthorityService.listAuthority(item.getPkBaseId())); }); - + activityParam.setAuthorityList(acBaseAuthorities); activityParam.setAcDeclarationConfigParams(acDeclarationConfigParams); activityParam.setPkBaseId(baseConfig.getPkId()); return AjaxResult.success(activityParam); @@ -225,11 +227,16 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl authorityList = recommendParam.getAuthorityList(); + boolean hasInvalid = authorityList.stream() + .anyMatch(auth -> auth.getAuthorityType() == null); + if (hasInvalid) { + return; + } if (CollectionUtil.isNotEmpty(authorityList)) { for (AcBaseAuthority acBaseAuthority : authorityList) { - acBaseAuthority.setPkBaseId(recommendParam.getPkBaseId()); + acBaseAuthority.setPkBaseId(acBaseConfig.getPkId()); } iAcBaseAuthorityService.saveBatch(authorityList); } @@ -278,7 +285,7 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl acDeclarationConfigParams = acDeclarationParam.getAcDeclarationConfigParams(); // 保存活动权限配置 - this.saveAuthority(acDeclarationParam); + this.saveAuthority(acDeclarationParam,acBaseConfig); acDeclarationConfigParams.forEach(item -> { if (item != null) { AcDeclarationGiftConfig build = AcDeclarationGiftConfig.builder() diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/tourism/provider/AcTourismServiceProvider.java b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/tourism/provider/AcTourismServiceProvider.java index 5790e5e6..0b400a51 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/activity/tourism/provider/AcTourismServiceProvider.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/activity/tourism/provider/AcTourismServiceProvider.java @@ -1,10 +1,14 @@ package com.hzs.activity.tourism.provider; +import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.hzs.activity.base.service.IAcBaseAuthorityService; import com.hzs.activity.base.service.IAcBaseConfigService; import com.hzs.activity.declaration.service.IAcDeclarationGiftConfigService; import com.hzs.activity.declaration.service.IAcDeclarationGiftRecordService; import com.hzs.common.core.enums.*; +import com.hzs.common.domain.activity.base.AcBaseAuthority; import com.hzs.common.domain.activity.declaration.AcDeclarationGiftConfig; import com.hzs.common.domain.activity.declaration.AcDeclarationGiftRecord; import com.hzs.activity.tourism.IAcTourismServiceApi; @@ -24,9 +28,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.ZoneId; import java.time.temporal.ChronoUnit; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -54,6 +56,8 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi { private IAcBaseConfigService iAcBaseConfigService; @Autowired private IMemberServiceApi iMemberServiceApi; + @Autowired + private IAcBaseAuthorityService iAcBaseAuthorityService; @Override public R handleTourismData() { @@ -148,24 +152,38 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi { Function.identity(), (a, b) -> b )); - + // 一次批量查询会员信息 + Set memberIds = new HashSet<>(); orderList.forEach(order -> { - // TODO 一天可能会有几百单,最好改成批量查询 - // 查看是否有重复订单 - int count = iAcDeclarationGiftRecordService.count(new LambdaQueryWrapper() - .eq(AcDeclarationGiftRecord::getOrderCode, order.getOrderCode()) - .eq(AcDeclarationGiftRecord::getDelFlag, EDelFlag.UN_DELETE.getValue())); - if (count > 0) { - log.warn("当前订单已同步至报单明细{}", order.getOrderCode()); - return; - } - // TODO 下面两个查询会员,报单会员可能都是同一个人,最好提前查询或者做个map存下来,防止多次查询数据库 - // 查询新会员信息 - R newMemberResult = iMemberServiceApi.getMember(order.getPkMember()); - CuMember newMember = newMemberResult.getData(); - // 查询老会员信息 - R oldMemberResult = iMemberServiceApi.getMember(order.getPkCreator()); - CuMember oldMember = oldMemberResult.getData(); + memberIds.add(order.getPkMember()); + memberIds.add(order.getPkCreator()); + }); + + Map memberMap = iMemberServiceApi.getMemberByIds(memberIds) + .getData().stream().collect(Collectors.toMap(CuMember::getPkId, m -> m)); + + + List orderCodes = orderList.stream() + .map(SaOrder::getOrderCode) + .collect(Collectors.toList()); + + // 过滤已存在订单 + Set existSet = iAcDeclarationGiftRecordService.list( + new LambdaQueryWrapper() + .in(AcDeclarationGiftRecord::getOrderCode, orderCodes) + .eq(AcDeclarationGiftRecord::getDelFlag, EDelFlag.UN_DELETE.getValue()) + ).stream().map(AcDeclarationGiftRecord::getOrderCode).collect(Collectors.toSet()); + + orderList = orderList.stream() + .filter(order -> !existSet.contains(order.getOrderCode())) + .collect(Collectors.toList()); + + List recordList = new ArrayList<>(); + orderList.forEach(order -> { + // 新会员信息 + CuMember newMember = memberMap.get(order.getPkMember()); + // 老会员信息 + CuMember oldMember = memberMap.get(order.getPkCreator()); if (oldMember == null || newMember == null) { log.warn("会员信息不存在, 新会员id={},老会员id={}", order.getPkMember(), order.getPkCreator()); return; @@ -180,8 +198,11 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi { oldMember.getPkId(), oldMember.getRegisterAuthority(), newMember.getPkSettleGrade()); return; } - - // TODO 入库改成批量 + // 查询活动权限 + AcBaseConfig baseConfig = iAcBaseConfigService.getById(matchedConfig.getPkBaseId()); + if (!this.checkAuthority(baseConfig, order.getPkMember())) { + return; + } AcDeclarationGiftRecord record = AcDeclarationGiftRecord.builder() .pkRuleId(matchedConfig.getPkId()) .pkBaseId(matchedConfig.getPkBaseId()) @@ -192,13 +213,73 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi { record.setDelFlag(EDelFlag.UN_DELETE.getValue()); record.setPkCreator(oldMember.getPkId()); record.setPkCountry(pkCountry); - // 插入数据库 - iAcDeclarationGiftRecordService.save(record); - - log.info("成功插入报单赠送记录 -> memberId={}, ruleId={}", - oldMember.getPkId(), matchedConfig.getPkId()); + recordList.add(record); }); + if (!recordList.isEmpty()) { + iAcDeclarationGiftRecordService.saveBatch(recordList); + log.info("[DeclarationGiftJob] 订单量={} 活动数={} 插入记录={}", + orderList.size(), acBaseConfigList.size(), recordList.size()); + } return R.ok(); } + /** + * 校验活动权限(true:进行处理,false:不进行处理) + * + * @param baseConfig 活动配置 + * @param pkMember 会员ID + * @return + */ + private boolean checkAuthority(AcBaseConfig baseConfig, Long pkMember) { + List authList = iAcBaseAuthorityService.list(Wrappers.lambdaQuery() + .eq(AcBaseAuthority::getPkBaseId, baseConfig.getPkId()) + .orderByDesc(AcBaseAuthority::getAuthorityType) + ); + if (CollectionUtil.isNotEmpty(authList)) { + Map> authMap = new HashMap<>(); + for (AcBaseAuthority authority : authList) { + authMap.computeIfAbsent(authority.getAuthorityType(), k -> new ArrayList<>()); + authMap.get(authority.getAuthorityType()).add(authority.getMemberCode()); + } + + for (Integer key : authMap.keySet()) { + List memberCodeList = authMap.get(key); + switch (EWaresPermissionType.getEnumByValue(key)) { + case AUTH_ORITY_TYPE: + // 全部 + return true; + case PLACE_STOP: + // 安置禁止 + if (iAcBaseAuthorityService.checkPlaceParent(pkMember, memberCodeList) > 0) { + return false; + } else { + return true; + } + case BLOOD_STOP: + // 血缘禁止 + if (iAcBaseAuthorityService.checkParent(pkMember, memberCodeList) > 0) { + return false; + } else { + return true; + } + case PLACE_ALLWO: + // 安置可见 + if (iAcBaseAuthorityService.checkPlaceParent(pkMember, memberCodeList) > 0) { + return true; + } else { + return false; + } + case BLOOD_ALLOW: + // 血缘可见 + if (iAcBaseAuthorityService.checkParent(pkMember, memberCodeList) > 0) { + return true; + } else { + return false; + } + default: + } + } + } + return true; + } }