Browse Source

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

Mp server test

See merge request quanshu/mp-server!777
zhong chunping 2 years ago
parent
commit
a674f6a3dc
29 changed files with 2065 additions and 1535 deletions
  1. 17 1
      mp-admin/pom.xml
  2. 13 4
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java
  3. 469 351
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java
  4. 8 4
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  5. 89 9
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java
  6. 199 198
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  7. 14 1
      mp-common/pom.xml
  8. 4 0
      mp-common/src/main/java/com/qs/mp/common/enums/GoodsStatusEnum.java
  9. 1 1
      mp-framework/src/main/java/com/qs/mp/framework/monitor/SendErrorMsgAppender.java
  10. 150 150
      mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java
  11. 9 0
      mp-service/src/main/java/com/qs/mp/admin/domain/CouponTicket.java
  12. 65 0
      mp-service/src/main/java/com/qs/mp/admin/domain/excel/GoodsExcel.java
  13. 48 49
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsQueryParam.java
  14. 37 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxQueryParam.java
  15. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponPkgItemVO.java
  16. 142 116
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponVO.java
  17. 67 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GoodsExportVO.java
  18. 12 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/GoodsMapper.java
  19. 9 0
      mp-service/src/main/java/com/qs/mp/admin/service/IGoodsService.java
  20. 140 139
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java
  21. 7 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/GoodsServiceImpl.java
  22. 13 9
      mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingServiceImpl.java
  23. 10 0
      mp-service/src/main/java/com/qs/mp/system/domain/SysUser.java
  24. 1 1
      mp-service/src/main/java/com/qs/mp/user/domain/UserCoupon.java
  25. 11 4
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserShareVO.java
  26. 499 497
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  27. 1 0
      mp-service/src/main/resources/mapper/admin/CouponPkgItemMapper.xml
  28. 24 0
      mp-service/src/main/resources/mapper/admin/GoodsMapper.xml
  29. 3 1
      mp-service/src/main/resources/mapper/system/SysUserMapper.xml

+ 17 - 1
mp-admin/pom.xml

@@ -34,8 +34,24 @@
         <dependency>
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
             <groupId>com.github.xiaoymin</groupId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
-            <version>2.0.8</version>
+            <version>2.0.9</version>
+            <exclusions>
+                <!-- 去除新版ui -->
+                <exclusion>
+                    <groupId>com.github.xiaoymin</groupId>
+                    <artifactId>knife4j-spring-ui</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         </dependency>
+        <!-- 引入老版ui -->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>1.9.6</version>
+        </dependency>
+
+
+
 
 
         <!-- spring-boot-devtools -->
         <!-- spring-boot-devtools -->
         <dependency>
         <dependency>

+ 13 - 4
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java

@@ -39,10 +39,7 @@ import io.swagger.annotations.ApiResponses;
 import ma.glasnost.orika.MapperFacade;
 import ma.glasnost.orika.MapperFacade;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collector;
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -176,6 +173,17 @@ public class CouponMgrController extends BaseApiController {
 		return AjaxResult.success(couponVO);
 		return AjaxResult.success(couponVO);
 	}
 	}
 
 
+
+	public static void main(String[] args) {
+		String boxIds = "964952657896800257,979749771218649117,986362095543124033,986361444503257092,984109134842560513";
+		String[] boxIdArray = boxIds.split(",");
+		for (int i = 0; i < boxIdArray.length; i++) {
+			String boxId = boxIdArray[i];
+			System.out.println("boxId = " + boxId);
+		}
+
+	}
+
 	/**
 	/**
 	 * 新增优惠券信息
 	 * 新增优惠券信息
 	 * @param
 	 * @param
@@ -264,6 +272,7 @@ public class CouponMgrController extends BaseApiController {
 	        	CouponTicket couponTicket = new CouponTicket();
 	        	CouponTicket couponTicket = new CouponTicket();
 	        	couponTicket.setBoxId(boxId);
 	        	couponTicket.setBoxId(boxId);
 	        	couponTicket.setCouponId(coupon.getCouponId());
 	        	couponTicket.setCouponId(coupon.getCouponId());
+				ticketList.add(couponTicket);
 	        }
 	        }
 		}
 		}
 		try {
 		try {

+ 469 - 351
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java

@@ -9,9 +9,12 @@ import com.github.xiaoymin.knife4j.annotations.DynamicParameters;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.GoodsTagRel;
 import com.qs.mp.admin.domain.GoodsTagRel;
+import com.qs.mp.admin.domain.excel.GoodsExcel;
+import com.qs.mp.admin.domain.excel.UserTicketOrderItemExcel;
 import com.qs.mp.admin.domain.param.GoodsParam;
 import com.qs.mp.admin.domain.param.GoodsParam;
 import com.qs.mp.admin.domain.param.GoodsQueryParam;
 import com.qs.mp.admin.domain.param.GoodsQueryParam;
 import com.qs.mp.admin.domain.param.GoodsUpdateSortWeightParam;
 import com.qs.mp.admin.domain.param.GoodsUpdateSortWeightParam;
+import com.qs.mp.admin.domain.vo.GoodsExportVO;
 import com.qs.mp.admin.domain.vo.GoodsVO;
 import com.qs.mp.admin.domain.vo.GoodsVO;
 import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.admin.service.IGoodsSkuService;
 import com.qs.mp.admin.service.IGoodsSkuService;
@@ -23,9 +26,12 @@ import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.GoodsStatusEnum;
 import com.qs.mp.common.enums.GoodsStatusEnum;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.utils.ExcelUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.*;
 import io.swagger.annotations.*;
 
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.net.URLDecoder;
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.HashSet;
@@ -35,6 +41,7 @@ import java.util.stream.Collectors;
 
 
 import ma.glasnost.orika.MapperFacade;
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -54,366 +61,477 @@ import org.springframework.web.bind.annotation.*;
 @Component
 @Component
 public class GoodsMgrController extends BaseApiController {
 public class GoodsMgrController extends BaseApiController {
 
 
-  @Autowired
-  private IGoodsService goodsService;
-
-  @Autowired
-  private IGoodsSkuService goodsSkuService;
-
-  @Autowired
-  private IGoodsTagRelService goodsTagRelService;
-
-  @Autowired
-  private MapperFacade mapperFacade;
-
-
-  /**
-   * 查询商品列表, 支持翻页
-   *
-   * @return
-   */
-  @PostMapping("/list")
-  @PreAuthorize("@ss.hasPermi('business:goods:list')")
-  @ApiOperation(value = "商品列表接口", notes = "查询商品列表, 支持翻页")
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "查询成功", response = Goods.class)
-  )
-  public TableDataInfo list(@RequestBody GoodsQueryParam queryParam) {
-    // 商品标签
-    List<Long> goodsIds = new ArrayList<>();
-    if (null != queryParam.getTagId()) {
-      List<GoodsTagRel> goodsTagRelList = goodsTagRelService.list(
-          new LambdaQueryWrapper<GoodsTagRel>().eq(GoodsTagRel::getTagId, queryParam.getTagId()));
-      goodsIds = goodsTagRelList.stream().map(GoodsTagRel::getGoodsId)
-          .collect(Collectors.toList());
-      if (CollectionUtils.isEmpty(goodsIds)) {
-        return getDataTable(new ArrayList<>());
-      }
-    }
-    startPage();
-    QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
-    queryWrapper.lambda()
-        .like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), Goods::getTitle,
-            queryParam.getTitle());
-    queryWrapper.lambda()
-        .eq(null != queryParam.getGoodsId() && 0 != queryParam.getGoodsId(),
-            Goods::getGoodsId, queryParam.getGoodsId());
-    // 供应商
-    queryWrapper.lambda()
-            .eq(null != queryParam.getSupplierId() && 0 != queryParam.getSupplierId(),
-                    Goods::getSupplierId, queryParam.getSupplierId());
-    // 成本
-    queryWrapper.lambda()
-        .ge(null != queryParam.getMinCost(), Goods::getCost, queryParam.getMinCost());
-    queryWrapper.lambda()
-        .le(null != queryParam.getMaxCost(), Goods::getCost, queryParam.getMaxCost());
-    // 价格
-    queryWrapper.lambda()
-        .ge(null != queryParam.getMinValue(), Goods::getValue, queryParam.getMinValue());
-    queryWrapper.lambda()
-        .le(null != queryParam.getMaxValue(), Goods::getValue, queryParam.getMaxValue());
-
-    // 盲豆兑换价格
-    queryWrapper.lambda()
-            .ge(null != queryParam.getMinExchange(), Goods::getExchangePrice, queryParam.getMinExchange());
-    queryWrapper.lambda()
-            .le(null != queryParam.getMaxExchange(), Goods::getExchangePrice, queryParam.getMaxExchange());
-
-    // 状态
-    queryWrapper.lambda()
-        .eq(null != queryParam.getStatus(), Goods::getStatus, queryParam.getStatus());
-    // 是否支持兑换
-    queryWrapper.lambda().eq(null != queryParam.getExchangeShow(), Goods::getExchangeShow,
-        queryParam.getExchangeShow());
-    // 商品分类
-    if (!CollectionUtils.isEmpty(queryParam.getCategoryIdList())) {
-      queryWrapper.lambda().in(Goods::getCategoryId, queryParam.getCategoryIdList());
-    }
-    // 标签过滤的商品ID
-    queryWrapper.lambda().in(null != queryParam.getTagId(), Goods::getGoodsId, goodsIds);
-    queryWrapper.lambda().eq(Goods::getIsDeleted, 0);
-    queryWrapper.orderByAsc("FIELD(`status`, 'init', 'on', 'off')");
-    queryWrapper.lambda().orderByDesc(Goods::getGoodsId);
-    List<Goods> goodsList = goodsService.list(queryWrapper);
-    TableDataInfo res = getDataTable(goodsList);
-    res.setRows(goodsList);
-    return res;
-  }
-
-
-  @PostMapping("/update/sortWeight")
-  @PreAuthorize("@ss.hasPermi('business:goods:edit')")
-  @ApiOperation("更新商品排序权重")
-
-  public AjaxResult updateSortWeight(@RequestBody GoodsUpdateSortWeightParam param) {
-
-    Goods goods = new Goods();
-    goods.setGoodsId(param.getGoodsId());
-    goods.setSortWeight(param.getSortWeight());
-    return AjaxResult.success(goodsService.updateById(goods));
-  }
-
-
-  /**
-   * 获取商品详情信息
-   *
-   * @param
-   * @return
-   */
-  @PostMapping(value = "/detail")
-  @PreAuthorize("@ss.hasPermi('business:goods:query')")
-  @ApiOperation("商品详情接口")
-  @DynamicParameters(properties = {
-          @DynamicParameter(name = "goodsId",value = "商品id",required = true,dataTypeClass = Long.class)
-  })
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "查询成功", response = GoodsVO.class)
-  )
-  public AjaxResult getGoodsDetail(@RequestBody JSONObject jsonObject) {
-    Long goodsId = jsonObject.getLong("goodsId");
-    if (null == goodsId || 0 == goodsId) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
-    }
-    Goods goods = goodsService.getById(goodsId);
-    if (null == goods) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
-    }
-    GoodsVO goodsVo = new GoodsVO();
-    BeanUtils.copyProperties(goods, goodsVo);
-    // 查询SKU列表
-    List<GoodsSku> skuList = new ArrayList<>();
-    LambdaQueryWrapper<GoodsSku> queryWrapper = new LambdaQueryWrapper<>();
-    queryWrapper.eq(GoodsSku::getGoodsId, goods.getGoodsId());
-    queryWrapper.orderByDesc(GoodsSku::getCreatedTime);
-    skuList = goodsSkuService.list(queryWrapper);
-    if (null != skuList && skuList.size() > 0) {
-      goodsVo.setSkuList(skuList);
-    }
-    // 查询标签ID列表
-    List<GoodsTagRel> goodsTagRelList = goodsTagRelService.list(
-        new LambdaQueryWrapper<GoodsTagRel>().eq(GoodsTagRel::getGoodsId, goods.getGoodsId()));
-    List<Long> tagIds = goodsTagRelList.stream().map(GoodsTagRel::getTagId)
-        .collect(Collectors.toList());
-    goodsVo.setTagIds(tagIds);
-
-    return AjaxResult.success(goodsVo);
-  }
-
-
-  /**
-   * 新增商品信息
-   *
-   * @param
-   * @return
-   */
-  @Log(title = "新增商品", businessType = BusinessType.INSERT)
-  @ApiOperation(value = "新增商品信息", notes = "后台商品管理新增商品")
-  @PostMapping("/create")
-  @PreAuthorize("@ss.hasPermi('business:goods:add')")
-  public AjaxResult goodsCreate(@Validated @RequestBody GoodsParam goodsParam) {
-    Goods goods = mapperFacade.map(goodsParam, Goods.class);
-    // 1、校验名称是否重复(商品表)
-    LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
-    queryWrapper.eq(Goods::getTitle, goods.getTitle());
-    queryWrapper.eq(Goods::getIsDeleted, 0);
-    int titleCount = goodsService.count(queryWrapper);
-    if (titleCount > 0) {
-      return AjaxResult.error("商品名称" + goods.getTitle() + "已存在!");
-    }
-    String description = URLDecoder.decode(goodsParam.getDescription());
-    goods.setDescription(description);
-    goods.setStatus(GoodsStatusEnum.PUT_INIT);
-    // 多SKU
-    List<GoodsSku> skuList = goodsParam.getSkuList();
-    if (goods.getMultiSku() == 1) {
-      if ((null == skuList || skuList.size() == 0)) {
-        return AjaxResult.error("商品" + goods.getTitle() + "不满足多SKU条件!");
-      } else {
-        GoodsSku firstGoodsSku = skuList.get(0);
-        goods.setExchangePrice(firstGoodsSku.getExchangePrice());
-        goods.setValue(firstGoodsSku.getValue());
-        goods.setCost(firstGoodsSku.getCost());
-        goods.setDiscountRate(firstGoodsSku.getDiscountRate());
-        // 累计库存
-        int totalQuantity = skuList.stream().mapToInt(GoodsSku::getQuantity).sum();
-        goods.setQuantity(totalQuantity);
-      }
-    }
-    if (null == goods.getOriginPrice()) {
-      goods.setOriginPrice(0);
-    }
-    if (null == goods.getDiscountRate()) {
-      goods.setDiscountRate(goodsParam.getDiscountRate());
-    }
-    // 3.插入数据
-    try {
-      goods.setSkuProp(getSkuProp(skuList));
-      goodsService.saveGoods(goods, skuList, goodsParam.getTagIds());
-    } catch (Exception e) {
-      LogUtil.error(logger, e, "商品新增失败。");
-      return AjaxResult.error("商品'" + goods.getTitle() + "'新增失败");
-    }
-    return AjaxResult.success("商品'" + goods.getTitle() + "'新增成功");
-  }
-
-  /**
-   * 编辑商品信息
-   *
-   * @param
-   * @return
-   */
-  @Log(title = "修改商品", businessType = BusinessType.UPDATE)
-  @ApiOperation(value = "编辑商品信息", notes = "后台商品管理修改商品信息")
-  @PostMapping("/update")
-  @PreAuthorize("@ss.hasPermi('business:goods:edit')")
-  public AjaxResult goodsUpdate(@Validated @RequestBody GoodsParam goodsParam) {
-    if (null == goodsParam || null == goodsParam.getGoodsId() || 0 == goodsParam.getGoodsId()) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
-    }
-    Goods oldGoods = goodsService.getById(goodsParam.getGoodsId());
-    if (null == oldGoods || null == oldGoods.getGoodsId()) {
-      return AjaxResult.error("商品'" + oldGoods.getTitle() + "'编辑失败,商品ID异常");
-    }
-    Goods goods = mapperFacade.map(goodsParam, Goods.class);
-    // 1、校验名称是否重复(商品表)
-    if (!goods.getTitle().equals(oldGoods.getTitle())) {
-      LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
-      queryWrapper.eq(Goods::getTitle, goods.getTitle());
-      queryWrapper.eq(Goods::getIsDeleted, 0);
-      int titleCount = goodsService.count(queryWrapper);
-      if (titleCount > 0) {
-        return AjaxResult.error("商品名称" + goods.getTitle() + "已存在!");
-      }
-    }
-    String description = URLDecoder.decode(goodsParam.getDescription());
-    goods.setDescription(description);
-    // 多SKU
-    List<GoodsSku> skuList = goodsParam.getSkuList();
-    if (goods.getMultiSku() == 1) {
-      if ((null == skuList || skuList.size() == 0)) {
-        return AjaxResult.error("商品" + goods.getTitle() + "不满足多SKU条件!");
-      } else {
-        GoodsSku firstGoodsSku = skuList.get(0);
-        goods.setExchangePrice(firstGoodsSku.getExchangePrice());
-        goods.setValue(firstGoodsSku.getValue());
-        goods.setCost(firstGoodsSku.getCost());
-        goods.setOriginPrice(firstGoodsSku.getOriginPrice());
-        if (null == firstGoodsSku.getOriginPrice()) {
-          goods.setOriginPrice(0);
-        }
-        if (null == firstGoodsSku.getDiscountRate()) {
-          goods.setDiscountRate(goodsParam.getDiscountRate());
-        } else {
-          goods.setDiscountRate(firstGoodsSku.getDiscountRate());
-        }
-        // 累计库存
-        int totalQuantity = skuList.stream().mapToInt(GoodsSku::getQuantity).sum();
-        goods.setQuantity(totalQuantity);
-      }
-    }
-    // 3.插入数据
-    try {
-      goods.setSkuProp(getSkuProp(skuList));
-      goodsService.updateGoods(goods, skuList, goodsParam.getTagIds());
-    } catch (Exception e) {
-      LogUtil.error(logger, e, "商品更新失败。");
-      return AjaxResult.error("商品'" + goods.getTitle() + "'更新失败");
-    }
-    return AjaxResult.success("商品'" + goods.getTitle() + "'更新成功");
-  }
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private IGoodsSkuService goodsSkuService;
+
+    @Autowired
+    private IGoodsTagRelService goodsTagRelService;
 
 
-  // 获取商品的sku
-  public String getSkuProp(List<GoodsSku> skuList) {
-    if (CollectionUtils.isEmpty(skuList)) {
-      return null;
+    @Autowired
+    private MapperFacade mapperFacade;
+
+
+    /**
+     * 查询商品列表, 支持翻页
+     *
+     * @return
+     */
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('business:goods:list')")
+    @ApiOperation(value = "商品列表接口", notes = "查询商品列表, 支持翻页")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "查询成功", response = Goods.class)
+    )
+    public TableDataInfo list(@RequestBody GoodsQueryParam queryParam) {
+        // 商品标签
+        List<Long> goodsIds = new ArrayList<>();
+        if (null != queryParam.getTagId()) {
+            List<GoodsTagRel> goodsTagRelList = goodsTagRelService.list(
+                    new LambdaQueryWrapper<GoodsTagRel>().eq(GoodsTagRel::getTagId, queryParam.getTagId()));
+            goodsIds = goodsTagRelList.stream().map(GoodsTagRel::getGoodsId)
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(goodsIds)) {
+                return getDataTable(new ArrayList<>());
+            }
+        }
+        startPage();
+        QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
+        queryWrapper.lambda()
+                .like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), Goods::getTitle,
+                        queryParam.getTitle());
+        queryWrapper.lambda()
+                .eq(null != queryParam.getGoodsId() && 0 != queryParam.getGoodsId(),
+                        Goods::getGoodsId, queryParam.getGoodsId());
+        // 供应商
+        queryWrapper.lambda()
+                .eq(null != queryParam.getSupplierId() && 0 != queryParam.getSupplierId(),
+                        Goods::getSupplierId, queryParam.getSupplierId());
+        // 成本
+        queryWrapper.lambda()
+                .ge(null != queryParam.getMinCost(), Goods::getCost, queryParam.getMinCost());
+        queryWrapper.lambda()
+                .le(null != queryParam.getMaxCost(), Goods::getCost, queryParam.getMaxCost());
+        // 价格
+        queryWrapper.lambda()
+                .ge(null != queryParam.getMinValue(), Goods::getValue, queryParam.getMinValue());
+        queryWrapper.lambda()
+                .le(null != queryParam.getMaxValue(), Goods::getValue, queryParam.getMaxValue());
+
+        // 盲豆兑换价格
+        queryWrapper.lambda()
+                .ge(null != queryParam.getMinExchange(), Goods::getExchangePrice, queryParam.getMinExchange());
+        queryWrapper.lambda()
+                .le(null != queryParam.getMaxExchange(), Goods::getExchangePrice, queryParam.getMaxExchange());
+
+        // 状态
+        queryWrapper.lambda()
+                .eq(null != queryParam.getStatus(), Goods::getStatus, queryParam.getStatus());
+        // 是否支持兑换
+        queryWrapper.lambda().eq(null != queryParam.getExchangeShow(), Goods::getExchangeShow,
+                queryParam.getExchangeShow());
+        // 商品分类
+        if (!CollectionUtils.isEmpty(queryParam.getCategoryIdList())) {
+            queryWrapper.lambda().in(Goods::getCategoryId, queryParam.getCategoryIdList());
+        }
+        // 标签过滤的商品ID
+        queryWrapper.lambda().in(null != queryParam.getTagId(), Goods::getGoodsId, goodsIds);
+        queryWrapper.lambda().eq(Goods::getIsDeleted, 0);
+        queryWrapper.orderByAsc("FIELD(`status`, 'init', 'on', 'off')");
+        queryWrapper.lambda().orderByDesc(Goods::getGoodsId);
+        List<Goods> goodsList = goodsService.list(queryWrapper);
+        TableDataInfo res = getDataTable(goodsList);
+        res.setRows(goodsList);
+        return res;
     }
     }
