diff --git a/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java index f655ce92..e8e0b982 100644 --- a/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java @@ -82,9 +82,6 @@ public class GoodsBuyerController { @NotNull(message = "SKU ID不能为空") @PathVariable("skuId") String skuId) { Map map = goodsSkuService.getGoodsSkuDetail(goodsId, skuId); - - - return ResultUtil.data(map); } diff --git a/buyer-api/src/main/java/cn/lili/controller/other/AppVersionBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/other/AppVersionBuyerController.java index 7109bc27..61354b6c 100644 --- a/buyer-api/src/main/java/cn/lili/controller/other/AppVersionBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/other/AppVersionBuyerController.java @@ -1,8 +1,13 @@ package cn.lili.controller.other; import cn.lili.common.enums.ResultUtil; +import cn.lili.common.utils.PageUtil; +import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.system.entity.dos.AppVersion; import cn.lili.modules.system.service.AppVersionService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -33,4 +38,13 @@ public class AppVersionBuyerController { public ResultMessage getAppVersion(@PathVariable String appType) { return ResultUtil.data(appVersionService.getAppVersion(appType)); } + + @ApiOperation(value = "获取版本号列表") + @ApiImplicitParam(name = "appType", value = "app类型", required = true, paramType = "path") + @GetMapping("/appVersion/{appType}") + public ResultMessage> appVersion(@PathVariable String appType, PageVO pageVO) { + + IPage page = appVersionService.page(PageUtil.initPage(pageVO), new LambdaQueryWrapper().eq(AppVersion::getType, appType)); + return ResultUtil.data(page); + } } diff --git a/buyer-api/src/main/java/cn/lili/controller/other/broadcast/StudioController.java b/buyer-api/src/main/java/cn/lili/controller/other/broadcast/StudioController.java new file mode 100644 index 00000000..b0235aa2 --- /dev/null +++ b/buyer-api/src/main/java/cn/lili/controller/other/broadcast/StudioController.java @@ -0,0 +1,48 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.broadcast.entity.dos.Studio; +import cn.lili.modules.broadcast.service.StudioService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +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; + +/** + * 买家端,直播间接口 + * + * @author Bulbasaur + * @date: 2021/5/20 12:03 下午 + */ +@RestController +@Api(tags = "买家端,直播间接口") +@RequestMapping("/buyer/broadcast/studio") +public class StudioController { + + @Autowired + private StudioService studioService; + + @ApiOperation(value = "获取店铺直播间列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "recommend", value = "是否推荐", paramType = "query", dataType = "int"), + @ApiImplicitParam(name = "status", value = "直播间状态", paramType = "query", dataType = "String") + }) + @GetMapping + public ResultMessage> page(PageVO pageVO, Integer recommend, String status) { + return ResultUtil.data(studioService.studioList(pageVO, recommend, status)); + } + + @ApiOperation(value = "获取店铺直播间回放地址") + @GetMapping("/getLiveInfo/{roomId}") + public ResultMessage getLiveInfo(Integer roomId) { + return ResultUtil.data(studioService.getLiveInfo(roomId)); + } + +} diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java index d4315341..03efbbc9 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java @@ -17,6 +17,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -30,6 +31,7 @@ import java.io.IOException; * @author Chopper * @date 2020-11-25 19:29 */ +@Slf4j @RestController @Api(tags = "买家端,web联合登录") @RequestMapping("/buyer/connect") @@ -93,7 +95,7 @@ public class ConnectBuyerWebController { try { return ResultUtil.data(connectService.appLoginCallback(authUser, uuid)); } catch (Exception e) { - e.printStackTrace(); + log.error("unionID登录错误",e); } return null; } diff --git a/buyer-api/src/main/java/cn/lili/controller/payment/CashierController.java b/buyer-api/src/main/java/cn/lili/controller/payment/CashierController.java index fffdceff..30117fee 100644 --- a/buyer-api/src/main/java/cn/lili/controller/payment/CashierController.java +++ b/buyer-api/src/main/java/cn/lili/controller/payment/CashierController.java @@ -12,6 +12,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -25,6 +26,7 @@ import javax.servlet.http.HttpServletResponse; * @author Chopper * @date 2020-12-18 16:59 */ +@Slf4j @RestController @Api(tags = "买家端,收银台接口") @RequestMapping("/buyer/cashier") @@ -63,7 +65,7 @@ public class CashierController { try { return cashierSupport.payment(paymentMethodEnum, paymentClientEnum, request, response, payParam); } catch (Exception e) { - e.printStackTrace(); + log.error("收银台支付错误",e); } return null; diff --git a/buyer-api/src/main/java/cn/lili/controller/promotion/SeckillBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/SeckillBuyerController.java index 45e2afcf..466bc376 100644 --- a/buyer-api/src/main/java/cn/lili/controller/promotion/SeckillBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/promotion/SeckillBuyerController.java @@ -17,29 +17,29 @@ import java.util.List; /** - * 买家端,限时抢购接口 + * 买家端,秒杀活动接口 * * @author paulG * @date 2020/11/17 2:30 下午 */ -@Api(tags = "买家端,限时抢购接口") +@Api(tags = "买家端,秒杀活动接口") @RestController @RequestMapping("/buyer/promotion/seckill") public class SeckillBuyerController { /** - * 限时抢购 + * 秒杀活动 */ @Autowired private SeckillApplyService seckillApplyService; - @ApiOperation(value = "获取当天限时抢购信息") + @ApiOperation(value = "获取当天秒杀活动信息") @GetMapping public ResultMessage> getSeckillTime() { return ResultUtil.data(seckillApplyService.getSeckillTimeline()); } - @ApiOperation(value = "获取某个时刻的限时抢购商品信息") + @ApiOperation(value = "获取某个时刻的秒杀活动商品信息") @GetMapping("/{timeline}") public ResultMessage> getSeckillGoods(@PathVariable Integer timeline) { return ResultUtil.data(seckillApplyService.getSeckillGoods(timeline)); diff --git a/buyer-api/src/main/resources/application.yml b/buyer-api/src/main/resources/application.yml index d230743c..61b5b4fb 100644 --- a/buyer-api/src/main/resources/application.yml +++ b/buyer-api/src/main/resources/application.yml @@ -4,9 +4,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -153,6 +150,7 @@ ignored: - /buyer/memberEvaluation/**/goodsEvaluation - /buyer/memberEvaluation/**/evaluationNumber - /buyer/appVersion/** + - /buyer/broadcast/studio/** - /druid/** - /swagger-ui.html - /doc.html @@ -262,7 +260,8 @@ lili: # account: # username: elastic # password: LiLiShopES - + logstash: + server: 192.168.0.116:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group diff --git a/buyer-api/src/main/resources/logback.xml b/buyer-api/src/main/resources/logback.xml new file mode 100644 index 00000000..5837ff17 --- /dev/null +++ b/buyer-api/src/main/resources/logback.xml @@ -0,0 +1,40 @@ + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + + 127.0.0.1:4560 + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java b/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java index 9fedbd63..8076a648 100644 --- a/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java +++ b/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java @@ -5,6 +5,7 @@ import cn.lili.modules.file.plugin.FileManagerPlugin; import cn.lili.modules.goods.entity.dos.Brand; import cn.lili.modules.goods.service.BrandService; import com.xkcoding.http.util.StringUtil; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +20,7 @@ import java.util.List; * @author paulG * @since 2020/11/14 **/ +@Slf4j @RunWith(SpringRunner.class) @SpringBootTest class FileTest { @@ -43,7 +45,7 @@ class FileTest { // 上传至第三方云服务或服务器 brand.setLogo(fileManagerPlugin.inputStreamUpload(inputStream, brand.getId() + ".png")); } catch (IOException e) { - e.printStackTrace(); + log.error("上传你文件出错",e); } } brandService.updateBatchById(categoryList); diff --git a/buyer-api/src/test/resources/application.yml b/buyer-api/src/test/resources/application.yml index d5368295..9484829b 100644 --- a/buyer-api/src/test/resources/application.yml +++ b/buyer-api/src/test/resources/application.yml @@ -2,9 +2,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: diff --git a/common-api/src/main/java/cn/lili/controller/common/SliderImageController.java b/common-api/src/main/java/cn/lili/controller/common/SliderImageController.java index 745ae80d..cae8d3ef 100644 --- a/common-api/src/main/java/cn/lili/controller/common/SliderImageController.java +++ b/common-api/src/main/java/cn/lili/controller/common/SliderImageController.java @@ -8,6 +8,7 @@ import cn.lili.common.verification.service.VerificationService; import cn.lili.common.vo.ResultMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -17,8 +18,9 @@ import org.springframework.web.bind.annotation.*; * @author Chopper * @date 2020/11/26 15:41 */ -@RequestMapping("/common/slider") +@Slf4j @RestController +@RequestMapping("/common/slider") @Api(tags = "滑块验证码接口") public class SliderImageController { @@ -35,7 +37,7 @@ public class SliderImageController { } catch (ServiceException e) { throw e; } catch (Exception e) { - e.printStackTrace(); + log.error("获取校验接口错误",e); return null; } } diff --git a/common-api/src/main/resources/application.yml b/common-api/src/main/resources/application.yml index 23bbc5c0..0d48f2ae 100644 --- a/common-api/src/main/resources/application.yml +++ b/common-api/src/main/resources/application.yml @@ -4,9 +4,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: diff --git a/common-api/src/main/resources/logback.xml b/common-api/src/main/resources/logback.xml new file mode 100644 index 00000000..46dec7c7 --- /dev/null +++ b/common-api/src/main/resources/logback.xml @@ -0,0 +1,41 @@ + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + + + 127.0.0.1:4560 + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/config/application.yml b/config/application.yml index ae0c6ec4..5a9316c8 100644 --- a/config/application.yml +++ b/config/application.yml @@ -2,9 +2,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -80,7 +77,7 @@ spring: default-datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - 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/Bulbasaur?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: lilishop maxActive: 20 @@ -150,6 +147,7 @@ ignored: - /buyer/memberEvaluation/**/goodsEvaluation - /buyer/memberEvaluation/**/evaluationNumber - /buyer/appVersion/** + - /buyer/broadcast/studio/** - /store/login/** - /manager/user/login - /manager/user/refresh/** @@ -252,7 +250,7 @@ lili: # jwt 细节设定 jwt-setting: # token过期时间(分钟) - tokenExpireTime: 60 + tokenExpireTime: 30 # 使用Spring @Cacheable注解失效时间 cache: @@ -276,6 +274,8 @@ lili: # username: elastic # password: LiLiShopES + logstash: + server: 192.168.0.116:4560 rocketmq: promotion-topic: lili_promotion_topic promotion-group: lili_promotion_group diff --git a/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java b/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java index 685b3289..fefac047 100644 --- a/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/DistributionOrderExecute.java @@ -15,6 +15,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; + /** * 分销订单入库 * @@ -28,7 +30,7 @@ public class DistributionOrderExecute implements OrderStatusChangeEvent, EveryDa @Autowired private DistributionOrderService distributionOrderService; //分销订单持久层 - @Autowired + @Resource private DistributionOrderMapper distributionOrderMapper; diff --git a/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java b/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java new file mode 100644 index 00000000..7c514764 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/MemberExperienceExecute.java @@ -0,0 +1,92 @@ +package cn.lili.event.impl; + + +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.event.GoodsCommentCompleteEvent; +import cn.lili.event.MemberRegisterEvent; +import cn.lili.event.OrderStatusChangeEvent; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dos.MemberEvaluation; +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.OrderStatusEnum; +import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.ExperienceSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; +import com.google.gson.Gson; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 会员经验值 + * + * @author Bulbasaur + * @date: 2021/5/16 11:16 下午 + */ +@Service +public class MemberExperienceExecute implements MemberRegisterEvent, GoodsCommentCompleteEvent, OrderStatusChangeEvent { + + //配置 + @Autowired + private SettingService settingService; + //会员 + @Autowired + private MemberService memberService; + //订单 + @Autowired + private OrderService orderService; + + /** + * 会员注册赠送经验值 + * @param member 会员 + */ + @Override + public void memberRegister(Member member) { + //获取经验值设置 + ExperienceSetting experienceSetting = getExperienceSetting(); + //赠送会员经验值 + memberService.updateMemberExperience(Long.valueOf(experienceSetting.getRegister().longValue()), true, member.getId(), "会员注册,赠送经验值" + experienceSetting.getRegister()); + } + + /** + * 商品评价赠送经验值 + * @param memberEvaluation 会员评价 + */ + @Override + public void goodsComment(MemberEvaluation memberEvaluation) { + //获取经验值设置 + ExperienceSetting experienceSetting = getExperienceSetting(); + //赠送会员经验值 + memberService.updateMemberExperience(Long.valueOf(experienceSetting.getComment().longValue()), true, memberEvaluation.getMemberId(), "会员评价,赠送经验值" + experienceSetting.getComment()); + } + + /** + * 完成订单赠送经验值 + * @param orderMessage 订单消息 + */ + @Override + public void orderChange(OrderMessage orderMessage) { + if(orderMessage.getNewStatus().equals(OrderStatusEnum.COMPLETED)){ + //获取经验值设置 + ExperienceSetting experienceSetting = getExperienceSetting(); + //获取订单信息 + Order order = orderService.getBySn(orderMessage.getOrderSn()); + //计算赠送经验值数量 + Double point= CurrencyUtil.mul(experienceSetting.getMoney(),order.getFlowPrice(),0); + //赠送会员经验值 + memberService.updateMemberExperience(point.longValue(), true, order.getMemberId(), "会员下单,赠送经验值" + point + "分"); + } + } + + /** + * 获取经验值设置 + * @return 经验值设置 + */ + private ExperienceSetting getExperienceSetting(){ + Setting setting = settingService.get(SettingEnum.EXPERIENCE_SETTING.name()); + return new Gson().fromJson(setting.getSettingValue(), ExperienceSetting.class); + } +} 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 237c3339..e4ce6de0 100644 --- a/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/MemberPointExecute.java @@ -1,30 +1,37 @@ package cn.lili.event.impl; +import cn.lili.common.utils.CurrencyUtil; +import cn.lili.event.AfterSaleStatusChangeEvent; import cn.lili.event.GoodsCommentCompleteEvent; import cn.lili.event.MemberRegisterEvent; +import cn.lili.event.OrderStatusChangeEvent; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberEvaluation; import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.member.service.MemberWalletService; +import cn.lili.modules.order.order.entity.dos.AfterSale; +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.service.OrderService; +import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.PointSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import com.google.gson.Gson; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * 会员积分 * - * @author Chopper + * @author Bulbasaur * @date 2020-07-03 11:20 */ @Service - -public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentCompleteEvent { +public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentCompleteEvent, OrderStatusChangeEvent, AfterSaleStatusChangeEvent { //配置 @Autowired @@ -32,22 +39,80 @@ public class MemberPointExecute implements MemberRegisterEvent, GoodsCommentComp //会员 @Autowired private MemberService memberService; + //订单 + @Autowired + private OrderService orderService; + /** + * 会员注册赠送积分 + * @param member 会员 + */ @Override public void memberRegister(Member member) { - //获取签到积分赠送设置 - Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); - PointSetting pointSetting = new Gson().fromJson(setting.getSettingValue(), PointSetting.class); + //获取积分设置 + PointSetting pointSetting=getPointSetting(); //赠送会员积分 - memberService.updateMemberPoint(Long.valueOf(pointSetting.getRegister().longValue()), 1, member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); + memberService.updateMemberPoint(Long.valueOf(pointSetting.getRegister().longValue()), true, member.getId(), "会员注册,赠送积分" + pointSetting.getRegister() + "分"); } + /** + * 会员评价赠送积分 + * @param memberEvaluation 会员评价 + */ @Override public void goodsComment(MemberEvaluation memberEvaluation) { - //获取签到积分赠送设置 - Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); - PointSetting pointSetting = new Gson().fromJson(setting.getSettingValue(), PointSetting.class); + //获取积分设置 + PointSetting pointSetting=getPointSetting(); //赠送会员积分 - memberService.updateMemberPoint(Long.valueOf(pointSetting.getComment().longValue()), 1, memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); + memberService.updateMemberPoint(Long.valueOf(pointSetting.getComment().longValue()), true, memberEvaluation.getMemberId(), "会员评价,赠送积分" + pointSetting.getComment() + "分"); + } + + /** + * 非积分订单订单完成后赠送积分 + * @param orderMessage 订单消息 + */ + @Override + public void orderChange(OrderMessage orderMessage) { + + if(orderMessage.getNewStatus().equals(OrderStatusEnum.COMPLETED)){ + //根据订单编号获取订单数据,如果为积分订单则跳回 + Order order = orderService.getBySn(orderMessage.getOrderSn()); + if(order.getOrderPromotionType().equals(OrderPromotionTypeEnum.POINT.name())){ + return; + } + //获取积分设置 + PointSetting pointSetting=getPointSetting(); + //计算赠送积分数量 + Double point=CurrencyUtil.mul(pointSetting.getMoney(),order.getFlowPrice(),0); + //赠送会员积分 + memberService.updateMemberPoint(point.longValue(), true, order.getMemberId(), "会员下单,赠送积分" + point + "分"); + + } + } + + /** + * 提交售后后扣除积分 + * @param afterSale 售后 + */ + @Override + public void afterSaleStatusChange(AfterSale afterSale) { + if (afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name())) { + //获取积分设置 + PointSetting pointSetting=getPointSetting(); + //计算扣除积分数量 + Double point=CurrencyUtil.mul(pointSetting.getMoney(), afterSale.getActualRefundPrice(),0); + //扣除会员积分 + memberService.updateMemberPoint(point.longValue(), false, afterSale.getMemberId(), "会员退款,扣除积分" + point + "分"); + + } + } + + /** + * 获取积分设置 + * @return 积分设置 + */ + private PointSetting getPointSetting(){ + Setting setting = settingService.get(SettingEnum.POINT_SETTING.name()); + return new Gson().fromJson(setting.getSettingValue(), PointSetting.class); } } diff --git a/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java b/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java index 7a23048a..3b63bdd8 100644 --- a/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/NoticeMessageExecute.java @@ -11,12 +11,11 @@ import cn.lili.modules.message.service.NoticeMessageService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.order.entity.dos.AfterSale; import cn.lili.modules.order.order.entity.dto.OrderMessage; -import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; +import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum; import cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -83,7 +82,7 @@ public class NoticeMessageExecute implements TradeEvent, OrderStatusChangeEvent, break; //如果是拼团订单,发送拼团成功消息 case UNDELIVERED: - if(orderDetailVO.getOrder().getOrderType().equals(OrderTypeEnum.PINTUAN.name())){ + if(orderDetailVO.getOrder().getOrderPromotionType().equals(OrderPromotionTypeEnum.PINTUAN.name())){ //拼团成功消息 noticeMessageDTO.setNoticeMessageNodeEnum(NoticeMessageNodeEnum.PINTUAN_SUCCESS); } diff --git a/consumer/src/main/java/cn/lili/event/impl/PaymentExecute.java b/consumer/src/main/java/cn/lili/event/impl/PaymentExecute.java index 1fa2566c..c51b180d 100644 --- a/consumer/src/main/java/cn/lili/event/impl/PaymentExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/PaymentExecute.java @@ -10,8 +10,6 @@ import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.payment.entity.RefundLog; import cn.lili.modules.payment.kit.Payment; import cn.lili.modules.payment.kit.enums.PaymentMethodEnum; -import cn.lili.modules.payment.service.PaymentService; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -24,9 +22,6 @@ import org.springframework.stereotype.Service; @Service public class PaymentExecute implements OrderStatusChangeEvent { - //支付日志 - @Autowired - private PaymentService paymentService; //订单 @Autowired private OrderService orderService; diff --git a/consumer/src/main/java/cn/lili/event/impl/RegisteredCouponActivityExecute.java b/consumer/src/main/java/cn/lili/event/impl/RegisteredCouponActivityExecute.java new file mode 100644 index 00000000..9eabd094 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/RegisteredCouponActivityExecute.java @@ -0,0 +1,41 @@ +package cn.lili.event.impl; + +import cn.lili.event.MemberRegisterEvent; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.service.CouponActivityService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 注册赠券活动 + * + * @author Bulbasaur + * @date: 2021/5/24 10:48 上午 + */ +@Component +public class RegisteredCouponActivityExecute implements MemberRegisterEvent { + + @Autowired + private CouponActivityService couponActivityService; + + /** + * 获取进行中的注册赠券的优惠券活动 + * 发送注册赠券 + * + * @param member 会员 + */ + @Override + public void memberRegister(Member member) { + List couponActivities = couponActivityService.list(new LambdaQueryWrapper() + .eq(CouponActivity::getCouponActivityType, CouponActivityTypeEnum.REGISTERED.name()) + .eq(CouponActivity::getPromotionStatus, PromotionStatusEnum.START.name())); + couponActivityService.registered(couponActivities, member); + + } +} diff --git a/consumer/src/main/java/cn/lili/event/impl/VerificationOrderExecute.java b/consumer/src/main/java/cn/lili/event/impl/VerificationOrderExecute.java new file mode 100644 index 00000000..95e2e3a8 --- /dev/null +++ b/consumer/src/main/java/cn/lili/event/impl/VerificationOrderExecute.java @@ -0,0 +1,62 @@ +package cn.lili.event.impl; + +import cn.hutool.core.util.RandomUtil; +import cn.lili.common.utils.CommonUtil; +import cn.lili.event.OrderStatusChangeEvent; +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.OrderStatusEnum; +import cn.lili.modules.order.order.service.OrderService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 虚拟商品 + * + * @author Bulbasaur + * @date: 2021/5/29 9:17 上午 + */ +@Component +public class VerificationOrderExecute implements OrderStatusChangeEvent { + + @Autowired + private OrderService orderService; + + @Override + public void orderChange(OrderMessage orderMessage) { + //订单状态为待核验,添加订单添加核验码 + if (orderMessage.getNewStatus().equals(OrderStatusEnum.TAKE)) { + //获取订单信息 + Order order = orderService.getBySn(orderMessage.getOrderSn()); + //获取随机数,判定是否存在 + String code = getCode(order.getStoreId()); + //设置订单验证码 + orderService.update(new LambdaUpdateWrapper() + .set(Order::getVerificationCode, code) + .eq(Order::getSn, orderMessage.getOrderSn())); + } + } + + /** + * 获取随机数 + * 判断当前店铺下是否使用验证码,如果已使用则重新获取 + * + * @param storeId 店铺ID + * @return + */ + private String getCode(String storeId) { + //获取八位验证码 + String code = Long.toString(RandomUtil.randomLong(10000000, 99999999)); + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(Order::getVerificationCode, code) + .eq(Order::getStoreId, storeId); + if (orderService.getOne(lambdaQueryWrapper) == null) { + return code; + } else { + return this.getCode(storeId); + } + } +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/bill/BillExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/bill/BillExecute.java index 1ff4cbcf..89b8bf35 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/bill/BillExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/bill/BillExecute.java @@ -44,7 +44,6 @@ public class BillExecute implements EveryDayExecute { //获取当前时间 DateTime endTime =DateUtil.date(); - //批量商家结算 for (StoreSettlementDay storeSettlementDay : storeList) { diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java new file mode 100644 index 00000000..9982d57d --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/broadcast/BroadcastExecute.java @@ -0,0 +1,25 @@ +package cn.lili.timetask.handler.impl.broadcast; + +import cn.lili.modules.broadcast.service.CommodityService; +import cn.lili.timetask.handler.EveryHourExecute; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 小程序直播状态获取 + * + * @author Bulbasaur + * @date: 2021/5/20 2:52 下午 + */ +@Component +public class BroadcastExecute implements EveryHourExecute { + + @Autowired + private CommodityService commodityService; + + @Override + public void execute() { + //同步直播商品状态 + commodityService.getGoodsWareHouse(); + } +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponActivityExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponActivityExecute.java new file mode 100644 index 00000000..f960098f --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponActivityExecute.java @@ -0,0 +1,80 @@ +package cn.lili.timetask.handler.impl.coupon; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.service.CouponActivityService; +import cn.lili.timetask.handler.EveryMinuteExecute; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 优惠券活动状态监测 + * + * @author Bulbasaur + * @date: 2021/5/24 10:08 上午 + */ +@Component +public class CouponActivityExecute implements EveryMinuteExecute { + + @Autowired + private CouponActivityService couponActivityService; + + @Override + public void execute() { + //精确发券活动 + specify(); + //注册赠券的活动 + registered(); + } + + /** + * 监测精确发券活动 + * 达到活动时间发送优惠券 + */ + private void specify(){ + DateTime dateTime=DateUtil.date(); + List couponActivities=couponActivityService.list(new LambdaQueryWrapper() + .eq(CouponActivity::getCouponActivityType, CouponActivityTypeEnum.SPECIFY.name()) + .le(CouponActivity::getStartTime, dateTime) + .eq(CouponActivity::getPromotionStatus,PromotionStatusEnum.NEW.name())); + //如果有符合要求的优惠券活动,发送优惠券 + if(couponActivities.size()>0){ + for (CouponActivity couponActivity:couponActivities) { + couponActivityService.specify(couponActivity.getId()); + + //修改精准发券优惠券活动状态 + couponActivityService.update(new LambdaUpdateWrapper() + .eq(CouponActivity::getId,couponActivity.getId()) + .set(CouponActivity::getPromotionStatus,PromotionStatusEnum.END.name())); + } + } + + } + /** + * 注册赠券活动状态监测 + */ + private void registered(){ + //开启注册赠券优惠券活动 + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(CouponActivity::getCouponActivityType, CouponActivityTypeEnum.REGISTERED.name()) + .eq(CouponActivity::getPromotionStatus, PromotionStatusEnum.NEW.name()) + .le(CouponActivity::getStartTime, DateUtil.date()) + .set(CouponActivity::getPromotionStatus,PromotionStatusEnum.START.name()); + couponActivityService.update(lambdaUpdateWrapper); + + //关闭注册赠券优惠券活动 + LambdaUpdateWrapper endWrapper = new LambdaUpdateWrapper<>(); + endWrapper.eq(CouponActivity::getCouponActivityType, CouponActivityTypeEnum.REGISTERED.name()) + .eq(CouponActivity::getPromotionStatus, PromotionStatusEnum.START.name()) + .le(CouponActivity::getEndTime, DateUtil.date()) + .set(CouponActivity::getPromotionStatus,PromotionStatusEnum.END.name()); + couponActivityService.update(endWrapper); + } +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java new file mode 100644 index 00000000..68a66e98 --- /dev/null +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/coupon/CouponExecute.java @@ -0,0 +1,38 @@ +package cn.lili.timetask.handler.impl.coupon; + +import cn.hutool.core.date.DateUtil; +import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; +import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.timetask.handler.EveryDayExecute; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 优惠券状态监测 + * + * @author Bulbasaur + * @date: 2021/5/24 10:08 上午 + */ +@Component +public class CouponExecute implements EveryDayExecute { + + @Autowired + private MemberCouponService memberCouponService; + + /** + * 检测优惠券的使用时间,超期未使用则失效 + * 此方法用于领取*天后失效优惠券使用 + */ + @Override + public void execute() { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()) + .le(MemberCoupon::getEndTime, DateUtil.date()) + .set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); + this.memberCouponService.update(updateWrapper); + + } + +} diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java index d431d869..3bcdbf1e 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/goods/GoodsExecute.java @@ -39,7 +39,6 @@ public class GoodsExecute implements EveryDayExecute { new QueryWrapper() .between("create_time", DateUtil.yesterday(), new DateTime())); - System.out.println("评论数量" + list.size()); for (Map map : list) { goodsMapper.addGoodsCommentNum(Integer.parseInt(map.get("num").toString()), map.get("goods_id").toString()); } diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java index 641dd29b..b8f6686c 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java @@ -3,15 +3,21 @@ package cn.lili.timetask.handler.impl.promotion; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.vos.CouponVO; import cn.lili.modules.promotion.entity.vos.PintuanVO; import cn.lili.modules.promotion.service.*; import cn.lili.modules.search.service.EsGoodsIndexService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.SeckillSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; import cn.lili.timetask.handler.EveryDayExecute; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; @@ -55,6 +61,13 @@ public class PromotionEverydayExecute implements EveryDayExecute { @Autowired private PromotionGoodsService promotionGoodsService; + // 系统设置 + @Autowired + private SettingService settingService; + + //秒杀活动 + @Autowired + private SeckillService seckillService; /** * 将已过期的促销活动置为结束 @@ -69,52 +82,26 @@ public class PromotionEverydayExecute implements EveryDayExecute { //结束条件 活动结束时间大于当前时间 query.addCriteria(Criteria.where("endTime").lt(new Date())); - try { - //关闭满减活动 - List fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class); - if (!fullDiscountVOS.isEmpty()) { - List ids = new ArrayList<>(); - //循环活动 关闭活动 - for (FullDiscountVO vo : fullDiscountVOS) { - vo.setPromotionStatus(PromotionStatusEnum.END.name()); - if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { - for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { - promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); - esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId()); - } - } - mongoTemplate.save(vo); - ids.add(vo.getId()); - } - fullDiscountService.update(this.getUpdatePromotionWrapper(ids)); - } - } catch (Exception e) { - log.error("满减活动关闭错误", e); - } - try { - //关闭拼团活动 - List pintuanVOS = mongoTemplate.find(query, PintuanVO.class); - if (!pintuanVOS.isEmpty()) { - //准备修改活动的id - List ids = new ArrayList<>(); - for (PintuanVO vo : pintuanVOS) { - vo.setPromotionStatus(PromotionStatusEnum.END.name()); - if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { - for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { - promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); - esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId()); - } - } - mongoTemplate.save(vo); - ids.add(vo.getId()); - } - pintuanService.update(this.getUpdatePromotionWrapper(ids)); - //将活动商品对照表进行结束处理 - promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids)); - } - } catch (Exception e) { - log.error("拼团活动关闭错误", e); - } + //结束满减活动 + endFullDiscount(query); + + //关闭拼团活动 + endPintuan(query); + + //结束优惠券 + endCoupon(query); + + //定时创建活动 + addSeckill(); + + } + + /** + * 结束优惠券活动 + * + * @param query + */ + private void endCoupon(Query query) { try { //关闭优惠券活动 @@ -142,15 +129,87 @@ public class PromotionEverydayExecute implements EveryDayExecute { } catch (Exception e) { log.error("优惠券活动关闭错误", e); } + } + /** + * 结束拼团活动 + * + * @param query + */ + private void endPintuan(Query query) { + try { + //关闭拼团活动 + List pintuanVOS = mongoTemplate.find(query, PintuanVO.class); + if (!pintuanVOS.isEmpty()) { + //准备修改活动的id + List ids = new ArrayList<>(); + for (PintuanVO vo : pintuanVOS) { + vo.setPromotionStatus(PromotionStatusEnum.END.name()); + if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { + for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { + promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); + esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId()); + } + } + mongoTemplate.save(vo); + ids.add(vo.getId()); + } + pintuanService.update(this.getUpdatePromotionWrapper(ids)); + //将活动商品对照表进行结束处理 + promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids)); + } + } catch (Exception e) { + log.error("拼团活动关闭错误", e); + } + } + /** + * 结束满减活动 + * + * @param query + */ + private void endFullDiscount(Query query) { + try { + //关闭满减活动 + List fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class); + if (!fullDiscountVOS.isEmpty()) { + List ids = new ArrayList<>(); + //循环活动 关闭活动 + for (FullDiscountVO vo : fullDiscountVOS) { + vo.setPromotionStatus(PromotionStatusEnum.END.name()); + if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { + for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) { + promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name()); + esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId()); + } + } + mongoTemplate.save(vo); + ids.add(vo.getId()); + } + fullDiscountService.update(this.getUpdatePromotionWrapper(ids)); + } + } catch (Exception e) { + log.error("满减活动关闭错误", e); + } + } + + /** + * 添加秒杀活动 + * 从系统设置中获取秒杀活动的配置 + * 添加30天后的秒杀活动 + */ + private void addSeckill() { + Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); + SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); + Seckill seckill = new Seckill(30, seckillSetting.getHours(), seckillSetting.getSeckillRule()); + seckillService.saveSeckill(seckill); } /** * 获取促销修改查询条件 修改活动状态 * - * @param ids - * @return + * @param ids 促销活动ID + * @return 促销活动商品查询Wrapper */ private UpdateWrapper getUpdatePromotionWrapper(List ids) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); @@ -162,8 +221,8 @@ public class PromotionEverydayExecute implements EveryDayExecute { /** * 获取商品的促销修改查询条件 修改商品状态 * - * @param ids - * @return + * @param ids 促销活动ID + * @return 促销活动商品修改Wrapper */ private UpdateWrapper getUpdatePromotionGoodsWrapper(List ids) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java index 74972785..22c0a9f4 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/view/PageViewStatisticsExecute.java @@ -186,7 +186,6 @@ class PageViewStatistics { calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); this.date = calendar.getTime(); - System.out.println(DateUtil.toString(date,DateUtil.STANDARD_FORMAT)); } } diff --git a/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java new file mode 100644 index 00000000..ab42b58b --- /dev/null +++ b/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java @@ -0,0 +1,36 @@ +package cn.lili.trigger.executor; + +import cn.hutool.json.JSONUtil; +import cn.lili.common.delayqueue.BroadcastMessage; +import cn.lili.common.trigger.model.TimeExecuteConstant; +import cn.lili.modules.broadcast.service.StudioService; +import cn.lili.trigger.TimeTriggerExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 直播间事件触发 + * + * @author Bulbasaur + * @date: 2021/6/1 5:02 下午 + */ +@Slf4j +@Component(TimeExecuteConstant.BROADCAST_EXECUTOR) +public class BroadcastTimeTriggerExecutor implements TimeTriggerExecutor { + + + @Autowired + private StudioService studioService; + + @Override + public void execute(Object object) { + //直播间订单消息 + BroadcastMessage broadcastMessage = JSONUtil.toBean(JSONUtil.parseObj(object), BroadcastMessage.class); + if (broadcastMessage != null && broadcastMessage.getStudioId() != null) { + log.info("直播间消费:{}", broadcastMessage); + // 修改直播间状态 + studioService.updateStudioStatus(broadcastMessage); + } + } +} diff --git a/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java b/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java index 08091c68..4466aa97 100644 --- a/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java +++ b/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java @@ -29,6 +29,6 @@ public class PromotionDelayQueueListen extends AbstractDelayQueueListen { @Override public String setDelayQueueName() { - return DelayQueueEnums.PROMOTION_QUEUE.name(); + return DelayQueueEnums.PROMOTION.name(); } } diff --git a/consumer/src/main/resources/application.yml b/consumer/src/main/resources/application.yml index d50be0e6..0e110495 100644 --- a/consumer/src/main/resources/application.yml +++ b/consumer/src/main/resources/application.yml @@ -4,9 +4,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: @@ -49,7 +46,7 @@ spring: open-in-view: false # Redis redis: - host: 127.0.0.1 + host: 192.168.0.116 port: 6379 password: lilishop lettuce: @@ -80,7 +77,7 @@ spring: default-datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - 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/Bulbasaur?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: lilishop maxActive: 20 @@ -282,6 +279,8 @@ lili: notice-send-group: lili_send_notice_group after-sale-topic: lili_after_sale_topic after-sale-group: lili_after_sale_group + broadcast-topic: lili_broadcast_topic + broadcast-group: lili_broadcast_group rocketmq: name-server: 127.0.0.1:9876 producer: diff --git a/consumer/src/main/resources/logback.xml b/consumer/src/main/resources/logback.xml new file mode 100644 index 00000000..45ee2e13 --- /dev/null +++ b/consumer/src/main/resources/logback.xml @@ -0,0 +1,41 @@ + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + + + 192.168.0.116:4560 + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/framework/pom.xml b/framework/pom.xml index 26ba0ab9..4873ab05 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -45,47 +45,16 @@ 2.3.1 1.21 1.2 + 4.1.2 + 4.1.2 + 6.6 + 3.4.1 + 1.7.28 + 2.2.0 1.4 - - javax.interceptor - javax.interceptor-api - ${interceptor-api} - - - de.codecentric - spring-boot-admin-starter-client - ${de.codecentric} - - - - com.google.zxing - core - 3.4.1 - - - com.google.zxing - javase - 3.4.1 - - - org.slf4j - slf4j-api - 1.7.28 - - - - com.github.xkzhangsan - xk-time - 2.2.0 - - - - - - org.springframework.boot spring-boot-starter-web @@ -356,23 +325,11 @@ simple-http ${simple-http-version} - org.antlr antlr4-runtime ${antlr4-runtime-version} - - - - - - - - - - - com.alipay.sdk alipay-sdk-java @@ -385,8 +342,54 @@ UserAgentUtils ${userAgentUtils} - - + + org.apache.poi + poi + ${poi-version} + + + org.apache.poi + poi-ooxml + ${poi-ooxml-version} + + + + net.logstash.logback + logstash-logback-encoder + ${logstash-logback-encoder} + + + javax.interceptor + javax.interceptor-api + ${interceptor-api} + + + de.codecentric + spring-boot-admin-starter-client + ${de.codecentric} + + + + com.google.zxing + core + ${zxing} + + + com.google.zxing + javase + ${zxing} + + + org.slf4j + slf4j-api + ${slf4j-api} + + + + com.github.xkzhangsan + xk-time + ${xk-time} + org.apache.commons commons-text diff --git a/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java b/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java index 0e35a46a..4a0cf9c6 100644 --- a/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java +++ b/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java @@ -1,6 +1,7 @@ package cn.lili.common.aop.limiter; import cn.lili.common.aop.limiter.annotation.LimitPoint; +import cn.lili.common.exception.ServiceException; import com.google.common.collect.ImmutableList; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -21,6 +22,7 @@ import java.lang.reflect.Method; /** * 流量拦截 + * * @author Chopper */ @Aspect @@ -42,7 +44,7 @@ public class LimitInterceptor { } @Around("execution(public * *(..)) && @annotation(cn.lili.common.aop.limiter.annotation.LimitPoint)") - public Object interceptor(ProceedingJoinPoint pjp) { + public Object interceptor(ProceedingJoinPoint pjp) throws Throwable { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); LimitPoint limitPointAnnotation = method.getAnnotation(LimitPoint.class); @@ -65,22 +67,26 @@ public class LimitInterceptor { try { Number count = redisTemplate.execute(limitScript, keys, limitCount, limitPeriod); log.info("Access try count is {} for name={} and key = {}", count, name, key); - if (count != null && count.intValue() <= limitCount) { + // 如果缓存里没有值,或者他的值小于限制频率 + if (count.intValue() <= limitCount) { return pjp.proceed(); } else { - throw new RuntimeException("访问过于频繁,请稍后再试"); - } - } catch (Throwable e) { - if (e instanceof RuntimeException) { - throw new RuntimeException(e.getLocalizedMessage()); + throw new ServiceException("访问过于频繁,请稍后再试"); } + } + //如果从redis中执行都值判定为空,则这里跳过 + catch (NullPointerException e) { + return pjp.proceed(); + } catch (Exception e) { throw new RuntimeException("服务器异常,请稍后再试"); } } + //默认unknown常量值 private static final String UNKNOWN = "unknown"; + //获取ip public String getIpAddress() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String ip = request.getHeader("x-forwarded-for"); diff --git a/framework/src/main/java/cn/lili/common/cache/CachePrefix.java b/framework/src/main/java/cn/lili/common/cache/CachePrefix.java index 65466d36..49d4fc13 100644 --- a/framework/src/main/java/cn/lili/common/cache/CachePrefix.java +++ b/framework/src/main/java/cn/lili/common/cache/CachePrefix.java @@ -219,7 +219,7 @@ public enum CachePrefix { STORE_ID_FULL_DISCOUNT, /** - * 限时抢购活动缓存key前缀 + * 秒杀活动活动缓存key前缀 */ STORE_ID_SECKILL, diff --git a/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java b/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java index 6585b36a..cc21e89b 100644 --- a/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java +++ b/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java @@ -1,6 +1,7 @@ package cn.lili.common.cache.impl; import cn.lili.common.cache.Cache; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.*; @@ -18,6 +19,7 @@ import java.util.function.Consumer; * * @author Chopepr */ +@Slf4j @Component public class RedisCache implements Cache { @@ -158,7 +160,7 @@ public class RedisCache implements Cache { return null; } catch (IOException e) { - e.printStackTrace(); + log.error("scan错误",e); throw new RuntimeException(e); } }); diff --git a/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java b/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java index 1cf15c42..a257a2ba 100644 --- a/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java +++ b/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java @@ -98,7 +98,7 @@ public abstract class BaseElasticsearchService { log.info(" Indicates whether the requisite number of shard copies were started for each shard in the index before timing out :{}", createIndexResponse.isShardsAcknowledged()); return; } catch (Exception e) { - e.printStackTrace(); + log.error("创建索引错误",e); throw new ElasticsearchException("创建索引 {" + index + "} 失败:" + e.getMessage()); } } @@ -420,7 +420,7 @@ public abstract class BaseElasticsearchService { try { searchResponse = client.search(searchRequest, COMMON_OPTIONS); } catch (IOException e) { - e.printStackTrace(); + log.error("es 搜索错误",e); } return searchResponse; } 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 1dd7c69a..d6e4b16b 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -97,7 +97,8 @@ public enum ResultCode { USER_RECEIPT_NOT_EXIST(20014, "会员发票信息不存在"), USER_EDIT_ERROR(20015, "用户修改失败"), USER_OLD_PASSWORD_ERROR(20016, "旧密码不正确"), - USER_COLLECTION_EXIST(2001, "无法重复收藏"), + USER_COLLECTION_EXIST(20017, "无法重复收藏"), + USER_GRADE_IS_DEFAULT(20018, "会员等级为默认会员等级"), DELETE_EXIST(2001, "无法重复收藏"), /** @@ -124,61 +125,97 @@ public enum ResultCode { * 购物车 */ CART_ERROR(30001, "读取结算页的购物车异常"), + CART_PINTUAN_NOT_EXIST_ERROR(30002, "拼团活动不存在错误"), + CART_PINTUAN_LIMIT_ERROR(30003, "购买数量超过拼团活动限制数量"), SHIPPING_NOT_APPLY(30005, "购物商品不支持当前收货地址配送"), + /** * 订单 */ ORDER_ERROR(31001, "创建订单异常,请稍后重试"), + ORDER_NOT_EXIST(31002, "订单不存在"), + ORDER_DELIVERED_ERROR(31003, "订单状态错误,无法进行确认收货"), + ORDER_UPDATE_PRICE_ERROR(31004, "已支付的订单不能修改金额"), + ORDER_LOGISTICS_ERROR(31005, "物流错误"), + ORDER_DELIVER_ERROR(31006, "物流错误"), + ORDER_NOT_USER(31007, "非当前会员的订单"), + ORDER_TAKE_ERROR(31008, "当前订单无法核销"), + MEMBER_ADDRESS_NOT_EXIST(31009, "订单无收货地址,请先配置收货地址"), + ORDER_DELIVER_NUM_ERROR(31010, "没有待发货的订单"), + /** * 支付 */ PAY_UN_WANTED(32000, "当前订单不需要付款,返回订单列表等待系统订单出库即可"), + PAY_SUCCESS(32001, "支付成功"), + PAY_INCONSISTENT_ERROR(32002, "付款金额和应付金额不一致"), + PAY_DOUBLE_ERROR(32003, "订单已支付,不能再次进行支付"), + PAY_CASHIER_ERROR(32004, "收银台信息获取错误"), + PAY_ERROR(32005, "支付业务异常,请稍后重试"), + PAY_BAN(32006, "当前订单不需要付款,请返回订单列表重新操作"), + PAY_PARTIAL_ERROR(32007, "该订单已部分支付,请前往订单中心进行支付"), + PAY_NOT_SUPPORT(32008, "支付暂不支持"), + PAY_CLIENT_TYPE_ERROR(32009, "错误的客户端"), + PAY_POINT_ENOUGH(32010, "积分不足,不能兑换"), + PAY_NOT_EXIST_ORDER(32011, "支付订单不存在"), /** * 售后 */ AFTER_SALES_NOT_PAY_ERROR(33001, "当前订单未支付,不能申请售后"), + AFTER_SALES_CANCEL_ERROR(33002, "当前售后单无法取消"), + AFTER_SALES_BAN(33003, "订单状态不允许申请售后,请联系平台或商家"), + AFTER_SALES_DOUBLE_ERROR(33004, "售后已审核,无法重复操作"), + AFTER_SALES_LOGISTICS_ERROR(33005, "物流公司错误,请重新选择"), + AFTER_STATUS_ERROR(33006, "售后状态错误,请刷新页面"), /** * 投诉 */ COMPLAINT_ORDER_ITEM_EMPTY_ERROR(33100, "订单不存在"), + COMPLAINT_SKU_EMPTY_ERROR(33101, "商品已下架,如需投诉请联系平台客服"), + COMPLAINT_ERROR(33102, "投诉异常,请稍后重试"), /** * 余额 */ WALLET_NOT_EXIT_ERROR(34000, "钱包不存在,请联系管理员"), + WALLET_INSUFFICIENT(34001, "余额不足以支付订单,请充值!"), + WALLET_WITHDRAWAL_INSUFFICIENT(34002, "可提现金额不足!"), + WALLET_ERROR_INSUFFICIENT(34003, "零钱提现失败!"), + WALLET_REMARK_ERROR(34004, "请填写审核备注!"), + WALLET_APPLY_ERROR(34005, "提现申请异常!"), /** @@ -195,52 +232,74 @@ public enum ResultCode { * 优惠券 */ COUPON_EDIT_STATUS_SUCCESS(41001, "修改状态成功!"), + COUPON_CANCELLATION_SUCCESS(41002, "会员优惠券作废成功"), + COUPON_EXPIRED(41003, "优惠券已使用/已过期,不能使用"), + COUPON_EDIT_STATUS_ERROR(41004, "优惠券修改状态失败!"), /** * 拼团 */ PINTUAN_MANUAL_OPEN_SUCCESS(42001, "手动开启拼团活动成功"), + PINTUAN_MANUAL_CLOSE_SUCCESS(42002, "手动关闭拼团活动成功"), + PINTUAN_ADD_SUCCESS(42003, "添加拼团活动成功"), + PINTUAN_EDIT_SUCCESS(42004, "修改拼团活动成功"), + PINTUAN_DELETE_SUCCESS(42005, "删除拼团活动成功"), + PINTUAN_MANUAL_OPEN_ERROR(42006, "手动开启拼团活动失败"), + PINTUAN_MANUAL_CLOSE_ERROR(42007, "手动关闭拼团活动失败"), + PINTUAN_ADD_ERROR(42008, "添加拼团活动失败"), + PINTUAN_EDIT_ERROR(42009, "修改拼团活动失败"), + PINTUAN_DELETE_ERROR(42010, "删除拼团活动失败"), /** * 满额活动 */ FULL_DISCOUNT_EDIT_SUCCESS(43001, "修改满优惠活动成功"), + FULL_DISCOUNT_EDIT_DELETE(43002, "删除满优惠活动成功"), /** * 店铺 */ STORE_NOT_EXIST(50001, "此店铺不存在"), + STORE_NAME_EXIST_ERROR(50002, "店铺名称已存在!"), + STORE_APPLY_DOUBLE_ERROR(50003, "已有店铺,无需重复申请!"), /** * 结算单 */ BILL_CHECK_ERROR(51001, "只有已出账结算单可以核对"), + BILL_COMPLETE_ERROR(51002, "只有已审核结算单可以支付"), /** * 文章 */ ARTICLE_CATEGORY_NAME_EXIST(60001, "文章分类名称已存在"), + ARTICLE_CATEGORY_PARENT_NOT_EXIST(60002, "文章分类父分类不存在"), + ARTICLE_CATEGORY_BEYOND_TWO(60003, "最多为二级分类,操作失败"), + ARTICLE_CATEGORY_DELETE_ERROR(60004, "该文章分类下存在子分类,不能删除"), + ARTICLE_CATEGORY_HAS_ARTICLE(60005, "该文章分类下存在文章,不能删除"), + ARTICLE_CATEGORY_NO_DELETION(60007, "默认文章分类不能进行删除"), + ARTICLE_NO_DELETION(60008, "默认文章不能进行删除"), @@ -248,8 +307,11 @@ public enum ResultCode { * 页面 */ PAGE_NOT_EXIST(61001, "页面不存在"), + PAGE_OPEN_DELETE_ERROR(61002, "当前页面为开启状态,无法删除"), + PAGE_DELETE_ERROR(61003, "当前页面为唯一页面,无法删除"), + PAGE_RELEASE_ERROR(61004, "页面已发布,无需重复提交"), /** @@ -266,39 +328,49 @@ public enum ResultCode { * 站内信 */ NOTICE_NOT_EXIST(80101, "当前消息模板不存在"), + NOTICE_ERROR(80102, "修改站内信异常,请稍后重试"), /** * OSS */ OSS_NOT_EXIST(80201, "OSS未配置"), + OSS_EXCEPTION(80202, "文件上传失败,请稍后重试"), /** * 验证码 */ VERIFICATION_SEND_SUCCESS(80301, "短信验证码,发送成功"), + VERIFICATION_ERROR(80302, "验证失败"), + VERIFICATION_SMS_ERROR(80303, "短信验证码错误,请重新校验"), + VERIFICATION_SMS_EXPIRED_ERROR(80304, "验证码已失效,请重新校验"), /** * 配置错误 */ ALIPAY_NOT_SETTING(80401, "支付宝支付未配置"), + ALIPAY_EXCEPTION(80402, "支付宝支付错误,请稍后重试"), + ALIPAY_PARAMS_EXCEPTION(80403, "支付宝参数异常"), /** * 微信相关异常 */ WECHAT_CONNECT_NOT_SETTING(80500, "微信联合登陆信息未配置"), + WECHAT_PAYMENT_NOT_SETTING(80501, "微信支付信息未配置"), + WECHAT_QRCODE_ERROR(80502, "微信二维码生成异常"), + WECHAT_MP_MESSAGE_ERROR(80503, "微信小程序小消息订阅异常"), - APP_VERSION_EXIST(80600, "APP版本已存在") - ; + APP_VERSION_EXIST(80600, "APP版本已存在"); + private final Integer code; private final String message; diff --git a/framework/src/main/java/cn/lili/common/sms/impl/SmsUtilAliImplService.java b/framework/src/main/java/cn/lili/common/sms/impl/SmsUtilAliImplService.java index 6a64bfaf..f22b9496 100644 --- a/framework/src/main/java/cn/lili/common/sms/impl/SmsUtilAliImplService.java +++ b/framework/src/main/java/cn/lili/common/sms/impl/SmsUtilAliImplService.java @@ -119,7 +119,6 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { default: return; } - //如果是测试模式 默认验证码 6个1 if (systemSetting.getIsTestModel()) { code = "111111"; @@ -156,7 +155,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { try { SendSmsResponse response = client.sendSms(sendSmsRequest); } catch (Exception e) { - e.printStackTrace(); + log.error("发送短信错误",e); } } @@ -192,7 +191,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { try { client.sendBatchSms(sendBatchSmsRequest); } catch (Exception e) { - e.printStackTrace(); + log.error("批量发送短信错误",e); } } @@ -203,8 +202,6 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { public void addSmsSign(SmsSign smsSign) throws Exception { //设置参数添加短信签名 com.aliyun.dysmsapi20170525.Client client = this.createClient(); - System.out.println(smsSign.getBusinessLicense().substring(smsSign.getBusinessLicense().lastIndexOf(".") + 1)); - System.out.println(smsSign.getLicense().substring(smsSign.getLicense().lastIndexOf("."))); //营业执照 AddSmsSignRequest.AddSmsSignRequestSignFileList signFileList0 = new AddSmsSignRequest.AddSmsSignRequestSignFileList() .setFileContents(Base64Utils.encode(smsSign.getBusinessLicense())) @@ -367,7 +364,7 @@ public class SmsUtilAliImplService implements SmsUtil, AliSmsUtil { config.endpoint = "dysmsapi.aliyuncs.com"; return new com.aliyun.dysmsapi20170525.Client(config); } catch (Exception e) { - e.printStackTrace(); + log.error("短信初始化错误",e); } return null; } diff --git a/framework/src/main/java/cn/lili/common/trigger/delay/queue/PromotionDelayQueue.java b/framework/src/main/java/cn/lili/common/trigger/delay/queue/PromotionDelayQueue.java index 2a072375..28f92713 100644 --- a/framework/src/main/java/cn/lili/common/trigger/delay/queue/PromotionDelayQueue.java +++ b/framework/src/main/java/cn/lili/common/trigger/delay/queue/PromotionDelayQueue.java @@ -2,8 +2,6 @@ package cn.lili.common.trigger.delay.queue; import cn.lili.common.trigger.delay.AbstractDelayQueueMachineFactory; import cn.lili.common.trigger.enums.DelayQueueEnums; -import cn.lili.common.trigger.interfaces.TimeTrigger; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** @@ -18,11 +16,9 @@ import org.springframework.stereotype.Component; @Component public class PromotionDelayQueue extends AbstractDelayQueueMachineFactory { - @Autowired - private TimeTrigger timeTrigger; @Override public String setDelayQueueName() { - return DelayQueueEnums.PROMOTION_QUEUE.name(); + return DelayQueueEnums.PROMOTION.name(); } } diff --git a/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueEnums.java b/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueEnums.java index 6bfc8618..6b67d7fe 100644 --- a/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueEnums.java +++ b/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueEnums.java @@ -7,9 +7,9 @@ public enum DelayQueueEnums { /** - * 促销任务队列 + * 促销活动 */ - PROMOTION_QUEUE("促销任务队列"); + PROMOTION("促销活动"); private String description; diff --git a/framework/src/main/java/cn/lili/common/trigger/enums/PromotionDelayTypeEnums.java b/framework/src/main/java/cn/lili/common/trigger/enums/DelayTypeEnums.java similarity index 64% rename from framework/src/main/java/cn/lili/common/trigger/enums/PromotionDelayTypeEnums.java rename to framework/src/main/java/cn/lili/common/trigger/enums/DelayTypeEnums.java index cf9ea551..2369fa52 100644 --- a/framework/src/main/java/cn/lili/common/trigger/enums/PromotionDelayTypeEnums.java +++ b/framework/src/main/java/cn/lili/common/trigger/enums/DelayTypeEnums.java @@ -6,7 +6,7 @@ package cn.lili.common.trigger.enums; * @author paulG * @since 2021/5/7 */ -public enum PromotionDelayTypeEnums { +public enum DelayTypeEnums { /** * 促销活动 @@ -15,11 +15,16 @@ public enum PromotionDelayTypeEnums { /** * 拼团订单 */ - PINTUAN_ORDER("拼团订单"); + PINTUAN_ORDER("拼团订单"), + + /** + * 直播 + */ + BROADCAST("直播"); private String description; - PromotionDelayTypeEnums(String description) { + DelayTypeEnums(String description) { this.description = description; } diff --git a/framework/src/main/java/cn/lili/common/trigger/message/BroadcastMessage.java b/framework/src/main/java/cn/lili/common/trigger/message/BroadcastMessage.java new file mode 100644 index 00000000..42e96cbf --- /dev/null +++ b/framework/src/main/java/cn/lili/common/trigger/message/BroadcastMessage.java @@ -0,0 +1,34 @@ +package cn.lili.common.delayqueue; + +import cn.hutool.core.date.DateTime; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 直播消息实体 + * + * @author Bulbasaur + * @date: 2021/6/1 4:48 下午 + */ +@Data +@NoArgsConstructor +public class BroadcastMessage { + + /** + * 直播间ID + */ + private String studioId; + + /** + * 状态 + */ + private String status; + + + public BroadcastMessage(String studioId, String status) { + this.studioId = studioId; + this.status = status; + } +} diff --git a/framework/src/main/java/cn/lili/common/trigger/model/TimeExecuteConstant.java b/framework/src/main/java/cn/lili/common/trigger/model/TimeExecuteConstant.java index 2065af34..e9136ee4 100644 --- a/framework/src/main/java/cn/lili/common/trigger/model/TimeExecuteConstant.java +++ b/framework/src/main/java/cn/lili/common/trigger/model/TimeExecuteConstant.java @@ -13,4 +13,9 @@ public abstract class TimeExecuteConstant { */ public static final String PROMOTION_EXECUTOR = "promotionTimeTriggerExecutor"; + /** + * 直播间延迟加载执行器 + */ + public static final String BROADCAST_EXECUTOR = "broadcastTimeTriggerExecutor"; + } diff --git a/framework/src/main/java/cn/lili/common/trigger/util/DelayQueueTools.java b/framework/src/main/java/cn/lili/common/trigger/util/DelayQueueTools.java index e5055eda..c8ce87be 100644 --- a/framework/src/main/java/cn/lili/common/trigger/util/DelayQueueTools.java +++ b/framework/src/main/java/cn/lili/common/trigger/util/DelayQueueTools.java @@ -1,6 +1,6 @@ package cn.lili.common.trigger.util; -import cn.lili.common.trigger.enums.PromotionDelayTypeEnums; +import cn.lili.common.trigger.enums.DelayTypeEnums; /** * 延时任务工具类 @@ -22,7 +22,7 @@ public class DelayQueueTools { * @param id id * @return 唯一键 */ - public static String wrapperUniqueKey(PromotionDelayTypeEnums type, String id) { + public static String wrapperUniqueKey(DelayTypeEnums type, String id) { return "{TIME_TRIGGER_" + type.name() + "}_" + id; } diff --git a/framework/src/main/java/cn/lili/common/utils/Base64DecodeMultipartFile.java b/framework/src/main/java/cn/lili/common/utils/Base64DecodeMultipartFile.java index 85a74350..757d4839 100644 --- a/framework/src/main/java/cn/lili/common/utils/Base64DecodeMultipartFile.java +++ b/framework/src/main/java/cn/lili/common/utils/Base64DecodeMultipartFile.java @@ -1,5 +1,6 @@ package cn.lili.common.utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.multipart.MultipartFile; import java.util.Base64; @@ -12,6 +13,7 @@ import java.io.*; * * @author Chopper */ +@Slf4j public class Base64DecodeMultipartFile implements MultipartFile { private final byte[] imgContent; @@ -64,7 +66,7 @@ public class Base64DecodeMultipartFile implements MultipartFile { stream = new FileOutputStream(dest); stream.write(imgContent); } catch (IOException e) { - e.printStackTrace(); + log.error("transferTo错误",e); }finally { stream.close(); } @@ -92,7 +94,7 @@ public class Base64DecodeMultipartFile implements MultipartFile { byte[] bytes = Base64.getDecoder().decode(base64); stream = new ByteArrayInputStream(bytes); } catch (Exception e) { - e.printStackTrace(); + log.error("base64ToInputStream错误",e); } return stream; } @@ -109,13 +111,13 @@ public class Base64DecodeMultipartFile implements MultipartFile { } data = swapStream.toByteArray(); } catch (IOException e) { - e.printStackTrace(); + log.error("转码错误",e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { - e.printStackTrace(); + log.error("inputStreamToStream错误",e); } } } diff --git a/framework/src/main/java/cn/lili/common/utils/CookieUtil.java b/framework/src/main/java/cn/lili/common/utils/CookieUtil.java index a430ebfb..db9d479e 100644 --- a/framework/src/main/java/cn/lili/common/utils/CookieUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/CookieUtil.java @@ -1,5 +1,7 @@ package cn.lili.common.utils; +import lombok.extern.slf4j.Slf4j; + import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -11,24 +13,9 @@ import javax.servlet.http.HttpServletResponse; * @version v1.0 * 2020-12-14 09:32 */ +@Slf4j public class CookieUtil { - /** - * 新增cookie - * - * @param key key值 - * @param value 对应值 - * @param response 响应 - */ - public static void addCookie(String key, String value, HttpServletResponse response) { - try { - Cookie c = new Cookie(key, value); - c.setPath("/"); - response.addCookie(c); - } catch (Exception e) { - e.printStackTrace(); - } - } /** * 新增cookie @@ -45,7 +32,7 @@ public class CookieUtil { c.setPath("/"); response.addCookie(c); } catch (Exception e) { - e.printStackTrace(); + log.error("新增cookie错误",e); } } @@ -61,7 +48,7 @@ public class CookieUtil { c.setMaxAge(0); response.addCookie(c); } catch (Exception e) { - e.printStackTrace(); + log.error("删除cookie错误",e); } } @@ -83,7 +70,7 @@ public class CookieUtil { } } } catch (Exception e) { - e.printStackTrace(); + log.error("获取cookie错误",e); } return null; } diff --git a/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java b/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java index d2e21cb5..290ba1b4 100644 --- a/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/CurrencyUtil.java @@ -56,6 +56,24 @@ public final class CurrencyUtil { return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } + /** + * 提供精确的乘法运算。 + * + * @param v1 被乘数 + * @param v2 乘数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的积 + */ + public static Double mul(double v1, double v2, int scale) { + if (scale < 0) { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + /** * 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。 * diff --git a/framework/src/main/java/cn/lili/common/utils/HttpClientUtils.java b/framework/src/main/java/cn/lili/common/utils/HttpClientUtils.java index 12b2ccc5..30ffb53c 100644 --- a/framework/src/main/java/cn/lili/common/utils/HttpClientUtils.java +++ b/framework/src/main/java/cn/lili/common/utils/HttpClientUtils.java @@ -1,9 +1,12 @@ package cn.lili.common.utils; -import org.apache.http.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntityEnclosingRequest; +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; +import org.apache.http.NoHttpResponseException; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; @@ -21,7 +24,6 @@ import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import javax.net.ssl.SSLException; @@ -30,10 +32,9 @@ import java.io.IOException; import java.io.InterruptedIOException; import java.net.URI; import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; import java.util.Map; +@Slf4j public class HttpClientUtils { // org.apache.http.impl.client.CloseableHttpClient @@ -146,11 +147,9 @@ public class HttpClientUtils { // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); - } else { - System.out.println(response.getStatusLine().getStatusCode()); } } catch (Exception e) { - e.printStackTrace(); + log.error("get请求错误",e); } finally { try { if (response != null) { @@ -158,71 +157,9 @@ public class HttpClientUtils { } httpClient.close(); } catch (IOException e) { - e.printStackTrace(); + log.error("Get错误",e); } } return resultString; } - - public static String doPost(String url, Map param) { - // 创建HttpClient对象 - CloseableHttpClient httpClient = getHttpClient(); - CloseableHttpResponse response = null; - String resultString = ""; - try { - // 创建Http Post请求 - HttpPost httpPost = new HttpPost(url); - // 创建参数列表 - if (param != null) { - List paramList = new ArrayList<>(); - for (String key : param.keySet()) { - paramList.add(new BasicNameValuePair(key, param.get(key))); - } - // 模拟表单 - UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8"); - httpPost.setEntity(entity); - } - // 执行http请求 - response = httpClient.execute(httpPost); - resultString = EntityUtils.toString(response.getEntity(), "utf-8"); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - response.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - return resultString; - } - - - public static String doPostJson(String url, String json) { - // 创建HttpClient对象 - CloseableHttpClient httpClient = getHttpClient(); - CloseableHttpResponse response = null; - String resultString = ""; - try { - // 创建Http Post请求 - HttpPost httpPost = new HttpPost(url); - // 创建请求内容 - StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); - httpPost.setEntity(entity); - // 执行http请求 - response = httpClient.execute(httpPost); - resultString = EntityUtils.toString(response.getEntity(), "utf-8"); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - response.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - return resultString; - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/common/utils/RedisUtil.java b/framework/src/main/java/cn/lili/common/utils/RedisUtil.java index 959ad346..2f01f7c8 100644 --- a/framework/src/main/java/cn/lili/common/utils/RedisUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/RedisUtil.java @@ -1,13 +1,12 @@ package cn.lili.common.utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.DefaultTypedTuple; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -17,6 +16,7 @@ import java.util.concurrent.TimeUnit; * @author paulG * @since 2020/11/7 **/ +@Slf4j @Component public class RedisUtil { @Autowired @@ -38,51 +38,11 @@ public class RedisUtil { } return true; } catch (Exception e) { - e.printStackTrace(); + log.error("指定缓存失效时间错误",e); return false; } } - /** - * 根据key 获取过期时间 - * - * @param key 键 不能为null - * @return 时间(秒) 返回0代表为永久有效 - */ - public long getExpire(String key) { - return redisTemplate.getExpire(key, TimeUnit.SECONDS); - } - - /** - * 判断key是否存在 - * - * @param key 键 - * @return true 存在 false不存在 - */ - public boolean hasKey(String key) { - try { - return redisTemplate.hasKey(key); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 删除缓存 - * - * @param key 可以传一个值 或多个 - */ - @SuppressWarnings("unchecked") - public void del(String... key) { - if (key != null && key.length > 0) { - if (key.length == 1) { - redisTemplate.delete(key[0]); - } else { - redisTemplate.delete(CollectionUtils.arrayToList(key)); - } - } - } //============================String============================= @@ -120,7 +80,7 @@ public class RedisUtil { redisTemplate.opsForValue().set(key, value); return true; } catch (Exception e) { - e.printStackTrace(); + log.error("缓存放入错误",e); return false; } @@ -143,215 +103,13 @@ public class RedisUtil { } return true; } catch (Exception e) { - e.printStackTrace(); + log.error("普通缓存放入并设置时间错误",e); return false; } } - /** - * 递增 - * - * @param key 键 - * @return - */ - public long incr(String key, long delta) { - if (delta < 0) { - throw new RuntimeException("递增因子必须大于0"); - } - return redisTemplate.opsForValue().increment(key, delta); - } - - /** - * 递减 - * - * @param key 键 - * @return - */ - public long decr(String key, long delta) { - if (delta < 0) { - throw new RuntimeException("递减因子必须大于0"); - } - return redisTemplate.opsForValue().increment(key, -delta); - } - //================================Map================================= - /** - * HashGet - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return 值 - */ - public Object hget(String key, String item) { - return redisTemplate.opsForHash().get(key, item); - } - - /** - * 获取hashKey对应的所有键值 - * - * @param key 键 - * @return 对应的多个键值 - */ - public Map hmget(String key) { - return redisTemplate.opsForHash().entries(key); - } - - /** - * HashSet - * - * @param key 键 - * @param map 对应多个键值 - * @return true 成功 false 失败 - */ - public boolean hmset(String key, Map map) { - try { - redisTemplate.opsForHash().putAll(key, map); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * HashSet 并设置时间 - * - * @param key 键 - * @param map 对应多个键值 - * @param time 时间(秒) - * @return true成功 false失败 - */ - public boolean hmset(String key, Map map, long time) { - try { - redisTemplate.opsForHash().putAll(key, map); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value) { - try { - redisTemplate.opsForHash().put(key, item, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value, long time) { - try { - redisTemplate.opsForHash().put(key, item, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * 删除hash表中的值 - * - * @param key 键 不能为null - * @param item 项 可以使多个 不能为null - */ - public void hdel(String key, Object... item) { - redisTemplate.opsForHash().delete(key, item); - } - - /** - * 判断hash表中是否有该项的值 - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return true 存在 false不存在 - */ - public boolean hHasKey(String key, String item) { - return redisTemplate.opsForHash().hasKey(key, item); - } - - /** - * hash递增 如果不存在,就会创建一个 并把新增后的值返回 - * - * @param key 键 - * @param item 项 - * @param by 要增加几(大于0) - * @return - */ - public double hincr(String key, String item, double by) { - return redisTemplate.opsForHash().increment(key, item, by); - } - - /** - * hash递减 - * - * @param key 键 - * @param item 项 - * @param by 要减少记(小于0) - * @return - */ - public double hdecr(String key, String item, double by) { - return redisTemplate.opsForHash().increment(key, item, -by); - } - - //============================set============================= - - /** - * 根据key获取Set中的所有值 - * - * @param key 键 - * @return - */ - public Set sGet(String key) { - try { - return redisTemplate.opsForSet().members(key); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 根据value从一个set中查询,是否存在 - * - * @param key 键 - * @param value 值 - * @return true 存在 false不存在 - */ - public boolean sHasKey(String key, Object value) { - try { - return redisTemplate.opsForSet().isMember(key, value); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } /** * 将数据放入set缓存 @@ -364,112 +122,11 @@ public class RedisUtil { try { return redisTemplate.opsForSet().add(key, values); } catch (Exception e) { - e.printStackTrace(); + log.error("将数据放入set缓存错误",e); return 0; } } - /** - * 将set数据放入缓存 - * - * @param key 键 - * @param time 时间(秒) - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSetAndTime(String key, long time, Object... values) { - try { - Long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) { - expire(key, time); - } - return count; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 获取set缓存的长度 - * - * @param key 键 - * @return - */ - public long sGetSetSize(String key) { - try { - return redisTemplate.opsForSet().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 移除值为value的 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 移除的个数 - */ - public long setRemove(String key, Object... values) { - try { - Long count = redisTemplate.opsForSet().remove(key, values); - return count; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - //===============================listByParentId================================= - - /** - * 获取list缓存的内容 - * - * @param key 键 - * @param start 开始 - * @param end 结束 0 到 -1代表所有值 - * @return - */ - public List lGet(String key, long start, long end) { - try { - return redisTemplate.opsForList().range(key, start, end); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 获取list缓存的长度 - * - * @param key 键 - * @return - */ - public long lGetListSize(String key) { - try { - return redisTemplate.opsForList().size(key); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - /** - * 通过索引 获取list中的值 - * - * @param key 键 - * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 - * @return - */ - public Object lGetIndex(String key, long index) { - try { - return redisTemplate.opsForList().index(key, index); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } /** * 将list放入缓存 @@ -483,7 +140,7 @@ public class RedisUtil { redisTemplate.opsForList().rightPush(key, value); return true; } catch (Exception e) { - e.printStackTrace(); + log.error("将list放入缓存错误",e); return false; } } @@ -504,7 +161,7 @@ public class RedisUtil { } return true; } catch (Exception e) { - e.printStackTrace(); + log.error("将list放入缓存错误",e); return false; } } @@ -521,27 +178,11 @@ public class RedisUtil { redisTemplate.opsForList().rightPushAll(key, value); return true; } catch (Exception e) { - e.printStackTrace(); + log.error("将list放入缓存错误",e); return false; } } - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lPush(String key, List value) { - try { - redisTemplate.opsForList().leftPushAll(key, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } /** * 将list放入缓存 @@ -559,46 +200,12 @@ public class RedisUtil { } return true; } catch (Exception e) { - e.printStackTrace(); + log.error("将list放入缓存错误",e); return false; } } - /** - * 根据索引修改list中的某条数据 - * - * @param key 键 - * @param index 索引 - * @param value 值 - * @return - */ - public boolean lUpdateIndex(String key, long index, Object value) { - try { - redisTemplate.opsForList().set(key, index, value); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - /** - * 移除N个值为value - * - * @param key 键 - * @param count 移除多少个 - * @param value 值 - * @return 移除的个数 - */ - public long lRemove(String key, long count, Object value) { - try { - Long remove = redisTemplate.opsForList().remove(key, count, value); - return remove; - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } //===============================ZSet================================= /** diff --git a/framework/src/main/java/cn/lili/common/verification/service/impl/VerificationServiceImpl.java b/framework/src/main/java/cn/lili/common/verification/service/impl/VerificationServiceImpl.java index acf28828..c73c085c 100644 --- a/framework/src/main/java/cn/lili/common/verification/service/impl/VerificationServiceImpl.java +++ b/framework/src/main/java/cn/lili/common/verification/service/impl/VerificationServiceImpl.java @@ -82,7 +82,7 @@ public class VerificationServiceImpl implements VerificationService { } catch (ServiceException e) { throw e; } catch (Exception e) { - e.printStackTrace(); + log.error("创建校验错误",e); return null; } } diff --git a/framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchConfig.java b/framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchConfig.java index 86212804..3aac32dd 100644 --- a/framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchConfig.java +++ b/framework/src/main/java/cn/lili/config/elasticsearch/ElasticsearchConfig.java @@ -1,6 +1,7 @@ package cn.lili.config.elasticsearch; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; @@ -27,6 +28,7 @@ import java.util.List; * @author paulG * @since 2020/10/13 **/ +@Slf4j @Configuration @RequiredArgsConstructor(onConstructor_ = @Autowired) public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { @@ -96,7 +98,7 @@ public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { try { this.client.close(); } catch (IOException e) { - e.printStackTrace(); + log.error("es clientClose错误",e); } } diff --git a/framework/src/main/java/cn/lili/config/rocketmq/RocketmqCustomProperties.java b/framework/src/main/java/cn/lili/config/rocketmq/RocketmqCustomProperties.java index 9f17158f..daedfe43 100644 --- a/framework/src/main/java/cn/lili/config/rocketmq/RocketmqCustomProperties.java +++ b/framework/src/main/java/cn/lili/config/rocketmq/RocketmqCustomProperties.java @@ -61,4 +61,8 @@ public class RocketmqCustomProperties { private String afterSaleGroup; + private String broadcastTopic; + + private String broadcastGroup; + } diff --git a/framework/src/main/java/cn/lili/modules/base/serviceimpl/RegionServiceImpl.java b/framework/src/main/java/cn/lili/modules/base/serviceimpl/RegionServiceImpl.java index 6c1c860a..2bec4e95 100644 --- a/framework/src/main/java/cn/lili/modules/base/serviceimpl/RegionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/base/serviceimpl/RegionServiceImpl.java @@ -58,7 +58,7 @@ public class RegionServiceImpl extends ServiceImpl impleme //删除缓存 cache.vagueDel("{regions}"); } catch (Exception e) { - e.printStackTrace(); + log.error("同步行政数据错误",e); } } diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/Commodity.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/Commodity.java new file mode 100644 index 00000000..51dab69e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/Commodity.java @@ -0,0 +1,64 @@ +package cn.lili.modules.broadcast.entity.dos; + +import cn.lili.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * 小程序直播商品 + * @author Bulbasaur + * @date: 2021/5/17 9:34 上午 + * + */ +@Data +@Entity +@ApiModel(value = "Commodity", description = "直播商品") +@TableName("li_commodity") +@Table(name = "li_commodity") +public class Commodity extends BaseEntity { + + @ApiModelProperty(value = "图片") + private String goodsImage; + + @ApiModelProperty(value = "商品名称") + private String name; + + //1:一口价(只需要传入price,price2不传) + // 2:价格区间(price字段为左边界,price2字段为右边界,price和price2必传) + // 3:显示折扣价(price字段为原价,price2字段为现价, price和price2必传 + @ApiModelProperty(value = "价格类型") + private Integer priceType; + + @ApiModelProperty(value = "价格") + private Double price; + + @ApiModelProperty(value = "价格2") + private Double price2; + + @ApiModelProperty(value = "商品详情页的小程序路径") + private String url; + + @ApiModelProperty(value = "微信程序直播商品ID") + private Integer liveGoodsId; + + @ApiModelProperty(value = "审核单ID") + private String auditId; + + @ApiModelProperty(value = "审核状态") + private String auditStatus; + + @ApiModelProperty(value = "店铺ID") + private String storeId; + + @ApiModelProperty(value = "商品ID") + private String goodsId; + + @ApiModelProperty(value = "规格ID") + private String skuId; + +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/Studio.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/Studio.java new file mode 100644 index 00000000..2eebe3b5 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/Studio.java @@ -0,0 +1,97 @@ +package cn.lili.modules.broadcast.entity.dos; + +import cn.lili.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * 小程序直播间 + * + * @author Bulbasaur + * @date: 2021/5/17 9:47 上午 + */ +@Data +@Entity +@ApiModel(value = "直播间") +@TableName("li_studio") +@Table(name = "li_studio") +public class Studio extends BaseEntity { + + /** + * 直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符 + */ + @ApiModelProperty(value = "直播间名字") + private String name; + + /** + * 背景图,填入mediaID(mediaID获取后,三天内有效);图片mediaID的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html;直播间背景图,图片规则:建议像素1080*1920,大小不超过2M + */ + @ApiModelProperty(value = "背景图") + private String coverImg; + + /** + * 直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后) + */ + @ApiModelProperty(value = "开始时间") + private String startTime; + + /** + * 直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时) + */ + @ApiModelProperty(value = "结束时间") + private String endTime; + + /** + * 主播昵称,最短2个汉字,最长15个汉字,1个汉字相当于2个字符 + */ + @ApiModelProperty(value = "主播昵称") + private String anchorName; + + /** + * 主播微信号,如果未实名认证,需要先前往“小程序直播”小程序进行实名验证, 小程序二维码链接:https://res.wx.qq.com/op_res/9rSix1dhHfK4rR049JL0PHJ7TpOvkuZ3mE0z7Ou_Etvjf-w1J_jVX0rZqeStLfwh + */ + @ApiModelProperty(value = "主播微信号") + private String anchorWechat; + + /** + * 分享图,填入mediaID(mediaID获取后,三天内有效);图片mediaID的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html;直播间分享图,图片规则:建议像素800*640,大小不超过1M; + */ + @ApiModelProperty(value = "分享图") + private String shareImg; + + /** + * 购物直播频道封面图,填入mediaID(mediaID获取后,三天内有效);图片mediaID的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html; 购物直播频道封面图,图片规则:建议像素800*800,大小不超过100KB; + */ + @ApiModelProperty(value = "封面图") + private String feedsImg; + + + @ApiModelProperty(value = "回放视频链接") + private String mediaUrl; + + @ApiModelProperty(value = "房间ID") + private Integer roomId; + + @ApiModelProperty(value = "小程序直播码") + private String qrCodeUrl; + + @ApiModelProperty(value = "店铺ID") + private String storeId; + + @ApiModelProperty(value = "直播间商品数量") + private Integer roomGoodsNum; + + @ApiModelProperty(value = "直播间商品(最多展示两个商品:name/goodsImage)") + private String roomGoodsList; + + @ApiModelProperty(value = "推荐直播间") + private boolean recommend; + + @ApiModelProperty(value = "直播间状态") + private String status; +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/StudioCommodity.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/StudioCommodity.java new file mode 100644 index 00000000..bc11e409 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/dos/StudioCommodity.java @@ -0,0 +1,47 @@ +package cn.lili.modules.broadcast.entity.dos; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * 直播商品 + * + * @author Bulbasaur + * @date: 2021/5/18 5:42 下午 + */ +@Data +@Entity +@ApiModel(value = "直播商品") +@TableName("li_studio_commodity") +@Table(name = "li_studio_commodity") +@NoArgsConstructor +public class StudioCommodity { + + @Id + @TableId + @TableField + @Column(columnDefinition = "bigint(20)") + @ApiModelProperty(value = "唯一标识", hidden = true) + private String id; + + @ApiModelProperty(value = "房间ID") + private Integer roomId; + + @ApiModelProperty(value = "商品ID") + private Integer goodsId; + + public StudioCommodity(Integer roomId, Integer goodsId) { + this.roomId = roomId; + this.goodsId = goodsId; + } +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/CommodityDTO.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/CommodityDTO.java new file mode 100644 index 00000000..e28e41d3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/CommodityDTO.java @@ -0,0 +1,22 @@ +package cn.lili.modules.broadcast.entity.dto; + +import lombok.Data; + +/** + * 直播商品DTO + * 用于获取直播商品状态时使用 + * + * @author Bulbasaur + * @date: 2021/5/25 12:12 下午 + */ +@Data +public class CommodityDTO { + //商品ID + private Integer goods_id; + //商品名称 + private String name; + //地址 + private String url; + //审核状态 + private Integer audit_status; +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/GoodsInfo.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/GoodsInfo.java new file mode 100644 index 00000000..f0e8ae93 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/GoodsInfo.java @@ -0,0 +1,43 @@ +package cn.lili.modules.broadcast.entity.dto; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.broadcast.entity.dos.Commodity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 微信小程序直播商品DTO + * @author Bulbasaur + * @date: 2021/5/17 11:03 上午 + * + */ +@Data +@NoArgsConstructor +public class GoodsInfo { + + @ApiModelProperty(value = "图片mediaID") + private String coverImgUrl; + + @ApiModelProperty(value = "商品名称") + private String name; + + //1:一口价(只需要传入price,price2不传) + // 2:价格区间(price字段为左边界,price2字段为右边界,price和price2必传) + // 3:显示折扣价(price字段为原价,price2字段为现价, price和price2必传 + @ApiModelProperty(value = "价格类型") + private Integer priceType; + + @ApiModelProperty(value = "价格") + private Double price; + + @ApiModelProperty(value = "价格2") + private Double price2; + + @ApiModelProperty(value = "商品详情页的小程序路径") + private String url; + + public GoodsInfo(Commodity commodity){ + BeanUtil.copyProperties(commodity, this); + } +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/SimpleCommodity.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/SimpleCommodity.java new file mode 100644 index 00000000..0b24cc76 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/dto/SimpleCommodity.java @@ -0,0 +1,18 @@ +package cn.lili.modules.broadcast.entity.dto; + +import io.swagger.annotations.ApiModelProperty; + +/** + * 用于直播间前台使用的直播间商品DTO + * + * @author Bulbasaur + * @date: 2021/5/20 2:34 下午 + */ +public class SimpleCommodity { + + @ApiModelProperty(value = "图片") + private String goodsImage; + + @ApiModelProperty(value = "商品名称") + private String name; +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/enums/StudioStatusEnum.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/enums/StudioStatusEnum.java new file mode 100644 index 00000000..8cdcbde9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/enums/StudioStatusEnum.java @@ -0,0 +1,27 @@ +package cn.lili.modules.broadcast.entity.enums; + + +/** + * 直播间状态 + * @author Bulbasaur + * @date: 2021/5/31 10:32 上午 + * + */ +public enum StudioStatusEnum { + + NEW("新建"), START("开始"), END("结束"); + + private final String clientName; + + StudioStatusEnum(String des) { + this.clientName = des; + } + + public String clientName() { + return this.clientName; + } + + public String value() { + return this.name(); + } +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/vos/CommodityVO.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/vos/CommodityVO.java new file mode 100644 index 00000000..012ac5b0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/vos/CommodityVO.java @@ -0,0 +1,21 @@ +package cn.lili.modules.broadcast.entity.vos; + +import cn.lili.modules.broadcast.entity.dos.Commodity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 直播商品VO + * + * @author Bulbasaur + * @date: 2021/5/26 6:09 下午 + */ +@Data +public class CommodityVO extends Commodity { + + @ApiModelProperty(value = "SKU库存") + private Integer quantity; + + @ApiModelProperty(value = "店铺名称") + private String storeName; +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/entity/vos/StudioVO.java b/framework/src/main/java/cn/lili/modules/broadcast/entity/vos/StudioVO.java new file mode 100644 index 00000000..9d207e44 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/entity/vos/StudioVO.java @@ -0,0 +1,22 @@ +package cn.lili.modules.broadcast.entity.vos; + +import cn.lili.modules.broadcast.entity.dos.Commodity; +import cn.lili.modules.broadcast.entity.dos.Studio; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 直播间VO + * + * @author Bulbasaur + * @date: 2021/5/31 11:58 上午 + */ +@Data +public class StudioVO extends Studio { + + @ApiModelProperty(value = "直播间商品列表") + private List commodityList; + +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/mapper/CommodityMapper.java b/framework/src/main/java/cn/lili/modules/broadcast/mapper/CommodityMapper.java new file mode 100644 index 00000000..9420d175 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/mapper/CommodityMapper.java @@ -0,0 +1,35 @@ +package cn.lili.modules.broadcast.mapper; + +import cn.lili.modules.broadcast.entity.dos.Commodity; +import cn.lili.modules.broadcast.entity.dto.SimpleCommodity; +import cn.lili.modules.broadcast.entity.vos.CommodityVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 直播商品数据层 + * + * @author Bulbasaur + * @date: 2021/5/17 9:56 上午 + */ +public interface CommodityMapper extends BaseMapper { + + @Select("SELECT live_goods_id FROM li_commodity WHERE audit_status='0' or audit_status='1'") + List getAuditCommodity(); + + @Select("SELECT * FROM li_commodity c INNER JOIN li_studio_commodity sc ON sc.goods_id = c.live_goods_id WHERE sc.room_id =#{roomId}") + List getCommodityByRoomId(Integer roomId); + + @Select("SELECT goods_image FROM li_commodity c INNER JOIN li_studio_commodity sc ON sc.goods_id = c.live_goods_id WHERE sc.room_id =#{roomId}") + List getSimpleCommodityByRoomId(Integer roomId); + + @Select("SELECT c.*,gs.quantity,s.store_name FROM li_commodity c INNER JOIN li_goods_sku gs ON c.sku_id = gs.id INNER JOIN li_store s ON s.id=c.store_id ${ew.customSqlSegment}") + IPage commodityVOList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/broadcast/mapper/StudioCommodityMapper.java b/framework/src/main/java/cn/lili/modules/broadcast/mapper/StudioCommodityMapper.java new file mode 100644 index 00000000..24f61928 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/mapper/StudioCommodityMapper.java @@ -0,0 +1,13 @@ +package cn.lili.modules.broadcast.mapper; + +import cn.lili.modules.broadcast.entity.dos.StudioCommodity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 直播间-商品关联持久层 + * @author Bulbasaur + * @date: 2021/5/17 3:14 下午 + * + */ +public interface StudioCommodityMapper extends BaseMapper { +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/mapper/StudioMapper.java b/framework/src/main/java/cn/lili/modules/broadcast/mapper/StudioMapper.java new file mode 100644 index 00000000..37ed4740 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/mapper/StudioMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.broadcast.mapper; + +import cn.lili.modules.broadcast.entity.dos.Studio; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 直播间数据层 + * + * @author Bulbasaur + * @date: 2021/5/17 9:56 上午 + */ +public interface StudioMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/broadcast/service/CommodityService.java b/framework/src/main/java/cn/lili/modules/broadcast/service/CommodityService.java new file mode 100644 index 00000000..c9161c7b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/service/CommodityService.java @@ -0,0 +1,45 @@ +package cn.lili.modules.broadcast.service; + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.broadcast.entity.dos.Commodity; +import cn.lili.modules.broadcast.entity.vos.CommodityVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 直播商品业务层 + * + * @author Bulbasaur + * @date: 2021/5/17 10:39 上午 + */ +public interface CommodityService extends IService { + + /** + * 添加直播商品 + * @return 添加结果 + */ + boolean addCommodity(List commodity); + + /** + * 删除直播商品 + * @param goodsId 直播商品ID + * @return 删除结果 + */ + boolean deleteCommodity(String goodsId); + + /** + * 查询微信小程序直播商品审核状态 + */ + void getGoodsWareHouse(); + + /** + * 查看直播商品分页 + * @param pageVO 分页 + * @param name 商品名称 + * @param auditStatus 审核状态 + * @return 直播商品分页 + */ + IPage commodityList(PageVO pageVO, String name, String auditStatus); +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/service/StudioCommodityService.java b/framework/src/main/java/cn/lili/modules/broadcast/service/StudioCommodityService.java new file mode 100644 index 00000000..27321937 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/service/StudioCommodityService.java @@ -0,0 +1,13 @@ +package cn.lili.modules.broadcast.service; + +import cn.lili.modules.broadcast.entity.dos.StudioCommodity; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 直播间-商品关联业务层 + * + * @author Bulbasaur + * @date: 2021/5/17 3:19 下午 + */ +public interface StudioCommodityService extends IService { +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/service/StudioService.java b/framework/src/main/java/cn/lili/modules/broadcast/service/StudioService.java new file mode 100644 index 00000000..0acb351b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/service/StudioService.java @@ -0,0 +1,79 @@ +package cn.lili.modules.broadcast.service; + +import cn.lili.common.delayqueue.BroadcastMessage; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.broadcast.entity.dos.Studio; +import cn.lili.modules.broadcast.entity.vos.StudioVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 直播间业务层 + * + * @author Bulbasaur + * @date: 2021/5/17 10:02 上午 + */ +public interface StudioService extends IService { + + /** + * 创建直播间 + * 直播间默认手机直播 + * 默认开启:点赞、商品货架、评论、回放 + * @param studio 直播间 + * @return 开启状态 + */ + Boolean create(Studio studio); + + /** + * 修改直播间 + * 直播间默认手机直播 + * @param studio 直播间 + * @return 修改状态 + */ + Boolean edit(Studio studio); + + /** + * 获取直播间信息 + * @param id 直播间ID + * @return 直播间VO + */ + StudioVO getStudioVO(String id); + + /** + * 获取直播间回放 + * @param roomId 房间ID + * @return 直播间回放地址 + */ + String getLiveInfo(Integer roomId); + + /** + * 推送商品 + * @param roomId 店铺ID + * @param goodsId 商品ID + * @return 操作结果 + */ + Boolean push(Integer roomId,Integer goodsId); + + /** + * 删除商品 + * @param roomId 店铺ID + * @param goodsId 商品ID + * @return 操作结果 + */ + Boolean goodsDeleteInRoom(Integer roomId,Integer goodsId); + + /** + * 获取直播间列表 + * @param pageVO 分页 + * @param recommend 是否推荐 + * @param status 直播间状态 + * @return 直播间分页 + */ + IPage studioList(PageVO pageVO, Integer recommend, String status); + + /** + * 修改直播间状态 + * @param broadcastMessage 直播间消息 + */ + void updateStudioStatus(BroadcastMessage broadcastMessage); +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/CommodityServiceImpl.java b/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/CommodityServiceImpl.java new file mode 100644 index 00000000..beabdc2e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/CommodityServiceImpl.java @@ -0,0 +1,112 @@ +package cn.lili.modules.broadcast.serviceimpl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.security.enums.UserEnums; +import cn.lili.common.utils.PageUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.broadcast.entity.dos.Commodity; +import cn.lili.modules.broadcast.entity.dto.CommodityDTO; +import cn.lili.modules.broadcast.entity.vos.CommodityVO; +import cn.lili.modules.broadcast.mapper.CommodityMapper; +import cn.lili.modules.broadcast.service.CommodityService; +import cn.lili.modules.broadcast.util.WechatLivePlayerUtil; +import cn.lili.modules.goods.entity.dos.GoodsSku; +import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; +import cn.lili.modules.goods.service.GoodsSkuService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 直播商品业务层实现 + * + * @author Bulbasaur + * @date: 2021/5/17 11:16 上午 + */ +@Service +public class CommodityServiceImpl extends ServiceImpl implements CommodityService { + + @Autowired + private WechatLivePlayerUtil wechatLivePlayerUtil; + @Autowired + private GoodsSkuService goodsSkuService; + + @Override + public boolean addCommodity(List commodityList) { + for (Commodity commodity : commodityList) { + //检测直播商品 + checkCommodity(commodity); + //添加直播商品 + JSONObject json = wechatLivePlayerUtil.addGoods(commodity); + if(!json.getStr("errcode").equals("0")){ + throw new ServiceException(json.getStr("errmsg")); + } + commodity.setLiveGoodsId(Convert.toInt(json.getStr("goodsId"))); + commodity.setAuditId(json.getStr("auditId")); + commodity.setStoreId(UserContext.getCurrentUser().getStoreId()); + //默认为待审核状态 + commodity.setAuditStatus("0"); + this.save(commodity); + } + return true; + } + + private void checkCommodity(Commodity commodity) { + //商品是否审核通过 + GoodsSku goodsSku = goodsSkuService.getById(commodity.getSkuId()); + if (!goodsSku.getIsAuth().equals(GoodsAuthEnum.PASS.name())) { + throw new ServiceException(goodsSku.getGoodsName() + " 未审核通过,不能添加直播商品"); + } + //是否已添加规格商品 + if (this.count(new LambdaQueryWrapper().eq(Commodity::getSkuId, commodity.getSkuId())) > 0) { + throw new ServiceException(goodsSku.getGoodsName() + " 已添加规格商品,无法重复增加"); + } + } + + @Override + public boolean deleteCommodity(String goodsId) { + JSONObject json = wechatLivePlayerUtil.deleteGoods(goodsId); + if (json.getStr("errcode").equals("0")) { + return this.remove(new LambdaQueryWrapper().eq(Commodity::getLiveGoodsId, goodsId)); + } + return false; + } + + @Override + public void getGoodsWareHouse() { + //查询审核中的商品 + List goodsIdList = this.baseMapper.getAuditCommodity(); + if (goodsIdList.size() > 0) { + //同步状态 + JSONObject json = wechatLivePlayerUtil.getGoodsWareHouse(goodsIdList); + //修改状态 + List commodityDTOList = JSONUtil.toList((JSONArray) json.get("goods"), CommodityDTO.class); + for (CommodityDTO commodityDTO : commodityDTOList) { + //修改审核状态 + this.update(new LambdaUpdateWrapper() + .eq(Commodity::getLiveGoodsId, commodityDTO.getGoods_id()) + .set(Commodity::getAuditStatus, commodityDTO.getAudit_status())); + } + } + } + + @Override + public IPage commodityList(PageVO pageVO, String name, String auditStatus) { + return this.baseMapper.commodityVOList(PageUtil.initPage(pageVO), + new QueryWrapper().like(name != null, "c.name", name) + .eq(auditStatus != null, "c.audit_status", auditStatus) + .eq(UserContext.getCurrentUser().getRole().equals(UserEnums.STORE), "c.store_id", UserContext.getCurrentUser().getStoreId()) + .orderByDesc("create_time")); + } +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioCommodityServiceImpl.java b/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioCommodityServiceImpl.java new file mode 100644 index 00000000..a87c619a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioCommodityServiceImpl.java @@ -0,0 +1,17 @@ +package cn.lili.modules.broadcast.serviceimpl; + +import cn.lili.modules.broadcast.entity.dos.StudioCommodity; +import cn.lili.modules.broadcast.mapper.StudioCommodityMapper; +import cn.lili.modules.broadcast.service.StudioCommodityService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 直播间-商品关联业务层实现 + * + * @author Bulbasaur + * @date: 2021/5/17 3:20 下午 + */ +@Service +public class StudioCommodityServiceImpl extends ServiceImpl implements StudioCommodityService { +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioServiceImpl.java b/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioServiceImpl.java new file mode 100644 index 00000000..0a20efbb --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioServiceImpl.java @@ -0,0 +1,212 @@ +package cn.lili.modules.broadcast.serviceimpl; + +import cn.hutool.json.JSONUtil; +import cn.lili.common.delayqueue.BroadcastMessage; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.trigger.enums.DelayTypeEnums; +import cn.lili.common.trigger.interfaces.TimeTrigger; +import cn.lili.common.trigger.model.TimeExecuteConstant; +import cn.lili.common.trigger.model.TimeTriggerMsg; +import cn.lili.common.trigger.util.DelayQueueTools; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.utils.DateUtil; +import cn.lili.common.utils.PageUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.config.rocketmq.RocketmqCustomProperties; +import cn.lili.modules.broadcast.entity.dos.Studio; +import cn.lili.modules.broadcast.entity.dos.StudioCommodity; +import cn.lili.modules.broadcast.entity.enums.StudioStatusEnum; +import cn.lili.modules.broadcast.entity.vos.StudioVO; +import cn.lili.modules.broadcast.mapper.CommodityMapper; +import cn.lili.modules.broadcast.mapper.StudioMapper; +import cn.lili.modules.broadcast.service.StudioCommodityService; +import cn.lili.modules.broadcast.service.StudioService; +import cn.lili.modules.broadcast.util.WechatLivePlayerUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 小程序直播间业务层实现 + * + * @author Bulbasaur + * @date: 2021/5/17 10:04 上午 + */ +@Service +public class StudioServiceImpl extends ServiceImpl implements StudioService { + + @Autowired + private WechatLivePlayerUtil wechatLivePlayerUtil; + @Autowired + private StudioCommodityService studioCommodityService; + @Resource + private CommodityMapper commodityMapper; + //延时任务 + @Autowired + private TimeTrigger timeTrigger; + //Rocketmq + @Autowired + private RocketmqCustomProperties rocketmqCustomProperties; + + @Override + public Boolean create(Studio studio) { + try { + //创建小程序直播 + Map roomMap = wechatLivePlayerUtil.create(studio); + studio.setRoomId(Integer.parseInt(roomMap.get("roomId"))); + studio.setQrCodeUrl(roomMap.get("qrcodeUrl")); + studio.setStoreId(UserContext.getCurrentUser().getStoreId()); + studio.setStatus(StudioStatusEnum.NEW.name()); + //直播间添加成功发送直播间开启、关闭延时任务 + if (this.save(studio)) { + //直播开启延时任务 + BroadcastMessage broadcastMessage = new BroadcastMessage(studio.getId(), StudioStatusEnum.START.name()); + TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.BROADCAST_EXECUTOR, + Long.parseLong(studio.getStartTime()) * 1000L, broadcastMessage, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.BROADCAST, studio.getId()), + rocketmqCustomProperties.getPromotionTopic()); + + // 发送促销活动开始的延时任务 + this.timeTrigger.addDelay(timeTriggerMsg); + + //直播结束延时任务 + broadcastMessage = new BroadcastMessage(studio.getId(), StudioStatusEnum.END.name()); + timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.BROADCAST_EXECUTOR, + Long.parseLong(studio.getEndTime()) * 1000L, broadcastMessage, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.BROADCAST, studio.getId()), + rocketmqCustomProperties.getPromotionTopic()); + // 发送促销活动开始的延时任务 + this.timeTrigger.addDelay(timeTriggerMsg); + } + return true; + + } catch (Exception e) { + throw new ServiceException(ResultCode.ERROR); + } + + } + + @Override + public Boolean edit(Studio studio) { + Studio oldStudio = this.getById(studio.getId()); + wechatLivePlayerUtil.editRoom(studio); + if (this.updateById(studio)) { + // 发送更新延时任务 + //直播间开始 + BroadcastMessage broadcastMessage = new BroadcastMessage(studio.getId(), StudioStatusEnum.START.name()); + this.timeTrigger.edit( + TimeExecuteConstant.BROADCAST_EXECUTOR, + broadcastMessage, + Long.parseLong(oldStudio.getStartTime()), + Long.parseLong(studio.getStartTime()), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.BROADCAST, studio.getId()), + DateUtil.getDelayTime(Long.parseLong(studio.getStartTime())), + rocketmqCustomProperties.getPromotionTopic()); + + //直播间结束 + broadcastMessage = new BroadcastMessage(studio.getId(), StudioStatusEnum.START.name()); + this.timeTrigger.edit( + TimeExecuteConstant.BROADCAST_EXECUTOR, + broadcastMessage, + Long.parseLong(oldStudio.getEndTime()), + Long.parseLong(studio.getEndTime()), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.BROADCAST, studio.getId()), + DateUtil.getDelayTime(Long.parseLong(studio.getEndTime())), + rocketmqCustomProperties.getPromotionTopic()); + } + return true; + } + + @Override + public StudioVO getStudioVO(String id) { + StudioVO studioVO = new StudioVO(); + //获取直播间信息 + BeanUtil.copyProperties(this.getById(id), studioVO); + //获取直播间商品信息 + studioVO.setCommodityList(commodityMapper.getCommodityByRoomId(studioVO.getRoomId())); + return studioVO; + } + + @Override + public String getLiveInfo(Integer roomId) { + Studio studio = this.getByRoomId(roomId); + //获取直播间并判断回放内容是否为空,如果为空则获取直播间回放并保存 + if (studio.getMediaUrl() != null) { + return studio.getMediaUrl(); + } else { + String mediaUrl = wechatLivePlayerUtil.getLiveInfo(roomId); + studio.setMediaUrl(mediaUrl); + this.save(studio); + return mediaUrl; + } + } + + @Override + public Boolean push(Integer roomId, Integer goodsId) { + //调用微信接口添加直播间商品并进行记录 + if (wechatLivePlayerUtil.pushGoods(roomId, goodsId)) { + studioCommodityService.save(new StudioCommodity(roomId, goodsId)); + //添加直播间商品数量 + Studio studio = this.getByRoomId(roomId); + studio.setRoomGoodsNum(studio.getRoomGoodsNum() != null ? studio.getRoomGoodsNum() + 1 : 1); + //设置直播间默认的商品(前台展示)只展示两个 + if (studio.getRoomGoodsNum() < 3) { + studio.setRoomGoodsList(JSONUtil.toJsonStr(commodityMapper.getSimpleCommodityByRoomId(roomId))); + } + return this.updateById(studio); + } + return false; + } + + @Override + public Boolean goodsDeleteInRoom(Integer roomId, Integer goodsId) { + //调用微信接口删除直播间商品并进行记录 + if (wechatLivePlayerUtil.goodsDeleteInRoom(roomId, goodsId)) { + studioCommodityService.remove(new QueryWrapper().eq("room_id", roomId).eq("goods_id", goodsId)); + //减少直播间商品数量 + Studio studio = this.getByRoomId(roomId); + studio.setRoomGoodsNum(studio.getRoomGoodsNum() - 1); + //设置直播间默认的商品(前台展示)只展示两个 + if (studio.getRoomGoodsNum() < 3) { + studio.setRoomGoodsList(JSONUtil.toJsonStr(commodityMapper.getSimpleCommodityByRoomId(roomId))); + } + return this.updateById(studio); + } + return false; + } + + @Override + public IPage studioList(PageVO pageVO, Integer recommend, String status) { + return this.page(PageUtil.initPage(pageVO), new QueryWrapper() + .eq(recommend != null, "recommend", true) + .eq(status != null, "status", status) + .orderByDesc("create_time")); + + } + + @Override + public void updateStudioStatus(BroadcastMessage broadcastMessage) { + this.update(new LambdaUpdateWrapper() + .eq(Studio::getId, broadcastMessage.getStudioId()) + .set(Studio::getStatus, broadcastMessage.getStatus())); + } + + /** + * 根据直播间ID获取直播间 + * + * @param roomId 直播间ID + * @return 直播间 + */ + private Studio getByRoomId(Integer roomId) { + return this.getOne(new LambdaQueryWrapper().eq(Studio::getRoomId, roomId)); + } +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/util/WechatLivePlayerUtil.java b/framework/src/main/java/cn/lili/modules/broadcast/util/WechatLivePlayerUtil.java new file mode 100644 index 00000000..702c284f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/util/WechatLivePlayerUtil.java @@ -0,0 +1,261 @@ +package cn.lili.modules.broadcast.util; + +import cn.hutool.json.JSONObject; +import cn.lili.common.exception.ServiceException; +import cn.lili.modules.base.entity.enums.ClientTypeEnum; +import cn.lili.modules.broadcast.entity.dos.Commodity; +import cn.lili.modules.broadcast.entity.dos.Studio; +import cn.lili.modules.broadcast.entity.dto.GoodsInfo; +import cn.lili.modules.message.util.WechatAccessTokenUtil; +import cn.lili.modules.system.utils.HttpUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 微信小程序直播工具类 + * + * @author Bulbasaur + * @date: 2021/5/17 10:16 上午 + */ +@Slf4j +@Component +public class WechatLivePlayerUtil { + + @Autowired + private WechatAccessTokenUtil wechatAccessTokenUtil; + @Autowired + private WechatMediaUtil wechatMediaUtil; + + /** + * 创建小程序直播间 + * + * @param studio 小程序直播 + * @return 房间ID + */ + public Map create(Studio studio) throws Exception { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/create?access_token=" + token; + //添加直播间 + Map map = this.mockRoom(token, studio); + String content = HttpUtils.doPostWithJson(url, map); + JSONObject json = new JSONObject(content); + log.info("微信小程序直播间创建结果:" + content); + if (!json.getStr("errcode").equals("0")) { + throw new ServiceException(json.getStr("errmsg")); + } + Map roomMap = new HashMap<>(); + roomMap.put("roomId", json.getStr("roomId")); + roomMap.put("qrcodeUrl", json.getStr("qrcode_url")); + return roomMap; + } + + /** + * 创建小程序直播间 + * + * @param studio 小程序直播 + * @return 房间ID + */ + public boolean editRoom(Studio studio) { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/editroom?access_token=" + token; + + //修改直播间 + Map map = this.mockRoom(token, studio); + map.put("id", studio.getRoomId().toString()); + String content = HttpUtils.doPostWithJson(url, map); + JSONObject json = new JSONObject(content); + log.info("微信小程序直播间修改结果:" + content); + if (!json.getStr("errcode").equals("0")) { + throw new ServiceException(json.getStr("errmsg")); + } + return true; + } + + + /** + * 获取直播间回放 + * + * @param roomId 房间ID + * @return 回放地址 + */ + public String getLiveInfo(Integer roomId) { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //发送url + String url = "https://api.weixin.qq.com/wxa/business/getliveinfo?access_token=" + token; + Map map = new HashMap<>(); + // 获取回放 + map.put("action", "get_replay"); + // 直播间ID + map.put("room_id", roomId); + // 起始拉取视频,0表示从第一个视频片段开始拉取 + map.put("start", "0"); + // 每次拉取的数量,建议100以内 + map.put("limit", "1"); + + String content = HttpUtils.doPostWithJson(url, map); + JSONObject json = new JSONObject(content); + log.info("微信小程序获取信息:" + content); + //TODO get media_url + return json.getStr("live_replay"); + } + + /** + * 推送直播间商品 + * + * @param roomId 房间ID + * @param goodsId 商品ID + * @return 操作结果 + */ + public Boolean pushGoods(Integer roomId, Integer goodsId) { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods?access_token=" + token; + Map map = new HashMap<>(); + // 直播间回放 + Integer[] ids = {goodsId}; + map.put("ids", ids); + // 商品ID + map.put("roomId", roomId); + String content = HttpUtils.doPostWithJson(url, map); + JSONObject json = new JSONObject(content); + log.info("直播间导入商品:" + content); + if (!json.getStr("errcode").equals("0")) { + throw new ServiceException(json.getStr("errmsg")); + } + return true; + } + + /** + * 删除直播间商品 + * + * @param roomId 房间ID + * @param goodsId 商品ID + * @return 操作结果 + */ + public Boolean goodsDeleteInRoom(Integer roomId, Integer goodsId) { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/deleteInRoom?access_token=" + token; + Map map = new HashMap<>(); + // 直播间回放 + map.put("goodsId", goodsId); + // 商品ID + map.put("roomId", roomId); + String content = HttpUtils.doPostWithJson(url, map); + JSONObject json = new JSONObject(content); + log.info("微信小程序直播间删除商品:" + content); + return json.getStr("errcode").equals("0"); + } + + /** + * 添加直播商品 + * + * @param commodity 直播商品 + * @return 添加结果 + */ + public JSONObject addGoods(Commodity commodity) { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=" + token; + + //商品名称,最长14个汉字 + if (commodity.getName().length() > 14) { + commodity.setName(commodity.getName().substring(0, 13)); + } + + //新建微信商品DTO + GoodsInfo goodsInfo = new GoodsInfo(commodity); + //上传微信临时图片 + goodsInfo.setCoverImgUrl(wechatMediaUtil.uploadMedia(token, "image", commodity.getGoodsImage())); + Map map = new HashMap<>(); + //调用新增直播商品接口 + map.put("goodsInfo", goodsInfo); + String content = HttpUtils.doPostWithJson(url, map); + JSONObject json = new JSONObject(content); + log.info("微信小程序添加直播商品结果:" + content); + return json; + } + + /** + * 删除直播商品 + * + * @param goodsId 商品ID + * @return 删除结果 + */ + public JSONObject deleteGoods(String goodsId) { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //发送url + String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=" + token; + Map map = new HashMap<>(); + map.put("goodsId", goodsId); + String content = HttpUtils.doPostWithJson(url, map); + JSONObject json = new JSONObject(content); + log.info("微信小程序删除直播商品结果:" + content); + return json; + } + + /** + * 查询直播商品状态 + * + * @param goodsIdList 商品ID列表 + * @return 删除结果 + */ + public JSONObject getGoodsWareHouse(List goodsIdList) { + //获取token + String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); + //发送url + String url = "https://api.weixin.qq.com/wxa/business/getgoodswarehouse?access_token=" + token; + Map map = new HashMap<>(); + map.put("goods_ids", goodsIdList); + String content = HttpUtils.doPostWithJson(url, map); + JSONObject json = new JSONObject(content); + log.info("微信小程序查询直播商品结果:" + content); + return json; + } + + private Map mockRoom(String token, Studio studio) { + Map map = new HashMap<>(); + // 背景图 + map.put("coverImg", wechatMediaUtil.uploadMedia(token, "image", studio.getCoverImg())); + // 分享图 + map.put("shareImg", wechatMediaUtil.uploadMedia(token, "image", studio.getShareImg())); + // 购物直播频道封面图 + map.put("feedsImg", wechatMediaUtil.uploadMedia(token, "image", studio.getFeedsImg())); + // 直播间名字 + map.put("name", studio.getName()); + // 直播计划开始时间 + map.put("startTime", studio.getStartTime()); + // 直播计划结束时间 + map.put("endTime", studio.getEndTime()); + // 主播昵称 + map.put("anchorName", studio.getAnchorName()); + // 主播微信号 + map.put("anchorWechat", studio.getAnchorWechat()); + // 直播间类型 + map.put("type", "0"); + // 是否关闭点赞 + map.put("closeLike", "0"); + // 是否关闭货架 + map.put("closeGoods", "0"); + // 是否关闭评论 + map.put("closeComment", "0"); + // 直播间名字 + map.put("closeReplay", "0"); + + return map; + } +} diff --git a/framework/src/main/java/cn/lili/modules/broadcast/util/WechatMediaUtil.java b/framework/src/main/java/cn/lili/modules/broadcast/util/WechatMediaUtil.java new file mode 100644 index 00000000..ad6cef2b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/broadcast/util/WechatMediaUtil.java @@ -0,0 +1,123 @@ +package cn.lili.modules.broadcast.util; + +import cn.hutool.json.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Date; + +/** + * 微信媒体工具 + * + * @author Bulbasaur + * @date: 2021/5/19 8:02 下午 + */ +@Slf4j +@Component +public class WechatMediaUtil { + + /** + * 上传多媒体数据到微信服务器 + * @param accessToken 从微信获取到的access_token + * @param mediaFileUrl 来自网络上面的媒体文件地址 + * @return + */ + public String uploadMedia(String accessToken, String type, String mediaFileUrl) { + /* + * 上传媒体文件到微信服务器需要请求的地址 + */ + String MEDIA_URL = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"; + + StringBuffer resultStr = null; + //拼装url地址 + String mediaStr = MEDIA_URL.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type); + URL mediaUrl; + try { + String boundary = "----WebKitFormBoundaryOYXo8heIv9pgpGjT"; + URL url = new URL(mediaStr); + HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); + //让输入输出流开启 + urlConn.setDoInput(true); + urlConn.setDoOutput(true); + //使用post方式请求的时候必须关闭缓存 + urlConn.setUseCaches(false); + //设置请求头的Content-Type属性 + urlConn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary); + urlConn.setRequestMethod("POST"); + //获取输出流,使用输出流拼接请求体 + OutputStream out = urlConn.getOutputStream(); + + //读取文件的数据,构建一个GET请求,然后读取指定地址中的数据 + mediaUrl = new URL(mediaFileUrl); + HttpURLConnection mediaConn = (HttpURLConnection)mediaUrl.openConnection(); + //设置请求方式 + mediaConn.setRequestMethod("GET"); + //设置可以打开输入流 + mediaConn.setDoInput(true); + //获取传输的数据类型 + String contentType = mediaConn.getHeaderField("Content-Type"); + //将获取大到的类型转换成扩展名 + String fileExt = judgeType(contentType); + //获取输入流,从mediaURL里面读取数据 + InputStream in = mediaConn.getInputStream(); + BufferedInputStream bufferedIn = new BufferedInputStream(in); + //数据读取到这个数组里面 + byte[] bytes = new byte[1024]; + int size = 0; + //使用outputStream流输出信息到请求体当中去 + out.write(("--"+boundary+"\r\n").getBytes()); + out.write(("Content-Disposition: form-data; name=\"media\";\r\n" + + "filename=\""+(new Date().getTime())+fileExt+"\"\r\n" + + "Content-Type: "+contentType+"\r\n\r\n").getBytes()); + while( (size = bufferedIn.read(bytes)) != -1) { + out.write(bytes, 0, size); + } + //切记,这里的换行符不能少,否则将会报41005错误 + out.write(("\r\n--"+boundary+"--\r\n").getBytes()); + + bufferedIn.close(); + in.close(); + mediaConn.disconnect(); + + InputStream resultIn = urlConn.getInputStream(); + InputStreamReader reader = new InputStreamReader(resultIn); + BufferedReader bufferedReader = new BufferedReader(reader); + String tempStr = null; + resultStr = new StringBuffer(); + while((tempStr = bufferedReader.readLine()) != null) { + resultStr.append(tempStr); + } + bufferedReader.close(); + reader.close(); + resultIn.close(); + urlConn.disconnect(); + } catch (Exception e) { + log.error("微信媒体上传失败",e); + } + JSONObject jsonObject=new JSONObject(resultStr.toString()); + return jsonObject.get("media_id").toString(); + } + /** + * 通过传过来的contentType判断是哪一种类型 + * @param contentType 获取来自连接的contentType + * @return + */ + public String judgeType(String contentType) { + String fileExt = ""; + switch (contentType){ + case "image/png": + fileExt = ".png"; + break; + case "image/jpeg": + fileExt = ".jpeg"; + break; + case "image/jpg": + fileExt = ".jpg"; + break; + } + return fileExt; + } +} diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectConfigServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectConfigServiceImpl.java index 15a4e232..8fbd22d3 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectConfigServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectConfigServiceImpl.java @@ -7,8 +7,6 @@ import cn.lili.modules.connect.mapper.ConnectConfigMapper; import cn.lili.modules.connect.service.ConnectConfigService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,8 +21,6 @@ import java.util.List; @Service @Transactional(rollbackFor = Exception.class) public class ConnectConfigServiceImpl extends ServiceImpl implements ConnectConfigService { - @Autowired - private ConnectConfigMapper connectConfigMapper; @Override public List listForms() { diff --git a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java index 200374ec..f9168a55 100644 --- a/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/connect/serviceimpl/ConnectServiceImpl.java @@ -339,7 +339,7 @@ public class ConnectServiceImpl extends ServiceImpl impl return JSONUtil.parseObj(result); } } catch (Exception e) { - e.printStackTrace(); + log.error("解密,获取微信信息错误",e); } throw new ServiceException(ResultCode.USER_CONNECT_ERROR); } diff --git a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java index a2f25f5c..30854584 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java @@ -29,6 +29,7 @@ import cn.lili.modules.system.entity.dto.connect.dto.QQConnectSettingItem; import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -45,6 +46,7 @@ import java.util.regex.Pattern; * @version v1.0 * 2020-11-25 21:16 */ +@Slf4j @Component public class ConnectUtil { @@ -106,7 +108,7 @@ public class ConnectUtil { try { httpServletResponse.sendRedirect(url); } catch (Exception e) { - e.printStackTrace(); + log.error("登录回调错误",e); } } diff --git a/framework/src/main/java/cn/lili/modules/connect/util/IpUtils.java b/framework/src/main/java/cn/lili/modules/connect/util/IpUtils.java index 35a9e3b6..00fc0c92 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/IpUtils.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/IpUtils.java @@ -1,5 +1,7 @@ package cn.lili.modules.connect.util; +import lombok.extern.slf4j.Slf4j; + import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; @@ -11,6 +13,7 @@ import java.net.UnknownHostException; * @version v1.0 * 2020-12-08 15:32 */ +@Slf4j public class IpUtils { /** @@ -22,7 +25,7 @@ public class IpUtils { try { return InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { - e.printStackTrace(); + log.error("获取本机IP错误",e); return null; } } diff --git a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionOrderMapper.java b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionOrderMapper.java index 7c415c0c..b5997871 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionOrderMapper.java +++ b/framework/src/main/java/cn/lili/modules/distribution/mapper/DistributionOrderMapper.java @@ -3,7 +3,7 @@ package cn.lili.modules.distribution.mapper; import cn.hutool.core.date.DateTime; import cn.lili.modules.distribution.entity.dos.DistributionOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; /** * 分销订单数据处理层 @@ -16,9 +16,8 @@ public interface DistributionOrderMapper extends BaseMapper { /** * 分销提佣 */ - @Select("UPDATE li_distribution AS d " + - "SET d.can_rebate =(d.can_rebate +(SELECT SUM( dorder.rebate ) FROM li_distribution_order AS dorder WHERE dorder.distribution_id = d.id AND " + - "dorder.distribution_order_status=#{distributionOrderStatus} AND dorder.settle_cycle< #{settleCycle} ))") + @Update("UPDATE li_distribution AS d " + + "SET d.can_rebate =(d.can_rebate +(SELECT SUM( dorder.rebate ) FROM li_distribution_order AS dorder WHERE dorder.distribution_id = d.id AND dorder.distribution_order_status=#{distributionOrderStatus} AND dorder.settle_cycle< #{settleCycle} ))") void rebate(String distributionOrderStatus, DateTime settleCycle); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionGoodsServiceImpl.java index b3cacfc7..8ca801d8 100644 --- a/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/distribution/serviceimpl/DistributionGoodsServiceImpl.java @@ -34,9 +34,6 @@ import org.springframework.transaction.annotation.Transactional; @Transactional public class DistributionGoodsServiceImpl extends ServiceImpl implements DistributionGoodsService { - //分销商品 - @Autowired - private DistributionGoodsMapper distributionGoodsMapper; //分销员 @Autowired private DistributionService distributionService; @@ -48,22 +45,22 @@ public class DistributionGoodsServiceImpl extends ServiceImpl goodsPage(DistributionGoodsSearchParams searchParams) { //获取商家的分销商品列表 if (UserContext.getCurrentUser().getRole().equals(UserEnums.STORE)) { - return distributionGoodsMapper.getDistributionGoodsVO(PageUtil.initPage(searchParams), searchParams.storeQueryWrapper()); + return this.baseMapper.getDistributionGoodsVO(PageUtil.initPage(searchParams), searchParams.storeQueryWrapper()); } else if (UserContext.getCurrentUser().getRole().equals(UserEnums.MEMBER)) { //判断当前登录用户是否为分销员 Distribution distribution = distributionService.getDistribution(); if (distribution != null) { //判断查看已选择的分销商品列表 if (searchParams.isChecked()) { - return distributionGoodsMapper.selectGoods(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper(), distribution.getId()); + return this.baseMapper.selectGoods(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper(), distribution.getId()); } else { - return distributionGoodsMapper.notSelectGoods(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper(), distribution.getId()); + return this.baseMapper.notSelectGoods(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper(), distribution.getId()); } } throw new ServiceException(ResultCode.DISTRIBUTION_NOT_EXIST); } //如果是平台则直接进行查询 - return distributionGoodsMapper.getDistributionGoodsVO(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper()); + return this.baseMapper.getDistributionGoodsVO(PageUtil.initPage(searchParams), searchParams.distributionQueryWrapper()); } @Override diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Category.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Category.java index b4f4d4f1..d7653ea7 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/Category.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/Category.java @@ -11,6 +11,7 @@ import lombok.NoArgsConstructor; import javax.persistence.Entity; import javax.persistence.Table; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.Date; @@ -35,18 +36,23 @@ public class Category extends BaseEntity { @ApiModelProperty(value = "分类名称") private String name; + @NotEmpty(message = "请选择父分类") @ApiModelProperty(value = "父id, 根节点为0") private String parentId; + @NotNull(message = "层级不能为空") @ApiModelProperty(value = "层级, 从0开始") private Integer level; + @NotNull(message = "排序值不能为空") @ApiModelProperty(value = "排序值") private BigDecimal sortOrder; + @NotNull(message = "请填写佣金比例") @ApiModelProperty(value = "佣金比例") private Double commissionRate; + @NotEmpty(message = "分类图标不能为空") @ApiModelProperty(value = "分类图标") private String image; 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 6281e45f..23e0a4a3 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 @@ -112,9 +112,6 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "运费模板id") private String templateId; - @ApiModelProperty(value = "运费承担者") - private String freightPayer; - @ApiModelProperty(value = "是否自营") private Boolean selfOperated; /** @@ -154,4 +151,10 @@ public class DraftGoods extends BaseEntity { @ApiModelProperty(value = "sku列表JSON") private String skuListJson; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型", required = true) + private String goodsType; + } \ No newline at end of file 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 253f36ab..512d4498 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 @@ -145,11 +145,6 @@ public class Goods extends BaseEntity { */ @ApiModelProperty(value = "运费模板id") private String templateId; - /** - * 谁承担运费 BUYER:买家承担,STORE:卖家承担 - */ - @ApiModelProperty(value = " 谁承担运费 BUYER:买家承担,STORE:卖家承担") - private String freightPayer; /** * 审核状态 * @@ -190,11 +185,19 @@ public class Goods extends BaseEntity { @ApiModelProperty(value = "销售模式", required = true) private String salesModel; + + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型", required = true) + private String goodsType; + @ApiModelProperty(value = "商品参数json", hidden = true) @Column(columnDefinition = "TEXT") @JsonIgnore private String params; + public Goods() { } @@ -206,7 +209,6 @@ public class Goods extends BaseEntity { this.sn = goodsOperationDTO.getSn(); this.price = goodsOperationDTO.getPrice(); this.weight = goodsOperationDTO.getWeight(); - this.freightPayer = goodsOperationDTO.getFreightPayer(); this.templateId = goodsOperationDTO.getTemplateId(); this.recommend = goodsOperationDTO.isRecommend(); this.sellingPoint = goodsOperationDTO.getSellingPoint(); @@ -220,6 +222,6 @@ public class Goods extends BaseEntity { } //如果立即上架则 this.marketEnable = goodsOperationDTO.isRelease() ? GoodsStatusEnum.UPPER.name() : GoodsStatusEnum.DOWN.name(); - + this.goodsType=goodsOperationDTO.getGoodsType(); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsSku.java b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsSku.java index 96b6ead7..7b9231f4 100644 --- a/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsSku.java +++ b/framework/src/main/java/cn/lili/modules/goods/entity/dos/GoodsSku.java @@ -131,8 +131,6 @@ public class GoodsSku extends BaseEntity { @ApiModelProperty(value = "运费模板id") private String templateId; - @ApiModelProperty(value = " 谁承担运费 BUYER:买家承担,STORE:卖家承担") - private String freightPayer; /** * @see GoodsAuthEnum */ @@ -160,6 +158,11 @@ public class GoodsSku extends BaseEntity { @ApiModelProperty(value = "销售模式", required = true) private String salesModel; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型", required = true) + private String goodsType; @Override public Date getUpdateTime() { 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 9e518082..20cf8120 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 @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; /** - * 商品查询条件 + * 商品编辑DTO * * @author pikachu * @date 2020-02-24 19:27:20 @@ -66,9 +66,6 @@ public class GoodsOperationDTO implements Serializable { @Max(value = 99999999, message = "重量不能超过99999999") private Double weight; - @ApiModelProperty(value = "谁承担运费 BUYER:买家承担,STORE:卖家承担", required = true) - private String freightPayer; - @ApiModelProperty(value = "详情") private String intro; @@ -118,4 +115,10 @@ public class GoodsOperationDTO implements Serializable { @ApiModelProperty(value = "是否重新生成sku数据") private Boolean regeneratorSkuFlag = true; + + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型") + private String goodsType; } 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 6edfcb6b..346a913e 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 @@ -67,6 +67,12 @@ public class GoodsSearchParams extends PageVO { @ApiModelProperty(value = "是否为推荐商品") private Boolean recommend; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型") + private String goodsType; + public QueryWrapper queryWrapper() { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotEmpty(goodsId)) { @@ -108,6 +114,10 @@ public class GoodsSearchParams extends PageVO { if (recommend != null) { queryWrapper.le("recommend", recommend); } + if (goodsType != null) { + queryWrapper.eq("goods_type", goodsType); + } + queryWrapper.eq("delete_flag", false); this.betweenWrapper(queryWrapper); return queryWrapper; diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsFreightEnum.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsFreightEnum.java deleted file mode 100644 index c89a56c2..00000000 --- a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsFreightEnum.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.lili.modules.goods.entity.enums; - -/** - * 商品运费承担者 - * - * @author pikachu - * @date 2020-02-26 23:24:13 - */ -public enum GoodsFreightEnum { - /** - * 买家承担运费 - */ - BUYER("买家承担运费"), - /** - * 卖家承担运费 - */ - STORE("卖家承担运费"); - - private final String description; - - GoodsFreightEnum(String description) { - this.description = description; - } - - public String description() { - return description; - } -} diff --git a/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsTypeEnum.java b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsTypeEnum.java new file mode 100644 index 00000000..db55d23e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/goods/entity/enums/GoodsTypeEnum.java @@ -0,0 +1,29 @@ +package cn.lili.modules.goods.entity.enums; + +/** + * 商品类型 + * + * @author Bulbasaur + * @date: 2021/5/28 4:23 下午 + */ +public enum GoodsTypeEnum { + + + PHYSICAL_GOODS("实物商品"), + + VIRTUAL_GOODS("虚拟商品"), + + E_COUPON("电子卡券"); + + + private final String description; + + GoodsTypeEnum(String description) { + this.description = description; + } + + public String description() { + return description; + } + +} diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java index 253ebb87..d95ca80a 100644 --- a/framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java +++ b/framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java @@ -109,11 +109,10 @@ public interface GoodsService extends IService { * 设置商品运费模板 * * @param goodsIds 商品列表 - * @param freightPayer 承担运费者 * @param templateId 运费模板ID * @return 操作结果 */ - Boolean freight(List goodsIds, String freightPayer, String templateId); + Boolean freight(List goodsIds, String templateId); /** * 修改商品库存数量 diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryBrandServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryBrandServiceImpl.java index 0f5e0199..e3e897e6 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryBrandServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryBrandServiceImpl.java @@ -24,18 +24,14 @@ import java.util.List; @Transactional public class CategoryBrandServiceImpl extends ServiceImpl implements CategoryBrandService { - //分类品牌绑定 - @Autowired - private CategoryBrandMapper categoryBrandMapper; - @Override public List getCategoryBrandList(String categoryId) { - return categoryBrandMapper.getCategoryBrandList(categoryId); + return this.baseMapper.getCategoryBrandList(categoryId); } @Override public void deleteByCategoryId(String categoryId) { - categoryBrandMapper.delete(new LambdaUpdateWrapper().eq(CategoryBrand::getCategoryId, categoryId)); + this.baseMapper.delete(new LambdaUpdateWrapper().eq(CategoryBrand::getCategoryId, categoryId)); } @Override diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryServiceImpl.java index 0e617814..957ac37f 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategoryServiceImpl.java @@ -17,7 +17,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -40,9 +39,6 @@ public class CategoryServiceImpl extends ServiceImpl i //缓存 @Autowired private Cache cache; - //分类 - @Autowired - private CategoryMapper categoryMapper; @Override public List dbList(String parentId) { @@ -159,7 +155,7 @@ public class CategoryServiceImpl extends ServiceImpl i .ne(category.getId() != null, "id", category.getId()) .eq(DELETE_FLAG_COLUMN, false) .orderByAsc("sort_order"); - return this.categoryMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @Override @@ -188,7 +184,7 @@ public class CategoryServiceImpl extends ServiceImpl i .set("sort_order", category.getSortOrder()) .set(DELETE_FLAG_COLUMN, category.getDeleteFlag()) .set("commission_rate", category.getCommissionRate()); - categoryMapper.update(category, updateWrapper); + this.baseMapper.update(category, updateWrapper); removeCache(); } diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategorySpecificationServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategorySpecificationServiceImpl.java index 9b308210..60405e67 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategorySpecificationServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/CategorySpecificationServiceImpl.java @@ -23,12 +23,10 @@ import java.util.List; @Service @Transactional public class CategorySpecificationServiceImpl extends ServiceImpl implements CategorySpecificationService { - @Autowired - private CategorySpecificationMapper categorySpecificationMapper; @Override public List getCategorySpecList(String categoryId) { - return categorySpecificationMapper.getCategorySpecList(categoryId); + return this.baseMapper.getCategorySpecList(categoryId); } @Override @@ -38,6 +36,6 @@ public class CategorySpecificationServiceImpl extends ServiceImpl().eq(CategorySpecification::getCategoryId,categoryId)); + this.baseMapper.delete(new LambdaQueryWrapper().eq(CategorySpecification::getCategoryId,categoryId)); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/DraftGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/DraftGoodsServiceImpl.java index 3566b0e7..3ff33cd8 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/DraftGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/DraftGoodsServiceImpl.java @@ -16,7 +16,6 @@ import cn.lili.modules.goods.service.GoodsGalleryService; import cn.lili.modules.goods.service.GoodsSkuService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -70,7 +69,7 @@ public class DraftGoodsServiceImpl extends ServiceImpl goodsGalleryList, String goodsId) { //删除原来商品相册信息 - this.goodsGalleryMapper.delete(new UpdateWrapper().eq("goods_id", goodsId)); + this.baseMapper.delete(new UpdateWrapper().eq("goods_id", goodsId)); //确定好图片选择器后进行处理 int i = 0; for (String origin : goodsGalleryList) { @@ -53,7 +51,7 @@ public class GoodsGalleryServiceImpl extends ServiceImpl goodsGalleryList(String goodsId) { //根据商品id查询商品相册 - return goodsGalleryMapper.selectList(new QueryWrapper().eq("goods_id", goodsId)); + return this.baseMapper.selectList(new QueryWrapper().eq("goods_id", goodsId)); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java index 9a50861a..25111bec 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java @@ -102,41 +102,19 @@ public class GoodsServiceImpl extends ServiceImpl implements @Override public void addGoods(GoodsOperationDTO goodsOperationDTO) { - Goods goods = new Goods(goodsOperationDTO); - - //判定商品是否需要审核 - this.checkNeedAuth(goods); - + //检查商品 + this.checkGoods(goods); // 向goods加入图片 this.setGoodsGalleryParam(goodsOperationDTO.getGoodsGalleryList().get(0), goods); - - //商品添加卖家信息 - StoreVO storeDetail = this.storeService.getStoreDetail(); - goods.setStoreId(storeDetail.getId()); - goods.setStoreName(storeDetail.getStoreName()); - if (storeDetail.getSelfOperated() != null) { - goods.setSelfOperated(storeDetail.getSelfOperated()); - } - // 评论次数 - goods.setCommentNum(0); - // 购买次数 - goods.setBuyCount(0); - // 购买次数 - goods.setQuantity(0); - // 商品评分 - goods.setGrade(100.0); - + //添加商品 this.save(goods); - // 添加商品参数 if (goodsOperationDTO.getGoodsParamsList() != null && !goodsOperationDTO.getGoodsParamsList().isEmpty()) { this.goodsParamsService.addParams(goodsOperationDTO.getGoodsParamsList(), goods.getId()); } - // 添加商品sku信息 this.goodsSkuService.add(goodsOperationDTO.getSkuList(), goods); - // 添加相册 if (goodsOperationDTO.getGoodsGalleryList() != null && !goodsOperationDTO.getGoodsGalleryList().isEmpty()) { this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId()); @@ -146,35 +124,25 @@ public class GoodsServiceImpl extends ServiceImpl implements @Override public void editGoods(GoodsOperationDTO goodsOperationDTO, String goodsId) { - this.checkExist(goodsId); Goods goods = new Goods(goodsOperationDTO); goods.setId(goodsId); - - //是否需要审核 - this.checkNeedAuth(goods); - + //检查商品信息 + this.checkGoods(goods); // 向goods加入图片 this.setGoodsGalleryParam(goodsOperationDTO.getGoodsGalleryList().get(0), goods); - - //商品添加卖家信息 - StoreVO storeDetail = this.storeService.getStoreDetail(); - if (storeDetail.getSelfOperated() != null) { - goods.setSelfOperated(storeDetail.getSelfOperated()); - } - goods.setStoreId(storeDetail.getId()); - goods.setStoreName(storeDetail.getStoreName()); - //修改商品 this.updateById(goods); - // 添加商品参数 - this.goodsParamsService.addParams(goodsOperationDTO.getGoodsParamsList(), goods.getId()); - - //修改商品规格 + if (goodsOperationDTO.getGoodsParamsList() != null && !goodsOperationDTO.getGoodsParamsList().isEmpty()) { + this.goodsParamsService.addParams(goodsOperationDTO.getGoodsParamsList(), goods.getId()); + } + //修改商品sku信息 this.goodsSkuService.update(goodsOperationDTO.getSkuList(), goods, goodsOperationDTO.getRegeneratorSkuFlag()); - // 添加相册 - this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId()); + if (goodsOperationDTO.getGoodsGalleryList() != null && !goodsOperationDTO.getGoodsGalleryList().isEmpty()) { + this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId()); + } + } @Override @@ -305,9 +273,8 @@ public class GoodsServiceImpl extends ServiceImpl implements } @Override - public Boolean freight(List goodsIds, String freightPayer, String templateId) { + public Boolean freight(List goodsIds, String templateId) { LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); - lambdaUpdateWrapper.set(Goods::getFreightPayer, freightPayer); lambdaUpdateWrapper.set(Goods::getTemplateId, templateId); lambdaUpdateWrapper.in(Goods::getId, goodsIds); return this.update(lambdaUpdateWrapper); @@ -355,16 +322,62 @@ public class GoodsServiceImpl extends ServiceImpl implements } /** - * 商品是否需要审核 + * 检查商品信息 + * 如果商品是虚拟商品则无需配置配送模板 + * 如果商品是实物商品需要配置配送模板 + * 判断商品是否存在 + * 判断商品是否需要审核 + * 判断当前用户是否为店铺 * * @param goods 商品 */ - private void checkNeedAuth(Goods goods) { + private void checkGoods(Goods goods) { + //判断商品类型 + switch (goods.getGoodsType()) { + case "PHYSICAL_GOODS": + if (goods.getTemplateId().equals("0")) { + throw new ServiceException("实物商品需选择配送模板"); + } + break; + case "VIRTUAL_GOODS": + if (!goods.getTemplateId().equals("0")) { + throw new ServiceException("虚拟商品不需要选择配送模板"); + } + break; + default: + throw new ServiceException("需选择商品类型"); + } + //检查商品是否存在--修改商品时使用 + if (goods.getId() != null) { + this.checkExist(goods.getId()); + } else { + // 评论次数 + goods.setCommentNum(0); + // 购买次数 + goods.setBuyCount(0); + // 购买次数 + goods.setQuantity(0); + // 商品评分 + goods.setGrade(100.0); + } + //获取商品系统配置决定是否审核 Setting setting = settingService.get(SettingEnum.GOODS_SETTING.name()); GoodsSetting goodsSetting = JSONUtil.toBean(setting.getSettingValue(), GoodsSetting.class); //是否需要审核 goods.setIsAuth(Boolean.TRUE.equals(goodsSetting.getGoodsCheck()) ? GoodsAuthEnum.TOBEAUDITED.name() : GoodsAuthEnum.PASS.name()); + //判断当前用户是否为店铺 + if (UserContext.getCurrentUser().getRole().equals(UserEnums.STORE)) { + StoreVO storeDetail = this.storeService.getStoreDetail(); + if (storeDetail.getSelfOperated() != null) { + goods.setSelfOperated(storeDetail.getSelfOperated()); + } + goods.setStoreId(storeDetail.getId()); + goods.setStoreName(storeDetail.getStoreName()); + goods.setSelfOperated(storeDetail.getSelfOperated()); + } else { + throw new ServiceException("当前未登录店铺"); + } } /** diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java index d2c8def3..47b3cb02 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java @@ -510,6 +510,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i if (goods.getSelfOperated() != null) { goodsSku.setSelfOperated(goods.getSelfOperated()); } + goodsSku.setGoodsType(goods.getGoodsType()); EsGoodsIndex goodsIndex = (EsGoodsIndex) resultMap.get("goodsIndex"); skus.add(goodsSku); goodsIndices.add(goodsIndex); @@ -566,8 +567,6 @@ public class GoodsSkuServiceImpl extends ServiceImpl i sku.setIntro(goods.getIntro()); sku.setMobileIntro(goods.getMobileIntro()); sku.setGoodsUnit(goods.getGoodsUnit()); - //运费 - sku.setFreightPayer(goods.getFreightPayer()); //商品状态 sku.setIsAuth(goods.getIsAuth()); sku.setSalesModel(goods.getSalesModel()); @@ -594,6 +593,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i StringBuilder goodsName = new StringBuilder(goods.getGoodsName()); //规格商品缩略图 String thumbnail = ""; + String small = ""; //规格值 Map specMap = new HashMap<>(); //商品属性 @@ -613,6 +613,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i throw new ServiceException("sku图片至少为一个"); } thumbnail = goodsGalleryService.getGoodsGallery(images.get(0).get("url")).getThumbnail(); + small = goodsGalleryService.getGoodsGallery(images.get(0).get("url")).getSmall(); } else { //设置商品名称 goodsName.append(" ").append(m.getValue()); @@ -637,6 +638,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i //设置规格信息 sku.setGoodsName(goodsName.toString()); sku.setThumbnail(thumbnail); + sku.setSmall(small); //规格信息 sku.setId(Convert.toStr(map.get("id"), "")); diff --git a/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java b/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java index 8e16afd5..7d6708ab 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/aop/interceptor/PointLogInterceptor.java @@ -5,6 +5,7 @@ import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberPointsHistory; import cn.lili.modules.member.service.MemberPointsHistoryService; import cn.lili.modules.member.service.MemberService; +import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; @@ -17,6 +18,7 @@ import org.springframework.stereotype.Component; * @author Chopper * @date 2020/11/17 7:22 下午 */ +@Slf4j @Aspect @Component public class PointLogInterceptor { @@ -62,7 +64,7 @@ public class PointLogInterceptor { memberPointsHistoryService.save(memberPointsHistory); } } catch (Exception e) { - e.printStackTrace(); + log.error("积分操作错误",e); } diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java index ea2aaa44..dab8b591 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java @@ -85,6 +85,14 @@ public class Member extends BaseEntity { @ApiModelProperty(value = "最后一次登录时间") private Date lastLoginDate; + @ApiModelProperty(value = "会员等级ID") + private String gradeId; + + @Min(message = "必须为数字", value = 0) + @ApiModelProperty(value = "经验值数量") + private Long experience; + + public Member(String username, String password, String mobile) { this.username = username; this.password = password; diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberGrade.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberGrade.java new file mode 100644 index 00000000..e65abef7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/MemberGrade.java @@ -0,0 +1,40 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +/** + * 会员等级 + * + * @author Bulbasaur + * @date 2021/5/14 5:43 下午 + */ +@Data +@Entity +@Table(name = "li_member_grade") +@TableName("li_member_grade") +@ApiModel(value = "会员等级") +public class MemberGrade extends BaseEntity { + + @NotNull + @ApiModelProperty(value = "等级名称") + private String gradeName; + + @NotNull + @ApiModelProperty(value = "等级图片") + private String gradeImage; + + @NotNull + @ApiModelProperty(value = "所需经验值") + private Integer experienceValue; + + @ApiModelProperty(value = "是否为默认等级") + private Boolean isDefault; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java index a1eddc2a..439bff9f 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/MemberPointMessage.java @@ -15,8 +15,8 @@ public class MemberPointMessage { @ApiModelProperty(value = "积分") private Long point; - @ApiModelProperty(value = "类型 1为增加") - private Integer type; + @ApiModelProperty(value = "是否增加积分") + private Boolean type; @ApiModelProperty(value = "会员id") private String memberId; diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberGradeMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberGradeMapper.java new file mode 100644 index 00000000..64073199 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberGradeMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.MemberGrade; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 会员等级数据层 + * + * @author Bulbasaur + * @date: 2021/5/14 5:57 下午 + */ +public interface MemberGradeMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberGradeService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberGradeService.java new file mode 100644 index 00000000..44002848 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberGradeService.java @@ -0,0 +1,15 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.MemberGrade; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 会员等级业务层 + * @author Bulbasaur + * @date: 2021/5/14 5:57 下午 + * + */ +public interface MemberGradeService extends IService { + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberPointsHistoryService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberPointsHistoryService.java index 6111f157..0597d871 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberPointsHistoryService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberPointsHistoryService.java @@ -29,7 +29,6 @@ public interface MemberPointsHistoryService extends IService MemberPointsHistoryList(PageVO page, String memberId, String memberName); - + IPage MemberPointsHistoryList(PageVO page, String memberId, String memberName); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java index 7395dc04..f7fb42bc 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java @@ -176,12 +176,23 @@ public interface MemberService extends IService { * 会员积分变动 * * @param point 变动积分 - * @param type 变动类型 1为增加 0为消费 + * @param type 是否增加积分 * @param memberId 会员id * @param content 变动详细 * @return 操作结果 */ - Boolean updateMemberPoint(Long point, Integer type, String memberId, String content); + Boolean updateMemberPoint(Long point, Boolean type, String memberId, String content); + + /** + * 会员积分变动 + * + * @param experience 变动经验值 + * @param type 是否增加经验值 + * @param memberId 会员id + * @param content 变动详细 + * @return 操作结果 + */ + Boolean updateMemberExperience(Long experience, Boolean type, String memberId, String content); /** * 修改会员状态 diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java index 89d28398..c66cf5ab 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java @@ -11,7 +11,6 @@ import cn.lili.modules.search.service.EsGoodsSearchService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,9 +29,6 @@ import java.util.Objects; @Transactional public class FootprintServiceImpl extends ServiceImpl implements FootprintService { - //足迹数据层 - @Autowired - private FootprintMapper footprintMapper; //es商品业务层 @Autowired private EsGoodsSearchService esGoodsSearchService; @@ -54,7 +50,7 @@ public class FootprintServiceImpl extends ServiceImpl skuIdList = footprintMapper.footprintSkuIdList(PageUtil.initPage(pageVO), lambdaQueryWrapper); + List skuIdList = this.baseMapper.footprintSkuIdList(PageUtil.initPage(pageVO), lambdaQueryWrapper); if (skuIdList.size() > 0) { List list = esGoodsSearchService.getEsGoodsBySkuIds(skuIdList); //去除为空的商品数据 diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/GoodsCollectionServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/GoodsCollectionServiceImpl.java index 11d26725..b4bd13d0 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/GoodsCollectionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/GoodsCollectionServiceImpl.java @@ -17,7 +17,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -37,9 +36,6 @@ import java.util.Optional; public class GoodsCollectionServiceImpl extends ServiceImpl implements GoodsCollectionService { - //商品收藏 - @Autowired - private GoodsCollectionMapper goodsCollectionMapper; //rocketMq @Autowired private RocketMQTemplate rocketMQTemplate; @@ -53,7 +49,7 @@ public class GoodsCollectionServiceImpl extends ServiceImpl implements MemberEvaluationService { //会员评价数据层 - @Autowired + @Resource private MemberEvaluationMapper memberEvaluationMapper; //订单 @Autowired @@ -91,7 +92,6 @@ public class MemberEvaluationServiceImpl extends ServiceImpl> list = memberEvaluationMapper.getEvaluationNumber(goodsId); + List> list = this.baseMapper.getEvaluationNumber(goodsId); Integer good = 0; diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberGradeServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberGradeServiceImpl.java new file mode 100644 index 00000000..0152e4da --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberGradeServiceImpl.java @@ -0,0 +1,18 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.modules.member.entity.dos.MemberGrade; +import cn.lili.modules.member.mapper.MemberGradeMapper; +import cn.lili.modules.member.service.MemberGradeService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 会员等级业务层实现 + * + * @author Bulbasaur + * @date: 2021/5/14 5:58 下午 + */ +@Service +public class MemberGradeServiceImpl extends ServiceImpl implements MemberGradeService { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java index 2ca33490..c5ad83f6 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java @@ -62,9 +62,6 @@ import java.util.List; @Transactional public class MemberServiceImpl extends ServiceImpl implements MemberService { - //会员数据处理层 - @Autowired - private MemberMapper memberMapper; //会员token @Autowired private MemberTokenGenerate memberTokenGenerate; @@ -90,7 +87,7 @@ public class MemberServiceImpl extends ServiceImpl impleme public Member findByUsername(String userName) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("username", userName); - return memberMapper.selectOne(queryWrapper); + return this.baseMapper.selectOne(queryWrapper); } @@ -107,7 +104,7 @@ public class MemberServiceImpl extends ServiceImpl impleme public boolean findByMobile(String uuid, String mobile) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("mobile", mobile); - Member member = memberMapper.selectOne(queryWrapper); + Member member = this.baseMapper.selectOne(queryWrapper); if (member == null) { throw new ServiceException(ResultCode.USER_NOT_PHONE); } @@ -165,7 +162,7 @@ public class MemberServiceImpl extends ServiceImpl impleme private Member findMember(String userName) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("username", userName).or().eq("mobile", userName); - return memberMapper.selectOne(queryWrapper); + return this.getOne(queryWrapper); } @Override @@ -216,7 +213,7 @@ public class MemberServiceImpl extends ServiceImpl impleme public Token mobilePhoneLogin(String mobilePhone) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("mobile", mobilePhone); - Member member = memberMapper.selectOne(queryWrapper); + Member member = this.baseMapper.selectOne(queryWrapper); //如果手机号不存在则自动注册用户 if (member == null) { member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone); @@ -362,13 +359,13 @@ public class MemberServiceImpl extends ServiceImpl impleme @Override @PointLogPoint - public Boolean updateMemberPoint(Long point, Integer type, String memberId, String content) { + public Boolean updateMemberPoint(Long point, Boolean type, String memberId, String content) { //获取当前会员信息 Member member = this.getById(memberId); if (member != null) { //积分变动后的会员积分 long currentPoint; - if (type == 1) { + if (type) { currentPoint = CurrencyUtil.add(member.getPoint(), point).longValue(); } else { currentPoint = CurrencyUtil.sub(member.getPoint(), point) < 0 ? 0 : new Double(CurrencyUtil.sub(member.getPoint(), point)).longValue(); @@ -391,6 +388,25 @@ public class MemberServiceImpl extends ServiceImpl impleme throw new ServiceException(ResultCode.USER_NOT_EXIST); } + @Override + public Boolean updateMemberExperience(Long experience, Boolean type, String memberId, String content) { + //获取当前会员信息 + Member member = this.getById(memberId); + if (member != null) { + //积分变动后的会员积分 + long currentExperience; + if (type) { + currentExperience = CurrencyUtil.add(member.getPoint(), experience).longValue(); + } else { + currentExperience = CurrencyUtil.sub(member.getPoint(), experience) < 0 ? 0 : new Double(CurrencyUtil.sub(member.getExperience(), experience)).longValue(); + } + member.setExperience(currentExperience); + + return this.updateById(member); + } + throw new ServiceException(ResultCode.USER_NOT_EXIST); + } + @Override public Boolean updateMemberStatus(List memberIds, Boolean status) { @@ -403,7 +419,7 @@ public class MemberServiceImpl extends ServiceImpl impleme @Override public List distribution() { - List memberDistributionVOS = memberMapper.distribution(); + List memberDistributionVOS = this.baseMapper.distribution(); return memberDistributionVOS; } @@ -416,7 +432,7 @@ public class MemberServiceImpl extends ServiceImpl impleme private Member findByPhone(String mobilePhone) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("mobile", mobilePhone); - return memberMapper.selectOne(queryWrapper); + return this.baseMapper.selectOne(queryWrapper); } /** 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 cf863383..74ab3170 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 @@ -21,7 +21,6 @@ import cn.lili.modules.system.service.SettingService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.gson.Gson; -import lombok.RequiredArgsConstructor; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -41,9 +40,6 @@ import java.util.Map; @Transactional public class MemberSignServiceImpl extends ServiceImpl implements MemberSignService { - //会员签到 - @Autowired - private MemberSignMapper memberSignMapper; //RocketMQ @Autowired private RocketMQTemplate rocketMQTemplate; @@ -67,12 +63,12 @@ public class MemberSignServiceImpl extends ServiceImpl todaySigns = memberSignMapper.getTodayMemberSign(queryWrapper); + List todaySigns = this.baseMapper.getTodayMemberSign(queryWrapper); if (todaySigns.size() > 0) { throw new ServiceException(ResultCode.MEMBER_SIGN_REPEAT); } //当前签到天数的前一天日期 - List signs = memberSignMapper.getBeforeMemberSign(authUser.getId()); + List signs = this.baseMapper.getBeforeMemberSign(authUser.getId()); //构建参数 MemberSign memberSign = new MemberSign(); memberSign.setMemberId(authUser.getId()); @@ -85,7 +81,7 @@ public class MemberSignServiceImpl extends ServiceImpl 0) { String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_SING.name(); @@ -102,7 +98,7 @@ public class MemberSignServiceImpl extends ServiceImpl implements MemberWalletService { - //预存款数据层 - @Autowired - private MemberWalletMapper walletMapper; //预存款日志 @Autowired private WalletLogService walletLogService; @@ -67,7 +64,7 @@ public class MemberWalletServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("member_id", memberId); //执行查询 - MemberWallet memberWallet = this.walletMapper.selectOne(queryWrapper); + MemberWallet memberWallet = this.baseMapper.selectOne(queryWrapper); //如果没有钱包,则创建钱包 if (memberWallet == null) { memberWallet = this.save(memberId, memberService.getById(memberId).getUsername()); @@ -83,7 +80,7 @@ public class MemberWalletServiceImpl extends ServiceImpl().eq("member_id", memberId)); + MemberWallet memberWallet = this.getOne(new QueryWrapper().eq("member_id", memberId)); //如果会员预存款信息不存在则同步重新建立预存款信息 if (memberWallet == null) { Member member = memberService.getById(memberId); @@ -184,11 +181,11 @@ public class MemberWalletServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("member_id", member.getId()); - MemberWallet memberWallet = this.walletMapper.selectOne(queryWrapper); + MemberWallet memberWallet = this.getOne(queryWrapper); //如果 预存款信息不为空 执行设置密码 if (memberWallet != null) { memberWallet.setWalletPassword(pwd); - this.walletMapper.updateById(memberWallet); + this.updateById(memberWallet); } } @@ -200,7 +197,7 @@ public class MemberWalletServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("member_id", authUser.getId()); - MemberWallet wallet = this.walletMapper.selectOne(queryWrapper); + MemberWallet wallet = this.getOne(queryWrapper); return wallet != null && !StringUtils.isEmpty(wallet.getWalletPassword()); } @@ -211,7 +208,7 @@ public class MemberWalletServiceImpl extends ServiceImpl implements MemberWithdrawApplyService { + //提现申请数据层 //会员余额 @Autowired @@ -41,7 +42,8 @@ public class MemberWithdrawApplyServiceImpl extends ServiceImpl implements StoreCollectionService { - @Autowired - private StoreCollectionMapper storeCollectionMapper; @Override public IPage storeCollection(PageVO pageVo) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("sc.member_id", UserContext.getCurrentUser().getId()); queryWrapper.orderByDesc("sc.create_time"); - return storeCollectionMapper.storeCollectionVOList(PageUtil.initPage(pageVo), queryWrapper); + return this.baseMapper.storeCollectionVOList(PageUtil.initPage(pageVo), queryWrapper); } @Override diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsSignServiceImpl.java b/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsSignServiceImpl.java index 817034f5..50c6cd93 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsSignServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsSignServiceImpl.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,6 +26,7 @@ import java.util.Map; * @author Chopper * @date 2021/1/30 4:27 下午 */ +@Slf4j @Service @Transactional public class SmsSignServiceImpl extends ServiceImpl implements SmsSignService { @@ -42,7 +44,7 @@ public class SmsSignServiceImpl extends ServiceImpl impl smsSign.setSignStatus(0); this.save(smsSign); } catch (Exception e) { - e.printStackTrace(); + log.error("添加短信签名错误",e); } } @@ -55,7 +57,7 @@ public class SmsSignServiceImpl extends ServiceImpl impl this.removeById(id); } } catch (Exception e) { - e.printStackTrace(); + log.error("删除短信签名错误",e); } } @@ -74,7 +76,7 @@ public class SmsSignServiceImpl extends ServiceImpl impl this.updateById(smsSign); } } catch (Exception e) { - e.printStackTrace(); + log.error("查询短信签名错误",e); } } @@ -84,7 +86,7 @@ public class SmsSignServiceImpl extends ServiceImpl impl aliSmsUtil.modifySmsSign(smsSign); this.updateById(smsSign); } catch (Exception e) { - e.printStackTrace(); + log.error("更新短信签名错误",e); } } diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsTemplateServiceImpl.java b/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsTemplateServiceImpl.java index 5de67750..d3286192 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsTemplateServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/message/serviceimpl/SmsTemplateServiceImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,6 +24,7 @@ import java.util.Map; * @author Chopper * @date 2021/1/30 4:27 下午 */ +@Slf4j @Service @Transactional public class SmsTemplateServiceImpl extends ServiceImpl implements SmsTemplateService { @@ -38,7 +40,7 @@ public class SmsTemplateServiceImpl extends ServiceImpl implements StoreMessageService { - @Autowired - private StoreMessageMapper storeMessageMapper; @Override public boolean deleteByMessageId(String messageId) { StoreMessage storeMessage = this.getById(messageId); if (storeMessage != null) { - int result = storeMessageMapper.deleteById(messageId); - return result > 0; + return this.removeById(messageId); } return false; @@ -60,7 +56,7 @@ public class StoreMessageServiceImpl extends ServiceImpl 0; + return this.updateById(storeMessage); } return false; } diff --git a/framework/src/main/java/cn/lili/modules/message/serviceimpl/WechatMPMessageServiceImpl.java b/framework/src/main/java/cn/lili/modules/message/serviceimpl/WechatMPMessageServiceImpl.java index 43328053..a6f8b107 100644 --- a/framework/src/main/java/cn/lili/modules/message/serviceimpl/WechatMPMessageServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/message/serviceimpl/WechatMPMessageServiceImpl.java @@ -36,8 +36,6 @@ import java.util.Map; @Transactional(rollbackFor = Exception.class) public class WechatMPMessageServiceImpl extends ServiceImpl implements WechatMPMessageService { - @Autowired - private WechatMPMessageMapper wechatMPMessageMapper; @Autowired private WechatAccessTokenUtil wechatAccessTokenUtil; @@ -53,7 +51,7 @@ public class WechatMPMessageServiceImpl extends ServiceImpl implements WechatMessageService { - @Autowired - private WechatMessageMapper wechatMessageMapper; + @Autowired private WechatAccessTokenUtil wechatAccessTokenUtil; @@ -50,7 +48,7 @@ public class WechatMessageServiceImpl extends ServiceImpl storeCoupons; /** - * key 为商家id - * value 为商家优惠券 - * 商家优惠券 + * 店铺备注 */ private List storeRemark; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java index 054f5e1c..bdc11c9d 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/CartTypeEnum.java @@ -24,5 +24,9 @@ public enum CartTypeEnum { * 积分 */ POINTS, + /** + * 虚拟商品 + */ + VIRTUAL; } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java index 2a0ff507..7671d446 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartSkuVO.java @@ -51,10 +51,6 @@ public class CartSkuVO extends CartBase implements Serializable { @ApiModelProperty(value = "是否选中,要去结算") private Boolean checked; - - @ApiModelProperty(value = " 谁承担运费 BUYER:买家承担,STORE:卖家承担") - private String freightPayer; - @ApiModelProperty(value = "是否免运费") private Boolean isFreeFreight; @@ -100,7 +96,6 @@ public class CartSkuVO extends CartBase implements Serializable { this.isShip = true; this.purchasePrice = goodsSku.getIsPromotion() != null && goodsSku.getIsPromotion() ? goodsSku.getPromotionPrice() : goodsSku.getPrice(); this.isFreeFreight = false; - this.freightPayer = goodsSku.getFreightPayer(); this.setStoreId(goodsSku.getStoreId()); this.setStoreName(goodsSku.getStoreName()); } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartVO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartVO.java index 20713c8e..5906b4fb 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartVO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/vo/CartVO.java @@ -5,6 +5,7 @@ import cn.lili.modules.promotion.entity.dos.MemberCoupon; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.ArrayList; @@ -19,6 +20,7 @@ import java.util.List; */ @Data @ApiModel(description = "购物车") +@NoArgsConstructor public class CartVO extends CartBase implements Serializable { private static final long serialVersionUID = -5651775413457562422L; @@ -44,7 +46,6 @@ public class CartVO extends CartBase implements Serializable { @ApiModelProperty(value = "使用的优惠券列表") private List couponList; - @ApiModelProperty(value = "赠品列表") private List giftList; @@ -72,9 +73,6 @@ public class CartVO extends CartBase implements Serializable { @ApiModelProperty(value = "已参与的的促销活动提示,直接展示给客户") private String promotionNotice; - public CartVO() { - } - public CartVO(CartSkuVO cartSkuVO) { this.setStoreId(cartSkuVO.getStoreId()); this.setStoreName(cartSkuVO.getStoreName()); diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java index ba32de5a..d51ddd1c 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.stream.Collectors; /** - * TradeBuilder + * 交易构造&&创建 * * @author Chopper * @date2020-04-01 9:47 下午 @@ -24,36 +24,41 @@ import java.util.stream.Collectors; @Service @Slf4j public class TradeBuilder { - //购物车渲染 + + //购物车渲染步骤 @Autowired private List cartRenderSteps; + //交易 @Autowired private TradeService tradeService; + //购物车业务 + @Autowired + private CartService cartService; + + /** * 渲染整比交易 + * 0-> 校验商品, 1-》 满优惠渲染, 2->渲染优惠, 3->优惠券渲染, 4->计算运费, 5->计算价格, 6->分销渲染, 7->扩展操作 */ int[] defaultRender = {0, 1, 2, 4, 5, 6, 7}; /** * 购物车购物车渲染 + * 0-> 校验商品, 1-》 满优惠渲染, 2->渲染优惠, 5->计算价格 */ int[] cartRender = {0, 1, 2, 5}; - /** - * 0-> 校验商品 1-》 满优惠渲染 2->渲染优惠 3->优惠券渲染 4->计算运费 5->计算价格 6->分销渲染 7->扩展操作 - */ - @Autowired - private CartService cartService; - /** * 构造购物车 + * 购物车与结算信息不一致的地方主要是优惠券计算和运费计算,其他规则都是一致都 * * @param checkedWay 购物车类型 * @return 购物车展示信息 */ public TradeDTO buildCart(CartTypeEnum checkedWay) { + //读取对应购物车的商品信息 TradeDTO tradeDTO = cartService.readDTO(checkedWay); //购物车需要将交易中的优惠券取消掉 @@ -67,7 +72,7 @@ public class TradeBuilder { try { cartRenderSteps.get(index).render(tradeDTO); } catch (Exception e) { - log.error("购物车渲染异常:", e); + log.error("购物车{}渲染异常:", cartRenderSteps.get(index).getClass(), e); } } return tradeDTO; @@ -80,28 +85,26 @@ public class TradeBuilder { * @return 购物车展示信息 */ public TradeDTO buildTrade(CartTypeEnum checkedWay) { + //读取对应购物车的商品信息 TradeDTO tradeDTO = cartService.readDTO(checkedWay); - tradeDTO.setNotSupportFreight(null); + //将购物车到sku未选择信息过滤 List collect = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList()); - //拼团类型订单预处理 - if (checkedWay.equals(CartTypeEnum.PINTUAN)) { - for (CartSkuVO cartSkuVO : collect) { - cartSkuVO.setPintuanId(""); - } - } tradeDTO.setSkuList(collect); //按照计划进行渲染 for (int index : defaultRender) { try { cartRenderSteps.get(index).render(tradeDTO); } catch (Exception e) { - log.error("购物车渲染异常:", e); + log.error("购物车{}渲染异常:", cartRenderSteps.get(index).getClass(), e); } } + //购物车信息接受 List cartVOList = new ArrayList<>(); - for (CartVO i : tradeDTO.getCartList()) { - i.setSkuList(i.getSkuList().stream().filter(j -> Boolean.TRUE.equals(j.getChecked())).collect(Collectors.toList())); - cartVOList.add(i); + //循环购物车信息 + for (CartVO cartVO : tradeDTO.getCartList()) { + //如果商品选中,则加入到对应购物车 + cartVO.setSkuList(cartVO.getSkuList().stream().filter(j -> Boolean.TRUE.equals(j.getChecked())).collect(Collectors.toList())); + cartVOList.add(cartVO); } tradeDTO.setCartList(cartVOList); return tradeDTO; @@ -111,12 +114,10 @@ public class TradeBuilder { * 创建一笔交易 * * @param checkedWay 购物车类型 - * @param parentOrderSn 是否为其他订单下的订单,如果是则为依赖订单的sn,否则为空 * @return 交易信息 */ - public Trade createTrade(CartTypeEnum checkedWay, String parentOrderSn) { + public Trade createTrade(CartTypeEnum checkedWay) { TradeDTO tradeDTO = this.buildTrade(checkedWay); - tradeDTO.setParentOrderSn(parentOrderSn); return tradeService.createTrade(tradeDTO); } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java index f5a5476d..29757f33 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java @@ -1,18 +1,28 @@ package cn.lili.modules.order.cart.render.impl; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; +import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.render.CartRenderStep; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.order.order.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * 商品有效性校验 * @@ -26,10 +36,31 @@ public class CheckDataRender implements CartRenderStep { @Autowired private GoodsSkuService goodsSkuService; + @Autowired + private OrderService orderService; + @Override public void render(TradeDTO tradeDTO) { + //校验商品有效性 + checkData(tradeDTO); + //店铺分组数据初始化 + groupStore(tradeDTO); + //预校验 + preCalibration(tradeDTO); + + } + + /** + * 校验商品属性 + * + * @param tradeDTO + */ + private void checkData(TradeDTO tradeDTO) { + //循环购物车中的商品 for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { + //缓存中的商品信息 GoodsSku dataSku = goodsSkuService.getGoodsSkuByIdFromCache(cartSkuVO.getGoodsSku().getId()); + //商品有效性判定 if (dataSku == null || dataSku.getUpdateTime().before(cartSkuVO.getGoodsSku().getUpdateTime())) { //设置购物车未选中 cartSkuVO.setChecked(false); @@ -39,6 +70,7 @@ public class CheckDataRender implements CartRenderStep { cartSkuVO.setErrorMessage("商品信息发生变化,已失效"); continue; } + // 商品上架状态判定 if (!GoodsAuthEnum.PASS.name().equals(dataSku.getIsAuth()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable())) { //设置购物车未选中 cartSkuVO.setChecked(false); @@ -48,17 +80,59 @@ public class CheckDataRender implements CartRenderStep { cartSkuVO.setErrorMessage("商品已下架"); continue; } - //商品库存不足 - if (dataSku.getQuantity() <= 0) { + // 商品库存判定 + if (dataSku.getQuantity() < cartSkuVO.getNum()) { //设置购物车未选中 cartSkuVO.setChecked(false); - //设置购物车此sku商品已失效 - cartSkuVO.setInvalid(true); //设置失效消息 - cartSkuVO.setErrorMessage("商品库存不足"); + cartSkuVO.setErrorMessage("商品库存不足,现有库存数量[" + dataSku.getQuantity() + "]"); } //写入初始价格 cartSkuVO.getPriceDetailDTO().setGoodsPrice(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); } } + + /** + * 店铺分组 + * + * @param tradeDTO + */ + private void groupStore(TradeDTO tradeDTO) { + // 渲染的购物车 + List cartList = new ArrayList<>(); + + // 根据店铺分组 + Map> storeCollect = tradeDTO.getSkuList().parallelStream().collect(Collectors.groupingBy(CartSkuVO::getStoreId)); + for (Map.Entry> storeCart : storeCollect.entrySet()) { + if (!storeCart.getValue().isEmpty()) { + CartVO cartVO = new CartVO(storeCart.getValue().get(0)); + if (CharSequenceUtil.isEmpty(cartVO.getDeliveryMethod())) { + cartVO.setDeliveryMethod(DeliveryMethodEnum.LOGISTICS.name()); + } + cartVO.setSkuList(storeCart.getValue()); + storeCart.getValue().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).findFirst().ifPresent(cartSkuVO -> cartVO.setChecked(true)); + cartList.add(cartVO); + } + } + tradeDTO.setCartList(cartList); + } + + /** + * 订单预校验 + * 1、自己拼团自己创建都拼团判定 + * + * @param tradeDTO + */ + private void preCalibration(TradeDTO tradeDTO) { + //拼团判定,不能参与自己创建的拼团 + if (tradeDTO.getParentOrderSn() != null) { + //订单接受 + cn.lili.modules.order.order.entity.dos.Order parentOrder = orderService.getBySn(tradeDTO.getParentOrderSn()); + //参与活动判定 + if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) { + throw new ServiceException("不能参与自己发起的拼团活动!"); + } + } + } + } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java index 33fa9b8c..0b728c64 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java @@ -1,15 +1,12 @@ package cn.lili.modules.order.cart.render.impl; -import cn.hutool.core.text.CharSequenceUtil; import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum; -import cn.lili.modules.promotion.entity.dos.PromotionGoods; -import cn.lili.modules.promotion.service.FullDiscountService; import cn.lili.modules.order.cart.entity.vo.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.order.cart.render.CartRenderStep; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.promotion.entity.dos.PromotionGoods; +import cn.lili.modules.promotion.service.FullDiscountService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; @@ -38,60 +35,63 @@ public class FullDiscountRender implements CartRenderStep { // 获取购物车中所有的商品 List cartSkuList = tradeDTO.getSkuList(); - // 渲染的购物车 - List cartList = new ArrayList<>(); - - // 确定有哪些商家 + // 店铺id集合 List storeIds = new ArrayList<>(); - // 根据店铺分组 - Map> storeCollect = cartSkuList.parallelStream().collect(Collectors.groupingBy(CartSkuVO::getStoreId)); + // 店铺集合 + List cartList = tradeDTO.getCartList(); + + + // 获取店铺id + Map> storeCollect = tradeDTO.getSkuList().parallelStream().collect(Collectors.groupingBy(CartSkuVO::getStoreId)); for (Map.Entry> storeCart : storeCollect.entrySet()) { if (!storeCart.getValue().isEmpty()) { storeIds.add(storeCart.getKey()); - CartVO cartVO = new CartVO(storeCart.getValue().get(0)); - if (CharSequenceUtil.isEmpty(cartVO.getDeliveryMethod())) { - cartVO.setDeliveryMethod(DeliveryMethodEnum.LOGISTICS.name()); - } - cartVO.setSkuList(storeCart.getValue()); - storeCart.getValue().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).findFirst().ifPresent(cartSkuVO -> cartVO.setChecked(true)); - cartList.add(cartVO); - } } + // 获取当前店铺进行到满减活动 List fullDiscounts = fullDiscountService.currentPromotion(storeIds); + //循环满减信息 for (FullDiscountVO fullDiscount : fullDiscounts) { + //判定参与活动的商品 if (fullDiscount.getPromotionGoodsList() != null || fullDiscount.getNumber() == -1) { + //循环店铺购物车 for (CartVO cart : cartList) { + //如果购物车中的店铺id与活动店铺id相等,则进行促销计算 if (fullDiscount.getStoreId().equals(cart.getStoreId())) { + //写入满减活动 cart.setFullDiscount(fullDiscount); List skuIds; + // 参与活动的sku判定 if (fullDiscount.getNumber() != -1) { skuIds = initFullDiscountGoods(fullDiscount, cartSkuList); } else { skuIds = cart.getSkuList().stream().map(i -> i.getGoodsSku().getId()).collect(Collectors.toList()); } + //记录参与满减活动的sku cart.setFullDiscountSkuIds(skuIds); } } } } - tradeDTO.setCartList(cartList); } /** * 获取参与满优惠的商品id * * @param fullDiscount 满优惠信息 - * @param cartSkuVOS 购物车商品sku信息 + * @param cartSkuVOS 购物车商品sku信息 * @return 参与满优惠的商品id */ public List initFullDiscountGoods(FullDiscountVO fullDiscount, List cartSkuVOS) { List goodsIds = new ArrayList<>(); + //判定参与活动的商品 for (PromotionGoods promotionGoods : fullDiscount.getPromotionGoodsList()) { + //sku 集合判定 for (CartSkuVO cartSkuVO : cartSkuVOS) { + //如果参加,则记录商品sku if (cartSkuVO.getGoodsSku().getId().equals(promotionGoods.getSkuId())) { goodsIds.add(promotionGoods.getSkuId()); } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java index afadb005..633e700b 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java @@ -1,6 +1,8 @@ package cn.lili.modules.order.cart.render.impl; import cn.hutool.core.util.NumberUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.CurrencyUtil; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.order.cart.entity.dto.TradeDTO; @@ -11,7 +13,6 @@ import cn.lili.modules.store.entity.dto.FreightTemplateChildDTO; import cn.lili.modules.store.entity.enums.FreightTemplateEnum; import cn.lili.modules.store.entity.vos.FreightTemplateVO; import cn.lili.modules.store.service.FreightTemplateService; -import com.xkcoding.http.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; @@ -37,27 +38,26 @@ public class SkuFreightRender implements CartRenderStep { List cartSkuVOS = tradeDTO.getSkuList(); //会员收货地址问题处理 MemberAddress memberAddress = tradeDTO.getMemberAddress(); + //如果收货地址为空,则抛出异常 if (memberAddress == null) { - return; + throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } //循环渲染购物车商品运费价格 forSku: for (CartSkuVO cartSkuVO : cartSkuVOS) { + //获取sku运费模版 String freightTemplateId = cartSkuVO.getGoodsSku().getFreightTemplateId(); - //如果商品设置卖家承担运费,或者没设置运费,则跳出此商品运费计算 - if (StringUtil.isEmpty(cartSkuVO.getFreightPayer())||cartSkuVO.getFreightPayer().equals("STORE")) { - continue; - } - //免运费则跳出运费计算 if (Boolean.TRUE.equals(cartSkuVO.getIsFreeFreight()) || freightTemplateId == null) { continue; } - //寻找对应对商品运费计算模版 FreightTemplateVO freightTemplate = freightTemplateService.getFreightTemplate(freightTemplateId); if (freightTemplate != null && freightTemplate.getFreightTemplateChildList() != null && !freightTemplate.getFreightTemplateChildList().isEmpty()) { - + //店铺支付运费则跳过 + if (freightTemplate.getPricingMethod().equals(FreightTemplateEnum.FREE.name())) { + break; + } FreightTemplateChild freightTemplateChild = null; //获取市级别id @@ -70,7 +70,7 @@ public class SkuFreightRender implements CartRenderStep { break; } } - + //如果没有匹配到物流规则,则说明不支持配送 if (freightTemplateChild == null) { if (tradeDTO.getNotSupportFreight() == null) { tradeDTO.setNotSupportFreight(new ArrayList<>()); @@ -79,6 +79,7 @@ public class SkuFreightRender implements CartRenderStep { continue forSku; } + //物流规则模型创立 FreightTemplateChildDTO freightTemplateChildDTO = new FreightTemplateChildDTO(freightTemplateChild); freightTemplateChildDTO.setPricingMethod(freightTemplate.getPricingMethod()); diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java index 09531030..2d997b3f 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java @@ -1,16 +1,12 @@ package cn.lili.modules.order.cart.service; -import cn.lili.modules.member.entity.dos.MemberAddress; 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.CartSkuVO; import cn.lili.modules.order.cart.entity.vo.TradeParams; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.vo.ReceiptVO; -import java.util.List; - /** * 购物车业务层 * @@ -171,13 +167,4 @@ public interface CartService { * @return 交易信息 */ Trade createTrade(TradeParams tradeParams); - - /** - * 检查商品是否在配送范围 - * - * @param skuList 商品列表 - * @param memberAddress 配送地址 - */ - void checkAddressScope(List skuList, MemberAddress memberAddress); - } 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 55808273..c317dfe1 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 @@ -24,18 +24,17 @@ import cn.lili.modules.order.cart.render.TradeBuilder; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.vo.ReceiptVO; import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.dos.Pintuan; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.enums.CouponScopeTypeEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; import cn.lili.modules.promotion.service.MemberAddressService; import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.modules.promotion.service.PintuanService; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.service.EsGoodsSearchService; -import cn.lili.modules.store.entity.dos.FreightTemplateChild; -import cn.lili.modules.store.entity.vos.FreightTemplateVO; -import cn.lili.modules.store.service.FreightTemplateService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -77,9 +76,10 @@ public class CartServiceImpl implements CartService { //ES商品 @Autowired private EsGoodsSearchService esGoodsSearchService; - //运费模板 + + //拼团服务 @Autowired - private FreightTemplateService freightTemplateService; + private PintuanService pintuanService; //交易 @Autowired private TradeBuilder tradeBuilder; @@ -134,10 +134,16 @@ public class CartServiceImpl implements CartService { promotionGoodsService.updatePromotion(cartSkuVO); //再设置加入购物车的数量 this.checkSetGoodsQuantity(cartSkuVO, skuId, num); + + //拼团判定 + checkPintuan(cartTypeEnum, cartSkuVO); + //计算购物车小计 cartSkuVO.setSubTotal(CurrencyUtil.mul(cartSkuVO.getPurchasePrice(), cartSkuVO.getNum())); cartSkuVOS.add(cartSkuVO); } + + tradeDTO.setCartTypeEnum(cartTypeEnum); // 如购物车发生更改,则重置优惠券 tradeDTO.setStoreCoupons(null); @@ -499,55 +505,15 @@ public class CartServiceImpl implements CartService { //设置基础属性 tradeDTO.setClientType(tradeParams.getClient()); tradeDTO.setStoreRemark(tradeParams.getRemark()); - //过滤勾选商品 - List collect = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList()); - //校验收获地址 - MemberAddress memberAddress = tradeDTO.getMemberAddress(); - this.checkAddressScope(collect, memberAddress); + tradeDTO.setParentOrderSn(tradeParams.getParentOrderSn()); + //将购物车信息写入缓存,后续逻辑调用校验 this.resetTradeDTO(tradeDTO); //构建交易 - Trade trade = tradeBuilder.createTrade(cartTypeEnum, tradeParams.getParentOrderSn()); + Trade trade = tradeBuilder.createTrade(cartTypeEnum); this.cleanChecked(tradeDTO); return trade; } - /** - * 检查商品是否在配送范围 - * - * @param skuList 商品列表 - * @param memberAddress 配送地址 - */ - @Override - public void checkAddressScope(List skuList, MemberAddress memberAddress) { - //如果收货地址为空,则抛出异常 - if (memberAddress == null) { - throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); - } - for (CartSkuVO cartSkuVO : skuList) { - //店铺支付运费则跳过 - if (cartSkuVO.getFreightPayer().equals("STORE")) { - break; - } - String freightTemplateId = cartSkuVO.getGoodsSku().getFreightTemplateId(); - FreightTemplateVO freightTemplate = freightTemplateService.getFreightTemplate(freightTemplateId); - //收货地址判定 - forTemplates: - if (freightTemplate != null && freightTemplate.getFreightTemplateChildList() != null && !freightTemplate.getFreightTemplateChildList().isEmpty()) { - - //获取市级别id - String addressId = memberAddress.getConsigneeAddressIdPath().split(",")[1]; - //获取匹配的收货地址 - for (FreightTemplateChild templateChild : freightTemplate.getFreightTemplateChildList()) { - //如果当前模版包含,则返回 - if (templateChild.getAreaId().contains(addressId)) { - break forTemplates; - } - } - throw new ServiceException(ResultCode.SHIPPING_NOT_APPLY, cartSkuVO.getGoodsSku().getGoodsName()); - - } - } - } /** * 获取购物车类型 @@ -568,6 +534,13 @@ public class CartServiceImpl implements CartService { return cartTypeEnum; } + /** + * 使用优惠券判定 + * + * @param tradeDTO 交易对象 + * @param memberCoupon 会员优惠券 + * @param cartTypeEnum 购物车 + */ private void useCoupon(TradeDTO tradeDTO, MemberCoupon memberCoupon, CartTypeEnum cartTypeEnum) { //如果是平台优惠券 if (Boolean.TRUE.equals(memberCoupon.getIsPlatform())) { @@ -575,24 +548,34 @@ public class CartServiceImpl implements CartService { Double cartPrice = 0d; for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) { // 获取商品的促销信息 - Optional promotionOptional = cartSkuVO.getPromotions().parallelStream().filter(i -> (i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name()) && cartTypeEnum.equals(CartTypeEnum.PINTUAN)) - || i.getPromotionType().equals(PromotionTypeEnum.SECKILL.name())).findAny(); + Optional promotionOptional = + cartSkuVO.getPromotions().parallelStream().filter(promotionGoods -> + (promotionGoods.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name()) && + cartTypeEnum.equals(CartTypeEnum.PINTUAN)) || + promotionGoods.getPromotionType().equals(PromotionTypeEnum.SECKILL.name())).findAny(); + //有促销金额则用促销金额,否则用商品原价 if (promotionOptional.isPresent()) { - cartPrice += CurrencyUtil.mul(promotionOptional.get().getPrice(), cartSkuVO.getNum()); + cartPrice = CurrencyUtil.add(cartPrice, CurrencyUtil.mul(promotionOptional.get().getPrice(), cartSkuVO.getNum())); } else { - cartPrice += CurrencyUtil.mul(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getNum()); + cartPrice = CurrencyUtil.add(cartPrice, CurrencyUtil.mul(cartSkuVO.getGoodsSku().getPrice(), cartSkuVO.getNum())); } } + //如果购物车金额大于消费门槛则使用 if (memberCoupon.getConsumeThreshold() <= cartPrice) { tradeDTO.setPlatformCoupon(new MemberCouponDTO(memberCoupon)); + //选择平台优惠券,则将品台优惠券清空 tradeDTO.setStoreCoupons(new HashMap<>()); } - } else { + } + //否则为店铺优惠券 + else { + //过滤对应店铺购物车 CartSkuVO cartVO = tradeDTO.getSkuList().stream().filter(i -> i.getStoreId().equals(memberCoupon.getStoreId())).findFirst().orElse(null); // 优惠券消费门槛 <= 商品购买时的成交价(单品) * 购买数量 if (cartVO != null && memberCoupon.getConsumeThreshold() <= CurrencyUtil.mul(cartVO.getPurchasePrice(), cartVO.getNum())) { tradeDTO.getStoreCoupons().put(memberCoupon.getStoreId(), new MemberCouponDTO(memberCoupon)); + //选择店铺优惠券,则将品台优惠券清空 tradeDTO.setPlatformCoupon(null); } } @@ -607,9 +590,12 @@ public class CartServiceImpl implements CartService { */ private boolean checkCoupon(MemberCoupon memberCoupon, TradeDTO tradeDTO) { List cartSkuVOS; + //如果是店铺优惠券,判定的内容 if (Boolean.FALSE.equals(memberCoupon.getIsPlatform())) { cartSkuVOS = tradeDTO.getSkuList().stream().filter(i -> i.getStoreId().equals(memberCoupon.getStoreId())).collect(Collectors.toList()); - } else { + } + //否则为平台优惠券,筛选商品为全部商品 + else { cartSkuVOS = tradeDTO.getSkuList(); } @@ -627,8 +613,33 @@ public class CartServiceImpl implements CartService { return true; } - @Autowired - public void setTradeBuilder(TradeBuilder tradeBuilder) { - this.tradeBuilder = tradeBuilder; + /** + * 校验拼团信息 + * + * @param cartTypeEnum 购物车枚举 + * @param cartSkuVO 购物车信息 + */ + private void checkPintuan(CartTypeEnum cartTypeEnum, CartSkuVO cartSkuVO) { + + //拼团活动的话,需要对限购数量进行判定 + if (cartTypeEnum.equals(CartTypeEnum.PINTUAN)) { + //获取拼团信息 + List currentPromotion = cartSkuVO.getPromotions().stream().filter( + promotionGoods -> (promotionGoods.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name()))) + .collect(Collectors.toList()); + //拼团活动判定 + if (currentPromotion.size() > 0) { + //写入拼团信息 + cartSkuVO.setPintuanId(currentPromotion.get(0).getPromotionId()); + } else { + throw new ServiceException(ResultCode.CART_PINTUAN_NOT_EXIST_ERROR); + } + + Pintuan pintuan = pintuanService.getPintuanById(cartSkuVO.getPintuanId()); + Integer limitNum = pintuan.getLimitNum(); + if (limitNum != 0 && cartSkuVO.getNum() > limitNum) { + throw new ServiceException(ResultCode.CART_PINTUAN_LIMIT_ERROR); + } + } } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleOperationLogAspect.java b/framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleOperationLogAspect.java index a206a4b0..a6460ad8 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleOperationLogAspect.java +++ b/framework/src/main/java/cn/lili/modules/order/order/aop/AfterSaleOperationLogAspect.java @@ -5,9 +5,8 @@ import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.SpelUtil; import cn.lili.common.utils.ThreadPoolUtil; -import cn.lili.modules.order.trade.entity.dos.AfterSaleLog; import cn.lili.modules.order.order.service.AfterSaleLogService; -import lombok.RequiredArgsConstructor; +import cn.lili.modules.order.trade.entity.dos.AfterSaleLog; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; @@ -51,7 +50,7 @@ public class AfterSaleOperationLogAspect { //调用线程保存 ThreadPoolUtil.getPool().execute(new SaveAfterSaleLogThread(afterSaleLog, afterSaleLogService)); } catch (Exception e) { - e.printStackTrace(); + log.error("售后日志错误",e); } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/aop/OrderOperationLogAspect.java b/framework/src/main/java/cn/lili/modules/order/order/aop/OrderOperationLogAspect.java index e446c292..122a200f 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/aop/OrderOperationLogAspect.java +++ b/framework/src/main/java/cn/lili/modules/order/order/aop/OrderOperationLogAspect.java @@ -6,7 +6,7 @@ import cn.lili.common.utils.SpelUtil; import cn.lili.common.utils.ThreadPoolUtil; import cn.lili.modules.order.trade.entity.dos.OrderLog; import cn.lili.modules.order.trade.service.OrderLogService; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; @@ -23,6 +23,7 @@ import java.util.Map; * @author Chopper * @date: 2020/11/17 7:22 下午 */ +@Slf4j @Aspect @Component public class OrderOperationLogAspect { @@ -48,7 +49,7 @@ public class OrderOperationLogAspect { //调用线程保存 ThreadPoolUtil.getPool().execute(new SaveOrderLogThread(orderLog, orderLogService)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单日志错误",e); } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java index 78ebeac1..09903e68 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/Order.java @@ -14,12 +14,17 @@ import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum; 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.enums.DeliveryMethodEnum; import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; +import cn.lili.modules.order.order.entity.enums.*; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NoArgsConstructor; import javax.persistence.Column; import javax.persistence.Entity; @@ -38,6 +43,7 @@ import java.util.Optional; @Table(name = "li_order") @TableName("li_order") @ApiModel(value = "订单") +@NoArgsConstructor public class Order extends BaseEntity { @@ -177,6 +183,12 @@ public class Order extends BaseEntity { @ApiModelProperty(value = "订单类型") private String orderType; + /** + * @see OrderPromotionTypeEnum + */ + @ApiModelProperty(value = "订单促销类型") + private String orderPromotionType; + @Column(columnDefinition = "TEXT") @ApiModelProperty(value = "价格详情") private String priceDetail; @@ -185,7 +197,7 @@ public class Order extends BaseEntity { private Boolean canReturn; @ApiModelProperty(value = "提货码") - private String qrCode; + private String verificationCode; @ApiModelProperty(value = "分销员ID") private String distributionId; @@ -196,20 +208,27 @@ public class Order extends BaseEntity { @ApiModelProperty(value = "使用的平台会员优惠券id") private String usePlatformMemberCouponId; - public Order() { - - } - + /** + * 构建订单 + * + * @param cartVO 购物车VO + * @param tradeDTO 交易DTO + */ public Order(CartVO cartVO, TradeDTO tradeDTO) { String oldId = this.getId(); - if (tradeDTO.getMemberAddress() != null) { - BeanUtil.copyProperties(tradeDTO.getMemberAddress(), this); - } BeanUtil.copyProperties(tradeDTO, this); BeanUtil.copyProperties(cartVO.getPriceDetailDTO(), this); BeanUtil.copyProperties(cartVO, this); + //订单类型判断--普通订单,活动订单。 + if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.CART) || tradeDTO.getCartTypeEnum().equals(CartTypeEnum.BUY_NOW)) { + this.setOrderType(OrderTypeEnum.NORMAL.name()); + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.VIRTUAL)) { + this.setOrderType(tradeDTO.getCartTypeEnum().name()); + } else { + this.setOrderType(OrderTypeEnum.NORMAL.name()); + } this.setId(oldId); - this.setOrderType(OrderTypeEnum.NORMAL.name()); + //促销信息填充 if (cartVO.getSkuList().get(0).getPromotions() != null && tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN)) { Optional pintuanId = cartVO.getSkuList().get(0).getPromotions().stream().filter(i -> i.getPromotionType().equals(PromotionTypeEnum.PINTUAN.name())).map(PromotionGoods::getPromotionId).findFirst(); @@ -226,14 +245,15 @@ public class Order extends BaseEntity { this.setOrderStatus(OrderStatusEnum.UNPAID.name()); this.setPayStatus(PayStatusEnum.UNPAID.name()); this.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name()); - //如果有收货地址,才记录收货地址 - if (tradeDTO.getMemberAddress() != null) { - this.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath()); - this.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath()); - this.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail()); - this.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile()); - this.setConsigneeName(tradeDTO.getMemberAddress().getName()); - } + this.setTradeSn(tradeDTO.getSn()); + this.setRemark(cartVO.getRemark()); + this.setFreightPrice(tradeDTO.getPriceDetailDTO().getFreightPrice()); + //会员收件信息 + this.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath()); + this.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath()); + this.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail()); + this.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile()); + this.setConsigneeName(tradeDTO.getMemberAddress().getName()); //平台优惠券判定 if (tradeDTO.getPlatformCoupon() != null) { this.setUsePlatformMemberCouponId(tradeDTO.getPlatformCoupon().getMemberCoupon().getId()); @@ -246,9 +266,6 @@ public class Order extends BaseEntity { } this.setUseStoreMemberCouponIds(storeCouponIds.toString()); } - this.setTradeSn(tradeDTO.getSn()); - this.setRemark(cartVO.getRemark()); - this.setFreightPrice(tradeDTO.getPriceDetailDTO().getFreightPrice()); } public PriceDetailDTO getPriceDetailDTO() { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java index cd59e1b5..0ef83e44 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java @@ -56,27 +56,38 @@ public class OrderItem extends BaseEntity { @ApiModelProperty(value = "商品ID") private String goodsId; + @ApiModelProperty(value = "货品ID") private String skuId; + @ApiModelProperty(value = "销售量") private Integer num; + @ApiModelProperty(value = "交易编号") private String tradeSn; + @ApiModelProperty(value = "图片") private String image; + @ApiModelProperty(value = "商品名称") private String goodsName; + @ApiModelProperty(value = "分类ID") private String categoryId; + @ApiModelProperty(value = "快照id") private String snapshotId; + @ApiModelProperty(value = "规格json") @Column(columnDefinition = "TEXT") private String specs; + @ApiModelProperty(value = "促销类型") private String promotionType; + @ApiModelProperty(value = "促销id") private String promotionId; + @ApiModelProperty(value = "销售金额") private Double goodsPrice; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderBatchDeliverDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderBatchDeliverDTO.java new file mode 100644 index 00000000..d6ccd31c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderBatchDeliverDTO.java @@ -0,0 +1,27 @@ +package cn.lili.modules.order.order.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单批量发货DTO + * @author Bulbasaur + * @date: 2021/5/26 4:21 下午 + * + */ +@Data +public class OrderBatchDeliverDTO { + + @ApiModelProperty(value = "订单SN") + private String orderSn; + + @ApiModelProperty(value = "物流公司ID") + private String logisticsId; + + @ApiModelProperty(value = "物流公司名称") + private String logisticsName; + + @ApiModelProperty(value = "发货单号") + private String logisticsNo; + +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java new file mode 100644 index 00000000..8d0b794b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java @@ -0,0 +1,95 @@ +package cn.lili.modules.order.order.entity.dto; + +import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum; +import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; +import cn.lili.modules.order.order.entity.enums.PayStatusEnum; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 订单导出DTO + * @author Bulbasaur + * @date: 2021/6/3 6:36 下午 + * + */ +@Data +public class OrderExportDTO { + + @ApiModelProperty("订单编号") + private String sn; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "用户名") + private String memberName; + + @ApiModelProperty(value = "收件人姓名") + private String consigneeName; + + @ApiModelProperty(value = "收件人手机") + private String consigneeMobile; + + @ApiModelProperty(value = "收件人地址") + private String consigneeAddressPath; + + @ApiModelProperty(value = "详细地址") + private String consigneeDetail; + + @ApiModelProperty(value = "支付方式") + private String paymentMethod; + + @ApiModelProperty(value = "物流公司名称") + private String logisticsName; + + @ApiModelProperty(value = "运费") + private Double freightPrice; + + @ApiModelProperty(value = "商品价格") + private Double goodsPrice; + + @ApiModelProperty(value = "优惠的金额") + private Double discountPrice; + + @ApiModelProperty(value = "总价格") + private Double flowPrice; + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品数量") + private Integer num; + + @ApiModelProperty(value = "买家订单备注") + private String remark; + + /** + * @see OrderStatusEnum + */ + @ApiModelProperty(value = "订单状态") + private String orderStatus; + + /** + * @see PayStatusEnum + */ + @ApiModelProperty(value = "付款状态") + private String payStatus; + + /** + * @see DeliverStatusEnum + */ + @ApiModelProperty(value = "货运状态") + private String deliverStatus; + + @ApiModelProperty(value = "是否需要发票") + private Boolean needReceipt; + + @ApiModelProperty(value = "店铺名称") + private String storeName; +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java index 8e561ce6..bc66e347 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java @@ -67,8 +67,9 @@ public class OrderSearchParams extends PageVO { /** * @see OrderTypeEnum + * @see cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum */ - @ApiModelProperty(value = "订单类型") + @ApiModelProperty(value = "订单类型",allowableValues = "NORMAL,VIRTUAL,GIFT,PINTUAN,POINT" ) private String orderType; @ApiModelProperty(value = "支付方式") @@ -136,7 +137,8 @@ public class OrderSearchParams extends PageVO { // 按订单类型 if (StringUtils.isNotEmpty(orderType)) { - wrapper.eq("o.order_type", orderType); + wrapper.eq("o.order_type", orderType) + .or().eq("o.order_promotion_type", orderType); } // 按支付方式 @@ -202,9 +204,6 @@ public class OrderSearchParams extends PageVO { wrapper.like("o.client_type", clientType); } wrapper.eq("o.delete_flag", false); - wrapper.groupBy("o.id"); - wrapper.orderByDesc("o.id"); - return wrapper; } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutTypeEnum.java index b3d2b564..fe2a6d71 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderOutTypeEnum.java @@ -15,7 +15,7 @@ public enum OrderOutTypeEnum { * 出库类型枚举 */ GOODS("商品"), - SECKILL_GOODS("限时抢购商品"); + SECKILL_GOODS("秒杀活动商品"); private final String description; diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java new file mode 100644 index 00000000..ac06e73c --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderPromotionTypeEnum.java @@ -0,0 +1,24 @@ +package cn.lili.modules.order.order.entity.enums; + +/** + * 订单促销类型枚举 + * + * @author Chopper + * @date 2020/11/17 7:28 下午 + */ +public enum OrderPromotionTypeEnum { + + /** + * 赠品订单 + */ + GIFT, + /** + * 拼团订单 + */ + PINTUAN, + /** + * 积分订单 + */ + POINT + +} diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java index 78a3b610..e670e523 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/enums/OrderTypeEnum.java @@ -21,10 +21,9 @@ public enum OrderTypeEnum { /** * 虚拟订单 */ - FICTITIOUS, + VIRTUAL, /** * 拼团订单 */ PINTUAN - } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AllowOperation.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AllowOperation.java index 1a00f5d1..dd8a1e9a 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AllowOperation.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/AllowOperation.java @@ -81,7 +81,7 @@ public class AllowOperation implements Serializable { //是否允许查看物流信息 this.showLogistics = order.getDeliverStatus().equals(DeliverStatusEnum.DELIVERED.name()) && status.equals(OrderStatusEnum.DELIVERED.name()); - this.take = order.getOrderType().equals(OrderTypeEnum.FICTITIOUS.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()); + this.take = order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()); } /** @@ -119,7 +119,7 @@ public class AllowOperation implements Serializable { //是否允许查看物流信息 this.showLogistics = order.getDeliverStatus().equals(DeliverStatusEnum.DELIVERED.name()) && status.equals(OrderStatusEnum.DELIVERED.name()); - this.take = order.getOrderType().equals(OrderTypeEnum.FICTITIOUS.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()); + this.take = order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()); } diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderVO.java index b04687bf..f6845095 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderVO.java @@ -1,9 +1,11 @@ package cn.lili.modules.order.order.entity.vo; +import cn.hutool.core.bean.BeanUtil; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.OrderItem; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @@ -14,6 +16,7 @@ import java.util.List; * @date 2020/11/28 11:38 */ @Data +@NoArgsConstructor public class OrderVO extends Order { @@ -23,4 +26,8 @@ public class OrderVO extends Order { private List orderItems; + public OrderVO (Order order,List orderItems){ + BeanUtil.copyProperties(order, this); + this.setOrderItems(orderItems); + } } diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java index e976a1a7..081f4ae4 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java +++ b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java @@ -1,6 +1,7 @@ package cn.lili.modules.order.order.mapper; import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; import cn.lili.modules.order.order.entity.vo.PaymentLog; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -11,6 +12,8 @@ import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; +import java.util.List; + /** * 订单数据处理层 * @@ -19,9 +22,6 @@ import org.apache.ibatis.annotations.Update; */ public interface OrderMapper extends BaseMapper { - @Update({"update li_order set order_status = #{status} where sn in #{orderSn}"}) - void batchUpdateStatus(String status, String orderSns); - @Update({"update li_order set order_status = #{status} where sn = #{orderSn}"}) void updateStatus(String status, String orderSn); @@ -39,8 +39,14 @@ public interface OrderMapper extends BaseMapper { " FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ") IPage queryByParams(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + @Select("SELECT o.sn,o.create_time,o.member_name,o.consignee_name,o.consignee_mobile,o.consignee_address_path,o.consignee_detail," + + "o.payment_method, o.logistics_name,o.freight_price,o.goods_price,o.discount_price,o.flow_price,oi.goods_name,oi.num," + + "o.remark,o.order_status,o.pay_status,o.deliver_status,o.need_receipt,o.store_name FROM li_order_item oi INNER JOIN li_order o ON oi.order_sn=o.sn") + List queryExportOrder(@Param(Constants.WRAPPER) Wrapper queryWrapper); @Select("select * from li_order ${ew.customSqlSegment} ") IPage queryPaymentLogs(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + @Select("SELECT sn FROM li_order o ${ew.customSqlSegment} ") + List deliverSnList(@Param(Constants.WRAPPER) Wrapper queryWrapper); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleService.java b/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleService.java index 41baf6ff..21d23e69 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/AfterSaleService.java @@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Date; +import java.util.List; /** * 售后业务层 @@ -31,6 +32,14 @@ public interface AfterSaleService extends IService { */ IPage getAfterSalePages(AfterSaleSearchParams saleSearchParams); + /** + * 查询导出售后信息 + * + * @param saleSearchParams 查询参数 + * @return 分页售后信息 + */ + List exportAfterSaleOrder(AfterSaleSearchParams saleSearchParams); + /** * 查询售后信息 * diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderPriceService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderPriceService.java index baa70f7e..3d1a00d6 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderPriceService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderPriceService.java @@ -3,10 +3,10 @@ package cn.lili.modules.order.order.service; import cn.lili.modules.order.order.entity.dos.Order; /** - * @author liushuai(liushuai711 @ gmail.com) - * @version v4.1 - * @Description: - * @since 2021/4/28 3:47 下午 + * 订单价格 + * + * @author Chopper + * @date 2020/11/17 7:36 下午 */ public interface OrderPriceService { diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java index 1f8da09e..a44078ff 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java @@ -4,6 +4,8 @@ import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dto.MemberAddressDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderBatchDeliverDTO; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; import cn.lili.modules.order.order.entity.dto.OrderMessage; import cn.lili.modules.order.order.entity.dto.OrderSearchParams; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; @@ -12,7 +14,10 @@ import cn.lili.modules.statistics.model.dto.StatisticsQueryParam; import cn.lili.modules.system.entity.vo.Traces; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; import java.util.List; /** @@ -47,6 +52,15 @@ public interface OrderService extends IService { */ IPage queryByParams(OrderSearchParams orderSearchParams); + /** + * 查询导出订单列表 + * + * @param orderSearchParams 查询参数 + * @return 导出订单列表 + */ + List queryExportOrder(OrderSearchParams orderSearchParams); + + /** * 订单详细 * @@ -64,6 +78,8 @@ public interface OrderService extends IService { /** * 订单付款 + * 修改订单付款信息 + * 记录订单流水 * * @param orderSn 订单编号 * @param paymentMethod 支付方法 @@ -116,10 +132,16 @@ public interface OrderService extends IService { /** * 订单核验 * - * @param orderSn 订单编号 - * @param qrCode 提货码 + * @param verificationCode 验证码 */ - Order take(String orderSn, String qrCode); + Order take(String orderSn, String verificationCode); + + /** + * 根据核验码获取订单信息 + * + * @param verificationCode 验证码 + */ + Order getOrderByVerificationCode(String verificationCode); /** * 订单完成 @@ -176,4 +198,20 @@ public interface OrderService extends IService { */ void agglomeratePintuanOrder(String pintuanId, String parentOrderSn); + /** + * 获取待发货订单编号列表 + * + * @param response + * @param logisticsName 店铺已选择物流公司列表 + * @return 待发货订单编号列表 + */ + void getBatchDeliverList(HttpServletResponse response, List logisticsName); + + /** + * 订单批量发货 + * + * @param files 文件 + */ + void batchDeliver(MultipartFile files); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleServiceImpl.java index b553f686..ca072304 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/AfterSaleServiceImpl.java @@ -53,6 +53,7 @@ import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.Date; +import java.util.List; /** * 售后业务层实现 @@ -91,6 +92,11 @@ public class AfterSaleServiceImpl extends ServiceImpl exportAfterSaleOrder(AfterSaleSearchParams saleSearchParams) { + return this.list(saleSearchParams.queryWrapper()); + } + @Override public AfterSaleVO getAfterSale(String sn) { return this.baseMapper.getAfterSaleVO(sn); diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java index b385f6dd..cd0b00c7 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java @@ -12,8 +12,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.transaction.Transactional; @@ -30,9 +28,6 @@ import java.util.List; @Transactional public class OrderItemServiceImpl extends ServiceImpl implements OrderItemService { - @Autowired - private OrderItemMapper orderItemMapper; - @Override public void updateCommentStatus(String orderItemSn, CommentStatusEnum commentStatusEnum) { LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); @@ -89,6 +84,6 @@ public class OrderItemServiceImpl extends ServiceImpl implements OrderService { private static final String ORDER_SN_COLUMN = "order_sn"; - //订单数据层 - @Autowired - private OrderMapper orderMapper; //延时任务 @Autowired private TimeTrigger timeTrigger; //订单货物数据层 - @Autowired + @Resource private OrderItemMapper orderItemMapper; //发票 @Autowired @@ -121,40 +127,33 @@ public class OrderServiceImpl extends ServiceImpl implements @Override public void intoDB(TradeDTO tradeDTO) { + //检查TradeDTO信息 + checkTradeDTO(tradeDTO); //存放购物车,即业务中的订单 List orders = new ArrayList<>(tradeDTO.getCartList().size()); //存放自订单/订单日志 List orderItems = new ArrayList<>(); List orderLogs = new ArrayList<>(); - //拼团判定,不能参与自己创建的拼团 - if (tradeDTO.getParentOrderSn() != null) { - Order parentOrder = this.getBySn(tradeDTO.getParentOrderSn()); - if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) { - throw new ServiceException("不能参与自己发起的拼团活动!"); - } - } + //订单集合 List orderVOS = new ArrayList<>(); - //循环购物车商品集合 + //循环购物车 tradeDTO.getCartList().forEach(item -> { Order order = new Order(item, tradeDTO); - if (OrderTypeEnum.PINTUAN.name().equals(order.getOrderType())) { - Pintuan pintuan = pintuanService.getPintuanById(order.getPromotionId()); - Integer limitNum = pintuan.getLimitNum(); - if (limitNum != 0 && order.getGoodsNum() > limitNum) { - throw new ServiceException("购买数量超过拼团活动限制数量"); - } - } //构建orderVO对象 OrderVO orderVO = new OrderVO(); BeanUtil.copyProperties(order, orderVO); + //持久化DO orders.add(order); String message = "订单[" + item.getSn() + "]创建"; + //记录日志 orderLogs.add(new OrderLog(item.getSn(), UserContext.getCurrentUser().getId(), UserContext.getCurrentUser().getRole().getRole(), UserContext.getCurrentUser().getUsername(), message)); item.getSkuList().forEach( sku -> orderItems.add(new OrderItem(sku, item, tradeDTO)) ); + //写入子订单信息 orderVO.setOrderItems(orderItems); + //orderVO 记录 orderVOS.add(orderVO); }); tradeDTO.setOrderVO(orderVOS); @@ -170,7 +169,15 @@ public class OrderServiceImpl extends ServiceImpl implements @Override public IPage queryByParams(OrderSearchParams orderSearchParams) { - return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), orderSearchParams.queryWrapper()); + QueryWrapper queryWrapper = orderSearchParams.queryWrapper(); + queryWrapper.groupBy("o.id"); + queryWrapper.orderByDesc("o.id"); + return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), queryWrapper); + } + + @Override + public List queryExportOrder(OrderSearchParams orderSearchParams) { + return this.baseMapper.queryExportOrder(orderSearchParams.queryWrapper()); } @Override @@ -195,7 +202,7 @@ public class OrderServiceImpl extends ServiceImpl implements @OrderLogPoint(description = "'订单['+#orderSn+']取消,原因为:'+#reason", orderSn = "#orderSn") public Order cancel(String orderSn, String reason) { Order order = OperationalJudgment.judgment(this.getBySn(orderSn)); - if (order.getOrderType().equals(OrderTypeEnum.PINTUAN.name()) && !order.getOrderStatus().equals(OrderStatusEnum.UNDELIVERED.name())) { + if (order.getOrderPromotionType().equals(OrderPromotionTypeEnum.PINTUAN.name()) && !order.getOrderStatus().equals(OrderStatusEnum.UNDELIVERED.name())) { throw new ServiceException("未成团订单不可取消"); } if (CharSequenceUtil.equalsAny(order.getOrderStatus(), @@ -233,9 +240,7 @@ public class OrderServiceImpl extends ServiceImpl implements */ @Override public Order getBySn(String orderSn) { - QueryWrapper orderWrapper = new QueryWrapper<>(); - orderWrapper.eq("sn", orderSn); - return this.getOne(orderWrapper); + return this.getOne(new LambdaQueryWrapper().eq(Order::getSn, orderSn)); } @Override @@ -253,11 +258,13 @@ public class OrderServiceImpl extends ServiceImpl implements order.setPayStatus(PayStatusEnum.PAID.name()); order.setOrderStatus(OrderStatusEnum.PAID.name()); order.setReceivableNo(receivableNo); + order.setCanReturn(!PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod())); this.updateById(order); //记录订单流水 storeFlowService.payOrder(orderSn); + //发送订单已付款消息 OrderMessage orderMessage = new OrderMessage(); orderMessage.setOrderSn(order.getSn()); orderMessage.setPaymentMethod(paymentMethod); @@ -268,69 +275,24 @@ public class OrderServiceImpl extends ServiceImpl implements OrderLog orderLog = new OrderLog(orderSn, "-1", UserEnums.SYSTEM.getRole(), "系统操作", message); orderLogService.save(orderLog); - } @Override @OrderLogPoint(description = "'库存确认'", orderSn = "#orderSn") public void afterOrderConfirm(String orderSn) { Order order = this.getBySn(orderSn); - LambdaUpdateWrapper orderLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); - - //如果为虚拟订单-修改订单状态为待核验 - if (order.getOrderType().equals(OrderTypeEnum.FICTITIOUS.name())) { - //填写提货码 - String code = CommonUtil.getRandomNum(); - orderLambdaUpdateWrapper.eq(Order::getSn, orderSn); - orderLambdaUpdateWrapper.set(Order::getQrCode, code); - orderLambdaUpdateWrapper.set(Order::getOrderStatus, OrderStatusEnum.TAKE.name()); - orderLambdaUpdateWrapper.set(Order::getCanReturn, !PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod())); - - this.update(orderLambdaUpdateWrapper); - - OrderMessage orderMessage = new OrderMessage(); - orderMessage.setNewStatus(OrderStatusEnum.TAKE); - orderMessage.setOrderSn(order.getSn()); - this.sendUpdateStatusMessage(orderMessage); - } - //如果为商品订单-修改订单状态为待发货 - else { - orderLambdaUpdateWrapper.eq(Order::getSn, orderSn); - //拼团订单 - if (order.getOrderType().equals(OrderTypeEnum.PINTUAN.name()) && order.getPromotionId() != null) { - //校验拼团是否成团 对拼团结果进行处理 - this.checkPintuanOrder(order.getPromotionId(), order.getParentOrderSn()); + //判断是否为拼团订单,进行特殊处理 + //判断订单类型进行不同的订单确认操作 + if (order.getOrderPromotionType() != null && order.getOrderPromotionType().equals(OrderPromotionTypeEnum.PINTUAN.name())) { + this.checkPintuanOrder(order.getPromotionId(), order.getParentOrderSn()); + } else { + //判断订单类型 + if (order.getOrderType().equals(OrderTypeEnum.NORMAL.name())) { + normalOrderConfirm(orderSn); } else { - //普通订单直接修改为代发货状态 - orderLambdaUpdateWrapper.set(Order::getOrderStatus, OrderStatusEnum.UNDELIVERED.name()); - orderLambdaUpdateWrapper.set(Order::getCanReturn, !PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod())); - this.update(orderLambdaUpdateWrapper); - - OrderMessage orderMessage = new OrderMessage(); - orderMessage.setNewStatus(OrderStatusEnum.UNDELIVERED); - orderMessage.setOrderSn(order.getSn()); - this.sendUpdateStatusMessage(orderMessage); + virtualOrderConfirm(orderSn); } } - - // 发送当前商品购买完成的信息(用于更新商品数据) - List orderItems = orderItemService.getByOrderSn(orderSn); - List goodsCompleteMessageList = new ArrayList<>(); - for (OrderItem orderItem : orderItems) { - GoodsCompleteMessage goodsCompleteMessage = new GoodsCompleteMessage(); - goodsCompleteMessage.setGoodsId(orderItem.getGoodsId()); - goodsCompleteMessage.setSkuId(orderItem.getSkuId()); - goodsCompleteMessage.setBuyNum(orderItem.getNum()); - goodsCompleteMessage.setMemberId(order.getMemberId()); - goodsCompleteMessageList.add(goodsCompleteMessage); - } - if (!goodsCompleteMessageList.isEmpty()) { - String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.BUY_GOODS_COMPLETE.name(); - //发送订单变更mq消息 - rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goodsCompleteMessageList), RocketmqSendCallbackBuilder.commonCallback()); - } - - } @@ -371,8 +333,6 @@ public class OrderServiceImpl extends ServiceImpl implements this.updateById(order); //修改订单状态为已发送 this.updateStatus(orderSn, OrderStatusEnum.DELIVERED); - - //修改订单货物可以进行售后、投诉 orderItemService.update(new UpdateWrapper().eq(ORDER_SN_COLUMN, orderSn) .set("after_sale_status", OrderItemAfterSaleStatusEnum.NOT_APPLIED) @@ -382,8 +342,6 @@ public class OrderServiceImpl extends ServiceImpl implements orderMessage.setNewStatus(OrderStatusEnum.DELIVERED); orderMessage.setOrderSn(order.getSn()); this.sendUpdateStatusMessage(orderMessage); - - } else { throw new ServiceException(ResultCode.ORDER_DELIVER_ERROR); } @@ -399,30 +357,30 @@ public class OrderServiceImpl extends ServiceImpl implements } @Override - @OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#qrCode+']'", orderSn = "#orderSn") - public Order take(String orderSn, String qrCode) { - //是否可以查询到订单 - Order order = OperationalJudgment.judgment(this.getBySn(orderSn)); - //判断是否为虚拟订单 - if (!order.getOrderType().equals(OrderTypeEnum.FICTITIOUS.name())) { - throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); - } - //判断虚拟订单状态 - if (order.getOrderStatus().equals(OrderStatusEnum.TAKE.name())) { - //判断提货码是否正确\修改订单状态 - if (order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()) && qrCode.equals(order.getQrCode())) { - order.setOrderStatus(OrderStatusEnum.COMPLETED.name()); + @OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#verificationCode+']'", orderSn = "#orderSn") + public Order take(String orderSn, String verificationCode) { - this.updateById(order); + //获取订单信息 + Order order = this.getBySn(orderSn); + //检测虚拟订单信息 + checkVerificationOrder(order, verificationCode); + order.setOrderStatus(OrderStatusEnum.COMPLETED.name()); + //修改订单信息 + this.updateById(order); + //发送订单完成消息 + OrderMessage orderMessage = new OrderMessage(); + orderMessage.setNewStatus(OrderStatusEnum.COMPLETED); + orderMessage.setOrderSn(order.getSn()); + this.sendUpdateStatusMessage(orderMessage); + return order; + } - OrderMessage orderMessage = new OrderMessage(); - orderMessage.setNewStatus(OrderStatusEnum.COMPLETED); - orderMessage.setOrderSn(order.getSn()); - this.sendUpdateStatusMessage(orderMessage); - } - return order; - } - throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); + @Override + public Order getOrderByVerificationCode(String verificationCode) { + return this.getOne(new LambdaQueryWrapper() + .eq(Order::getOrderStatus, OrderStatusEnum.TAKE.name()) + .eq(Order::getStoreId, UserContext.getCurrentUser().getStoreId()) + .eq(Order::getVerificationCode, verificationCode)); } @Override @@ -442,6 +400,25 @@ public class OrderServiceImpl extends ServiceImpl implements orderMessage.setNewStatus(OrderStatusEnum.COMPLETED); orderMessage.setOrderSn(order.getSn()); this.sendUpdateStatusMessage(orderMessage); + + // 发送当前商品购买完成的信息(用于更新商品数据) + List orderItems = orderItemService.getByOrderSn(orderSn); + List goodsCompleteMessageList = new ArrayList<>(); + for (OrderItem orderItem : orderItems) { + GoodsCompleteMessage goodsCompleteMessage = new GoodsCompleteMessage(); + goodsCompleteMessage.setGoodsId(orderItem.getGoodsId()); + goodsCompleteMessage.setSkuId(orderItem.getSkuId()); + goodsCompleteMessage.setBuyNum(orderItem.getNum()); + goodsCompleteMessage.setMemberId(order.getMemberId()); + goodsCompleteMessageList.add(goodsCompleteMessage); + } + //发送商品购买消息 + if (!goodsCompleteMessageList.isEmpty()) { + String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.BUY_GOODS_COMPLETE.name(); + //发送订单变更mq消息 + rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goodsCompleteMessageList), RocketmqSendCallbackBuilder.commonCallback()); + } + } @Override @@ -484,7 +461,7 @@ public class OrderServiceImpl extends ServiceImpl implements queryWrapper.eq("o.delete_flag", false); queryWrapper.groupBy("o.id"); queryWrapper.orderByDesc("o.id"); - return orderMapper.queryByParams(PageUtil.initPage(pageVO), queryWrapper); + return this.baseMapper.queryByParams(PageUtil.initPage(pageVO), queryWrapper); } @Override @@ -519,6 +496,95 @@ public class OrderServiceImpl extends ServiceImpl implements } } + @Override + public void getBatchDeliverList(HttpServletResponse response, List logisticsName) { + ExcelWriter writer = ExcelUtil.getWriter(); + //Excel 头部 + ArrayList rows = new ArrayList<>(); + rows.add("订单编号"); + rows.add("物流公司"); + rows.add("物流编号"); + writer.writeHeadRow(rows); + + //存放下拉列表 ----店铺已选择物流公司列表 + String[] logiList = logisticsName.toArray(new String[]{}); + CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 200, 1, 1); + writer.addSelect(cellRangeAddressList, logiList); + + ServletOutputStream out = null; + try { + //设置公共属性,列表名称 + response.setContentType("application/vnd.ms-excel;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("批量发货导入模板", "UTF8") + ".xls"); + out = response.getOutputStream(); + writer.flush(out, true); + } catch (Exception e) { + log.error("获取待发货订单编号列表错误", e); + } finally { + writer.close(); + IoUtil.close(out); + } + + } + + @Override + public void batchDeliver(MultipartFile files) { + + InputStream inputStream = null; + List orderBatchDeliverDTOList = new ArrayList<>(); + try { + inputStream = files.getInputStream(); + // 2.应用HUtool ExcelUtil获取ExcelReader指定输入流和sheet + ExcelReader excelReader = ExcelUtil.getReader(inputStream); + // 可以加上表头验证 + // 3.读取第二行到最后一行数据 + List> read = excelReader.read(1, excelReader.getRowCount()); + for (List objects : read) { + OrderBatchDeliverDTO orderBatchDeliverDTO = new OrderBatchDeliverDTO(); + orderBatchDeliverDTO.setOrderSn(objects.get(0).toString()); + orderBatchDeliverDTO.setLogisticsName(objects.get(1).toString()); + orderBatchDeliverDTO.setLogisticsNo(objects.get(2).toString()); + orderBatchDeliverDTOList.add(orderBatchDeliverDTO); + } + } catch (Exception e) { + throw new ServiceException("文件读取失败"); + } + //循环检查是否符合规范 + checkBatchDeliver(orderBatchDeliverDTOList); + //订单批量发货 + for (OrderBatchDeliverDTO orderBatchDeliverDTO : orderBatchDeliverDTOList) { + this.delivery(orderBatchDeliverDTO.getOrderSn(), orderBatchDeliverDTO.getLogisticsNo(), orderBatchDeliverDTO.getLogisticsId()); + } + } + + /** + * 循环检查批量发货订单列表 + * + * @param list 待发货订单列表 + */ + private void checkBatchDeliver(List list) { + for (OrderBatchDeliverDTO orderBatchDeliverDTO : list) { + //查看订单号是否存在-是否是当前店铺的订单 + Order order = this.getOne(new LambdaQueryWrapper() + .eq(Order::getStoreId, UserContext.getCurrentUser().getStoreId()) + .eq(Order::getSn, orderBatchDeliverDTO.getOrderSn())); + if (order == null) { + throw new ServiceException("订单编号:'" + orderBatchDeliverDTO.getOrderSn() + " '不存在"); + } else if (order.getOrderStatus().equals(OrderStatusEnum.DELIVERED.name())) { + throw new ServiceException("订单编号:'" + orderBatchDeliverDTO.getOrderSn() + " '不能发货"); + } + //查看物流公司 + Logistics logistics = logisticsService.getOne(new LambdaQueryWrapper().eq(Logistics::getName, orderBatchDeliverDTO.getLogisticsName())); + if (logistics == null) { + throw new ServiceException("物流公司:'" + orderBatchDeliverDTO.getLogisticsName() + " '不存在"); + } else { + orderBatchDeliverDTO.setLogisticsId(logistics.getId()); + } + } + + + } + /** * 订单状态变更消息 * @@ -542,6 +608,14 @@ public class OrderServiceImpl extends ServiceImpl implements this.baseMapper.updateStatus(orderStatus.name(), orderSn); } + /** + * 检测拼团订单内容 + * 此方法用与订单确认 + * 判断拼团是否达到人数进行下一步处理 + * + * @param pintuanId 拼团活动ID + * @param parentOrderSn 拼团父订单编号 + */ private void checkPintuanOrder(String pintuanId, String parentOrderSn) { //拼团有效参数判定 if (CharSequenceUtil.isEmpty(parentOrderSn)) { @@ -560,8 +634,9 @@ public class OrderServiceImpl extends ServiceImpl implements TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, startTime, pintuanOrderMessage, - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PINTUAN_ORDER, (pintuanId + parentOrderSn)), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PINTUAN_ORDER, (pintuanId + parentOrderSn)), rocketmqCustomProperties.getPromotionTopic()); + this.timeTrigger.addDelay(timeTriggerMsg); } //拼团所需人数,小于等于 参团后的人数,则说明成团,所有订单成团 @@ -581,7 +656,7 @@ public class OrderServiceImpl extends ServiceImpl implements //寻找拼团的所有订单 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Order::getPromotionId, pintuanId) - .eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()) + .eq(Order::getOrderPromotionType, OrderPromotionTypeEnum.PINTUAN.name()) .eq(Order::getPayStatus, PayStatusEnum.PAID.name()); // 拼团sn=开团订单sn 或者 参团订单的开团订单sn queryWrapper.and(i -> i.eq(Order::getSn, parentOrderSn) @@ -592,17 +667,18 @@ public class OrderServiceImpl extends ServiceImpl implements /** * 根据提供的拼团订单列表更新拼团状态为拼团成功 + * 循环订单列表根据不同的订单类型进行确认订单 * * @param list 需要更新拼团状态为成功的拼团订单列表 */ private void pintuanOrderSuccess(List list) { - for (Order order : list) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Order::getId, order.getId()); - updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.UNDELIVERED.name()); - updateWrapper.set(Order::getCanReturn, !PaymentMethodEnum.BANK_TRANSFER.name().equals(order.getPaymentMethod())); - this.update(updateWrapper); - } + list.stream().forEach(order -> { + if (order.getOrderType().equals(OrderTypeEnum.VIRTUAL)) { + this.virtualOrderConfirm(order.getSn()); + } else if (order.getOrderType().equals(OrderTypeEnum.NORMAL)) { + this.normalOrderConfirm(order.getSn()); + } + }); } /** @@ -612,11 +688,6 @@ public class OrderServiceImpl extends ServiceImpl implements */ private void pintuanOrderFailed(List list) { for (Order order : list) { -// LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); -// updateWrapper.eq(Order::getId, order.getId()); -// updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.CANCELLED.name()); -// updateWrapper.set(Order::getCancelReason, "拼团人数不足,拼团失败!"); -// this.update(updateWrapper); try { this.cancel(order.getSn(), "拼团人数不足,拼团失败!"); } catch (Exception e) { @@ -642,7 +713,7 @@ public class OrderServiceImpl extends ServiceImpl implements BeanUtil.copyProperties(priceDetailDTO, order, "id"); order.setSn(SnowFlake.createStr("G")); order.setTradeSn(tradeDTO.getSn()); - order.setOrderType(OrderTypeEnum.GIFT.name()); + order.setOrderType(OrderPromotionTypeEnum.GIFT.name()); order.setOrderStatus(OrderStatusEnum.UNPAID.name()); order.setPayStatus(PayStatusEnum.UNPAID.name()); order.setDeliverStatus(DeliverStatusEnum.UNDELIVERED.name()); @@ -699,4 +770,97 @@ public class OrderServiceImpl extends ServiceImpl implements } } + /** + * 检查交易信息 + * + * @param tradeDTO 交易DTO + */ + private void checkTradeDTO(TradeDTO tradeDTO) { + //检测是否为拼团订单 + if (tradeDTO.getParentOrderSn() != null) { + //判断用户不能参与自己发起的拼团活动 + Order parentOrder = this.getBySn(tradeDTO.getParentOrderSn()); + if (parentOrder.getMemberId().equals(UserContext.getCurrentUser().getId())) { + throw new ServiceException("不能参与自己发起的拼团活动!"); + } + } + } + + /** + * 检查交易信息 + * + * @param order 订单 + */ + private void checkOrder(Order order) { + //订单类型为拼团订单,检测购买数量是否超过了限购数量 + if (OrderPromotionTypeEnum.PINTUAN.name().equals(order.getOrderPromotionType())) { + Pintuan pintuan = pintuanService.getPintuanById(order.getPromotionId()); + Integer limitNum = pintuan.getLimitNum(); + if (limitNum != 0 && order.getGoodsNum() > limitNum) { + throw new ServiceException("购买数量超过拼团活动限制数量"); + } + } + } + + /** + * 普通商品订单确认 + * 修改订单状态为待发货 + * 发送订单状态变更消息 + * + * @param orderSn 订单编号 + */ + private void normalOrderConfirm(String orderSn) { + //修改订单 + this.update(new LambdaUpdateWrapper() + .eq(Order::getSn, orderSn) + .set(Order::getOrderStatus, OrderStatusEnum.UNDELIVERED.name())); + //修改订单 + OrderMessage orderMessage = new OrderMessage(); + orderMessage.setNewStatus(OrderStatusEnum.UNDELIVERED); + orderMessage.setOrderSn(orderSn); + this.sendUpdateStatusMessage(orderMessage); + } + + /** + * 虚拟商品订单确认 + * 修改订单状态为待核验 + * 发送订单状态变更消息 + * + * @param orderSn 订单编号 + */ + private void virtualOrderConfirm(String orderSn) { + //修改订单 + this.update(new LambdaUpdateWrapper() + .eq(Order::getSn, orderSn) + .set(Order::getOrderStatus, OrderStatusEnum.TAKE.name())); + OrderMessage orderMessage = new OrderMessage(); + orderMessage.setNewStatus(OrderStatusEnum.TAKE); + orderMessage.setOrderSn(orderSn); + this.sendUpdateStatusMessage(orderMessage); + } + + /** + * 检测虚拟订单信息 + * + * @param order 订单 + * @param verificationCode 验证码 + */ + private void checkVerificationOrder(Order order, String verificationCode) { + //判断查询是否可以查询到订单 + if (order == null) { + throw new ServiceException(ResultCode.ORDER_NOT_EXIST); + } + //判断是否为虚拟订单 + else if (!order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name())) { + throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); + } + //判断虚拟订单状态 + else if (!order.getOrderStatus().equals(OrderStatusEnum.TAKE.name())) { + throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); + } + //判断验证码是否正确 + else if (!verificationCode.equals(order.getVerificationCode())) { + throw new ServiceException(ResultCode.ORDER_TAKE_ERROR); + } + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/ReceiptServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/ReceiptServiceImpl.java index 339566e9..087264ec 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/ReceiptServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/ReceiptServiceImpl.java @@ -13,7 +13,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,14 +26,9 @@ import org.springframework.transaction.annotation.Transactional; @Transactional public class ReceiptServiceImpl extends ServiceImpl implements ReceiptService { - //发票mapper - @Autowired - private ReceiptMapper receiptMapper; - - @Override public IPage getReceiptData(ReceiptSearchParams searchParams, PageVO pageVO) { - return receiptMapper.getReceipt(PageUtil.initPage(pageVO), searchParams.wrapper()); + return this.baseMapper.getReceipt(PageUtil.initPage(pageVO), searchParams.wrapper()); } @Override 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 485db40f..b4e49d35 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 @@ -74,7 +74,9 @@ public class TradeServiceImpl extends ServiceImpl implements pointPretreatment(tradeDTO); //优惠券预处理 couponPretreatment(tradeDTO); + //添加交易 this.save(trade); + //添加订单 orderService.intoDB(tradeDTO); //写入缓存,给消费者调用 cache.put(key, tradeDTO); @@ -123,7 +125,7 @@ public class TradeServiceImpl extends ServiceImpl implements throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } boolean result = memberService.updateMemberPoint(tradeDTO.getPriceDetailDTO(). - getPayPoint().longValue(), 0, tradeDTO.getMemberId(), + getPayPoint().longValue(), false, tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { diff --git a/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/RechargeServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/RechargeServiceImpl.java index 6114d3c7..c0b8684a 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/RechargeServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/RechargeServiceImpl.java @@ -18,7 +18,6 @@ import cn.lili.modules.order.trade.service.RechargeService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,9 +34,6 @@ import java.util.Date; @Transactional public class RechargeServiceImpl extends ServiceImpl implements RechargeService { - //预存款 - @Autowired - private RechargeMapper rechargeMapper; //会员预存款 @Autowired private MemberWalletService memberWalletService; @@ -51,7 +47,7 @@ public class RechargeServiceImpl extends ServiceImpl i //整合充值订单数据 Recharge recharge = new Recharge(sn, authUser.getId(), authUser.getUsername(), price); //添加预存款充值账单 - this.rechargeMapper.insert(recharge); + this.save(recharge); //返回预存款 return recharge; } @@ -75,20 +71,20 @@ public class RechargeServiceImpl extends ServiceImpl i queryWrapper.between("pay_time", start, end); } //查询返回数据 - return this.rechargeMapper.selectPage(PageUtil.initPage(page), queryWrapper); + return this.page(PageUtil.initPage(page), queryWrapper); } @Override public void paySuccess(String sn, String receivableNo) { //根据sn获取支付账单 - Recharge recharge = this.rechargeMapper.selectOne(new QueryWrapper().eq("recharge_sn", sn)); + Recharge recharge = this.getOne(new QueryWrapper().eq("recharge_sn", sn)); //如果支付账单不为空则进行一下逻辑 if (recharge != null) { //将此账单支付状态更改为已支付 recharge.setPayStatus(PayStatusEnum.PAID.name()); recharge.setReceivableNo(receivableNo); //执行保存操作 - this.rechargeMapper.updateById(recharge); + this.updateById(recharge); //增加预存款余额 memberWalletService.increase(recharge.getRechargeMoney(), recharge.getMemberId(), "会员余额充值,充值单号为:" + recharge.getRechargeSn(), DepositServiceTypeEnum.WALLET_RECHARGE.name()); } @@ -96,7 +92,7 @@ public class RechargeServiceImpl extends ServiceImpl i @Override public Recharge getRecharge(String sn) { - Recharge recharge = this.rechargeMapper.selectOne(new QueryWrapper().eq("recharge_sn", sn)); + Recharge recharge = this.getOne(new QueryWrapper().eq("recharge_sn", sn)); if (recharge != null) { return recharge; } diff --git a/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/WalletLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/WalletLogServiceImpl.java index a1b69f8e..9aa465c4 100644 --- a/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/WalletLogServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/trade/serviceimpl/WalletLogServiceImpl.java @@ -10,7 +10,6 @@ import cn.lili.modules.order.trade.service.WalletLogService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -26,9 +25,6 @@ import java.util.Date; @Transactional public class WalletLogServiceImpl extends ServiceImpl implements WalletLogService { - @Autowired - private WalletLogMapper walletLogMapper; - @Override public IPage depositLogPage(PageVO page, DepositQueryVO depositQueryVO) { //构建查询条件 @@ -44,6 +40,6 @@ public class WalletLogServiceImpl extends ServiceImpl hints = new HashMap(3); - hints.put(EncodeHintType.ERROR_CORRECTION, errorLevel); - hints.put(EncodeHintType.MARGIN, margin); - hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); - - try { - BitMatrix bitMatrix = (new MultiFormatWriter()).encode(contents, barcodeFormat, width, height, hints); - MatrixToImageWriter.writeToStream(bitMatrix, format, outputStream); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (outputStream != null) { - outputStream.close(); - } - } - - } - /** * @param srcImgFilePath 要解码的图片地址 * @return {Result} @@ -105,7 +76,7 @@ public class QrCodeKit { throw new IllegalArgumentException("Could not decode image."); } } catch (Exception e) { - e.printStackTrace(); + log.error("图片解码错误",e); } return result; } @@ -123,7 +94,7 @@ public class QrCodeKit { try { bool = ImageIO.write(bufImg, format, new File(saveImgFilePath)); } catch (Exception e) { - e.printStackTrace(); + log.error("将BufferedImage对象写入文件错误",e); } return bool; } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/RsaKit.java b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/RsaKit.java index f6d5f06a..f205e4c3 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/RsaKit.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/core/kit/RsaKit.java @@ -2,6 +2,7 @@ package cn.lili.modules.payment.kit.core.kit; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; @@ -19,6 +20,7 @@ import java.util.Map; * * @author */ +@Slf4j public class RsaKit { /** @@ -77,29 +79,7 @@ public class RsaKit { RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2); return (RSAPublicKey) keyFactory.generatePublic(keySpec); } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * 使用模和指数生成RSA私钥 - * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA - * /None/NoPadding】 - * - * @param modulus 模 - * @param exponent 指数 - * @return {@link RSAPrivateKey} - */ - public static RSAPrivateKey getPrivateKey(String modulus, String exponent) { - try { - BigInteger b1 = new BigInteger(modulus); - BigInteger b2 = new BigInteger(exponent); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2); - return (RSAPrivateKey) keyFactory.generatePrivate(keySpec); - } catch (Exception e) { - e.printStackTrace(); + log.error("使用模和指数生成RSA公钥错误",e); return null; } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/bankTransfer/BankTransferPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/bankTransfer/BankTransferPlugin.java index 77acc875..a42e97b3 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/bankTransfer/BankTransferPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/bankTransfer/BankTransferPlugin.java @@ -37,7 +37,7 @@ public class BankTransferPlugin implements Payment { refundLog.setIsRefund(true); refundLogService.save(refundLog); } catch (Exception e) { - e.printStackTrace(); + log.error("线下收款错误",e); } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wallet/WalletPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wallet/WalletPlugin.java index 16be59f3..6caca9ef 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wallet/WalletPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wallet/WalletPlugin.java @@ -90,7 +90,7 @@ public class WalletPlugin implements Payment { refundLog.setIsRefund(true); refundLogService.save(refundLog); } catch (Exception e) { - e.printStackTrace(); + log.error("订单取消错误",e); } } @@ -114,7 +114,7 @@ public class WalletPlugin implements Payment { refundLog.setIsRefund(true); refundLogService.save(refundLog); } catch (Exception e) { - e.printStackTrace(); + log.error("退款失败",e); } } diff --git a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java index e08484ca..f8222308 100644 --- a/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java +++ b/framework/src/main/java/cn/lili/modules/payment/kit/plugin/wechat/WechatPlugin.java @@ -137,7 +137,7 @@ public class WechatPlugin implements Payment { return ResultUtil.data(JSONUtil.toJsonStr(response.getBody())); } catch (Exception e) { - e.printStackTrace(); + log.error("微信H5支付错误",e); throw new ServiceException(ResultCode.PAY_ERROR); } } @@ -558,7 +558,7 @@ public class WechatPlugin implements Payment { refundLogService.save(refundLog); } } catch (Exception e) { - e.printStackTrace(); + log.error("微信退款失败",e); } } @@ -573,7 +573,7 @@ public class WechatPlugin implements Payment { WechatPaymentSetting wechatPaymentSetting = JSONUtil.toBean(systemSetting.getSettingValue(), WechatPaymentSetting.class); return wechatPaymentSetting; } catch (Exception e) { - e.printStackTrace(); + log.error("微信支付暂不支持",e); throw new ServiceException(ResultCode.PAY_NOT_SUPPORT); } } @@ -624,7 +624,7 @@ public class WechatPlugin implements Payment { } return PayKit.getCertificate(publicCert); } catch (Exception e) { - e.printStackTrace(); + log.error("证书获取失败",e); } return null; } diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java index ffe3c787..844f760b 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @@ -38,6 +39,7 @@ import java.util.stream.Collectors; * @author Chopper * @date 2020/11/17 3:46 下午 */ +@Slf4j @Service @Transactional public class AdminUserServiceImpl extends ServiceImpl implements AdminUserService { @@ -114,7 +116,7 @@ public class AdminUserServiceImpl extends ServiceImpl implements DepartmentRoleService { - @Autowired - private DepartmentRoleMapper departmentRoleMapper; + @Override public List listByDepartmentId(String departmentId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("department_id", departmentId); - return departmentRoleMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @Override public void updateByDepartmentId(String departmentId, List departmentRoles) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("department_id", departmentId); - departmentRoleMapper.delete(queryWrapper); + this.remove(queryWrapper); this.saveBatch(departmentRoles); } @@ -44,6 +41,6 @@ public class DepartmentRoleServiceImpl extends ServiceImpl ids) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("department_id", ids); - departmentRoleMapper.delete(queryWrapper); + this.remove(queryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentServiceImpl.java index 42d54d30..990f5229 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/DepartmentServiceImpl.java @@ -11,7 +11,7 @@ import cn.lili.modules.permission.service.DepartmentRoleService; import cn.lili.modules.permission.service.DepartmentService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,6 +25,7 @@ import java.util.List; * @author Chopper * @date 2020/11/17 3:47 下午 */ +@Slf4j @Service @Transactional public class DepartmentServiceImpl extends ServiceImpl implements DepartmentService { @@ -65,7 +66,7 @@ public class DepartmentServiceImpl extends ServiceImpl implements MenuService { - //菜单 - @Autowired - private MenuMapper menuMapper; //菜单角色 @Autowired private RoleMenuService roleMenuService; @@ -61,13 +59,13 @@ public class MenuServiceImpl extends ServiceImpl implements Me if (authUser.getIsSuper()) { return this.tree(); } - List userMenus = menuMapper.findByUserId(authUser.getId()); + List userMenus = this.baseMapper.findByUserId(authUser.getId()); return this.tree(userMenus); } @Override public List findUserList(String userId) { - return menuMapper.findByUserId(userId); + return this.baseMapper.findByUserId(userId); } @Override @@ -90,7 +88,7 @@ public class MenuServiceImpl extends ServiceImpl implements Me queryWrapper.like("title", title); } queryWrapper.orderByDesc("sort_order"); - return menuMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @@ -100,7 +98,7 @@ public class MenuServiceImpl extends ServiceImpl implements Me List menus = this.list(); return tree(menus); } catch (Exception e) { - e.printStackTrace(); + log.error("菜单树错误",e); } return null; } diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java index 5e28fc3b..cd49e058 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleMenuServiceImpl.java @@ -7,11 +7,11 @@ import cn.lili.modules.permission.mapper.RoleMenuMapper; import cn.lili.modules.permission.service.RoleMenuService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import groovy.util.logging.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; /** @@ -20,22 +20,20 @@ import java.util.List; * @author Chopper * @date 2020/11/22 11:43 */ +@Slf4j @Service @Transactional(rollbackFor = Exception.class) public class RoleMenuServiceImpl extends ServiceImpl implements RoleMenuService { //菜单 - @Autowired + @Resource private MenuMapper menuMapper; - //角色菜单 - @Autowired - private RoleMenuMapper roleMenuMapper; @Override public List findByRoleId(String roleId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("role_id", roleId); - return roleMenuMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @Override @@ -52,7 +50,7 @@ public class RoleMenuServiceImpl extends ServiceImpl i //重新保存角色菜单关系 this.saveBatch(roleMenus); } catch (Exception e) { - e.printStackTrace(); + log.error("修改用户权限错误",e); } } @@ -61,13 +59,13 @@ public class RoleMenuServiceImpl extends ServiceImpl i //删除 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("role_id", roleId); - roleMenuMapper.delete(queryWrapper); + this.remove(queryWrapper); } @Override public void deleteRoleMenu(List roleId) { //删除 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("role_id", roleId); - roleMenuMapper.delete(queryWrapper); + this.remove(queryWrapper); } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/SystemLogServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/SystemLogServiceImpl.java index 25aeaffc..bf5e55b2 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/SystemLogServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/SystemLogServiceImpl.java @@ -70,9 +70,6 @@ public class SystemLogServiceImpl implements SystemLogService { } //时间有效性判定 if (searchVo.getConvertStartDate() != null && searchVo.getConvertEndDate() != null) { - System.out.println(DateUtil.toString(searchVo.getConvertStartDate(), DateUtil.STANDARD_FORMAT)); - System.out.println(DateUtil.toString(searchVo.getConvertEndDate(), DateUtil.STANDARD_FORMAT)); - //大于方法 Criteria gt = Criteria.where("createTime").gt(searchVo.getConvertStartDate()); //小于方法 diff --git a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/UserRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/UserRoleServiceImpl.java index 434b387e..8046084b 100644 --- a/framework/src/main/java/cn/lili/modules/permission/serviceimpl/UserRoleServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/permission/serviceimpl/UserRoleServiceImpl.java @@ -22,14 +22,12 @@ import java.util.List; @Service @Transactional public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { - @Autowired - private UserRoleMapper userRoleMapper; @Override public List listByUserId(String userId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); - return userRoleMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @Override @@ -46,7 +44,7 @@ public class UserRoleServiceImpl extends ServiceImpl i //删除 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); - userRoleMapper.delete(queryWrapper); + this.remove(queryWrapper); //保存 this.saveBatch(userRoles); diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Coupon.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Coupon.java index ae410350..9c9739e0 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Coupon.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Coupon.java @@ -20,7 +20,7 @@ import javax.persistence.Table; @Entity @Table(name = "li_coupon") @TableName("li_coupon") -@ApiModel(value = "优惠券活动实体类") +@ApiModel(value = "优惠券实体类") public class Coupon extends BasePromotion { @@ -35,7 +35,7 @@ public class Coupon extends BasePromotion { * * @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum */ - @ApiModelProperty(value = "活动类型") + @ApiModelProperty(value = "优惠券类型") private String couponType; /** @@ -81,4 +81,14 @@ public class Coupon extends BasePromotion { @ApiModelProperty(value = "消费门槛") private Double consumeThreshold; + /** + * @see cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum + * + */ + @ApiModelProperty(value = "时间范围类型") + private String rangeDayType; + + @ApiModelProperty(value = "有效期") + private Integer effectiveDays; + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java new file mode 100644 index 00000000..a91fff96 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivity.java @@ -0,0 +1,45 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.modules.promotion.entity.dto.BasePromotion; +import cn.lili.modules.promotion.entity.enums.CouponActivitySendTypeEnum; +import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +/** + * 优惠券活动实体类 + * + * @author Bulbasaur + * @date 2020-03-19 10:44 上午 + */ +@Data +@Entity +@Table(name = "li_coupon_activity") +@TableName("li_coupon_activity") +@ApiModel(value = "优惠券活动实体类") +public class CouponActivity extends BasePromotion { + + /** + * @see CouponActivityTypeEnum + */ + @NotNull(message = "优惠券活动类型不能为空") + @ApiModelProperty(value = "优惠券活动类型", allowableValues = "REGISTERED:新人赠券,SPECIFY:精确发券") + private String couponActivityType; + + /** + * @see CouponActivitySendTypeEnum + */ + @NotNull(message = "请选择活动范围") + @ApiModelProperty(value = "活动范围", allowableValues = "ALL:全部会员,DESIGNATED:指定会员") + private String activityScope; + + @ApiModelProperty(value = "活动范围详情,只有精准发券使用") + private String activityScopeInfo; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java new file mode 100644 index 00000000..0bb06e67 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/CouponActivityItem.java @@ -0,0 +1,35 @@ +package cn.lili.modules.promotion.entity.dos; + +import cn.lili.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * 优惠券活动实体类 + * + * @author Bulbasaur + * @date 2020-03-19 10:44 上午 + */ +@Data +@Entity +@Table(name = "li_coupon_activity_item") +@TableName("li_coupon_activity_item") +@ApiModel(value = "优惠券活动-优惠券关联实体类") +public class CouponActivityItem extends BaseEntity { + + @ApiModelProperty(value = "优惠券活动ID") + private String activityId; + + @ApiModelProperty(value = "优惠券ID") + private String couponId; + + @ApiModelProperty(value = "优惠券数量") + private Integer num; + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCoupon.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCoupon.java index 62028958..de6f5eb0 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCoupon.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/MemberCoupon.java @@ -1,6 +1,10 @@ package cn.lili.modules.promotion.entity.dos; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.lili.base.BaseEntity; +import cn.lili.modules.promotion.entity.enums.CouponRangeDayEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; @@ -114,14 +118,13 @@ public class MemberCoupon extends BaseEntity { setScopeId(coupon.getScopeId()); setCouponType(coupon.getCouponType()); setStartTime(coupon.getStartTime()); - setEndTime(coupon.getEndTime()); + setGetType(coupon.getGetType()); setStoreCommission(coupon.getStoreCommission()); + if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { + setEndTime(coupon.getEndTime()); + } else { + setEndTime(DateUtil.endOfDay(DateUtil.offset(new DateTime(), DateField.DAY_OF_YEAR, (coupon.getEffectiveDays() - 1)))); + } } - - public boolean canUse() { - return this.getMemberCouponStatus().equals(MemberCouponStatusEnum.NEW.name()); - } - - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java index 55b154eb..2f00487e 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java @@ -1,11 +1,16 @@ package cn.lili.modules.promotion.entity.dos; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.lili.modules.promotion.entity.dto.BasePromotion; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NoArgsConstructor; import javax.persistence.Entity; import javax.persistence.Table; @@ -13,7 +18,7 @@ import javax.validation.constraints.NotNull; import java.util.Date; /** - * 限时抢购实体类 + * 秒杀活动实体类 * * @author Chopper * @date 2020-03-19 10:44 上午 @@ -22,7 +27,8 @@ import java.util.Date; @Entity @Table(name = "li_seckill") @TableName("li_seckill") -@ApiModel(value = "限时抢购活动") +@ApiModel(value = "秒杀活动活动") +@NoArgsConstructor public class Seckill extends BasePromotion { private static final long serialVersionUID = -9116425737163730836L; @@ -44,4 +50,25 @@ public class Seckill extends BasePromotion { */ @ApiModelProperty(value = "商家id集合以逗号分隔") private String storeIds; + + @ApiModelProperty(value = "商品数量") + private Integer goodsNum; + + public Seckill(int day,String hours,String seckillRule){ + //默认创建*天后的秒杀活动 + DateTime dateTime= DateUtil.beginOfDay(DateUtil.offset(new DateTime(), DateField.DAY_OF_YEAR, day)); + this.applyEndTime=dateTime; + this.hours=hours; + this.seckillRule=seckillRule; + this.goodsNum=0; + + //BasePromotion + setStoreName("platform"); + setStoreId("platform"); + setPromotionName(DateUtil.formatDate(dateTime)+" 秒杀活动"); + setStartTime(dateTime); + setEndTime(DateUtil.endOfDay(dateTime)); + setPromotionStatus(PromotionStatusEnum.NEW.name()); + + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/SeckillApply.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/SeckillApply.java index e21b3505..754e0c4c 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/SeckillApply.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/SeckillApply.java @@ -13,7 +13,7 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; /** - * 限时抢购申请实体类 + * 秒杀活动申请实体类 * * @author Chopper * @date 2020-03-19 10:44 上午 @@ -22,7 +22,7 @@ import javax.validation.constraints.NotNull; @Entity @Table(name = "li_seckill_apply") @TableName("li_seckill_apply") -@ApiModel(value = "限时抢购申请") +@ApiModel(value = "秒杀活动申请") public class SeckillApply extends BaseEntity { private static final long serialVersionUID = 5440164641970820989L; diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java new file mode 100644 index 00000000..888edc6e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/CouponActivityDTO.java @@ -0,0 +1,26 @@ +package cn.lili.modules.promotion.entity.dto; + +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.beans.factory.annotation.Required; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * 优惠券活动DTO + * + * @author Bulbasaur + * @date: 2021/5/21 7:16 下午 + */ +@Data +public class CouponActivityDTO extends CouponActivity { + + @ApiModelProperty(value = "优惠券列表") + private List couponActivityItems; + + @ApiModelProperty(value = "会员列表") + private List memberDTOS; +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dto/MemberDTO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/MemberDTO.java new file mode 100644 index 00000000..c7d40695 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dto/MemberDTO.java @@ -0,0 +1,22 @@ +package cn.lili.modules.promotion.entity.dto; + +import lombok.Data; + +/** + * 会员dto + * + * @author Chopper + * @version v1.0 + * 2021-06-18 11:30 + */ +@Data +public class MemberDTO { + /** + * 会员昵称 + */ + private String nickName; + /** + * id + */ + private String id; +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivitySendTypeEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivitySendTypeEnum.java new file mode 100644 index 00000000..29faba67 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivitySendTypeEnum.java @@ -0,0 +1,23 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 优惠券活动发送类型枚举 + * + * @author Bulbasaur + * @date: 2021/5/20 5:47 下午 + */ +public enum CouponActivitySendTypeEnum { + + ALL("全部会员"), + DESIGNATED("指定会员"); + + private final String description; + + CouponActivitySendTypeEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivityTypeEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivityTypeEnum.java new file mode 100644 index 00000000..323d38f7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponActivityTypeEnum.java @@ -0,0 +1,23 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 优惠券活动类型枚举 + * + * @author Bulbasaur + * @date: 2021/5/20 5:47 下午 + */ +public enum CouponActivityTypeEnum { + + REGISTERED("新人赠券"), + SPECIFY("精确发券"); + + private final String description; + + CouponActivityTypeEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponRangeDayEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponRangeDayEnum.java new file mode 100644 index 00000000..d67aa29d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/CouponRangeDayEnum.java @@ -0,0 +1,27 @@ +package cn.lili.modules.promotion.entity.enums; + +/** + * 优惠券时间范围枚举 + * + * @author Bulbasaur + * @date: 2021/5/24 8:31 上午 + */ +public enum CouponRangeDayEnum { + + /** + * 枚举 + */ + FIXEDTIME("固定时间"), DYNAMICTIME("动态时间"); + + private final String description; + + CouponRangeDayEnum(String str) { + this.description = str; + } + + public String description() { + return description; + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionTypeEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionTypeEnum.java index 2a346080..e7e2a883 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionTypeEnum.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/PromotionTypeEnum.java @@ -11,7 +11,13 @@ public enum PromotionTypeEnum { /** * 促销枚举 */ - PINTUAN("拼团"), SECKILL("秒杀"), COUPON("优惠券"), FULL_DISCOUNT("满减"), POINTS_GOODS("积分商品"); + PINTUAN("拼团"), + SECKILL("秒杀"), + COUPON("优惠券"), + FULL_DISCOUNT("满减"), + POINTS_GOODS("积分商品"), + COUPON_ACTIVITY("优惠券活动") + ; /** * 拼团秒杀拥有独立库存,如果其他促销也有独立库存涉及库存扣减的,请添加在下方 diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/SeckillApplyStatusEnum.java b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/SeckillApplyStatusEnum.java index d243df5a..0479580e 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/enums/SeckillApplyStatusEnum.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/enums/SeckillApplyStatusEnum.java @@ -1,7 +1,7 @@ package cn.lili.modules.promotion.entity.enums; /** - * 限时抢购状态枚举 + * 秒杀活动状态枚举 * * @author paulG * @date 2020/8/26 @@ -9,7 +9,7 @@ package cn.lili.modules.promotion.entity.enums; public enum SeckillApplyStatusEnum { /** - * 当前店铺对当前限时抢购的申请状态 + * 当前店铺对当前秒杀活动的申请状态 */ APPLIED("已经申请过"), NOT_APPLY("未报名"), EXPIRE("过期的"); diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityItemVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityItemVO.java new file mode 100644 index 00000000..da003d29 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityItemVO.java @@ -0,0 +1,32 @@ +package cn.lili.modules.promotion.entity.vos; + +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 优惠券活动的优惠券VO + * + * @author Bulbasaur + * @date: 2021/6/18 11:00 上午 + */ +@Data +public class CouponActivityItemVO extends CouponActivityItem { + + @ApiModelProperty(value = "优惠券名称") + private String couponName; + + @ApiModelProperty(value = "面额") + private Double price; + + /** + * POINT("打折"), PRICE("减免现金"); + * + * @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum + */ + @ApiModelProperty(value = "优惠券类型") + private String couponType; + + @ApiModelProperty(value = "折扣") + private Double couponDiscount; +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java new file mode 100644 index 00000000..0a8a9d26 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/CouponActivityVO.java @@ -0,0 +1,28 @@ +package cn.lili.modules.promotion.entity.vos; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 优惠券活动VO + * + * @author Bulbasaur + * @date: 2021/5/21 7:01 下午 + */ +@Data +@NoArgsConstructor +public class CouponActivityVO extends CouponActivity { + + @ApiModelProperty(value = "优惠券活动下的优惠券列表") + private List couponActivityItems; + + public CouponActivityVO(CouponActivity couponActivity, List couponActivityItemVOS) { + BeanUtil.copyProperties(couponActivity, this); + this.couponActivityItems = couponActivityItemVOS; + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillApplyVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillApplyVO.java index d351d4d2..ca07f14b 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillApplyVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillApplyVO.java @@ -5,7 +5,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** - * 限时抢购申请视图对象 + * 秒杀活动申请视图对象 * * @author paulG * @date 2020/8/21 diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillGoodsVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillGoodsVO.java index 238c5cdb..011c9e04 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillGoodsVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillGoodsVO.java @@ -6,7 +6,7 @@ import lombok.Data; import java.io.Serializable; /** - * 限时抢购商品视图对象 + * 秒杀活动商品视图对象 * * @author paulG * @date 2020/8/26 diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillSearchParams.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillSearchParams.java index 04838e41..063921b7 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillSearchParams.java @@ -17,7 +17,7 @@ import java.util.Date; import java.util.regex.Pattern; /** - * 限时抢购查询通用类 + * 秒杀活动查询通用类 * * @author paulG * @date 2020/8/21 @@ -27,7 +27,7 @@ public class SeckillSearchParams implements Serializable { private static final long serialVersionUID = -4052716630253333681L; - @ApiModelProperty(value = "限时抢购活动编号") + @ApiModelProperty(value = "秒杀活动活动编号") private String seckillId; @ApiModelProperty(value = "活动名称") diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillTimelineVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillTimelineVO.java index 1c8a7ae1..b03e9fd6 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillTimelineVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillTimelineVO.java @@ -7,7 +7,7 @@ import java.io.Serializable; import java.util.List; /** - * 限时抢购时刻视图对象 + * 秒杀活动时刻视图对象 * * @author paulG * @date 2020/8/27 @@ -26,7 +26,7 @@ public class SeckillTimelineVO implements Serializable { @ApiModelProperty(value = "距离本组活动开始的时间,秒为单位。如果活动的开始时间是10点,服务器时间为8点,距离开始还有多少时间") private Long distanceStartTime; - @ApiModelProperty(value = "本组活动内的限时抢购商品列表") + @ApiModelProperty(value = "本组活动内的秒杀活动商品列表") private List seckillGoodsList; } diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillVO.java b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillVO.java index 6191c84d..10c1246d 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillVO.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/vos/SeckillVO.java @@ -1,19 +1,14 @@ package cn.lili.modules.promotion.entity.vos; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.DateUtil; import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import java.util.Arrays; -import java.util.Date; import java.util.List; /** - * 限时抢购视图对象 + * 秒杀活动视图对象 * * @author paulG * @date 2020/8/20 @@ -30,60 +25,8 @@ public class SeckillVO extends Seckill { private String seckillApplyStatus; /** - * 当前限时抢购下所有的秒杀申请信息 + * 当前秒杀活动下所有的秒杀申请信息 */ private List seckillApplyList; - /** - * 检查当前时间 - */ - public void checkTime() { - String[] timeRange = this.getHours().split(","); - int[] hoursSored = Arrays.stream(timeRange).mapToInt(Integer::parseInt).toArray(); - Arrays.sort(hoursSored); - int lastTime = 0; - for (int s : hoursSored) { - if (lastTime == s) { - throw new ServiceException("抢购区间的值不能重复"); - } else { - lastTime = s; - } - - if (s < 0 || s > 23) { - throw new ServiceException("抢购区间必须在0点到23点的整点时刻"); - } - } - - // 活动开始时间 - long startTime = this.getStartTime().getTime() / 1000; - // 报名截止时间 - long applyEndTime = this.getApplyEndTime().getTime() / 1000; - - int timeHour = hoursSored[0]; - int endTimeHour = hoursSored[hoursSored.length - 1]; - //获取活动开始当天0点的时间 - String startDate = DateUtil.toString(startTime, DateUtil.STANDARD_DATE_FORMAT) + " " + (timeHour > 10 ? timeHour : "0" + timeHour) + ":00:00"; - long startDayTime = cn.hutool.core.date.DateUtil.parse(startDate, DateUtil.STANDARD_FORMAT).getTime() / 1000; - // 结束时间 - String endDate = DateUtil.toString(startTime, DateUtil.STANDARD_DATE_FORMAT) + " " + (endTimeHour > 10 ? endTimeHour : "0" + endTimeHour) + ":59:00"; - long endDayTime = cn.hutool.core.date.DateUtil.parse(endDate, DateUtil.STANDARD_FORMAT).getTime() / 1000; - //活动时间小于当天开始时间 - if (startDayTime < DateUtil.startOfTodDay()) { - throw new ServiceException("活动时间不能小于当前时间"); - } - - //报名截止时间小于当前时间 - if (applyEndTime < DateUtil.getDateline()) { - throw new ServiceException("报名截止时间不能小于当前时间"); - } - - //报名截止时间大于活动开始当天的起始时间 - if (applyEndTime >= startDayTime) { - throw new ServiceException("报名截止时间不能大于等于活动开始时间"); - } - - this.setStartTime(new Date(startDayTime * 1000)); - this.setEndTime(new Date(endDayTime * 1000)); - } - } diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java new file mode 100644 index 00000000..ec251625 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityItemMapper.java @@ -0,0 +1,21 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * 优惠券活动 + * @author Bulbasaur + * @date: 2021/5/20 6:11 下午 + * + */ +public interface CouponActivityItemMapper extends BaseMapper { + + @Select("SELECT cai.*,c.coupon_name,c.price,c.coupon_type,c.coupon_discount FROM li_coupon_activity_item cai INNER JOIN li_coupon c ON cai.coupon_id = c.id WHERE cai.activity_id= #{activityId} ") + List getCouponActivityItemListVO(String activityId); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityMapper.java new file mode 100644 index 00000000..256e78e4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/CouponActivityMapper.java @@ -0,0 +1,15 @@ +package cn.lili.modules.promotion.mapper; + +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 优惠券活动 + * @author Bulbasaur + * @date: 2021/5/20 6:11 下午 + * + */ +public interface CouponActivityMapper extends BaseMapper { + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillApplyMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillApplyMapper.java index 45eb1ce6..f3d0fa47 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillApplyMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillApplyMapper.java @@ -4,7 +4,7 @@ import cn.lili.modules.promotion.entity.dos.SeckillApply; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** - * 限时抢购申请数据处理层 + * 秒杀活动申请数据处理层 * * @author Chopper * @date 2020/8/21 diff --git a/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillMapper.java b/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillMapper.java index 1ffae1f8..9491fc6d 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillMapper.java +++ b/framework/src/main/java/cn/lili/modules/promotion/mapper/SeckillMapper.java @@ -2,13 +2,16 @@ package cn.lili.modules.promotion.mapper; import cn.lili.modules.promotion.entity.dos.Seckill; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Update; /** - * 限时抢购数据处理层 + * 秒杀活动数据处理层 * * @author Chopper * @date 2020/8/21 */ public interface SeckillMapper extends BaseMapper { + @Update("UPDATE li_seckill SET goods_num =( SELECT count( id ) FROM li_seckill_apply WHERE seckill_id = #{seckillId} ) WHERE id = #{seckillId}") + void updateSeckillGoodsNum(String seckillId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java new file mode 100644 index 00000000..f85206dc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityItemService.java @@ -0,0 +1,31 @@ +package cn.lili.modules.promotion.service; + +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 优惠券活动-优惠券业务层 + * + * @author Bulbasaur + * @date: 2021/5/20 6:10 下午 + */ +public interface CouponActivityItemService extends IService { + + /** + * 获取优惠券活动关联优惠券列表 + * + * @param activityId 优惠券活动ID + * @return 优惠券关联优惠券列表 + */ + List getCouponActivityList(String activityId); + /** + * 获取优惠券活动关联优惠券列表VO + * + * @param activityId 优惠券活动ID + * @return 优惠券关联优惠券列表 + */ + List getCouponActivityItemListVO(String activityId); +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java new file mode 100644 index 00000000..7b5fd0d4 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponActivityService.java @@ -0,0 +1,63 @@ +package cn.lili.modules.promotion.service; + +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dto.CouponActivityDTO; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.entity.vos.CouponActivityVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 优惠券活动业务层 + * + * @author Bulbasaur + * @date: 2021/5/20 6:10 下午 + */ +public interface CouponActivityService extends IService { + + /** + * 创建优惠券活动--精准发券、新人赠券 + * + * @param couponActivityDTO 优惠券活动DTO + */ + CouponActivityDTO addCouponActivity(CouponActivityDTO couponActivityDTO); + + /** + * 修改优惠券活动--精准发券、新人赠券 + * + * @param couponActivityDTO 优惠券活动DTO + */ + CouponActivityDTO updateCouponActivity(CouponActivityDTO couponActivityDTO); + + /** + * 获取优惠券活动VO + * 包含优惠券活动信息以及优惠券关联优惠券列表 + * + * @param couponActivityId 优惠券活动ID + * @return 优惠券VO + */ + CouponActivityVO getCouponActivityVO(String couponActivityId); + + /** + * 精准发券 + * + * @param couponActivityId 优惠券活动ID + */ + void specify(String couponActivityId); + + /** + * 注册赠券 + * + * @param couponActivityList 优惠券活动 + * @param member 会员 + */ + void registered(List couponActivityList, Member member); + + + /** + * 关闭优惠券活动 + */ + boolean updateCouponActivityStatus(String id, PromotionStatusEnum promotionStatus); +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java index 037f1193..02b3d4b1 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java @@ -104,4 +104,6 @@ public interface CouponService extends IService { void usedCoupon(String couponId, Integer usedNum); + + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java index 7eb8d5e3..de04aea4 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java @@ -142,15 +142,4 @@ public interface PromotionGoodsService extends IService { */ void updatePromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId, Integer quantity); - - /** - * 分页获取根据条件获取促销商品 - * - * @param goodsName 商品名称 - * @param categoryPath 商品分类 - * @param promotionType 促销类型 - * @param pageVo 分页参数 - * @return 促销商品信息 - */ - IPage getPromotionGoodsPage(String goodsName, String categoryPath, String promotionType, PageVO pageVo); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java index aeff8ee7..07e1c0cf 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java @@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; -import java.util.Map; /** * 秒杀申请业务层 @@ -22,82 +21,46 @@ public interface SeckillApplyService extends IService { /** - * 获取当天限时抢购信息列表(时刻及对应时刻下的商品) + * 获取当天秒杀活动信息列表(时刻及对应时刻下的商品) * - * @return 限时抢购信息列表 + * @return 秒杀活动信息列表 */ List getSeckillTimeline(); - /** - * 获取当天某个时刻的限时抢购商品列表 + * 获取当天某个时刻的秒杀活动商品列表 * * @param timeline 指定时刻 - * @return 限时抢购商品列表 + * @return 秒杀活动商品列表 */ List getSeckillGoods(Integer timeline); - /** - * 审核一批申请 - * - * @param ids 限时抢购申请编号 - * @param seckillId 限时抢购编号 - * @param applyStatus 审批状态 - * @param failReason 驳回原因 - */ - void auditBatchApply(String[] ids, String seckillId, String applyStatus, String failReason); - - /** - * 分页查询限时请购申请列表 - * - * @param queryParam 限时抢购申请查询参数 - * @param pageVo 分页参数 - * @return 限时请购申请列表 - */ - IPage getSeckillApplyFromMysql(SeckillSearchParams queryParam, PageVO pageVo); - /** * 从mongo中分页查询限时请购申请列表 * - * @param queryParam 限时抢购申请查询参数 + * @param queryParam 秒杀活动申请查询参数 * @param pageVo 分页参数 * @return 限时请购申请列表 */ IPage getSeckillApplyFromMongo(SeckillSearchParams queryParam, PageVO pageVo); /** - * 添加限时抢购申请 + * 添加秒杀活动申请 + * 检测是否商品是否同时参加多个活动 + * 将秒杀商品信息存入秒杀活动中,更新mogo信息 + * 保存秒杀活动商品,促销商品信息 * - * @param seckillId 限时抢购编号 + * @param seckillId 秒杀活动编号 * @param storeId 商家id - * @param seckillApplyList 限时抢购申请列表 + * @param seckillApplyList 秒杀活动申请列表 */ void addSeckillApply(String seckillId, String storeId, List seckillApplyList); /** - * 批量删除限时抢购申请 + * 批量删除秒杀活动申请 * - * @param seckillId 限时抢购活动id - * @param ids 限时抢购申请id集合 + * @param seckillId 秒杀活动活动id + * @param ids 秒杀活动申请id集合 */ void removeSeckillApplyByIds(String seckillId, List ids); - - /** - * 更新限时抢购库存数量 - * - * @param id 限时抢购申请(限时抢购商品)id - * @param num 数量 - * @return 是否成功 - */ - boolean updateSeckillStock(String id, Integer num); - - - /** - * 更新限时抢购库存数量 - * - * @param map key 为 限时抢购申请(限时抢购商品)id, value 为数量 - * @return 是否成功 - */ - boolean updateSeckillStock(Map map); - } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillService.java b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillService.java index bd8cfc90..27fdc908 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillService.java @@ -17,79 +17,93 @@ public interface SeckillService extends IService { /** - * 从mysql中根据条件获取限时抢购分页列表 + * 从mysql中根据条件获取秒杀活动分页列表 * * @param queryParam 查询参数 * @param pageVo 分页参数 - * @return 限时抢购分页列表 + * @return 秒杀活动分页列表 */ IPage getSeckillByPageFromMysql(SeckillSearchParams queryParam, PageVO pageVo); /** - * 从mongo中根据条件获取限时抢购分页列表 + * 从mongo中根据条件获取秒杀活动分页列表 * * @param queryParam 查询参数 * @param pageVo 分页参数 - * @return 限时抢购分页列表 + * @return 秒杀活动分页列表 */ IPage getSeckillByPageFromMongo(SeckillSearchParams queryParam, PageVO pageVo); /** - * 从mongo中获取限时抢购信息 + * 从mongo中获取秒杀活动信息 * - * @param id 限时抢购id - * @return 限时抢购信息 + * @param id 秒杀活动id + * @return 秒杀活动信息 */ SeckillVO getSeckillByIdFromMongo(String id); /** - * 保存限时抢购 + * 初始化秒杀活动,默认开启三十天的秒杀活动 * - * @param seckill 限时抢购信息 * @return 是否保存成功 */ - boolean saveSeckill(SeckillVO seckill); + void init(); + /** + * 保存秒杀活动 + * + * @param seckill 秒杀活动 + * @return 是否保存成功 + */ + boolean saveSeckill(Seckill seckill); /** - * 商家报名限时抢购活动 + * 商家报名秒杀活动活动 * * @param storeId 商家编号 - * @param seckillId 限时抢购编号 + * @param seckillId 秒杀活动编号 */ void storeApply(String storeId, String seckillId); /** - * 修改限时抢购 + * 修改秒杀活动 * - * @param seckillVO 限时抢购信息 + * @param seckillVO 秒杀活动信息 * @return 是否修改成功 */ boolean modifySeckill(SeckillVO seckillVO); /** - * 删除限时抢购 + * 删除秒杀活动 * - * @param id 限时抢购编号 + * @param id 秒杀活动编号 */ void deleteSeckill(String id); /** - * 开启一个限时抢购 + * 开启一个秒杀活动 * - * @param id 限时抢购编号 + * @param id 秒杀活动编号 */ void openSeckill(String id); /** - * 关闭一个限时抢购 + * 关闭一个秒杀活动 * - * @param id 限时抢购编号 + * @param id 秒杀活动编号 */ void closeSeckill(String id); /** * 获取当前可参与的活动数量 + * * @return 可参与活动数量 */ Integer getApplyNum(); + + /** + * 更新秒杀活动的商品数量 + * @param seckillId 秒杀活动ID + * @return 更新结果 + */ + void updateSeckillGoodsNum(String seckillId); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java new file mode 100644 index 00000000..caa7a589 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityItemServiceImpl.java @@ -0,0 +1,34 @@ +package cn.lili.modules.promotion.serviceimpl; + +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.vos.CouponActivityItemVO; +import cn.lili.modules.promotion.mapper.CouponActivityItemMapper; +import cn.lili.modules.promotion.service.CouponActivityItemService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 优惠券活动关联优惠券业务层实现 + * + * @author Bulbasaur + * @date: 2021/5/21 6:42 下午 + */ +@Service +public class CouponActivityItemServiceImpl extends ServiceImpl implements CouponActivityItemService { + + @Override + public List getCouponActivityList(String activityId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(CouponActivityItem::getActivityId, activityId); + return this.list(lambdaQueryWrapper); + } + + @Override + public List getCouponActivityItemListVO(String activityId) { + return this.baseMapper.getCouponActivityItemListVO(activityId); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java new file mode 100644 index 00000000..03f56f14 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponActivityServiceImpl.java @@ -0,0 +1,244 @@ +package cn.lili.modules.promotion.serviceimpl; + +import cn.hutool.json.JSONUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.DateUtil; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.promotion.entity.dos.Coupon; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dos.CouponActivityItem; +import cn.lili.modules.promotion.entity.dos.MemberCoupon; +import cn.lili.modules.promotion.entity.dto.CouponActivityDTO; +import cn.lili.modules.promotion.entity.enums.CouponActivitySendTypeEnum; +import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.entity.vos.CouponActivityVO; +import cn.lili.modules.promotion.mapper.CouponActivityMapper; +import cn.lili.modules.promotion.service.CouponActivityItemService; +import cn.lili.modules.promotion.service.CouponActivityService; +import cn.lili.modules.promotion.service.CouponService; +import cn.lili.modules.promotion.service.MemberCouponService; +import cn.lili.modules.promotion.tools.PromotionTools; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import groovy.util.logging.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 优惠券活动业务层实现 + * + * @author Bulbasaur + * @date: 2021/5/20 6:10 下午 + */ +@Slf4j +@Service +public class CouponActivityServiceImpl extends ServiceImpl implements CouponActivityService { + + @Autowired + private CouponService couponService; + @Autowired + private MemberCouponService memberCouponService; + @Autowired + private CouponActivityItemService couponActivityItemService; + @Autowired + private MemberService memberService; + + @Override + public CouponActivityDTO addCouponActivity(CouponActivityDTO couponActivityDTO) { + //检测优惠券活动是否可以添加 + this.checkParam(couponActivityDTO); + //如果有会员,则写入会员信息 + if (couponActivityDTO.getMemberDTOS() != null && couponActivityDTO.getMemberDTOS().size() != 0) { + couponActivityDTO.setActivityScopeInfo(JSONUtil.toJsonStr(couponActivityDTO.getMemberDTOS())); + } + //添加优惠券活动 + this.save(couponActivityDTO); + //添加优惠券活动优惠券 + this.addCouponActivityItems(couponActivityDTO); + return couponActivityDTO; + } + + @Override + public CouponActivityDTO updateCouponActivity(CouponActivityDTO couponActivityDTO) { + //检测优惠券活动是否可以修改 + this.checkParam(couponActivityDTO); + //修改优惠券活动 + this.updateById(couponActivityDTO); + //删除优惠券活动关联的优惠券 + couponActivityItemService.remove(new LambdaQueryWrapper() + .eq(CouponActivityItem::getActivityId, couponActivityDTO.getId())); + //重新添加优惠券活动关联优惠券 + this.addCouponActivityItems(couponActivityDTO); + return couponActivityDTO; + } + + @Override + public CouponActivityVO getCouponActivityVO(String couponActivityId) { + CouponActivity couponActivity = this.getById(couponActivityId); + CouponActivityVO couponActivityVO = new CouponActivityVO(couponActivity, couponActivityItemService.getCouponActivityItemListVO(couponActivityId)); + return couponActivityVO; + } + + @Override + public void specify(String couponActivityId) { + //获取优惠券 + CouponActivity couponActivity = this.getById(couponActivityId); + //获取活动优惠券发送范围 + List> member = this.getMemberList(couponActivity); + + //会员拆成多个小组进行发送 + List>> memberGroup = new ArrayList<>(); + + //循环分组 + for (int i = 0; i < (member.size() / 100 + (member.size() % 100 == 0 ? 0 : 1)); i++) { + int endPoint = Math.min((100 + (i * 100)), member.size()); + memberGroup.add(member.subList((i * 100), endPoint)); + } + + //优惠优惠券活动的优惠券列表 + List couponActivityItems = couponActivityItemService.getCouponActivityList(couponActivity.getId()); + //发送优惠券 + for (List> memberList : memberGroup) { + sendCoupon(memberList, couponActivityItems); + } + + } + + @Override + public void registered(List couponActivityList, Member member) { + for (CouponActivity couponActivity : couponActivityList) { + //获取会员信息 + List> memberList = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id", member.getId()); + map.put("nick_name", member.getNickName()); + memberList.add(map); + + //优惠优惠券活动的优惠券列表 + List couponActivityItems = couponActivityItemService.getCouponActivityList(couponActivity.getId()); + + //发送优惠券 + sendCoupon(memberList, couponActivityItems); + } + } + + @Override + public boolean updateCouponActivityStatus(String id, PromotionStatusEnum promotionStatus) { + CouponActivity couponActivity = this.getById(id); + couponActivity.setPromotionStatus(promotionStatus.name()); + return this.updateById(couponActivity); + } + + /** + * 发送优惠券 + * 1.循环优惠券列表 + * 2.判断优惠券每个会员发送数量 + * 3.循环会员列表,发送优惠券 + * 4.记录优惠券发送数量 + * + * @param memberList 用户列表 + * @param couponActivityItems 优惠券列表 + */ + private void sendCoupon(List> memberList, List couponActivityItems) { + + for (CouponActivityItem couponActivityItem : couponActivityItems) { + //获取优惠券 + Coupon coupon = couponService.getCouponDetailFromMongo(couponActivityItem.getCouponId()); + //判断优惠券是否存在 + if (coupon != null) { + List memberCouponList = new LinkedList<>(); + //循环优惠券的领取数量 + int j=couponActivityItem.getNum(); + for (int i = 1; i <= j; i++) { + //循环会员列表,添加优惠券 + for (Map map : memberList) { + MemberCoupon memberCoupon = new MemberCoupon(coupon); + memberCoupon.setMemberId(map.get("id").toString()); + memberCoupon.setMemberName(map.get("nick_name").toString()); + memberCoupon.setMemberCouponStatus(MemberCouponStatusEnum.NEW.name()); + memberCoupon.setIsPlatform(coupon.getStoreId().equals("platform")); + memberCouponList.add(memberCoupon); + } + } + //批量添加优惠券 + memberCouponService.saveBatch(memberCouponList); + //添加优惠券已领取数量 + couponService.receiveCoupon(couponActivityItem.getCouponId(), memberCouponList.size() * couponActivityItem.getNum()); + } else { + log.error("赠送优惠券失败,当前优惠券不存在:" + couponActivityItem.getCouponId()); + } + } + + } + + /** + * 检测优惠券活动参数 + * + * @param couponActivity 优惠券活动 + */ + private void checkParam(CouponActivityDTO couponActivity) { + + //检测活动时间超过当前时间不能进行操作 + long nowTime = DateUtil.getDateline() * 1000; + if (couponActivity.getStartTime().getTime() < nowTime && couponActivity.getEndTime().getTime() > nowTime) { + throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作"); + } + //活动时间需超过当前时间 + PromotionTools.checkPromotionTime(couponActivity.getStartTime().getTime(), couponActivity.getEndTime().getTime()); + //指定会员判定 + if (couponActivity.getActivityScope().equals(CouponActivitySendTypeEnum.DESIGNATED.name())) { + if (couponActivity.getMemberDTOS().size() == 0) { + throw new ServiceException("指定精准发券则必须指定会员,会员不可以为空"); + } + } + //优惠券数量判定 + if (couponActivity.getCouponActivityItems().size() == 0) { + throw new ServiceException("优惠券活动必须指定优惠券,不能为空"); + } else if (couponActivity.getCouponActivityItems().size() > 10) { + throw new ServiceException("优惠券活动最多指定10个优惠券"); + } else { + for (CouponActivityItem item : couponActivity.getCouponActivityItems()) { + if (item.getNum() == null || item.getNum() <= 0) { + throw new ServiceException("赠券数量必须大于0"); + } + } + } + } + + /** + * 获取优惠券的范围范围 + * 此方法用于精准发券 + * + * @param couponActivity 优惠券活动 + * @return 获取优惠券的会员列表 + */ + private List> getMemberList(CouponActivity couponActivity) { + //判断优惠券的发送范围,获取会员列表 + if (couponActivity.getActivityScope().equals("ALL")) { + return memberService.listMaps(new QueryWrapper() + .select("id,nick_name")); + } else { + return memberService.listMaps(new QueryWrapper() + .select("id,nick_name") + .in("id", couponActivity.getActivityScopeInfo())); + } + } + + /** + * 添加优惠券活动关联优惠券 + * + * @param couponActivityDTO 优惠券活动DTO + */ + private void addCouponActivityItems(CouponActivityDTO couponActivityDTO) { + //创建优惠券活动子列表 + for (CouponActivityItem couponActivityItem : couponActivityDTO.getCouponActivityItems()) { + couponActivityItem.setActivityId(couponActivityDTO.getId()); + } + couponActivityItemService.saveBatch(couponActivityDTO.getCouponActivityItems()); + } +} diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java index 6a7fd73c..04941ab5 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java @@ -2,7 +2,7 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.trigger.util.DelayQueueTools; -import cn.lili.common.trigger.enums.PromotionDelayTypeEnums; +import cn.lili.common.trigger.enums.DelayTypeEnums; import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.exception.ServiceException; import cn.lili.common.trigger.interfaces.TimeTrigger; @@ -89,14 +89,18 @@ public class CouponServiceImpl extends ServiceImpl impleme this.updateScopePromotionGoods(coupon); // 保存到MONGO中 this.mongoTemplate.save(coupon); - PromotionMessage promotionMessage = new PromotionMessage(coupon.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime()); - TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, - coupon.getStartTime().getTime(), - promotionMessage, - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), - rocketmqCustomProperties.getPromotionTopic()); - // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg); + //如果优惠券是固定时间则添加延时任务 + if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { + PromotionMessage promotionMessage = new PromotionMessage(coupon.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime()); + TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, + coupon.getStartTime().getTime(), + promotionMessage, + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + rocketmqCustomProperties.getPromotionTopic()); + // 发送促销活动开始的延时任务 + this.timeTrigger.addDelay(timeTriggerMsg); + } + return coupon; } @@ -116,7 +120,7 @@ public class CouponServiceImpl extends ServiceImpl impleme this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage, coupon.getStartTime().getTime(), couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DateUtil.getDelayTime(couponVO.getStartTime().getTime()), rocketmqCustomProperties.getPromotionTopic()); return couponVO; @@ -144,7 +148,7 @@ public class CouponServiceImpl extends ServiceImpl impleme this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage, couponVO.getStartTime().getTime(), couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DateUtil.getDelayTime(couponVO.getStartTime().getTime()), rocketmqCustomProperties.getPromotionTopic()); } @@ -166,7 +170,7 @@ public class CouponServiceImpl extends ServiceImpl impleme this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), CouponVO.class); this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.COUPON.name() + couponVO.getId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.COUPON.name() + couponVO.getId())), rocketmqCustomProperties.getPromotionTopic()); return result; } @@ -278,12 +282,14 @@ public class CouponServiceImpl extends ServiceImpl impleme throw new ServiceException("优惠券折扣必须小于10且大于0"); } - long nowTime = DateUtil.getDateline() * 1000; - if (coupon.getStartTime().getTime() < nowTime && coupon.getEndTime().getTime() > nowTime) { - throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作"); - } + if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { + long nowTime = DateUtil.getDateline() * 1000; + if (coupon.getStartTime().getTime() < nowTime && coupon.getEndTime().getTime() > nowTime) { + throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作"); + } - PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime()); + PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime()); + } this.checkCouponScope(coupon); //对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态 @@ -326,7 +332,7 @@ public class CouponServiceImpl extends ServiceImpl impleme * @param coupon 优惠券参数 */ private void promotionStatusEmpty(CouponVO coupon) { - if (StringUtils.isEmpty(coupon.getPromotionStatus())) { + if (StringUtils.isEmpty(coupon.getPromotionStatus()) && coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { //格式时间 long startTme = coupon.getStartTime().getTime() / 1000; long endTime = coupon.getEndTime().getTime() / 1000; diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java index 9a6f3260..cfcb8cef 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java @@ -1,7 +1,7 @@ package cn.lili.modules.promotion.serviceimpl; import cn.lili.common.trigger.util.DelayQueueTools; -import cn.lili.common.trigger.enums.PromotionDelayTypeEnums; +import cn.lili.common.trigger.enums.DelayTypeEnums; import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.exception.ServiceException; import cn.lili.common.trigger.interfaces.TimeTrigger; @@ -56,9 +56,6 @@ public class FullDiscountServiceImpl extends ServiceImpl queryWrapper = PromotionTools.checkActiveTime(statTime, endTime, PromotionTypeEnum.FULL_DISCOUNT, storeId, id); - Integer sameNum = this.fullDiscountMapper.selectCount(queryWrapper); + Integer sameNum = this.count(queryWrapper); if (sameNum > 0) { throw new ServiceException("当前时间内已存在同类活动"); } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java index 1123b3fa..720d2d8b 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PintuanServiceImpl.java @@ -2,7 +2,7 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.bean.BeanUtil; import cn.lili.common.trigger.util.DelayQueueTools; -import cn.lili.common.trigger.enums.PromotionDelayTypeEnums; +import cn.lili.common.trigger.enums.DelayTypeEnums; import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.exception.ServiceException; import cn.lili.common.trigger.interfaces.TimeTrigger; @@ -17,7 +17,6 @@ import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; -import cn.lili.modules.order.order.entity.enums.OrderTypeEnum; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.promotion.entity.dos.Pintuan; @@ -103,8 +102,10 @@ public class PintuanServiceImpl extends ServiceImpl impl return new ArrayList<>(); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Order::getPromotionId, pintuanId).eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()) - .eq(Order::getOrderStatus, OrderStatusEnum.PAID.name()).eq(Order::getParentOrderSn, ""); + queryWrapper.eq(Order::getPromotionId, pintuanId) + .eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()) + .eq(Order::getOrderStatus, OrderStatusEnum.PAID.name()) + .eq(Order::getParentOrderSn, ""); List orders = orderService.list(queryWrapper); // 遍历订单状态为已支付,为团长的拼团订单 for (Order order : orders) { @@ -222,7 +223,7 @@ public class PintuanServiceImpl extends ServiceImpl impl promotionMessage, pintuanVO.getStartTime().getTime(), pintuan.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DateUtil.getDelayTime(pintuanVO.getStartTime().getTime()), rocketmqCustomProperties.getPromotionTopic()); } @@ -265,7 +266,7 @@ public class PintuanServiceImpl extends ServiceImpl impl } else { pintuan.setPromotionStatus(PromotionStatusEnum.END.name()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()); + queryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()); queryWrapper.eq(Order::getPromotionId, pintuanId); queryWrapper.nested(i -> i.eq(Order::getPayStatus, PayStatusEnum.PAID.name()).or().eq(Order::getOrderStatus, OrderStatusEnum.PAID.name())); // 过滤父级拼团订单,根据父级拼团订单分组 @@ -322,7 +323,7 @@ public class PintuanServiceImpl extends ServiceImpl impl pintuanShareVO.setPintuanMemberVOS(new ArrayList<>()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // 查找团长订单和已和当前拼团订单拼团的订单 - queryWrapper.eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()) + queryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()) .eq(Order::getPayStatus, OrderStatusEnum.PAID.name()) .and(i -> i.eq(Order::getParentOrderSn, parentOrderSn).or(j -> j.eq(Order::getSn, parentOrderSn))); List orders = orderService.list(queryWrapper); @@ -331,7 +332,7 @@ public class PintuanServiceImpl extends ServiceImpl impl if (!orders.isEmpty() && pintuanShareVO.getPromotionGoods() == null) { LambdaQueryWrapper orderLambdaQueryWrapper = new LambdaQueryWrapper<>(); // 查找团长订单和已和当前拼团订单拼团的订单 - orderLambdaQueryWrapper.eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()) + orderLambdaQueryWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()) .eq(Order::getPayStatus, OrderStatusEnum.PAID.name()) .ne(Order::getSn, parentOrderSn) .and(i -> i.eq(Order::getParentOrderSn, orders.get(0).getParentOrderSn()).or(j -> j.eq(Order::getSn, orders.get(0).getParentOrderSn()))); @@ -389,7 +390,7 @@ public class PintuanServiceImpl extends ServiceImpl impl TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, pintuan.getStartTime().getTime(), promotionMessage, - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), rocketmqCustomProperties.getPromotionTopic()); // 发送促销活动开始的延时任务 this.timeTrigger.addDelay(timeTriggerMsg); @@ -404,7 +405,7 @@ public class PintuanServiceImpl extends ServiceImpl impl private void removePintuanGoodsFromEs(String id, Long originStartTime) { this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, originStartTime, - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.PINTUAN.name() + id)), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.PINTUAN.name() + id)), rocketmqCustomProperties.getPromotionTopic()); } @@ -423,7 +424,7 @@ public class PintuanServiceImpl extends ServiceImpl impl if (Boolean.FALSE.equals(pintuan.getFictitious()) && entry.getValue().size() < requiredNum) { // 如果未开启虚拟成团且已参团人数小于成团人数,则自动取消订单 LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Order::getOrderType, OrderTypeEnum.PINTUAN.name()); + updateWrapper.eq(Order::getOrderPromotionType, PromotionTypeEnum.PINTUAN.name()); updateWrapper.eq(Order::getPromotionId, pintuan.getId()); updateWrapper.eq(Order::getParentOrderSn, entry.getKey()); updateWrapper.set(Order::getOrderStatus, OrderStatusEnum.CANCELLED.name()); @@ -507,8 +508,8 @@ public class PintuanServiceImpl extends ServiceImpl impl // 查询是否在同一时间段参与了限时抢购活动 count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), promotionGood.getSkuId(), pintuan.getStartTime(), pintuan.getEndTime(), pintuan.getId()); if (count > 0) { - log.error("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了限时抢购或拼团活动,不能参加拼团活动"); - throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了限时抢购或拼团活动,不能参加拼团活动"); + log.error("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了秒杀活动或拼团活动,不能参加拼团活动"); + throw new ServiceException("商品[" + promotionGood.getGoodsName() + "]已经在重叠的时间段参加了秒杀活动或拼团活动,不能参加拼团活动"); } } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java index b9b83bf2..690e2acb 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java @@ -2,7 +2,7 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.util.StrUtil; import cn.lili.common.trigger.util.DelayQueueTools; -import cn.lili.common.trigger.enums.PromotionDelayTypeEnums; +import cn.lili.common.trigger.enums.DelayTypeEnums; import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.exception.ServiceException; import cn.lili.common.trigger.interfaces.TimeTrigger; @@ -120,7 +120,7 @@ public class PointsGoodsServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId); @@ -335,30 +335,6 @@ public class PromotionGoodsServiceImpl extends ServiceImpl getPromotionGoodsPage(String goodsName, String categoryPath, String promotionType, PageVO pageVo) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (CharSequenceUtil.isNotEmpty(goodsName)) { - queryWrapper.like(PromotionGoods::getGoodsName, goodsName); - } - if (CharSequenceUtil.isNotEmpty(categoryPath)) { - queryWrapper.like(PromotionGoods::getCategoryPath, categoryPath); - } - if (CharSequenceUtil.isNotEmpty(promotionType)) { - queryWrapper.eq(PromotionGoods::getPromotionType, promotionType); - } - return this.page(PageUtil.initPage(pageVo), queryWrapper); - } - private void setFullDiscountPromotionGoods(IPage promotionGoodsPage, List fullDiscountVOS, PageVO pageVo) { List promotionGoodsDTOList = new ArrayList<>(); int total = 0; diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java index e3b08b9d..34414c7f 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionPriceServiceImpl.java @@ -33,7 +33,7 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { //ES商品 @Autowired private EsGoodsSearchService goodsSearchService; - //限时抢购申请 + //秒杀活动申请 @Autowired private SeckillApplyService seckillApplyService; //促销商品 @@ -180,7 +180,7 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { } /** - * 促销计算(限时抢购,拼团) + * 促销计算(秒杀活动,拼团) * * @param promotionMap 当前商品所有参加的促销活动 * @param goodsSkuPromotionPrice 商品SKU促销计算信息 @@ -189,11 +189,11 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { */ private void calculationPromotionMap(Map promotionMap, GoodsSkuPromotionPriceDTO goodsSkuPromotionPrice, EsGoodsIndex esGoodsIndex, String pintuanId) { if (promotionMap != null && !promotionMap.isEmpty()) { - // 检查当前商品是否存在限时抢购活动 + // 检查当前商品是否存在秒杀活动活动 Optional existSeckill = promotionMap.keySet().parallelStream().filter(i -> i.contains(PromotionTypeEnum.SECKILL.name())).findFirst(); if (existSeckill.isPresent()) { Seckill seckill = (Seckill) promotionMap.get(existSeckill.get()); - // 计算限时抢购促销 + // 计算秒杀活动促销 this.calculationSeckill(seckill, goodsSkuPromotionPrice); seckill.setPromotionName(PromotionTypeEnum.SECKILL.name()); goodsSkuPromotionPrice.getJoinPromotion().add(seckill); @@ -338,9 +338,9 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { } /** - * 计算限时抢购 + * 计算秒杀活动 * - * @param seckill 限时抢购信息 + * @param seckill 秒杀活动信息 * @param promotionPrice 商品SKU的计算促销信息 */ private void calculationSeckill(Seckill seckill, GoodsSkuPromotionPriceDTO promotionPrice) { @@ -358,7 +358,7 @@ public class PromotionPriceServiceImpl implements PromotionPriceService { promotionPrice.setDiscountPrice(discountPrice); promotionPrice.setFinalePrice(seckillApply.getPrice()); } else { - log.error("购买数量超出限时抢购剩余数量"); + log.error("购买数量超出秒杀活动剩余数量"); } } } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java index 87d8783a..bf5565e4 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java @@ -9,10 +9,7 @@ import cn.lili.common.utils.DateUtil; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.promotion.entity.dos.*; import cn.lili.modules.promotion.entity.enums.*; -import cn.lili.modules.promotion.entity.vos.CouponVO; -import cn.lili.modules.promotion.entity.vos.PintuanVO; -import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; -import cn.lili.modules.promotion.entity.vos.SeckillVO; +import cn.lili.modules.promotion.entity.vos.*; import cn.lili.modules.promotion.service.*; import cn.lili.modules.search.entity.dos.EsGoodsIndex; import cn.lili.modules.search.service.EsGoodsIndexService; @@ -63,6 +60,9 @@ public class PromotionServiceImpl implements PromotionService { //积分商品 @Autowired private PointsGoodsService pointsGoodsService; + //优惠券活动 + @Autowired + private CouponActivityService couponActivityService; //ES商品 @Autowired private EsGoodsIndexService goodsIndexService; @@ -84,63 +84,11 @@ public class PromotionServiceImpl implements PromotionService { break; //秒杀 case SECKILL: - SeckillVO seckill = this.mongoTemplate.findById(promotionMessage.getPromotionId(), SeckillVO.class); - if (seckill == null) { - this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); - break; - } - seckill.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.seckillService.update(promotionMessage.updateWrapper()); - for (SeckillApply seckillApply : seckill.getSeckillApplyList()) { - if (seckillApply.getPromotionApplyStatus().equals(PromotionApplyStatusEnum.PASS.name())) { - // 下一个时间,默认为当天结束时间 - int nextHour = 23; - String[] split = seckill.getHours().split(","); - int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); - // 排序时间段 - Arrays.sort(hoursSored); - for (int i : hoursSored) { - // 如果当前时间段大于排序后的时间段的某个,当前时间段的下个时间段即为排序后的时间段的某个 - if (seckillApply.getTimeLine() < i) { - nextHour = i; - break; - } - } - Seckill seckill1 = JSONUtil.toBean(JSONUtil.toJsonStr(seckill), Seckill.class); - String format = cn.hutool.core.date.DateUtil.format(seckill.getStartTime(), DateUtil.STANDARD_DATE_FORMAT); - DateTime parseStartTime = cn.hutool.core.date.DateUtil.parse((format + " " + seckillApply.getTimeLine()), "yyyy-MM-dd HH"); - DateTime parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour), "yyyy-MM-dd HH"); - // 如果是当天最后的时间段则设置到当天结束时间的59分59秒 - if (nextHour == seckillApply.getTimeLine()) { - parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour + ":59:59"), DateUtil.STANDARD_FORMAT); - } - seckill1.setStartTime(parseStartTime); - // 当时商品的限时抢购活动结束时间为下个时间段的开始 - seckill1.setEndTime(parseEndTime); - this.goodsIndexService.updateEsGoodsIndex(seckillApply.getSkuId(), seckill1, promotionTypeEnum.name() + "-" + seckillApply.getTimeLine(), seckillApply.getPrice()); - } - } - this.mongoTemplate.save(seckill); + result = this.updateSeckill(promotionMessage, esPromotionKey, promotionTypeEnum); break; //拼团 case PINTUAN: - PintuanVO pintuanVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PintuanVO.class); - if (pintuanVO == null) { - this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); - break; - } - pintuanVO.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.pintuanService.update(promotionMessage.updateWrapper()); - this.promotionGoodsService.updateBatchById(pintuanVO.getPromotionGoodsList()); - if (pintuanVO.getPromotionGoodsList() != null) { - List promotionGoodsList = pintuanVO.getPromotionGoodsList(); - // 更新促销商品索引 - for (PromotionGoods promotionGoods : promotionGoodsList) { - Pintuan pintuan1 = JSONUtil.toBean(JSONUtil.toJsonStr(pintuanVO), Pintuan.class); - this.goodsIndexService.updateEsGoodsIndex(promotionGoods.getSkuId(), pintuan1, esPromotionKey, promotionGoods.getPrice()); - } - } - this.mongoTemplate.save(pintuanVO); + result = this.updatePintuan(promotionMessage, esPromotionKey, promotionTypeEnum); break; //优惠券 case COUPON: @@ -148,16 +96,11 @@ public class PromotionServiceImpl implements PromotionService { break; //积分商品 case POINTS_GOODS: - PointsGoodsVO pointsGoodsVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PointsGoodsVO.class); - if (pointsGoodsVO == null) { - this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); - break; - } - pointsGoodsVO.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.pointsGoodsService.update(promotionMessage.updateWrapper()); - PointsGoods pointsGoods = JSONUtil.toBean(JSONUtil.toJsonStr(pointsGoodsVO), PointsGoods.class); - this.goodsIndexService.updateEsGoodsIndex(pointsGoodsVO.getSkuId(), pointsGoods, esPromotionKey, null); - this.mongoTemplate.save(pointsGoodsVO); + result = this.updatePointsGoods(promotionMessage, esPromotionKey, promotionTypeEnum); + break; + //优惠券活动 + case COUPON_ACTIVITY: + result = this.updateCouponActivity(promotionMessage, promotionTypeEnum); break; default: break; @@ -178,7 +121,7 @@ public class PromotionServiceImpl implements PromotionService { queryWrapper.eq("promotion_status", PromotionStatusEnum.START.name()); queryWrapper.gt("start_time", new Date()); queryWrapper.lt("end_time", new Date()); - // 获取当前进行的限时抢购活动 + // 获取当前进行的秒杀活动活动 List seckillList = seckillService.list(queryWrapper); if (seckillList != null && !seckillList.isEmpty()) { for (Seckill seckill : seckillList) { @@ -287,6 +230,13 @@ public class PromotionServiceImpl implements PromotionService { return promotionMap; } + /** + * 修改满额活动状态 + * @param promotionMessage 信息队列传输促销信息实体 + * @param esPromotionKey es Key + * @param promotionTypeEnum 促销分类枚举 + * @return 修改结果 + */ private boolean updateFullDiscount(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) { boolean result; //从mongo中获取促销备份 @@ -317,19 +267,32 @@ public class PromotionServiceImpl implements PromotionService { return result; } + /** + * 修改优惠券状态 + * @param promotionMessage 信息队列传输促销信息实体 + * @param esPromotionKey es Key + * @param promotionTypeEnum 促销分类枚举 + * @return 修改结果 + */ private boolean updateCoupon(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum) { boolean result; + //从mongo中获取优惠券信息 CouponVO couponVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), CouponVO.class); if (couponVO == null) { this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); return false; } + //修改优惠券 couponVO.setPromotionStatus(promotionMessage.getPromotionStatus()); - result = this.couponService.update(promotionMessage.updateWrapper()); - - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper().eq(MemberCoupon::getCouponId, couponVO.getId()).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); - this.memberCouponService.update(updateWrapper); + //优惠券活动结束,会员已领取未使用的优惠券状态修改为:已过期 + if(couponVO.getPromotionStatus().equals(PromotionStatusEnum.END)){ + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(MemberCoupon::getCouponId, couponVO.getId()) + .eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name()) + .set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); + this.memberCouponService.update(updateWrapper); + } // clone一个活动信息,用于存放与索引中 CouponVO clone = ObjectUtil.clone(couponVO); clone.setPromotionGoodsList(null); @@ -345,11 +308,131 @@ public class PromotionServiceImpl implements PromotionService { return result; } + /** + * 修改拼团状态 + * @param promotionMessage 信息队列传输促销信息实体 + * @param esPromotionKey es Key + * @param promotionTypeEnum 促销分类枚举 + * @return 修改结果 + */ + private boolean updatePintuan(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum){ + boolean result; + PintuanVO pintuanVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PintuanVO.class); + if (pintuanVO == null) { + this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); + return false; + } + pintuanVO.setPromotionStatus(promotionMessage.getPromotionStatus()); + result = this.pintuanService.update(promotionMessage.updateWrapper()); + this.promotionGoodsService.updateBatchById(pintuanVO.getPromotionGoodsList()); + if (pintuanVO.getPromotionGoodsList() != null) { + List promotionGoodsList = pintuanVO.getPromotionGoodsList(); + // 更新促销商品索引 + for (PromotionGoods promotionGoods : promotionGoodsList) { + Pintuan pintuan1 = JSONUtil.toBean(JSONUtil.toJsonStr(pintuanVO), Pintuan.class); + this.goodsIndexService.updateEsGoodsIndex(promotionGoods.getSkuId(), pintuan1, esPromotionKey, promotionGoods.getPrice()); + } + } + this.mongoTemplate.save(pintuanVO); + return result; + + + } + + /** + * 修改秒杀状态 + * @param promotionMessage 信息队列传输促销信息实体 + * @param esPromotionKey es Key + * @param promotionTypeEnum 促销分类枚举 + * @return 修改结果 + */ + private boolean updateSeckill(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum){ + boolean result; + SeckillVO seckill = this.mongoTemplate.findById(promotionMessage.getPromotionId(), SeckillVO.class); + if (seckill == null) { + this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); + return false; + } + seckill.setPromotionStatus(promotionMessage.getPromotionStatus()); + result = this.seckillService.update(promotionMessage.updateWrapper()); + for (SeckillApply seckillApply : seckill.getSeckillApplyList()) { + if (seckillApply.getPromotionApplyStatus().equals(PromotionApplyStatusEnum.PASS.name())) { + // 下一个时间,默认为当天结束时间 + int nextHour = 23; + String[] split = seckill.getHours().split(","); + int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); + // 排序时间段 + Arrays.sort(hoursSored); + for (int i : hoursSored) { + // 如果当前时间段大于排序后的时间段的某个,当前时间段的下个时间段即为排序后的时间段的某个 + if (seckillApply.getTimeLine() < i) { + nextHour = i; + break; + } + } + Seckill seckill1 = JSONUtil.toBean(JSONUtil.toJsonStr(seckill), Seckill.class); + String format = cn.hutool.core.date.DateUtil.format(seckill.getStartTime(), DateUtil.STANDARD_DATE_FORMAT); + DateTime parseStartTime = cn.hutool.core.date.DateUtil.parse((format + " " + seckillApply.getTimeLine()), "yyyy-MM-dd HH"); + DateTime parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour), "yyyy-MM-dd HH"); + // 如果是当天最后的时间段则设置到当天结束时间的59分59秒 + if (nextHour == seckillApply.getTimeLine()) { + parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour + ":59:59"), DateUtil.STANDARD_FORMAT); + } + seckill1.setStartTime(parseStartTime); + // 当时商品的秒杀活动活动结束时间为下个时间段的开始 + seckill1.setEndTime(parseEndTime); + this.goodsIndexService.updateEsGoodsIndex(seckillApply.getSkuId(), seckill1, promotionTypeEnum.name() + "-" + seckillApply.getTimeLine(), seckillApply.getPrice()); + } + } + return result; + } + + /** + * 修改积分商品状态 + * @param promotionMessage 信息队列传输促销信息实体 + * @param esPromotionKey es Key + * @param promotionTypeEnum 促销分类枚举 + * @return 修改结果 + */ + private boolean updatePointsGoods(PromotionMessage promotionMessage, String esPromotionKey, PromotionTypeEnum promotionTypeEnum){ + boolean result; + PointsGoodsVO pointsGoodsVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), PointsGoodsVO.class); + if (pointsGoodsVO == null) { + this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); + return false; + } + pointsGoodsVO.setPromotionStatus(promotionMessage.getPromotionStatus()); + result = this.pointsGoodsService.update(promotionMessage.updateWrapper()); + PointsGoods pointsGoods = JSONUtil.toBean(JSONUtil.toJsonStr(pointsGoodsVO), PointsGoods.class); + this.goodsIndexService.updateEsGoodsIndex(pointsGoodsVO.getSkuId(), pointsGoods, esPromotionKey, null); + this.mongoTemplate.save(pointsGoodsVO); + return result; + } + + /** + * 修改优惠券活动状态 + * @param promotionMessage 信息队列传输促销信息实体 + * @param promotionTypeEnum 促销分类枚举 + * @return 修改结果 + */ + private boolean updateCouponActivity(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum){ + boolean result; + CouponActivityVO couponActivityVO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), CouponActivityVO.class); + if (couponActivityVO == null) { + this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus()); + return false; + } + couponActivityVO.setPromotionStatus(promotionMessage.getPromotionStatus()); + result = this.couponActivityService.update(promotionMessage.updateWrapper()); + this.mongoTemplate.save(couponActivityVO); + return result; + } + /** * 更新促销商品信息 * - * @param promotionId - * @param promotionStatus + * @param promotionId 促销活动ID + * @param promotionStatus 活动状态 */ private void updatePromotionGoods(String promotionId, String promotionStatus) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java index c38789a4..3a147a1e 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java @@ -3,12 +3,10 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.cache.Cache; import cn.lili.common.exception.ServiceException; -import cn.lili.common.utils.DateUtil; -import cn.lili.common.utils.PageUtil; -import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; @@ -27,8 +25,6 @@ import cn.lili.modules.promotion.tools.PromotionCacheKeys; import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.search.service.EsGoodsIndexService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -74,15 +70,15 @@ public class SeckillApplyServiceImpl extends ServiceImpl getSeckillTimeline() { List timelineVoS = new ArrayList<>(); - // 限时抢购缓存key - String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.toString(DateUtil.startOfTodDay(), DateUtil.STANDARD_DATE_NO_UNDERLINE_FORMAT)); + // 秒杀活动缓存key + String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.format(DateUtil.beginOfDay(new DateTime()), "yyyyMMdd")); Map cacheSeckill = cache.getHash(seckillCacheKey); if (cacheSeckill == null || cacheSeckill.isEmpty()) { // 如缓存中不存在,则单独获取 try { timelineVoS = getSeckillTimelineToCache(seckillCacheKey); } catch (Exception e) { - log.error("获取限时抢购信息发生错误!", e); + log.error("获取秒杀活动信息发生错误!", e); } } else { // 如缓存中存在,则取缓存中转为展示的信息 @@ -97,8 +93,8 @@ public class SeckillApplyServiceImpl extends ServiceImpl getSeckillGoods(Integer timeline) { List seckillGoodsVoS = new ArrayList<>(); - // 限时抢购缓存key - String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.toString(DateUtil.startOfTodDay(), DateUtil.STANDARD_DATE_NO_UNDERLINE_FORMAT)); + // 秒杀活动缓存key + String seckillCacheKey = PromotionCacheKeys.getSeckillTimelineKey(DateUtil.format(DateUtil.beginOfDay(new DateTime()), "yyyyMMdd")); Map cacheSeckill = cache.getHash(seckillCacheKey); if (cacheSeckill == null || cacheSeckill.isEmpty()) { // 如缓存中不存在,则单独获取 @@ -115,57 +111,6 @@ public class SeckillApplyServiceImpl extends ServiceImpl seckillApplyList = seckillVO.getSeckillApplyList(); - - for (String id : ids) { - - Optional seckillApplyOptional = seckillApplyList.stream().filter(i -> i.getId().equals(id)).findFirst(); - SeckillApply seckillApply; - if (seckillApplyOptional.isPresent()) { - seckillApply = seckillApplyOptional.get(); - } else { - log.error("编号为【" + id + "】限时抢购的申请不存在"); - throw new ServiceException(); - } - - seckillApply.setPromotionApplyStatus(PromotionApplyStatusEnum.valueOf(applyStatus).name()); - seckillApply.setFailReason(failReason); - this.updateById(seckillApply); - if (PromotionApplyStatusEnum.PASS.name().equals(applyStatus)) { - //检查缓存中是否存在相同商品参与的限时抢购活动 - checkCache(seckillVO.getStartTime().getTime()); - } - } - seckillVO.setSeckillApplyList(seckillApplyList); - mongoTemplate.save(seckillVO); - } - - @Override - public IPage getSeckillApplyFromMysql(SeckillSearchParams queryParam, PageVO pageVo) { - QueryWrapper queryWrapper = queryParam.wrapper(); - return page(PageUtil.initPage(pageVo), queryWrapper); - } - @Override public IPage getSeckillApplyFromMongo(SeckillSearchParams queryParam, PageVO pageVo) { IPage seckillApplyIPage = new Page<>(); @@ -200,133 +145,64 @@ public class SeckillApplyServiceImpl extends ServiceImpl seckillApplyList) { SeckillVO seckill = mongoTemplate.findById(seckillId, SeckillVO.class); if (seckill == null) { - throw new ServiceException("当前参与的限时抢购不存在!"); + throw new ServiceException("当前参与的秒杀活动不存在!"); } - seckill.checkTime(); - // 检查限时抢购申请是否合法 - checkSeckillApplyList(seckill.getApplyEndTime().getTime(), seckill.getHours(), seckillApplyList, storeId); - String storeIds = seckill.getStoreIds() != null ? seckill.getStoreIds() : ""; - boolean containsStore = false; - List storeIdList = Arrays.asList(storeIds.split(",")); - // 检查是否为已参加活动的店铺 - if (CharSequenceUtil.isNotEmpty(seckillId) && !storeIdList.contains(storeId)) { - if (!CharSequenceUtil.isEmpty(storeIds)) { - String[] storeIdSplit = storeIds.split(","); - for (String s : storeIdSplit) { - if (s.equals(seckillId)) { - containsStore = true; - break; - } - } - storeIds = seckill.getStoreIds() + storeId + ","; - } else { - storeIds = storeId + ","; - } - seckill.setStoreIds(storeIds); - } - - List originList = seckill.getSeckillApplyList(); + // 检查秒杀活动申请是否合法 + checkSeckillApplyList(seckill.getHours(), seckillApplyList, storeId); + //获取已参与活动的秒杀活动活动申请列表 + List originList = seckill.getSeckillApplyList() != null ? seckill.getSeckillApplyList() : new ArrayList<>(); List promotionGoodsList = new ArrayList<>(); - if (originList == null) { - originList = new ArrayList<>(); - } for (SeckillApplyVO seckillApply : seckillApplyList) { + //获取参与活动的商品信息 GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId()); - if (goodsSku.getQuantity() < seckillApply.getQuantity()) { - throw new ServiceException(seckillApply.getGoodsName() + ",此商品库存不足"); - } - - /* - *************两种情况:****************** - 团购时间段: |________________| - 秒杀时间段: |_____| |_______| - - ************第三种情况:****************** - 团购时间段: |______| - 秒杀时间段: |________________| - - ************第四种情况:****************** - 团购时间段: |________________| - 秒杀时间段: |______| - - 这个商品的开始时间计算要用他参与的时间段来计算,结束时间是当天晚上23:59:59 - */ - String startTimeStr = DateUtil.toString(seckill.getStartTime(), DateUtil.STANDARD_DATE_FORMAT) + " " + (seckillApply.getTimeLine() > 10 ? ("0" + seckillApply.getTimeLine()) : seckillApply.getTimeLine()) + ":00:00"; - String endTimeStr = DateUtil.toString(seckill.getStartTime(), "yyyy-MM-dd") + " 23:59:59"; - - // 查询是否在同一时间段参与了拼团活动 - Integer count = promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.PINTUAN.name(), goodsSku.getId(), DateUtil.toDate(startTimeStr, DateUtil.STANDARD_FORMAT), DateUtil.toDate(endTimeStr, DateUtil.STANDARD_FORMAT), seckillId); - // 查询是否在同一时间段参与了限时抢购活动 - count += promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), goodsSku.getId(), DateUtil.toDate(startTimeStr, DateUtil.STANDARD_FORMAT), DateUtil.toDate(endTimeStr, DateUtil.STANDARD_FORMAT), seckillId); - if (count > 0) { - throw new ServiceException("商品[" + goodsSku.getGoodsName() + "]已经在重叠的时间段参加了团购或限时抢购活动,不能参加限时抢购活动"); - } + //获取秒杀活动时间段 + DateTime startTime = DateUtil.offsetHour(seckill.getStartTime(), seckillApply.getTimeLine()); + //检测是否可以发布促销商品 + checkSeckillGoodsSKU(seckill, seckillApply, goodsSku, startTime); + //设置秒杀申请默认内容 seckillApply.setOriginalPrice(goodsSku.getPrice()); - seckillApply.setPromotionApplyStatus(PromotionApplyStatusEnum.APPLY.name()); + seckillApply.setPromotionApplyStatus(PromotionApplyStatusEnum.PASS.name()); seckillApply.setSalesNum(0); - - Optional first = originList.stream().filter(i -> i.getSkuId().equals(seckillApply.getSkuId())).findFirst(); - if (first.isPresent() && (first.get().getPromotionApplyStatus().equals(PromotionApplyStatusEnum.REFUSE.name()) || first.get().getPromotionApplyStatus().equals(PromotionApplyStatusEnum.APPLY.name()))) { - originList = originList.stream().filter(i -> !i.getSkuId().equals(seckillApply.getSkuId())).collect(Collectors.toList()); - } else if (first.isPresent() && first.get().getPromotionApplyStatus().equals(PromotionApplyStatusEnum.PASS.name())) { - continue; - } originList.add(seckillApply); - PromotionGoods promotionGoods = new PromotionGoods(goodsSku); - promotionGoods.setPrice(seckillApply.getPrice()); - promotionGoods.setQuantity(seckillApply.getQuantity()); - // 设置单独每个促销商品的结束时间 - int nextHour = 23; - String[] split = seckill.getHours().split(","); - int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); - Arrays.sort(hoursSored); - for (int i : hoursSored) { - if (seckillApply.getTimeLine() < i) { - nextHour = i; - break; - } - } - String format = cn.hutool.core.date.DateUtil.format(seckill.getStartTime(), DateUtil.STANDARD_DATE_FORMAT); - DateTime parseStartTime = cn.hutool.core.date.DateUtil.parse((format + " " + seckillApply.getTimeLine()), "yyyy-MM-dd HH"); - DateTime parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour), "yyyy-MM-dd HH"); - // 如果是当天最后的时间段则设置到当天结束时间的59分59秒 - if (nextHour == seckillApply.getTimeLine()) { - parseEndTime = cn.hutool.core.date.DateUtil.parse((format + " " + nextHour + ":59:59"), DateUtil.STANDARD_FORMAT); - } - promotionGoods.setStartTime(parseStartTime); - promotionGoods.setEndTime(parseEndTime); + //获取促销商品 + PromotionGoods promotionGoods = this.setSeckillGoods(goodsSku, seckillApply, seckill); promotionGoodsList.add(promotionGoods); } + //保存秒杀活动申请 this.saveOrUpdateBatch(originList); + //设置秒杀活动下的申请列表 seckill.setSeckillApplyList(originList); + //mongo保存秒杀活动信息 this.mongoTemplate.save(seckill); + //保存促销活动商品信息 if (!promotionGoodsList.isEmpty()) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(PromotionGoods::getSkuId, promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList())).eq(PromotionGoods::getStoreId, storeId); + queryWrapper.in(PromotionGoods::getSkuId, promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList())) + .eq(PromotionGoods::getStoreId, storeId); promotionGoodsService.remove(queryWrapper); + //初始化促销商品 PromotionTools.promotionGoodsInit(promotionGoodsList, seckill, PromotionTypeEnum.SECKILL); promotionGoodsService.saveBatch(promotionGoodsList); } - - if (Boolean.FALSE.equals(containsStore)) { - seckillService.storeApply(storeId, seckill.getId()); - } + //设置秒杀活动的商品数量、店铺数量 + seckillService.updateSeckillGoodsNum(seckill.getId()); } + /** - * 批量删除限时抢购申请 + * 批量删除秒杀活动申请 * - * @param seckillId 限时抢购活动id - * @param ids 限时抢购申请id集合 + * @param seckillId 秒杀活动活动id + * @param ids 秒杀活动申请id集合 */ @Override public void removeSeckillApplyByIds(String seckillId, List ids) { SeckillVO seckillVO = this.mongoTemplate.findById(seckillId, SeckillVO.class); if (seckillVO == null) { - throw new ServiceException("当前限时抢购活动不存在!"); + throw new ServiceException("当前秒杀活动活动不存在!"); } if (seckillVO.getPromotionStatus().equals(PromotionStatusEnum.START.name())) { - throw new ServiceException("当前限时抢购活动已经开始,无法修改!"); + throw new ServiceException("当前秒杀活动活动已经开始,无法修改!"); } seckillVO.getSeckillApplyList().removeIf(seckillApply -> ids.contains(seckillApply.getId())); this.mongoTemplate.save(seckillVO); @@ -334,78 +210,26 @@ public class SeckillApplyServiceImpl extends ServiceImpl promotionIds = this.esGoodsIndexService.getPromotionIdByPromotionType(id, PromotionTypeEnum.SECKILL); - for (String promotionId : promotionIds) { - SeckillVO seckillVO = this.mongoTemplate.findById(promotionId, SeckillVO.class); - if (seckillVO == null) { - log.error("限时抢购活动id为" + promotionId + "的限时抢购活动不存在!"); - break; - } - if (seckillVO.getSeckillApplyList() != null && !seckillVO.getSeckillApplyList().isEmpty()) { - Optional seckillApplyOptional = seckillVO.getSeckillApplyList().stream().filter(i -> i.getSkuId().equals(id)).findFirst(); - if (seckillApplyOptional.isPresent()) { - SeckillApply seckillApply = seckillApplyOptional.get(); - // 设置售卖数量 - Integer countNum = seckillApply.getSalesNum() + num; - seckillApply.setSalesNum(countNum); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(SeckillApply::getId, seckillApply.getId()); - updateWrapper.set(SeckillApply::getQuantity, seckillApply.getQuantity() - num); - updateWrapper.set(SeckillApply::getSalesNum, countNum); - this.update(updateWrapper); - this.mongoTemplate.save(seckillVO); - } - } - } - return true; - } - - /** - * 更新限时抢购库存数量 - * - * @param map key 为 限时抢购申请(限时抢购商品)id, value 为数量 - * @return 是否成功 - */ - @Override - public boolean updateSeckillStock(Map map) { - boolean result = false; - for (Map.Entry entry : map.entrySet()) { - result = this.updateSeckillStock(entry.getKey(), entry.getValue()); - } - return result; - } - - /** - * 检查限时抢购申请列表参数信息 - * - * @param applyEndTime 申请结束时间 - * @param hours 限时抢购时间段 - * @param seckillApplyList 限时抢购申请列表 + * @param hours 秒杀活动时间段 + * @param seckillApplyList 秒杀活动申请列表 * @param storeId 当前申请商家编号 */ - private void checkSeckillApplyList(Long applyEndTime, String hours, List seckillApplyList, String storeId) { + private void checkSeckillApplyList(String hours, List seckillApplyList, String storeId) { List existSku = new ArrayList<>(); for (SeckillApplyVO seckillApply : seckillApplyList) { seckillApply.setStoreId(storeId); if (seckillApply.getPrice() > seckillApply.getOriginalPrice()) { throw new ServiceException("活动价格不能大于商品原价"); } - - // 检查限时抢购申请的时刻,是否存在在限时抢购的时间段内 + // 检查秒杀活动申请的时刻,是否存在在秒杀活动的时间段内 String[] rangeHours = hours.split(","); boolean containsSame = Arrays.stream(rangeHours).anyMatch(i -> i.equals(seckillApply.getTimeLine().toString())); if (!containsSame) { throw new ServiceException("时刻参数异常"); } - + //检查商品是否参加多个时间段的活动 if (existSku.contains(seckillApply.getSkuId())) { throw new ServiceException(seckillApply.getGoodsName() + "该商品不能同时参加多个时间段的活动"); } else { @@ -418,13 +242,13 @@ public class SeckillApplyServiceImpl extends ServiceImpl hash = cache.getHash(seckillCacheKey); - //如果缓存中存在当前审核商品参与的限时抢购活动商品信息,清除 + //如果缓存中存在当前审核商品参与的秒杀活动活动商品信息,清除 if (hash != null && !hash.isEmpty()) { cache.remove(seckillCacheKey); } } /** - * 从缓存中获取限时抢购信息 + * 从缓存中获取秒杀活动信息 * - * @param seckillCacheKey 限时抢购缓存键 - * @return 限时抢购信息 + * @param seckillCacheKey 秒杀活动缓存键 + * @return 秒杀活动信息 */ private List getSeckillTimelineToCache(String seckillCacheKey) { List timelineList = new ArrayList<>(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - // 查询当天时间段内的且状态不为结束或关闭的限时抢购活动 - queryWrapper.gt(Seckill::getStartTime, new Date(DateUtil.startOfTodDay() * 1000)).lt(Seckill::getEndTime, DateUtil.endOfDate()) + // 查询当天时间段内的且状态不为结束或关闭的秒杀活动活动 + queryWrapper.gt(Seckill::getStartTime, new Date(cn.lili.common.utils.DateUtil.startOfTodDay() * 1000)).lt(Seckill::getEndTime, cn.lili.common.utils.DateUtil.endOfDate()) .and(i -> i.eq(Seckill::getPromotionStatus, PromotionStatusEnum.NEW.name()) .or(j -> j.eq(Seckill::getPromotionStatus, PromotionStatusEnum.START.name()))); List seckillList = seckillService.list(queryWrapper); @@ -482,14 +306,14 @@ public class SeckillApplyServiceImpl extends ServiceImpl= hour || ((i + 1) < hoursSored.length && hoursSored[i + 1] > hour)) { - SimpleDateFormat format = new SimpleDateFormat(DateUtil.STANDARD_DATE_FORMAT); + SimpleDateFormat format = new SimpleDateFormat(cn.lili.common.utils.DateUtil.STANDARD_DATE_FORMAT); String date = format.format(new Date()); //当前时间的秒数 - long currentTime = DateUtil.getDateline(); - //限时抢购的时刻 - long timeLine = DateUtil.getDateline(date + " " + hoursSored[i], "yyyy-MM-dd HH"); + long currentTime = cn.lili.common.utils.DateUtil.getDateline(); + //秒杀活动的时刻 + long timeLine = cn.lili.common.utils.DateUtil.getDateline(date + " " + hoursSored[i], "yyyy-MM-dd HH"); if ((i + 1) < hoursSored.length && hour > hoursSored[i] && hour <= hoursSored[i + 1]) { - timeLine = DateUtil.getDateline(date + " " + hoursSored[i + 1], "yyyy-MM-dd HH"); + timeLine = cn.lili.common.utils.DateUtil.getDateline(date + " " + hoursSored[i + 1], "yyyy-MM-dd HH"); } Long distanceTime = timeLine - currentTime < 0 ? 0 : timeLine - currentTime; tempTimeline.setDistanceStartTime(distanceTime); @@ -506,16 +330,16 @@ public class SeckillApplyServiceImpl extends ServiceImpl wrapperSeckillGoods(Integer startTimeline) { List seckillGoodsVoS = new ArrayList<>(); LambdaQueryWrapper seckillLambdaQueryWrapper = new LambdaQueryWrapper<>(); - seckillLambdaQueryWrapper.gt(Seckill::getStartTime, new Date(DateUtil.startOfTodDay() * 1000)).lt(Seckill::getEndTime, DateUtil.endOfDate()) + seckillLambdaQueryWrapper.gt(Seckill::getStartTime, new Date(cn.lili.common.utils.DateUtil.startOfTodDay() * 1000)).lt(Seckill::getEndTime, cn.lili.common.utils.DateUtil.endOfDate()) .and(i -> i.eq(Seckill::getPromotionStatus, PromotionStatusEnum.NEW.name()) .or(j -> j.eq(Seckill::getPromotionStatus, PromotionStatusEnum.START.name()))); List seckillList = this.seckillService.list(seckillLambdaQueryWrapper); @@ -538,4 +362,58 @@ public class SeckillApplyServiceImpl extends ServiceImpl 0) { + throw new ServiceException("商品[" + goodsSku.getGoodsName() + "]已经在重叠的时间段参加了拼团活动,不能参加秒杀活动"); + } + // 查询是否在同一时间段参与了秒杀活动活动 + if (promotionGoodsService.findInnerOverlapPromotionGoods(PromotionTypeEnum.SECKILL.name(), goodsSku.getId(), startTime, seckill.getEndTime(), seckill.getId()) > 0) { + throw new ServiceException("商品[" + goodsSku.getGoodsName() + "]已经在重叠的时间段参加了秒杀活动,不能参加秒杀活动活动"); + } + } + + /** + * 获取秒杀活动促销商品 + * + * @param goodsSku 商品SKU + * @param seckillApply 秒杀活动申请 + * @param seckill 秒杀活动 + * @return 秒杀活动促销商品 + */ + private PromotionGoods setSeckillGoods(GoodsSku goodsSku, SeckillApply seckillApply, Seckill seckill) { + //设置促销商品默认内容 + PromotionGoods promotionGoods = new PromotionGoods(goodsSku); + promotionGoods.setPrice(seckillApply.getPrice()); + promotionGoods.setQuantity(seckillApply.getQuantity()); + // 设置单独每个促销商品的结束时间 + int nextHour = 23; + String[] split = seckill.getHours().split(","); + int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); + Arrays.sort(hoursSored); + for (int i : hoursSored) { + if (seckillApply.getTimeLine() < i) { + nextHour = i; + break; + } + } + DateTime startTime = DateUtil.offsetHour(seckill.getStartTime(), seckillApply.getTimeLine()); + DateTime parseEndTime = DateUtil.offsetSecond(DateUtil.offsetHour(seckill.getStartTime(), nextHour), 1); + promotionGoods.setStartTime(startTime); + promotionGoods.setEndTime(parseEndTime); + return promotionGoods; + } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java index d36bd81b..532f7d60 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java @@ -1,12 +1,13 @@ package cn.lili.modules.promotion.serviceimpl; import cn.lili.common.trigger.util.DelayQueueTools; -import cn.lili.common.trigger.enums.PromotionDelayTypeEnums; +import cn.lili.common.trigger.enums.DelayTypeEnums; import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.exception.ServiceException; import cn.lili.common.trigger.interfaces.TimeTrigger; import cn.lili.common.trigger.model.TimeExecuteConstant; import cn.lili.common.trigger.model.TimeTriggerMsg; +import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.DateUtil; import cn.lili.common.utils.PageUtil; import cn.lili.common.utils.StringUtils; @@ -25,6 +26,10 @@ import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillService; import cn.lili.modules.promotion.tools.PromotionTools; import cn.lili.modules.search.service.EsGoodsIndexService; +import cn.lili.modules.system.entity.dos.Setting; +import cn.lili.modules.system.entity.dto.SeckillSetting; +import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.service.SettingService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -32,6 +37,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; @@ -43,7 +49,7 @@ import java.util.List; import java.util.stream.Collectors; /** - * 限时抢购业务层实现 + * 秒杀活动业务层实现 * * @author Chopper * @date 2020/8/21 @@ -70,6 +76,9 @@ public class SeckillServiceImpl extends ServiceImpl impl //秒杀申请 @Autowired private SeckillApplyService seckillApplyService; + //设置 + @Autowired + private SettingService settingService; @Override public IPage getSeckillByPageFromMysql(SeckillSearchParams queryParam, PageVO pageVo) { @@ -77,13 +86,6 @@ public class SeckillServiceImpl extends ServiceImpl impl return page(PageUtil.initPage(pageVo), queryWrapper); } - /** - * 从mongo中根据条件获取限时抢购分页列表 - * - * @param queryParam 查询参数 - * @param pageVo 分页参数 - * @return 限时抢购分页列表 - */ @Override public IPage getSeckillByPageFromMongo(SeckillSearchParams queryParam, PageVO pageVo) { IPage seckill = new Page<>(pageVo.getPageNumber(), pageVo.getPageSize()); @@ -101,27 +103,34 @@ public class SeckillServiceImpl extends ServiceImpl impl return seckill; } - /** - * 从mongo中获取限时抢购信息 - * - * @param id 限时抢购id - * @return 限时抢购信息 - */ @Override public SeckillVO getSeckillByIdFromMongo(String id) { return this.checkSeckillExist(id); } @Override - public boolean saveSeckill(SeckillVO seckill) { - // 检查限时抢购参数 - checkSeckillParam(seckill, seckill.getStoreId()); - seckill.setPromotionStatus(PromotionStatusEnum.NEW.name()); + public void init() { + Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); + SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); + for (int i=1;i<=30;i++){ + Seckill seckill = new Seckill(i,seckillSetting.getHours(), seckillSetting.getSeckillRule()); + this.saveSeckill(seckill); + } + } + + @Override + public boolean saveSeckill(Seckill seckill) { + + SeckillVO seckillVO=new SeckillVO(); + BeanUtil.copyProperties(seckill,seckillVO); + // 检查秒杀活动参数 + checkSeckillParam(seckillVO, seckill.getStoreId()); // 保存到MYSQL中 boolean result = this.save(seckill); // 保存到MONGO中 - this.mongoTemplate.save(seckill); - this.addSeckillStartTask(seckill); + this.mongoTemplate.save(seckillVO); + //添加秒杀延时任务 + this.addSeckillStartTask(seckillVO); return result; } @@ -135,17 +144,18 @@ public class SeckillServiceImpl extends ServiceImpl impl storeIds = storeId + ","; } seckill.setStoreIds(storeIds); + this.updateById(seckill); } @Override public boolean modifySeckill(SeckillVO seckillVO) { - // 检查该限时抢购是否存在 + // 检查该秒杀活动是否存在 SeckillVO seckill = checkSeckillExist(seckillVO.getId()); if (PromotionStatusEnum.START.name().equals(seckillVO.getPromotionStatus())) { throw new ServiceException("活动已经开始,不能进行编辑删除操作"); } - // 检查限时抢购参数 + // 检查秒杀活动参数 this.checkSeckillParam(seckillVO, seckillVO.getStoreId()); // 更新到MYSQL中 @@ -159,7 +169,7 @@ public class SeckillServiceImpl extends ServiceImpl impl promotionMessage, seckill.getStartTime().getTime(), seckillVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DateUtil.getDelayTime(seckillVO.getStartTime().getTime()), rocketmqCustomProperties.getPromotionTopic()); } @@ -170,7 +180,7 @@ public class SeckillServiceImpl extends ServiceImpl impl public void deleteSeckill(String id) { Seckill seckill = checkSeckillExist(id); if (PromotionStatusEnum.CLOSE.name().equals(seckill.getPromotionStatus()) || PromotionStatusEnum.END.name().equals(seckill.getPromotionStatus())) { - // 更新限时抢购状态为关闭,标示删除标志 + // 更新秒杀活动状态为关闭,标示删除标志 LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper().eq(Seckill::getId, id).set(Seckill::getDeleteFlag, true).set(Seckill::getPromotionStatus, PromotionStatusEnum.CLOSE.name()); this.update(updateWrapper); LambdaUpdateWrapper seckillApplyLambdaUpdateWrapper = new LambdaUpdateWrapper().eq(SeckillApply::getSeckillId, id).set(SeckillApply::getDeleteFlag, true); @@ -180,17 +190,17 @@ public class SeckillServiceImpl extends ServiceImpl impl this.promotionGoodsService.update(promotionGoodsQueryWrapper); this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, seckill.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())), rocketmqCustomProperties.getPromotionTopic()); } else { - throw new ServiceException("该限时抢购活动的状态不能删除"); + throw new ServiceException("该秒杀活动活动的状态不能删除"); } } /** - * 开启一个限时抢购 + * 开启一个秒杀活动 * - * @param id 限时抢购编号 + * @param id 秒杀活动编号 */ @Override public void openSeckill(String id) { @@ -223,11 +233,11 @@ public class SeckillServiceImpl extends ServiceImpl impl } this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, seckillVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckillVO.getId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckillVO.getId())), rocketmqCustomProperties.getPromotionTopic()); } } else { - throw new ServiceException("该限时抢购活动的状态不能关闭"); + throw new ServiceException("该秒杀活动活动的状态不能关闭"); } } @@ -240,39 +250,47 @@ public class SeckillServiceImpl extends ServiceImpl impl return this.count(queryWrapper); } + @Override + public void updateSeckillGoodsNum(String seckillId) { + this.baseMapper.updateSeckillGoodsNum(seckillId); + } + + /** + * 添加秒杀活动延时任务 + * @param seckill 秒杀活动 + */ private void addSeckillStartTask(SeckillVO seckill) { PromotionMessage promotionMessage = new PromotionMessage(seckill.getId(), PromotionTypeEnum.SECKILL.name(), PromotionStatusEnum.START.name(), seckill.getStartTime(), seckill.getEndTime()); TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, seckill.getStartTime().getTime(), promotionMessage, - DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), rocketmqCustomProperties.getPromotionTopic()); // 发送促销活动开始的延时任务 this.timeTrigger.addDelay(timeTriggerMsg); } /** - * 检查该限时抢购是否存在 + * 检查该秒杀活动是否存在 * - * @param id 限时抢购编号 - * @return 限时抢购信息 + * @param id 秒杀活动编号 + * @return 秒杀活动信息 */ private SeckillVO checkSeckillExist(String id) { SeckillVO seckill = this.mongoTemplate.findById(id, SeckillVO.class); if (seckill == null) { - throw new ServiceException("当前限时抢购活动不存在"); + throw new ServiceException("当前秒杀活动活动不存在"); } return seckill; } /** - * 检查限时抢购参数 + * 检查秒杀活动参数 * - * @param seckill 限时抢购信息 + * @param seckill 秒杀活动信息 * @param storeId 卖家编号 */ private void checkSeckillParam(SeckillVO seckill, String storeId) { - seckill.checkTime(); // 同一时间段内相同的活动 QueryWrapper queryWrapper = PromotionTools.checkActiveTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL, storeId, seckill.getId()); int sameNum = this.count(queryWrapper); diff --git a/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionCacheKeys.java b/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionCacheKeys.java index e2f4be21..b2a7a150 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionCacheKeys.java +++ b/framework/src/main/java/cn/lili/modules/promotion/tools/PromotionCacheKeys.java @@ -28,7 +28,7 @@ public class PromotionCacheKeys { } /** - * 读取满优惠redis key + * 读取秒杀活动redis key * @param timeStr 时间字符串(格式为 yyyyMMdd) * @return 满优惠redis key */ diff --git a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedServiceImpl.java b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedServiceImpl.java index 8dbdd847..cb7d3833 100644 --- a/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/purchase/serviceimpl/PurchaseQuotedServiceImpl.java @@ -25,8 +25,6 @@ import java.util.List; @Service @Transactional public class PurchaseQuotedServiceImpl extends ServiceImpl implements PurchaseQuotedService { - @Autowired - private PurchaseQuotedMapper purchaseQuotedMapper; @Autowired private PurchaseQuotedItemService purchaseQuotedItemService; diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dos/EsGoodsIndex.java b/framework/src/main/java/cn/lili/modules/search/entity/dos/EsGoodsIndex.java index e9ccef56..a1baae33 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/dos/EsGoodsIndex.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/dos/EsGoodsIndex.java @@ -8,7 +8,6 @@ import cn.lili.modules.goods.entity.dos.GoodsSku; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; import org.springframework.data.annotation.Id; @@ -226,6 +225,12 @@ public class EsGoodsIndex implements Serializable { @Field(type = FieldType.Date, format = DateFormat.basic_date_time) private Date releaseTime; + /** + * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum + */ + @ApiModelProperty(value = "商品类型", required = true) + private String goodsType; + /** * 商品属性(参数和规格) */ diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/CustomWordsServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/CustomWordsServiceImpl.java index a4185096..4eb7ea7a 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/CustomWordsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/CustomWordsServiceImpl.java @@ -24,7 +24,6 @@ import java.util.List; @Service public class CustomWordsServiceImpl extends ServiceImpl implements CustomWordsService { - @Override public String deploy() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(CustomWords::getDisabled, 1); @@ -41,7 +40,7 @@ public class CustomWordsServiceImpl extends ServiceImpl implements GoodsStatisticsDataService { - /** - * 商品统计 - */ - @Autowired - private GoodsStatisticsDataMapper goodsStatisticsDataMapper; - @Override public List getGoodsStatisticsData(GoodsStatisticsQueryParam goodsStatisticsQueryParam, Integer num) { //获取查询条件 @@ -46,8 +40,7 @@ public class GoodsStatisticsDataServiceImpl extends ServiceImpl(1, num); - - return goodsStatisticsDataMapper.getGoodsStatisticsData(page, queryWrapper); + return this.baseMapper.getGoodsStatisticsData(page, queryWrapper); } @Override @@ -56,7 +49,7 @@ public class GoodsStatisticsDataServiceImpl extends ServiceImpl implements MemberStatisticsDataService { - @Override public Integer getMemberCount() { QueryWrapper queryWrapper = new QueryWrapper(); diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsDataServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsDataServiceImpl.java index a6fb285e..870970b6 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsDataServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/OrderStatisticsDataServiceImpl.java @@ -36,10 +36,6 @@ import java.util.*; */ @Service public class OrderStatisticsDataServiceImpl extends ServiceImpl implements OrderStatisticsDataService { - - //订单统计 - @Autowired - private OrderStatisticsDataMapper orderStatisticsDataMapper; //平台PV统计 @Autowired private PlatformViewDataService platformViewDataService; @@ -215,7 +211,7 @@ public class OrderStatisticsDataServiceImpl extends ServiceImpl orderStatisticsDataVOS = orderStatisticsDataMapper.getOrderStatisticsData(queryWrapper); + List orderStatisticsDataVOS = this.baseMapper.getOrderStatisticsData(queryWrapper); Calendar calendar = Calendar.getInstance(); calendar.setTime(dates[0]); diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewDataServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewDataServiceImpl.java index 84adf2d1..8d69e54f 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewDataServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/PlatformViewDataServiceImpl.java @@ -48,9 +48,6 @@ public class PlatformViewDataServiceImpl extends ServiceImpl implements RefundOrderStatisticsService { - //退款统计 - @Autowired - private RefundOrderStatisticsDataMapper refundOrderStatisticsDataMapper; - @Override public IPage getRefundOrderStatisticsData(PageVO pageVO, StatisticsQueryParam statisticsQueryParam) { QueryWrapper queryWrapper = getQueryWrapper(statisticsQueryParam); - return refundOrderStatisticsDataMapper.getRefundStatisticsData(PageUtil.initPage(pageVO), queryWrapper); + return this.baseMapper.getRefundStatisticsData(PageUtil.initPage(pageVO), queryWrapper); } @Override diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplate.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplate.java index 98058968..ffdbc8b0 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplate.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/FreightTemplate.java @@ -13,9 +13,9 @@ import javax.validation.constraints.NotEmpty; /** * 运费模板 + * * @author Chopper * @date 2020/11/17 4:27 下午 - * */ @Data @Entity @@ -35,7 +35,7 @@ public class FreightTemplate extends BaseEntity { * @see FreightTemplateEnum */ @NotEmpty(message = "计价方式不能为空") - @ApiModelProperty(value = "计价方式:按件、按重量", allowableValues = "WEIGHT, NUM") + @ApiModelProperty(value = "计价方式:按件、按重量", allowableValues = "WEIGHT,NUM,FREE") private String pricingMethod; 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 c271a186..27c2c9be 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 @@ -95,6 +95,12 @@ public class Store extends BaseEntity { @ApiModelProperty(value = "收藏数量") private Integer collectionNum; + @ApiModelProperty(value = "腾讯云智服唯一标识") + private String yzfSign; + + @ApiModelProperty(value = "腾讯云智服小程序唯一标识") + private String yzfMpSign; + public Store(Member member) { this.memberId = member.getId(); this.memberName = member.getUsername(); diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreEditDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreEditDTO.java index 33616b57..6b6bfe50 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreEditDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreEditDTO.java @@ -42,4 +42,10 @@ public class StoreEditDTO extends StoreDetail { @ApiModelProperty(value = "详细地址") private String storeAddressDetail; + @ApiModelProperty(value = "腾讯云智服唯一标识") + private String yzfSign; + + @ApiModelProperty(value = "腾讯云智服小程序唯一标识") + private String yzfMpSign; + } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/enums/FreightTemplateEnum.java b/framework/src/main/java/cn/lili/modules/store/entity/enums/FreightTemplateEnum.java index d4a3c720..e1a1a404 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/enums/FreightTemplateEnum.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/enums/FreightTemplateEnum.java @@ -11,8 +11,9 @@ public enum FreightTemplateEnum { /** * 重量 * 件数 + * 包邮 */ - WEIGHT, NUM + WEIGHT, NUM, FREE } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreBasicInfoVO.java b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreBasicInfoVO.java index ffbcae0c..f337722a 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreBasicInfoVO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/vos/StoreBasicInfoVO.java @@ -14,7 +14,7 @@ import lombok.Data; public class StoreBasicInfoVO { @ApiModelProperty(value = "店铺ID") - private Long storeId; + private String storeId; @ApiModelProperty(value = "店铺名称") private String storeName; @@ -42,4 +42,17 @@ public class StoreBasicInfoVO { @ApiModelProperty(value = "是否自营") private String selfOperated; + + @ApiModelProperty(value = "商品数量") + private Integer goodsNum; + + @ApiModelProperty(value = "收藏数量") + private Integer collectionNum; + + @ApiModelProperty(value = "腾讯云智服唯一标识") + private String yzfSign; + + @ApiModelProperty(value = "腾讯云智服小程序唯一标识") + private String yzfMpSign; + } diff --git a/framework/src/main/java/cn/lili/modules/store/mapper/StoreDetailMapper.java b/framework/src/main/java/cn/lili/modules/store/mapper/StoreDetailMapper.java index 3751a445..c6e0a920 100644 --- a/framework/src/main/java/cn/lili/modules/store/mapper/StoreDetailMapper.java +++ b/framework/src/main/java/cn/lili/modules/store/mapper/StoreDetailMapper.java @@ -20,15 +20,15 @@ import java.util.List; */ public interface StoreDetailMapper extends BaseMapper { - @Select("select s.store_logo,s.member_name,s.store_name,s.store_disable,s.self_operated,s.store_address_detail,s.store_address_path,s.store_address_id_path,s.store_center,s.store_desc,d.* " + - "from li_store s inner join li_store_detail d on s.id=d.store_id where s.id=#{storeId}") + @Select("select s.store_logo,s.member_name,s.store_name,s.store_disable,s.self_operated,s.store_address_detail,s.store_address_path,s.store_address_id_path,s.store_center,s.store_desc,s.yzf_sign," + + "d.* from li_store s inner join li_store_detail d on s.id=d.store_id where s.id=#{storeId}") StoreDetailVO getStoreDetail(String storeId); @Select("select s.member_name,s.store_name,s.store_disable,s.self_operated,s.store_center,s.store_logo,s.store_desc,d.* " + "from li_store s inner join li_store_detail d on s.id=d.store_id where s.member_id=#{memberId}") StoreDetailVO getStoreDetailByMemberId(String memberId); - @Select("SELECT s.id as storeId,s.* FROM li_store s LEFT JOIN li_store_detail sd ON s.id=sd.store_id WHERE s.id=#{storeId}") + @Select("SELECT s.id as storeId,s.* FROM li_store s WHERE s.id=#{storeId}") StoreBasicInfoVO getStoreBasicInfoDTO(String storeId); @Select("select s.sales_consignee_name,s.sales_consignee_mobile,s.sales_consignee_address_id,s.sales_consignee_address_path,s.sales_consignee_detail " + diff --git a/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateService.java b/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateService.java index cecc0ba2..c4b82724 100644 --- a/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateService.java +++ b/framework/src/main/java/cn/lili/modules/store/service/FreightTemplateService.java @@ -41,6 +41,7 @@ public interface FreightTemplateService extends IService { /** * 添加商家运费模板 + * 运费模板分为卖家包邮、运费计算两种类型 * * @param freightTemplateVO 运费模板 * @return 运费模板 diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java index 17712da7..36c92826 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/BillServiceImpl.java @@ -160,7 +160,7 @@ public class BillServiceImpl extends ServiceImpl implements Bi @Override public IPage billPage(BillSearchParams billSearchParams) { QueryWrapper queryWrapper = billSearchParams.queryWrapper(); - return billMapper.queryBillPage(PageUtil.initPage(billSearchParams), queryWrapper); + return this.baseMapper.queryBillPage(PageUtil.initPage(billSearchParams), queryWrapper); } @Override diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceChildImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceChildImpl.java index 764f34ec..46224790 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceChildImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceChildImpl.java @@ -6,8 +6,6 @@ import cn.lili.modules.store.service.FreightTemplateChildService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,15 +21,11 @@ import java.util.List; @Transactional(rollbackFor = Exception.class) public class FreightTemplateServiceChildImpl extends ServiceImpl implements FreightTemplateChildService { - //配送子模板数据层 - @Autowired - private FreightTemplateChildMapper freightTemplateChildMapper; - @Override public List getFreightTemplateChild(String freightTemplateId) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(FreightTemplateChild::getFreightTemplateId, freightTemplateId); - return freightTemplateChildMapper.selectList(lambdaQueryWrapper); + return this.baseMapper.selectList(lambdaQueryWrapper); } @Override diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceImpl.java index 40771f63..a239e50e 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/FreightTemplateServiceImpl.java @@ -19,7 +19,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -37,10 +36,6 @@ import java.util.List; @Service @Transactional(rollbackFor = Exception.class) public class FreightTemplateServiceImpl extends ServiceImpl implements FreightTemplateService { - - //配送模板 - @Autowired - private FreightTemplateMapper freightTemplateMapper; //配送子模板 @Autowired private FreightTemplateChildService freightTemplateChildService; @@ -60,7 +55,7 @@ public class FreightTemplateServiceImpl extends ServiceImpl lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(FreightTemplate::getStoreId, UserContext.getCurrentUser().getId()); - List freightTemplates = freightTemplateMapper.selectList(lambdaQueryWrapper); + List freightTemplates = this.baseMapper.selectList(lambdaQueryWrapper); if (!freightTemplates.isEmpty()) { //如果模板不为空则查询子模板信息 for (FreightTemplate freightTemplate : freightTemplates) { @@ -80,18 +75,16 @@ public class FreightTemplateServiceImpl extends ServiceImpl getFreightTemplate(PageVO pageVo) { - //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); - lambdaQueryWrapper.eq(FreightTemplate::getStoreId, UserContext.getCurrentUser().getId()); - return freightTemplateMapper.selectPage(PageUtil.initPage(pageVo), lambdaQueryWrapper); + lambdaQueryWrapper.eq(FreightTemplate::getStoreId, UserContext.getCurrentUser().getStoreId()); + return this.baseMapper.selectPage(PageUtil.initPage(pageVo), lambdaQueryWrapper); } @Override public FreightTemplateVO getFreightTemplate(String id) { FreightTemplateVO freightTemplateVO = new FreightTemplateVO(); //获取运费模板 - FreightTemplate freightTemplate = freightTemplateMapper.selectById(id); + FreightTemplate freightTemplate = this.getById(id); if (freightTemplate != null) { //复制属性 BeanUtils.copyProperties(freightTemplate, freightTemplateVO); @@ -112,15 +105,19 @@ public class FreightTemplateServiceImpl extends ServiceImpl list = new ArrayList<>(); - for (FreightTemplateChild freightTemplateChild : freightTemplateVO.getFreightTemplateChildList()) { - freightTemplateChild.setFreightTemplateId(freightTemplate.getId()); - list.add(freightTemplateChild); + //如果子运费模板不为空则进行新增 + if(freightTemplateVO.getFreightTemplateChildList()!=null){ + for (FreightTemplateChild freightTemplateChild : freightTemplateVO.getFreightTemplateChildList()) { + freightTemplateChild.setFreightTemplateId(freightTemplate.getId()); + list.add(freightTemplateChild); + } + //添加运费模板子内容 + freightTemplateChildService.addFreightTemplateChild(list); } - //添加运费模板子内容 - freightTemplateChildService.addFreightTemplateChild(list); + //更新缓存 cache.remove(CachePrefix.SHIP_TEMPLATE.getPrefix() + tokenUser.getStoreId()); return freightTemplateVO; @@ -138,7 +135,7 @@ public class FreightTemplateServiceImpl extends ServiceImpl implements StoreAddressService { - @Autowired - private StoreAddressMapper storeAddressMapper; - @Override public IPage getStoreAddress(PageVO pageVo) { //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(StoreAddress::getStoreId, UserContext.getCurrentUser().getStoreId()); - return storeAddressMapper.selectPage(PageUtil.initPage(pageVo), lambdaQueryWrapper); + return this.page(PageUtil.initPage(pageVo), lambdaQueryWrapper); } @Override public StoreAddress addStoreAddress(StoreAddress storeAddress) { //获取当前登录商家账号 - AuthUser tokenUser = UserContext.getCurrentUser(); - storeAddress.setStoreId(tokenUser.getId()); + storeAddress.setStoreId(UserContext.getCurrentUser().getStoreId()); //添加自提点 - storeAddressMapper.insert(storeAddress); + this.save(storeAddress); return storeAddress; } @@ -54,13 +47,12 @@ public class StoreAddressServiceImpl extends ServiceImpl implements StoreDetailService { - //店铺详情数据层 - @Autowired - private StoreDetailMapper storeDetailMapper; //店铺 @Autowired private StoreService storeService; @@ -49,12 +45,12 @@ public class StoreDetailServiceImpl extends ServiceImpl implements StoreGoodsLabelService { - @Autowired - private StoreGoodsLabelMapper storeGoodsLabelMapper; - @Override public List listByStoreId(String storeId) { //TODO 从缓存获取店铺商品分类列表 @@ -68,7 +63,7 @@ public class StoreGoodsLabelServiceImpl extends ServiceImpl list(String storeId) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(StoreGoodsLabel::getStoreId, storeId); - return storeGoodsLabelMapper.selectList(queryWrapper); + return this.baseMapper.selectList(queryWrapper); } @Override @@ -76,7 +71,7 @@ public class StoreGoodsLabelServiceImpl extends ServiceImpl lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.eq(StoreGoodsLabel::getStoreId, tokenUser.getStoreId()); lambdaUpdateWrapper.eq(StoreGoodsLabel::getId, storeGoodsLabel.getId()); - storeGoodsLabelMapper.update(storeGoodsLabel, lambdaUpdateWrapper); + this.update(storeGoodsLabel, lambdaUpdateWrapper); return storeGoodsLabel; } @Override public void removeStoreGoodsLabel(String storeLabelId) { - storeGoodsLabelMapper.deleteById(storeLabelId); + this.removeById(storeLabelId); } } diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreServiceImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreServiceImpl.java index 6921a843..687b9eb5 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreServiceImpl.java @@ -38,7 +38,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; import java.util.Optional; /** @@ -51,9 +50,6 @@ import java.util.Optional; @Transactional(rollbackFor = Exception.class) public class StoreServiceImpl extends ServiceImpl implements StoreService { - //店铺 - @Resource - private StoreMapper storeMapper; //会员 @Autowired private MemberService memberService; @@ -75,12 +71,12 @@ public class StoreServiceImpl extends ServiceImpl implements @Override public IPage findByConditionPage(StoreSearchParams storeSearchParams, PageVO page) { - return storeMapper.getStoreList(PageUtil.initPage(page), storeSearchParams.queryWrapper()); + return this.baseMapper.getStoreList(PageUtil.initPage(page), storeSearchParams.queryWrapper()); } @Override public StoreVO getStoreDetail() { - StoreVO storeVO = storeMapper.getStoreDetail(UserContext.getCurrentUser().getStoreId()); + StoreVO storeVO = this.baseMapper.getStoreDetail(UserContext.getCurrentUser().getStoreId()); storeVO.setNickName(UserContext.getCurrentUser().getNickName()); return storeVO; } @@ -168,7 +164,7 @@ public class StoreServiceImpl extends ServiceImpl implements @Override public boolean audit(String id, Integer passed) { - Store store = storeMapper.selectById(id); + Store store = this.getById(id); if (store == null) { throw new ServiceException(ResultCode.STORE_NOT_EXIST); } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/ExperienceSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/ExperienceSetting.java new file mode 100644 index 00000000..be6d0a72 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/ExperienceSetting.java @@ -0,0 +1,33 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 经验值设置 + * + * @author Bulbasaur + * @date: 2021/5/16 11:10 下午 + */ +@Data +public class ExperienceSetting implements Serializable { + + private static final long serialVersionUID = -4261856614779031745L; + @ApiModelProperty(value = "注册") + private Integer register; + + @ApiModelProperty(value = "每日签到经验值") + private Integer signIn; + + @ApiModelProperty(value = "订单评价赠送经验值") + private Integer comment; + + @ApiModelProperty(value = "分享获取经验值") + private Integer share; + + @ApiModelProperty(value = "购物获取经验值,一元*经验值") + private Integer money; + +} diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java index 0e5d29dd..15d4c46b 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/PointSetting.java @@ -20,7 +20,7 @@ public class PointSetting implements Serializable { @ApiModelProperty(value = "注册") private Integer register; - @ApiModelProperty(value = "1积分等于多少元") + @ApiModelProperty(value = "1元等级*积分") private Integer money; @ApiModelProperty(value = "每日签到积分") diff --git a/framework/src/main/java/cn/lili/modules/system/entity/dto/SeckillSetting.java b/framework/src/main/java/cn/lili/modules/system/entity/dto/SeckillSetting.java new file mode 100644 index 00000000..d5c0075e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/system/entity/dto/SeckillSetting.java @@ -0,0 +1,25 @@ +package cn.lili.modules.system.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 秒杀活动设置 + * + * @author Bulbasaur + * @date: 2021/5/24 3:27 下午 + */ +@Data +public class SeckillSetting implements Serializable { + + @ApiModelProperty(value = "开启几点场 例如:6,8,12") + @NotNull(message = "活动时间段不能为空") + private String hours; + + @ApiModelProperty(value = "秒杀规则") + @NotNull(message = "秒杀规则不能为空") + private String seckillRule; +} 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 bffbae87..23c8fbda 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 @@ -27,6 +27,10 @@ public enum SettingEnum { SMS_SETTING, //积分设置 POINT_SETTING, + //经验值设置 + EXPERIENCE_SETTING, + //秒杀活动设置 + SECKILL_SETTING, //微信 联合登陆设置 WECHAT_CONNECT, @@ -38,5 +42,5 @@ public enum SettingEnum { //支付宝支付设置 ALIPAY_PAYMENT, //微信支付设置 - WECHAT_PAYMENT, + WECHAT_PAYMENT; } diff --git a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/DadaPlugin.java b/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/DadaPlugin.java index 9d1a913d..876c15cc 100644 --- a/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/DadaPlugin.java +++ b/framework/src/main/java/cn/lili/modules/system/entity/plugin/InstantDelivery/dada/DadaPlugin.java @@ -20,8 +20,7 @@ import cn.lili.modules.system.entity.vo.InstantDeliveryResultVO; import cn.lili.modules.system.service.InstantDeliveryLogService; import cn.lili.modules.system.utils.HttpUtils; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -38,11 +37,10 @@ import java.util.Map; * @Description: * @since 2020/12/01 15:58 */ +@Slf4j @Component("ddPlugin") public class DadaPlugin implements InstantDeliveryPlugin { - private final Logger logger = LoggerFactory.getLogger(getClass()); - @Autowired private StoreDetailService storeDetailService; @Autowired @@ -186,7 +184,7 @@ public class DadaPlugin implements InstantDeliveryPlugin { //组织返回参数 InstantDeliveryResultVO instantDeliveryResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); if (instantDeliveryResultVO.getStatus().equals("fail")) { - logger.error("达达店铺信息修改失败," + instantDeliveryResultVO.getMsg()); + log.error("达达店铺信息修改失败",instantDeliveryResultVO.getMsg()); } return instantDeliveryResultVO; } @@ -273,17 +271,17 @@ public class DadaPlugin implements InstantDeliveryPlugin { } InstantDeliveryResultVO instantDeliveryResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); if (instantDeliveryResultVO.getStatus().equals("fail")) { - logger.error("达达订单发送失败,订单号为" + order.getSn() + "," + instantDeliveryResultVO.getMsg()); + log.error("达达订单发送失败,订单号为",order.getSn() + "," + instantDeliveryResultVO.getMsg()); //如果发送失败择等待一秒重新发送,如果失败择记录日志 try { Thread.sleep(1000); } catch (Exception e) { - e.printStackTrace(); + log.error("达达订单发布失败",e); } result = HttpUtils.doPostWithJson(url + InstantDeliveryUrl.DD_RE_ADD_ORDER.getUrl(), requstJson); InstantDeliveryResultVO instantDeliveryResResultVO = JSONUtil.toBean(result, InstantDeliveryResultVO.class); if (instantDeliveryResResultVO.getStatus().equals("fail")) { - logger.error("达达订单重试发送失败,订单号为" + order.getSn() + "," + instantDeliveryResultVO.getMsg()); + log.error("达达订单重试发送失败,订单号为" + order.getSn() + "," + instantDeliveryResultVO.getMsg()); } } return instantDeliveryResultVO; diff --git a/framework/src/main/java/cn/lili/modules/system/mapper/StoreLogisticsMapper.java b/framework/src/main/java/cn/lili/modules/system/mapper/StoreLogisticsMapper.java index d441d321..23bb348b 100644 --- a/framework/src/main/java/cn/lili/modules/system/mapper/StoreLogisticsMapper.java +++ b/framework/src/main/java/cn/lili/modules/system/mapper/StoreLogisticsMapper.java @@ -18,6 +18,9 @@ public interface StoreLogisticsMapper extends BaseMapper { @Select("SELECT l.* FROM li_logistics l RIGHT JOIN li_store_logistics sl ON l.id=sl.logistics_id WHERE sl.store_id=#{storeId}") List getSelectedStoreLogistics(String storeId); + @Select("SELECT l.name FROM li_logistics l RIGHT JOIN li_store_logistics sl ON l.id=sl.logistics_id WHERE sl.store_id=#{storeId}") + List getSelectedStoreLogisticsName(String storeId); + @Select("SELECT *, ( SELECT sl.id FROM li_store_logistics sl WHERE l.id = sl.logistics_id AND sl.store_id=#{storeId} ) AS selected FROM li_logistics l;") List getStoreLogistics(String storeId); diff --git a/framework/src/main/java/cn/lili/modules/system/service/StoreLogisticsService.java b/framework/src/main/java/cn/lili/modules/system/service/StoreLogisticsService.java index 0fb6adc3..8d4e39be 100644 --- a/framework/src/main/java/cn/lili/modules/system/service/StoreLogisticsService.java +++ b/framework/src/main/java/cn/lili/modules/system/service/StoreLogisticsService.java @@ -28,6 +28,13 @@ public interface StoreLogisticsService extends IService { */ List getStoreSelectedLogistics(); + /** + * 获取当前店铺已选择的物流公司名称列表 + * + * @return 物流公司列表 + */ + List getStoreSelectedLogisticsName(); + /** * 添加店铺-物流公司 * diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/AppVersionServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/AppVersionServiceImpl.java index 45a31a10..bf6e05ec 100644 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/AppVersionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/system/serviceimpl/AppVersionServiceImpl.java @@ -2,6 +2,7 @@ package cn.lili.modules.system.serviceimpl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; +import cn.lili.modules.goods.entity.dos.Brand; import cn.lili.modules.system.entity.dos.AppVersion; import cn.lili.modules.system.mapper.AppVersionMapper; import cn.lili.modules.system.service.AppVersionService; @@ -29,7 +30,9 @@ public class AppVersionServiceImpl extends ServiceImpl().eq(AppVersion::getVersion,appVersion.getVersion()))){ + if (null != this.getOne(new LambdaQueryWrapper() + .eq(AppVersion::getVersion, appVersion.getVersion()) + .ne(appVersion.getId() != null, AppVersion::getId, appVersion.getId()))) { throw new ServiceException(ResultCode.APP_VERSION_EXIST); } return true; diff --git a/framework/src/main/java/cn/lili/modules/system/serviceimpl/LogisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/system/serviceimpl/LogisticsServiceImpl.java index 32e869b3..5228eef1 100644 --- a/framework/src/main/java/cn/lili/modules/system/serviceimpl/LogisticsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/system/serviceimpl/LogisticsServiceImpl.java @@ -1,13 +1,13 @@ package cn.lili.modules.system.serviceimpl; import cn.hutool.core.util.StrUtil; -import cn.lili.common.exception.ServiceException; import cn.lili.common.enums.SwitchEnum; +import cn.lili.common.exception.ServiceException; import cn.lili.modules.system.entity.dos.Logistics; import cn.lili.modules.system.entity.dos.Setting; -import cn.lili.modules.system.entity.vo.Traces; import cn.lili.modules.system.entity.dto.KuaidiSetting; import cn.lili.modules.system.entity.enums.SettingEnum; +import cn.lili.modules.system.entity.vo.Traces; import cn.lili.modules.system.mapper.LogisticsMapper; import cn.lili.modules.system.service.LogisticsService; import cn.lili.modules.system.service.SettingService; @@ -15,7 +15,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.gson.Gson; -import lombok.RequiredArgsConstructor; +import groovy.util.logging.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,6 +36,7 @@ import java.util.Map; * @author Chopper * @date 2020/11/17 8:02 下午 */ +@Slf4j @Service @Transactional public class LogisticsServiceImpl extends ServiceImpl implements LogisticsService { @@ -47,7 +48,8 @@ public class LogisticsServiceImpl extends ServiceImpl implements StoreLogisticsService { - @Autowired - private StoreLogisticsMapper storeLogisticsMapper; - @Override public List getStoreLogistics() { - return storeLogisticsMapper.getStoreLogistics(UserContext.getCurrentUser().getStoreId()); + return this.baseMapper.getStoreLogistics(UserContext.getCurrentUser().getStoreId()); } @Override public List getStoreSelectedLogistics() { - return storeLogisticsMapper.getSelectedStoreLogistics(UserContext.getCurrentUser().getStoreId()); + return this.baseMapper.getSelectedStoreLogistics(UserContext.getCurrentUser().getStoreId()); } + @Override + public List getStoreSelectedLogisticsName() { + return this.baseMapper.getSelectedStoreLogisticsName(UserContext.getCurrentUser().getStoreId()); + } + @Override public StoreLogistics add(String logisticsId) { //判断是否已经选择过,如果没有选择则进行添加 diff --git a/framework/src/main/java/cn/lili/modules/system/utils/HttpUtils.java b/framework/src/main/java/cn/lili/modules/system/utils/HttpUtils.java index 43d8ce41..af24f0e2 100644 --- a/framework/src/main/java/cn/lili/modules/system/utils/HttpUtils.java +++ b/framework/src/main/java/cn/lili/modules/system/utils/HttpUtils.java @@ -1,21 +1,15 @@ package cn.lili.modules.system.utils; import com.alibaba.fastjson.JSONObject; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.message.BasicHeader; -import org.apache.http.protocol.HTTP; +import lombok.extern.slf4j.Slf4j; import java.io.*; -import java.net.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; /** * Http工具 @@ -23,19 +17,12 @@ import java.util.Map.Entry; * @author pikachu * @date 2018/3/13 */ +@Slf4j public final class HttpUtils { public static final int HTTP_CONN_TIMEOUT = 100000; public static final int HTTP_SOCKET_TIMEOUT = 100000; - public static String doPost(String reqUrl, Map parameters) { - return doPost(reqUrl, parameters, "UTF-8", HTTP_CONN_TIMEOUT, HTTP_SOCKET_TIMEOUT); - } - - public static String doPost(String reqUrl, Map parameters, String encoding) { - return doPost(reqUrl, parameters, encoding, HTTP_CONN_TIMEOUT, HTTP_SOCKET_TIMEOUT); - } - public static String doPost(String reqUrl, Map parameters, String encoding, int connectTimeout, int readTimeout) { HttpURLConnection urlConn = null; @@ -54,8 +41,8 @@ public final class HttpUtils { /** * post携带json请求 * - * @param reqUrl - * @param jsonParameters + * @param reqUrl 请求地址 + * @param jsonParameters 参数 * @return */ public static String doPostWithJson(String reqUrl, Map jsonParameters) { @@ -88,7 +75,50 @@ public final class HttpUtils { return res; } catch (IOException e) { - e.printStackTrace(); + log.error("post请求错误",e); + } + return "error"; // 自定义错误信息 + + } + + /** + * post携带json请求 + * + * @param reqUrl 请求地址 + * @param object 对象 + * @return + */ + public static String doPostWithJson(String reqUrl, Object object) { + + BufferedReader reader = null; + try { + URL url = new URL(reqUrl);// 创建连接 + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(false); + connection.setInstanceFollowRedirects(true); + connection.setRequestMethod("POST"); // 设置请求方式 + // connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式 + connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式 + connection.connect(); + //一定要用BufferedReader 来接收响应, 使用字节来接收响应的方法是接收不到内容的 + OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8); // utf-8编码 + out.append(JSONObject.toJSONString(object)); + out.flush(); + out.close(); + // 读取响应 + reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); + String line; + String res = ""; + while ((line = reader.readLine()) != null) { + res += line; + } + reader.close(); + + return res; + } catch (IOException e) { + log.error("post错误",e); } return "error"; // 自定义错误信息 @@ -178,16 +208,6 @@ public final class HttpUtils { } } - /** - * UTF-8编码 - * - * @param link - * @return - */ - public static String doGet(String link) { - return doGet(link, "UTF-8", HTTP_CONN_TIMEOUT, HTTP_SOCKET_TIMEOUT); - } - /** * 将parameters中数据转换成用"&"链接的http请求参数形式 * @@ -217,146 +237,4 @@ public final class HttpUtils { } return params.toString(); } - - /** - * post请求封装 参数为{"a":1,"b":2,"c":3} - * - * @param path 接口地址 - * @param Info 参数 - * @return - * @throws IOException - */ - public static String postResponse(String path, JSONObject Info) { - HttpClient client = new DefaultHttpClient(); - HttpPost post = new HttpPost(path); - - post.setHeader("Content-Type", "application/json"); - post.addHeader("Authorization", "Basic YWRtaW46"); - String result = ""; - - try { - StringEntity s = new StringEntity(Info.toString(), "utf-8"); - System.out.println("<-------------------->"); - System.out.println(s); - System.out.println("<-------------------->"); - s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); - post.setEntity(s); - // 发送请求 - HttpResponse httpResponse = client.execute(post); - - // 获取响应输入流 - InputStream inStream = httpResponse.getEntity().getContent(); - BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, StandardCharsets.UTF_8)); - StringBuilder strber = new StringBuilder(); - String line = null; - while ((line = reader.readLine()) != null) { - strber.append(line + "\n"); - } - inStream.close(); - - result = strber.toString(); - System.out.println(result); - - if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { - System.out.println("请求服务器成功,做相应处理"); - } else { - System.out.println("请求服务端失败"); - } - - } catch (Exception e) { - System.out.println("请求异常"); - throw new RuntimeException(e); - } - - return result; - } - - public static String http(String url, String proxyUrl, int proxyPort, Map params, String chartSet) - throws Exception { - URL u = null; - HttpURLConnection con = null; - // 构建请求参数 - StringBuffer sb = new StringBuffer(); - OutputStreamWriter osw = null; - BufferedReader br = null; - if (params != null) { - int i = 0; - for (Entry e : params.entrySet()) { - if (i != 0) { - sb.append("&"); - } else { - i++; - } - sb.append(e.getKey()); - if (e.getValue() != null && !e.getValue().equals("")) { - sb.append("="); - sb.append(e.getValue());///URLEncoder.encode(sign, "UTF-8") - } - } - } - System.out.println("连接:" + url); - System.out.println("发送:" + sb.toString()); - try { - u = new URL(url); - if (null != proxyUrl && !proxyUrl.equals("")) { - System.out.println("代理的IP是:" + proxyUrl + ",代理端口:" + proxyPort); - Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyUrl, proxyPort)); - con = (HttpURLConnection) u.openConnection(proxy); - } else { - con = (HttpURLConnection) u.openConnection(); - } - con.setConnectTimeout(30000); - con.setReadTimeout(700000); - con.setRequestMethod("POST"); - con.setDoOutput(true); - con.setDoInput(true); - con.setUseCaches(false); - con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - con.setRequestProperty("Charset", "UTF-8"); - osw = new OutputStreamWriter(con.getOutputStream(), StandardCharsets.UTF_8); - osw.write(sb.toString()); - osw.flush(); - } catch (SocketTimeoutException e) { - throw new Exception(); - } catch (Exception e) { - throw new Exception(); - } finally { - try { - osw.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - StringBuffer buffer = new StringBuffer(); - try { - br = new BufferedReader(new InputStreamReader(con.getInputStream(), - StandardCharsets.UTF_8)); - String temp; - while ((temp = br.readLine()) != null) { - buffer.append(temp); - buffer.append("\n"); - } - } catch (SocketTimeoutException e) { - throw new Exception(); - } catch (FileNotFoundException e) { - throw new Exception(); - } catch (Exception e) { - throw new Exception(); - } finally { - try { - if (osw != null) { - osw.close(); - } - if (br != null) { - br.close(); - } - if (con != null) { - con.disconnect(); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - } - return buffer.toString(); - } } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsFilter.java b/framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsFilter.java index 37b295c9..c74eb6fa 100644 --- a/framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsFilter.java +++ b/framework/src/main/java/cn/lili/modules/system/utils/SensitiveWordsFilter.java @@ -2,6 +2,7 @@ package cn.lili.modules.system.utils; import cn.lili.modules.system.entity.dos.SensitiveWords; import cn.lili.modules.system.service.SensitiveWordsService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; @@ -20,6 +21,7 @@ import java.util.NavigableSet; * @since v1.0 * 2020-02-25 14:10:16 */ +@Slf4j @Component public class SensitiveWordsFilter implements Serializable, ApplicationRunner { @@ -240,7 +242,7 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner { } } } catch (Exception e) { - e.printStackTrace(); + log.error("初始化敏感词错误",e); } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/BrandManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/BrandManagerController.java index 0a617a35..6db36c2c 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/BrandManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/BrandManagerController.java @@ -97,13 +97,8 @@ public class BrandManagerController { @ApiImplicitParam(name = "ids", value = "品牌ID", required = true, dataType = "String", allowMultiple = true, paramType = "path") @DeleteMapping(value = "/delByIds/{ids}") public ResultMessage delAllByIds(@PathVariable List ids) { - - for (String id : ids) { - Brand brand = brandService.getById(id); - brand.setDeleteFlag(true); - brandService.updateById(brand); - } - return ResultUtil.success(ResultCode.BRAND_DELETE_ERROR); + brandService.removeByIds(ids); + return ResultUtil.success(ResultCode.SUCCESS); } } diff --git a/manager-api/src/main/java/cn/lili/controller/goods/CategoryManagerController.java b/manager-api/src/main/java/cn/lili/controller/goods/CategoryManagerController.java index 0ef47f8e..cd705a56 100644 --- a/manager-api/src/main/java/cn/lili/controller/goods/CategoryManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/goods/CategoryManagerController.java @@ -87,7 +87,7 @@ public class CategoryManagerController { @PutMapping @ApiOperation(value = "修改商品分类") - public ResultMessage updateCategory(CategoryVO category) { + public ResultMessage updateCategory(@Valid CategoryVO category) { Category catTemp = categoryService.getById(category.getId()); if (catTemp == null) { throw new ServiceException(ResultCode.CATEGORY_PARENT_NOT_EXIST); diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberGradeManagerController.java b/manager-api/src/main/java/cn/lili/controller/member/MemberGradeManagerController.java new file mode 100644 index 00000000..95c7e5e0 --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/member/MemberGradeManagerController.java @@ -0,0 +1,86 @@ +package cn.lili.controller.member; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.PageUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.MemberGrade; +import cn.lili.modules.member.service.MemberGradeService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 管理端,会员等级接口 + * + * @author Bulbasaur + * @date: 2021/5/16 11:29 下午 + */ +@RestController +@Api(tags = "管理端,会员等级接口") +@RequestMapping("/manager/memberGrade") +public class MemberGradeManagerController { + + @Autowired + private MemberGradeService memberGradeService; + + @ApiOperation(value = "通过id获取会员等级") + @ApiImplicitParam(name = "id", value = "会员等级ID", required = true, dataType = "String", paramType = "path") + @GetMapping(value = "/get/{id}") + public ResultMessage get(@PathVariable String id) { + + return ResultUtil.data(memberGradeService.getById(id)); + } + + @ApiOperation(value = "获取会员等级分页") + @GetMapping(value = "/getByPage") + public ResultMessage> getByPage(PageVO page) { + + return ResultUtil.data(memberGradeService.page(PageUtil.initPage(page))); + } + + @ApiOperation(value = "添加会员等级") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "会员等级ID", required = true, paramType = "path") + }) + @PostMapping(value = "/add") + public ResultMessage daa(@Validated MemberGrade memberGrade) { + if (memberGradeService.save(memberGrade)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "修改会员等级") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "会员等级ID", required = true, paramType = "path") + }) + @PutMapping(value = "/update/{id}") + public ResultMessage update(@PathVariable String id,MemberGrade memberGrade) { + if (memberGradeService.updateById(memberGrade)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + + + @ApiOperation(value = "删除会员等级") + @ApiImplicitParam(name = "id", value = "会员等级ID", required = true, dataType = "String", paramType = "path") + @DeleteMapping(value = "/delete/{id}") + public ResultMessage> delete(@PathVariable String id) { + if(memberGradeService.getById(id).getIsDefault()){ + throw new ServiceException(ResultCode.USER_GRADE_IS_DEFAULT); + }else if(memberGradeService.removeById(id)){ + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } +} diff --git a/manager-api/src/main/java/cn/lili/controller/other/ArticleCategoryManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/ArticleCategoryManagerController.java index fbd0c39a..3d499455 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/ArticleCategoryManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/ArticleCategoryManagerController.java @@ -8,6 +8,7 @@ import cn.lili.modules.page.service.ArticleCategoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,6 +21,7 @@ import java.util.List; * @author pikachu * @date 2020-05-5 15:10:16 */ +@Slf4j @RestController @Api(tags = "管理端,文章分类管理接口") @RequestMapping("/manager/article-category") @@ -37,7 +39,7 @@ public class ArticleCategoryManagerController { try { return ResultUtil.data(this.articleCategoryService.allChildren()); } catch (Exception e) { - e.printStackTrace(); + log.error("查询分类列表错误",e); } return null; } diff --git a/manager-api/src/main/java/cn/lili/controller/other/CustomWordsController.java b/manager-api/src/main/java/cn/lili/controller/other/CustomWordsController.java index bf2017e6..aa300078 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/CustomWordsController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/CustomWordsController.java @@ -7,6 +7,7 @@ import cn.lili.modules.search.service.CustomWordsService; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.service.SettingService; import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,6 +21,7 @@ import java.nio.charset.StandardCharsets; * @author paulG * @since 2020/10/16 **/ +@Slf4j @RestController @Api(tags = "管理端,自定义分词接口") @RequestMapping("/manager/custom-words") @@ -54,7 +56,7 @@ public class CustomWordsController { try { return new String(res.getBytes(), StandardCharsets.UTF_8); } catch (Exception e) { - e.printStackTrace(); + log.error("获取分词错误",e); } return ""; } diff --git a/manager-api/src/main/java/cn/lili/controller/other/broadcast/CommodityManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/broadcast/CommodityManagerController.java new file mode 100644 index 00000000..7c87b697 --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/other/broadcast/CommodityManagerController.java @@ -0,0 +1,41 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.broadcast.entity.vos.CommodityVO; +import cn.lili.modules.broadcast.service.CommodityService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +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; + +/** + * 管理端,直播间管理接口 + * + * @author Bulbasaur + * @date: 2021/5/28 11:56 上午 + */ +@RestController +@Api(tags = "店铺端,直播商品接口") +@RequestMapping("/manager/broadcast/commodity") +public class CommodityManagerController { + + @Autowired + private CommodityService commodityService; + + @ApiOperation(value = "获取店铺直播商品列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "商品名称", dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "auditStatus", value = "直播商品状态", dataType = "String", paramType = "query") + }) + @GetMapping + public ResultMessage> page(String auditStatus, String name, PageVO pageVO) { + return ResultUtil.data(commodityService.commodityList(pageVO, name, auditStatus)); + } +} diff --git a/manager-api/src/main/java/cn/lili/controller/other/broadcast/StudioManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/broadcast/StudioManagerController.java new file mode 100644 index 00000000..d510874d --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/other/broadcast/StudioManagerController.java @@ -0,0 +1,64 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.broadcast.entity.dos.Studio; +import cn.lili.modules.broadcast.entity.vos.StudioVO; +import cn.lili.modules.broadcast.service.StudioService; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; + +/** + * 管理端,直播间接口 + * + * @author Bulbasaur + * @date: 2021/5/28 11:56 上午 + */ +@RestController +@Api(tags = "店铺端,直播间接口") +@RequestMapping("/manager/broadcast/studio") +public class StudioManagerController { + + @Autowired + private StudioService studioService; + + @ApiOperation(value = "获取店铺直播间列表") + @ApiImplicitParam(name = "status", value = "直播间状态", paramType = "query") + @GetMapping + public ResultMessage> page(PageVO pageVO, String status) { + return ResultUtil.data(studioService.studioList(pageVO, null, status)); + } + + @ApiOperation(value = "获取店铺直播间详情") + @ApiImplicitParam(name = "studioId", value = "直播间ID", required = true, paramType = "path") + @GetMapping("/{studioId}") + public ResultMessage studioInfo(@PathVariable String studioId) { + return ResultUtil.data(studioService.getStudioVO(studioId)); + } + + @ApiOperation(value = "是否推荐直播间") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "Id", required = true, paramType = "path"), + @ApiImplicitParam(name = "recommend", value = "是否推荐", required = true, paramType = "query") + }) + @PutMapping("/recommend/{id}") + public ResultMessage recommend(@PathVariable String id, @NotNull boolean recommend) { + if (studioService.update(new UpdateWrapper() + .eq("id", id) + .set("recommend", recommend))) { + return ResultUtil.success(); + } + throw new ServiceException(ResultCode.ERROR); + } +} diff --git a/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java b/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java index 08c3c164..c6f25213 100644 --- a/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java @@ -152,7 +152,7 @@ public class AdminUserManagerController { } adminUserService.saveAdminUser(adminUser, roles); } catch (Exception e) { - e.printStackTrace(); + log.error("添加用户错误",e); } return ResultUtil.success(); } diff --git a/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java index 47f46bc6..fb7e1bce 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java @@ -10,6 +10,7 @@ import cn.lili.modules.permission.service.MenuService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,6 +23,7 @@ import java.util.List; * @author Chopper * @date 2020/11/20 12:07 */ +@Slf4j @RestController @Api(tags = "管理端,菜单管理接口") @RequestMapping("/manager/menu") @@ -42,7 +44,7 @@ public class MenuManagerController { try { menuService.save(menu); } catch (Exception e) { - e.printStackTrace(); + log.error("添加菜单错误",e); } return ResultUtil.data(menu); } diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java new file mode 100644 index 00000000..5609a3e8 --- /dev/null +++ b/manager-api/src/main/java/cn/lili/controller/promotion/CouponActivityManagerController.java @@ -0,0 +1,70 @@ +package cn.lili.controller.promotion; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.utils.PageUtil; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.promotion.entity.dos.CouponActivity; +import cn.lili.modules.promotion.entity.dto.CouponActivityDTO; +import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; +import cn.lili.modules.promotion.entity.vos.CouponActivityVO; +import cn.lili.modules.promotion.service.CouponActivityService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 优惠券活动 + * + * @author Bulbasaur + * @date: 2021/5/21 7:11 下午 + */ +@RestController +@Api(tags = "管理端,优惠券活动接口") +@RequestMapping("/manager/promotion/couponActivity") +public class CouponActivityManagerController { + + @Autowired + private CouponActivityService couponActivityService; + + @ApiOperation(value = "获取优惠券活动分页") + @GetMapping + public ResultMessage> getCouponActivityPage(PageVO page) { + return ResultUtil.data(couponActivityService.page(PageUtil.initPage(page))); + } + + @ApiOperation(value = "获取优惠券活动") + @ApiImplicitParam(name = "couponActivityId", value = "优惠券活动ID", required = true, paramType = "path") + @GetMapping("/{couponActivityId}") + public ResultMessage getCouponActivity(@PathVariable String couponActivityId) { + return ResultUtil.data(couponActivityService.getCouponActivityVO(couponActivityId)); + } + + @ApiOperation(value = "添加优惠券活动") + @PostMapping + @PutMapping(consumes = "application/json", produces = "application/json") + public ResultMessage addCouponActivity(@RequestBody(required = false) CouponActivityDTO couponActivityDTO) { + couponActivityDTO.setPromotionStatus(PromotionStatusEnum.NEW.name()); + return ResultUtil.data(couponActivityService.addCouponActivity(couponActivityDTO)); + } + + @ApiOperation(value = "关闭优惠券活动") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "优惠券活动ID", required = true, dataType = "String", paramType = "path") + }) + @DeleteMapping("/{id}") + public ResultMessage updateStatus(@PathVariable String id) { + if (couponActivityService.updateCouponActivityStatus(id, PromotionStatusEnum.END)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + +} diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java index 9c8cbd31..cdc4ec46 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java @@ -42,11 +42,9 @@ public class CouponManagerController { @ApiOperation(value = "获取优惠券列表") @GetMapping - public ResultMessage> getCouponList(CouponSearchParams queryParam, PageVO page) { - page.setNotConvert(true); + public ResultMessage> getCouponList(CouponSearchParams queryParam, PageVO page) { queryParam.setStoreId("platform"); - IPage coupons = couponService.getCouponsByPageFromMongo(queryParam, page); - return ResultUtil.data(coupons); + return ResultUtil.data(couponService.getCouponsByPage(queryParam, page)); } @ApiOperation(value = "获取优惠券详情") diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java index e7b2b59c..acfe4ca5 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/PointsGoodsManagerController.java @@ -36,11 +36,10 @@ public class PointsGoodsManagerController { @PostMapping(consumes = "application/json", produces = "application/json") @ApiOperation(value = "添加积分商品") public ResultMessage addPointsGoods(@RequestBody List pointsGoodsList) { - AuthUser currentUser = UserContext.getCurrentUser(); List collect = new ArrayList<>(); for (PointsGoodsVO i : pointsGoodsList) { i.setStoreName(i.getGoodsSku().getStoreName()); - i.setStoreId(currentUser.getId()); + i.setStoreId(UserContext.getCurrentUser().getStoreId()); collect.add(i); } pointsGoodsService.addPointsGoods(collect); diff --git a/manager-api/src/main/java/cn/lili/controller/promotion/SeckillManagerController.java b/manager-api/src/main/java/cn/lili/controller/promotion/SeckillManagerController.java index 6fc60377..91210d44 100644 --- a/manager-api/src/main/java/cn/lili/controller/promotion/SeckillManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/promotion/SeckillManagerController.java @@ -7,25 +7,25 @@ import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; -import cn.lili.modules.promotion.entity.enums.SeckillApplyStatusEnum; import cn.lili.modules.promotion.entity.vos.SeckillSearchParams; import cn.lili.modules.promotion.entity.vos.SeckillVO; import cn.lili.modules.promotion.service.SeckillApplyService; import cn.lili.modules.promotion.service.SeckillService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** - * 管理端,限时抢购接口 + * 管理端,秒杀活动接口 * * @author paulG * @date 2020/8/20 **/ @RestController -@Api(tags = "管理端,限时抢购接口") +@Api(tags = "管理端,秒杀活动接口") @RequestMapping("/manager/promotion/seckill") public class SeckillManagerController { @Autowired @@ -33,19 +33,16 @@ public class SeckillManagerController { @Autowired private SeckillApplyService seckillApplyService; - @PostMapping - @ApiOperation(value = "添加限时抢购") - public ResultMessage addSeckill(SeckillVO seckillVO) { - AuthUser currentUser = UserContext.getCurrentUser(); - seckillVO.setStoreId(currentUser.getId()); - seckillVO.setStoreName(currentUser.getUsername()); - seckillVO.setSeckillApplyStatus(SeckillApplyStatusEnum.NOT_APPLY.name()); - seckillService.saveSeckill(seckillVO); - return ResultUtil.data(seckillVO); + + @ApiOperation(value = "初始化秒杀活动(初始化方法,默认初始化30天内的活动)") + @GetMapping("/init") + public void addSeckill() { + seckillService.init(); } + + @ApiOperation(value = "修改秒杀活动") @PutMapping - @ApiOperation(value = "修改限时抢购") public ResultMessage updateSeckill(SeckillVO seckillVO) { AuthUser currentUser = UserContext.getCurrentUser(); seckillVO.setStoreId(currentUser.getId()); @@ -54,54 +51,49 @@ public class SeckillManagerController { return ResultUtil.data(seckillVO); } - @GetMapping(value = "/{id}") @ApiOperation(value = "通过id获取") + @ApiImplicitParam(name = "id", value = "秒杀活动ID", required = true, dataType = "String", paramType = "path") + @GetMapping(value = "/{id}") public ResultMessage get(@PathVariable String id) { Seckill seckill = seckillService.getById(id); return ResultUtil.data(seckill); } + @ApiOperation(value = "分页查询秒杀活动列表") @GetMapping - @ApiOperation(value = "分页查询限时抢购列表") - public ResultMessage> getAll(SeckillSearchParams param, PageVO pageVo) { - pageVo.setNotConvert(true); - IPage page = seckillService.getSeckillByPageFromMongo(param, pageVo); - return ResultUtil.data(page); + public ResultMessage> getAll(SeckillSearchParams param, PageVO pageVo) { + return ResultUtil.data(seckillService.getSeckillByPageFromMysql(param, pageVo)); } + @ApiOperation(value = "删除一个秒杀活动") + @ApiImplicitParam(name = "id", value = "秒杀活动ID", required = true, dataType = "String", paramType = "path") @DeleteMapping("/{id}") - @ApiOperation(value = "删除一个限时抢购") public ResultMessage deleteSeckill(@PathVariable String id) { seckillService.deleteSeckill(id); return ResultUtil.success(); } + @ApiOperation(value = "关闭一个秒杀活动") + @ApiImplicitParam(name = "id", value = "秒杀活动ID", required = true, dataType = "String", paramType = "path") @PutMapping("/close/{id}") - @ApiOperation(value = "关闭一个限时抢购") public ResultMessage closeSeckill(@PathVariable String id) { seckillService.closeSeckill(id); return ResultUtil.success(); } + @ApiOperation(value = "开启一个秒杀活动") + @ApiImplicitParam(name = "id", value = "秒杀活动ID", required = true, dataType = "String", paramType = "path") @PutMapping("/open/{id}") - @ApiOperation(value = "一个限时抢购") public ResultMessage openSeckill(@PathVariable String id) { seckillService.openSeckill(id); return ResultUtil.success(); } + @ApiOperation(value = "获取秒杀活动申请列表") @GetMapping("/apply") - @ApiOperation(value = "获取限时抢购申请列表") public ResultMessage> getSeckillApply(SeckillSearchParams param, PageVO pageVo) { IPage seckillApply = seckillApplyService.getSeckillApplyFromMongo(param, pageVo); return ResultUtil.data(seckillApply); } - @PutMapping("/apply/audit/{ids}") - @ApiOperation(value = "审核多个限时抢购申请") - public ResultMessage auditSeckillApply(@PathVariable String[] ids, String seckillId, String applyStatus, String failReason) { - seckillApplyService.auditBatchApply(ids, seckillId, applyStatus, failReason); - return ResultUtil.success(); - } - } diff --git a/manager-api/src/main/java/cn/lili/controller/setting/LogManagerController.java b/manager-api/src/main/java/cn/lili/controller/setting/LogManagerController.java index e4a41e56..4a9227e0 100644 --- a/manager-api/src/main/java/cn/lili/controller/setting/LogManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/setting/LogManagerController.java @@ -1,6 +1,5 @@ package cn.lili.controller.setting; -import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; @@ -41,7 +40,7 @@ public class LogManagerController { try { return ResultUtil.data(systemLogService.queryLog(null, operatorName, key, searchVo, pageVo)); } catch (Exception e) { - e.printStackTrace(); + log.error("日志获取错误",e); } return null; } 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 c60b586c..3f301f0f 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") + "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING") 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" + "PAYMENT_SUPPORT,ALIPAY_PAYMENT,WECHAT_PAYMENT,SECKILL_SETTING,EXPERIENCE_SETTING" ) public ResultMessage settingGet(@PathVariable String key) { return createSetting(key); @@ -115,7 +115,6 @@ public class SettingManagerController { return setting == null ? ResultUtil.data(new BaseSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), BaseSetting.class)); - case WITHDRAWAL_SETTING: return setting == null ? ResultUtil.data(new WithdrawalSetting()) : @@ -124,7 +123,6 @@ public class SettingManagerController { return setting == null ? ResultUtil.data(new DistributionSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class)); - case EMAIL_SETTING: return setting == null ? ResultUtil.data(new EmailSetting()) : @@ -141,46 +139,46 @@ public class SettingManagerController { return setting == null ? ResultUtil.data(new OrderSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class)); - case OSS_SETTING: return setting == null ? ResultUtil.data(new OssSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), OssSetting.class)); - case SMS_SETTING: return setting == null ? ResultUtil.data(new SmsSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), SmsSetting.class)); - case POINT_SETTING: return setting == null ? ResultUtil.data(new PointSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), PointSetting.class)); - case QQ_CONNECT: return setting == null ? ResultUtil.data(new QQConnectSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), QQConnectSetting.class)); - case PAYMENT_SUPPORT: return setting == null ? ResultUtil.data(new PaymentSupportSetting(new PaymentSupportForm())) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), PaymentSupportSetting.class)); - case ALIPAY_PAYMENT: return setting == null ? ResultUtil.data(new AlipayPaymentSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), AlipayPaymentSetting.class)); - case WECHAT_CONNECT: return setting == null ? ResultUtil.data(new WechatConnectSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), WechatConnectSetting.class)); - case WECHAT_PAYMENT: return setting == null ? ResultUtil.data(new WechatPaymentSetting()) : ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), WechatPaymentSetting.class)); + case SECKILL_SETTING: + return setting == null ? + ResultUtil.data(new SeckillSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), SeckillSetting.class)); + case EXPERIENCE_SETTING: + return setting == null ? + ResultUtil.data(new ExperienceSetting()) : + ResultUtil.data(JSONUtil.toBean(setting.getSettingValue(), ExperienceSetting.class)); default: throw new ServiceException(ResultCode.SETTING_NOT_TO_SET); } diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsManagerController.java index f8a76dfb..de2b59d4 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/GoodsStatisticsManagerController.java @@ -31,12 +31,7 @@ public class GoodsStatisticsManagerController { @ApiOperation(value = "获取统计列表,排行前一百的数据") @GetMapping public ResultMessage> getByPage(GoodsStatisticsQueryParam goodsStatisticsQueryParam) { - try { - return ResultUtil.data(goodsStatisticsDataService.getGoodsStatisticsData(goodsStatisticsQueryParam, 100)); - } catch (Exception e) { - e.printStackTrace(); - } - return null; + return ResultUtil.data(goodsStatisticsDataService.getGoodsStatisticsData(goodsStatisticsQueryParam, 100)); } @ApiOperation(value = "获取行业统计列表") diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsManagerController.java index 1477776b..669d9e30 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/IndexStatisticsManagerController.java @@ -12,6 +12,7 @@ import cn.lili.modules.statistics.model.vo.StoreStatisticsDataVO; import cn.lili.modules.statistics.service.IndexStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -25,6 +26,7 @@ import java.util.List; * @author Bulbasaur * @date: 2020/12/15 17:53 */ +@Slf4j @Api(tags = "管理端,首页统计数据接口") @RestController @RequestMapping("/manager/statistics/index") @@ -42,7 +44,7 @@ public class IndexStatisticsManagerController { try { return ResultUtil.data(indexStatisticsService.indexStatistics()); } catch (Exception e) { - e.printStackTrace(); + log.error("获取首页查询数据错误",e); } return null; } diff --git a/manager-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsManagerController.java b/manager-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsManagerController.java index 4aa5dff7..2094c62f 100644 --- a/manager-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsManagerController.java @@ -14,6 +14,7 @@ import cn.lili.modules.statistics.service.OrderStatisticsDataService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,6 +28,7 @@ import java.util.List; * @author Bulbasaur * @date: 2020/12/9 19:04 */ +@Slf4j @Api(tags = "管理端,订单统计接口") @RestController @RequestMapping("/manager/statistics/order") @@ -44,7 +46,7 @@ public class OrderStatisticsManagerController { try { return ResultUtil.data(orderStatisticsDataService.overview(statisticsQueryParam)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单概览统计错误",e); } return null; } @@ -55,7 +57,7 @@ public class OrderStatisticsManagerController { try { return ResultUtil.data(orderStatisticsDataService.statisticsChart(statisticsQueryParam)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单图表统计",e); } return null; } @@ -67,7 +69,7 @@ public class OrderStatisticsManagerController { try { return ResultUtil.data(orderService.getStatistics(statisticsQueryParam, pageVO)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单统计",e); } return null; } diff --git a/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleManagerController.java b/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleManagerController.java index daf715af..8ae8f5f0 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/trade/AfterSaleManagerController.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; +import java.util.List; /** * 管理端,售后接口 @@ -40,6 +41,12 @@ public class AfterSaleManagerController { return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams)); } + @ApiOperation(value = "获取导出售后服务列表列表") + @GetMapping(value = "/exportAfterSaleOrder") + public ResultMessage> exportAfterSaleOrder(AfterSaleSearchParams searchParams) { + return ResultUtil.data(afterSaleService.exportAfterSaleOrder(searchParams)); + } + @ApiOperation(value = "查看售后服务详情") @ApiImplicitParam(name = "sn", value = "售后单号", required = true, paramType = "path") @GetMapping(value = "/get/{sn}") diff --git a/manager-api/src/main/java/cn/lili/controller/trade/OrderManagerController.java b/manager-api/src/main/java/cn/lili/controller/trade/OrderManagerController.java index 0b93d2c3..613bcbcd 100644 --- a/manager-api/src/main/java/cn/lili/controller/trade/OrderManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/trade/OrderManagerController.java @@ -1,10 +1,10 @@ package cn.lili.controller.trade; -import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dto.MemberAddressDTO; import cn.lili.modules.order.order.entity.dos.Order; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; import cn.lili.modules.order.order.entity.dto.OrderSearchParams; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; @@ -21,6 +21,7 @@ import springfox.documentation.annotations.ApiIgnore; import javax.validation.Valid; import javax.validation.constraints.NotNull; +import java.util.List; /** * 管理端,订单API @@ -31,7 +32,6 @@ import javax.validation.constraints.NotNull; @RestController @RequestMapping("/manager/orders") @Api(tags = "管理端,订单API") - public class OrderManagerController { //订单 @@ -48,6 +48,13 @@ public class OrderManagerController { return ResultUtil.data(orderService.queryByParams(orderSearchParams)); } + @ApiOperation(value = "查询订单导出列表") + @GetMapping("/queryExportOrder") + public ResultMessage> queryExportOrder(OrderSearchParams orderSearchParams) { + return ResultUtil.data(orderService.queryExportOrder(orderSearchParams)); + } + + @ApiOperation(value = "订单明细") @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") @GetMapping(value = "/{orderSn}") diff --git a/manager-api/src/main/resources/application.yml b/manager-api/src/main/resources/application.yml index d198e6fe..0d6ad253 100644 --- a/manager-api/src/main/resources/application.yml +++ b/manager-api/src/main/resources/application.yml @@ -4,9 +4,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: diff --git a/manager-api/src/main/resources/manager.xml b/manager-api/src/main/resources/manager.xml new file mode 100644 index 00000000..46dec7c7 --- /dev/null +++ b/manager-api/src/main/resources/manager.xml @@ -0,0 +1,41 @@ + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + + + 127.0.0.1:4560 + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/manager-api/src/test/java/cn/lili/test/promotion/SeckillTest.java b/manager-api/src/test/java/cn/lili/test/promotion/SeckillTest.java index 835b0716..c0c9eac8 100644 --- a/manager-api/src/test/java/cn/lili/test/promotion/SeckillTest.java +++ b/manager-api/src/test/java/cn/lili/test/promotion/SeckillTest.java @@ -83,11 +83,4 @@ class SeckillTest { Assertions.assertTrue(true); } - - @Test - void audit() { - seckillApplyService.auditBatchApply(new String[]{"1327169604003061760"}, "123456", PromotionApplyStatusEnum.PASS.name(), ""); - Assertions.assertTrue(true); - } - } diff --git a/seller-api/src/main/java/cn/lili/controller/goods/GoodsStoreController.java b/seller-api/src/main/java/cn/lili/controller/goods/GoodsStoreController.java index b59a1e02..952925ef 100644 --- a/seller-api/src/main/java/cn/lili/controller/goods/GoodsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/goods/GoodsStoreController.java @@ -139,11 +139,10 @@ public class GoodsStoreController { @PutMapping(value = "/freight") @ApiImplicitParams({ @ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "query", allowMultiple = true), - @ApiImplicitParam(name = "freightPayer", value = "运费承担者", required = true, paramType = "query"), @ApiImplicitParam(name = "templateId", value = "运费模板ID", required = true, paramType = "query") }) - public ResultMessage freight(@RequestParam List goodsId, @RequestParam String freightPayer, @RequestParam String templateId) { - goodsService.freight(goodsId, freightPayer, templateId); + public ResultMessage freight(@RequestParam List goodsId, @RequestParam String templateId) { + goodsService.freight(goodsId, templateId); return ResultUtil.success(); } diff --git a/seller-api/src/main/java/cn/lili/controller/other/ArticleStoreController.java b/seller-api/src/main/java/cn/lili/controller/other/article/ArticleStoreController.java similarity index 97% rename from seller-api/src/main/java/cn/lili/controller/other/ArticleStoreController.java rename to seller-api/src/main/java/cn/lili/controller/other/article/ArticleStoreController.java index c73eda9e..28e3784f 100644 --- a/seller-api/src/main/java/cn/lili/controller/other/ArticleStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/other/article/ArticleStoreController.java @@ -1,4 +1,4 @@ -package cn.lili.controller.other; +package cn.lili.controller.other.article; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; diff --git a/seller-api/src/main/java/cn/lili/controller/other/broadcast/CommodityStoreController.java b/seller-api/src/main/java/cn/lili/controller/other/broadcast/CommodityStoreController.java new file mode 100644 index 00000000..30cbb04b --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/other/broadcast/CommodityStoreController.java @@ -0,0 +1,64 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.broadcast.entity.dos.Commodity; +import cn.lili.modules.broadcast.entity.vos.CommodityVO; +import cn.lili.modules.broadcast.service.CommodityService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 店铺端,直播商品接口 + * + * @author Bulbasaur + * @date: 2021/5/17 2:05 下午 + */ +@RestController +@Api(tags = "店铺端,直播商品接口") +@RequestMapping("/store/broadcast/commodity") +public class CommodityStoreController { + + @Autowired + private CommodityService commodityService; + + @ApiOperation(value = "获取店铺直播商品列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "商品名称", dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "auditStatus", value = "直播商品状态", dataType = "String", paramType = "query") + }) + @GetMapping + public ResultMessage> page(String auditStatus, String name, PageVO pageVO) { + return ResultUtil.data(commodityService.commodityList(pageVO, name, auditStatus)); + } + + @ApiOperation(value = "添加店铺直播商品") + @ApiImplicitParam(name = "commodityList", value = "直播商品列表", paramType = "body", allowMultiple = true, dataType = "Commodity") + @PostMapping + public ResultMessage addCommodity(@RequestBody List commodityList) { + if (commodityService.addCommodity(commodityList)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "删除店铺直播商品") + @ApiImplicitParam(name = "goodsId", value = "直播商品ID", dataType = "String", paramType = "path") + @DeleteMapping("/{goodsId}") + public ResultMessage delete(@PathVariable String goodsId) { + if (commodityService.deleteCommodity(goodsId)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/other/broadcast/StudioStoreController.java b/seller-api/src/main/java/cn/lili/controller/other/broadcast/StudioStoreController.java new file mode 100644 index 00000000..36831063 --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/other/broadcast/StudioStoreController.java @@ -0,0 +1,91 @@ +package cn.lili.controller.other.broadcast; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.broadcast.entity.dos.Studio; +import cn.lili.modules.broadcast.entity.vos.StudioVO; +import cn.lili.modules.broadcast.service.StudioService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 店铺端,直播间接口 + * + * @author Bulbasaur + * @date: 2021/5/17 2:05 下午 + */ +@RestController +@Api(tags = "店铺端,直播间接口") +@RequestMapping("/store/broadcast/studio") +public class StudioStoreController { + + @Autowired + private StudioService studioService; + + @ApiOperation(value = "获取店铺直播间列表") + @ApiImplicitParam(name = "status", value = "直播间状态", paramType = "query", dataType = "String") + @GetMapping + public ResultMessage> page(PageVO pageVO, String status) { + return ResultUtil.data(studioService.studioList(pageVO, null, status)); + } + + @ApiOperation(value = "获取店铺直播间详情") + @ApiImplicitParam(name = "studioId", value = "直播间ID", required = true, dataType = "String", paramType = "path") + @GetMapping("/studioInfo/{studioId}") + public ResultMessage studioInfo(@PathVariable String studioId) { + return ResultUtil.data(studioService.getStudioVO(studioId)); + } + + @ApiOperation(value = "添加直播间") + @PostMapping + public ResultMessage add(@Validated Studio studio) { + if (studioService.create(studio)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "修改直播间") + @PutMapping("/edit") + public ResultMessage edit(@Validated Studio studio) { + if (studioService.edit(studio)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "店铺直播间添加商品") + @ApiImplicitParams({ + @ApiImplicitParam(name = "roomId", value = "房间ID", required = true, dataType = "Integer", paramType = "path"), + @ApiImplicitParam(name = "liveGoodsId", value = "直播商品ID", required = true, dataType = "Integer", paramType = "path") + }) + @PutMapping(value = "/push/{roomId}/{liveGoodsId}") + public ResultMessage push(@PathVariable Integer roomId, @PathVariable Integer liveGoodsId) { + if (studioService.push(roomId, liveGoodsId)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } + + @ApiOperation(value = "店铺直播间删除商品") + @ApiImplicitParams({ + @ApiImplicitParam(name = "roomId", value = "房间ID", required = true, dataType = "Integer", paramType = "path"), + @ApiImplicitParam(name = "liveGoodsId", value = "直播商品ID", required = true, dataType = "Integer", paramType = "path") + }) + @DeleteMapping(value = "/deleteInRoom/{roomId}/{liveGoodsId}") + public ResultMessage deleteInRoom(@PathVariable Integer roomId, @PathVariable Integer liveGoodsId) { + if (studioService.goodsDeleteInRoom(roomId, liveGoodsId)) { + return ResultUtil.success(ResultCode.SUCCESS); + } + throw new ServiceException(ResultCode.ERROR); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/promotion/SeckillStoreController.java b/seller-api/src/main/java/cn/lili/controller/promotion/SeckillStoreController.java index 83c0a3b9..c620777d 100644 --- a/seller-api/src/main/java/cn/lili/controller/promotion/SeckillStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/promotion/SeckillStoreController.java @@ -22,13 +22,13 @@ import java.util.Arrays; import java.util.List; /** - * 店铺端,限时抢购接口 + * 店铺端,秒杀活动接口 * * @author paulG * @date 2020/8/26 **/ @RestController -@Api(tags = "店铺端,限时抢购接口") +@Api(tags = "店铺端,秒杀活动接口") @RequestMapping("/store/promotion/seckill") public class SeckillStoreController { @Autowired @@ -37,14 +37,14 @@ public class SeckillStoreController { private SeckillApplyService seckillApplyService; @GetMapping - @ApiOperation(value = "获取限时抢购列表") + @ApiOperation(value = "获取秒杀活动列表") public ResultMessage> getSeckillPage(SeckillSearchParams queryParam, PageVO pageVo) { IPage seckillPage = seckillService.getSeckillByPageFromMongo(queryParam, pageVo); return ResultUtil.data(seckillPage); } @GetMapping("/apply") - @ApiOperation(value = "获取限时抢购申请列表") + @ApiOperation(value = "获取秒杀活动申请列表") public ResultMessage> getSeckillApplyPage(SeckillSearchParams queryParam, PageVO pageVo) { String storeId = UserContext.getCurrentUser().getStoreId(); queryParam.setStoreId(storeId); @@ -53,19 +53,19 @@ public class SeckillStoreController { } @GetMapping("/{seckillId}") - @ApiOperation(value = "获取限时抢购") + @ApiOperation(value = "获取秒杀活动") public ResultMessage getSeckill(@PathVariable String seckillId) { return ResultUtil.data(seckillService.getSeckillByIdFromMongo(seckillId)); } @GetMapping("/apply/{seckillApplyId}") - @ApiOperation(value = "获取限时抢购申请") + @ApiOperation(value = "获取秒杀活动申请") public ResultMessage getSeckillApply(@PathVariable String seckillApplyId) { return ResultUtil.data(seckillApplyService.getById(seckillApplyId)); } @PostMapping(path = "/apply/{seckillId}", consumes = "application/json", produces = "application/json") - @ApiOperation(value = "添加限时抢购申请") + @ApiOperation(value = "添加秒杀活动申请") public ResultMessage addSeckillApply(@PathVariable String seckillId, @RequestBody List applyVos) { String storeId = UserContext.getCurrentUser().getStoreId(); seckillApplyService.addSeckillApply(seckillId, storeId, applyVos); @@ -73,7 +73,7 @@ public class SeckillStoreController { } @DeleteMapping("/apply/{seckillId}/{ids}") - @ApiOperation(value = "删除限时抢购申请") + @ApiOperation(value = "删除秒杀活动申请") public ResultMessage deleteSeckillApply(@PathVariable("seckillId") String seckillId, @PathVariable("ids") String ids) { String[] idsSplit = ids.split(","); seckillApplyService.removeSeckillApplyByIds(seckillId, Arrays.asList(idsSplit)); diff --git a/seller-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsStoreController.java b/seller-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsStoreController.java index 3de478a3..4a17cdef 100644 --- a/seller-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/statistics/OrderStatisticsStoreController.java @@ -15,6 +15,7 @@ import cn.lili.modules.statistics.service.OrderStatisticsDataService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -28,6 +29,7 @@ import java.util.List; * @author Bulbasaur * @date: 2020/12/9 19:04 */ +@Slf4j @Api(tags = "店铺端,订单统计接口") @RestController @RequestMapping("/store/statistics/order") @@ -56,7 +58,7 @@ public class OrderStatisticsStoreController { statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); return ResultUtil.data(orderStatisticsDataService.overview(statisticsQueryParam)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单概览统计错误",e); } return null; } @@ -68,7 +70,7 @@ public class OrderStatisticsStoreController { statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); return ResultUtil.data(orderStatisticsDataService.statisticsChart(statisticsQueryParam)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单图表统计错误",e); } return null; } @@ -82,7 +84,7 @@ public class OrderStatisticsStoreController { statisticsQueryParam.setStoreId(UserContext.getCurrentUser().getStoreId()); return ResultUtil.data(orderService.getStatistics(statisticsQueryParam, pageVO)); } catch (Exception e) { - e.printStackTrace(); + log.error("订单统计错误",e); } return null; } diff --git a/seller-api/src/main/java/cn/lili/controller/trade/AfterSaleStoreController.java b/seller-api/src/main/java/cn/lili/controller/trade/AfterSaleStoreController.java index 57792ffa..214f63b6 100644 --- a/seller-api/src/main/java/cn/lili/controller/trade/AfterSaleStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/trade/AfterSaleStoreController.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; +import java.util.List; /** * 店铺端,售后管理接口 @@ -44,6 +45,12 @@ public class AfterSaleStoreController { return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams)); } + @ApiOperation(value = "获取导出售后服务列表列表") + @GetMapping(value = "/exportAfterSaleOrder") + public ResultMessage> exportAfterSaleOrder(AfterSaleSearchParams searchParams) { + return ResultUtil.data(afterSaleService.exportAfterSaleOrder(searchParams)); + } + @ApiOperation(value = "审核售后申请") @ApiImplicitParams({ @ApiImplicitParam(name = "afterSaleSn", value = "售后sn", required = true, paramType = "path"), diff --git a/seller-api/src/main/java/cn/lili/controller/trade/OrderStoreController.java b/seller-api/src/main/java/cn/lili/controller/trade/OrderStoreController.java index 4ca89760..1290ded1 100644 --- a/seller-api/src/main/java/cn/lili/controller/trade/OrderStoreController.java +++ b/seller-api/src/main/java/cn/lili/controller/trade/OrderStoreController.java @@ -1,24 +1,38 @@ package cn.lili.controller.trade; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelUtil; +import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; +import cn.lili.config.context.ThreadContextHolder; import cn.lili.modules.member.entity.dto.MemberAddressDTO; +import cn.lili.modules.order.order.entity.dto.OrderBatchDeliverDTO; +import cn.lili.modules.order.order.entity.dto.OrderExportDTO; import cn.lili.modules.order.order.entity.dto.OrderSearchParams; import cn.lili.modules.order.order.entity.vo.OrderDetailVO; import cn.lili.modules.order.order.entity.vo.OrderSimpleVO; import cn.lili.modules.order.order.service.OrderPriceService; import cn.lili.modules.order.order.service.OrderService; +import cn.lili.modules.system.service.StoreLogisticsService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; /** * 店铺端,订单接口 @@ -26,6 +40,7 @@ import javax.validation.constraints.NotNull; * @author Chopper * @date 2020/11/17 4:35 下午 **/ +@Slf4j @RestController @RequestMapping("/store/orders") @Api(tags = "店铺端,订单接口") @@ -36,12 +51,17 @@ public class OrderStoreController { */ @Autowired private OrderService orderService; - /** * 订单价格 */ @Autowired private OrderPriceService orderPriceService; + /** + * 物流公司 + */ + @Autowired + private StoreLogisticsService storeLogisticsService; + @ApiOperation(value = "查询订单列表") @GetMapping @@ -102,23 +122,53 @@ public class OrderStoreController { return ResultUtil.data(orderService.cancel(orderSn, reason)); } + @ApiOperation(value = "根据核验码获取订单信息") + @ApiImplicitParam(name = "verificationCode", value = "核验码", required = true, paramType = "path") + @GetMapping(value = "/getOrderByVerificationCode/{verificationCode}") + public ResultMessage getOrderByVerificationCode(@PathVariable String verificationCode){ + return ResultUtil.data(orderService.getOrderByVerificationCode(verificationCode)); + } + @ApiOperation(value = "订单核验") @ApiImplicitParams({ - @ApiImplicitParam(name = "orderSn", value = "订单sn", required = true, dataType = "String", paramType = "path"), - @ApiImplicitParam(name = "qrCode", value = "发货单号", required = true, dataType = "String", paramType = "query") + @ApiImplicitParam(name = "orderSn", value = "订单号", required = true, paramType = "path"), + @ApiImplicitParam(name = "verificationCode", value = "核验码", required = true, paramType = "path") }) - @PostMapping(value = "/{orderSn}/take") - public ResultMessage take(@NotNull(message = "参数非法") @PathVariable String orderSn, - @NotNull(message = "核验码") String qrCode) { - return ResultUtil.data(orderService.take(orderSn, qrCode)); + @PutMapping(value = "/take/{orderSn}/{verificationCode}") + public ResultMessage take(@PathVariable String orderSn,@PathVariable String verificationCode) { + return ResultUtil.data(orderService.take(orderSn,verificationCode)); } @ApiOperation(value = "查询物流踪迹") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") - }) - @PostMapping(value = "/getTraces/{orderSn}") + @ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path") + @GetMapping(value = "/getTraces/{orderSn}") public ResultMessage getTraces(@NotBlank(message = "订单编号不能为空") @PathVariable String orderSn) { return ResultUtil.data(orderService.getTraces(orderSn)); } + + @ApiOperation(value = "下载待发货的订单列表",produces="application/octet-stream") + @GetMapping(value = "/downLoadDeliverExcel") + public void downLoadDeliverExcel() { + HttpServletResponse response = ThreadContextHolder.getHttpResponse(); + //获取店铺已经选择物流公司列表 + List logisticsName = storeLogisticsService.getStoreSelectedLogisticsName(); + //下载订单批量发货Excel + this.orderService.getBatchDeliverList(response,logisticsName); + + //return ResultUtil.success(ResultCode.SUCCESS); + + } + + @PostMapping(value = "/batchDeliver", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @ApiOperation(value = "上传文件进行订单批量发货") + public ResultMessage batchDeliver(@RequestPart("files") MultipartFile files) { + orderService.batchDeliver(files); + return ResultUtil.success(ResultCode.SUCCESS); + } + + @ApiOperation(value = "查询订单导出列表") + @GetMapping("/queryExportOrder") + public ResultMessage> queryExportOrder(OrderSearchParams orderSearchParams) { + return ResultUtil.data(orderService.queryExportOrder(orderSearchParams)); + } } \ No newline at end of file diff --git a/seller-api/src/main/resources/application.yml b/seller-api/src/main/resources/application.yml index 79aa0617..fe58f5f8 100644 --- a/seller-api/src/main/resources/application.yml +++ b/seller-api/src/main/resources/application.yml @@ -4,9 +4,6 @@ server: servlet: context-path: / - # 正式部署时候,解开此处配置,防止文件夹被清除导致的文件上传失败问题 - # multipart: - # location: /Users/lifenlong/Desktop/ceshi tomcat: uri-encoding: UTF-8 threads: diff --git a/seller-api/src/main/resources/logback.xml b/seller-api/src/main/resources/logback.xml new file mode 100644 index 00000000..ce08fb6f --- /dev/null +++ b/seller-api/src/main/resources/logback.xml @@ -0,0 +1,41 @@ + + + + + + + + + + ${APP_NAME} + + + + ${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log + 30 + + + ${FILE_LOG_PATTERN} + + + + + + + 127.0.0.1:4560 + + + + UTC + + + + {"appName":"${APP_NAME}"} + + + + + + + + \ No newline at end of file diff --git a/socket-api/src/main/resources/application.yml b/socket-api/src/main/resources/application.yml new file mode 100644 index 00000000..4b502b6e --- /dev/null +++ b/socket-api/src/main/resources/application.yml @@ -0,0 +1,295 @@ +server: + port: 8885 + servlet: + context-path: / + + tomcat: + uri-encoding: UTF-8 + threads: + min-spare: 50 + max: 1000 + +# 与Spring Boot 2一样,默认情况下,大多数端点都不通过http公开,我们公开了所有端点。对于生产,您应该仔细选择要公开的端点。 +management: + # health: + # elasticsearch: + # enabled: false + # datasource: + # enabled: false + endpoints: + web: + exposure: + include: '*' +spring: + # 要在其中注册的Spring Boot Admin Server的URL。 + boot: + admin: + client: + url: http://127.0.0.1:8000 + # mongodb + data: + mongodb: + host: 127.0.0.1 + port: 27017 + database: lilishop + username: root + password: lilishop + authentication-database: admin + # replica-set-name: mongoreplset + cache: + type: redis + + jpa: + # 自动生成表结构 + generate-ddl: true + open-in-view: false + # Redis + redis: + host: 127.0.0.1 + port: 6379 + password: lilishop + lettuce: + pool: + # 连接池最大连接数(使用负值表示没有限制) 默认 8 + max-active: 200 + # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 + max-wait: 20 + # 连接池中的最大空闲连接 默认 8 + max-idle: 10 + # 连接池中的最小空闲连接 默认 8 + min-idle: 8 + # 文件大小上传配置 + servlet: + multipart: + max-file-size: 20MB + max-request-size: 20MB + jackson: + time-zone: GMT+8 + serialization: + #关闭jackson 对json做解析 + fail-on-empty-beans: false + + shardingsphere: + datasource: + # 数据库名称,可自定义,可以为多个,以逗号隔开,每个在这里定义的库,都要在下面定义连接属性 + names: default-datasource + default-datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: lilishop + maxActive: 20 + initialSize: 5 + maxWait: 60000 + minIdle: 5 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + #是否缓存preparedStatement,也就是PSCache。在mysql下建议关闭。 PSCache对支持游标的数据库性能提升巨大,比如说oracle。 + poolPreparedStatements: false + #要启用PSCache,-1为关闭 必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true 可以把这个数值配置大一些,比如说100 + maxOpenPreparedStatements: -1 + #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,log4j2 + #通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + #合并多个DruidDataSource的监控数据 + useGlobalDataSourceStat: true + loginUsername: druid + loginPassword: druid + # sharding: + # default-data-source-name: default-datasource + # #需要拆分的表,可以设置多个 在 li_order 级别即可 + # tables: + # #需要进行分表的逻辑表名 + # li_order: + # #实际的表结点,下面代表的是li_order_为开头的所有表,如果能确定表的范围例如按月份分表,这里的写法是data2020.li_order_$->{2020..2021}_$->{01..12} 表示例如 li_order_2020_01 li_order_2020_03 li_order_2021_01 + # actual-data-nodes: data2020.li_order_$->{2019..2021}_$->{01..12} + # table-strategy: + # # 分表策略,根据创建日期 + # standard: + # sharding-column: create_time + # #分表策略 + # precise-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + # #范围查询实现 + # range-algorithm-class-name: cn.lili.config.sharding.CreateTimeShardingTableAlgorithm + props: + #是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭 + sql: + show: true + +# 忽略鉴权url +ignored: + urls: + - /editor-app/** + - /actuator** + - /actuator/** + - /MP_verify_qSyvBPhDsPdxvOhC.txt + - /weixin/** + - /source/** + - /buyer/mini-program/** + - /buyer/cashier/** + - /buyer/pageData/** + - /buyer/article/** + - /buyer/goods/** + - /buyer/category/** + - /buyer/shop/** + - /buyer/connect/** + - /buyer/members/smsLogin + - /buyer/members/refresh/* + - /buyer/members/refresh** + - /buyer/promotion/pintuan + - /buyer/promotion/seckill + - /buyer/memberEvaluation/**/goodsEvaluation + - /buyer/memberEvaluation/**/evaluationNumber + - /store/login/** + - /manager/user/login + - /manager/user/refresh/** + - /druid/** + - /swagger-ui.html + - /doc.html + - /swagger-resources/** + - /swagger/** + - /**/**.js + - /**/**.png + - /**/**.css + - /webjars/** + - /v2/api-docs + - /configuration/ui + - /boot-admin + statics: + - /**/*.js + - /**/*.css + - /**/*.png + - /**/*.ico + +# Swagger界面内容配置 +swagger: + title: lili API接口文档 + description: lili Api Documentation + version: 1.0.0 + termsOfServiceUrl: https://pickmall.cn + contact: + name: lili + url: https://pickmall.cn + email: admin@pickmall.com + +# Mybatis-plus +mybatis-plus: + mapper-locations: classpath*:mapper/*.xml + configuration: + #缓存开启 + cache-enabled: true + #日志 +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +# 日志 +logging: + # 输出级别 + level: + cn.lili: info + # org.hibernate: debug + # org.springframework: debug + # org.springframework.data.mongodb.core: debug + file: + # 指定路径 + path: lili-logs + # 最大保存天数 + max-history: 7 + # 每个文件最大大小 + max-size: 5MB +#加密参数 +jasypt: + encryptor: + password: lili + +lili: + system: + isDemoSite: true + statistics: + # 在线人数统计 X 小时。这里设置48,即统计过去48小时每小时在线人数 + onlineMember: 48 + # 当前在线人数刷新时间间隔,单位秒,设置为600,则每10分钟刷新一次 + currentOnlineUpdate: 600 + #qq lbs 申请 + lbs: + key: 4BYBZ-7MT6S-PUAOA-6BNWL-FJUD7-UUFXT + sk: zhNKVrJK6UPOhqIjn8AQvG37b9sz6 + #域名 + domain: + pc: http://127.0.0.1:8888 + wap: http://127.0.0.1:8888 + seller: http://127.0.0.1:8888 + admin: http://127.0.0.1:8888 + #api地址 + api: + buyer: https://z171l91606.51mypc.cn/ + base: http://127.0.0.1:8888 + manager: http://127.0.0.1:8888 + seller: http://127.0.0.1:8888 + + # jwt 细节设定 + jwt-setting: + # token过期时间(分钟) + tokenExpireTime: 60 + + # 使用Spring @Cacheable注解失效时间 + cache: + # 过期时间 单位秒 永久不过期设为-1 + timeout: 1500 + #多线程配置 + thread: + corePoolSize: 5 + maxPoolSize: 50 + queueCapacity: 50 + data: + elasticsearch: + cluster-name: elasticsearch + cluster-nodes: 127.0.0.1:9200 + index: + number-of-replicas: 0 + number-of-shards: 3 + index-prefix: lili + schema: http + # account: + # username: elastic + # password: LiLiShopES + + rocketmq: + promotion-topic: lili_promotion_topic + promotion-group: lili_promotion_group + msg-ext-topic: lili_msg_topic + msg-ext-group: lili_msg_group + goods-topic: lili_goods_topic + goods-group: lili_goods_group + order-topic: lili_order_topic + order-group: lili_order_group + member-topic: lili_member_topic + member-group: lili_member_group + other-topic: lili_other_topic + other-group: lili_other_group + notice-topic: lili_notice_topic + notice-group: lili_notice_group + notice-send-topic: lili_send_notice_topic + notice-send-group: lili_send_notice_group +rocketmq: + name-server: 127.0.0.1:9876 + producer: + group: lili_group + send-message-timeout: 30000 + +xxl: + job: + admin: + addresses: http://127.0.0.1:9001/xxl-job-admin + executor: + appname: xxl-job-executor-lilishop + address: + ip: + port: 8891 + logpath: ./xxl-job/executor + logretentiondays: 7 \ No newline at end of file diff --git a/update.sql b/update.sql new file mode 100644 index 00000000..d853abbf --- /dev/null +++ b/update.sql @@ -0,0 +1,14 @@ +/** 修改文章表**/ +ALTER TABLE li_article DROP COLUMN open_status; +ALTER TABLE li_article ADD open_status bit ( 1 ); +UPDATE li_article SET open_status = 1; +/** 增加会员等级会员经验值**/ +ALTER TABLE li_member ADD gradeId VARCHAR ( 32 ); +ALTER TABLE li_member ADD experience BIGINT; +/**去除商品运费承担**/ +ALTER TABLE li_goods DROP COLUMN freight_payer; +/**增加优惠券有效期类型**/ +ALTER TABLE li_coupon ADD range_day_type VARCHAR ( 32 ); +ALTER TABLE li_coupon ADD effective_days INT; +/**秒杀增加显示商品数量**/ +ALTER TABLE li_seckill ADD goods_num INT;