Browse Source

Merge branch 'mp-server-test' into 'master'

Mp server test

See merge request quanshu/mp-server!485
zhong chunping 3 years ago
parent
commit
bbb227f6b4
100 changed files with 3261 additions and 83 deletions
  1. 61 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/AreaMgrController.java
  2. 126 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponPkgMgrController.java
  3. 92 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ShippingTemplateController.java
  4. 24 11
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  5. 149 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserTicketOrderMgrController.java
  6. 40 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  7. 44 9
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java
  8. 43 6
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  9. 55 9
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  10. 4 0
      mp-admin/src/main/resources/application-8100.yml
  11. 4 0
      mp-admin/src/main/resources/application-8200.yml
  12. 4 0
      mp-admin/src/main/resources/application-test.yml
  13. 28 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponPkgStatusEnum.java
  14. 37 0
      mp-common/src/main/java/com/qs/mp/common/enums/ShippingTemplateRuleTypeEnum.java
  15. 29 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketBoxSaleChannelTypeEnum.java
  16. 1 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPrizeTypeEnum.java
  17. 4 0
      mp-common/src/main/java/com/qs/mp/common/enums/UserTicketOrderStatusEnum.java
  18. 1 1
      mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java
  19. 2 1
      mp-framework/src/main/java/com/qs/mp/framework/monitor/SendErrorMsgAppender.java
  20. 6 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/DayStatTask.java
  21. 29 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/UserDeliverOrderTask.java
  22. 83 0
      mp-service/src/main/java/com/qs/mp/admin/domain/CouponPkg.java
  23. 67 0
      mp-service/src/main/java/com/qs/mp/admin/domain/CouponPkgItem.java
  24. 13 0
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketAwardsPrize.java
  25. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java
  26. 62 0
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketBoxChannel.java
  27. 57 0
      mp-service/src/main/java/com/qs/mp/admin/domain/excel/UserTicketOrderExcel.java
  28. 16 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponPkgItemParam.java
  29. 22 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponPkgParam.java
  30. 30 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponPkgQueryParam.java
  31. 22 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponPkgStatusParam.java
  32. 26 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ShippingTemplateParam.java
  33. 19 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ShippingTemplateRuleAreaParam.java
  34. 25 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ShippingTemplateRuleParam.java
  35. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketAwardsPrizeParam.java
  36. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxCreateParam.java
  37. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxUpdateParam.java
  38. 41 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/UserTicketOrderQueryParam.java
  39. 35 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponPkgItemVO.java
  40. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponPkgVO.java
  41. 51 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateCalculateVO.java
  42. 18 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateRuleAreaVO.java
  43. 24 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateRuleVO.java
  44. 22 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateVO.java
  45. 5 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketAwardsPrizeVO.java
  46. 19 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxListVO.java
  47. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxVO.java
  48. 68 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderDetailVO.java
  49. 61 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderListVO.java
  50. 32 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderTicketDetailVO.java
  51. 33 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/CouponPkgItemMapper.java
  52. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/CouponPkgMapper.java
  53. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/TicketBoxChannelMapper.java
  54. 11 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/TicketBoxMapper.java
  55. 34 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICouponPkgItemService.java
  56. 60 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICouponPkgService.java
  57. 2 0
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketAwardsPrizeService.java
  58. 16 0
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxChannelService.java
  59. 10 0
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxService.java
  60. 38 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponPkgItemServiceImpl.java
  61. 188 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponPkgServiceImpl.java
  62. 1 1
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java
  63. 7 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketAwardsPrizeServiceImpl.java
  64. 20 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxChannelServiceImpl.java
  65. 108 26
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  66. 5 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelCartVO.java
  67. 17 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderSettleVO.java
  68. 7 0
      mp-service/src/main/java/com/qs/mp/common/domain/Area.java
  69. 61 0
      mp-service/src/main/java/com/qs/mp/common/domain/ShippingTemplate.java
  70. 97 0
      mp-service/src/main/java/com/qs/mp/common/domain/ShippingTemplateRule.java
  71. 83 0
      mp-service/src/main/java/com/qs/mp/common/domain/ShippingTemplateRuleArea.java
  72. 23 0
      mp-service/src/main/java/com/qs/mp/common/domain/vo/CityVO.java
  73. 29 0
      mp-service/src/main/java/com/qs/mp/common/domain/vo/ProvinceVO.java
  74. 13 0
      mp-service/src/main/java/com/qs/mp/common/mapper/ShippingTemplateMapper.java
  75. 13 0
      mp-service/src/main/java/com/qs/mp/common/mapper/ShippingTemplateRuleAreaMapper.java
  76. 25 0
      mp-service/src/main/java/com/qs/mp/common/mapper/ShippingTemplateRuleMapper.java
  77. 16 0
      mp-service/src/main/java/com/qs/mp/common/service/IShippingTemplateRuleAreaService.java
  78. 26 0
      mp-service/src/main/java/com/qs/mp/common/service/IShippingTemplateRuleService.java
  79. 56 0
      mp-service/src/main/java/com/qs/mp/common/service/IShippingTemplateService.java
  80. 20 0
      mp-service/src/main/java/com/qs/mp/common/service/impl/ShippingTemplateRuleAreaServiceImpl.java
  81. 32 0
      mp-service/src/main/java/com/qs/mp/common/service/impl/ShippingTemplateRuleServiceImpl.java
  82. 257 0
      mp-service/src/main/java/com/qs/mp/common/service/impl/ShippingTemplateServiceImpl.java
  83. 17 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserPrizeStorage.java
  84. 31 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java
  85. 15 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/DeliverOrderSettleVO.java
  86. 6 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/TicketHitPrizeBarrageVO.java
  87. 12 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserExchangeOrderMapper.java
  88. 9 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderItemMapper.java
  89. 19 1
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java
  90. 11 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserExchangeOrderService.java
  91. 9 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderItemService.java
  92. 25 1
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  93. 6 3
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java
  94. 7 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserExchangeOrderServiceImpl.java
  95. 9 7
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java
  96. 8 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderItemServiceImpl.java
  97. 30 3
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  98. 41 0
      mp-service/src/main/resources/mapper/admin/CouponPkgItemMapper.xml
  99. 21 0
      mp-service/src/main/resources/mapper/admin/CouponPkgMapper.xml
  100. 2 1
      mp-service/src/main/resources/mapper/admin/GoodsMapper.xml

+ 61 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/AreaMgrController.java

@@ -1,12 +1,23 @@
 package com.qs.mp.web.controller.api.admin;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.domain.Area;
+import com.qs.mp.common.domain.vo.CityVO;
+import com.qs.mp.common.domain.vo.ProvinceVO;
 import com.qs.mp.common.service.IAreaService;
 import com.qs.mp.web.controller.common.BaseApiController;
+
+import java.util.ArrayList;
 import java.util.List;
 import javax.validation.Valid;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -21,17 +32,51 @@ import org.springframework.web.bind.annotation.RestController;
 /**
  * @author lgh on 2018/10/26.
  */
+
 @RestController
 @RequestMapping("/api/v1/mp")
+@Api(tags = "区域管理接口")
 public class AreaMgrController extends BaseApiController {
 
     @Autowired
     private IAreaService areaService;
 
+    @PostMapping("/admin/area/tree/list")
+    @ApiOperation("省市树状列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = Area.class)
+    )
+    public AjaxResult treeList() {
+        // 获取省
+        List<Area> provinceList = areaService.list(new LambdaQueryWrapper<Area>().eq(Area::getParentId, 0));
+        List<ProvinceVO> provinceVOList = new ArrayList<>();
+        for (Area province : provinceList) {
+            ProvinceVO provinceVO = new ProvinceVO();
+            BeanUtils.copyProperties(province, provinceVO);
+            // 获取市
+            List<Area> cityList = areaService.list(new LambdaQueryWrapper<Area>().eq(Area::getParentId, province.getAreaId()));
+
+            List<CityVO> cityVOList = new ArrayList<>();
+            for (Area city : cityList) {
+                CityVO cityVO = new CityVO();
+                BeanUtils.copyProperties(city, cityVO);
+                cityVOList.add(cityVO);
+            }
+            provinceVO.setCityList(cityVOList);
+            provinceVOList.add(provinceVO);
+        }
+        return AjaxResult.success(provinceVOList);
+    }
+
+
     /**
      * 分页获取
      */
     @GetMapping("/admin/area/list")
+    @ApiOperation("分页获取")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = Area.class)
+    )
 //    @PreAuthorize("@pms.hasPermission('admin:area:page')")
     public TableDataInfo page(Area area) {
         startPage();
@@ -43,6 +88,10 @@ public class AreaMgrController extends BaseApiController {
      * 获取省市
      */
     @GetMapping("/list")
+    @ApiOperation("获取省市")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = Area.class)
+    )
 //    @PreAuthorize("@pms.hasPermission('admin:area:list')")
     public ResponseEntity<List<Area>> list(Area area) {
         List<Area> areas = areaService.list(new LambdaQueryWrapper<Area>()
@@ -54,6 +103,10 @@ public class AreaMgrController extends BaseApiController {
      * 通过父级id获取区域列表
      */
     @GetMapping("/listByPid")
+    @ApiOperation("通过父级id获取区域列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = Area.class)
+    )
     public ResponseEntity<List<Area>> listByPid(Long pid) {
         List<Area> list = areaService.listByPid(pid);
         return ResponseEntity.ok(list);
@@ -63,6 +116,10 @@ public class AreaMgrController extends BaseApiController {
      * 获取信息
      */
     @GetMapping("/info/{id}")
+    @ApiOperation("获取信息")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = Area.class)
+    )
 //    @PreAuthorize("@pms.hasPermission('admin:area:info')")
     public ResponseEntity<Area> info(@PathVariable("id") Long id) {
         Area area = areaService.getById(id);
@@ -73,6 +130,10 @@ public class AreaMgrController extends BaseApiController {
      * 保存
      */
     @PostMapping
+    @ApiOperation("保存")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = Area.class)
+    )
 //    @PreAuthorize("@pms.hasPermission('admin:area:save')")
     public ResponseEntity<Void> save(@Valid @RequestBody Area area) {
         if (area.getParentId() != null) {

+ 126 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponPkgMgrController.java

@@ -0,0 +1,126 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponPkg;
+import com.qs.mp.admin.domain.param.CouponPkgParam;
+import com.qs.mp.admin.domain.param.CouponPkgQueryParam;
+import com.qs.mp.admin.domain.param.CouponPkgStatusParam;
+import com.qs.mp.admin.domain.vo.CouponPkgVO;
+import com.qs.mp.admin.service.ICouponPkgItemService;
+import com.qs.mp.admin.service.ICouponPkgService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 券包管理API
+ *
+ * @author Cup
+ * @date 2022/5/6
+ */
+@Api(tags = "券包管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/coupon/pkg/*")
+public class CouponPkgMgrController extends BaseApiController {
+
+
+    @Autowired
+    private ICouponPkgService couponPkgService;
+
+
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('business:couponPkg:add')")
+    @ApiOperation("创建券包")
+    public AjaxResult create(@RequestBody CouponPkgParam couponPkgParam) {
+
+        couponPkgService.create(couponPkgParam);
+
+        return AjaxResult.success();
+    }
+
+
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('business:couponPkg:edit')")
+    @ApiOperation("更新券包")
+    public AjaxResult update(@RequestBody CouponPkgParam couponPkgParam) {
+
+        couponPkgService.updateCouponPkg(couponPkgParam);
+
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('business:couponPkg:list')")
+    @ApiOperation("券包列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "券包列表", response = CouponPkg.class)
+    )
+    public TableDataInfo list(@RequestBody CouponPkgQueryParam couponPkgQueryParam) {
+        startPage();
+        LambdaQueryWrapper<CouponPkg> queryWrapper = new LambdaQueryWrapper<>();
+
+        if (StringUtils.isNotBlank(couponPkgQueryParam.getTitle())) {
+            queryWrapper.like(CouponPkg::getTitle, couponPkgQueryParam.getTitle());
+        }
+
+        if (Objects.nonNull(couponPkgQueryParam.getStatus())) {
+            queryWrapper.eq(CouponPkg::getStatus, couponPkgQueryParam.getStatus());
+        }
+        queryWrapper.orderByDesc(CouponPkg::getId);
+        List<CouponPkg> list = couponPkgService.list(queryWrapper);
+        return getDataTable(list);
+    }
+
+    @PostMapping("/detail/{id}")
+    @PreAuthorize("@ss.hasPermi('business:couponPkg:query')")
+    @ApiOperation("券包详情")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "券包详情", response = CouponPkgVO.class)
+    )
+    public AjaxResult detail(@PathVariable("id") Long id) {
+
+        return AjaxResult.success(couponPkgService.detail(id));
+    }
+
+    @PostMapping("/status")
+    @PreAuthorize("@ss.hasPermi('business:couponPkg:on')")
+    @ApiOperation("券包上下架")
+    public AjaxResult status(@RequestBody CouponPkgStatusParam couponPkgStatusParam) {
+
+        // 参数校验
+        if (Objects.isNull(couponPkgStatusParam.getId()) || Objects.isNull(couponPkgStatusParam.getStatus())) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+
+        if (couponPkgService.update(new LambdaUpdateWrapper<CouponPkg>()
+                .set(CouponPkg::getStatus, couponPkgStatusParam.getStatus())
+                .eq(CouponPkg::getId, couponPkgStatusParam.getId()))) {
+            return AjaxResult.success("操作成功");
+        }
+
+        return AjaxResult.error("操作失败");
+    }
+
+    @PostMapping("/delete/{id}")
+    @PreAuthorize("@ss.hasPermi('business:couponPkg:remove')")
+    @ApiOperation("删除券包")
+    public AjaxResult delete(@PathVariable("id") Long id) {
+        couponPkgService.delete(id);
+        return AjaxResult.success();
+    }
+}

+ 92 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ShippingTemplateController.java

@@ -0,0 +1,92 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.param.ShippingTemplateParam;
+import com.qs.mp.admin.domain.vo.ShippingTemplateVO;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.domain.ShippingTemplate;
+import com.qs.mp.common.service.IShippingTemplateService;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 运费模板相关接口
+ *
+ * @author Cup
+ * @date 2022/5/5
+ */
+@Api(tags = "运费模板相关接口")
+@RestController
+@RequestMapping("/api/v1/mp/admin/shipping/template/*")
+public class ShippingTemplateController extends BaseApiController {
+
+    @Autowired
+    private IShippingTemplateService shippingTemplateService;
+
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('setting:template:add')")
+    @ApiOperation("新增运费模板")
+    public AjaxResult create(@RequestBody ShippingTemplateParam shippingTemplateParam) {
+        // 新增运费模板
+        shippingTemplateService.create(shippingTemplateParam);
+
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('setting:template:edit')")
+    @ApiOperation("更新运费模板")
+    public AjaxResult update(@RequestBody ShippingTemplateParam shippingTemplateParam){
+        // 修改运费模板
+        shippingTemplateService.updateShippingTemplate(shippingTemplateParam);
+        return AjaxResult.success();
+    }
+
+
+    @PostMapping("/detail/{id}")
+    @PreAuthorize("@ss.hasPermi('setting:template:query')")
+    @ApiOperation("运费模板详情")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "返回运费模板详情",response = ShippingTemplateVO.class)
+    )
+    public AjaxResult detail(@PathVariable("id") Long id){
+        // 运费模板详情
+        return AjaxResult.success(shippingTemplateService.detail(id));
+    }
+
+    @PostMapping("list")
+    @PreAuthorize("@ss.hasPermi('setting:template:list')")
+    @ApiOperation("运费模板列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "返回运费模板列表",response = ShippingTemplate.class)
+    )
+    public TableDataInfo list(){
+        startPage();
+        List<ShippingTemplate> list = shippingTemplateService.list(new LambdaQueryWrapper<ShippingTemplate>()
+                .orderByDesc(ShippingTemplate::getCreatedTime));
+        // 运费模板列表
+        return getDataTable(list);
+    }
+
+    @PostMapping("/delete/{id}")
+    @PreAuthorize("@ss.hasPermi('setting:template:remove')")
+    @ApiOperation("删除运费模板")
+    public AjaxResult delete(@PathVariable("id") Long id){
+        // 删除运费模板
+       boolean falg = shippingTemplateService.deleteShippingTemplate(id);
+        return AjaxResult.success();
+    }
+
+
+
+
+}

+ 24 - 11
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -5,15 +5,13 @@ import com.alibaba.fastjson.JSONObject;
 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.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.*;
 import com.qs.mp.admin.domain.excel.TicketExcel;
 import com.qs.mp.admin.domain.param.*;
 import com.qs.mp.admin.domain.vo.TicketAwardsVO;
 import com.qs.mp.admin.domain.vo.TicketBoxVO;
-import com.qs.mp.admin.service.ITicketAwardsPrizeService;
-import com.qs.mp.admin.service.ITicketAwardsService;
-import com.qs.mp.admin.service.ITicketBoxService;
-import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.admin.service.*;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.param.ChannelParam;
 import com.qs.mp.channel.domain.vo.ChannelVO;
@@ -23,13 +21,8 @@ import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.constant.UserConstants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
-import com.qs.mp.common.enums.BusinessType;
-import com.qs.mp.common.enums.ChannelRoleEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
-import com.qs.mp.common.enums.MqTopicType;
-import com.qs.mp.common.enums.ServerEnvEnum;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.*;
+import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.RSAUtil;
@@ -45,6 +38,7 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
@@ -86,6 +80,12 @@ public class TicketBoxMgrController extends BaseApiController {
 	@Autowired
 	private MapperFacade mapperFacade;
 
+	@Autowired
+	private ITicketBoxChannelService ticketBoxChannelService;
+
+	@Autowired
+	private IChannelService channelService;
+
 	@Value("${mp.exportUrl}")
 	private String exportUrl;
 
@@ -145,12 +145,25 @@ public class TicketBoxMgrController extends BaseApiController {
 	@PostMapping("/detail")
 	@PreAuthorize("@ss.hasPermi('business:ticket:query')")
 	@ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
+	@ApiResponses(
+			@ApiResponse(code = 200, message = "查询成功", response = TicketBoxVO.class)
+	)
 	public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
 		if (com.qs.mp.common.utils.StringUtils.isBlank(param.getBoxId())) {
 			return AjaxResult.error("参数异常,盲票组ID缺失");
 		}
 		TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
 		TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+		// 设置经销商信息
+		if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(ticketBox.getSaleChannelType())) {
+			List<TicketBoxChannel> ticketBoxChannelList = ticketBoxChannelService.list(new LambdaQueryWrapper<TicketBoxChannel>().eq(TicketBoxChannel::getBoxId, ticketBox.getBoxId()));
+			if (CollectionUtils.isNotEmpty(ticketBoxChannelList)) {
+				List<Long> channelIds = ticketBoxChannelList.stream().map(TicketBoxChannel::getChannelId).collect(Collectors.toList());
+				List<Channel> channelList = channelService.list(new LambdaQueryWrapper<Channel>().select(Channel::getChannelId, Channel::getName)
+						.in(Channel::getChannelId, channelIds));
+				ticketBoxVO.setChannelList(channelList);
+			}
+		}
 		List<TicketAwards> ticketAwardsList = ticketAwardsService.list(new LambdaQueryWrapper<TicketAwards>()
 				.eq(TicketAwards::getBoxId, ticketBox.getBoxId()).orderByAsc(TicketAwards::getSort));
 		List<TicketAwardsVO> ticketAwardsVOS = mapperFacade.mapAsList(ticketAwardsList, TicketAwardsVO.class);

+ 149 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserTicketOrderMgrController.java

@@ -0,0 +1,149 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.excel.UserTicketOrderExcel;
+import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
+import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
+import com.qs.mp.common.annotation.Log;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.BusinessType;
+import com.qs.mp.common.enums.PayOrderStatusEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.domain.excel.DeliverOrderExcel;
+import com.qs.mp.user.domain.vo.UserDeliverOrderItemVO;
+import com.qs.mp.user.domain.vo.UserDeliverOrderVO;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import com.qs.mp.utils.ExcelUtil;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author Cup
+ * @date 2022/5/6
+ */
+@RestController
+@RequestMapping("/api/v1/mp/admin/ticket/order")
+@Api(tags = "用户盲票订单接口")
+public class UserTicketOrderMgrController extends BaseApiController {
+
+
+    @Autowired
+    private IUserTicketOrderService userTicketOrderService;
+
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('order:userTicket:list')")
+    @ApiOperation("用户盲票订单列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserTicketOrderListVO.class)
+    )
+    public TableDataInfo list(@RequestBody UserTicketOrderQueryParam userTicketOrderQueryParam) {
+        startPage();
+        QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
+            queryWrapper.like("t1.title", userTicketOrderQueryParam.getBoxTitle());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
+            queryWrapper.eq("t3.type", userTicketOrderQueryParam.getBoxType());
+        }
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
+            queryWrapper.eq("t2.phonenumber", userTicketOrderQueryParam.getPhone());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getStatus())) {
+            queryWrapper.eq("t1.status", userTicketOrderQueryParam.getStatus());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
+            queryWrapper.between("t1.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
+        }
+
+        queryWrapper.orderByDesc("t1.created_time");
+
+        List<UserTicketOrderListVO> list = userTicketOrderService.listUserTicketOrder(queryWrapper);
+        return getDataTable(list);
+    }
+
+    @PostMapping("/detail/{orderId}")
+    @PreAuthorize("@ss.hasPermi('order:userTicket:query')")
+    @ApiOperation("用户盲票订单详情")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserTicketOrderDetailVO.class)
+    )
+    public AjaxResult detail(@PathVariable("orderId") String orderId) {
+
+        return AjaxResult.success(userTicketOrderService.detail(orderId));
+    }
+
+    @Log(title = "用户订单导出", businessType = BusinessType.EXPORT)
+    @PostMapping("export")
+    @PreAuthorize("@ss.hasPermi('order:userTicket:export')")
+    @ApiOperation("用户订单导出")
+    public AjaxResult export(@RequestBody UserTicketOrderQueryParam userTicketOrderQueryParam) {
+        QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
+            queryWrapper.like("t1.title", userTicketOrderQueryParam.getBoxTitle());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
+            queryWrapper.eq("t3.type", userTicketOrderQueryParam.getBoxType());
+        }
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
+            queryWrapper.eq("t2.phonenumber", userTicketOrderQueryParam.getPhone());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getStatus())) {
+            queryWrapper.eq("t1.status", userTicketOrderQueryParam.getStatus());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
+            queryWrapper.between("t1.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
+        }
+        queryWrapper.orderByDesc("t1.created_time");
+        int totalSize = userTicketOrderService.countUserTicketOrder(queryWrapper);
+        if (totalSize == 0) {
+            return AjaxResult.error("没有符合条件的用户订单");
+        }
+        int pageSize = 2000;
+        List<UserTicketOrderListVO> userTicketOrderListVOList = new ArrayList<>();
+        if (totalSize > pageSize) {
+            int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
+            for (int i = 0; i < totalPage; i++) {
+                queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
+                List<UserTicketOrderListVO> list = userTicketOrderService.listUserTicketOrder(queryWrapper);
+                if (CollectionUtils.isNotEmpty(list)) {
+                    userTicketOrderListVOList.addAll(list);
+                }
+            }
+        } else {
+            userTicketOrderListVOList = userTicketOrderService.listUserTicketOrder(queryWrapper);
+        }
+        List<UserTicketOrderExcel> excelList = userTicketOrderListVOList.stream().map(userTicketOrderListVO -> {
+            UserTicketOrderExcel userTicketOrderExcel = new UserTicketOrderExcel();
+            BeanUtils.copyProperties(userTicketOrderListVO, userTicketOrderExcel);
+            if (Objects.nonNull(userTicketOrderListVO.getStatus())) {
+                userTicketOrderExcel.setStatus(userTicketOrderListVO.getStatus().getDesc());
+            }
+            if (Objects.nonNull(userTicketOrderListVO.getBoxType())){
+                userTicketOrderExcel.setBoxType(userTicketOrderListVO.getBoxType().getDesc());
+            }
+            return userTicketOrderExcel;
+        }).collect(Collectors.toList());
+
+        ExcelUtil<UserTicketOrderExcel> util = new ExcelUtil<>(UserTicketOrderExcel.class);
+        return util.exportExcel(excelList, "用户盲票订单导出", false);
+    }
+
+
+}