-    LinkedHashMap<String, HashSet<String>> skuProp = new LinkedHashMap<>();
-    for (GoodsSku sku : skuList) {
-      if (StringUtils.isNotBlank(sku.getProperties())) {
-        String[] skuAry = sku.getProperties().split(";");
-        for (int i = 0; i < skuAry.length; i++) {
-          String item = skuAry[i];
-          String[] itemAry = item.split(":");
-          String key = itemAry[0];
-          String value = itemAry[1];
-          HashSet<String> valueSet = skuProp.get(key);
-          if (null == valueSet) {
-            valueSet = new HashSet<>();
-            skuProp.put(key, valueSet);
-          }
-          valueSet.add(value);
-        }
-      }
+
+
+    @PostMapping("/update/sortWeight")
+    @PreAuthorize("@ss.hasPermi('business:goods:edit')")
+    @ApiOperation("更新商品排序权重")
+
+    public AjaxResult updateSortWeight(@RequestBody GoodsUpdateSortWeightParam param) {
+
+        Goods goods = new Goods();
+        goods.setGoodsId(param.getGoodsId());
+        goods.setSortWeight(param.getSortWeight());
+        return AjaxResult.success(goodsService.updateById(goods));
     }
     }
-    List<JSONObject> skuPropList = new ArrayList<>();
-    for (String key : skuProp.keySet()) {
-      JSONObject jsonObject = new JSONObject();
-      jsonObject.put("name", key);
-      jsonObject.put("value", skuProp.get(key));
-      skuPropList.add(jsonObject);
+
+
+    /**
+     * 获取商品详情信息
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/detail")
+    @PreAuthorize("@ss.hasPermi('business:goods:query')")
+    @ApiOperation("商品详情接口")
+    @DynamicParameters(properties = {
+            @DynamicParameter(name = "goodsId", value = "商品id", required = true, dataTypeClass = Long.class)
+    })
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "查询成功", response = GoodsVO.class)
+    )
+    public AjaxResult getGoodsDetail(@RequestBody JSONObject jsonObject) {
+        Long goodsId = jsonObject.getLong("goodsId");
+        if (null == goodsId || 0 == goodsId) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        Goods goods = goodsService.getById(goodsId);
+        if (null == goods) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        GoodsVO goodsVo = new GoodsVO();
+        BeanUtils.copyProperties(goods, goodsVo);
+        // 查询SKU列表
+        List<GoodsSku> skuList = new ArrayList<>();
+        LambdaQueryWrapper<GoodsSku> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(GoodsSku::getGoodsId, goods.getGoodsId());
+        queryWrapper.orderByDesc(GoodsSku::getCreatedTime);
+        skuList = goodsSkuService.list(queryWrapper);
+        if (null != skuList && skuList.size() > 0) {
+            goodsVo.setSkuList(skuList);
+        }
+        // 查询标签ID列表
+        List<GoodsTagRel> goodsTagRelList = goodsTagRelService.list(
+                new LambdaQueryWrapper<GoodsTagRel>().eq(GoodsTagRel::getGoodsId, goods.getGoodsId()));
+        List<Long> tagIds = goodsTagRelList.stream().map(GoodsTagRel::getTagId)
+                .collect(Collectors.toList());
+        goodsVo.setTagIds(tagIds);
+
+        return AjaxResult.success(goodsVo);
     }
     }
-    return JSONObject.toJSONString(skuPropList);
-  }
-
-
-  /**
-   * 上下架商品
-   *
-   * @param
-   * @return
-   */
-  @Log(title = "上下架商品", businessType = BusinessType.UPDATE)
-  @ApiOperation(value = "上下架商品", notes = "上下架商品")
-  @PostMapping("/status")
-  @PreAuthorize("@ss.hasPermi('business:goods:on')")
-  public AjaxResult goodsStatus(@RequestBody JSONObject jsonObject) {
-    String goodsId = jsonObject.getString("goodsId");
-
-    GoodsStatusEnum status = GoodsStatusEnum.getStatusEnum(jsonObject.getString("status"));
-    if (StringUtils.isBlank(goodsId) || null == status) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
+
+
+    /**
+     * 新增商品信息
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "新增商品", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "新增商品信息", notes = "后台商品管理新增商品")
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('business:goods:add')")
+    public AjaxResult goodsCreate(@Validated @RequestBody GoodsParam goodsParam) {
+        Goods goods = mapperFacade.map(goodsParam, Goods.class);
+        // 1、校验名称是否重复(商品表)
+        LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Goods::getTitle, goods.getTitle());
+        queryWrapper.eq(Goods::getIsDeleted, 0);
+        int titleCount = goodsService.count(queryWrapper);
+        if (titleCount > 0) {
+            return AjaxResult.error("商品名称" + goods.getTitle() + "已存在!");
+        }
+        String description = URLDecoder.decode(goodsParam.getDescription());
+        goods.setDescription(description);
+        goods.setStatus(GoodsStatusEnum.PUT_INIT);
+        // 多SKU
+        List<GoodsSku> skuList = goodsParam.getSkuList();
+        if (goods.getMultiSku() == 1) {
+            if ((null == skuList || skuList.size() == 0)) {
+                return AjaxResult.error("商品" + goods.getTitle() + "不满足多SKU条件!");
+            } else {
+                GoodsSku firstGoodsSku = skuList.get(0);
+                goods.setExchangePrice(firstGoodsSku.getExchangePrice());
+                goods.setValue(firstGoodsSku.getValue());
+                goods.setCost(firstGoodsSku.getCost());
+                goods.setDiscountRate(firstGoodsSku.getDiscountRate());
+                // 累计库存
+                int totalQuantity = skuList.stream().mapToInt(GoodsSku::getQuantity).sum();
+                goods.setQuantity(totalQuantity);
+            }
+        }
+        if (null == goods.getOriginPrice()) {
+            goods.setOriginPrice(0);
+        }
+        if (null == goods.getDiscountRate()) {
+            goods.setDiscountRate(goodsParam.getDiscountRate());
+        }
+        // 3.插入数据
+        try {
+            goods.setSkuProp(getSkuProp(skuList));
+            goodsService.saveGoods(goods, skuList, goodsParam.getTagIds());
+        } catch (Exception e) {
+            LogUtil.error(logger, e, "商品新增失败。");
+            return AjaxResult.error("商品'" + goods.getTitle() + "'新增失败");
+        }
+        return AjaxResult.success("商品'" + goods.getTitle() + "'新增成功");
     }
     }
-    try {
-      goodsService.lambdaUpdate().set(Goods::getStatus, status).eq(Goods::getGoodsId, goodsId)
-          .update();
-      // 查询代金券信息
-    } catch (Exception e) {
-      return AjaxResult.error("操作失败");
+
+    /**
+     * 编辑商品信息
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "修改商品", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "编辑商品信息", notes = "后台商品管理修改商品信息")
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('business:goods:edit')")
+    public AjaxResult goodsUpdate(@Validated @RequestBody GoodsParam goodsParam) {
+        if (null == goodsParam || null == goodsParam.getGoodsId() || 0 == goodsParam.getGoodsId()) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        Goods oldGoods = goodsService.getById(goodsParam.getGoodsId());
+        if (null == oldGoods || null == oldGoods.getGoodsId()) {
+            return AjaxResult.error("商品'" + oldGoods.getTitle() + "'编辑失败,商品ID异常");
+        }
+        Goods goods = mapperFacade.map(goodsParam, Goods.class);
+        // 1、校验名称是否重复(商品表)
+        if (!goods.getTitle().equals(oldGoods.getTitle())) {
+            LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(Goods::getTitle, goods.getTitle());
+            queryWrapper.eq(Goods::getIsDeleted, 0);
+            int titleCount = goodsService.count(queryWrapper);
+            if (titleCount > 0) {
+                return AjaxResult.error("商品名称" + goods.getTitle() + "已存在!");
+            }
+        }
+        String description = URLDecoder.decode(goodsParam.getDescription());
+        goods.setDescription(description);
+        // 多SKU
+        List<GoodsSku> skuList = goodsParam.getSkuList();
+        if (goods.getMultiSku() == 1) {
+            if ((null == skuList || skuList.size() == 0)) {
+                return AjaxResult.error("商品" + goods.getTitle() + "不满足多SKU条件!");
+            } else {
+                GoodsSku firstGoodsSku = skuList.get(0);
+                goods.setExchangePrice(firstGoodsSku.getExchangePrice());
+                goods.setValue(firstGoodsSku.getValue());
+                goods.setCost(firstGoodsSku.getCost());
+                goods.setOriginPrice(firstGoodsSku.getOriginPrice());
+                if (null == firstGoodsSku.getOriginPrice()) {
+                    goods.setOriginPrice(0);
+                }
+                if (null == firstGoodsSku.getDiscountRate()) {
+                    goods.setDiscountRate(goodsParam.getDiscountRate());
+                } else {
+                    goods.setDiscountRate(firstGoodsSku.getDiscountRate());
+                }
+                // 累计库存
+                int totalQuantity = skuList.stream().mapToInt(GoodsSku::getQuantity).sum();
+                goods.setQuantity(totalQuantity);
+            }
+        }
+        // 3.插入数据
+        try {
+            goods.setSkuProp(getSkuProp(skuList));
+            goodsService.updateGoods(goods, skuList, goodsParam.getTagIds());
+        } catch (Exception e) {
+            LogUtil.error(logger, e, "商品更新失败。");
+            return AjaxResult.error("商品'" + goods.getTitle() + "'更新失败");
+        }
+        return AjaxResult.success("商品'" + goods.getTitle() + "'更新成功");
     }
     }
-    return AjaxResult.success("操作成功");
-  }
-
-
-  /**
-   * 删除商品(假删)
-   *
-   * @param
-   * @return
-   */
-  @Log(title = "删除商品", businessType = BusinessType.DELETE)
-  @PostMapping(value = "/remove")
-  @PreAuthorize("@ss.hasPermi('business:goods:remove')")
-  public AjaxResult removeGoods(@RequestBody JSONObject jsonObject) {
-    Long goodsId = jsonObject.getLong("goodsId");
-    if (null == goodsId || 0 == goodsId) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
+
+    // 获取商品的sku
+    public String getSkuProp(List<GoodsSku> skuList) {
+        if (CollectionUtils.isEmpty(skuList)) {
+            return null;
+        }
+        LinkedHashMap<String, HashSet<String>> skuProp = new LinkedHashMap<>();
+        for (GoodsSku sku : skuList) {
+            if (StringUtils.isNotBlank(sku.getProperties())) {
+                String[] skuAry = sku.getProperties().split(";");
+                for (int i = 0; i < skuAry.length; i++) {
+                    String item = skuAry[i];
+                    String[] itemAry = item.split(":");
+                    String key = itemAry[0];
+                    String value = itemAry[1];
+                    HashSet<String> valueSet = skuProp.get(key);
+                    if (null == valueSet) {
+                        valueSet = new HashSet<>();
+                        skuProp.put(key, valueSet);
+                    }
+                    valueSet.add(value);
+                }
+            }
+        }
+        List<JSONObject> skuPropList = new ArrayList<>();
+        for (String key : skuProp.keySet()) {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("name", key);
+            jsonObject.put("value", skuProp.get(key));
+            skuPropList.add(jsonObject);
+        }
+        return JSONObject.toJSONString(skuPropList);
     }
     }
-    Goods goods = goodsService.getById(goodsId);
-    if (null == goods || null == goods.getGoodsId() || 0 == goods.getGoodsId()) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
+
+
+    /**
+     * 上下架商品
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "上下架商品", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "上下架商品", notes = "上下架商品")
+    @PostMapping("/status")
+    @PreAuthorize("@ss.hasPermi('business:goods:on')")
+    public AjaxResult goodsStatus(@RequestBody JSONObject jsonObject) {
+        String goodsId = jsonObject.getString("goodsId");
+
+        GoodsStatusEnum status = GoodsStatusEnum.getStatusEnum(jsonObject.getString("status"));
+        if (StringUtils.isBlank(goodsId) || null == status) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        try {
+            goodsService.lambdaUpdate().set(Goods::getStatus, status).eq(Goods::getGoodsId, goodsId)
+                    .update();
+            // 查询代金券信息
+        } catch (Exception e) {
+            return AjaxResult.error("操作失败");
+        }
+        return AjaxResult.success("操作成功");
     }
     }
-    // 商品未下架, 不允许删除
-    if (goods.getStatus().equals("on")) {
-      return AjaxResult.error("商品未下架,不允许删除");
+
+
+    /**
+     * 删除商品(假删)
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "删除商品", businessType = BusinessType.DELETE)
+    @PostMapping(value = "/remove")
+    @PreAuthorize("@ss.hasPermi('business:goods:remove')")
+    public AjaxResult removeGoods(@RequestBody JSONObject jsonObject) {
+        Long goodsId = jsonObject.getLong("goodsId");
+        if (null == goodsId || 0 == goodsId) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        Goods goods = goodsService.getById(goodsId);
+        if (null == goods || null == goods.getGoodsId() || 0 == goods.getGoodsId()) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        // 商品未下架, 不允许删除
+        if (goods.getStatus().equals("on")) {
+            return AjaxResult.error("商品未下架,不允许删除");
+        }
+        LambdaUpdateWrapper<Goods> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(Goods::getIsDeleted, 1);
+        updateWrapper.eq(Goods::getGoodsId, goods.getGoodsId());
+        boolean res = goodsService.update(updateWrapper);
+        if (!res) {
+            return AjaxResult.error("商品删除失败");
+        }
+        return AjaxResult.success("商品删除成功");
     }
     }
-    LambdaUpdateWrapper<Goods> updateWrapper = new LambdaUpdateWrapper<>();
-    updateWrapper.set(Goods::getIsDeleted, 1);
-    updateWrapper.eq(Goods::getGoodsId, goods.getGoodsId());
-    boolean res = goodsService.update(updateWrapper);
-    if (!res) {
-      return AjaxResult.error("商品删除失败");
+
+    @ApiOperation("商品导出")
+    @PostMapping("/export")
+    @PreAuthorize("@ss.hasPermi('business:goods:export')")
+    public AjaxResult export(@RequestBody GoodsQueryParam queryParam) {
+
+        // 商品标签
+        List<Long> goodsIds = new ArrayList<>();
+        if (null != queryParam.getTagId()) {
+            List<GoodsTagRel> goodsTagRelList = goodsTagRelService.list(
+                    new LambdaQueryWrapper<GoodsTagRel>().eq(GoodsTagRel::getTagId, queryParam.getTagId()));
+            goodsIds = goodsTagRelList.stream().map(GoodsTagRel::getGoodsId)
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(goodsIds)) {
+                return AjaxResult.error("没有符合条件的商品信息");
+            }
+        }
+        QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
+        if (StringUtils.isNotBlank(queryParam.getTitle())) {
+            queryWrapper.eq("t1.title", queryParam.getTitle());
+        }
+
+        if (queryParam.getGoodsId() != null && queryParam.getGoodsId() != 0) {
+            queryWrapper.eq("t1.goods_id", queryParam.getGoodsId());
+        }
+
+        if (queryParam.getSupplierId() != null && queryParam.getSupplierId() != 0) {
+            queryWrapper.eq("t1.supplier_id", queryParam.getSupplierId());
+        }
+
+        // 成本
+        if (queryParam.getMinCost() != null) {
+            queryWrapper.ge("t1.cost", queryParam.getMinCost());
+        }
+        if (queryParam.getMaxCost() != null) {
+            queryWrapper.le("t1.cost", queryParam.getMaxCost());
+        }
+
+        // 价格
+        if (queryParam.getMinValue() != null) {
+            queryWrapper.ge("t1.value", queryParam.getMinValue());
+        }
+        if (queryParam.getMaxValue() != null) {
+            queryWrapper.le("t1.value", queryParam.getMaxValue());
+        }
+
+        // 盲豆兑换价格
+        if (queryParam.getMinExchange() != null) {
+            queryWrapper.ge("t1.exchange_price", queryParam.getMinExchange());
+        }
+
+        if (queryParam.getMaxExchange() != null) {
+            queryWrapper.le("t1.exchange_price", queryParam.getMaxExchange());
+        }
+
+        // 状态
+        if (queryParam.getStatus() != null) {
+            queryWrapper.eq("t1.status", queryParam.getStatus());
+        }
+
+        // 是否支持兑换
+        if (queryParam.getExchangeShow() != null) {
+            queryWrapper.eq("t1.exchange_show", queryParam.getExchangeShow());
+        }
+
+        // 商品分类
+        if (!CollectionUtils.isEmpty(queryParam.getCategoryIdList())) {
+            queryWrapper.in("t1.category_id", queryParam.getCategoryIdList());
+        }
+
+
+        // 标签过滤的商品ID
+        if (queryParam.getTagId() != null) {
+            queryWrapper.in("t1.goods_id", goodsIds);
+        }
+        queryWrapper.eq("t1.is_deleted", 0);
+
+        queryWrapper.orderByDesc("t1.goods_id");
+
+        List<GoodsExportVO> goodsExportVOList = goodsService.listGoodsExportVOByQueryWrapper(queryWrapper);
+        if (CollectionUtils.isEmpty(goodsExportVOList)) {
+            return AjaxResult.error("没有符合条件的商品信息");
+        }
+
+        List<GoodsExcel> goodsExcelList = new ArrayList<>();
+        for (GoodsExportVO goodsExportVO : goodsExportVOList) {
+            GoodsExcel goodsExcel = new GoodsExcel();
+            BeanUtils.copyProperties(goodsExportVO, goodsExcel);
+
+            if (goodsExportVO.getValue() != null) {
+                goodsExcel.setValue(BigDecimal.valueOf(goodsExportVO.getValue()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
+            }
+
+            if (goodsExportVO.getCost() != null) {
+                goodsExcel.setCost(BigDecimal.valueOf(goodsExportVO.getCost()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
+            }
+
+            goodsExcel.setExchangeShow(goodsExportVO.getExchangeShow() == 1 ? "是" : "否");
+
+            if (goodsExportVO.getStatus() != null) {
+                goodsExcel.setStatus(goodsExportVO.getStatus().getDesc());
+            }
+
+            goodsExcelList.add(goodsExcel);
+        }
+
+        ExcelUtil<GoodsExcel> util = new ExcelUtil<>(GoodsExcel.class);
+        return util.exportExcel(goodsExcelList, "商品导出", false);
+
     }
     }
-    return AjaxResult.success("商品删除成功");
-  }
+
 
 
 }
 }

+ 8 - 4
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -107,12 +107,16 @@ public class TicketBoxMgrController extends BaseApiController {
 	@ApiResponses(
 	@ApiResponses(
 			@ApiResponse(code = 200, message = "查询成功", response = TicketBox.class)
 			@ApiResponse(code = 200, message = "查询成功", response = TicketBox.class)
 	)
 	)
-	public TableDataInfo list(@RequestBody TicketBox ticketBox) {
+	public TableDataInfo list(@RequestBody TicketBoxQueryParam ticketBoxQueryParam) {
 		startPage();
 		startPage();
 		QueryWrapper<TicketBox> queryWrapper = new QueryWrapper<TicketBox>();
 		QueryWrapper<TicketBox> queryWrapper = new QueryWrapper<TicketBox>();
-		queryWrapper.like(null != ticketBox && StringUtils.isNotBlank(ticketBox.getTitle()), "title", ticketBox.getTitle());
-		queryWrapper.eq(null != ticketBox && null != ticketBox.getType(), "type", ticketBox.getType());
-		queryWrapper.eq(null != ticketBox && null != ticketBox.getStatus(), "status", ticketBox.getStatus());
+		queryWrapper.like(null != ticketBoxQueryParam && StringUtils.isNotBlank(ticketBoxQueryParam.getTitle()), "title", ticketBoxQueryParam.getTitle());
+		queryWrapper.eq(null != ticketBoxQueryParam && null != ticketBoxQueryParam.getType(), "type", ticketBoxQueryParam.getType());
+		queryWrapper.eq(null != ticketBoxQueryParam && null != ticketBoxQueryParam.getStatus(), "status", ticketBoxQueryParam.getStatus());
+		// 排除指定票组
+		if (CollectionUtils.isNotEmpty(ticketBoxQueryParam.getExcludeBoxIds())) {
+			queryWrapper.notIn("box_id", ticketBoxQueryParam.getExcludeBoxIds());
+		}
 		queryWrapper.orderByAsc("FIELD(`status`, 'wait', 'doing', 'done', 'on', 'off')").orderByDesc("box_id");
 		queryWrapper.orderByAsc("FIELD(`status`, 'wait', 'doing', 'done', 'on', 'off')").orderByDesc("box_id");
 		List<TicketBox> list = ticketBoxService.list(queryWrapper);
 		List<TicketBox> list = ticketBoxService.list(queryWrapper);
 		return getDataTable(list);
 		return getDataTable(list);

+ 89 - 9
mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java

@@ -13,11 +13,12 @@ import com.alipay.api.DefaultAlipayClient;
 import com.alipay.api.internal.util.AlipayEncrypt;
 import com.alipay.api.internal.util.AlipayEncrypt;
 import com.alipay.api.internal.util.AlipaySignature;
 import com.alipay.api.internal.util.AlipaySignature;
 import com.alipay.api.request.AlipaySystemOauthTokenRequest;
 import com.alipay.api.request.AlipaySystemOauthTokenRequest;
+import com.alipay.api.request.AlipayUserInfoShareRequest;
 import com.alipay.api.response.AlipaySystemOauthTokenResponse;
 import com.alipay.api.response.AlipaySystemOauthTokenResponse;
+import com.alipay.api.response.AlipayUserInfoShareResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.channel.service.IChannelService;
-import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.domain.vo.AliPhoneDecryptVO;
 import com.qs.mp.common.domain.vo.AliPhoneDecryptVO;
 import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.common.enums.UserIdentityEnum;
@@ -44,16 +45,15 @@ import io.swagger.annotations.Api;
 import java.io.File;
 import java.io.File;
 import java.net.HttpURLConnection;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URL;
-import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.logging.Logger;
 import javax.crypto.Cipher;
 import javax.crypto.Cipher;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.SecretKeySpec;
 import javax.crypto.spec.SecretKeySpec;
 
 
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FileUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -61,7 +61,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import sun.misc.BASE64Decoder;
 import sun.misc.BASE64Decoder;
-import sun.misc.BASE64Encoder;
 
 
 /**
 /**
  * @auther duota
  * @auther duota
@@ -104,10 +103,10 @@ public class UserController extends BaseApiController {
     @Value("${ali-miniApp.private-key}")
     @Value("${ali-miniApp.private-key}")
     private String aliPrivateKey;
     private String aliPrivateKey;
 
 
-    @Value("{ali-miniApp.serverUrl}")
-    private String serverUrl;
+    @Value("${ali-miniApp.serverUrl}")
+    private String aliServerUrl;
 
 
-    @Value("{ali-miniApp.decrypt-key}")
+    @Value("${ali-miniApp.decrypt-key}")
     private String decryptKey;
     private String decryptKey;
 
 
     /**
     /**
@@ -216,6 +215,81 @@ public class UserController extends BaseApiController {
     }
     }
 
 
 
 
+    @ApiOperation("支付宝授权登录")
+    @PostMapping("/user/aliAuth")
+    public AjaxResult aliAuth(@RequestBody WxLoginParams wxLoginParams) {
+        String code = wxLoginParams.getCode();
+        if (StringUtils.isBlank(code)) {
+            return AjaxResult.error("code码不存在");
+        }
+
+        AlipayClient alipayClient = new DefaultAlipayClient(aliServerUrl, aliAppId, aliPrivateKey, "json", "GBK", aliPublicKey, "RSA2");
+        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
+        request.setGrantType("authorization_code");
+        request.setCode(code);
+        AlipaySystemOauthTokenResponse response = null;
+        try {
+            response = alipayClient.execute(request);
+        } catch (AlipayApiException e) {
+            LogUtil.error(logger, "获取支付宝授权令牌失败,errorMsg:{0}", e.getMessage());
+            return AjaxResult.error("获取授权令牌失败");
+        }
+        if (!response.isSuccess()) {
+            return AjaxResult.error("获取授权令牌调用失败");
+        }
+        LogUtil.info(logger, "授权令牌信息:{0}", JSONUtil.toJsonStr(response));
+        // 支付宝小程序userId
+        String aliUserId = response.getUserId();
+        // 访问令牌
+        String accessToken = response.getAccessToken();
+
+        // 根据访问令牌获取用户基本信息
+        AlipayUserInfoShareRequest userInfoRequest = new AlipayUserInfoShareRequest();
+        AlipayUserInfoShareResponse userInfoResponse = null;
+        try {
+            userInfoResponse = alipayClient.execute(userInfoRequest, accessToken);
+        } catch (AlipayApiException e) {
+            LogUtil.error(logger, "获取用户基本信息失败,errorMsg:{0}", e.getMessage());
+            return AjaxResult.error("获取用户基本信息失败");
+        }
+        if (!userInfoResponse.isSuccess()) {
+            return AjaxResult.error("获取用户基本信息失败");
+        }
+        LogUtil.info(logger, "用户基本信息:{0}", JSONUtil.toJsonStr(userInfoResponse));
+
+
+        // 更新数据库用户授权信息
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = new SysUser();
+        user.setUserId(loginUser.getUserId());
+        user.setLoginDate(new Date());
+        user.setAliuserId(aliUserId);
+        user.setNickName(userInfoResponse.getNickName());
+        // 如果用户头像字段为空,则默认获取用户支付宝头像
+        String avatarUrl = userInfoResponse.getAvatar();
+
+        if (StringUtils.isBlank(loginUser.getUser().getAvatar()) && !StringUtils.isBlank(avatarUrl)) {
+            try {
+                //下载并且重新上传头像
+                JSONObject result = saveHeadImage(avatarUrl, String.valueOf(user.getUserId()));
+                if (result != null) {
+                    user.setAvatar(result.getString("fileName"));
+                }
+            } catch (Exception e) {
+                LogUtil.error(logger, "头像上传异常", e.getMessage());
+            }
+        }
+        logger.info("更新用户数据:" + JSONUtil.toJsonStr(user));
+        int rows = sysUserService.updateUserProfile(user);
+        if (rows != 1) {
+            LogUtil.error(logger, "用户支付宝授权异常");
+            return error("用户支付宝授权异常");
+        }
+        JSONObject rst = new JSONObject();
+        rst.put("aliUserId", aliUserId);
+        return success(rst);
+    }
+
     @ApiOperation("微信授权登录")
     @ApiOperation("微信授权登录")
     @RequestMapping(value = "/user/wxauth", method = RequestMethod.POST)
     @RequestMapping(value = "/user/wxauth", method = RequestMethod.POST)
     @ResponseBody
     @ResponseBody
@@ -409,6 +483,7 @@ public class UserController extends BaseApiController {
         }
         }
         jsonObject.put("openId", sysUser.getOpenId());
         jsonObject.put("openId", sysUser.getOpenId());
         jsonObject.put("channelOpenId", sysUser.getChannelOpenId());
         jsonObject.put("channelOpenId", sysUser.getChannelOpenId());
+        jsonObject.put("aliuserId", sysUser.getAliuserId());
         JSONArray roleKeys = new JSONArray();
         JSONArray roleKeys = new JSONArray();
         JSONArray roles = new JSONArray();
         JSONArray roles = new JSONArray();
         loginUser.getUser().getRoles().forEach(sysRole -> roles.add(sysRole.getRoleName()));
         loginUser.getUser().getRoles().forEach(sysRole -> roles.add(sysRole.getRoleName()));
@@ -551,12 +626,17 @@ public class UserController extends BaseApiController {
         String charset = "UTF-8";
         String charset = "UTF-8";
         String encryptType = "AES";
         String encryptType = "AES";
 
 
-        String publicKey1 = "al2021003127607930AES";
+        String publicKey1 = "fhixMEfC0kpw9drqNJiMfQ==";
         String s = AlipayEncrypt.encryptContent("17681682549", encryptType, publicKey1, charset);
         String s = AlipayEncrypt.encryptContent("17681682549", encryptType, publicKey1, charset);
         System.out.println("s = " + s);
         System.out.println("s = " + s);
         String s2 = AlipayEncrypt.decryptContent(s, encryptType, publicKey1, charset);
         String s2 = AlipayEncrypt.decryptContent(s, encryptType, publicKey1, charset);
         System.out.println("s2 = " + s2);
         System.out.println("s2 = " + s2);
 
 
+
+        String sss = "MdfC1q4gGs/I+SSrEXPj53glFjQhASHV2Op69KeecJ6iM0jN6mUVkjAOHSrjCzd9O5RI0vZt7EFcyyQP3YS5Mg==";
+        String s1 = AlipayEncrypt.decryptContent(sss, encryptType, publicKey1, charset);
+        System.out.println("s1 = " + s1);
+
     }
     }
 
 
 }
 }

+ 199 - 198
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java

@@ -36,6 +36,7 @@ import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
+
 import java.util.List;
 import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
@@ -61,224 +62,224 @@ import org.springframework.web.bind.annotation.RestController;
 public class UserTicketOrderController extends BaseApiController {
 public class UserTicketOrderController extends BaseApiController {
 
 
 
 
-  @Autowired
-  private ITicketBoxService ticketBoxService;
+    @Autowired
+    private ITicketBoxService ticketBoxService;
 
 
-  @Autowired
-  private IUserTicketOrderService userTicketOrderService;
+    @Autowired
+    private IUserTicketOrderService userTicketOrderService;
 
 
-  @Autowired
-  private ITicketService ticketService;
+    @Autowired
+    private ITicketService ticketService;
 
 
-  @Autowired
-  private IUserCouponService userCouponService;
+    @Autowired
+    private IUserCouponService userCouponService;
 
 
-  @Autowired
-  private IWalletService walletService;
+    @Autowired
+    private IWalletService walletService;
 
 
-  @Autowired
-  private ISysUserService sysUserService;
+    @Autowired
+    private ISysUserService sysUserService;
 
 
-  @Autowired
-  private MapperFacade mapperFacade;
+    @Autowired
+    private MapperFacade mapperFacade;
 
 
-  @Autowired
-  private RedisCache redisCache;
+    @Autowired
+    private RedisCache redisCache;
 
 
-  @Autowired
-  private PulsarClientService pulsarClientService;
+    @Autowired
+    private PulsarClientService pulsarClientService;
 
 
-  @Autowired
-  private ITicketPackageService ticketPackageService;
+    @Autowired
+    private ITicketPackageService ticketPackageService;
 
 
 
 
-  /**
-   * 订单结算,每次更换优惠券时需重新请求此接口
-   */
-  @PostMapping("/order/settle")
-  @ApiOperation(value = "订单结算" , notes = "单个盲票商品上点立即购买")
-  public AjaxResult settle(@Valid @RequestBody TicketOrderParam param) {
-    if (StringUtils.isBlank(param.getTicketId()) && StringUtils.isBlank(param.getBoxId())) {
-      return AjaxResult.error("参数缺失");
-    }
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-
-    TicketOrderSettleVO orderSettleVO = new TicketOrderSettleVO();
-
-
-    // 订单金额计算
-    Integer orderAmt = 0;
-    Integer discountAmt = 0;
-    TicketBox ticketBox;
-    if (StringUtils.isNotBlank(param.getTicketId())) {
-      // 线下扫码购票
-      Ticket ticket = ticketService.getById(param.getTicketId());
-      ticketBox = ticketBoxService.getById(ticket.getBoxId());
-      orderAmt = ticketBox.getSalePrice();
-
-      // 预付票设置金额为0
-      TicketPackage ticketPackage =  ticketPackageService.getById(ticket.getPkgId());
-      if (ticketPackage.getIsPre() == 1) {
-        orderAmt = 0;
-      }
-    } else {
-      // 线上购票
-      ticketBox = ticketBoxService.getById(param.getBoxId());
-      orderAmt = ticketBox.getSalePrice() * param.getOrderNum();
-    }
+    /**
+     * 订单结算,每次更换优惠券时需重新请求此接口
+     */
+    @PostMapping("/order/settle")
+    @ApiOperation(value = "订单结算", notes = "单个盲票商品上点立即购买")
+    public AjaxResult settle(@Valid @RequestBody TicketOrderParam param) {
+        if (StringUtils.isBlank(param.getTicketId()) && StringUtils.isBlank(param.getBoxId())) {
+            return AjaxResult.error("参数缺失");
+        }
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+
+        TicketOrderSettleVO orderSettleVO = new TicketOrderSettleVO();
+
+
+        // 订单金额计算
+        Integer orderAmt = 0;
+        Integer discountAmt = 0;
+        TicketBox ticketBox;
+        if (StringUtils.isNotBlank(param.getTicketId())) {
+            // 线下扫码购票
+            Ticket ticket = ticketService.getById(param.getTicketId());
+            ticketBox = ticketBoxService.getById(ticket.getBoxId());
+            orderAmt = ticketBox.getSalePrice();
+
+            // 预付票设置金额为0
+            TicketPackage ticketPackage = ticketPackageService.getById(ticket.getPkgId());
+            if (ticketPackage.getIsPre() == 1) {
+                orderAmt = 0;
+            }
+        } else {
+            // 线上购票
+            ticketBox = ticketBoxService.getById(param.getBoxId());
+            orderAmt = ticketBox.getSalePrice() * param.getOrderNum();
+        }
 
 
-    if (param.getAutoCoupon() == 1) {
-      List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderAmt, ticketBox);
-      if (!CollectionUtils.isEmpty(userCouponVOList)) {
-        // 只考虑使用单张券
-        orderSettleVO.getCouponList().add(mapperFacade.map(userCouponVOList.get(0), UserCoupon4OrderVO.class));
-        discountAmt = userCouponVOList.get(0).getDiscount();
-      }
-    } else if (!CollectionUtils.isEmpty(param.getUserCouponIds())){
-      // 查询指定券
-      List<UserCouponVO> userCouponVOList = userCouponService.listTicketOrderCouponByIds(param.getUserCouponIds());
-      if (!CollectionUtils.isEmpty(userCouponVOList)) {
-        // 只考虑使用单张券
-        orderSettleVO.getCouponList().add(mapperFacade.map(userCouponVOList.get(0), UserCoupon4OrderVO.class));
-        discountAmt = userCouponVOList.get(0).getDiscount();
-      }
-    }
+        if (param.getAutoCoupon() == 1) {
+            List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderAmt, ticketBox);
+            if (!CollectionUtils.isEmpty(userCouponVOList)) {
+                // 只考虑使用单张券
+                orderSettleVO.getCouponList().add(mapperFacade.map(userCouponVOList.get(0), UserCoupon4OrderVO.class));
+                discountAmt = userCouponVOList.get(0).getDiscount();
+            }
+        } else if (!CollectionUtils.isEmpty(param.getUserCouponIds())) {
+            // 查询指定券
+            List<UserCouponVO> userCouponVOList = userCouponService.listTicketOrderCouponByIds(param.getUserCouponIds());
+            if (!CollectionUtils.isEmpty(userCouponVOList)) {
+                // 只考虑使用单张券
+                orderSettleVO.getCouponList().add(mapperFacade.map(userCouponVOList.get(0), UserCoupon4OrderVO.class));
+                discountAmt = userCouponVOList.get(0).getDiscount();
+            }
+        }
 
 
-    orderSettleVO.setOrderAmt(orderAmt);
-    orderSettleVO.setDiscountAmt(discountAmt);
-    // 当前没有运费和优惠,实付金额=订单金额
-    orderSettleVO.setPayAmt(orderAmt - discountAmt);
-    orderSettleVO.setOrderNum(param.getOrderNum());
-    orderSettleVO.setBoxId(ticketBox.getBoxId());
-    orderSettleVO.setTicketId(param.getTicketId());
-    orderSettleVO.setPicUrl(ticketBox.getPicUrl());
-    orderSettleVO.setTitle(ticketBox.getTitle());
-
-    // 缓存订单结算对象
-    redisCache.setCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
-    return AjaxResult.success(orderSettleVO);
-  }
-
-  /**
-   * 提交订单
-   */
-  @PostMapping("/order/submit")
-  @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
-  public AjaxResult submit(@RequestBody UserShareVO userShareVO) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
-    if (null == orderSettleVO) {
-      return AjaxResult.error("订单已过期,请重新下单");
-    }
-    String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO, userShareVO);
-    JSONObject jsonObject = new JSONObject();
-    jsonObject.put("orderId", orderId);
-    if (orderSettleVO.getPayAmt() > 0) {
-      jsonObject.put("needPay", 1);
-    } else {
-      jsonObject.put("needPay", 0);
-    }
-    // 清除缓存的订单
-    redisCache.deleteObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
-
-    return AjaxResult.success(jsonObject);
-  }
-
-
-  /**
-   * 取消订单
-   */
-  @PostMapping("/order/cancel")
-  @ApiOperation(value = "取消订单" , notes = "在订单列表页面取消")
-  public AjaxResult cancel(@RequestBody ChannelOrder order) {
-    userTicketOrderService.cancelOrder(order.getOrderId());
-    return AjaxResult.success("取消成功");
-  }
-
-  /**
-   * 订单支付
-   */
-  @PostMapping("/order/pay")
-  @ApiOperation(value = "订单支付" , notes = "在盲票页面支付")
-  public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    SysUser sysUser = sysUserService.selectUserById(userId);
-    if (StringUtils.isBlank(sysUser.getOpenId())) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+        orderSettleVO.setOrderAmt(orderAmt);
+        orderSettleVO.setDiscountAmt(discountAmt);
+        // 当前没有运费和优惠,实付金额=订单金额
+        orderSettleVO.setPayAmt(orderAmt - discountAmt);
+        orderSettleVO.setOrderNum(param.getOrderNum());
+        orderSettleVO.setBoxId(ticketBox.getBoxId());
+        orderSettleVO.setTicketId(param.getTicketId());
+        orderSettleVO.setPicUrl(ticketBox.getPicUrl());
+        orderSettleVO.setTitle(ticketBox.getTitle());
+
+        // 缓存订单结算对象
+        redisCache.setCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
+        return AjaxResult.success(orderSettleVO);
     }
     }
