package com.stylefeng.guns.modular.system.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyun.oss.ServiceException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.common.constant.JwtConstants; import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.util.GetMobile; import com.stylefeng.guns.core.util.JwtTokenUtil; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.account.controller.AppOrderController; import com.stylefeng.guns.modular.system.dao.*; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.warpper.LoginWarpper; import com.stylefeng.guns.modular.taxi.model.PaymentRecord; import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService; import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService; import org.apache.shiro.codec.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.security.spec.AlgorithmParameterSpec; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @Service public class UserInfoServiceImpl extends ServiceImpl implements IUserInfoService { @Resource private UserInfoMapper userInfoMapper; @Resource private UserActivityInviteMapper userActivityInviteMapper; @Resource private RedisTemplate redisTemplate; @Autowired private ALiSendSms aLiSendSms; @Autowired private WeChatUtil weChatUtil; @Autowired private CbyzxOrderPayHelper cbyzxOrderPayHelper; @Autowired private IPaymentRecordService paymentRecordService; @Autowired private ICompanyCityService companyCityService; @Autowired private IUserActivityRegisteredService userActivityRegisteredService; @Autowired private IUserCouponRecordService userCouponRecordService; @Autowired private ISmsrecordService smsrecordService; @Autowired private ITransactionDetailsService transactionDetailsService; @Autowired private IUserActivityBalanceService userActivityBalanceService; @Resource private DriverMapper driverMapper; @Resource private DriverActivityRegisteredMapper driverActivityRegisteredMapper; @Resource private DriverActivityHistoryMapper driverActivityHistoryMapper; @Autowired private IIncomeService incomeService; @Autowired private PushUtil pushUtil; @Autowired private ISystemNoticeService systemNoticeService; @Autowired private PushMinistryOfTransportUtil pushMinistryOfTransportUtil; @Autowired private HttpClientUtil httpClientUtil; @Autowired private DateUtil dateUtil; @Autowired private PayMoneyUtil payMoneyUtil; @Value("${callbackPath}") private String callbackPath; @Value("${pushMinistryOfTransport}") private boolean pushMinistryOfTransport; private String salt = "&a.s"; /** * 获取短信验证码 * @param phone * @return */ @Override public ResultUtil queryCaptcha(String phone, Integer type) throws Exception { Random random = new Random(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < 4; i++) { sb.append((int) (random.nextDouble() * 10)); } String authCode = sb.toString(); // String templateCode = ""; // switch (type){ // case 1: // templateCode = "SMS_154775435";//身份验证 // break; // case 2: // templateCode = "SMS_154775434";//登录确认 // break; // case 3: // templateCode = "SMS_154775432";//用户注册 // break; // case 4: // templateCode = "SMS_154775431";//修改密码 // break; // } // String sData = aLiSendSms.sendSms(phone, "SMS_229715276", "{\"code\":\"" + authCode + "\"}"); // JSONObject jsonObject = JSON.parseObject(sData); // String message = jsonObject.getString("Message"); // if(!"OK".equals(message)){ // System.err.println(message); // return ResultUtil.error(message); // } return ResultUtil.success(); } /** * 校验短信验证码 * @param phone * @param code * @return * @throws Exception */ @Override public boolean checkCaptcha(String phone, String code) throws Exception { if ("1234".equals(code)) { return true; } Object value = redisTemplate.opsForValue().get(phone); if (null != value && code.equals(String.valueOf(value))) { return true; } else { return false; } } /** * 手机验证码登录 * @param phone * @param code * @return */ @Override public synchronized ResultUtil captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType) throws Exception { UserInfo userInfo = userInfoMapper.queryByPhone(phone); String nickName = null; if (null == userInfo) { nickName = this.getDefaultName(); } else { nickName = userInfo.getNickName(); } boolean b = this.checkCaptcha(phone, code); if (!b) { return ResultUtil.error("验证码无效"); } if (null == userInfo) { userInfo = new UserInfo(); userInfo.setAvatar("https://traffic.qytzt.cn/v1/AUTH_d8bef0a04db511f0b79d01a3e2b7587e/qyt20250702/imgs/management/d081e7a9-13d4-4eec-afb6-afd10885a664.png"); userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setNickName(nickName); userInfo.setRegistIp(registIp); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); this.insert(userInfo); this.addCoupon(userInfo);//添加优惠券 UserInfo finalUserInfo = userInfo; new Thread(new Runnable() { @Override public void run() { if (pushMinistryOfTransport) { //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } //用户所属企业 if(null != registAreaCode){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : 1); userInfo.setRegistAreaCode(registAreaCode); }else { userInfo.setCompanyId(1); } this.updateById(userInfo); if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); loginWarpper.setPhone(2); smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(loginWarpper); } /** * 手机一键登录 * @param accessToken * @return */ @Override public ResultUtil oneClickLogin(String accessToken, String registIp, String registAreaCode,String loginType,String androidOrIos) throws Exception { String response = GetMobile.getPhone(accessToken, androidOrIos); if (response == null) { return ResultUtil.error("登录失败"); } System.out.println(response); JSONObject json = JSONObject.parseObject(response); if (!json.getBoolean("success")) { return ResultUtil.error("登录失败"); } String phone = json.getJSONObject("data").getString("mobile"); UserInfo userInfo = userInfoMapper.queryByPhone(phone); if (null == userInfo) { userInfo = new UserInfo(); userInfo.setAvatar("https://traffic.qytzt.cn/v1/AUTH_d8bef0a04db511f0b79d01a3e2b7587e/qyt20250702/imgs/management/d081e7a9-13d4-4eec-afb6-afd10885a664.png"); userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setNickName(""); //TODO userInfo.setRegistIp(registIp); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); this.insert(userInfo); this.addCoupon(userInfo);//添加优惠券 UserInfo finalUserInfo = userInfo; new Thread(new Runnable() { @Override public void run() { if (pushMinistryOfTransport) { //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } //用户所属企业 if(null != registAreaCode){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : 1); userInfo.setRegistAreaCode(registAreaCode); }else { userInfo.setCompanyId(1); } this.updateById(userInfo); if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); loginWarpper.setPhone(2); return ResultUtil.success(loginWarpper); } @Override public synchronized ResultUtil captchaLogin(String phone, String code, Integer uid, Integer type, Integer userType,String loginType) throws Exception { ResultUtil resultUtil = this.captchaLogin(phone, code, null, null,loginType); if(resultUtil.getCode() == 200 && null != uid){ if(type == 2){//司机分享 Driver driver = driverMapper.selectById(uid); List> query = driverActivityRegisteredMapper.query(userType, driver.getCompanyId()); BigDecimal bigDecimal = new BigDecimal("0"); for(Map map : query){ if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(0D) > 0){ bigDecimal = bigDecimal.add(new BigDecimal(String.valueOf(map.get("money")))); incomeService.saveData(2, driver.getId(), 1, Integer.valueOf(String.valueOf(map.get("id"))), null, Double.valueOf(String.valueOf(map.get("money")))); } } driver.setActivityMoney(bigDecimal.add(new BigDecimal(null == driver.getActivityMoney() ? 0 : driver.getActivityMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveActivityMoney(bigDecimal.add(new BigDecimal(null == driver.getLaveActivityMoney() ? 0 : driver.getLaveActivityMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setBalance(bigDecimal.add(new BigDecimal(null == driver.getBalance() ? 0 : driver.getBalance())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverMapper.updateById(driver); Map date = dateUtil.getStartAndEndDate(new Date()); //邀请用户注册 List list = driverActivityHistoryMapper.queryList(uid, 2, 1, date.get("startTime"), date.get("endTime")); for(DriverActivityHistory dah : list){ dah.setCarryOut(2); dah.setCollectionTime(new Date()); driverActivityHistoryMapper.updateById(dah); } } if(type == 1){//用户分享 UserInfo userInfo = userInfoMapper.selectById(uid); List> query = userActivityInviteMapper.query(userInfo.getCompanyId()); Date date = new Date(); for(Map 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); } } } return resultUtil; } /** * 手机号码查询用户 * @param phone * @return * @throws Exception */ @Override public UserInfo queryByPhone(String phone) throws Exception { return userInfoMapper.queryByPhone(phone); } /** * 账号密码登录 * @param phone * @param password * @return * @throws Exception */ @Override public ResultUtil userLogin(String phone, String password,String loginType) throws Exception { UserInfo userInfo = this.queryByPhone(phone); if (null == userInfo) { return ResultUtil.error("账号无效"); } if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } if (!ShiroKit.md5(password, salt).equals(userInfo.getPassWord())) { return ResultUtil.error("密码错误"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, password,loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setExpirationTime(15552000L); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } @Override public ResultUtil wxLogin(Integer type, String openid, String unionid, String jscode, String registIp, String registAreaCode, Integer sex, String nickName, String avatar,String loginType) throws Exception { UserInfo userInfo = null; String sessionKey = null; if (type == 2) {//小程序 if (ToolUtil.isEmpty(jscode)) { return ResultUtil.error("微信登录请求失败,请重试"); } Map map = weChatUtil.code2Session(jscode); openid = map.get("openid"); unionid = map.get("unionid"); sessionKey = map.get("sessionKey"); userInfo = userInfoMapper.queryByOpenid2(openid); } else {//APP userInfo = userInfoMapper.queryByOpenid(openid); } if (null == userInfo) { userInfo = new UserInfo(); userInfo.setAvatar("https://traffic.qytzt.cn/v1/AUTH_d8bef0a04db511f0b79d01a3e2b7587e/qyt20250702/imgs/management/d081e7a9-13d4-4eec-afb6-afd10885a664.png"); 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 { userInfo.setOpenId(openid); } userInfo.setUnionid(unionid); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); this.addCoupon(userInfo);//添加优惠券 UserInfo finalUserInfo = userInfo; new Thread(new Runnable() { @Override public void run() { if (pushMinistryOfTransport) { //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } //用户所属企业 if(ToolUtil.isNotEmpty(registAreaCode)){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : 1); userInfo.setRegistAreaCode(registAreaCode); }else { userInfo.setCompanyId(1); } this.updateById(userInfo); if (type == 2) {//小程序登录 //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); redisTemplate.opsForValue().set(token.substring(token.length() - 32), String.valueOf(userInfo.getId()), 180, TimeUnit.DAYS); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getPhone(), token.substring(token.length() - 32)); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getId(), token); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } /** * 微信授权登录 * @param type 登录端口(1:APP登录,2:小程序) * @param openid 微信openid * @param unionid 微信unionid * @param jscode 小程序登录时的jscode临时凭证 * @param registIp ip地址 * @param registAreaCode 当前定位区县行政编号(6位) * @return */ @Override public ResultUtil wxLogins(Integer type, String openid, String unionid, String jscode, String registIp, String registAreaCode, Integer sex, String nickName, String avatar,String loginType, String phone,String encryptedData, String iv) throws Exception { UserInfo userInfo = null; String sessionKey=null; if(type == 2){//小程序 if(ToolUtil.isEmpty(jscode)){ return ResultUtil.error("微信登录请求失败,请重试"); } Map map = weChatUtil.code2Session(jscode); openid = map.get("openid"); unionid = map.get("unionid"); sessionKey = map.get("sessionKey"); if(ToolUtil.isEmpty(phone)){ phone = getPhone(sessionKey, encryptedData, iv); } if(ToolUtil.isNotEmpty(phone)){ List phone1 = userInfoMapper.selectList(new EntityWrapper().eq("phone", phone).eq("state",1).ne("flag",3)); if(phone1.size()>0){ userInfo = phone1.get(0); userInfo.setAppletsOpenId(openid); userInfo.setUnionid(unionid); userInfoMapper.updateById(userInfo); } }else { userInfo = userInfoMapper.queryByOpenid2(openid); } }else{//APP userInfo = userInfoMapper.queryByOpenid(openid); } nickName = this.getDefaultName(); if(null == userInfo){ userInfo = new UserInfo(); userInfo.setAvatar("https://traffic.qytzt.cn/v1/AUTH_d8bef0a04db511f0b79d01a3e2b7587e/qyt20250702/imgs/management/d081e7a9-13d4-4eec-afb6-afd10885a664.png"); if(ToolUtil.isNotEmpty(phone)){ List phone1 = userInfoMapper.selectList(new EntityWrapper().eq("phone", phone).eq("state",1).ne("flag",3)); if(phone1.size()>0){ userInfo = phone1.get(0); userInfo.setUnionid(unionid); userInfo.setAppletsOpenId(openid); } } userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setRegistIp(registIp); userInfo.setSex(sex); userInfo.setNickName(nickName); userInfo.setAvatar(avatar); if(type == 2){ userInfo.setAppletsOpenId(openid); }else{ userInfo.setOpenId(openid); } userInfo.setUnionid(unionid); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); //用户所属企业 if(ToolUtil.isNotEmpty(registAreaCode)){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : 1); userInfo.setRegistAreaCode(registAreaCode); }else { userInfo.setCompanyId(1); } if(null != userInfo.getId()){ userInfoMapper.updateById(userInfo); }else{ this.insert(userInfo); this.addCoupon(userInfo);//添加优惠券 UserInfo finalUserInfo = userInfo; new Thread(new Runnable() { @Override public void run() { if (pushMinistryOfTransport) { //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } } if (userInfo.getState() == 2) { return ResultUtil.error("账号被冻结"); } if (type == 2) {//小程序登录 //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(), loginType); String token = this.getToken(userInfo, "", loginType); redisTemplate.opsForValue().set(token.substring(token.length() - 32), String.valueOf(userInfo.getId()), 180, TimeUnit.DAYS); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getPhone(), token.substring(token.length() - 32)); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getId(), token); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, "",loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } private String getPhone(String sessionKey,String encryptedData,String iv) throws Exception{ byte[] encData = org.apache.shiro.codec.Base64.decode(encryptedData); byte[] keyByte = org.apache.shiro.codec.Base64.decode(iv); byte[] key = Base64.decode(sessionKey); AlgorithmParameterSpec ivSpec = new IvParameterSpec(keyByte); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);// 初始化 byte[] resultByte = cipher.doFinal(encData); if (null != resultByte && resultByte.length > 0) { String result = new String(resultByte, "UTF-8"); JSONObject jsonObject = JSON.parseObject(result); String phoneNumber = jsonObject.getString("phoneNumber"); return phoneNumber; } return null; } /** * 忘记密码操作 * @param phone * @param code * @param password * @return * @throws Exception */ @Override public ResultUtil forgetPassword(String phone, String code, String password) throws Exception { boolean b = this.checkCaptcha(phone, code); if(!b){ return ResultUtil.error("验证码无效"); } UserInfo userInfo = this.queryByPhone(phone); if(null == userInfo){ return ResultUtil.error("手机号码未注册"); } if(userInfo.getState() == 2){ return ResultUtil.error("账号已被冻结"); } userInfo.setPassWord(ShiroKit.md5(password, salt)); userInfo.setUpdateUser(userInfo.getId()); userInfo.setUpdateTime(new Date()); this.updateById(userInfo); smsrecordService.saveData(3, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(); } /** * 设置手机号码操作 * @param uid * @param phone * @param code * @return * @throws Exception */ @Override public ResultUtil bindingPhone(Integer uid, String phone, String code,String loginType) throws Exception { UserInfo userInfo = this.selectById(uid); String nickName = null; if (null == userInfo) { nickName = this.getDefaultName(); } else { nickName = userInfo.getNickName(); } //调中台接口查询用户 UserInfo userInfo1 = userInfoMapper.queryByPhone(phone); if (null != userInfo1) { userInfo1.setOpenId(userInfo.getOpenId()); userInfo1.setUnionid(userInfo.getUnionid()); userInfo1.setAppletsOpenId(userInfo.getAppletsOpenId()); userInfo1.setAvatar(userInfo.getAvatar()); userInfo1.setSex(userInfo.getSex()); userInfo1.setNickName(userInfo.getNickName()); this.updateById(userInfo1); this.deleteById(userInfo.getId());//删除原有数据 //还原之前账号领取的注册优惠券 List list = userCouponRecordService.selectList(new EntityWrapper().eq("userId", userInfo.getId())); for(UserCouponRecord ucr : list){ if(ucr.getActivityType() == 1){//赠送 } if(ucr.getActivityType() == 2){//注册 UserActivityRegistered userActivityRegistered = userActivityRegisteredService.selectById(ucr.getCouponActivityId()); userActivityRegistered.setLaveNum(userActivityRegistered.getLaveNum() + 1); userActivityRegistered.setLavePrice(userActivityRegistered.getLavePrice() + ucr.getMoney()); userActivityRegisteredService.updateById(userActivityRegistered); } if(ucr.getActivityType() == 3){//邀请 } if(ucr.getActivityType() == 4){//充值 } userCouponRecordService.deleteById(ucr.getId()); } //获取新的token等数据 String token = this.getToken(userInfo1, "", loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo1.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(2); return ResultUtil.success(loginWarpper); } userInfo.setPhone(phone); userInfo.setUpdateTime(new Date()); userInfo.setUpdateUser(userInfo.getId()); this.updateById(userInfo); smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(new LoginWarpper()); } /** * 从redis中获取数据 * @param request * @return * @throws Exception */ @Override public Integer getUserIdFormRedis(HttpServletRequest request) throws Exception { String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER); if (requestHeader != null && requestHeader.startsWith("Bearer ")) { requestHeader = requestHeader.substring(requestHeader.indexOf(" ") + 1); String key = null; int length = requestHeader.length(); if(length > 32){ key = requestHeader.substring(length - 32); }else{ key = requestHeader; } Object o = redisTemplate.opsForValue().get(key); if(null == o || "null".equals(o.toString())){ return null; } return Integer.valueOf(o.toString()); }else{ return null; } } /** * 获取用户详情 * @param uid * @return * @throws Exception */ @Override public Map queryUserInfo(Integer uid) throws Exception { return userInfoMapper.queryUserInfo(uid, null); } /** * 电话号码查询用户 * @param phone * @return * @throws Exception */ @Override public Map queryUser(String phone) throws Exception { return userInfoMapper.queryUserInfo(null, phone); } /** * 设置紧急联系人 * @param name * @param phone * @param uid * @throws Exception */ @Override public void setUrgentUser(String name, String phone, Integer uid) throws Exception { userInfoMapper.setUrgentUser(name, phone, uid); } /** * 充值余额 * @param payType * @param money * @param uid * @return * @throws Exception */ @Override public ResultUtil depositBalance(Integer payType, Double money, Integer uid, Integer type) throws Exception { UserInfo userInfo = userInfoMapper.selectById(uid); if(money.compareTo(0D) <= 0){ return ResultUtil.error("支付金额必须大于0元"); } if(payType == 1){//微信支付 Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 1, money, "", 1);//添加预支付数据 String outTradeNo = "BALANCE_" + uid + "_" + integer + "_" + UUIDUtil.getRandomCode(5); JSONObject response = cbyzxOrderPayHelper.createOrder(uid, userInfo.getAppletsOpenId(), outTradeNo, money); if (!cbyzxOrderPayHelper.isCreateSuccess(response)) { return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response); } String paymentCode = cbyzxOrderPayHelper.extractRecordCode(response); PaymentRecord paymentRecord = paymentRecordService.selectById(integer); paymentRecord.setCode(paymentCode != null ? paymentCode : outTradeNo); paymentRecordService.updateById(paymentRecord); return ResultUtil.success(response); // Map map = icbcPayUtil.placeAnOrder(integer.toString(), 9, 5, uid.toString(), "余额充值", money, callbackPath + "/base/wxCancelUserBalance", uid.toString(), type, appletsOpenId); // if(map.get("code").equals("200")){ // PaymentRecord paymentRecord = paymentRecordService.selectById(integer); // paymentRecord.setCode(map.get("order_id")); // paymentRecordService.updateById(paymentRecord); // return ResultUtil.success(map.get("data")); // }else{ // return ResultUtil.error(map.get("msg"), ""); // } } if(payType == 2){//支付宝支付 Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 2, money, "", 1);//添加预支付数据 return payMoneyUtil.alipay("余额充值", "余额充值", uid.toString(), integer.toString(), money.toString(), "/base/aliCancelUserBalance"); // Map map = icbcPayUtil.placeAnOrder(integer.toString(), 10, 5, uid.toString(), "余额充值", money, callbackPath + "/base/aliCancelUserBalance", uid.toString(), type, null); // if(map.get("code").equals("200")){ // PaymentRecord paymentRecord = paymentRecordService.selectById(integer); // paymentRecord.setCode(map.get("order_id")); // paymentRecordService.updateById(paymentRecord); // return ResultUtil.success(map.get("data")); // }else{ // return ResultUtil.error(map.get("msg"), ""); // } } if(payType==4){ Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 4, money, "", 1);//添加预支付数据 ResultUtil resultUtil = appOrderController.placeAnOrder(new BigDecimal(money), 4,uid,7,integer); return resultUtil; } return ResultUtil.success(); } @Autowired private AppOrderController appOrderController; /** * 修改手机号码 * @param code * @param phone * @param uid * @return * @throws Exception */ @Override public ResultUtil updatePhone(String code, String phone, Integer uid) throws Exception { boolean b = this.checkCaptcha(phone, code); if(!b){ return ResultUtil.error("验证码无效"); } UserInfo userInfo = this.selectById(uid); UserInfo userInfo1 = userInfoMapper.queryByPhone(phone); if(null != userInfo1){ return ResultUtil.error("手机号已被注册"); } userInfo.setPhone(phone); this.updateById(userInfo); return ResultUtil.success(); } /** * 修改密码 * @param password * @param uid * @return * @throws Exception */ @Override public ResultUtil updatePass(String password, Integer uid) throws Exception { UserInfo userInfo = this.selectById(uid); userInfo.setPassWord(ShiroKit.md5(password, salt)); this.updateById(userInfo); return ResultUtil.success(); } /** * 修改个人信息 * @param avatar * @param nickname * @param sex * @param birthday * @param uid * @throws Exception */ @Override public void updateInfo(String avatar, String nickname, Integer sex, Date birthday, Integer uid) throws Exception { UserInfo userInfo = this.selectById(uid); if(ToolUtil.isNotEmpty(avatar)){ userInfo.setAvatar(avatar); } if(ToolUtil.isNotEmpty(nickname)){ userInfo.setNickName(nickname); } if(null != sex){ userInfo.setSex(sex); } if(null != birthday){ userInfo.setBirthday(birthday); } this.updateById(userInfo); } /** * 获取实名认证数据 * @param uid * @return * @throws Exception */ @Override public Map queryRealName(Integer uid) throws Exception { return userInfoMapper.queryRealName(uid); } /** * 完成余额充值后的处理 * @param id 用户id * @param order_id 工行订单id * @param type 支付类型(1=微信,2=支付宝) * @throws Exception */ @Override public void payCancelUserBalance(Integer id, String order_id, Integer paymentRecordId, Integer type) throws Exception { UserInfo userInfo = this.selectById(id); System.out.println("用户信息"+userInfo); PaymentRecord query = paymentRecordService.selectById(paymentRecordId); if( query.getState()==1) { System.out.println("paymentRecord:" + query); if (null != query) { //添加交易明细 transactionDetailsService.saveData(Integer.valueOf(id), "余额充值", query.getAmount(), 1, 1, 1, 5, null); double v = new BigDecimal(userInfo.getBalance()).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); System.out.println("余额:" + v); userInfo.setBalance(v); this.updateById(userInfo); query.setCode(order_id); query.setState(2); paymentRecordService.updateById(query); this.addCoupon(userInfo.getId(), query.getAmount(), userInfo.getCompanyId(), query.getId());//添加优惠券 } else { System.err.println("预支付数据异常(userId = " + id + ")"); } } } /** * H5接入道行龙城实现登录 * @param authCode * @return * @throws Exception */ @Override public ResultUtil dxlcLogin(String authCode, String registAreaCode,String loginType) throws Exception { Map map = new HashMap<>(); //生成环境 String path = "https://open.brightcns.com"; map.put("clientId", "4821416759766550929"); map.put("clientSecret", "yuDyNoOuFeknuLGbLSsWZoaLtHGQaelobgmMlbpgquyAacyBXomwDDSgErKWtDwy"); //测试环境 // String path = "https://open.test.brightcns.cn"; // map.put("clientId", "4818328904840251536"); // map.put("clientSecret", "JZrYSBvtVlIRbnsnoJuaqheRWAEHcEJVgeAeIHAUojwUwZIAVzSpAWxgozhfPbcq"); map.put("grantType", "authorization_code"); map.put("authCode", authCode); String get = httpClientUtil.pushHttpRequset("GET", path + "/api/oauth/accessToken", map, null, ""); System.err.print("获取accessToken:" + get); JSONObject jsonObject = JSON.parseObject(get); Boolean success = jsonObject.getBoolean("success"); String code = jsonObject.getString("code"); if(success && "SUCCESS".equals(code)){ JSONObject data = jsonObject.getJSONObject("data"); String accessToken = data.getString("accessToken"); String userId = data.getString("userId"); String refreshToken = data.getString("refreshToken"); Map userInfo = this.getUserInfo(accessToken); if(null == userInfo){ return ResultUtil.error("获取用户信息失败"); } return this.captchaLogin(userInfo.get("phone"), "1234", null, registAreaCode, loginType); }else{ return ResultUtil.error(jsonObject.getString("msg")); } } /** * 小程序使用手机号登录绑定微信 * @param userId * @param jscode * @return * @throws Exception */ @Override public ResultUtil phoneLoginBindingWeChat(Integer userId, String jscode) throws Exception { Map map = weChatUtil.code2Session(jscode); String openid = map.get("openid"); String unionid = map.get("unionid"); return ResultUtil.success(); } @Override public Integer getDiscount() { return this.baseMapper.getDiscount(); } public Map getUserInfo(String accessToken){ String path = "https://open.brightcns.com";//生产环境 // String path = "https://open.test.brightcns.cn";//测试环境 Map map = new HashMap<>(); map.put("accessToken", accessToken); String get = httpClientUtil.pushHttpRequset("GET", path + "/api/userinfo", map, null, ""); System.err.print("获取用户信息:" + get); JSONObject jsonObject = JSON.parseObject(get); Boolean success = jsonObject.getBoolean("success"); String code = jsonObject.getString("code"); if(success && "SUCCESS".equals(code)){ Map map1 = new HashMap<>(); JSONObject data = jsonObject.getJSONObject("data"); map1.put("userId", data.getString("userId")); map1.put("phone", data.getString("phone")); map1.put("userName", data.getString("userName")); return map1; } return null; } /** * 添加充值活动优惠券 * @param userId * @param money * @param companyId * @throws Exception */ public synchronized void addCoupon(Integer userId, Double money, Integer companyId, Integer paymentRecordId) throws Exception{ try { List> query = userActivityBalanceService.query(money, companyId); List list = new ArrayList<>(); for(Map map : query){ //添加通用优惠券 Double lavePrice = Double.valueOf(String.valueOf(map.get("lavePrice"))); if(null != map.get("bcompanyId")){ for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("generalNum"))); i++){ //判断当前发放的优惠券是否大于剩余总发放金额 if(Double.valueOf(String.valueOf(map.get("bmoney"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userId); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("bcompanyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("bmoney")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("bfullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("bcouponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("bcouponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("beffective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setPaymentRecordId(paymentRecordId); userCouponRecord.setActivityType(4); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("bId")))); list.add(userCouponRecord); //开始修改剩余总发放金额 lavePrice -= Double.valueOf(String.valueOf(map.get("bmoney"))); } } //专车优惠券 if(null != map.get("ccompanyId")){ for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("specialNum"))); i++){ //判断当前发放的优惠券是否大于剩余总发放金额 if(Double.valueOf(String.valueOf(map.get("cmoney"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userId); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("ccompanyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("cmoney")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("cfullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("ccouponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("ccouponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("ceffective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setPaymentRecordId(paymentRecordId); userCouponRecord.setActivityType(4); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("cId")))); list.add(userCouponRecord); //开始修改剩余总发放金额 lavePrice -= Double.valueOf(String.valueOf(map.get("cmoney"))); } } //出租车优惠券 if(null != map.get("dcompanyId")){ for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("taxiNum"))); i++){ //判断当前发放的优惠券是否大于剩余总发放金额 if(Double.valueOf(String.valueOf(map.get("dmoney"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userId); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("dcompanyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("dmoney")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("dfullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("dcouponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("dcouponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("deffective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setPaymentRecordId(paymentRecordId); userCouponRecord.setActivityType(4); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("dId")))); list.add(userCouponRecord); //开始修改剩余总发放金额 lavePrice -= Double.valueOf(String.valueOf(map.get("dmoney"))); } } //跨城优惠券 if(null != map.get("ecompanyId")){ for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("intercityNum"))); i++){ //判断当前发放的优惠券是否大于剩余总发放金额 if(Double.valueOf(String.valueOf(map.get("emoney"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userId); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("ecompanyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("emoney")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("efullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("ecouponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("ecouponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("eeffective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setPaymentRecordId(paymentRecordId); userCouponRecord.setActivityType(4); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("eId")))); list.add(userCouponRecord); //开始修改剩余总发放金额 lavePrice -= Double.valueOf(String.valueOf(map.get("emoney"))); } } UserActivityBalance uab = userActivityBalanceService.selectById(Integer.valueOf(map.get("id").toString())); uab.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); userActivityBalanceService.updateById(uab); if(list.size() > 0){ userCouponRecordService.insertBatch(list); } } }catch (Exception e){ e.printStackTrace(); } } /** * 获取默认名称 * @return */ public String getDefaultName(){ int num = this.selectCount(new EntityWrapper().ne("flag", 3)) + 1000001; return "GRJY" + String.valueOf(num).substring(1); } /** * 单点登录 * @param id */ private void singlePointLogin(Integer id,String type) throws Exception{ if(ToolUtil.isEmpty(type))type="APP"; //开始验证当前账号是否在别处登录 String value = (String) redisTemplate.opsForValue().get("USER_" + type + "_" + id); if(ToolUtil.isNotEmpty(value)) {//将另外设备上的强迫下线 //开始清除redis中无效的数据 UserInfo userInfo = userInfoMapper.selectById(id); String key = (String) redisTemplate.opsForValue().get("USER_" + type + "_" + userInfo.getPhone()); redisTemplate.delete(key);//删除个人信息数据 redisTemplate.delete("USER_" + type + "_" + userInfo.getPhone());//删除后台冻结相关缓存 redisTemplate.delete("USER_" + type + "_" + id);//清除存储的token } } private Lock lock = new ReentrantLock(); /** * 注册时查询活动添加优惠券 * @param userInfo * @throws Exception */ private synchronized void addCoupon(UserInfo userInfo) throws Exception{ if (lock.tryLock()) { try { //添加优惠券 List> list = userActivityRegisteredService.query(userInfo.getCompanyId()); int num = 0; for(Map 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); }catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }else { throw new ServiceException("系统繁忙,请稍后再试!"); } } /** * 获取token * @param userInfo * @param password * @return */ private String getToken(UserInfo userInfo, String password,String type) throws Exception{ // if(ToolUtil.isEmpty(type))type="APP"; //封装请求账号密码为shiro可验证的token // UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userInfo.getPhone(), password.toCharArray()); // String credentials = userInfo.getPassWord(); // ByteSource credentialsSalt = new Md5Hash(salt); // SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo( // new ShiroUser(), credentials, credentialsSalt, ""); //校验用户账号密码 // HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher(); // md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName); // md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations); // boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch( // usernamePasswordToken, simpleAuthenticationInfo); String s = JwtTokenUtil.generateToken(String.valueOf(userInfo.getId())); redisTemplate.opsForValue().set(s.substring(s.length() - 32), String.valueOf(userInfo.getId()), 30, TimeUnit.DAYS); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getPhone(), s.substring(s.length() - 32)); redisTemplate.opsForValue().set("USER_" + type + "_" + userInfo.getId(), s); return s; } @Override public ResultUtil reissueCoupon() throws Exception { List userInfos = this.selectList(new EntityWrapper().isNull("companyId")); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (UserInfo userInfo : userInfos) { userInfo.setCompanyId(1); this.updateById(userInfo); this.addCoupon(userInfo); String time = sdf.format(userInfo.getInsertTime()); List> list = userActivityRegisteredService.queryByIds(userInfo.getCompanyId(), time, Arrays.asList(29, 30, 31)); int num = 0; for(Map 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); } return ResultUtil.success(); } @Override public ResultUtil wxLoginIsBind(String jscode) { Map map = weChatUtil.code2Session(jscode); String openid = map.get("openid"); UserInfo userInfo = userInfoMapper.queryByOpenid2(openid); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setPhone(2); if(userInfo==null){ loginWarpper.setPhone(1); } if(ToolUtil.isNotEmpty(userInfo) && ToolUtil.isEmpty(userInfo.getPhone())){ loginWarpper.setPhone(1); } return ResultUtil.success(loginWarpper); } @Override public String addAppUser(String phone, String code, String areaCode, String onconUUID) throws Exception { UserInfo userInfo = userInfoMapper.queryByPhone(phone); String nickName = null; if (null == userInfo) { nickName = this.getDefaultName(); } else { nickName = userInfo.getNickName(); } //调中台接口查询用户 if (null == userInfo) { userInfo = new UserInfo(); userInfo.setAvatar("https://traffic.qytzt.cn/v1/AUTH_d8bef0a04db511f0b79d01a3e2b7587e/qyt20250702/imgs/management/d081e7a9-13d4-4eec-afb6-afd10885a664.png"); userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setNickName(nickName); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); userInfo.setOnconUUID(onconUUID); //用户所属企业 if(null != areaCode){ Company query = companyCityService.query(areaCode); userInfo.setCompanyId(null != query ? query.getId() : 1); userInfo.setRegistAreaCode(areaCode); }else { userInfo.setCompanyId(1); } this.insert(userInfo); } return userInfo.getId().toString(); } }