Browse Source

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

Mp server test

See merge request quanshu/mp-server!756
zhong chunping 2 years ago
parent
commit
3fc4c0a73e
26 changed files with 898 additions and 384 deletions
  1. 6 0
      mp-admin/pom.xml
  2. 4 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  3. 29 11
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java
  4. 474 354
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java
  5. 44 11
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java
  6. 8 0
      mp-admin/src/main/resources/application.yml
  7. 170 0
      mp-admin/src/test/java/com/qs/mp/task/MyTest.java
  8. 1 1
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelWithdrawStatusEnum.java
  9. 19 4
      mp-common/src/main/java/com/qs/mp/common/enums/SiteTypeEnum.java
  10. 1 0
      mp-framework/src/main/java/com/qs/mp/framework/config/SecurityConfig.java
  11. 9 0
      mp-service/src/main/java/com/qs/mp/admin/domain/excel/ChannelExcel.java
  12. 1 1
      mp-service/src/main/java/com/qs/mp/admin/domain/excel/ChannelWithdrawExcel.java
  13. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/UserDeliverOrderQueryParam.java
  14. 22 0
      mp-service/src/main/java/com/qs/mp/common/domain/vo/AliPhoneDecryptVO.java
  15. 1 1
      mp-service/src/main/java/com/qs/mp/user/domain/UserDeliverOrder.java
  16. 29 0
      mp-service/src/main/java/com/qs/mp/user/domain/param/UserPrizeStorageUpdateParam.java
  17. 3 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserPrizeStorageVO.java
  18. 9 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserDeliverOrderItemMapper.java
  19. 12 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserPrizeStorageMapper.java
  20. 7 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserDeliverOrderItemService.java
  21. 11 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserPrizeStorageService.java
  22. 6 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderItemServiceImpl.java
  23. 11 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserPrizeStorageServiceImpl.java
  24. 10 0
      mp-service/src/main/resources/mapper/user/UserDeliverOrderItemMapper.xml
  25. 2 0
      mp-service/src/main/resources/mapper/user/UserDeliverOrderMapper.xml
  26. 6 0
      mp-service/src/main/resources/mapper/user/UserPrizeStorageMapper.xml

+ 6 - 0
mp-admin/pom.xml

@@ -17,6 +17,12 @@
 
     <dependencies>
 
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.31.12.ALL</version>
+        </dependency>
+
         <!--快递100SDK-->
         <dependency>
             <groupId>com.github.kuaidi100-api</groupId>

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

@@ -203,6 +203,10 @@ public class SaleSiteMgrController extends BaseApiController {
 			channelExcel.setName(channelVO.getName());
 			channelExcel.setParentsName(channelVO.getParentsName());
 			channelExcel.setCreatedTime(channelVO.getCreatedTime());
+			channelExcel.setOffLineSaleCnt(channelVO.getOffLineSaleCnt());
+			channelExcel.setOffLineQtyCnt(channelVO.getOffLineQtyCnt());
+			channelExcel.setOnLineSaleCnt(channelVO.getOnLineSaleCnt());
+			channelExcel.setUserCnt(channelVO.getUserCnt());
 			if (Objects.nonNull(channelVO.getCertifyStatus())) {
 				channelExcel.setCertifyStatus(channelVO.getCertifyStatus().getDesc());
 			}

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

@@ -95,12 +95,16 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 		queryWrapper.eq(null != queryParam && null != queryParam.getResource(), "t1.`resource`", queryParam.getResource());
 		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.eq(null != queryParam && null != queryParam.getSupplierId(), "t3.supplier_id", queryParam.getSupplierId());
 		queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getNickName()), "t2.nick_name", queryParam.getNickName());
 		queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), "t3.title", queryParam.getTitle());
 		queryWrapper.orderByDesc("t1.order_id");
 		List<UserDeliverOrderVO> userDeliverOrderVOList = userDeliverOrderService.selectUserDeliverOrderVoList(queryWrapper);
 		for (UserDeliverOrderVO userDeliverOrderVO : userDeliverOrderVOList) {
-			List<UserDeliverOrderItemVO> orderItems = userDeliverOrderItemService.selectUserDeliverOrderItemVOList(userDeliverOrderVO.getOrderId());
+			QueryWrapper<UserDeliverOrderItemVO> userDeliverOrderItemVOQueryWrapper = new QueryWrapper<>();
+			userDeliverOrderItemVOQueryWrapper.eq("t1.order_id", userDeliverOrderVO.getOrderId());
+			userDeliverOrderItemVOQueryWrapper.eq(null != queryParam && null != queryParam.getSupplierId(), "t1.supplier_id", queryParam.getSupplierId());
+			List<UserDeliverOrderItemVO> orderItems = userDeliverOrderItemService.selectUserDeliverOrderItemVOListByQueryWrapper(userDeliverOrderItemVOQueryWrapper);
 			userDeliverOrderVO.setItems(orderItems);
 		}
 		TableDataInfo rspData = getDataTable(userDeliverOrderVOList);
@@ -265,14 +269,21 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 	@PreAuthorize("@ss.hasPermi('order:deliver:export')")
 	public AjaxResult export(@RequestBody UserDeliverOrderQueryParam queryParam) {
 
-		// 导出时间范围限制校验
-		Date startTime = queryParam.getStartTime();
-		Date endTime = queryParam.getEndTime();
-		if (startTime == null || endTime == null) {
-			return AjaxResult.error("导出数据必须设置日期范围");
-		}
-		if (DateUtils.diff(startTime, endTime) > 30) {
-			return AjaxResult.error("导出的数据不能超过31天");
+
+		if (queryParam == null
+				|| queryParam.getStatus() == null
+				|| (!DeliverOrderStatusEnum.NOT_DELIVER.getValue().equals(queryParam.getStatus())
+				&& !DeliverOrderStatusEnum.PART_DELIVER.getValue().equals(queryParam.getStatus()))) {
+
+			// 导出时间范围限制校验
+			Date startTime = queryParam.getStartTime();
+			Date endTime = queryParam.getEndTime();
+			if (startTime == null || endTime == null) {
+				return AjaxResult.error("导出数据必须设置日期范围");
+			}
+			if (DateUtils.diff(startTime, endTime) > 30) {
+				return AjaxResult.error("导出的数据不能超过31天");
+			}
 		}
 
 		List<DeliverOrderExcel> excelList = new ArrayList<DeliverOrderExcel>();
@@ -282,6 +293,7 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 		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.eq(null != queryParam && null != queryParam.getResource(), "t1.`resource`", queryParam.getResource());
+		queryWrapper.eq(null != queryParam && null != queryParam.getSupplierId(), "t3.supplier_id", queryParam.getSupplierId());
 		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.getNickName()), "t2.nick_name", queryParam.getNickName());
