yujian
2019-03-07 e6cb7c27384f22b39ccee584028e23b56c30e9ee
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
@@ -4,6 +4,7 @@
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -13,6 +14,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.tencentcloud.COSManager;
import com.google.gson.Gson;
import com.qcloud.cos.model.COSObjectSummary;
@@ -22,7 +25,6 @@
import com.yeshi.fanli.dao.mybatis.BindingAccountMapper;
import com.yeshi.fanli.dao.mybatis.MoneyRecordMapper;
import com.yeshi.fanli.dao.mybatis.PidOrderMapper;
import com.yeshi.fanli.dao.mybatis.ThreeSaleMapper;
import com.yeshi.fanli.dao.mybatis.UserConnectHistoryMapper;
import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
import com.yeshi.fanli.dao.mybatis.hongbao.HongBaoMapper;
@@ -31,6 +33,8 @@
import com.yeshi.fanli.entity.bus.user.AccountDetails;
import com.yeshi.fanli.entity.bus.user.AccountMessage;
import com.yeshi.fanli.entity.bus.user.BindingAccount;
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode;
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode.ForbiddenUserIdentifyCodeTypeEnum;
import com.yeshi.fanli.entity.bus.user.HongBao;
import com.yeshi.fanli.entity.bus.user.LoginResult;
import com.yeshi.fanli.entity.bus.user.MoneyRecord;
@@ -44,16 +48,21 @@
import com.yeshi.fanli.exception.UserAccountException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.hongbao.HongBaoService;
import com.yeshi.fanli.service.inter.hongbao.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.msg.UserAccountMsgNotificationService;
import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
import com.yeshi.fanli.service.inter.user.SpreadUserImgService;
import com.yeshi.fanli.service.inter.user.UserAccountService;
import com.yeshi.fanli.service.inter.user.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.FileUtil;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.factory.AccountDetailsFactory;
import com.yeshi.fanli.util.factory.msg.MsgAccountDetailFactory;
import com.yeshi.fanli.util.wx.WXLoginUtil;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.tencentcloud.COSManager;
import net.sf.json.JSONObject;
@Service
public class UserAccountServiceImpl implements UserAccountService {
@@ -80,7 +89,7 @@
   private OrderItemMapper orderItemMapper;
   @Resource
   private ThreeSaleMapper threeSaleMapper;
   private ThreeSaleSerivce threeSaleSerivce;
   @Resource
   private PidOrderMapper pidOrderMapper;
@@ -96,10 +105,29 @@
   @Resource
   private SpreadUserImgService spreadUserImgService;
   @Resource
   private UserAccountMsgNotificationService userAccountMsgNotificationService;
   @Resource
   private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
   @Resource
   private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
   @Transactional
   @Override
   public LoginResult login(HttpServletRequest request, Boolean first, String appId, String code, String phone,
         UserInfo tbUserInfo, boolean wxinstall, int loginType) throws UserAccountException {
      JSONObject logInfo = new JSONObject();
      logInfo.put("appId", appId);
      logInfo.put("code", code);
      logInfo.put("phone", phone);
      if (tbUserInfo != null)
         logInfo.put("tbUserInfo", tbUserInfo.getId());
      logInfo.put("loginType", loginType);
      LogHelper.lgoinInfo(logInfo.toString());
      HttpSession session = request.getSession();
      if (first != null && first == true)
         session.removeAttribute("LAST_LOGIN_USER");
@@ -110,7 +138,20 @@
         WeiXinUser weiXinUser = null;
         switch (loginType) {
         case 1:// 淘宝
               // 判断淘宝是否被封禁
            if (!StringUtil.isNullOrEmpty(tbUserInfo.getTaoBaoUid())) {
               ForbiddenUserIdentifyCode identifyCode = forbiddenUserIdentifyCodeService.listByTypeAndIdentifyCode(
                     ForbiddenUserIdentifyCodeTypeEnum.taobaoUid, tbUserInfo.getTaoBaoUid());
               if (identifyCode != null && identifyCode.getEffective() != null && identifyCode.getEffective())
                  throw new UserAccountException(Constant.CODE_FORBIDDEN_USER,
                        Constant.FORBIDDEN_USER_REASON_DESC);
            }
            userInfo = getUserInfoByTaoBaoOpenId(appId, tbUserInfo.getOpenid());
            // 判断用户是否被删除
            if (userInfo != null && userInfo.getState() != null
                  && (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
                        || userInfo.getState() == UserInfo.STATE_DELETE))
               userInfo = null;
            if (userInfo == null) {// 原先的账号不存在
               userInfo = new UserInfo();
               userInfo.setAppId(appId);
@@ -142,12 +183,23 @@
            if (weiXinUser == null)
               throw new UserAccountException(1001, "无法获取到微信个人信息");
            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);
            userInfo = getUserInfoByWXUnionId(appId, weiXinUser.getUnionid());
            // 判断用户是否被删除
            if (userInfo != null && userInfo.getState() != null
                  && (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
                        || userInfo.getState() == UserInfo.STATE_DELETE))
               userInfo = null;
            // 直接用的微信登录
            if (lastUser == null) {
               if (userInfo != null) {
                  // 使分销关系生效
                  threeSaleMapper.effectThreeSale(userInfo.getId());
                  threeSaleSerivce.effective(userInfo);
                  // 更新头像与昵称
                  UserInfo updateUserInfo = new UserInfo(userInfo.getId());
                  updateUserInfo.setNickName(weiXinUser.getNickname());
@@ -206,20 +258,24 @@
                     // 绑定关系
                     UserInfo updateUserInfo = new UserInfo(userInfo.getId());
                     if (!StringUtil.isNullOrEmpty(lastUser.getPhone()))
                     if (!StringUtil.isNullOrEmpty(lastUser.getPhone())) {
                        updateUserInfo.setPhone(lastUser.getPhone());
                        userAccountMsgNotificationService.bindingSuccess(userInfo.getId(),
                              MsgAccountDetailFactory.TYPE_PHONE);
                     }
                     if (!StringUtil.isNullOrEmpty(lastUser.getOpenid())) {
                        updateUserInfo.setOpenid(lastUser.getOpenid());
                        updateUserInfo.setTbName(lastUser.getTbName());
                        updateUserInfo.setTbPic(lastUser.getTbPic());
                        userAccountMsgNotificationService.bindingSuccess(userInfo.getId(),
                              MsgAccountDetailFactory.TYPE_TB);
                     }
                     updateUserInfo.setLastLoginTime(System.currentTimeMillis());
                     userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
                     session.removeAttribute("LAST_LOGIN_USER");
                     // 使分销关系生效
                     threeSaleMapper.effectThreeSale(userInfo.getId());
                     threeSaleSerivce.effective(userInfo);
                     return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
                  } else {// 两个账号拥有不同的UID
@@ -233,7 +289,7 @@
                     result.setLessUser(lastUser);
                     // 使分销关系生效
                     threeSaleMapper.effectThreeSale(userInfo.getId());
                     threeSaleSerivce.effective(userInfo);
                     return result;
                  }
@@ -264,7 +320,19 @@
               }
            }
         case 3:// 手机号码
               // 判断手机号码是否被封禁
            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);
            userInfo = getUserInfoByPhone(appId, phone);
            // 判断用户是否被删除
            if (userInfo != null && userInfo.getState() != null
                  && (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
                        || userInfo.getState() == UserInfo.STATE_DELETE))
               userInfo = null;
            if (userInfo == null) {// 原先的账号不存在
               userInfo = new UserInfo();
               userInfo.setAppId(appId);
@@ -303,10 +371,25 @@
   @Override
   public LoginResult loginNoInstallWX(String appId, String code, String phone, UserInfo tbUserInfo, int loginType)
         throws UserAccountException {
      JSONObject logInfo = new JSONObject();
      logInfo.put("appId", appId);
      logInfo.put("code", code);
      logInfo.put("phone", phone);
      if (tbUserInfo != null)
         logInfo.put("tbUserInfo", tbUserInfo.getId());
      logInfo.put("loginType", loginType);
      LogHelper.lgoinInfo(logInfo.toString());
      UserInfo userInfo = null;
      WeiXinUser weiXinUser = null;
      switch (loginType) {
      case 1:// 淘宝
         if (!StringUtil.isNullOrEmpty(tbUserInfo.getTaoBaoUid())) {
            ForbiddenUserIdentifyCode identifyCode = forbiddenUserIdentifyCodeService.listByTypeAndIdentifyCode(
                  ForbiddenUserIdentifyCodeTypeEnum.taobaoUid, tbUserInfo.getTaoBaoUid());
            if (identifyCode != null && identifyCode.getEffective() != null && identifyCode.getEffective())
               throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
         }
         userInfo = getUserInfoByTaoBaoOpenId(appId, tbUserInfo.getOpenid());
         break;
      case 2:// 微信
@@ -314,12 +397,29 @@
         weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code);
         if (weiXinUser == null)
            throw new UserAccountException(1001, "无法获取到微信个人信息");
         // 判断是否被封禁
         ForbiddenUserIdentifyCode identifyCode = forbiddenUserIdentifyCodeService
               .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, phone);
         if (identifyCode != null && identifyCode.getEffective() != null && identifyCode.getEffective())
            throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
         userInfo = getUserInfoByWXUnionId(appId, weiXinUser.getUnionid());
         break;
      case 3:// 手机号码
            // 判断是否被封禁
         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);
         userInfo = getUserInfoByPhone(appId, phone);
         break;
      }
      // 判断用户是否被删除
      if (userInfo != null && userInfo.getState() != null && (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
            || userInfo.getState() == UserInfo.STATE_DELETE))
         userInfo = null;
      if (userInfo != null) {
         UserInfo updateUserInfo = new UserInfo(userInfo.getId());
@@ -400,9 +500,9 @@
      if (!StringUtil.isNullOrEmpty(mainUser.getPhone()) && !StringUtil.isNullOrEmpty(lessUser.getPhone()))
         throw new UserAccountException(9, "两个账号都绑定了手机号码,请解绑其中一个");
      if (lessUser.getMyHongBao().compareTo(new BigDecimal("20")) >= 0
            && mainUser.getMyHongBao().compareTo(new BigDecimal("20")) > 0)
         throw new UserAccountException(10, String.format("账户ID:%s 的资金超过20元,为保证资金安全请联系客服打通", lessUser.getId() + ""));
      if (lessUser.getMyHongBao().compareTo(new BigDecimal("10")) >= 0
            && mainUser.getMyHongBao().compareTo(new BigDecimal("10")) > 0)
         throw new UserAccountException(10, String.format("账户ID:%s 的资金超过10元,为保证资金安全请联系客服打通", lessUser.getId() + ""));
      // 判定是否绑定了同一支付宝
      List<BindingAccount> mainUserAccountList = bindingAccountMapper.selectByUid(mainUser.getId());
@@ -510,6 +610,7 @@
         moneyRecordMapper.insertSelective(moneyRecord);
      }
      userAccountMsgNotificationService.connectSuccess(mainUser.getId(), lessUser.getId());
   }
   /**
@@ -519,8 +620,25 @@
    * @param unionId
    * @return
    */
   public UserInfo getUserInfoByWXUnionId(String appId, String unionId) {
      return userInfoMapper.getUserInfoByAppIdAndWXUnionId(appId, unionId);
   public UserInfo getUserInfoByWXUnionId(String appId, String unionId) throws UserAccountException {
      if (StringUtil.isNullOrEmpty(appId))
         throw new UserAccountException(1, "appId为空");
      if (StringUtil.isNullOrEmpty(unionId))
         throw new UserAccountException(2, "unionId为空");
      List<UserInfo> list = userInfoMapper.listByAppIdAndWXUnionId(appId, unionId);
      // 剔除被删除掉的用户
      for (int i = 0; i < list.size(); i++) {
         if (list.get(i).getState() == UserInfo.STATE_DELETE
               || list.get(i).getState() == UserInfo.STATE_DELETE_OUT_OF_DATE) {
            list.remove(i);
            i--;
         }
      }
      if (list.size() > 0)
         return list.get(list.size() - 1);
      else
         return null;
   }
   /**
@@ -530,9 +648,26 @@
    * @param openId
    * @return
    */
   public UserInfo getUserInfoByTaoBaoOpenId(String appId, String openId) {
   public UserInfo getUserInfoByTaoBaoOpenId(String appId, String openId) throws UserAccountException {
      if (StringUtil.isNullOrEmpty(appId))
         throw new UserAccountException(1, "appId为空");
      if (StringUtil.isNullOrEmpty(openId))
         throw new UserAccountException(2, "openId为空");
      List<UserInfo> list = userInfoMapper.listByAppIdAndTaoBaoOpenId(appId, openId);
      return userInfoMapper.getUserInfoByAppIdAndTaoBaoOpenId(appId, openId);
      // 剔除被删除掉的用户
      for (int i = 0; i < list.size(); i++) {
         if (list.get(i).getState() == UserInfo.STATE_DELETE
               || list.get(i).getState() == UserInfo.STATE_DELETE_OUT_OF_DATE) {
            list.remove(i);
            i--;
         }
      }
      if (list.size() > 0)
         return list.get(list.size() - 1);
      else
         return null;
   }
   /**
@@ -542,9 +677,26 @@
    * @param phone
    * @return
    */
   public UserInfo getUserInfoByPhone(String appId, String phone) {
   public UserInfo getUserInfoByPhone(String appId, String phone) throws UserAccountException {
      if (StringUtil.isNullOrEmpty(appId))
         throw new UserAccountException(1, "appId为空");
      if (StringUtil.isNullOrEmpty(phone))
         throw new UserAccountException(2, "phone为空");
      List<UserInfo> list = userInfoMapper.listByAppIdAndPhone(appId, phone);
      return userInfoMapper.getUserInfoByAppIdAndPhone(appId, phone);
      // 剔除被删除掉的用户
      for (int i = 0; i < list.size(); i++) {
         if (list.get(i).getState() == UserInfo.STATE_DELETE
               || list.get(i).getState() == UserInfo.STATE_DELETE_OUT_OF_DATE) {
            list.remove(i);
            i--;
         }
      }
      if (list.size() > 0)
         return list.get(list.size() - 1);
      else
         return null;
   }
   private void updateLatestLoginTime(Long uid) {
@@ -624,6 +776,7 @@
      UserInfo update = new UserInfo(user.getId());
      update.setPhone(phone);
      userInfoMapper.updateByPrimaryKeySelective(update);
      userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
   }
   @Override
@@ -644,6 +797,7 @@
      UserInfo updateUserInfo = new UserInfo(uid);
      updateUserInfo.setPhone("");
      userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
      userAccountMsgNotificationService.unBindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
   }
   @Override
@@ -653,8 +807,12 @@
      if (user == null)
         throw new UserAccountException(4, "用户不存在");
      if (!StringUtil.isNullOrEmpty(user.getOpenid()))
      if (!StringUtil.isNullOrEmpty(user.getOpenid()) && !user.getOpenid().equalsIgnoreCase(tbOpenId))
         throw new UserAccountException(5, "当前账号已经绑定了淘宝,请先解绑");
      // 绑定同一个淘宝号
      if (!StringUtil.isNullOrEmpty(user.getOpenid()) && user.getOpenid().equalsIgnoreCase(tbOpenId))
         return;
      UserInfo taoBaoUser = getUserInfoByTaoBaoOpenId(user.getAppId(), tbOpenId);
      if (taoBaoUser != null)
@@ -669,6 +827,8 @@
         update.setPortrait(tbPortrait);
      }
      userInfoMapper.updateByPrimaryKeySelective(update);
      userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_TB);
   }
   @Override
@@ -693,6 +853,10 @@
      }
      userInfoMapper.updateByPrimaryKeySelective(update);
      userExtraTaoBaoInfoService.unBindUid(uid);
      userAccountMsgNotificationService.unBindingSuccess(uid, MsgAccountDetailFactory.TYPE_TB);
   }
   @Override
@@ -725,6 +889,8 @@
         updateUserInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
      }
      userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
      userAccountMsgNotificationService.changeBindingSuccess(uid, MsgAccountDetailFactory.TYPE_WX);
   }
   @Override
@@ -745,7 +911,7 @@
      List<OrderItem> orderItemList = orderItemMapper.selectByUid(uid);
      // 备份邀请关系
      List<ThreeSale> threeSaleList = threeSaleMapper.selectByUid(uid);
      List<ThreeSale> threeSaleList = new ArrayList<>();
      // 备份分享赚
      List<PidOrder> pidOrderList = pidOrderMapper.selectByUid(uid);