-    UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
-    JSONObject jsonObject;
-    try {
-      jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getOpenId(), ticketOrder.getPayAmt(), ticketOrder.getTitle());
-    }catch (ServiceException e) {
-      LogUtil.error(logger, e, "根据盲票购买订单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
-      return AjaxResult.error(e.getMessage());
+
+    /**
+     * 提交订单
+     */
+    @PostMapping("/order/submit")
+    @ApiOperation(value = "提交订单", notes = "在订单确认页面提交")
+    public AjaxResult submit(@RequestBody UserShareVO userShareVO) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+        if (null == orderSettleVO) {
+            return AjaxResult.error("订单已过期,请重新下单");
+        }
+        String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO, userShareVO);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("orderId", orderId);
+        if (orderSettleVO.getPayAmt() > 0) {
+            jsonObject.put("needPay", 1);
+        } else {
+            jsonObject.put("needPay", 0);
+        }
+        // 清除缓存的订单
+        redisCache.deleteObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+
+        return AjaxResult.success(jsonObject);
     }
     }
-    return AjaxResult.success(jsonObject);
-  }
-
-  /**
-   * 可用优惠券列表
-   */
-  @PostMapping("/order/coupon/list")
-  @ApiOperation(value = "查询可用优惠券" , notes = "在下单页面选择")
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
-  )
-  public AjaxResult listCoupon(@RequestBody TicketOrderParam param) {
-    Long userId = SecurityUtils.getUserId();
-    TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
-    if (null == orderSettleVO) {
-      return AjaxResult.error("订单已过期,请重新下单");
+
+
+    /**
+     * 取消订单
+     */
+    @PostMapping("/order/cancel")
+    @ApiOperation(value = "取消订单", notes = "在订单列表页面取消")
+    public AjaxResult cancel(@RequestBody ChannelOrder order) {
+        userTicketOrderService.cancelOrder(order.getOrderId());
+        return AjaxResult.success("取消成功");
     }
     }
-    TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
-    List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
-
-    // 设置选中状态
-    for (UserCouponVO userCouponVO : userCouponVOList) {
-      if (!CollectionUtils.isEmpty(orderSettleVO.getCouponList())) {
-        for (UserCoupon4OrderVO userCoupon4OrderVO : orderSettleVO.getCouponList()) {
-          if (userCoupon4OrderVO.getId().equals(userCouponVO.getId())) {
-            userCouponVO.setChecked(true);
-            break;
-          }
+
+    /**
+     * 订单支付
+     */
+    @PostMapping("/order/pay")
+    @ApiOperation(value = "订单支付", notes = "在盲票页面支付")
+    public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        if (StringUtils.isBlank(sysUser.getOpenId())) {
+            return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+        }
+        UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
+        JSONObject jsonObject;
+        try {
+            jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getOpenId(), ticketOrder.getPayAmt(), ticketOrder.getTitle());
+        } catch (ServiceException e) {
+            LogUtil.error(logger, e, "根据盲票购买订单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
+            return AjaxResult.error(e.getMessage());
         }
         }
-      }
+        return AjaxResult.success(jsonObject);
     }
     }
