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