merge conflict origin/master

This commit is contained in:
paulGao 2022-02-11 15:33:28 +08:00
commit 5c78711d8e
216 changed files with 1473 additions and 789 deletions

View File

@ -54,3 +54,11 @@ ALTER TABLE li_goods RENAME COLUMN is_auth TO auth_flag;
ALTER TABLE li_goods_sku RENAME COLUMN is_promotion TO promotion_flag; ALTER TABLE li_goods_sku RENAME COLUMN is_promotion TO promotion_flag;
ALTER TABLE li_goods_sku RENAME COLUMN is_auth TO auth_flag; ALTER TABLE li_goods_sku RENAME COLUMN is_auth TO auth_flag;
-- 增加会员表索引
ALTER TABLE li_member ADD INDEX query_mobile (`mobile`) COMMENT 'query_member';
-- 会员签到唯一索引 惠券查询索引
ALTER TABLE li_member_sign ADD INDEX query_create_time (`create_time`) COMMENT 'query_create_time';
ALTER TABLE li_member_sign ADD INDEX query_member_id (`member_id`) COMMENT 'query_member_id';
ALTER TABLE li_member_sign add unique uk_member_day (member_id, create_time) COMMENT 'uk_member_day';

View File

@ -75,7 +75,7 @@ PS手机验证码为 111111
#### 平台管理端功能 #### 平台管理端功能
![平台管理端功能](https://pickmall.cn/assets/imgs/other/managerList.jpg) ![平台管理端功能](https://pickmall.cn/assets/imgs/other/managerList1.jpg)

View File

@ -1,5 +1,6 @@
package cn.lili.controller.distribution; package cn.lili.controller.distribution;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
@ -49,6 +50,7 @@ public class DistributionCashBuyerController {
private DistributionCashService distributorCashService; private DistributionCashService distributorCashService;
@PreventDuplicateSubmissions
@ApiOperation(value = "分销员提现") @ApiOperation(value = "分销员提现")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "price", value = "申请金额", required = true, paramType = "query", dataType = "double") @ApiImplicitParam(name = "price", value = "申请金额", required = true, paramType = "query", dataType = "double")

View File

@ -1,5 +1,6 @@
package cn.lili.controller.distribution; package cn.lili.controller.distribution;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
@ -50,6 +51,7 @@ public class DistributionGoodsBuyerController {
return ResultUtil.data(distributionGoodsService.goodsPage(distributionGoodsSearchParams)); return ResultUtil.data(distributionGoodsService.goodsPage(distributionGoodsSearchParams));
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "选择分销商品") @ApiOperation(value = "选择分销商品")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "distributionGoodsId", value = "分销ID", required = true, dataType = "String", paramType = "path"), @ApiImplicitParam(name = "distributionGoodsId", value = "分销ID", required = true, dataType = "String", paramType = "path"),

View File