-    return AjaxResult.success(userCouponVOList);
-  }
-
-
-  @PostMapping("/order/coupon/listPage")
-  @ApiOperation(value = "查询可用优惠券,分页" , notes = "在下单页面选择")
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
-  )
-  public TableDataInfo listPageCoupon(@RequestBody TicketOrderParam param) {
-    Long userId = SecurityUtils.getUserId();
-    TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
-    if (null == orderSettleVO) {
-      return getErrorDataTable("订单已过期,请重新下单");
+
+    /**
+     * 可用优惠券列表
+     */
+    @PostMapping("/order/coupon/list")
+    @ApiOperation(value = "查询可用优惠券", notes = "在下单页面选择")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
+    )
+    public AjaxResult listCoupon(@RequestBody TicketOrderParam param) {
+        Long userId = SecurityUtils.getUserId();
+        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+        if (null == orderSettleVO) {
+            return AjaxResult.error("订单已过期,请重新下单");
+        }
+        TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
+        List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
+
+        // 设置选中状态
+        for (UserCouponVO userCouponVO : userCouponVOList) {
+            if (!CollectionUtils.isEmpty(orderSettleVO.getCouponList())) {
+                for (UserCoupon4OrderVO userCoupon4OrderVO : orderSettleVO.getCouponList()) {
+                    if (userCoupon4OrderVO.getId().equals(userCouponVO.getId())) {
+                        userCouponVO.setChecked(true);
+                        break;
+                    }
+                }
+            }
+        }
+        return AjaxResult.success(userCouponVOList);
     }
     }
-    TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
-    startPage();
-    List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
-
-    // 设置选中状态
-    for (UserCouponVO userCouponVO : userCouponVOList) {
-      if (!CollectionUtils.isEmpty(orderSettleVO.getCouponList())) {
-        for (UserCoupon4OrderVO userCoupon4OrderVO : orderSettleVO.getCouponList()) {
-          if (userCoupon4OrderVO.getId().equals(userCouponVO.getId())) {
-            userCouponVO.setChecked(true);
-            break;
-          }
+
+
+    @PostMapping("/order/coupon/listPage")
+    @ApiOperation(value = "查询可用优惠券,分页", notes = "在下单页面选择")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
+    )
+    public TableDataInfo listPageCoupon(@RequestBody TicketOrderParam param) {
+        Long userId = SecurityUtils.getUserId();
+        TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+        if (null == orderSettleVO) {
+            return getErrorDataTable("订单已过期,请重新下单");
+        }
+        TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
+        startPage();
+        List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
+
+        // 设置选中状态
+        for (UserCouponVO userCouponVO : userCouponVOList) {
+            if (!CollectionUtils.isEmpty(orderSettleVO.getCouponList())) {
+                for (UserCoupon4OrderVO userCoupon4OrderVO : orderSettleVO.getCouponList()) {
+                    if (userCoupon4OrderVO.getId().equals(userCouponVO.getId())) {
+                        userCouponVO.setChecked(true);
+                        break;
+                    }
+                }
+            }
         }
         }
-      }
+        List<UserCouponVO> countUserCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
+        TableDataInfo dataTable = getDataTable(userCouponVOList);
+        dataTable.setTotal(countUserCouponVOList.size());
+        return dataTable;
     }
     }
-    List<UserCouponVO> countUserCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
-    TableDataInfo dataTable = getDataTable(userCouponVOList);
-    dataTable.setTotal(countUserCouponVOList.size());
-    return dataTable;
-  }
 
 
 }
 }

+ 14 - 1
mp-common/pom.xml

@@ -40,7 +40,20 @@
         <dependency>
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
             <groupId>com.github.xiaoymin</groupId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
             <artifactId>knife4j-spring-boot-starter</artifactId>
-            <version>2.0.8</version>
+            <version>2.0.9</version>
+            <exclusions>
+                <!-- 去除新版ui -->
+                <exclusion>
+                    <groupId>com.github.xiaoymin</groupId>
+                    <artifactId>knife4j-spring-ui</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- 引入老版ui -->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>1.9.6</version>
         </dependency>
         </dependency>
 
 
         <!-- Spring框架基本的核心工具 -->
         <!-- Spring框架基本的核心工具 -->

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

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

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

@@ -31,7 +31,7 @@ public class SendErrorMsgAppender extends UnsynchronizedAppenderBase<ILoggingEve
         || throwableMsg.startsWith("盲票已付款,") || throwableMsg.startsWith("盲票已兑奖") || throwableMsg.startsWith("登录用户不存在:")
         || throwableMsg.startsWith("盲票已付款,") || throwableMsg.startsWith("盲票已兑奖") || throwableMsg.startsWith("登录用户不存在:")
         || throwableMsg.startsWith("用户不存在/密码错误") || throwableMsg.startsWith("验证码已失效") || throwableMsg.startsWith("您已经助力过了")
         || throwableMsg.startsWith("用户不存在/密码错误") || throwableMsg.startsWith("验证码已失效") || throwableMsg.startsWith("您已经助力过了")
         || throwableMsg.startsWith("您已经获取过抽奖码了") || throwableMsg.startsWith("奖品总数值不相同") || throwableMsg.startsWith("包含已兑奖记录的奖品不能从奖级中删除")
         || throwableMsg.startsWith("您已经获取过抽奖码了") || throwableMsg.startsWith("奖品总数值不相同") || throwableMsg.startsWith("包含已兑奖记录的奖品不能从奖级中删除")
-        || throwableMsg.startsWith("登录账号不存在") || throwableMsg.startsWith("已选择更高级的渠道,不支持渠道相互嵌套!")
+        || throwableMsg.startsWith("登录账号不存在") || throwableMsg.startsWith("已选择更高级的渠道,不支持渠道相互嵌套!") || throwableMsg.startsWith("内定人数不能超过100")
         )) {
         )) {
           return;
           return;
         }
         }

+ 150 - 150
mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java

@@ -12,6 +12,7 @@ import com.qs.mp.common.enums.CouponDistributeTypeEnum;
 import com.qs.mp.common.enums.CouponStatusEnum;
 import com.qs.mp.common.enums.CouponStatusEnum;
 import com.qs.mp.common.enums.CouponTypeEnum;
 import com.qs.mp.common.enums.CouponTypeEnum;
 import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.CouponUseAreaEnum;
+
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.Date;
 
 
@@ -29,156 +30,155 @@ import lombok.Data;
 @ApiModel("优惠券实体类")
 @ApiModel("优惠券实体类")
 public class Coupon implements Serializable {
 public class Coupon implements Serializable {
 
 
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * 主键
-   */
-  @ApiModelProperty("优惠券id")
-  @TableId(value = "coupon_id", type = IdType.AUTO)
-  private Long couponId;
-
-  /**
-   * 标题
-   */
-  @ApiModelProperty("标题")
-  @TableField("title")
-  private String title;
-
-  /**
-   * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
-   */
-  @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
-  @TableField("type")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponTypeEnum type;
-
-  /**
-   * 图片
-   */
-  @ApiModelProperty("图片")
-  @TableField("pic_url")
-  private String picUrl;
-
-  /**
-   * 使用说明
-   */
-  @ApiModelProperty("使用说明")
-  @TableField("description")
-  private String description;
-
-  /**
-   * 优惠类型;1代金券、2折扣券、3兑换券
-   */
-  @ApiModelProperty("优惠类型;1代金券、2折扣券、3兑换券")
-  @TableField("discount_type")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponDiscountTypeEnum discountType;
-
-  /**
-   * 优惠金额(比例)
-   */
-  @ApiModelProperty("优惠金额(比例)")
-  @TableField("discount")
-  private Integer discount;
-
-  /**
-   * 最低消费金额
-   */
-  @ApiModelProperty("最低消费金额")
-  @TableField("min_order_amt")
-  private Integer minOrderAmt;
-
-  /**
-   * 渠道代金券,渠道承担比例
-   */
-  @ApiModelProperty("渠道代金券,渠道承担比例")
-  @TableField("channel_shared_rate")
-  private Integer channelSharedRate;
-
-
-  /**
-   * 状态;off下架 on正常
-   */
-  @ApiModelProperty("状态;off下架 on正常")
-  @TableField("status")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponStatusEnum status;
-
-  /**
-   * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
-   *         0:进票门店  1、指定盲票  2:所有门票
-   *
-   */
-  @ApiModelProperty("使用范围;0通用 1生成券时指定范围 2发放时动态指定范围")
-  @TableField("use_area")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponUseAreaEnum useArea;
-
-  /**
-   * 发放方式;1系统发放 2用户主动领取
-   */
-  @ApiModelProperty("发放方式;1系统发放 2用户主动领取")
-  @TableField("distribute_type")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponDistributeTypeEnum distributeType;
-
-  /**
-   * 叠加使用;0不允许 1允许
-   */
-  @ApiModelProperty("叠加使用;0不允许 1允许")
-  @TableField("composite_use")
-  private Integer compositeUse;
-
-  /**
-   * 有效期天数;从领券后开始多少天有效,0则使用绝对有效期
-   */
-  @ApiModelProperty("有效期天数;从领券后开始多少天有效,0则使用绝对有效期")
-  @TableField("due_days")
-  private Integer dueDays;
-
-  /**
-   * 有效期开始日
-   */
-  @TableField("valid_start")
-  private Date validStart;
-
-  /**
-   * 有效期结束日
-   */
-  @TableField("valid_end")
-  private Date validEnd;
-
-  /**
-   * 总量;总量为0代表不限量
-   */
-  @TableField("quantity")
-  private Integer quantity;
-
-  /**
-   * 已发放量
-   */
-  @TableField("distribute_qty")
-  private Integer distributeQty;
-
-  /**
-   * 逻辑删除标识
-   */
-  @TableField("is_deleted")
-  @TableLogic
-  private Integer isDeleted;
-
-  /**
-   * 创建时间
-   */
-  @TableField("created_time")
-  private Date createdTime;
-
-  /**
-   * 更新时间
-   */
-  @TableField("updated_time")
-  private Date updatedTime;
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("优惠券id")
+    @TableId(value = "coupon_id", type = IdType.AUTO)
+    private Long couponId;
+
+    /**
+     * 标题
+     */
+    @ApiModelProperty("标题")
+    @TableField("title")
+    private String title;
+
+    /**
+     * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
+     */
+    @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
+    @TableField("type")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponTypeEnum type;
+
+    /**
+     * 图片
+     */
+    @ApiModelProperty("图片")
+    @TableField("pic_url")
+    private String picUrl;
+
+    /**
+     * 使用说明
+     */
+    @ApiModelProperty("使用说明")
+    @TableField("description")
+    private String description;
+
+    /**
+     * 优惠类型;1代金券、2折扣券、3兑换券
+     */
+    @ApiModelProperty("优惠类型;1代金券、2折扣券、3兑换券")
+    @TableField("discount_type")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponDiscountTypeEnum discountType;
+
+    /**
+     * 优惠金额(比例)
+     */
+    @ApiModelProperty("优惠金额(比例)")
+    @TableField("discount")
+    private Integer discount;
+
+    /**
+     * 最低消费金额
+     */
+    @ApiModelProperty("最低消费金额")
+    @TableField("min_order_amt")
+    private Integer minOrderAmt;
+
+    /**
+     * 渠道代金券,渠道承担比例
+     */
+    @ApiModelProperty("渠道代金券,渠道承担比例")
+    @TableField("channel_shared_rate")
+    private Integer channelSharedRate;
+
+
+    /**
+     * 状态;off下架 on正常
+     */
+    @ApiModelProperty("状态;off下架 on正常")
+    @TableField("status")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponStatusEnum status;
+
+    /**
+     * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
+     * 0:进票门店  1、指定盲票  2:所有门票
+     */
+    @ApiModelProperty("使用范围;0通用, 1指定范围, 2门店消费,发放时动态指定范围, 3线上票, 4线下票")
+    @TableField("use_area")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponUseAreaEnum useArea;
+
+    /**
+     * 发放方式;1系统发放 2用户主动领取
+     */
+    @ApiModelProperty("发放方式;1系统发放 2用户主动领取")
+    @TableField("distribute_type")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponDistributeTypeEnum distributeType;
+
+    /**
+     * 叠加使用;0不允许 1允许
+     */
+    @ApiModelProperty("叠加使用;0不允许 1允许")
+    @TableField("composite_use")
+    private Integer compositeUse;
+
+    /**
+     * 有效期天数;从领券后开始多少天有效,0则使用绝对有效期
+     */
+    @ApiModelProperty("有效期天数;从领券后开始多少天有效,0则使用绝对有效期")
+    @TableField("due_days")
+    private Integer dueDays;
+
+    /**
+     * 有效期开始日
+     */
+    @TableField("valid_start")
+    private Date validStart;
+
+    /**
+     * 有效期结束日
+     */
+    @TableField("valid_end")
+    private Date validEnd;
+
+    /**
+     * 总量;总量为0代表不限量
+     */
+    @TableField("quantity")
+    private Integer quantity;
+
+    /**
+     * 已发放量
+     */
+    @TableField("distribute_qty")
+    private Integer distributeQty;
+
+    /**
+     * 逻辑删除标识
+     */
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+    /**
+     * 创建时间
+     */
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("updated_time")
+    private Date updatedTime;
 
 
 
 
 }
 }

+ 9 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/CouponTicket.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
 /**
 /**
@@ -15,6 +18,7 @@ import lombok.Data;
  */
  */
 @TableName("mp_coupon_ticket")
 @TableName("mp_coupon_ticket")
 @Data
 @Data
