瀏覽代碼

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

Mp server test

See merge request quanshu/mp-server!451
zhong chunping 3 年之前
父節點
當前提交
6462fa59b4
共有 48 個文件被更改,包括 925 次插入134 次删除
  1. 10 4
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  2. 33 7
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java
  3. 36 15
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  4. 11 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java
  5. 7 6
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java
  6. 1 4
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  7. 2 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java
  8. 1 7
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  9. 20 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserExchangeController.java
  10. 4 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  11. 1 7
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  12. 83 14
      mp-admin/src/main/java/com/qs/mp/web/controller/common/LogisticsController.java
  13. 2 1
      mp-common/src/main/java/com/qs/mp/common/enums/PayOrderStatusEnum.java
  14. 4 0
      mp-framework/src/main/java/com/qs/mp/framework/monitor/SendErrorMsgAppender.java
  15. 1 1
      mp-framework/src/main/java/com/qs/mp/framework/web/service/UserDetailsServiceImpl.java
  16. 5 5
      mp-quartz/src/main/java/com/qs/mp/quartz/task/DayStatTask.java
  17. 1 1
      mp-quartz/src/main/java/com/qs/mp/quartz/task/OperateToolTask.java
  18. 35 0
      mp-service/src/main/java/com/qs/mp/admin/domain/Goods.java
  19. 21 0
      mp-service/src/main/java/com/qs/mp/admin/domain/GoodsSku.java
  20. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java
  21. 24 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelOrderCancelParam.java
  22. 9 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsParam.java
  23. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsUpdateSortWeightParam.java
  24. 31 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/LogisticsQueryParam.java
  25. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketAwardsParam.java
  26. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketAwardsPrizeParam.java
  27. 43 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxUpdateParam.java
  28. 22 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketUpdateSortWeightParam.java
  29. 34 1
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/GoodsVO.java
  30. 25 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/LogisticsQueryVO.java
  31. 8 0
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxService.java
  32. 104 1
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  33. 8 1
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java
  34. 6 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelService.java
  35. 84 11
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  36. 43 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java
  37. 15 0
      mp-service/src/main/java/com/qs/mp/common/domain/DeliveryCompany.java
  38. 11 3
      mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java
  39. 38 15
      mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java
  40. 21 1
      mp-service/src/main/java/com/qs/mp/user/domain/UserAddr.java
  41. 25 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrderItem.java
  42. 7 0
      mp-service/src/main/java/com/qs/mp/user/domain/excel/DeliverOrderExcel.java
  43. 6 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserDeliverOrderItemVO.java
  44. 4 4
      mp-service/src/main/java/com/qs/mp/user/service/IUserAddrService.java
  45. 16 9
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserAddrServiceImpl.java
  46. 7 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  47. 3 1
      mp-service/src/main/resources/mapper/user/UserDeliverOrderItemMapper.xml
  48. 19 8
      mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml

+ 10 - 4
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java

@@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.TicketPackage;
-import com.qs.mp.admin.domain.param.ChannelOrderPkgParam;
-import com.qs.mp.admin.domain.param.ChannelOrderQueryParam;
-import com.qs.mp.admin.domain.param.ChannelOrderShipParam;
-import com.qs.mp.admin.domain.param.UserDeliverOrderQueryParam;
+import com.qs.mp.admin.domain.param.*;
 import com.qs.mp.admin.domain.vo.TicketPackageVO;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.channel.domain.Channel;
@@ -52,6 +49,7 @@ import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -112,6 +110,14 @@ public class ChannelOrderMgrController extends BaseApiController {
     return getDataTable(channelOrderVOList);
   }
 
+
+  @PostMapping("/order/cancel")
+  @PreAuthorize("@ss.hasPermi('order:channel:edit')")
+  @ApiOperation("经销商订单取消")
+  public AjaxResult cancelOrder(@Validated @RequestBody ChannelOrderCancelParam param) {
+	  return AjaxResult.success(channelOrderService.cancelOrderByAdmin(param));
+  }
+
   /**
    * 订单详情
    */

+ 33 - 7
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java

@@ -4,11 +4,14 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameters;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.GoodsTagRel;
 import com.qs.mp.admin.domain.param.GoodsParam;
 import com.qs.mp.admin.domain.param.GoodsQueryParam;
+import com.qs.mp.admin.domain.param.GoodsUpdateSortWeightParam;
 import com.qs.mp.admin.domain.vo.GoodsVO;
 import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.admin.service.IGoodsSkuService;
@@ -21,14 +24,15 @@ import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.GoodsStatusEnum;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
+
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.stream.Collectors;
+
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -37,17 +41,14 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @auther liugl
  * @create 2022-03-09 23:45:48
  * @describe 商品管理前端控制器
  */
-@Api("渠道管理API")
+@Api(tags = "商品管理API")
 @RestController
 @RequestMapping("/api/v1/mp/admin/goods/*")
 @Component
@@ -73,6 +74,10 @@ public class GoodsMgrController extends BaseApiController {
    */
   @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<>();
@@ -123,6 +128,20 @@ public class GoodsMgrController extends BaseApiController {
     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));
