瀏覽代碼

Merge branch 'dev' of http://113.31.163.91:7777/quanshu/mp-server.git into dev

Liugl 3 年之前
父節點
當前提交
c4b3c6ed79
共有 17 個文件被更改,包括 266 次插入21 次删除
  1. 2 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  2. 12 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java
  3. 48 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  4. 119 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserExchangeController.java
  5. 2 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  6. 2 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  7. 1 1
      mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java
  8. 4 4
      mp-service/src/main/java/com/qs/mp/admin/domain/Ticket.java
  9. 2 1
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxSerialService.java
  10. 4 2
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxSerialServiceImpl.java
  11. 5 1
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  12. 1 1
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelCommission.java
  13. 4 4
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java
  14. 23 0
      mp-service/src/main/java/com/qs/mp/user/domain/param/ExchangeOrderParam.java
  15. 15 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/DeliverOrderVO.java
  16. 13 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java
  17. 9 3
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

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

@@ -127,6 +127,7 @@ public class ChannelOrderController extends BaseApiController {
   @ApiOperation(value = "订单结算" , notes = "购物车里点结算或者单个盲票组商品上点立即购买")
   public AjaxResult settle(@Valid @RequestBody ChannelOrderParam param) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
 
     ChannelOrderSettleVO orderSettleVO = new ChannelOrderSettleVO();
 
@@ -168,7 +169,7 @@ public class ChannelOrderController extends BaseApiController {
     orderSettleVO.setPkgNum(pkgNum);
 
     // 缓存订单结算对象
-    redisCache.setCacheObject(RedisKey.build(RedisKey.CHANNEL_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
+    redisCache.setCacheObject(RedisKey.build(RedisKey.CHANNEL_ORDER_KEY, channelId), orderSettleVO, 10, TimeUnit.MINUTES);
     return AjaxResult.success(orderSettleVO);
   }
 

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

@@ -4,6 +4,8 @@ import cn.jsms.api.ValidSMSResult;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.Channel;
+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.enums.UserIdentityEnum;
@@ -64,6 +66,9 @@ public class UserController extends BaseApiController {
   @Autowired
   private IWxAccountService wxAccountService;
 
+  @Autowired
+  private IChannelService channelService;
+
   @Value("${wx-channel.appId}")
   private String channelAppId;
   @Value("${wx-channel.appSecret}")
@@ -229,10 +234,16 @@ public class UserController extends BaseApiController {
   @RequestMapping(value = "/user/getLoginUserinfo", method = RequestMethod.POST)
   public AjaxResult getLoginUserinfo(@RequestBody JSONObject params) {
     LoginUser loginUser = hostHolder.getUser();
+
     JSONObject jsonObject = new JSONObject();
     jsonObject.put("userName", loginUser.getUsername());
     jsonObject.put("avatar", loginUser.getUser().getAvatar());
-    jsonObject.put("nickName", loginUser.getUser().getNickName());
+    if(loginUser.getIdentity() == UserIdentityEnum.CHANNEL) {
+      Channel channel = channelService.getById(loginUser.getChannelId());
+      jsonObject.put("nickName", channel.getName());
+    } else {
+      jsonObject.put("nickName", loginUser.getUser().getNickName());
+    }
     jsonObject.put("openId", loginUser.getUser().getOpenId());
     jsonObject.put("channelOpenId", loginUser.getUser().getChannelOpenId());
     JSONArray roleKeys = new JSONArray();

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

@@ -3,8 +3,11 @@ 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.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;
 import com.qs.mp.common.enums.BizTypeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
@@ -13,10 +16,13 @@ import com.qs.mp.framework.redis.RedisKey;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.qs.mp.user.domain.param.DeliverOrderParam;
 import com.qs.mp.user.domain.vo.DeliverOrderSettleVO;
+import com.qs.mp.user.domain.vo.DeliverOrderVO;
 import com.qs.mp.user.service.IUserAddrService;
+import com.qs.mp.user.service.IUserDeliverOrderItemService;
 import com.qs.mp.user.service.IUserDeliverOrderService;
 import com.qs.mp.user.service.IUserPrizeStorageService;
 import com.qs.mp.utils.SecurityUtils;
@@ -50,6 +56,9 @@ public class UserDeliverOrderController extends BaseApiController {
   @Autowired
   private IUserDeliverOrderService userDeliverOrderService;
 
+  @Autowired
+  private IUserDeliverOrderItemService userDeliverOrderItemService;
+
   @Autowired
   private IWalletService walletService;
 
@@ -59,6 +68,43 @@ public class UserDeliverOrderController extends BaseApiController {
   @Autowired
   private RedisCache redisCache;
 
+  /**
+   * 订单列表
+   */
+  @PostMapping("/order/list")
+  @ApiOperation(value = "订单列表" , notes = "获取所有订单信息")
+  public TableDataInfo list(@RequestBody JSONObject param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    Integer status = param.getInteger("status");
+    startPage();
+    List<UserDeliverOrder> deliverOrders = userDeliverOrderService.list(
+        new LambdaQueryWrapper<UserDeliverOrder>().eq(UserDeliverOrder::getUserId, userId)
+            .eq(null != status, UserDeliverOrder::getStatus, status)
+            .orderByDesc(UserDeliverOrder::getCreatedTime));
+    List<DeliverOrderVO> deliverOrderVOList = mapperFacade.mapAsList(deliverOrders, DeliverOrderVO.class);
+    for (DeliverOrderVO deliverOrderVO : deliverOrderVOList) {
+      deliverOrderVO.setItems(userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+          .eq(UserDeliverOrderItem::getOrderId, deliverOrderVO.getOrderId())));
+    }
+    TableDataInfo rspData = getDataTable(deliverOrders);
+    rspData.setRows(deliverOrderVOList);
+    return rspData;
+  }
+
+  /**
+   * 订单详情
+   */
+  @PostMapping("/order/detail")
+  @ApiOperation(value = "订单详情" , notes = "在订单列表页面查看详情")
+  public AjaxResult query(@RequestBody UserDeliverOrder order) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    UserDeliverOrder deliverOrder = userDeliverOrderService.getOne(new LambdaQueryWrapper<UserDeliverOrder>()
+        .eq(UserDeliverOrder::getOrderId, order.getOrderId()).eq(UserDeliverOrder::getUserId, userId));
+    DeliverOrderVO deliverOrderVO = mapperFacade.map(deliverOrder, DeliverOrderVO.class);
+    deliverOrderVO.setItems(userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+        .eq(UserDeliverOrderItem::getOrderId, deliverOrderVO.getOrderId())));
+    return AjaxResult.success(deliverOrderVO);
+  }
 
   /**
    * 订单结算,每次更换地址时需重新请求此接口
@@ -114,6 +160,8 @@ public class UserDeliverOrderController extends BaseApiController {
     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));

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

@@ -0,0 +1,119 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.domain.GoodsSku;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.param.TicketParam;
+import com.qs.mp.admin.domain.vo.GoodsListVO;
+import com.qs.mp.admin.domain.vo.GoodsVO;
+import com.qs.mp.admin.domain.vo.TicketBoxListVO;
+import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.domain.vo.TicketVO;
+import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.admin.service.IGoodsSkuService;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.GoodsStatusEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.user.domain.param.ExchangeOrderParam;
+import com.qs.mp.user.service.IUserHitPrizeService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.ArrayList;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user/exchange")
+@Api(tags = "盲票商城接口")
+@AllArgsConstructor
+public class UserExchangeController extends BaseApiController {
+
+
+  @Autowired
+  private IGoodsService goodsService;
+
+  @Autowired
+  private IGoodsSkuService goodsSkuService;
+
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 商品列表
+   */
+  @PostMapping("/goods/list")
+  @ApiOperation(value = "商品列表" , notes = "获取所有可兑换商品")
+  public TableDataInfo list(@RequestBody Goods goods) {
+    startPage();
+    List<Goods> goodsList = goodsService.list(new LambdaQueryWrapper<Goods>()
+        .eq(null != goods.getCategoryId() && 0 != goods.getCategoryId(), Goods::getCategoryId, goods.getCategoryId())
+        .eq(Goods::getStatus, GoodsStatusEnum.PUT_ON));
+    List<GoodsListVO> goodsListVOList = mapperFacade.mapAsList(goodsList, GoodsListVO.class);
+    TableDataInfo rspData = getDataTable(goodsList);
+    rspData.setRows(goodsListVOList);
+    return rspData;
+  }
+
+
+  /**
+   * 查看商品详情
+   */
+  @PostMapping("/goods/detail")
+  @ApiOperation(value = "查看商品详情" , notes = "根据商品ID,获取商品信息")
+  public AjaxResult getInfo(@RequestBody Goods param) {
+    if (StringUtils.isBlank(param.getGoodsId())) {
+      return AjaxResult.error("参数异常,商品ID缺失");
+    }
+    Goods goods = goodsService.getById(param.getGoodsId());
+    GoodsVO goodsVo = new GoodsVO();
+    BeanUtils.copyProperties(goods, goodsVo);
+    // 查询SKU列表
+    LambdaQueryWrapper<GoodsSku> queryWrapper = new LambdaQueryWrapper<>();
+    queryWrapper.eq(GoodsSku::getGoodsId, goods.getGoodsId());
+    queryWrapper.orderByDesc(GoodsSku::getCreatedTime);
+    List<GoodsSku> skuList = goodsSkuService.list(queryWrapper);
+    if(null != skuList && skuList.size() > 0) {
+      goodsVo.setSkuList(skuList);
+    }
+    return AjaxResult.success(goodsVo);
+  }
+
+  /**
+   * 提交兑换订单
+   */
+  @PostMapping("/submit")
+  @ApiOperation(value = "提交兑换订单" , notes = "提交兑换订单")
+  public AjaxResult submit(@RequestBody ExchangeOrderParam param) {
+    if (StringUtils.isBlank(param.getGoodsId()) || null == param.getOrderNum()
+        || param.getOrderNum() == 0) {
+      return AjaxResult.error("参数缺失");
+    }
+
+    return AjaxResult.success();
+  }
+
+}

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

@@ -112,9 +112,9 @@ public class UserTicketController extends BaseApiController {
       return AjaxResult.error("参数异常,盲票不存在");
     }
 
-    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+    /*if (ticket.getStatus() == TicketStatusEnum.CASHED) {
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
-    }
+    }*/
 
     // 已付款的盲票,需要校验当前用户是否有权限查看
     /*if (ticket.getStatus() == TicketStatusEnum.ACTIVATED) {

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

@@ -155,6 +155,8 @@ public class UserTicketOrderController extends BaseApiController {
     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));

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

@@ -97,7 +97,7 @@ public class PulsarClientService {
           logger.info("receive data>>>>>>" + jsons);
           consumer.acknowledge(message);
         } catch (Exception e) {
-          LogUtil.error(logger, "消费Pulsar数据异常,key【{}】,json【{}】:", message.getKey(), jsons, e);
+          LogUtil.error(logger, e, "消费Pulsar数据异常,key【{0}】,json【{1}】:", new Object[]{message.getKey(), jsons});
         }
       }
 

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

@@ -80,26 +80,26 @@ public class Ticket implements Serializable {
   /**
    * 是否实体纸质票(0否1是)
    */
-  @TableField("IS_PHYSICAL")
+  @TableField("is_physical")
   private Integer isPhysical;
 
   /**
    * 盲票状态;1未付款、2已激活、3已兑奖、4付款中
    */
-  @TableField("STATUS")
+  @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private TicketStatusEnum status;
 
   /**
    * 创建时间
    */
-  @TableField("CREATED_TIME")
+  @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
-  @TableField("UPDATED_TIME")
+  @TableField("updated_time")
   @Version
   private Date updatedTime;
 

+ 2 - 1
mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxSerialService.java

@@ -11,8 +11,9 @@ import com.qs.mp.common.enums.TicketTypeEnum;
 public interface ITicketBoxSerialService {
 
   /**
-   * 格式,共7位,分三段,票类型(1位)-年份(1位)-序号(5位)
+   * 格式,共8位,分四段,票类型(1位)-形式(1位)-年份(1位)-序号(5位)
    * T(票类型,T代表通用票)
+   * S(形式,S代表线上,X代表线下)
    * H(年份后两位+50后的ascii码,从2022年可以用到2072年)
    * 00001(序号,每年从年份数字开始,比如2022年,那起始序号为2022)
    *

+ 4 - 2
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxSerialServiceImpl.java

@@ -56,7 +56,7 @@ public class TicketBoxSerialServiceImpl implements ITicketBoxSerialService {
       if (!CollectionUtils.isEmpty(ticketBoxList)) {
         String boxNo = ticketBoxList.get(0).getBoxNo();
 
-        int year = Character.codePointAt(boxNo.substring(1, 2), 0) - 50;
+        int year = Character.codePointAt(boxNo.substring(2, 3), 0) - 50;
         // 同一年份,做累加
         if (year == Integer.valueOf(prefix)) {
           start = Integer.valueOf(boxNo.substring(2)) + 1;
@@ -69,7 +69,9 @@ public class TicketBoxSerialServiceImpl implements ITicketBoxSerialService {
     String str = new String(Character.toChars(Integer.parseInt(prefix) + 50));
     Object value = redisTemplate.opsForValue().get(prefix);
     LogUtil.debug(logger, "生成的年份为{0},序列号为{1}", new Object[]{str, value});
-    return "T" + str + String.format("%1$05d", value);
+
+    String type = ticketType == TicketTypeEnum.ONLINE ? "S" : "X";
+    return "T" + type + str + String.format("%1$05d", value);
   }
 
   // 获取第二年 1月 1日 00:00的时间

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

@@ -128,6 +128,10 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
         awardsPrize.setPrizeId(bizIdGenerator.newId());
         awardsPrize.setBoxId(ticketBox.getBoxId());
         awardsPrize.setAwardsId(ticketAwards.getAwardsId());
+        if (null == awardsPrize.getQuantity() || 0 == awardsPrize.getQuantity()) {
+          // 页面没设置奖品的具体数量,则默认为整个奖项的数量
+          awardsPrize.setQuantity(ticketAwards.getQuantity());
+        }
         awardsPrize.setRemainQty(awardsPrize.getQuantity());
         awardsPrize.setCashedQty(0);
         if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
@@ -197,7 +201,7 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
       ticketPackage.setStartSn(
           ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + 1));
       ticketPackage.setEndSn(
-          ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + 200));
+          ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + pkgUnit));
       ticketPackage.setStatus(TicketPkgStatusEnum.FOR_SALE);
       ticketPackageList.add(ticketPackage);
 

+ 1 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelCommission.java

@@ -35,7 +35,7 @@ public class ChannelCommission implements Serializable {
   /**
    * 用户订单ID
    */
-  @TableField("order_item_id")
+  @TableField("order_id")
   private String orderId;
 
   /**

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

@@ -68,7 +68,7 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
 			SysUser sysUser = new SysUser();
 			sysUser.setUserName(channel.getMobile());
 		    sysUser.setPhonenumber(channel.getMobile());
-		    sysUser.setNickName(channel.getName());
+		    sysUser.setNickName(channel.getMobile());
 //		    sysUser.setDeptId(SecurityUtils.getDeptId());
 //			sysUser.setCreateBy(SecurityUtils.getUsername());
 			Long[] roleIds = new Long[1];
@@ -126,7 +126,7 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
 	public int getChannelSiteCnt(String channelNo) {
 		return getBaseMapper().getChannelSiteCnt(channelNo);
 	}
-	
+
 	@Override
 	public ChannelVO getChannelVoById(Long channelId) {
 		return getBaseMapper().getChannelVoById(channelId);
@@ -158,6 +158,6 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
 		// channelOperData.setNewUserCnt(newUserCnt);
 		return channelOperData;
 	}
-	
-	
+
+
 }

+ 23 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/ExchangeOrderParam.java

@@ -0,0 +1,23 @@
+package com.qs.mp.user.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.List;
+import javax.validation.constraints.NotEmpty;
+import lombok.Data;
+
+@ApiModel(value= "兑换订单参数")
+@Data
+public class ExchangeOrderParam {
+
+	@NotEmpty(message = "商品ID不能为空")
+	@ApiModelProperty(value = "商品ID",required=true)
+	private String goodsId;
+
+	@ApiModelProperty(value = "skuID",required=true)
+	private String skuId;
+
+	@NotEmpty(message = "兑换数量不能为空")
+	@ApiModelProperty(value = "兑换数量",required=false)
+	private Integer orderNum;
+}

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

@@ -0,0 +1,15 @@
+package com.qs.mp.user.domain.vo;
+
+import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
+import java.util.List;
+import lombok.Data;
+
+/**
+ * @author zhongcp
+ * @Date 2022/3/17
+ */
+@Data
+public class DeliverOrderVO extends UserDeliverOrder {
+  List<UserDeliverOrderItem> items;
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java

@@ -16,10 +16,12 @@ import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.domain.UserCoupon;
 import com.qs.mp.user.domain.UserCouponChannel;
@@ -43,6 +45,7 @@ import org.slf4j.LoggerFactory;
 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;
 
 /**
@@ -76,6 +79,9 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
   @Autowired
   private ITicketAwardsService ticketAwardsService;
 
+  @Autowired
+  private ITicketService ticketService;
+
   @Override
   public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
     UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
@@ -124,6 +130,9 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
 
     // 保存奖品到中奖记录中
     UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
+    if (StringUtils.isNotBlank(userHitPrize.getPrizeId())) {
+      throw new ServiceException("盲票已兑奖");
+    }
     userHitPrize.setPrizeId(prizeId);
     updateById(userHitPrize);
 
@@ -135,6 +144,10 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
     } else {
       userPrizeStorageService.takeInStorage(userId, ticketAwardsPrize, PrizeStorageInTypeEnum.TICKET_CASHED, String.valueOf(userHitPrize.getId()));
     }
+
+    boolean rtn = ticketService.update(new LambdaUpdateWrapper<Ticket>().set(Ticket::getStatus, TicketStatusEnum.CASHED)
+        .eq(Ticket::getTicketId, ticket.getTicketId()).eq(Ticket::getStatus, TicketStatusEnum.ACTIVATED));
+    Assert.isTrue(rtn, "兑奖后更新盲票状态失败。ticketId:" + ticket.getTicketId());
   }
 
 

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

@@ -45,6 +45,7 @@ import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
@@ -304,6 +305,11 @@ public class UserTicketOrderServiceImpl extends
         Assert.isTrue(rst, "支付回调用户购票订单处理,更新订单明细的盲票ID失败,itemId:" + orderItem.getItemId());
       } else {
         ticket = ticketService.getById(orderItem.getTicketId());
+        // 线下票更新销量,此处不做乐观锁控制,因为不用控制库存
+        TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+        ticketBoxService.update(
+            new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty, ticketBox.getSaleQty() + 1)
+                .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
       }
       // 开幸运数字,更新ticket状态为已激活
       boolean rtn = ticketService.update(
@@ -359,7 +365,7 @@ public class UserTicketOrderServiceImpl extends
         channelCommission.setSaleCommAmt(siteCommission.getSaleCommAmt());
         channelCommission.setCommRate(channel.getCommRate());
         channelCommission.setCommAmt(new BigDecimal(channelCommission.getSaleCommAmt()).multiply(
-            channelCommission.getCommRate()).intValue() - sumCommAmt);
+            channelCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN).intValue() - sumCommAmt);
         channelCommissionService.save(channelCommission);
         sumCommAmt += channelCommission.getCommAmt();
       }
@@ -406,10 +412,10 @@ public class UserTicketOrderServiceImpl extends
     siteCommission.setSaleAmt(ticketOrder.getPayAmt());
     siteCommission.setSaleCommRate(ticketBox.getSaleCommRate());
     siteCommission.setSaleCommAmt(new BigDecimal(siteCommission.getSaleAmt()).multiply(
-        siteCommission.getSaleCommRate()).intValue());
+        siteCommission.getSaleCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN).intValue());
     siteCommission.setCommRate(channel.getCommRate());
     siteCommission.setCommAmt(new BigDecimal(siteCommission.getSaleCommAmt()).multiply(
-        siteCommission.getCommRate()).intValue());
+        siteCommission.getCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN).intValue());
     channelCommissionService.save(siteCommission);
     return siteCommission;
   }