yujian
2019-10-09 b44f60ae27bbe0b7aec29414c629747b7755e964
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
@@ -41,22 +41,23 @@
import com.yeshi.fanli.exception.user.ForbiddenUserIdentifyCodeException;
import com.yeshi.fanli.exception.user.UserAccountException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.hongbao.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.msg.UserAccountMsgNotificationService;
import com.yeshi.fanli.service.inter.user.BindingAccountService;
import com.yeshi.fanli.service.inter.money.extract.BindingAccountService;
import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
import com.yeshi.fanli.service.inter.user.SpreadUserImgService;
import com.yeshi.fanli.service.inter.user.UserAccountBindingHistoryService;
import com.yeshi.fanli.service.inter.user.UserAccountService;
import com.yeshi.fanli.service.inter.user.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.inter.user.UserInfoDeleteRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoModifyRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.msg.UserAccountMsgNotificationService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.FileUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.factory.msg.MsgAccountDetailFactory;
import com.yeshi.fanli.util.wx.WXLoginUtil;
@@ -117,7 +118,8 @@
   @Lazy
   @Resource
   private UserInfoModifyRecordService userInfoModifyRecordService;
   @Transactional
   @Override
   public LoginResult login(HttpServletRequest request, AcceptData acceptData, Boolean first, String appId,
@@ -734,7 +736,7 @@
   @Override
   public void bindPhone(Long uid, String phone) throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      if (user == null)
         throw new UserAccountException(4, "用户不存在");
@@ -755,7 +757,7 @@
   @Override
   public void unBindPhone(Long uid, String phone) throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      if (user == null)
         throw new UserAccountException(4, "用户不存在");
@@ -777,7 +779,7 @@
   @Override
   public void bindTaoBao(Long uid, String tbOpenId, String tbNickName, String tbPortrait)
         throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      if (user == null)
         throw new UserAccountException(4, "用户不存在");
@@ -807,7 +809,7 @@
   @Override
   public void unBindTaoBao(Long uid) throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      if (user == null)
         throw new UserAccountException(4, "用户不存在");
      if (StringUtil.isNullOrEmpty(user.getOpenid()))
@@ -835,7 +837,7 @@
   @Override
   public void changeWXBind(AcceptData acceptData, Long uid, String code) throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      if (user == null)
         throw new UserAccountException(4, "用户不存在");
      WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
@@ -860,7 +862,7 @@
      String defaultNickName = Constant.systemCommonConfig.getDefaultNickName();
      if (!StringUtil.isNullOrEmpty(defaultNickName) && !StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
         defaultNickName = defaultNickName + uid;
         if ((defaultNickName.equals(user.getNickName()) || "返利券".equals(user.getNickName()))) {
         if ((defaultNickName.equals(user.getNickName()) || "板栗快省".equals(user.getNickName()))) {
            updateUserInfo.setNickName(weiXinUser.getNickname());
         }
      }
@@ -886,7 +888,7 @@
            TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMddHHmmss"));
      // 备份用户信息
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      // TODO 备份资金明细
@@ -923,7 +925,7 @@
   public void clearUserPortrait(Long uid) {
      if (uid == null)
         return;
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      String prefix = String.format("/portrait/wx/%s_", user.getWxUnionId());
      ObjectListing list = COSManager.getInstance().getObjectList(prefix, null, 30);
      if (list != null && list.getObjectSummaries() != null)
@@ -938,7 +940,7 @@
   public String repairPortrait(Long uid) {
      if (uid == null)
         return null;
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      if (user == null)
         return null;
      String prefix = String.format("/portrait/wx/%s_", user.getWxUnionId());
@@ -1155,6 +1157,76 @@
      throw new UserAccountException(10, "请稍后再试");
   }
   @Transactional
   @Override
   public UserInfo loginWeiXinNew(HttpServletRequest request, AcceptData acceptData, int loginType, String wxCode, String appId) throws UserAccountException {
      // 日志信息
      JSONObject logInfo = new JSONObject();
      logInfo.put("appId", appId);
      logInfo.put("wxCode", wxCode);
      logInfo.put("loginType", loginType);
      LogHelper.lgoinInfo(logInfo.toString());
      // 通过Code换取信息
      WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
      WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(wxCode, wxAccount.getAppId(),
            wxAccount.getAppSecret());
      if (weiXinUser == null) {
         throw new UserAccountException(1, "微信帐号授权失败");
      }
      LogHelper.test("微信授权用户信息:" + new Gson().toJson(weiXinUser));
      // 判断微信unionid是否被封禁
      ForbiddenUserIdentifyCode identifyCode = forbiddenUserIdentifyCodeService
            .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.wxUnionId, weiXinUser.getUnionid());
      if (identifyCode != null && identifyCode.getEffective() != null && identifyCode.getEffective()) {
         throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
      }
      // 采用redis事务防止一个微信号多次注册问题
      String watchKey = StringUtil.Md5("REGISTER:" + weiXinUser.getUnionid());
      Jedis jedis = jedisPool.getResource();
      try {
         jedis.watch(watchKey);
         if (jedis.get(watchKey) != null && Integer.parseInt(jedis.get(watchKey)) > 1)
            throw new UserAccountException(10, "请稍后再试");
         Transaction tran = jedis.multi();
         tran.incr(watchKey);
         List<Object> exec = tran.exec();
         if (exec == null || exec.size() == 0)
            throw new UserAccountException(10, "请稍后再试");
         UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
         if (userInfo == null) {
            redisManager.cacheCommonString(watchKey, JsonUtil.getSimpleGson().toJson(weiXinUser), 60 * 20);
            throw new UserAccountException(101, watchKey);
         }
         LogHelper.test("微信unionID存在:" + weiXinUser.getUnionid());
         // 更新账户登录信息
         updateLonginInfo(userInfo, loginType, request);
         Long uid = userInfo.getId();
         ThreadUtil.run(new Runnable() {
            public void run() {
               // 删除邀请分享图
               spreadUserImgService.deleteImgUrl(uid);
            }
         });
         return userInfo;
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         jedis.del(watchKey);
         jedis.unwatch();
         jedisPool.returnResource(jedis);
      }
      throw new UserAccountException(10, "请稍后再试");
   }
   /**
    * 更新账户登录信息
    * 
@@ -1173,7 +1245,7 @@
   @Override
   public void bindPhoneNew(Long uid, String phone) throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      if (user == null) {
         throw new UserAccountException(1, "用户不存在");
      }
@@ -1214,7 +1286,7 @@
   @Override
   public void bindWeiXin(AcceptData acceptData, Long uid, String code) throws UserAccountException {
      UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
      UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
      if (user == null) {
         throw new UserAccountException(1, "用户不存在");
      }
@@ -1254,7 +1326,7 @@
      String defaultNickName = Constant.systemCommonConfig.getDefaultNickName();
      if (!StringUtil.isNullOrEmpty(defaultNickName) && !StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
         defaultNickName = defaultNickName + uid;
         if ((defaultNickName.equals(user.getNickName()) || "返利券".equals(user.getNickName()))) {
         if ((defaultNickName.equals(user.getNickName()) || "板栗快省".equals(user.getNickName()))) {
            updateUserInfo.setNickName(weiXinUser.getNickname());
         }
      }
@@ -1284,6 +1356,98 @@
      userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, wxUnionId);
   }
   @Override
   public UserInfo bindPhoneToLogin(String phone, String key, String appId, HttpServletRequest request) throws UserAccountException {
      UserInfo phoneUser = userInfoMapper.getEffectiveUserInfoByPhone(phone);
      if (phoneUser != null)
         throw new UserAccountException(1, "号码已经被占用");
      // 判断手机号码是否被封禁
      ForbiddenUserIdentifyCode identifyCode1 = forbiddenUserIdentifyCodeService
            .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, phone);
      if (identifyCode1 != null && identifyCode1.getEffective() != null && identifyCode1.getEffective())
         throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
      String value = redisManager.getCommonString(key);
      if (StringUtil.isNullOrEmpty(value))
         throw new UserAccountException(1, "微信授权失效,请使用微信重新登录");
      WeiXinUser weiXinUser = JsonUtil.getSimpleGson().fromJson(value, WeiXinUser.class);
      if (weiXinUser == null)
         throw new UserAccountException(1, "微信授权失效,请使用微信重新登录");
      String watchKey = StringUtil.Md5("REGISTER:" + weiXinUser.getUnionid());
      Jedis jedis = jedisPool.getResource();
      try {
         jedis.watch(watchKey);
         if (jedis.get(watchKey) != null && Integer.parseInt(jedis.get(watchKey)) > 1)
            throw new UserAccountException(10, "请稍后再试");
         Transaction tran = jedis.multi();
         tran.incr(watchKey);
         List<Object> exec = tran.exec();
         if (exec == null || exec.size() == 0)
            throw new UserAccountException(10, "请稍后再试");
         UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
         // 直接用的微信登录
         if (userInfo != null)
            throw new UserAccountException(10, "该微信号已被占用");
         // 创建新账户
         userInfo = new UserInfo();
         userInfo.setPortrait(weiXinUser.getHeadimgurl());
         userInfo.setAppId(appId);
         userInfo.setNickName(weiXinUser.getNickname());
         userInfo.setWxName(weiXinUser.getNickname());
         userInfo.setWxOpenId(weiXinUser.getOpenid());
         userInfo.setWxUnionId(weiXinUser.getUnionid());
         userInfo.setWxPic(weiXinUser.getHeadimgurl());
         userInfo.setLastLoginTime(System.currentTimeMillis());
         userInfo.setLoginType(2);
         userInfo.setLastLoginIp(request.getRemoteHost());
         userInfo.setState(UserInfo.STATE_NORMAL);
         addUser(userInfo);
         Long uid = userInfo.getId();
         ThreadUtil.run(new Runnable() {
            public void run() {
               try {
                  // 第一次登录时创建用户额外信息
                  userInfoExtraService.createUserInfoExtra(uid);
               } catch (Exception e) {
                  e.printStackTrace();
               }
               // 加入绑定记录
               UserAccountBindingHistory history = new UserAccountBindingHistory();
               history.setContent(phone);
               history.setType(UserAccountBindingHistory.TYPE_PHONE);
               history.setUid(uid);
               history.setFirst(true);
               userAccountBindingHistoryService.addUserAccountBindingHistory(history);
               userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, phone);
               userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin,   weiXinUser.getUnionid());
            }
         });
         // 删除缓存
         redisManager.removeCommonString(key);
         return userInfo;
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         jedis.del(watchKey);
         jedis.unwatch();
         jedisPool.returnResource(jedis);
      }
      throw new UserAccountException(10, "请稍后再试");
   }
   @Override
   public void forbiddenUserAll(Long uid, String reason) {