Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop

This commit is contained in:
Chopper 2022-06-23 09:11:37 +08:00
commit 8fbc7b9f5c
19 changed files with 156 additions and 209 deletions

View File

@ -11,7 +11,6 @@ import org.redisson.config.ClusterServersConfig;
import org.redisson.config.Config; import org.redisson.config.Config;
import org.redisson.config.SentinelServersConfig; import org.redisson.config.SentinelServersConfig;
import org.redisson.config.SingleServerConfig; import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@ -56,13 +55,11 @@ import java.util.Map;
public class RedisConfig extends CachingConfigurerSupport { public class RedisConfig extends CachingConfigurerSupport {
private static final String REDIS_PREFIX = "redis://";
@Value("${lili.cache.timeout:7200}") @Value("${lili.cache.timeout:7200}")
private Integer timeout; private Integer timeout;
@Autowired
private RedisProperties redisProperties;
/** /**
* 当有多个管理器的时候必须使用该注解在一个管理器上注释表示该管理器为默认的管理器 * 当有多个管理器的时候必须使用该注解在一个管理器上注释表示该管理器为默认的管理器
* *
@ -101,7 +98,7 @@ public class RedisConfig extends CachingConfigurerSupport {
public RedisTemplate<Object, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { public RedisTemplate<Object, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>(); RedisTemplate<Object, Object> template = new RedisTemplate<>();
//使用fastjson序列化 //使用fastjson序列化
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class); FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
//value值的序列化采用fastJsonRedisSerializer //value值的序列化采用fastJsonRedisSerializer
template.setValueSerializer(fastJsonRedisSerializer); template.setValueSerializer(fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer); template.setHashValueSerializer(fastJsonRedisSerializer);
@ -113,7 +110,7 @@ public class RedisConfig extends CachingConfigurerSupport {
} }
@Bean(destroyMethod = "shutdown") @Bean(destroyMethod = "shutdown")
public RedissonClient redisson() { public RedissonClient redisson(RedisProperties redisProperties) {
Config config = new Config(); Config config = new Config();
if (redisProperties.getSentinel() != null && !redisProperties.getSentinel().getNodes().isEmpty()) { if (redisProperties.getSentinel() != null && !redisProperties.getSentinel().getNodes().isEmpty()) {
// 哨兵模式 // 哨兵模式
@ -121,7 +118,7 @@ public class RedisConfig extends CachingConfigurerSupport {
sentinelServersConfig.setMasterName(redisProperties.getSentinel().getMaster()); sentinelServersConfig.setMasterName(redisProperties.getSentinel().getMaster());
List<String> sentinelAddress = new ArrayList<>(); List<String> sentinelAddress = new ArrayList<>();
for (String node : redisProperties.getCluster().getNodes()) { for (String node : redisProperties.getCluster().getNodes()) {
sentinelAddress.add("redis://" + node); sentinelAddress.add(REDIS_PREFIX + node);
} }
sentinelServersConfig.setSentinelAddresses(sentinelAddress); sentinelServersConfig.setSentinelAddresses(sentinelAddress);
if (CharSequenceUtil.isNotEmpty(redisProperties.getSentinel().getPassword())) { if (CharSequenceUtil.isNotEmpty(redisProperties.getSentinel().getPassword())) {
@ -132,7 +129,7 @@ public class RedisConfig extends CachingConfigurerSupport {
ClusterServersConfig clusterServersConfig = config.useClusterServers(); ClusterServersConfig clusterServersConfig = config.useClusterServers();
List<String> clusterNodes = new ArrayList<>(); List<String> clusterNodes = new ArrayList<>();
for (String node : redisProperties.getCluster().getNodes()) { for (String node : redisProperties.getCluster().getNodes()) {
clusterNodes.add("redis://" + node); clusterNodes.add(REDIS_PREFIX + node);
} }
clusterServersConfig.setNodeAddresses(clusterNodes); clusterServersConfig.setNodeAddresses(clusterNodes);
if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) { if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) {
@ -140,7 +137,7 @@ public class RedisConfig extends CachingConfigurerSupport {
} }
} else { } else {
SingleServerConfig singleServerConfig = config.useSingleServer(); SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig.setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort()); singleServerConfig.setAddress(REDIS_PREFIX + redisProperties.getHost() + ":" + redisProperties.getPort());
if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) { if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) {
singleServerConfig.setPassword(redisProperties.getPassword()); singleServerConfig.setPassword(redisProperties.getPassword());
} }

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -89,6 +89,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
} }
return memberTokenGenerate.createToken(member, longTerm); return memberTokenGenerate.createToken(member, longTerm);
} catch (NoPermissionException e) { } catch (NoPermissionException e) {
log.error("联合登陆失败:", e);
throw e; throw e;
} }
} }
@ -121,7 +122,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
@Override @Override
public void bind(String unionId, String type) { 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); Connect connect = new Connect(authUser.getId(), unionId, type);
this.save(connect); this.save(connect);
} }
@ -160,6 +161,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
@Override @Override
@Transactional
public Token miniProgramAutoLogin(WechatMPLoginParams params) { public Token miniProgramAutoLogin(WechatMPLoginParams params) {
Object cacheData = cache.get(CachePrefix.WECHAT_SESSION_PARAMS.getPrefix() + params.getUuid()); Object cacheData = cache.get(CachePrefix.WECHAT_SESSION_PARAMS.getPrefix() + params.getUuid());
@ -186,8 +188,8 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
/** /**
* 通过微信返回等code 获取openid 等信息 * 通过微信返回等code 获取openid 等信息
* *
* @param code * @param code 微信code
* @return * @return 微信返回的信息
*/ */
public JSONObject getConnect(String code) { public JSONObject getConnect(String code) {
WechatConnectSettingItem setting = getWechatMPSetting(); WechatConnectSettingItem setting = getWechatMPSetting();
@ -208,11 +210,12 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
* @param params 微信小程序自动登录参数 * @param params 微信小程序自动登录参数
* @param openId 微信openid * @param openId 微信openid
* @param unionId 微信unionid * @param unionId 微信unionid
* @return * @return token
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Token phoneMpBindAndLogin(String sessionKey, WechatMPLoginParams params, String openId, String unionId) { 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); JSONObject userInfo = this.getUserInfo(encryptedData, sessionKey, iv);
log.info("联合登陆返回:{}", userInfo.toString()); log.info("联合登陆返回:{}", userInfo.toString());
String phone = (String) userInfo.get("purePhoneNumber"); String phone = (String) userInfo.get("purePhoneNumber");
@ -259,9 +262,9 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
* 这样微信小程序注册之后其他app 公众号页面都可以实现绑定自动登录功能 * 这样微信小程序注册之后其他app 公众号页面都可以实现绑定自动登录功能
* </p> * </p>
* *
* @param openId * @param openId 微信openid
* @param unionId * @param unionId 微信unionid
* @param member * @param member 会员
*/ */
private void bindMpMember(String openId, String unionId, Member member) { private void bindMpMember(String openId, String unionId, Member member) {
@ -272,7 +275,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
lambdaQueryWrapper.eq(Connect::getUnionId, unionId); lambdaQueryWrapper.eq(Connect::getUnionId, unionId);
lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT.name()); lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT.name());
List<Connect> connects = this.list(lambdaQueryWrapper); List<Connect> connects = this.list(lambdaQueryWrapper);
if (connects.size() == 0) { if (connects.isEmpty()) {
Connect connect = new Connect(); Connect connect = new Connect();
connect.setUnionId(unionId); connect.setUnionId(unionId);
connect.setUserId(member.getId()); connect.setUserId(member.getId());
@ -281,7 +284,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
} }
}//如果openid 不为空 则为账号绑定openid }//如果openid 不为空 则为账号绑定openid
if (CharSequenceUtil.isNotEmpty(openId)) { if (CharSequenceUtil.isNotEmpty(openId)) {
LambdaQueryWrapper<Connect> lambdaQueryWrapper = new LambdaQueryWrapper(); LambdaQueryWrapper<Connect> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(Connect::getUnionId, openId); lambdaQueryWrapper.eq(Connect::getUnionId, openId);
lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT_MP_OPEN_ID.name()); lambdaQueryWrapper.eq(Connect::getUnionType, ConnectEnum.WECHAT_MP_OPEN_ID.name());
List<Connect> connects = this.list(lambdaQueryWrapper); List<Connect> connects = this.list(lambdaQueryWrapper);

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -9,6 +9,7 @@ import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix; import cn.lili.cache.CachePrefix;
import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.event.TransactionCommitSendMQEvent;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.context.UserContext; 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.GoodsSkuVO;
import cn.lili.modules.goods.entity.vos.GoodsVO; import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.goods.entity.vos.SpecValueVO; 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.mapper.GoodsSkuMapper;
import cn.lili.modules.goods.service.*; import cn.lili.modules.goods.service.*;
import cn.lili.modules.goods.sku.GoodsSkuBuilder; import cn.lili.modules.goods.sku.GoodsSkuBuilder;
@ -362,10 +362,10 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
boolean update = this.update(updateWrapper); boolean update = this.update(updateWrapper);
if (Boolean.TRUE.equals(update)) { if (Boolean.TRUE.equals(update)) {
if (GoodsStatusEnum.UPPER.name().equals(marketEnable)) { 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)) { } else if (GoodsStatusEnum.DOWN.name().equals(marketEnable)) {
cache.vagueDel(CachePrefix.GOODS_SKU.getPrefix()); 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<GoodsSkuMapper, GoodsSku> i
if (!GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) { if (!GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) {
return; 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 @Override

View File

@ -24,6 +24,7 @@ public class ManagerMemberEditDTO {
@ApiModelProperty(value = "会员用户名,用户名不能进行修改", required = true) @ApiModelProperty(value = "会员用户名,用户名不能进行修改", required = true)
@NotNull(message = "会员用户名不能为空") @NotNull(message = "会员用户名不能为空")
private String id; private String id;
@ApiModelProperty(value = "会员用户名,用户名不能进行修改", required = true) @ApiModelProperty(value = "会员用户名,用户名不能进行修改", required = true)
@NotNull(message = "会员用户名不能为空") @NotNull(message = "会员用户名不能为空")
private String username; private String username;
@ -48,7 +49,7 @@ public class ManagerMemberEditDTO {
private Integer sex; private Integer sex;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "会员生日") @ApiModelProperty(value = "会员生日")
private Date birthday; private Date birthday;

View File

@ -6,6 +6,7 @@ import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
@ -19,6 +20,7 @@ import java.util.Map;
*/ */
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class CartSkuVO extends CartBase implements Serializable { public class CartSkuVO extends CartBase implements Serializable {

View File

@ -10,6 +10,7 @@ import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter; import cn.hutool.poi.excel.ExcelWriter;
import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.event.TransactionCommitSendMQEvent;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.OperationalJudgment; 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.poi.ss.util.CellRangeAddressList;
import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -144,6 +146,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
@Autowired @Autowired
private TradeService tradeService; private TradeService tradeService;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void intoDB(TradeDTO tradeDTO) { public void intoDB(TradeDTO tradeDTO) {
@ -445,12 +451,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
//获取订单信息 //获取订单信息
Order order = this.getBySn(orderSn); Order order = this.getBySn(orderSn);
//获取踪迹信息 //获取踪迹信息
String str=order.getConsigneeMobile(); String str = order.getConsigneeMobile();
return logisticsService.getLogistic(order.getLogisticsCode(), order.getLogisticsNo(), str.substring(str.length()-4)); return logisticsService.getLogistic(order.getLogisticsCode(), order.getLogisticsNo(), str.substring(str.length() - 4));
} }
@Override @Override
@OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#verificationCode+']'", orderSn = "#orderSn") @OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#verificationCode+']'", orderSn = "#orderSn")
@Transactional(rollbackFor = Exception.class)
public Order take(String orderSn, String verificationCode) { public Order take(String orderSn, String verificationCode) {
//获取订单信息 //获取订单信息
@ -495,7 +502,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
* @param order 订单 * @param order 订单
* @param orderSn 订单编号 * @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); this.updateStatus(orderSn, OrderStatusEnum.COMPLETED);
//修改订单货物可以进行评价 //修改订单货物可以进行评价
@ -534,10 +542,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void sendUpdateStatusMessage(OrderMessage orderMessage) { public void sendUpdateStatusMessage(OrderMessage orderMessage) {
String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name(); applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("发送订单变更mq消息", rocketmqCustomProperties.getOrderTopic(), OrderTagsEnum.STATUS_CHANGE.name(), JSONUtil.toJsonStr(orderMessage)));
//发送订单变更mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback());
} }
@Override @Override
@ -621,6 +628,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void batchDeliver(MultipartFile files) { public void batchDeliver(MultipartFile files) {
InputStream inputStream; InputStream inputStream;
@ -777,9 +785,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
/** /**
* 订单状态变更消息 * 订单状态变更消息
* *
* @param order * @param order 订单信息
*/ */
private void orderStatusMessage(Order order) { @Transactional(rollbackFor = Exception.class)
public void orderStatusMessage(Order order) {
OrderMessage orderMessage = new OrderMessage(); OrderMessage orderMessage = new OrderMessage();
orderMessage.setOrderSn(order.getSn()); orderMessage.setOrderSn(order.getSn());
orderMessage.setNewStatus(OrderStatusEnum.valueOf(order.getOrderStatus())); orderMessage.setNewStatus(OrderStatusEnum.valueOf(order.getOrderStatus()));
@ -811,10 +820,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
List<Order> list = this.getPintuanOrder(pintuanId, parentOrderSn); List<Order> list = this.getPintuanOrder(pintuanId, parentOrderSn);
int count = list.size(); int count = list.size();
if (count == 1) { if (count == 1) {
//如果为开团订单则发布一个小时的延时任务时间到达后如果未成团则自动结束未开启虚拟成团的情况下 //如果为开团订单则发布一个24小时的延时任务时间到达后如果未成团则自动结束未开启虚拟成团的情况下
PintuanOrderMessage pintuanOrderMessage = new PintuanOrderMessage(); PintuanOrderMessage pintuanOrderMessage = new PintuanOrderMessage();
//开团结束时间 //开团结束时间
long startTime = DateUtil.offsetMinute(new Date(), 2).getTime(); long startTime = DateUtil.offsetHour(new Date(), 24).getTime();
pintuanOrderMessage.setOrderSn(parentOrderSn); pintuanOrderMessage.setOrderSn(parentOrderSn);
pintuanOrderMessage.setPintuanId(pintuanId); pintuanOrderMessage.setPintuanId(pintuanId);
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
@ -906,7 +915,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
* *
* @param orderSn 订单编号 * @param orderSn 订单编号
*/ */
private void normalOrderConfirm(String orderSn) { @Transactional(rollbackFor = Exception.class)
public void normalOrderConfirm(String orderSn) {
//修改订单 //修改订单
this.update(new LambdaUpdateWrapper<Order>() this.update(new LambdaUpdateWrapper<Order>()
.eq(Order::getSn, orderSn) .eq(Order::getSn, orderSn)
@ -925,7 +935,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
* *
* @param orderSn 订单编号 * @param orderSn 订单编号
*/ */
private void virtualOrderConfirm(String orderSn) { @Transactional(rollbackFor = Exception.class)
public void virtualOrderConfirm(String orderSn) {
//修改订单 //修改订单
this.update(new LambdaUpdateWrapper<Order>() this.update(new LambdaUpdateWrapper<Order>()
.eq(Order::getSn, orderSn) .eq(Order::getSn, orderSn)

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -4,6 +4,7 @@ import cn.hutool.core.map.MapBuilder;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.event.TransactionCommitSendMQEvent;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.vo.PageVO; 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.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.search.BasePromotionsSearchParams; import cn.lili.modules.promotion.entity.dto.search.BasePromotionsSearchParams;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; 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.AbstractPromotionsService;
import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.promotion.tools.PromotionTools;
import cn.lili.mybatis.util.PageUtil; import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum; import cn.lili.rocketmq.tags.GoodsTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -48,12 +46,6 @@ public abstract class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T e
@Autowired @Autowired
private RocketmqCustomProperties rocketmqCustomProperties; private RocketmqCustomProperties rocketmqCustomProperties;
/**
* rocketMq
*/
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Autowired @Autowired
private ApplicationEventPublisher applicationEventPublisher; private ApplicationEventPublisher applicationEventPublisher;
@ -253,13 +245,12 @@ public abstract class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T e
* @param promotions 促销实体 * @param promotions 促销实体
*/ */
@Override @Override
@Transactional(rollbackFor = {Exception.class})
public void updateEsGoodsIndex(T promotions) { public void updateEsGoodsIndex(T promotions) {
if (promotions.getStartTime() == null && promotions.getEndTime() == null) { if (promotions.getStartTime() == null && promotions.getEndTime() == null) {
Map<Object, Object> build = MapBuilder.create().put("promotionKey", this.getPromotionType() + "-" + promotions.getId()).put("scopeId", promotions.getScopeId()).build(); Map<Object, Object> build = MapBuilder.create().put("promotionKey", this.getPromotionType() + "-" + promotions.getId()).put("scopeId", promotions.getScopeId()).build();
//删除商品促销消息 //删除商品促销消息
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.DELETE_GOODS_INDEX_PROMOTIONS.name(); applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("删除商品促销事件", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.DELETE_GOODS_INDEX_PROMOTIONS.name(), JSONUtil.toJsonStr(build)));
//发送mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(build), RocketmqSendCallbackBuilder.commonCallback());
} else { } else {
String esPromotionKey = this.getPromotionType().name() + "-" + promotions.getId(); String esPromotionKey = this.getPromotionType().name() + "-" + promotions.getId();
@ -270,7 +261,7 @@ public abstract class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T e
map.put("promotionsType", promotions.getClass().getName()); map.put("promotionsType", promotions.getClass().getName());
// 促销实体 // 促销实体
map.put("promotions", promotions); 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)));
} }
} }

View File

@ -299,7 +299,7 @@ public class PintuanServiceImpl extends AbstractPromotionsServiceImpl<PintuanMap
for (PromotionGoods promotionGood : promotionGoods) { for (PromotionGoods promotionGood : promotionGoods) {
if (goodsSkuService.getGoodsSkuByIdFromCache(promotionGood.getSkuId()) == null) { if (goodsSkuService.getGoodsSkuByIdFromCache(promotionGood.getSkuId()) == null) {
log.error("商品[" + promotionGood.getGoodsName() + "]不存在或处于不可售卖状态!"); log.error("商品[" + promotionGood.getGoodsName() + "]不存在或处于不可售卖状态!");
throw new ServiceException(); throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]不存在或处于不可售卖状态!");
} }
//查询是否在同一时间段参与了拼团活动 //查询是否在同一时间段参与了拼团活动
Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getId()); Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getId());

View File

@ -133,12 +133,15 @@ public class PromotionTools {
promotionGoods.setStoreName(promotion.getStoreName()); promotionGoods.setStoreName(promotion.getStoreName());
} }
promotionGoods.setTitle(promotion.getPromotionName()); promotionGoods.setTitle(promotion.getPromotionName());
if (promotionGoods.getStartTime() == null) { // 如果是秒杀活动保留原时间
if (promotionGoods.getStartTime() == null || !PromotionTypeEnum.SECKILL.equals(promotionTypeEnum)) {
promotionGoods.setStartTime(promotion.getStartTime()); promotionGoods.setStartTime(promotion.getStartTime());
} }
if (promotionGoods.getEndTime() == null) { if (promotionGoods.getStartTime() == null || !PromotionTypeEnum.SECKILL.equals(promotionTypeEnum)) {
promotionGoods.setEndTime(promotion.getEndTime()); promotionGoods.setEndTime(promotion.getEndTime());
} }
promotionGoods.setStartTime(promotion.getStartTime());
promotionGoods.setEndTime(promotion.getEndTime());
promotionGoods.setPromotionType(promotionTypeEnum.name()); promotionGoods.setPromotionType(promotionTypeEnum.name());
promotionGoods.setNum(0); promotionGoods.setNum(0);
promotionGoods.setDeleteFlag(promotion.getDeleteFlag()); promotionGoods.setDeleteFlag(promotion.getDeleteFlag());

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
@ -18,6 +19,7 @@ import javax.validation.constraints.NotEmpty;
@Data @Data
@TableName("li_custom_words") @TableName("li_custom_words")
@ApiModel(value = "自定义分词") @ApiModel(value = "自定义分词")
@EqualsAndHashCode(callSuper = true)
public class CustomWords extends BaseEntity { public class CustomWords extends BaseEntity {
private static final long serialVersionUID = 650889506808657977L; private static final long serialVersionUID = 650889506808657977L;

View File

@ -4,7 +4,6 @@ import cn.lili.common.vo.PageVO;
import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo; import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
import cn.lili.modules.search.entity.dto.HotWordsDTO;
import org.springframework.data.elasticsearch.core.SearchPage; import org.springframework.data.elasticsearch.core.SearchPage;
import java.util.List; import java.util.List;

View File

@ -25,7 +25,6 @@ import org.elasticsearch.index.query.Operator;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder; import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.GaussDecayFunctionBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.aggregations.*; import org.elasticsearch.search.aggregations.*;
import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested; import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested;
@ -56,6 +55,9 @@ import java.util.*;
@Service @Service
public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
// 最小分词匹配
private static final String MINIMUM_SHOULD_MATCH = "20%";
private static final String ATTR_PATH = "attrList"; private static final String ATTR_PATH = "attrList";
private static final String ATTR_VALUE = "attrList.value"; private static final String ATTR_VALUE = "attrList.value";
private static final String ATTR_NAME = "attrList.name"; private static final String ATTR_NAME = "attrList.name";
@ -364,16 +366,10 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
//关键字检索 //关键字检索
if (CharSequenceUtil.isEmpty(searchDTO.getKeyword())) { if (CharSequenceUtil.isEmpty(searchDTO.getKeyword())) {
List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>(); List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = this.buildFunctionSearch();
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);
FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()]; FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];
filterFunctionBuilders.toArray(builders); filterFunctionBuilders.toArray(builders);
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders) FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), builders)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM) .scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.setMinScore(2); .setMinScore(2);
//聚合搜索则将结果放入过滤条件 //聚合搜索则将结果放入过滤条件
@ -529,47 +525,40 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
* @param keyword 关键字 * @param keyword 关键字
*/ */
private void keywordSearch(BoolQueryBuilder filterBuilder, String keyword) { private void keywordSearch(BoolQueryBuilder filterBuilder, String keyword) {
List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>();
if (keyword.contains(" ")) { List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = this.buildFunctionSearch();
for (String s : keyword.split(" ")) {
filterFunctionBuilders.addAll(this.buildKeywordSearch(s)); //分词匹配
} // operator AND 需全部分词匹配 OR 需配置 minimumShouldMatch最小分词匹配数不设置默认为1
} else { MatchQueryBuilder goodsNameMatchQuery = QueryBuilders.matchQuery("goodsName", keyword).operator(Operator.OR).minimumShouldMatch(MINIMUM_SHOULD_MATCH);
filterFunctionBuilders = this.buildKeywordSearch(keyword);
}
FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()]; FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];
filterFunctionBuilders.toArray(builders); filterFunctionBuilders.toArray(builders);
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders) FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(goodsNameMatchQuery, builders)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM) .scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.setMinScore(2); .setMinScore(2);
//聚合搜索则将结果放入过滤条件 //聚合搜索则将结果放入过滤条件
filterBuilder.must(functionScoreQueryBuilder); filterBuilder.must(functionScoreQueryBuilder);
filterBuilder.should(QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("goodsName", keyword).boost(10)));
} }
/** /**
* 构造关键字查询 * 构造关键字查询
* *
* @param keyword 关键字
* @return 构造查询的集合 * @return 构造查询的集合
*/ */
private List<FunctionScoreQueryBuilder.FilterFunctionBuilder> buildKeywordSearch(String keyword) { private List<FunctionScoreQueryBuilder.FilterFunctionBuilder> buildFunctionSearch() {
List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>(); List<FunctionScoreQueryBuilder.FilterFunctionBuilder> 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); // GaussDecayFunctionBuilder skuNoScore = ScoreFunctionBuilders.gaussDecayFunction("skuSource", 100, 10).setWeight(2);
FunctionScoreQueryBuilder.FilterFunctionBuilder skuNoBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(goodsNameQuery, skuNoScore); // 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); filterFunctionBuilders.add(skuNoBuilder);
FieldValueFactorFunctionBuilder buyCountScore = ScoreFunctionBuilders.fieldValueFactorFunction("buyCount").modifier(FieldValueFactorFunction.Modifier.LOG1P).setWeight(6); FieldValueFactorFunctionBuilder buyCountScore = ScoreFunctionBuilders.fieldValueFactorFunction("buyCount").modifier(FieldValueFactorFunction.Modifier.LOG1P).setWeight(3);
FunctionScoreQueryBuilder.FilterFunctionBuilder buyCountBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(goodsNameQuery, buyCountScore); FunctionScoreQueryBuilder.FilterFunctionBuilder buyCountBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(buyCountScore);
filterFunctionBuilders.add(buyCountBuilder); filterFunctionBuilders.add(buyCountBuilder);
return filterFunctionBuilders; return filterFunctionBuilders;
} }

View File

@ -84,7 +84,7 @@ public class MemberWalletServiceImpl extends ServiceImpl<MemberWalletMapper, Mem
QueryWrapper<MemberWallet> queryWrapper = new QueryWrapper<>(); QueryWrapper<MemberWallet> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("member_id", memberId); queryWrapper.eq("member_id", memberId);
//执行查询 //执行查询
MemberWallet memberWallet = this.baseMapper.selectOne(queryWrapper); MemberWallet memberWallet = this.getOne(queryWrapper, false);
//如果没有钱包则创建钱包 //如果没有钱包则创建钱包
if (memberWallet == null) { if (memberWallet == null) {
memberWallet = this.save(memberId, memberService.getById(memberId).getUsername()); memberWallet = this.save(memberId, memberService.getById(memberId).getUsername());
@ -186,7 +186,7 @@ public class MemberWalletServiceImpl extends ServiceImpl<MemberWalletMapper, Mem
*/ */
private MemberWallet checkMemberWallet(String memberId) { private MemberWallet checkMemberWallet(String memberId) {
//获取会员预存款信息 //获取会员预存款信息
MemberWallet memberWallet = this.getOne(new QueryWrapper<MemberWallet>().eq("member_id", memberId)); MemberWallet memberWallet = this.getOne(new QueryWrapper<MemberWallet>().eq("member_id", memberId), false);
//如果会员预存款信息不存在则同步重新建立预存款信息 //如果会员预存款信息不存在则同步重新建立预存款信息
if (memberWallet == null) { if (memberWallet == null) {
Member member = memberService.getById(memberId); Member member = memberService.getById(memberId);