From 3459169885dfb3ad650fcc479f9d7539d6cd1a17 Mon Sep 17 00:00:00 2001 From: Chopper Date: Thu, 16 Sep 2021 15:32:09 +0800 Subject: [PATCH 1/4] =?UTF-8?q?IM=20=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DB/version4.2.2to4.2.3.sql | 2 ++ .../lili/modules/store/entity/dos/Store.java | 5 ++++ .../modules/system/entity/dto/ImSetting.java | 26 +++++++++++++++++++ .../system/entity/enums/SettingEnum.java | 4 ++- .../setting/SettingManagerController.java | 8 ++++-- 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 DB/version4.2.2to4.2.3.sql create mode 100644 framework/src/main/java/cn/lili/modules/system/entity/dto/ImSetting.java diff --git a/DB/version4.2.2to4.2.3.sql b/DB/version4.2.2to4.2.3.sql new file mode 100644 index 00000000..712abb3b --- /dev/null +++ b/DB/version4.2.2to4.2.3.sql @@ -0,0 +1,2 @@ +/** 新增会员获的总积分 **/ +ALTER TABLE li_store ADD merchant_euid varchar(255) COMMENT '客服标识'; \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/Store.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/Store.java index 2a4c7a9b..980bac72 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/Store.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/Store.java @@ -97,6 +97,11 @@ public class Store extends BaseEntity { @ApiModelProperty(value = "腾讯云智服小程序唯一标识") private String yzfMpSign; + + @ApiModelProperty(value = "udesk IM标识") + private String merchantEuid; + + public Store(Member member) { this.memberId = member.getId(); this.memberName = member.getUsername(); diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/ImSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/ImSetting.java new file mode 100644 index 00000000..87ca2b74 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/ImSetting.java @@ -0,0 +1,26 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * IM设置 + * + * @author Bulbasaur + * @since 2021/5/16 11:10 下午 + */ +@Data +public class ImSetting implements Serializable { + + + @ApiModelProperty(value = "平台地址") + private String httpUrl; + + + @ApiModelProperty(value = "平台ID") + private Integer tenantId; + + +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java b/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java index 727f1a83..8e511b96 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java @@ -42,5 +42,7 @@ public enum SettingEnum { //支付宝支付设置 ALIPAY_PAYMENT, //微信支付设置 - WECHAT_PAYMENT; + WECHAT_PAYMENT, + //IM 配置 + IM; } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java index ee1ecd45..7255c165 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java @@ -46,7 +46,7 @@ public class SettingManagerController { "WECHAT_PC_CONNECT,WECHAT_WAP_CONNECT,WECHAT_APP_CONNECT,WECHAT_MP_CONNECT," + "QQ_WEB_CONNECT,QQ_APP_CONNECT," + "QQ_WEB_CONNECT,QQ_APP_CONNECT,WEIBO_CONNECT,ALIPAY_CONNECT," + - "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING") + "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING,IM") public ResultMessage saveConfig(@PathVariable String key, @RequestBody String configValue) { SettingEnum settingEnum = SettingEnum.valueOf(key); //获取系统配置 @@ -92,7 +92,7 @@ public class SettingManagerController { "WECHAT_PC_CONNECT,WECHAT_WAP_CONNECT,WECHAT_APP_CONNECT,WECHAT_MP_CONNECT," + "QQ_WEB_CONNECT,QQ_APP_CONNECT," + "QQ_WEB_CONNECT,QQ_APP_CONNECT,WEIBO_CONNECT,ALIPAY_CONNECT," + - "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING" + "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING,IM" ) public ResultMessage settingGet(@PathVariable String key) { return createSetting(key); @@ -179,6 +179,10 @@ public class SettingManagerController { return setting == null ? ResultUtil.data(new ExperienceSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), ExperienceSetting.class)); + case IM: + return setting == null ? + ResultUtil.data(new ExperienceSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), ImSetting.class)); default: throw new ServiceException(ResultCode.SETTING_NOT_TO_SET); } From 9cee1093f422b5f683ff74f3ca52515edff952da Mon Sep 17 00:00:00 2001 From: Chopper Date: Fri, 17 Sep 2021 14:47:25 +0800 Subject: [PATCH 2/4] =?UTF-8?q?IM=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/controller/common/IMController.java | 49 +++++++++++++++++++ .../java/cn/lili/common/enums/ResultCode.java | 2 + .../system/entity/enums/SettingEnum.java | 6 +-- .../setting/SettingManagerController.java | 36 +++++++------- 4 files changed, 73 insertions(+), 20 deletions(-) create mode 100644 common-api/src/main/java/cn/lili/controller/common/IMController.java diff --git a/common-api/src/main/java/cn/lili/controller/common/IMController.java b/common-api/src/main/java/cn/lili/controller/common/IMController.java new file mode 100644 index 00000000..1f89b937 --- /dev/null +++ b/common-api/src/main/java/cn/lili/controller/common/IMController.java @@ -0,0 +1,49 @@ +package cn.lili.controller.common; + + +import cn.hutool.json.JSONUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.ImSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * IM控制器 + * + * @author Chopper + * @version v1.0 + * 2021-09-16 15:32 + */ +@RestController +@RequestMapping("/common/IM") +@Api(tags = "IM 中心") +public class IMController { + + @Autowired + private SettingService settingService; + + @ApiOperation(value = "获取店铺列表分页") + @GetMapping + public ResultMessage getUrl() { + String imUrl; + try { + Setting imSettingVal = settingService.get(SettingEnum.IM_SETTING.name()); + ImSetting imSetting = JSONUtil.toBean(imSettingVal.getSettingValue(), ImSetting.class); + imUrl = imSetting.getHttpUrl() + "?tenant_id=" + imSetting.getTenantId()+"&merchant_euid="; + } catch (Exception e) { + throw new ServiceException(ResultCode.PLATFORM_NOT_SUPPORTED_IM); + } + return ResultUtil.data(imUrl); + } + +} diff --git a/framework/src/main/java/cn/lili/common/enums/ResultCode.java b/framework/src/main/java/cn/lili/common/enums/ResultCode.java index c44fc68c..0b95a6f4 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -37,6 +37,8 @@ public enum ResultCode { LIMIT_ERROR(1003, "访问过于频繁,请稍后再试"), ILLEGAL_REQUEST_ERROR(1004, "非法请求,请重新刷新页面操作"), IMAGE_FILE_EXT_ERROR(1005, "不支持图片格式"), + PLATFORM_NOT_SUPPORTED_IM(1006, "平台未开启IM"), + STORE_NOT_SUPPORTED_IM(1007, "店铺未开启IM"), /** * 分类 */ diff --git a/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java b/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java index 8e511b96..ec6b1e23 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/enums/SettingEnum.java @@ -31,6 +31,8 @@ public enum SettingEnum { EXPERIENCE_SETTING, //秒杀活动设置 SECKILL_SETTING, + //IM 配置 + IM_SETTING, //微信 联合登陆设置 WECHAT_CONNECT, @@ -42,7 +44,5 @@ public enum SettingEnum { //支付宝支付设置 ALIPAY_PAYMENT, //微信支付设置 - WECHAT_PAYMENT, - //IM 配置 - IM; + WECHAT_PAYMENT; } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java index 7255c165..5d3aa8e1 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/SettingManagerController.java @@ -63,6 +63,23 @@ public class SettingManagerController { return ResultUtil.success(); } + + @DemoSite + @ApiOperation(value = "查看配置") + @GetMapping(value = "/get/{key}") + @ApiImplicitParam(name = "key", value = "配置key", paramType = "path" + , allowableValues = "BASE_SETTING,EMAIL_SETTING,GOODS_SETTING,KUAIDI_SETTING,ORDER_SETTING,OSS_SETTING,POINT_SETTING," + + "WECHAT_PC_CONNECT,WECHAT_WAP_CONNECT,WECHAT_APP_CONNECT,WECHAT_MP_CONNECT," + + "QQ_WEB_CONNECT,QQ_APP_CONNECT," + + "QQ_WEB_CONNECT,QQ_APP_CONNECT,WEIBO_CONNECT,ALIPAY_CONNECT," + + "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING,IM" + ) + public ResultMessage settingGet(@PathVariable String key) { + return createSetting(key); + } + + + /** * 对配置进行过滤 * @@ -83,21 +100,6 @@ public class SettingManagerController { return configValue; } - - @DemoSite - @ApiOperation(value = "查看配置") - @GetMapping(value = "/get/{key}") - @ApiImplicitParam(name = "key", value = "配置key", paramType = "path" - , allowableValues = "BASE_SETTING,EMAIL_SETTING,GOODS_SETTING,KUAIDI_SETTING,ORDER_SETTING,OSS_SETTING,POINT_SETTING," + - "WECHAT_PC_CONNECT,WECHAT_WAP_CONNECT,WECHAT_APP_CONNECT,WECHAT_MP_CONNECT," + - "QQ_WEB_CONNECT,QQ_APP_CONNECT," + - "QQ_WEB_CONNECT,QQ_APP_CONNECT,WEIBO_CONNECT,ALIPAY_CONNECT," + - "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING,IM" - ) - public ResultMessage settingGet(@PathVariable String key) { - return createSetting(key); - } - /** * 获取表单 * 这里主要包含一个配置对象为空,导致转换异常问题的处理,解决配置项增加减少,带来的系统异常,无法直接配置 @@ -179,9 +181,9 @@ public class SettingManagerController { return setting == null ? ResultUtil.data(new ExperienceSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), ExperienceSetting.class)); - case IM: + case IM_SETTING: return setting == null ? - ResultUtil.data(new ExperienceSetting()) : + ResultUtil.data(new ImSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), ImSetting.class)); default: throw new ServiceException(ResultCode.SETTING_NOT_TO_SET); From ff24c95d0229577ea912ab1454ba85face547b32 Mon Sep 17 00:00:00 2001 From: Chopper Date: Thu, 23 Sep 2021 11:42:03 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/MemberAddressBuyerController.java | 5 ---- .../serviceimpl/MemberSignServiceImpl.java | 22 ++++++++---------- .../serviceimpl/MemberAddressServiceImpl.java | 23 +++++++++++-------- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/buyer-api/src/main/java/cn/lili/controller/member/MemberAddressBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/member/MemberAddressBuyerController.java index 6353c3fa..8cdb835f 100644 --- a/buyer-api/src/main/java/cn/lili/controller/member/MemberAddressBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/member/MemberAddressBuyerController.java @@ -66,11 +66,6 @@ public class MemberAddressBuyerController { @ApiOperation(value = "修改会员收件地址") @PutMapping public ResultMessage editShippingAddress(@Valid MemberAddress shippingAddress) { - //修改会员地址 - shippingAddress.setMemberId(UserContext.getCurrentUser().getId()); - if(shippingAddress.getIsDefault()==null){ - shippingAddress.setIsDefault(false); - } return ResultUtil.data(memberAddressService.updateMemberAddress(shippingAddress)); } diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java index bc4e073a..25dd0ea0 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberSignServiceImpl.java @@ -3,6 +3,7 @@ package cn.lili.modules.member.serviceimpl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.modules.member.entity.enums.PointTypeEnum; +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; @@ -118,24 +119,19 @@ public class MemberSignServiceImpl extends ServiceImpl pointSettingItems = pointSetting.getPointSettingItems(); + if (!pointSettingItems.isEmpty()) { + for (PointSettingItem item : pointSettingItems) { + if (item.getDay().equals(day)) { + point = item.getPoint().longValue(); content = "会员连续签到" + day + "天,赠送积分" + point + "分"; } } } //如果他不处于连续赠送阶段,则只赠送签到积分数 - if (point == -1 && pointSetting.getSignIn() != null) { + if (point == null && pointSetting.getSignIn() != null) { point = Long.valueOf(pointSetting.getSignIn().toString()); content = "会员签到第" + day + "天,赠送积分" + point + "分"; } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberAddressServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberAddressServiceImpl.java index 1272fc18..85f7b69b 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberAddressServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberAddressServiceImpl.java @@ -56,7 +56,7 @@ public class MemberAddressServiceImpl extends ServiceImpl() - .eq("id", memberAddress.getId())); } } From d9b1d78c61f7e6aa1a11829cd091baa00df4637d Mon Sep 17 00:00:00 2001 From: Chopper Date: Fri, 24 Sep 2021 18:15:29 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=A7=AF=E5=88=86=E8=B5=A0=E9=80=81?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E8=BF=94=E8=BF=98=E9=97=AE=E9=A2=98=E5=A4=84?= =?UTF-8?q?=E7=90=86=E3=80=82=20=E7=A7=AF=E5=88=86=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E6=97=B6=E9=A2=84=E6=A0=A1=E9=AA=8C=EF=BC=8C=E4=BB=A5=E5=85=8D?= =?UTF-8?q?=E4=B8=8B=E5=8D=95=E5=90=8E=E5=8F=96=E6=B6=88=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E7=A7=AF=E5=88=86=E8=BF=94=E8=BF=98=E6=97=A0=E6=95=88?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=20=E9=A2=9D=E5=A4=96=E7=9A=84=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E4=BB=A3=E7=A0=81=E5=AE=8C=E5=96=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/event/impl/MemberPointExecute.java | 56 +++++--- .../java/cn/lili/event/impl/PointExecute.java | 57 -------- .../java/cn/lili/common/enums/ResultCode.java | 3 +- .../dto/DistributionGoodsSearchParams.java | 2 +- .../modules/goods/entity/dos/DraftGoods.java | 20 +-- .../lili/modules/goods/entity/dos/Goods.java | 124 +++++------------- .../goods/entity/dto/GoodsOperationDTO.java | 25 +--- .../goods/entity/dto/GoodsSearchParams.java | 6 +- .../order/cart/service/CartServiceImpl.java | 4 + .../order/serviceimpl/TradeServiceImpl.java | 2 +- .../KanjiaActivityGoodsServiceImpl.java | 2 +- .../store/entity/dos/StoreGoodsLabel.java | 6 +- 12 files changed, 95 insertions(+), 212 deletions(-) delete mode 100644 consumer/src/main/java/cn/lili/event/impl/PointExecute.java diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java index 4cf13704..6c32b979 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java @@ -17,6 +17,7 @@ import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.system.entity.dos.Setting; @@ -62,7 +63,7 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp //获取积分设置 PointSetting pointSetting = getPointSetting(); //赠送会员积分 - memberService.updateMemberPoint(Long.valueOf(pointSetting.getRegister().longValue()), PointTypeEnum.INCREASE.name(), member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); + memberService.updateMemberPoint(pointSetting.getRegister().longValue(), PointTypeEnum.INCREASE.name(), member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); } /** @@ -75,7 +76,7 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp //获取积分设置 PointSetting pointSetting = getPointSetting(); //赠送会员积分 - memberService.updateMemberPoint(Long.valueOf(pointSetting.getComment().longValue()), PointTypeEnum.INCREASE.name(), memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); + memberService.updateMemberPoint(pointSetting.getComment().longValue(), PointTypeEnum.INCREASE.name(), memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); } /** @@ -86,30 +87,43 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp @Override public void orderChange(OrderMessage orderMessage) { - if (orderMessage.getNewStatus().equals(OrderStatusEnum.COMPLETED)) { - Order order = orderService.getBySn(orderMessage.getOrderSn()); - //根据订单编号获取订单数据,如果订单促销类型不为空,并且订单促销类型为积分订单 则直接返回 - if (StringUtils.isNotEmpty(order.getOrderPromotionType()) && order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name())) { - return; + switch (orderMessage.getNewStatus()) { + case CANCELLED: { + Order order = orderService.getBySn(orderMessage.getOrderSn()); + Long point = order.getPriceDetailDTO().getPayPoint(); + if (point <= 0) { + return; + } + //如果未付款,则不去要退回相关代码执行 + if (order.getPayStatus().equals(PayStatusEnum.UNPAID.name())) { + return; + } + String content = "订单取消,积分返还:" + point + "分"; + //赠送会员积分 + memberService.updateMemberPoint(point, PointTypeEnum.INCREASE.name(), order.getMemberId(), content); + break; } - //获取积分设置 - PointSetting pointSetting = getPointSetting(); - //计算赠送积分数量 - Double point = CurrencyUtil.mul(pointSetting.getMoney(), order.getFlowPrice(), 0); - //赠送会员积分 - memberService.updateMemberPoint(point.longValue(), PointTypeEnum.INCREASE.name(), order.getMemberId(), "会员下单,赠送积分" + point + "分"); - //取消订单恢复积分 - } else if (orderMessage.getNewStatus().equals(OrderStatusEnum.CANCELLED)) { - //根据订单编号获取订单数据,如果为积分订单则跳回 - Order order = orderService.getBySn(orderMessage.getOrderSn()); - //增加对积分订单的判定,如果积分支付,取消订单则退还用户积分 - if (StringUtils.isNotEmpty(order.getOrderPromotionType()) && - order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name()) && order.getPriceDetailDTO().getPayPoint() != null) { - memberService.updateMemberPoint(Convert.toLong(order.getPriceDetailDTO().getPayPoint()), PointTypeEnum.INCREASE.name(), order.getMemberId(), "订单取消,恢复积分:" + order.getPriceDetailDTO().getPayPoint() + "分"); + case COMPLETED: { + Order order = orderService.getBySn(orderMessage.getOrderSn()); + //根据订单编号获取订单数据,如果订单促销类型不为空,并且订单促销类型为积分订单 则直接返回 + if (StringUtils.isNotEmpty(order.getOrderPromotionType()) && order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINTS.name())) { + return; + } + //获取积分设置 + PointSetting pointSetting = getPointSetting(); + //计算赠送积分数量 + Double point = CurrencyUtil.mul(pointSetting.getMoney(), order.getFlowPrice(), 0); + //赠送会员积分 + memberService.updateMemberPoint(point.longValue(), PointTypeEnum.INCREASE.name(), order.getMemberId(), "会员下单,赠送积分" + point + "分"); + break; } + + default: + break; } } + /** * 提交售后后扣除积分 * diff --git a/consumer/src/main/java/cn/lili/event/impl/PointExecute.java b/consumer/src/main/java/cn/lili/event/impl/PointExecute.java deleted file mode 100644 index be034348..00000000 --- a/consumer/src/main/java/cn/lili/event/impl/PointExecute.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.lili.event.impl; - -import cn.lili.event.OrderStatusChangeEvent; -import cn.lili.modules.member.entity.enums.PointTypeEnum; -import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.entity.dto.OrderMessage; -import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.order.order.service.OrderService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * 积分 - * - * @author Chopper - * @since 2021-03-13 16:58 - */ -@Slf4j -@Service -public class PointExecute implements OrderStatusChangeEvent { - - @Autowired - private MemberService memberService; - - @Autowired - private OrderService orderService; - - @Override - public void orderChange(OrderMessage orderMessage) { - - switch (orderMessage.getNewStatus()) { - case CANCELLED: - Order order = orderService.getBySn(orderMessage.getOrderSn()); - Long point = order.getPriceDetailDTO().getPayPoint(); - if (point <= 0) { - return; - } - //如果未付款,则不去要退回相关代码执行 - if (order.getPayStatus().equals(PayStatusEnum.UNPAID.name())) { - return; - } - //如果他不处于连续赠送阶段,则只赠送签到积分数 - String content = "订单取消,积分返还:" + point + "分"; - //赠送会员积分 - memberService.updateMemberPoint(point, PointTypeEnum.INCREASE.name(), order.getMemberId(), content); - break; - default: - break; - } - - - } - - -} diff --git a/framework/src/main/java/cn/lili/common/enums/ResultCode.java b/framework/src/main/java/cn/lili/common/enums/ResultCode.java index 0b95a6f4..fa811003 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -335,7 +335,8 @@ public enum ResultCode { * 其他促销 */ MEMBER_SIGN_REPEAT(47001, "请勿重复签到"), - POINT_GOODS_ACTIVE_STOCK_ERROR(47002, "最低金额不能高于商品金额"), + POINT_GOODS_ACTIVE_STOCK_ERROR(47002, "活动库存数量不能高于商品库存"), + POINT_GOODS_ACTIVE_STOCK_INSUFFICIENT(47003, "积分商品库存不足"), /** * 砍价活动 diff --git a/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionGoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionGoodsSearchParams.java index bd6f0214..d47a0d36 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionGoodsSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/distribution/entity/dto/DistributionGoodsSearchParams.java @@ -31,7 +31,7 @@ public class DistributionGoodsSearchParams extends PageVO { public QueryWrapper distributionQueryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq(StringUtils.isNotEmpty(goodsName), "dg.goods_name", goodsName); + queryWrapper.like(StringUtils.isNotEmpty(goodsName), "dg.goods_name", goodsName); return queryWrapper; } diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/DraftGoods.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/DraftGoods.java index c8e0fe3b..56b92f3d 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/DraftGoods.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/DraftGoods.java @@ -31,9 +31,10 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "商品名称") private String goodsName; - @Length(max = 30, message = "商品规格编号太长,不能超过30个字符") - @ApiModelProperty(value = "商品编号") - private String sn; + @Max(value = 99999999, message = "价格不能超过99999999") + @ApiModelProperty(value = "商品价格") + private Double price; + @ApiModelProperty(value = "品牌id") private String brandId; @@ -47,9 +48,6 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "卖点") private String sellingPoint; - @ApiModelProperty(value = "重量") - @Max(value = 99999999, message = "重量不能超过99999999") - private Double weight; /** * @see GoodsStatusEnum */ @@ -63,14 +61,6 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "商品移动端详情") private String mobileIntro; - @Max(value = 99999999, message = "价格不能超过99999999") - @ApiModelProperty(value = "商品价格") - private Double price; - - @Max(value = 99999999, message = "成本价格99999999") - @ApiModelProperty(value = "成本价格") - private Double cost; - @ApiModelProperty(value = "购买数量") private Integer buyCount; @@ -137,7 +127,7 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "商品图片JSON") private String goodsGalleryListJson; - + @ApiModelProperty(value = "sku列表JSON") private String skuListJson; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java index 03943a5b..b9045b37 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java @@ -19,6 +19,9 @@ import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.Map; /** @@ -33,17 +36,17 @@ import java.util.Map; public class Goods extends BaseEntity { private static final long serialVersionUID = 370683495251252601L; - /** - * 商品名称 - */ + @ApiModelProperty(value = "商品名称") + @NotEmpty(message = "商品名称不能为空") + @Length(max = 100, message = "商品名称提案仓,不能超过100个字符") private String goodsName; - /** - * 商品编号 - */ - @Length(max = 30, message = "商品规格编号太长,不能超过30个字符") - @ApiModelProperty(value = "商品编号") - private String sn; + + @ApiModelProperty(value = "商品价格", required = true) + @NotNull(message = "商品价格不能为空") + @Min(value = 0, message = "商品价格不能为负数") + @Max(value = 99999999, message = "商品价格不能超过99999999") + private Double price; @ApiModelProperty(value = "品牌id") private String brandId; @@ -54,129 +57,69 @@ public class Goods extends BaseEntity { @ApiModelProperty(value = "计量单位") private String goodsUnit; - /** - * 卖点 - */ + + @Length(max = 60, message = "商品卖点太长,不能超过60个字符") @ApiModelProperty(value = "卖点") private String sellingPoint; /** - * 重量 - */ - @ApiModelProperty(value = "重量") - @Max(value = 99999999, message = "重量不能超过99999999") - private Double weight; - /** - * 上架状态 - * * @see GoodsStatusEnum */ @ApiModelProperty(value = "上架状态") private String marketEnable; - /** - * 详情 - */ + @ApiModelProperty(value = "详情") private String intro; - /** - * 商品价格 - */ - @Max(value = 99999999, message = "价格不能超过99999999") - @ApiModelProperty(value = "商品价格") - private Double price; - /** - * 成本价格 - */ - @Max(value = 99999999, message = "成本价格99999999") - @ApiModelProperty(value = "成本价格") - private Double cost; - /** - * 购买数量 - */ @ApiModelProperty(value = "购买数量") private Integer buyCount; - /** - * 库存 - */ + @Max(value = 99999999, message = "库存不能超过99999999") @ApiModelProperty(value = "库存") private Integer quantity; - /** - * 商品好评率 - */ + @ApiModelProperty(value = "商品好评率") private Double grade; - /** - * 缩略图路径 - */ + @ApiModelProperty(value = "缩略图路径") private String thumbnail; - /** - * 小图路径 - */ + @ApiModelProperty(value = "小图路径") private String small; - /** - * 原图路径 - */ + @ApiModelProperty(value = "原图路径") private String original; - /** - * 店铺分类id - */ + @ApiModelProperty(value = "店铺分类id") private String storeCategoryPath; - /** - * 评论数量 - */ + @ApiModelProperty(value = "评论数量") private Integer commentNum; - /** - * 卖家id - */ + @ApiModelProperty(value = "卖家id") private String storeId; - /** - * 卖家名字 - */ + @ApiModelProperty(value = "卖家名字") private String storeName; - /** - * 运费模板id - */ + @ApiModelProperty(value = "运费模板id") private String templateId; - /** - * 审核状态 - * - * @see GoodsAuthEnum - */ + @ApiModelProperty(value = "审核状态") private String isAuth; - /** - * 审核信息 - */ + @ApiModelProperty(value = "审核信息") private String authMessage; - /** - * 下架原因 - */ + @ApiModelProperty(value = "下架原因") private String underMessage; - /** - * 是否自营 - */ + @ApiModelProperty(value = "是否自营") private Boolean selfOperated; - /** - * 商品移动端详情 - */ + @ApiModelProperty(value = "商品移动端详情") private String mobileIntro; - /** - * 商品视频 - */ + @ApiModelProperty(value = "商品视频") private String goodsVideo; @@ -207,9 +150,6 @@ public class Goods extends BaseEntity { this.categoryPath = goodsOperationDTO.getCategoryPath(); this.storeCategoryPath = goodsOperationDTO.getStoreCategoryPath(); this.brandId = goodsOperationDTO.getBrandId(); - this.sn = goodsOperationDTO.getSn(); - this.price = goodsOperationDTO.getPrice(); - this.weight = goodsOperationDTO.getWeight(); this.templateId = goodsOperationDTO.getTemplateId(); this.recommend = goodsOperationDTO.getRecommend(); this.sellingPoint = goodsOperationDTO.getSellingPoint(); @@ -217,8 +157,8 @@ public class Goods extends BaseEntity { this.goodsUnit = goodsOperationDTO.getGoodsUnit(); this.intro = goodsOperationDTO.getIntro(); this.mobileIntro = goodsOperationDTO.getMobileIntro(); - this.cost = goodsOperationDTO.getCost(); this.goodsVideo = goodsOperationDTO.getGoodsVideo(); + this.price = goodsOperationDTO.getPrice(); if (goodsOperationDTO.getGoodsParamsDTOList() != null && goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) { this.params = JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList()); } diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsOperationDTO.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsOperationDTO.java index a6039d8b..6c3bb520 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsOperationDTO.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsOperationDTO.java @@ -29,6 +29,12 @@ public class GoodsOperationDTO implements Serializable { @ApiModelProperty(hidden = true) private String goodsId; + @ApiModelProperty(value = "商品价格", required = true) + @NotNull(message = "商品价格不能为空") + @Min(value = 0, message = "商品价格不能为负数") + @Max(value = 99999999, message = "商品价格不能超过99999999") + private Double price; + @ApiModelProperty(value = "分类path") private String categoryPath; @@ -45,25 +51,6 @@ public class GoodsOperationDTO implements Serializable { @NotEmpty(message = "商品名称不能为空") private String goodsName; - @ApiModelProperty(value = "商品编号", required = true) - @Length(max = 30, message = "商品编号太长,不能超过30个字符") - private String sn; - - @ApiModelProperty(value = "商品价格", required = true) - @NotNull(message = "商品价格不能为空") - @Min(value = 0, message = "商品价格不能为负数") - @Max(value = 99999999, message = "商品价格不能超过99999999") - private Double price; - - @ApiModelProperty(value = "市场价格", required = true) - @NotNull(message = "市场价格不能为空") - private Double cost; - - @ApiModelProperty(value = "重量", required = true) - @NotNull(message = "商品重量不能为空") - @Min(value = 0, message = "重量不能为负数") - @Max(value = 99999999, message = "重量不能超过99999999") - private Double weight; @ApiModelProperty(value = "详情") private String intro; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java index 6e891b89..ab13aebd 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsSearchParams.java @@ -26,7 +26,7 @@ public class GoodsSearchParams extends PageVO { private String goodsName; @ApiModelProperty(value = "商品编号") - private String sn; + private String id; @ApiModelProperty(value = "商家ID") private String storeId; @@ -78,8 +78,8 @@ public class GoodsSearchParams extends PageVO { if (StringUtils.isNotEmpty(goodsName)) { queryWrapper.like("goods_name", goodsName); } - if (StringUtils.isNotEmpty(sn)) { - queryWrapper.eq("sn", sn); + if (StringUtils.isNotEmpty(id)) { + queryWrapper.eq("id", id); } if (StringUtils.isNotEmpty(storeId)) { queryWrapper.eq("store_id", storeId); diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java index 14cc677b..fa3de3ed 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java @@ -744,6 +744,10 @@ public class CartServiceImpl implements CartService { PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(cartSkuVO.getGoodsSku().getId()); if (pointsGoodsVO != null) { + + if (pointsGoodsVO.getActiveStock() < 1) { + throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_INSUFFICIENT); + } cartSkuVO.setPoint(pointsGoodsVO.getPoints()); cartSkuVO.setPurchasePrice(0D); cartSkuVO.setPointsId(pointsGoodsVO.getId()); diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java index e037ae46..3a74708e 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java @@ -1 +1 @@ -package cn.lili.modules.order.order.serviceimpl; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.TradeMapper; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.TradeService; import cn.lili.modules.promotion.entity.dos.KanjiaActivity; import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.KanjiaActivityService; import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.MqOrderTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * 交易业务层实现 * * @author Chopper * @date 2020/11/17 7:39 下午 */ @Service @Transactional(rollbackFor = Exception.class) public class TradeServiceImpl extends ServiceImpl implements TradeService { /** * 缓存 */ @Autowired private Cache cache; /** * 订单 */ @Autowired private OrderService orderService; /** * 会员 */ @Autowired private MemberService memberService; /** * 优惠券 */ @Autowired private CouponService couponService; /** * 会员优惠券 */ @Autowired private MemberCouponService memberCouponService; /** * 砍价 */ @Autowired private KanjiaActivityService kanjiaActivityService; /** * RocketMQ */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * RocketMQ 配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override @Transactional(rollbackFor = Exception.class) public Trade createTrade(TradeDTO tradeDTO) { //创建订单预校验 createTradeCheck(tradeDTO); Trade trade = new Trade(tradeDTO); String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); //优惠券预处理 couponPretreatment(tradeDTO); //积分预处理 pointPretreatment(tradeDTO); //添加交易 this.save(trade); //添加订单 orderService.intoDB(tradeDTO); //砍价订单处理 kanjiaPretreatment(tradeDTO); //写入缓存,给消费者调用 cache.put(key, tradeDTO); //构建订单创建消息 String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); //发送订单创建消息 rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); return trade; } /** * 创建订单最后一步校验 * * @param tradeDTO */ private void createTradeCheck(TradeDTO tradeDTO) { //创建订单如果没有收获地址, MemberAddress memberAddress = tradeDTO.getMemberAddress(); if (memberAddress == null) { throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } /** * 订单配送区域校验 */ if (tradeDTO.getNotSupportFreight() != null && tradeDTO.getNotSupportFreight().size() > 0) { StringBuilder stringBuilder = new StringBuilder("包含商品有-"); tradeDTO.getNotSupportFreight().forEach(sku -> { stringBuilder.append(sku.getGoodsSku().getGoodsName()); }); throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); } } @Override public Trade getBySn(String sn) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Trade::getSn, sn); return this.getOne(queryWrapper); } @Override public void payTrade(String tradeSn, String paymentName, String receivableNo) { LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); orderQueryWrapper.eq(Order::getTradeSn, tradeSn); List orders = orderService.list(orderQueryWrapper); for (Order order : orders) { orderService.payOrder(order.getSn(), paymentName, receivableNo); } Trade trade = this.getBySn(tradeSn); trade.setPayStatus(PayStatusEnum.PAID.name()); this.saveOrUpdate(trade); } /** * 优惠券预处理 * 下单同时,扣除优惠券 * * @param tradeDTO */ private void couponPretreatment(TradeDTO tradeDTO) { List memberCouponDTOList = new ArrayList<>(); if (null != tradeDTO.getPlatformCoupon()) { memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); } Collection storeCoupons = tradeDTO.getStoreCoupons().values(); if (!storeCoupons.isEmpty()) { memberCouponDTOList.addAll(storeCoupons); } List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); memberCouponService.used(ids); memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); } /** * 创建交易,积分处理 * * @param tradeDTO */ private void pointPretreatment(TradeDTO tradeDTO) { //需要支付积分 if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { StringBuilder orderSns = new StringBuilder(); for (CartVO item : tradeDTO.getCartList()) { orderSns.append(item.getSn()); } boolean result = memberService.updateMemberPoint((0 - tradeDTO.getPriceDetailDTO().getPayPoint().longValue()), PointTypeEnum.REDUCE.name(), tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } } } /** * 创建交易、砍价处理 * @param tradeDTO */ private void kanjiaPretreatment(TradeDTO tradeDTO) { if(tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)){ String kanjiaId=tradeDTO.getSkuList().get(0).getKanjiaId(); kanjiaActivityService.update(new LambdaUpdateWrapper() .eq(KanjiaActivity::getId,kanjiaId) .set(KanjiaActivity::getStatus, KanJiaStatusEnum.END.name())); } } } \ No newline at end of file +package cn.lili.modules.order.order.serviceimpl; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.member.entity.enums.PointTypeEnum; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.TradeMapper; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.TradeService; import cn.lili.modules.promotion.entity.dos.KanjiaActivity; import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.KanjiaActivityService; import cn.lili.modules.promotion.service.MemberCouponService; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.MqOrderTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * 交易业务层实现 * * @author Chopper * @date 2020/11/17 7:39 下午 */ @Service @Transactional(rollbackFor = Exception.class) public class TradeServiceImpl extends ServiceImpl implements TradeService { /** * 缓存 */ @Autowired private Cache cache; /** * 订单 */ @Autowired private OrderService orderService; /** * 会员 */ @Autowired private MemberService memberService; /** * 优惠券 */ @Autowired private CouponService couponService; /** * 会员优惠券 */ @Autowired private MemberCouponService memberCouponService; /** * 砍价 */ @Autowired private KanjiaActivityService kanjiaActivityService; /** * RocketMQ */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * RocketMQ 配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override @Transactional(rollbackFor = Exception.class) public Trade createTrade(TradeDTO tradeDTO) { //创建订单预校验 createTradeCheck(tradeDTO); Trade trade = new Trade(tradeDTO); String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); //优惠券预处理 couponPretreatment(tradeDTO); //积分预处理 pointPretreatment(tradeDTO); //添加交易 this.save(trade); //添加订单 orderService.intoDB(tradeDTO); //砍价订单处理 kanjiaPretreatment(tradeDTO); //写入缓存,给消费者调用 cache.put(key, tradeDTO); //构建订单创建消息 String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); //发送订单创建消息 rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); return trade; } /** * 创建订单最后一步校验 * * @param tradeDTO */ private void createTradeCheck(TradeDTO tradeDTO) { //创建订单如果没有收获地址, MemberAddress memberAddress = tradeDTO.getMemberAddress(); if (memberAddress == null) { throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } /** * 订单配送区域校验 */ if (tradeDTO.getNotSupportFreight() != null && tradeDTO.getNotSupportFreight().size() > 0) { StringBuilder stringBuilder = new StringBuilder("包含商品有-"); tradeDTO.getNotSupportFreight().forEach(sku -> { stringBuilder.append(sku.getGoodsSku().getGoodsName()); }); throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); } } @Override public Trade getBySn(String sn) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Trade::getSn, sn); return this.getOne(queryWrapper); } @Override public void payTrade(String tradeSn, String paymentName, String receivableNo) { LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); orderQueryWrapper.eq(Order::getTradeSn, tradeSn); List orders = orderService.list(orderQueryWrapper); for (Order order : orders) { orderService.payOrder(order.getSn(), paymentName, receivableNo); } Trade trade = this.getBySn(tradeSn); trade.setPayStatus(PayStatusEnum.PAID.name()); this.saveOrUpdate(trade); } /** * 优惠券预处理 * 下单同时,扣除优惠券 * * @param tradeDTO */ private void couponPretreatment(TradeDTO tradeDTO) { List memberCouponDTOList = new ArrayList<>(); if (null != tradeDTO.getPlatformCoupon()) { memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); } Collection storeCoupons = tradeDTO.getStoreCoupons().values(); if (!storeCoupons.isEmpty()) { memberCouponDTOList.addAll(storeCoupons); } List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); memberCouponService.used(ids); memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); } /** * 创建交易,积分处理 * * @param tradeDTO */ private void pointPretreatment(TradeDTO tradeDTO) { //需要支付积分 if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { StringBuilder orderSns = new StringBuilder(); for (CartVO item : tradeDTO.getCartList()) { orderSns.append(item.getSn()); } boolean result = memberService.updateMemberPoint(tradeDTO.getPriceDetailDTO().getPayPoint().longValue(), PointTypeEnum.REDUCE.name(), tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } } } /** * 创建交易、砍价处理 * * @param tradeDTO */ private void kanjiaPretreatment(TradeDTO tradeDTO) { if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) { String kanjiaId = tradeDTO.getSkuList().get(0).getKanjiaId(); kanjiaActivityService.update(new LambdaUpdateWrapper() .eq(KanjiaActivity::getId, kanjiaId) .set(KanjiaActivity::getStatus, KanJiaStatusEnum.END.name())); } } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java index 50e64bc2..c6cd6abd 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/KanjiaActivityGoodsServiceImpl.java @@ -185,7 +185,7 @@ public class KanjiaActivityGoodsServiceImpl extends ServiceImpl