diff --git a/epmet-commons/epmet-commons-rocketmq/pom.xml b/epmet-commons/epmet-commons-rocketmq/pom.xml index a3761c000f..e61ac46c9e 100644 --- a/epmet-commons/epmet-commons-rocketmq/pom.xml +++ b/epmet-commons/epmet-commons-rocketmq/pom.xml @@ -16,6 +16,11 @@ org.apache.rocketmq rocketmq-spring-boot-starter 2.0.1 + + + + org.projectlombok + lombok - \ No newline at end of file + diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java index ded5a9aa8d..38ec75d055 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/ConsomerGroupConstants.java @@ -22,4 +22,9 @@ public interface ConsomerGroupConstants { */ String ISSUE_PROJECT_CATEGORY_TAG = "issue_project_category_tag"; + /** + * 小组成就消费者组 + */ + String GROUP_ACHIEVEMENT_COMPONENTS_GROUP = "group_achievement_components_group"; + } diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java index 7687136498..d0f7b7f829 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/constants/TopicConstants.java @@ -1,5 +1,12 @@ package com.epmet.commons.rocketmq.constants; public interface TopicConstants { + /** + * 初始化客户 + */ String INIT_CUSTOMER = "init_customer"; + /** + * 小组成就 + */ + String GROUP_ACHIEVEMENT = "group_achievement"; } diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/GroupAchievementMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/GroupAchievementMQMsg.java new file mode 100644 index 0000000000..f54a2bee52 --- /dev/null +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/GroupAchievementMQMsg.java @@ -0,0 +1,27 @@ +package com.epmet.commons.rocketmq.messages; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serializable; + +/** + * desc:小组成就mq消息类 + * + * @author LiuJanJun + * @date 2021/4/22 8:35 下午 + */ +@Data +@AllArgsConstructor +public class GroupAchievementMQMsg implements Serializable { + + private String customerId; + + private String groupId; + + /** + * 成就类型 + * @see com.epmet.modules.enums.AchievementTypeEnum + */ + private String achievementType; +} diff --git a/epmet-module/epmet-message/epmet-message-client/pom.xml b/epmet-module/epmet-message/epmet-message-client/pom.xml index 4c7ff05c15..1f18392613 100644 --- a/epmet-module/epmet-message/epmet-message-client/pom.xml +++ b/epmet-module/epmet-message/epmet-message-client/pom.xml @@ -26,6 +26,11 @@ io.springfox springfox-swagger-ui + + com.epmet + epmet-commons-rocketmq + 2.0.0 + diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java index 382b96e275..545940ecea 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/constant/SystemMessageType.java @@ -10,4 +10,9 @@ public interface SystemMessageType { */ String INIT_CUSTOMER = "init_customer"; + /** + * 小组成就 + */ + String GROUP_ACHIEVEMENT = "group_achievement"; + } diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java new file mode 100644 index 0000000000..b7dfb15d5d --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/send/SendMqMsgUtil.java @@ -0,0 +1,68 @@ +package com.epmet.send; + +import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.utils.Result; +import com.epmet.constant.SystemMessageType; +import com.epmet.dto.form.SystemMsgFormDTO; +import com.epmet.feign.EpmetMessageOpenFeignClient; +import lombok.extern.slf4j.Slf4j; + +/** + * desc: 发送mq消息直接到rocketMq 系统 + * + * @author: LiuJanJun + * @date: 2021/4/23 2:39 下午 + * @versio: 1.0 + */ +@Slf4j +public class SendMqMsgUtil { + private static final SendMqMsgUtil INSTANCE = new SendMqMsgUtil(); + + private SendMqMsgUtil() { + + } + + private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient; + + public static SendMqMsgUtil build() { + return INSTANCE; + } + + public SendMqMsgUtil openFeignClient(EpmetMessageOpenFeignClient epmetMessageOpenFeignClient) { + this.epmetMessageOpenFeignClient = epmetMessageOpenFeignClient; + return this; + } + + /** + * desc: 发送小组成就消息,计算小组成就 + * + * @param msgContent + * @return boolean + * @author LiuJanJun + * @date 2021/4/23 3:01 下午 + * @remark 失败重试1次 + */ + public boolean sendGroupAchievementMqMsg(GroupAchievementMQMsg msgContent) { + try { + SystemMsgFormDTO systemMsgFormDTO = new SystemMsgFormDTO(); + systemMsgFormDTO.setMessageType(SystemMessageType.GROUP_ACHIEVEMENT); + systemMsgFormDTO.setContent(msgContent); + Result sendMsgResult = null; + int retryTime = 1; + do { + sendMsgResult = epmetMessageOpenFeignClient.sendSystemMsgByMQ(systemMsgFormDTO); + } while ((sendMsgResult == null || !sendMsgResult.success()) && retryTime++ < NumConstant.TWO); + + if (sendMsgResult != null && sendMsgResult.success()) { + return true; + } + log.error("发送(小组成就)系统消息到message服务失败:{},msg:{}", JSON.toJSONString(sendMsgResult), JSON.toJSONString(systemMsgFormDTO)); + } catch (Exception e) { + log.error("sendMqMsg exception", e); + } + return false; + } + +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java index 64a067af56..72b1657e2a 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/service/impl/SystemMessageServiceImpl.java @@ -64,6 +64,9 @@ public class SystemMessageServiceImpl implements SystemMessageService { case SystemMessageType.INIT_CUSTOMER: topic = TopicConstants.INIT_CUSTOMER; break; + case SystemMessageType.GROUP_ACHIEVEMENT: + topic = TopicConstants.GROUP_ACHIEVEMENT; + break; } return topic; } diff --git a/epmet-module/resi-group/resi-group-server/pom.xml b/epmet-module/resi-group/resi-group-server/pom.xml index e7432526b2..075676c7b6 100644 --- a/epmet-module/resi-group/resi-group-server/pom.xml +++ b/epmet-module/resi-group/resi-group-server/pom.xml @@ -112,6 +112,12 @@ 2.0.0 compile + + + com.epmet + epmet-commons-rocketmq + 2.0.0 + @@ -185,6 +191,10 @@ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19 + + + 192.168.1.130:9876;192.168.1.132:9876 + epmet_message @@ -237,6 +247,9 @@ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19 + + 192.168.1.130:9876;192.168.1.132:9876 + epmet_message @@ -288,6 +301,10 @@ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19 + + + 192.168.10.161:9876 + epmet_message @@ -336,6 +353,10 @@ SEC95f4f40b533ad379ea6a6d1af6dd37029383cfe1b7cd96dfac2678be2c1c3ed1 + + + 192.168.11.187:9876;192.168.11.184:9876 + epmet_message diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java index 24d35a5edd..b53a2cf69c 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementConfigDao.java @@ -1,4 +1,4 @@ -/** +package com.epmet.modules.group.dao; /** * Copyright 2018 人人开源 https://www.renren.io *

* This program is free software: you can redistribute it and/or modify @@ -15,11 +15,14 @@ * along with this program. If not, see . */ -package com.epmet.modules.group.dao; + import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 小组成就配置表 @@ -29,5 +32,26 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface ResiGroupAchievementConfigDao extends BaseDao { - -} \ No newline at end of file + + /** + * desc: 获取成就配置 比targetValue + * + * @param achievementType + * @param offset + * @param pageSize + * @return java.util.List + * @author LiuJanJun + * @date 2021/4/21 10:04 下午 + */ + List selectMoreThanOneByValue(@Param("achievementType") String achievementType, @Param("offset") int offset, @Param("pageSize") int pageSize); + + /** + * desc: 获取最后一条配置 + * + * @param achievementType + * @return com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity + * @author LiuJanJun + * @date 2021/4/22 1:58 下午 + */ + ResiGroupAchievementConfigEntity getLastOne(@Param("achievementType") String achievementType); +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java index 0de55fe72e..247c371ed6 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/dao/ResiGroupAchievementStatsDao.java @@ -35,10 +35,34 @@ import java.util.List; public interface ResiGroupAchievementStatsDao extends BaseDao { /** * 获取未完成的成就 - * @author zhaoqifeng - * @date 2021/4/19 15:52 + * * @param groupId * @return java.util.List + * @author zhaoqifeng + * @date 2021/4/19 15:52 */ List selectUnAchieved(@Param("groupId") String groupId); -} \ No newline at end of file + + /** + * desc: 获取最后一个为实现的成就 + * + * @param customerId + * @param groupId + * @param achievementType + * @return com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity + * @author LiuJanJun + * @date 2021/4/21 8:34 下午 + */ + ResiGroupAchievementStatsEntity selectLastUnAchieved(@Param("customerId") String customerId, @Param("groupId") String groupId, @Param("achievementType") String achievementType); + + /** + * desc: 插入或更新成就 + * + * @param haveArrive + * @param updateAll + * @return int + * @author LiuJanJun + * @date 2021/4/22 3:03 下午 + */ + int saveOrUpdate(@Param("list") List list, @Param("updateAll") boolean updateAll); +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java index 8710dc43d9..3559786095 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/entity/ResiGroupAchievementStatsEntity.java @@ -49,15 +49,20 @@ public class ResiGroupAchievementStatsEntity extends BaseEpmetEntity { private String groupId; /** - * 里程ID + * 成就ID */ private String achievementId; /** - * 里程名称 + * 成就名称 */ private String achievementName; + /** + * 成就类型 + */ + private String achievementType; + /** * 实现时间 */ diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/AbstractStatsAchievementService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/AbstractStatsAchievementService.java new file mode 100644 index 0000000000..818937dcf6 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/AbstractStatsAchievementService.java @@ -0,0 +1,103 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.modules.group.service; + +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.StrConstant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.modules.enums.AchievementTypeEnum; +import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity; +import com.epmet.modules.support.GroupAchievementUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * desc:实时计算小组成就完成情况 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-04-19 + */ +public abstract class AbstractStatsAchievementService { + + @Autowired + public ResiGroupAchievementConfigService achievementConfigService; + @Autowired + public ResiGroupAchievementStatsService achievementStatsService; + + + /** + * desc: 根据成绩类型 分页获取成就配置 按targetValue 升序 + * + * @param offset + * @param pageSize + * @return java.util.List + * @author LiuJanJun + * @date 2021/4/22 1:36 下午 + */ + /** + * desc: 根据成绩类型 分页获取成就配置 按targetValue 升序 + * + * @param pageNum + * @param pageSize + * @return java.util.List + * @author LiuJanJun + * @date 2021/4/22 1:36 下午 + */ + protected List getAchievemnetConfigPage(int pageNum, int pageSize, String achievementType) { + return achievementConfigService.selectMoreThanOneByValue(achievementType, (pageNum - NumConstant.ONE) * pageSize, pageSize); + } + + /** + * desc:初始化配置5条 + * + * @param achievementType + * @return + */ + protected List initAchievementConfig(String achievementType) { + AchievementTypeEnum anEnum = AchievementTypeEnum.getEnum(achievementType); + if (anEnum == null) { + throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode()); + } + if (AchievementTypeEnum.MEMBER.getCode().equals(anEnum.getCode())) { + throw new RenException("小组人数都到10000啦?"); + } + ResiGroupAchievementConfigEntity lastOne = achievementConfigService.getLastOne(achievementType); + List newConfigList = new ArrayList<>(); + Integer nextTargetValue = null; + int preValue = lastOne.getTargetValue(); + String oldName = lastOne.getAchievementName().replace(String.valueOf(lastOne.getTargetValue()), StrConstant.UNDER_LINE); + for (int i = 0; i < 5; i++) { + nextTargetValue = GroupAchievementUtils.getNextTargetValue(achievementType, preValue); + ResiGroupAchievementConfigEntity next = new ResiGroupAchievementConfigEntity(); + next.setCustomerId(lastOne.getCustomerId()); + next.setAchievementName(oldName.replace(StrConstant.UNDER_LINE, String.valueOf(nextTargetValue))); + //todo 把这个字段去掉 + next.setPreValue(preValue); + preValue = nextTargetValue; + next.setTargetValue(nextTargetValue); + next.setAchievementType(lastOne.getAchievementType()); + newConfigList.add(next); + } + achievementConfigService.insertBatch(newConfigList); + return newConfigList; + } + +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java index cb45a821ef..d7de022e82 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementConfigService.java @@ -18,12 +18,9 @@ package com.epmet.modules.group.service; import com.epmet.commons.mybatis.service.BaseService; -import com.epmet.commons.tools.page.PageData; import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity; -import com.epmet.resi.group.dto.group.ResiGroupAchievementConfigDTO; import java.util.List; -import java.util.Map; /** * 小组成就配置表 @@ -33,63 +30,7 @@ import java.util.Map; */ public interface ResiGroupAchievementConfigService extends BaseService { - /** - * 默认分页 - * - * @param params - * @return PageData - * @author generator - * @date 2021-04-19 - */ - PageData page(Map params); + ResiGroupAchievementConfigEntity getLastOne(String achievementType); - /** - * 默认查询 - * - * @param params - * @return java.util.List - * @author generator - * @date 2021-04-19 - */ - List list(Map params); - - /** - * 单条查询 - * - * @param id - * @return ResiGroupMilestoneConfigDTO - * @author generator - * @date 2021-04-19 - */ - ResiGroupAchievementConfigDTO get(String id); - - /** - * 默认保存 - * - * @param dto - * @return void - * @author generator - * @date 2021-04-19 - */ - void save(ResiGroupAchievementConfigDTO dto); - - /** - * 默认更新 - * - * @param dto - * @return void - * @author generator - * @date 2021-04-19 - */ - void update(ResiGroupAchievementConfigDTO dto); - - /** - * 批量删除 - * - * @param ids - * @return void - * @author generator - * @date 2021-04-19 - */ - void delete(String[] ids); -} \ No newline at end of file + List selectMoreThanOneByValue(String achievementType,int offset,int pageSize); +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java index 3b71116fea..4fc8370ad9 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupAchievementStatsService.java @@ -110,4 +110,27 @@ public interface ResiGroupAchievementStatsService extends BaseService */ List getUnAchieved(String groupId); -} \ No newline at end of file + + /** + * desc: 获取最后未实现的成就 实际每种类型 数据库只存在一条未实现的成就 + * + * @param customerId + * @param groupId + * @param achievementType + * @return com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity + * @author LiuJanJun + * @date 2021/4/22 2:35 下午 + */ + ResiGroupAchievementStatsEntity selectLastUnAchieved(String customerId, String groupId, String achievementType); + + /** + * desc: 插入或更新成就 + * + * @param haveArrive + * @param updateAll + * @return int + * @author LiuJanJun + * @date 2021/4/22 3:03 下午 + */ + int saveOrUpdate(List haveArrive, boolean updateAll); +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/StatsAchievementService.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/StatsAchievementService.java new file mode 100644 index 0000000000..7b532f83e0 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/StatsAchievementService.java @@ -0,0 +1,51 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.modules.group.service; + +/** + * desc:实时计算小组成就完成情况 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-04-19 + */ +public interface StatsAchievementService{ + + /** + * desc: 计算小组成就 统一入口 + * + * @param achievementType 成就类型 小组人数、话题数、转议题数、小组内问题解决数 + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2021/4/20 + */ + Boolean calculateAcm(String achievementType); + + /** + * desc: 根据小组Id计算小组成就 入口 + * + * @param customerId + * @param groupId + * @param achievementType 成就类型 小组人数、话题数、转议题数、小组内问题解决数 + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2021/4/20 + */ + Boolean calculateAcm(String customerId, String groupId, String achievementType); + + +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java index 42ff9f7288..85a8077e78 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementConfigServiceImpl.java @@ -17,23 +17,13 @@ package com.epmet.modules.group.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; -import com.epmet.commons.tools.page.PageData; -import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.modules.group.dao.ResiGroupAchievementConfigDao; import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity; import com.epmet.modules.group.service.ResiGroupAchievementConfigService; -import com.epmet.resi.group.dto.group.ResiGroupAchievementConfigDTO; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; import java.util.List; -import java.util.Map; /** * 小组成就配置表 @@ -44,57 +34,13 @@ import java.util.Map; @Service public class ResiGroupAchievementConfigServiceImpl extends BaseServiceImpl implements ResiGroupAchievementConfigService { - @Override - public PageData page(Map params) { - IPage page = baseDao.selectPage( - getPage(params, FieldConstant.CREATED_TIME, false), - getWrapper(params) - ); - return getPageData(page, ResiGroupAchievementConfigDTO.class); - } - - @Override - public List list(Map params) { - List entityList = baseDao.selectList(getWrapper(params)); - - return ConvertUtils.sourceToTarget(entityList, ResiGroupAchievementConfigDTO.class); - } - - private QueryWrapper getWrapper(Map params){ - String id = (String)params.get(FieldConstant.ID_HUMP); - - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); - - return wrapper; + public ResiGroupAchievementConfigEntity getLastOne(String achievementType) { + return baseDao.getLastOne(achievementType); } @Override - public ResiGroupAchievementConfigDTO get(String id) { - ResiGroupAchievementConfigEntity entity = baseDao.selectById(id); - return ConvertUtils.sourceToTarget(entity, ResiGroupAchievementConfigDTO.class); + public List selectMoreThanOneByValue(String achievementType,int offset,int pageSize) { + return baseDao.selectMoreThanOneByValue(achievementType,offset,pageSize); } - - @Override - @Transactional(rollbackFor = Exception.class) - public void save(ResiGroupAchievementConfigDTO dto) { - ResiGroupAchievementConfigEntity entity = ConvertUtils.sourceToTarget(dto, ResiGroupAchievementConfigEntity.class); - insert(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(ResiGroupAchievementConfigDTO dto) { - ResiGroupAchievementConfigEntity entity = ConvertUtils.sourceToTarget(dto, ResiGroupAchievementConfigEntity.class); - updateById(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void delete(String[] ids) { - // 逻辑删除(@TableLogic 注解) - baseDao.deleteBatchIds(Arrays.asList(ids)); - } - -} \ No newline at end of file +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java index 46b0fa5303..3e84f116a3 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupAchievementStatsServiceImpl.java @@ -131,4 +131,14 @@ public class ResiGroupAchievementStatsServiceImpl extends BaseServiceImpl haveArrive, boolean updateAll) { + return baseDao.saveOrUpdate(haveArrive, updateAll); + } + +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java index 7b2bdedcab..47c0dc7bf6 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java @@ -21,6 +21,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; import com.epmet.commons.tools.constant.*; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; @@ -44,6 +45,7 @@ import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.group.constant.GroupConstant; import com.epmet.feign.EpmetUserOpenFeignClient; import com.epmet.modules.constant.UserMessageConstant; +import com.epmet.modules.enums.AchievementTypeEnum; import com.epmet.modules.feign.EpmetMessageFeignClient; import com.epmet.modules.feign.EpmetUserFeignClient; import com.epmet.modules.feign.GovOrgFeignClient; @@ -75,6 +77,7 @@ import com.epmet.resi.group.dto.member.ResiGroupMemberInfoRedisDTO; import com.epmet.resi.group.dto.member.form.EditAuditSwitchFormDTO; import com.epmet.resi.group.dto.member.result.AchievementResultDTO; import com.epmet.resi.group.dto.member.result.GroupAchievementDTO; +import com.epmet.send.SendMqMsgUtil; import com.github.pagehelper.PageHelper; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -676,6 +679,13 @@ public class ResiGroupServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); msgList.add(wxSubscribeMessageFormDTO); epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + + //发送小组成就消息 + boolean flag = SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient) + .sendGroupAchievementMqMsg(new GroupAchievementMQMsg(resiGroupDTO.getCustomerId(),resiGroupDTO.getId(),AchievementTypeEnum.MEMBER.getCode())); + if (!flag) { + logger.error("发送(小组成就)系统消息到message服务失败"); + } return new Result(); } diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/StatsAchievementServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/StatsAchievementServiceImpl.java new file mode 100644 index 0000000000..74ada0b770 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/StatsAchievementServiceImpl.java @@ -0,0 +1,218 @@ +package com.epmet.modules.group.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.modules.enums.AchievementTypeEnum; +import com.epmet.modules.group.entity.ResiGroupAchievementConfigEntity; +import com.epmet.modules.group.entity.ResiGroupAchievementStatsEntity; +import com.epmet.modules.group.service.AbstractStatsAchievementService; +import com.epmet.modules.group.service.StatsAchievementService; +import com.epmet.modules.member.dao.ResiGroupMemberDao; +import com.epmet.modules.topic.dao.ResiTopicDao; +import com.epmet.modules.topic.entity.ResiTopicEntity; +import com.epmet.resi.group.constant.TopicConstant; +import com.epmet.resi.group.dto.group.ResiGroupAchievementStatsDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * desc: + * + * @author: LiuJanJun + * @date: 2021/4/20 5:48 下午 + * @version: 1.0 + */ +@Slf4j +@Service +public class StatsAchievementServiceImpl extends AbstractStatsAchievementService implements StatsAchievementService { + @Autowired + private ResiGroupMemberDao resiGroupMemberDao; + @Autowired + private ResiTopicDao resiTopicDao; + + + /** + * desc: 计算小组成就 统一入口 + * + * @param achievementType 成就类型 + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2021/4/20 + */ + @Override + public Boolean calculateAcm(String achievementType) { + if (StringUtils.isBlank(achievementType)) { + //计算所有类型的 小组人数、话题数、转议题数、小组内问题解决数 + } + return null; + } + + /** + * desc: 根据小组Id计算小组成就 入口 + * + * @param customerId + * @param groupId + * @param achievementType 成就类型 小组人数、话题数、转议题数、小组内问题解决数 + * @return java.lang.Boolean + * @author LiuJanJun + * @date 2021/4/20 + */ + @Override + public Boolean calculateAcm(String customerId, String groupId, String achievementType) { + AchievementTypeEnum anEnum = AchievementTypeEnum.getEnum(achievementType); + if (StringUtils.isBlank(customerId) || StringUtils.isBlank(groupId) || anEnum == null) { + return false; + } + Integer currentValue = null; + switch (anEnum) { + case TOPIC: + //查询话题数 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(ResiTopicEntity::getCustomerId,customerId) + .eq(ResiTopicEntity::getGroupId,groupId) + .eq(ResiTopicEntity::getDelFlag,NumConstant.ZERO); + currentValue = resiTopicDao.selectCount(queryWrapper); + break; + case MEMBER: + currentValue = resiGroupMemberDao.countMembers(customerId, groupId); + break; + case TOISSUE: + //查询已经转议题的话题数 + queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(ResiTopicEntity::getCustomerId,customerId) + .eq(ResiTopicEntity::getGroupId,groupId) + .eq(ResiTopicEntity::getShiftIssue, NumConstant.ONE) + .eq(ResiTopicEntity::getDelFlag,NumConstant.ZERO); + currentValue = resiTopicDao.selectCount(queryWrapper); + break; + case RESOVLE_TOPIC: + //查询已经关闭且为已解决的话题数 + queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(ResiTopicEntity::getCustomerId,customerId) + .eq(ResiTopicEntity::getGroupId,groupId) + .eq(ResiTopicEntity::getStatus, TopicConstant.CLOSED) + .eq(ResiTopicEntity::getClosedStatus, TopicConstant.RESOLVED) + .eq(ResiTopicEntity::getShiftIssue, NumConstant.ONE) + .eq(ResiTopicEntity::getDelFlag,NumConstant.ZERO); + currentValue = resiTopicDao.selectCount(queryWrapper); + break; + default: + log.info("calculateAcm error"); + } + calculateGroupAchievement(customerId, groupId, currentValue, achievementType); + return true; + } + + /** + * desc: 计算小组的人数等级 + * + * @param customerId + * @param groupId + */ + private void calculateGroupAchievement(String customerId, String groupId, int currentValue, String achievementType) { + + ResiGroupAchievementStatsEntity one = super.achievementStatsService.selectLastUnAchieved(customerId, groupId, achievementType); + + List haveArrive = new ArrayList<>(); + //如果没有实现的额成就则说明是初始化 + if (one == null) { + initAchievementStat(customerId, groupId, achievementType, currentValue, haveArrive); + super.achievementStatsService.saveOrUpdate(haveArrive,false); + return; + } + + boolean isBatch = false; + Integer targetValue = one.getTargetValue(); + //改为已实现 + if (currentValue >= targetValue) { + isBatch = true; + + boolean isContinue; + int pageNum = NumConstant.ONE; + int pageSize = NumConstant.TEN; + do { + List list = getConfigByType(achievementType,pageNum++,pageSize); + isContinue = buildArriveList(customerId, groupId, achievementType, currentValue, one.getTargetValue(), haveArrive, list); + }while (isContinue); + } + + if (isBatch) { + super.achievementStatsService.saveOrUpdate(haveArrive,true); + } else { + //未实现 只更新当前值 + ResiGroupAchievementStatsDTO newStat = new ResiGroupAchievementStatsDTO(); + newStat.setId(one.getId()); + newStat.setCurrentValue(currentValue); + super.achievementStatsService.update(newStat); + } + } + + private void initAchievementStat(String customerId, String groupId, String achievementType, int currentValue, List haveArrive) { + + boolean isContinue; + int pageNum = NumConstant.ONE; + int pageSize = NumConstant.TEN; + do { //没有任何数据说明是初始化 + List list = getConfigByType(achievementType,pageNum++,pageSize); + //查询和初始化都失败啦 + if (CollectionUtils.isEmpty(list)) { + log.error("calculateMember get config fail"); + throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode()); + } + isContinue = buildArriveList(customerId, groupId, achievementType, currentValue, null, haveArrive, list); + }while (isContinue); + if (CollectionUtils.isEmpty(haveArrive)) { + throw new RenException("小组达成成就失败"); + } + } + + private boolean buildArriveList(String customerId, String groupId, String achievementType, int currentValue, Integer targetValue, List haveArrive, List list) { + boolean isContinue = true; + for (ResiGroupAchievementConfigEntity configEntity : list) { + if (targetValue != null) { + //筛选出已经完成的成就 + if (configEntity.getTargetValue()= configEntity.getTargetValue()) { + statsEntity.setIsArrive(NumConstant.ONE); + } else { + //如果没有达到则 放入这一条后 退出 + statsEntity.setIsArrive(NumConstant.ZERO); + isContinue = false; + break; + } + } + return isContinue; + } + + private List getConfigByType(String achievementType,int pageNum,int pageSize) { + List list = super.getAchievemnetConfigPage(pageNum, pageSize, achievementType); + if (CollectionUtils.isEmpty(list)) { + log.warn("获取小组成就配置错误,{} 开始进行初始化规则", achievementType); + list = super.initAchievementConfig(achievementType); + } + return list; + } +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java index 4205eb483d..f9d9117915 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/member/dao/ResiGroupMemberDao.java @@ -168,4 +168,15 @@ public interface ResiGroupMemberDao extends BaseDao { * @date 2021/4/20 下午4:03 */ String selectUserRole(@Param("groupId")String groupId, @Param("userId")String userId); + + /** + * desc: 仅统计除组长之外的成员数 + * + * @param customerId + * @param groupId + * @return int + * @author LiuJanJun + * @date 2021/4/23 3:14 下午 + */ + int countMembers(@Param("customerId") String customerId, @Param("groupId") String groupId); } diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java index 0f135804a8..ac90ee00fb 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/support/GroupAchievementUtils.java @@ -3,6 +3,7 @@ package com.epmet.modules.support; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; +import com.epmet.modules.enums.AchievementTypeEnum; /** * desc:小组成就下一等级规则工具类 @@ -20,7 +21,7 @@ public class GroupAchievementUtils { * * @param currentValue */ - public static Integer getNextTopicTargetValue(Integer currentValue) { + private static Integer getNextTopicTargetValue(Integer currentValue) { if (currentValue < NumConstant.FIVE_HUNDRED) { throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode()); } @@ -32,7 +33,7 @@ public class GroupAchievementUtils { * * @param currentValue */ - public static Integer getNextToIssueTargetValue(Integer currentValue) { + private static Integer getNextToIssueTargetValue(Integer currentValue) { if (currentValue < NumConstant.ONE_HUNDRED) { throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode()); } @@ -44,10 +45,37 @@ public class GroupAchievementUtils { * * @param currentValue */ - public static Integer getNextResolveTopicTargetValue(Integer currentValue) { + private static Integer getNextResolveTopicTargetValue(Integer currentValue) { if (currentValue < NumConstant.ONE_HUNDRED) { throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode()); } return currentValue + NumConstant.ONE_HUNDRED; } + + /** + * desc:获取下一等级的话题数目标值 步长500 起始值 500 + * + * @param currentValue + */ + public static Integer getNextTargetValue(String achievementType, Integer currentValue) { + AchievementTypeEnum anEnum = AchievementTypeEnum.getEnum(achievementType); + if (anEnum == null){ + throw new RenException(EpmetErrorCode.INTERNAL_VALIDATE_ERROR.getCode()); + } + Integer next = null; + switch (anEnum){ + case TOPIC: + next = getNextTopicTargetValue(currentValue); + break; + case TOISSUE: + next = getNextToIssueTargetValue(currentValue); + break; + case RESOVLE_TOPIC: + next = getNextResolveTopicTargetValue(currentValue); + break; + default: + + } + return next; + } } diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/controller/ResiTopicController.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/controller/ResiTopicController.java index aa8158ede0..f47871a741 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/controller/ResiTopicController.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/controller/ResiTopicController.java @@ -47,6 +47,7 @@ public class ResiTopicController { * @Author wangc * @Date 2020.03.31 13:15 **/ + @Deprecated @PostMapping("createtopic") public Result createTopic(@LoginUser TokenDto tokenDto, @RequestBody ResiTopicPublishFormDTO topicPublishFormDTO){ diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicServiceImpl.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicServiceImpl.java index d3073e3788..e9de211071 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicServiceImpl.java +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/topic/service/impl/ResiTopicServiceImpl.java @@ -22,6 +22,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; +import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.MqConstant; import com.epmet.commons.tools.constant.NumConstant; @@ -54,6 +55,7 @@ import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.modules.constant.GroupMemberConstant; import com.epmet.modules.constant.ResiGroupRedisKeys; import com.epmet.modules.constant.WxmpSubscribeConstant; +import com.epmet.modules.enums.AchievementTypeEnum; import com.epmet.modules.feign.EpmetUserFeignClient; import com.epmet.modules.feign.GovIssueFeignClient; import com.epmet.modules.feign.GovOrgFeignClient; @@ -100,9 +102,11 @@ import com.epmet.resi.group.dto.topic.form.*; import com.epmet.resi.group.dto.topic.result.CheckTopicPublisherResultDTO; import com.epmet.resi.group.dto.topic.result.GovTopicIssueInfoResultDTO; import com.epmet.resi.group.dto.topic.result.*; +import com.epmet.send.SendMqMsgUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.base.CharMatcher; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -124,6 +128,7 @@ import java.util.stream.Collectors; * @author generator generator@elink-cn.com * @since v1.0.0 2020-03-31 */ +@Data @Service @Slf4j public class ResiTopicServiceImpl extends BaseServiceImpl implements ResiTopicService { @@ -794,6 +799,11 @@ public class ResiTopicServiceImpl extends BaseServiceImpl { + @Autowired + private StatsAchievementService statsAchievementService; + + @Override + public void onMessage(GroupAchievementMQMsg msg) { + log.info("receive msg:{}", JSON.toJSONString(msg)); + if (StringUtils.isBlank(msg.getAchievementType()) || StringUtils.isBlank(msg.getCustomerId()) + || StringUtils.isBlank(msg.getGroupId())) { + log.error("consumer fail,msg:{}", msg); + return; + } + Boolean aBoolean = statsAchievementService.calculateAcm(msg.getCustomerId(), msg.getGroupId(), msg.getAchievementType()); + log.info("consumer msg success,{}", aBoolean); + } +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/type1/GroupAchievementCustomListener.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/type1/GroupAchievementCustomListener.java new file mode 100644 index 0000000000..1e63735ad3 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/type1/GroupAchievementCustomListener.java @@ -0,0 +1,77 @@ +package com.epmet.mq.type1; + +import com.alibaba.fastjson.JSON; +import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; +import com.epmet.commons.tools.distributedlock.DistributedLock; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.modules.group.service.StatsAchievementService; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.common.message.MessageExt; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @Description 小组成就-监听器 + * @return + * @author wxz + * @date 2021.03.03 16:10 +*/ +public class GroupAchievementCustomListener implements MessageListenerConcurrently { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + try { + msgs.forEach(this::consumeMessage); + } catch (Exception e) { + logger.error("consumeMessage fail,msg:{}",e.getMessage()); + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + + private void consumeMessage(MessageExt messageExt) { + String msg = new String(messageExt.getBody()); + logger.info("receive msg:{}", JSON.toJSONString(msg)); + GroupAchievementMQMsg msgObj = JSON.parseObject(msg, GroupAchievementMQMsg.class); + + DistributedLock distributedLock = null; + RLock lock = null; + try { + distributedLock = SpringContextUtils.getBean(DistributedLock.class); + lock = distributedLock.getLock(String.format("lock:init_customer_org:%s", msgObj.getCustomerId()), + 30l, 30l, TimeUnit.SECONDS); + + + + if (StringUtils.isBlank(msgObj.getAchievementType()) || StringUtils.isBlank(msgObj.getCustomerId()) + || StringUtils.isBlank(msgObj.getGroupId())){ + logger.error("consumer fail,msg:{}",msgObj); + return; + } + Boolean aBoolean = SpringContextUtils.getBean(StatsAchievementService.class).calculateAcm(msgObj.getCustomerId(), msgObj.getGroupId(), msgObj.getAchievementType()); + logger.info("consumer msg success,{}",aBoolean); + } catch (RenException e) { + // 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试 + logger.error("【RocketMQ】初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + } catch (Exception e) { + // 不是我们自己抛出的异常,可以让MQ重试 + logger.error("【RocketMQ】初始化客户组织失败:".concat(ExceptionUtils.getErrorStackTrace(e))); + throw e; + } finally { + if (distributedLock != null){ + distributedLock.unLock(lock); + } + } + } +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/type1/RocketMQConsumerRegister.java b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/type1/RocketMQConsumerRegister.java new file mode 100644 index 0000000000..c15e0ba6b2 --- /dev/null +++ b/epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/mq/type1/RocketMQConsumerRegister.java @@ -0,0 +1,63 @@ +package com.epmet.mq.type1; + +import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants; +import com.epmet.commons.rocketmq.constants.TopicConstants; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.listener.MessageListener; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Slf4j +@Component +public class RocketMQConsumerRegister { + + @Value("${rocketmq.name-server}") + private String nameServer; + + /** + * @return + * @Description 注册监听器 + * @author wxz + * @date 2021.03.03 16:09 + */ + @PostConstruct + public void registerAllListeners() { + try { + register(ConsomerGroupConstants.GROUP_ACHIEVEMENT_COMPONENTS_GROUP, MessageModel.CLUSTERING, TopicConstants.GROUP_ACHIEVEMENT, "*", new GroupAchievementCustomListener()); + } catch (MQClientException e) { + log.error("registerAllListeners exception", e); + } + } + + public void register(String group, MessageModel messageModel, String topic, String subException, MessageListener listener) throws MQClientException { + // 实例化消费者 + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group); + + // 设置NameServer的地址 + consumer.setNamesrvAddr(nameServer); + consumer.setMessageModel(messageModel); + consumer.setInstanceName(buildInstanceName()); + // 订阅一个或者多个Topic,以及Tag来过滤需要消费的消息 + consumer.subscribe(topic, subException); + // 注册回调实现类来处理从broker拉取回来的消息 + consumer.registerMessageListener(listener); + // 启动消费者实例 + consumer.start(); + } + + private String buildInstanceName() { + String instanceName = ""; + for (int i = 0; i < 4; i++) { + int t = (int) (Math.random() * 10); + instanceName = instanceName.concat(t + ""); + } + + return instanceName; + } + +} diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml b/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml index f8517a8d56..2ad05a26a0 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml +++ b/epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml @@ -166,3 +166,8 @@ shutdown: graceful: enable: true #是否开启优雅停机 waitTimeSecs: 30 # 优雅停机等待时间,每超过30秒,打印一次错误日志 + +rocketmq: + name-server: @rocketmq.nameserver@ + producer: + group: @rocketmq.producer.group@ diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml index 5531c7228e..1728c69e11 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml +++ b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementConfigDao.xml @@ -3,20 +3,29 @@ - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml index 7705832ba7..a6d3c8e49b 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml +++ b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/group/ResiGroupAchievementStatsDao.xml @@ -35,6 +35,67 @@ CURRENT_VALUE / TARGET_VALUE ASC LIMIT 3 + + + INSERT INTO resi_group_achievement_stats + ( + ID, + CUSTOMER_ID, + GROUP_ID, + ACHIEVEMENT_ID, + ACHIEVEMENT_NAME, + ACHIEVEMENT_TYPE, + ARRIVE_TIME, + CURRENT_VALUE, + TARGET_VALUE, + IS_ARRIVE, + DEL_FLAG, + REVISION, + CREATED_BY, + CREATED_TIME, + UPDATED_BY, + UPDATED_TIME + ) + VALUES + + ( + #{item.id}, + #{item.customerId}, + #{item.groupId}, + #{item.achievementId}, + #{item.achievementName}, + #{item.achievementType}, + #{item.arriveTime}, + #{item.currentValue}, + #{item.targetValue}, + #{item.isArrive}, + #{item.delFlag}, + #{item.revision}, + #{item.createdBy}, + #{item.createdTime}, + #{item.updatedBy}, + #{item.updatedTime} + ) + + ON DUPLICATE KEY UPDATE + + CURRENT_VALUE = values(CURRENT_VALUE), + TARGET_VALUE = values(TARGET_VALUE), + IS_ARRIVE = VALUES(IS_ARRIVE), + UPDATED_TIME = VALUES(UPDATED_TIME), + + UPDATED_BY = VALUES(UPDATED_BY) + - \ No newline at end of file + diff --git a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml index 7cf0ffb00a..fb7457d649 100644 --- a/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml +++ b/epmet-module/resi-group/resi-group-server/src/main/resources/mapper/member/ResiGroupMemberDao.xml @@ -191,6 +191,18 @@ ORDER BY rgm.CREATED_TIME DESC +