+@ApiModel("盲票购买优惠券使用范围限制实体类")
 public class CouponTicket implements Serializable {
 public class CouponTicket implements Serializable {
 
 
   private static final long serialVersionUID = 1L;
   private static final long serialVersionUID = 1L;
@@ -22,30 +26,35 @@ public class CouponTicket implements Serializable {
   /**
   /**
    * 主键
    * 主键
    */
    */
+  @ApiModelProperty("主键")
   @TableId(value = "id", type = IdType.AUTO)
   @TableId(value = "id", type = IdType.AUTO)
   private Long id;
   private Long id;
 
 
   /**
   /**
    * 优惠券ID
    * 优惠券ID
    */
    */
+  @ApiModelProperty("优惠券ID")
   @TableField("coupon_id")
   @TableField("coupon_id")
   private Long couponId;
   private Long couponId;
 
 
   /**
   /**
    * 盲票组ID
    * 盲票组ID
    */
    */
+  @ApiModelProperty("盲票组ID")
   @TableField("box_id")
   @TableField("box_id")
   private String boxId;
   private String boxId;
 
 
   /**
   /**
    * 创建时间
    * 创建时间
    */
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   @TableField("created_time")
   private Date createdTime;
   private Date createdTime;
 
 
   /**
   /**
    * 更新时间
    * 更新时间
    */
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   @TableField("updated_time")
   private Date updatedTime;
   private Date updatedTime;
 
 

+ 65 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/excel/GoodsExcel.java

@@ -0,0 +1,65 @@
+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.GoodsStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 商品导出类
+ * @author Cup
+ * @date 2022/6/26
+ */
+@ApiModel("商品导出类")
+@Data
+public class GoodsExcel {
+
+    @Excel(name = "商品ID")
+    private Long goodsId;
+
+    @Excel(name = "商品名称")
+    private String title;
+
+    @Excel(name = "一级分类")
+    private String parentCategoryName;
+
+    @Excel(name = "二级分类")
+    private String categoryName;
+
+    @Excel(name = "价格")
+    private BigDecimal value;
+
+    @Excel(name = "成本")
+    private BigDecimal cost;
+
+    @Excel(name = "是否支持兑换")
+    private String exchangeShow;
+
+    @Excel(name = "盲豆兑换数量")
+    private Integer exchangePrice;
+
+    @Excel(name = "销量")
+    private Integer exchangedQty;
+
+    @Excel(name = "库存")
+    private Integer quantity;
+
+    @Excel(name = "状态")
+    private String status;
+
+    @Excel(name = "商品编码")
+    private String goodsCode;
+
+    @Excel(name = "供应商")
+    private String supplierName;
+
+    @Excel(name = "商品采购链接")
+    private String shoppingLink;
+
+
+}

+ 48 - 49
mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsQueryParam.java

@@ -22,70 +22,69 @@ import java.util.List;
 @Data
 @Data
 public class GoodsQueryParam {
 public class GoodsQueryParam {
 
 
-	@ApiModelProperty(value = "商品ID", required = false)
-	private Long goodsId;
+    @ApiModelProperty(value = "商品ID", required = false)
+    private Long goodsId;
 
 
-	@ApiModelProperty(value = "分类ID", required = false)
-	private Long categoryId;
+    @ApiModelProperty(value = "分类ID", required = false)
+    private Long categoryId;
 
 
-	@ApiModelProperty(value = "分类ID列表", required = false)
-	private List<Long> categoryIdList;
+    @ApiModelProperty(value = "分类ID列表", required = false)
+    private List<Long> categoryIdList;
 
 
-	@ApiModelProperty(value = "标签ID", required = false)
-	private Long tagId;
+    @ApiModelProperty(value = "标签ID", required = false)
+    private Long tagId;
 
 
-	@NotNull(message = "商品名称不能为空")
-	@ApiModelProperty(value = "商品名称", required = true)
-	private String title;
+    @NotNull(message = "商品名称不能为空")
+    @ApiModelProperty(value = "商品名称", required = true)
+    private String title;
 
 
 
 
-	@ApiModelProperty(value = "供应商id", required = false)
-	private Long supplierId;
+    @ApiModelProperty(value = "供应商id", required = false)
+    private Long supplierId;
 
 
 
 
-	/**
-	 * 最低成本
-	 */
-	@ApiModelProperty(value = "最低成本", required = false)
-	private Integer minCost;
+    /**
+     * 最低成本
+     */
+    @ApiModelProperty(value = "最低成本", required = false)
+    private Integer minCost;
 
 
-	/**
-	 * 最高成本
-	 */
-	@ApiModelProperty(value = "最高成本", required = false)
-	private Integer maxCost;
+    /**
+     * 最高成本
+     */
+    @ApiModelProperty(value = "最高成本", required = false)
+    private Integer maxCost;
 
 
-	/**
-	 * 最低价格
-	 */
-	@ApiModelProperty(value = "最低价格", required = false)
-	private Integer minValue;
+    /**
+     * 最低价格
+     */
+    @ApiModelProperty(value = "最低价格", required = false)
+    private Integer minValue;
 
 
-	/**
-	 * 最高价格
-	 */
-	@ApiModelProperty(value = "最高价格", required = false)
-	private Integer maxValue;
+    /**
+     * 最高价格
+     */
+    @ApiModelProperty(value = "最高价格", required = false)
+    private Integer maxValue;
 
 
-	@ApiModelProperty("最低兑换价格")
-	private Integer minExchange;
+    @ApiModelProperty("最低兑换价格")
+    private Integer minExchange;
 
 
-	@ApiModelProperty("最高兑换价格")
-	private Integer maxExchange;
+    @ApiModelProperty("最高兑换价格")
+    private Integer maxExchange;
 
 
-	/**
-	 * 兑换大厅是否展示,0不展示,1展示
-	 */
-	@ApiModelProperty(value = "兑换大厅是否展示", required = false)
-	private Integer exchangeShow;
-
-	/**
-	 * 上架状态;上架/下架
-	 */
-	@ApiModelProperty(value = "上架状态", required = false)
-	@JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-	private GoodsStatusEnum status;
+    /**
+     * 兑换大厅是否展示,0不展示,1展示
+     */
+    @ApiModelProperty(value = "兑换大厅是否展示", required = false)
+    private Integer exchangeShow;
 
 
+    /**
+     * 上架状态;上架/下架
+     */
+    @ApiModelProperty(value = "上架状态", required = false)
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private GoodsStatusEnum status;
 
 
 
 
 }
 }

+ 37 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxQueryParam.java

@@ -0,0 +1,37 @@
+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.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Cup
+ * @date 2022/6/27
+ */
+@ApiModel("盲票组查询入参类")
+@Data
+public class TicketBoxQueryParam {
+
+    @ApiModelProperty("盲票组标题")
+    private String title;
+
+    @ApiModelProperty("盲票形式(线上或线下)")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketTypeEnum type;
+
+    @ApiModelProperty("状态,上架/下架")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketBoxStatusEnum status;
+
+    @ApiModelProperty("排除的盲票组id列表")
+    private List<String> excludeBoxIds;
+
+
+}

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

@@ -24,6 +24,9 @@ public class CouponPkgItemVO extends CouponPkgItem {
     @ApiModelProperty("券优惠金额(比例)")
     @ApiModelProperty("券优惠金额(比例)")
     private Integer discount;
     private Integer discount;
 
 
+    @ApiModelProperty("渠道代金券,渠道承担比例")
+    private Integer channelSharedRate;
+
     @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
     @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
     @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
     @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
     private CouponTypeEnum type;
     private CouponTypeEnum type;

+ 142 - 116
mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponVO.java

@@ -11,9 +11,12 @@ import com.qs.mp.common.enums.CouponDistributeTypeEnum;
 import com.qs.mp.common.enums.CouponStatusEnum;
 import com.qs.mp.common.enums.CouponStatusEnum;
 import com.qs.mp.common.enums.CouponTypeEnum;
 import com.qs.mp.common.enums.CouponTypeEnum;
 import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.CouponUseAreaEnum;
+
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
 /**
 /**
@@ -22,125 +25,148 @@ import lombok.Data;
  * @create 2022-03-07 20:43:44
  * @create 2022-03-07 20:43:44
  */
  */
 @Data
 @Data
+@ApiModel("优惠券实体类")
 public class CouponVO {
 public class CouponVO {
 
 
 
 
-	/**
-	 * 盲票购买优惠券使用范围限制列表
-	 */
-	private List<TicketBox> ticketBoxList;
-
-	/**
-	 * 经销商门店优惠券使用范围限制列表
-	 */
-	private List<Channel> channelList;
-
-
-  /**
-   * 主键
-   */
-  private Long couponId;
-
-  /**
-   * 标题
-   */
-  private String title;
-
-  /**
-   * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
-   */
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponTypeEnum type;
-
-  /**
-   * 图片
-   */
-  private String picUrl;
-
-  /**
-   * 使用说明
-   */
-  private String description;
-
-  /**
-   * 优惠类型;1代金券、2折扣券、3兑换券
-   */
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponDiscountTypeEnum discountType;
-
-  /**
-   * 优惠金额(比例)
-   */
-  private Integer discount;
-
-  /**
-   * 最低消费金额
-   */
-  private Integer minOrderAmt;
-
-  /**
-   * 渠道代金券,渠道承担比例
-   */
-  private Integer channelSharedRate;
-
-
-  /**
-   * 状态;off下架 on正常
-   */
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponStatusEnum status;
-
-  /**
-   * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
-   */
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponUseAreaEnum useArea;
-
-  /**
-   * 发放方式;1系统发放 2用户主动领取
-   */
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponDistributeTypeEnum distributeType;
-
-  /**
-   * 叠加使用;0不允许 1允许
-   */
-  private Integer compositeUse;
-
-  /**
-   * 有效期天数;从领券后开始多少天有效,0则使用绝对有效期
-   */
-  private Integer dueDays;
-
-  /**
-   * 有效期开始日
-   */
-  private Date validStart;
-
-  /**
-   * 有效期结束日
-   */
-  private Date validEnd;
-
-  /**
-   * 总量;总量为0代表不限量
-   */
-  private Integer quantity;
-
-  /**
-   * 已发放量
-   */
-  private Integer distributeQty;
-
-  /**
-   * 创建时间
-   */
-  private Date createdTime;
-
-  /**
-   * 更新时间
-   */
-  private Date updatedTime;
+    /**
+     * 盲票购买优惠券使用范围限制列表
+     */
+    @ApiModelProperty("盲票购买优惠券使用范围限制列表")
+    private List<TicketBox> ticketBoxList;
+
+    /**
+     * 经销商门店优惠券使用范围限制列表
+     */
+    @ApiModelProperty("经销商门店优惠券使用范围限制列表")
+    private List<Channel> channelList;
+
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("优惠券id")
+    private Long couponId;
+
+    /**
+     * 标题
+     */
+    @ApiModelProperty("标题")
+    private String title;
+
+    /**
+     * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
+     */
+    @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponTypeEnum type;
+
+    /**
+     * 图片
+     */
+    @ApiModelProperty("图片")
+    private String picUrl;
+
+    /**
+     * 使用说明
+     */
+    @ApiModelProperty("使用说明")
+    private String description;
+
+    /**
+     * 优惠类型;1代金券、2折扣券、3兑换券
+     */
+    @ApiModelProperty("优惠类型;1代金券、2折扣券、3兑换券")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponDiscountTypeEnum discountType;
+
+    /**
+     * 优惠金额(比例)
+     */
+    @ApiModelProperty("优惠金额(比例)")
+    private Integer discount;
+
+    /**
+     * 最低消费金额
+     */
+    @ApiModelProperty("最低消费金额")
+    private Integer minOrderAmt;
+
+    /**
+     * 渠道代金券,渠道承担比例
+     */
+    @ApiModelProperty("渠道代金券,渠道承担比例")
+    private Integer channelSharedRate;
+
+
+    /**
+     * 状态;off下架 on正常
+     */
+    @ApiModelProperty("状态;off下架 on正常")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponStatusEnum status;
+
+    /**
+     * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
+     */
+    @ApiModelProperty("使用范围;0通用, 1指定范围, 2门店消费,发放时动态指定范围, 3线上票, 4线下票")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponUseAreaEnum useArea;
+
+    /**
+     * 发放方式;1系统发放 2用户主动领取
+     */
+    @ApiModelProperty("发放方式;1系统发放 2用户主动领取")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponDistributeTypeEnum distributeType;
+
+    /**
+     * 叠加使用;0不允许 1允许
+     */
+    @ApiModelProperty("叠加使用;0不允许 1允许")
+    private Integer compositeUse;
+
+    /**
+     * 有效期天数;从领券后开始多少天有效,0则使用绝对有效期
+     */
+    @ApiModelProperty("有效期天数;从领券后开始多少天有效,0则使用绝对有效期")
+    private Integer dueDays;
+
+    /**
+     * 有效期开始日
+     */
+    @ApiModelProperty("有效期开始日")
+    private Date validStart;
+
+    /**
+     * 有效期结束日
+     */
+    @ApiModelProperty("有效期结束日")
+    private Date validEnd;
+
+    /**
+     * 总量;总量为0代表不限量
+     */
+    @ApiModelProperty("总量;总量为0代表不限量")
+    private Integer quantity;
+
+    /**
+     * 已发放量
+     */
+    @ApiModelProperty("已发放量")
+    private Integer distributeQty;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    private Date updatedTime;
 
 
 
 
 }
 }

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

@@ -0,0 +1,67 @@
+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.GoodsStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 商品导出出参类
+ * @author Cup
+ * @date 2022/6/26
+ */
+@ApiModel("商品导出出参类")
+@Data
+public class GoodsExportVO {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("商品名称")
+    private String title;
+
+    @ApiModelProperty("一级分类")
+    private String parentCategoryName;
+
+    @ApiModelProperty("二级分类")
+    private String categoryName;
+
+    @ApiModelProperty("价格")
+    private Integer value;
+
+    @ApiModelProperty("成本")
+    private Integer cost;
+
+    @ApiModelProperty("兑换大厅是否展示,0不展示,1展示")
+    private Integer exchangeShow;
+
+    @ApiModelProperty("盲豆兑换价格")
+    private Integer exchangePrice;
+
+    @ApiModelProperty("已经兑换的数量")
+    private Integer exchangedQty;
+
+    @ApiModelProperty("库存")
+    private Integer quantity;
+
+    @ApiModelProperty("上架状态;上架/下架")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private GoodsStatusEnum status;
+
+    @ApiModelProperty("商品编码")
+    private String goodsCode;
+
+    @ApiModelProperty("供应商")
+    private String supplierName;
+
+    @ApiModelProperty("商品采购链接")
+    private String shoppingLink;
+
+
+
+
+}

+ 12 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/GoodsMapper.java

@@ -1,7 +1,13 @@
 package com.qs.mp.admin.mapper;
 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.Goods;
 import com.qs.mp.admin.domain.Goods;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.admin.domain.vo.GoodsExportVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
 /**
 /**
  * @auther quanshu
  * @auther quanshu
@@ -10,4 +16,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
  */
 public interface GoodsMapper extends BaseMapper<Goods> {
 public interface GoodsMapper extends BaseMapper<Goods> {
 
 
+    /**
+     * 根据条件查询导出商品的数据
+     * @param queryWrapper
+     * @return
+     */
+    List<GoodsExportVO> listGoodsExportVOByQueryWrapper(@Param(Constants.WRAPPER) QueryWrapper<Goods> queryWrapper);
 }
 }

+ 9 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IGoodsService.java

@@ -1,10 +1,12 @@
 package com.qs.mp.admin.service;
 package com.qs.mp.admin.service;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.GoodsSku;
 import java.util.List;
 import java.util.List;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.vo.GoodsExportVO;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -30,4 +32,11 @@ public interface IGoodsService extends IService<Goods> {
      * @param skuList
      * @param skuList
      */
      */
     void updateGoods(Goods goods, List<GoodsSku> skuList, List<Long> tagIds);
     void updateGoods(Goods goods, List<GoodsSku> skuList, List<Long> tagIds);
+
+    /**
+     * 根据条件查询导出商品的数据
+     * @param queryWrapper
+     * @return
+     */
+    List<GoodsExportVO> listGoodsExportVOByQueryWrapper(QueryWrapper<Goods> queryWrapper);
 }
 }

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

@@ -29,6 +29,7 @@ import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 
 
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.user.service.IUserTicketOrderService;
+
 import java.util.List;
 import java.util.List;
 
 
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -49,143 +50,143 @@ import org.springframework.util.Assert;
 @Service
 @Service
 public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements ICouponService {
 public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements ICouponService {
 
 
-  protected final Logger logger = LoggerFactory.getLogger(this.getClass());
-
-  @Autowired
-  private ICouponService couponService;
-
-  @Autowired
-  private IUserCouponService userCouponService;
-
-  @Autowired
-  private IUserCouponChannelService userCouponChannelService;
-
-  @Autowired
-  private ICouponTicketService couponTicketService;
-
-  @Autowired
-  private BizIdGenerator bizIdGenerator;
-
-  @Autowired
-  private IUserTicketOrderItemService userTicketOrderItemService;
-
-	@Autowired
-	private IUserTicketOrderService userTicketOrderService;
-
-	@Autowired
-	private IChannelService channelService;
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void distributeByMarketing(Long userId, String couponId) {
-		Coupon coupon = getById(couponId);
-		UserCoupon userCoupon = getUserCoupon(userId, coupon);
-		userCoupon.setUseAreaDesc(coupon.getUseArea().getDesc());
-		userCouponService.save(userCoupon);
-		boolean rtn = update(new LambdaUpdateWrapper<Coupon>().set(Coupon::getDistributeQty, coupon.getDistributeQty() + 1)
-				.eq(Coupon::getCouponId, coupon.getCouponId()).eq(Coupon::getDistributeQty, coupon.getDistributeQty()));
-		Assert.isTrue(rtn, "发放优惠券奖品,更新优惠券发放量失败。couponId:" + coupon.getCouponId());
-	}
-
-
-	@Override
-  @Transactional(rollbackFor = Exception.class)
-  public void distribute(Ticket ticket, Long userId, String couponId) {
-    Coupon coupon = getById(couponId);
-	UserCoupon userCoupon = getUserCoupon(userId, coupon);
-
-
-		// 确定限定范围
-    if (coupon.getUseArea() == CouponUseAreaEnum.POST_SCOPE) {
-      UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
-			UserTicketOrder ticketOrder = userTicketOrderService.getById(orderItem.getOrderId());
-      if (null == orderItem || null == ticketOrder.getChannelId()) {
-        LogUtil.error(logger, "优惠券的限定使用范围类型为发放时生成,但找不到关联的渠道ID。orderItem:{0}", new Object[]{
-            JSONObject.toJSONString(orderItem)});
-        throw new ServiceException("优惠券发放失败");
-      }
-      UserCouponChannel userCouponChannel = new UserCouponChannel();
-      userCouponChannel.setUserCouponId(userCoupon.getId());
-      userCouponChannel.setChannelId(ticketOrder.getChannelId());
-      userCouponChannelService.save(userCouponChannel);
-			Channel channel = channelService.getById(ticketOrder.getChannelId());
-			userCoupon.setUseAreaDesc(channel.getSiteName());
-    } else {
-			userCoupon.setUseAreaDesc(coupon.getUseArea().getDesc());
-		}
-		userCouponService.save(userCoupon);
-
-		boolean rtn = update(new LambdaUpdateWrapper<Coupon>().set(Coupon::getDistributeQty, coupon.getDistributeQty() + 1)
-				.eq(Coupon::getCouponId, coupon.getCouponId()).eq(Coupon::getDistributeQty, coupon.getDistributeQty()));
-		Assert.isTrue(rtn, "领取优惠券奖品,更新优惠券发放量失败。couponId:" + coupon.getCouponId());
-  }
-
-	private UserCoupon getUserCoupon(Long userId, Coupon coupon) {
-		UserCoupon userCoupon = new UserCoupon();
-		userCoupon.setId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
-		userCoupon.setUserId(userId);
-		userCoupon.setVerifyCode(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
-		userCoupon.setCouponId(coupon.getCouponId());
-		if (coupon.getDueDays() > 0) {
-			userCoupon.setValidStart(DateUtils.getToday());
-			userCoupon.setValidEnd(DateUtils.addDays(userCoupon.getValidStart(), coupon.getDueDays() - 1));
-		} else {
-			userCoupon.setValidStart(coupon.getValidStart());
-			userCoupon.setValidEnd(coupon.getValidEnd());
-		}
-		userCoupon.setStatus(UserCouponStatusEnum.UNUSED);
-		return userCoupon;
-	}
-
-	@Override
-	@Transactional
-	public void saveCoupon(Coupon coupon, List<CouponTicket> ticketList) {
-		boolean res = couponService.save(coupon);
-		if(!res) {
-			throw new ServiceException("请联系管理员");
-		}
-		if(res && null != ticketList
-				&& ticketList.size() > 0) {
-			for(CouponTicket couponTicket:ticketList) {
-				if(null != couponTicket) {
-					couponTicket.setCouponId(coupon.getCouponId());
-				}
-			}
-			boolean skuRes = couponTicketService.saveBatch(ticketList);
-			if(!skuRes) {
-				throw new ServiceException("请联系管理员");
-			}
-		}
-	}
-
-	@Override
-	@Transactional
-	public void updateCoupon(Coupon coupon, List<CouponTicket> ticketList) {
-		boolean res = couponService.updateById(coupon);
-		if(!res) {
-			throw new ServiceException("请联系管理员");
-		}
-		// 多SKU
-		if(res && null != ticketList
-				&& ticketList.size() > 0) {
-			for(CouponTicket couponTicket:ticketList) {
-				if(null != couponTicket) {
-					couponTicket.setCouponId(couponTicket.getCouponId());
-				}
-			}
-
-			LambdaQueryWrapper<CouponTicket> queryWrapper = new LambdaQueryWrapper<>();
-			queryWrapper.eq(CouponTicket::getCouponId, coupon.getCouponId());
-			boolean delRes = couponTicketService.remove(queryWrapper);
-			if(delRes) {
-				boolean skuRes = couponTicketService.saveBatch(ticketList);
-				if(!skuRes) {
-					throw new ServiceException("请联系管理员");
-				}
-			}else {
-				throw new ServiceException("请联系管理员");
-			}
-
-		}
-	}
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    private ICouponService couponService;
+
+    @Autowired
+    private IUserCouponService userCouponService;
+
+    @Autowired
+    private IUserCouponChannelService userCouponChannelService;
+
+    @Autowired
+    private ICouponTicketService couponTicketService;
+
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
+
+    @Autowired
+    private IUserTicketOrderItemService userTicketOrderItemService;
+
+    @Autowired
+    private IUserTicketOrderService userTicketOrderService;
+
+    @Autowired
+    private IChannelService channelService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void distributeByMarketing(Long userId, String couponId) {
+        Coupon coupon = getById(couponId);
+        UserCoupon userCoupon = getUserCoupon(userId, coupon);
+        userCoupon.setUseAreaDesc(coupon.getUseArea().getDesc());
+        userCouponService.save(userCoupon);
+        boolean rtn = update(new LambdaUpdateWrapper<Coupon>().set(Coupon::getDistributeQty, coupon.getDistributeQty() + 1)
+                .eq(Coupon::getCouponId, coupon.getCouponId()).eq(Coupon::getDistributeQty, coupon.getDistributeQty()));
+        Assert.isTrue(rtn, "发放优惠券奖品,更新优惠券发放量失败。couponId:" + coupon.getCouponId());
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void distribute(Ticket ticket, Long userId, String couponId) {
+        Coupon coupon = getById(couponId);
+        UserCoupon userCoupon = getUserCoupon(userId, coupon);
+
+
+        // 确定限定范围
+        if (coupon.getUseArea() == CouponUseAreaEnum.POST_SCOPE) {
+            UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
+            UserTicketOrder ticketOrder = userTicketOrderService.getById(orderItem.getOrderId());
+            if (null == orderItem || null == ticketOrder.getChannelId()) {
+                LogUtil.error(logger, "优惠券的限定使用范围类型为发放时生成,但找不到关联的渠道ID。orderItem:{0}", new Object[]{
+                        JSONObject.toJSONString(orderItem)});
+                throw new ServiceException("优惠券发放失败");
+            }
+            UserCouponChannel userCouponChannel = new UserCouponChannel();
+            userCouponChannel.setUserCouponId(userCoupon.getId());
+            userCouponChannel.setChannelId(ticketOrder.getChannelId());
+            userCouponChannelService.save(userCouponChannel);
+            Channel channel = channelService.getById(ticketOrder.getChannelId());
+            userCoupon.setUseAreaDesc(channel.getSiteName());
+        } else {
+            userCoupon.setUseAreaDesc(coupon.getUseArea().getDesc());
+        }
+        userCouponService.save(userCoupon);
+
+        boolean rtn = update(new LambdaUpdateWrapper<Coupon>().set(Coupon::getDistributeQty, coupon.getDistributeQty() + 1)
+                .eq(Coupon::getCouponId, coupon.getCouponId()).eq(Coupon::getDistributeQty, coupon.getDistributeQty()));
+        Assert.isTrue(rtn, "领取优惠券奖品,更新优惠券发放量失败。couponId:" + coupon.getCouponId());
+    }
+
+    private UserCoupon getUserCoupon(Long userId, Coupon coupon) {
+        UserCoupon userCoupon = new UserCoupon();
+        userCoupon.setId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+        userCoupon.setUserId(userId);
+        userCoupon.setVerifyCode(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+        userCoupon.setCouponId(coupon.getCouponId());
+        if (coupon.getDueDays() > 0) {
+            userCoupon.setValidStart(DateUtils.getToday());
+            userCoupon.setValidEnd(DateUtils.addDays(userCoupon.getValidStart(), coupon.getDueDays() - 1));
+        } else {
+            userCoupon.setValidStart(coupon.getValidStart());
+            userCoupon.setValidEnd(coupon.getValidEnd());
+        }
+        userCoupon.setStatus(UserCouponStatusEnum.UNUSED);
+        return userCoupon;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveCoupon(Coupon coupon, List<CouponTicket> ticketList) {
+        boolean res = couponService.save(coupon);
+        if (!res) {
+            throw new ServiceException("请联系管理员");
+        }
+        if (res && null != ticketList
+                && ticketList.size() > 0) {
+            for (CouponTicket couponTicket : ticketList) {
+                if (null != couponTicket) {
+                    couponTicket.setCouponId(coupon.getCouponId());
+                }
+            }
+            boolean skuRes = couponTicketService.saveBatch(ticketList);
+            if (!skuRes) {
+                throw new ServiceException("请联系管理员");
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateCoupon(Coupon coupon, List<CouponTicket> ticketList) {
+        boolean res = couponService.updateById(coupon);
+        if (!res) {
+            throw new ServiceException("请联系管理员");
+        }
+        // 多SKU
+        if (res && null != ticketList
+                && ticketList.size() > 0) {
+            for (CouponTicket couponTicket : ticketList) {
+                if (null != couponTicket) {
+                    couponTicket.setCouponId(couponTicket.getCouponId());
+                }
+            }
+
+            LambdaQueryWrapper<CouponTicket> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(CouponTicket::getCouponId, coupon.getCouponId());
+            boolean delRes = couponTicketService.remove(queryWrapper);
+            if (delRes) {
+                boolean skuRes = couponTicketService.saveBatch(ticketList);
+                if (!skuRes) {
+                    throw new ServiceException("请联系管理员");
+                }
+            } else {
+                throw new ServiceException("请联系管理员");
+            }
+
+        }
+    }
 }
 }

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

@@ -1,8 +1,10 @@
 package com.qs.mp.admin.service.impl;
 package com.qs.mp.admin.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.GoodsTagRel;
 import com.qs.mp.admin.domain.GoodsTagRel;
+import com.qs.mp.admin.domain.vo.GoodsExportVO;
 import com.qs.mp.admin.mapper.GoodsMapper;
 import com.qs.mp.admin.mapper.GoodsMapper;
 import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.admin.service.IGoodsSkuService;
 import com.qs.mp.admin.service.IGoodsSkuService;
@@ -117,4 +119,9 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 			}
 			}
 		}
 		}
 	}
 	}
+
+	@Override
+	public List<GoodsExportVO> listGoodsExportVOByQueryWrapper(QueryWrapper<Goods> queryWrapper) {
+		return getBaseMapper().listGoodsExportVOByQueryWrapper(queryWrapper);
+	}
 }
 }

+ 13 - 9
mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingServiceImpl.java

@@ -225,12 +225,12 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
         boolean isInside = false;
         boolean isInside = false;
 
 
         // 参与人数不足,全部采用内定人员开奖
         // 参与人数不足,全部采用内定人员开奖
-        if (prizeQuantity >= realNum) {
-            insideNum = prizeQuantity;
-            isInside = true;
-        } else {
+//        if (prizeQuantity >= realNum) {
+//            insideNum = prizeQuantity;
+//            isInside = true;
+//        } else {
             insideNum = marketingAwardsList.stream().mapToInt(MarketingAwards::getInsideNum).sum();
             insideNum = marketingAwardsList.stream().mapToInt(MarketingAwards::getInsideNum).sum();
-        }
+//        }
 
 
         // 获取一定数量的内定人员设置抽奖码加入抽奖关系表和抽奖池
         // 获取一定数量的内定人员设置抽奖码加入抽奖关系表和抽奖池
         List<SysUser> insideUserList = sysUserService.selectUserListByRand(UserTypeEnum.INSIDE.getValue(), insideNum);
         List<SysUser> insideUserList = sysUserService.selectUserListByRand(UserTypeEnum.INSIDE.getValue(), insideNum);
@@ -336,6 +336,9 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
                     if (CollectionUtils.isEmpty(hitCodeList)) {
                     if (CollectionUtils.isEmpty(hitCodeList)) {
                         hitCodeList = redisCache.popCacheSet(userLowLotteryPool, 1);
                         hitCodeList = redisCache.popCacheSet(userLowLotteryPool, 1);
                     }
                     }
+                    if (CollectionUtils.isEmpty(hitCodeList)) {
+                        break;
+                    }
                     MarketingUserCode marketingUserCode = marketingUserCodeService.getOne(new LambdaQueryWrapper<MarketingUserCode>()
                     MarketingUserCode marketingUserCode = marketingUserCodeService.getOne(new LambdaQueryWrapper<MarketingUserCode>()
                             .eq(MarketingUserCode::getMarketingId, marketing.getId())
                             .eq(MarketingUserCode::getMarketingId, marketing.getId())
                             .eq(MarketingUserCode::getCode, hitCodeList.get(0)));
                             .eq(MarketingUserCode::getCode, hitCodeList.get(0)));
@@ -605,14 +608,12 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
      * @param marketing
      * @param marketing
      */
      */
     private void createAwardsAndPrize(List<MarketingAwardsParam> awardsList, Marketing marketing) {
     private void createAwardsAndPrize(List<MarketingAwardsParam> awardsList, Marketing marketing) {
-        int sum = awardsList.stream().mapToInt(MarketingAwardsParam::getQuantity).sum();
-        if (sum > 100) {
-            throw new ServiceException("中奖名额不能超过100");
-        }
 
 
+        int insideNum = 0;
         // 创建奖级
         // 创建奖级
         List<MarketingAwardsPrize> marketingAwardsPrizeList = new ArrayList<>();
         List<MarketingAwardsPrize> marketingAwardsPrizeList = new ArrayList<>();
         for (MarketingAwardsParam awardsParam : awardsList) {
         for (MarketingAwardsParam awardsParam : awardsList) {
+            insideNum += awardsParam.getInsideNum();
             if (awardsParam.getInsideNum() > awardsParam.getQuantity()) {
             if (awardsParam.getInsideNum() > awardsParam.getQuantity()) {
                 throw new ServiceException("内定数量不能大于奖品数量");
                 throw new ServiceException("内定数量不能大于奖品数量");
             }
             }
@@ -656,6 +657,9 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
                 marketingAwardsPrizeList.add(awardsPrize);
                 marketingAwardsPrizeList.add(awardsPrize);
             }
             }
         }
         }
+        if (insideNum > 100) {
+            throw new ServiceException("内定人数不能超过100");
+        }
         marketingAwardsPrizeService.saveBatch(marketingAwardsPrizeList);
         marketingAwardsPrizeService.saveBatch(marketingAwardsPrizeList);
     }
     }
 
 

