Pu Zhibing
2025-04-28 c399be7463c16b3787b3e591d3006628a11ab858
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,16 +148,16 @@
        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 + "\"}");
@@ -152,11 +168,6 @@
            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 +182,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 +200,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 +227,6 @@
                userInfo.setRegistAreaCode(registAreaCode);
            }
            this.insert(userInfo);
            this.addCoupon(userInfo);//添加优惠券
            UserInfo finalUserInfo = userInfo;
@@ -227,11 +239,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 +377,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 +405,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 +502,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 +517,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 +554,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 +626,7 @@
            jsonObject.put(userInfo.getId().toString(), userInfo.getAppletsOpenId());
            redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString());
        }
        generateQrCode(userInfo);
        //调用单点登录的逻辑
        this.singlePointLogin(userInfo.getId(),loginType);
@@ -530,6 +642,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 +743,7 @@
        smsrecordService.saveData(3, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!");
        return ResultUtil.success();
    }
    /**
@@ -641,6 +825,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 +1101,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 +1129,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 +1174,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 +1314,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 +1355,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){