+  }
+
+
   /**
    * 获取商品详情信息
    *
@@ -131,6 +150,13 @@ public class GoodsMgrController extends BaseApiController {
    */
   @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) {

+ 36 - 15
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -5,14 +5,9 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.qs.mp.admin.domain.Ticket;
-import com.qs.mp.admin.domain.TicketAwards;
-import com.qs.mp.admin.domain.TicketAwardsPrize;
-import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.*;
 import com.qs.mp.admin.domain.excel.TicketExcel;
-import com.qs.mp.admin.domain.param.BathIdParam;
-import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
-import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.param.*;
 import com.qs.mp.admin.domain.vo.TicketAwardsVO;
 import com.qs.mp.admin.domain.vo.TicketBoxVO;
 import com.qs.mp.admin.service.ITicketAwardsPrizeService;
@@ -42,14 +37,15 @@ import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.utils.ExcelUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.pulsar.client.api.PulsarClientException;
@@ -58,11 +54,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 /**
@@ -70,7 +62,7 @@ import org.springframework.web.multipart.MultipartFile;
  * @create 2022-02-28 16:17:48
  * @describe 盲票管理前端控制器
  */
-@Api("渠道管理API")
+@Api(tags = "盲票管理API")
 @RestController
 @RequestMapping("/api/v1/mp/admin/ticket/box/*")
 @Component
@@ -110,6 +102,10 @@ public class TicketBoxMgrController extends BaseApiController {
 	 */
 	@PostMapping("/list")
 	@PreAuthorize("@ss.hasPermi('business:ticket:list')")
+	@ApiOperation("查询所有盲票组列表")
+	@ApiResponses(
+			@ApiResponse(code = 200, message = "查询成功", response = TicketBox.class)
+	)
 	public TableDataInfo list(@RequestBody TicketBox ticketBox) {
 		startPage();
 		QueryWrapper<TicketBox> queryWrapper = new QueryWrapper<TicketBox>();
@@ -121,6 +117,28 @@ public class TicketBoxMgrController extends BaseApiController {
 		return getDataTable(list);
 	}
 
+	@PostMapping("/update")
+	@PreAuthorize("@ss.hasPermi('business:ticket:edit')")
+	@ApiOperation("更新盲票信息")
+	public AjaxResult update(@RequestBody TicketBoxUpdateParam param) {
+		return AjaxResult.success(ticketBoxService.updateTicketBox(param));
+	}
+
+
+
+	@PostMapping("/update/sortWeight")
+	@PreAuthorize("@ss.hasPermi('business:ticket:edit')")
+	@ApiOperation("更新盲票排序权重")
+	public AjaxResult updateSortWeight(@RequestBody TicketUpdateSortWeightParam param) {
+
+		TicketBox ticketBox = new TicketBox();
+		ticketBox.setBoxId(param.getBoxId());
+		ticketBox.setSortWeight(param.getSortWeight());
+		return AjaxResult.success(ticketBoxService.updateById(ticketBox));
+	}
+
+
+
 	/**
 	 * 查看盲票详情
 	 */
@@ -163,6 +181,9 @@ public class TicketBoxMgrController extends BaseApiController {
 				return AjaxResult.error("每包张数必须大于0");
 			}
 		}
+		if (param.getAwardsList().size() <= 1) {
+			return AjaxResult.error("至少需要两个奖级");
+		}
 		String boxId = ticketBoxService.createTicketBox(param);
 		if (StringUtils.isNotBlank(boxId)) {
 			try {

+ 11 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java

@@ -220,6 +220,7 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 
 	@Log(title = "提货订单导出", businessType = BusinessType.EXPORT)
 	@PostMapping("/export")
+	@ApiOperation("替换订单导出")
 	@PreAuthorize("@ss.hasPermi('order:deliver:export')")
 	public AjaxResult export(@RequestBody UserDeliverOrderQueryParam queryParam) {
 
@@ -271,9 +272,18 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 						&& StringUtils.isNotBlank(deliverOrder.getArea())
 						&& StringUtils.isNotBlank(deliverOrder.getAddress()) && null != deliverOrder.getItems()
 						&& deliverOrder.getItems().size() > 0) {
-					for (UserDeliverOrderItem userDeliverOrderItem : deliverOrder.getItems()) {
+					for (UserDeliverOrderItemVO userDeliverOrderItem : deliverOrder.getItems()) {
 						if (null != userDeliverOrderItem) {
 							DeliverOrderExcel deliverOrderExcel = new DeliverOrderExcel();
+							// 设置商品id
+							deliverOrderExcel.setGoodsId(userDeliverOrderItem.getGoodsId());
+							// 设置商品编号
+							if (Objects.isNull(userDeliverOrderItem.getSkuId())) {
+								deliverOrderExcel.setCode(userDeliverOrderItem.getGoodsCode());
+							} else {
+								deliverOrderExcel.setCode(userDeliverOrderItem.getSkuCode());
+							}
+
 							deliverOrderExcel.setTitle(userDeliverOrderItem.getTitle());
 							deliverOrderExcel.setProperties(userDeliverOrderItem.getProperties());
 							deliverOrderExcel.setGoodsNum(userDeliverOrderItem.getGoodsNum());

+ 7 - 6
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java

@@ -25,9 +25,12 @@ import com.qs.mp.common.enums.ChannelRoleEnum;
 import com.qs.mp.common.enums.ChannelVerifyStatusEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.exception.base.BaseException;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.service.IUserAddrService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
@@ -87,6 +90,9 @@ public class ChannelController extends BaseApiController {
 	@Autowired
 	private MapperFacade mapperFacade;
 
+	@Autowired
+	private IUserAddrService userAddrService;
+
 	/**
 	 * 获取我的下级渠道列表信息,支持翻页
 	 *
@@ -585,12 +591,7 @@ public class ChannelController extends BaseApiController {
 			return AjaxResult.error(queryChannel.getName() + "非当前用户的门店, 认证审核失败");
 		}
 		try {
-			if(channel.getVerifyStatus() == ChannelVerifyStatusEnum.ACCEPT) {
-				channel.setCertifyStatus(ChannelCertifyStatusEnum.CERTIFIED);
-			}else {
-				channel.setCertifyStatus(ChannelCertifyStatusEnum.NOT_CERTIFIED);
-			}
-			channelService.updateById(channel);
+			channelService.siteVerify(channel);
 		} catch (Exception e) {
 			return AjaxResult.error("门店'" + channel.getName() + "'认证审核失败");
 		}

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

@@ -25,7 +25,6 @@ import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
-import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.service.IUserAddrService;
 import com.qs.mp.channel.service.IChannelCartService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
@@ -51,8 +50,6 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
 
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -293,7 +290,7 @@ public class ChannelOrderController extends BaseApiController {
     ChannelOrder channelOrder = channelOrderService.getById(param.getOrderId());
     JSONObject jsonObject;
     try {
-      jsonObject = walletService.pay(BizTypeEnum.CHANNEL_ORDER, param.getOrderId(), channelOpenId, channelOrder.getPayAmt());
+      jsonObject = walletService.pay(BizTypeEnum.CHANNEL_ORDER, param.getOrderId(), channelOpenId, channelOrder.getPayAmt(), channelOrder.getTitle());
     }catch (ServiceException e) {
       LogUtil.error(logger, e, "根据经销商采购订单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
       return AjaxResult.error(e.getMessage());

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

@@ -54,7 +54,8 @@ public class ChannelTicketController extends BaseApiController {
     List<TicketBox> ticketBoxes = ticketBoxService.list(
         new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
             .eq(null != param.getCategoryId() && 0 != param.getCategoryId(), TicketBox::getCategoryId, param.getCategoryId())
-            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON));
+            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+            .orderByDesc(TicketBox::getSortWeight));
     List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes, TicketBoxListVO.class);
     TableDataInfo rspData = getDataTable(ticketBoxes);
     rspData.setRows(ticketBoxListVOList);

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

@@ -1,15 +1,10 @@
 package com.qs.mp.web.controller.api.user;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.channel.domain.ChannelOrder;
-import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.param.OrderPayParam;
-import com.qs.mp.channel.domain.vo.ChannelOrderVO;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
@@ -18,7 +13,6 @@ import com.qs.mp.common.enums.DeliverOrderStatusEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
-import com.qs.mp.common.service.IDeliveryCompanyService;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.framework.redis.RedisKey;
@@ -230,7 +224,7 @@ public class UserDeliverOrderController extends BaseApiController {
     UserDeliverOrder deliverOrder = userDeliverOrderService.getById(param.getOrderId());
     JSONObject jsonObject;
     try {
-      jsonObject = walletService.pay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(), sysUser.getOpenId(), deliverOrder.getPayAmt());
+      jsonObject = walletService.pay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(), sysUser.getOpenId(), deliverOrder.getPayAmt(), "盲票--提货订单");
     }catch (ServiceException e) {
       LogUtil.error(logger, e, "根据提货单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
       return AjaxResult.error(e.getMessage());

+ 20 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserExchangeController.java

@@ -2,6 +2,8 @@ package com.qs.mp.web.controller.api.user;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameters;
 import com.qs.mp.admin.domain.ExchangeBanner;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsCategory;
@@ -32,6 +34,9 @@ import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.BeanUtils;
@@ -45,7 +50,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @RequestMapping("/api/v1/mp/user/exchange")
-@Api(tags = "盲票商城接口")
+@Api(tags = "盲票兑换大厅接口")
 @AllArgsConstructor
 public class UserExchangeController extends BaseApiController {
 
@@ -79,6 +84,15 @@ public class UserExchangeController extends BaseApiController {
    */
   @PostMapping("/goods/list")
   @ApiOperation(value = "商品列表", notes = "获取所有可兑换商品")
+  @DynamicParameters(properties = {
+          @DynamicParameter(name = "categoryId",value = "分类id",dataTypeClass = Long.class),
+          @DynamicParameter(name = "tagIds",value = "标签id",dataTypeClass = String.class),
+          @DynamicParameter(name = "startPrice",value = "开始价格",dataTypeClass = Integer.class),
+          @DynamicParameter(name = "endPrice",value = "结束价格",dataTypeClass = Integer.class)
+  })
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success" , response = GoodsListVO.class)
+  )
   public TableDataInfo list(@RequestBody JSONObject param) {
     Long categoryId = param.getLong("categoryId");
     String tagIds = param.getString("tagIds");
@@ -99,7 +113,8 @@ public class UserExchangeController extends BaseApiController {
         .le(null != endPrice && 0 != endPrice, Goods::getExchangePrice, endPrice)
         .eq(Goods::getStatus, GoodsStatusEnum.PUT_ON)
         .eq(Goods::getExchangeShow, 1)
-        .in(!CollectionUtils.isEmpty(goodsIds), Goods::getGoodsId, goodsIds));
+        .in(!CollectionUtils.isEmpty(goodsIds), Goods::getGoodsId, goodsIds)
+        .orderByDesc(Goods::getSortWeight));
     List<GoodsListVO> goodsListVOList = mapperFacade.mapAsList(goodsList, GoodsListVO.class);
     TableDataInfo rspData = getDataTable(goodsList);
     rspData.setRows(goodsListVOList);
@@ -112,6 +127,9 @@ public class UserExchangeController extends BaseApiController {
    */
   @PostMapping("/goods/detail")
   @ApiOperation(value = "查看商品详情", notes = "根据商品ID,获取商品信息")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success" , response = GoodsVO.class)
+  )
   public AjaxResult getInfo(@RequestBody Goods param) {
     if (null == param.getGoodsId() || 0 == param.getGoodsId()) {
       return AjaxResult.error("参数异常,商品ID缺失");

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

@@ -95,7 +95,9 @@ public class UserTicketController extends BaseApiController {
         new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
             .eq(null != param.getCategoryId() && 0 != param.getCategoryId(),
                 TicketBox::getCategoryId, param.getCategoryId())
-            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON));
+            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+            .orderByDesc(TicketBox::getSortWeight)
+    );
     List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes,
         TicketBoxListVO.class);
     TableDataInfo rspData = getDataTable(ticketBoxes);
@@ -146,7 +148,7 @@ public class UserTicketController extends BaseApiController {
     }*/
     TicketPackage ticketPackage = ticketPackageService.getById(ticket.getPkgId());
     if (ticketPackage.getStatus() != TicketPkgStatusEnum.SOLD) {
-      LogUtil.error(logger, "盲票未激活。sn:{0},pkgId:{1}", new Object[]{ticket.getSerialNo(), ticket.getPkgId()});
+      LogUtil.warn(logger, "盲票未激活。sn:{0},pkgId:{1}", new Object[]{ticket.getSerialNo(), ticket.getPkgId()});
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1023);
     }
 

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

@@ -1,11 +1,8 @@
 package com.qs.mp.web.controller.api.user;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
-import com.qs.mp.admin.service.ICouponTicketService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.ChannelOrder;
@@ -13,10 +10,8 @@ import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.BizTypeEnum;
-import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.MqTopicType;
-import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.LogUtil;
@@ -37,7 +32,6 @@ import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
@@ -202,7 +196,7 @@ public class UserTicketOrderController extends BaseApiController {
     UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
     JSONObject jsonObject;
     try {
-      jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getOpenId(), ticketOrder.getPayAmt());
+      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());

+ 83 - 14
mp-admin/src/main/java/com/qs/mp/web/controller/common/LogisticsController.java

@@ -1,32 +1,38 @@
 package com.qs.mp.web.controller.common;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.json.JSON;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONConfig;
-import cn.hutool.json.JSONUtil;
+import cn.hutool.json.*;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.google.gson.Gson;
 import com.kuaidi100.sdk.api.AutoNum;
+import com.kuaidi100.sdk.api.QueryTrack;
+import com.kuaidi100.sdk.api.QueryTrackMap;
 import com.kuaidi100.sdk.core.IBaseClient;
 import com.kuaidi100.sdk.pojo.HttpResult;
 import com.kuaidi100.sdk.request.AutoNumReq;
+import com.kuaidi100.sdk.request.QueryTrackParam;
+import com.kuaidi100.sdk.request.QueryTrackReq;
+import com.kuaidi100.sdk.utils.SignUtils;
+import com.qs.mp.admin.domain.param.LogisticsQueryParam;
+import com.qs.mp.admin.domain.vo.LogisticsQueryVO;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.domain.DeliveryCompany;
 import com.qs.mp.common.service.IDeliveryCompanyService;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.MD5Util;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -54,6 +60,74 @@ public class LogisticsController extends BaseApiController {
     @Autowired
     private IDeliveryCompanyService deliveryCompanyService;
 
+
+    @PostMapping("/query")
+    @ApiOperation("物流查询")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = LogisticsQueryVO.class)
+    )
+    public AjaxResult query(@Validated @RequestBody LogisticsQueryParam logisticsQueryParam) {
+        // 查询物流公司信息
+        DeliveryCompany deliveryCompany = deliveryCompanyService.getOne(new LambdaQueryWrapper<DeliveryCompany>()
+                .select(DeliveryCompany::getCode)
+                .eq(DeliveryCompany::getDeliveryId, logisticsQueryParam.getDeliveryId()));
+
+        if (Objects.isNull(deliveryCompany)) {
+            return error("物流公司不存在");
+        }
+        if (StringUtils.isBlank(deliveryCompany.getCode())) {
+            return error("物流公司编码不存在");
+        }
+
+        // 封装物流请求参数
+        QueryTrackParam queryTrackParam = new QueryTrackParam();
+        // 快递公司编码
+        queryTrackParam.setCom(deliveryCompany.getCode());
+        // 物流单号
+        queryTrackParam.setNum(logisticsQueryParam.getDeliveryFlowId());
+        //1:开通行政区域解析功能以及物流轨迹增加物流状态名称
+        queryTrackParam.setResultv2("1");
+
+        // 查询地图轨迹必填,暂时写死
+        queryTrackParam.setTo("浙江省杭州市西湖区");
+        queryTrackParam.setFrom("浙江省嘉兴市南湖区");
+
+        String param = new Gson().toJson(queryTrackParam);
+
+        QueryTrackReq queryTrackReq = new QueryTrackReq();
+        queryTrackReq.setCustomer(customer);
+        queryTrackReq.setParam(param);
+        String sign = SignUtils.querySign(param ,key,customer);
+        queryTrackReq.setSign(sign);
+
+        IBaseClient baseClient = new QueryTrackMap();
+        try {
+            HttpResult execute = baseClient.execute(queryTrackReq);
+            String body = execute.getBody();
+            JSONObject jsonObject = JSONUtil.parseObj(body);
+            String flag = jsonObject.getStr("result");
+            if (StringUtils.equals(flag, "false")) {
+                return AjaxResult.error(jsonObject.getStr("message"));
+            }
+            List<LogisticsQueryVO> data = JSONUtil.toList(jsonObject.getStr("data"), LogisticsQueryVO.class);
+            if (CollectionUtils.isNotEmpty(data) && data.size() > 1) {
+                for (int i = data.size() - 1; i > 0; i--) {
+                    if (data.get(i).getStatus().equals(data.get(i-1).getStatus())) {
+                        data.get(i).setStatus("");
+                    }
+                }
+            }
+            return AjaxResult.success(data);
+
+        } catch (Exception e) {
+            LogUtil.error(logger, e, "物流查询异常");
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+
+
+
     @PostMapping("/autonumber/auto/{number}")
     @ApiOperation("自动单号识别接口")
     @ApiImplicitParams(
@@ -90,12 +164,7 @@ public class LogisticsController extends BaseApiController {
             return AjaxResult.success(deliveryCompany);
 
         } catch (Exception e) {
-            e.printStackTrace();
-        }
-        try {
-            return AjaxResult.success();
-        } catch (Exception e) {
-            e.printStackTrace();
+            LogUtil.error(logger, e, "自动单号识别异常");
             return error(e.getMessage());
         }
     }

+ 2 - 1
mp-common/src/main/java/com/qs/mp/common/enums/PayOrderStatusEnum.java

@@ -11,7 +11,8 @@ import com.baomidou.mybatisplus.annotation.IEnum;
 public enum PayOrderStatusEnum implements IEnum<String> {
 
   SUCCESS("1", "支付成功"),
-  WAIT("2", "待支付");
+  WAIT("2", "待支付"),
+  REFUND("3", "已退款");
 
 
   private final String value;

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

@@ -27,6 +27,10 @@ public class SendErrorMsgAppender extends UnsynchronizedAppenderBase<ILoggingEve
         ThrowableProxy throwableProxy = (ThrowableProxy) iThrowableProxy;
         Throwable throwable = throwableProxy.getThrowable();
         String throwableMsg = throwable.getMessage();
+        if (StringUtils.isNotBlank(throwableMsg) && (throwableMsg.startsWith("验证码失效") || throwableMsg.startsWith("重复购买,请稍后再试")
+        || throwableMsg.startsWith("盲票已付款,") || throwableMsg.startsWith("盲票已兑奖") || throwableMsg.startsWith("登录用户不存在:"))) {
+          return;
+        }
         StackTraceElementProxy[] stackTraceElementProxy = iThrowableProxy.getStackTraceElementProxyArray();
         //获取服务器Ip,告知哪台服务器抛异常
         /*String ip = Context.getContext().getIp();

+ 1 - 1
mp-framework/src/main/java/com/qs/mp/framework/web/service/UserDetailsServiceImpl.java

@@ -37,7 +37,7 @@ public class UserDetailsServiceImpl implements UserDetailsService
         if (StringUtils.isNull(user))
         {
             log.info("登录用户:{} 不存在.", username);
-            throw new ServiceException("登录用户:" + username + " 不存在");
+            throw new ServiceException("登录用户不存在:" + username);
         }
         else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
         {

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

@@ -115,11 +115,11 @@ public class DayStatTask {
 
     StringBuffer sbDetail = new StringBuffer("");
     LambdaQueryWrapper<TicketBox> queryWrapper = new LambdaQueryWrapper<TicketBox>()
-        .nested(wrapper -> {
-          wrapper.eq(TicketBox::getType, TicketTypeEnum.ONLINE).eq(TicketBox::getStatus,
-              TicketBoxStatusEnum.PUT_ON).or().eq(TicketBox::getType, TicketTypeEnum.OFFLINE);
-        })
-        .notLike(TicketBox::getTitle, "测试票")
+//        .nested(wrapper -> {
+//          wrapper.eq(TicketBox::getType, TicketTypeEnum.ONLINE).eq(TicketBox::getStatus,
+//              TicketBoxStatusEnum.PUT_ON).or().eq(TicketBox::getType, TicketTypeEnum.OFFLINE);
+//        })
+//        .notLike(TicketBox::getTitle, "测试票")
         .eq(TicketBox::getIsDeleted, 0);
 
     int totalSize = ticketBoxService.count(queryWrapper);

+ 1 - 1
mp-quartz/src/main/java/com/qs/mp/quartz/task/OperateToolTask.java

@@ -50,7 +50,7 @@ public class OperateToolTask {
   public void refund(String orderNo, Integer refundAmount){
     LogUtil.info(logger, "...退款任务开始...");
 
-    walletService.refund(orderNo, refundAmount);
+    walletService.refundByUser(orderNo, refundAmount, "后台人工操作");
 
     LogUtil.info(logger, "...退款任务结束...");
 

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

@@ -20,6 +20,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.*;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -29,6 +31,7 @@ import lombok.Data;
  */
 @TableName("mp_goods")
 @Data
+@ApiModel("商品库实体类")
 public class Goods implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -36,84 +39,112 @@ public class Goods implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("商品ID,主键")
   @TableId(value = "goods_id", type = IdType.AUTO)
   private Long goodsId;
 
   /**
    * 商品标题
    */
+  @ApiModelProperty("商品标题")
   @TableField("title")
   private String title;
 
   /**
    * 商品类目ID
    */
+  @ApiModelProperty("商品类目ID")
   @TableField("category_id")
   private Long categoryId;
 
+  @ApiModelProperty("商品编码")
+  @TableField("goods_code")
+  private String goodsCode;
+
   /**
    * 商品图片
    */
+  @ApiModelProperty("商品图片")
   @TableField("pic_url")
   private String picUrl;
 
   /**
    * 详情
    */
+  @ApiModelProperty("详情")
   @TableField("description")
   private String description;
 
   /**
    * 原兑换价格
    */
+  @ApiModelProperty("原兑换价格")
   @TableField("origin_price")
   private Integer originPrice;
 
   /**
    * 现兑换价格
    */
+  @ApiModelProperty("现兑换价格")
   @TableField("exchange_price")
   private Integer exchangePrice;
 
   /**
    * 商品价值
    */
+  @ApiModelProperty("商品价值")
   @TableField("value")
   private Integer value;
 
   /**
    * 商品成本
    */
+  @ApiModelProperty("商品成本")
   @TableField("cost")
   private Integer cost;
 
   /**
    * 库存数量
    */
+  @ApiModelProperty("库存数量")
   @TableField("quantity")
   private Integer quantity;
 
   /**
    * 已兑换量
    */
+  @ApiModelProperty("已兑换量")
   @TableField("exchanged_qty")
   private Integer exchangedQty;
 
   /**
    * 兑换大厅是否展示,0不展示,1展示
    */
+  @ApiModelProperty("兑换大厅是否展示,0不展示,1展示")
   @TableField("exchange_show")
   private Integer exchangeShow;
 
+
+  @ApiModelProperty("商家信息")
+  @TableField("merchant_info")
+  private String merchantInfo;
+
+
+  @ApiModelProperty("排序权重,越大越靠前")
+  @TableField("sort_weight")
+  private Integer sortWeight;
+
   /**
    * 是否多sku,0否,1是
    */
+  @ApiModelProperty("是否多sku,0否,1是")
   @TableField("multi_sku")
   private Integer multiSku;
 
   /**
    * 规格描述
    */
+  @ApiModelProperty("规格描述")
   @TableField("sku_prop")
   private String skuProp;
 
@@ -121,6 +152,7 @@ public class Goods implements Serializable {
   /**
    * 上架状态;上架/下架
    */
+  @ApiModelProperty("上架状态;上架/下架")
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private GoodsStatusEnum status;
@@ -128,6 +160,7 @@ public class Goods implements Serializable {
   /**
    * 逻辑删除标识
    */
+  @ApiModelProperty("逻辑删除标识")
   @TableField("is_deleted")
   @TableLogic
   private Integer isDeleted;
@@ -135,12 +168,14 @@ public class Goods implements Serializable {
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 }

+ 21 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/GoodsSku.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -15,6 +18,7 @@ import lombok.Data;
  */
 @TableName("mp_goods_sku")
 @Data
+@ApiModel("商品规格实体类")
 public class GoodsSku implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -22,78 +26,95 @@ public class GoodsSku implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("skuId,主键")
   @TableId(value = "sku_id", type = IdType.AUTO)
   private Long skuId;
 
   /**
    * 商品ID
    */
+  @ApiModelProperty("商品id")
   @TableField("goods_id")
   private Long goodsId;
 
   /**
    * sku名称
    */
+  @ApiModelProperty("sku名称")
   @TableField("name")
   private String name;
 
+  @ApiModelProperty("sku编码")
+  @TableField("sku_code")
+  private String skuCode;
+
   /**
    * 图片
    */
+  @ApiModelProperty("图片")
   @TableField("pic_url")
   private String picUrl;
 
   /**
    * 属性组合字符串 格式是p1:v1;p2:v2
    */
+  @ApiModelProperty("属性组合字符串 格式是p1:v1;p2:v2")
   @TableField("properties")
   private String properties;
 
   /**
    * 原兑换价格
    */
+  @ApiModelProperty("原兑换价格")
   @TableField("origin_price")
   private Integer originPrice;
 
   /**
    * 现兑换价格
    */
+  @ApiModelProperty("现兑换价格")
   @TableField("exchange_price")
   private Integer exchangePrice;
 
   /**
    * 商品价格
    */
+  @ApiModelProperty("商品价格")
   @TableField("value")
   private Integer value;
 
   /**
    * 商品成本
    */
+  @ApiModelProperty("商品成本")
   @TableField("cost")
   private Integer cost;
 
   /**
    * 库存数
    */
+  @ApiModelProperty("库存数")
   @TableField("quantity")
   private Integer quantity;
 
   /**
    * 已兑换数
    */
+  @ApiModelProperty("已兑换数")
   @TableField("sold_qty")
   private Integer soldQty;
 
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

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

@@ -156,6 +156,10 @@ public class TicketBox implements Serializable {
   @TableField("properties")
   private String properties;
 
+  @ApiModelProperty("排序权重,越大越靠前")
+  @TableField("sort_weight")
+  private Integer sortWeight;
+
   /**
    * 上架时间
    */

+ 24 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelOrderCancelParam.java

@@ -0,0 +1,24 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Value;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 经销商订单取消入参类
+ * @author Cup
+ * @date 2022/4/26
+ */
+@ApiModel("经销商订单取消入参类")
+@Data
+public class ChannelOrderCancelParam {
+
+    @NotBlank(message = "订单id不能为空")
+    @ApiModelProperty(value = "订单id",required = true)
+    private String orderId;
+
+}

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

@@ -2,6 +2,7 @@ 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.admin.domain.GoodsSku;
 import com.qs.mp.common.enums.GoodsStatusEnum;
 
@@ -33,6 +34,9 @@ public class GoodsParam {
 	@ApiModelProperty(value = "商品类目ID", required = false)
 	private Long categoryId;
 
+	@ApiModelProperty("商品编码")
+	private String goodsCode;
+
 	/**
 	 * 商品图片
 	 */
@@ -112,4 +116,9 @@ public class GoodsParam {
 	@ApiModelProperty(value = "商品标签ID列表", required = false)
 	private List<Long> tagIds;
 
+
+	@ApiModelProperty("商家信息")
+	private String merchantInfo;
+
+
 }

+ 23 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsUpdateSortWeightParam.java

@@ -0,0 +1,23 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * 商品排序权重更新入参类
+ * @author Cup
+ * @date 2022/4/26
+ */
+@ApiModel("商品排序权重更新入参类")
+@Data
+public class GoodsUpdateSortWeightParam {
+
+
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+
+    @ApiModelProperty("权重值")
+    private Integer sortWeight;
+}

+ 31 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/LogisticsQueryParam.java

@@ -0,0 +1,31 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 物流消息查询入参类
+ * @author Cup
+ * @date 2022/4/26
+ */
+@Data
+@ApiModel("物流查询入参类")
+public class LogisticsQueryParam implements Serializable {
+
+
+    @NotNull(message = "物流公司id不能为空")
+    @ApiModelProperty("物流公司id")
+    private Long deliveryId;
+
+
+    @NotBlank(message = "物流单号不能为空")
+    @ApiModelProperty("物流单号")
+    private String deliveryFlowId;
+
+
+}

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

@@ -15,6 +15,9 @@ import lombok.Data;
 @Data
 public class TicketAwardsParam {
 
+  @ApiModelProperty("奖项ID")
+  private String awardsId;
+
   @NotEmpty(message = "奖品列表不能为空")
   @ApiModelProperty(value = "奖品列表",required=true)
   List<TicketAwardsPrizeParam> prizeList;

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

@@ -13,6 +13,10 @@ import lombok.Data;
 @ApiModel(value= "盲票组奖级对应的奖品参数")
 @Data
 public class TicketAwardsPrizeParam {
+
+  @ApiModelProperty("奖品id")
+  private String prizeId;
+
   @NotNull(message = "奖品关联ID不能为空")
   @ApiModelProperty(value = "奖品关联ID",required=true)
   private String refId;

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

@@ -0,0 +1,43 @@
+package com.qs.mp.admin.domain.param;
+
+import com.qs.mp.common.enums.TicketTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 盲票组更新入参类
+ * @author Cup
+ * @date 2022/4/26
+ */
+@ApiModel(value= "盲票组更新入参类")
+@Data
+public class TicketBoxUpdateParam {
+
+    @ApiModelProperty(value = "盲票组ID")
+    private String boxId;
+
+    @ApiModelProperty(value = "盲票组标题")
+    private String title;
+
+    @ApiModelProperty(value = "图片")
+    private String picUrl;
+
+    @NotNull(message = "售价不能为空")
+    @ApiModelProperty(value = "售价",required=true)
+    private Integer salePrice;
+
+    @ApiModelProperty(value = "盲票包采购单价,线下票时必传")
+    private Integer pkgSalePrice;
+
+    @ApiModelProperty(value = "分佣基数")
+    private BigDecimal saleCommRate;
+
+    @ApiModelProperty(value = "奖级列表")
+    List<TicketAwardsParam> awardsList;
+}

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

@@ -0,0 +1,22 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 盲票排序权重更新入参类
+ * @author Cup
+ * @date 2022/4/26
+ */
+@ApiModel("盲票排序权重更新入参类")
+@Data
+public class TicketUpdateSortWeightParam {
+
+
+    @ApiModelProperty("盲票组id")
+    private String boxId;
+
+    @ApiModelProperty("权重值")
+    private Integer sortWeight;
+}

+ 34 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/vo/GoodsVO.java

@@ -2,116 +2,149 @@ package com.qs.mp.admin.domain.vo;
 
 import com.alibaba.fastjson.annotation.JSONField;
 import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.common.enums.GoodsStatusEnum;
 
 import java.util.Date;
 import java.util.List;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
- * @describe 商品库实体
+ * @describe 商品详情VO
  * @auther quanshu
  * @create 2022-03-07 20:43:44
  */
 @Data
+@ApiModel("商品详情VO类")
 public class GoodsVO {
 
 	/**
 	 * 规格列表
 	 */
+	@ApiModelProperty("规格列表")
 	private List<GoodsSku> skuList;
 
+	@ApiModelProperty("商品id")
 	private Long goodsId;
 	/**
 	 * 商品标题
 	 */
+	@ApiModelProperty("商品标题")
 	private String title;
 
 	/**
 	 * 商品类目ID
 	 */
+	@ApiModelProperty("商品类目ID")
 	private Long categoryId;
 
+	@ApiModelProperty("商品编码")
+	private String goodsCode;
+
 	/**
 	 * 商品图片
 	 */
+	@ApiModelProperty("商品图片")
 	private String picUrl;
 
 	/**
 	 * 详情
 	 */
+	@ApiModelProperty("详情")
 	private String description;
 
 	/**
 	 * 原兑换价格
 	 */
+	@ApiModelProperty("原兑换价格")
 	private Integer originPrice;
 
 	/**
 	 * 现兑换价格
 	 */
+	@ApiModelProperty("现兑换价格")
 	private Integer exchangePrice;
 
 	/**
 	 * 商品价值
 	 */
+	@ApiModelProperty("商品价值")
 	private Integer value;
 
 	/**
 	 * 商品成本
 	 */
+	@ApiModelProperty("商品成本")
 	private Integer cost;
 
 	/**
 	 * 库存数量
 	 */
+	@ApiModelProperty("库存数量")
 	private Integer quantity;
 
 	/**
 	 * 已兑换量
 	 */
+	@ApiModelProperty("已兑换量")
 	private Integer exchangedQty;
 
 	/**
 	 * 兑换大厅是否展示,0不展示,1展示
 	 */
+	@ApiModelProperty("兑换大厅是否展示,0不展示,1展示")
 	private Integer exchangeShow;
 
 	/**
 	 * 是否多sku,0否,1是
 	 */
+	@ApiModelProperty("是否多sku,0否,1是")
 	private Integer multiSku;
 
 	/**
 	 * 规格描述
 	 */
+	@ApiModelProperty("规格描述")
 	private String skuProp;
 
 	/**
 	 * 上架状态;上架/下架
 	 */
+	@ApiModelProperty("上架状态;上架/下架")
 	@JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
 	private GoodsStatusEnum status;
 
 	/**
 	 * 逻辑删除标识
 	 */
+	@ApiModelProperty("逻辑删除标识")
 	private Integer isDeleted;
 
 	/**
 	 * 标签ID列表
 	 */
+	@ApiModelProperty("标签ID列表")
 	private List<Long> tagIds;
 
+
+
+	@ApiModelProperty("商家信息")
+	private String merchantInfo;
+
+
 	/**
 	 * 创建时间
 	 */
+	@ApiModelProperty("创建时间")
 	private Date createdTime;
 
 	/**
 	 * 更新时间
 	 */
+	@ApiModelProperty("更新时间")
 	private Date updatedTime;
 }

+ 25 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/LogisticsQueryVO.java

@@ -0,0 +1,25 @@
+package com.qs.mp.admin.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 物流查询出参类
+ * @author Cup
+ * @date 2022/4/26
+ */
+@ApiModel("物流查询出参类")
+@Data
+public class LogisticsQueryVO {
+
+    @ApiModelProperty("时间")
+    private String time;
+
+    @ApiModelProperty("内容")
+    private String context;
+
+    @ApiModelProperty("状态")
+    private String status;
+
+}

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

@@ -3,6 +3,7 @@ package com.qs.mp.admin.service;
 import com.qs.mp.admin.domain.TicketBox;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
+import com.qs.mp.admin.domain.param.TicketBoxUpdateParam;
 
 /**
  * <p>
@@ -32,4 +33,11 @@ public interface ITicketBoxService extends IService<TicketBox> {
    * @param boxId
    */
   void removeTicketBox(String boxId);
+
+    /**
+     * 更新盲票信息
+     * @param param 更新入参类
+     * @return
+     */
+  boolean updateTicketBox(TicketBoxUpdateParam param);
 }

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

@@ -3,6 +3,7 @@ package com.qs.mp.admin.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.Coupon;
 import com.qs.mp.admin.domain.Goods;
@@ -15,6 +16,7 @@ import com.qs.mp.admin.domain.dto.TicketDrawNumDTO;
 import com.qs.mp.admin.domain.param.TicketAwardsParam;
 import com.qs.mp.admin.domain.param.TicketAwardsPrizeParam;
 import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
+import com.qs.mp.admin.domain.param.TicketBoxUpdateParam;
 import com.qs.mp.admin.mapper.TicketBoxMapper;
 import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.admin.service.IGoodsService;
@@ -31,9 +33,11 @@ import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.RSAUtil;
+import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -46,6 +50,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.stream.Collectors;
+
 import lombok.Data;
 import ma.glasnost.orika.MapperFacade;
 import org.apache.pulsar.client.api.PulsarClientException;
@@ -55,7 +61,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
-import org.springframework.util.CollectionUtils;
 
 /**
  * <p>
@@ -98,6 +103,104 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
   @Autowired
   private ITicketPackageService ticketPackageService;
 
+  @Override
+  @Transactional(rollbackFor = Exception.class)
+  public boolean updateTicketBox(TicketBoxUpdateParam param) {
+    if (StringUtils.isBlank(param.getBoxId())) {
+      throw new ServiceException("盲票组ID不能为空");
+    }
+    // 设置更新盲票基本信息
+    TicketBox ticketBox = new TicketBox();
+    ticketBox.setBoxId(param.getBoxId());
+    ticketBox.setTitle(param.getTitle());
+    ticketBox.setPicUrl(param.getPicUrl());
+    ticketBox.setSalePrice(param.getSalePrice());
+    ticketBox.setPkgSalePrice(param.getPkgSalePrice());
+    ticketBox.setSaleCommRate(param.getSaleCommRate());
+    this.updateById(ticketBox);
+
+    // 校验更新奖品信息
+    if (CollectionUtils.isEmpty(param.getAwardsList())) {
+      throw new ServiceException("奖品列表不能为空");
+    }
+    // 校验奖品信息
+    int count = ticketAwardsService.count(new LambdaQueryWrapper<TicketAwards>().eq(TicketAwards::getBoxId, param.getBoxId()));
+    if (count != param.getAwardsList().size()) {
+      throw new ServiceException("奖级数量与原来不同");
+    }
+
+    // 更新奖品信息
+    for (TicketAwardsParam ticketAwardsParam : param.getAwardsList()) {
+       if (CollectionUtils.isEmpty(ticketAwardsParam.getPrizeList())) {
+        throw new ServiceException("奖品列表不能为空");
+       }
+
+       List<TicketAwardsPrize> ticketAwardsPrizeList = new ArrayList<>();
+      List<String> prizeIdList = ticketAwardsParam.getPrizeList().stream().map(ticketAwardsPrizeParam -> {
+        // 奖品id为空则封装要新增的奖品
+        if (StringUtils.isBlank(ticketAwardsPrizeParam.getPrizeId())) {
+          // 封装奖品信息
+          TicketAwardsPrize awardsPrize = mapperFacade.map(ticketAwardsPrizeParam, TicketAwardsPrize.class);
+          awardsPrize.setPrizeId(bizIdGenerator.newId());
+          awardsPrize.setBoxId(ticketBox.getBoxId());
+          awardsPrize.setAwardsId(ticketAwardsParam.getAwardsId());
+          if (null == awardsPrize.getQuantity() || 0 == awardsPrize.getQuantity()) {
+            // 页面没设置奖品的具体数量,则默认为整个奖项的数量
+            awardsPrize.setQuantity(ticketAwardsParam.getQuantity());
+          }
+          awardsPrize.setRemainQty(awardsPrize.getQuantity());
+          awardsPrize.setCashedQty(0);
+          if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
+            Goods goods = goodsService.getById(awardsPrize.getRefId());
+            awardsPrize.setTitle(goods.getTitle());
+            awardsPrize.setPicUrl(goods.getPicUrl());
+            awardsPrize.setValue(goods.getValue());
+          } else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
+            Coupon coupon = couponService.getById(awardsPrize.getRefId());
+            awardsPrize.setTitle(coupon.getTitle());
+            awardsPrize.setPicUrl(coupon.getPicUrl());
+            awardsPrize.setValue(coupon.getDiscount());
+          } else {
+            awardsPrize.setTitle("盲豆");
+            awardsPrize.setPicUrl("md.jpeg");
+          }
+          ticketAwardsPrizeList.add(awardsPrize);
+        }
+        return ticketAwardsPrizeParam.getPrizeId();
+      }).collect(Collectors.toList());
+
+      // 如果新的奖品id为空,则清除原来的所有奖品
+      if (CollectionUtils.isEmpty(prizeIdList)) {
+        ticketAwardsPrizeService.remove(new LambdaUpdateWrapper<TicketAwardsPrize>().eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
+      } else {
+        // 去重后,清除原来的奖品
+        // 查询原来的奖品信息
+        List<TicketAwardsPrize> oldTicketAwardsPrizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
+                .select(TicketAwardsPrize::getPrizeId)
+                .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
+        if (CollectionUtils.isEmpty(oldTicketAwardsPrizeList)) {
+          throw new ServiceException("原奖品列表为空");
+        }
+        List<String> oldPrizeIdList = oldTicketAwardsPrizeList.stream().map(TicketAwardsPrize::getPrizeId).collect(Collectors.toList());
+        // 去重原来的奖品信息
+        oldPrizeIdList.removeAll(prizeIdList);
+
+        if (CollectionUtils.isNotEmpty(oldPrizeIdList)) {
+          // 删除原来的奖品信息
+          ticketAwardsPrizeService.removeByIds(oldPrizeIdList);
+        }
+      }
+
+      // 新增奖品
+      if (CollectionUtils.isNotEmpty(ticketAwardsPrizeList)) {
+        ticketAwardsPrizeService.saveBatch(ticketAwardsPrizeList);
+      }
+
+    }
+
+    return true;
+  }
+
   @Override
   @Transactional
   public String createTicketBox(TicketBoxCreateParam param) {

+ 8 - 1
mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java

@@ -1,5 +1,6 @@
 package com.qs.mp.channel.service;
 
+import com.qs.mp.admin.domain.param.ChannelOrderCancelParam;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
@@ -73,5 +74,11 @@ public interface IChannelOrderService extends IService<ChannelOrder> {
 	 * @return
 	 */
 	int selectChannelOrderCount(Wrapper<ChannelOrder> wrapper);
-	
+
+	/**
+	 * 后台经销商取消订单
+	 * @param param
+	 * @return
+	 */
+    boolean cancelOrderByAdmin(ChannelOrderCancelParam param);
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelService.java

@@ -110,4 +110,10 @@ public interface IChannelService extends IService<Channel> {
     */
 	List<IndexVO> selectIndexSiteIncreaseList(Wrapper<Channel> wrapper);
 
+	/**
+	 * 审核通过的经销商
+	 * @param channel
+	 * @return
+	 */
+    boolean siteVerify(Channel channel);
 }

+ 84 - 11
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -4,12 +4,17 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.domain.param.ChannelOrderCancelParam;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
+import com.qs.mp.common.enums.PayOrderStatusEnum;
+import com.qs.mp.pay.service.IPayOrderService;
+import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
@@ -32,6 +37,7 @@ import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 import org.slf4j.Logger;
@@ -75,6 +81,12 @@ public class ChannelOrderServiceImpl extends
   @Autowired
   private IChannelOrderDetailService channelOrderDetailervice;
 
+  @Autowired
+  private IWalletService walletService;
+
+  @Autowired
+  private IPayOrderService payOrderService;
+
   @Override
   @Transactional
   public String submitOrder(Long channelId, String memo, ChannelOrderSettleVO orderSettleVO) {
@@ -148,7 +160,7 @@ public class ChannelOrderServiceImpl extends
   }
 
   @Override
-  @Transactional
+  @Transactional(rollbackFor = Exception.class)
   public boolean cancelOrder(Long channelId, String orderId) {
     ChannelOrder channelOrder = channelOrderService.getOne(new LambdaQueryWrapper<ChannelOrder>()
         .eq(ChannelOrder::getChannelId, channelId).eq(ChannelOrder::getOrderId, orderId));
@@ -162,15 +174,8 @@ public class ChannelOrderServiceImpl extends
     for (ChannelOrderItem orderItem : orderItemList) {
       TicketBox ticketBox = ticketBoxService.getById(orderItem.getBoxId());
       // 恢复盲票组的已销售数和状态,乐观锁
-      boolean rst = ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
-          .set(
-              ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF && ticketBox.getManualOff() != 1,
-              TicketBox::getStatus,
-              TicketBoxStatusEnum.PUT_ON)
-          .set(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty() - orderItem.getOrderNum())
-          .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty())
-          .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
-      if (!rst) {
+        boolean rst = rollbackTicketStatusAndSalePkgQty(orderItem, ticketBox);
+        if (!rst) {
         LogUtil.error(logger, "渠道采购票组订单取消时,更新盲票组销量失败。boxId:{0}, saleQty:{1}",
             ticketBox.getBoxId(), ticketBox.getSaleQty());
         throw new ServiceException("渠道采购票组订单取消时,更新盲票组销量失败");
@@ -188,7 +193,75 @@ public class ChannelOrderServiceImpl extends
     return true;
   }
 
-  @Override
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean cancelOrderByAdmin(ChannelOrderCancelParam param) {
+        ChannelOrder channelOrder = this.getById(param.getOrderId());
+        if (Objects.isNull(channelOrder)) {
+            throw new ServiceException("订单不存在");
+        }
+        if (!ChannelOrderStatusEnum.NOT_DELIVER.equals(channelOrder.getStatus())) {
+            throw new ServiceException("订单状态异常,不能取消");
+        }
+
+        // 更新订单状态
+        ChannelOrder channelOrderParam  = new ChannelOrder();
+        channelOrderParam.setOrderId(channelOrder.getOrderId());
+        channelOrderParam.setStatus(ChannelOrderStatusEnum.CANCELED);
+        this.updateById(channelOrderParam);
+
+        // 更新销量
+        List<ChannelOrderItem> list = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>().eq(ChannelOrderItem::getOrderId, param.getOrderId()));
+        if (CollectionUtils.isEmpty(list)) {
+            throw new ServiceException("订单商品不存在");
+        }
+        for (ChannelOrderItem channelOrderItem : list) {
+            TicketBox ticketBox = ticketBoxService.getById(channelOrderItem.getBoxId());
+
+            boolean rst = this.rollbackTicketStatusAndSalePkgQty(channelOrderItem, ticketBox);
+            if (!rst) {
+                throw new ServiceException("操作繁忙,请稍后再试!");
+            }
+        }
+
+        // 获取支付成功的订单号
+        PayOrder payOrder = payOrderService.getOne(new LambdaQueryWrapper<PayOrder>()
+                .eq(PayOrder::getBizId, channelOrder.getOrderId())
+                .eq(PayOrder::getOrderStatus, PayOrderStatusEnum.SUCCESS));
+        if (Objects.isNull(payOrder)) {
+            throw new ServiceException("支付订单不存在");
+        }
+
+        // 更新支付表订单状态
+        PayOrder payOrderParam = new PayOrder();
+        payOrderParam.setOrderId(payOrder.getOrderId());
+        payOrderParam.setOrderStatus(PayOrderStatusEnum.REFUND.getValue());
+        payOrderService.updateById(payOrderParam);
+
+        // 退款
+        walletService.refundByChannel(payOrder.getOrderId(), channelOrder.getPayAmt(),"经销商取消订单");
+
+        return true;
+    }
+
+    /**
+     * 回滚盲票组销量和状态
+     * @param orderItem
+     * @param ticketBox
+     * @return
+     */
+    private boolean rollbackTicketStatusAndSalePkgQty(ChannelOrderItem orderItem, TicketBox ticketBox) {
+        return ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+                .set(
+                        ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF && ticketBox.getManualOff() != 1,
+                        TicketBox::getStatus,
+                        TicketBoxStatusEnum.PUT_ON)
+                .set(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty() - orderItem.getOrderNum())
+                .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty())
+                .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+    }
+
+    @Override
   public void paySuccess(PayOrder payOrder) {
     ChannelOrder channelOrder = getById(payOrder.getBizId());
     if (null == channelOrder || channelOrder.getStatus() != ChannelOrderStatusEnum.NOT_PAY) {

+ 43 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java

@@ -12,7 +12,9 @@ import com.qs.mp.channel.mapper.ChannelMapper;
 import com.qs.mp.channel.service.IChannelCommissionService;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
 import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.common.enums.ChannelVerifyStatusEnum;
 import com.qs.mp.common.enums.RoleTypeEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.jsms.JSMSUtils;
@@ -20,6 +22,8 @@ import com.qs.mp.system.domain.SysRole;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysRoleService;
 import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.user.domain.UserAddr;
+import com.qs.mp.user.service.IUserAddrService;
 import com.qs.mp.utils.SecurityUtils;
 import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,6 +58,9 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
   @Autowired
   private ISysRoleService roleService;
 
+  @Autowired
+  private IUserAddrService userAddrService;
+
   @Override
   @Transactional
   public void saveChannel(Channel channel, ChannelRoleEnum channelRole) {
@@ -187,4 +194,40 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
 	 return getBaseMapper().selectIndexSiteIncreaseList(wrapper);
   }
 
+  @Override
+  @Transactional(rollbackFor = Exception.class)
+  public boolean siteVerify(Channel channel) {
+
+    if(channel.getVerifyStatus() == ChannelVerifyStatusEnum.ACCEPT) {
+      channel.setCertifyStatus(ChannelCertifyStatusEnum.CERTIFIED);
+
+      // 获取经销商信息
+      Channel param = this.getById(channel.getChannelId());
+      // 设置保存地址信息
+      UserAddr userAddr = new UserAddr();
+      userAddr.setUserId(param.getUserId());
+      userAddr.setReceiver(param.getContact());
+      userAddr.setProvince(param.getProvince());
+      userAddr.setProvinceId(param.getProvinceId());
+      userAddr.setCity(param.getCity());
+      userAddr.setCityId(param.getCityId());
+      userAddr.setArea(param.getArea());
+      userAddr.setAreaId(param.getAreaId());
+      userAddr.setAddr(param.getAddress());
+      userAddr.setMobile(param.getMobile());
+      userAddr.setStatus(1);
+      int count = userAddrService.count(new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, channel.getUserId()));
+      if (count == 0) {
+        userAddr.setCommonAddr(1);
+      }
+      userAddrService.save(userAddr);
+
+    }else {
+      channel.setCertifyStatus(ChannelCertifyStatusEnum.NOT_CERTIFIED);
+    }
+    // 更新经销商信息
+    channelService.updateById(channel);
+
+    return true;
+  }
 }

+ 15 - 0
mp-service/src/main/java/com/qs/mp/common/domain/DeliveryCompany.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -15,6 +18,7 @@ import lombok.Data;
  */
 @TableName("mp_delivery_company")
 @Data
+@ApiModel("物流公司实体类")
 public class DeliveryCompany implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -22,36 +26,47 @@ public class DeliveryCompany implements Serializable {
   /**
    * ID
    */
+  @ApiModelProperty("物流公司id")
   @TableId(value = "delivery_id", type = IdType.AUTO)
   private Long deliveryId;
 
   /**
    * 物流公司名称
    */
+  @ApiModelProperty("物流公司名称")
   @TableField("company_name")
   private String companyName;
 
   /**
    * 公司主页
    */
+  @ApiModelProperty("公司主页")
   @TableField("company_home_url")
   private String companyHomeUrl;
 
   /**
    * 物流查询接口
    */
+  @ApiModelProperty("物流查询接口")
   @TableField("query_url")
   private String queryUrl;
 
+  @ApiModelProperty("物流公司编码")
+  @TableField("code")
+  private String code;
+
+
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

+ 11 - 3
mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java

@@ -17,15 +17,23 @@ public interface IWalletService {
    * @param bizId
    * @param openId
    * @param money
+   * @param orderRemark
    * @return
    */
-  JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money);
+  JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money,
+      String orderRemark);
 
   /**
-   * 订单退款
+   * 用户订单退款
    * @return
    */
-  boolean refund(String orderNo, Integer refundAmount);
+  boolean refundByUser(String orderNo, Integer refundAmount, String remark);
+
+  /**
+   * 经销商订单退款
+   * @return
+   */
+  boolean refundByChannel(String orderNo, Integer refundAmount, String remark);
 
   /**
    *

+ 38 - 15
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -1,12 +1,9 @@
 package com.qs.mp.pay.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.common.enums.BizTypeEnum;
 import com.qs.mp.common.enums.MqTopicType;
-import com.qs.mp.common.enums.PayOrderStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.DateUtils;
@@ -19,15 +16,12 @@ import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.service.IUserDeliverOrderService;
 import com.qs.mp.user.service.IUserTicketOrderService;
-import java.util.List;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @auther duota
@@ -83,7 +77,8 @@ public class WalletServiceImpl implements IWalletService {
   private static final String PAY_RESOURCE_TYPE = "1017"; //2:微信小程序
 
   @Override
-  public JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money) {
+  public JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money,
+      String orderRemark) {
     String reqUrl = baseUrl + "/pay/payMoneyCTB";
     String appId = channelAppId;
     String payShopNo = channelPayShopNo;
@@ -93,7 +88,7 @@ public class WalletServiceImpl implements IWalletService {
       payShopNo = userPayShopNo;
       paySign = userPaySign;
     }
-    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId);
+    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId, orderRemark);
     String result = OkHttpUtil.postJsonParams(reqUrl, params.toJSONString());
     logger.info("request params:" + params.toJSONString() + "  result:" + result);
     if (StringUtils.isBlank(result)) {
@@ -127,7 +122,7 @@ public class WalletServiceImpl implements IWalletService {
   }
 
   @Override
-  public boolean refund(String orderNo, Integer refundAmount) {
+  public boolean refundByUser(String orderNo, Integer refundAmount, String remark) {
 
     String reqUrl = baseUrl + "/pay/refundOrder";
 
@@ -136,13 +131,41 @@ public class WalletServiceImpl implements IWalletService {
     sendData.put("timestamp",System.currentTimeMillis());
     sendData.put("order_no",orderNo);
     sendData.put("refund_amount", refundAmount);
-    sendData.put("order_remark", "测试退款");
+    sendData.put("order_remark", remark);
     sendData.put("type","sno");
     sendData.put("sign",userPaySign);
-    System.err.println(sendData.toJSONString());
     String result = OkHttpUtil.postJsonParams(reqUrl, sendData.toJSONString());
-    System.err.println(result);
-    return true;
+    JSONObject jsonObject = JSONObject.parseObject(result);
+    String code = jsonObject.getString("code");
+    logger.info("用户订单退款 -> request params:" + sendData.toJSONString() + "  result:" + result);
+    if ("R0001".equals(code)) {
+      return true;
+    }
+    throw new ServiceException(jsonObject.getString("result"));
+  }
+
+
+  @Override
+  public boolean refundByChannel(String orderNo, Integer refundAmount, String remark) {
+
+    String reqUrl = baseUrl + "/pay/refundOrder";
+
+    JSONObject sendData = new JSONObject();
+    sendData.put("shop_no", channelPayShopNo);
+    sendData.put("timestamp",System.currentTimeMillis());
+    sendData.put("order_no",orderNo);
+    sendData.put("refund_amount", refundAmount);
+    sendData.put("order_remark", remark);
+    sendData.put("type","sno");
+    sendData.put("sign",channelPaySign);
+    String result = OkHttpUtil.postJsonParams(reqUrl, sendData.toJSONString());
+    JSONObject jsonObject = JSONObject.parseObject(result);
+    String code = jsonObject.getString("code");
+    logger.info("经销商订单退款 -> request params:" + sendData.toJSONString() + "  result:" + result);
+    if ("R0001".equals(code)) {
+      return true;
+    }
+    throw new ServiceException(jsonObject.getString("result"));
   }
 
   @Override
@@ -199,7 +222,7 @@ public class WalletServiceImpl implements IWalletService {
     return payOrder;
   }
 
-  private JSONObject buildPayOrderReqData(String shopNo, String sign, int money, String openId, String appId) {
+  private JSONObject buildPayOrderReqData(String shopNo, String sign, int money, String openId, String appId, String orderRemark) {
 
     JSONObject sendData = new JSONObject();
     sendData.put("shop_no" , shopNo);
@@ -208,7 +231,7 @@ public class WalletServiceImpl implements IWalletService {
     sendData.put("pay_resource" , PAY_RESOURCE); //支付来源 1:支付宝  2:微信支付 5:云闪付
     sendData.put("trans_type_code" , PAY_RESOURCE_TYPE); //1017:微信小程序
     sendData.put("transaction_amount" , money);
-    sendData.put("order_remark" , "");
+    sendData.put("order_remark" , orderRemark);
     sendData.put("timestamp" , System.currentTimeMillis());
     sendData.put("callback_url" , callbackUrl);
 

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

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.Version;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -16,6 +19,7 @@ import lombok.Data;
  */
 @TableName("mp_user_addr")
 @Data
+@ApiModel("用户配送地址实体类")
 public class UserAddr implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -23,96 +27,112 @@ public class UserAddr implements Serializable {
   /**
    * ID
    */
+  @ApiModelProperty("地址id,主键")
   @TableId(value = "addr_id" , type = IdType.AUTO)
   private Long addrId;
 
   /**
-   * 渠道ID
+   * 用户ID
    */
+  @ApiModelProperty("用户id")
   @TableField("user_id")
   private Long userId;
 
   /**
    * 收货人
    */
+  @ApiModelProperty("收货人")
   @TableField("receiver")
   private String receiver;
 
   /**
    * 省ID
    */
+  @ApiModelProperty("省id")
   @TableField("province_id")
   private Long provinceId;
 
   /**
    * 省
    */
+  @ApiModelProperty("省")
   @TableField("province")
   private String province;
 
   /**
    * 城市
    */
+  @ApiModelProperty("城市")
   @TableField("city")
   private String city;
 
   /**
    * 城市ID
    */
+  @ApiModelProperty("城市id")
   @TableField("city_id")
   private Long cityId;
 
   /**
    * 区
    */
+  @ApiModelProperty("区")
   @TableField("area")
   private String area;
 
   /**
    * 区ID
    */
+  @ApiModelProperty("区id")
   @TableField("area_id")
   private Long areaId;
 
   /**
    * 邮编
    */
+  @ApiModelProperty("邮编")
   @TableField("post_code")
   private String postCode;
 
   /**
    * 地址
    */
+  @ApiModelProperty("地址")
   @TableField("addr")
   private String addr;
 
   /**
    * 手机
    */
+  @ApiModelProperty("手机")
   @TableField("mobile")
   private String mobile;
 
   /**
    * 状态,1正常,0无效
    */
+  @ApiModelProperty("状态,1正常,0无效")
   @TableField("status")
   private Integer status;
 
   /**
    * 是否默认地址 1是
    */
+  @ApiModelProperty("是否默认地址 1是")
   @TableField("common_addr")
   private Integer commonAddr;
 
   /**
    * 建立时间
    */
+  @ApiModelProperty("建立时间")
   @TableField("create_time")
   private Date createTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @Version
   @TableField("update_time")
   private Date updateTime;

+ 25 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrderItem.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.Version;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -16,6 +19,7 @@ import lombok.Data;
  */
 @TableName("mp_user_ticket_order_item")
 @Data
+@ApiModel("用户盲票订单明细实体类")
 public class UserTicketOrderItem implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -23,42 +27,63 @@ public class UserTicketOrderItem implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("明细id,主键")
   @TableId(value = "item_id", type = IdType.INPUT)
   private String itemId;
 
   /**
    * 订单ID
    */
+  @ApiModelProperty("订单id")
   @TableField("order_id")
   private String orderId;
 
   /**
    * 用户ID
    */
+  @ApiModelProperty("用户id")
   @TableField("user_id")
   private Long userId;
 
   /**
    * 盲票组ID
    */
+  @ApiModelProperty("盲票组id")
   @TableField("box_id")
   private String boxId;
 
   /**
    * 盲票ID
    */
+  @ApiModelProperty("盲票id")
   @TableField("ticket_id")
   private String ticketId;
 
+  /**
+   * 盲票组标题
+   */
+  @ApiModelProperty("盲票组标题")
+  @TableField("title")
+  private String title;
+
+  /**
+   * 主图url
+   */
+  @ApiModelProperty("主图url")
+  @TableField("pic_url")
+  private String picUrl;
+
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   @Version
   private Date updatedTime;

+ 7 - 0
mp-service/src/main/java/com/qs/mp/user/domain/excel/DeliverOrderExcel.java

@@ -10,6 +10,13 @@ import lombok.Data;
  */
 @Data
 public class DeliverOrderExcel {
+
+	@Excel(name = "商品ID")
+	private Long goodsId;
+
+	@Excel(name = "商品编码")
+	private String code;
+
  
 	/**
 	   * 商品标题

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

@@ -14,6 +14,12 @@ import lombok.Data;
 @ApiModel("用户提货订单项VO")
 public class UserDeliverOrderItemVO  extends UserDeliverOrderItem {
 
+	@ApiModelProperty("商品编号")
+	private String goodsCode;
+
+	@ApiModelProperty("sku编号")
+	private String skuCode;
+
 	  // 物流公司名称
 	@ApiModelProperty("物流公司名称")
 	  private  String companyName;

+ 4 - 4
mp-service/src/main/java/com/qs/mp/user/service/IUserAddrService.java

@@ -12,11 +12,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2022-03-02
  */
 public interface IUserAddrService extends IService<UserAddr> {
-  UserAddr getDefaultChannelAddr(Long channelId);
+  UserAddr getDefaultChannelAddr(Long userId);
 
-  boolean updateDefaultChannelAddr(Long addrId, Long channelId);
+  boolean updateDefaultChannelAddr(Long addrId, Long userId);
 
-  boolean removeChannelAddrByUserId(Long addrId, Long channelId);
+  boolean removeChannelAddrByUserId(Long addrId, Long userId);
 
-  UserAddr getChannelAddrByUserId(Long addrId, Long channelId);
+  UserAddr getChannelAddrByUserId(Long addrId, Long userId);
 }

+ 16 - 9
mp-service/src/main/java/com/qs/mp/user/service/impl/UserAddrServiceImpl.java

@@ -6,8 +6,10 @@ import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.user.mapper.UserAddrMapper;
 import com.qs.mp.user.service.IUserAddrService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.util.List;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 /**
  * <p>
@@ -22,29 +24,34 @@ public class UserAddrServiceImpl extends ServiceImpl<UserAddrMapper, UserAddr> i
     IUserAddrService {
 
   @Override
-  public UserAddr getDefaultChannelAddr(Long channelId) {
-    return getOne(new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, channelId)
+  public UserAddr getDefaultChannelAddr(Long userId) {
+    List<UserAddr> userAddrList = list(new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId,
+            userId)
         .eq(UserAddr::getCommonAddr, 1));
+    if (CollectionUtils.isEmpty(userAddrList)) {
+      return null;
+    }
+    return userAddrList.get(0);
   }
 
   @Override
   @Transactional
-  public boolean updateDefaultChannelAddr(Long addrId, Long channelId) {
+  public boolean updateDefaultChannelAddr(Long addrId, Long userId) {
     update(new LambdaUpdateWrapper<UserAddr>().set(UserAddr::getCommonAddr, 0)
-        .eq(UserAddr::getUserId, channelId).eq(UserAddr::getCommonAddr, 1));
+        .eq(UserAddr::getUserId, userId).eq(UserAddr::getCommonAddr, 1));
     return update(new LambdaUpdateWrapper<UserAddr>().set(UserAddr::getCommonAddr, 1)
-        .eq(UserAddr::getUserId, channelId).eq(UserAddr::getAddrId, addrId));
+        .eq(UserAddr::getUserId, userId).eq(UserAddr::getAddrId, addrId));
   }
 
   @Override
-  public boolean removeChannelAddrByUserId(Long addrId, Long channelId) {
+  public boolean removeChannelAddrByUserId(Long addrId, Long userId) {
     return remove(new LambdaQueryWrapper<UserAddr>()
-        .eq(UserAddr::getUserId, channelId).eq(UserAddr::getAddrId, addrId));
+        .eq(UserAddr::getUserId, userId).eq(UserAddr::getAddrId, addrId));
   }
 
   @Override
-  public UserAddr getChannelAddrByUserId(Long addrId, Long channelId) {
+  public UserAddr getChannelAddrByUserId(Long addrId, Long userId) {
     return getOne(new LambdaQueryWrapper<UserAddr>()
-        .eq(UserAddr::getUserId, channelId).eq(UserAddr::getAddrId, addrId));
+        .eq(UserAddr::getUserId, userId).eq(UserAddr::getAddrId, addrId));
   }
 }

+ 7 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -204,6 +204,9 @@ public class UserTicketOrderServiceImpl extends
       orderItem.setUserId(userId);
       orderItem.setBoxId(ticketBox.getBoxId());
       orderItem.setTicketId(null); // 付款成功后再分配具体盲票
+      // 保存名称和图片快照
+      orderItem.setTitle(ticketBox.getTitle());
+      orderItem.setPicUrl(ticketBox.getPicUrl());
       userTicketOrderItemService.save(orderItem);
     }
 
@@ -221,7 +224,7 @@ public class UserTicketOrderServiceImpl extends
         "盲票已付款,ticketId:" + ticket.getTicketId());
     if (null != redisCache.getCacheObject(
         RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()))) {
-      LogUtil.error(logger, "线下盲票重复购买,ticketNo:{0}", ticket.getSerialNo());
+      LogUtil.warn(logger, "线下盲票重复购买,ticketNo:{0}", ticket.getSerialNo());
       throw new ServiceException("重复购买,请稍后再试");
     }
     redisCache.setCacheObject(RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()),
@@ -264,6 +267,9 @@ public class UserTicketOrderServiceImpl extends
     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) {

+ 3 - 1
mp-service/src/main/resources/mapper/user/UserDeliverOrderItemMapper.xml

@@ -36,9 +36,11 @@
 	
 	 <!-- 查询用户订单明细列表 -->
     <select id="selectUserDeliverOrderItemVOList" resultType="com.qs.mp.user.domain.vo.UserDeliverOrderItemVO">
-		select t1.*, t2.company_name ,t2.company_home_url ,t2.query_url
+		select t1.*, t2.company_name ,t2.company_home_url ,t2.query_url,t3.goods_code,t4.sku_code
 		from mp_user_deliver_order_item t1
 		left join mp_delivery_company t2 on t1.delivery_id = t2.delivery_id
+        left join mp_goods t3 on t1.goods_id = t3.goods_id
+        LEFT JOIN mp_goods_sku t4 on t1.sku_id = t4.sku_id
 		where t1.order_id = #{orderId}
 	</select>
 

+ 19 - 8
mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml

@@ -26,14 +26,25 @@
     </select>
 
     <select id="listMyTicketVO" resultType="com.qs.mp.admin.domain.vo.TicketListVO">
-      select t1.item_id, t3.*, t4.pic_url, t6.title prizeInfo, t6.`value`,t6.prize_type
-      from mp_user_ticket_order_item t1
-             left join mp_user_ticket_order t2 on t1.order_id = t2.order_id
-             left join mp_ticket t3 on t1.ticket_id = t3.ticket_id
-             left join mp_ticket_box t4 on t3.box_id = t4.box_id
-             left join mp_user_hit_prize t5 on t5.ticket_id = t1.ticket_id
-             left join mp_ticket_awards_prize t6 on t6.prize_id = t5.prize_id
-        ${ew.customSqlSegment}
+        select t1.item_id,
+                t1.title,
+                t1.pic_url,
+                t3.ticket_id,
+                t3.box_id,
+                t3.serial_no,
+                t3.face_price,
+                t3.plain_lucky_num,
+                t3.`status`,
+                t6.title prizeInfo,
+                t6.`value`,
+                t6.prize_type
+        from mp_user_ticket_order_item t1
+         left join mp_user_ticket_order t2 on t1.order_id = t2.order_id
+         left join mp_ticket t3 on t1.ticket_id = t3.ticket_id
+         left join mp_ticket_box t4 on t3.box_id = t4.box_id
+         left join mp_user_hit_prize t5 on t5.ticket_id = t1.ticket_id
+         left join mp_ticket_awards_prize t6 on t6.prize_id = t5.prize_id
+            ${ew.customSqlSegment}
     </select>
 
     <select id="countMyTicket" resultType="Integer">