## 报单赠送添加权限控制,报单赠送订单推送代码优化

This commit is contained in:
zhangheng 2025-10-29 16:30:01 +08:00
parent 79850099f0
commit a0180bb249
7 changed files with 145 additions and 43 deletions

View File

@ -21,6 +21,7 @@ import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* 会员服务接口 * 会员服务接口
@ -443,4 +444,5 @@ public interface IMemberServiceApi {
R<Map<String, Long>> memberRegionMap(Date settleDate); R<Map<String, Long>> memberRegionMap(Date settleDate);
R<List<CuMember>> getMemberByIds(Set<Long> memberIds);
} }

View File

@ -36,10 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* 会员涉及dubbo服务 * 会员涉及dubbo服务
@ -520,4 +517,9 @@ public class MemberServiceProvider implements IMemberServiceApi {
return R.ok(resultMap); return R.ok(resultMap);
} }
@Override
public R<List<CuMember>> getMemberByIds(Set<Long> memberIds) {
return R.ok(iCuMemberService.getMemberByIds(memberIds));
}
} }

View File

@ -23,10 +23,7 @@ import com.hzs.member.share.param.ShareRegisterParam;
import com.hzs.system.sys.dto.ApprovalBusinessResultDTO; import com.hzs.system.sys.dto.ApprovalBusinessResultDTO;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collection; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
/** /**
* 会员 服务类 * 会员 服务类
@ -1029,4 +1026,5 @@ public interface ICuMemberService extends IService<CuMember> {
*/ */
void clearZeroMember(); void clearZeroMember();
List<CuMember> getMemberByIds(Set<Long> memberIds);
} }

View File

@ -3771,4 +3771,10 @@ public class CuMemberServiceImpl extends ServiceImpl<CuMemberMapper, CuMember> i
baseMapper.clearZeroMember(); baseMapper.clearZeroMember();
} }
@Override
public List<CuMember> getMemberByIds(Set<Long> memberIds) {
return baseMapper.selectList(new LambdaQueryWrapper<CuMember>()
.in(CuMember::getPkId, memberIds));
}
} }

View File

