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