!118 优化编辑商品时的生成索引和操作促销活动时更新索引促销信息,增加事务监听在事务提交后发

Merge pull request !118 from OceansDeep/feature/pg
This commit is contained in:
OceansDeep 2022-01-19 06:17:35 +00:00 committed by Gitee
commit 0b081c2d85
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
16 changed files with 196 additions and 36 deletions

View File

@ -15,6 +15,11 @@
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
@ -161,6 +166,12 @@
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>${aliyun-sdk-dysms-version}</version>
<exclusions>
<exclusion>
<artifactId>org.jacoco.agent</artifactId>
<groupId>org.jacoco</groupId>
</exclusion>
</exclusions>
</dependency>
<!--脚本编程-->
<dependency>
@ -172,6 +183,12 @@
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>${rocketmq-version}</version>
<exclusions>
<exclusion>
<artifactId>fastjson</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- token加密 -->
<dependency>
@ -220,6 +237,10 @@
<artifactId>groovy</artifactId>
<groupId>org.codehaus.groovy</groupId>
</exclusion>
<exclusion>
<artifactId>commons-collections4</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
</exclusions>
</dependency>
@ -248,6 +269,20 @@
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>${alipay-sdk-version}</version>
<exclusions>
<exclusion>
<artifactId>bcprov-jdk15on</artifactId>
<groupId>org.bouncycastle</groupId>
</exclusion>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
<exclusion>
<artifactId>xml-apis</artifactId>
<groupId>xml-apis</groupId>
</exclusion>
</exclusions>
</dependency>
<!--用户端类型处理-->
@ -314,6 +349,12 @@
<groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
<artifactId>owasp-java-html-sanitizer</artifactId>
<version>${owasp-java-html-sanitizer}</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

View File

@ -33,7 +33,6 @@ public class SnowFlake {
*/
public static void initialize(long workerId, long datacenterId) {
snowflake = IdUtil.getSnowflake(workerId, datacenterId);
log.error(workerId+""+datacenterId);
}
public static long getId() {

View File

@ -0,0 +1,19 @@
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 String goodsId;
public GeneratorEsGoodsIndexEvent(Object source, String goodsId) {
super(source);
this.goodsId = goodsId;
}
}

View File

@ -0,0 +1,38 @@
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 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 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() + ":" + GoodsTagsEnum.GENERATOR_GOODS_INDEX.name();
//发送mq消息
rocketMQTemplate.asyncSend(destination, esGoodsIndexEvent.getGoodsId(), RocketmqSendCallbackBuilder.commonCallback());
}
}

View File