@ -2,6 +2,7 @@ package com.hzs.activity.declaration.param;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.hzs.activity.add.param.AcAddUpgradeConfigParam; 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.AcBaseConfig;
import com.hzs.common.domain.activity.base.AcGoalMemberConfig; import com.hzs.common.domain.activity.base.AcGoalMemberConfig;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -108,6 +109,11 @@ public class AcDeclarationDetailParam implements Serializable {
*/ */
private List<AcGoalMemberConfig> goalMemberConfigList; private List<AcGoalMemberConfig> goalMemberConfigList;
/**
* 权限配置列表
*/
private List<AcBaseAuthority> authorityList;
/** /**
* 是否强制弹框 0 1 * 是否强制弹框 0 1
*/ */

View File

@ -2,6 +2,7 @@ package com.hzs.activity.declaration.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.nacos.client.naming.utils.CollectionUtils; import com.alibaba.nacos.client.naming.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hzs.activity.declaration.service.IAcDeclarationGiftDetailService; import com.hzs.activity.declaration.service.IAcDeclarationGiftDetailService;
import com.hzs.activity.recommend.param.AcRecommendParam; 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.base.AcBaseAuthority;
import com.hzs.common.domain.activity.declaration.AcDeclarationGiftConfig; import com.hzs.common.domain.activity.declaration.AcDeclarationGiftConfig;
import com.hzs.common.domain.activity.declaration.AcDeclarationGiftDetail; import com.hzs.common.domain.activity.declaration.AcDeclarationGiftDetail;
import com.hzs.common.core.constant.CountryConstants; 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.core.web.domain.AjaxResult;
import com.hzs.common.domain.activity.base.AcBaseConfig; import com.hzs.common.domain.activity.base.AcBaseConfig;
import com.hzs.common.security.utils.SecurityUtils; import com.hzs.common.security.utils.SecurityUtils;
@ -82,13 +80,17 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl<AcDeclaratio
.eq(AcDeclarationGiftConfig::getPkBaseId, pkId) .eq(AcDeclarationGiftConfig::getPkBaseId, pkId)
.eq(AcDeclarationGiftConfig::getDelFlag, 0)); .eq(AcDeclarationGiftConfig::getDelFlag, 0));
ArrayList<AcDeclarationConfigParam> acDeclarationConfigParams = new ArrayList<>(); ArrayList<AcDeclarationConfigParam> acDeclarationConfigParams = new ArrayList<>();
ArrayList<AcBaseAuthority> acBaseAuthorities = new ArrayList<>();
list.forEach(item -> { list.forEach(item -> {
AcDeclarationConfigParam acDeclarationConfigParam = BeanUtil.copyProperties(item, AcDeclarationConfigParam.class); AcDeclarationConfigParam acDeclarationConfigParam = BeanUtil.copyProperties(item, AcDeclarationConfigParam.class);
List<AcDeclarationProductParam> declarationConfigParams = iAcDeclarationGiftDetailService.listByPKRuleId(item.getPkId()); List<AcDeclarationProductParam> declarationConfigParams = iAcDeclarationGiftDetailService.listByPKRuleId(item.getPkId());
// 添加商品详情
acDeclarationConfigParam.setAcDeclarationProductParamList(declarationConfigParams); acDeclarationConfigParam.setAcDeclarationProductParamList(declarationConfigParams);
acDeclarationConfigParams.add(acDeclarationConfigParam); acDeclarationConfigParams.add(acDeclarationConfigParam);
// 添加权限列表
acBaseAuthorities.addAll(iAcBaseAuthorityService.listAuthority(item.getPkBaseId()));
}); });
activityParam.setAuthorityList(acBaseAuthorities);
activityParam.setAcDeclarationConfigParams(acDeclarationConfigParams); activityParam.setAcDeclarationConfigParams(acDeclarationConfigParams);
activityParam.setPkBaseId(baseConfig.getPkId()); activityParam.setPkBaseId(baseConfig.getPkId());
return AjaxResult.success(activityParam); return AjaxResult.success(activityParam);
@ -225,11 +227,16 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl<AcDeclaratio
* *
* @param recommendParam * @param recommendParam
*/ */
private void saveAuthority(AcDeclarationParam recommendParam) { private void saveAuthority(AcDeclarationParam recommendParam,AcBaseConfig acBaseConfig) {
List<AcBaseAuthority> authorityList = recommendParam.getAuthorityList(); List<AcBaseAuthority> authorityList = recommendParam.getAuthorityList();
boolean hasInvalid = authorityList.stream()
.anyMatch(auth -> auth.getAuthorityType() == null);
if (hasInvalid) {
return;
}
if (CollectionUtil.isNotEmpty(authorityList)) { if (CollectionUtil.isNotEmpty(authorityList)) {
for (AcBaseAuthority acBaseAuthority : authorityList) { for (AcBaseAuthority acBaseAuthority : authorityList) {
acBaseAuthority.setPkBaseId(recommendParam.getPkBaseId()); acBaseAuthority.setPkBaseId(acBaseConfig.getPkId());
} }
iAcBaseAuthorityService.saveBatch(authorityList); iAcBaseAuthorityService.saveBatch(authorityList);
} }
@ -278,7 +285,7 @@ public class AcDeclarationGiftConfigServiceImpl extends ServiceImpl<AcDeclaratio
private void saveDeclarationConfig(AcDeclarationParam acDeclarationParam, AcBaseConfig acBaseConfig) { private void saveDeclarationConfig(AcDeclarationParam acDeclarationParam, AcBaseConfig acBaseConfig) {
List<AcDeclarationConfigParam> acDeclarationConfigParams = acDeclarationParam.getAcDeclarationConfigParams(); List<AcDeclarationConfigParam> acDeclarationConfigParams = acDeclarationParam.getAcDeclarationConfigParams();
// 保存活动权限配置 // 保存活动权限配置
this.saveAuthority(acDeclarationParam); this.saveAuthority(acDeclarationParam,acBaseConfig);
acDeclarationConfigParams.forEach(item -> { acDeclarationConfigParams.forEach(item -> {
if (item != null) { if (item != null) {
AcDeclarationGiftConfig build = AcDeclarationGiftConfig.builder() AcDeclarationGiftConfig build = AcDeclarationGiftConfig.builder()

View File

@ -1,10 +1,14 @@
package com.hzs.activity.tourism.provider; 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.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.base.service.IAcBaseConfigService;
import com.hzs.activity.declaration.service.IAcDeclarationGiftConfigService; import com.hzs.activity.declaration.service.IAcDeclarationGiftConfigService;
import com.hzs.activity.declaration.service.IAcDeclarationGiftRecordService; import com.hzs.activity.declaration.service.IAcDeclarationGiftRecordService;
import com.hzs.common.core.enums.*; 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.AcDeclarationGiftConfig;
import com.hzs.common.domain.activity.declaration.AcDeclarationGiftRecord; import com.hzs.common.domain.activity.declaration.AcDeclarationGiftRecord;
import com.hzs.activity.tourism.IAcTourismServiceApi; import com.hzs.activity.tourism.IAcTourismServiceApi;
@ -24,9 +28,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Date; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -54,6 +56,8 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi {
private IAcBaseConfigService iAcBaseConfigService; private IAcBaseConfigService iAcBaseConfigService;
@Autowired @Autowired
private IMemberServiceApi iMemberServiceApi; private IMemberServiceApi iMemberServiceApi;
@Autowired
private IAcBaseAuthorityService iAcBaseAuthorityService;
@Override @Override
public R<?> handleTourismData() { public R<?> handleTourismData() {
@ -148,24 +152,38 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi {
Function.identity(), Function.identity(),
(a, b) -> b (a, b) -> b
)); ));
// 一次批量查询会员信息
Set<Long> memberIds = new HashSet<>();
orderList.forEach(order -> { orderList.forEach(order -> {
// TODO 一天可能会有几百单最好改成批量查询 memberIds.add(order.getPkMember());
// 查看是否有重复订单 memberIds.add(order.getPkCreator());
int count = iAcDeclarationGiftRecordService.count(new LambdaQueryWrapper<AcDeclarationGiftRecord>() });
.eq(AcDeclarationGiftRecord::getOrderCode, order.getOrderCode())
.eq(AcDeclarationGiftRecord::getDelFlag, EDelFlag.UN_DELETE.getValue())); Map<Long, CuMember> memberMap = iMemberServiceApi.getMemberByIds(memberIds)
if (count > 0) { .getData().stream().collect(Collectors.toMap(CuMember::getPkId, m -> m));
log.warn("当前订单已同步至报单明细{}", order.getOrderCode());
return;
} List<String> orderCodes = orderList.stream()
// TODO 下面两个查询会员报单会员可能都是同一个人最好提前查询或者做个map存下来防止多次查询数据库 .map(SaOrder::getOrderCode)
// 查询新会员信息 .collect(Collectors.toList());
R<CuMember> newMemberResult = iMemberServiceApi.getMember(order.getPkMember());
CuMember newMember = newMemberResult.getData(); // 过滤已存在订单
// 查询老会员信息 Set<String> existSet = iAcDeclarationGiftRecordService.list(
R<CuMember> oldMemberResult = iMemberServiceApi.getMember(order.getPkCreator()); new LambdaQueryWrapper<AcDeclarationGiftRecord>()
CuMember oldMember = oldMemberResult.getData(); .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<AcDeclarationGiftRecord> recordList = new ArrayList<>();
orderList.forEach(order -> {
// 新会员信息
CuMember newMember = memberMap.get(order.getPkMember());
// 老会员信息
CuMember oldMember = memberMap.get(order.getPkCreator());
if (oldMember == null || newMember == null) { if (oldMember == null || newMember == null) {
log.warn("会员信息不存在, 新会员id={},老会员id={}", order.getPkMember(), order.getPkCreator()); log.warn("会员信息不存在, 新会员id={},老会员id={}", order.getPkMember(), order.getPkCreator());
return; return;
@ -180,8 +198,11 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi {
oldMember.getPkId(), oldMember.getRegisterAuthority(), newMember.getPkSettleGrade()); oldMember.getPkId(), oldMember.getRegisterAuthority(), newMember.getPkSettleGrade());
return; return;
} }
// 查询活动权限
// TODO 入库改成批量 AcBaseConfig baseConfig = iAcBaseConfigService.getById(matchedConfig.getPkBaseId());
if (!this.checkAuthority(baseConfig, order.getPkMember())) {
return;
}
AcDeclarationGiftRecord record = AcDeclarationGiftRecord.builder() AcDeclarationGiftRecord record = AcDeclarationGiftRecord.builder()
.pkRuleId(matchedConfig.getPkId()) .pkRuleId(matchedConfig.getPkId())
.pkBaseId(matchedConfig.getPkBaseId()) .pkBaseId(matchedConfig.getPkBaseId())
@ -192,13 +213,73 @@ public class AcTourismServiceProvider implements IAcTourismServiceApi {
record.setDelFlag(EDelFlag.UN_DELETE.getValue()); record.setDelFlag(EDelFlag.UN_DELETE.getValue());
record.setPkCreator(oldMember.getPkId()); record.setPkCreator(oldMember.getPkId());
record.setPkCountry(pkCountry); record.setPkCountry(pkCountry);
// 插入数据库 recordList.add(record);
iAcDeclarationGiftRecordService.save(record);
log.info("成功插入报单赠送记录 -> memberId={}, ruleId={}",
oldMember.getPkId(), matchedConfig.getPkId());
}); });
if (!recordList.isEmpty()) {
iAcDeclarationGiftRecordService.saveBatch(recordList);
log.info("[DeclarationGiftJob] 订单量={} 活动数={} 插入记录={}",
orderList.size(), acBaseConfigList.size(), recordList.size());
}
return R.ok(); return R.ok();
} }
/**
* 校验活动权限true进行处理false不进行处理
*
* @param baseConfig 活动配置
* @param pkMember 会员ID
* @return
*/
private boolean checkAuthority(AcBaseConfig baseConfig, Long pkMember) {
List<AcBaseAuthority> authList = iAcBaseAuthorityService.list(Wrappers.<AcBaseAuthority>lambdaQuery()
.eq(AcBaseAuthority::getPkBaseId, baseConfig.getPkId())
.orderByDesc(AcBaseAuthority::getAuthorityType)
);
if (CollectionUtil.isNotEmpty(authList)) {
Map<Integer, List<String>> 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<String> 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;
}
} }