ソースを参照

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

Mp server test

See merge request quanshu/mp-server!295
zhong chunping 3 年 前
コミット
44b1a172a1

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

@@ -247,6 +247,7 @@ public class ChannelMgrController extends BaseApiController {
 		}
 		boolean mobileChange = false;  // 手机号码是否有变更
 		if(!channel.getMobile().equals(oldChannel.getMobile())) {
+			
 			int mobileCount = channelService.count(
 			        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
 			if(mobileCount > 0) {
@@ -281,6 +282,7 @@ public class ChannelMgrController extends BaseApiController {
 			}
 		}
 		try {
+			channel.setUserId(oldChannel.getUserId());
 			channelService.updateChannel(channel, mobileChange);
 		} catch (Exception e) {
 			return AjaxResult.error(e.getMessage());

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

@@ -60,13 +60,13 @@ public class ChannelOrderMgrController extends BaseApiController {
 
   @Autowired
   private IChannelOrderDetailService channelOrderDetailService;
-  
-  @Autowired 
+
+  @Autowired
   private IChannelService channelService;
-  
-  @Autowired 
+
+  @Autowired
   private IDeliveryCompanyService deliveryCompanyService;
-  
+
   @Autowired
   private ITicketPackageService ticketPackageService;
 
@@ -85,8 +85,8 @@ public class ChannelOrderMgrController extends BaseApiController {
     queryWrapper.eq(null != queryParam && null != queryParam.getChannelId(), "t1.channel_id" ,queryParam.getChannelId());
     queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getOrderId()), "t1.order_id" ,queryParam.getOrderId());
 	queryWrapper.eq(null != queryParam && null != queryParam.getStatus(), "t1.`status`" ,queryParam.getStatus());
-	queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(),  "t1.create_time", queryParam.getStartTime());
-	queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.create_time", queryParam.getEndTime());
+	queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(),  "t1.created_time", queryParam.getStartTime());
+	queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 	queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), "t1.title", queryParam.getTitle());
     queryWrapper.orderByDesc("t1.order_id");
     List<ChannelOrderVO> channelOrderVOList = channelOrderService.selectChannelOrderVoList(queryWrapper);
@@ -112,7 +112,7 @@ public class ChannelOrderMgrController extends BaseApiController {
     	return error(ErrorCodeEnum.ERROR_CODE_1001);
     }
     ChannelOrderInfoVO channelOrderInfoVO = mapperFacade.map(channelOrder, ChannelOrderInfoVO.class);
-    
+
     if(null != channelOrderInfoVO && null != channelOrderInfoVO.getChannelId()) {
     	Channel channel = channelService.getById(channelOrderInfoVO.getChannelId());
     	channelOrderInfoVO.setChannel(channel);
@@ -123,7 +123,7 @@ public class ChannelOrderMgrController extends BaseApiController {
     }
     List<ChannelOrderItem> itemList = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
 	          .eq(ChannelOrderItem::getOrderId, channelOrderInfoVO.getOrderId()));