+ 10 - 0
mp-service/src/main/java/com/qs/mp/system/domain/SysUser.java

@@ -104,6 +104,16 @@ public class SysUser extends BaseEntity
     private String unionId;  //用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回
     private String unionId;  //用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回
     private String sessionKey; //会话密钥
     private String sessionKey; //会话密钥
 
 
+    private String aliuserId; // 支付宝小程序userId
+
+    public String getAliuserId() {
+        return aliuserId;
+    }
+
+    public void setAliuserId(String aliuserId) {
+        this.aliuserId = aliuserId;
+    }
+
     public String getUserType() {
     public String getUserType() {
         return userType;
         return userType;
     }
     }

+ 1 - 1
mp-service/src/main/java/com/qs/mp/user/domain/UserCoupon.java

@@ -72,7 +72,7 @@ public class UserCoupon implements Serializable {
   /**
   /**
    * 适用范围说明
    * 适用范围说明
    */
    */
-  @ApiModelProperty("适用范围说明")
+  @ApiModelProperty("使用范围;0通用, 1指定范围, 2门店消费,发放时动态指定范围, 3线上票, 4线下票")
   @TableField("use_area_desc")
   @TableField("use_area_desc")
   private String useAreaDesc;
   private String useAreaDesc;
 
 

+ 11 - 4
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserShareVO.java

@@ -1,5 +1,7 @@
 package com.qs.mp.user.domain.vo;
 package com.qs.mp.user.domain.vo;
 
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
 /**
 /**
@@ -7,10 +9,15 @@ import lombok.Data;
  * @Date 2022/3/31
  * @Date 2022/3/31
  */
  */
 @Data
 @Data
+@ApiModel("用户分享VO")
 public class UserShareVO {
 public class UserShareVO {
-  private Long suid; // 分享者uid
-  private String type; // 分享者类型
+  @ApiModelProperty("分享者uid")
+  private Long suid;
+  @ApiModelProperty("分享者类型")
+  private String type;
 
 
-  public static final String SHARE_TYPE_USER = "1"; // 用户分享
-  public static final String SHARE_TYPE_SITE = "2"; // 经销商分享
+  @ApiModelProperty("用户分享")
+  public static final String SHARE_TYPE_USER = "1";
+  @ApiModelProperty("经销商分享")
+  public static final String SHARE_TYPE_SITE = "2";
 }
 }

+ 499 - 497
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -42,6 +42,7 @@ import com.qs.mp.user.mapper.UserTicketOrderMapper;
 import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.user.service.IUserTicketOrderService;
+
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.Arrays;
@@ -49,6 +50,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
+
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.aop.framework.AopContext;
 import org.springframework.aop.framework.AopContext;
@@ -68,555 +70,555 @@ import org.springframework.util.Assert;
  */
  */
 @Service
 @Service
 public class UserTicketOrderServiceImpl extends
 public class UserTicketOrderServiceImpl extends
-    ServiceImpl<UserTicketOrderMapper, UserTicketOrder> implements IUserTicketOrderService {
+        ServiceImpl<UserTicketOrderMapper, UserTicketOrder> implements IUserTicketOrderService {
 
 
-  protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 
 
-  @Autowired
-  private ITicketBoxService ticketBoxService;
+    @Autowired
+    private ITicketBoxService ticketBoxService;
 
 
-  @Autowired
-  private IUserCouponService userCouponService;
+    @Autowired
+    private IUserCouponService userCouponService;
 
 
-  @Autowired
-  private IChannelUserRelService channelUserRelService;
+    @Autowired
+    private IChannelUserRelService channelUserRelService;
 
 
-  @Autowired
-  private IChannelOrderDetailService channelOrderDetailService;
+    @Autowired
+    private IChannelOrderDetailService channelOrderDetailService;
 
 
-  @Autowired
-  private IUserTicketOrderItemService userTicketOrderItemService;
+    @Autowired
+    private IUserTicketOrderItemService userTicketOrderItemService;
 
 
-  @Autowired
-  private ITicketService ticketService;
+    @Autowired
+    private ITicketService ticketService;
 
 
-  @Autowired
-  private IChannelService channelService;
+    @Autowired
+    private IChannelService channelService;
 
 
-  @Autowired
-  private IChannelCommissionService channelCommissionService;
+    @Autowired
+    private IChannelCommissionService channelCommissionService;
 
 
-  @Autowired
-  private IChannelMoneyLogService channelMoneyLogService;
+    @Autowired
+    private IChannelMoneyLogService channelMoneyLogService;
 
 
-  @Autowired
-  private ITicketPackageService ticketPackageService;
+    @Autowired
+    private ITicketPackageService ticketPackageService;
 
 
-  @Autowired
-  private IChannelOrderService channelOrderService;
+    @Autowired
+    private IChannelOrderService channelOrderService;
 
 
-  @Autowired
-  private IChannelOrderItemService channelOrderItemService;
+    @Autowired
+    private IChannelOrderItemService channelOrderItemService;
 
 
-  @Autowired
-  private BizIdGenerator bizIdGenerator;
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
 
 
-  @Autowired
-  private RedisCache redisCache;
+    @Autowired
+    private RedisCache redisCache;
 
 
-  @Autowired
-  private IAsyncTaskService asyncTaskService;
+    @Autowired
+    private IAsyncTaskService asyncTaskService;
 
 
-  @Autowired
-  private DistributedLocker distributedLocker;
+    @Autowired
+    private DistributedLocker distributedLocker;
+
+    @Override
+    public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO,
+                              UserShareVO userShareVO) {
+        UserTicketOrderServiceImpl proxy = (UserTicketOrderServiceImpl) AopContext.currentProxy();
+        if (StringUtils.isBlank(orderSettleVO.getTicketId())) {
+            String lockKey = RedisLockKey.build(RedisLockKey.CREATED_ONLINE_TICKET_ORDER_KEY, orderSettleVO.getBoxId());
+            if (!distributedLocker.tryLock(lockKey)) {
+                throw new ServiceException("该票太火爆了,请稍后再试!");
+            }
+            try {
+                return proxy.createOnlineOrder(userId, orderSettleVO, userShareVO);
+            } finally {
+                distributedLocker.unlock(lockKey);
+            }
+        }
 
 
-  @Override
-  public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO,
-      UserShareVO userShareVO) {
-    UserTicketOrderServiceImpl proxy = (UserTicketOrderServiceImpl) AopContext.currentProxy();
-    if (StringUtils.isBlank(orderSettleVO.getTicketId())) {
-      String lockKey = RedisLockKey.build(RedisLockKey.CREATED_ONLINE_TICKET_ORDER_KEY, orderSettleVO.getBoxId());
-      if (!distributedLocker.tryLock(lockKey)) {
-        throw new ServiceException("该票太火爆了,请稍后再试!");
-      }
-      try {
-        return proxy.createOnlineOrder(userId, orderSettleVO, userShareVO);
-      } finally {
-        distributedLocker.unlock(lockKey);
-      }
+        // 线下票不需锁库存,待付款成功后再更新票组销量
+        return proxy.createOfflineOrder(userId, orderSettleVO);
     }
     }
 
 
-    // 线下票不需锁库存,待付款成功后再更新票组销量
-    return proxy.createOfflineOrder(userId, orderSettleVO);
-  }
-
-  @Transactional(rollbackFor = Exception.class)
-  public String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO,
-      UserShareVO userShareVO) {
-    // 线上票更新票组销量,防止超卖
-    TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
-    if (ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
-        || ticketBox.getSaleQty() + orderSettleVO.getOrderNum() > ticketBox.getQuantity()) {
-      LogUtil.error(logger, "库存不足,boxId:{0},qty:{1},saleQty:{2},orderNum:{3}",
-          ticketBox.getBoxId(), ticketBox.getQuantity(), ticketBox.getSaleQty(),
-          orderSettleVO.getOrderNum());
-      throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1020);
+    @Transactional(rollbackFor = Exception.class)
+    public String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO,
+                                    UserShareVO userShareVO) {
+        // 线上票更新票组销量,防止超卖
+        TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
+        if (ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
+                || ticketBox.getSaleQty() + orderSettleVO.getOrderNum() > ticketBox.getQuantity()) {
+            LogUtil.error(logger, "库存不足,boxId:{0},qty:{1},saleQty:{2},orderNum:{3}",
+                    ticketBox.getBoxId(), ticketBox.getQuantity(), ticketBox.getSaleQty(),
+                    orderSettleVO.getOrderNum());
+            throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1020);
+        }
+        boolean rst = ticketBoxService.update(
+                new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
+                                ticketBox.getSaleQty() + orderSettleVO.getOrderNum())
+                        .set(ticketBox.getSaleQty() + orderSettleVO.getOrderNum() == ticketBox.getQuantity(),
+                                TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
+                        .eq(TicketBox::getBoxId, ticketBox.getBoxId())
+                        .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
+        Assert.isTrue(rst,
+                "盲票购买订单创建时,更新盲票销量失败。boxId:" + ticketBox.getBoxId() + "saleQty:" + ticketBox.getSaleQty());
+
+        // 核销优惠券
+        String couponIds = verifyUserCoupon(orderSettleVO.getCouponList());
+
+        // 创建订单
+        UserTicketOrder userTicketOrder = new UserTicketOrder();
+        userTicketOrder.setOrderId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+        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());
+        userTicketOrder.setTicketNum(orderSettleVO.getOrderNum());
+        userTicketOrder.setMemo("");
+        userTicketOrder.setResource(TicketTypeEnum.ONLINE);
+        userTicketOrder.setCouponInfo(couponIds);
+        userTicketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
+        if (orderSettleVO.getPayAmt() == 0) {
+            userTicketOrder.setCommStatus(CommStatusEnum.YES); // 无需结佣,直接置为已结佣
+        }
+
+        // 查询用户的所属经销商,线上票直接查询
+        ChannelUserRel channelUserRel = channelUserRelService.getOne(
+                new LambdaQueryWrapper<ChannelUserRel>()
+                        .eq(ChannelUserRel::getUserId, userId));
+        if (null != channelUserRel) {
+            userTicketOrder.setChannelId(channelUserRel.getChannelId());
+        } else {
+            // 没被绑定,看有没有分享者
+            if (null != userShareVO.getSuid() && 0 != userShareVO.getSuid()) {
+                if (UserShareVO.SHARE_TYPE_USER.equals(userShareVO.getType())) {
+                    ChannelUserRel channelShareUserRel = channelUserRelService.getOne(
+                            new LambdaQueryWrapper<ChannelUserRel>()
+                                    .eq(ChannelUserRel::getUserId, userShareVO.getSuid()));
+                    if (null != channelShareUserRel) {
+                        userTicketOrder.setChannelId(channelShareUserRel.getChannelId());
+                        userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
+                    }
+                } else if (UserShareVO.SHARE_TYPE_SITE.equals(userShareVO.getType())) {
+                    Channel channel = channelService.getOne(
+                            new LambdaQueryWrapper<Channel>()
+                                    .eq(Channel::getUserId, userShareVO.getSuid()));
+                    if (null != channel) {
+                        userTicketOrder.setChannelId(channel.getChannelId());
+                        userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
+                    }
+                }
+            }
+        }
+        save(userTicketOrder);
+
+        for (int i = 0; i < orderSettleVO.getOrderNum(); i++) {
+            UserTicketOrderItem orderItem = new UserTicketOrderItem();
+            orderItem.setItemId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+            orderItem.setOrderId(userTicketOrder.getOrderId());
+            orderItem.setUserId(userId);
+            orderItem.setBoxId(ticketBox.getBoxId());
+            orderItem.setTicketId(null); // 付款成功后再分配具体盲票
+            // 保存名称和图片快照
+            orderItem.setTitle(ticketBox.getTitle());
+            orderItem.setPicUrl(ticketBox.getPicUrl());
+            userTicketOrderItemService.save(orderItem);
+        }
+
+        if (orderSettleVO.getPayAmt() == 0) {
+            // 无需支付的,直接置为成功
+            processTicketOrder(userTicketOrder);
+            // 插入付款异步任务
+            Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, userTicketOrder.getOrderId()), "盲票支付,创建异步任务失败:" + userTicketOrder.getOrderId());
+        }
+
+        return userTicketOrder.getOrderId();
     }
     }
