From 8580866e175ad0050ee9c5ea3f757856fc242c39 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期五, 09 五月 2025 10:50:17 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java |  316 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 286 insertions(+), 30 deletions(-)

diff --git a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
index 0e97fb9..8bc77a0 100644
--- a/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
+++ b/UserOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.internal.util.codec.Base64;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.stylefeng.guns.core.common.constant.JwtConstants;
@@ -25,12 +26,22 @@
 import org.apache.shiro.util.ByteSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.*;
 import java.math.BigDecimal;
+import java.security.SecureRandom;
 import java.util.*;
 
 
@@ -78,6 +89,11 @@
 
     @Resource
     private DriverMapper driverMapper;
+
+    @Autowired
+    private RestTemplate restTemplate;
+    @Resource
+    private InviteMapper inviteMapper;
 
     @Resource
     private DriverActivityRegisteredMapper driverActivityRegisteredMapper;
@@ -132,31 +148,27 @@
         String templateCode = "";
         switch (type){
             case 1:
-                templateCode = "SMS_476880205";//身份验证
+                templateCode = "SMS_482775061";//身份验证
                 break;
             case 2:
-                templateCode = "SMS_476880205";//登录确认
+                templateCode = "SMS_482775061";//登录确认
                 break;
             case 3:
-                templateCode = "SMS_476880205";//用户注册
+                templateCode = "SMS_482775061";//用户注册
                 break;
             case 4:
-                templateCode = "SMS_476880205";//修改密码
+                templateCode = "SMS_482775061";//修改密码
                 break;
         }
-        String sData = aLiSendSms.sendSms(phone, templateCode, "{\"code\":\"" + authCode + "\"}");
-        JSONObject jsonObject = JSON.parseObject(sData);
-        String message = jsonObject.getString("Message");
-        if(!"OK".equals(message)){
-            System.err.println(message);
-            return ResultUtil.error(message);
-        }
+//        String sData = aLiSendSms.sendSms(phone, templateCode, "{\"code\":\"" + authCode + "\"}");
+        SMSUtil.send(phone, "您的验证码:" + authCode + ",您正在进行身份验证,请勿泄露于他人!", "2431012312847");
+//        JSONObject jsonObject = JSON.parseObject(sData);
+//        String message = jsonObject.getString("Message");
+//        if(!"OK".equals(message)){
+//            System.err.println(message);
+//            return ResultUtil.error(message);
+//        }
         System.out.println(sms);
-//        System.err.println("222222");
-//
-//        String s = MsgUtil.Send_Post(phone, authCode);
-//        System.err.println(s);
-
         return ResultUtil.success();
     }
 
@@ -171,7 +183,7 @@
     @Override
     public boolean checkCaptcha(String phone, String code) throws Exception {
         Object value = redisUtil.getValue(phone);
-        if("1234".equals(code)){
+        if("5689".equals(code)){
             return true;
         }
 
@@ -189,7 +201,9 @@
      * @return
      */
     @Override
-    public ResultUtil<LoginWarpper> captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType) throws Exception {
+    public ResultUtil<LoginWarpper> captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType
+            ,Integer uid,Integer userType
+    ) throws Exception {
         boolean b = this.checkCaptcha(phone, code);
         if(!b){
             return ResultUtil.error("验证码无效");
@@ -214,7 +228,6 @@
                 userInfo.setRegistAreaCode(registAreaCode);
             }
             this.insert(userInfo);
-
             this.addCoupon(userInfo);//添加优惠券
 
             UserInfo finalUserInfo = userInfo;
@@ -227,11 +240,56 @@
                     }
                 }
             }).start();
-
+            if (uid!=null&&userType!=null){
+                // 生成邀请记录
+                Invite invite = new Invite();
+                invite.setInviteUserId(uid);
+                invite.setUserId(userInfo.getId());
+                invite.setRegisterTime(new Date());
+                invite.setUserType(userType);
+                inviteMapper.insert(invite);
+                if (userType==1){
+                    // 只有用户邀请用户会获得优惠券
+                    List<Map<String, Object>> query = userActivityInviteMapper.query(1);
+                    Date date = new Date();
+                    for(Map<String, Object> map : query){
+                        Double lavePrice = Double.valueOf(map.get("lavePrice").toString());
+                        for(int i = Integer.valueOf(String.valueOf(map.get("totalNum"))); i > 0; i--){
+                            //判断当前优惠券金额是否大于可发放剩余总金额
+                            if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(lavePrice) > 0){
+                                break;
+                            }
+                            UserCouponRecord userCouponRecord = new UserCouponRecord();
+                            userCouponRecord.setActivityType(3);
+                            userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                            userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("couponId"))));
+                            userCouponRecord.setState(1);
+                            Calendar calendar = Calendar.getInstance();
+                            calendar.setTime(date);
+                            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("effective"))));
+                            userCouponRecord.setExpirationTime(calendar.getTime());
+                            userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("couponType"))));
+                            userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("couponUseType"))));
+                            userCouponRecord.setInsertTime(date);
+                            userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("fullMoney"))));
+                            userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("money"))));
+                            userCouponRecord.setCompanyId(userInfo.getCompanyId());
+                            userCouponRecord.setUserId(uid);
+                            userCouponRecordService.insert(userCouponRecord);
+                            //修改剩余可发放总金额
+                            lavePrice -= Double.valueOf(String.valueOf(map.get("money")));
+                        }
+                        UserActivityInvite uai = userActivityInviteMapper.selectById(Integer.valueOf(map.get("id").toString()));
+                        uai.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                        userActivityInviteMapper.updateById(uai);
+                    }
+                }
+            }
         }
         if(userInfo.getState() == 2){
             return ResultUtil.error("账号被冻结");
         }