@ -383,6 +383,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateStock(String goodsId, Integer quantity) {
LambdaUpdateWrapper<Goods> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.set(Goods::getQuantity, quantity);

View File

@ -22,6 +22,7 @@ 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.CategoryService;
import cn.lili.modules.goods.service.GoodsGalleryService;
@ -48,10 +49,9 @@ 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;
import java.util.*;
import java.util.stream.Collectors;
@ -109,6 +109,9 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
@Autowired
private PromotionGoodsService promotionGoodsService;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void add(List<Map<String, Object>> skuList, Goods goods) {
// 检查是否需要生成索引
@ -128,6 +131,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(List<Map<String, Object>> skuList, Goods goods, Boolean regeneratorSkuFlag) {
// 是否存在规格
if (skuList == null || skuList.isEmpty()) {
@ -543,15 +547,12 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
* @param goods 商品信息
*/
@Override
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void generateEs(Goods goods) {
// 不生成没有审核通过且没有上架的商品
if (!GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) {
return;
}
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GENERATOR_GOODS_INDEX.name();
//发送mq消息
rocketMQTemplate.asyncSend(destination, goods.getId(), RocketmqSendCallbackBuilder.commonCallback());
applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("生成商品索引事件", goods.getId()));
}
/**
@ -577,7 +578,8 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
* @param skuList sku列表
* @param goods 商品信息
*/
private List<GoodsSku> addGoodsSku(List<Map<String, Object>> skuList, Goods goods) {
@Transactional(rollbackFor = Exception.class)
List<GoodsSku> addGoodsSku(List<Map<String, Object>> skuList, Goods goods) {
List<GoodsSku> skus = new ArrayList<>();
for (Map<String, Object> skuVO : skuList) {
Map<String, Object> resultMap = this.add(skuVO, goods);

View File

@ -0,0 +1,19 @@
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;
}
}

View File

@ -0,0 +1,41 @@
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());
}
}

View File

@ -10,6 +10,7 @@ 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;
@ -23,6 +24,7 @@ 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;
import java.util.*;
@ -51,6 +53,9 @@ public abstract class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T e
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
/**
* 通用促销保存
* 调用顺序:
@ -263,10 +268,7 @@ public abstract class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T e
map.put("promotionsType", promotions.getClass().getName());
// 促销实体
map.put("promotions", promotions);
//更新商品促销消息
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_PROMOTIONS.name();
//发送mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(map), RocketmqSendCallbackBuilder.commonCallback());
applicationEventPublisher.publishEvent(new UpdateEsGoodsIndexPromotionsEvent("更新商品索引促销事件", JSONUtil.toJsonStr(map)));
}
}

View File

@ -7,6 +7,7 @@ import cn.lili.modules.promotion.service.CouponActivityItemService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@ -37,6 +38,7 @@ public class CouponActivityItemServiceImpl extends ServiceImpl<CouponActivityIte
* @param couponIds 优惠券id集合
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public void removeByCouponId(List<String> couponIds) {
this.remove(new LambdaQueryWrapper<CouponActivityItem>()
.in(CouponActivityItem::getCouponId, couponIds));

View File

@ -23,6 +23,7 @@ import cn.lili.modules.promotion.tools.PromotionTools;
import groovy.util.logging.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
@ -140,6 +141,7 @@ public class CouponActivityServiceImpl extends AbstractPromotionsServiceImpl<Cou
* @return 是否更新成功
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean updatePromotionsGoods(CouponActivity couponActivity) {
boolean result = super.updatePromotionsGoods(couponActivity);
if (couponActivity instanceof CouponActivityDTO
@ -189,7 +191,8 @@ public class CouponActivityServiceImpl extends AbstractPromotionsServiceImpl<Cou
* @param memberList 用户列表
* @param couponActivityItems 优惠券列表
*/
private void sendCoupon(List<Map<String, Object>> memberList, List<CouponActivityItem> couponActivityItems) {
@Transactional(rollbackFor = {Exception.class})
void sendCoupon(List<Map<String, Object>> memberList, List<CouponActivityItem> couponActivityItems) {
for (CouponActivityItem couponActivityItem : couponActivityItems) {
//获取优惠券

View File

@ -77,6 +77,7 @@ public class CouponServiceImpl extends AbstractPromotionsServiceImpl<CouponMappe
* @param receiveNum 领取数量
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public void receiveCoupon(String couponId, Integer receiveNum) {
Coupon coupon = this.getById(couponId);
if (coupon == null) {
@ -87,6 +88,7 @@ public class CouponServiceImpl extends AbstractPromotionsServiceImpl<CouponMappe
}
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean removePromotions(List<String> ids) {
//删除优惠券信息
this.memberCouponService.closeMemberCoupon(ids);
@ -103,6 +105,7 @@ public class CouponServiceImpl extends AbstractPromotionsServiceImpl<CouponMappe
* @param usedNum 使用数量
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public void usedCoupon(String couponId, Integer usedNum) {
Coupon coupon = this.getById(couponId);
if (coupon == null) {
@ -155,6 +158,7 @@ public class CouponServiceImpl extends AbstractPromotionsServiceImpl<CouponMappe
* @return 是否更新成功
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean updateStatus(List<String> ids, Long startTime, Long endTime) {
List<Coupon> list = this.list(new LambdaQueryWrapper<Coupon>().in(Coupon::getId, ids).eq(Coupon::getRangeDayType, CouponRangeDayEnum.DYNAMICTIME.name()));
if (!list.isEmpty()) {
@ -220,6 +224,7 @@ public class CouponServiceImpl extends AbstractPromotionsServiceImpl<CouponMappe
}
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean updatePromotionsGoods(Coupon promotions) {
boolean result = super.updatePromotionsGoods(promotions);
if (!PromotionsStatusEnum.CLOSE.name().equals(promotions.getPromotionStatus()) &&

View File

@ -109,6 +109,7 @@ public class FullDiscountServiceImpl extends AbstractPromotionsServiceImpl<FullD
* @return 是否更新成功
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean updatePromotionsGoods(FullDiscount promotions) {
boolean result = super.updatePromotionsGoods(promotions);
if (!PromotionsStatusEnum.CLOSE.name().equals(promotions.getPromotionStatus())

View File

@ -144,6 +144,7 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
}
@Override
@Transactional(rollbackFor = Exception.class)
public void addSeckillApply(String seckillId, String storeId, List<SeckillApplyVO> seckillApplyList) {
Seckill seckill = this.seckillService.getById(seckillId);
if (seckill == null) {

View File

@ -39,9 +39,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 秒杀活动业务层实现
@ -153,19 +151,7 @@ public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMap
}
}
if (!seckillApplies.isEmpty()) {
log.info("更新限时抢购商品状态:{}", seckill);
String promotionKey = PromotionTypeEnum.SECKILL.name() + "-" + seckill.getId();
Map<String, Object> map = new HashMap<>();
// es促销key
map.put("esPromotionKey", promotionKey);
// 促销类型全路径名
map.put("promotionsType", Seckill.class.getName());
// 促销实体
map.put("promotions", seckill);
//更新商品促销消息
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_PROMOTIONS.name();
//发送mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(map), RocketmqSendCallbackBuilder.commonCallback());
this.updateEsGoodsIndex(seckill);
}
}
}

16
pom.xml
View File

@ -21,18 +21,18 @@
<revision>4.2.3</revision>
<docker-registry>registry.cn-beijing.aliyuncs.com/lili-images</docker-registry>
<images-version>1</images-version>
<alipay-sdk-version>4.13.40.ALL</alipay-sdk-version>
<mysql-connector-version>5.1.48</mysql-connector-version>
<alipay-sdk-version>4.22.17.ALL</alipay-sdk-version>
<mysql-connector-version>8.0.27</mysql-connector-version>
<mybatis-plus-version>3.4.3.4</mybatis-plus-version>
<Hutool-version>5.7.16</Hutool-version>
<Hutool-version>5.7.18</Hutool-version>
<TinyPinyin-verions>2.0.3.RELEASE</TinyPinyin-verions>
<jasypt-version>3.0.0</jasypt-version>
<neetl-version>2.9.10</neetl-version>
<lombok-version>1.18.22</lombok-version>
<aliyun-version>4.5.18</aliyun-version>
<aliyun-sdk-oss-version>3.11.1</aliyun-sdk-oss-version>
<aliyun-sdk-dysms-version>2.0.1</aliyun-sdk-dysms-version>
<rocketmq-version>2.1.1</rocketmq-version>
<aliyun-sdk-dysms-version>2.0.8</aliyun-sdk-dysms-version>
<rocketmq-version>2.2.1</rocketmq-version>
<jwt-version>0.10.7</jwt-version>
<antlr4-runtime-version>4.7.2</antlr4-runtime-version>
<sharding-jdbc-version>4.0.0</sharding-jdbc-version>
@ -48,12 +48,12 @@
<de.codecentric>2.3.1</de.codecentric>
<userAgentUtils>1.21</userAgentUtils>
<interceptor-api>1.2</interceptor-api>
<poi-version>4.1.2</poi-version>
<poi-ooxml-version>4.1.2</poi-ooxml-version>
<poi-version>5.1.0</poi-version>
<poi-ooxml-version>5.1.0</poi-ooxml-version>
<logstash-logback-encoder>6.6</logstash-logback-encoder>
<zxing>3.4.1</zxing>
<slf4j-api>1.7.28</slf4j-api>
<xk-time>2.2.0</xk-time>
<xk-time>3.2.3</xk-time>
<commons-text>1.4</commons-text>
<enjoy.version>4.3</enjoy.version>
<xxl-job>2.3.0</xxl-job>