+ 40 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java

@@ -1,9 +1,11 @@
 package com.qs.mp.web.controller.api.channel.mall;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
@@ -13,6 +15,8 @@ import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.qs.mp.common.domain.DeliveryCompany;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.service.IDeliveryCompanyService;
+import com.qs.mp.common.service.IShippingTemplateRuleService;
+import com.qs.mp.common.service.IShippingTemplateService;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
@@ -25,6 +29,7 @@ import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.user.domain.UserPrizeStorage;
 import com.qs.mp.user.service.IUserAddrService;
 import com.qs.mp.channel.service.IChannelCartService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
@@ -53,6 +58,7 @@ import javax.validation.Valid;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -63,7 +69,6 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/api/v1/mp/channel/mall")
 @Api(tags = "渠道盲票商城订单接口")
-@AllArgsConstructor
 public class ChannelOrderController extends BaseApiController {
 
 
@@ -103,6 +108,15 @@ public class ChannelOrderController extends BaseApiController {
   @Autowired
   private RedisCache redisCache;
 
+  @Autowired
+  private IShippingTemplateRuleService shippingTemplateRuleService;
+
+  @Value("${shipping.channel}")
+  public Long shippingTemplateId;
+
+  @Autowired
+  private IShippingTemplateService shippingTemplateService;
+
 
 
   /**
@@ -221,9 +235,32 @@ public class ChannelOrderController extends BaseApiController {
       orderSettleVO.getItems().add(cartVO);
       pkgNum += param.getOrderNum();
     }
+
+
+    // 运费计算
+    Integer freightAmt = 0;
+    // 计算运费
+    UserAddr userAddr = orderSettleVO.getAddr();
+    // TODO: 4L上线需要调整,后期放开就是取的商品里配的运费模板id
+    ShippingTemplateCalculateVO shippingTemplateCalculateVO = shippingTemplateRuleService.getShippingTemplateRuleByTemplateIdAndAreaInfo(shippingTemplateId, userAddr.getProvinceId(), userAddr.getCityId());
+    // 无法查到运费模板则默认为0
+    if (Objects.nonNull(shippingTemplateCalculateVO)) {
+
+      orderSettleVO.setFreightRemark(shippingTemplateCalculateVO.getRemark());
+      orderSettleVO.setFreightType(shippingTemplateCalculateVO.getType());
+
+      if (ShippingTemplateRuleTypeEnum.SHIP.getValue().equals(shippingTemplateCalculateVO.getType())) {
+        // 运费计算
+        freightAmt = shippingTemplateService.calculateFreightAmt(pkgNum, shippingTemplateCalculateVO);
+      }
+    }
+
+    // 设置运费
+    orderSettleVO.setFreightAmt(freightAmt);
+
     orderSettleVO.setOrderAmt(orderAmt);
-    // 当前没有运费和优惠,实付金额=订单金额
-    orderSettleVO.setPayAmt(orderAmt);
+    // 当前没有运费和优惠,实付金额=订单金额 + 运费金额
+    orderSettleVO.setPayAmt(orderAmt + freightAmt);
     orderSettleVO.setPkgNum(pkgNum);
 
     // 缓存订单结算对象

+ 44 - 9
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java

@@ -1,23 +1,30 @@
 package com.qs.mp.web.controller.api.channel.mall;
 
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.vo.TicketBoxListVO;
 import com.qs.mp.admin.domain.param.TicketBoxParam;
 import com.qs.mp.admin.domain.vo.TicketBoxVO;
 import com.qs.mp.admin.service.ITicketAwardsPrizeService;
 import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.TicketBoxSaleChannelTypeEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
 import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,6 +50,9 @@ public class ChannelTicketController extends BaseApiController {
   @Autowired
   private MapperFacade mapperFacade;
 
+  @Autowired
+  private IChannelService channelService;
+
   /**
    * 盲票进货列表
    */
@@ -51,11 +61,37 @@ public class ChannelTicketController extends BaseApiController {
   public TableDataInfo list(@RequestBody TicketBoxParam param) {
     // TODO 根据标签过滤
     startPage();
-    List<TicketBox> ticketBoxes = ticketBoxService.list(
-        new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
-            .eq(null != param.getCategoryId() && 0 != param.getCategoryId(), TicketBox::getCategoryId, param.getCategoryId())
-            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
-            .orderByDesc(TicketBox::getSortWeight));
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    Channel channel = channelService.getById(channelId);
+    List<Long> channelIds = new ArrayList<>();
+    if (StringUtils.isNotBlank(channel.getChannelNo())) {
+      String[] split = StringUtils.split(channel.getChannelNo(), ".");
+      for (String s : split) {
+        channelIds.add(Long.valueOf(s));
+      }
+    }
+    QueryWrapper<TicketBox> queryWrapper = new QueryWrapper<>();
+    queryWrapper.eq("t1.type",param.getType());
+    if (Objects.nonNull(param.getCategoryId()) && param.getCategoryId() != 0) {
+      queryWrapper.eq("t1.category_id",param.getCategoryId());
+    }
+    queryWrapper.eq("t1.status", TicketBoxStatusEnum.PUT_ON);
+    queryWrapper.orderByDesc("t1.sort_weight");
+
+    queryWrapper.nested(wrapper -> {
+      wrapper.eq("t1.sale_channel_type", TicketBoxSaleChannelTypeEnum.ALL.getValue());
+      if (channelIds.size() != 0) {
+        wrapper.or().in("t2.channel_id",channelIds);
+      }
+    });
+
+    List<TicketBox> ticketBoxes  = ticketBoxService.listBySaleChannel(queryWrapper);
+
+//    List<TicketBox> ticketBoxes = ticketBoxService.list(
+//        new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
+//            .eq(null != param.getCategoryId() && 0 != param.getCategoryId(), TicketBox::getCategoryId, param.getCategoryId())
+//            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+//            .orderByDesc(TicketBox::getSortWeight));
     List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes, TicketBoxListVO.class);
     TableDataInfo rspData = getDataTable(ticketBoxes);
     rspData.setRows(ticketBoxListVOList);
@@ -74,8 +110,7 @@ public class ChannelTicketController extends BaseApiController {
     }
     TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
     TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
-    ticketBoxVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
-        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    ticketBoxVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(ticketBox.getBoxId()));
     return AjaxResult.success(ticketBoxVO);
   }
 

+ 43 - 6
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java

@@ -1,18 +1,21 @@
 package com.qs.mp.web.controller.api.user;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
-import com.qs.mp.common.enums.BizTypeEnum;
-import com.qs.mp.common.enums.DeliverOrderStatusEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
-import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.domain.ShippingTemplate;
+import com.qs.mp.common.domain.ShippingTemplateRule;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.service.IShippingTemplateRuleService;
+import com.qs.mp.common.service.IShippingTemplateService;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.framework.redis.RedisKey;
@@ -32,14 +35,19 @@ import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -50,7 +58,6 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/api/v1/mp/user/deliver")
 @Api(tags = "用户端奖品提货接口")
-@AllArgsConstructor
 public class UserDeliverOrderController extends BaseApiController {
 
   @Autowired
@@ -77,6 +84,15 @@ public class UserDeliverOrderController extends BaseApiController {
   @Autowired
   private RedisCache redisCache;
 
+  @Autowired
+  private IShippingTemplateRuleService shippingTemplateRuleService;
+
+  @Autowired
+  private IShippingTemplateService shippingTemplateService;
+
+  @Value("${shipping.user}")
+  public Long shippingTemplateId;
+
   /**
    * 订单列表
    */
@@ -138,6 +154,9 @@ public class UserDeliverOrderController extends BaseApiController {
    */
   @PostMapping("/order/settle")
   @ApiOperation(value = "订单结算" , notes = "奖品库里点提货")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success", response = DeliverOrderSettleVO.class)
+  )
   public AjaxResult settle(@Valid @RequestBody DeliverOrderParam param) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
 
@@ -161,6 +180,24 @@ public class UserDeliverOrderController extends BaseApiController {
         .in(UserPrizeStorage::getStorageId, param.getIds()));
 
 
+    // 计算运费
+    UserAddr userAddr = orderSettleVO.getAddr();
+    // TODO: 4L上线需要调整,后期放开就是取的商品里配的运费模板id
+    ShippingTemplateCalculateVO shippingTemplateCalculateVO = shippingTemplateRuleService.getShippingTemplateRuleByTemplateIdAndAreaInfo(shippingTemplateId, userAddr.getProvinceId(), userAddr.getCityId());
+    // 无法查到运费模板则默认为0
+    if (Objects.nonNull(shippingTemplateCalculateVO)) {
+
+      orderSettleVO.setFreightRemark(shippingTemplateCalculateVO.getRemark());
+      orderSettleVO.setFreightType(shippingTemplateCalculateVO.getType());
+
+      if (ShippingTemplateRuleTypeEnum.SHIP.getValue().equals(shippingTemplateCalculateVO.getType())) {
+        int goodsNum = prizeStorageList.stream().mapToInt(UserPrizeStorage::getGoodsNum).sum();
+        // 计算运费
+        freightAmt = shippingTemplateService.calculateFreightAmt(goodsNum,shippingTemplateCalculateVO);
+      }
+
+    }
+
     orderSettleVO.setOrderAmt(orderAmt);
     orderSettleVO.setFreightAmt(freightAmt);
     orderSettleVO.setPayAmt(orderAmt + freightAmt);
@@ -194,7 +231,7 @@ public class UserDeliverOrderController extends BaseApiController {
       jsonObject.put("needPay", 0);
     }
     // 清除缓存的订单
-    redisCache.deleteObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+    redisCache.deleteObject(RedisKey.build(RedisKey.USER_DELIVER_ORDER_KEY, userId));
 
     return AjaxResult.success(jsonObject);
   }

+ 55 - 9
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java

@@ -23,12 +23,14 @@ import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.*;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.framework.security.handle.HostHolder;
 import com.qs.mp.user.domain.UserHitPrize;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
+import com.qs.mp.user.service.IUserExchangeOrderService;
 import com.qs.mp.user.service.IUserHitPrizeService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.utils.SecurityUtils;
@@ -36,10 +38,10 @@ import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.lang.reflect.Array;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.*;
 
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
@@ -83,6 +85,9 @@ public class UserTicketController extends BaseApiController {
   @Autowired
   private HostHolder hostHolder;
 
+  @Autowired
+  private IUserExchangeOrderService userExchangeOrderService;
+
   /**
    * 盲票进货列表
    */
@@ -120,9 +125,7 @@ public class UserTicketController extends BaseApiController {
     }
     TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
     TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
-    ticketBoxVO.setPrizeList(
-        ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
-            .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    ticketBoxVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(ticketBox.getBoxId()));
     return AjaxResult.success(ticketBoxVO);
   }
 
@@ -155,8 +158,7 @@ public class UserTicketController extends BaseApiController {
     TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
 
     TicketVO ticketVO = new TicketVO();
-    ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
-        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(ticket.getBoxId()));
     ticketVO.setTicketId(ticket.getTicketId());
     ticketVO.setBoxId(ticket.getBoxId());
     ticketVO.setTitle(ticketBox.getTitle());
@@ -268,6 +270,34 @@ public class UserTicketController extends BaseApiController {
     List<TicketHitPrizeBarrageVO> listOne = new ArrayList<>();
     List<TicketHitPrizeBarrageVO> listTwo = new ArrayList<>();
 
+    // 获取除当前用户外最近10条盲豆大于1000的商品兑换数据
+    QueryWrapper<TicketHitPrizeBarrageVO> queryWrapper = new QueryWrapper<>();
+    queryWrapper.ge("t1.order_coin", 1000);
+    queryWrapper.notIn("t1.user_id", userId);
+    queryWrapper.orderByDesc("t1.created_time");
+    queryWrapper.last("limit 10");
+    List<TicketHitPrizeBarrageVO> exchangeList = userExchangeOrderService.listByWrapper(queryWrapper);
+
+    // 获取当前用户当天的商品兑换数据
+    LocalDateTime startTime = LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN);
+    LocalDateTime endTime = LocalDateTime.now().withNano(0);
+    queryWrapper.clear();
+    queryWrapper.eq("t1.user_id", userId);
+    queryWrapper.between("t1.created_time", startTime, endTime);
+    List<TicketHitPrizeBarrageVO> userExchangeList = userExchangeOrderService.listByWrapper(queryWrapper);
+
+
+    if (CollectionUtils.isNotEmpty(userExchangeList)) {
+      exchangeList.addAll(userExchangeList);
+    }
+
+    for (TicketHitPrizeBarrageVO ticketHitPrizeBarrageVO : exchangeList) {
+      // 设置为兑换类型
+      ticketHitPrizeBarrageVO.setType(2);
+    }
+
+
+
     // 获取用户当天中奖的 2 条弹幕
     if (userId != 0L) {
       List<TicketHitPrizeBarrageVO> ticketHitPrizeBarrageVOList = userHitPrizeService.hitPrizeBarrageByUserId(userId);
@@ -278,6 +308,9 @@ public class UserTicketController extends BaseApiController {
             ticketHitPrizeBarrageVOList.get(i).setPrizeInfo(ticketHitPrizeBarrageVOList.get(i).getPrizeInfo() + ticketHitPrizeBarrageVOList.get(i).getValue() + "颗");
           }
 
+          // 设置类型为中奖
+          ticketHitPrizeBarrageVOList.get(i).setType(1);
+
           if (i % 2 == 0) {
             listOne.add(ticketHitPrizeBarrageVOList.get(i));
           }else {
@@ -289,6 +322,17 @@ public class UserTicketController extends BaseApiController {
     // 获取除该用户外,最近中奖的 40 条弹幕信息
     List<TicketHitPrizeBarrageVO> ticketHitPrizeBarrageVOList = userHitPrizeService.hitPrizeBarrage(userId);
 
+
+    for (TicketHitPrizeBarrageVO ticketHitPrizeBarrageVO : ticketHitPrizeBarrageVOList) {
+      // 设置为中奖类型
+      ticketHitPrizeBarrageVO.setType(1);
+    }
+
+    // 增加兑奖信息并且按时间排序
+    ticketHitPrizeBarrageVOList.addAll(exchangeList);
+
+    ticketHitPrizeBarrageVOList.sort((o1, o2) -> o2.getCreatedTime().compareTo(o1.getCreatedTime()));
+
     // 获取除该用户外,近 6 个月,8 条高级中奖弹幕信息
     List<TicketHitPrizeBarrageVO> expensiveHitPrizeBarrageList = userHitPrizeService.expensiveHitPrizeBarrage(userId);
     int count = 0;
@@ -308,6 +352,8 @@ public class UserTicketController extends BaseApiController {
 
       // 插入大奖弹幕
       if (count != 0 && i % 5 == 0) {
+        // 设置类型为中奖
+        expensiveHitPrizeBarrageList.get(index).setType(1);
         if (index % 2 == 0) {
           listOne.add(expensiveHitPrizeBarrageList.get(index));
         }else {

+ 4 - 0
mp-admin/src/main/resources/application-8100.yml

@@ -138,3 +138,7 @@ miniprogram:
 # 盲票导出每页查询数量
 export:
   page-size: 1000
+
+shipping:
+  user: 1
+  channel: 2

+ 4 - 0
mp-admin/src/main/resources/application-8200.yml

@@ -138,3 +138,7 @@ miniprogram:
 # 盲票导出每页查询数量
 export:
   page-size: 1000
+
+shipping:
+  user: 1
+  channel: 2

+ 4 - 0
mp-admin/src/main/resources/application-test.yml

@@ -136,3 +136,7 @@ miniprogram:
 # 盲票导出每页查询数量
 export:
   page-size: 200
+
+shipping:
+  user: 4
+  channel: 7

+ 28 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponPkgStatusEnum.java

@@ -0,0 +1,28 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * 券包类型枚举
+ * @author Cup
+ * @date 2022/5/6
+ */
+public enum CouponPkgStatusEnum implements IEnum<Integer> {
+
+    PUT_INIT(0, "待上架"),
+    PUT_ON(1, "已上架"),
+    PUT_OFF(2, "已下架");
+
+    private final Integer value;
+    private final String desc;
+
+    CouponPkgStatusEnum(final Integer value, final String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+}

+ 37 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ShippingTemplateRuleTypeEnum.java

@@ -0,0 +1,37 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+
+/**
+ * 运费模板规则类型枚举类
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费模板规则类型枚举类")
+public enum ShippingTemplateRuleTypeEnum implements IEnum<Integer> {
+
+    SHIP(1,"发货"),
+
+    NOT_SHIP(2,"不发货");
+
+
+    ShippingTemplateRuleTypeEnum(int value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    private final int value;
+    private final String desc;
+
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+}

+ 29 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketBoxSaleChannelTypeEnum.java

@@ -0,0 +1,29 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import lombok.AllArgsConstructor;
+
+/**
+ * 盲票销售渠道类型
+ *
+ * @author Cup
+ * @date 2022/5/6
+ */
+public enum TicketBoxSaleChannelTypeEnum implements IEnum<Integer> {
+
+    ALL(1, "所有渠道"),
+    PART(2, "部分渠道");
+
+    private int value;
+    private final String desc;
+
+    TicketBoxSaleChannelTypeEnum(int value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+}

+ 1 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketPrizeTypeEnum.java

@@ -15,6 +15,7 @@ public enum TicketPrizeTypeEnum implements IEnum<String> {
 
   GOODS("goods", "商品"),
   COUPON("coupon", "优惠券"),
+  COUPON_PKG("coupon_pkg", "优惠券包"),
   COIN("coin", "盲豆");
 
   private final String value;

+ 4 - 0
mp-common/src/main/java/com/qs/mp/common/enums/UserTicketOrderStatusEnum.java

@@ -29,6 +29,10 @@ public enum UserTicketOrderStatusEnum implements IEnum<Integer> {
     return value;
   }
 
+  public String getDesc() {
+    return desc;
+  }
+
   /**
    * 重写toString,单个转化成json
    * @return

+ 1 - 1
mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java

@@ -67,7 +67,7 @@ public class PulsarClientService {
     if (consumerConn) {
       consumer = client.newConsumer()
           .topic(topics.split(","))//topic完整路径,格式为persistent://集群(租户)ID/命名空间/Topic名称
-          .subscriptionName("ygp")//需要现在控制台或者通过控制台API创建好一个订阅,此处填写订阅名
+          .subscriptionName("mp")//需要现在控制台或者通过控制台API创建好一个订阅,此处填写订阅名
           .subscriptionType(SubscriptionType.Exclusive)//声明消费模式为exclusive(独占)模式
           .subscriptionInitialPosition(
               SubscriptionInitialPosition.Earliest)//配置从最早开始消费,否则可能会消费不到历史消息

+ 2 - 1
mp-framework/src/main/java/com/qs/mp/framework/monitor/SendErrorMsgAppender.java

@@ -28,7 +28,8 @@ public class SendErrorMsgAppender extends UnsynchronizedAppenderBase<ILoggingEve
         Throwable throwable = throwableProxy.getThrowable();
         String throwableMsg = throwable.getMessage();
         if (StringUtils.isNotBlank(throwableMsg) && (throwableMsg.startsWith("验证码失效") || throwableMsg.startsWith("重复购买,请稍后再试")
-        || throwableMsg.startsWith("盲票已付款,") || throwableMsg.startsWith("盲票已兑奖") || throwableMsg.startsWith("登录用户不存在:"))) {
+        || throwableMsg.startsWith("盲票已付款,") || throwableMsg.startsWith("盲票已兑奖") || throwableMsg.startsWith("登录用户不存在:")
+        || throwableMsg.startsWith("用户不存在/密码错误") || throwableMsg.startsWith("验证码已失效"))) {
           return;
         }
         StackTraceElementProxy[] stackTraceElementProxy = iThrowableProxy.getStackTraceElementProxyArray();

+ 6 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/DayStatTask.java

@@ -220,10 +220,16 @@ public class DayStatTask {
             .select("IFNULL(sum(money) ,0) as withdrawAmt")
             .lambda().lt(ChannelWithdraw::getCreateTime, DateUtils.addDays(bizDay, 1))
             .eq(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.FINISHED));
+    Map<String, Object> allAcctMoneyMap = channelService.getMap(
+        new QueryWrapper<Channel>()
+            .select("IFNULL(sum(money) ,0) as acctAmt"));
     if (null != withdrawMap) {
       sb.append("累计提现:").append(
               new BigDecimal(Integer.valueOf(String.valueOf(allWithdrawMap.get("withdrawAmt")))).divide(
                   new BigDecimal(100), 2, RoundingMode.DOWN))
+          .append("元,待提现:").append(
+              new BigDecimal(Integer.valueOf(String.valueOf(allAcctMoneyMap.get("acctAmt")))).divide(
+                  new BigDecimal(100), 2, RoundingMode.DOWN))
           .append("元,当日:").append(
               new BigDecimal(Integer.valueOf(String.valueOf(withdrawMap.get("withdrawAmt")))).divide(
                   new BigDecimal(100), 2, RoundingMode.DOWN)).append("元\n");

+ 29 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/UserDeliverOrderTask.java

@@ -4,7 +4,10 @@ import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.date.TemporalUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.common.enums.ChannelOrderStatusEnum;
 import com.qs.mp.common.enums.DeliverOrderStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.service.IUserDeliverOrderService;
@@ -34,6 +37,8 @@ public class UserDeliverOrderTask {
     @Autowired
     private IUserDeliverOrderService userDeliverOrderService;
 
+    private final int PAGE_SIZE = 500;
+
 
     /**
      * x天前的待收货订单自动确认收货任务
@@ -62,5 +67,29 @@ public class UserDeliverOrderTask {
         LogUtil.info(logger, "...用户提货订单自动确认收货任务结束...");
     }
 
+    /**
+     * 订单取消到期任务
+     */
+    public void cancel() {
+        LogUtil.info(logger, "...用户提货未支付订单定时取消任务开始...");
+        int total = PAGE_SIZE;
+        while (total == PAGE_SIZE) {
+            // 捞取30分钟前未支付订单
+            List<UserDeliverOrder> userDeliverOrderList = userDeliverOrderService.list(
+                new LambdaQueryWrapper<UserDeliverOrder>()
+                    .eq(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.NOT_PAY)
+                    .lt(UserDeliverOrder::getCreatedTime, DateUtils.addMinutes(DateUtils.getNowDate(), -30))
+                    .last("limit " + PAGE_SIZE));
+            total = userDeliverOrderList.size();
+            for (UserDeliverOrder userDeliverOrder : userDeliverOrderList) {
+                try {
+                    userDeliverOrderService.cancelOrder(userDeliverOrder.getOrderId());
+                } catch (Exception e) {
+                    LogUtil.error(logger, e, "定时取消未支付用户提货订单异常。orderId:{0}", userDeliverOrder.getOrderId());
+                }
+            }
+        }
+        LogUtil.info(logger, "...用户提货未支付订单定时取消任务结束...");
+    }
 
 }

+ 83 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/CouponPkg.java

@@ -0,0 +1,83 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 券包表实体类
+ * @auther quanshu
+ * @create 2022-04-29 17:43:38
+ */
+@TableName("mp_coupon_pkg")
+@Data
+@ApiModel("券包表实体类")
+public class CouponPkg implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 券包标题
+     */
+    @ApiModelProperty("券包标题")
+    @TableField("title")
+    private String title;
+
+    /**
+     * 券包图片
+     */
+    @ApiModelProperty("券包图片")
+    @TableField("pic_url")
+    private String picUrl;
+
+    /**
+     * 面值
+     */
+    @ApiModelProperty("面值")
+    @TableField("face_price")
+    private Integer facePrice;
+
+    /**
+     * 优惠券数量
+     */
+    @ApiModelProperty("优惠券数量")
+    @TableField("coupon_num")
+    private Integer couponNum;
+
+    /**
+     * 券包,状态 0待上架 1 上架 2下架
+     */
+    @ApiModelProperty("券包,状态 0待上架 1 上架 2下架")
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 67 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/CouponPkgItem.java

@@ -0,0 +1,67 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 券包明细表实体类
+ * @auther quanshu
+ * @create 2022-04-29 17:43:54
+ */
+@TableName("mp_coupon_pkg_item")
+@Data
+@ApiModel("券包明细表实体类")
+public class CouponPkgItem implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 券包id
+     */
+    @ApiModelProperty("券包id")
+    @TableField("coupon_pkg_id")
+    private Long couponPkgId;
+
+    /**
+     * 优惠券id
+     */
+    @ApiModelProperty("优惠券id")
+    @TableField("coupon_id")
+    private Long couponId;
+
+    @ApiModelProperty("优惠券发放数量")
+    @TableField("coupon_num")
+    private Integer couponNum;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/TicketAwardsPrize.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import java.io.Serializable;
@@ -104,6 +105,18 @@ public class TicketAwardsPrize implements Serializable {
   @TableField("value")
   private Integer value;
 
+  @ApiModelProperty("排序权重,越大越靠前")
+  @TableField("sort_weight")
+  private Integer sortWeight;
+
+  /**
+   * 逻辑删除标识
+   */
+  @ApiModelProperty("逻辑删除标识")
+  @TableField("is_deleted")
+  @TableLogic
+  private Integer isDeleted;
+
   /**
    * 创建时间
    */

+ 4 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java

@@ -149,6 +149,10 @@ public class TicketBox implements Serializable {
   @TableField("sale_comm_rate")
   private BigDecimal saleCommRate;
 
+  @ApiModelProperty("销售渠道类型:1所有渠道,2指定渠道")
+  @TableField("sale_channel_type")
+  private Integer saleChannelType;
+
   /**
    * 规格属性
    */

+ 62 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/TicketBoxChannel.java

@@ -0,0 +1,62 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 盲票销售渠道关联表实体类
+ * @auther quanshu
+ * @create 2022-04-29 17:44:27
+ */
+@TableName("mp_ticket_box_channel")
+@Data
+@ApiModel("盲票销售渠道关联表实体类")
+public class TicketBoxChannel implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 盲票组id
+     */
+    @ApiModelProperty("盲票组id")
+    @TableField("box_id")
+    private String boxId;
+
+    /**
+     * 渠道id
+     */
+    @ApiModelProperty("渠道id")
+    @TableField("channel_id")
+    private Long channelId;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 57 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/excel/UserTicketOrderExcel.java

@@ -0,0 +1,57 @@
+package com.qs.mp.admin.domain.excel;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.annotation.Excel;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户盲票订单导出类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单导出类")
+@Data
+public class UserTicketOrderExcel {
+
+    @Excel(name = "订单编号")
+    private String orderId;
+
+    @Excel(name = "下单时间")
+    private Date createdTime;
+
+    @Excel(name = "盲票组名称")
+    private String title;
+
+    @Excel(name = "盲票类型")
+    private String boxType;
+
+    @Excel(name = "盲票售价")
+    private Integer salePrice;
+
+    @Excel(name = "购买数量")
+    private Integer ticketNum;
+
+    @Excel(name = "订单状态")
+    private String status;
+
+    @Excel(name = "优惠金额")
+    private Integer discountAmt;
+
+    @Excel(name = "实付金额")
+    private Integer payAmt;
+
+    @Excel(name = "用户昵称")
+    private String nickName;
+
+    @Excel(name = "用户手机号")
+    private String phone;
+
+
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponPkgItemParam.java

@@ -0,0 +1,16 @@
+package com.qs.mp.admin.domain.param;
+
+import com.qs.mp.admin.domain.CouponPkgItem;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 券包明细入参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("券包明细入参类")
+@Data
+public class CouponPkgItemParam extends CouponPkgItem {
+
+}

+ 22 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponPkgParam.java

@@ -0,0 +1,22 @@
+package com.qs.mp.admin.domain.param;
+
+import com.qs.mp.admin.domain.CouponPkg;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 券包入参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("券包入参类")
+@Data
+public class CouponPkgParam extends CouponPkg {
+
+    @ApiModelProperty("券包明细列表")
+    List<CouponPkgItemParam> couponPkgItemList;
+
+}

+ 30 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponPkgQueryParam.java

@@ -0,0 +1,30 @@
+package com.qs.mp.admin.domain.param;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 券包查询入参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("券包查询入参类")
+@Data
+public class CouponPkgQueryParam {
+    /**
+     * 券包标题
+     */
+    @ApiModelProperty("券包标题")
+    private String title;
+
+    /**
+     * 券包,状态 0待上架 1 上架 2下架
+     */
+    @ApiModelProperty("券包,状态 0待上架 1 上架 2下架")
+    private Integer status;
+
+
+
+}

+ 22 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponPkgStatusParam.java

@@ -0,0 +1,22 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 券包状态修改入参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("券包状态修改入参类")
+@Data
+public class CouponPkgStatusParam {
+
+    @ApiModelProperty("券包id")
+    private Long id;
+
+
+    @ApiModelProperty("券包,状态 0待上架 1 上架 2下架")
+    private Integer status;
+}

+ 26 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ShippingTemplateParam.java

@@ -0,0 +1,26 @@
+package com.qs.mp.admin.domain.param;
+
+
+import com.qs.mp.common.domain.ShippingTemplate;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 运费模板入参类
+ *
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费模板入参类")
+@Data
+public class ShippingTemplateParam extends ShippingTemplate {
+
+
+    @ApiModelProperty("运费模板相关规则列表")
+    List<ShippingTemplateRuleParam> shippingTemplateRuleList;
+
+
+}

+ 19 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ShippingTemplateRuleAreaParam.java

@@ -0,0 +1,19 @@
+package com.qs.mp.admin.domain.param;
+
+
+import com.qs.mp.common.domain.ShippingTemplateRuleArea;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 运费模板规则区域入参类
+ *
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费模板规则区域入参类")
+@Data
+public class ShippingTemplateRuleAreaParam extends ShippingTemplateRuleArea {
+
+}

+ 25 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ShippingTemplateRuleParam.java

@@ -0,0 +1,25 @@
+package com.qs.mp.admin.domain.param;
+
+
+import com.qs.mp.common.domain.ShippingTemplateRule;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 运费模板规则入参类
+ *
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费模板规则入参类")
+@Data
+public class ShippingTemplateRuleParam extends ShippingTemplateRule {
+
+
+    @ApiModelProperty("运费规则相关区域列表")
+    List<ShippingTemplateRuleAreaParam> shippingTemplateRuleAreaList;
+
+}

+ 3 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketAwardsPrizeParam.java

@@ -31,4 +31,7 @@ public class TicketAwardsPrizeParam {
 
   @ApiModelProperty(value = "奖品价值",required=true)
   private Integer value;
+
+  @ApiModelProperty(value = "排序权重",required=true)
+  private Integer sortWeight;
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxCreateParam.java

@@ -25,6 +25,12 @@ public class TicketBoxCreateParam {
 	@ApiModelProperty(value = "图片",required=true)
 	private String picUrl;
 
+	@ApiModelProperty("销售渠道类型  1 所有渠道 2 指定渠道")
+	private Integer saleChannelType;
+
+	@ApiModelProperty("渠道商id列表")
+	private List<Long> channelIdList;
+
 	@NotNull(message = "面值不能为空")
 	@ApiModelProperty(value = "面值",required=true)
 	private Integer facePrice;

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxUpdateParam.java

@@ -32,6 +32,12 @@ public class TicketBoxUpdateParam {
     @ApiModelProperty(value = "售价",required=true)
     private Integer salePrice;
 
+    @ApiModelProperty("销售渠道类型  1 所有渠道 2 指定渠道")
+    private Integer saleChannelType;
+
+    @ApiModelProperty("渠道商id列表")
+    private List<Long> channelIdList;
+
     @ApiModelProperty(value = "盲票包采购单价,线下票时必传")
     private Integer pkgSalePrice;
 

+ 41 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/UserTicketOrderQueryParam.java

@@ -0,0 +1,41 @@
+package com.qs.mp.admin.domain.param;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户盲票订单查询入参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单查询入参类")
+@Data
+public class UserTicketOrderQueryParam {
+
+    @ApiModelProperty("盲票组名称")
+    private String boxTitle;
+
+    @ApiModelProperty("盲票形式(线上或线下)")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketTypeEnum boxType;
+
+    @ApiModelProperty("用户手机号")
+    private String phone;
+
+    @ApiModelProperty("订单状态;-1 已取消 0:待付款 1:已完成")
+    private Integer status;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+}

+ 35 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponPkgItemVO.java

@@ -0,0 +1,35 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.admin.domain.CouponPkgItem;
+import com.qs.mp.common.enums.CouponTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 券包明细出参类
+ *
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("券包明细出参类")
+@Data
+public class CouponPkgItemVO extends CouponPkgItem {
+
+    @ApiModelProperty("优惠券名称")
+    private String title;
+
+    @ApiModelProperty("券优惠金额(比例)")
+    private Integer discount;
+
+    @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponTypeEnum type;
+
+    @ApiModelProperty("有效期天数;从领券后开始多少天有效,0则使用绝对有效期")
+    private Integer dueDays;
+
+
+}

+ 23 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponPkgVO.java

@@ -0,0 +1,23 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.admin.domain.CouponPkg;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 券包出参类
+ *
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("券包出参类")
+@Data
+public class CouponPkgVO extends CouponPkg {
+
+    @ApiModelProperty("券包明细列表")
+    List<CouponPkgItemVO> couponPkgItemVOList;
+
+}

+ 51 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateCalculateVO.java

@@ -0,0 +1,51 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 运费计算出参类
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费计算出参类")
+@Data
+public class ShippingTemplateCalculateVO {
+
+    /**
+     * 类型 1发货,2不发货,默认1
+     */
+    @ApiModelProperty("类型 1发货,2不发货,默认1")
+    private Integer type;
+
+    /**
+     * 默认数量
+     */
+    @ApiModelProperty("默认数量")
+    private Integer defaultNumber;
+
+    /**
+     * 默认价格
+     */
+    @ApiModelProperty("默认价格")
+    private Integer defaultPrice;
+
+    /**
+     * 新增数量
+     */
+    @ApiModelProperty("新增数量")
+    private Integer createNumber;
+
+    /**
+     * 新增价格
+     */
+    @ApiModelProperty("新增价格")
+    private Integer createPrice;
+
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 18 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateRuleAreaVO.java

@@ -0,0 +1,18 @@
+package com.qs.mp.admin.domain.vo;
+
+
+import com.qs.mp.common.domain.ShippingTemplateRuleArea;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 运费模板规则区域出参类
+ *
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费模板规则区域出参类")
+@Data
+public class ShippingTemplateRuleAreaVO extends ShippingTemplateRuleArea {
+
+}

+ 24 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateRuleVO.java

@@ -0,0 +1,24 @@
+package com.qs.mp.admin.domain.vo;
+
+
+import com.qs.mp.common.domain.ShippingTemplateRule;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 运费模板规则出参类
+ *
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费模板规则出参类")
+@Data
+public class ShippingTemplateRuleVO extends ShippingTemplateRule {
+
+    @ApiModelProperty("运费规则相关区域列表")
+    List<ShippingTemplateRuleAreaVO> shippingTemplateRuleAreaList;
+
+}

+ 22 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/ShippingTemplateVO.java

@@ -0,0 +1,22 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.common.domain.ShippingTemplate;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 运费模板出参类
+ * @author Cup
+ * @date 2022/5/5
+ */
+@ApiModel("运费模板出参类")
+@Data
+public class ShippingTemplateVO extends ShippingTemplate {
+
+    @ApiModelProperty("运费模板相关规则列表")
+    List<ShippingTemplateRuleVO> shippingTemplateRuleList;
+
+}

+ 5 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketAwardsPrizeVO.java

@@ -107,5 +107,10 @@ public class TicketAwardsPrizeVO {
   @ApiModelProperty("奖品价值")
   private Integer value;
 
+  /**
+   * 排序权重
+   */
+  private Integer sortWeight;
+
 
 }

+ 19 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxListVO.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.qs.mp.admin.domain.TicketBox;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -13,79 +16,95 @@ import lombok.Data;
  * @Date 2022/3/3
  */
 @Data
+@ApiModel("盲票组列表出参类")
 public class TicketBoxListVO {
   /**
    * 主键
    */
+  @ApiModelProperty("盲票组id")
   private String boxId;
 
   /**
    * 盲票组标题
    */
+  @ApiModelProperty("盲票组标题")
   private String title;
 
   /**
    * 主图url
    */
+  @ApiModelProperty("主图Url")
   private String picUrl;
 
   /**
    * 盲票张数
    */
+  @ApiModelProperty("盲票张数")
   private Integer quantity;
 
   /**
    * 已售盲票张数
    */
+  @ApiModelProperty("已售盲票张数")
   private Integer saleQty;
 
   /**
    * 盲票包原价
    */
+  @ApiModelProperty("盲票包原价")
   private Integer pkgPrice;
 
   /**
    * 盲票包售价
    */
+  @ApiModelProperty("盲票包售价")
   private Integer pkgSalePrice;
 
   /**
    * 每包盲票张数
    */
+  @ApiModelProperty("每包盲票张数")
   private Integer pkgUnit;
 
   /**
    * 盲票包数
    */
+  @ApiModelProperty("盲票包数")
   private Integer pkgQty;
 
   /**
    * 已销售包数
    */
+  @ApiModelProperty("已销售包数")
   private Integer salePkgQty;
 
   /**
    * 盲票票面价格
    */
+  @ApiModelProperty("盲票票面价格")
   private Integer facePrice;
 
   /**
    * 盲票销售价格
    */
+  @ApiModelProperty("盲票销售价格")
   private Integer salePrice;
 
   /**
    * 分佣的销售额百分比
    */
+  @ApiModelProperty("分佣的销售额百分比")
   private BigDecimal saleCommRate;
 
   /**
    * 规格属性
    */
+  @ApiModelProperty("规格属性")
   private String properties;
 
   /**
    * 上架时间
    */
+  @ApiModelProperty("上架时间")
   private Date onTime;
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxVO.java

@@ -3,6 +3,8 @@ package com.qs.mp.admin.domain.vo;
 import com.qs.mp.admin.domain.TicketBox;
 import java.util.List;
 
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.vo.ChannelVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -15,6 +17,10 @@ import lombok.Data;
 @Data
 @ApiModel(value = "票组出参类")
 public class TicketBoxVO extends TicketBox {
+
+  @ApiModelProperty("经销商信息")
+  List<Channel> channelList;
+
   // 奖品列表(小程序端显示)
   @ApiModelProperty("奖品列表(小程序端显示)")
   List<TicketAwardsPrizeVO> prizeList;

+ 68 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderDetailVO.java

@@ -0,0 +1,68 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户盲票订单详情出参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单详情出参类")
+@Data
+public class UserTicketOrderDetailVO {
+
+    @ApiModelProperty("订单id")
+    private String orderId;
+
+    @ApiModelProperty("订单状态;-1 已取消 0:待付款 1:已完成")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private UserTicketOrderStatusEnum status;
+
+    @ApiModelProperty("优惠金额")
+    private Integer discountAmt;
+
+    @ApiModelProperty("实付金额")
+    private Integer payAmt;
+
+    @ApiModelProperty("用户昵称")
+    private String nickName;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("渠道商名称")
+    private String channelName;
+
+    @ApiModelProperty("盲票组标题")
+    private String ticketBoxTitle;
+
+    @ApiModelProperty("盲票类型(线上或线下)")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketTypeEnum ticketBoxType;
+
+    @ApiModelProperty("佣金系数")
+    private BigDecimal saleCommRate;
+
+    @ApiModelProperty("盲票数量")
+    private Integer ticketNum;
+
+    @ApiModelProperty("销售价格")
+    private Integer salePrice;
+
+    @ApiModelProperty("下单时间")
+    private Date createdTime;
+
+    @ApiModelProperty("票相关信息列表")
+    private List<UserTicketOrderTicketDetailVO>  ticketDetailList;
+}

+ 61 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderListVO.java

@@ -0,0 +1,61 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户盲票订单列表出参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单列表出参类")
+@Data
+public class UserTicketOrderListVO {
+
+    @ApiModelProperty("订单id")
+    private String orderId;
+
+    @ApiModelProperty("盲票组名称")
+    private String title;
+
+    @ApiModelProperty("订单状态;-1 已取消 0:待付款 1:已完成")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private UserTicketOrderStatusEnum status;
+
+    @ApiModelProperty("盲票销售价格")
+    private Integer salePrice;
+
+    @ApiModelProperty("优惠金额")
+    private Integer discountAmt;
+
+    @ApiModelProperty("盲票数量")
+    private Integer ticketNum;
+
+    @ApiModelProperty("实付金额")
+    private Integer payAmt;
+
+    @ApiModelProperty("盲票形式(线上或线下)")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketTypeEnum boxType;
+
+    @ApiModelProperty("用户昵称")
+    private String nickName;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
+
+}

+ 32 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderTicketDetailVO.java

@@ -0,0 +1,32 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 用户盲票订单盲票详情出参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单盲票详情出参类")
+@Data
+public class UserTicketOrderTicketDetailVO {
+
+    @ApiModelProperty("盲票序列号")
+    private String serialNo;
+
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    @ApiModelProperty("盲票状态;1未付款、2已激活、3已兑奖、4付款中")
+    private TicketStatusEnum status;
+
+    @ApiModelProperty("奖级")
+    private String prizeGrade;
+
+    @ApiModelProperty("奖品名称")
+    private String prizeTitle;
+}

+ 33 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/CouponPkgItemMapper.java

@@ -0,0 +1,33 @@
+package com.qs.mp.admin.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponPkgItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.admin.domain.vo.CouponPkgItemVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2022-04-29 17:43:54
+ * @describe 券包明细表mapper类
+ */
+public interface CouponPkgItemMapper extends BaseMapper<CouponPkgItem> {
+
+    /**
+     * 查询券包明细列表
+     * @param queryWrapper
+     * @return
+     */
+    List<CouponPkgItemVO> selectDetail(@Param(Constants.WRAPPER) QueryWrapper<CouponPkgItemVO> queryWrapper);
+
+    /**
+     * 根据券包id获取优惠券列表
+     * @param queryWrapper
+     * @return
+     */
+    List<Coupon> selectCouponList(@Param(Constants.WRAPPER) QueryWrapper<Coupon> queryWrapper);
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/CouponPkgMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.CouponPkg;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-04-29 17:43:38
+ * @describe 券包表mapper类
+ */
+public interface CouponPkgMapper extends BaseMapper<CouponPkg> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/TicketBoxChannelMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.TicketBoxChannel;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-04-29 17:44:27
+ * @describe 盲票销售渠道关联表mapper类
+ */
+public interface TicketBoxChannelMapper extends BaseMapper<TicketBoxChannel> {
+
+}

+ 11 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/TicketBoxMapper.java

@@ -1,7 +1,12 @@
 package com.qs.mp.admin.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.TicketBox;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @auther quanshu
@@ -10,4 +15,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface TicketBoxMapper extends BaseMapper<TicketBox> {
 
+    /**
+     * 根据条件查询盲票组列表
+     * @param queryWrapper
+     * @return
+     */
+    List<TicketBox> listBySaleChannel(@Param(Constants.WRAPPER) QueryWrapper<TicketBox> queryWrapper);
 }

+ 34 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICouponPkgItemService.java

@@ -0,0 +1,34 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponPkgItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.vo.CouponPkgItemVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 券包明细表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+public interface ICouponPkgItemService extends IService<CouponPkgItem> {
+
+    /**
+     * 获取券包明细列表
+     * @param id
+     * @return
+     */
+    List<CouponPkgItemVO> listDetailByCouponPkgId(Long id);
+
+    /**
+     * 根据券包模板id获取优惠券列表
+     * @param couponPkgId
+     * @return
+     */
+    List<Coupon> listCouponByPkgId(String couponPkgId);
+
+}

+ 60 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICouponPkgService.java

@@ -0,0 +1,60 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.CouponPkg;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.param.CouponPkgParam;
+import com.qs.mp.admin.domain.vo.CouponPkgVO;
+
+/**
+ * <p>
+ * 券包表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+public interface ICouponPkgService extends IService<CouponPkg> {
+
+    /**
+     * 新增券包
+     *
+     * @param couponPkgParam
+     * @return
+     */
+    boolean create(CouponPkgParam couponPkgParam);
+
+    /**
+     * 修改券包
+     *
+     * @param couponPkgParam
+     * @return
+     */
+    boolean updateCouponPkg(CouponPkgParam couponPkgParam);
+
+    /**
+     * 券包详情
+     *
+     * @param id
+     * @return
+     */
+    CouponPkgVO detail(Long id);
+
+    /**
+     * 删除券包
+     *
+     * @param id
+     * @return
+     */
+    boolean delete(Long id);
+
+    /**
+     * 券包发券
+     *
+     * @param ticket
+     * @param userId
+     * @param refId
+     */
+    void distribute(Ticket ticket, Long userId, String couponPkgId);
+
+}

+ 2 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ITicketAwardsPrizeService.java

@@ -18,4 +18,6 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface ITicketAwardsPrizeService extends IService<TicketAwardsPrize> {
   List<TicketAwardsPrizeVO> listPrizeVO(Wrapper<TicketAwardsPrize> queryWrapper);
+
+  List<TicketAwardsPrizeVO> listPrizeVO(String boxId);
 }

+ 16 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxChannelService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.TicketBoxChannel;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 盲票销售渠道关联表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+public interface ITicketBoxChannelService extends IService<TicketBoxChannel> {
+
+}

+ 10 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxService.java

@@ -1,10 +1,13 @@
 package com.qs.mp.admin.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.TicketBox;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
 import com.qs.mp.admin.domain.param.TicketBoxUpdateParam;
 
+import java.util.List;
+
 /**
  * <p>
  * 盲票组 服务类
@@ -40,4 +43,11 @@ public interface ITicketBoxService extends IService<TicketBox> {
      * @return
      */
   boolean updateTicketBox(TicketBoxUpdateParam param);
+
+  /**
+   * 根据条件查询盲票组列表
+   * @param queryWrapper
+   * @return
+   */
+  List<TicketBox> listBySaleChannel(QueryWrapper<TicketBox> queryWrapper);
 }

+ 38 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponPkgItemServiceImpl.java

@@ -0,0 +1,38 @@
+package com.qs.mp.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponPkgItem;
+import com.qs.mp.admin.domain.vo.CouponPkgItemVO;
+import com.qs.mp.admin.mapper.CouponPkgItemMapper;
+import com.qs.mp.admin.service.ICouponPkgItemService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 券包明细表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+@Service
+public class CouponPkgItemServiceImpl extends ServiceImpl<CouponPkgItemMapper, CouponPkgItem> implements ICouponPkgItemService {
+
+    @Override
+    public List<CouponPkgItemVO> listDetailByCouponPkgId(Long id) {
+        QueryWrapper<CouponPkgItemVO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.coupon_pkg_id", id);
+        return this.getBaseMapper().selectDetail(queryWrapper);
+    }
+
+    @Override
+    public List<Coupon> listCouponByPkgId(String couponPkgId) {
+        QueryWrapper<Coupon> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.coupon_pkg_id", couponPkgId);
+        return this.getBaseMapper().selectCouponList(queryWrapper);
+    }
+}

+ 188 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponPkgServiceImpl.java

@@ -0,0 +1,188 @@
+package com.qs.mp.admin.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponPkg;
+import com.qs.mp.admin.domain.CouponPkgItem;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.param.CouponPkgItemParam;
+import com.qs.mp.admin.domain.param.CouponPkgParam;
+import com.qs.mp.admin.domain.vo.CouponPkgItemVO;
+import com.qs.mp.admin.domain.vo.CouponPkgVO;
+import com.qs.mp.admin.mapper.CouponPkgMapper;
+import com.qs.mp.admin.service.ICouponPkgItemService;
+import com.qs.mp.admin.service.ICouponPkgService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.service.ICouponService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.enums.CouponPkgStatusEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.domain.UserCouponChannel;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.service.IUserCouponChannelService;
+import com.qs.mp.user.service.IUserCouponService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 券包表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+@Service
+public class CouponPkgServiceImpl extends ServiceImpl<CouponPkgMapper, CouponPkg> implements ICouponPkgService {
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    private ICouponPkgItemService couponPkgItemService;
+
+
+    @Autowired
+    private ICouponService couponService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void distribute(Ticket ticket, Long userId, String couponPkgId) {
+        List<CouponPkgItem> couponPkgItems = couponPkgItemService.list(new LambdaQueryWrapper<CouponPkgItem>().eq(CouponPkgItem::getCouponPkgId, couponPkgId));
+
+        if (CollectionUtils.isEmpty(couponPkgItems)) {
+            throw new ServiceException("券包下优惠券不存在");
+        }
+        for (CouponPkgItem couponPkgItem : couponPkgItems) {
+            for (int i = 0; i < couponPkgItem.getCouponNum(); i++) {
+                couponService.distribute(ticket, userId, couponPkgItem.getCouponId().toString());
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean delete(Long id) {
+
+        // 删除券包明细
+        couponPkgItemService.remove(new LambdaQueryWrapper<CouponPkgItem>().eq(CouponPkgItem::getCouponPkgId, id));
+
+        // 删除券包
+        this.removeById(id);
+
+        return true;
+    }
+
+    @Override
+    public CouponPkgVO detail(Long id) {
+        CouponPkgVO couponPkgVO = new CouponPkgVO();
+
+        // 封装券包信息
+        CouponPkg couponPkg = this.getById(id);
+        if (Objects.isNull(couponPkg)) {
+            throw new ServiceException("券包不存在");
+        }
+        BeanUtils.copyProperties(couponPkg, couponPkgVO);
+
+        // 封装券包明细信息
+        List<CouponPkgItemVO> list = couponPkgItemService.listDetailByCouponPkgId(id);
+        couponPkgVO.setCouponPkgItemVOList(list);
+
+        return couponPkgVO;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateCouponPkg(CouponPkgParam couponPkgParam) {
+
+        if (Objects.isNull(couponPkgParam.getId()) || couponPkgParam.getId() == 0) {
+            throw new ServiceException("券包ID不正确");
+        }
+
+        CouponPkg couponPkg = this.getById(couponPkgParam.getId());
+        if (Objects.isNull(couponPkg)) {
+            throw new ServiceException("券包不存在");
+        }
+
+        if (!CouponPkgStatusEnum.PUT_INIT.getValue().equals(couponPkg.getStatus())) {
+            throw new ServiceException("券包只有待上架才可编辑");
+        }
+
+
+        List<CouponPkgItemParam> couponPkgItemList = couponPkgParam.getCouponPkgItemList();
+        if (CollectionUtils.isEmpty(couponPkgItemList)) {
+            throw new ServiceException("券包明细不能为空");
+        }
+
+        // 清除券包明细
+        couponPkgItemService.remove(new LambdaQueryWrapper<CouponPkgItem>()
+                .eq(CouponPkgItem::getCouponPkgId, couponPkgParam.getId()));
+
+        // 更新券包
+        couponPkg = new CouponPkg();
+        BeanUtils.copyProperties(couponPkgParam, couponPkg);
+        couponPkg.setPicUrl("coupon_def.jpeg");
+        this.updateById(couponPkg);
+
+        // 创建券包明细
+        List<CouponPkgItem> params = new ArrayList<>();
+        for (CouponPkgItemParam couponPkgItemParam : couponPkgItemList) {
+            CouponPkgItem param = new CouponPkgItem();
+            param.setCouponPkgId(couponPkg.getId());
+            param.setCouponId(couponPkgItemParam.getCouponId());
+            param.setCouponNum(couponPkgItemParam.getCouponNum());
+            params.add(param);
+        }
+        couponPkgItemService.saveBatch(params);
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean create(CouponPkgParam couponPkgParam) {
+
+        List<CouponPkgItemParam> couponPkgItemList = couponPkgParam.getCouponPkgItemList();
+        if (CollectionUtils.isEmpty(couponPkgItemList)) {
+            throw new ServiceException("券包明细不能为空");
+        }
+
+        CouponPkg couponPkg = new CouponPkg();
+        BeanUtils.copyProperties(couponPkgParam, couponPkg);
+        couponPkg.setPicUrl("coupon_def.jpeg");
+        this.save(couponPkg);
+
+        List<CouponPkgItem> params = new ArrayList<>();
+        for (CouponPkgItemParam couponPkgItemParam : couponPkgItemList) {
+            CouponPkgItem param = new CouponPkgItem();
+            param.setCouponPkgId(couponPkg.getId());
+            param.setCouponId(couponPkgItemParam.getCouponId());
+            param.setCouponNum(couponPkgItemParam.getCouponNum());
+            params.add(param);
+        }
+        couponPkgItemService.saveBatch(params);
+
+        return true;
+    }
+}

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java

@@ -76,7 +76,7 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
 	private IChannelService channelService;
 
   @Override
-  @Transactional
+  @Transactional(rollbackFor = Exception.class)
   public void distribute(Ticket ticket, Long userId, String couponId) {
     Coupon coupon = getById(couponId);
     UserCoupon userCoupon = new UserCoupon();

+ 7 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketAwardsPrizeServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qs.mp.admin.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.admin.mapper.TicketAwardsPrizeMapper;
@@ -25,4 +26,10 @@ public class TicketAwardsPrizeServiceImpl extends ServiceImpl<TicketAwardsPrizeM
   public List<TicketAwardsPrizeVO> listPrizeVO(Wrapper<TicketAwardsPrize> queryWrapper) {
     return getBaseMapper().listPrizeVO(queryWrapper);
   }
+
+  @Override
+  public List<TicketAwardsPrizeVO> listPrizeVO(String boxId) {
+    return listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", boxId).eq("t2.is_deleted", 0).orderByAsc("t1.sort").orderByDesc("t2.sort_weight").orderByDesc("t2.value"));
+  }
 }

+ 20 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxChannelServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.admin.service.impl;
+
+import com.qs.mp.admin.domain.TicketBoxChannel;
+import com.qs.mp.admin.mapper.TicketBoxChannelMapper;
+import com.qs.mp.admin.service.ITicketBoxChannelService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 盲票销售渠道关联表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+@Service
+public class TicketBoxChannelServiceImpl extends ServiceImpl<TicketBoxChannelMapper, TicketBoxChannel> implements ITicketBoxChannelService {
+
+}

+ 108 - 26
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -2,37 +2,21 @@ package com.qs.mp.admin.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 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.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qs.mp.admin.domain.Coupon;
-import com.qs.mp.admin.domain.Goods;
-import com.qs.mp.admin.domain.Ticket;
-import com.qs.mp.admin.domain.TicketAwards;
-import com.qs.mp.admin.domain.TicketAwardsPrize;
-import com.qs.mp.admin.domain.TicketBox;
-import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.domain.*;
 import com.qs.mp.admin.domain.dto.TicketDrawNumDTO;
 import com.qs.mp.admin.domain.param.TicketAwardsParam;
 import com.qs.mp.admin.domain.param.TicketAwardsPrizeParam;
 import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
 import com.qs.mp.admin.domain.param.TicketBoxUpdateParam;
 import com.qs.mp.admin.mapper.TicketBoxMapper;
-import com.qs.mp.admin.service.ICouponService;
-import com.qs.mp.admin.service.IGoodsService;
-import com.qs.mp.admin.service.ITicketAwardsPrizeService;
-import com.qs.mp.admin.service.ITicketAwardsService;
-import com.qs.mp.admin.service.ITicketBoxSerialService;
-import com.qs.mp.admin.service.ITicketBoxService;
-import com.qs.mp.admin.service.ITicketPackageService;
-import com.qs.mp.admin.service.ITicketService;
-import com.qs.mp.common.enums.MqTopicType;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
-import com.qs.mp.common.enums.TicketPkgStatusEnum;
-import com.qs.mp.common.enums.TicketPrizeTypeEnum;
-import com.qs.mp.common.enums.TicketStatusEnum;
-import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.admin.service.*;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.LogUtil;
@@ -103,6 +87,21 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
   @Autowired
   private ITicketPackageService ticketPackageService;
 
+  @Autowired
+  private ICouponPkgService couponPkgService;
+
+  @Autowired
+  private ITicketBoxChannelService ticketBoxChannelService;
+
+  @Autowired
+  private IChannelService channelService;
+
+
+  @Override
+  public List<TicketBox> listBySaleChannel(QueryWrapper<TicketBox> queryWrapper) {
+    return getBaseMapper().listBySaleChannel(queryWrapper);
+  }
+
   @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean updateTicketBox(TicketBoxUpdateParam param) {
@@ -117,8 +116,43 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     ticketBox.setSalePrice(param.getSalePrice());
     ticketBox.setPkgSalePrice(param.getPkgSalePrice());
     ticketBox.setSaleCommRate(param.getSaleCommRate());
+    ticketBox.setSaleChannelType(param.getSaleChannelType());
     this.updateById(ticketBox);
 
+    // 清除指定渠道内容
+    ticketBoxChannelService.remove(new LambdaUpdateWrapper<TicketBoxChannel>().eq(TicketBoxChannel::getBoxId, ticketBox.getBoxId()));
+
+    // 指定渠道
+    if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(param.getSaleChannelType())) {
+      List<Long> channelIdList = param.getChannelIdList();
+      if (CollectionUtils.isEmpty(channelIdList)) {
+        throw new ServiceException("渠道列表为空");
+      }
+      // 校验嵌套问题
+      List<String> channelNoList = channelService.list(new LambdaQueryWrapper<Channel>()
+                      .in(Channel::getChannelId, channelIdList))
+              .stream().map(Channel::getChannelNo)
+              .collect(Collectors.toList());
+      for (int i = 0; i < channelNoList.size(); i++) {
+        for (int j = 0; j < channelNoList.size(); j++) {
+          if (i == j) {
+            continue;
+          }
+          if (channelNoList.get(i).contains(channelNoList.get(j))) {
+            throw new ServiceException("已选择更高级的渠道,不支持渠道相互嵌套!");
+          }
+        }
+      }
+      List<TicketBoxChannel> ticketBoxChannelList = new ArrayList<>();
+      for (Long channelId : channelIdList) {
+        TicketBoxChannel ticketBoxChannel = new TicketBoxChannel();
+        ticketBoxChannel.setBoxId(ticketBox.getBoxId());
+        ticketBoxChannel.setChannelId(channelId);
+        ticketBoxChannelList.add(ticketBoxChannel);
+      }
+      ticketBoxChannelService.saveBatch(ticketBoxChannelList);
+    }
+
     // 校验更新奖品信息
     if (CollectionUtils.isEmpty(param.getAwardsList())) {
       throw new ServiceException("奖品列表不能为空");
@@ -160,24 +194,33 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
             awardsPrize.setTitle(coupon.getTitle());
             awardsPrize.setPicUrl(coupon.getPicUrl());
             awardsPrize.setValue(coupon.getDiscount());
+          } else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
+            CouponPkg couponPkg = couponPkgService.getById(awardsPrize.getRefId());
+            awardsPrize.setTitle(couponPkg.getTitle());
+            awardsPrize.setValue(couponPkg.getFacePrice());
+            awardsPrize.setPicUrl(couponPkg.getPicUrl());
           } else {
             awardsPrize.setTitle("盲豆");
             awardsPrize.setPicUrl("md.jpeg");
           }
           ticketAwardsPrizeList.add(awardsPrize);
+        } else {
+          // 更新排序权重字段
+          ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getSortWeight, ticketAwardsPrizeParam.getSortWeight()).eq(TicketAwardsPrize::getPrizeId, ticketAwardsPrizeParam.getPrizeId()));
         }
         return ticketAwardsPrizeParam.getPrizeId();
       }).collect(Collectors.toList());
 
       // 如果新的奖品id为空,则清除原来的所有奖品
       if (CollectionUtils.isEmpty(prizeIdList)) {
-        ticketAwardsPrizeService.remove(new LambdaUpdateWrapper<TicketAwardsPrize>().eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
+        ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getIsDeleted, 1).eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
       } else {
         // 去重后,清除原来的奖品
         // 查询原来的奖品信息
         List<TicketAwardsPrize> oldTicketAwardsPrizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
                 .select(TicketAwardsPrize::getPrizeId)
-                .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
+                .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId())
+            .eq(TicketAwardsPrize::getIsDeleted, 0));
         if (CollectionUtils.isEmpty(oldTicketAwardsPrizeList)) {
           throw new ServiceException("原奖品列表为空");
         }
@@ -187,7 +230,7 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
 
         if (CollectionUtils.isNotEmpty(oldPrizeIdList)) {
           // 删除原来的奖品信息
-          ticketAwardsPrizeService.removeByIds(oldPrizeIdList);
+          ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getIsDeleted, 1).in(TicketAwardsPrize::getPrizeId, oldPrizeIdList));
         }
       }
 
@@ -202,7 +245,7 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
   }
 
   @Override
-  @Transactional
+  @Transactional(rollbackFor = Exception.class)
   public String createTicketBox(TicketBoxCreateParam param) {
     // 创建盲票组
     TicketBox ticketBox = mapperFacade.map(param, TicketBox.class);
@@ -210,8 +253,42 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     ticketBox.setStatus(TicketBoxStatusEnum.WAIT);
     ticketBox.setBoxNo(ticketBoxSerialService.generateSerial(ticketBox.getType()));
     ticketBox.setBoxId(bizIdGenerator.newId());
+    ticketBox.setSaleChannelType(param.getSaleChannelType());
     save(ticketBox);
 
+    // 指定渠道
+    if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(param.getSaleChannelType())) {
+      List<Long> channelIdList = param.getChannelIdList();
+      if (CollectionUtils.isEmpty(channelIdList)) {
+        throw new ServiceException("渠道列表为空");
+      }
+
+      // 校验嵌套问题
+      List<String> channelNoList = channelService.list(new LambdaQueryWrapper<Channel>()
+                                .in(Channel::getChannelId, channelIdList))
+                                .stream().map(Channel::getChannelNo)
+                                .collect(Collectors.toList());
+      for (int i = 0; i < channelNoList.size(); i++) {
+        for (int j = 0; j < channelNoList.size(); j++) {
+          if (i == j) {
+            continue;
+          }
+          if (channelNoList.get(i).contains(channelNoList.get(j))) {
+            throw new ServiceException("已选择更高级的渠道,不支持渠道相互嵌套!");
+          }
+        }
+      }
+
+      List<TicketBoxChannel> ticketBoxChannelList = new ArrayList<>();
+      for (Long channelId : channelIdList) {
+        TicketBoxChannel ticketBoxChannel = new TicketBoxChannel();
+        ticketBoxChannel.setBoxId(ticketBox.getBoxId());
+        ticketBoxChannel.setChannelId(channelId);
+        ticketBoxChannelList.add(ticketBoxChannel);
+      }
+      ticketBoxChannelService.saveBatch(ticketBoxChannelList);
+    }
+
     // 创建奖级
     List<TicketAwards> ticketAwardsList = new ArrayList<>();
     List<TicketAwardsPrize> awardsPrizeList = new ArrayList<>();
@@ -252,6 +329,11 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
           awardsPrize.setTitle(coupon.getTitle());
           awardsPrize.setPicUrl(coupon.getPicUrl());
           awardsPrize.setValue(coupon.getDiscount());
+        } else if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
+          CouponPkg couponPkg = couponPkgService.getById(awardsPrize.getRefId());
+          awardsPrize.setTitle(couponPkg.getTitle());
+          awardsPrize.setValue(couponPkg.getFacePrice());
+          awardsPrize.setPicUrl(couponPkg.getPicUrl());
         } else {
           awardsPrize.setTitle("盲豆");
           awardsPrize.setPicUrl("md.jpeg");

+ 5 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelCartVO.java

@@ -1,6 +1,8 @@
 package com.qs.mp.channel.domain.vo;
 
 import com.qs.mp.admin.domain.vo.TicketBoxListVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -8,14 +10,17 @@ import lombok.Data;
  * @Date 2022/3/3
  */
 @Data
+@ApiModel("经销商购物车出参类")
 public class ChannelCartVO extends TicketBoxListVO {
 
   /**
    * 购物车清单ID
    */
+  @ApiModelProperty("购物车清单ID")
   private Long cartId;
   /**
    * 订购数量
    */
+  @ApiModelProperty("订购数量")
   private Integer orderNum;
 }

+ 17 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderSettleVO.java

@@ -3,6 +3,9 @@ package com.qs.mp.channel.domain.vo;
 import com.qs.mp.user.domain.UserAddr;
 import java.util.ArrayList;
 import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -10,37 +13,51 @@ import lombok.Data;
  * @Date 2022/3/3
  */
 @Data
+@ApiModel("经销商订单结算出参类")
 public class ChannelOrderSettleVO {
 
+  @ApiModelProperty("用户地址")
   private UserAddr addr;
 
   /**
    * 订单金额
    */
+  @ApiModelProperty("订单金额")
   private Integer orderAmt = 0;
 
   /**
    * 优惠金额
    */
+  @ApiModelProperty("优惠金额")
   private Integer discountAmt = 0;
 
   /**
    * 运费金额
    */
+  @ApiModelProperty("运费金额")
   private Integer freightAmt = 0;
 
+  @ApiModelProperty("运费模板类型 1发货,2不发货")
+  private Integer freightType;
+
+  @ApiModelProperty("运费备注")
+  private String freightRemark;
+
   /**
    * 实付金额
    */
+  @ApiModelProperty("实付金额")
   private Integer payAmt = 0;
 
   /**
    * 订单明细
    */
+  @ApiModelProperty("订单明细")
   private List<ChannelCartVO> items = new ArrayList<>();
 
   /**
    * 盲票包数
    */
+  @ApiModelProperty("盲票包数")
   private Integer pkgNum = 0;
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/common/domain/Area.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -13,20 +15,25 @@ import lombok.Data;
  * @auther quanshu
  * @create 2022-03-02 11:23:04
  */
+@ApiModel("区域实体类")
 @TableName("mp_area")
 @Data
 public class Area implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @TableId(value = "area_id", type = IdType.AUTO)
+    @ApiModelProperty("区域id")
     private Long areaId;
 
+    @ApiModelProperty("区域名称")
     @TableField("area_name")
     private String areaName;
 
+    @ApiModelProperty("上级id")
     @TableField("parent_id")
     private Long parentId;
 
+    @ApiModelProperty("级别")
     @TableField("level")
     private Integer level;
 

+ 61 - 0
mp-service/src/main/java/com/qs/mp/common/domain/ShippingTemplate.java

@@ -0,0 +1,61 @@
+package com.qs.mp.common.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 运费模板表实体类
+ * @auther quanshu
+ * @create 2022-04-29 17:38:31
+ */
+@TableName("mp_shipping_template")
+@Data
+@ApiModel("运费模板表实体类")
+public class ShippingTemplate implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 运费模板标题
+     */
+    @ApiModelProperty("运费模板标题")
+    @TableField("title")
+    private String title;
+
+
+    @ApiModelProperty("默认模板 0不默认,1默认")
+    @TableField("is_default")
+    private Integer isDefault;
+
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 97 - 0
mp-service/src/main/java/com/qs/mp/common/domain/ShippingTemplateRule.java

@@ -0,0 +1,97 @@
+package com.qs.mp.common.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 运费规则表实体类
+ * @auther quanshu
+ * @create 2022-04-29 17:38:57
+ */
+@TableName("mp_shipping_template_rule")
+@Data
+@ApiModel("运费规则表实体类")
+public class ShippingTemplateRule implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 运费模板ID
+     */
+    @ApiModelProperty("运费模板ID")
+    @TableField("shipping_template_id")
+    private Long shippingTemplateId;
+
+    /**
+     * 类型 1发货,2不发货,默认1
+     */
+    @ApiModelProperty("类型 1发货,2不发货,默认1")
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 默认数量
+     */
+    @ApiModelProperty("默认数量")
+    @TableField("default_number")
+    private Integer defaultNumber;
+
+    /**
+     * 默认价格
+     */
+    @ApiModelProperty("默认价格")
+    @TableField("default_price")
+    private Integer defaultPrice;
+
+    /**
+     * 新增数量
+     */
+    @ApiModelProperty("新增数量")
+    @TableField("create_number")
+    private Integer createNumber;
+
+    /**
+     * 新增价格
+     */
+    @ApiModelProperty("新增价格")
+    @TableField("create_price")
+    private Integer createPrice;
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty("备注")
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 83 - 0
mp-service/src/main/java/com/qs/mp/common/domain/ShippingTemplateRuleArea.java

@@ -0,0 +1,83 @@
+package com.qs.mp.common.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 运费规则地区关联表实体类
+ * @auther quanshu
+ * @create 2022-04-29 17:39:13
+ */
+@TableName("mp_shipping_template_rule_area")
+@Data
+@ApiModel("运费规则地区关联表实体类")
+public class ShippingTemplateRuleArea implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 运费规则id
+     */
+    @ApiModelProperty("运费规则id")
+    @TableField("shipping_template_rule_id")
+    private Long shippingTemplateRuleId;
+
+    /**
+     * 省份
+     */
+    @ApiModelProperty("省份")
+    @TableField("province")
+    private String province;
+
+    /**
+     * 省份ID
+     */
+    @ApiModelProperty("省份ID")
+    @TableField("province_id")
+    private Long provinceId;
+
+    /**
+     * 市
+     */
+    @ApiModelProperty("市")
+    @TableField("city")
+    private String city;
+
+    /**
+     * 市ID
+     */
+    @ApiModelProperty("市ID")
+    @TableField("city_id")
+    private Long cityId;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 23 - 0
mp-service/src/main/java/com/qs/mp/common/domain/vo/CityVO.java

@@ -0,0 +1,23 @@
+package com.qs.mp.common.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("市信息")
+@Data
+public class CityVO {
+
+    @ApiModelProperty("区域id")
+    private Long areaId;
+
+    @ApiModelProperty("区域名称")
+    private String areaName;
+}

+ 29 - 0
mp-service/src/main/java/com/qs/mp/common/domain/vo/ProvinceVO.java

@@ -0,0 +1,29 @@
+package com.qs.mp.common.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("省份信息")
+@Data
+public class ProvinceVO {
+
+    @ApiModelProperty("区域id")
+    private Long areaId;
+
+    @ApiModelProperty("区域名称")
+    private String areaName;
+
+    @ApiModelProperty("市信息")
+    private List<CityVO> cityList;
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/common/mapper/ShippingTemplateMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.common.mapper;
+
+import com.qs.mp.common.domain.ShippingTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-04-29 17:38:31
+ * @describe 运费模板表mapper类
+ */
+public interface ShippingTemplateMapper extends BaseMapper<ShippingTemplate> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/common/mapper/ShippingTemplateRuleAreaMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.common.mapper;
+
+import com.qs.mp.common.domain.ShippingTemplateRuleArea;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-04-29 17:39:13
+ * @describe 运费规则地区关联表mapper类
+ */
+public interface ShippingTemplateRuleAreaMapper extends BaseMapper<ShippingTemplateRuleArea> {
+
+}

+ 25 - 0
mp-service/src/main/java/com/qs/mp/common/mapper/ShippingTemplateRuleMapper.java

@@ -0,0 +1,25 @@
+package com.qs.mp.common.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
+import com.qs.mp.common.domain.ShippingTemplateRule;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @auther quanshu
+ * @create 2022-04-29 17:38:57
+ * @describe 运费规则表mapper类
+ */
+public interface ShippingTemplateRuleMapper extends BaseMapper<ShippingTemplateRule> {
+
+    /**
+     * 根据运费模板和地区信息获取运费规则
+     *
+     * @param queryWrapper
+     * @return
+     */
+    ShippingTemplateCalculateVO selectShippingTemplateRuleByTemplateIdAndAreaInfo(@Param(Constants.WRAPPER) QueryWrapper<ShippingTemplateRule> queryWrapper);
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/common/service/IShippingTemplateRuleAreaService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.common.service;
+
+import com.qs.mp.common.domain.ShippingTemplateRuleArea;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 运费规则地区关联表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+public interface IShippingTemplateRuleAreaService extends IService<ShippingTemplateRuleArea> {
+
+}

+ 26 - 0
mp-service/src/main/java/com/qs/mp/common/service/IShippingTemplateRuleService.java

@@ -0,0 +1,26 @@
+package com.qs.mp.common.service;
+
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
+import com.qs.mp.common.domain.ShippingTemplateRule;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 运费规则表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+public interface IShippingTemplateRuleService extends IService<ShippingTemplateRule> {
+
+    /**
+     * 根据运费模板和地区信息获取运费规则
+     *
+     * @param shippingTemplateId 运费模板id
+     * @param provinceId         省份id
+     * @param cityId             城市id
+     * @return
+     */
+    ShippingTemplateCalculateVO getShippingTemplateRuleByTemplateIdAndAreaInfo(Long shippingTemplateId, Long provinceId, Long cityId);
+}

+ 56 - 0
mp-service/src/main/java/com/qs/mp/common/service/IShippingTemplateService.java

@@ -0,0 +1,56 @@
+package com.qs.mp.common.service;
+
+import com.qs.mp.admin.domain.param.ShippingTemplateParam;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
+import com.qs.mp.admin.domain.vo.ShippingTemplateVO;
+import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
+import com.qs.mp.common.domain.ShippingTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 运费模板表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+public interface IShippingTemplateService extends IService<ShippingTemplate> {
+
+    /**
+     * 新增运费模板
+     * @param shippingTemplateParam 运费模板入参类
+     * @return
+     */
+    boolean create(ShippingTemplateParam shippingTemplateParam);
+
+    /**
+     * 更新运费模板
+     * @param shippingTemplateParam 运费模板入参类
+     * @return
+     */
+    boolean updateShippingTemplate(ShippingTemplateParam shippingTemplateParam);
+
+    /**
+     * 根据id查询运费模板详情
+     * @param id    运费模板id
+     * @return
+     */
+    ShippingTemplateVO detail(Long id);
+
+
+    /**
+     * 根据id删除运费模板
+     * @param id    运费模板id
+     * @return
+     */
+    boolean deleteShippingTemplate(Long id);
+
+    /**
+     * 计算运费
+     * @param num  购买数量
+     * @param shippingTemplateCalculateVO   运费模板计算入参类
+     * @return
+     */
+    int calculateFreightAmt(Integer num, ShippingTemplateCalculateVO shippingTemplateCalculateVO);
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/common/service/impl/ShippingTemplateRuleAreaServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.common.service.impl;
+
+import com.qs.mp.common.domain.ShippingTemplateRuleArea;
+import com.qs.mp.common.mapper.ShippingTemplateRuleAreaMapper;
+import com.qs.mp.common.service.IShippingTemplateRuleAreaService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 运费规则地区关联表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+@Service
+public class ShippingTemplateRuleAreaServiceImpl extends ServiceImpl<ShippingTemplateRuleAreaMapper, ShippingTemplateRuleArea> implements IShippingTemplateRuleAreaService {
+
+}

+ 32 - 0
mp-service/src/main/java/com/qs/mp/common/service/impl/ShippingTemplateRuleServiceImpl.java

@@ -0,0 +1,32 @@
+package com.qs.mp.common.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
+import com.qs.mp.common.domain.Area;
+import com.qs.mp.common.domain.ShippingTemplateRule;
+import com.qs.mp.common.mapper.ShippingTemplateRuleMapper;
+import com.qs.mp.common.service.IShippingTemplateRuleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 运费规则表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+@Service
+public class ShippingTemplateRuleServiceImpl extends ServiceImpl<ShippingTemplateRuleMapper, ShippingTemplateRule> implements IShippingTemplateRuleService {
+
+    @Override
+    public ShippingTemplateCalculateVO getShippingTemplateRuleByTemplateIdAndAreaInfo(Long shippingTemplateId, Long provinceId, Long cityId) {
+        QueryWrapper<ShippingTemplateRule> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.id", shippingTemplateId);
+        queryWrapper.eq("t3.province_id", provinceId);
+        queryWrapper.eq("t3.city_id", cityId);
+        return this.getBaseMapper().selectShippingTemplateRuleByTemplateIdAndAreaInfo(queryWrapper);
+    }
+}

+ 257 - 0
mp-service/src/main/java/com/qs/mp/common/service/impl/ShippingTemplateServiceImpl.java

@@ -0,0 +1,257 @@
+package com.qs.mp.common.service.impl;
+
+import cn.hutool.core.util.NumberUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.param.ShippingTemplateParam;
+import com.qs.mp.admin.domain.param.ShippingTemplateRuleAreaParam;
+import com.qs.mp.admin.domain.param.ShippingTemplateRuleParam;
+import com.qs.mp.admin.domain.vo.ShippingTemplateCalculateVO;
+import com.qs.mp.admin.domain.vo.ShippingTemplateRuleAreaVO;
+import com.qs.mp.admin.domain.vo.ShippingTemplateRuleVO;
+import com.qs.mp.admin.domain.vo.ShippingTemplateVO;
+import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
+import com.qs.mp.common.domain.ShippingTemplate;
+import com.qs.mp.common.domain.ShippingTemplateRule;
+import com.qs.mp.common.domain.ShippingTemplateRuleArea;
+import com.qs.mp.common.enums.ShippingTemplateRuleTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.mapper.ShippingTemplateMapper;
+import com.qs.mp.common.service.IShippingTemplateRuleAreaService;
+import com.qs.mp.common.service.IShippingTemplateRuleService;
+import com.qs.mp.common.service.IShippingTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.user.domain.UserAddr;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 运费模板表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-29
+ */
+@Service
+public class ShippingTemplateServiceImpl extends ServiceImpl<ShippingTemplateMapper, ShippingTemplate> implements IShippingTemplateService {
+
+    @Autowired
+    private IShippingTemplateRuleService shippingTemplateRuleService;;
+
+    @Autowired
+    private IShippingTemplateRuleAreaService shippingTemplateRuleAreaService;
+
+    @Override
+    public int calculateFreightAmt(Integer num, ShippingTemplateCalculateVO shippingTemplateCalculateVO) {
+        int freightAmt = shippingTemplateCalculateVO.getDefaultPrice();
+        int createNumber = shippingTemplateCalculateVO.getCreateNumber();
+        if (num - shippingTemplateCalculateVO.getDefaultNumber() > 0 && createNumber > 0) {
+            // 运费:首件价格 + ((商品数量 - 首件数量) / 续件数量)向上取整 * 续件价格
+            freightAmt += ((int) Math.ceil(NumberUtil.div(num - shippingTemplateCalculateVO.getDefaultNumber(), createNumber))) * shippingTemplateCalculateVO.getCreatePrice();
+        }
+        return freightAmt;
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteShippingTemplate(Long id) {
+        ShippingTemplate shippingTemplate = this.getById(id);
+        if (Objects.isNull(shippingTemplate)) {
+            throw new ServiceException("运费模板不存在");
+        }
+        if (shippingTemplate.getIsDefault() == 1) {
+            throw new ServiceException("默认模板不能删除");
+        }
+
+        // 清除原来运费模板规则地区
+        List<ShippingTemplateRule> shippingTemplateRules = shippingTemplateRuleService.list(new LambdaQueryWrapper<ShippingTemplateRule>().eq(ShippingTemplateRule::getShippingTemplateId, id));
+        if (!CollectionUtils.isEmpty(shippingTemplateRules)) {
+            for (ShippingTemplateRule shippingTemplateRule : shippingTemplateRules) {
+                shippingTemplateRuleAreaService.remove(new LambdaQueryWrapper<ShippingTemplateRuleArea>().eq(ShippingTemplateRuleArea::getShippingTemplateRuleId, shippingTemplateRule.getId()));
+            }
+            // 清除原来的运费模板规则
+            shippingTemplateRuleService.remove(new LambdaQueryWrapper<ShippingTemplateRule>().eq(ShippingTemplateRule::getShippingTemplateId, id));
+        }
+
+        // 删除运费模板
+        this.removeById(id);
+        return true;
+    }
+
+    @Override
+    public ShippingTemplateVO detail(Long id) {
+        ShippingTemplateVO shippingTemplateVO = new ShippingTemplateVO();
+        ShippingTemplate shippingTemplate = this.getById(id);
+        if (Objects.isNull(shippingTemplate)) {
+            throw new ServiceException("运费模板不存在");
+        }
+        BeanUtils.copyProperties(shippingTemplate, shippingTemplateVO);
+
+        // 获取封装运费模板规则
+        List<ShippingTemplateRuleVO> shippingTemplateRuleVOS = new ArrayList<>();
+        List<ShippingTemplateRule> shippingTemplateRules = shippingTemplateRuleService.list(new LambdaQueryWrapper<ShippingTemplateRule>().eq(ShippingTemplateRule::getShippingTemplateId, id));
+        for (ShippingTemplateRule shippingTemplateRule : shippingTemplateRules) {
+
+            ShippingTemplateRuleVO shippingTemplateRuleVO = new ShippingTemplateRuleVO();
+            BeanUtils.copyProperties(shippingTemplateRule, shippingTemplateRuleVO);
+
+            List<ShippingTemplateRuleAreaVO> shippingTemplateRuleAreaVOS = new ArrayList<>();
+
+            // 获取封装运费模板规则区域
+            List<ShippingTemplateRuleArea> shippingTemplateRuleAreaList = shippingTemplateRuleAreaService.list(new LambdaQueryWrapper<ShippingTemplateRuleArea>().eq(ShippingTemplateRuleArea::getShippingTemplateRuleId, shippingTemplateRule.getId()));
+            for (ShippingTemplateRuleArea shippingTemplateRuleArea : shippingTemplateRuleAreaList) {
+                ShippingTemplateRuleAreaVO shippingTemplateRuleAreaVO = new ShippingTemplateRuleAreaVO();
+                BeanUtils.copyProperties(shippingTemplateRuleArea, shippingTemplateRuleAreaVO);
+                shippingTemplateRuleAreaVOS.add(shippingTemplateRuleAreaVO);
+            }
+
+            shippingTemplateRuleVO.setShippingTemplateRuleAreaList(shippingTemplateRuleAreaVOS);
+            shippingTemplateRuleVOS.add(shippingTemplateRuleVO);
+        }
+        shippingTemplateVO.setShippingTemplateRuleList(shippingTemplateRuleVOS);
+        return shippingTemplateVO;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean create(ShippingTemplateParam shippingTemplateParam) {
+
+        // 校验运费模板参数
+        this.checkCreateShippingTemplateParam(shippingTemplateParam);
+
+        // 新增运费模板
+        ShippingTemplate shippingTemplate = new ShippingTemplate();
+        BeanUtils.copyProperties(shippingTemplateParam, shippingTemplate);
+        this.save(shippingTemplate);
+
+        // 新增运费模板规则
+        List<ShippingTemplateRuleParam> shippingTemplateRuleList = shippingTemplateParam.getShippingTemplateRuleList();
+        if (!CollectionUtils.isEmpty(shippingTemplateRuleList)) {
+            for (ShippingTemplateRuleParam shippingTemplateRuleParam : shippingTemplateRuleList) {
+                ShippingTemplateRule shippingTemplateRule = new ShippingTemplateRule();
+                BeanUtils.copyProperties(shippingTemplateRuleParam, shippingTemplateRule);
+                shippingTemplateRule.setShippingTemplateId(shippingTemplate.getId());
+                shippingTemplateRuleService.save(shippingTemplateRule);
+
+                // 新增运费模板规则地区
+                List<ShippingTemplateRuleAreaParam> shippingTemplateRuleAreaList = shippingTemplateRuleParam.getShippingTemplateRuleAreaList();
+                List<ShippingTemplateRuleArea> params = new ArrayList<>();
+                for (ShippingTemplateRuleAreaParam shippingTemplateRuleAreaParam : shippingTemplateRuleAreaList) {
+                    ShippingTemplateRuleArea param = new ShippingTemplateRuleArea();
+                    BeanUtils.copyProperties(shippingTemplateRuleAreaParam, param);
+                    param.setShippingTemplateRuleId(shippingTemplateRule.getId());
+                    params.add(param);
+                }
+                shippingTemplateRuleAreaService.saveBatch(params);
+            }
+        }
+
+        return true;
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateShippingTemplate(ShippingTemplateParam shippingTemplateParam) {
+
+        Long shippingTemplateId = shippingTemplateParam.getId();
+        if (Objects.isNull(shippingTemplateId)) {
+            throw new ServiceException("运费模板ID不能为空");
+        }
+
+        // 校验运费模板参数
+        this.checkCreateShippingTemplateParam(shippingTemplateParam);
+
+        // 清除原来运费模板规则地区
+        List<ShippingTemplateRule> shippingTemplateRules = shippingTemplateRuleService.list(new LambdaQueryWrapper<ShippingTemplateRule>().eq(ShippingTemplateRule::getShippingTemplateId, shippingTemplateId));
+        if (!CollectionUtils.isEmpty(shippingTemplateRules)) {
+            for (ShippingTemplateRule shippingTemplateRule : shippingTemplateRules) {
+                shippingTemplateRuleAreaService.remove(new LambdaQueryWrapper<ShippingTemplateRuleArea>().eq(ShippingTemplateRuleArea::getShippingTemplateRuleId, shippingTemplateRule.getId()));
+            }
+            // 清除原来的运费模板规则
+            shippingTemplateRuleService.remove(new LambdaQueryWrapper<ShippingTemplateRule>().eq(ShippingTemplateRule::getShippingTemplateId, shippingTemplateId));
+        }
+
+        // 更新运费模板
+        ShippingTemplate shippingTemplate = new ShippingTemplate();
+        BeanUtils.copyProperties(shippingTemplateParam, shippingTemplate);
+        this.updateById(shippingTemplate);
+
+        // 新增运费模板规则
+        List<ShippingTemplateRuleParam> shippingTemplateRuleList = shippingTemplateParam.getShippingTemplateRuleList();
+        if (!CollectionUtils.isEmpty(shippingTemplateRuleList)) {
+            for (ShippingTemplateRuleParam shippingTemplateRuleParam : shippingTemplateRuleList) {
+                ShippingTemplateRule shippingTemplateRule = new ShippingTemplateRule();
+                BeanUtils.copyProperties(shippingTemplateRuleParam, shippingTemplateRule);
+                shippingTemplateRule.setShippingTemplateId(shippingTemplateId);
+                shippingTemplateRuleService.save(shippingTemplateRule);
+
+                // 新增运费模板规则地区
+                List<ShippingTemplateRuleAreaParam> shippingTemplateRuleAreaList = shippingTemplateRuleParam.getShippingTemplateRuleAreaList();
+                List<ShippingTemplateRuleArea> params = new ArrayList<>();
+                for (ShippingTemplateRuleAreaParam shippingTemplateRuleAreaParam : shippingTemplateRuleAreaList) {
+                    ShippingTemplateRuleArea param = new ShippingTemplateRuleArea();
+                    BeanUtils.copyProperties(shippingTemplateRuleAreaParam, param);
+                    param.setShippingTemplateRuleId(shippingTemplateRule.getId());
+                    params.add(param);
+                }
+                shippingTemplateRuleAreaService.saveBatch(params);
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 校验运费模板参数
+     * @param shippingTemplateParam 运费模板入参类
+     */
+    private void checkCreateShippingTemplateParam(ShippingTemplateParam shippingTemplateParam) {
+
+        if (StringUtils.isBlank(shippingTemplateParam.getTitle())) {
+            throw new ServiceException("运费模板标题不能为空");
+        }
+
+        List<ShippingTemplateRuleParam> shippingTemplateRuleList = shippingTemplateParam.getShippingTemplateRuleList();
+        if (!CollectionUtils.isEmpty(shippingTemplateRuleList)) {
+            for (ShippingTemplateRuleParam shippingTemplateRuleParam : shippingTemplateRuleList) {
+                List<ShippingTemplateRuleAreaParam> shippingTemplateRuleAreaList = shippingTemplateRuleParam.getShippingTemplateRuleAreaList();
+                if (CollectionUtils.isEmpty(shippingTemplateRuleAreaList)) {
+                    throw new ServiceException("运费模板规则区域不能为空");
+                }
+
+                for (ShippingTemplateRuleAreaParam shippingTemplateRuleAreaParam : shippingTemplateRuleAreaList) {
+
+                    if (StringUtils.isBlank(shippingTemplateRuleAreaParam.getProvince())) {
+                        throw new ServiceException("省份不能为空");
+                    }
+
+                    if (Objects.isNull(shippingTemplateRuleAreaParam.getProvinceId())) {
+                        throw new ServiceException("省份ID不能为空");
+                    }
+
+                    if (StringUtils.isBlank(shippingTemplateRuleAreaParam.getCity())) {
+                        throw new ServiceException("城市不能为空");
+                    }
+
+                    if (Objects.isNull(shippingTemplateRuleAreaParam.getCityId())) {
+                        throw new ServiceException("城市ID不能为空");
+                    }
+                }
+            }
+        }
+
+
+
+    }
+}

+ 17 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserPrizeStorage.java

@@ -10,6 +10,9 @@ import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -19,6 +22,7 @@ import lombok.Data;
  */
 @TableName("mp_user_prize_storage")
 @Data
+@ApiModel(value = "用户实物奖品仓库实体类")
 public class UserPrizeStorage implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -27,48 +31,56 @@ public class UserPrizeStorage implements Serializable {
    * 主键
    */
   @TableId(value = "storage_id", type = IdType.INPUT)
+  @ApiModelProperty("主键")
   private String storageId;
 
   /**
    * 用户ID
    */
   @TableField("user_id")
+  @ApiModelProperty("用户ID")
   private Long userId;
 
   /**
    * 商品ID
    */
   @TableField("goods_id")
+  @ApiModelProperty("商品ID")
   private Long goodsId;
 
   /**
    * sku ID
    */
   @TableField("sku_id")
+  @ApiModelProperty("sku ID")
   private Long skuId;
 
   /**
    * sku 属性
    */
   @TableField("properties")
+  @ApiModelProperty("sku 属性")
   private String properties;
 
   /**
    * 商品标题
    */
   @TableField("title")
+  @ApiModelProperty("商品标题")
   private String title;
 
   /**
    * 商品图片
    */
   @TableField("pic_url")
+  @ApiModelProperty("商品图片")
   private String picUrl;
 
   /**
    * 商品数
    */
   @TableField("goods_num")
+  @ApiModelProperty("商品数")
   private Integer goodsNum;
 
   /**
@@ -76,12 +88,14 @@ public class UserPrizeStorage implements Serializable {
    */
   @TableField("in_type")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("入库类型;1盲票兑奖、2盲豆兑换")
   private PrizeStorageInTypeEnum inType;
 
   /**
    * 关联业务ID
    */
   @TableField("ref_id")
+  @ApiModelProperty("关联业务ID")
   private String refId;
 
   /**
@@ -89,17 +103,20 @@ public class UserPrizeStorage implements Serializable {
    */
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("状态;1待提货、2已提货")
   private PrizeStorageStatusEnum status;
 
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

+ 31 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java

@@ -12,7 +12,11 @@ import com.qs.mp.common.enums.CommStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -22,6 +26,7 @@ import lombok.Data;
  */
 @TableName("mp_user_ticket_order")
 @Data
+@ApiModel("用户盲票订单实体类")
 public class UserTicketOrder implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -29,78 +34,100 @@ public class UserTicketOrder implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("订单id")
   @TableId(value = "order_id", type = IdType.INPUT)
   private String orderId;
 
   /**
    * 用户ID
    */
+  @ApiModelProperty("用户id")
   @TableField("user_id")
   private Long userId;
 
   /**
    * 标题
    */
+  @ApiModelProperty("标题")
   @TableField("title")
   private String title;
 
   /**
    * 票组ID
    */
+  @ApiModelProperty("票组id")
   @TableField("box_id")
   private String boxId;
 
+
+  @ApiModelProperty("盲票销售价格")
+  @TableField("sale_price")
+  private Integer salePrice;
+
   /**
    * 订单金额
    */
+  @ApiModelProperty("订单金额")
   @TableField("order_amt")
   private Integer orderAmt;
 
   /**
    * 优惠金额
    */
+  @ApiModelProperty("优惠金额")
   @TableField("discount_amt")
   private Integer discountAmt;
 
   /**
    * 实付金额
    */
+  @ApiModelProperty("实付金额")
   @TableField("pay_amt")
   private Integer payAmt;
 
   /**
    * 盲票数量
    */
+  @ApiModelProperty("盲票数量")
   @TableField("ticket_num")
   private Integer ticketNum;
 
+  @ApiModelProperty("分佣的销售额百分比")
+  @TableField("sale_comm_rate")
+  private BigDecimal saleCommRate;
+
   /**
    * 订单备注
    */
+  @ApiModelProperty("订单备注")
   @TableField("memo")
   private String memo;
 
   /**
    * 订单来源
    */
+  @ApiModelProperty("订单来源")
   @TableField("resource")
   private TicketTypeEnum resource;
 
   /**
    * 使用优惠信息
    */
+  @ApiModelProperty("使用优惠信息")
   @TableField("coupon_info")
   private String couponInfo;
 
   /**
    * 分享信息
    */
+  @ApiModelProperty("分享信息")
   @TableField("share_info")
   private String shareInfo;
 
   /**
    * 订单状态;-1 已取消 0:待付款 1:已完成
    */
+  @ApiModelProperty("订单状态;-1 已取消 0:待付款 1:已完成")
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private UserTicketOrderStatusEnum status;
@@ -108,6 +135,7 @@ public class UserTicketOrder implements Serializable {
   /**
    * 结佣标识,1代表已结佣 0代表未结佣
    */
+  @ApiModelProperty("结佣标识,1代表已结佣 0代表未结佣")
   @TableField("comm_status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private CommStatusEnum commStatus;
@@ -115,18 +143,21 @@ public class UserTicketOrder implements Serializable {
   /**
    * 结佣渠道ID
    */
+  @ApiModelProperty("结佣渠道ID")
   @TableField("channel_id")
   private Long channelId;
 
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   @Version
   private Date updatedTime;

+ 15 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/DeliverOrderSettleVO.java

@@ -4,6 +4,9 @@ import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import java.util.ArrayList;
 import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -11,28 +14,40 @@ import lombok.Data;
  * @Date 2022/3/3
  */
 @Data
+@ApiModel("用户提货订单结算出参类")
 public class DeliverOrderSettleVO {
 
+  @ApiModelProperty("用户配送地址")
   private UserAddr addr;
 
   /**
    * 订单金额
    */
+  @ApiModelProperty("订单金额")
   private Integer orderAmt = 0;
 
   /**
    * 运费
    */
+  @ApiModelProperty("运费")
   private Integer freightAmt = 0;
 
+  @ApiModelProperty("运费模板类型 1发货,2不发货")
+  private Integer freightType;
+
+  @ApiModelProperty("运费备注")
+  private String freightRemark;
+
   /**
    * 实付金额
    */
+  @ApiModelProperty("实付金额")
   private Integer payAmt = 0;
 
   /**
    * 奖品库列表
    */
+  @ApiModelProperty("奖品库列表")
   List<UserPrizeStorage> prizeList = new ArrayList<>();
 
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/TicketHitPrizeBarrageVO.java

@@ -9,6 +9,7 @@ import lombok.Data;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -36,5 +37,10 @@ public class TicketHitPrizeBarrageVO {
     @ApiModelProperty("奖品类型")
     private String prizeType;
 
+    @ApiModelProperty("弹幕类型 1中奖,2兑换")
+    private Integer type;
+
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
 
 }

+ 12 - 0
mp-service/src/main/java/com/qs/mp/user/mapper/UserExchangeOrderMapper.java

@@ -1,7 +1,13 @@
 package com.qs.mp.user.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.user.domain.UserExchangeOrder;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @auther quanshu
@@ -10,4 +16,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface UserExchangeOrderMapper extends BaseMapper<UserExchangeOrder> {
 
+    /**
+     * 根据条件获取用户兑奖列表
+     * @param queryWrapper
+     * @return
+     */
+    List<TicketHitPrizeBarrageVO> listByWrapper(@Param(Constants.WRAPPER) QueryWrapper<TicketHitPrizeBarrageVO> queryWrapper);
 }

+ 9 - 0
mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderItemMapper.java

@@ -1,10 +1,12 @@
 package com.qs.mp.user.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import java.util.List;
@@ -21,4 +23,11 @@ public interface UserTicketOrderItemMapper extends BaseMapper<UserTicketOrderIte
   List<TicketListVO> listMyTicketVO(@Param(Constants.WRAPPER) Wrapper<UserTicketOrderItem> queryWrapper);
 
   int countMyTicket(@Param(Constants.WRAPPER) Wrapper<UserTicketOrderItem> queryWrapper);
+
+  /**
+   * 获取订单下盲票相关详情信息
+   * @param queryWrapper
+   * @return
+   */
+  List<UserTicketOrderTicketDetailVO> listTicketDetailByOrderId(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrderTicketDetailVO> queryWrapper);
 }

+ 19 - 1
mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java

@@ -1,7 +1,10 @@
 package com.qs.mp.user.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 
@@ -82,5 +85,20 @@ public interface UserTicketOrderMapper extends BaseMapper<UserTicketOrder> {
 	    * @return
 	    */
 	   List<TicketCntVO> listTicketSaleCnt(@Param(Constants.WRAPPER) Wrapper<UserTicketOrder> queryWrapper);
-	  
+
+	/**
+	 * 获取用户盲票订单列表
+	 * @param queryWrapper
+	 * @return
+	 */
+	List<UserTicketOrderListVO> listUserTicketOrder(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
+
+	/**
+	 * 查询用户盲票订单详情
+	 * @param
+	 * @return
+	 */
+	UserTicketOrderDetailVO selectUserTicketOrderDetail(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
+
+	int countUserTicketOrder(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
 }

+ 11 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserExchangeOrderService.java

@@ -1,7 +1,11 @@
 package com.qs.mp.user.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.user.domain.UserExchangeOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -21,4 +25,11 @@ public interface IUserExchangeOrderService extends IService<UserExchangeOrder> {
    * @return 余额不足返回false,其他抛异常
    */
   boolean exchange(Long userId, Long goodsId, Long skuId, int orderNum);
+
+  /**
+   * 根据条件获取用户兑奖记录列表
+   * @param queryWrapper
+   * @return
+   */
+  List<TicketHitPrizeBarrageVO> listByWrapper(QueryWrapper<TicketHitPrizeBarrageVO> queryWrapper);
 }

+ 9 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderItemService.java

@@ -3,6 +3,7 @@ package com.qs.mp.user.service;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -47,4 +48,12 @@ public interface IUserTicketOrderItemService extends IService<UserTicketOrderIte
    * @return
    */
   TicketListVO queryTicketVO(Long userId, String orderId);
+
+  /**
+   * 获取订单下盲票相关详情信息
+   *
+   * @param orderId
+   * @return
+   */
+  List<UserTicketOrderTicketDetailVO> listTicketDetailByOrderId(String orderId);
 }

+ 25 - 1
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java

@@ -1,7 +1,11 @@
 package com.qs.mp.user.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserDeliverOrder;
@@ -128,5 +132,25 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
     * @return
     */
    List<TicketCntVO> listTicketSaleCnt(Wrapper<UserTicketOrder> queryWrapper);
-  
+
+
+    /**
+     * 获取用户盲票订单列表
+     * @return
+     */
+    List<UserTicketOrderListVO> listUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper);
+
+
+    /**
+     * 查询用户订单详情
+     * @param orderId
+     * @return
+     */
+    UserTicketOrderDetailVO detail(String orderId);
+
+    /**
+     * 统计用户订单数量
+     * @return
+     */
+    int countUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper);
 }

+ 6 - 3
mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java

@@ -96,9 +96,12 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
       orderItem.setPicUrl(prizeStorage.getPicUrl());
       orderItem.setGoodsNum(prizeStorage.getGoodsNum());
       userDeliverOrderItemService.save(orderItem);
-      userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
-          .set(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.HAS_DISTRIBUTED)
-          .eq(UserPrizeStorage::getStorageId, prizeStorage.getStorageId()));
+      boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
+                .set(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.HAS_DISTRIBUTED)
+                .eq(UserPrizeStorage::getStorageId, prizeStorage.getStorageId()));
+
+        Assert.isTrue(rtn, "提交提货订单时,更新状态失败。userDeliverOrder:" + JSONObject.toJSONString(userDeliverOrder));
+
     }
 
     return userDeliverOrder.getOrderId();

+ 7 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserExchangeOrderServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qs.mp.user.service.impl;
 
 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.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsSku;
@@ -15,6 +16,7 @@ import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.domain.UserCoin;
 import com.qs.mp.user.domain.UserExchangeOrder;
 import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
 import com.qs.mp.user.mapper.UserExchangeOrderMapper;
 import com.qs.mp.user.service.IUserCoinService;
 import com.qs.mp.user.service.IUserExchangeOrderService;
@@ -53,6 +55,11 @@ public class UserExchangeOrderServiceImpl extends ServiceImpl<UserExchangeOrderM
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
+  @Override
+  public List<TicketHitPrizeBarrageVO> listByWrapper(QueryWrapper<TicketHitPrizeBarrageVO> queryWrapper) {
+    return getBaseMapper().listByWrapper(queryWrapper);
+  }
+
   @Override
   @Transactional
   public boolean exchange(Long userId, Long goodsId, Long skuId, int orderNum) {

+ 9 - 7
mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java

@@ -8,10 +8,7 @@ import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketAwards;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.dto.TicketDrawNumDTO;
-import com.qs.mp.admin.service.ICouponService;
-import com.qs.mp.admin.service.ITicketAwardsPrizeService;
-import com.qs.mp.admin.service.ITicketAwardsService;
-import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.admin.service.*;
 import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
@@ -90,6 +87,9 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
     @Autowired
     private BizIdGenerator bizIdGenerator;
 
+    @Autowired
+    private ICouponPkgService couponPkgService;
+
     @Override
     public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
         UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
@@ -120,12 +120,12 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
             }
         }
         List<TicketAwardsPrize> awardsPrizes = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
-                .eq(TicketAwardsPrize::getAwardsId, userHitPrize.getAwardsId()).orderByDesc(TicketAwardsPrize::getRemainQty));
+                .eq(TicketAwardsPrize::getAwardsId, userHitPrize.getAwardsId()).orderByDesc(TicketAwardsPrize::getSortWeight).orderByDesc(TicketAwardsPrize::getValue));
         return awardsPrizes;
     }
 
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId) {
         // 更新奖品已兑奖数量
         TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizeService.getById(prizeId);
@@ -150,7 +150,9 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
             userCoinService.produce(userId, ticketAwardsPrize.getValue(), userHitPrize.getId());
         } else if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
             couponService.distribute(ticket, userId, ticketAwardsPrize.getRefId());
-        } else {
+        } else if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
+            couponPkgService.distribute(ticket, userId, ticketAwardsPrize.getRefId());
+        }else {
             userPrizeStorageService.takeInStorage(userId, ticketAwardsPrize, PrizeStorageInTypeEnum.TICKET_CASHED, userHitPrize.getId());
         }
 

+ 8 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderItemServiceImpl.java

@@ -2,6 +2,7 @@ package com.qs.mp.user.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
@@ -59,4 +60,11 @@ public class UserTicketOrderItemServiceImpl extends ServiceImpl<UserTicketOrderI
     }
     return ticketListVOS.get(0);
   }
+
+  @Override
+  public List<UserTicketOrderTicketDetailVO> listTicketDetailByOrderId(String orderId) {
+    QueryWrapper<UserTicketOrderTicketDetailVO> queryWrapper = new QueryWrapper<>();
+    queryWrapper.eq("t1.order_id", orderId);
+    return getBaseMapper().listTicketDetailByOrderId(queryWrapper);
+  }
 }

+ 30 - 3
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -3,13 +3,14 @@ package com.qs.mp.user.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 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.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketPackage;
-import com.qs.mp.admin.domain.vo.IndexVO;
-import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
+import com.qs.mp.admin.domain.vo.*;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
@@ -55,6 +56,7 @@ import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -155,6 +157,8 @@ public class UserTicketOrderServiceImpl extends
     userTicketOrder.setUserId(userId);
     userTicketOrder.setTitle(ticketBox.getTitle());
     userTicketOrder.setBoxId(orderSettleVO.getBoxId());
+    userTicketOrder.setSalePrice(ticketBox.getSalePrice());
+    userTicketOrder.setSaleCommRate(ticketBox.getSaleCommRate());
     userTicketOrder.setOrderAmt(orderSettleVO.getOrderAmt());
     userTicketOrder.setDiscountAmt(orderSettleVO.getDiscountAmt());
     userTicketOrder.setPayAmt(orderSettleVO.getPayAmt());
@@ -233,11 +237,15 @@ public class UserTicketOrderServiceImpl extends
     // 核销优惠券
     String couponIds = verifyUserCoupon(orderSettleVO.getCouponList());
 
+    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+
     UserTicketOrder ticketOrder = new UserTicketOrder();
     ticketOrder.setOrderId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
     ticketOrder.setUserId(userId);
-    ticketOrder.setTitle(ticket.getTitle());
+    ticketOrder.setTitle(ticketBox.getTitle());
     ticketOrder.setBoxId(ticket.getBoxId());
+    ticketOrder.setSalePrice(ticketBox.getSalePrice());
+    ticketOrder.setSaleCommRate(ticketBox.getSaleCommRate());
     ticketOrder.setOrderAmt(orderSettleVO.getOrderAmt());
     ticketOrder.setDiscountAmt(orderSettleVO.getDiscountAmt());
     ticketOrder.setPayAmt(orderSettleVO.getPayAmt());
@@ -548,5 +556,24 @@ public class UserTicketOrderServiceImpl extends
     return getBaseMapper().listTicketSaleCnt(queryWrapper);
   }
 
+  @Override
+  public List<UserTicketOrderListVO> listUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper) {
+    return getBaseMapper().listUserTicketOrder(queryWrapper);
+  }
+
+  @Override
+  public int countUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper) {
+    return getBaseMapper().countUserTicketOrder(queryWrapper);
+  }
 
+  @Override
+  public UserTicketOrderDetailVO detail(String orderId) {
+    QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+    queryWrapper.eq("t1.order_id", orderId);
+    UserTicketOrderDetailVO userTicketOrderDetailVO = getBaseMapper().selectUserTicketOrderDetail(queryWrapper);
+
+    List<UserTicketOrderTicketDetailVO> list = userTicketOrderItemService.listTicketDetailByOrderId(orderId);
+    userTicketOrderDetailVO.setTicketDetailList(list);
+    return userTicketOrderDetailVO;
+  }
 }

+ 41 - 0
mp-service/src/main/resources/mapper/admin/CouponPkgItemMapper.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.admin.mapper.CouponPkgItemMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.CouponPkgItem">
+        <id column="id" property="id" />
+        <result column="coupon_pkg_id" property="couponPkgId" />
+        <result column="coupon_id" property="couponId" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, coupon_pkg_id, coupon_id, created_time, updated_time
+    </sql>
+
+    <select id="selectDetail" resultType="com.qs.mp.admin.domain.vo.CouponPkgItemVO">
+        select t1.id,
+            t1.coupon_pkg_id,
+            t1.coupon_id,
+            t1.coupon_num,
+            t1.created_time,
+            t1.updated_time,
+            t2.title,
+            t2.discount,
+            t2.type,
+            t2.due_days
+        from mp_coupon_pkg_item t1
+        left join mp_coupon t2 on t1.coupon_id = t2.coupon_id
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="selectCouponList" resultType="com.qs.mp.admin.domain.Coupon">
+        select t2.*
+        from mp_coupon_pkg_item t1
+        left join mp_coupon t2 on t1.coupon_id = t2.coupon_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 21 - 0
mp-service/src/main/resources/mapper/admin/CouponPkgMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.admin.mapper.CouponPkgMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.CouponPkg">
+        <id column="id" property="id" />
+        <result column="title" property="title" />
+        <result column="face_price" property="facePrice" />
+        <result column="coupon_num" property="couponNum" />
+        <result column="status" property="status" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, title, face_price, coupon_num, status, created_time, updated_time
+    </sql>
+
+</mapper>

+ 2 - 1
mp-service/src/main/resources/mapper/admin/GoodsMapper.xml

@@ -19,6 +19,7 @@
         <result column="exchange_show" property="exchangeShow" />
         <result column="multi_sku" property="multiSku" />
         <result column="sku_prop" property="skuProp" />
+        <result column="sort_weight" property="sortWeight" />
         <result column="is_deleted" property="isDeleted" />
         <result column="created_time" property="createdTime" />
         <result column="updated_time" property="updatedTime" />
@@ -26,7 +27,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        goods_id, title, category_id, pic_url, description, origin_price, exchange_price, value, cost, quantity, exchanged_qty, status, exchange_show, multi_sku, sku_prop, is_deleted, created_time, updated_time
+        goods_id, title, category_id, pic_url, description, origin_price, exchange_price, value, cost, quantity, exchanged_qty, status, exchange_show, multi_sku, sku_prop, sort_weight, is_deleted, created_time, updated_time
     </sql>
 
 </mapper>

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