-	
+
 	List<ChannelOrderItemVO> itemVOList = mapperFacade.mapAsList(itemList, ChannelOrderItemVO.class);
 	if(null != itemVOList && itemVOList.size() > 0) {
 		for(ChannelOrderItemVO itemVO : itemVOList) {
@@ -140,7 +140,7 @@ public class ChannelOrderMgrController extends BaseApiController {
 	channelOrderInfoVO.setItems(itemVOList);
     return AjaxResult.success(channelOrderInfoVO);
   }
-  
+
 
   /**
    * 订单发货
@@ -153,13 +153,13 @@ public class ChannelOrderMgrController extends BaseApiController {
 		if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
-		
+
 		ChannelOrder order  = channelOrderService.getById(shipParam.getOrderId());
-		if(null == order || StringUtils.isBlank(order.getOrderId()) 
+		if(null == order || StringUtils.isBlank(order.getOrderId())
 				|| null == order.getChannelId()) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
-		
+
 		if(null != shipParam && null != shipParam.getPkgIds()
 				&& shipParam.getPkgIds().size() > 0) {
 			ChannelOrder channelOrder = new ChannelOrder();
@@ -173,7 +173,7 @@ public class ChannelOrderMgrController extends BaseApiController {
 		}
 		return AjaxResult.error("发货失败");
   }
-  
+
 	@PostMapping("/item/list")
 	@ApiOperation(value = "获取经销商订单盲票组列表", notes = "")
 	public AjaxResult list(@RequestBody ChannelOrder order) {

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

@@ -85,6 +85,8 @@ public class GoodsMgrController extends BaseApiController {
 		queryWrapper.lambda().le(null != queryParam && null != queryParam.getMaxValue(), Goods::getValue, queryParam.getMaxValue());
 		// 状态
 		queryWrapper.lambda().eq(null != queryParam && null != queryParam.getStatus(), Goods::getStatus, queryParam.getStatus());
+		// 是否支持兑换
+		queryWrapper.lambda().eq(null != queryParam && null != queryParam.getExchangeShow(), Goods::getExchangeShow, queryParam.getExchangeShow());
 		queryWrapper.lambda().eq(Goods::getIsDeleted, 0);
 		queryWrapper.orderByAsc("FIELD(`status`, 'init', 'on', 'off')");
 		queryWrapper.lambda().orderByDesc(Goods::getGoodsId);

+ 1 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -218,6 +218,7 @@ public class SaleSiteMgrController extends BaseApiController {
 			return AjaxResult.error("父经销商不存在");
 		}
 		try {
+			channel.setUserId(oldChannel.getUserId());
 			channelService.updateChannel(channel, mobileChange);
 		} catch (Exception e) {
 			return AjaxResult.error(e.getMessage());

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

@@ -97,7 +97,7 @@ public class TicketBoxMgrController extends BaseApiController {
 		queryWrapper.like(null != ticketBox && StringUtils.isNotBlank(ticketBox.getTitle()), "title", ticketBox.getTitle());
 		queryWrapper.eq(null != ticketBox && null != ticketBox.getType(), "type", ticketBox.getType());
 		queryWrapper.eq(null != ticketBox && null != ticketBox.getStatus(), "status", ticketBox.getStatus());
-		queryWrapper.orderByDesc("FIELD(`status`, 'wait', 'doing', 'done', 'on', 'off')").orderByDesc("box_id");
+		queryWrapper.orderByAsc("FIELD(`status`, 'wait', 'doing', 'done', 'on', 'off')").orderByDesc("box_id");
 		List<TicketBox> list = ticketBoxService.list(queryWrapper);
 		return getDataTable(list);
 	}

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

@@ -33,6 +33,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -595,4 +596,27 @@ public class ChannelController extends BaseApiController {
 		}
 		return AjaxResult.success(channelVO);
 	}
+	
+	
+	/**
+	 * 场景是这里要显示待审核数量
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "subchannel/index")
+	public AjaxResult getChannelIndex() {
+		int waitVerifyNum = 0;
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		if(null != channelId && 0 != channelId) {
+			LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+			queryWrapper.eq(Channel::getParentId, channelId);
+			queryWrapper.eq(Channel::getVerifyStatus, ChannelVerifyStatusEnum.WAIT);
+			queryWrapper.eq(Channel::getLevel, 0);
+			waitVerifyNum = channelService.count(queryWrapper);
+		}
+	    Map<String,Object> map = new HashMap<String,Object>();
+	    map.put("waitVerifyNum", waitVerifyNum);
+		return AjaxResult.success(map);
+	}
 }

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

@@ -1,6 +1,7 @@
 package com.qs.mp.web.controller.api.common;
 
 import cn.jsms.api.ValidSMSResult;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -31,10 +32,14 @@ import io.swagger.annotations.Api;
 import java.io.File;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
 import org.apache.commons.io.FileUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -44,6 +49,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
 
 /**
  * @auther duota
@@ -97,6 +104,10 @@ public class UserController extends BaseApiController {
   @Autowired
   private SysLoginService sysLoginService;
 
+  private static final String CBC_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
+  private static final String KEY_ALGORITHM = "AES";
+  private static final String UTF8 = "UTF-8";
+
 
   @RequestMapping(value = "/user/wxauth", method = RequestMethod.POST)
   @ResponseBody
@@ -108,7 +119,7 @@ public class UserController extends BaseApiController {
       appSecret = userAppSecret;
     }
     //调用微信后台接口获取openId
-    String res = wxLoginCheck(wxLoginParams, appId, appSecret);
+    String res = wxLoginCheck(wxLoginParams.getCode(), appId, appSecret);
     JSONObject jsonObject = JSONObject.parseObject(res);
     String openId = jsonObject.getString("openid");
     String sessionKey = jsonObject.getString("session_key");
@@ -169,23 +180,60 @@ public class UserController extends BaseApiController {
   public AjaxResult wxauthMobile(@RequestBody WxLoginParams wxLoginParams) {
     String appId = userAppId;
     String appSecret = userAppSecret;
-    if (UserIdentityEnum.isChannel(wxLoginParams.getIdentity())) {
+    /*if (UserIdentityEnum.isChannel(wxLoginParams.getIdentity())) {
       appId = channelAppId;
       appSecret = channelAppSecret;
+    }*/
+    JSONObject phoneInfo;
+    if (StringUtils.isNotBlank(wxLoginParams.getCode())) {
+      //调用微信后台接口获取openId
+      String res = getWxMobile(wxLoginParams, appId);
+      JSONObject jsonObject = JSONObject.parseObject(res);
+      int errcode = jsonObject.getIntValue("errcode");
+      if (errcode != 0) {
+        LogUtil.error(logger, "手机号获取失败:" + res);
+        return error("手机号获取失败");
+      }
+      phoneInfo = jsonObject.getJSONObject("phone_info");
+    } else {
+      //调用微信后台接口获取openId
+      String rtn = wxLoginCheck(wxLoginParams.getLoginCode(), appId, appSecret);
+      JSONObject jsonObject = JSONObject.parseObject(rtn);
+      String openId = jsonObject.getString("openid");
+      String sessionKey = jsonObject.getString("session_key");
+
+      if (StringUtils.isBlank(openId) || StringUtils.isBlank(sessionKey)) {
+        LogUtil.error(logger, "微信登录失败:" + jsonObject.toJSONString());
+        return error("登录失败");
+      }
+
+      String res = weixinDecrypt(wxLoginParams.getEncryptedData(), sessionKey, wxLoginParams.getIv());
+      if (StringUtils.isBlank(res)) {
+        return error("手机号获取失败");
+      }
+      /**
+       * {
+       *     "phoneNumber": "13580006666",
+       *     "purePhoneNumber": "13580006666",
+       *     "countryCode": "86",
+       *     "watermark":
+       *     {
+       *         "appid":"APPID",
+       *         "timestamp": TIMESTAMP
+       *     }
+       * }
+       */
+      phoneInfo = JSON.parseObject(res);
+      JSONObject watermark = phoneInfo.getJSONObject("watermark");
+      if (!appId.equals(watermark.getString("appid"))) {
+        LogUtil.error(logger, "手机号解密appid不符,appid:{0}",  watermark.getString("appid"));
+        return error("手机号获取失败");
+      }
     }
-    //调用微信后台接口获取openId
-    String res = getWxMobile(wxLoginParams, appId);
-    JSONObject jsonObject = JSONObject.parseObject(res);
-    int errcode = jsonObject.getIntValue("errcode");
-    if (errcode != 0 ) {
-      LogUtil.error(logger, "手机号获取失败:" + res);
-      return error("手机号获取失败");
-    }
-    JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
     String phoneNumber = phoneInfo.getString("phoneNumber");
 
     if (StringUtils.isBlank(phoneNumber)) {
-      LogUtil.error(logger, "微信手机号不存在:" + res);
+      LogUtil.error(logger, "微信手机号不存在:" + phoneInfo);
       return error("手机号获取失败");
     }
     AjaxResult ajax = AjaxResult.success();
@@ -265,8 +313,8 @@ public class UserController extends BaseApiController {
    * @param
    * @return
    */
-  private String wxLoginCheck(WxLoginParams params, String appId, String appSecret) {
-    String param = "appid=" + appId + "&secret=" + appSecret + "&js_code=" + params.getCode()
+  private String wxLoginCheck(String code, String appId, String appSecret) {
+    String param = "appid=" + appId + "&secret=" + appSecret + "&js_code=" + code
         + "&grant_type=authorization_code";
     String res = HttpUtils.sendGet("https://api.weixin.qq.com/sns/jscode2session", param);
     return res;
@@ -349,4 +397,46 @@ public class UserController extends BaseApiController {
     return result;
   }
 
+  /**
+   * 带有初始变量的解密(微信用)
+   *
+   * @param content     密文
+   * @param skey        密钥
+   * @param ivParameter 初始向量
+   * @return
+   * @throws Exception
+   */
+  public String weixinDecrypt(String content, String skey, String ivParameter) {
+    try {
+      BASE64Decoder decoder = new BASE64Decoder();
+      // 根据微信文档要求需要把 密文、密钥、iv 使用BASE64进行解码
+      byte[] keyByte = decoder.decodeBuffer(skey);
+      byte[] contentByte = decoder.decodeBuffer(content);
+      byte[] ivByte = decoder.decodeBuffer(ivParameter);
+      // 生成密码
+      SecretKeySpec keySpec = new SecretKeySpec(keyByte, KEY_ALGORITHM);
+      // 生成IvParameterSpec
+      IvParameterSpec iv = new IvParameterSpec(ivByte);
+      // 初始化解密 指定模式 AES/CBC/PKCS5Padding
+      Cipher cipher = Cipher.getInstance(CBC_CIPHER_ALGORITHM);
+      // 指定解密模式 传入密码 iv
+      cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
+      // 解密
+      byte[] result = cipher.doFinal(contentByte);
+      return new String(result, UTF8);
+    } catch (Exception e) {
+      LogUtil.error(logger, e, "【解密错误】content:{0},ivParameter:{1}", new Object[]{content, ivParameter});
+      return null;
+    }
+  }
+
+  public static void main(String[] args) {
+    UserController userController = new UserController();
+    BASE64Encoder encoder = new BASE64Encoder();
+    String sessionKey = encoder.encode("f7a104e09d6c2e55445be2a45c4ab551".getBytes(
+        StandardCharsets.UTF_8));
+    System.out.println(sessionKey);
+    System.out.println(userController.weixinDecrypt("1U2iT7fucPip+hYDO+fcksOJCyFMIzxe5qXKGPbLZVfz2kwlKkbRDbfjECRHtjg0yFiTXpHuvR9gBShL9Id7p8KO1w2Y2vhgj5idU/VYSOhF7IRyXEObDApMCs4JSWuS997hIl/JMX3N43IHC99Ak5aeTuk4UHtvHeJsTYfvNKrp7c4fDt0n9yX9MJijsoOjFQ/TFh0jJuWKpzS2QwhdGg==", sessionKey, "C9Kc2ibw/cy7U0Vv6vneOg=="));
+  }
+
 }

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

@@ -143,87 +143,4 @@ public class Goods implements Serializable {
    */
   @TableField("updated_time")
   private Date updatedTime;
-  
-  public static void main(String[] args) {
-	  List<Map<String,Object>> lists=new ArrayList<>();
-	  Map<String,Object> map1 = new HashMap<String,Object>();
-	  map1.put("大小", 1);
-	  lists.add(map1);
-	  Map<String,Object> map2 = new HashMap<String,Object>();
-	  map2.put("大小", 2);
-	  lists.add(map2);
-	  Map<String,Object> map3 = new HashMap<String,Object>();
-	  map3.put("名字", "胜多负少");
-	  lists.add(map3);
-	  
-	  Map<String,Object> map4 = new HashMap<String,Object>();
-	  map4.put("大小", 4);
-	  lists.add(map4);
-	  
-	  System.out.println(lists.toString());
-	  
-	  Map<String,Object> map = lists.stream().flatMap(m -> m.entrySet().stream())
-              .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> getObjValue(a,b))); 
-	  
-	  System.out.println(map.toString());
-	  
-	  List<Map<String,Object>> mapList=new ArrayList<>(); 
-	  
-	  for(Map.Entry<String, Object> entry:map.entrySet()) {
-          //map.entrySet()  返回此映射中包含的映射关系的Set视图
-          //Map.Entry<Integer, String> 映射项 (键值对)
-		  String key = entry.getKey();
-		  Object value = entry.getValue();
-          System.out.println("key="+entry.getKey()+" value="+entry.getValue());
-
-          
-          Map<String,Object> mapObj = new HashMap<String,Object>();
-          mapObj.put("name", key);
-          if(value instanceof List<?>) {
-        	  mapObj.put("value", value);
-          }else {
-        	  List<Object> list = new ArrayList<>();
-        	  list.add(value+"");
-        	  mapObj.put("value", list);
-          }
-         
-          mapList.add(mapObj);
-      }
-	  
-	  System.out.println(JSONArray.toJSONString(mapList));
-	  
-}
-  
- 
-  
-  static Object getObjValue(Object a, Object b){
-		boolean isa = (a instanceof List<?>);
-		boolean isb = (b instanceof List<?>);
-		System.out.println("isa == " + isa);
-		System.out.println("isb == " + isb);
-		List<Object> list = new ArrayList<>();
-		if (isa) {
-			list.addAll((List<?>) a);
-		} else {
-			list.add(a+"");
-		}
-		if (isb) {
-			list.addAll((List<?>) b);
-		} else {
-			list.add(b+"");
-		}
-	  return list;
-	  
-  }
-  
-  
-  public static boolean isArray(Object obj) {
-      if (obj == null) {
-          return false;
-      }
-
-      return obj.getClass().isArray();
-  }
-
-
 }

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

@@ -50,6 +50,12 @@ public class GoodsQueryParam {
 	 */
 	@ApiModelProperty(value = "最高价格", required = false)
 	private Integer maxValue;
+	
+	/**
+	 * 兑换大厅是否展示,0不展示,1展示
+	 */
+	@ApiModelProperty(value = "兑换大厅是否展示", required = false)
+	private Integer exchangeShow;
 
 	/**
 	 * 上架状态;上架/下架

+ 5 - 1
mp-service/src/main/java/com/qs/mp/system/domain/vo/WxLoginParams.java

@@ -12,9 +12,13 @@ public class WxLoginParams {
     private String code;   //微信返回code,用于服务端换取鉴权信息
     private String nickName;
     private String avatarUrl;
+    /** 微信手机号授权信息,兼容基础类库2.22.1以下版本 */
+    private String encryptedData; // 包括敏感数据在内的完整用户信息的加密数据
+    private String iv; // 加密算法的初始向量
+    private String loginCode; // 调用wx.login获取的code
     /**
      * 登录身份
      */
-    private int identity = 2;
+    private int identity;
 
 }

+ 15 - 15
mp-service/src/main/java/com/qs/mp/user/service/IUserDeliverOrderService.java

@@ -26,7 +26,7 @@ import com.qs.mp.user.domain.vo.UserDeliverOrderVO;
 public interface IUserDeliverOrderService extends IService<UserDeliverOrder> {
 	/**
 	 * 提交奖品提货订单
-	 * 
+	 *
 	 * @param userId
 	 * @param orderSettleVO
 	 * @return
@@ -35,7 +35,7 @@ public interface IUserDeliverOrderService extends IService<UserDeliverOrder> {
 
 	/**
 	 * 取消订单
-	 * 
+	 *
 	 * @param orderId
 	 * @return
 	 */
@@ -43,7 +43,7 @@ public interface IUserDeliverOrderService extends IService<UserDeliverOrder> {
 
 	/**
 	 * 支付成功回调
-	 * 
+	 *
 	 * @param payOrder
 	 * @return
 	 */
@@ -51,31 +51,31 @@ public interface IUserDeliverOrderService extends IService<UserDeliverOrder> {
 
 	/**
 	 * 获取用户提货订单列表信息,支持翻页
-	 * 
+	 *
 	 * @param wrapper
 	 * @return
 	 */
-	public List<UserDeliverOrderVO> selectUserDeliverOrderVoList(Wrapper<UserDeliverOrder> wrapper);
-	
-	
+	List<UserDeliverOrderVO> selectUserDeliverOrderVoList(Wrapper<UserDeliverOrder> wrapper);
+
+
 	/**
 	 * 查询满足筛选条件的用户提货订单数量
-	 * 
+	 *
 	 * @param wrapper
 	 * @return
 	 */
-	public int selectUserDeliverOrderCount(Wrapper<UserDeliverOrder> wrapper);
-	
-	
+	int selectUserDeliverOrderCount(Wrapper<UserDeliverOrder> wrapper);
+
+
 	/**
 	 * 获取用户提货订单信息VO
-	 * 
+	 *
 	 * @param wrapper
 	 * @return
 	 */
-	public UserDeliverOrderVO selectUserDeliverOrderVo(String orderId);
-	
-	
+	UserDeliverOrderVO selectUserDeliverOrderVo(String orderId);
+
+
 	/**
 	 * 用户提货订单发货
 	 * @param orderId

+ 30 - 13
mp-service/src/main/java/com/qs/mp/user/service/impl/UserExchangeOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qs.mp.user.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsSku;
@@ -19,10 +20,12 @@ import com.qs.mp.user.service.IUserCoinService;
 import com.qs.mp.user.service.IUserExchangeOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.user.service.IUserPrizeStorageService;
+import java.util.List;
 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>
@@ -89,19 +92,33 @@ public class UserExchangeOrderServiceImpl extends ServiceImpl<UserExchangeOrderM
     userCoinService.consume(userId, orderAmt, exchangeOrder.getOrderId());
 
     // 放入奖品库
-    UserPrizeStorage userPrizeStorage = new UserPrizeStorage();
-    userPrizeStorage.setStorageId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
-    userPrizeStorage.setUserId(userId);
-    userPrizeStorage.setGoodsId(goodsId);
-    userPrizeStorage.setSkuId(skuId);
-    userPrizeStorage.setProperties(goodsSku.getProperties());
-    userPrizeStorage.setTitle(goods.getTitle());
-    userPrizeStorage.setPicUrl(goods.getPicUrl());
-    userPrizeStorage.setGoodsNum(orderNum);
-    userPrizeStorage.setInType(PrizeStorageInTypeEnum.COIN_EXCHANGE);
-    userPrizeStorage.setRefId(exchangeOrder.getOrderId());
-    userPrizeStorage.setStatus(PrizeStorageStatusEnum.NOT_DISTRIBUTED);
-    userPrizeStorageService.save(userPrizeStorage);
+    List<UserPrizeStorage> userPrizeStorageList = userPrizeStorageService.list(new LambdaQueryWrapper<UserPrizeStorage>()
+        .eq(UserPrizeStorage::getUserId, userId)
+        .eq(UserPrizeStorage::getGoodsId, goodsId)
+        .eq(null != skuId, UserPrizeStorage::getSkuId, skuId)
+        .isNull(null == skuId, UserPrizeStorage::getSkuId)
+        .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED));
+    if (CollectionUtils.isEmpty(userPrizeStorageList)) {
+      UserPrizeStorage userPrizeStorage = new UserPrizeStorage();
+      userPrizeStorage.setStorageId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+      userPrizeStorage.setUserId(userId);
+      userPrizeStorage.setGoodsId(goodsId);
+      userPrizeStorage.setSkuId(skuId);
+      userPrizeStorage.setProperties(goodsSku.getProperties());
+      userPrizeStorage.setTitle(goods.getTitle());
+      userPrizeStorage.setPicUrl(goods.getPicUrl());
+      userPrizeStorage.setGoodsNum(orderNum);
+      userPrizeStorage.setInType(PrizeStorageInTypeEnum.COIN_EXCHANGE);
+      userPrizeStorage.setRefId(exchangeOrder.getOrderId());
+      userPrizeStorage.setStatus(PrizeStorageStatusEnum.NOT_DISTRIBUTED);
+      userPrizeStorageService.save(userPrizeStorage);
+    } else {
+      UserPrizeStorage userPrizeStorage = userPrizeStorageList.get(0);
+      boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
+          .set(UserPrizeStorage::getGoodsNum, userPrizeStorage.getGoodsNum() + orderNum)
+          .eq(UserPrizeStorage::getStorageId, userPrizeStorage.getStorageId()));
+      Assert.isTrue(rtn, "兑换商品成功,放入奖品库失败。userId:" + userId + ",goodsId:" + goodsId + ",skuId:" + skuId + ",orderNum:" + orderNum);
+    }
 
     // 修改商品库存
     if (null != skuId && 0 != skuId) {