From 4944932d094755954ec36fa30988bcaa0f434b5e Mon Sep 17 00:00:00 2001 From: jianjun Date: Sat, 16 Jul 2022 20:40:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B1=85=E6=B0=91=20?= =?UTF-8?q?=E7=B1=BB=E5=88=AB=E6=95=B0=E6=8D=AE=20=E5=92=8C=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=88=BF=E5=B1=8B=E5=86=85=E5=B1=85=E6=B0=91=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=90=8C?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 14 +++ .../epmet/commons/tools/redis/RedisUtils.java | 18 ++++ .../com/epmet/task/ic/IcDataSyncTask.java | 36 +++++++ .../epmet/feign/EpmetUserOpenFeignClient.java | 11 ++ .../EpmetUserOpenFeignClientFallback.java | 5 + .../IcResiUserDataSyncController.java | 101 ++++++++++++++++++ .../mq/listener/ICWarnStatsEventListener.java | 6 +- .../service/IcResiUserDataSyncService.java | 36 +++++++ .../com/epmet/service/IcResiUserService.java | 1 + .../impl/IcResiUserDataSyncServiceImpl.java | 55 ++++++++++ .../service/impl/IcResiUserServiceImpl.java | 6 ++ 11 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/ic/IcDataSyncTask.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserDataSyncController.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserDataSyncService.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserDataSyncServiceImpl.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 99dca942df..579f8ee9cf 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -803,4 +803,18 @@ public class RedisKeys { } + /** + * desc: 数据同步业务key 根据方法名区分 + * + * @param bizType [resi] + * @return java.lang.String + * @author LiuJanJun + * @date 2022/7/16 7:12 下午 + */ + public static String getDataSyncKey(String bizType) { + if (StringUtils.isBlank(bizType)){ + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"参数错误"); + } + return rootPrefix.concat("datasync:").concat(bizType); + } } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java index 27636e435a..a324a5970a 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java @@ -357,6 +357,24 @@ public class RedisUtils { return redisTemplate.opsForSet().members(key); } + /** + * @Description 获取一个(set) + * @param key + * @author zxc + */ + public Object sPop(String key){ + return redisTemplate.opsForSet().pop(key); + } + + /** + * @Description 添加一个元素(set) + * @param key + * @author zxc + */ + public Long sAdd(String key,Object value){ + return redisTemplate.opsForSet().add(key,value); + } + /** * @Description 获取 zset 中带score的集合 * @param key diff --git a/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/ic/IcDataSyncTask.java b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/ic/IcDataSyncTask.java new file mode 100644 index 0000000000..c92144ca26 --- /dev/null +++ b/epmet-module/epmet-job/epmet-job-server/src/main/java/com/epmet/task/ic/IcDataSyncTask.java @@ -0,0 +1,36 @@ +package com.epmet.task.ic; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.feign.EpmetUserOpenFeignClient; +import com.epmet.task.ITask; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * desc:定时弥补数据 保证数据的一致性 + */ +@Slf4j +@Component("icDataSyncTask") +public class IcDataSyncTask implements ITask { + + @Resource + private EpmetUserOpenFeignClient epmetUserOpenFeignClient; + + /** + * 执行定时任务接口 + * + * @param params 参数,多参数使用JSON数据 + */ + @Override + public void run(String customerId) { + log.info("icDataSyncTask定时任务正在执行,参数为customerId:{}", customerId); + Result result = epmetUserOpenFeignClient.icDataSyncTask(customerId); + if (result.success()) { + log.info("icDataSyncTask定时任务正在执行定时任务执行成功"); + } else { + log.warn("icDataSyncTask定时任务正在执行定时任务执行失败:" + result.getMsg()); + } + } +} diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java index 65e7b7b850..d52625b704 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/EpmetUserOpenFeignClient.java @@ -835,4 +835,15 @@ public interface EpmetUserOpenFeignClient { */ @PostMapping("/epmetuser/icresiuser/getIcUserCount") Result> getIcUserCount(@RequestBody IcUserCountFormDTO formDTO); + + /** + * desc: 同步数据,房内居民数量 类别统计数据量等只用客户id当条件 + * + * @param customerId + * @return com.epmet.commons.tools.utils.Result + * @author LiuJanJun + * @date 2022/7/16 6:53 下午 + */ + @PostMapping("/epmetuser/icResiUserDataSync/icDataSyncTask") + Result icDataSyncTask(String customerId); } diff --git a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java index 8c47cdb204..56b203743a 100644 --- a/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java +++ b/epmet-user/epmet-user-client/src/main/java/com/epmet/feign/fallback/EpmetUserOpenFeignClientFallback.java @@ -636,4 +636,9 @@ public class EpmetUserOpenFeignClientFallback implements EpmetUserOpenFeignClien return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "getIcUserCount", formDTO); } + @Override + public Result icDataSyncTask(String customerId) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "icDataSyncTask", customerId); + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserDataSyncController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserDataSyncController.java new file mode 100644 index 0000000000..44bfe961da --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserDataSyncController.java @@ -0,0 +1,101 @@ +/** + * 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.controller; + +import com.epmet.commons.tools.distributedlock.DistributedLock; +import com.epmet.commons.tools.feign.ResultDataResolver; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.service.IcResiUserDataSyncService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + + +/** + * 用户基础信息同步计算入口 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +@Slf4j +@RestController +@RequestMapping("icResiUserDataSync") +public class IcResiUserDataSyncController implements ResultDataResolver { + + @Autowired + private IcResiUserDataSyncService icResiUserDataSyncService; + @Autowired + private RedisUtils redisUtils; + @Autowired + private DistributedLock distributedLock; + + + /** + * 获取录入居民的数量 + * + * @Param formDTO + * @Return {@link Result>} + * @Author zhaoqifeng + * @Date 2022/6/30 9:35 + */ + @PostMapping("icDataSyncTask") + public Result icDataSyncTask(@RequestParam("customerId") String customerId) { + RLock lock = null; + String key = RedisKeys.getDataSyncKey("resi"); + try { + lock = distributedLock.getLock(RedisKeys.getLockByMethodName("icDataSyncTask"), + 30L, 30L, TimeUnit.SECONDS); + if (StringUtils.isBlank(customerId)) { + Object customerIdObj = redisUtils.sPop(key); + while (customerIdObj != null) { + try { + icResiUserDataSyncService.icDataSyncTask(customerIdObj.toString()); + log.debug("icDataSyncTask customerId:{} execute success", customerIdObj); + + customerIdObj = redisUtils.sPop(key); + } catch (Exception e) { + log.error("icDataSyncTask exception msg:{},customerId:{}", e.getMessage(), customerIdObj); + redisUtils.sAdd(key, customerIdObj); + } + log.debug("icDataSyncTask finish customerId:{} execute success", customerIdObj); + } + } else { + icResiUserDataSyncService.icDataSyncTask(customerId); + log.debug("icDataSyncTask customerId:{} execute success", customerId); + } + } catch (Exception e) { + if (StringUtils.isNotBlank(customerId)) { + redisUtils.sAdd(key, customerId); + } + log.error("icDataSyncTask exception msg:{},customerId:{}", e.getMessage(), customerId); + } finally { + distributedLock.unLock(lock); + } + return new Result().ok(true); + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java index 6feab639a7..c1328f548a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/mq/listener/ICWarnStatsEventListener.java @@ -70,9 +70,11 @@ public class ICWarnStatsEventListener implements MessageListenerConcurrently { IcResiUserAddMQMsg obj = JSON.parseObject(msg, IcResiUserAddMQMsg.class); log.info("obj is {}", JSON.toJSONString(obj)); try { + String key = RedisKeys.getDataSyncKey("resi"); + redisUtils.sAdd(key, obj.getCustomerId()); //todo 统计预警人数和 更新屋内居民数 用定时任务跑吧 这样太费劲 - //||!updateIcHouseResiNumber(obj) - if (!resiWarnStats(obj)||!updateIcNatResiFlag(tags, obj)){ + //||!updateIcHouseResiNumber(obj) !resiWarnStats(obj)|| installed of IcDataSyncTask + if (!updateIcNatResiFlag(tags, obj)){ throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"消费失败,等待重新消费"); } } catch (RenException e) { diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserDataSyncService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserDataSyncService.java new file mode 100644 index 0000000000..7e1ccc9a24 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserDataSyncService.java @@ -0,0 +1,36 @@ +/** + * 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.service; + +/** + * 用户基础信息 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-10-26 + */ +public interface IcResiUserDataSyncService { + /** + * desc: 同步与居民相关的数据 + * + * @param customerId + * @return java.lang.String + * @author LiuJanJun + * @date 2022/7/16 8:06 下午 + */ + Boolean icDataSyncTask(String customerId); +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 97cb5345a5..0fde2cad33 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -490,4 +490,5 @@ public interface IcResiUserService extends BaseService { */ Map getIcUserCount(IcUserCountFormDTO formDTO); + String icDataSyncTask(String customerId); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserDataSyncServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserDataSyncServiceImpl.java new file mode 100644 index 0000000000..95c5f97e34 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserDataSyncServiceImpl.java @@ -0,0 +1,55 @@ +package com.epmet.service.impl; + +import com.epmet.service.IcResiUserDataSyncService; +import com.epmet.service.IcResiUserService; +import com.epmet.service.StatsResiWarnService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.ExecutorService; + +/** + * desc: + * + * @author: LiuJanJun + * @date: 2022/7/16 8:07 下午 + * @version: 1.0 + */ +@Slf4j +@Service +public class IcResiUserDataSyncServiceImpl implements IcResiUserDataSyncService { + + @Autowired + private IcResiUserService icResiUserService; + @Autowired + private StatsResiWarnService statsResiWarnService; + @Autowired + private ExecutorService executorService; + + /** + * desc: 同步与居民相关的数据 + * + * @param customerId + * @return java.lang.String + * @author LiuJanJun + * @date 2022/7/16 8:06 下午 + */ + @Override + public Boolean icDataSyncTask(String customerId) { + Boolean flag = true; + try { + statsResiWarnService.resiWarn(customerId); + } catch (Exception e) { + flag = false; + log.error("icDataSyncTask resiWarn exception:{}", e.getMessage(), customerId); + } + try { + icResiUserService.updateIcHouseResiNumber(customerId); + } catch (Exception e) { + flag = false; + log.error("icDataSyncTask updateIcHouseResiNumber exception:{}", e.getMessage(), customerId); + } + return flag; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 9410073e56..1fce5da5f2 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -2763,6 +2763,12 @@ public class IcResiUserServiceImpl extends BaseServiceImpl key2)); } + @Override + public String icDataSyncTask(String customerId) { + operCustomizeOpenFeignClient + return null; + } + /** * 根据身份证获取居民角色(目前只有是否是志愿者) * From 2fc4c03955229440f54a9692e8ea71a94708b17d Mon Sep 17 00:00:00 2001 From: jianjun Date: Sat, 16 Jul 2022 20:51:02 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B1=85=E6=B0=91=20?= =?UTF-8?q?=E7=B1=BB=E5=88=AB=E6=95=B0=E6=8D=AE=20=E5=92=8C=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=88=BF=E5=B1=8B=E5=86=85=E5=B1=85=E6=B0=91=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=90=8C?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/epmet/service/IcResiUserService.java | 1 - .../java/com/epmet/service/impl/IcResiUserServiceImpl.java | 6 ------ 2 files changed, 7 deletions(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java index 0fde2cad33..97cb5345a5 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserService.java @@ -490,5 +490,4 @@ public interface IcResiUserService extends BaseService { */ Map getIcUserCount(IcUserCountFormDTO formDTO); - String icDataSyncTask(String customerId); } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 1fce5da5f2..9410073e56 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java @@ -2763,12 +2763,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl key2)); } - @Override - public String icDataSyncTask(String customerId) { - operCustomizeOpenFeignClient - return null; - } - /** * 根据身份证获取居民角色(目前只有是否是志愿者) * From a7cf6167055489568bf7c0c94b3d669292e2e42f Mon Sep 17 00:00:00 2001 From: jianjun Date: Sat, 16 Jul 2022 21:10:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B1=85=E6=B0=91=20?= =?UTF-8?q?=E7=B1=BB=E5=88=AB=E6=95=B0=E6=8D=AE=20=E5=92=8C=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=88=BF=E5=B1=8B=E5=86=85=E5=B1=85=E6=B0=91=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=90=8C?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/epmet/controller/IcResiUserDataSyncController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserDataSyncController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserDataSyncController.java index 44bfe961da..ae875c7acf 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserDataSyncController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserDataSyncController.java @@ -64,7 +64,7 @@ public class IcResiUserDataSyncController implements ResultDataResolver { * @Date 2022/6/30 9:35 */ @PostMapping("icDataSyncTask") - public Result icDataSyncTask(@RequestParam("customerId") String customerId) { + public Result icDataSyncTask(@RequestParam(value = "customerId",required = false) String customerId) { RLock lock = null; String key = RedisKeys.getDataSyncKey("resi"); try {