@@ -298,7 +310,10 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 				queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
 				List<UserDeliverOrderVO> userDeliverOrderVOList = userDeliverOrderService.selectUserDeliverOrderVoList(queryWrapper);
 				for (UserDeliverOrderVO userDeliverOrderVO : userDeliverOrderVOList) {
-					List<UserDeliverOrderItemVO> orderItems = userDeliverOrderItemService.selectUserDeliverOrderItemVOList(userDeliverOrderVO.getOrderId());
+					QueryWrapper<UserDeliverOrderItemVO> userDeliverOrderItemVOQueryWrapper = new QueryWrapper<>();
+					userDeliverOrderItemVOQueryWrapper.eq("t1.order_id", userDeliverOrderVO.getOrderId());
+					userDeliverOrderItemVOQueryWrapper.eq(null != queryParam && null != queryParam.getSupplierId(), "t1.supplier_id", queryParam.getSupplierId());
+					List<UserDeliverOrderItemVO> orderItems = userDeliverOrderItemService.selectUserDeliverOrderItemVOListByQueryWrapper(userDeliverOrderItemVOQueryWrapper);
 					userDeliverOrderVO.setItems(orderItems);
 				}
 				if (null != userDeliverOrderVOList && userDeliverOrderVOList.size() > 0) {
@@ -308,7 +323,10 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 		} else {
 			listAll = userDeliverOrderService.selectUserDeliverOrderVoList(queryWrapper);
 			for (UserDeliverOrderVO userDeliverOrderVO : listAll) {
-				List<UserDeliverOrderItemVO> orderItems = userDeliverOrderItemService.selectUserDeliverOrderItemVOList(userDeliverOrderVO.getOrderId());
+				QueryWrapper<UserDeliverOrderItemVO> userDeliverOrderItemVOQueryWrapper = new QueryWrapper<>();
+				userDeliverOrderItemVOQueryWrapper.eq("t1.order_id", userDeliverOrderVO.getOrderId());
+				userDeliverOrderItemVOQueryWrapper.eq(null != queryParam && null != queryParam.getSupplierId(), "t1.supplier_id", queryParam.getSupplierId());
+				List<UserDeliverOrderItemVO> orderItems = userDeliverOrderItemService.selectUserDeliverOrderItemVOListByQueryWrapper(userDeliverOrderItemVOQueryWrapper);
 				userDeliverOrderVO.setItems(orderItems);
 			}
 		}

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

@@ -1,14 +1,25 @@
 package com.qs.mp.web.controller.api.common;
 
+import cn.hutool.json.JSONUtil;
 import cn.jsms.api.ValidSMSResult;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.alibaba.fastjson.parser.Feature;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.internal.util.AlipayEncrypt;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipaySystemOauthTokenRequest;
+import com.alipay.api.response.AlipaySystemOauthTokenResponse;
 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.domain.vo.AliPhoneDecryptVO;
 import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.common.enums.WxActTypeEnum;
 import com.qs.mp.common.jsms.JSMSUtils;
@@ -29,6 +40,7 @@ import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
+
 import java.io.File;
 import java.net.HttpURLConnection;
 import java.net.URL;
@@ -37,18 +49,17 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.logging.Logger;
 import javax.crypto.Cipher;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.SecretKeySpec;
+
+import io.swagger.annotations.ApiOperation;
 import org.apache.commons.io.FileUtils;
 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.RequestBody;
-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 org.springframework.web.bind.annotation.*;
 import sun.misc.BASE64Decoder;
 import sun.misc.BASE64Encoder;
 
@@ -64,379 +75,488 @@ import sun.misc.BASE64Encoder;
 @Component
 public class UserController extends BaseApiController {
 
-  @Autowired
-  private ISysUserService sysUserService;
-
-  @Autowired
-  protected HostHolder hostHolder;
-
-  @Autowired
-  private IWxAccountService wxAccountService;
-
-  @Autowired
-  private IChannelService channelService;
-
-  @Value("${wx-channel.appId}")
-  private String channelAppId;
-  @Value("${wx-channel.appSecret}")
-  private String channelAppSecret;
-
-  @Value("${wx-user.appId}")
-  private String userAppId;
-  @Value("${wx-user.appSecret}")
-  private String userAppSecret;
-
-  /**
-   * 文件上传路径
-   */
-  @Value("${mp.profile}")
-  public String filePath;
-
-  /**
-   * 公开
-   */
-  @Value("${cloud.public-bucket-name}")
-  private String publicBucketName;
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    protected HostHolder hostHolder;
+
+    @Autowired
+    private IWxAccountService wxAccountService;
+
+    @Autowired
+    private IChannelService channelService;
+
+    @Value("${wx-channel.appId}")
+    private String channelAppId;
+    @Value("${wx-channel.appSecret}")
+    private String channelAppSecret;
+
+    @Value("${wx-user.appId}")
+    private String userAppId;
+    @Value("${wx-user.appSecret}")
+    private String userAppSecret;
+
+    @Value("${ali-miniApp.appId}")
+    private String aliAppId;
+    @Value("${ali-miniApp.public-key}")
+    private String aliPublicKey;
+    @Value("${ali-miniApp.private-key}")
+    private String aliPrivateKey;
+
+    @Value("{ali-miniApp.serverUrl}")
+    private String serverUrl;
+
+    @Value("{ali-miniApp.decrypt-key}")
+    private String decryptKey;
+
+    /**
+     * 文件上传路径
+     */
+    @Value("${mp.profile}")
+    public String filePath;
+
+    /**
+     * 公开
+     */
+    @Value("${cloud.public-bucket-name}")
+    private String publicBucketName;
+
+    @Autowired
+    private IAppTokenService appTokenService;
+
+    @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";
+
+
+    @ApiOperation("支付宝获取用户手机号")
+    @PostMapping("/user/aliAuth/mobile")
+    public AjaxResult aliAuthMobile(@RequestBody WxLoginParams wxLoginParams) {
+
+        String response = wxLoginParams.getEncryptedData();
+
+        //1. 获取验签和解密所需要的参数
+        Map<String, String> openapiResult = JSON.parseObject(response,
+                new TypeReference<Map<String, String>>() {
+                }, Feature.OrderedField);
+        String signType = "RSA2";
+        String charset = "UTF-8";
+        String encryptType = "AES";
+        String sign = openapiResult.get("sign");
+        String content = openapiResult.get("response");
+
+        // 是否加密
+        boolean isDataEncrypted = !content.startsWith("{");
+        boolean signCheckPass = false;
+
+        //2. 验签
+        String signContent = content;
+        String signVeriKey = aliPublicKey;
+        // 如果是加密的报文则需要在密文的前后添加双引号
+        if (isDataEncrypted) {
+            signContent = "\"" + signContent + "\"";
+        }
+        try {
+            signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);
+        } catch (AlipayApiException e) {
+            // 验签异常, 日志
+            LogUtil.error(logger, "验签异常:{0}", e.getMessage());
+        }
+        if (!signCheckPass) {
+            // 验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
+            LogUtil.warn(logger, "验签失败");
+            return AjaxResult.error("验签失败");
+        }
 
-  @Autowired
-  private IAppTokenService appTokenService;
+        //3. 解密
+        String plainData = null;
+        if (isDataEncrypted) {
+            try {
+                plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);
+            } catch (AlipayApiException e) {
+                //解密异常, 记录日志
+                LogUtil.warn(logger, "解密异常");
+                return AjaxResult.error("解密异常");
+            }
+        } else {
+            plainData = content;
+        }
 