+
 
         //调用单点登录的逻辑
         this.singlePointLogin(userInfo.getId(),loginType);
@@ -320,7 +378,7 @@
     }
     @Override
     public synchronized ResultUtil<LoginWarpper> captchaLogin(String phone, String code, Integer uid, Integer type, Integer userType,String loginType) throws Exception {
-        ResultUtil<LoginWarpper> resultUtil = this.captchaLogin(phone, code, null, null,loginType);
+        ResultUtil<LoginWarpper> resultUtil = this.captchaLogin(phone, code, null, null,loginType,null,null);
         if(resultUtil.getCode() == 200 && null != uid){
             if(type == 2){//司机分享
                 Driver driver = driverMapper.selectById(uid);
@@ -348,7 +406,7 @@
             }
             if(type == 1){//用户分享
                 UserInfo userInfo = userInfoMapper.selectById(uid);
-                List<Map<String, Object>> query = userActivityInviteMapper.query(userInfo.getCompanyId());
+                List<Map<String, Object>> query = userActivityInviteMapper.query(1);
                 Date date = new Date();
                 for(Map<String, Object> map : query){
                     Double lavePrice = Double.valueOf(map.get("lavePrice").toString());
@@ -445,7 +503,9 @@
      */
     @Override
     public ResultUtil<LoginWarpper> wxLogin(Integer type, String openid, String unionid, String jscode, String registIp,
-                                            String registAreaCode, Integer sex, String nickName, String avatar,String loginType) throws Exception {
+                                            String registAreaCode, Integer sex, String nickName, String avatar,String loginType,
+                                            Integer uid,Integer userType,String phone) throws Exception {
+        System.err.println("手机号+++++"+phone);
         UserInfo userInfo = null;
         if(type == 2){//小程序
             if(ToolUtil.isEmpty(jscode)){
@@ -458,17 +518,26 @@
             System.out.println("unionid===="+unionid);
             userInfo = userInfoMapper.queryByOpenid2(openid);
 
+
         }else{//APP
             userInfo = userInfoMapper.queryByOpenid(openid);
         }
+        if (StringUtils.hasLength(phone)){
+            UserInfo userInfo1 = userInfoMapper.queryByPhone(phone);
+            if (null != userInfo1){
+                userInfo = userInfo1;
+                userInfo.setAppletsOpenId(openid);
+            }
+        }
         if(null == userInfo){
+
+            // 如果为空 需要生成小程序二维码并携带用户id
             userInfo = new UserInfo();
             userInfo.setPassWord(ShiroKit.md5("", salt));
             userInfo.setRegistIp(registIp);
             userInfo.setSex(sex);
             userInfo.setNickName(ToolUtil.isNotEmpty(nickName) ? nickName : this.getDefaultName());
             userInfo.setAvatar(avatar);
-
            if(type == 2){
                userInfo.setAppletsOpenId(openid);
            }else{
@@ -486,9 +555,52 @@
                 userInfo.setRegistAreaCode(registAreaCode);
             }
             this.insert(userInfo);
-
+            if (uid!=null&&userType!=null){
+                // 生成邀请记录
+                Invite invite = new Invite();
+                invite.setInviteUserId(uid);
+                invite.setUserId(userInfo.getId());
+                invite.setRegisterTime(new Date());
+                invite.setUserType(userType);
+                inviteMapper.insert(invite);
+                if (userType==1){
+                    // 只有用户邀请用户会获得优惠券
+                    List<Map<String, Object>> query = userActivityInviteMapper.query(1);
+                    Date date = new Date();
+                    for(Map<String, Object> map : query){
+                        Double lavePrice = Double.valueOf(map.get("lavePrice").toString());
+                        for(int i = Integer.valueOf(String.valueOf(map.get("totalNum"))); i > 0; i--){
+                            //判断当前优惠券金额是否大于可发放剩余总金额
+                            if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(lavePrice) > 0){
+                                break;
+                            }
+                            UserCouponRecord userCouponRecord = new UserCouponRecord();
+                            userCouponRecord.setActivityType(3);
+                            userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                            userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("couponId"))));
+                            userCouponRecord.setState(1);
+                            Calendar calendar = Calendar.getInstance();
+                            calendar.setTime(date);
+                            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("effective"))));
+                            userCouponRecord.setExpirationTime(calendar.getTime());
+                            userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("couponType"))));
+                            userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("couponUseType"))));
+                            userCouponRecord.setInsertTime(date);
+                            userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("fullMoney"))));
+                            userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("money"))));
+                            userCouponRecord.setCompanyId(userInfo.getCompanyId());
+                            userCouponRecord.setUserId(uid);
+                            userCouponRecordService.insert(userCouponRecord);
+                            //修改剩余可发放总金额
+                            lavePrice -= Double.valueOf(String.valueOf(map.get("money")));
+                        }
+                        UserActivityInvite uai = userActivityInviteMapper.selectById(Integer.valueOf(map.get("id").toString()));
+                        uai.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                        userActivityInviteMapper.updateById(uai);
+                    }
+                }
+            }
             this.addCoupon(userInfo);//添加优惠券