-    boolean rst = ticketBoxService.update(
-        new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
-                ticketBox.getSaleQty() + orderSettleVO.getOrderNum())
-            .set(ticketBox.getSaleQty() + orderSettleVO.getOrderNum() == ticketBox.getQuantity(),
-                TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
-            .eq(TicketBox::getBoxId, ticketBox.getBoxId())
-            .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
-    Assert.isTrue(rst,
-        "盲票购买订单创建时,更新盲票销量失败。boxId:" + ticketBox.getBoxId() + "saleQty:" + ticketBox.getSaleQty());
-
-    // 核销优惠券
-    String couponIds = verifyUserCoupon(orderSettleVO.getCouponList());
-
-    // 创建订单
-    UserTicketOrder userTicketOrder = new UserTicketOrder();
-    userTicketOrder.setOrderId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
-    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());
-    userTicketOrder.setTicketNum(orderSettleVO.getOrderNum());
-    userTicketOrder.setMemo("");
-    userTicketOrder.setResource(TicketTypeEnum.ONLINE);
-    userTicketOrder.setCouponInfo(couponIds);
-    userTicketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
-    if (orderSettleVO.getPayAmt() == 0) {
-      userTicketOrder.setCommStatus(CommStatusEnum.YES); // 无需结佣,直接置为已结佣
+
+    @Transactional(rollbackFor = Exception.class)
+    public String createOfflineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+        Ticket ticket = ticketService.getById(orderSettleVO.getTicketId());
+        Assert.isTrue(ticket.getStatus() == TicketStatusEnum.NOT_PAY,
+                "盲票已付款,ticketId:" + ticket.getTicketId());
+        if (null != redisCache.getCacheObject(
+                RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()))) {
+            LogUtil.warn(logger, "线下盲票重复购买,ticketNo:{0}", ticket.getSerialNo());
+            throw new ServiceException("重复购买,请稍后再试");
+        }
+        redisCache.setCacheObject(RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()),
+                userId, 5, TimeUnit.MINUTES);
+
+        // 核销优惠券
+        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(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());
+        ticketOrder.setTicketNum(1);
+        ticketOrder.setMemo("");
+        ticketOrder.setResource(TicketTypeEnum.OFFLINE);
+        ticketOrder.setCouponInfo(couponIds);
+        ticketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
+        if (orderSettleVO.getPayAmt() == 0) {
+            ticketOrder.setCommStatus(CommStatusEnum.YES); // 无需结佣,直接置为已结佣
+        }
+        // 查询用户的所属经销商,线下票根据票包查询
+        ChannelOrderDetail channelOrderDetail = channelOrderDetailService.getOne(
+                new LambdaQueryWrapper<ChannelOrderDetail>()
+                        .eq(ChannelOrderDetail::getPkgId, ticket.getPkgId()));
+        if (null == channelOrderDetail) {
+            LogUtil.error(logger, "线下票,根据票包ID查询购买渠道为空。ticketId:{0}, pkgId{1}",
+                    ticket.getTicketId(), ticket.getPkgId());
+        } else {
+            ticketOrder.setChannelId(channelOrderDetail.getChannelId());
+        }
+        save(ticketOrder);
+
+        UserTicketOrderItem orderItem = new UserTicketOrderItem();
+        orderItem.setItemId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+        orderItem.setOrderId(ticketOrder.getOrderId());
+        orderItem.setUserId(userId);
+        orderItem.setBoxId(ticket.getBoxId());
+        orderItem.setTicketId(ticket.getTicketId());
+        // 保存名称和图片快照
+        orderItem.setTitle(orderSettleVO.getTitle());
+        orderItem.setPicUrl(orderSettleVO.getPicUrl());
+        userTicketOrderItemService.save(orderItem);
+
+        if (orderSettleVO.getPayAmt() == 0) {
+            // 无需支付的,直接置为成功
+            processTicketOrder(ticketOrder);
+
+            // 插入付款异步任务
+            Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, ticketOrder.getOrderId()), "盲票支付,创建异步任务失败:" + ticketOrder.getOrderId());
+
+        }
+        return ticketOrder.getOrderId();
+    }
+
+    private String verifyUserCoupon(List<UserCoupon4OrderVO> userCouponVOList) {
+        StringBuilder sb = new StringBuilder();
+        for (UserCoupon4OrderVO userCouponVO : userCouponVOList) {
+            UserCoupon userCoupon = userCouponService.getById(userCouponVO.getId());
+            userCoupon.setVerifyTime(new Date());
+            userCoupon.setStatus(UserCouponStatusEnum.USED);
+            boolean rst = userCouponService.updateById(userCoupon);
+            Assert.isTrue(rst, "盲票购买订单创建时,核销优惠券失败。userCoupon:" + JSONObject.toJSONString(userCoupon));
+            sb.append(userCouponVO.getId()).append(",");
+        }
+        if (sb.length() > 0) {
+            return sb.substring(0, sb.length() - 1);
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional
+    public boolean batchCancelOrder(String boxId, List<String> orderIds) {
+        int sumTicket = 0;
+        for (String orderId : orderIds) {
+            UserTicketOrder userTicketOrder = getById(orderId);
+            Assert.isTrue(userTicketOrder.getResource() == TicketTypeEnum.ONLINE,
+                    "非在线盲票不用取消。boxId:" + boxId);
+            if (!rollbackOrder(userTicketOrder)) {
+                return false;
+            }
+            sumTicket += userTicketOrder.getTicketNum();
+        }
+        rollbackBoxQty(boxId, sumTicket);
+        return true;
+    }
+
+    private void rollbackBoxQty(String boxId, int qty) {
+        TicketBox ticketBox = ticketBoxService.getById(boxId);
+        boolean updateBox = ticketBoxService.update(
+                new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
+                                ticketBox.getSaleQty() - qty)
+                        .set(
+                                ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
+                                        && ticketBox.getManualOff() != 1,
+                                TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+                        .eq(TicketBox::getBoxId, ticketBox.getBoxId())
+                        .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
+        Assert.isTrue(updateBox, "取消过期未支付盲票购买订单,恢复票组销量失败。boxId:{0}" + boxId);
     }
     }
 
 
-    // 查询用户的所属经销商,线上票直接查询
-    ChannelUserRel channelUserRel = channelUserRelService.getOne(
-        new LambdaQueryWrapper<ChannelUserRel>()
-            .eq(ChannelUserRel::getUserId, userId));
-    if (null != channelUserRel) {
-      userTicketOrder.setChannelId(channelUserRel.getChannelId());
-    } else {
-      // 没被绑定,看有没有分享者
-      if (null != userShareVO.getSuid() && 0 != userShareVO.getSuid()) {
-        if (UserShareVO.SHARE_TYPE_USER.equals(userShareVO.getType())) {
-          ChannelUserRel channelShareUserRel = channelUserRelService.getOne(
-              new LambdaQueryWrapper<ChannelUserRel>()
-                  .eq(ChannelUserRel::getUserId, userShareVO.getSuid()));
-          if (null != channelShareUserRel) {
-            userTicketOrder.setChannelId(channelShareUserRel.getChannelId());
-            userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
-          }
-        } else if (UserShareVO.SHARE_TYPE_SITE.equals(userShareVO.getType())) {
-          Channel channel = channelService.getOne(
-              new LambdaQueryWrapper<Channel>()
-                  .eq(Channel::getUserId, userShareVO.getSuid()));
-          if (null != channel) {
-            userTicketOrder.setChannelId(channel.getChannelId());
-            userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
-          }
+    @Override
+    @Transactional
+    public boolean cancelOrder(String orderId) {
+        UserTicketOrder userTicketOrder = getById(orderId);
+
+        if (!rollbackOrder(userTicketOrder)) {
+            return false;
+        }
+
+        if (userTicketOrder.getResource() == TicketTypeEnum.ONLINE) {
+            rollbackBoxQty(userTicketOrder.getBoxId(), userTicketOrder.getTicketNum());
         }
         }
-      }
+
+        return true;
     }
     }
-    save(userTicketOrder);
-
-    for (int i = 0; i < orderSettleVO.getOrderNum(); i++) {
-      UserTicketOrderItem orderItem = new UserTicketOrderItem();
-      orderItem.setItemId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
-      orderItem.setOrderId(userTicketOrder.getOrderId());
-      orderItem.setUserId(userId);
-      orderItem.setBoxId(ticketBox.getBoxId());
-      orderItem.setTicketId(null); // 付款成功后再分配具体盲票
-      // 保存名称和图片快照
-      orderItem.setTitle(ticketBox.getTitle());
-      orderItem.setPicUrl(ticketBox.getPicUrl());
-      userTicketOrderItemService.save(orderItem);
+
+    private boolean rollbackOrder(UserTicketOrder userTicketOrder) {
+        if (userTicketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
+            LogUtil.warn(logger, "取消购票订单时,订单状态不是待支付,忽略。orderId:{0}, status:{1}",
+                    userTicketOrder.getOrderId(), userTicketOrder.getStatus());
+            return false;
+        }
+
+        if (StringUtils.isNotBlank(userTicketOrder.getCouponInfo())) {
+            // 优惠券反核销
+            List<String> userCouponIds = Arrays.asList(userTicketOrder.getCouponInfo().split(","));
+            boolean rst = userCouponService.update(new LambdaUpdateWrapper<UserCoupon>()
+                    .set(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED)
+                    .set(UserCoupon::getVerifyTime, null)
+                    .in(UserCoupon::getId, userCouponIds));
+            Assert.isTrue(rst,
+                    "盲票购买订单取消时,反核销优惠券失败。orderId:" + userTicketOrder.getOrderId() + "userCouponIds:"
+                            + userTicketOrder.getCouponInfo());
+        }
+
+        boolean rst = update(new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus,
+                        UserTicketOrderStatusEnum.CANCELED)
+                .eq(UserTicketOrder::getOrderId, userTicketOrder.getOrderId())
+                .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
+        Assert.isTrue(rst, "盲票购买订单取消时,更新订单状态失败。orderId:" + userTicketOrder.getOrderId());
+        return true;
     }
     }
 
 
-    if (orderSettleVO.getPayAmt() == 0) {
-      // 无需支付的,直接置为成功
-      processTicketOrder(userTicketOrder);
-      // 插入付款异步任务
-      Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, userTicketOrder.getOrderId()),"盲票支付,创建异步任务失败:" + userTicketOrder.getOrderId());
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean paySuccess(PayOrder payOrder) {
+        UserTicketOrder ticketOrder = getById(payOrder.getBizId());
+        if (null == ticketOrder || ticketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
+            LogUtil.error(logger, "支付回调用户购票订单处理,订单状态异常,不是待支付。payOrder:{0}, ticketOrder:{1}",
+                    JSONObject.toJSONString(payOrder), JSONObject.toJSONString(ticketOrder));
+            throw new ServiceException("支付回调用户购票订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
+        }
+        ticketOrder.setPayTime(DateUtils.parseDate(payOrder.getCompleteDate()));
+
+        // 插入异步任务
+        Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, payOrder.getBizId()), "创建支付成功异步任务失败. orderId:" + payOrder.getOrderId());
+        return processTicketOrder(ticketOrder);
     }
     }
 
 
-    return userTicketOrder.getOrderId();
-  }
-
-  @Transactional(rollbackFor = Exception.class)
-  public String createOfflineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
-    Ticket ticket = ticketService.getById(orderSettleVO.getTicketId());
-    Assert.isTrue(ticket.getStatus() == TicketStatusEnum.NOT_PAY,
-        "盲票已付款,ticketId:" + ticket.getTicketId());
-    if (null != redisCache.getCacheObject(
-        RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()))) {
-      LogUtil.warn(logger, "线下盲票重复购买,ticketNo:{0}", ticket.getSerialNo());
-      throw new ServiceException("重复购买,请稍后再试");
+    private boolean processTicketOrder(UserTicketOrder ticketOrder) {
+        List<UserTicketOrderItem> orderItemList = userTicketOrderItemService.list(
+                new LambdaQueryWrapper<UserTicketOrderItem>()
+                        .eq(UserTicketOrderItem::getOrderId, ticketOrder.getOrderId()));
+
+        for (UserTicketOrderItem orderItem : orderItemList) {
+            Ticket ticket;
+            if (ticketOrder.getResource() == TicketTypeEnum.ONLINE) {
+                // 线上票,要先分配票ticketId
+                ticket = ticketService.getRandOne(ticketOrder.getBoxId());
+                orderItem.setTicketId(ticket.getTicketId());
+                boolean rst = userTicketOrderItemService.updateById(orderItem);
+                Assert.isTrue(rst, "支付回调用户购票订单处理,更新订单明细的盲票ID失败,itemId:" + orderItem.getItemId());
+            } else {
+                ticket = ticketService.getById(orderItem.getTicketId());
+            }
+
+            // 开幸运数字,更新ticket状态为已激活
+            boolean rtn = ticketService.update(
+                    new LambdaUpdateWrapper<Ticket>().set(Ticket::getPlainLuckyNum,
+                                    Integer.valueOf(RSAUtil.decrypt(ticket.getCipherLuckyNum())))
+                            .set(Ticket::getStatus, TicketStatusEnum.ACTIVATED)
+                            .eq(Ticket::getTicketId, ticket.getTicketId()));
+            Assert.isTrue(rtn, "支付回调用户购票订单处理,更新盲票状态失败,ticketId:" + ticket.getTicketId());
+
+        }
+
+        // 更新订单状态为已完成
+        boolean updateRst = update(
+                new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus,
+                                UserTicketOrderStatusEnum.FINISHED)
+                        .set(UserTicketOrder::getPayTime, ticketOrder.getPayTime())
+                        .eq(UserTicketOrder::getOrderId, ticketOrder.getOrderId())
+                        .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
+        Assert.isTrue(updateRst, "支付回调用户购票订单处理,更新订单状态失败,orderId:" + ticketOrder.getOrderId());
+
+        return true;
     }
     }
-    redisCache.setCacheObject(RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()),
-        userId, 5, TimeUnit.MINUTES);
-
-    // 核销优惠券
-    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(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());
-    ticketOrder.setTicketNum(1);
-    ticketOrder.setMemo("");
-    ticketOrder.setResource(TicketTypeEnum.OFFLINE);
-    ticketOrder.setCouponInfo(couponIds);
-    ticketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
-    if (orderSettleVO.getPayAmt() == 0) {
-      ticketOrder.setCommStatus(CommStatusEnum.YES); // 无需结佣,直接置为已结佣
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean commToChannel(String orderId, Integer resource) {
+        ChannelCommParam channelCommParam = new ChannelCommParam();
+        if (ChannelCommissionResourceEnum.USER.getValue().equals(resource)) {
+            UserTicketOrder ticketOrder = getById(orderId);
+            BeanUtils.copyProperties(ticketOrder, channelCommParam);
+            Assert.isTrue(channelCommParam.getCommStatus() != CommStatusEnum.YES,
+                    "结佣处理,结佣状态异常,不是结佣中或未结佣。orderId=" + orderId);
+        } else {
+            ChannelOrder channelOrder = channelOrderService.getById(orderId);
+            ChannelOrderItem channelOrderItem = channelOrderItemService.getOne(new LambdaQueryWrapper<ChannelOrderItem>()
+                    .eq(ChannelOrderItem::getOrderId, orderId));
+            channelCommParam.setBoxId(channelOrderItem.getBoxId());
+            channelCommParam.setChannelId(channelOrder.getChannelId());
+            channelCommParam.setOrderId(channelOrder.getOrderId());
+            channelCommParam.setPayAmt(channelOrder.getPayAmt());
+        }
+        if (channelCommParam.getPayAmt() == 0) {
+            return true;
+        }
+        if (null != channelCommParam.getChannelId()) {
+            // 线下购票,优先给当前票的经销商渠道分润
+            TicketBox ticketBox = ticketBoxService.getById(channelCommParam.getBoxId());
+            Channel channel = channelService.getById(channelCommParam.getChannelId());
+            ChannelCommission siteCommission = saveSiteCommAmt(channelCommParam, ticketBox, channel);
+            // 经销商账户余额增加
+            changeMoney(channel, siteCommission);
+
+            int sumCommAmt = siteCommission.getCommAmt();
+            // 渠道分润
+            while (channel.getParentId() > 0) {
+                channel = channelService.getById(channel.getParentId());
+                ChannelCommission channelCommission = new ChannelCommission();
+                channelCommission.setChannelId(channel.getChannelId());
+                channelCommission.setOrderId(siteCommission.getOrderId());
+                channelCommission.setResource(resource);
+                channelCommission.setBoxId(siteCommission.getBoxId());
+                channelCommission.setSaleAmt(siteCommission.getSaleAmt());
+                channelCommission.setSaleCommRate(siteCommission.getSaleCommRate());
+                channelCommission.setSaleCommAmt(siteCommission.getSaleCommAmt());
+                channelCommission.setCommRate(channel.getCommRate());
+                channelCommission.setCommAmt(new BigDecimal(channelCommission.getSaleCommAmt()).multiply(
+                                channelCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
+                        .intValue() - sumCommAmt);
+                channelCommissionService.save(channelCommission);
+                sumCommAmt += channelCommission.getCommAmt();
+            }
+        } else {
+            LogUtil.info(logger, "渠道结佣时,订单对应的渠道不存在,无需结佣。orderId:{0}",
+                    channelCommParam.getOrderId());
+        }
+        if (ChannelCommissionResourceEnum.USER.getValue().equals(resource)) {
+            boolean rst = update(
+                    new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus,
+                                    CommStatusEnum.YES)
+                            .eq(UserTicketOrder::getOrderId, orderId)
+                            .in(UserTicketOrder::getCommStatus, CommStatusEnum.DOING, CommStatusEnum.NO));
+            Assert.isTrue(rst, "渠道结佣完成,更新订单状态失败。orderId:" + orderId);
+        }
+        return true;
     }
     }
-    // 查询用户的所属经销商,线下票根据票包查询
-    ChannelOrderDetail channelOrderDetail = channelOrderDetailService.getOne(
-        new LambdaQueryWrapper<ChannelOrderDetail>()
-            .eq(ChannelOrderDetail::getPkgId, ticket.getPkgId()));
-    if (null == channelOrderDetail) {
-      LogUtil.error(logger, "线下票,根据票包ID查询购买渠道为空。ticketId:{0}, pkgId{1}",
-          ticket.getTicketId(), ticket.getPkgId());
-    } else {
-      ticketOrder.setChannelId(channelOrderDetail.getChannelId());
+
+    private void changeMoney(Channel channel, ChannelCommission siteCommission) {
+        ChannelMoneyLog moneyLog = new ChannelMoneyLog();
+        moneyLog.setChannelId(channel.getChannelId());
+        moneyLog.setType(ChannelMoneyEnum.COMMISSION);
+        moneyLog.setLogMoney(siteCommission.getCommAmt());
+        moneyLog.setBizTime(new Date());
+        moneyLog.setRefId(String.valueOf(siteCommission.getId()));
+        channelMoneyLogService.changeMoney(moneyLog);
     }
     }
-    save(ticketOrder);
-
-    UserTicketOrderItem orderItem = new UserTicketOrderItem();
-    orderItem.setItemId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
-    orderItem.setOrderId(ticketOrder.getOrderId());
-    orderItem.setUserId(userId);
-    orderItem.setBoxId(ticket.getBoxId());
-    orderItem.setTicketId(ticket.getTicketId());
-    // 保存名称和图片快照
-    orderItem.setTitle(orderSettleVO.getTitle());
-    orderItem.setPicUrl(orderSettleVO.getPicUrl());
-    userTicketOrderItemService.save(orderItem);
-
-    if (orderSettleVO.getPayAmt() == 0) {
-      // 无需支付的,直接置为成功
-      processTicketOrder(ticketOrder);
-
-      // 插入付款异步任务
-      Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, ticketOrder.getOrderId()),"盲票支付,创建异步任务失败:" + ticketOrder.getOrderId());
 
 
+    private ChannelCommission saveSiteCommAmt(ChannelCommParam channelCommParam, TicketBox ticketBox,
+                                              Channel channel) {
+        ChannelCommission siteCommission = new ChannelCommission();
+        siteCommission.setChannelId(channel.getChannelId());
+        siteCommission.setOrderId(channelCommParam.getOrderId());
+        siteCommission.setBoxId(channelCommParam.getBoxId());
+        siteCommission.setSaleAmt(channelCommParam.getPayAmt());
+        siteCommission.setSaleCommRate(ticketBox.getSaleCommRate());
+        siteCommission.setSaleCommAmt(new BigDecimal(siteCommission.getSaleAmt()).multiply(
+                        siteCommission.getSaleCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
+                .intValue());
+        siteCommission.setCommRate(channel.getCommRate());
+        siteCommission.setCommAmt(new BigDecimal(siteCommission.getSaleCommAmt()).multiply(
+                siteCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN).intValue());
+        channelCommissionService.save(siteCommission);
+        return siteCommission;
     }
     }