-  @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";
+        AliPhoneDecryptVO aliPhoneDecryptVO = JSONUtil.toBean(plainData, AliPhoneDecryptVO.class);
+        if (!aliPhoneDecryptVO.isSuccess()) {
+            LogUtil.error(logger, "解析手机号失败,errorMsg:{0}", plainData);
+            return AjaxResult.error("解析手机号失败," + aliPhoneDecryptVO.getSubMsg());
+        }
+        String mobile = aliPhoneDecryptVO.getMobile();
+
+        AjaxResult ajax = AjaxResult.success();
+        SysUser sysUser = sysUserService.selectUserByUserName(mobile);
+        if (null == sysUser) {
+            if (wxLoginParams.getIdentity() != UserIdentityEnum.USER.ordinal()) {
+                return error("用户不存在,请联系客服");
+            }
+            // C端直接注册新用户
+            sysUser = new SysUser();
+            sysUser.setUserName(mobile);
+            sysUser.setNickName(mobile);
+            sysUser.setPhonenumber(mobile);
+            sysUserService.registerUser(sysUser);
+        }
+        Map<String, String> result = sysLoginService.wxAuthLogin(mobile, wxLoginParams.getIdentity());
+        for (String key : result.keySet()) {
+            ajax.put(key, result.get(key));
+        }
+        return ajax;
+    }
 
 
-  @RequestMapping(value = "/user/wxauth", method = RequestMethod.POST)
-  @ResponseBody
-  public AjaxResult wxauth(@RequestBody WxLoginParams wxLoginParams) {
-    String appId = channelAppId;
-    String appSecret = channelAppSecret;
-    if (wxLoginParams.getIdentity() == UserIdentityEnum.USER.ordinal()) {
-      appId = userAppId;
-      appSecret = userAppSecret;
-    }
-    //调用微信后台接口获取openId
-    String res = wxLoginCheck(wxLoginParams.getCode(), appId, appSecret);
-    JSONObject jsonObject = JSONObject.parseObject(res);
-    String openId = jsonObject.getString("openid");
-    String sessionKey = jsonObject.getString("session_key");
-    String unionId = jsonObject.getString("unionid");
-
-    if (StringUtils.isBlank(openId) || StringUtils.isBlank(sessionKey)) {
-      LogUtil.error(logger, "微信登录失败:" + jsonObject.toJSONString());
-      return error("登录失败");
-    }
-    //更新数据库用户授权信息
-    LoginUser loginUser = SecurityUtils.getLoginUser();
-    SysUser user = new SysUser();
-    user.setUserId(loginUser.getUserId());
-    if (wxLoginParams.getIdentity() == UserIdentityEnum.USER.ordinal()) {
-      user.setOpenId(openId);
-    } else {
-      user.setChannelOpenId(openId);
-    }
+    @ApiOperation("微信授权登录")
+    @RequestMapping(value = "/user/wxauth", method = RequestMethod.POST)
+    @ResponseBody
+    public AjaxResult wxauth(@RequestBody WxLoginParams wxLoginParams) {
+        String appId = channelAppId;
+        String appSecret = channelAppSecret;
+        if (wxLoginParams.getIdentity() == UserIdentityEnum.USER.ordinal()) {
+            appId = userAppId;
+            appSecret = userAppSecret;
+        }
+        //调用微信后台接口获取openId
+        String res = wxLoginCheck(wxLoginParams.getCode(), appId, appSecret);
+        JSONObject jsonObject = JSONObject.parseObject(res);
+        String openId = jsonObject.getString("openid");
+        String sessionKey = jsonObject.getString("session_key");
+        String unionId = jsonObject.getString("unionid");
+
+        if (StringUtils.isBlank(openId) || StringUtils.isBlank(sessionKey)) {
+            LogUtil.error(logger, "微信登录失败:" + jsonObject.toJSONString());
+            return error("登录失败");
+        }
+        //更新数据库用户授权信息
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = new SysUser();
+        user.setUserId(loginUser.getUserId());
+        if (wxLoginParams.getIdentity() == UserIdentityEnum.USER.ordinal()) {
+            user.setOpenId(openId);
+        } else {
+            user.setChannelOpenId(openId);
+        }
 
-    user.setSessionKey(sessionKey);
-    user.setUnionId(unionId);
-    user.setLoginDate(new Date());
-    user.setNickName(wxLoginParams.getNickName());
-    //如果用户头像字段为空,则默认获取用户微信头像
-    String avatarUrl = wxLoginParams.getAvatarUrl();
-
-    //用户先关联过公众号,那么授权后进行自动绑定
-    LambdaQueryWrapper<WxAccount> wrapper = new LambdaQueryWrapper();
-    wrapper.eq(WxAccount::getUnionid,unionId);
-    wrapper.eq(WxAccount::getActType, WxActTypeEnum.GZH.getValue());
-    List<WxAccount> accountList = wxAccountService.list(wrapper);
-    if(accountList.size() == 1){
-      user.setGzhOpenId(accountList.get(0).getOpenid());
-    }
-    if(StringUtils.isBlank(loginUser.getUser().getAvatar()) && !StringUtils.isBlank(avatarUrl)){
-      try {
-        //下载并且重新上传头像
-        JSONObject result = saveHeadImage(avatarUrl,String.valueOf(user.getUserId()));
-        if(result != null){
-          user.setAvatar(result.getString("fileName"));
+        user.setSessionKey(sessionKey);
+        user.setUnionId(unionId);
+        user.setLoginDate(new Date());
+        user.setNickName(wxLoginParams.getNickName());
+        //如果用户头像字段为空,则默认获取用户微信头像
+        String avatarUrl = wxLoginParams.getAvatarUrl();
+
+        //用户先关联过公众号,那么授权后进行自动绑定
+        LambdaQueryWrapper<WxAccount> wrapper = new LambdaQueryWrapper();
+        wrapper.eq(WxAccount::getUnionid, unionId);
+        wrapper.eq(WxAccount::getActType, WxActTypeEnum.GZH.getValue());
+        List<WxAccount> accountList = wxAccountService.list(wrapper);
+        if (accountList.size() == 1) {
+            user.setGzhOpenId(accountList.get(0).getOpenid());
         }
-      } catch (Exception e) {
-        LogUtil.error(logger,"头像上传异常",e.getMessage());
-      }
-    }
-    logger.info("update user data:"+JSONObject.toJSONString(user));
-    int rows = sysUserService.updateUserProfile(user);
-    if (rows != 1) {
-      LogUtil.error(logger,"用户微信授权异常");
-      return error("用户微信授权异常");
+        if (StringUtils.isBlank(loginUser.getUser().getAvatar()) && !StringUtils.isBlank(avatarUrl)) {
+            try {
+                //下载并且重新上传头像
+                JSONObject result = saveHeadImage(avatarUrl, String.valueOf(user.getUserId()));
+                if (result != null) {
+                    user.setAvatar(result.getString("fileName"));
+                }
+            } catch (Exception e) {
+                LogUtil.error(logger, "头像上传异常", e.getMessage());
+            }
+        }
+        logger.info("update user data:" + JSONObject.toJSONString(user));
+        int rows = sysUserService.updateUserProfile(user);
+        if (rows != 1) {
+            LogUtil.error(logger, "用户微信授权异常");
+            return error("用户微信授权异常");
+        }
+        JSONObject rst = new JSONObject();
+        rst.put("openId", openId);
+        return success(rst);
     }
-    JSONObject rst = new JSONObject();
-    rst.put("openId", openId);
-    return success(rst);
-  }
 
 
-  @RequestMapping(value = "/user/wxauth/mobile", method = RequestMethod.POST)
-  @ResponseBody
-  public AjaxResult wxauthMobile(@RequestBody WxLoginParams wxLoginParams) {
-    String appId = userAppId;
-    String appSecret = userAppSecret;
+    @ApiOperation("微信授权获取用户手机号")
+    @RequestMapping(value = "/user/wxauth/mobile", method = RequestMethod.POST)
+    @ResponseBody
+    public AjaxResult wxauthMobile(@RequestBody WxLoginParams wxLoginParams) {
+        String appId = userAppId;
+        String appSecret = userAppSecret;
     /*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("手机号获取失败");
-      }
-    }
-    String phoneNumber = phoneInfo.getString("phoneNumber");
+        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("手机号获取失败");
+            }
+        }
+        String phoneNumber = phoneInfo.getString("phoneNumber");
 
-    if (StringUtils.isBlank(phoneNumber)) {
-      LogUtil.error(logger, "微信手机号不存在:" + phoneInfo);
-      return error("手机号获取失败");
-    }
-    AjaxResult ajax = AjaxResult.success();
-
-    SysUser sysUser = sysUserService.selectUserByUserName(phoneNumber);
-    if (null == sysUser) {
-      if (wxLoginParams.getIdentity() != UserIdentityEnum.USER.ordinal()) {
-        return error("用户不存在,请联系客服");
-      }
-      // C端直接注册新用户
-      sysUser = new SysUser();
-      sysUser.setUserName(phoneNumber);
-      sysUser.setNickName(phoneNumber);
-      sysUser.setPhonenumber(phoneNumber);
-      sysUserService.registerUser(sysUser);
+        if (StringUtils.isBlank(phoneNumber)) {
+            LogUtil.error(logger, "微信手机号不存在:" + phoneInfo);
+            return error("手机号获取失败");
+        }
+        AjaxResult ajax = AjaxResult.success();
+
+        SysUser sysUser = sysUserService.selectUserByUserName(phoneNumber);
+        if (null == sysUser) {
+            if (wxLoginParams.getIdentity() != UserIdentityEnum.USER.ordinal()) {
+                return error("用户不存在,请联系客服");
+            }
+            // C端直接注册新用户
+            sysUser = new SysUser();
+            sysUser.setUserName(phoneNumber);
+            sysUser.setNickName(phoneNumber);
+            sysUser.setPhonenumber(phoneNumber);
+            sysUserService.registerUser(sysUser);
+        }
+        Map<String, String> result = sysLoginService.wxAuthLogin(phoneNumber, wxLoginParams.getIdentity());
+        for (String key : result.keySet()) {
+            ajax.put(key, result.get(key));
+        }
+        return ajax;
     }
-    Map<String, String> result = sysLoginService.wxAuthLogin(phoneNumber, wxLoginParams.getIdentity());
-    for (String key : result.keySet()) {
-      ajax.put(key, result.get(key));
+
+    /**
+     * 重置密码
+     */
+    @RequestMapping(value = "/user/resetPwd", method = RequestMethod.POST)
+    public AjaxResult resetPwd(@RequestBody JSONObject user) {
+        //验证短信验证码
+        ValidSMSResult res = JSMSUtils.sendValidSMSCode(
+                user.getString("messageId"), user.getString("code"));
+        if (res == null || !res.getIsValid()) {
+            return error("短信验证码错误");
+        }
+
+        int rows = sysUserService.resetUserPwd(user.getString("userName"),
+                SecurityUtils.encryptPassword(user.getString("password")));
+        if (rows == 1) {
+            return success("密码修改成功.");
+        } else {
+            return error("密码修改失败");
+        }
     }
-    return ajax;
-  }
-
-  /**
-   * 重置密码
-   */
-  @RequestMapping(value = "/user/resetPwd", method = RequestMethod.POST)
-  public AjaxResult resetPwd(@RequestBody JSONObject user) {
-    //验证短信验证码
-    ValidSMSResult res = JSMSUtils.sendValidSMSCode(
-        user.getString("messageId"), user.getString("code"));
-    if (res == null || !res.getIsValid()) {
-      return error("短信验证码错误");
+
+    /**
+     * 查询当前登录用户信息
+     */
+    @ApiOperation("查询当前登录用户信息")
+    @RequestMapping(value = "/user/getLoginUserinfo", method = RequestMethod.POST)
+    public AjaxResult getLoginUserinfo(@RequestBody JSONObject params) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser sysUser = sysUserService.selectUserById(SecurityUtils.getUserId());
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("userName", sysUser.getUserName());
+        jsonObject.put("avatar", sysUser.getAvatar());
+        if (loginUser.getIdentity() == UserIdentityEnum.CHANNEL) {
+            Channel channel = channelService.getById(loginUser.getChannelId());
+            jsonObject.put("nickName", channel.getName());
+        } else {
+            jsonObject.put("nickName", sysUser.getNickName());
+        }
+        jsonObject.put("openId", sysUser.getOpenId());
+        jsonObject.put("channelOpenId", sysUser.getChannelOpenId());
+        JSONArray roleKeys = new JSONArray();
+        JSONArray roles = new JSONArray();
+        loginUser.getUser().getRoles().forEach(sysRole -> roles.add(sysRole.getRoleName()));
+        jsonObject.put("roleKeys", roleKeys);
+        jsonObject.put("roles", roles);
+        jsonObject.put("userId", SecurityUtils.getUserId());
+
+        return success(jsonObject);
     }
 
-    int rows = sysUserService.resetUserPwd(user.getString("userName"),
-        SecurityUtils.encryptPassword(user.getString("password")));
-    if (rows == 1) {
-      return success("密码修改成功.");
-    } else {
-      return error("密码修改失败");
+
+    /**
+     * code 换取 session_key
+     *
+     * @param
+     * @return
+     */
+    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;
     }
-  }
-
-  /**
-   * 查询当前登录用户信息
-   */
-  @RequestMapping(value = "/user/getLoginUserinfo", method = RequestMethod.POST)
-  public AjaxResult getLoginUserinfo(@RequestBody JSONObject params) {
-    LoginUser loginUser = SecurityUtils.getLoginUser();
-    SysUser sysUser = sysUserService.selectUserById(SecurityUtils.getUserId());
-
-    JSONObject jsonObject = new JSONObject();
-    jsonObject.put("userName", sysUser.getUserName());
-    jsonObject.put("avatar", sysUser.getAvatar());
-    if(loginUser.getIdentity() == UserIdentityEnum.CHANNEL) {
-      Channel channel = channelService.getById(loginUser.getChannelId());
-      jsonObject.put("nickName", channel.getName());
-    } else {
-      jsonObject.put("nickName", sysUser.getNickName());
+
+    /**
+     * code 换取 手机号
+     * {
+     * "errcode":0,
+     * "errmsg":"ok",
+     * "phone_info": {
+     * "phoneNumber":"xxxxxx",
+     * "purePhoneNumber": "xxxxxx",
+     * "countryCode": 86,
+     * "watermark": {
+     * "timestamp": 1637744274,
+     * "appid": "xxxx"
+     * }
+     * }
+     * }
+     *
+     * @param
+     * @return
+     */
+    private String getWxMobile(WxLoginParams params, String appId) {
+        String accessToken = appTokenService.getAccessToken(appId);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("code", params.getCode());
+        LogUtil.info(logger, JSONObject.toJSONString(params));
+        String res = HttpUtils.sendPost("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken, jsonObject.toJSONString());
+        return res;
     }
-    jsonObject.put("openId", sysUser.getOpenId());
-    jsonObject.put("channelOpenId", sysUser.getChannelOpenId());
-    JSONArray roleKeys = new JSONArray();
-    JSONArray roles = new JSONArray();
-    loginUser.getUser().getRoles().forEach(sysRole -> roles.add(sysRole.getRoleName()));
-    jsonObject.put("roleKeys", roleKeys);
-    jsonObject.put("roles", roles);
-    jsonObject.put("userId", SecurityUtils.getUserId());
-
-    return success(jsonObject);
-  }
-
-
-
-  /**
-   * code 换取 session_key
-   *
-   * @param
-   * @return
-   */
-  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;
-  }
-
-  /**
-   * code 换取 手机号
-   *{
-   *     "errcode":0,
-   *     "errmsg":"ok",
-   *     "phone_info": {
-   *         "phoneNumber":"xxxxxx",
-   *         "purePhoneNumber": "xxxxxx",
-   *         "countryCode": 86,
-   *         "watermark": {
-   *             "timestamp": 1637744274,
-   *             "appid": "xxxx"
-   *         }
-   *     }
-   * }
-   * @param
-   * @return
-   */
-  private String getWxMobile(WxLoginParams params, String appId) {
-    String accessToken = appTokenService.getAccessToken(appId);
-    JSONObject jsonObject = new JSONObject();
-    jsonObject.put("code", params.getCode());
-    LogUtil.info(logger, JSONObject.toJSONString(params));
-    String res = HttpUtils.sendPost("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken, jsonObject.toJSONString());
-    return res;
-  }
-
-  /**
-   * { "subscribe": 1, "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", "nickname": "Band", "sex": 1,
-   * "language": "zh_CN", "city": "广州", "province": "广东", "country": "中国", "headimgurl":
-   * "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
-   * "subscribe_time": 1382694957, "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" }
-   *
-   * @param accessToken
-   * @param openId
-   * @return
-   */
-  private String getWxUserInfo(String accessToken, String openId) {
-    String url = "https://api.weixin.qq.com/cgi-bin/user/info";
-    String params = "access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
-    String res = HttpUtils.sendGet(url, params);
-    logger.info("weixin user info :" + res);
-    return res;
-  }
-
-  private JSONObject saveHeadImage(String serverUrl,String userId) throws Exception {
-    String outFilePath = filePath+"/headImage";
-    File outPath = new File(outFilePath);
-    if (!outPath.exists()) {
-      if (!outPath.mkdirs()) {
-        throw new Exception("makdirs: '" + outFilePath + "'fail");
-      }
+
+    /**
+     * { "subscribe": 1, "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", "nickname": "Band", "sex": 1,
+     * "language": "zh_CN", "city": "广州", "province": "广东", "country": "中国", "headimgurl":
+     * "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
+     * "subscribe_time": 1382694957, "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" }
+     *
+     * @param accessToken
+     * @param openId
+     * @return
+     */
+    private String getWxUserInfo(String accessToken, String openId) {
+        String url = "https://api.weixin.qq.com/cgi-bin/user/info";
+        String params = "access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
+        String res = HttpUtils.sendGet(url, params);
+        logger.info("weixin user info :" + res);
+        return res;
     }
-    URL url = new URL(serverUrl);
-    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-    conn.setConnectTimeout(3 * 1000);
-    //防止屏蔽程序抓取而放回403错误
-    conn.setRequestProperty("User-Agent", "Mozilla/4.0(compatible;MSIE 5.0;Windows NT;DigExt)");
-    Long totalSize = Long.parseLong(conn.getHeaderField("Content-Length"));
-    String name = userId+"/"+ UUIDUtils.newId();
-    String mimeType = "image/jpg";
-    //logger.info("图片开始下载. totalSize" + totalSize);
-    if (totalSize > 0) {
-      File file = new File(outFilePath+"/"+userId);
-      FileUtils.copyURLToFile(url, file);
-      //logger.info("图片下载完成.");
-      QcloudFileUtils.putFile(file, name, publicBucketName, mimeType );
-      FileUtils.delete(file);
-    } else {
-      throw new Exception("can not find serverUrl :{}" + serverUrl);
+
+    private JSONObject saveHeadImage(String serverUrl, String userId) throws Exception {
+        String outFilePath = filePath + "/headImage";
+        File outPath = new File(outFilePath);
+        if (!outPath.exists()) {
+            if (!outPath.mkdirs()) {
+                throw new Exception("makdirs: '" + outFilePath + "'fail");
+            }
+        }
+        URL url = new URL(serverUrl);
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+        conn.setConnectTimeout(3 * 1000);
+        //防止屏蔽程序抓取而放回403错误
+        conn.setRequestProperty("User-Agent", "Mozilla/4.0(compatible;MSIE 5.0;Windows NT;DigExt)");
+        Long totalSize = Long.parseLong(conn.getHeaderField("Content-Length"));
+        String name = userId + "/" + UUIDUtils.newId();
+        String mimeType = "image/jpg";
+        //logger.info("图片开始下载. totalSize" + totalSize);
+        if (totalSize > 0) {
+            File file = new File(outFilePath + "/" + userId);
+            FileUtils.copyURLToFile(url, file);
+            //logger.info("图片下载完成.");
+            QcloudFileUtils.putFile(file, name, publicBucketName, mimeType);
+            FileUtils.delete(file);
+        } else {
+            throw new Exception("can not find serverUrl :{}" + serverUrl);
+        }
+        JSONObject result = new JSONObject();
+        result.put("fileName", name);
+        result.put("fileType", mimeType);
+        return result;
     }
-    JSONObject result = new JSONObject();
-    result.put("fileName",name);
-    result.put("fileType",mimeType);
-    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;
+
+    /**
+     * 带有初始变量的解密(微信用)
+     *
+     * @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();
-    System.out.println(userController.weixinDecrypt("qvNE+SHdiP2GTbmNaqahrhhLw7EZetcMhUMV9yPXHxBbWOMcZ5gFxOGliXC9uojyC0NDUXCUi1xvFVDKMYREQ7rLXXrZIkB1jEleJNuUb9kO3LCDRucvbGAbVwm2EsTNsd5VbqI3fKdu0IOxmmSAWCLZNGXZBlki4ke62lI+ASg6dPohQmmCux8jwD2Js3ZnDQN2mb0JPRT68Qj716gYvA==", "QJ/WdeFANTIfIErOCJ2jNg==", "60YJmIckq4kaXp88wAGGHA=="));
-  }
+    public static void main(String[] args) throws AlipayApiException {
+//    UserController userController = new UserController();
+//    System.out.println(userController.weixinDecrypt("qvNE+SHdiP2GTbmNaqahrhhLw7EZetcMhUMV9yPXHxBbWOMcZ5gFxOGliXC9uojyC0NDUXCUi1xvFVDKMYREQ7rLXXrZIkB1jEleJNuUb9kO3LCDRucvbGAbVwm2EsTNsd5VbqI3fKdu0IOxmmSAWCLZNGXZBlki4ke62lI+ASg6dPohQmmCux8jwD2Js3ZnDQN2mb0JPRT68Qj716gYvA==", "QJ/WdeFANTIfIErOCJ2jNg==", "60YJmIckq4kaXp88wAGGHA=="));
+
+        String charset = "UTF-8";
+        String encryptType = "AES";
+
+        String publicKey1 = "al2021003127607930AES";
+        String s = AlipayEncrypt.encryptContent("17681682549", encryptType, publicKey1, charset);
+        System.out.println("s = " + s);
+        String s2 = AlipayEncrypt.decryptContent(s, encryptType, publicKey1, charset);
+        System.out.println("s2 = " + s2);
+
+    }
 
 }

+ 44 - 11
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java

@@ -3,15 +3,13 @@ package com.qs.mp.web.controller.api.user;
 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.vo.TicketListVO;
 import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
-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.enums.*;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.user.domain.UserCoin;
@@ -19,6 +17,7 @@ import com.qs.mp.user.domain.UserCoinLog;
 import com.qs.mp.user.domain.UserCoupon;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.qs.mp.user.domain.param.UserPrizeStorageQueryParam;
+import com.qs.mp.user.domain.param.UserPrizeStorageUpdateParam;
 import com.qs.mp.user.domain.vo.UserCouponVO;
 import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
 import com.qs.mp.user.service.IUserCoinLogService;
@@ -42,6 +41,7 @@ import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 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;
@@ -154,19 +154,52 @@ public class UserMineController extends BaseApiController {
   @PostMapping("/prize/list")
   @ApiOperation(value = "我的实物奖品库", notes = "获取我的实物奖品库")
   @ApiResponses(
-          @ApiResponse(code = 200, message = "成功", response = UserPrizeStorage.class)
+          @ApiResponse(code = 200, message = "成功", response = UserPrizeStorageVO.class)
   )
   public TableDataInfo listPrize(@RequestBody JSONObject param) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
     startPage();
-    List<UserPrizeStorage> userPrizeStorageList = userPrizeStorageService.list(
-            new LambdaQueryWrapper<UserPrizeStorage>()
-                    .eq(UserPrizeStorage::getUserId, userId)
-                    .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED)
-                    .orderByDesc(UserPrizeStorage::getCreatedTime));
-    return getDataTable(userPrizeStorageList);
+    QueryWrapper<UserPrizeStorage> queryWrapper = new QueryWrapper<>();
+    queryWrapper.eq("t1.user_id", userId);
+    queryWrapper.eq("t1.status", PrizeStorageStatusEnum.NOT_DISTRIBUTED);
+    queryWrapper.orderByDesc("t1.created_time");
+    List<UserPrizeStorageVO> userPrizeStorageVOList = userPrizeStorageService.listByQueryWrapper(queryWrapper);
+    return getDataTable(userPrizeStorageVOList);
   }
 
+
+  @PostMapping("/prize/saveSku")
+  @ApiOperation("设置实物奖品的SKU")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success")
+  )
+  public AjaxResult saveSku(@Validated @RequestBody UserPrizeStorageUpdateParam userPrizeStorageUpdateParam) {
+    UserPrizeStorage userPrizeStorage = userPrizeStorageService.getById(userPrizeStorageUpdateParam.getStorageId());
+    if (userPrizeStorage == null) {
+      return AjaxResult.error("奖品存储ID不正确");
+    }
+
+    if (PrizeStorageInTypeEnum.COIN_EXCHANGE.equals(userPrizeStorage.getInType())) {
+      return AjaxResult.error("当前来源不支持选择规格");
+    }
+
+    if (userPrizeStorage.getSkuId() != null) {
+      return AjaxResult.error("非法调用,已存在规格");
+    }
+
+    // 保存商品的sku信息
+    boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
+            .set(UserPrizeStorage::getSkuId, userPrizeStorageUpdateParam.getSkuId())
+            .set(UserPrizeStorage::getProperties, userPrizeStorageUpdateParam.getProperties())
+            .eq(UserPrizeStorage::getStorageId, userPrizeStorageUpdateParam.getStorageId()));
+    if (!rtn) {
+      return AjaxResult.error("保存规格失败,请重试");
+    }
+
+    return AjaxResult.success();
+  }
+
+
   /**
    * 我的
    */

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

@@ -138,6 +138,14 @@ wx-user:
 wxgzh:
   appId: wxfe9785e665c741a2
 
+# 支付宝盲票小程序appId和公钥私钥
+ali-miniApp:
+  appId: 2021003127607930
+  serverUrl: https://openapi.alipay.com/gateway.do
+  public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlHI65xSPooVQ7oMnNw3U2s+yGEYHCepQXgkl9c94wrUrP22wYevv7HVKZ1A87lPJhjxwFyXRsqK/WMXA8lfl/kYP3+Tu43VVKSuACAFD+1p/ZShnRR+HAD9g43fFqmPGvBM8c9lzbBS+5wwMfiNsjMNjU5XVTY8/w2NG4fp3MzePqQ4jzMofiYUtWIkpFeGBbFedJW+QEGVkZ5A/3aDzqX8/wOQBT0Hv/r0yjoTwFOBJhZ9PJg+IRifHEoSI4krut31UX+HEdhTt+0p0+ZOI0zokFR8Jz/ZJn6kjMVeMuCFH4fpbwUa+DX4n1ldyeLCe2zZE/KYnho0I0GRWkgJx7wIDAQAB
+  private-key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCC2LZ1+YgJhK4w00cW1rrdLh7r4VoOjQS7KPl7mmM3vssREng8Q2Ldr758h+cFR7hg0+oUygRFzsRryEzo8+VFRA1LIqJRO3n3y82bjPuMcAeNhTg3xvHsquQEkhFomWYdkj61j5zYzljUXJBdB7DktP0PU5XMcBlFtZ7zJMaU0v3qo0+RXFCG/UtYPBzw1adyf70TKKan2o+2ZUy9VAbDCoX9VW54FfrSmNXSOMI5pj2idcy2gANkcoXRWXM0PmATYMVyrhS3VWWGi/G51G33iaudq3ghPoyuv4jLyoaix7sjdCn4OaXB53zLm7/9qShjiOJUocn39duqipSrIzbvAgMBAAECggEAGACVB/MsR0K1iXNYWRIu2R/6wB5onL61nXeYvFnH1ZQEQC95KuTZn/z7HnD3qfpMEkcNa57bRcr2MSdfJGSJLDmdjqjdybT1XMVgBCbKhiqO2CEV/PVbr6Rxi30YAG4TU11eb4PWq9a+aMZKHSaqBmpE+ajFk+kEWctFSyj13JrKCThHqzj9PPi0OdB/SrbhHgRf9yL4XeE6bBxQ+iWDFTtoAeI5quOsH7h8yOSfp84e40kaFW3cJOzOJboFl308yhlV7/9ap3CWz7R2o0I8fSls5s4GiX62FSXuP0jocnhj1jlOmFW8UAg65pSE8B9X691JUuLQQt/WNolLdGI3EQKBgQDxX52UZHiyIbQhZzRa2dChMaN+p7r8lVxqW3d0dTYmnUbdpeP0z9ivhVC2S7DhONd3GtwmH+e86VoS+1IZlzxoXgrDptFv2IvuxtlZ2RsXS+Y66yTDJCGbrVDtjeWGlJqiRaTPlufdxq3qawIzhpxluBpCrCP79D9VTvzmVYbaPQKBgQCKxoMM6dc3NE9mG7BM3D5lFD0BZo2osPk4cu7t0llNlZdsmtslphTbIu+HMwbzmvDJ/fRABgzkVwubSKxwHEmNl3qMGH5smAVWi6t5QzZ4HYWrYSmJhBegeTvEvWFSb1hyHnpJRGUPXWFJfbM9aC4xCJcZoNKS/k1Zt4M/OkakmwKBgDhV2LGJwaHRu/kP3WhW7hqxOzeUblAFjExGjNrhgIICs0eIMGwzFp/gvbXOdLocSi3CVx+O0seEr0E+5yqR4cd6K4j+pmM0Z3STdKdDxM7rKBEYULw68p0jFoBbXfbLOEwndQ/+aJ+af3z2/MyJ3nbfQUHOa5eiqiV/Cge4boEBAoGANVPTSEMT0MLpP/Oj6+U2lOESEFe4V/qpymdgKUOLzaSOa82WKQGJQixKn0mcgkAoB3bvRSsOCTDp5OIoYWx9V0u+a9d9vX0tj/RcEF0jsUSm+RR9Qbrg2Wm87f1YSLVA55mOpFkD/MOFfxguqIpANdd3OQHz6UiPsMo0RTe/rcECgYEAhMX5DsSXM4WyAHyYTQW3NVH1ehFcf6yp4uCSj+hq3SMezKYS/dRNSA912XM3rJakrjaVNzRTnSuwfajIYi68A1TjS/rj6OTAx7V5HEeYS2U1VLR5Ai7VKHc85Kye4LuF5hIp35/vYo3qHZLZFsM7eDP9SGVG/zUje6Ce1QTFrp8=
+  decrypt-key: fhixMEfC0kpw9drqNJiMfQ==
+
 #三方支付配置
 pay:
   notifyUrl: https://www.quanshu123.com

+ 170 - 0
mp-admin/src/test/java/com/qs/mp/task/MyTest.java

@@ -0,0 +1,170 @@
+package com.qs.mp.task;
+
+import cn.hutool.core.codec.Base62;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.HashUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.symmetric.DES;
+import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
+import cn.hutool.crypto.symmetric.SymmetricCrypto;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.Marketing;
+import com.qs.mp.common.core.redis.DistributedLocker;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.UserTypeEnum;
+import com.qs.mp.common.utils.AESUtil;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.RSAUtil;
+import com.qs.mp.common.utils.WebhookService;
+import com.qs.mp.common.utils.html.EscapeUtil;
+import com.qs.mp.common.utils.uuid.IdUtils;
+import com.qs.mp.common.utils.uuid.UUID;
+import com.qs.mp.framework.service.IWxSubscribeMessage;
+import com.qs.mp.pay.service.IWalletService;
+import com.qs.mp.quartz.task.DayStatTask;
+import com.qs.mp.quartz.task.MarketingTask;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.qs.mp.user.service.IMarketingUserCodeService;
+import com.qs.mp.utils.SecurityUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * @author Cup
+ * @date 2022/4/26
+ */
+@SpringBootTest
+public class MyTest {
+
+    @Autowired
+    private IWalletService walletService;
+
+    @Autowired
+    private MarketingTask marketingTask;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
+
+    @Autowired
+    private IWxSubscribeMessage wxSubscribeMessage;
+
+
+    @Autowired
+    private IMarketingUserCodeService marketingUserCodeService;
+
+
+    @Autowired
+    private DayStatTask dayStatTask;
+
+
+    public static void main(String[] args) {
+        WebhookService.sendAlertDing("mayday,mayday,上上下下,左右左右,BABA");
+
+        String decrypt = AESUtil.decrypt("75213771c6c781d62136e39180303be03f0a99761114c1264f116051a9e95108");
+        System.out.println("decrypt = " + decrypt);
+
+    }
+
+    @Test
+    void test9() {
+
+    }
+
+    @Test
+    void test8(){
+        dayStatTask.stat("20220617");
+    }
+
+
+    @Test
+    void test7() {
+        String hellow = AESUtil.encrypt("hellow");
+        System.out.println("hellow = " + hellow);
+        String decrypt = AESUtil.decrypt("hahaha");
+        System.out.println("decrypt = " + decrypt);
+    }
+
+
+    @Test
+    void test6(){
+//        List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
+//                .select(MarketingUserCode::getUserId)
+//                .eq(MarketingUserCode::getMarketingId, 102)
+////                .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue())
+//                .groupBy(MarketingUserCode::getUserId));
+        List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
+                .select(MarketingUserCode::getUserId)
+                .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue())
+                .groupBy(MarketingUserCode::getUserId));
+        userCodeList.forEach(System.out::println);
+    }
+
+    @Test
+    void test5() {
+        Set<String> testSet =new HashSet<>();
+        testSet.add("test1");
+        testSet.add("test2");
+        testSet.add("test3");
+        testSet.add("test4");
+        redisCache.setCacheSet("testSet",testSet);
+        List<Object> list = new ArrayList<>();
+        list.add("test1");
+        list.add("test3");
+        list.add("test5");
+        list.add("test6");
+        list.add("test7");
+        redisCache.removeSetValueByKey("testSet",list);
+
+
+    }
+
+    @Test
+    void test4() {
+        Marketing marketing = new Marketing();
+        marketing.setId(45L);
+        marketing.setTitle("测试订阅通");
+        wxSubscribeMessage.sendMarketingLottery(188L, marketing);
+        wxSubscribeMessage.sendMarketingLottery(79L, marketing);
+
+//        wxSubscribeMessage.sendMarketingStart(188L, marketing);
+//        wxSubscribeMessage.sendMarketingStart(79L, marketing);
+
+//        wxSubscribeMessage.sendMarketingHelp(188L, marketing);
+//        wxSubscribeMessage.sendMarketingHelp(79L, marketing);
+    }
+    
+    @Test
+    void test2() throws IOException {
+        marketingTask.lottery();
+
+    }
+
+    @Test
+    void test3(){
+        for (int i = 0; i < 20; i++) {
+            System.out.println("bizIdGenerator = " + bizIdGenerator.newId());
+        }
+
+    }
+
+
+
+    @Test
+    void test1(){
+        walletService.refund("968527112497659906",10,"测试");
+    }
+
+}

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

@@ -13,7 +13,7 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 @JSONType(deserializer = EnumValueDeserializer.class)
 public enum ChannelWithdrawStatusEnum implements IEnum<Integer> {
 
-  WITHDRAWING(1, "提现"),
+  WITHDRAWING(1, "提现"),
   FINISHED(2, "已完成"),
   FAILED(3, "提现失败");
 

+ 19 - 4
mp-common/src/main/java/com/qs/mp/common/enums/SiteTypeEnum.java

@@ -13,10 +13,25 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 @JSONType(deserializer = EnumValueDeserializer.class)
 public enum SiteTypeEnum implements IEnum<Integer> {
 
-  STREET_STORE(1, "临街门店"),
-  ENTERTAINMENT(2, "娱乐场所"),
-  CINEMA(3, "电影院"),
-  CHAIN_STORE(4, "品牌连锁店");
+  CONVENIENCE_STORE(1, "便利店/超市/烟酒店"),
+  FAST_FOOD(2,"快餐/正餐"),
+  TEA_HOUSE(3, "咖啡/茶馆/甜品/奶茶"),
+  KAT_BAR(5,"KTV/酒吧"),
+  MASSAGE(6, "按摩/足浴/洗浴"),
+  COSMETIC(7,"美容/美发"),
+  HOTEL(8,"酒店/民宿"),
+  CINEMA(9, "电影院"),
+  SPORT(10,"台球/运动/健身"),
+  BOARD_GAME(11,"棋牌室/剧本杀/密室/网咖"),
+  PARENT_CHILD(12,"亲子/母婴/教育"),
+  HOME_APPLIANCES(13,"家电/通信/电动车"),
+  SCENIC_SPOT(14,"景区"),
+  WECHAT_BUSINESS(15,"线上-微商"),
+  OFFLINE_PLATFORM(16,"线下-平台"),
+  OTHER(17,"其他"),
+  STREET_STORE(18, "临街门店"),
+  ENTERTAINMENT(19, "娱乐场所"),
+  CHAIN_STORE(20, "品牌连锁店");
 
   private final int value;
   private final String desc;

+ 1 - 0
mp-framework/src/main/java/com/qs/mp/framework/config/SecurityConfig.java

@@ -108,6 +108,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                     "/wxlogin",
                     "/api/v1/mp/sms/sendSmsCode",
                     "/api/v1/mp/user/wxauth/mobile",
+                    "/api/v1/mp/user/aliAuth/mobile",
                     "/api/v1/mp/channel/invite/register",
                     "/common/download**",
                     "/common/download/resource**",

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

@@ -31,6 +31,15 @@ public class ChannelExcel {
     @Excel(name = "经销商佣金比例(%)")
     private BigDecimal commRate;
 
+    @Excel(name = "盲票库存")
+    long offLineQtyCnt;
+    @Excel(name = "线下销量")
+    long offLineSaleCnt;
+    @Excel(name = "线上销量")
+    long onLineSaleCnt;
+    @Excel(name = "用户数")
+    long userCnt;
+
     @Excel(name = "注册时间")
     private Date createdTime;
 

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/excel/ChannelWithdrawExcel.java

@@ -41,7 +41,7 @@ public class ChannelWithdrawExcel {
     private String level;
 
 
-    @Excel(name = "提现金额")
+    @Excel(name = "提现金额(元)")
     private BigDecimal money;
 
 

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

@@ -32,6 +32,9 @@ public class UserDeliverOrderQueryParam {
 	@ApiModelProperty(value = "收货人手机号", required = false)
 	private String tel;
 
+	@ApiModelProperty("供应商id")
+	private Long supplierId;
+
 	/**
 	 * 下单区间-开始时间
 	 */

+ 22 - 0
mp-service/src/main/java/com/qs/mp/common/domain/vo/AliPhoneDecryptVO.java

@@ -0,0 +1,22 @@
+package com.qs.mp.common.domain.vo;
+
+import lombok.Data;
+import org.apache.commons.lang3.math.NumberUtils;
+
+/**
+ * 支付宝手机解密结果类
+ * @author Cup
+ * @date 2022/6/21
+ */
+@Data
+public class AliPhoneDecryptVO {
+    private String code;
+    private String msg;
+    private String mobile;
+    private String subCode;
+    private String subMsg;
+
+    public boolean isSuccess() {
+        return NumberUtils.isDigits(mobile);
+    }
+}

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

@@ -121,7 +121,7 @@ public class UserDeliverOrder implements Serializable {
   /**
    * 订单状态;-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成
    */
-  @ApiModelProperty("订单状态;-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成")
+  @ApiModelProperty("订单状态;-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成 4:部分发货")
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private DeliverOrderStatusEnum status;

+ 29 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/UserPrizeStorageUpdateParam.java

@@ -0,0 +1,29 @@
+package com.qs.mp.user.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;
+
+/**
+ * @author Cup
+ * @date 2022/6/20
+ */
+@ApiModel(value = "用户实物奖品更新入参类")
+@Data
+public class UserPrizeStorageUpdateParam {
+
+    @NotBlank(message = "奖品存储ID不能为空")
+    @ApiModelProperty("奖品存储id")
+    private String storageId;
+
+    @NotNull(message = "skuId不能为空")
+    @ApiModelProperty("skuId")
+    private Long skuId;
+
+    @NotBlank(message = "sku属性不能为空")
+    @ApiModelProperty("sku属性")
+    private String properties;
+}

+ 3 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserPrizeStorageVO.java

@@ -15,4 +15,7 @@ import java.math.BigDecimal;
 @ApiModel("用户事务奖品库出参类")
 @Data
 public class UserPrizeStorageVO extends UserPrizeStorage {
+
+    @ApiModelProperty("是否多sku: 0否,1是")
+    private Integer isMoreSku;
 }

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

@@ -1,5 +1,7 @@
 package com.qs.mp.user.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.user.domain.vo.OrderDeliverItemVO;
 import com.qs.mp.user.domain.vo.UserDeliverOrderItemVO;
@@ -31,4 +33,11 @@ public interface UserDeliverOrderItemMapper extends BaseMapper<UserDeliverOrderI
 	 * @return
 	 */
 	public List<UserDeliverOrderItemVO> selectUserDeliverOrderItemVOList(@Param("orderId") String orderId);
+
+	/**
+	 * 根据条件查询订单明细信息
+	 * @param queryWrapper
+	 * @return
+	 */
+    List<UserDeliverOrderItemVO> selectUserDeliverOrderItemVOListByQueryWrapper(@Param(Constants.WRAPPER) QueryWrapper<UserDeliverOrderItemVO> queryWrapper);
 }

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

@@ -1,7 +1,13 @@
 package com.qs.mp.user.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @auther quanshu
@@ -10,4 +16,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface UserPrizeStorageMapper extends BaseMapper<UserPrizeStorage> {
 
+    /**
+     * 根据条件查询用户奖品库信息
+     * @param queryWrapper
+     * @return
+     */
+    List<UserPrizeStorageVO> listByQueryWrapper(@Param(Constants.WRAPPER) QueryWrapper<UserPrizeStorage> queryWrapper);
 }

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

@@ -1,5 +1,6 @@
 package com.qs.mp.user.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.user.domain.vo.OrderDeliverItemVO;
@@ -47,4 +48,10 @@ public interface IUserDeliverOrderItemService extends IService<UserDeliverOrderI
 	 */
 	List<OrderDeliverItemVO> getDeliverItemList(String orderId, List<UserDeliverOrderItemVO> orderItems);
 
+	/**
+	 * 根据条件查询订单明细信息
+	 * @param userDeliverOrderItemVOQueryWrapper
+	 * @return
+	 */
+    List<UserDeliverOrderItemVO> selectUserDeliverOrderItemVOListByQueryWrapper(QueryWrapper<UserDeliverOrderItemVO> queryWrapper);
 }

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

@@ -1,9 +1,13 @@
 package com.qs.mp.user.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -23,4 +27,11 @@ public interface IUserPrizeStorageService extends IService<UserPrizeStorage> {
    * @param refId
    */
   void takeInStorage(Long userId, String title, String picUrl, String goodsId, PrizeStorageInTypeEnum inTypeEnum, String refId);
+
+  /**
+   * 根据条件查询用户奖品库信息
+   * @param queryWrapper
+   * @return
+   */
+  List<UserPrizeStorageVO> listByQueryWrapper(QueryWrapper<UserPrizeStorage> queryWrapper);
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderItemServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qs.mp.user.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.user.domain.vo.OrderDeliverItemVO;
@@ -38,6 +39,11 @@ public class UserDeliverOrderItemServiceImpl extends ServiceImpl<UserDeliverOrde
 		return getBaseMapper().selectUserDeliverOrderItemVOList(orderId);
 	}
 
+	@Override
+	public List<UserDeliverOrderItemVO> selectUserDeliverOrderItemVOListByQueryWrapper(QueryWrapper<UserDeliverOrderItemVO> queryWrapper) {
+		return getBaseMapper().selectUserDeliverOrderItemVOListByQueryWrapper(queryWrapper);
+	}
+
 	@Override
 	public List<OrderDeliverItemVO> getDeliverItemList(String orderId, List<UserDeliverOrderItemVO> orderItems) {
 		List<OrderDeliverItemVO> itemList = new ArrayList<OrderDeliverItemVO>();

+ 11 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserPrizeStorageServiceImpl.java

@@ -1,18 +1,22 @@
 package com.qs.mp.user.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
 import com.qs.mp.user.mapper.UserPrizeStorageMapper;
 import com.qs.mp.user.service.IUserPrizeStorageService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  * 用户实物奖品仓库 服务实现类
@@ -26,7 +30,13 @@ public class UserPrizeStorageServiceImpl extends ServiceImpl<UserPrizeStorageMap
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
-  @Override
+
+    @Override
+    public List<UserPrizeStorageVO> listByQueryWrapper(QueryWrapper<UserPrizeStorage> queryWrapper) {
+        return getBaseMapper().listByQueryWrapper(queryWrapper);
+    }
+
+    @Override
   public void takeInStorage(Long userId, String title, String picUrl, String goodsId, PrizeStorageInTypeEnum inTypeEnum, String refId) {
       UserPrizeStorage userPrizeStorage = new UserPrizeStorage();
       userPrizeStorage.setStorageId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));

+ 10 - 0
mp-service/src/main/resources/mapper/user/UserDeliverOrderItemMapper.xml

@@ -45,4 +45,14 @@
 		where t1.order_id = #{orderId}
 	</select>
 
+    <select id="selectUserDeliverOrderItemVOListByQueryWrapper"
+            resultType="com.qs.mp.user.domain.vo.UserDeliverOrderItemVO">
+        select t1.*, t2.company_name ,t2.company_home_url ,t2.query_url,t3.goods_code,t3.value goodsValue,t3.cost goodsCost,t4.value skuValue,t4.sku_code,t5.name supplierName
+        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
+        LEFT JOIN mp_supplier t5 on t1.supplier_id = t5.id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 2 - 0
mp-service/src/main/resources/mapper/user/UserDeliverOrderMapper.xml

@@ -33,6 +33,7 @@
 		from mp_user_deliver_order t1
 		left join sys_user t2 on t1.user_id = t2.user_id
 		left join mp_user_deliver_order_item t3 on t1.order_id = t3.order_id
+        left join mp_supplier t4 on t3.supplier_id = t4.id
 		${ew.customSqlSegment}
 	</select>
 	
@@ -43,6 +44,7 @@
 		from mp_user_deliver_order t1
 		left join sys_user t2 on t1.user_id = t2.user_id
 		left join mp_user_deliver_order_item t3 on t1.order_id = t3.order_id
+        left join mp_supplier t4 on t3.supplier_id = t4.id
 		${ew.customSqlSegment}
 	</select>
 	

+ 6 - 0
mp-service/src/main/resources/mapper/user/UserPrizeStorageMapper.xml

@@ -24,4 +24,10 @@
         storage_id, user_id, goods_id, sku_id, properties, title, pic_url, goods_num, in_type, ref_id, status, created_time, updated_time
     </sql>
 
+    <select id="listByQueryWrapper" resultType="com.qs.mp.user.domain.vo.UserPrizeStorageVO">
+        select t1.*, t2.multi_sku isMoreSku
+        from mp_user_prize_storage t1
+         left join mp_goods t2 on t1.goods_id = t2.goods_id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>