package com.stylefeng.guns.modular.system.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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.shiro.ShiroUser; import com.stylefeng.guns.core.util.JwtTokenUtil; import com.stylefeng.guns.core.util.ToolUtil; 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.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.crypto.hash.Md5Hash; import org.apache.shiro.util.ByteSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; @Service public class UserInfoServiceImpl extends ServiceImpl implements IUserInfoService { @Resource private UserInfoMapper userInfoMapper; @Resource private UserActivityInviteMapper userActivityInviteMapper; @Autowired private RedisUtil redisUtil; @Autowired private WeChatUtil weChatUtil; @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; @Autowired private IIncomeService incomeService; @Autowired private PushUtil pushUtil; @Autowired private ISystemNoticeService systemNoticeService; @Autowired private PushMinistryOfTransportUtil pushMinistryOfTransportUtil; @Autowired private PayMoneyUtil payMoneyUtil; @Resource private DriverActivityHistoryMapper driverActivityHistoryMapper; @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(); Object value = redisUtil.getValue(phone); if(value==null){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < 4; i++){ sb.append((int) (random.nextDouble() * 10)); } String authCode = sb.toString(); String sms = "短信验证码【" + authCode + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"; //发送验证码短信 redisUtil.setStrValue(phone, authCode, 5 * 60);//设置五分钟过期 String templateCode = ""; switch (type){ case 1: templateCode = "SMS_207770039";//身份验证 break; case 2: templateCode = "SMS_207770039";//登录确认 break; case 3: templateCode = "SMS_207770039";//用户注册 break; case 4: templateCode = "SMS_207770039";//修改密码 break; } //发送记录集合 JSONArray records = new JSONArray(); JSONObject record = new JSONObject(); //手机号 record.put("mobile", phone); //替换变量 JSONObject param = new JSONObject(); param.put("code", authCode); record.put("tpContent", param); records.add(record); SMSUtil.sendSmsTp(96596L, records); System.out.println(sms); } return ResultUtil.success(); } /** * 校验短信验证码 * @param phone * @param code * @return * @throws Exception */ @Override public boolean checkCaptcha(String phone, String code) throws Exception { Object value = redisUtil.getValue(phone); if("1246".equals(code)){ return true; } if(null != value && code.equals(String.valueOf(value))){ return true; }else{ return false; } } /** * 手机验证码登录 * @param phone * @param code * @param uid 分享用户的id * @param type 分享用户的来源 * @return */ @Override public ResultUtil captchaLogin(String phone, String code, String registIp, String registAreaCode,Integer uid,Integer type, Integer userType) throws Exception { boolean b = this.checkCaptcha(phone, code); if(!b){ return ResultUtil.error("验证码无效"); } UserInfo userInfo = userInfoMapper.queryByPhone(phone); if(null == userInfo){ userInfo = new UserInfo(); userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setNickName(this.getDefaultName()); userInfo.setRegistIp(registIp); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); //用户所属企业 if(null != registAreaCode){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : null); userInfo.setRegistAreaCode(registAreaCode); }else{ userInfo.setCompanyId(1); } Double money = this.userInfoMapper.queryFreeMOney(); if(money!=null){ userInfo.setFreeMoney(BigDecimal.valueOf(money)); } if(null!=uid){ userInfo.setUid(uid); } if(null!=type){ userInfo.setuType(type); } this.insert(userInfo); this.addCoupon(userInfo);//添加优惠券 if(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")))); DriverActivityHistory driverActivityHistory = new DriverActivityHistory(); driverActivityHistory.setActivityId(Integer.valueOf(String.valueOf(map.get("id")))); driverActivityHistory.setCarryOut(2); driverActivityHistory.setDay(new Date()); driverActivityHistory.setDriverId(driver.getId()); driverActivityHistory.setInsertTime(new Date()); driverActivityHistory.setMoney(Double.valueOf(String.valueOf(map.get("money")))); driverActivityHistory.setType(1); driverActivityHistoryMapper.insert(driverActivityHistory); } } driver.setActivityMoney(bigDecimal.add(new BigDecimal(driver.getActivityMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveActivityMoney(bigDecimal.add(new BigDecimal(driver.getLaveActivityMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setBalance(bigDecimal.add(new BigDecimal(driver.getBalance())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverMapper.updateById(driver); } if(type == 1){//用户分享 UserInfo userInfo1 = userInfoMapper.selectById(uid); List> query = userActivityInviteMapper.query(userInfo1.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(userInfo1.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); } } } 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("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId()); String token = this.getToken(userInfo, ""); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(loginWarpper); } @Override public synchronized ResultUtil captchaLogin(String phone, String code, Integer uid, Integer type, Integer userType) throws Exception { ResultUtil resultUtil = this.captchaLogin(phone, code, null, null,uid,type,userType); 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(driver.getActivityMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveActivityMoney(bigDecimal.add(new BigDecimal(driver.getLaveActivityMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setBalance(bigDecimal.add(new BigDecimal(driver.getBalance())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverMapper.updateById(driver); } if(type == 1){//用户分享 UserInfo userInfo1 = userInfoMapper.selectById(uid); List> query = userActivityInviteMapper.query(userInfo1.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(userInfo1.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) 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()); String token = this.getToken(userInfo, password); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); 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 wxLogin(Integer type, String openid, String unionid, String jscode, String registIp, String registAreaCode, Integer sex, String nickName, String avatar,String loginType,String encryptedData, String iv,Integer uid) throws Exception { UserInfo userInfo = null; String phone=null; if(type == 2){//小程序 if(ToolUtil.isEmpty(jscode)){ return ResultUtil.error("微信登录请求失败,请重试"); } Map map = weChatUtil.code2Session(jscode); openid = map.get("openid"); unionid = map.get("unionid"); userInfo = userInfoMapper.queryByOpenid2(openid); if(null==userInfo){ String result= weChatUtil.decrypt1(encryptedData,map.get("sessionKey"),iv); JSONObject json=JSONObject.parseObject(result); if (!ToolUtil.isEmpty(result) && result.length()>0) { userInfo = userInfoMapper.queryByPhone(json.getString("phoneNumber")); phone=json.getString("phoneNumber"); } } if(null!=userInfo && !openid.equals(userInfo.getAppletsOpenId())){ userInfo.setAppletsOpenId(openid); userInfo.setUnionid(unionid); userInfo.setNickName(ToolUtil.isNotEmpty(nickName) ? nickName : this.getDefaultName()); userInfo.setAvatar(avatar); userInfoMapper.updateById(userInfo); } }else{//APP userInfo = userInfoMapper.queryByOpenid(openid); } if(null == userInfo){ userInfo = new UserInfo(); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setRegistIp(registIp); userInfo.setSex(sex); userInfo.setPhone(phone); userInfo.setNickName(ToolUtil.isNotEmpty(nickName) ? nickName : this.getDefaultName()); userInfo.setAvatar(avatar); Double money = this.userInfoMapper.queryFreeMOney(); if(money!=null){ userInfo.setFreeMoney(BigDecimal.valueOf(money)); } if(null!=uid){ userInfo.setUid(uid); //微信登录只能是乘客用户分享 userInfo.setuType(1); } 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(null != registAreaCode){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : null); userInfo.setRegistAreaCode(registAreaCode); } 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("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId()); String token = this.getToken(userInfo, ""); 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()); if(uid!=null){ 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.success(loginWarpper); } @Override public ResultUtil wxIsLogin(String jscode) throws Exception { UserInfo userInfo = null; String phone=null; if(ToolUtil.isEmpty(jscode)){ return ResultUtil.error("微信登录请求失败,请重试"); } Map map = weChatUtil.code2Session(jscode); String openid = map.get("openid"); String unionid = map.get("unionid"); userInfo = userInfoMapper.queryByOpenid2(openid); if(null==userInfo){ return ResultUtil.getResult(2000,"微信登录请求失败,请重试"); } if(userInfo.getState() == 2){ return ResultUtil.error("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId()); String token = this.getToken(userInfo, ""); 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 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) 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){ 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, ""); 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; } String value = redisUtil.getValue(key); return null != value ? Integer.valueOf(value) : null; }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){//微信支付 if(ToolUtil.isEmpty(userInfo.getAppletsOpenId())){ return ResultUtil.error("未授权微信,无法完成支付"); } Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 1, money, "", 1, "");//添加预支付数据 ResultUtil resultUtil = payMoneyUtil.weixinpay("余额充值", integer.toString(), integer.toString(),money+"","/base/wxCancelUserBalance","JSAPI",userInfo.getAppletsOpenId()); if(resultUtil.getCode()==200){ PaymentRecord paymentRecord = paymentRecordService.selectById(integer); paymentRecordService.updateById(paymentRecord); return resultUtil; }else{ return ResultUtil.error("获取支付信息失败", ""); } } if(payType == 2){//支付宝支付 Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 2, money, "", 1, "");//添加预支付数据 ResultUtil resultUtil = payMoneyUtil.alipay("余额充值","余额充值", "",integer.toString(),money+"","/base/aliCancelUserBalance"); if(resultUtil.getCode()==200){ PaymentRecord paymentRecord = paymentRecordService.selectById(integer); paymentRecordService.updateById(paymentRecord); return resultUtil; }else{ return ResultUtil.error("获取支付信息失败", ""); } } return ResultUtil.success(); } /** * 修改手机号码 * @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); // smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); 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 { PaymentRecord query = paymentRecordService.selectById(paymentRecordId); UserInfo userInfo = this.selectById(query.getUserId()); if(null != query){ //添加交易明细 transactionDetailsService.saveData(Integer.valueOf(query.getUserId()), "余额充值", query.getAmount(), 2, 1, 1, 5, null); double v = new BigDecimal(userInfo.getBalance()).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); 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 + ")"); } } /** * 添加充值活动优惠券 * @param userId * @param money * @param companyId * @throws Exception */ public synchronized void addCoupon(Integer userId, Double money, Integer companyId, Integer paymentRecordId) throws Exception{ 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); } } } /** * 获取默认名称 * @return */ public String getDefaultName(){ SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); String n = UUIDUtil.getNumberCode(3) + sdf.format(new Date()); return "ZY" + n; } /** * 获取token * @param userInfo * @param password * @return */ private String getToken(UserInfo userInfo, String password) throws Exception{ //封装请求账号密码为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())); redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(userInfo.getId()), 365 * 24 * 60 * 60); redisUtil.setStrValue("USER_" + userInfo.getPhone(), s.substring(s.length() - 32)); redisUtil.setStrValue("USER_" + userInfo.getId(), s); return s; } /** * 注册时查询活动添加优惠券 * @param userInfo * @throws Exception */ private synchronized void addCoupon(UserInfo userInfo) throws Exception{ //添加优惠券 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); } /** * 单点登录 * @param id */ private void singlePointLogin(Integer id) throws Exception{ //开始验证当前账号是否在别处登录 String value = redisUtil.getValue("USER_" + id); if(ToolUtil.isNotEmpty(value)){//将另外设备上的强迫下线 //开始清除redis中无效的数据 UserInfo userInfo = userInfoMapper.selectById(id); String key = redisUtil.getValue("USER_" + userInfo.getPhone()); redisUtil.remove(key);//删除个人信息数据 redisUtil.remove("USER_" + userInfo.getPhone());//删除后台冻结相关缓存 redisUtil.remove("USER_" + id);//清除存储的token } } @Override public List> queryMyInviteList(Integer type, Integer uid, Integer pageNum, Integer size) { pageNum = (pageNum - 1) * size; if(type==1){ //乘客表uType为1表示是乘客邀请的 return userInfoMapper.queryMyInviteUserList(1,uid,pageNum,size); }else if(type==2){ //司机表uType为1表示是乘客邀请的 return driverMapper.queryMyInviteDriverList(1,uid, pageNum, size); } return null; } @Override public Integer getAppOpenInfo(Integer type) { return userInfoMapper.getAppOpenInfo(type); } }