From 2c578625c37a62c401340a5921e38c6c473dad29 Mon Sep 17 00:00:00 2001 From: zhangran Date: Thu, 21 Mar 2024 15:16:36 +0800 Subject: [PATCH] =?UTF-8?q?add-=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E6=8E=A8=E9=80=81=E5=88=B0mq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- black-list/black-list-api/pom.xml | 8 +++ .../api/constant/enums/BlackModuleEnum.java | 69 +++++++++++++++++++ .../api/constant/enums/MQEventEnum.java | 40 +++++++++++ black-list/black-list-service/pom.xml | 5 ++ .../dao/mapper/BlackAndWhiteListMapper.java | 15 ++++ .../BlackAndWhiteListRepository.java | 19 ++++- .../nanopart/server/job/BaseJobHandler.java | 22 ++++++ .../nanopart/server/job/BlackUserSyncJob.java | 50 ++++++++++++++ .../server/mq/RocketMQEventConfiguration.java | 50 ++++++++++++++ .../server/mq/producer/BlackProducer.java | 59 ++++++++++++++++ .../service/BlackAndWhiteListService.java | 3 + .../impl/BlackAndWhiteListServiceImpl.java | 12 +++- job/job-api/pom.xml | 4 ++ .../mapper/BlackAndWhiteListMapper.xml | 18 +++++ 14 files changed, 371 insertions(+), 3 deletions(-) create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/enums/BlackModuleEnum.java create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/enums/MQEventEnum.java create mode 100644 black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/job/BaseJobHandler.java create mode 100644 black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/job/BlackUserSyncJob.java create mode 100644 black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/mq/RocketMQEventConfiguration.java create mode 100644 black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/mq/producer/BlackProducer.java create mode 100644 nanopart-server/src/main/resources/mapper/BlackAndWhiteListMapper.xml diff --git a/black-list/black-list-api/pom.xml b/black-list/black-list-api/pom.xml index ffd67112..c49e653b 100644 --- a/black-list/black-list-api/pom.xml +++ b/black-list/black-list-api/pom.xml @@ -22,9 +22,17 @@ cn.axzo.framework axzo-common-domain + + cn.axzo.framework.rocketmq + axzo-common-rocketmq + jakarta.servlet jakarta.servlet-api + + org.springframework.cloud + spring-cloud-context + diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/enums/BlackModuleEnum.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/enums/BlackModuleEnum.java new file mode 100644 index 00000000..30f03477 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/enums/BlackModuleEnum.java @@ -0,0 +1,69 @@ +package cn.axzo.nanopart.api.constant.enums; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author zr + * @Date 2024/3/20 10:00 + * @Description + **/ +@Getter +public enum BlackModuleEnum { + + + /** + * 登录白名单 + */ + ALL_LOGIN("all-login","登录白名单"), + /** + * 企业注册黑名单 + */ + OU_REGISTER_BLACK_LIST("ou_register_black_list","企业注册黑名单"), + /** + * 白名单 + */ + ATTENDANCE_PASS("attendance-pass","白名单"), + /** + * 产业工人黑名单 + */ + GXJG_BLACKUSER_WORKER("gxjg-blackuser-worker","产业工人黑名单"), + /** + * 班组管理人员黑名单 + */ + GXJG_BLACKUSER_TEAMLEADER("gxjg-blackuser-teamleader","班组管理人员黑名单"), + /** + * 项目管理人员黑名单 + */ + GXJG_BLACKUSER_EMPLOYEE("gxjg-blackuser-employee","项目管理人员黑名单"), + /** + * 企业黑名单 + */ + GXJG_BLACKCOMPANY("gxjg-blackcompany","企业黑名单"), + + ; + + private final String value; + private final String description; + + BlackModuleEnum(String value, String description) { + this.value = value; + this.description = description; + } + + public static BlackModuleEnum getByValue(String value){ + return Arrays.stream(values()).filter(l -> l.getValue().equals(value)).findFirst().orElse(null); + } + + public static List getValueList(List enums){ + if(enums == null){ + return Collections.emptyList(); + } + return enums.stream().map(BlackModuleEnum::getValue).collect(Collectors.toList()); + } + +} diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/enums/MQEventEnum.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/enums/MQEventEnum.java new file mode 100644 index 00000000..347d15b9 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/enums/MQEventEnum.java @@ -0,0 +1,40 @@ +package cn.axzo.nanopart.api.constant.enums; + +import cn.axzo.framework.rocketmq.Event; +import lombok.Getter; + +import java.util.Arrays; + +/** + * @Author zr + * @Date 2024/3/19 18:01 + * @Description + **/ +@Getter +public enum MQEventEnum { + + GXJG_BLACKUSER_WORKER("plat-blacklist", "plat-blackuser-worker-list", "产业工人黑名单"), + GXJG_BLACKUSER_TEAMLEADER("plat-blacklist", "plat-blackuser-teamleader-list", "班组管理人员黑名单"), + GXJG_BLACKUSER_EMPLOYEE("plat-blacklist", "plat-blackuser-employee-list", "项目管理人员黑名单"), + + + ; + private final String model; + private final String tag; + private final String desc; + private final Event.EventCode eventCode; + + MQEventEnum(String model, String tag, String desc) { + this.eventCode = Event.EventCode.builder() + .module(model) + .name(tag) + .build(); + this.model = model; + this.tag = tag; + this.desc = desc; + } + + public static MQEventEnum getByName(String name){ + return Arrays.stream(MQEventEnum.values()).filter(item -> item.name().equals(name)).findFirst().orElse(null); + } +} diff --git a/black-list/black-list-service/pom.xml b/black-list/black-list-service/pom.xml index 61d27631..7c00fa03 100644 --- a/black-list/black-list-service/pom.xml +++ b/black-list/black-list-service/pom.xml @@ -41,5 +41,10 @@ cn.axzo.pokonyan pokonyan + + com.xuxueli + xxl-job-core + 2.2.0 + diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/mapper/BlackAndWhiteListMapper.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/mapper/BlackAndWhiteListMapper.java index e1196f79..73a06d46 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/mapper/BlackAndWhiteListMapper.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/mapper/BlackAndWhiteListMapper.java @@ -3,6 +3,9 @@ package cn.axzo.nanopart.server.dao.mapper; import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author: chenwenjian @@ -13,4 +16,16 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface BlackAndWhiteListMapper extends BaseMapper { + + /** + * 获取getField中字段的值 + * + * @param type + * @param getField 获取json中指定字段 + * @param modules + * @return + */ + List getParamValue(@Param("type") Integer type, + @Param("getField") String getField, + @Param("modules") List modules); } diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java index 253e291e..d2b7fa8d 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java @@ -6,16 +6,15 @@ import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import cn.axzo.nanopart.server.dao.mapper.BlackAndWhiteListMapper; import cn.azxo.framework.common.utils.StringUtils; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.json.JSONObject; import org.springframework.stereotype.Repository; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -127,4 +126,20 @@ public class BlackAndWhiteListRepository extends ServiceImpl listByModule(Integer type, List modules) { + return lambdaQuery() + .eq(SaasBlackWhiteList::getType, type) + .in(CollUtil.isNotEmpty(modules),SaasBlackWhiteList::getModule, modules) + .eq(SaasBlackWhiteList::getIsDelete, 0) + .list(); + } } \ No newline at end of file diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/job/BaseJobHandler.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/job/BaseJobHandler.java new file mode 100644 index 00000000..2b5ed1d7 --- /dev/null +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/job/BaseJobHandler.java @@ -0,0 +1,22 @@ +package cn.axzo.nanopart.server.job; + +import cn.azxo.framework.common.logger.JobLoggerTemplate; +import com.xxl.job.core.biz.model.ReturnT; + +import javax.annotation.Resource; + +/** + * @Author zr + * @Date 2024/3/20 16:28 + * @Description + **/ +public abstract class BaseJobHandler { + + @Resource(name = "jobLoggerTemplate") + protected JobLoggerTemplate jobLoggerTemplate; + + /** + * 定时任务执行逻辑 + */ + public abstract ReturnT execute(String param) throws Exception; +} diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/job/BlackUserSyncJob.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/job/BlackUserSyncJob.java new file mode 100644 index 00000000..15199e53 --- /dev/null +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/job/BlackUserSyncJob.java @@ -0,0 +1,50 @@ +package cn.axzo.nanopart.server.job; + +import cn.axzo.nanopart.api.constant.enums.BlackModuleEnum; +import cn.axzo.nanopart.api.constant.enums.MQEventEnum; +import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; +import cn.axzo.nanopart.server.mq.producer.BlackProducer; +import cn.axzo.nanopart.server.service.BlackAndWhiteListService; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @Author zr + * @Date 2024/3/20 16:26 + * @Description 定时任务 + **/ +@Slf4j +@Component +public class BlackUserSyncJob extends BaseJobHandler{ + + @Resource + private BlackAndWhiteListService blackAndWhiteListService; + /** + * 定时任务执行逻辑 + * + * @param param + */ + @Override + @XxlJob("blackUserSyncJob") + public ReturnT execute(String param) throws Exception { + List saasBlackWhiteLists = blackAndWhiteListService.listModuleBlackUser(); + Map> modulBlackMap = saasBlackWhiteLists.stream().collect(Collectors.groupingBy(SaasBlackWhiteList::getModule)); + modulBlackMap.forEach((module, blackList) -> { + log.info("syncRockerMQ module:{} ,blackList.size:{}" ,module, blackList.size()); + BlackModuleEnum blackModuleEnum = BlackModuleEnum.getByValue(module); + MQEventEnum event = MQEventEnum.getByName(blackModuleEnum.name()); + if(Objects.nonNull(blackModuleEnum) && Objects.nonNull(event)){ + BlackProducer.sendBatch(event, blackList); + } + }); + return ReturnT.SUCCESS; + } +} diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/mq/RocketMQEventConfiguration.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/mq/RocketMQEventConfiguration.java new file mode 100644 index 00000000..8fc658ba --- /dev/null +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/mq/RocketMQEventConfiguration.java @@ -0,0 +1,50 @@ +package cn.axzo.nanopart.server.mq; + +import cn.axzo.framework.rocketmq.EventProducer; +import cn.axzo.framework.rocketmq.RocketMQEventProducer; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +/** + * @Author zr + * @Date 2024/3/21 14:12 + * @Description + **/ +@Slf4j +@Component +public class RocketMQEventConfiguration { + + @Value("${spring.profiles.active}") + private String profileActivity; + private final String serviceName = "nanopart"; + private final String topic = "nanopart"; + + @Bean + public RocketMQTemplate ser(){ + return new RocketMQTemplate(); + } + @Bean + EventProducer eventProducer(RocketMQTemplate rocketMQTemplate) { + return new RocketMQEventProducer(rocketMQTemplate, + serviceName, + serviceName, + EventProducer.Context.builder() + .meta(RocketMQEventProducer.RocketMQMessageMeta.builder() + .topic(getTopic(topic)) + .build()) + .build(), + null + ); + } + + private String getTopic(String topic) { + if (!StringUtils.isEmpty(topic)) { + topic = topic + "_" + profileActivity; + } + return topic; + } +} diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/mq/producer/BlackProducer.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/mq/producer/BlackProducer.java new file mode 100644 index 00000000..b5aef2ce --- /dev/null +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/mq/producer/BlackProducer.java @@ -0,0 +1,59 @@ +package cn.axzo.nanopart.server.mq.producer; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.framework.domain.ServiceException; +import cn.axzo.framework.rocketmq.Event; +import cn.axzo.framework.rocketmq.EventProducer; +import cn.axzo.nanopart.api.constant.enums.MQEventEnum; +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +public class BlackProducer implements InitializingBean { + private static EventProducer eventProducer; + + public static void send(MQEventEnum mqEventEnum, BaseEntity baseEntity, String operatorId){ + log.info(JSON.toJSONString(baseEntity)); + if(mqEventEnum == null){ + throw new ServiceException("无法正确发送mq: mqEventEnum不能为空"); + } + if(baseEntity == null){ + log.error("消息实体为空不能发送mq mqEventEnum {}", mqEventEnum); + return; + } + if(baseEntity.getId() == null){ + throw new ServiceException("无法正确发送mq: 主健id不能为空"); + } + //生产消息 + eventProducer.send(Event.builder() + .shardingKey(String.valueOf(baseEntity.getId())) + .targetId(String.valueOf(baseEntity.getId())) + .targetType(mqEventEnum.getModel()) + .eventCode(new Event.EventCode(mqEventEnum.getModel(), mqEventEnum.getTag())) + .eventModule(mqEventEnum.getModel()) + .eventName(mqEventEnum.getTag()) + .operatorId(operatorId) + .data(baseEntity) + .build()); + } + + public static void send(MQEventEnum mqEventEnum, BaseEntity baseEntity){ + send(mqEventEnum, baseEntity, null); + } + + public static void sendBatch(MQEventEnum mqEventEnum, List> baseEntities){ + baseEntities.forEach(baseEntity -> send(mqEventEnum, baseEntity, null)); + } + + @Override + public void afterPropertiesSet() { + eventProducer = SpringUtil.getBean(EventProducer.class); + } + +} diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java index a68301fb..081e3435 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java @@ -7,6 +7,7 @@ import cn.axzo.nanopart.api.request.BlackAndWhiteListPlatformSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; +import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -36,4 +37,6 @@ public interface BlackAndWhiteListService { Boolean platformSync(BlackAndWhiteListPlatformSyncReq req); Long internalSync(BlackAndWhiteListInternalSyncReq req); + + List listModuleBlackUser(); } diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java index 42c6b42f..21aec660 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java @@ -2,7 +2,9 @@ package cn.axzo.nanopart.server.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.nanopart.api.constant.enums.BlackModuleEnum; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import cn.axzo.nanopart.api.constant.enums.MQEventEnum; import cn.axzo.nanopart.api.request.BlackAndWhiteListInternalSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListPlatformSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; @@ -11,9 +13,9 @@ import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; import cn.axzo.nanopart.server.constant.BlackAndWhiteListConstant; import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import cn.axzo.nanopart.server.dao.repository.BlackAndWhiteListRepository; +import cn.axzo.nanopart.server.mq.producer.BlackProducer; import cn.axzo.nanopart.server.service.BlackAndWhiteListService; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; @@ -376,4 +378,12 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { }).collect(Collectors.toList()); return blackAndWhiteListRepository.saveBatch(list); } + + + @Override + public List listModuleBlackUser(){ + // 同步到RockerMQ + ArrayList models = Lists.newArrayList(BlackModuleEnum.GXJG_BLACKUSER_WORKER, BlackModuleEnum.GXJG_BLACKUSER_TEAMLEADER, BlackModuleEnum.GXJG_BLACKUSER_EMPLOYEE); + return blackAndWhiteListRepository.listByModule(ListTypeEnum.BLACK_LIST.getValue(), BlackModuleEnum.getValueList(models)); + } } \ No newline at end of file diff --git a/job/job-api/pom.xml b/job/job-api/pom.xml index 2e63e4dd..99f9ba94 100644 --- a/job/job-api/pom.xml +++ b/job/job-api/pom.xml @@ -28,6 +28,10 @@ cn.axzo.basics basics-common + + com.baomidou + mybatis-plus-annotation + diff --git a/nanopart-server/src/main/resources/mapper/BlackAndWhiteListMapper.xml b/nanopart-server/src/main/resources/mapper/BlackAndWhiteListMapper.xml new file mode 100644 index 00000000..52a4415a --- /dev/null +++ b/nanopart-server/src/main/resources/mapper/BlackAndWhiteListMapper.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file