diff --git a/framework/src/main/java/cn/lili/cache/config/redis/RedisConfig.java b/framework/src/main/java/cn/lili/cache/config/redis/RedisConfig.java index 0551f26b..8af75596 100644 --- a/framework/src/main/java/cn/lili/cache/config/redis/RedisConfig.java +++ b/framework/src/main/java/cn/lili/cache/config/redis/RedisConfig.java @@ -11,7 +11,6 @@ import org.redisson.config.ClusterServersConfig; import org.redisson.config.Config; import org.redisson.config.SentinelServersConfig; import org.redisson.config.SingleServerConfig; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -56,13 +55,11 @@ import java.util.Map; public class RedisConfig extends CachingConfigurerSupport { + private static final String REDIS_PREFIX = "redis://"; + @Value("${lili.cache.timeout:7200}") private Integer timeout; - @Autowired - private RedisProperties redisProperties; - - /** * 当有多个管理器的时候,必须使用该注解在一个管理器上注释:表示该管理器为默认的管理器 * @@ -101,7 +98,7 @@ public class RedisConfig extends CachingConfigurerSupport { public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate template = new RedisTemplate<>(); //使用fastjson序列化 - FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class); + FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); //value值的序列化采用fastJsonRedisSerializer template.setValueSerializer(fastJsonRedisSerializer); template.setHashValueSerializer(fastJsonRedisSerializer); @@ -113,7 +110,7 @@ public class RedisConfig extends CachingConfigurerSupport { } @Bean(destroyMethod = "shutdown") - public RedissonClient redisson() { + public RedissonClient redisson(RedisProperties redisProperties) { Config config = new Config(); if (redisProperties.getSentinel() != null && !redisProperties.getSentinel().getNodes().isEmpty()) { // 哨兵模式 @@ -121,7 +118,7 @@ public class RedisConfig extends CachingConfigurerSupport { sentinelServersConfig.setMasterName(redisProperties.getSentinel().getMaster()); List sentinelAddress = new ArrayList<>(); for (String node : redisProperties.getCluster().getNodes()) { - sentinelAddress.add("redis://" + node); + sentinelAddress.add(REDIS_PREFIX + node); } sentinelServersConfig.setSentinelAddresses(sentinelAddress); if (CharSequenceUtil.isNotEmpty(redisProperties.getSentinel().getPassword())) { @@ -132,7 +129,7 @@ public class RedisConfig extends CachingConfigurerSupport { ClusterServersConfig clusterServersConfig = config.useClusterServers(); List clusterNodes = new ArrayList<>(); for (String node : redisProperties.getCluster().getNodes()) { - clusterNodes.add("redis://" + node); + clusterNodes.add(REDIS_PREFIX + node); } clusterServersConfig.setNodeAddresses(clusterNodes); if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) { @@ -140,7 +137,7 @@ public class RedisConfig extends CachingConfigurerSupport { } } else { SingleServerConfig singleServerConfig = config.useSingleServer(); - singleServerConfig.setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort()); + singleServerConfig.setAddress(REDIS_PREFIX + redisProperties.getHost() + ":" + redisProperties.getPort()); if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) { singleServerConfig.setPassword(redisProperties.getPassword()); } diff --git a/framework/src/main/java/cn/lili/common/event/TransactionCommitSendMQEvent.java b/framework/src/main/java/cn/lili/common/event/TransactionCommitSendMQEvent.java new file mode 100644 index 00000000..9f16c1e4 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/event/TransactionCommitSendMQEvent.java @@ -0,0 +1,32 @@ +package cn.lili.common.event; + +import lombok.Getter; +import org.springframework.context.ApplicationEvent; + +/** + * 事务提交后发生mq事件 + * + * @author paulG + * @since 2022/1/19 + **/ +public class TransactionCommitSendMQEvent extends ApplicationEvent { + + private static final long serialVersionUID = 5885956821347953071L; + + + @Getter + private final String topic; + + @Getter + private final String tag; + + @Getter + private final String message; + + public TransactionCommitSendMQEvent(Object source, String topic, String tag, String message) { + super(source); + this.topic = topic; + this.tag = tag; + this.message = message; + } +} diff --git a/framework/src/main/java/cn/lili/common/listener/TransactionCommitSendMQListener.java b/framework/src/main/java/cn/lili/common/listener/TransactionCommitSendMQListener.java new file mode 100644 index 00000000..c709df75 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/listener/TransactionCommitSendMQListener.java @@ -0,0 +1,38 @@ +package cn.lili.common.listener; + +import cn.lili.common.event.TransactionCommitSendMQEvent; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +/** + * 事务提交监听器 + * + * @author paulG + * @since 2022/1/19 + **/ +@Component +@Slf4j +public class TransactionCommitSendMQListener { + + /** + * rocketMq + */ + @Autowired + private RocketMQTemplate rocketMQTemplate; + + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void send(TransactionCommitSendMQEvent event) { + log.info("事务提交,发送mq信息!{}", event); + String destination = event.getTopic() + ":" + event.getTag(); + //发送订单变更mq消息 + rocketMQTemplate.asyncSend(destination, event.getMessage(), RocketmqSendCallbackBuilder.commonCallback()); + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java index 1ea33779..e910a6c7 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java @@ -89,6 +89,7 @@ public class ConnectServiceImpl extends ServiceImpl impl } return memberTokenGenerate.createToken(member, longTerm); } catch (NoPermissionException e) { + log.error("联合登陆失败:", e); throw e; } } @@ -121,7 +122,7 @@ public class ConnectServiceImpl extends ServiceImpl impl @Override public void bind(String unionId, String type) { - AuthUser authUser = UserContext.getCurrentUser(); + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); Connect connect = new Connect(authUser.getId(), unionId, type); this.save(connect); } @@ -160,6 +161,7 @@ public class ConnectServiceImpl extends ServiceImpl impl @Override + @Transactional public Token miniProgramAutoLogin(WechatMPLoginParams params) { Object cacheData = cache.get(CachePrefix.WECHAT_SESSION_PARAMS.getPrefix() + params.getUuid()); @@ -186,8 +188,8 @@ public class ConnectServiceImpl extends ServiceImpl impl /** * 通过微信返回等code 获取openid 等信息 * - * @param code - * @return + * @param code 微信code + * @return 微信返回的信息 */ public JSONObject getConnect(String code) { WechatConnectSettingItem setting = getWechatMPSetting(); @@ -208,11 +210,12 @@ public class ConnectServiceImpl extends ServiceImpl impl * @param params 微信小程序自动登录参数 * @param openId 微信openid * @param unionId 微信unionid - * @return + * @return token */ @Transactional(rollbackFor = Exception.class) public Token phoneMpBindAndLogin(String sessionKey, WechatMPLoginParams params, String openId, String unionId) { - String encryptedData = params.getEncryptedData(), iv = params.getIv(); + String encryptedData = params.getEncryptedData(); + String iv = params.getIv(); JSONObject userInfo = this.getUserInfo(encryptedData, sessionKey, iv); log.info("联合登陆返回:{}", userInfo.toString()); String phone = (String) userInfo.get("purePhoneNumber"); @@ -259,9 +262,9 @@ public class ConnectServiceImpl extends ServiceImpl impl * 这样,微信小程序注册之后,其他app 公众号页面,都可以实现绑定自动登录功能 *

* - * @param openId - * @param unionId - * @param member + * @param openId 微信openid + * @param unionId 微信unionid + * @param member 会员 */ private void bindMpMember(String openId, String unionId, Member member) { @@ -272,7 +275,7 @@ public class ConnectServiceImpl extends ServiceImpl impl lambdaQueryWrapper.eq(Connect::getUnionId, unionId); lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT.name()); List connects = this.list(lambdaQueryWrapper); - if (connects.size() == 0) { + if (connects.isEmpty()) { Connect connect = new Connect(); connect.setUnionId(unionId); connect.setUserId(member.getId()); @@ -281,7 +284,7 @@ public class ConnectServiceImpl extends ServiceImpl impl } }//如果openid 不为空 则为账号绑定openid if (CharSequenceUtil.isNotEmpty(openId)) { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(Connect::getUnionId, openId); lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT_MP_OPEN_ID.name()); List connects = this.list(lambdaQueryWrapper); diff --git a/framework/src/main/java/cn/lili/modules/goods/event/GeneratorEsGoodsIndexEvent.java b/framework/src/main/java/cn/lili/modules/goods/event/GeneratorEsGoodsIndexEvent.java deleted file mode 100644 index 4088b5aa..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/event/GeneratorEsGoodsIndexEvent.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.lili.modules.goods.event; - -import lombok.Data; -import org.springframework.context.ApplicationEvent; - -/** - * @author paulG - * @since 2022/1/19 - **/ -@Data -public class GeneratorEsGoodsIndexEvent extends ApplicationEvent { - - private static final long serialVersionUID = -6206752641309458207L; - - private String id; - - private String tag; - - public GeneratorEsGoodsIndexEvent(Object source, String tag, String id) { - super(source); - this.tag = tag; - this.id = id; - } -} diff --git a/framework/src/main/java/cn/lili/modules/goods/listener/GeneratorEsGoodsIndexListener.java b/framework/src/main/java/cn/lili/modules/goods/listener/GeneratorEsGoodsIndexListener.java deleted file mode 100644 index 175e0b13..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/listener/GeneratorEsGoodsIndexListener.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.lili.modules.goods.listener; - -import cn.lili.common.properties.RocketmqCustomProperties; -import cn.lili.modules.goods.event.GeneratorEsGoodsIndexEvent; -import cn.lili.rocketmq.RocketmqSendCallbackBuilder; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.transaction.event.TransactionPhase; -import org.springframework.transaction.event.TransactionalEventListener; - -/** - * @author paulG - * @since 2022/1/19 - **/ -@Component -public class GeneratorEsGoodsIndexListener { - - /** - * rocketMq - */ - @Autowired - private RocketMQTemplate rocketMQTemplate; - /** - * rocketMq配置 - */ - @Autowired - private RocketmqCustomProperties rocketmqCustomProperties; - - @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) - public void generatorEsGoodsIndex(GeneratorEsGoodsIndexEvent esGoodsIndexEvent) { - String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + esGoodsIndexEvent.getTag(); - //发送mq消息 - rocketMQTemplate.asyncSend(destination, esGoodsIndexEvent.getId(), RocketmqSendCallbackBuilder.commonCallback()); - } - -} diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java index c4d89278..94bec3dc 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java @@ -9,6 +9,7 @@ import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; +import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.context.UserContext; @@ -26,7 +27,6 @@ import cn.lili.modules.goods.entity.vos.GoodsSkuSpecVO; import cn.lili.modules.goods.entity.vos.GoodsSkuVO; import cn.lili.modules.goods.entity.vos.GoodsVO; import cn.lili.modules.goods.entity.vos.SpecValueVO; -import cn.lili.modules.goods.event.GeneratorEsGoodsIndexEvent; import cn.lili.modules.goods.mapper.GoodsSkuMapper; import cn.lili.modules.goods.service.*; import cn.lili.modules.goods.sku.GoodsSkuBuilder; @@ -362,10 +362,10 @@ public class GoodsSkuServiceImpl extends ServiceImpl i boolean update = this.update(updateWrapper); if (Boolean.TRUE.equals(update)) { if (GoodsStatusEnum.UPPER.name().equals(marketEnable)) { - applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("生成店铺商品", GoodsTagsEnum.GENERATOR_STORE_GOODS_INDEX.name(), storeId)); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("生成店铺商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.GENERATOR_STORE_GOODS_INDEX.name(), storeId)); } else if (GoodsStatusEnum.DOWN.name().equals(marketEnable)) { cache.vagueDel(CachePrefix.GOODS_SKU.getPrefix()); - applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("删除店铺商品", GoodsTagsEnum.STORE_GOODS_DELETE.name(), storeId)); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("删除店铺商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.STORE_GOODS_DELETE.name(), storeId)); } } } @@ -589,7 +589,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i if (!GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) { return; } - applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("生成商品", GoodsTagsEnum.GENERATOR_GOODS_INDEX.name(), goods.getId())); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("生成商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.GENERATOR_GOODS_INDEX.name(), goods.getId())); } @Override diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ManagerMemberEditDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ManagerMemberEditDTO.java index 8818ad4a..c61792aa 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/ManagerMemberEditDTO.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ManagerMemberEditDTO.java @@ -24,6 +24,7 @@ public class ManagerMemberEditDTO { @ApiModelProperty(value = "会员用户名,用户名不能进行修改", required = true) @NotNull(message = "会员用户名不能为空") private String id; + @ApiModelProperty(value = "会员用户名,用户名不能进行修改", required = true) @NotNull(message = "会员用户名不能为空") private String username; @@ -48,7 +49,7 @@ public class ManagerMemberEditDTO { private Integer sex; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "会员生日") private Date birthday; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java index 30608258..1dcffeeb 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java @@ -6,6 +6,7 @@ import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.promotion.tools.PromotionTools; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import java.io.Serializable; @@ -19,6 +20,7 @@ import java.util.Map; */ @Data @NoArgsConstructor +@EqualsAndHashCode(callSuper = true) public class CartSkuVO extends CartBase implements Serializable { diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java index b6211c3c..76491576 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java @@ -10,6 +10,7 @@ import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; +import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.OperationalJudgment; @@ -66,6 +67,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -144,6 +146,10 @@ public class OrderServiceImpl extends ServiceImpl implements @Autowired private TradeService tradeService; + + @Autowired + private ApplicationEventPublisher applicationEventPublisher; + @Override @Transactional(rollbackFor = Exception.class) public void intoDB(TradeDTO tradeDTO) { @@ -445,12 +451,13 @@ public class OrderServiceImpl extends ServiceImpl implements //获取订单信息 Order order = this.getBySn(orderSn); //获取踪迹信息 - String str=order.getConsigneeMobile(); - return logisticsService.getLogistic(order.getLogisticsCode(), order.getLogisticsNo(), str.substring(str.length()-4)); + String str = order.getConsigneeMobile(); + return logisticsService.getLogistic(order.getLogisticsCode(), order.getLogisticsNo(), str.substring(str.length() - 4)); } @Override @OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#verificationCode+']'", orderSn = "#orderSn") + @Transactional(rollbackFor = Exception.class) public Order take(String orderSn, String verificationCode) { //获取订单信息 @@ -495,7 +502,8 @@ public class OrderServiceImpl extends ServiceImpl implements * @param order 订单 * @param orderSn 订单编号 */ - private void complete(Order order, String orderSn) {//修改订单状态为完成 + @Transactional(rollbackFor = Exception.class) + public void complete(Order order, String orderSn) {//修改订单状态为完成 this.updateStatus(orderSn, OrderStatusEnum.COMPLETED); //修改订单货物可以进行评价 @@ -534,10 +542,9 @@ public class OrderServiceImpl extends ServiceImpl implements } @Override + @Transactional(rollbackFor = Exception.class) public void sendUpdateStatusMessage(OrderMessage orderMessage) { - String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name(); - //发送订单变更mq消息 - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback()); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("发送订单变更mq消息", rocketmqCustomProperties.getOrderTopic(), OrderTagsEnum.STATUS_CHANGE.name(), JSONUtil.toJsonStr(orderMessage))); } @Override @@ -621,6 +628,7 @@ public class OrderServiceImpl extends ServiceImpl implements } @Override + @Transactional(rollbackFor = Exception.class) public void batchDeliver(MultipartFile files) { InputStream inputStream; @@ -777,9 +785,10 @@ public class OrderServiceImpl extends ServiceImpl implements /** * 订单状态变更消息 * - * @param order + * @param order 订单信息 */ - private void orderStatusMessage(Order order) { + @Transactional(rollbackFor = Exception.class) + public void orderStatusMessage(Order order) { OrderMessage orderMessage = new OrderMessage(); orderMessage.setOrderSn(order.getSn()); orderMessage.setNewStatus(OrderStatusEnum.valueOf(order.getOrderStatus())); @@ -811,10 +820,10 @@ public class OrderServiceImpl extends ServiceImpl implements List list = this.getPintuanOrder(pintuanId, parentOrderSn); int count = list.size(); if (count == 1) { - //如果为开团订单,则发布一个一小时的延时任务,时间到达后,如果未成团则自动结束(未开启虚拟成团的情况下) + //如果为开团订单,则发布一个24小时的延时任务,时间到达后,如果未成团则自动结束(未开启虚拟成团的情况下) PintuanOrderMessage pintuanOrderMessage = new PintuanOrderMessage(); //开团结束时间 - long startTime = DateUtil.offsetMinute(new Date(), 2).getTime(); + long startTime = DateUtil.offsetHour(new Date(), 24).getTime(); pintuanOrderMessage.setOrderSn(parentOrderSn); pintuanOrderMessage.setPintuanId(pintuanId); TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, @@ -906,7 +915,8 @@ public class OrderServiceImpl extends ServiceImpl implements * * @param orderSn 订单编号 */ - private void normalOrderConfirm(String orderSn) { + @Transactional(rollbackFor = Exception.class) + public void normalOrderConfirm(String orderSn) { //修改订单 this.update(new LambdaUpdateWrapper() .eq(Order::getSn, orderSn) @@ -925,7 +935,8 @@ public class OrderServiceImpl extends ServiceImpl implements * * @param orderSn 订单编号 */ - private void virtualOrderConfirm(String orderSn) { + @Transactional(rollbackFor = Exception.class) + public void virtualOrderConfirm(String orderSn) { //修改订单 this.update(new LambdaUpdateWrapper() .eq(Order::getSn, orderSn) diff --git a/framework/src/main/java/cn/lili/modules/promotion/event/UpdateEsGoodsIndexPromotionsEvent.java b/framework/src/main/java/cn/lili/modules/promotion/event/UpdateEsGoodsIndexPromotionsEvent.java deleted file mode 100644 index 94442bf7..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/event/UpdateEsGoodsIndexPromotionsEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.lili.modules.promotion.event; - -import lombok.Data; -import org.springframework.context.ApplicationEvent; - -/** - * @author paulG - * @since 2022/1/19 - **/ -@Data -public class UpdateEsGoodsIndexPromotionsEvent extends ApplicationEvent { - - private String promotionsJsonStr; - - public UpdateEsGoodsIndexPromotionsEvent(Object source, String promotionsJsonStr) { - super(source); - this.promotionsJsonStr = promotionsJsonStr; - } -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/listener/UpdateEsGoodsIndexPromotionsListener.java b/framework/src/main/java/cn/lili/modules/promotion/listener/UpdateEsGoodsIndexPromotionsListener.java deleted file mode 100644 index 00417c5f..00000000 --- a/framework/src/main/java/cn/lili/modules/promotion/listener/UpdateEsGoodsIndexPromotionsListener.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.lili.modules.promotion.listener; - -import cn.lili.common.properties.RocketmqCustomProperties; -import cn.lili.modules.promotion.event.UpdateEsGoodsIndexPromotionsEvent; -import cn.lili.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.rocketmq.tags.GoodsTagsEnum; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.transaction.event.TransactionPhase; -import org.springframework.transaction.event.TransactionalEventListener; - -/** - * @author paulG - * @since 2022/1/19 - **/ -@Component -public class UpdateEsGoodsIndexPromotionsListener { - - /** - * rocketMq - */ - @Autowired - private RocketMQTemplate rocketMQTemplate; - /** - * rocketMq配置 - */ - @Autowired - private RocketmqCustomProperties rocketmqCustomProperties; - - - @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, fallbackExecution = true) - public void updateEsGoodsIndexPromotions(UpdateEsGoodsIndexPromotionsEvent event) { - //更新商品促销消息 - String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_PROMOTIONS.name(); - //发送mq消息 - rocketMQTemplate.asyncSend(destination, event.getPromotionsJsonStr(), RocketmqSendCallbackBuilder.commonCallback()); - } - - -} diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/AbstractPromotionsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/AbstractPromotionsServiceImpl.java index c46eb258..05682167 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/AbstractPromotionsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/AbstractPromotionsServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.map.MapBuilder; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.json.JSONUtil; import cn.lili.common.enums.ResultCode; +import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.vo.PageVO; @@ -11,19 +12,16 @@ import cn.lili.modules.promotion.entity.dos.BasePromotions; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dto.search.BasePromotionsSearchParams; import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; -import cn.lili.modules.promotion.event.UpdateEsGoodsIndexPromotionsEvent; import cn.lili.modules.promotion.service.AbstractPromotionsService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.mybatis.util.PageUtil; -import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.GoodsTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.transaction.annotation.Transactional; @@ -48,12 +46,6 @@ public abstract class AbstractPromotionsServiceImpl, T e @Autowired private RocketmqCustomProperties rocketmqCustomProperties; - /** - * rocketMq - */ - @Autowired - private RocketMQTemplate rocketMQTemplate; - @Autowired private ApplicationEventPublisher applicationEventPublisher; @@ -253,13 +245,12 @@ public abstract class AbstractPromotionsServiceImpl, T e * @param promotions 促销实体 */ @Override + @Transactional(rollbackFor = {Exception.class}) public void updateEsGoodsIndex(T promotions) { if (promotions.getStartTime() == null && promotions.getEndTime() == null) { Map build = MapBuilder.create().put("promotionKey", this.getPromotionType() + "-" + promotions.getId()).put("scopeId", promotions.getScopeId()).build(); //删除商品促销消息 - String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.DELETE_GOODS_INDEX_PROMOTIONS.name(); - //发送mq消息 - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(build), RocketmqSendCallbackBuilder.commonCallback()); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("删除商品促销事件", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.DELETE_GOODS_INDEX_PROMOTIONS.name(), JSONUtil.toJsonStr(build))); } else { String esPromotionKey = this.getPromotionType().name() + "-" + promotions.getId(); @@ -270,7 +261,7 @@ public abstract class AbstractPromotionsServiceImpl, T e map.put("promotionsType", promotions.getClass().getName()); // 促销实体 map.put("promotions", promotions); - applicationEventPublisher.publishEvent(new UpdateEsGoodsIndexPromotionsEvent("更新商品索引促销事件", JSONUtil.toJsonStr(map))); + applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("更新商品索引促销事件", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.UPDATE_GOODS_INDEX_PROMOTIONS.name(), JSONUtil.toJsonStr(map))); } } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java index 4edd344a..6750104b 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java @@ -299,7 +299,7 @@ public class PintuanServiceImpl extends AbstractPromotionsServiceImpl filterFunctionBuilders = new ArrayList<>(); - GaussDecayFunctionBuilder skuNoScore = ScoreFunctionBuilders.gaussDecayFunction("skuSource", 50, 10, 50).setWeight(2); - FunctionScoreQueryBuilder.FilterFunctionBuilder skuNoBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchAllQuery(), skuNoScore); - filterFunctionBuilders.add(skuNoBuilder); - FieldValueFactorFunctionBuilder buyCountScore = ScoreFunctionBuilders.fieldValueFactorFunction("buyCount").modifier(FieldValueFactorFunction.Modifier.LOG1P).setWeight(3); - FunctionScoreQueryBuilder.FilterFunctionBuilder buyCountBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchAllQuery(), buyCountScore); - filterFunctionBuilders.add(buyCountBuilder); + List filterFunctionBuilders = this.buildFunctionSearch(); FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()]; filterFunctionBuilders.toArray(builders); - FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders) + FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), builders) .scoreMode(FunctionScoreQuery.ScoreMode.SUM) .setMinScore(2); //聚合搜索则将结果放入过滤条件 @@ -529,47 +525,40 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { * @param keyword 关键字 */ private void keywordSearch(BoolQueryBuilder filterBuilder, String keyword) { - List filterFunctionBuilders = new ArrayList<>(); - if (keyword.contains(" ")) { - for (String s : keyword.split(" ")) { - filterFunctionBuilders.addAll(this.buildKeywordSearch(s)); - } - } else { - filterFunctionBuilders = this.buildKeywordSearch(keyword); - } + + List filterFunctionBuilders = this.buildFunctionSearch(); + + //分词匹配 + // operator 为 AND 时 需全部分词匹配。为 OR 时 需配置 minimumShouldMatch(最小分词匹配数)不设置默认为1 + MatchQueryBuilder goodsNameMatchQuery = QueryBuilders.matchQuery("goodsName", keyword).operator(Operator.OR).minimumShouldMatch(MINIMUM_SHOULD_MATCH); FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()]; filterFunctionBuilders.toArray(builders); - FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders) + FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(goodsNameMatchQuery, builders) .scoreMode(FunctionScoreQuery.ScoreMode.SUM) .setMinScore(2); //聚合搜索则将结果放入过滤条件 filterBuilder.must(functionScoreQueryBuilder); + filterBuilder.should(QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("goodsName", keyword).boost(10))); } /** * 构造关键字查询 * - * @param keyword 关键字 * @return 构造查询的集合 */ - private List buildKeywordSearch(String keyword) { + private List buildFunctionSearch() { List filterFunctionBuilders = new ArrayList<>(); - // operator 为 AND 时 需全部分词匹配。为 OR 时 需配置 minimumShouldMatch(最小分词匹配数)不设置默认为1 - MatchQueryBuilder goodsNameQuery = QueryBuilders.matchQuery("goodsName", keyword).operator(Operator.OR).minimumShouldMatch("2"); - //分词匹配 - filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(goodsNameQuery, - ScoreFunctionBuilders.weightFactorFunction(10))); - //属性匹配 - filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.nestedQuery(ATTR_PATH, QueryBuilders.wildcardQuery(ATTR_VALUE, "*" + keyword + "*"), ScoreMode.None), - ScoreFunctionBuilders.weightFactorFunction(8))); - GaussDecayFunctionBuilder skuNoScore = ScoreFunctionBuilders.gaussDecayFunction("skuSource", 50, 10, 50).setWeight(7); - FunctionScoreQueryBuilder.FilterFunctionBuilder skuNoBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(goodsNameQuery, skuNoScore); +// GaussDecayFunctionBuilder skuNoScore = ScoreFunctionBuilders.gaussDecayFunction("skuSource", 100, 10).setWeight(2); +// FunctionScoreQueryBuilder.FilterFunctionBuilder skuNoBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(skuNoScore); +// filterFunctionBuilders.add(skuNoBuilder); + FieldValueFactorFunctionBuilder skuNoScore = ScoreFunctionBuilders.fieldValueFactorFunction("skuSource").modifier(FieldValueFactorFunction.Modifier.LOG1P).setWeight(3); + FunctionScoreQueryBuilder.FilterFunctionBuilder skuNoBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(skuNoScore); filterFunctionBuilders.add(skuNoBuilder); - FieldValueFactorFunctionBuilder buyCountScore = ScoreFunctionBuilders.fieldValueFactorFunction("buyCount").modifier(FieldValueFactorFunction.Modifier.LOG1P).setWeight(6); - FunctionScoreQueryBuilder.FilterFunctionBuilder buyCountBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(goodsNameQuery, buyCountScore); + FieldValueFactorFunctionBuilder buyCountScore = ScoreFunctionBuilders.fieldValueFactorFunction("buyCount").modifier(FieldValueFactorFunction.Modifier.LOG1P).setWeight(3); + FunctionScoreQueryBuilder.FilterFunctionBuilder buyCountBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(buyCountScore); filterFunctionBuilders.add(buyCountBuilder); return filterFunctionBuilders; } diff --git a/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java index d411481d..be6f99ee 100644 --- a/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/wallet/serviceimpl/MemberWalletServiceImpl.java @@ -84,7 +84,7 @@ public class MemberWalletServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("member_id", memberId); //执行查询 - MemberWallet memberWallet = this.baseMapper.selectOne(queryWrapper); + MemberWallet memberWallet = this.getOne(queryWrapper, false); //如果没有钱包,则创建钱包 if (memberWallet == null) { memberWallet = this.save(memberId, memberService.getById(memberId).getUsername()); @@ -186,7 +186,7 @@ public class MemberWalletServiceImpl extends ServiceImpl().eq("member_id", memberId)); + MemberWallet memberWallet = this.getOne(new QueryWrapper().eq("member_id", memberId), false); //如果会员预存款信息不存在则同步重新建立预存款信息 if (memberWallet == null) { Member member = memberService.getById(memberId);