From 654f4eebf519f015506b90d71637e6aad75e5b5c Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期三, 25 六月 2025 14:33:26 +0800 Subject: [PATCH] 视频评论点赞通过mq异步添加数据库,点赞数缓存redis --- framework/src/main/java/cn/lili/modules/lmk/service/VideoCommentService.java | 22 ++ framework/src/main/resources/mapper/lmk/VideoCommentMapper.xml | 15 + framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoComment.java | 4 framework/src/main/java/cn/lili/modules/lmk/mapper/VideoCommentMapper.java | 7 framework/src/main/resources/mapper/lmk/ThumbsUpRecordMapper.xml | 15 + config/application.yml | 2 consumer/src/main/java/cn/lili/listener/CommentMessageListener.java | 93 +++++++++++ framework/src/main/java/cn/lili/modules/lmk/service/ThumbsUpRecordService.java | 7 framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoCommentServiceImpl.java | 99 +++++++++-- framework/src/main/java/cn/lili/modules/lmk/mapper/ThumbsUpRecordMapper.java | 7 framework/src/main/java/cn/lili/modules/lmk/domain/vo/CollectTypeNumVO.java | 2 consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java | 9 - /dev/null | 22 -- framework/src/main/java/cn/lili/modules/lmk/constant/RedisKeyExpireConstant.java | 27 +++ framework/src/main/java/cn/lili/common/properties/RocketmqCustomProperties.java | 6 framework/src/main/java/cn/lili/modules/lmk/service/impl/ThumbsUpRecordServiceImpl.java | 6 consumer/pom.xml | 6 framework/src/main/java/cn/lili/rocketmq/tags/CommentTagsEnum.java | 32 ++++ framework/src/main/java/cn/lili/modules/lmk/enums/general/ThumbsUpTypeEnum.java | 45 +++++ lmk-job/src/main/java/cn/lili/job/VideoJob.java | 17 ++ 20 files changed, 385 insertions(+), 58 deletions(-) diff --git a/config/application.yml b/config/application.yml index 0902162..a44c47e 100644 --- a/config/application.yml +++ b/config/application.yml @@ -282,6 +282,8 @@ rocketmq: promotion-topic: shop_lili_promotion_topic promotion-group: shop_lili_promotion_group + comment-topic: lmk_comment_topic # 璇勮 + comment-group: lmk_comment_group msg-ext-topic: shop_lili_msg_topic msg-ext-group: shop_lili_msg_group goods-topic: shop_lili_goods_topic diff --git a/consumer/pom.xml b/consumer/pom.xml index fad02f7..d971f7e 100644 --- a/consumer/pom.xml +++ b/consumer/pom.xml @@ -18,11 +18,7 @@ <artifactId>framework</artifactId> <version>${revision}</version> </dependency> - <dependency> - <groupId>com.xuxueli</groupId> - <artifactId>xxl-job-core</artifactId> - <version>${xxl-job}</version> - </dependency> + </dependencies> <repositories> diff --git a/consumer/src/main/java/cn/lili/config/XxlJobConfig.java b/consumer/src/main/java/cn/lili/config/XxlJobConfig.java deleted file mode 100644 index 24052c8..0000000 --- a/consumer/src/main/java/cn/lili/config/XxlJobConfig.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.lili.config; - -import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * xxl-job config - * - * @author xuxueli 2017-04-28 - */ -@Configuration -public class XxlJobConfig { - private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); - - @Value("${xxl.job.admin.addresses:}") - private String adminAddresses; - - @Value("${xxl.job.accessToken:}") - private String accessToken; - - @Value("${xxl.job.executor.appname}") - private String appname; - - @Value("${xxl.job.executor.address}") - private String address; - - @Value("${xxl.job.executor.ip}") - private String ip; - - @Value("${xxl.job.executor.port}") - private int port; - - @Value("${xxl.job.executor.logpath}") - private String logPath; - - @Value("${xxl.job.executor.logretentiondays}") - private int logRetentionDays; - - - @Bean - public XxlJobSpringExecutor xxlJobExecutor() { - logger.info(">>>>>>>>>>> xxl-job config init."); - XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); - xxlJobSpringExecutor.setAdminAddresses(adminAddresses); - xxlJobSpringExecutor.setAppname(appname); - xxlJobSpringExecutor.setAddress(address); - xxlJobSpringExecutor.setIp(ip); - xxlJobSpringExecutor.setPort(port); - xxlJobSpringExecutor.setAccessToken(accessToken); - xxlJobSpringExecutor.setLogPath(logPath); - xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); - - return xxlJobSpringExecutor; - } - - /** - * 閽堝澶氱綉鍗°�佸鍣ㄥ唴閮ㄧ讲绛夋儏鍐碉紝鍙�熷姪 "spring-cloud-commons" 鎻愪緵鐨� "InetUtils" 缁勪欢鐏垫椿瀹氬埗娉ㄥ唽IP锛� - * - * 1銆佸紩鍏ヤ緷璧栵細 - * <dependency> - * <groupId>org.springframework.cloud</groupId> - * <artifactId>spring-cloud-commons</artifactId> - * <version>${version}</version> - * </dependency> - * - * 2銆侀厤缃枃浠讹紝鎴栬�呭鍣ㄥ惎鍔ㄥ彉閲� - * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' - * - * 3銆佽幏鍙朓P - * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); - */ - - -} diff --git a/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java b/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java index d7cf46c..b64b996 100644 --- a/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java @@ -1,20 +1,11 @@ package cn.lili.event.impl; -import cn.hutool.core.date.DateField; -import cn.hutool.core.date.DateTime; -import cn.hutool.json.JSONUtil; import cn.lili.event.AfterSaleStatusChangeEvent; import cn.lili.event.OrderStatusChangeEvent; -import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum; import cn.lili.modules.distribution.service.DistributionOrderService; import cn.lili.modules.order.aftersale.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; -import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.dto.DistributionSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import cn.lili.timetask.handler.EveryDayExecute; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/consumer/src/main/java/cn/lili/listener/CommentMessageListener.java b/consumer/src/main/java/cn/lili/listener/CommentMessageListener.java new file mode 100644 index 0000000..5d87495 --- /dev/null +++ b/consumer/src/main/java/cn/lili/listener/CommentMessageListener.java @@ -0,0 +1,93 @@ +package cn.lili.listener; + +import cn.lili.base.Result; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.lmk.constant.RedisKeyExpireConstant; +import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord; +import cn.lili.modules.lmk.domain.entity.VideoComment; +import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm; +import cn.lili.modules.lmk.service.ThumbsUpRecordService; +import cn.lili.modules.lmk.service.VideoCommentService; +import cn.lili.rocketmq.tags.CommentTagsEnum; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * 璇勮娑堟伅娑堣垂鑰� + * + * @author paulG + * @since 2020/12/9 + **/ +@Component +@Slf4j +@RocketMQMessageListener(topic = "${lili.data.rocketmq.comment-topic}", consumerGroup = "${lili.data.rocketmq.comment-group}") +public class CommentMessageListener implements RocketMQListener<MessageExt> { + + @Autowired + private ThumbsUpRecordService thumbsUpRecordService; + + @Autowired + private VideoCommentService videoCommentService; + + /** + * 缂撳瓨 + */ + @Autowired + private Cache<Object> cache; + + @Override + public void onMessage(MessageExt messageExt) { + try { + String msg = new String(messageExt.getBody()); + if (StringUtils.isBlank(msg)) { + log.error("comment msg is null, cant not consumer"); + return; + } + switch (CommentTagsEnum.valueOf(messageExt.getTags())) { + case THUMBS_UP: + this.thumbsUp(msg); + break; + case CANCEL_THUMBS_UP: + this.cancelThumbsUp(msg); + break; + default: + log.error("comment msg not match correct tag, consumer err"); + break; + } + } catch (Exception e) { + log.error("comment msg consumer err", e); + } + } + + /** + * 璇勮鐐硅禐 + * + * @param msg + */ + public void thumbsUp(String msg) { + ThumbsUpRecord record = JSON.parseObject(msg, ThumbsUpRecord.class); + videoCommentService.mqThumbsUp(record); + } + + /** + * 璇勮鍙栨秷鐐硅禐 + * + * @param msg + */ + public void cancelThumbsUp(String msg) { + ThumbsUpRecordForm form = JSON.parseObject(msg, ThumbsUpRecordForm.class); + videoCommentService.mqCancelThumbsUp(form); + } +} diff --git a/consumer/src/main/java/cn/lili/timetask/TimedTaskJobHandler.java b/consumer/src/main/java/cn/lili/timetask/TimedTaskJobHandler.java deleted file mode 100644 index b898358..0000000 --- a/consumer/src/main/java/cn/lili/timetask/TimedTaskJobHandler.java +++ /dev/null @@ -1,104 +0,0 @@ -package cn.lili.timetask; - -import cn.lili.timetask.handler.EveryDayExecute; -import cn.lili.timetask.handler.EveryHourExecute; -import cn.lili.timetask.handler.EveryMinuteExecute; -import com.xxl.job.core.biz.model.ReturnT; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 瀹氭椂鍣ㄤ换鍔� - * - * @author Chopper - * @version v1.0 - * 2020-12-24 11:51 - */ -@Slf4j -@Component -public class TimedTaskJobHandler { - - @Autowired(required = false) - private List<EveryMinuteExecute> everyMinuteExecutes; - - - @Autowired(required = false) - private List<EveryHourExecute> everyHourExecutes; - - - @Autowired(required = false) - private List<EveryDayExecute> everyDayExecutes; - - /** - * 姣忓垎閽熶换鍔� - * - * @throws Exception - */ - @XxlJob("everyMinuteExecute") - public ReturnT<String> everyMinuteExecute(String param) { - log.info("姣忓垎閽熶换鍔℃墽琛�"); - if (everyMinuteExecutes == null || everyMinuteExecutes.size() == 0) { - return ReturnT.SUCCESS; - } - - for (int i = 0; i < everyMinuteExecutes.size(); i++) { - try { - everyMinuteExecutes.get(i).execute(); - } catch (Exception e) { - log.error("姣忓垎閽熶换鍔″紓甯�", e); - } - } - return ReturnT.SUCCESS; - } - - /** - * 姣忓皬鏃朵换鍔� - * - * @throws Exception - */ - @XxlJob("everyHourExecuteJobHandler") - public ReturnT<String> everyHourExecuteJobHandler(String param) { - log.info("姣忓皬鏃朵换鍔℃墽琛�"); - if (everyHourExecutes == null || everyHourExecutes.size() == 0) { - return ReturnT.SUCCESS; - } - - for (int i = 0; i < everyHourExecutes.size(); i++) { - try { - everyHourExecutes.get(i).execute(); - } catch (Exception e) { - log.error("姣忓皬鏃朵换鍔″紓甯�", e); - } - } - return ReturnT.SUCCESS; - } - - /** - * 姣忔棩浠诲姟 - * - * @throws Exception - */ - @XxlJob("everyDayExecuteJobHandler") - public ReturnT<String> everyDayExecuteJobHandler(String param) { - - log.info("姣忔棩浠诲姟鎵ц"); - if (everyDayExecutes == null || everyDayExecutes.size() == 0) { - return ReturnT.SUCCESS; - } - - for (int i = 0; i < everyDayExecutes.size(); i++) { - try { - everyDayExecutes.get(i).execute(); - } catch (Exception e) { - log.error("姣忔棩浠诲姟寮傚父", e); - } - } - return ReturnT.SUCCESS; - } - - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/EveryDayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/EveryDayExecute.java deleted file mode 100644 index e5fc9a5..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/EveryDayExecute.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.lili.timetask.handler; - -/** - * 姣忔棩浠诲姟 - * 姣忔棩鍑屾櫒1鐐规墽琛� - * - * @author Chopper - * @since 2020/12/24 11:52 - */ -public interface EveryDayExecute { - - /** - * 鎵ц姣忔棩浠诲姟 - */ - void execute(); - - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/EveryHourExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/EveryHourExecute.java deleted file mode 100644 index 4604220..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/EveryHourExecute.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.lili.timetask.handler; - -/** - * 姣忓皬鏃朵换鍔� - * - * @author Chopper - * @since 2020/12/24 11:52 - */ -public interface EveryHourExecute { - - /** - * 鎵ц - */ - void execute(); - - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/EveryMinuteExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/EveryMinuteExecute.java deleted file mode 100644 index e1960e2..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/EveryMinuteExecute.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.lili.timetask.handler; - -/** - * 姣忓垎閽熶换鍔� - * - * @author Chopper - * @since 2020/12/24 11:52 - */ -public interface EveryMinuteExecute { - - /** - * 鎵ц - */ - void execute(); - - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java deleted file mode 100644 index 6be091e..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.lili.timetask.handler.impl.broadcast; - -import cn.lili.modules.goods.service.CommodityService; -import cn.lili.timetask.handler.EveryHourExecute; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 灏忕▼搴忕洿鎾姸鎬佽幏鍙� - * - * @author Bulbasaur - * @since 2021/5/20 2:52 涓嬪崍 - */ -@Component -public class BroadcastExecute implements EveryHourExecute { - - @Autowired - private CommodityService commodityService; - - @Override - public void execute() { - //鍚屾鐩存挱鍟嗗搧鐘舵�� - commodityService.getGoodsWareHouse(); - } -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java deleted file mode 100644 index acb0503..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.lili.timetask.handler.impl.coupon; - -import cn.lili.modules.promotion.entity.dos.MemberCoupon; -import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; -import cn.lili.modules.promotion.service.MemberCouponService; -import cn.lili.timetask.handler.EveryDayExecute; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.Calendar; -import java.util.Date; - -/** - * 浼樻儬鍒哥姸鎬佺洃娴� - * - * @author Bulbasaur - * @since 2021/5/24 10:08 涓婂崍 - */ -@Component -public class CouponExecute implements EveryDayExecute { - - /** - * 杩囨湡甯搁噺锛岃繃鏈熷悗鎴栬�呬娇鐢ㄥ悗涓�瀹氭椂闂村唴锛屽垹闄ゆ棤鏁堢殑浼樻儬鍒革紝鐗╃悊鍒犻櫎 - */ - static final int EXPIRATION_DAY = 3; - - @Autowired - private MemberCouponService memberCouponService; - - /** - * 妫�娴嬩紭鎯犲埜鐨勪娇鐢ㄦ椂闂达紝瓒呮湡鏈娇鐢ㄥ垯澶辨晥 - * 姝ゆ柟娉曠敤浜庨鍙�*澶╁悗澶辨晥浼樻儬鍒镐娇鐢� - */ - @Override - public void execute() { - //灏嗚繃鏈熶紭鎯犲埜鍙樻洿涓鸿繃鏈熺姸鎬� - LambdaUpdateWrapper<MemberCoupon> updateWrapper = new LambdaUpdateWrapper<MemberCoupon>() - .eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()) - .le(MemberCoupon::getEndTime, new Date()) - .set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); - this.memberCouponService.update(updateWrapper); - - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - EXPIRATION_DAY); - Date removeTime = calendar.getTime(); - //鍒犻櫎杩囨湡/宸蹭娇鐢ㄧ殑浼樻儬鍒� - LambdaUpdateWrapper<MemberCoupon> deleteWrapper = new LambdaUpdateWrapper<MemberCoupon>() - //濡傛灉缁撴潫鏃堕棿灏忎簬 褰撳墠鏃堕棿澧炲姞鎸囧畾鍒犻櫎鏃ユ湡锛屽垯鍒犻櫎 - .le(MemberCoupon::getEndTime, removeTime); - this.memberCouponService.remove(deleteWrapper); - - - } - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java deleted file mode 100644 index 2956c45..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.lili.timetask.handler.impl.goods; - -import cn.hutool.core.convert.Convert; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.lili.modules.goods.service.GoodsService; -import cn.lili.modules.member.service.MemberEvaluationService; -import cn.lili.timetask.handler.EveryDayExecute; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -/** - * 鍟嗗搧瀹氭椂鍣� - * - * @author Chopper - * @since 2021/3/18 3:23 涓嬪崍 - */ -@Component -public class GoodsExecute implements EveryDayExecute { - /** - * 浼氬憳璇勪环 - */ - @Autowired - private MemberEvaluationService memberEvaluationService; - /** - * 鍟嗗搧 - */ - @Autowired - private GoodsService goodsService; - - /** - * 鏌ヨ宸蹭笂鏋剁殑鍟嗗搧鐨勮瘎浠锋暟閲忓苟璧嬪�� - */ - @Override - public void execute() { - - //鏌ヨ涓婃缁熻鍒版湰娆$殑璇勪环鏁伴噺 - List<Map<String, Object>> list = memberEvaluationService.memberEvaluationNum(DateUtil.yesterday(), new DateTime()); - - for (Map<String, Object> map : list) { - goodsService.addGoodsCommentNum(Convert.toInt(map.get("num").toString()), map.get("goods_id").toString()); - } - - } -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java deleted file mode 100644 index ecf63d5..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.lili.timetask.handler.impl.hotwords; - -import cn.hutool.json.JSONUtil; -import cn.lili.cache.Cache; -import cn.lili.cache.CachePrefix; -import cn.lili.common.utils.StringUtils; -import cn.lili.modules.search.entity.dos.HotWordsHistory; -import cn.lili.modules.search.service.HotWordsHistoryService; -import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.dto.HotWordsSetting; -import cn.lili.modules.system.entity.dto.HotWordsSettingItem; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import cn.lili.timetask.handler.EveryDayExecute; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.DefaultTypedTuple; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -import java.util.*; - -/** - * @author paulG - * @since 2021/3/11 - **/ -@Slf4j -@Component -public class HotWordsEveryDayTaskExecute implements EveryDayExecute { - - @Autowired - private Cache cache; - - @Autowired - private HotWordsHistoryService hotWordsHistoryService; - @Autowired - private SettingService settingService; - - /** - * 鎵ц姣忔棩浠诲姟 - */ - @Override - public void execute() { - //鑾峰彇澶т簬0鍒嗙殑鐑瘝 - Set<DefaultTypedTuple> tuples = cache.zRangeByScore(CachePrefix.HOT_WORD.getPrefix(), 1, Integer.MAX_VALUE); - //濡傛灉浠诲姟涓嶄负绌� - if (!CollectionUtils.isEmpty(tuples)) { - - //鍥犱负鏄浜屽ぉ缁熻绗竴澶╃殑鏁版嵁锛屾墍浠ヨ繖閲岃幏鍙栨槰澶╁噷鏅ㄧ殑鏃堕棿 - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 1); - - //鎵归噺淇濆瓨鐑瘝 - List<HotWordsHistory> hotWordsHistories = new ArrayList<>(); - for (DefaultTypedTuple tuple : tuples) { - String keywords = (String) tuple.getValue(); - Double score = tuple.getScore(); - hotWordsHistories.add(new HotWordsHistory(keywords, score.intValue(), calendar.getTime())); - } - - hotWordsHistoryService.saveBatch(hotWordsHistories); - } - //绉婚櫎鏄ㄦ棩鐨勭儹鎼滆瘝 - cache.remove(CachePrefix.HOT_WORD.getPrefix()); - - //璁剧疆浠婃棩榛樿鐑瘝 - Setting setting = settingService.get(SettingEnum.HOT_WORDS.name()); - if (setting == null) { - return; - } - HotWordsSetting hotWordsSetting = JSONUtil.toBean(setting.getSettingValue(), HotWordsSetting.class); - List<HotWordsSettingItem> hotWordsSettingItems = hotWordsSetting.getHotWordsSettingItems(); - if (hotWordsSettingItems != null && !hotWordsSettingItems.isEmpty()) { - for (HotWordsSettingItem hotWordsSettingItem : hotWordsSettingItems) { - cache.zAdd(CachePrefix.HOT_WORD.getPrefix(), hotWordsSettingItem.getScore(), hotWordsSettingItem.getKeywords()); - } - } - } - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java deleted file mode 100644 index 93b14e4..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.lili.timetask.handler.impl.order; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.json.JSONUtil; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.dto.OrderSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import cn.lili.timetask.handler.EveryMinuteExecute; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 璁㈠崟鑷姩鍙栨秷锛堟瘡鍒嗛挓鎵ц锛� - * - * @author paulG - * @since 2021/3/11 - **/ -@Slf4j -@Component -public class CancelOrderTaskExecute implements EveryMinuteExecute { - /** - * 璁㈠崟 - */ - @Autowired - private OrderService orderService; - /** - * 璁剧疆 - */ - @Autowired - private SettingService settingService; - - - @Override - public void execute() { - Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name()); - OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class); - if (orderSetting != null && orderSetting.getAutoCancel() != null) { - //璁㈠崟鑷姩鍙栨秷鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鍙栨秷鏃堕棿鍒嗛挓鏁� - DateTime cancelTime = DateUtil.offsetMinute(DateUtil.date(), -orderSetting.getAutoCancel()); - LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.UNPAID.name()); - //璁㈠崟鍒涘缓鏃堕棿 <= 璁㈠崟鑷姩鍙栨秷鏃堕棿 - queryWrapper.le(Order::getCreateTime, cancelTime); - List<Order> list = orderService.list(queryWrapper); - List<String> cancelSnList = list.stream().map(Order::getSn).collect(Collectors.toList()); - for (String sn : cancelSnList) { - orderService.systemCancel(sn, "瓒呮椂鏈敮浠樿嚜鍔ㄥ彇娑�",false); - } - } - } -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java deleted file mode 100644 index b7edf22..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java +++ /dev/null @@ -1,286 +0,0 @@ -package cn.lili.timetask.handler.impl.order; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.json.JSONUtil; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.exception.ServiceException; -import cn.lili.modules.distribution.service.DistributionOrderService; -import cn.lili.modules.member.entity.dto.MemberEvaluationDTO; -import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; -import cn.lili.modules.member.service.MemberEvaluationService; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.entity.dos.OrderItem; -import cn.lili.modules.order.order.entity.dto.OrderItemOperationDTO; -import cn.lili.modules.order.order.entity.enums.CommentStatusEnum; -import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum; -import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum; -import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.order.order.service.OrderItemService; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.order.order.service.StoreFlowService; -import cn.lili.modules.store.entity.dto.StoreSettlementDay; -import cn.lili.modules.store.service.BillService; -import cn.lili.modules.store.service.StoreDetailService; -import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.dto.OrderSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import cn.lili.timetask.handler.EveryDayExecute; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import java.util.List; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.messaging.handler.annotation.SendTo; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -/** - * @author paulG - * @since 2021/3/11 - **/ -@Slf4j -@Component - -public class OrderEveryDayTaskExecute implements EveryDayExecute { - - /** - * 璁㈠崟 - */ - @Autowired - private OrderService orderService; - /** - * 璁㈠崟璐х墿 - */ - @Autowired - private OrderItemService orderItemService; - /** - * 璁剧疆 - */ - @Autowired - private SettingService settingService; - /** - * 浼氬憳璇勪环 - */ - @Autowired - private MemberEvaluationService memberEvaluationService; - - @Autowired - private DistributionOrderService distributionOrderService; - - @Autowired - private StoreFlowService storeFlowService; - - /** - * 缁撶畻鍗� - */ - @Autowired - private BillService billService; - /** - * 搴楅摵璇︽儏 - */ - @Autowired - private StoreDetailService storeDetailService; - - /** - * 鎵ц姣忔棩浠诲姟 - */ - @Override - public void execute() { - - Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name()); - //璁㈠崟璁剧疆 - OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class); - if (orderSetting == null) { - throw new ServiceException(ResultCode.ORDER_SETTING_ERROR); - } - - try { - //鑷姩纭鏀惰揣 - completedOrder(orderSetting); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - try { - //鑷姩濂借瘎 - memberEvaluation(orderSetting); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - try { - //鍏抽棴鍏佽鍞悗鐢宠 - this.closeAfterSale(orderSetting); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - try { - //鍏抽棴鍏佽鎶曡瘔 - closeComplaint(orderSetting); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - - //淇敼鍒嗚处鐘舵�� - try { - storeFlowService.updateProfitSharingStatus(); - } catch (Exception e) { - log.error("淇敼鍒嗚处鐘舵�佸け璐�", e); - } - - //鐢熸垚搴楅摵缁撶畻鍗� - try { - createBill(); - } catch (Exception e) { - log.error("鐢熸垚搴楅摵缁撶畻鍗�", e); - } - - - } - - /** - * 鑷姩纭鏀惰幏锛岃鍗曞畬鎴� - * - * @param orderSetting 璁㈠崟璁剧疆 - */ - private void completedOrder(OrderSetting orderSetting) { - - //璁㈠崟鑷姩鏀惰揣鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鏀惰揣鏃堕棿澶╂暟 - DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoReceive()); - LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.DELIVERED.name()); - - //璁㈠崟鍙戣揣鏃堕棿 >= 璁㈠崟鑷姩鏀惰揣鏃堕棿 - queryWrapper.le(Order::getLogisticsTime, receiveTime); - List<Order> list = orderService.list(queryWrapper); - - try { - //鍒ゆ柇鏄惁鏈夌鍚堟潯浠剁殑璁㈠崟锛岃繘琛岃鍗曞畬鎴愬鐞� - if (!list.isEmpty()) { - List<String> receiveSnList = list.stream().map(Order::getSn).collect(Collectors.toList()); - for (String orderSn : receiveSnList) { - orderService.systemComplete(orderSn); - } - } - } catch (Exception e) { - log.error(e.getMessage(), e); - } - } - - /** - * 鑷姩濂借瘎 - * - * @param orderSetting 璁㈠崟璁剧疆 - */ - private void memberEvaluation(OrderSetting orderSetting) { - //璁㈠崟鑷姩鏀惰揣鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鏀惰揣鏃堕棿澶╂暟 - DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoEvaluation()); - - //璁㈠崟瀹屾垚鏃堕棿 <= 璁㈠崟鑷姩濂借瘎鏃堕棿 - OrderItemOperationDTO orderItemOperationDTO = - OrderItemOperationDTO.builder().receiveTime(receiveTime).commentStatus(CommentStatusEnum.UNFINISHED.name()) - .build(); - List<OrderItem> orderItems = orderItemService.waitOperationOrderItem(orderItemOperationDTO); - - //鍒ゆ柇鏄惁鏈夌鍚堟潯浠剁殑璁㈠崟锛岃繘琛岃嚜鍔ㄨ瘎浠峰鐞� - if (!orderItems.isEmpty()) { - for (OrderItem orderItem : orderItems) { - MemberEvaluationDTO memberEvaluationDTO = new MemberEvaluationDTO(); - memberEvaluationDTO.setOrderItemSn(orderItem.getSn()); - memberEvaluationDTO.setContent("绯荤粺榛樿濂借瘎"); - memberEvaluationDTO.setGoodsId(orderItem.getGoodsId()); - memberEvaluationDTO.setSkuId(orderItem.getSkuId()); - memberEvaluationDTO.setGrade(EvaluationGradeEnum.GOOD.name()); - memberEvaluationDTO.setDeliveryScore(5); - memberEvaluationDTO.setDescriptionScore(5); - memberEvaluationDTO.setServiceScore(5); - - try { - memberEvaluationService.addMemberEvaluation(memberEvaluationDTO, false); - - } catch (Exception e) { - log.error(e.getMessage(), e); - } - } - } - } - - /** - * 鍏抽棴鍏佽鍞悗鐢宠 - * - * @param orderSetting 璁㈠崟璁剧疆 - */ - @Transactional(rollbackFor = Exception.class) - public void closeAfterSale(OrderSetting orderSetting) { - //璁㈠崟鍏抽棴鍞悗鐢宠鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鍏抽棴鍞悗鐢宠澶╂暟 - DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getCloseAfterSale()); - -// OrderItemOperationDTO build = OrderItemOperationDTO.builder().receiveTime(receiveTime) -// .afterSaleStatus(OrderItemAfterSaleStatusEnum.NOT_APPLIED.name()).build(); -// List<OrderItem> orderItems = orderItemService.waitOperationOrderItem(build); - //鍏抽棴鍞悗璁㈠崟=鏈敭鍚庤鍗�+灏忎簬璁㈠崟鍏抽棴鍞悗鐢宠鏃堕棿 - orderItemService.expiredAfterSaleStatus(receiveTime); - - } - - /** - * 鍏抽棴鍏佽浜ゆ槗鎶曡瘔 - * - * @param orderSetting 璁㈠崟璁剧疆 - */ - private void closeComplaint(OrderSetting orderSetting) { - - //涓�0鍒欎笉闄愬埗 - if (orderSetting.getCloseComplaint() == null || orderSetting.getCloseComplaint() == 0) { - return; - } - //璁㈠崟鍏抽棴浜ゆ槗鎶曡瘔鐢宠鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鍏抽棴浜ゆ槗鎶曡瘔鐢宠澶╂暟 - DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getCloseComplaint()); - - //鍏抽棴鍞悗璁㈠崟=鏈敭鍚庤鍗�+灏忎簬璁㈠崟鍏抽棴鍞悗鐢宠鏃堕棿 - OrderItemOperationDTO build = OrderItemOperationDTO.builder().receiveTime(receiveTime) - .complainStatus(OrderComplaintStatusEnum.NO_APPLY.name()).build(); - List<OrderItem> orderItems = orderItemService.waitOperationOrderItem(build); - - //鍒ゆ柇鏄惁鏈夌鍚堟潯浠剁殑璁㈠崟锛屽叧闂厑璁稿敭鍚庣敵璇峰鐞� - if (!orderItems.isEmpty()) { - - //鑾峰彇璁㈠崟璐х墿ID - List<String> orderItemIdList = orderItems.stream().map(OrderItem::getId).collect(Collectors.toList()); - - //淇敼璁㈠崟鎶曡瘔鐘舵�� - LambdaUpdateWrapper<OrderItem> lambdaUpdateWrapper = - new LambdaUpdateWrapper<OrderItem>().set(OrderItem::getComplainStatus, - OrderItemAfterSaleStatusEnum.EXPIRED.name()).in(OrderItem::getId, orderItemIdList); - orderItemService.update(lambdaUpdateWrapper); - } - - } - - /** - * 1.鏌ヨ浠婃棩寰呯粨绠楃殑鍟嗗 - * 2.鏌ヨ鍟嗗涓婃缁撶畻鏃ユ湡锛岀敓鎴愭湰娆$粨绠楀崟 - * 3.璁板綍鍟嗗缁撶畻鏃� - */ - private void createBill() { - //鑾峰彇褰撳墠澶╂暟 - int day = DateUtil.date().dayOfMonth(); - - //鑾峰彇寰呯粨绠楀晢瀹跺垪琛� - List<StoreSettlementDay> storeList = storeDetailService.getSettlementStore(day); - - //鑾峰彇褰撳墠鏃堕棿 - DateTime endTime = DateUtil.date(); - //鎵归噺鍟嗗缁撶畻 - for (StoreSettlementDay storeSettlementDay : storeList) { - - //鐢熸垚缁撶畻鍗� - billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(), endTime); - - //淇敼搴楅摵缁撶畻鏃堕棿 - storeDetailService.updateSettlementDay(storeSettlementDay.getStoreId(), endTime); - } - } - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/RechargeOrderTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/RechargeOrderTaskExecute.java deleted file mode 100644 index e0ca23a..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/RechargeOrderTaskExecute.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.lili.timetask.handler.impl.order; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.json.JSONUtil; -import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.dto.OrderSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import cn.lili.modules.wallet.entity.dos.Recharge; -import cn.lili.modules.wallet.service.RechargeService; -import cn.lili.timetask.handler.EveryMinuteExecute; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 鍏呭�艰鍗曡嚜鍔ㄥ彇娑堬紙姣忓垎閽熸墽琛岋級 - * - * @author zhuhai - * @since 2021/3/11 - **/ -@Slf4j -@Component -public class RechargeOrderTaskExecute implements EveryMinuteExecute { - /** - * 鍏呭�� - */ - @Autowired - private RechargeService rechargeService; - /** - * 璁剧疆 - */ - @Autowired - private SettingService settingService; - - - @Override - public void execute() { - Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name()); - OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class); - if (orderSetting != null && orderSetting.getAutoCancel() != null) { - //鍏呭�艰鍗曡嚜鍔ㄥ彇娑堟椂闂� = 褰撳墠鏃堕棿 - 鑷姩鍙栨秷鏃堕棿鍒嗛挓鏁� - DateTime cancelTime = DateUtil.offsetMinute(DateUtil.date(), -orderSetting.getAutoCancel()); - LambdaQueryWrapper<Recharge> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Recharge::getPayStatus, PayStatusEnum.UNPAID.name()); - //鍏呭�艰鍗曞垱寤烘椂闂� <= 璁㈠崟鑷姩鍙栨秷鏃堕棿 - queryWrapper.le(Recharge::getCreateTime, cancelTime); - List<Recharge> list = rechargeService.list(queryWrapper); - List<String> cancelSnList = list.stream().map(Recharge::getRechargeSn).collect(Collectors.toList()); - for (String sn : cancelSnList) { - rechargeService.rechargeOrderCancel(sn); - } - } - } -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/MemberCouponSignEverydayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/MemberCouponSignEverydayExecute.java deleted file mode 100644 index 13a5e7a..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/MemberCouponSignEverydayExecute.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.lili.timetask.handler.impl.promotion; - -import cn.lili.common.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.dos.Seckill; -import cn.lili.modules.promotion.service.MemberCouponSignService; -import cn.lili.modules.promotion.service.SeckillService; -import cn.lili.modules.promotion.tools.PromotionTools; -import cn.lili.modules.search.service.EsGoodsIndexService; -import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.dto.SeckillSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import cn.lili.timetask.handler.EveryDayExecute; -import com.google.gson.Gson; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 淇冮攢娲诲姩姣忔棩瀹氭椂鍣� - * - * @author Chopper - * @since 2021/3/18 3:23 涓嬪崍 - */ -@Slf4j -@Component -public class MemberCouponSignEverydayExecute implements EveryDayExecute { - - @Autowired - private MemberCouponSignService memberCouponSignService; - - /** - * 灏嗗凡杩囨湡鐨勪績閿�娲诲姩缃负缁撴潫 - */ - @Override - public void execute() { - try { - memberCouponSignService.clean(); - } catch (Exception e) { - log.error("娓呴櫎棰嗗彇浼樻儬鍒告爣璁板紓甯�", e); - } - - } - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java deleted file mode 100644 index a9fa7fc..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java +++ /dev/null @@ -1,85 +0,0 @@ -package cn.lili.timetask.handler.impl.promotion; - -import cn.lili.common.enums.PromotionTypeEnum; -import cn.lili.modules.promotion.entity.dos.Seckill; -import cn.lili.modules.promotion.service.SeckillService; -import cn.lili.modules.promotion.tools.PromotionTools; -import cn.lili.modules.search.service.EsGoodsIndexService; -import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.dto.SeckillSetting; -import cn.lili.modules.system.entity.enums.SettingEnum; -import cn.lili.modules.system.service.SettingService; -import cn.lili.timetask.handler.EveryDayExecute; -import com.google.gson.Gson; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 淇冮攢娲诲姩姣忔棩瀹氭椂鍣� - * - * @author Chopper - * @since 2021/3/18 3:23 涓嬪崍 - */ -@Slf4j -@Component -public class PromotionEverydayExecute implements EveryDayExecute { - - /** - * ES鍟嗗搧绱㈠紩 - */ - @Autowired - private EsGoodsIndexService esGoodsIndexService; - /** - * 绯荤粺璁剧疆 - */ - @Autowired - private SettingService settingService; - /** - * 绉掓潃娲诲姩 - */ - @Autowired - private SeckillService seckillService; - - /** - * 灏嗗凡杩囨湡鐨勪績閿�娲诲姩缃负缁撴潫 - */ - @Override - public void execute() { - try { - //娓呴櫎鎵�鏈夊晢鍝佺储寮曠殑鏃犳晥淇冮攢娲诲姩 - this.esGoodsIndexService.cleanInvalidPromotion(); - } catch (Exception e) { - log.error("娓呮鍟嗗搧绱㈠紩涓棤鏁堜績閿�寮傚父", e); - } - try { - //瀹氭椂鍒涘缓娲诲姩 - addSeckill(); - } catch (Exception e) { - log.error("绉掓潃娲诲姩娣诲姞寮傚父", e); - } - - } - - /** - * 娣诲姞绉掓潃娲诲姩 - * 浠庣郴缁熻缃腑鑾峰彇绉掓潃娲诲姩鐨勯厤缃� - * 娣诲姞鏄庡ぉ鍚庣殑绉掓潃娲诲姩 - */ - private void addSeckill() { - Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); - SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); - log.info("鐢熸垚绉掓潃娲诲姩璁剧疆锛歿}", seckillSetting); - for (int i = 1; i <= SeckillService.PRE_CREATION; i++) { - Seckill seckill = new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule()); - seckill.setApplyEndTime(null); - - //濡傛灉宸茬粡瀛樺湪淇冮攢锛屽垯涓嶅啀娆′繚瀛� - if (seckillService.list( - PromotionTools.checkActiveTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL, null, seckill.getId())).isEmpty()) { - boolean result = seckillService.savePromotions(seckill); - log.info("鐢熸垚绉掓潃娲诲姩鍙傛暟锛歿},缁撴灉锛歿}", seckill, result); - } - } - } -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/MemberStatisticsExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/MemberStatisticsExecute.java deleted file mode 100644 index b349250..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/MemberStatisticsExecute.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.lili.timetask.handler.impl.statistics; - -import cn.lili.modules.statistics.entity.dos.MemberStatisticsData; -import cn.lili.modules.statistics.service.MemberStatisticsService; -import cn.lili.timetask.handler.EveryDayExecute; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.Calendar; -import java.util.Date; - -/** - * 浼氬憳鏁版嵁缁熻 - * - * @author Chopper - * @since 2021-03-02 14:56 - */ -@Slf4j -@Component -public class MemberStatisticsExecute implements EveryDayExecute { - - /** - * 浼氬憳缁熻 - */ - @Autowired - private MemberStatisticsService memberStatisticsService; - - @Override - public void execute() { - - try { - //缁熻鐨勬椂闂达紙寮�濮嬨�傜粨鏉熸椂闂达級 - Date startTime, endTime; - //鍒濆鍊� - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 1); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.HOUR_OF_DAY, 0); - endTime = calendar.getTime(); - //-1澶╋紝鍗充负寮�濮嬫椂闂� - calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - 1); - startTime = calendar.getTime(); - MemberStatisticsData memberStatisticsData = new MemberStatisticsData(); - memberStatisticsData.setMemberCount(memberStatisticsService.memberCount(endTime)); - memberStatisticsData.setCreateDate(startTime); - memberStatisticsData.setActiveQuantity(memberStatisticsService.activeQuantity(startTime)); - memberStatisticsData.setNewlyAdded(memberStatisticsService.newlyAdded(startTime, endTime)); - memberStatisticsService.save(memberStatisticsData); - } catch (Exception e) { - log.error("姣忔棩浼氬憳缁熻鍔熻兘寮傚父锛�", e); - } - } -} \ No newline at end of file diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/OnlineMemberStatistics.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/OnlineMemberStatistics.java deleted file mode 100644 index 19f90bb..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/statistics/OnlineMemberStatistics.java +++ /dev/null @@ -1,114 +0,0 @@ -package cn.lili.timetask.handler.impl.statistics; - -import cn.lili.cache.Cache; -import cn.lili.cache.CachePrefix; -import cn.lili.common.security.enums.UserEnums; -import cn.lili.common.properties.StatisticsProperties; -import cn.lili.modules.statistics.entity.vo.OnlineMemberVO; -import cn.lili.timetask.handler.EveryHourExecute; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; - -/** - * 瀹炴椂鍦ㄧ嚎浜烘暟缁熻 - * - * @author Chopper - * @since 2021-02-21 09:47 - */ -@Component -public class OnlineMemberStatistics implements EveryHourExecute { - - /** - * 缂撳瓨 - */ - @Autowired - private Cache<List<OnlineMemberVO>> cache; - /** - * 缁熻灏忔椂 - */ - @Autowired - private StatisticsProperties statisticsProperties; - - - @Override - public void execute() { - - Calendar calendar = Calendar.getInstance(); - - List<OnlineMemberVO> onlineMemberVOS = cache.get(CachePrefix.ONLINE_MEMBER.getPrefix()); - - if (onlineMemberVOS == null) { - onlineMemberVOS = new ArrayList<>(); - } - - //杩囨护 鏈夋晥缁熻鏃堕棿 - calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - statisticsProperties.getOnlineMember()); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - - Calendar finalCalendar = calendar; - - AtomicReference<Integer> lastNum = new AtomicReference<>(0); - onlineMemberVOS = onlineMemberVOS.stream() - .filter(onlineMemberVO -> { - //濡傛灉涓鸿繃婊ゅ弬鏁帮紝鍒欒褰曚负杩囨湡鍙傛暟锛屽垯涓虹粺涓�鏃舵涓婁竴鍛ㄦ湡鐨勫湪绾夸汉鏁� - if (!onlineMemberVO.getDate().after(finalCalendar.getTime())) { - lastNum.set(onlineMemberVO.getNum()); - } - return onlineMemberVO.getDate().after(finalCalendar.getTime()); - }) - .collect(Collectors.toList()); - - //璁″叆鏂版暟鎹� - calendar = Calendar.getInstance(); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - onlineMemberVOS.add(new OnlineMemberVO(calendar.getTime(), cache.keys(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + "*").size(), - lastNum.get())); - - //鍐欏叆缂撳瓨 - cache.put(CachePrefix.ONLINE_MEMBER.getPrefix(), onlineMemberVOS); - } - - - /** - * 鎵嬪姩璁剧疆鏌愪竴鏃堕棿锛屾椿璺冧汉鏁� - * - * @param time 鏃堕棿 - * @param num 浜烘暟 - */ - public void execute(Date time, Integer num) { - - List<OnlineMemberVO> onlineMemberVOS = cache.get(CachePrefix.ONLINE_MEMBER.getPrefix()); - - if (onlineMemberVOS == null) { - onlineMemberVOS = new ArrayList<>(); - } - - Calendar calendar = Calendar.getInstance(); - calendar.setTime(time); - //杩囨护 鏈夋晥缁熻鏃堕棿 - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 48); - - onlineMemberVOS = onlineMemberVOS.stream() - .filter(onlineMemberVO -> onlineMemberVO.getDate().after(calendar.getTime())) - .collect(Collectors.toList()); - onlineMemberVOS.add(new OnlineMemberVO(time, num, num)); - - //鍐欏叆缂撳瓨 - cache.put(CachePrefix.ONLINE_MEMBER.getPrefix(), onlineMemberVOS); - } - -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreExecute.java deleted file mode 100644 index 283a155..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreExecute.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.lili.timetask.handler.impl.store; - -import cn.lili.modules.goods.service.GoodsSkuService; -import cn.lili.modules.store.entity.dos.Store; -import cn.lili.modules.store.entity.enums.StoreStatusEnum; -import cn.lili.modules.store.service.StoreService; -import cn.lili.timetask.handler.EveryDayExecute; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 搴楅摵淇℃伅鏇存柊 - * - * @author Chopper - * @since 2021/3/15 5:30 涓嬪崍 - */ -@Component -@Slf4j -public class StoreExecute implements EveryDayExecute { - /** - * 搴楅摵 - */ - @Autowired - private StoreService storeService; - - @Autowired - private GoodsSkuService goodsSkuService; - - @Override - public void execute() { - //鑾峰彇鎵�鏈夊紑鍚殑搴楅摵 - List<Store> storeList = storeService.list(new LambdaQueryWrapper<Store>().eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name())); - - for (Store store : storeList) { - try { - Long num = goodsSkuService.countSkuNum(store.getId()); - storeService.updateStoreGoodsNum(store.getId(), num); - } catch (Exception e) { - log.error("搴楅摵id涓簕},鏇存柊鍟嗗搧鏁伴噺澶辫触", store.getId(), e); - } - } - - - } -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreRatingExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreRatingExecute.java deleted file mode 100644 index fe07139..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/store/StoreRatingExecute.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.lili.timetask.handler.impl.store; - -import cn.lili.common.enums.SwitchEnum; -import cn.lili.modules.member.entity.vo.StoreRatingVO; -import cn.lili.modules.member.service.MemberEvaluationService; -import cn.lili.modules.store.entity.dos.Store; -import cn.lili.modules.store.entity.enums.StoreStatusEnum; -import cn.lili.modules.store.service.StoreService; -import cn.lili.timetask.handler.EveryDayExecute; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 搴楅摵璇勫垎 - * - * @author Chopper - * @since 2021/3/15 5:30 涓嬪崍 - */ -@Component -public class StoreRatingExecute implements EveryDayExecute { - /** - * 搴楅摵 - */ - @Autowired - private StoreService storeService; - /** - * 浼氬憳璇勪环 - */ - @Autowired - private MemberEvaluationService memberEvaluationService; - - - @Override - public void execute() { - //鑾峰彇鎵�鏈夊紑鍚殑搴楅摵 - List<Store> storeList = storeService.list(new LambdaQueryWrapper<Store>().eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name())); - for (Store store : storeList) { - //搴楅摵鎵�鏈夊紑鍚殑璇勪环 - StoreRatingVO storeRatingVO = memberEvaluationService.getStoreRatingVO(store.getId(), SwitchEnum.OPEN.name()); - - if (storeRatingVO != null) { - //淇濆瓨璇勫垎 - LambdaUpdateWrapper<Store> lambdaUpdateWrapper = Wrappers.lambdaUpdate(); - lambdaUpdateWrapper.eq(Store::getId, store.getId()); - lambdaUpdateWrapper.set(Store::getDescriptionScore, storeRatingVO.getDescriptionScore()); - lambdaUpdateWrapper.set(Store::getDeliveryScore, storeRatingVO.getDeliveryScore()); - lambdaUpdateWrapper.set(Store::getServiceScore, storeRatingVO.getServiceScore()); - storeService.update(lambdaUpdateWrapper); - } - - } - - - } -} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java deleted file mode 100644 index 0783517..0000000 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java +++ /dev/null @@ -1,195 +0,0 @@ -package cn.lili.timetask.handler.impl.view; - -import cn.hutool.core.convert.Convert; -import cn.lili.cache.Cache; -import cn.lili.cache.CachePrefix; -import cn.lili.common.utils.BeanUtil; -import cn.lili.modules.statistics.entity.dos.PlatformViewData; -import cn.lili.modules.statistics.service.PlatformViewService; -import cn.lili.timetask.handler.EveryDayExecute; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.List; - -/** - * 缁熻 鍏ュ簱 - * - * @author Chopper - * @since 2021-01-15 18:20 - */ -@Slf4j -@Component -public class PageViewStatisticsExecute implements EveryDayExecute { - /** - * 缂撳瓨 - */ - @Autowired - private Cache cache; - /** - * 骞冲彴PV缁熻 - */ - @Autowired - private PlatformViewService platformViewService; - - @Override - public void execute() { - - //1銆佺紦瀛榢eys 妯$硦鍖归厤 - //2銆佽繃婊や粖鏃ョ殑鏁版嵁锛屽嵆浠婂ぉ鍙兘缁熻浠婃棩浠ュ墠鐨勬暟鎹� - //4瀵筴ey value 鍒嗗埆浠h〃骞冲彴PV銆佸钩鍙癠V銆佸簵閾篜V銆佸簵閾篣V - List<String> pvKeys = filterKeys(cache.keys(CachePrefix.PV.getPrefix() + "*")); - List<Integer> pvValues = cache.multiGet(pvKeys); - - List<String> storePVKeys = filterKeys(cache.keys(CachePrefix.STORE_PV.getPrefix() + "*")); - List<Integer> storePvValues = cache.multiGet(storePVKeys); - - //澶囦唤UV鏁版嵁锛岃繖閲岃祴鍊间箣鍚庯紝浼氳鍒犻櫎 - List<String> uvKeys = new ArrayList<>(); - List<String> storeUvKeys = new ArrayList<>(); - - log.debug("寮�濮嬬粺璁″钩鍙版暟鎹紝PV鍏辫銆恵}銆戞潯", pvKeys.size()); - log.debug("寮�濮嬬粺璁″簵閾烘暟鎹紝PV鍏辫銆恵}銆戞潯", storePvValues.size()); - - //瀹氫箟瑕佺粺璁$殑鏁版嵁 - List<PlatformViewData> platformViewDataList = new ArrayList<>(); - - //PV 缁熻 - if (pvKeys.size() > 0) { - for (int i = 0; i < pvKeys.size(); i++) { - String key = pvKeys.get(i); - PageViewStatistics pageViewStatistics = new PageViewStatistics(key); - PlatformViewData platformPVData = new PlatformViewData(); - BeanUtil.copyProperties(pageViewStatistics, platformPVData); - platformPVData.setPvNum(pvValues.get(i).longValue()); - //鏍规嵁pvkey 鑾峰彇 uvkey - String uvKey = getUvKey(key); - uvKeys.add(uvKey); - platformPVData.setUvNum(cache.counter(uvKey)); - platformPVData.setStoreId("-1"); - platformViewDataList.add(platformPVData); - } - batchSave(pvKeys, uvKeys, platformViewDataList); - } - //搴楅摵 PV 缁熻 - if (storePVKeys.size() > 0) { - platformViewDataList = new ArrayList<>(); - for (int i = 0; i < storePVKeys.size(); i++) { - String key = storePVKeys.get(i); - PageViewStatistics pageViewStatistics = new PageViewStatistics(key); - PlatformViewData storePVData = new PlatformViewData(); - BeanUtil.copyProperties(pageViewStatistics, storePVData); - storePVData.setPvNum(storePvValues.get(i).longValue()); - //鏍规嵁pvkey 鑾峰彇 uvkey - String uvKey = getUvKey(key); - uvKeys.add(uvKey); - storePVData.setUvNum(cache.counter(uvKey)); - platformViewDataList.add(storePVData); - } - batchSave(storePVKeys, storeUvKeys, platformViewDataList); - } - } - - /** - * 鏍规嵁缂撳瓨鐨凱Vkey 鑾峰彇瀵瑰簲鐨刄Vkey - * - * @param key - * @return - */ - private String getUvKey(String key) { - if (StringUtils.isNotEmpty(key)) { - - key = key.replace(CachePrefix.PV.getPrefix(), CachePrefix.UV.getPrefix()); - key = key.replace(CachePrefix.STORE_PV.getPrefix(), CachePrefix.STORE_UV.getPrefix()); - return key; - } - return key; - } - - /** - * 鎵归噺淇濆瓨鏁版嵁&&娓呴櫎淇濆瓨鏁版嵁鐨勭紦瀛� - * - * @param pvKeys PV key - * @param uvKeys UV key - * @param platformViewData DOS - */ - @Transactional(rollbackFor = Exception.class) - void batchSave(List<String> pvKeys, List<String> uvKeys, List<PlatformViewData> platformViewData) { - log.debug("鎵归噺淇濆瓨娴侀噺鏁版嵁锛屽叡璁°�恵}銆戞潯", platformViewData.size()); - platformViewService.saveBatch(platformViewData); - //鎵归噺鍒犻櫎缂撳瓨key - cache.multiDel(pvKeys); - cache.multiDel(uvKeys); - log.debug("娴侀噺鏁版嵁淇濆瓨瀹屾垚"); - } - - - /** - * 杩囨护缂撳瓨key - * - * @param keys 缂撳瓨key闆嗗悎 - */ - private static List<String> filterKeys(List<String> keys) { - - //鍙粺璁′竴澶╁墠鐨勬暟鎹� - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR_OF_DAY, -24); - - List<String> result = new ArrayList<>(); - for (String key : keys) { - PageViewStatistics temp = new PageViewStatistics(key); - //濡傛灉闇�瑕佺粺璁★紝鍒欏皢key鍐欏叆闆嗗悎 - if (temp.getDate().before(calendar.getTime())) { - result.add(key); - } - } - - return result; - } - -} - -/** - * 鏍规嵁缂撳瓨key 鑾峰彇鍏朵腑闇�瑕佺殑鍙傛暟锛屽勾鏈堟棩锛屼互鍙婂簵閾轰俊鎭� - */ -@Data -class PageViewStatistics { - /** - * 骞� 銆� 鏈� 銆� 鏃� 銆� 搴楅摵id - */ - private Date date; - private String storeId; - - public PageViewStatistics(String str) { - //灏嗗瓧绗︿覆瑙f瀽鎴愰渶瑕佺殑瀵硅薄 - str = str.substring(str.indexOf("}") + 2); - String[] dateStr = str.split("-"); - Integer year = Convert.toInt(dateStr[0]); - Integer month = Convert.toInt(dateStr[1]); - Integer day; - //鏄惁鏈夊簵閾篿d - if (dateStr.length > 3) { - day = Convert.toInt(dateStr[2]); - this.storeId = dateStr[3]; - } else { - day = Convert.toInt(dateStr[2]); - } - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.YEAR, year); - calendar.set(Calendar.MONTH, month - 1); - calendar.set(Calendar.DAY_OF_MONTH, day); - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - this.date = calendar.getTime(); - } - -} diff --git a/consumer/src/test/java/cn/lili/buyer/test/cart/MemberStatisticsTest.java b/consumer/src/test/java/cn/lili/buyer/test/cart/MemberStatisticsTest.java deleted file mode 100644 index bc88236..0000000 --- a/consumer/src/test/java/cn/lili/buyer/test/cart/MemberStatisticsTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.lili.buyer.test.cart; - -import cn.lili.timetask.handler.impl.statistics.MemberStatisticsExecute; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; - - -@ExtendWith(SpringExtension.class) -@SpringBootTest -class MemberStatisticsTest { - - @Autowired - private MemberStatisticsExecute memberStatisticsExecute; - - @Test - void customSetting() { - memberStatisticsExecute.execute(); - } -} diff --git a/framework/src/main/java/cn/lili/common/properties/RocketmqCustomProperties.java b/framework/src/main/java/cn/lili/common/properties/RocketmqCustomProperties.java index cfc001f..2a6e0dc 100644 --- a/framework/src/main/java/cn/lili/common/properties/RocketmqCustomProperties.java +++ b/framework/src/main/java/cn/lili/common/properties/RocketmqCustomProperties.java @@ -19,6 +19,12 @@ @ConfigurationProperties(prefix = "lili.data.rocketmq") public class RocketmqCustomProperties { + /** + * 璇勮 + */ + private String commentTopic; + + private String commentGroup; private String promotionTopic; diff --git a/framework/src/main/java/cn/lili/modules/lmk/constant/RedisKeyExpireConstant.java b/framework/src/main/java/cn/lili/modules/lmk/constant/RedisKeyExpireConstant.java new file mode 100644 index 0000000..73873eb --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/constant/RedisKeyExpireConstant.java @@ -0,0 +1,27 @@ +package cn.lili.modules.lmk.constant; + +import java.util.concurrent.TimeUnit; + +/** + * redis key杩囨湡鏃堕棿 + * + * @author锛歺p + * @date锛�2025/6/25 10:31 + */ +public class RedisKeyExpireConstant { + + /** + * 璇勮鏁� + */ + public static final Long COMMENT_NUM_EXPIRE = 15l; + + + /** + * 杩囨湡鏃堕棿鍗曚綅 + */ + public static final TimeUnit EXPIRE_DAY = TimeUnit.DAYS; // 澶� + public static final TimeUnit EXPIRE_SED = TimeUnit.SECONDS; // 绉� + public static final TimeUnit EXPIRE_HOUR = TimeUnit.HOURS; // 灏忔椂 + public static final TimeUnit EXPIRE_MINUTES = TimeUnit.MINUTES; // 鍒嗛挓 + +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoComment.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoComment.java index b13ac36..3cb1a3b 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoComment.java +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoComment.java @@ -54,6 +54,10 @@ /** 鐐硅禐鏁伴噺 */ private Long thumbsUpNum; + @TableField("thumbs_up_job") + /** 鏄惁闇�瑕佸畾鏃朵换鍔℃洿鏂扮偣璧炴暟 */ + private Boolean thumbsUpJob; + @TableField("user_nickname") /** 璇勮浜烘樀绉� */ private String userNickname; diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/CollectTypeNumVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/CollectTypeNumVO.java index 2097361..41ef46c 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/CollectTypeNumVO.java +++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/CollectTypeNumVO.java @@ -10,7 +10,7 @@ public class CollectTypeNumVO { /** - * 瑙嗛id + * id */ private String id; diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/ThumbsUpTypeEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/ThumbsUpTypeEnum.java new file mode 100644 index 0000000..f8374f2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/ThumbsUpTypeEnum.java @@ -0,0 +1,45 @@ +package cn.lili.modules.lmk.enums.general; + +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +/** + * 鐐硅禐涓氬姟绫诲瀷 + * + * @author锛歺p + * @date锛�2025/5/14 10:30 + */ +@Getter +public enum ThumbsUpTypeEnum { + + VIDEO_COMMENT("video_comment", "瑙嗛璇勮"), + ; + + private final String value; + + + private final String desc; + + ThumbsUpTypeEnum(String value, String desc) { + this.value = value; + this.desc = desc; + } + + /** + * 鑾峰彇鍚箟 + * + * @param value + * @return + */ + public static String getDescByValue(String value) { + if (StringUtils.isBlank(value)) { + return null; + } + for (ThumbsUpTypeEnum e : ThumbsUpTypeEnum.values()){ + if (value.equals(e.getValue())) { + return e.getDesc(); + } + } + return null; + } +} diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/ThumbsUpRecordMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/ThumbsUpRecordMapper.java index 124dbb0..013bc58 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/mapper/ThumbsUpRecordMapper.java +++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/ThumbsUpRecordMapper.java @@ -1,6 +1,7 @@ package cn.lili.modules.lmk.mapper; import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord; +import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import cn.lili.modules.lmk.domain.vo.ThumbsUpRecordVO; @@ -31,4 +32,10 @@ */ IPage getPage(IPage page, @Param("query") ThumbsUpRecordQuery query); + /** + * 缁熻璇勮鐐硅禐鏁伴噺 + * + * @return + */ + List<CollectTypeNumVO> countNumGroupByComment(); } diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoCommentMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoCommentMapper.java index a632138..d05610e 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoCommentMapper.java +++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoCommentMapper.java @@ -54,4 +54,11 @@ * @return */ List<CollectTypeNumVO> countNumGroupByVideo(); + + /** + * 鎵归噺鏇存柊瑙嗛璇勮鐐硅禐鏁� + * + * @param chunk + */ + void updateCommentThumbsUpNumBatch(@Param("list") List<CollectTypeNumVO> chunk); } diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/ThumbsUpRecordService.java b/framework/src/main/java/cn/lili/modules/lmk/service/ThumbsUpRecordService.java index 0612b04..24a2102 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/service/ThumbsUpRecordService.java +++ b/framework/src/main/java/cn/lili/modules/lmk/service/ThumbsUpRecordService.java @@ -4,6 +4,7 @@ import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord; import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm; import cn.lili.modules.lmk.domain.query.ThumbsUpRecordQuery; +import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -50,4 +51,10 @@ */ Result all(); + /** + * 缁熻璇勮鐨勭偣璧炴暟 + * + * @return + */ + List<CollectTypeNumVO> countNumGroupByComment(); } diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/VideoCommentService.java b/framework/src/main/java/cn/lili/modules/lmk/service/VideoCommentService.java index fd159c4..0825f82 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/service/VideoCommentService.java +++ b/framework/src/main/java/cn/lili/modules/lmk/service/VideoCommentService.java @@ -1,5 +1,6 @@ package cn.lili.modules.lmk.service; +import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord; import cn.lili.modules.lmk.domain.entity.VideoComment; import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm; import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO; @@ -82,10 +83,31 @@ Result thumbsUp(ThumbsUpRecordForm form); /** + * mq鎵ц鐐硅禐璇勮閫昏緫 + * + * @param form + */ + void mqThumbsUp(ThumbsUpRecord form); + + /** * 鍙栨秷鐐硅禐璇勮 * * @param form * @return */ Result cancelThumbsUp(ThumbsUpRecordForm form); + + /** + * mq鐨勫彇娑堢偣璧為�昏緫 + * + * @param form + */ + void mqCancelThumbsUp(ThumbsUpRecordForm form); + + /** + * 鎵归噺鏇存柊璇勮鐐硅禐鏁� + * + * @param numList + */ + void updateCommentThumbsUpNumBatch(List<CollectTypeNumVO> numList); } diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/ThumbsUpRecordServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/ThumbsUpRecordServiceImpl.java index dad82ef..44570b1 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/ThumbsUpRecordServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/ThumbsUpRecordServiceImpl.java @@ -1,5 +1,6 @@ package cn.lili.modules.lmk.service.impl; +import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO; import com.baomidou.mybatisplus.core.metadata.IPage; import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord; import cn.lili.modules.lmk.mapper .ThumbsUpRecordMapper; @@ -88,4 +89,9 @@ .collect(Collectors.toList()); return Result.ok().data(vos); } + + @Override + public List<CollectTypeNumVO> countNumGroupByComment() { + return baseMapper.countNumGroupByComment(); + } } diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoCommentServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoCommentServiceImpl.java index fecee7f..6d4047b 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoCommentServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoCommentServiceImpl.java @@ -6,11 +6,16 @@ import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.sensitive.SensitiveWordsFilter; +import cn.lili.modules.lmk.constant.RedisKeyExpireConstant; import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord; import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm; import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO; import cn.lili.modules.lmk.enums.general.VideoCommentStatusEnum; import cn.lili.modules.lmk.service.ThumbsUpRecordService; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.CommentTagsEnum; +import cn.lili.rocketmq.tags.OrderTagsEnum; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import cn.lili.modules.lmk.domain.entity.VideoComment; import cn.lili.modules.lmk.mapper.VideoCommentMapper; @@ -22,7 +27,10 @@ import cn.lili.modules.lmk.domain.form.VideoCommentForm; import cn.lili.modules.lmk.domain.vo.VideoCommentVO; import cn.lili.modules.lmk.domain.query.VideoCommentQuery; +import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.common.MixAll; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -176,40 +184,75 @@ @Override public Result thumbsUp(ThumbsUpRecordForm form) { - boolean exists = new LambdaQueryChainWrapper<>(thumbsUpRecordService.getBaseMapper()) - .eq(ThumbsUpRecord::getRefId, form.getRefId()) - .eq(ThumbsUpRecord::getUserId, UserContext.getCurrentUserId()) - .exists(); - if (exists) { - return Result.ok(); - } ThumbsUpRecord record = ThumbsUpRecordForm.getEntityByForm(form, null); record.setUserId(UserContext.getCurrentUserId()); - thumbsUpRecordService.save(record); - if (cache.exist(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(record.getRefId()))) { - cache.incr(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(record.getRefId())); - } else { - VideoComment comment = baseMapper.selectById(form.getRefId()); - if (Objects.nonNull(comment)) { - cache.put(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(comment.getId()), comment.getThumbsUpNum() + 1, EXPIRE_TIME, TimeUnit.DAYS); - } - } - // TODO 浣跨敤rocketmq寮傛鍐欏叆鍒癿ysql涓� -// rocketMQTemplate.asyncSend(); + + // 璧癿q寮傛澶勭悊 + String destination = rocketmqCustomProperties.getCommentTopic() + ":" + CommentTagsEnum.THUMBS_UP.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(record), RocketmqSendCallbackBuilder.commonCallback()); return Result.ok(); } @Override + @Transactional(rollbackFor = Exception.class) + public void mqThumbsUp(ThumbsUpRecord record) { + boolean exists = new LambdaQueryChainWrapper<>(thumbsUpRecordService.getBaseMapper()) + .eq(ThumbsUpRecord::getRefId, record.getRefId()) + .eq(ThumbsUpRecord::getUserId, UserContext.getCurrentUserId()) + .exists(); + if (exists) { + return; + } + thumbsUpRecordService.save(record); + VideoComment comment = this.getById(record.getRefId()); + if (cache.exist(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(record.getRefId()))) { + cache.incr(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(record.getRefId())); + } else { + if (Objects.nonNull(comment)) { + cache.put(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(comment.getId()), comment.getThumbsUpNum() + 1, RedisKeyExpireConstant.COMMENT_NUM_EXPIRE, RedisKeyExpireConstant.EXPIRE_DAY); + } + } + // 鏍囪瘑璇ヨ瘎璁洪渶瑕侀�氳繃瀹氭椂浠诲姟缁熻鐐硅禐鏁� + if (Objects.nonNull(comment) && ! comment.getThumbsUpJob()) { + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(VideoComment::getId, comment.getId()) + .set(VideoComment::getThumbsUpJob, Boolean.TRUE) + .update(); + } + } + + @Override public Result cancelThumbsUp(ThumbsUpRecordForm form) { + // 璧癿q寮傛澶勭悊 + String destination = rocketmqCustomProperties.getCommentTopic() + ":" + CommentTagsEnum.CANCEL_THUMBS_UP.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(form), RocketmqSendCallbackBuilder.commonCallback()); + return Result.ok(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void mqCancelThumbsUp(ThumbsUpRecordForm form) { new LambdaUpdateChainWrapper<>(thumbsUpRecordService.getBaseMapper()) .eq(ThumbsUpRecord::getRefId, form.getRefId()) .eq(ThumbsUpRecord::getThumbsUpType, form.getThumbsUpType()) .eq(ThumbsUpRecord::getUserId, UserContext.getCurrentUserId()) .remove(); // redis鏁伴噺鍑忎竴 - cache.decr(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(form.getRefId())); - // TODO mq寮傛鍚屾鍒癿ysql - return Result.ok(); + VideoComment comment = this.getById(form.getRefId()); + if (cache.exist(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(form.getRefId()))) { + cache.decr(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(form.getRefId())); + } else { + if (Objects.nonNull(comment)) { + cache.put(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(comment.getId()), comment.getThumbsUpNum() - 1, RedisKeyExpireConstant.COMMENT_NUM_EXPIRE, RedisKeyExpireConstant.EXPIRE_DAY); + } + } + // 鏍囪瘑璇ヨ瘎璁洪渶瑕侀�氳繃瀹氭椂浠诲姟缁熻鐐硅禐鏁� + if (Objects.nonNull(comment) && ! comment.getThumbsUpJob()) { + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(VideoComment::getId, comment.getId()) + .set(VideoComment::getThumbsUpJob, Boolean.TRUE) + .update(); + } } /** @@ -228,4 +271,18 @@ } return Long.valueOf((Integer) redisNum); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCommentThumbsUpNumBatch(List<CollectTypeNumVO> numList) { + // 鎸�500鏉℃暟鎹繘琛屾媶鍒� + List<List<CollectTypeNumVO>> chunks = ListUtils.partition(numList, 500); + for (List<CollectTypeNumVO> chunk : chunks) { + baseMapper.updateCommentThumbsUpNumBatch(chunk); + new LambdaUpdateChainWrapper<>(baseMapper) + .in(VideoComment::getId, chunk.stream().map(CollectTypeNumVO::getId).collect(Collectors.toList())) + .set(VideoComment::getThumbsUpJob, Boolean.FALSE) + .update(); + } + } } diff --git a/framework/src/main/java/cn/lili/rocketmq/tags/CommentTagsEnum.java b/framework/src/main/java/cn/lili/rocketmq/tags/CommentTagsEnum.java new file mode 100644 index 0000000..b993f6e --- /dev/null +++ b/framework/src/main/java/cn/lili/rocketmq/tags/CommentTagsEnum.java @@ -0,0 +1,32 @@ +package cn.lili.rocketmq.tags; + +/** + * rocketmq鐐硅禐tag + * + * @author paulG + * @since 2020/12/9 + **/ +public enum CommentTagsEnum { + + /** + * 鐐硅禐 + */ + THUMBS_UP("鐐硅禐"), + /** + * 鍙栨秷鐐硅禐 + */ + CANCEL_THUMBS_UP("璁㈠崟鐘舵�佹敼鍙�"); + + + private final String description; + + CommentTagsEnum(String description) { + this.description = description; + } + + public String description() { + return description; + } + + +} diff --git a/framework/src/main/resources/mapper/lmk/ThumbsUpRecordMapper.xml b/framework/src/main/resources/mapper/lmk/ThumbsUpRecordMapper.xml index 674236c..1e1c362 100644 --- a/framework/src/main/resources/mapper/lmk/ThumbsUpRecordMapper.xml +++ b/framework/src/main/resources/mapper/lmk/ThumbsUpRecordMapper.xml @@ -41,4 +41,19 @@ LTUR.delete_flag = 0 </select> + + <select id="countNumGroupByComment" resultType="cn.lili.modules.lmk.domain.vo.CollectTypeNumVO"> + SELECT + LTUR.ref_id as id, + count(LTUR.ref_id) as countNum + FROM + lmk_thumbs_up_record LTUR + INNER JOIN lmk_video_comment LVC ON LTUR.ref_id = LVC.id AND LVC.thumbs_up_job = 1 AND LVC.delete_flag = 0 + WHERE + LTUR.thumbs_up_type = 'video_comment' + AND LTUR.delete_flag = 0 + GROUP BY + LTUR.ref_id + </select> + </mapper> diff --git a/framework/src/main/resources/mapper/lmk/VideoCommentMapper.xml b/framework/src/main/resources/mapper/lmk/VideoCommentMapper.xml index 759dfc5..2c1c43a 100644 --- a/framework/src/main/resources/mapper/lmk/VideoCommentMapper.xml +++ b/framework/src/main/resources/mapper/lmk/VideoCommentMapper.xml @@ -155,4 +155,19 @@ video_id </select> + + <update id="updateCommentThumbsUpNumBatch"> + UPDATE lmk_video_comment + SET thumbs_up_num = CASE id + <foreach collection="list" item="comment"> + WHEN #{comment.id} THEN #{comment.countNum} + </foreach> + ELSE thumbs_up_num + END + WHERE id IN + <foreach collection="list" item="comment" open="(" separator="," close=")"> + #{comment.id} + </foreach> + </update> + </mapper> diff --git a/lmk-job/src/main/java/cn/lili/job/VideoJob.java b/lmk-job/src/main/java/cn/lili/job/VideoJob.java index 7b3b710..9ff9d00 100644 --- a/lmk-job/src/main/java/cn/lili/job/VideoJob.java +++ b/lmk-job/src/main/java/cn/lili/job/VideoJob.java @@ -3,6 +3,7 @@ import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO; import cn.lili.modules.lmk.enums.general.CollectTypeEnum; import cn.lili.modules.lmk.service.MyCollectService; +import cn.lili.modules.lmk.service.ThumbsUpRecordService; import cn.lili.modules.lmk.service.VideoCommentService; import cn.lili.modules.lmk.service.VideoService; import com.xxl.job.core.context.XxlJobHelper; @@ -26,6 +27,7 @@ private final VideoService videoService; private final MyCollectService myCollectService; private final VideoCommentService videoCommentService; + private final ThumbsUpRecordService thumbsUpRecordService; /** * 瑙嗛鏀惰棌鏁扮粺璁� @@ -55,4 +57,19 @@ } } + /** + * 瑙嗛璇勮鐐硅禐鏁扮粺璁� + * + * @throws Exception + */ + @XxlJob("videoCommentThumbsUpNumJob") + public void videoCommentThumbsUpNumJob() throws Exception { + XxlJobHelper.log("寮�濮嬫墽琛岋細璇勮鐐硅禐鏁扮粺璁�"); + + List<CollectTypeNumVO> numList = thumbsUpRecordService.countNumGroupByComment(); + if (CollectionUtils.isNotEmpty(numList)) { + videoCommentService.updateCommentThumbsUpNumBatch(numList); + } + } + } -- Gitblit v1.8.0