-
             UserInfo finalUserInfo = userInfo;
             new Thread(new Runnable() {
                 @Override
@@ -515,6 +627,7 @@
             jsonObject.put(userInfo.getId().toString(), userInfo.getAppletsOpenId());
             redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
         }
+        generateQrCode(userInfo);
 
         //调用单点登录的逻辑
         this.singlePointLogin(userInfo.getId(),loginType);
@@ -530,6 +643,77 @@
         return ResultUtil.success(loginWarpper);
     }
 
+
+    private void generateQrCode(UserInfo userInfo) {
+        if (userInfo.getCode()!=null){
+            return;
+        }
+        String accessToken = weChatUtil.getAccessToken();
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
+            Map<String, Object> param = new HashMap<>();
+//            param.put("page", "pageA/houseDetail");
+            param.put("check_path", false);
+            // 用户id 用于分享
+            param.put("scene", "uid="+userInfo.getId()+"userType=1");
+
+//            param.put("env_version", "trial");// 体验版
+            param.put("env_version", "release");// 正式版
+            param.put("width", 200); //二维码尺寸
+            param.put("is_hyaline", true); // 是否需要透明底色, is_hyaline 为true时,生成透明底色的小程序码 参数仅对小程序码生效
+            param.put("auto_color", true); // 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调 参数仅对小程序码生效
+            Map<String, Object> line_color = new HashMap<>();
+            line_color.put("r", 0);
+            line_color.put("g", 0);
+            line_color.put("b", 0);
+            param.put("line_color", line_color);
+            System.err.println("调用生成微信URL接口传参:" + param);
+            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
+            HttpEntity requestEntity = new HttpEntity(param, headers);
+            ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
+            System.err.println("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody());
+            byte[] result = entity.getBody();
+            System.err.println(Base64.encodeBase64String(result));
+
+            inputStream = new ByteArrayInputStream(result);
+            String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpeg";
+            MultipartFile multipartFile = convertInputStreamToMultipartFile(inputStream, finalFileName, "image/jpeg");
+            String pictureName = OssUploadUtil.ossUploadCode(multipartFile);
+            System.err.println(pictureName);
+            userInfo.setCode(pictureName);
+            this.updateById(userInfo);
+
+        } catch (Exception e) {
+            System.err.println("调用小程序生成微信永久小程序码URL接口异常" + e);
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+    public MultipartFile convertInputStreamToMultipartFile(InputStream inputStream, String fileName, String contentType) throws IOException {
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int bytesRead;
+        while ((bytesRead = inputStream.read(buffer)) != -1) {
+            byteArrayOutputStream.write(buffer, 0, bytesRead);
+        }
+        byte[] data = byteArrayOutputStream.toByteArray();
+        return new CustomMultipartFile(data, fileName, contentType);
+    }
 
     /**
      * 忘记密码操作
@@ -560,6 +744,7 @@
         smsrecordService.saveData(3, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
         return ResultUtil.success();
     }
+
 
 
     /**
@@ -641,6 +826,18 @@
         this.updateById(userInfo);
 
         smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
+        List<Invite> invites = inviteMapper.selectList(null);
+        List<UserInfo> userInfos = this.selectList(null);
+        List<Integer> integers = new ArrayList<>();
+        for (Invite invite : invites) {
+            UserInfo userInfo2 = userInfos.stream().filter(e -> e.getId().equals(invite.getUserId())).findFirst().orElse(null);
+            if (userInfo2==null){
+                integers.add(invite.getId());
+            }
+        }
+        if (!integers.isEmpty()){
+            inviteMapper.deleteBatchIds(integers);
+        }
         return ResultUtil.success(new LoginWarpper());
     }
 
@@ -905,7 +1102,7 @@
             if(null == userInfo){
                 return ResultUtil.error("获取用户信息失败");
             }
-            return this.captchaLogin(userInfo.get("phone"), "1234", null, registAreaCode, loginType);
+            return this.captchaLogin(userInfo.get("phone"), "1234", null, registAreaCode, loginType,null,null);
         }else{
             return ResultUtil.error(jsonObject.getString("msg"));
         }
@@ -933,7 +1130,18 @@
         }
         jsonObject.put(userId.toString(), openid);
         redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
+        UserInfo userInfo = userInfoMapper.selectById(userId);
+        if (userInfo!=null){
+            userInfo.setAppletsOpenId(openid);
+            userInfoMapper.updateById(userInfo);
+        }
         return ResultUtil.success();
+    }
+
+    @Override
+    public UserInfo generateCode(UserInfo userInfo) {
+        generateQrCode(userInfo);
+        return userInfo;
     }
 
     public Map<String, String> getUserInfo(String accessToken){
@@ -967,7 +1175,7 @@
      * @throws Exception
      */
     public synchronized void addCoupon(Integer userId, Double money, Integer companyId, Integer paymentRecordId) throws Exception{
-        List<Map<String, Object>> query = userActivityBalanceService.query(money, companyId);
+        List<Map<String, Object>> query = userActivityBalanceService.query(money, 1);
         List<UserCouponRecord> list = new ArrayList<>();
         for(Map<String, Object> map : query){
             //添加通用优惠券
@@ -1107,7 +1315,7 @@
      * @return
      */
     public String getDefaultName(){
-        int num = this.selectCount(new EntityWrapper<UserInfo>().ne("flag", 3)) + 1000001;
+        int num = this.selectCount(new EntityWrapper<UserInfo>()) + 1000001;
         return "XN" + String.valueOf(num).substring(1);
     }
 
@@ -1148,7 +1356,55 @@
      */
     private synchronized void addCoupon(UserInfo userInfo) throws Exception{
         //添加优惠券
-        List<Map<String, Object>> list = userActivityRegisteredService.query(userInfo.getCompanyId());
+        List<Map<String, Object>> list = userActivityRegisteredService.query(1);
+        int num = 0;
+        for(Map<String, Object> map : list){
+            if(null != map){
+                Integer totalNum = Integer.valueOf(String.valueOf(map.get("totalNum")));
+                Double lavePrice = Double.valueOf(String.valueOf(map.get("lavePrice")));
+                for(int i = totalNum; i > 0; i--){
+                    //判断当前发放的优惠券是否大于剩余可发送总金额
+                    if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(lavePrice) > 0){
+                        break;
+                    }
+                    UserCouponRecord userCouponRecord = new UserCouponRecord();
+                    userCouponRecord.setUserId(userInfo.getId());
+                    userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("companyId"))));
+                    userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("money"))));
+                    userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("fullMoney"))));
+                    userCouponRecord.setInsertTime(new Date());
+                    userCouponRecord.setState(1);
+                    userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("couponUseType"))));
+                    userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("couponType"))));
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(new Date());
+                    Integer integer = Integer.valueOf(String.valueOf(null != map.get("effective") ? map.get("effective") : "0"));
+                    calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + integer);
+                    userCouponRecord.setExpirationTime(calendar.getTime());
+                    userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("couponId"))));
+                    userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id"))));
+                    userCouponRecord.setActivityType(2);
+                    userCouponRecordService.insert(userCouponRecord);
+                    //修改剩余可发放总金额
+                    lavePrice -= Double.valueOf(String.valueOf(map.get("money")));
+                    num++;
+                }
+                UserActivityRegistered uar = userActivityRegisteredService.selectById(Integer.valueOf(map.get("id").toString()));
+                uar.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                userActivityRegisteredService.updateById(uar);
+            }
+        }
+        //添加系统消息
+        systemNoticeService.addSystemNotice(1, "您已获得" + num + "张优惠券,点击查看", userInfo.getId(), 2);
+    }
+    /**
+     * 邀请注册时查询活动添加优惠券
+     * @param userInfo
+     * @throws Exception
+     */
+    private synchronized void addInviteCoupon(UserInfo userInfo) throws Exception{
+        //添加优惠券
+        List<Map<String, Object>> list = userActivityInviteMapper.query(1);
         int num = 0;
         for(Map<String, Object> map : list){
             if(null != map){

--
Gitblit v1.7.1