-    return ticketOrder.getOrderId();
-  }
-
-  private String verifyUserCoupon(List<UserCoupon4OrderVO> userCouponVOList) {
-    StringBuilder sb = new StringBuilder();
-    for (UserCoupon4OrderVO userCouponVO : userCouponVOList) {
-      UserCoupon userCoupon = userCouponService.getById(userCouponVO.getId());
-      userCoupon.setVerifyTime(new Date());
-      userCoupon.setStatus(UserCouponStatusEnum.USED);
-      boolean rst = userCouponService.updateById(userCoupon);
-      Assert.isTrue(rst, "盲票购买订单创建时,核销优惠券失败。userCoupon:" + JSONObject.toJSONString(userCoupon));
-      sb.append(userCouponVO.getId()).append(",");
+
+    @Override
+    public List<IndexVO> selectIndexPayAmtList(Wrapper<UserTicketOrder> wrapper) {
+        return getBaseMapper().selectIndexPayAmtList(wrapper);
     }
     }
-    if (sb.length() > 0) {
-      return sb.substring(0, sb.length() - 1);
+
+    @Override
+    public List<IndexVO> selectIndexPayUserCntList(Wrapper<UserTicketOrder> wrapper) {
+        return getBaseMapper().selectIndexPayUserCntList(wrapper);
     }
     }
-    return sb.toString();
-  }
-
-  @Override
-  @Transactional
-  public boolean batchCancelOrder(String boxId, List<String> orderIds) {
-    int sumTicket = 0;
-    for (String orderId : orderIds) {
-      UserTicketOrder userTicketOrder = getById(orderId);
-      Assert.isTrue(userTicketOrder.getResource() == TicketTypeEnum.ONLINE,
-          "非在线盲票不用取消。boxId:" + boxId);
-      if (!rollbackOrder(userTicketOrder)) {
-        return false;
-      }
-      sumTicket += userTicketOrder.getTicketNum();
+
+    @Override
+    public List<IndexVO> selectIndexDailyInfoList(Wrapper<UserTicketOrder> wrapper) {
+        return getBaseMapper().selectIndexDailyInfoList(wrapper);
     }
     }
-    rollbackBoxQty(boxId, sumTicket);
-    return true;
-  }
-
-  private void rollbackBoxQty(String boxId, int qty) {
-    TicketBox ticketBox = ticketBoxService.getById(boxId);
-    boolean updateBox = ticketBoxService.update(
-        new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
-                ticketBox.getSaleQty() - qty)
-            .set(
-                ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
-                    && ticketBox.getManualOff() != 1,
-                TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
-            .eq(TicketBox::getBoxId, ticketBox.getBoxId())
-            .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
-    Assert.isTrue(updateBox, "取消过期未支付盲票购买订单,恢复票组销量失败。boxId:{0}" + boxId);
-  }
-
-  @Override
-  @Transactional
-  public boolean cancelOrder(String orderId) {
-    UserTicketOrder userTicketOrder = getById(orderId);
-
-    if (!rollbackOrder(userTicketOrder)) {
-      return false;
+
+    @Override
+    public List<IndexVO> selectIndexTicketBoxTop(Wrapper<UserTicketOrder> wrapper) {
+        return getBaseMapper().selectIndexTicketBoxTop(wrapper);
     }
     }
 
 
-    if (userTicketOrder.getResource() == TicketTypeEnum.ONLINE) {
-      rollbackBoxQty(userTicketOrder.getBoxId(), userTicketOrder.getTicketNum());
+    @Override
+    public List<IndexVO> selectIndexTicketSiteTop(Wrapper<UserTicketOrder> wrapper) {
+        return getBaseMapper().selectIndexTicketSiteTop(wrapper);
     }
     }
 
 
-    return true;
-  }
+    @Override
+    public int getChannelTotalTicketNumCnt(String channelNo) {
+        return getBaseMapper().getChannelTotalTicketNumCnt(channelNo);
+    }
 
 
-  private boolean rollbackOrder(UserTicketOrder userTicketOrder) {
-    if (userTicketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
-      LogUtil.warn(logger, "取消购票订单时,订单状态不是待支付,忽略。orderId:{0}, status:{1}",
-          userTicketOrder.getOrderId(), userTicketOrder.getStatus());
-      return false;
+    @Override
+    public int getSaleSiteTotalTicketNumCnt(Long channelId) {
+        return getBaseMapper().getSaleSiteTotalTicketNumCnt(channelId);
     }
     }
 
 
-    if (StringUtils.isNotBlank(userTicketOrder.getCouponInfo())) {
-      // 优惠券反核销
-      List<String> userCouponIds = Arrays.asList(userTicketOrder.getCouponInfo().split(","));
-      boolean rst = userCouponService.update(new LambdaUpdateWrapper<UserCoupon>()
-          .set(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED)
-          .set(UserCoupon::getVerifyTime, null)
-          .in(UserCoupon::getId, userCouponIds));
-      Assert.isTrue(rst,
-          "盲票购买订单取消时,反核销优惠券失败。orderId:" + userTicketOrder.getOrderId() + "userCouponIds:"
-              + userTicketOrder.getCouponInfo());
+    @Override
+    public TicketCntVO getTicketSaleCnt(Long channelId) {
+        return getBaseMapper().getTicketSaleCnt(channelId);
     }
     }
 
 
-    boolean rst = update(new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus,
-            UserTicketOrderStatusEnum.CANCELED)
-        .eq(UserTicketOrder::getOrderId, userTicketOrder.getOrderId())
-        .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
-    Assert.isTrue(rst, "盲票购买订单取消时,更新订单状态失败。orderId:" + userTicketOrder.getOrderId());
-    return true;
-  }
-
-  @Override
-  @Transactional(rollbackFor = Exception.class)
-  public boolean paySuccess(PayOrder payOrder) {
-    UserTicketOrder ticketOrder = getById(payOrder.getBizId());
-    if (null == ticketOrder || ticketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
-      LogUtil.error(logger, "支付回调用户购票订单处理,订单状态异常,不是待支付。payOrder:{0}, ticketOrder:{1}",
-          JSONObject.toJSONString(payOrder), JSONObject.toJSONString(ticketOrder));
-      throw new ServiceException("支付回调用户购票订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
+    @Override
+    public List<TicketCntVO> listTicketSaleCnt(Wrapper<UserTicketOrder> queryWrapper) {
+        return getBaseMapper().listTicketSaleCnt(queryWrapper);
     }
     }
-    ticketOrder.setPayTime(DateUtils.parseDate(payOrder.getCompleteDate()));
-
-    // 插入异步任务
-    Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_PAY, payOrder.getBizId()), "创建支付成功异步任务失败. orderId:" + payOrder.getOrderId());
-    return processTicketOrder(ticketOrder);
-  }
-
-  private boolean processTicketOrder(UserTicketOrder ticketOrder) {
-    List<UserTicketOrderItem> orderItemList = userTicketOrderItemService.list(
-        new LambdaQueryWrapper<UserTicketOrderItem>()
-            .eq(UserTicketOrderItem::getOrderId, ticketOrder.getOrderId()));
-
-    for (UserTicketOrderItem orderItem : orderItemList) {
-      Ticket ticket;
-      if (ticketOrder.getResource() == TicketTypeEnum.ONLINE) {
-        // 线上票,要先分配票ticketId
-        ticket = ticketService.getRandOne(ticketOrder.getBoxId());
-        orderItem.setTicketId(ticket.getTicketId());
-        boolean rst = userTicketOrderItemService.updateById(orderItem);
-        Assert.isTrue(rst, "支付回调用户购票订单处理,更新订单明细的盲票ID失败,itemId:" + orderItem.getItemId());
-      } else {
-        ticket = ticketService.getById(orderItem.getTicketId());
-      }
-
-      // 开幸运数字,更新ticket状态为已激活
-      boolean rtn = ticketService.update(
-          new LambdaUpdateWrapper<Ticket>().set(Ticket::getPlainLuckyNum,
-                  Integer.valueOf(RSAUtil.decrypt(ticket.getCipherLuckyNum())))
-              .set(Ticket::getStatus, TicketStatusEnum.ACTIVATED)
-              .eq(Ticket::getTicketId, ticket.getTicketId()));
-      Assert.isTrue(rtn, "支付回调用户购票订单处理,更新盲票状态失败,ticketId:" + ticket.getTicketId());
 
 
+    @Override
+    public List<UserTicketOrderListVO> listUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper) {
+        return getBaseMapper().listUserTicketOrder(queryWrapper);
     }
     }
 
 
-    // 更新订单状态为已完成
-    boolean updateRst = update(
-        new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus,
-                UserTicketOrderStatusEnum.FINISHED)
-            .set(UserTicketOrder::getPayTime, ticketOrder.getPayTime())
-            .eq(UserTicketOrder::getOrderId, ticketOrder.getOrderId())
-            .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
-    Assert.isTrue(updateRst, "支付回调用户购票订单处理,更新订单状态失败,orderId:" + ticketOrder.getOrderId());
-
-    return true;
-  }
-
-  @Override
-  @Transactional(rollbackFor = Exception.class)
-  public boolean commToChannel(String orderId, Integer resource) {
-    ChannelCommParam channelCommParam = new ChannelCommParam();
-    if (ChannelCommissionResourceEnum.USER.getValue().equals(resource)) {
-      UserTicketOrder ticketOrder = getById(orderId);
-      BeanUtils.copyProperties(ticketOrder, channelCommParam);
-      Assert.isTrue(channelCommParam.getCommStatus() != CommStatusEnum.YES,
-              "结佣处理,结佣状态异常,不是结佣中或未结佣。orderId=" + orderId);
-    } else {
-      ChannelOrder channelOrder = channelOrderService.getById(orderId);
-      ChannelOrderItem channelOrderItem = channelOrderItemService.getOne(new LambdaQueryWrapper<ChannelOrderItem>()
-              .eq(ChannelOrderItem::getOrderId, orderId));
-      channelCommParam.setBoxId(channelOrderItem.getBoxId());
-      channelCommParam.setChannelId(channelOrder.getChannelId());
-      channelCommParam.setOrderId(channelOrder.getOrderId());
-      channelCommParam.setPayAmt(channelOrder.getPayAmt());
+    @Override
+    public int countUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper) {
+        return getBaseMapper().countUserTicketOrder(queryWrapper);
     }
     }
-    if (channelCommParam.getPayAmt() == 0) {
-      return true;
+
+    @Override
+    public List<IndexVO> selectIndexTicketBoxTopByTicketOrderAndChannelOrder(IndexTicketBoxTopQueryParam indexTicketBoxTopQueryParam) {
+        return getBaseMapper().selectIndexTicketBoxTopByTicketOrderAndChannelOrder(indexTicketBoxTopQueryParam);
     }
     }
-    if (null != channelCommParam.getChannelId()) {
-      // 线下购票,优先给当前票的经销商渠道分润
-      TicketBox ticketBox = ticketBoxService.getById(channelCommParam.getBoxId());
-      Channel channel = channelService.getById(channelCommParam.getChannelId());
-      ChannelCommission siteCommission = saveSiteCommAmt(channelCommParam, ticketBox, channel);
-      // 经销商账户余额增加
-      changeMoney(channel, siteCommission);
-
-      int sumCommAmt = siteCommission.getCommAmt();
-      // 渠道分润
-      while (channel.getParentId() > 0) {
-        channel = channelService.getById(channel.getParentId());
-        ChannelCommission channelCommission = new ChannelCommission();
-        channelCommission.setChannelId(channel.getChannelId());
-        channelCommission.setOrderId(siteCommission.getOrderId());
-        channelCommission.setResource(resource);
-        channelCommission.setBoxId(siteCommission.getBoxId());
-        channelCommission.setSaleAmt(siteCommission.getSaleAmt());
-        channelCommission.setSaleCommRate(siteCommission.getSaleCommRate());
-        channelCommission.setSaleCommAmt(siteCommission.getSaleCommAmt());
-        channelCommission.setCommRate(channel.getCommRate());
-        channelCommission.setCommAmt(new BigDecimal(channelCommission.getSaleCommAmt()).multiply(
-                channelCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
-            .intValue() - sumCommAmt);
-        channelCommissionService.save(channelCommission);
-        sumCommAmt += channelCommission.getCommAmt();
-      }
-    } else {
-      LogUtil.info(logger, "渠道结佣时,订单对应的渠道不存在,无需结佣。orderId:{0}",
-          channelCommParam.getOrderId());
+
+    @Override
+    public List<IndexVO> selectIndexTicketSiteTopByTicketOrderAndChannelOrder(IndexTicketSiteTopQueryParam indexTicketSiteTopQueryParam) {
+        return getBaseMapper().selectIndexTicketSiteTopByTicketOrderAndChannelOrder(indexTicketSiteTopQueryParam);
     }
     }
-    if (ChannelCommissionResourceEnum.USER.getValue().equals(resource)) {
-      boolean rst = update(
-              new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus,
-                              CommStatusEnum.YES)
-                      .eq(UserTicketOrder::getOrderId, orderId)
-                      .in(UserTicketOrder::getCommStatus, CommStatusEnum.DOING, CommStatusEnum.NO));
-      Assert.isTrue(rst, "渠道结佣完成,更新订单状态失败。orderId:" + orderId);
+
+    @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;
     }
     }
-    return true;
-  }
-
-  private void changeMoney(Channel channel, ChannelCommission siteCommission) {
-    ChannelMoneyLog moneyLog = new ChannelMoneyLog();
-    moneyLog.setChannelId(channel.getChannelId());
-    moneyLog.setType(ChannelMoneyEnum.COMMISSION);
-    moneyLog.setLogMoney(siteCommission.getCommAmt());
-    moneyLog.setBizTime(new Date());
-    moneyLog.setRefId(String.valueOf(siteCommission.getId()));
-    channelMoneyLogService.changeMoney(moneyLog);
-  }
-
-  private ChannelCommission saveSiteCommAmt(ChannelCommParam channelCommParam, TicketBox ticketBox,
-      Channel channel) {
-    ChannelCommission siteCommission = new ChannelCommission();
-    siteCommission.setChannelId(channel.getChannelId());
-    siteCommission.setOrderId(channelCommParam.getOrderId());
-    siteCommission.setBoxId(channelCommParam.getBoxId());
-    siteCommission.setSaleAmt(channelCommParam.getPayAmt());
-    siteCommission.setSaleCommRate(ticketBox.getSaleCommRate());
-    siteCommission.setSaleCommAmt(new BigDecimal(siteCommission.getSaleAmt()).multiply(
-            siteCommission.getSaleCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
-        .intValue());
-    siteCommission.setCommRate(channel.getCommRate());
-    siteCommission.setCommAmt(new BigDecimal(siteCommission.getSaleCommAmt()).multiply(
-        siteCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN).intValue());
-    channelCommissionService.save(siteCommission);
-    return siteCommission;
-  }
-
-  @Override
-  public List<IndexVO> selectIndexPayAmtList(Wrapper<UserTicketOrder> wrapper) {
-    return getBaseMapper().selectIndexPayAmtList(wrapper);
-  }
-
-  @Override
-  public List<IndexVO> selectIndexPayUserCntList(Wrapper<UserTicketOrder> wrapper) {
-    return getBaseMapper().selectIndexPayUserCntList(wrapper);
-  }
-
-  @Override
-  public List<IndexVO> selectIndexDailyInfoList(Wrapper<UserTicketOrder> wrapper) {
-    return getBaseMapper().selectIndexDailyInfoList(wrapper);
-  }
-
-  @Override
-  public List<IndexVO> selectIndexTicketBoxTop(Wrapper<UserTicketOrder> wrapper) {
-    return getBaseMapper().selectIndexTicketBoxTop(wrapper);
-  }
-
-  @Override
-  public List<IndexVO> selectIndexTicketSiteTop(Wrapper<UserTicketOrder> wrapper) {
-    return getBaseMapper().selectIndexTicketSiteTop(wrapper);
-  }
-
-  @Override
-  public int getChannelTotalTicketNumCnt(String channelNo) {
-    return getBaseMapper().getChannelTotalTicketNumCnt(channelNo);
-  }
-
-  @Override
-  public int getSaleSiteTotalTicketNumCnt(Long channelId) {
-    return getBaseMapper().getSaleSiteTotalTicketNumCnt(channelId);
-  }
-
-  @Override
-  public TicketCntVO getTicketSaleCnt(Long channelId) {
-    return getBaseMapper().getTicketSaleCnt(channelId);
-  }
-
-  @Override
-  public List<TicketCntVO> listTicketSaleCnt(Wrapper<UserTicketOrder> queryWrapper) {
-    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 List<IndexVO> selectIndexTicketBoxTopByTicketOrderAndChannelOrder(IndexTicketBoxTopQueryParam indexTicketBoxTopQueryParam ) {
-    return getBaseMapper().selectIndexTicketBoxTopByTicketOrderAndChannelOrder(indexTicketBoxTopQueryParam);
-  }
-
-  @Override
-  public List<IndexVO> selectIndexTicketSiteTopByTicketOrderAndChannelOrder(IndexTicketSiteTopQueryParam indexTicketSiteTopQueryParam) {
-    return getBaseMapper().selectIndexTicketSiteTopByTicketOrderAndChannelOrder(indexTicketSiteTopQueryParam);
-  }
-
-  @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;
-  }
 }
 }

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

@@ -24,6 +24,7 @@
             t1.created_time,
             t1.created_time,
             t1.updated_time,
             t1.updated_time,
             t2.title,
             t2.title,
+            t2.channel_shared_rate,
             t2.discount,
             t2.discount,
             t2.type,
             t2.type,
             t2.due_days
             t2.due_days

+ 24 - 0
mp-service/src/main/resources/mapper/admin/GoodsMapper.xml

@@ -30,4 +30,28 @@
         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
         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>
     </sql>
 
 
+
+    <select id="listGoodsExportVOByQueryWrapper" resultType="com.qs.mp.admin.domain.vo.GoodsExportVO">
+        select t1.goods_id,
+               t1.title,
+               if(t3.name is not null, t2.name , null) as categoryName,
+               if(t3.name is not null, t3.name, t2.name) as parentCategoryName,
+               t1.value,
+               t1.cost,
+               t1.exchange_show,
+               t1.exchange_price,
+               t1.exchanged_qty,
+               t1.quantity,
+               t1.status,
+               t1.goods_code,
+               t4.name as supplierName,
+               t1.shopping_link
+        from mp_goods t1
+                 left join mp_goods_category t2 on t1.category_id = t2.category_id
+                 left join mp_goods_category t3 on t2.parent_id = t3.category_id
+                 left join mp_supplier t4 on t1.supplier_id = t4.id
+        ${ew.customSqlSegment}
+
+    </select>
+
 </mapper>
 </mapper>

+ 3 - 1
mp-service/src/main/resources/mapper/system/SysUserMapper.xml

@@ -25,6 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="remark"       column="remark"       />
 		<result property="remark"       column="remark"       />
 		<result property="gzhOpenId"       column="gzh_open_id"       />
 		<result property="gzhOpenId"       column="gzh_open_id"       />
 		<result property="openId"       column="open_id"       />
 		<result property="openId"       column="open_id"       />
+		<result property="aliuserId"       column="aliuser_id"       />
 		<result property="channelOpenId"       column="channel_open_id"       />
 		<result property="channelOpenId"       column="channel_open_id"       />
 		<result property="unionId"       column="union_id"       />
 		<result property="unionId"       column="union_id"       />
 		<result property="sessionKey"       column="session_key"       />
 		<result property="sessionKey"       column="session_key"       />
@@ -53,7 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 
 	<sql id="selectUserVo">
 	<sql id="selectUserVo">
         select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
         select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
-        u.gzh_open_id,u.open_id,u.channel_open_id,u.union_id,u.session_key,d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
+        u.gzh_open_id,u.open_id,u.aliuser_id,u.channel_open_id,u.union_id,u.session_key,d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
         from sys_user u
 		    left join sys_dept d on u.dept_id = d.dept_id
 		    left join sys_dept d on u.dept_id = d.dept_id
@@ -201,6 +202,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="remark != null">remark = #{remark},</if>
  			<if test="remark != null">remark = #{remark},</if>
 			<if test="gzhOpenId != null">gzh_open_id = #{gzhOpenId},</if>
 			<if test="gzhOpenId != null">gzh_open_id = #{gzhOpenId},</if>
 			<if test="openId != null">open_id = #{openId},</if>
 			<if test="openId != null">open_id = #{openId},</if>
+			<if test="aliuserId != null ">aliuser_id = #{aliuserId},</if>
 			<if test="channelOpenId != null">channel_open_id = #{channelOpenId},</if>
 			<if test="channelOpenId != null">channel_open_id = #{channelOpenId},</if>
 			<if test="unionId != null">union_id = #{unionId},</if>
 			<if test="unionId != null">union_id = #{unionId},</if>
 			<if test="sessionKey != null">session_key = #{sessionKey},</if>
 			<if test="sessionKey != null">session_key = #{sessionKey},</if>