@ -1,5 +1,6 @@
package cn.lili.controller.member; package cn.lili.controller.member;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.enums.SwitchEnum; import cn.lili.common.enums.SwitchEnum;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
@ -37,10 +38,11 @@ public class MemberEvaluationBuyerController {
@Autowired @Autowired
private MemberEvaluationService memberEvaluationService; private MemberEvaluationService memberEvaluationService;
@PreventDuplicateSubmissions
@ApiOperation(value = "添加会员评价") @ApiOperation(value = "添加会员评价")
@PostMapping @PostMapping
public ResultMessage<MemberEvaluationDTO> save(@Valid MemberEvaluationDTO memberEvaluationDTO) { public ResultMessage<MemberEvaluationDTO> save(@Valid MemberEvaluationDTO memberEvaluationDTO) {
return ResultUtil.data(memberEvaluationService.addMemberEvaluation(memberEvaluationDTO)); return ResultUtil.data(memberEvaluationService.addMemberEvaluation(memberEvaluationDTO, true));
} }
@ApiOperation(value = "查看会员评价详情") @ApiOperation(value = "查看会员评价详情")

View File

@ -1,5 +1,6 @@
package cn.lili.controller.member; package cn.lili.controller.member;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.MemberSign; import cn.lili.modules.member.entity.dos.MemberSign;
@ -27,6 +28,8 @@ public class MemberSignBuyerController {
@Autowired @Autowired
private MemberSignService memberSignService; private MemberSignService memberSignService;
@PreventDuplicateSubmissions
@PostMapping @PostMapping
@ApiOperation(value = "会员签到") @ApiOperation(value = "会员签到")
public ResultMessage<Boolean> memberSign() { public ResultMessage<Boolean> memberSign() {

View File

@ -1,5 +1,6 @@
package cn.lili.controller.order; package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
@ -77,6 +78,7 @@ public class AfterSaleBuyerController {
return ResultUtil.data(afterSaleService.getAfterSaleVO(sn)); return ResultUtil.data(afterSaleService.getAfterSaleVO(sn));
} }
@PreventDuplicateSubmissions
@PostMapping(value = "/save/{orderItemSn}") @PostMapping(value = "/save/{orderItemSn}")
@ApiImplicitParam(name = "orderItemSn", value = "订单货物编号", required = true, paramType = "query") @ApiImplicitParam(name = "orderItemSn", value = "订单货物编号", required = true, paramType = "query")
@ApiOperation(value = "申请售后") @ApiOperation(value = "申请售后")
@ -101,6 +103,7 @@ public class AfterSaleBuyerController {
return ResultUtil.data(afterSaleService.buyerDelivery(afterSaleSn, logisticsNo, logisticsId, mDeliverTime)); return ResultUtil.data(afterSaleService.buyerDelivery(afterSaleSn, logisticsNo, logisticsId, mDeliverTime));
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "售后,取消售后") @ApiOperation(value = "售后,取消售后")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, dataType = "String", paramType = "path")

View File

@ -1,5 +1,6 @@
package cn.lili.controller.order; package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
@ -235,6 +236,7 @@ public class CartController {
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "创建交易") @ApiOperation(value = "创建交易")
@PostMapping(value = "/create/trade", consumes = "application/json", produces = "application/json") @PostMapping(value = "/create/trade", consumes = "application/json", produces = "application/json")
public ResultMessage<Object> crateTrade(@RequestBody TradeParams tradeParams) { public ResultMessage<Object> crateTrade(@RequestBody TradeParams tradeParams) {

View File

@ -1,5 +1,6 @@
package cn.lili.controller.order; package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
@ -62,6 +63,7 @@ public class OrderBuyerController {
return ResultUtil.data(orderDetailVO); return ResultUtil.data(orderDetailVO);
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "确认收货") @ApiOperation(value = "确认收货")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, paramType = "path") @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, paramType = "path")
@ -80,6 +82,7 @@ public class OrderBuyerController {
return ResultUtil.success(); return ResultUtil.success();
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "取消订单") @ApiOperation(value = "取消订单")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path"), @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path"),
@ -91,6 +94,7 @@ public class OrderBuyerController {
return ResultUtil.success(); return ResultUtil.success();
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "删除订单") @ApiOperation(value = "删除订单")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path")
@ -113,6 +117,7 @@ public class OrderBuyerController {
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "开票") @ApiOperation(value = "开票")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path")

View File

@ -1,5 +1,6 @@
package cn.lili.controller.order; package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.OperationalJudgment;
@ -66,6 +67,7 @@ public class OrderComplaintBuyerController {
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "添加交易投诉") @ApiOperation(value = "添加交易投诉")
@PostMapping @PostMapping
public ResultMessage<OrderComplaint> add(@Valid OrderComplaintDTO orderComplaintDTO) { public ResultMessage<OrderComplaint> add(@Valid OrderComplaintDTO orderComplaintDTO) {
@ -85,6 +87,7 @@ public class OrderComplaintBuyerController {
return ResultUtil.data(communicationVO); return ResultUtil.data(communicationVO);
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "取消售后") @ApiOperation(value = "取消售后")
@ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path") @ApiImplicitParam(name = "id", value = "投诉单ID", required = true, paramType = "path")
@PutMapping(value = "/status/{id}") @PutMapping(value = "/status/{id}")

View File

@ -1,5 +1,6 @@
package cn.lili.controller.order; package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
@ -41,6 +42,7 @@ public class ReceiptBuyerController {
return ResultUtil.data(this.receiptService.getReceiptData(searchParams, pageVO)); return ResultUtil.data(this.receiptService.getReceiptData(searchParams, pageVO));
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "保存发票信息") @ApiOperation(value = "保存发票信息")
@PostMapping @PostMapping
public ResultMessage<Receipt> save(@Valid Receipt receipt) { public ResultMessage<Receipt> save(@Valid Receipt receipt) {

View File

@ -1,5 +1,6 @@
package cn.lili.controller.order; package cn.lili.controller.order;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.wallet.entity.dos.Recharge; import cn.lili.modules.wallet.entity.dos.Recharge;
@ -9,7 +10,6 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -26,12 +26,12 @@ import javax.validation.constraints.Min;
@RestController @RestController
@Api(tags = "买家端,预存款充值记录接口") @Api(tags = "买家端,预存款充值记录接口")
@RequestMapping("/buyer/trade/recharge") @RequestMapping("/buyer/trade/recharge")
@Transactional(rollbackFor = Exception.class)
public class RechargeTradeBuyerController { public class RechargeTradeBuyerController {
@Autowired @Autowired
private RechargeService rechargeService; private RechargeService rechargeService;
@PreventDuplicateSubmissions
@PostMapping @PostMapping
@ApiOperation(value = "创建余额充值订单") @ApiOperation(value = "创建余额充值订单")
@ApiImplicitParams({ @ApiImplicitParams({

View File

@ -1,5 +1,6 @@
package cn.lili.controller.other; package cn.lili.controller.other;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
@ -31,6 +32,7 @@ public class FeedbackBuyerController {
@Autowired @Autowired
private FeedbackService feedbackService; private FeedbackService feedbackService;
@PreventDuplicateSubmissions
@ApiOperation(value = "添加意见反馈") @ApiOperation(value = "添加意见反馈")
@PostMapping() @PostMapping()
public ResultMessage<Object> save(@Valid Feedback feedback) { public ResultMessage<Object> save(@Valid Feedback feedback) {

View File

@ -1,5 +1,6 @@
package cn.lili.controller.other.purchase; package cn.lili.controller.other.purchase;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
@ -48,6 +49,8 @@ public class PurchaseBuyerController {
return ResultUtil.data(goodsUnitService.page(PageUtil.initPage(pageVO))); return ResultUtil.data(goodsUnitService.page(PageUtil.initPage(pageVO)));
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "添加采购单") @ApiOperation(value = "添加采购单")
@PostMapping @PostMapping
public ResultMessage<PurchaseOrderVO> addPurchaseOrderVO(@RequestBody PurchaseOrderVO purchaseOrderVO) { public ResultMessage<PurchaseOrderVO> addPurchaseOrderVO(@RequestBody PurchaseOrderVO purchaseOrderVO) {
@ -74,6 +77,7 @@ public class PurchaseBuyerController {
return ResultUtil.data(purchaseOrderService.page(purchaseOrderSearchParams)); return ResultUtil.data(purchaseOrderService.page(purchaseOrderSearchParams));
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "关闭采购单") @ApiOperation(value = "关闭采购单")
@ApiImplicitParam(name = "id", value = "采购单ID", required = true, dataType = "Long", paramType = "path") @ApiImplicitParam(name = "id", value = "采购单ID", required = true, dataType = "Long", paramType = "path")
@PutMapping("/{id}") @PutMapping("/{id}")

View File

@ -1,6 +1,7 @@
package cn.lili.controller.wallet; package cn.lili.controller.wallet;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
@ -35,6 +36,7 @@ public class MemberReceiptController {
return ResultUtil.data(memberReceiptService.getPage(memberReceiptVO, page)); return ResultUtil.data(memberReceiptService.getPage(memberReceiptVO, page));
} }
@PreventDuplicateSubmissions
@ApiOperation(value = "新增会员发票") @ApiOperation(value = "新增会员发票")
@PostMapping @PostMapping
public ResultMessage<Object> add(MemberReceiptAddVO memberReceiptAddVO) { public ResultMessage<Object> add(MemberReceiptAddVO memberReceiptAddVO) {

View File

@ -1,5 +1,6 @@
package cn.lili.controller.wallet; package cn.lili.controller.wallet;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
@ -120,6 +121,7 @@ public class MemberWalletBuyerController {
} }
@PreventDuplicateSubmissions
@PostMapping(value = "/withdrawal") @PostMapping(value = "/withdrawal")
@ApiOperation(value = "会员中心余额提现") @ApiOperation(value = "会员中心余额提现")
@ApiImplicitParams({ @ApiImplicitParams({

View File

@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -26,8 +25,7 @@ import org.springframework.web.bind.annotation.RestController;
*/ */
@RestController @RestController
@Api(tags = "买家端,余额提现记录接口") @Api(tags = "买家端,余额提现记录接口")
@RequestMapping("/buyer/wallet/withdrawApply") @RequestMapping("/buyer/member/withdrawApply")
@Transactional(rollbackFor = Exception.class)
public class MemberWithdrawApplyBuyerController { public class MemberWithdrawApplyBuyerController {
@Autowired @Autowired
private MemberWithdrawApplyService memberWithdrawApplyService; private MemberWithdrawApplyService memberWithdrawApplyService;

View File

@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -25,7 +24,6 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Api(tags = "买家端,预存款充值记录接口") @Api(tags = "买家端,预存款充值记录接口")
@RequestMapping("/buyer/wallet/recharge") @RequestMapping("/buyer/wallet/recharge")
@Transactional(rollbackFor = Exception.class)
public class RechargeBuyerController { public class RechargeBuyerController {
@Autowired @Autowired

View File

@ -3,12 +3,19 @@ server:
servlet: servlet:
context-path: / context-path: /
#
tomcat: # tomcat:
uri-encoding: UTF-8 # #最大链接数默认不设置默认是10000
threads: # max-connections: 6500
min-spare: 50 # #最大等待队列长度允许HTTP请求缓存到请求队列的最大个数默认不限制
max: 1000 # accept-count: 1000
# threads:
# #最少闲置
# min-spare: 50
# #最大线程数 默认是200
# max: 800
netty:
connection-timeout:
# 与Spring Boot 2一样默认情况下大多数端点都不通过http公开我们公开了所有端点。对于生产您应该仔细选择要公开的端点。 # 与Spring Boot 2一样默认情况下大多数端点都不通过http公开我们公开了所有端点。对于生产您应该仔细选择要公开的端点。
management: management:
@ -69,10 +76,10 @@ spring:
url: jdbc:mysql://127.0.0.1:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root username: root
password: lilishop password: lilishop
maxActive: 20 maxActive: 50
initialSize: 5 initialSize: 10
maxWait: 60000 maxWait: 60000
minIdle: 5 minIdle: 10
timeBetweenEvictionRunsMillis: 60000 timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000 minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL validationQuery: SELECT 1 FROM DUAL
@ -110,7 +117,7 @@ spring:
props: props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭 #是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql: sql:
show: true show: false
# 忽略TOKEN 鉴权 的url # 忽略TOKEN 鉴权 的url
ignored: ignored:
@ -176,8 +183,7 @@ logging:
config: classpath:logback-spring.xml config: classpath:logback-spring.xml
# 输出级别 # 输出级别
level: level:
cn.lili: debug root: error
org.hibernate: debug
# org.springframework: debug # org.springframework: debug
file: file:
# 指定路径 # 指定路径

View File

@ -5,7 +5,6 @@ import cn.lili.cache.Cache;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.SystemSettingProperties;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
@ -52,9 +51,6 @@ public class UploadController {
@Autowired @Autowired
private Cache cache; private Cache cache;
@Autowired
private SystemSettingProperties systemSettingProperties;
@ApiOperation(value = "文件上传") @ApiOperation(value = "文件上传")
@PostMapping(value = "/file") @PostMapping(value = "/file")
public ResultMessage<Object> upload(MultipartFile file, public ResultMessage<Object> upload(MultipartFile file,

View File

@ -108,7 +108,7 @@ spring:
props: props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭 #是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql: sql:
show: true show: false
# 忽略鉴权url # 忽略鉴权url
ignored: ignored:
@ -176,7 +176,7 @@ logging:
config: classpath:logback-spring.xml config: classpath:logback-spring.xml
# 输出级别 # 输出级别
level: level:
cn.lili: info root: error
# org.hibernate: debug # org.hibernate: debug
# org.springframework: debug # org.springframework: debug
file: file:

View File

@ -72,8 +72,8 @@ spring:
url: jdbc:mysql://192.168.0.116:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai url: jdbc:mysql://192.168.0.116:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root username: root
password: lilishop password: lilishop
maxActive: 20 maxActive: 50
initialSize: 5 initialSize: 20
maxWait: 60000 maxWait: 60000
minIdle: 5 minIdle: 5
timeBetweenEvictionRunsMillis: 60000 timeBetweenEvictionRunsMillis: 60000
@ -183,7 +183,7 @@ mybatis-plus:
logging: logging:
# 输出级别 # 输出级别
level: level:
cn.lili: info root: info
# org.hibernate: debug # org.hibernate: debug
# org.springframework: debug # org.springframework: debug
# org.springframework.data.mongodb.core: debug # org.springframework.data.mongodb.core: debug

View File

@ -0,0 +1,19 @@
package cn.lili.event;
import cn.lili.modules.member.entity.dos.Member;
/**
* 会员登录消息
*
* @author Chopper
* @since 2020/11/17 7:13 下午
*/
public interface MemberLoginEvent {
/**
* 会员登录
*
* @param member 会员
*/
void memberLogin(Member member);
}

View File

@ -11,7 +11,7 @@ import cn.lili.modules.member.entity.dos.Member;
public interface MemberRegisterEvent { public interface MemberRegisterEvent {
/** /**
* 会员登录 * 会员注册
* *
* @param member 会员 * @param member 会员
*/ */

View File

@ -10,6 +10,7 @@ import cn.lili.common.utils.SnowFlake;
import cn.lili.event.OrderStatusChangeEvent; import cn.lili.event.OrderStatusChangeEvent;
import cn.lili.event.TradeEvent; import cn.lili.event.TradeEvent;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.enums.GoodsTypeEnum;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.entity.enums.PointTypeEnum;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
@ -34,6 +35,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* 订单状态处理类 * 订单状态处理类
@ -90,6 +92,7 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent {
@Override @Override
public void orderChange(OrderMessage orderMessage) { public void orderChange(OrderMessage orderMessage) {
//如果订单已支付
if (orderMessage.getNewStatus().equals(OrderStatusEnum.PAID)) { if (orderMessage.getNewStatus().equals(OrderStatusEnum.PAID)) {
log.debug("满减活动,订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()); log.debug("满减活动,订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn());
renderGift(JSONUtil.toBean(cache.getString(CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()), CartVO.class), orderMessage); renderGift(JSONUtil.toBean(cache.getString(CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()), CartVO.class), orderMessage);
@ -142,49 +145,89 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent {
* @param originOrder 赠品原订单信息 * @param originOrder 赠品原订单信息
*/ */
private void generatorGiftOrder(List<String> skuIds, Order originOrder) { private void generatorGiftOrder(List<String> skuIds, Order originOrder) {
//获取赠品列表
List<GoodsSku> goodsSkus = goodsSkuService.getGoodsSkuByIdFromCache(skuIds);
//赠品判定
if (goodsSkus == null || goodsSkus.isEmpty()) {
log.error("赠品不存在:{}", skuIds);
return;
}
//赠品分类分为实体商品/虚拟商品/电子卡券
List<GoodsSku> physicalSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.PHYSICAL_GOODS.name())).collect(Collectors.toList());
List<GoodsSku> virtualSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.VIRTUAL_GOODS.name())).collect(Collectors.toList());
List<GoodsSku> eCouponSkus = goodsSkus.stream().filter(goodsSku -> goodsSku.getGoodsType().equals(GoodsTypeEnum.E_COUPON.name())).collect(Collectors.toList());
//如果赠品不为空则生成对应的赠品订单
if (!physicalSkus.isEmpty()) {
giftOrderHandler(physicalSkus, originOrder, OrderTypeEnum.NORMAL);
}
if (!virtualSkus.isEmpty()) {
giftOrderHandler(virtualSkus, originOrder, OrderTypeEnum.VIRTUAL);
}
if (!eCouponSkus.isEmpty()) {
giftOrderHandler(eCouponSkus, originOrder, OrderTypeEnum.E_COUPON);
}
}
/**
* 赠品订单处理
*
* @param skuList 赠品列表
* @param originOrder 原始订单
* @param orderTypeEnum 订单类型
*/
private void giftOrderHandler(List<GoodsSku> skuList, Order originOrder, OrderTypeEnum orderTypeEnum) {
//初始化订单对象/订单日志/自订单
Order order = new Order();
List<OrderItem> orderItems = new ArrayList<>(); List<OrderItem> orderItems = new ArrayList<>();
List<OrderLog> orderLogs = new ArrayList<>(); List<OrderLog> orderLogs = new ArrayList<>();
Order order = new Order(); //初始化价格详情
PriceDetailDTO priceDetailDTO = new PriceDetailDTO(); PriceDetailDTO priceDetailDTO = new PriceDetailDTO();
//复制通用属性
BeanUtil.copyProperties(originOrder, order, "id"); BeanUtil.copyProperties(originOrder, order, "id");
BeanUtil.copyProperties(priceDetailDTO, order, "id"); BeanUtil.copyProperties(priceDetailDTO, order, "id");
//生成订单参数
order.setSn(SnowFlake.createStr("G")); order.setSn(SnowFlake.createStr("G"));
order.setOrderType(OrderPromotionTypeEnum.GIFT.name()); order.setOrderPromotionType(OrderPromotionTypeEnum.GIFT.name());
order.setOrderStatus(OrderStatusEnum.UNPAID.name()); order.setOrderStatus(OrderStatusEnum.UNPAID.name());
order.setPayStatus(PayStatusEnum.PAID.name()); order.setPayStatus(PayStatusEnum.PAID.name());
order.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name()); order.setOrderType(orderTypeEnum.name());
order.setNeedReceipt(false); order.setNeedReceipt(false);
order.setPriceDetailDTO(priceDetailDTO); order.setPriceDetailDTO(priceDetailDTO);
order.setClientType(originOrder.getClientType()); order.setClientType(originOrder.getClientType());
//订单日志
String message = "赠品订单[" + order.getSn() + "]创建"; String message = "赠品订单[" + order.getSn() + "]创建";
orderLogs.add(new OrderLog(order.getSn(), originOrder.getMemberId(), UserEnums.MEMBER.name(), originOrder.getMemberName(), message)); orderLogs.add(new OrderLog(order.getSn(), originOrder.getMemberId(), UserEnums.MEMBER.name(), originOrder.getMemberName(), message));
for (String skuId : skuIds) { //生成子订单
GoodsSku goodsSkuByIdFromCache = goodsSkuService.getGoodsSkuByIdFromCache(skuId); for (GoodsSku goodsSku : skuList) {
OrderItem orderItem = new OrderItem(); OrderItem orderItem = new OrderItem();
BeanUtil.copyProperties(goodsSkuByIdFromCache, orderItem, "id"); BeanUtil.copyProperties(goodsSku, orderItem, "id");
BeanUtil.copyProperties(priceDetailDTO, orderItem, "id"); BeanUtil.copyProperties(priceDetailDTO, orderItem, "id");
orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NEW.name()); orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NEW.name());
orderItem.setCommentStatus(CommentStatusEnum.NEW.name()); orderItem.setCommentStatus(CommentStatusEnum.NEW.name());
orderItem.setComplainStatus(OrderComplaintStatusEnum.NEW.name()); orderItem.setComplainStatus(OrderComplaintStatusEnum.NEW.name());
orderItem.setNum(1); orderItem.setNum(1);
orderItem.setOrderSn(order.getSn()); orderItem.setOrderSn(order.getSn());
orderItem.setImage(goodsSkuByIdFromCache.getThumbnail()); orderItem.setImage(goodsSku.getThumbnail());
orderItem.setGoodsName(goodsSkuByIdFromCache.getGoodsName()); orderItem.setGoodsName(goodsSku.getGoodsName());
orderItem.setSkuId(goodsSkuByIdFromCache.getId()); orderItem.setSkuId(goodsSku.getId());
orderItem.setCategoryId(goodsSkuByIdFromCache.getCategoryPath().substring( orderItem.setCategoryId(goodsSku.getCategoryPath().substring(
goodsSkuByIdFromCache.getCategoryPath().lastIndexOf(",") + 1 goodsSku.getCategoryPath().lastIndexOf(",") + 1
)); ));
orderItem.setGoodsPrice(goodsSkuByIdFromCache.getPrice()); orderItem.setGoodsPrice(goodsSku.getPrice());
orderItem.setPriceDetailDTO(priceDetailDTO); orderItem.setPriceDetailDTO(priceDetailDTO);
orderItems.add(orderItem); orderItems.add(orderItem);
} }
//保存订单
orderService.save(order); orderService.save(order);
orderItemService.saveBatch(orderItems); orderItemService.saveBatch(orderItems);
orderLogService.saveBatch(orderLogs); orderLogService.saveBatch(orderLogs);
//发送订单已付款消息 //发送订单已付款消息PS:不在这里处理逻辑是因为期望加交给消费者统一处理库存等等问题
OrderMessage orderMessage = new OrderMessage(); OrderMessage orderMessage = new OrderMessage();
orderMessage.setOrderSn(order.getSn()); orderMessage.setOrderSn(order.getSn());
orderMessage.setPaymentMethod(order.getPaymentMethod()); orderMessage.setPaymentMethod(order.getPaymentMethod());
@ -193,7 +236,5 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent {
String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name(); String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name();
//发送订单变更mq消息 //发送订单变更mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback()); rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback());
} }
} }

View File

@ -0,0 +1,25 @@
package cn.lili.event.impl;
import cn.lili.event.MemberLoginEvent;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 会员自身业务
*
* @author Chopper
* @version v1.0
* 2022-01-11 11:08
*/
@Service
public class MemberExecute implements MemberLoginEvent {
@Autowired
private MemberService memberService;
@Override
public void memberLogin(Member member) {
memberService.updateMemberLoginTime(member.getId());
}
}

View File

@ -103,14 +103,18 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp
} }
case COMPLETED: { case COMPLETED: {
Order order = orderService.getBySn(orderMessage.getOrderSn()); Order order = orderService.getBySn(orderMessage.getOrderSn());
//根据订单编号获取订单数据,如果订单促销类型不为空并且订单促销类型为积分订单 则直接返回 //如果是积分订单 则直接返回
if (StringUtils.isNotEmpty(order.getOrderPromotionType()) && order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name())) { if (StringUtils.isNotEmpty(order.getOrderPromotionType())
&& order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name())) {
return; return;
} }
//获取积分设置 //获取积分设置
PointSetting pointSetting = getPointSetting(); PointSetting pointSetting = getPointSetting();
if (pointSetting.getConsumer() == 0) {
return;
}
//计算赠送积分数量 //计算赠送积分数量
Double point = CurrencyUtil.mul(pointSetting.getMoney(), order.getFlowPrice(), 0); Double point = CurrencyUtil.mul(pointSetting.getConsumer(), order.getFlowPrice(), 0);
//赠送会员积分 //赠送会员积分
memberService.updateMemberPoint(point.longValue(), PointTypeEnum.INCREASE.name(), order.getMemberId(), "会员下单,赠送积分" + point + ""); memberService.updateMemberPoint(point.longValue(), PointTypeEnum.INCREASE.name(), order.getMemberId(), "会员下单,赠送积分" + point + "");
break; break;

View File

@ -154,14 +154,11 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
* @param stocks * @param stocks
*/ */
private void checkStocks(List<Integer> stocks, OrderDetailVO order) { private void checkStocks(List<Integer> stocks, OrderDetailVO order) {
for (int i = 0; i < stocks.size(); i++) { if (order.getOrderItems().size() == stocks.size()) {
if (null == stocks.get(i)) {
initSkuCache(order.getOrderItems());
initPromotionCache(order.getOrderItems());
return; return;
} }
initSkuCache(order.getOrderItems());
} initPromotionCache(order.getOrderItems());
} }
/** /**

View File

@ -390,7 +390,7 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
} }
if (goodsIndex.getPromotionMap() == null || goodsIndex.getPromotionMap().isEmpty()) { if (goodsIndex.getPromotionMap() == null || goodsIndex.getPromotionMap().isEmpty()) {
Map<String, Object> goodsCurrentPromotionMap = promotionService.getGoodsPromotionMap(goodsIndex); Map<String, Object> goodsCurrentPromotionMap = promotionService.getGoodsSkuPromotionMap(goodsIndex.getStoreId(), goodsIndex.getId());
goodsIndex.setPromotionMapJson(JSONUtil.toJsonStr(goodsCurrentPromotionMap)); goodsIndex.setPromotionMapJson(JSONUtil.toJsonStr(goodsCurrentPromotionMap));
} }
} }

View File

@ -1,6 +1,7 @@
package cn.lili.listener; package cn.lili.listener;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.event.MemberLoginEvent;
import cn.lili.event.MemberPointChangeEvent; import cn.lili.event.MemberPointChangeEvent;
import cn.lili.event.MemberRegisterEvent; import cn.lili.event.MemberRegisterEvent;
import cn.lili.event.MemberWithdrawalEvent; import cn.lili.event.MemberWithdrawalEvent;
@ -51,6 +52,12 @@ public class MemberMessageListener implements RocketMQListener<MessageExt> {
@Autowired @Autowired
private List<MemberRegisterEvent> memberSignEvents; private List<MemberRegisterEvent> memberSignEvents;
/**
* 会员注册
*/
@Autowired
private List<MemberLoginEvent> memberLoginEvents;
@Override @Override
public void onMessage(MessageExt messageExt) { public void onMessage(MessageExt messageExt) {
@ -69,6 +76,21 @@ public class MemberMessageListener implements RocketMQListener<MessageExt> {
} }
} }
break; break;
case MEMBER_LOGIN:
for (MemberLoginEvent memberLoginEvent : memberLoginEvents) {
try {
Member member = JSONUtil.toBean(new String(messageExt.getBody()), Member.class);
memberLoginEvent.memberLogin(member);
} catch (Exception e) {
log.error("会员{},在{}业务中,状态修改事件执行异常",
new String(messageExt.getBody()),
memberLoginEvent.getClass().getName(),
e);
}
}
break;
//会员签到 //会员签到
case MEMBER_SING: case MEMBER_SING:
MemberSign memberSign = JSONUtil.toBean(new String(messageExt.getBody()), MemberSign.class); MemberSign memberSign = JSONUtil.toBean(new String(messageExt.getBody()), MemberSign.class);

View File

@ -5,7 +5,6 @@ import cn.lili.common.enums.SwitchEnum;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.vo.MemberSearchVO; import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.entity.vo.MemberVO; import cn.lili.modules.member.entity.vo.MemberVO;
import cn.lili.modules.member.mapper.MemberMapper;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.message.entity.dos.MemberMessage; import cn.lili.modules.message.entity.dos.MemberMessage;
import cn.lili.modules.message.entity.dos.Message; import cn.lili.modules.message.entity.dos.Message;
@ -28,7 +27,6 @@ import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -42,11 +40,6 @@ import java.util.List;
@RocketMQMessageListener(topic = "${lili.data.rocketmq.notice-send-topic}", consumerGroup = "${lili.data.rocketmq.notice-send-group}") @RocketMQMessageListener(topic = "${lili.data.rocketmq.notice-send-topic}", consumerGroup = "${lili.data.rocketmq.notice-send-group}")
public class NoticeSendMessageListener implements RocketMQListener<MessageExt> { public class NoticeSendMessageListener implements RocketMQListener<MessageExt> {
/**
* 会员
*/
@Resource
private MemberMapper memberMapper;
/** /**
* 短信 * 短信
*/ */
@ -82,7 +75,7 @@ public class NoticeSendMessageListener implements RocketMQListener<MessageExt> {
//发送全部会员 //发送全部会员
if (smsReachDTO.getSmsRange().equals(RangeEnum.ALL.name())) { if (smsReachDTO.getSmsRange().equals(RangeEnum.ALL.name())) {
//获取所有会员的手机号 //获取所有会员的手机号
List<String> list = memberMapper.getAllMemberMobile(); List<String> list = memberService.getAllMemberMobile();
smsUtil.sendBatchSms(smsReachDTO.getSignName(), list, smsReachDTO.getMessageCode()); smsUtil.sendBatchSms(smsReachDTO.getSignName(), list, smsReachDTO.getMessageCode());
//判断为发送部分用户 //判断为发送部分用户
} else { } else {

View File

@ -146,7 +146,7 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute {
memberEvaluationDTO.setDescriptionScore(5); memberEvaluationDTO.setDescriptionScore(5);
memberEvaluationDTO.setServiceScore(5); memberEvaluationDTO.setServiceScore(5);
memberEvaluationService.addMemberEvaluation(memberEvaluationDTO); memberEvaluationService.addMemberEvaluation(memberEvaluationDTO, false);
} }
} }
} }

View File

@ -59,7 +59,9 @@ public class PromotionEverydayExecute implements EveryDayExecute {
private void addSeckill() { private void addSeckill() {
Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name());
SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
Seckill seckill = new Seckill(SeckillService.PRE_CREATION, seckillSetting.getHours(), seckillSetting.getSeckillRule()); for (int i = 1; i <= SeckillService.PRE_CREATION; i++) {
Seckill seckill = new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule());
seckillService.savePromotions(seckill); seckillService.savePromotions(seckill);
} }
} }
}

View File

@ -5,10 +5,10 @@ import cn.lili.cache.Cache;
import cn.lili.common.utils.ThreadPoolUtil; import cn.lili.common.utils.ThreadPoolUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.redis.core.DefaultTypedTuple; import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
* @since 2020/11/7 * @since 2020/11/7
**/ **/
@Slf4j @Slf4j
public abstract class AbstractDelayQueueListen { public abstract class AbstractDelayQueueListen implements ApplicationRunner {
@Autowired @Autowired
private Cache cache; private Cache cache;
@ -87,7 +87,6 @@ public abstract class AbstractDelayQueueListen {
/** /**
* 监听队列 * 监听队列
*/ */
@PostConstruct
public void init() { public void init() {
ThreadPoolUtil.getPool().execute(this::startDelayQueueMachine); ThreadPoolUtil.getPool().execute(this::startDelayQueueMachine);
} }

View File

@ -1,11 +1,12 @@
package cn.lili.trigger.listen; package cn.lili.trigger.listen;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.trigger.AbstractDelayQueueListen;
import cn.lili.trigger.enums.DelayQueueEnums; import cn.lili.trigger.enums.DelayQueueEnums;
import cn.lili.trigger.interfaces.TimeTrigger; import cn.lili.trigger.interfaces.TimeTrigger;
import cn.lili.trigger.model.TimeTriggerMsg; import cn.lili.trigger.model.TimeTriggerMsg;
import cn.lili.trigger.AbstractDelayQueueListen;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
@ -31,4 +32,9 @@ public class PromotionDelayQueueListen extends AbstractDelayQueueListen {
public String setDelayQueueName() { public String setDelayQueueName() {
return DelayQueueEnums.PROMOTION.name(); return DelayQueueEnums.PROMOTION.name();
} }
@Override
public void run(ApplicationArguments args) throws Exception {
this.init();
}
} }

View File

@ -111,7 +111,7 @@ spring:
props: props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭 #是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql: sql:
show: true show: false
# 忽略鉴权url # 忽略鉴权url
ignored: ignored:
@ -179,7 +179,7 @@ logging:
config: classpath:logback-spring.xml config: classpath:logback-spring.xml
# 输出级别 # 输出级别
level: level:
cn.lili: info root: error
# org.hibernate: debug # org.hibernate: debug
# org.springframework: debug # org.springframework: debug
file: file:

View File

@ -15,6 +15,11 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
<dependency> <dependency>
<groupId>org.junit.vintage</groupId> <groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId> <artifactId>junit-vintage-engine</artifactId>
@ -30,6 +35,12 @@
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId> <artifactId>spring-boot-starter-quartz</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
@ -67,6 +78,10 @@
<artifactId>HdrHistogram</artifactId> <artifactId>HdrHistogram</artifactId>
<groupId>org.hdrhistogram</groupId> <groupId>org.hdrhistogram</groupId>
</exclusion> </exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <dependency>
@ -76,6 +91,12 @@
<dependency> <dependency>
<groupId>org.springframework.integration</groupId> <groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId> <artifactId>spring-integration-redis</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
@ -91,29 +112,40 @@
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-version}</version> <version>${mybatis-plus-version}</version>
</dependency> <exclusions>
<dependency> <exclusion>
<groupId>org.mybatis.spring.boot</groupId> <artifactId>slf4j-api</artifactId>
<artifactId>mybatis-spring-boot-starter-test</artifactId> <groupId>org.slf4j</groupId>
<version>2.2.0</version> </exclusion>
</exclusions>
</dependency> </dependency>
<!-- Mysql Connector --> <!-- Mysql Connector -->
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-version}</version>
</dependency> </dependency>
<!-- Redis--> <!-- Redis-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId> <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> </dependency>
<!-- Swagger API文档 --> <!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>${redisson}</version>
</dependency>
<dependency> <dependency>
<groupId>com.github.xiaoymin</groupId> <groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId> <artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version> <version>${knife4j.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- Hutool工具包 --> <!-- Hutool工具包 -->
<dependency> <dependency>
@ -143,6 +175,12 @@
<groupId>com.aliyun</groupId> <groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId> <artifactId>aliyun-java-sdk-core</artifactId>
<version>${aliyun-version}</version> <version>${aliyun-version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- 阿里云OSS --> <!-- 阿里云OSS -->
<dependency> <dependency>
@ -161,6 +199,16 @@
<groupId>com.aliyun</groupId> <groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId> <artifactId>dysmsapi20170525</artifactId>
<version>${aliyun-sdk-dysms-version}</version> <version>${aliyun-sdk-dysms-version}</version>
<exclusions>
<exclusion>
<artifactId>org.jacoco.agent</artifactId>
<groupId>org.jacoco</groupId>
</exclusion>
<exclusion>
<artifactId>bcprov-jdk15on</artifactId>
<groupId>org.bouncycastle</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!--脚本编程--> <!--脚本编程-->
<dependency> <dependency>
@ -172,6 +220,16 @@
<groupId>org.apache.rocketmq</groupId> <groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId> <artifactId>rocketmq-spring-boot-starter</artifactId>
<version>${rocketmq-version}</version> <version>${rocketmq-version}</version>
<exclusions>
<exclusion>
<artifactId>fastjson</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- token加密 --> <!-- token加密 -->
<dependency> <dependency>
@ -195,6 +253,12 @@
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- 解决版本提示问题 --> <!-- 解决版本提示问题 -->
@ -220,6 +284,18 @@
<artifactId>groovy</artifactId> <artifactId>groovy</artifactId>
<groupId>org.codehaus.groovy</groupId> <groupId>org.codehaus.groovy</groupId>
</exclusion> </exclusion>
<exclusion>
<artifactId>commons-collections4</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
<exclusion>
<artifactId>antlr4-runtime</artifactId>
<groupId>org.antlr</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -227,6 +303,12 @@
<groupId>org.apache.shardingsphere</groupId> <groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId> <artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>${sharding-jdbc-version}</version> <version>${sharding-jdbc-version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!--druid--> <!--druid-->
<dependency> <dependency>
@ -248,6 +330,20 @@
<groupId>com.alipay.sdk</groupId> <groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId> <artifactId>alipay-sdk-java</artifactId>
<version>${alipay-sdk-version}</version> <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> </dependency>
<!--用户端类型处理--> <!--用户端类型处理-->
@ -272,11 +368,6 @@
<artifactId>logstash-logback-encoder</artifactId> <artifactId>logstash-logback-encoder</artifactId>
<version>${logstash-logback-encoder}</version> <version>${logstash-logback-encoder}</version>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>javax.interceptor</groupId>-->
<!-- <artifactId>javax.interceptor-api</artifactId>-->
<!-- <version>${interceptor-api}</version>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>de.codecentric</groupId> <groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId> <artifactId>spring-boot-admin-starter-client</artifactId>
@ -314,6 +405,12 @@
<groupId>com.googlecode.owasp-java-html-sanitizer</groupId> <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
<artifactId>owasp-java-html-sanitizer</artifactId> <artifactId>owasp-java-html-sanitizer</artifactId>
<version>${owasp-java-html-sanitizer}</version> <version>${owasp-java-html-sanitizer}</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -211,6 +211,14 @@ public interface Cache<T> {
* @return 计数器结果 * @return 计数器结果
*/ */
Long incr(String key, long liveTime); Long incr(String key, long liveTime);
/**
* redis 计数器 累加
* 到达liveTime之后该次增加取消即自动-1而不是redis值为空
*
* @param key 为累计的key同一key每次调用则值 +1
* @return 计数器结果
*/
Long incr(String key);
//-----------------------------------------------redis计数--------------------------------------------- //-----------------------------------------------redis计数---------------------------------------------
/** /**

View File

@ -1,9 +1,17 @@
package cn.lili.cache.config.redis; package cn.lili.cache.config.redis;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.parser.ParserConfig;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
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.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;
@ -28,7 +36,9 @@ import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -49,6 +59,9 @@ public class RedisConfig extends CachingConfigurerSupport {
@Value("${lili.cache.timeout:7200}") @Value("${lili.cache.timeout:7200}")
private Integer timeout; private Integer timeout;
@Autowired
private RedisProperties redisProperties;
/** /**
* 当有多个管理器的时候必须使用该注解在一个管理器上注释表示该管理器为默认的管理器 * 当有多个管理器的时候必须使用该注解在一个管理器上注释表示该管理器为默认的管理器
@ -99,6 +112,44 @@ public class RedisConfig extends CachingConfigurerSupport {
return template; return template;
} }
@Bean(destroyMethod = "shutdown")
public RedissonClient redisson() {
Config config = new Config();
if (redisProperties.getSentinel() != null && !redisProperties.getSentinel().getNodes().isEmpty()) {
// 哨兵模式
SentinelServersConfig sentinelServersConfig = config.useSentinelServers();
sentinelServersConfig.setMasterName(redisProperties.getSentinel().getMaster());
List<String> sentinelAddress = new ArrayList<>();
for (String node : redisProperties.getCluster().getNodes()) {
sentinelAddress.add("redis://" + node);
}
sentinelServersConfig.setSentinelAddresses(sentinelAddress);
if (CharSequenceUtil.isNotEmpty(redisProperties.getSentinel().getPassword())) {
sentinelServersConfig.setSentinelPassword(redisProperties.getSentinel().getPassword());
}
} else if (redisProperties.getCluster() != null && !redisProperties.getCluster().getNodes().isEmpty()) {
// 集群模式
ClusterServersConfig clusterServersConfig = config.useClusterServers();
List<String> clusterNodes = new ArrayList<>();
for (String node : redisProperties.getCluster().getNodes()) {
clusterNodes.add("redis://" + node);
}
clusterServersConfig.setNodeAddresses(clusterNodes);
if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) {
clusterServersConfig.setPassword(redisProperties.getPassword());
}
} else {
SingleServerConfig singleServerConfig = config.useSingleServer();
singleServerConfig.setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort());
if (CharSequenceUtil.isNotEmpty(redisProperties.getPassword())) {
singleServerConfig.setPassword(redisProperties.getPassword());
}
}
return Redisson.create(config);
}
/** /**
* 自定义缓存key生成策略默认将使用该策略 * 自定义缓存key生成策略默认将使用该策略
*/ */

View File

@ -207,13 +207,19 @@ public class RedisCache implements Cache {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long increment = entityIdCounter.getAndIncrement(); Long increment = entityIdCounter.getAndIncrement();
//初始设置过期时间 //初始设置过期时间
if ((null == increment || increment == 0) && liveTime > 0) { if (increment == 0 && liveTime > 0) {
entityIdCounter.expire(liveTime, TimeUnit.SECONDS); entityIdCounter.expire(liveTime, TimeUnit.SECONDS);
} }
return increment; return increment;
} }
@Override
public Long incr(String key) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
return entityIdCounter.getAndIncrement();
}
/** /**
* 使用Sorted Set记录keyword * 使用Sorted Set记录keyword
* zincrby命令对于一个Sorted Set存在的就把分数加x(x可自行设定)不存在就创建一个分数为1的成员 * zincrby命令对于一个Sorted Set存在的就把分数加x(x可自行设定)不存在就创建一个分数为1的成员

View File

@ -1,9 +1,10 @@
package cn.lili.cache.limit.interceptor; package cn.lili.cache.limit.interceptor;
import cn.lili.cache.limit.enums.LimitTypeEnums;
import cn.lili.cache.limit.annotation.LimitPoint; import cn.lili.cache.limit.annotation.LimitPoint;
import cn.lili.cache.limit.enums.LimitTypeEnums;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.IpUtils;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -16,7 +17,6 @@ import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable; import java.io.Serializable;
/** /**
@ -54,7 +54,8 @@ public class LimitInterceptor {
key = limitPointAnnotation.key(); key = limitPointAnnotation.key();
break; break;
default: default:
key = limitPointAnnotation.key() + getIpAddress(); key = limitPointAnnotation.key() + IpUtils
.getIpAddress(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
} }
ImmutableList<String> keys = ImmutableList.of(StringUtils.join(limitPointAnnotation.prefix(), key)); ImmutableList<String> keys = ImmutableList.of(StringUtils.join(limitPointAnnotation.prefix(), key));
try { try {
@ -71,32 +72,8 @@ public class LimitInterceptor {
} catch (ServiceException e) { } catch (ServiceException e) {
throw e; throw e;
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("服务器异常,请稍后再试"); throw new ServiceException(ResultCode.ERROR);
} }
} }
/**
* 默认unknown常量值
*/
private static final String UNKNOWN = "unknown";
/**
* 获取ip
* @return ip
*/
public String getIpAddress() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
} }

View File

@ -4,6 +4,8 @@ import java.lang.annotation.*;
/** /**
* 演示站点注解 * 演示站点注解
* <p>
* PS 此注解需要用户登录之后才可以使用
* *
* @author Bulbasaur * @author Bulbasaur
* @since 2021/7/9 1:40 上午 * @since 2021/7/9 1:40 上午

View File

@ -0,0 +1,24 @@
package cn.lili.common.aop.annotation;
import java.lang.annotation.*;
/**
* 防止重复提交注解
*
* @author liushuai(liushuai711 @ gmail.com)
* @version v4.0
* @Description:
* @since 2022/1/25 09:17
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface PreventDuplicateSubmissions {
/**
* 过期时间
*/
long expire() default 3;
}

View File

@ -26,7 +26,7 @@ public class DemoInterceptor {
@Before("@annotation(demoSite)") @Before("@annotation(demoSite)")
public void doAfter(DemoSite demoSite) { public void doAfter(DemoSite demoSite) {
if (systemSettingProperties.getIsDemoSite()) { if (Boolean.TRUE.equals(systemSettingProperties.getIsDemoSite())) {
throw new ServiceException(ResultCode.DEMO_SITE_EXCEPTION); throw new ServiceException(ResultCode.DEMO_SITE_EXCEPTION);
} }
} }

View File

@ -0,0 +1,67 @@
package cn.lili.common.aop.interceptor;
/**
* 防重复提交业务
*
* @author Chopper
* @version v1.0
* 2022-01-25 09:20
*/
import cn.lili.cache.Cache;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
@Slf4j
public class PreventDuplicateSubmissionsInterceptor {
@Autowired
private Cache<String> cache;
@Before("@annotation(preventDuplicateSubmissions)")
public void interceptor(PreventDuplicateSubmissions preventDuplicateSubmissions) {
try {
Long count = cache.incr(getParams(), preventDuplicateSubmissions.expire());
//如果超过1或者设置的参数则表示重复提交了
if (count.intValue() >= preventDuplicateSubmissions.expire()) {
throw new ServiceException(ResultCode.LIMIT_ERROR);
}
}
//如果参数为空则表示用户未登录直接略过不做处理
catch (NullPointerException e) {
return;
} catch (ServiceException e) {
throw e;
} catch (Exception e) {
throw new ServiceException(ResultCode.ERROR);
}
}
/**
* 获取表单参数
*
* @return
*/
private String getParams() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//请求地址
return request.getRequestURI() + UserContext.getCurrentUser().getId() + UserContext.getCurrentUser().getUsername();
}
}

View File

@ -115,8 +115,7 @@ public enum ResultCode {
USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"), USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"),
USER_AUTHORITY_ERROR(20005, "权限不足"), USER_AUTHORITY_ERROR(20005, "权限不足"),
USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"), USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"),
USER_NAME_EXIST(20007, "该用户名已被注册"), USER_EXIST(20008, "该用户名或手机号已被注册"),
USER_PHONE_EXIST(20008, "该手机号已被注册"),
USER_PHONE_NOT_EXIST(20009, "手机号不存在"), USER_PHONE_NOT_EXIST(20009, "手机号不存在"),
USER_PASSWORD_ERROR(20010, "密码不正确"), USER_PASSWORD_ERROR(20010, "密码不正确"),
USER_NOT_PHONE(20011, "非当前用户的手机号"), USER_NOT_PHONE(20011, "非当前用户的手机号"),

View File

@ -37,6 +37,19 @@ public class UserContext {
return null; return null;
} }
/**
* 根据request获取用户信息
*
* @return 授权用户
*/
public static String getUuid() {
if (RequestContextHolder.getRequestAttributes() != null) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return request.getHeader(SecurityEnum.UUID.getValue());
}
return null;
}
/** /**
* 根据jwt获取token重的用户信息 * 根据jwt获取token重的用户信息

View File

@ -10,7 +10,7 @@ public enum SecurityEnum {
/** /**
* 存在与header中的token参数头 * 存在与header中的token参数头
*/ */
HEADER_TOKEN("accessToken"), USER_CONTEXT("userContext"), JWT_SECRET("secret"); HEADER_TOKEN("accessToken"), USER_CONTEXT("userContext"), JWT_SECRET("secret"), UUID("uuid");
String value; String value;

View File

@ -7,7 +7,6 @@ import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.owasp.html.HtmlPolicyBuilder; import org.owasp.html.HtmlPolicyBuilder;
import org.owasp.html.PolicyFactory; import org.owasp.html.PolicyFactory;
import org.owasp.html.Sanitizers;
import javax.servlet.ReadListener; import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream; import javax.servlet.ServletInputStream;
@ -32,33 +31,6 @@ import java.util.Map;
@Slf4j @Slf4j
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
/**
* xss过滤参数
*
* @todo 这里的参数应该更智能些例如iv前端的参数包含这两个字母就会放过这是有问题的
*/
private static final String[] IGNORE_FIELD = {
"logo",
"url",
"photo",
"intro",
"content",
"name",
"image",
"encrypted",
"iv",
"mail",
"sell",
"id",
"price",
"prop",
"reply",
"profile",
"privateKey",
"wechatpay",
};
//允许的标签 //允许的标签
private static final String[] allowedTags = {"h1", "h2", "h3", "h4", "h5", "h6", private static final String[] allowedTags = {"h1", "h2", "h3", "h4", "h5", "h6",
"span", "strong", "span", "strong",
@ -74,8 +46,10 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
"footer", "header", "hgroup", "section", "summary"}; "footer", "header", "hgroup", "section", "summary"};
//带有超链接的标签 //带有超链接的标签
private static final String[] linkTags = {"img", "video", "source", "a", "iframe"}; private static final String[] linkTags = {"img", "video", "source", "a", "iframe", "p"};
//带有超链接的标签
private static final String[] allowAttributes = {"style", "src", "href", "target", "width", "height"};
public XssHttpServletRequestWrapper(HttpServletRequest request) { public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request); super(request);
@ -284,19 +258,11 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
.allowElements(allowedTags) .allowElements(allowedTags)
//内容标签转化为div //内容标签转化为div
.allowElements((elementName, attributes) -> "div", needTransformTags) .allowElements((elementName, attributes) -> "div", needTransformTags)
.allowAttributes("src", "href", "target", "width", "height").onElements(linkTags) .allowAttributes(allowAttributes).onElements(linkTags)
//校验链接中的是否为http .allowStyling()
// .allowUrlProtocols("https")
.toFactory(); .toFactory();
// basic prepackaged policies for links, tables, integers, images, styles, blocks // basic prepackaged policies for links, tables, integers, images, styles, blocks
value = Sanitizers.FORMATTING value = policy.sanitize(value);
.and(Sanitizers.STYLES)
.and(Sanitizers.IMAGES)
.and(Sanitizers.LINKS)
.and(Sanitizers.BLOCKS)
.and(Sanitizers.TABLES)
.and(policy)
.sanitize(value);
} }
return HtmlUtil.unescape(value); return HtmlUtil.unescape(value);
} }
@ -309,12 +275,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
* @return 参数值 * @return 参数值
*/ */
private String filterXss(String name, String value) { private String filterXss(String name, String value) {
// if (CharSequenceUtil.containsAny(name.toLowerCase(Locale.ROOT), IGNORE_FIELD)) {
// // 忽略的处理过滤敏感字符
// return value;
// } else {
// return cleanXSS(value);
// }
return cleanXSS(value); return cleanXSS(value);
} }

View File

@ -72,7 +72,7 @@ public class SensitiveJsonSerializer extends JsonSerializer<String>
AuthUser authUser = UserContext.getCurrentUser(); AuthUser authUser = UserContext.getCurrentUser();
//默认脱敏 //默认脱敏
if (authUser == null) { if (authUser == null) {
return true; return false;
} }
//如果是店铺 //如果是店铺

View File

@ -11,16 +11,16 @@ import cn.lili.common.security.token.Token;
* @version v1.0 * @version v1.0
* 2020-11-13 10:13 * 2020-11-13 10:13
*/ */
public abstract class AbstractTokenGenerate { public abstract class AbstractTokenGenerate<T> {
/** /**
* 生成token * 生成token
* *
* @param username 用户名 * @param user 用户名
* @param longTerm 是否长时间有效 * @param longTerm 是否长时间有效
* @return TOKEN对象 * @return TOKEN对象
*/ */
public abstract Token createToken(String username, Boolean longTerm); public abstract Token createToken(T user, Boolean longTerm);
/** /**
* 刷新token * 刷新token

View File

@ -36,9 +36,9 @@ public final class CurrencyUtil {
return result.doubleValue(); return result.doubleValue();
} }
/** /**
* 提供精确的法运算 * 提供精确的法运算
* *
* @return 累加之和 * @return 第一个参数为被减数其余数字为减数
*/ */
public static Double sub(double... params) { public static Double sub(double... params) {
BigDecimal result = BigDecimal.valueOf(params[0]); BigDecimal result = BigDecimal.valueOf(params[0]);

View File

@ -2,6 +2,7 @@ package cn.lili.common.utils;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.Date; import java.util.Date;
@ -10,18 +11,29 @@ import java.util.Date;
* *
* @author Chopper * @author Chopper
*/ */
@Slf4j
public class SnowFlake { public class SnowFlake {
/** // /**
* 机器id // * 机器id
*/ // */
private static long workerId = 0L; // private static long workerId = 0L;
/** // /**
* 机房id // * 机房id
*/ // */
private static long datacenterId = 0L; // public static long datacenterId = 0L;
private static Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId); private static Snowflake snowflake;
/**
* 初始化配置
*
* @param workerId
* @param datacenterId
*/
public static void initialize(long workerId, long datacenterId) {
snowflake = IdUtil.getSnowflake(workerId, datacenterId);
}
public static long getId() { public static long getId() {
return snowflake.nextId(); return snowflake.nextId();
@ -29,12 +41,14 @@ public class SnowFlake {
/** /**
* 生成字符带有前缀 * 生成字符带有前缀
*
* @param prefix * @param prefix
* @return * @return
*/ */
public static String createStr(String prefix) { public static String createStr(String prefix) {
return prefix + DateUtil.toString(new Date(), "yyyyMMdd") + SnowFlake.getId(); return prefix + DateUtil.toString(new Date(), "yyyyMMdd") + SnowFlake.getId();
} }
public static String getIdStr() { public static String getIdStr() {
return snowflake.nextId() + ""; return snowflake.nextId() + "";
} }

View File

@ -0,0 +1,54 @@
package cn.lili.common.utils;
import cn.lili.cache.Cache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* SnowflakeInitiator
*
* @author Chopper
* @version v1.0
* 2022-01-14 14:04
*/
@Component
@Slf4j
public class SnowflakeInitiator {
/**
* 缓存前缀
*/
private static final String KEY = "{Snowflake}";
@Autowired
private Cache cache;
/**
* 尝试初始化
*
* @return
*/
@PostConstruct
public void init() {
Long num = cache.incr(KEY);
long dataCenter = num / 32;
long workedId = num % 32;
//如果数据中心大于32则抹除缓存从头开始
if (dataCenter >= 32) {
cache.remove(KEY);
num = cache.incr(KEY);
dataCenter = num / 32;
workedId = num % 32;
}
SnowFlake.initialize(workedId, dataCenter);
}
public static void main(String[] args) {
SnowFlake.initialize(0, 8);
System.out.println(SnowFlake.getId());
}
}

View File

@ -87,7 +87,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
this.remove(queryWrapper); this.remove(queryWrapper);
throw new NoPermissionException("未绑定用户"); throw new NoPermissionException("未绑定用户");
} }
return memberTokenGenerate.createToken(member.getUsername(), longTerm); return memberTokenGenerate.createToken(member, longTerm);
} catch (NoPermissionException e) { } catch (NoPermissionException e) {
throw e; throw e;
} }
@ -222,7 +222,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
//如果不存在会员则进行绑定微信openid unionid并且登录 //如果不存在会员则进行绑定微信openid unionid并且登录
if (member != null) { if (member != null) {
bindMpMember(openId, unionId, member); bindMpMember(openId, unionId, member);
return memberTokenGenerate.createToken(member.getUsername(), true); return memberTokenGenerate.createToken(member, true);
} }
//如果没有会员则根据手机号注册会员 //如果没有会员则根据手机号注册会员
@ -230,7 +230,7 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
memberService.save(newMember); memberService.save(newMember);
newMember = memberService.findByUsername(newMember.getUsername()); newMember = memberService.findByUsername(newMember.getUsername());
bindMpMember(openId, unionId, newMember); bindMpMember(openId, unionId, newMember);
return memberTokenGenerate.createToken(newMember.getUsername(), true); return memberTokenGenerate.createToken(newMember, true);
} }
@Override @Override

View File

@ -28,7 +28,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date; import java.util.Date;
@ -40,7 +39,6 @@ import java.util.Date;
* @since 2020-03-126 18:04:56 * @since 2020-03-126 18:04:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMapper, DistributionCash> implements DistributionCashService { public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMapper, DistributionCash> implements DistributionCashService {
/** /**
* 分销员 * 分销员

View File

@ -21,7 +21,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -34,7 +33,6 @@ import java.util.Objects;
* @since 2020-03-24 23:04:56 * @since 2020-03-24 23:04:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class DistributionGoodsServiceImpl extends ServiceImpl<DistributionGoodsMapper, DistributionGoods> implements DistributionGoodsService { public class DistributionGoodsServiceImpl extends ServiceImpl<DistributionGoodsMapper, DistributionGoods> implements DistributionGoodsService {
/** /**

View File

@ -29,7 +29,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -42,7 +41,6 @@ import java.util.List;
*/ */
@Slf4j @Slf4j
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderMapper, DistributionOrder> implements DistributionOrderService { public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderMapper, DistributionOrder> implements DistributionOrderService {
/** /**

View File

@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 分销选择商品接口实现 * 分销选择商品接口实现
@ -17,7 +16,6 @@ import org.springframework.transaction.annotation.Transactional;
* @since 2020-03-24 23:04:56 * @since 2020-03-24 23:04:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class DistributionSelectedGoodsServiceImpl extends ServiceImpl<DistributionSelectedGoodsMapper, DistributionSelectedGoods> implements DistributionSelectedGoodsService { public class DistributionSelectedGoodsServiceImpl extends ServiceImpl<DistributionSelectedGoodsMapper, DistributionSelectedGoods> implements DistributionSelectedGoodsService {
/** /**

View File

@ -7,7 +7,6 @@ import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.BeanUtil;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.distribution.entity.dos.Distribution; import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dto.DistributionApplyDTO; import cn.lili.modules.distribution.entity.dto.DistributionApplyDTO;
@ -21,12 +20,12 @@ import cn.lili.modules.system.entity.dos.Setting;
import cn.lili.modules.system.entity.dto.DistributionSetting; import cn.lili.modules.system.entity.dto.DistributionSetting;
import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService; import cn.lili.modules.system.service.SettingService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -38,7 +37,6 @@ import java.util.concurrent.TimeUnit;
* @since 2020-03-14 23:04:56 * @since 2020-03-14 23:04:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class DistributionServiceImpl extends ServiceImpl<DistributionMapper, Distribution> implements DistributionService { public class DistributionServiceImpl extends ServiceImpl<DistributionMapper, Distribution> implements DistributionService {
/** /**

View File

@ -3,7 +3,6 @@ package cn.lili.modules.file.serviceimpl;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.SearchVO; import cn.lili.common.vo.SearchVO;
@ -12,12 +11,12 @@ import cn.lili.modules.file.entity.dto.FileOwnerDTO;
import cn.lili.modules.file.mapper.FileMapper; import cn.lili.modules.file.mapper.FileMapper;
import cn.lili.modules.file.plugin.FileManagerPlugin; import cn.lili.modules.file.plugin.FileManagerPlugin;
import cn.lili.modules.file.service.FileService; import cn.lili.modules.file.service.FileService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -29,7 +28,6 @@ import java.util.List;
* @since 2020/11/26 17:50 * @since 2020/11/26 17:50
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements FileService { public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements FileService {
@Autowired @Autowired

View File

@ -112,6 +112,9 @@ public class GoodsOperationDTO implements Serializable {
@ApiModelProperty(value = "商品视频") @ApiModelProperty(value = "商品视频")
private String goodsVideo; private String goodsVideo;
public String getGoodsName() {
//对商品对名称做一个极限处理这里没有用xss过滤是因为xss过滤为全局过滤影响很大
// 业务中全局代码中只有商品名称不能拥有英文逗号是由于商品名称存在一个数据库联合查询结果要根据逗号分组
return goodsName.replace(",", "");
}
} }

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

@ -4,6 +4,9 @@ package cn.lili.modules.goods.service;
import cn.lili.modules.goods.entity.dos.Category; import cn.lili.modules.goods.entity.dos.Category;
import cn.lili.modules.goods.entity.vos.CategoryVO; import cn.lili.modules.goods.entity.vos.CategoryVO;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import java.util.List; import java.util.List;
@ -13,6 +16,7 @@ import java.util.List;
* @author pikachu * @author pikachu
* @since 2020-03-02 16:44:56 * @since 2020-03-02 16:44:56
*/ */
@CacheConfig(cacheNames = "{category}")
public interface CategoryService extends IService<Category> { public interface CategoryService extends IService<Category> {
@ -25,6 +29,15 @@ public interface CategoryService extends IService<Category> {
*/ */
List<Category> dbList(String parentId); List<Category> dbList(String parentId);
/**
* 获取分类
*
* @param id
* @return
*/
@Cacheable(key = "#id")
Category getCategoryById(String id);
/** /**
* 根据分类id集合获取所有分类根据层级排序 * 根据分类id集合获取所有分类根据层级排序
* *
@ -86,6 +99,7 @@ public interface CategoryService extends IService<Category> {
* @param category 商品分类信息 * @param category 商品分类信息
* @return 修改结果 * @return 修改结果
*/ */
@CacheEvict(key = "#category.id")
void updateCategory(Category category); void updateCategory(Category category);
/** /**

View File

@ -195,14 +195,6 @@ public interface GoodsSkuService extends IService<GoodsSku> {
*/ */
void updateGoodsSkuCommentNum(String skuId); void updateGoodsSkuCommentNum(String skuId);
/**
* 更新商品sku促销价格
*
* @param skuId skuId
* @param promotionPrice 促销价格
*/
void updateGoodsSkuPromotion(String skuId, Double promotionPrice);
/** /**
* 根据商品id获取全部skuId的集合 * 根据商品id获取全部skuId的集合
* *

View File

@ -20,7 +20,6 @@ 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.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -34,7 +33,6 @@ import java.util.stream.Collectors;
* @since 2020-02-18 16:18:56 * @since 2020-02-18 16:18:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class BrandServiceImpl extends ServiceImpl<BrandMapper, Brand> implements BrandService { public class BrandServiceImpl extends ServiceImpl<BrandMapper, Brand> implements BrandService {
/** /**

View File

@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -20,7 +19,6 @@ import java.util.List;
* @since 2020-02-18 16:18:56 * @since 2020-02-18 16:18:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class CategoryBrandServiceImpl extends ServiceImpl<CategoryBrandMapper, CategoryBrand> implements CategoryBrandService { public class CategoryBrandServiceImpl extends ServiceImpl<CategoryBrandMapper, CategoryBrand> implements CategoryBrandService {
@Override @Override

View File

@ -20,7 +20,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -37,7 +36,6 @@ import java.util.stream.Collectors;
* 2020-03-02 16:45:03 * 2020-03-02 16:45:03
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class CategoryParameterGroupServiceImpl extends ServiceImpl<CategoryParameterGroupMapper, CategoryParameterGroup> implements CategoryParameterGroupService { public class CategoryParameterGroupServiceImpl extends ServiceImpl<CategoryParameterGroupMapper, CategoryParameterGroup> implements CategoryParameterGroupService {
/** /**
* 商品参数 * 商品参数

View File

@ -23,7 +23,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -36,7 +35,6 @@ import java.util.stream.Collectors;
* @since 2020-02-23 15:18:56 * @since 2020-02-23 15:18:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService { public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
private static final String DELETE_FLAG_COLUMN = "delete_flag"; private static final String DELETE_FLAG_COLUMN = "delete_flag";
@ -60,6 +58,11 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i
return this.list(new LambdaQueryWrapper<Category>().eq(Category::getParentId, parentId)); return this.list(new LambdaQueryWrapper<Category>().eq(Category::getParentId, parentId));
} }
@Override
public Category getCategoryById(String id) {
return this.getById(id);
}
/** /**
* 根据分类id集合获取所有分类根据层级排序 * 根据分类id集合获取所有分类根据层级排序
* *

View File

@ -7,7 +7,6 @@ import cn.lili.modules.goods.service.CategorySpecificationService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -18,7 +17,6 @@ import java.util.List;
* @since 2020-02-23 15:18:56 * @since 2020-02-23 15:18:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class CategorySpecificationServiceImpl extends ServiceImpl<CategorySpecificationMapper, CategorySpecification> implements CategorySpecificationService { public class CategorySpecificationServiceImpl extends ServiceImpl<CategorySpecificationMapper, CategorySpecification> implements CategorySpecificationService {
@Override @Override

View File

@ -8,7 +8,6 @@ import cn.lili.modules.goods.entity.dos.Category;
import cn.lili.modules.goods.entity.dos.DraftGoods; import cn.lili.modules.goods.entity.dos.DraftGoods;
import cn.lili.modules.goods.entity.dos.GoodsGallery; import cn.lili.modules.goods.entity.dos.GoodsGallery;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.modules.goods.entity.dto.DraftGoodsDTO; import cn.lili.modules.goods.entity.dto.DraftGoodsDTO;
import cn.lili.modules.goods.entity.dto.DraftGoodsSearchParams; import cn.lili.modules.goods.entity.dto.DraftGoodsSearchParams;
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
@ -18,11 +17,11 @@ import cn.lili.modules.goods.service.CategoryService;
import cn.lili.modules.goods.service.DraftGoodsService; import cn.lili.modules.goods.service.DraftGoodsService;
import cn.lili.modules.goods.service.GoodsGalleryService; import cn.lili.modules.goods.service.GoodsGalleryService;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.mybatis.util.PageUtil;
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.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
@ -33,7 +32,6 @@ import java.util.*;
* @since 2020/12/19 * @since 2020/12/19
**/ **/
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class DraftGoodsServiceImpl extends ServiceImpl<DraftGoodsMapper, DraftGoods> implements DraftGoodsService { public class DraftGoodsServiceImpl extends ServiceImpl<DraftGoodsMapper, DraftGoods> implements DraftGoodsService {
/** /**
* 分类 * 分类

View File

@ -14,7 +14,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -27,7 +26,6 @@ import java.util.List;
* 2020-02-23 15:18:56 * 2020-02-23 15:18:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class GoodsGalleryServiceImpl extends ServiceImpl<GoodsGalleryMapper, GoodsGallery> implements GoodsGalleryService { public class GoodsGalleryServiceImpl extends ServiceImpl<GoodsGalleryMapper, GoodsGallery> implements GoodsGalleryService {
/** /**
* 设置 * 设置

View File

@ -63,7 +63,6 @@ import java.util.*;
* @since 2020-02-23 15:18:56 * @since 2020-02-23 15:18:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements GoodsService { public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements GoodsService {
@ -384,6 +383,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void updateStock(String goodsId, Integer quantity) { public void updateStock(String goodsId, Integer quantity) {
LambdaUpdateWrapper<Goods> lambdaUpdateWrapper = Wrappers.lambdaUpdate(); LambdaUpdateWrapper<Goods> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.set(Goods::getQuantity, quantity); lambdaUpdateWrapper.set(Goods::getQuantity, quantity);

View File

@ -22,13 +22,14 @@ 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.CategoryService; import cn.lili.modules.goods.service.CategoryService;
import cn.lili.modules.goods.service.GoodsGalleryService; import cn.lili.modules.goods.service.GoodsGalleryService;
import cn.lili.modules.goods.service.GoodsService; import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.member.entity.dos.FootPrint; import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.entity.dto.EvaluationQueryParams;
import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
import cn.lili.modules.member.service.MemberEvaluationService; import cn.lili.modules.member.service.MemberEvaluationService;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
@ -48,10 +49,9 @@ 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.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.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -63,7 +63,6 @@ import java.util.stream.Collectors;
* @since 2020-02-23 15:18:56 * @since 2020-02-23 15:18:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> implements GoodsSkuService { public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> implements GoodsSkuService {
/** /**
@ -110,6 +109,9 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
@Autowired @Autowired
private PromotionGoodsService promotionGoodsService; private PromotionGoodsService promotionGoodsService;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Override @Override
public void add(List<Map<String, Object>> skuList, Goods goods) { public void add(List<Map<String, Object>> skuList, Goods goods) {
// 检查是否需要生成索引 // 检查是否需要生成索引
@ -129,6 +131,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void update(List<Map<String, Object>> skuList, Goods goods, Boolean regeneratorSkuFlag) { public void update(List<Map<String, Object>> skuList, Goods goods, Boolean regeneratorSkuFlag) {
// 是否存在规格 // 是否存在规格
if (skuList == null || skuList.isEmpty()) { if (skuList == null || skuList.isEmpty()) {
@ -251,11 +254,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
//获取当前商品的索引信息 //获取当前商品的索引信息
EsGoodsIndex goodsIndex = goodsIndexService.findById(skuId); EsGoodsIndex goodsIndex = goodsIndexService.findById(skuId);
if (goodsIndex == null) { if (goodsIndex == null) {
goodsIndex = goodsIndexService.getTempEsGoodsIndex(goodsSku, goodsVO.getGoodsParamsDTOList()); goodsIndex = goodsIndexService.getResetEsGoodsIndex(goodsSku, goodsVO.getGoodsParamsDTOList());
//发送mq消息
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.RESET_GOODS_INDEX.name();
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(Collections.singletonList(goodsIndex)), RocketmqSendCallbackBuilder.commonCallback());
} }
//商品规格 //商品规格
@ -503,12 +502,11 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
//获取商品信息 //获取商品信息
GoodsSku goodsSku = this.getGoodsSkuByIdFromCache(skuId); GoodsSku goodsSku = this.getGoodsSkuByIdFromCache(skuId);
LambdaQueryWrapper<MemberEvaluation> goodEvaluationQueryWrapper = new LambdaQueryWrapper<>(); EvaluationQueryParams queryParams = new EvaluationQueryParams();
goodEvaluationQueryWrapper.eq(MemberEvaluation::getSkuId, goodsSku.getId()); queryParams.setGrade(EvaluationGradeEnum.GOOD.name());
goodEvaluationQueryWrapper.eq(MemberEvaluation::getGrade, EvaluationGradeEnum.GOOD.name()); queryParams.setSkuId(goodsSku.getId());
//好评数量 //好评数量
long highPraiseNum = memberEvaluationService.count(goodEvaluationQueryWrapper); long highPraiseNum = memberEvaluationService.getEvaluationCount(queryParams);
//更新商品评价数量 //更新商品评价数量
goodsSku.setCommentNum(goodsSku.getCommentNum() != null ? goodsSku.getCommentNum() + 1 : 1); goodsSku.setCommentNum(goodsSku.getCommentNum() != null ? goodsSku.getCommentNum() + 1 : 1);
@ -532,22 +530,6 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
goodsService.updateGoodsCommentNum(goodsSku.getGoodsId()); goodsService.updateGoodsCommentNum(goodsSku.getGoodsId());
} }
/**
* 更新商品sku促销价格
*
* @param skuId skuId
* @param promotionPrice 促销价格
*/
@Override
public void updateGoodsSkuPromotion(String skuId, Double promotionPrice) {
LambdaUpdateWrapper<GoodsSku> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(GoodsSku::getId, skuId);
updateWrapper.set(GoodsSku::getPromotionPrice, promotionPrice);
updateWrapper.set(GoodsSku::getPromotionFlag, true);
this.update(updateWrapper);
cache.remove(GoodsSkuService.getCacheKeys(skuId));
}
/** /**
* 根据商品id获取全部skuId的集合 * 根据商品id获取全部skuId的集合
* *
@ -565,15 +547,12 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
* @param goods 商品信息 * @param goods 商品信息
*/ */
@Override @Override
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void generateEs(Goods goods) { public void generateEs(Goods goods) {
// 不生成没有审核通过且没有上架的商品 // 不生成没有审核通过且没有上架的商品
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;
} }
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GENERATOR_GOODS_INDEX.name(); applicationEventPublisher.publishEvent(new GeneratorEsGoodsIndexEvent("生成商品索引事件", goods.getId()));
//发送mq消息
rocketMQTemplate.asyncSend(destination, goods.getId(), RocketmqSendCallbackBuilder.commonCallback());
} }
/** /**
@ -599,7 +578,8 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
* @param skuList sku列表 * @param skuList sku列表
* @param goods 商品信息 * @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<>(); List<GoodsSku> skus = new ArrayList<>();
for (Map<String, Object> skuVO : skuList) { for (Map<String, Object> skuVO : skuList) {
Map<String, Object> resultMap = this.add(skuVO, goods); Map<String, Object> resultMap = this.add(skuVO, goods);

View File

@ -5,7 +5,6 @@ import cn.lili.modules.goods.mapper.GoodsWordsMapper;
import cn.lili.modules.goods.service.GoodsWordsService; import cn.lili.modules.goods.service.GoodsWordsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 商品关键字业务层实现 * 商品关键字业务层实现
@ -14,6 +13,5 @@ import org.springframework.transaction.annotation.Transactional;
* @since 2020/10/15 * @since 2020/10/15
**/ **/
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class GoodsWordsServiceImpl extends ServiceImpl<GoodsWordsMapper, GoodsWords> implements GoodsWordsService { public class GoodsWordsServiceImpl extends ServiceImpl<GoodsWordsMapper, GoodsWords> implements GoodsWordsService {
} }

View File

@ -17,7 +17,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
@ -30,7 +29,6 @@ import java.util.List;
* @since 2020-03-07 16:18:56 * @since 2020-03-07 16:18:56
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class StoreGoodsLabelServiceImpl extends ServiceImpl<StoreGoodsLabelMapper, StoreGoodsLabel> implements StoreGoodsLabelService { public class StoreGoodsLabelServiceImpl extends ServiceImpl<StoreGoodsLabelMapper, StoreGoodsLabel> implements StoreGoodsLabelService {
/** /**

View File

@ -1,12 +1,11 @@
package cn.lili.modules.member.entity.dto; package cn.lili.modules.member.entity.dto;
import cn.lili.common.security.context.UserContext; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* 评价查询条件 * 评价查询条件
@ -14,13 +13,19 @@ import lombok.Data;
* @author Bulbasaur * @author Bulbasaur
* @since 2020/11/30 14:52 * @since 2020/11/30 14:52
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class EvaluationQueryParams extends PageVO { public class EvaluationQueryParams extends PageVO {
@ApiModelProperty(value = "ID")
private String id;
@ApiModelProperty(value = "买家ID") @ApiModelProperty(value = "买家ID")
private String memberId; private String memberId;
@ApiModelProperty(value = "skuID")
private String skuId;
@ApiModelProperty(value = "会员名称") @ApiModelProperty(value = "会员名称")
private String memberName; private String memberName;
@ -51,40 +56,42 @@ public class EvaluationQueryParams extends PageVO {
@ApiModelProperty(value = "状态") @ApiModelProperty(value = "状态")
private String status; private String status;
public EvaluationQueryParams() {
}
public <T> QueryWrapper<T> queryWrapper() { public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>(); QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { if (CharSequenceUtil.isNotEmpty(id)) {
queryWrapper.eq("id", id);
}
if (CharSequenceUtil.isNotEmpty(startTime) && CharSequenceUtil.isNotEmpty(endTime)) {
queryWrapper.between("create_time", startTime, endTime); queryWrapper.between("create_time", startTime, endTime);
} }
if (StringUtils.isNotEmpty(grade)) { if (CharSequenceUtil.isNotEmpty(grade)) {
queryWrapper.eq("grade", grade); queryWrapper.eq("grade", grade);
} }
if (StringUtils.isNotEmpty(goodsName)) { if (CharSequenceUtil.isNotEmpty(goodsName)) {
queryWrapper.like("goods_name", goodsName); queryWrapper.like("goods_name", goodsName);
} }
if (StringUtils.isNotEmpty(storeName)) { if (CharSequenceUtil.isNotEmpty(storeName)) {
queryWrapper.like("store_name", storeName); queryWrapper.like("store_name", storeName);
} }
if (StringUtils.isNotEmpty(memberName)) { if (CharSequenceUtil.isNotEmpty(memberName)) {
queryWrapper.like("member_name", memberName); queryWrapper.like("member_name", memberName);
} }
if (StringUtils.isNotEmpty(goodsId)) { if (CharSequenceUtil.isNotEmpty(goodsId)) {
queryWrapper.eq("goods_id", goodsId); queryWrapper.eq("goods_id", goodsId);
} }
if (StringUtils.isNotEmpty(storeId)) { if (CharSequenceUtil.isNotEmpty(skuId)) {
queryWrapper.eq("sku_id", skuId);
}
if (CharSequenceUtil.isNotEmpty(storeId)) {
queryWrapper.eq("store_id", storeId); queryWrapper.eq("store_id", storeId);
} }
if (StringUtils.isNotEmpty(memberId)) { if (CharSequenceUtil.isNotEmpty(memberId)) {
queryWrapper.eq("member_id", memberId); queryWrapper.eq("member_id", memberId);
} }
if (StringUtils.isNotEmpty(haveImage)) { if (CharSequenceUtil.isNotEmpty(haveImage)) {
queryWrapper.eq("have_image", haveImage); queryWrapper.eq("have_image", haveImage);
} }
if (StringUtils.isNotEmpty(status)) { if (CharSequenceUtil.isNotEmpty(status)) {
queryWrapper.eq("status", status); queryWrapper.eq("status", status);
} }
queryWrapper.eq("delete_flag", false); queryWrapper.eq("delete_flag", false);

View File

@ -34,8 +34,9 @@ public interface FootprintMapper extends BaseMapper<FootPrint> {
* *
* @param memberId 会员ID * @param memberId 会员ID
*/ */
@Delete("DELETE FROM li_foot_print WHERE (SELECT COUNT(b.id) FROM ( SELECT * FROM li_foot_print WHERE member_id = #{memberId} ) b) >100 " + @Delete("DELETE FROM li_foot_print l1 WHERE l1.id IN (" +
" AND id =(SELECT a.id FROM ( SELECT * FROM li_foot_print WHERE member_id = #{memberId} ORDER BY create_time ASC LIMIT 1 ) AS a)") "SELECT l2.id FROM (" +
"SELECT l3.id FROM li_foot_print l3 WHERE l3.member_id=${memberId} ORDER BY id DESC LIMIT 100,100) l2)")
void deleteLastFootPrint(String memberId); void deleteLastFootPrint(String memberId);
} }

View File

@ -41,9 +41,10 @@ public interface MemberEvaluationService extends IService<MemberEvaluation> {
* 4.发送用户评价消息修改商品的评价数量以及好评率 * 4.发送用户评价消息修改商品的评价数量以及好评率
* *
* @param memberEvaluationDTO 评论 * @param memberEvaluationDTO 评论
* @param isSelf 是否自己操作true买家操作/false 系统操作
* @return 操作状态 * @return 操作状态
*/ */
MemberEvaluationDTO addMemberEvaluation(MemberEvaluationDTO memberEvaluationDTO); MemberEvaluationDTO addMemberEvaluation(MemberEvaluationDTO memberEvaluationDTO, Boolean isSelf);
/** /**
* 根据ID查询会员评价 * 根据ID查询会员评价
@ -88,5 +89,26 @@ public interface MemberEvaluationService extends IService<MemberEvaluation> {
*/ */
EvaluationNumberVO getEvaluationNumber(String goodsId); EvaluationNumberVO getEvaluationNumber(String goodsId);
/**
* 获取今天新增的评价数量
*
* @return 今日评价数量
*/
long todayMemberEvaluation();
/**
* 获取等待回复评价数量
*
* @return 等待回复评价数量
*/
long getWaitReplyNum();
/**
* 统计商品评价数量
*
* @param evaluationQueryParams 查询条件
* @return 商品评价数量
*/
long getEvaluationCount(EvaluationQueryParams evaluationQueryParams);
} }

View File

@ -220,4 +220,19 @@ public interface MemberService extends IService<Member> {
* @param userEnums token角色类型 * @param userEnums token角色类型
*/ */
void logout(UserEnums userEnums); void logout(UserEnums userEnums);
/**
* 获取所有会员的手机号
*
* @return 所有会员的手机号
*/
List<String> getAllMemberMobile();
/**
* 更新会员登录时间为最新时间
*
* @param memberId 会员id
* @return 是否更新成功
*/
boolean updateMemberLoginTime(String memberId);
} }

View File

@ -13,7 +13,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
@ -27,7 +26,6 @@ import java.util.Objects;
* @since 2020/11/18 10:46 上午 * @since 2020/11/18 10:46 上午
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class FootprintServiceImpl extends ServiceImpl<FootprintMapper, FootPrint> implements FootprintService { public class FootprintServiceImpl extends ServiceImpl<FootprintMapper, FootPrint> implements FootprintService {
/** /**

View File

@ -14,7 +14,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
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.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -26,7 +25,6 @@ import java.util.Optional;
* @since 2020/11/18 2:25 下午 * @since 2020/11/18 2:25 下午
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class GoodsCollectionServiceImpl extends ServiceImpl<GoodsCollectionMapper, GoodsCollection> implements GoodsCollectionService { public class GoodsCollectionServiceImpl extends ServiceImpl<GoodsCollectionMapper, GoodsCollection> implements GoodsCollectionService {

View File

@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects; import java.util.Objects;
@ -23,7 +22,6 @@ import java.util.Objects;
* @since 2020/11/18 9:44 上午 * @since 2020/11/18 9:44 上午
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class MemberAddressServiceImpl extends ServiceImpl<MemberAddressMapper, MemberAddress> implements MemberAddressService { public class MemberAddressServiceImpl extends ServiceImpl<MemberAddressMapper, MemberAddress> implements MemberAddressService {
@Override @Override

View File

@ -1,11 +1,15 @@
package cn.lili.modules.member.serviceimpl; package cn.lili.modules.member.serviceimpl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
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.enums.SwitchEnum; import cn.lili.common.enums.SwitchEnum;
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;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.sensitive.SensitiveWordsFilter; import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.StringUtils;
import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.dos.GoodsSku;
@ -29,6 +33,7 @@ import cn.lili.modules.order.order.service.OrderService;
import cn.lili.mybatis.util.PageUtil; import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum; import cn.lili.rocketmq.tags.GoodsTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@ -51,7 +56,6 @@ import java.util.Map;
* @since 2020-02-25 14:10:16 * @since 2020-02-25 14:10:16
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMapper, MemberEvaluation> implements MemberEvaluationService { public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMapper, MemberEvaluation> implements MemberEvaluationService {
/** /**
@ -102,13 +106,16 @@ public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMap
} }
@Override @Override
public MemberEvaluationDTO addMemberEvaluation(MemberEvaluationDTO memberEvaluationDTO) { @Transactional(rollbackFor = Exception.class)
public MemberEvaluationDTO addMemberEvaluation(MemberEvaluationDTO memberEvaluationDTO, Boolean isSelf) {
//获取子订单信息 //获取子订单信息
OrderItem orderItem = orderItemService.getBySn(memberEvaluationDTO.getOrderItemSn()); OrderItem orderItem = orderItemService.getBySn(memberEvaluationDTO.getOrderItemSn());
//获取订单信息 //获取订单信息
Order order = orderService.getBySn(orderItem.getOrderSn()); Order order = orderService.getBySn(orderItem.getOrderSn());
//检测是否可以添加会员评价 //检测是否可以添加会员评价
if (Boolean.TRUE.equals(isSelf)) {
checkMemberEvaluation(orderItem, order); checkMemberEvaluation(orderItem, order);
}
//获取用户信息 //获取用户信息
Member member = memberService.getUserInfo(); Member member = memberService.getUserInfo();
//获取商品信息 //获取商品信息
@ -191,6 +198,31 @@ public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMap
return evaluationNumberVO; return evaluationNumberVO;
} }
@Override
public long todayMemberEvaluation() {
return this.count(new LambdaQueryWrapper<MemberEvaluation>().ge(MemberEvaluation::getCreateTime, DateUtil.beginOfDay(new DateTime())));
}
@Override
public long getWaitReplyNum() {
QueryWrapper<MemberEvaluation> queryWrapper = Wrappers.query();
queryWrapper.eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()),
"store_id", UserContext.getCurrentUser().getStoreId());
queryWrapper.eq("reply_status", false);
return this.count(queryWrapper);
}
/**
* 统计商品评价数量
*
* @param evaluationQueryParams 查询条件
* @return 商品评价数量
*/
@Override
public long getEvaluationCount(EvaluationQueryParams evaluationQueryParams) {
return this.count(evaluationQueryParams.queryWrapper());
}
/** /**
* 检测会员评价 * 检测会员评价
* *

View File

@ -17,6 +17,7 @@ import cn.lili.common.security.token.Token;
import cn.lili.common.sensitive.SensitiveWordsFilter; import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CookieUtil; import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.UuidUtils; import cn.lili.common.utils.UuidUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.config.ConnectAuthEnum;
@ -49,8 +50,8 @@ import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -62,7 +63,6 @@ import java.util.Objects;
* @since 2021-03-29 14:10:16 * @since 2021-03-29 14:10:16
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService { public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
/** /**
@ -143,7 +143,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); throw new ServiceException(ResultCode.USER_PASSWORD_ERROR);
} }
loginBindUser(member); loginBindUser(member);
return memberTokenGenerate.createToken(member.getUsername(), false); return memberTokenGenerate.createToken(member, false);
} }
@Override @Override
@ -168,7 +168,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
throw new ServiceException(ResultCode.USER_NOT_EXIST); throw new ServiceException(ResultCode.USER_NOT_EXIST);
} }
return storeTokenGenerate.createToken(member.getUsername(), false); return storeTokenGenerate.createToken(member, false);
} }
/** /**
@ -196,12 +196,10 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
String username = UuidUtils.getUUID(); String username = UuidUtils.getUUID();
Member member = new Member(username, UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(), Member member = new Member(username, UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(),
authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0); authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0);
//保存会员 registerHandler(member);
this.save(member);
Member loadMember = this.findByUsername(username);
//绑定登录方式 //绑定登录方式
loginBindUser(loadMember, authUser.getUuid(), authUser.getSource()); loginBindUser(member, authUser.getUuid(), authUser.getSource());
return memberTokenGenerate.createToken(username, false); return memberTokenGenerate.createToken(member, false);
} catch (ServiceException e) { } catch (ServiceException e) {
log.error("自动注册服务泡出异常:", e); log.error("自动注册服务泡出异常:", e);
throw e; throw e;
@ -235,14 +233,24 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//如果手机号不存在则自动注册用户 //如果手机号不存在则自动注册用户
if (member == null) { if (member == null) {
member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone); member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone);
registerHandler(member);
}
loginBindUser(member);
return memberTokenGenerate.createToken(member, false);
}
/**
* 注册方法抽象
*
* @param member
*/
private void registerHandler(Member member) {
member.setId(SnowFlake.getIdStr());
//保存会员 //保存会员
this.save(member); this.save(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name(); String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback()); rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
} }
loginBindUser(member);
return memberTokenGenerate.createToken(member.getUsername(), false);
}
@Override @Override
public Member editOwn(MemberEditDTO memberEditDTO) { public Member editOwn(MemberEditDTO memberEditDTO) {
@ -281,14 +289,10 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//设置会员信息 //设置会员信息
Member member = new Member(userName, new BCryptPasswordEncoder().encode(password), mobilePhone); Member member = new Member(userName, new BCryptPasswordEncoder().encode(password), mobilePhone);
//注册成功后用户自动登录 //注册成功后用户自动登录
if (this.save(member)) { registerHandler(member);
Token token = memberTokenGenerate.createToken(member.getUsername(), false); Token token = memberTokenGenerate.createToken(member, false);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
return token; return token;
} }
return null;
}
@Override @Override
public boolean changeMobile(String mobile) { public boolean changeMobile(String mobile) {
@ -331,9 +335,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
//添加会员 //添加会员
Member member = new Member(memberAddDTO.getUsername(), new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()), memberAddDTO.getMobile()); Member member = new Member(memberAddDTO.getUsername(), new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()), memberAddDTO.getMobile());
this.save(member); registerHandler(member);
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
return member; return member;
} }
@ -430,10 +432,11 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
* @param mobilePhone 手机号 * @param mobilePhone 手机号
* @return 会员 * @return 会员
*/ */
private Member findByPhone(String mobilePhone) { private Long findMember(String mobilePhone, String userName) {
QueryWrapper<Member> queryWrapper = new QueryWrapper<>(); QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mobile", mobilePhone); queryWrapper.eq("mobile", mobilePhone)
return this.baseMapper.selectOne(queryWrapper); .or().eq("username", userName);
return this.baseMapper.selectCount(queryWrapper);
} }
/** /**
@ -582,6 +585,30 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
} }
} }
/**
* 获取所有会员的手机号
*
* @return 所有会员的手机号
*/
@Override
public List<String> getAllMemberMobile() {
return this.baseMapper.getAllMemberMobile();
}
/**
* 更新会员登录时间为最新时间
*
* @param memberId 会员id
* @return 是否更新成功
*/
@Override
public boolean updateMemberLoginTime(String memberId) {
LambdaUpdateWrapper<Member> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Member::getId, memberId);
updateWrapper.set(Member::getLastLoginDate, new Date());
return this.update(updateWrapper);
}
/** /**
* 检测会员 * 检测会员
* *
@ -589,13 +616,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
* @param mobilePhone 手机号 * @param mobilePhone 手机号
*/ */
private void checkMember(String userName, String mobilePhone) { private void checkMember(String userName, String mobilePhone) {
//判断用户名是否存在
if (findByUsername(userName) != null) {
throw new ServiceException(ResultCode.USER_NAME_EXIST);
}
//判断手机号是否存在 //判断手机号是否存在
if (findByPhone(mobilePhone) != null) { if (findMember(userName, mobilePhone) > 0) {
throw new ServiceException(ResultCode.USER_PHONE_EXIST); throw new ServiceException(ResultCode.USER_EXIST);
} }
} }
} }

View File

@ -2,34 +2,30 @@ package cn.lili.modules.member.serviceimpl;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.system.entity.dto.PointSettingItem;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.CurrencyUtil; import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.DateUtil; import cn.lili.common.utils.DateUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.member.entity.dos.MemberSign; import cn.lili.modules.member.entity.dos.MemberSign;
import cn.lili.modules.member.entity.enums.PointTypeEnum;
import cn.lili.modules.member.mapper.MemberSignMapper; import cn.lili.modules.member.mapper.MemberSignMapper;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.member.service.MemberSignService; import cn.lili.modules.member.service.MemberSignService;
import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dos.Setting;
import cn.lili.modules.system.entity.dto.PointSetting; import cn.lili.modules.system.entity.dto.PointSetting;
import cn.lili.modules.system.entity.dto.PointSettingItem;
import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService; import cn.lili.modules.system.service.SettingService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.Gson; import com.google.gson.Gson;
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.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 会员签到业务层实现 * 会员签到业务层实现
@ -67,14 +63,6 @@ public class MemberSignServiceImpl extends ServiceImpl<MemberSignMapper, MemberS
//获取当前会员信息 //获取当前会员信息
AuthUser authUser = UserContext.getCurrentUser(); AuthUser authUser = UserContext.getCurrentUser();
if (authUser != null) { if (authUser != null) {
QueryWrapper<MemberSign> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("member_id", authUser.getId());
queryWrapper.between("create_time", new Date(DateUtil.startOfTodDay() * 1000), DateUtil.getCurrentDayEndTime());
//校验今天是否已经签到
List<MemberSign> todaySigns = this.baseMapper.getTodayMemberSign(queryWrapper);
if (todaySigns.size() > 0) {
throw new ServiceException(ResultCode.MEMBER_SIGN_REPEAT);
}
//当前签到天数的前一天日期 //当前签到天数的前一天日期
List<MemberSign> signs = this.baseMapper.getBeforeMemberSign(authUser.getId()); List<MemberSign> signs = this.baseMapper.getBeforeMemberSign(authUser.getId());
//构建参数 //构建参数
@ -82,21 +70,24 @@ public class MemberSignServiceImpl extends ServiceImpl<MemberSignMapper, MemberS
memberSign.setMemberId(authUser.getId()); memberSign.setMemberId(authUser.getId());
memberSign.setMemberName(authUser.getUsername()); memberSign.setMemberName(authUser.getUsername());
//如果size大于0 说明昨天已经签到过获取昨天的签到数反之新签到 //如果size大于0 说明昨天已经签到过获取昨天的签到数反之新签到
if (signs.size() > 0) { if (!signs.isEmpty()) {
//截止目前为止 签到总天数 不带今天 //截止目前为止 签到总天数 不带今天
Integer signDay = signs.get(0).getSignDay(); Integer signDay = signs.get(0).getSignDay();
memberSign.setSignDay(CurrencyUtil.add(signDay, 1).intValue()); memberSign.setSignDay(CurrencyUtil.add(signDay, 1).intValue());
} else { } else {
memberSign.setSignDay(1); memberSign.setSignDay(1);
} }
Integer result = this.baseMapper.insert(memberSign); //手动写入创建时间以保证唯一索引生效
memberSign.setCreateTime(DateUtil.getCurrentDayEndTime());
try {
this.baseMapper.insert(memberSign);
//签到成功后发送消息赠送积分 //签到成功后发送消息赠送积分
if (result > 0) {
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_SING.name(); String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_SING.name();
rocketMQTemplate.asyncSend(destination, memberSign, RocketmqSendCallbackBuilder.commonCallback()); rocketMQTemplate.asyncSend(destination, memberSign, RocketmqSendCallbackBuilder.commonCallback());
return true; return true;
} catch (Exception e) {
throw new ServiceException(ResultCode.MEMBER_SIGN_REPEAT);
} }
return false;
} }
throw new ServiceException(ResultCode.USER_NOT_LOGIN); throw new ServiceException(ResultCode.USER_NOT_LOGIN);
} }

View File

@ -1,14 +1,17 @@
package cn.lili.modules.member.token; package cn.lili.modules.member.token;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token; import cn.lili.common.security.token.Token;
import cn.lili.common.security.token.TokenUtil; import cn.lili.common.security.token.TokenUtil;
import cn.lili.common.security.token.base.AbstractTokenGenerate; import cn.lili.common.security.token.base.AbstractTokenGenerate;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService; import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -22,17 +25,17 @@ import java.util.Date;
* @since 2020/11/16 10:50 * @since 2020/11/16 10:50
*/ */
@Component @Component
public class MemberTokenGenerate extends AbstractTokenGenerate { public class MemberTokenGenerate extends AbstractTokenGenerate<Member> {
@Autowired
private MemberService memberService;
@Autowired @Autowired
private TokenUtil tokenUtil; private TokenUtil tokenUtil;
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Override @Override
public Token createToken(String username, Boolean longTerm) { public Token createToken(Member member, Boolean longTerm) {
Member member = memberService.findByUsername(username);
//获取客户端类型 //获取客户端类型
String clientType = ThreadContextHolder.getHttpRequest().getHeader("clientType"); String clientType = ThreadContextHolder.getHttpRequest().getHeader("clientType");
@ -50,11 +53,12 @@ public class MemberTokenGenerate extends AbstractTokenGenerate {
//记录最后登录时间客户端类型 //记录最后登录时间客户端类型
member.setLastLoginDate(new Date()); member.setLastLoginDate(new Date());
member.setClientEnum(clientTypeEnum.name()); member.setClientEnum(clientTypeEnum.name());
memberService.updateById(member); String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_LOGIN.name();
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), member.getFace(), UserEnums.MEMBER); AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), member.getFace(), UserEnums.MEMBER);
//登陆成功生成token //登陆成功生成token
return tokenUtil.createToken(username, authUser, longTerm, UserEnums.MEMBER); return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.MEMBER);
} }
@Override @Override

View File

@ -8,7 +8,6 @@ import cn.lili.common.security.token.Token;
import cn.lili.common.security.token.TokenUtil; import cn.lili.common.security.token.TokenUtil;
import cn.lili.common.security.token.base.AbstractTokenGenerate; import cn.lili.common.security.token.base.AbstractTokenGenerate;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.service.StoreService; import cn.lili.modules.store.service.StoreService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -23,29 +22,25 @@ import org.springframework.stereotype.Component;
* @since 2020/11/16 10:51 * @since 2020/11/16 10:51
*/ */
@Component @Component
public class StoreTokenGenerate extends AbstractTokenGenerate { public class StoreTokenGenerate extends AbstractTokenGenerate<Member> {
@Autowired
private MemberService memberService;
@Autowired @Autowired
private StoreService storeService; private StoreService storeService;
@Autowired @Autowired
private TokenUtil tokenUtil; private TokenUtil tokenUtil;
@Override @Override
public Token createToken(String username, Boolean longTerm) { public Token createToken(Member member, Boolean longTerm) {
//生成token if (Boolean.FALSE.equals(member.getHaveStore())) {
Member member = memberService.findByUsername(username);
if (!member.getHaveStore()) {
throw new ServiceException(ResultCode.STORE_NOT_OPEN); throw new ServiceException(ResultCode.STORE_NOT_OPEN);
} }
LambdaQueryWrapper<Store> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Store> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Store::getMemberId, member.getId()); queryWrapper.eq(Store::getMemberId, member.getId());
Store store = storeService.getOne(queryWrapper); Store store = storeService.getOne(queryWrapper);
AuthUser user = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), store.getStoreLogo(), UserEnums.STORE); AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), store.getStoreLogo(), UserEnums.STORE);
user.setStoreId(store.getId()); authUser.setStoreId(store.getId());
user.setStoreName(store.getStoreName()); authUser.setStoreName(store.getStoreName());
return tokenUtil.createToken(username, user, longTerm, UserEnums.STORE); return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.STORE);
} }
@Override @Override

View File

@ -1,20 +1,19 @@
package cn.lili.modules.message.serviceimpl; package cn.lili.modules.message.serviceimpl;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.OtherTagsEnum;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.message.entity.dos.Message; import cn.lili.modules.message.entity.dos.Message;
import cn.lili.modules.message.entity.vos.MessageVO; import cn.lili.modules.message.entity.vos.MessageVO;
import cn.lili.modules.message.mapper.MessageMapper; import cn.lili.modules.message.mapper.MessageMapper;
import cn.lili.modules.message.service.MessageService; import cn.lili.modules.message.service.MessageService;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.OtherTagsEnum;
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.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 管理端发送消息内容业务层实现 * 管理端发送消息内容业务层实现
@ -23,7 +22,6 @@ import org.springframework.transaction.annotation.Transactional;
* @since 2020/11/17 3:48 下午 * @since 2020/11/17 3:48 下午
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> implements MessageService { public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> implements MessageService {
@Autowired @Autowired

View File

@ -6,7 +6,6 @@ import cn.lili.modules.message.service.ShortLinkService;
import cn.lili.mybatis.util.PageUtil; import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -16,7 +15,6 @@ import java.util.List;
* @author Chopper * @author Chopper
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class ShortLinkServiceImpl extends ServiceImpl<ShortLinkMapper, ShortLink> implements ShortLinkService { public class ShortLinkServiceImpl extends ServiceImpl<ShortLinkMapper, ShortLink> implements ShortLinkService {
@Override @Override

View File

@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -18,7 +17,6 @@ import java.util.List;
* @since 2020/11/17 7:37 下午 * @since 2020/11/17 7:37 下午
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class AfterSaleLogServiceImpl extends ServiceImpl<AfterSaleLogMapper, AfterSaleLog> implements AfterSaleLogService { public class AfterSaleLogServiceImpl extends ServiceImpl<AfterSaleLogMapper, AfterSaleLog> implements AfterSaleLogService {
@Override @Override

View File

@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -19,7 +18,6 @@ import java.util.List;
* @since 2020/11/17 7:38 下午 * @since 2020/11/17 7:38 下午
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class AfterSaleReasonServiceImpl extends ServiceImpl<AfterSaleReasonMapper, AfterSaleReason> implements AfterSaleReasonService { public class AfterSaleReasonServiceImpl extends ServiceImpl<AfterSaleReasonMapper, AfterSaleReason> implements AfterSaleReasonService {

View File

@ -51,7 +51,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -65,7 +64,6 @@ import java.util.stream.Collectors;
* @since 2020/11/17 7:38 下午 * @since 2020/11/17 7:38 下午
*/ */
@Service @Service
@Transactional(rollbackFor = Exception.class)
public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale> implements AfterSaleService { public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale> implements AfterSaleService {
/** /**

View File

@ -106,6 +106,7 @@ public class TradeDTO implements Serializable {
*/ */
private MemberAddress memberAddress; private MemberAddress memberAddress;
/** /**
* 客户端类型 * 客户端类型
*/ */

View File

@ -85,17 +85,15 @@ public class TradeBuilder {
* 1.构造交易 * 1.构造交易
* 2.创建交易 * 2.创建交易
* *
* @param checkedWay 购物车类 * @param tradeDTO 交易模
* @return 交易信息 * @return 交易信息
*/ */
public Trade createTrade(CartTypeEnum checkedWay) { public Trade createTrade(TradeDTO tradeDTO) {
//读取对应购物车的商品信息
TradeDTO tradeDTO = cartService.readDTO(checkedWay);
//需要对购物车渲染 //需要对购物车渲染
if (isSingle(checkedWay)) { if (isSingle(tradeDTO.getCartTypeEnum())) {
renderCartBySteps(tradeDTO, RenderStepStatement.singleTradeRender); renderCartBySteps(tradeDTO, RenderStepStatement.singleTradeRender);
} else if (checkedWay.equals(CartTypeEnum.PINTUAN)) { } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN)) {
renderCartBySteps(tradeDTO, RenderStepStatement.pintuanTradeRender); renderCartBySteps(tradeDTO, RenderStepStatement.pintuanTradeRender);
} else { } else {
renderCartBySteps(tradeDTO, RenderStepStatement.tradeRender); renderCartBySteps(tradeDTO, RenderStepStatement.tradeRender);

View File

@ -66,7 +66,7 @@ public class CommissionRender implements CartRenderStep {
String categoryId = cartSkuVO.getGoodsSku().getCategoryPath() String categoryId = cartSkuVO.getGoodsSku().getCategoryPath()
.substring(cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1); .substring(cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1);
if (CharSequenceUtil.isNotEmpty(categoryId)) { if (CharSequenceUtil.isNotEmpty(categoryId)) {
Double commissionRate = categoryService.getById(categoryId).getCommissionRate(); Double commissionRate = categoryService.getCategoryById(categoryId).getCommissionRate();
priceDetailDTO.setPlatFormCommissionPoint(commissionRate); priceDetailDTO.setPlatFormCommissionPoint(commissionRate);
} }

View File

@ -2,7 +2,6 @@ package cn.lili.modules.order.cart.render.impl;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.CurrencyUtil; import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.StringUtils;
import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO;
@ -13,11 +12,8 @@ import cn.lili.modules.order.cart.render.CartRenderStep;
import cn.lili.modules.order.cart.render.util.PromotionPriceUtil; import cn.lili.modules.order.cart.render.util.PromotionPriceUtil;
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
import cn.lili.modules.promotion.entity.enums.CouponTypeEnum; import cn.lili.modules.promotion.entity.enums.CouponTypeEnum;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum; import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
import cn.lili.modules.promotion.entity.vos.MemberCouponVO; import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.modules.promotion.service.MemberCouponService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -64,11 +60,7 @@ public class CouponRender implements CartRenderStep {
* @param tradeDTO 交易dto * @param tradeDTO 交易dto
*/ */
private void renderCouponRule(TradeDTO tradeDTO) { private void renderCouponRule(TradeDTO tradeDTO) {
MemberCouponSearchParams searchParams = new MemberCouponSearchParams(); List<MemberCoupon> memberCouponList = memberCouponService.getMemberCoupons(tradeDTO.getMemberId());
searchParams.setMemberId(UserContext.getCurrentUser().getId());
searchParams.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name());
searchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
List<MemberCoupon> memberCouponList = memberCouponService.getMemberCoupons(searchParams);
if (!memberCouponList.isEmpty()) { if (!memberCouponList.isEmpty()) {
this.checkMemberExistCoupon(tradeDTO, memberCouponList); this.checkMemberExistCoupon(tradeDTO, memberCouponList);

View File

@ -7,7 +7,6 @@ import cn.lili.cache.Cache;
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.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.CurrencyUtil; import cn.lili.common.utils.CurrencyUtil;
@ -35,6 +34,7 @@ import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams; import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams;
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams; import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
@ -47,11 +47,7 @@ import cn.lili.modules.promotion.service.PromotionGoodsService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.modules.search.service.EsGoodsIndexService;
import cn.lili.modules.search.service.EsGoodsSearchService; import cn.lili.modules.search.service.EsGoodsSearchService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -115,16 +111,6 @@ public class CartServiceImpl implements CartService {
*/ */
@Autowired @Autowired
private KanjiaActivityService kanjiaActivityService; private KanjiaActivityService kanjiaActivityService;
/**
* rocketMq
*/
@Autowired
private RocketMQTemplate rocketMQTemplate;
/**
* rocketMq配置
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/** /**
* 交易 * 交易
*/ */
@ -516,12 +502,11 @@ public class CartServiceImpl implements CartService {
CartTypeEnum cartTypeEnum = getCartType(way); CartTypeEnum cartTypeEnum = getCartType(way);
TradeDTO tradeDTO = this.readDTO(cartTypeEnum); TradeDTO tradeDTO = this.readDTO(cartTypeEnum);
MemberCoupon memberCoupon = MemberCouponSearchParams searchParams = new MemberCouponSearchParams();
memberCouponService.getOne( searchParams.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name());
new LambdaQueryWrapper<MemberCoupon>() searchParams.setMemberId(currentUser.getId());
.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()) searchParams.setId(couponId);
.eq(MemberCoupon::getMemberId, currentUser.getId()) MemberCoupon memberCoupon = memberCouponService.getMemberCoupon(searchParams);
.eq(MemberCoupon::getId, couponId));
if (memberCoupon == null) { if (memberCoupon == null) {
throw new ServiceException(ResultCode.COUPON_EXPIRED); throw new ServiceException(ResultCode.COUPON_EXPIRED);
} }
@ -552,10 +537,8 @@ public class CartServiceImpl implements CartService {
if (tradeDTO.getMemberAddress() == null) { if (tradeDTO.getMemberAddress() == null) {
throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST);
} }
//将购物车信息写入缓存后续逻辑调用校验
this.resetTradeDTO(tradeDTO);
//构建交易 //构建交易
Trade trade = tradeBuilder.createTrade(cartTypeEnum); Trade trade = tradeBuilder.createTrade(tradeDTO);
this.cleanChecked(tradeDTO); this.cleanChecked(tradeDTO);
return trade; return trade;
} }
@ -565,11 +548,7 @@ public class CartServiceImpl implements CartService {
EsGoodsIndex goodsIndex = goodsIndexService.findById(dataSku.getId()); EsGoodsIndex goodsIndex = goodsIndexService.findById(dataSku.getId());
if (goodsIndex == null) { if (goodsIndex == null) {
GoodsVO goodsVO = this.goodsService.getGoodsVO(dataSku.getGoodsId()); GoodsVO goodsVO = this.goodsService.getGoodsVO(dataSku.getGoodsId());
goodsIndex = goodsIndexService.getTempEsGoodsIndex(dataSku, goodsVO.getGoodsParamsDTOList()); goodsIndex = goodsIndexService.getResetEsGoodsIndex(dataSku, goodsVO.getGoodsParamsDTOList());
//发送mq消息
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.RESET_GOODS_INDEX.name();
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(Collections.singletonList(goodsIndex)), RocketmqSendCallbackBuilder.commonCallback());
} }
if (goodsIndex.getPromotionMap() != null && !goodsIndex.getPromotionMap().isEmpty()) { if (goodsIndex.getPromotionMap() != null && !goodsIndex.getPromotionMap().isEmpty()) {
if (goodsIndex.getPromotionMap().keySet().stream().anyMatch(i -> i.contains(PromotionTypeEnum.SECKILL.name())) || if (goodsIndex.getPromotionMap().keySet().stream().anyMatch(i -> i.contains(PromotionTypeEnum.SECKILL.name())) ||
@ -692,13 +671,13 @@ public class CartServiceImpl implements CartService {
return cartSkuVOS; return cartSkuVOS;
} else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name())) { } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name())) {
//分类路径是否包含 //分类路径是否包含
return cartSkuVOS.stream().filter(i -> i.getGoodsSku().getCategoryPath().indexOf("," + memberCoupon.getScopeId() + ",") <= 0).collect(Collectors.toList()); return cartSkuVOS.stream().filter(i -> CharSequenceUtil.contains(memberCoupon.getScopeId(), i.getGoodsSku().getCategoryPath())).collect(Collectors.toList());
} else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())) { } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS.name())) {
//范围关联ID是否包含 //范围关联ID是否包含
return cartSkuVOS.stream().filter(i -> memberCoupon.getScopeId().indexOf("," + i.getGoodsSku().getId() + ",") <= 0).collect(Collectors.toList()); return cartSkuVOS.stream().filter(i -> CharSequenceUtil.contains(memberCoupon.getScopeId(), i.getGoodsSku().getId())).collect(Collectors.toList());
} else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_SHOP_CATEGORY.name())) { } else if (memberCoupon.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_SHOP_CATEGORY.name())) {
//店铺分类路径是否包含 //店铺分类路径是否包含
return cartSkuVOS.stream().filter(i -> i.getGoodsSku().getStoreCategoryPath().indexOf("," + memberCoupon.getScopeId() + ",") <= 0).collect(Collectors.toList()); return cartSkuVOS.stream().filter(i -> CharSequenceUtil.contains(memberCoupon.getScopeId(), i.getGoodsSku().getStoreCategoryPath())).collect(Collectors.toList());
} }
return new ArrayList<>(); return new ArrayList<>();
} }

View File

@ -1,9 +1,10 @@
package cn.lili.modules.order.order.entity.dos; package cn.lili.modules.order.order.entity.dos;
import cn.lili.mybatis.BaseEntity;
import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.BeanUtil;
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName; 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;
@ -82,6 +83,7 @@ public class Trade extends BaseEntity {
} }
BeanUtil.copyProperties(tradeDTO, this); BeanUtil.copyProperties(tradeDTO, this);
BeanUtil.copyProperties(tradeDTO.getPriceDetailDTO(), this); BeanUtil.copyProperties(tradeDTO.getPriceDetailDTO(), this);
this.setPayStatus(PayStatusEnum.UNPAID.name());
this.setId(originId); this.setId(originId);
} }
} }

Some files were not shown because too many files have changed in this diff Show More