From 30d8e227e8d823b6c38c3b9c90ac2df03b63befe Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期二, 25 二月 2025 16:41:22 +0800
Subject: [PATCH] 淘宝转链接口更新

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java | 3539 ++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 1,896 insertions(+), 1,643 deletions(-)

diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
index 2f030c6..3e8adb6 100644
--- a/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
+++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
@@ -1,1643 +1,1896 @@
-package com.yeshi.fanli.service.impl.user;
-
-import java.io.InputStream;
-import java.util.List;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import com.yeshi.fanli.entity.SystemEnum;
-import com.yeshi.fanli.util.*;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.yeshi.utils.HttpUtil;
-import org.yeshi.utils.JsonUtil;
-import org.yeshi.utils.SystemUtil;
-import org.yeshi.utils.entity.FileUploadResult;
-import org.yeshi.utils.entity.ProxyIP;
-import org.yeshi.utils.tencentcloud.COSManager;
-
-import com.google.gson.Gson;
-import com.qcloud.cos.model.COSObjectSummary;
-import com.qcloud.cos.model.ObjectListing;
-import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
-import com.yeshi.fanli.dto.wx.WXAccountInfoDTO;
-import com.yeshi.fanli.entity.accept.AcceptData;
-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.LoginResult;
-import com.yeshi.fanli.entity.bus.user.SMSHistory;
-import com.yeshi.fanli.entity.bus.user.UserAccountBindingHistory;
-import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
-import com.yeshi.fanli.entity.bus.user.UserInfo;
-import com.yeshi.fanli.entity.bus.user.UserInfoModifyRecord.ModifyTypeEnum;
-import com.yeshi.fanli.entity.bus.user.WeiXinUser;
-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.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.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.factory.msg.MsgAccountDetailFactory;
-import com.yeshi.fanli.util.wx.WXLoginUtil;
-
-import net.sf.json.JSONObject;
-import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisPool;
-import redis.clients.jedis.Transaction;
-
-@Service
-public class UserAccountServiceImpl implements UserAccountService {
-
-    @Resource
-    private RedisManager redisManager;
-
-//    @Resource
-//    private UserInfoMapper userInfoMapper;
-
-    @Resource
-    private UserInfoService userInfoService;
-
-    @Resource
-    private BindingAccountService bindingAccountService;
-
-    @Resource
-    private ThreeSaleSerivce threeSaleSerivce;
-
-    @Resource
-    private SpreadUserImgService spreadUserImgService;
-
-    @Resource
-    private UserAccountMsgNotificationService userAccountMsgNotificationService;
-
-    @Resource
-    private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
-
-    @Resource
-    private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
-
-    @Resource
-    private UserInfoExtraService userInfoExtraService;
-
-    @Resource
-    private UserAccountBindingHistoryService userAccountBindingHistoryService;
-
-    @Resource
-    private UserInfoDeleteRecordService userInfoDeleteRecordService;
-
-    @Resource
-    private JedisPool jedisPool;
-
-    @Lazy
-    @Resource
-    private UserInfoModifyRecordService userInfoModifyRecordService;
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public LoginResult login(HttpServletRequest request, AcceptData acceptData, 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");
-        // 浼氳瘽涓笂娆$櫥褰曠殑鐢ㄦ埛
-        if (wxinstall) {// 瀹夎浜嗗井淇$殑鐘舵��
-            UserInfo lastUser = (UserInfo) session.getAttribute("LAST_LOGIN_USER");
-            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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), tbUserInfo.getOpenid());
-                    // 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-                    if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
-                        userInfo = null;
-                    if (userInfo == null) {// 鍘熷厛鐨勮处鍙蜂笉瀛樺湪
-                        userInfo = new UserInfo();
-                        userInfo.setAppId(appId);
-                        userInfo.setTbName(tbUserInfo.getTbName());
-                        userInfo.setOpenid(tbUserInfo.getOpenid());
-                        userInfo.setTbPic(tbUserInfo.getTbPic());
-                        userInfo.setNickName(tbUserInfo.getNickName());
-                        userInfo.setPortrait(tbUserInfo.getPortrait());
-                        userInfo.setLoginType(loginType);
-                        userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
-                        session.setAttribute("LAST_LOGIN_USER", userInfo);
-                        // 闇�瑕佸井淇$櫥褰�
-                        return new LoginResult(LoginResult.TYPE_WX, userInfo);
-                    } else {// 鍘熷厛鐨勮处鍙峰瓨鍦�
-                        // 鍒ゅ畾鏄惁缁戝畾浜嗗井淇�
-                        if (StringUtil.isNullOrEmpty(userInfo.getWxUnionId())) {// 娌℃湁缁戝畾寰俊
-                            userInfo.setLoginType(loginType);
-                            session.setAttribute("LAST_LOGIN_USER", userInfo);
-                            // 闇�瑕佸井淇$櫥褰�
-                            return new LoginResult(LoginResult.TYPE_WX, userInfo);
-                        } else {// 缁戝畾浜嗗井淇�
-                            updateLatestLoginTime(userInfo.getId());
-                            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
-                        }
-                    }
-
-                case 2:// 寰俊
-                    // 閫氳繃Code鎹㈠彇淇℃伅
-                    WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
-                    weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
-                            wxAccount.getAppSecret());
-                    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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), weiXinUser.getUnionid());
-                    // 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-                    if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
-                        userInfo = null;
-                    // 鐩存帴鐢ㄧ殑寰俊鐧诲綍
-                    if (lastUser == null) {
-                        if (userInfo != null) {
-                            // 浣垮垎閿�鍏崇郴鐢熸晥
-                            threeSaleSerivce.effective(userInfo);
-                            // 鏇存柊澶村儚涓庢樀绉�
-                            UserInfo updateUserInfo = new UserInfo(userInfo.getId());
-                            updateUserInfo.setNickName(weiXinUser.getNickname());
-                            if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl()))
-                                updateUserInfo.setPortrait(weiXinUser.getHeadimgurl());
-                            updateUserInfo.setWxPic(weiXinUser.getHeadimgurl());
-                            updateUserInfo.setWxName(weiXinUser.getNickname());
-                            // 璁剧疆鐧诲綍鏃堕棿涓庣櫥褰曠被鍨�
-                            updateUserInfo.setLastLoginTime(System.currentTimeMillis());
-                            updateUserInfo.setLoginType(loginType);
-                            updateUserInfo.setLastLoginIp(request.getRemoteHost());
-                            // 鏇存柊openId
-                            updateUserInfo.setOpenid(weiXinUser.getOpenid());
-                            userInfoService.updateByPrimaryKeySelective(updateUserInfo);
-                            // 鍒犻櫎閭�璇峰浘鐗�
-                            spreadUserImgService.deleteImgUrl(userInfo.getId());
-                            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
-                        }
-                        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(loginType);
-                        userInfo.setLastLoginIp(request.getRemoteHost());
-                        userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
-                        addUser(userInfo);
-
-                        return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
-                    } else {
-                        // 鏈細璇濋噰鐢ㄨ繃鍏朵粬璐﹀彿鐧诲綍
-                        if (userInfo != null)// 寰俊璐﹀彿瀛樺湪
-                        {
-                            if (lastUser.getLoginType() == 2) {
-                                session.removeAttribute("LAST_LOGIN_USER");
-                                throw new UserAccountException(1002, "寰俊涓嶈兘缁戝畾寰俊");
-                            }
-                            if (lastUser.getLoginType() == 1 && !StringUtil.isNullOrEmpty(userInfo.getOpenid())) {
-                                session.removeAttribute("LAST_LOGIN_USER");
-                                throw new UserAccountException(1003, "璇ュ井淇″凡缁忕粦瀹氫簡娣樺疂璐﹀彿锛岃鍏堣В缁�");
-                            }
-                            if (lastUser.getLoginType() == 3 && !StringUtil.isNullOrEmpty(userInfo.getPhone())) {
-                                session.removeAttribute("LAST_LOGIN_USER");
-                                throw new UserAccountException(1003, "璇ュ井淇″凡缁忕粦瀹氫簡鐢佃瘽鍙风爜锛岃鍏堣В缁�");
-                            }
-
-                            // 鍒犻櫎閭�璇峰浘鐗�
-                            spreadUserImgService.deleteImgUrl(userInfo.getId());
-                            // 杩樻病鏈夌粦瀹氬悓绫诲瀷鐨勮处鍙�
-
-                            // 涓や釜璐﹀彿娌℃湁鍚屾椂鏈夌嫭绔嬬殑UID
-                            if (lastUser.getId() == null || lastUser.getId() == 0
-                                    || lastUser.getId() == userInfo.getId().longValue()) {
-                                // 缁戝畾鍏崇郴
-                                UserInfo updateUserInfo = new UserInfo(userInfo.getId());
-
-                                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());
-                                userInfoService.updateByPrimaryKeySelective(updateUserInfo);
-                                session.removeAttribute("LAST_LOGIN_USER");
-
-                                // 浣垮垎閿�鍏崇郴鐢熸晥
-                                threeSaleSerivce.effective(userInfo);
-
-                                return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
-                            } else {// 涓や釜璐﹀彿鎷ユ湁涓嶅悓鐨刄ID
-                                // 璇㈤棶鏄惁鎵撻��
-                                // 鏆傚瓨寰俊璐﹀彿
-                                // session.setAttribute("WEIXIN_USERINFO",
-                                // userInfo);
-                                session.removeAttribute("LAST_LOGIN_USER");
-                                LoginResult result = new LoginResult(LoginResult.TYPE_CONNECT, lastUser);
-                                result.setMainUser(userInfo);
-                                result.setLessUser(lastUser);
-
-                                // 浣垮垎閿�鍏崇郴鐢熸晥
-                                threeSaleSerivce.effective(userInfo);
-                                return result;
-                            }
-
-                        } else {// 寰俊璐﹀彿涓嶅瓨鍦�
-                            // 鍒涘缓璐﹀彿,缁戝畾璐﹀彿
-                            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());
-                            if (!StringUtil.isNullOrEmpty(lastUser.getPhone()))
-                                userInfo.setPhone(lastUser.getPhone());
-
-                            if (!StringUtil.isNullOrEmpty(lastUser.getOpenid())) {
-                                userInfo.setOpenid(lastUser.getOpenid());
-                                userInfo.setTbName(lastUser.getTbName());
-                                userInfo.setTbPic(lastUser.getTbPic());
-                            }
-                            userInfo.setLastLoginTime(System.currentTimeMillis());
-                            userInfo.setLoginType(loginType);
-                            userInfo.setLastLoginIp(request.getRemoteHost());
-                            userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
-                            addUser(userInfo);
-                            session.removeAttribute("LAST_LOGIN_USER");
-                            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
-                        }
-                    }
-                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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), phone);
-                    // 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-                    if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
-                        userInfo = null;
-
-                    if (userInfo == null) {// 鍘熷厛鐨勮处鍙蜂笉瀛樺湪
-                        userInfo = new UserInfo();
-                        userInfo.setAppId(appId);
-                        userInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
-                        userInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
-                        userInfo.setPhone(phone);
-                        userInfo.setLoginType(loginType);
-                        userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
-                        session.setAttribute("LAST_LOGIN_USER", userInfo);
-                        // 璇㈤棶鏄惁缁戝畾寰俊
-                        return new LoginResult(LoginResult.TYPE_WX, userInfo);
-                    } else {// 鍘熷厛鐨勮处鍙峰瓨鍦�
-                        // 鍒ゅ畾鏄惁缁戝畾浜嗗井淇�
-                        if (StringUtil.isNullOrEmpty(userInfo.getWxUnionId())) {// 娌℃湁缁戝畾寰俊
-                            userInfo.setLoginType(loginType);
-                            session.setAttribute("LAST_LOGIN_USER", userInfo);
-                            // 闇�瑕佸井淇$櫥褰�
-                            return new LoginResult(LoginResult.TYPE_WX, userInfo);
-                        } else {// 缁戝畾浜嗗井淇�
-                            updateLatestLoginTime(userInfo.getId());
-                            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
-                        }
-                    }
-                default:
-                    return null;
-            }
-
-        } else {// 娌℃湁瀹夎寰俊
-            LoginResult result = loginNoInstallWX(acceptData, appId, code, phone, tbUserInfo, loginType);
-            if (result.getType() == LoginResult.TYPE_CREATE)
-                session.setAttribute("LAST_LOGIN_USER", result.getUser());
-            return result;
-        }
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public LoginResult loginNoInstallWX(AcceptData acceptData, 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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), tbUserInfo.getOpenid());
-                break;
-            case 2:// 寰俊
-                // 閫氳繃Code鎹㈠彇淇℃伅
-                WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
-                weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
-                        wxAccount.getAppSecret());
-                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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), 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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), phone);
-                break;
-        }
-
-        // 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-        if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
-            userInfo = null;
-
-        if (userInfo != null) {
-            UserInfo updateUserInfo = new UserInfo(userInfo.getId());
-            updateUserInfo.setLastLoginTime(System.currentTimeMillis());
-            userInfoService.updateByPrimaryKeySelective(updateUserInfo);
-            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
-        } else {// 璇㈤棶鏄惁鍒涘缓鐢ㄦ埛
-            userInfo = new UserInfo();
-            userInfo.setAppId(appId);
-            switch (loginType) {
-                case 1:// 娣樺疂
-                    userInfo.setTbName(tbUserInfo.getNickName());
-                    userInfo.setTbPic(tbUserInfo.getPortrait());
-                    userInfo.setNickName(tbUserInfo.getNickName());
-                    userInfo.setPortrait(tbUserInfo.getPortrait());
-                    break;
-                case 2:// 寰俊
-                    userInfo.setPortrait(weiXinUser.getHeadimgurl());
-                    userInfo.setNickName(weiXinUser.getNickname());
-                    userInfo.setWxName(weiXinUser.getNickname());
-                    userInfo.setWxOpenId(weiXinUser.getOpenid());
-                    userInfo.setWxUnionId(weiXinUser.getUnionid());
-                    userInfo.setWxPic(weiXinUser.getHeadimgurl());
-                    break;
-                case 3:// 鎵嬫満鍙风爜
-                    // 榛樿澶村儚涓庢樀绉�
-                    userInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
-                    userInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
-                    userInfo.setPhone(phone);
-                    break;
-            }
-            userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
-            return new LoginResult(LoginResult.TYPE_CREATE, userInfo);
-        }
-    }
-
-
-    /**
-     * 鏍规嵁绯荤粺涓巙nionid瀵绘壘鐢ㄦ埛
-     * @param system
-     * @param unionId
-     * @return
-     * @throws UserAccountException
-     */
-    @Override
-    public UserInfo getUserInfoByWXUnionId(SystemEnum system, String unionId) throws UserAccountException {
-        if (system == null)
-            throw new UserAccountException(1, "绯荤粺");
-        if (StringUtil.isNullOrEmpty(unionId))
-            throw new UserAccountException(2, "unionId涓虹┖");
-
-        List<UserInfo> list = userInfoService.listBySystemAndWXUnionId(system, unionId);
-        // 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
-        for (int i = 0; i < list.size(); i++) {
-            if (list.get(i).getState() == UserInfo.STATE_NORMAL) {
-                list.remove(i);
-                i--;
-            }
-        }
-        if (list.size() > 0)
-            return list.get(list.size() - 1);
-        else
-            return null;
-    }
-
-
-    /**
-     *鏍规嵁绯荤粺鍜屾窐瀹濈殑Openid瀵绘壘鐢ㄦ埛
-     * @param system
-     * @param openId
-     * @return
-     * @throws UserAccountException
-     */
-    public UserInfo getUserInfoByTaoBaoOpenId(SystemEnum system, String openId) throws UserAccountException {
-        if (system == null)
-            throw new UserAccountException(1, "绯荤粺涓虹┖");
-        if (StringUtil.isNullOrEmpty(openId))
-            throw new UserAccountException(2, "openId涓虹┖");
-        List<UserInfo> list = userInfoService.listBySystemAndTaoBaoOpenId(system, openId);
-
-        // 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
-        for (int i = 0; i < list.size(); i++) {
-            if (list.get(i).getState() != UserInfo.STATE_NORMAL) {
-                list.remove(i);
-                i--;
-            }
-        }
-        if (list.size() > 0)
-            return list.get(list.size() - 1);
-        else
-            return null;
-
-    }
-
-    /**
-     * 鏍规嵁绯荤粺鍜岀數璇濆彿鐮佸鎵剧敤鎴�
-     * @param system
-     * @param phone
-     * @return
-     * @throws UserAccountException
-     */
-    public UserInfo getUserInfoByPhone(SystemEnum system, String phone) throws UserAccountException {
-        if (system == null)
-            throw new UserAccountException(1, "绯荤粺涓虹┖");
-        if (StringUtil.isNullOrEmpty(phone))
-            throw new UserAccountException(2, "phone涓虹┖");
-        List<UserInfo> list = userInfoService.listBySystemAndPhone(system, phone);
-
-        // 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
-        for (int i = 0; i < list.size(); i++) {
-            if (list.get(i).getState() != UserInfo.STATE_NORMAL) {
-                list.remove(i);
-                i--;
-            }
-        }
-        if (list.size() > 0)
-            return list.get(list.size() - 1);
-        else
-            return null;
-
-    }
-
-    private void updateLatestLoginTime(Long uid) {
-        UserInfo userInfo = new UserInfo(uid);
-        userInfo.setLastLoginTime(System.currentTimeMillis());
-        userInfoService.updateByPrimaryKeySelective(userInfo);
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public void register(UserInfo userInfo) throws UserAccountException {
-        if (!StringUtil.isNullOrEmpty(userInfo.getPhone())) {
-            UserInfo user = getUserInfoByPhone(userInfo.getSystem(), userInfo.getPhone());
-            if (user != null)
-                throw new UserAccountException(50001, "鐢佃瘽鍙风爜宸茬粡琚粦瀹�");
-        }
-
-        if (!StringUtil.isNullOrEmpty(userInfo.getOpenid())) {
-            UserInfo user = getUserInfoByTaoBaoOpenId(userInfo.getSystem(), userInfo.getOpenid());
-            if (user != null)
-                throw new UserAccountException(50002, "娣樺疂鍙峰凡缁忚缁戝畾");
-        }
-
-        if (!StringUtil.isNullOrEmpty(userInfo.getWxUnionId())) {
-            UserInfo user = getUserInfoByWXUnionId(userInfo.getSystem(), userInfo.getWxUnionId());
-            if (user != null)
-                throw new UserAccountException(50003, "寰俊鍙峰凡缁忚娉ㄥ唽");
-        }
-
-        addUser(userInfo);
-    }
-
-    @Transactional
-    @Override
-    public void addUser(UserInfo user) {
-        user.setCreatetime(System.currentTimeMillis());
-        user.setRank(0);
-        if (StringUtil.isNullOrEmpty(user.getPortrait()))
-            user.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
-        userInfoService.createUser(user,user.getSystem());
-        // 鏄电О涓虹┖鏃� 榛樿鏄电О
-        if (StringUtil.isNullOrEmpty(user.getNickName())) {
-            UserInfo updateUserInfo = new UserInfo(user.getId());
-            updateUserInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName() + user.getId());
-            userInfoService.updateByPrimaryKeySelective(updateUserInfo);
-        }
-
-        try {
-            // 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
-            userInfoExtraService.createUserInfoExtra(user.getId());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        // 娣诲姞璐﹀彿缁戝畾鍘嗗彶
-        if (!StringUtil.isNullOrEmpty(user.getPhone()))
-            userInfoModifyRecordService.addModifyRecord(user.getId(), ModifyTypeEnum.bindPhone, user.getPhone());
-
-        if (!StringUtil.isNullOrEmpty(user.getWxUnionId()))
-            userInfoModifyRecordService.addModifyRecord(user.getId(), ModifyTypeEnum.bindWeiXin, user.getWxUnionId());
-    }
-
-    @Override
-    public void updateUserSelective(UserInfo user) {
-        userInfoService.updateByPrimaryKeySelective(user);
-    }
-
-    @Override
-    public void bindPhone(Long uid, String phone) throws UserAccountException {
-        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
-        if (user == null)
-            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
-
-        if (!StringUtil.isNullOrEmpty(user.getPhone()))
-            throw new UserAccountException(5, "褰撳墠璐﹀彿宸茬粡缁戝畾浜嗘墜鏈哄彿锛岃鍏堣В缁�");
-
-        UserInfo phoneUser = getUserInfoByPhone(user.getSystem(), phone);
-        if (phoneUser != null)
-            throw new UserAccountException(6, "褰撳墠鐢佃瘽鍙风爜宸茬粡琚粦瀹�");
-
-        UserInfo update = new UserInfo(user.getId());
-        update.setPhone(phone);
-        userInfoService.updateByPrimaryKeySelective(update);
-        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
-
-        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, phone);
-    }
-
-    @Override
-    public void unBindPhone(Long uid, String phone) throws UserAccountException {
-        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
-        if (user == null)
-            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
-
-        if (StringUtil.isNullOrEmpty(user.getPhone()))
-            throw new UserAccountException(4, "灏氭湭缁戝畾鐢佃瘽鍙风爜");
-
-        if (!user.getPhone().equalsIgnoreCase(phone))
-            throw new UserAccountException(4, "鍘熺粦瀹氭墜鏈哄彿杈撳叆閿欒");
-
-        if (StringUtil.isNullOrEmpty(user.getWxUnionId()) && StringUtil.isNullOrEmpty(user.getOpenid()))
-            throw new UserAccountException(5, "涓嶈兘瑙i櫎缁戝畾");
-
-        UserInfo updateUserInfo = new UserInfo(uid);
-        updateUserInfo.setPhone("");
-        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
-        userAccountMsgNotificationService.unBindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
-    }
-
-    @Override
-    public void bindTaoBao(Long uid, String tbOpenId, String tbNickName, String tbPortrait)
-            throws UserAccountException {
-        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
-        if (user == null)
-            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
-
-        if (!StringUtil.isNullOrEmpty(user.getOpenid()) && !user.getOpenid().equalsIgnoreCase(tbOpenId))
-            throw new UserAccountException(5, "褰撳墠璐﹀彿宸茬粡缁戝畾浜嗘窐瀹濓紝璇峰厛瑙g粦");
-
-        // 缁戝畾鍚屼竴涓窐瀹濆彿
-        if (!StringUtil.isNullOrEmpty(user.getOpenid()) && user.getOpenid().equalsIgnoreCase(tbOpenId))
-            return;
-
-        UserInfo taoBaoUser = getUserInfoByTaoBaoOpenId(user.getSystem(), tbOpenId);
-        if (taoBaoUser != null)
-            throw new UserAccountException(6, "褰撳墠娣樺疂鍙峰凡缁忚缁戝畾");
-        UserInfo update = new UserInfo(user.getId());
-        update.setOpenid(tbOpenId);
-        update.setTbName(tbNickName);
-        update.setTbPic(tbPortrait);
-        // 濡傛灉娌℃湁缁戝畾寰俊灏变互娣樺疂鐨勫ご鍍忓拰鏄电О浣滀负鐢ㄦ埛鐨勫ご鍍忎笌鏄电О
-        if (StringUtil.isNullOrEmpty(user.getWxUnionId())) {
-            update.setNickName(tbNickName);
-            update.setPortrait(tbPortrait);
-        }
-        userInfoService.updateByPrimaryKeySelective(update);
-
-        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_TB);
-    }
-
-    @Override
-    public void unBindTaoBao(Long uid) throws UserAccountException {
-        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
-        if (user == null)
-            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
-        if (StringUtil.isNullOrEmpty(user.getOpenid()))
-            throw new UserAccountException(5, "褰撳墠璐﹀彿灏氭湭缁戝畾娣樺疂");
-
-        if (StringUtil.isNullOrEmpty(user.getWxUnionId()) && StringUtil.isNullOrEmpty(user.getPhone()))
-            throw new UserAccountException(5, "涓嶈兘鎺ヨЕ缁戝畾");
-
-        UserInfo update = new UserInfo(user.getId());
-        update.setOpenid("");
-        update.setTbName("");
-        update.setTbPic("");
-        // 鍒ゆ柇鏄惁鏈夊井淇$粦瀹�
-        if (StringUtil.isNullOrEmpty(user.getWxUnionId())) {
-            update.setNickName(Constant.systemCommonConfig.getDefaultNickName() + user.getId());
-            update.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
-        }
-
-        userInfoService.updateByPrimaryKeySelective(update);
-
-        userExtraTaoBaoInfoService.unBindUid(uid);
-
-        userAccountMsgNotificationService.unBindingSuccess(uid, MsgAccountDetailFactory.TYPE_TB);
-    }
-
-    @Override
-    public void changeWXBind(AcceptData acceptData, Long uid, String code) throws UserAccountException {
-        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
-        if (user == null)
-            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
-        WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
-        WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
-                wxAccount.getAppSecret());
-        if (weiXinUser == null)
-            throw new UserAccountException(10, "鑾峰彇寰俊鐢ㄦ埛淇℃伅澶辫触");
-        if (weiXinUser.getUnionid().equalsIgnoreCase(user.getWxUnionId()))
-            throw new UserAccountException(12, "浜诧紝璇风櫥褰曞叾瀹冨井淇″彿杩涜鏇存崲缁戝畾");
-
-        UserInfo newUser = getUserInfoByWXUnionId(user.getSystem(), weiXinUser.getUnionid());
-        if (newUser != null)
-            throw new UserAccountException(13, "璇ュ井淇″彿宸茶鍏朵粬璐﹀彿缁戝畾");
-
-        UserInfo updateUserInfo = new UserInfo(uid);
-        updateUserInfo.setWxName(weiXinUser.getNickname());
-        updateUserInfo.setWxOpenId(weiXinUser.getOpenid());
-        updateUserInfo.setWxPic(weiXinUser.getHeadimgurl());
-        updateUserInfo.setWxUnionId(weiXinUser.getUnionid());
-
-        // 灏嗛粯璁ゆ樀绉版浛鎹㈡垚寰俊鏄电О
-        String defaultNickName = Constant.systemCommonConfig.getDefaultNickName();
-        if (!StringUtil.isNullOrEmpty(defaultNickName) && !StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
-            defaultNickName = defaultNickName + uid;
-            if ((defaultNickName.equals(user.getNickName()) || "鏉挎牀蹇渷".equals(user.getNickName()))) {
-                updateUserInfo.setNickName(weiXinUser.getNickname());
-            }
-        }
-
-        // 灏嗛粯璁ゅご鍍忔浛鎹㈡垚寰俊澶村儚
-        String defaultPortrait = Constant.systemCommonConfig.getDefaultPortrait();
-        if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl()) && !StringUtil.isNullOrEmpty(defaultPortrait)
-                && defaultPortrait.equals(user.getPortrait())) {
-            updateUserInfo.setPortrait(weiXinUser.getHeadimgurl());
-        }
-
-        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
-
-        userAccountMsgNotificationService.changeBindingSuccess(uid, MsgAccountDetailFactory.TYPE_WX);
-
-        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, weiXinUser.getUnionid());
-    }
-
-    @Override
-    public void clearUserPortrait(Long uid) {
-        if (uid == null)
-            return;
-        UserInfo user = userInfoService.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)
-            for (COSObjectSummary object : list.getObjectSummaries()) {
-                if (user.getWxPic() != null && !user.getWxPic().contains(object.getKey())) {
-                    COSManager.getInstance().deleteFile(object.getKey());
-                }
-            }
-    }
-
-    @Override
-    public String repairPortrait(Long uid) {
-        if (uid == null)
-            return null;
-        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
-        if (user == null)
-            return null;
-        String prefix = String.format("/portrait/wx/%s_", user.getWxUnionId());
-        ObjectListing list = COSManager.getInstance().getObjectList(prefix, null, 30);
-        // 鏌ヨ澶村儚鏂囦欢鏄惁杩樺瓨鍦�
-        boolean exist = false;
-        if (list != null && list.getObjectSummaries() != null)
-            for (COSObjectSummary object : list.getObjectSummaries()) {
-                if (user.getPortrait().contains(object.getKey())) {
-                    exist = true;
-                    break;
-                }
-            }
-
-        if (!exist && list.getObjectSummaries() != null && list.getObjectSummaries().size() > 0) {
-            COSObjectSummary object = list.getObjectSummaries().get(list.getObjectSummaries().size() - 1);
-            String portrait = String.format("https://%s.file.myqcloud.com/%s", object.getBucketName(), object.getKey());
-            if (!StringUtil.isNullOrEmpty(portrait)) {
-                UserInfo updateUser = new UserInfo(uid);
-                updateUser.setPortrait(portrait);
-                userInfoService.updateByPrimaryKeySelective(updateUser);
-                return portrait;
-            }
-        }
-
-        return user.getPortrait();
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public UserInfo loginPhone(ProxyIP ipInfo, AcceptData acceptData, int loginType, String vcode, String phone, String appId)
-            throws UserAccountException {
-
-        // 绌洪娓呯悊
-        if (phone == null || phone.trim().length() == 0) {
-            throw new UserAccountException(1, "璇疯緭鍏ユ墜鏈哄彿鐮�");
-        }
-        phone = phone.replaceAll(" ", "");
-
-        // 鑻规灉搴旂敤鍟嗗簵涓婄嚎娴嬭瘯鍙风爜
-        if ("17316780233".equalsIgnoreCase(phone) && "2581".equalsIgnoreCase(vcode)) {
-            ;
-        } else {
-
-            if (StringUtil.isNullOrEmpty(vcode)) {
-                throw new UserAccountException(1, "璇疯緭鍏ラ獙璇佺爜");
-            }
-
-            String oldVcode = redisManager.getSMSVCode(phone, SMSHistory.TYPE_LOGIN);
-            LogHelper.test("----------------------鐧诲綍楠岃瘉鐮侊細 " + oldVcode);
-            if (!Constant.IS_TEST)
-                if (StringUtil.isNullOrEmpty(oldVcode) || !oldVcode.equalsIgnoreCase(vcode)) {
-                    throw new UserAccountException(1, "楠岃瘉鐮侀敊璇紝閲嶆柊杈撳叆");
-                } else {// 楠岃瘉鐮佽緭鍏ユ纭�
-                    redisManager.clearSMSVCode(phone, SMSHistory.TYPE_LOGIN);
-                }
-        }
-
-        JSONObject logInfo = new JSONObject();
-        logInfo.put("appId", appId);
-        logInfo.put("phone", phone);
-        logInfo.put("loginType", loginType);
-        LogHelper.lgoinInfo(logInfo.toString());
-
-        // 鍒ゆ柇鎵嬫満鍙风爜鏄惁琚皝绂�
-        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);
-        }
-
-        // 娓呯┖闄愬埗
-        redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN);
-        // 娓呯悊娆℃暟
-        String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSLoginCount, phone);
-        redisManager.removeCommonString(key);
-
-        // 閲囩敤redis浜嬪姟闃叉涓�涓墜鏈哄彿澶氭娉ㄥ唽闂
-        String watchKey = StringUtil.Md5("REGISTER:" + phone);
-        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, "璇风◢鍚庡啀璇�");
-            } else {
-
-                // 鏌ヨ鏄惁瀛樺湪璇ョ數璇濆巻鍙茬敤鎴�
-                UserInfo userInfo = userInfoService.getEffectiveUserInfoByPhone(phone, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
-                if (userInfo != null) {
-                    // 鏇存柊璐︽埛鐧诲綍淇℃伅
-                    updateLonginInfo(userInfo, loginType, ipInfo);
-                } else {
-                    userInfo = new UserInfo();
-                    userInfo.setAppId(appId);
-                    // userInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
-                    userInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
-                    userInfo.setPhone(phone);
-                    userInfo.setLoginType(loginType);
-                    userInfo.setState(UserInfo.STATE_NORMAL);
-                    userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
-                    // 鍒涘缓鐢ㄦ埛
-                    addUser(userInfo);
-
-                    try {
-                        // 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
-                        userInfoExtraService.createUserInfoExtra(userInfo.getId());
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                    userInfoModifyRecordService.addModifyRecord(userInfo.getId(), ModifyTypeEnum.bindPhone, phone);
-                }
-                return userInfo;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            jedis.del(watchKey);
-            jedis.unwatch();
-            jedis.close();
-        }
-        throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
-    }
-
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public UserInfo loginPhoneNew(ProxyIP ipInfo, AcceptData acceptData, int loginType, String vcode, String phone, String appId)
-            throws UserAccountException {
-        // 绌洪娓呯悊
-        if (phone == null || phone.trim().length() == 0) {
-            throw new UserAccountException(1, "璇疯緭鍏ユ墜鏈哄彿鐮�");
-        }
-        phone = phone.replaceAll(" ", "");
-
-        // 鑻规灉搴旂敤鍟嗗簵涓婄嚎娴嬭瘯鍙风爜
-        if ("17316780233".equalsIgnoreCase(phone) && "2581".equalsIgnoreCase(vcode)) {
-            ;
-        } else {
-            if (StringUtil.isNullOrEmpty(vcode)) {
-                throw new UserAccountException(1, "璇疯緭鍏ラ獙璇佺爜");
-            }
-
-            String oldVcode = redisManager.getSMSVCode(phone, SMSHistory.TYPE_LOGIN);
-            LogHelper.test("----------------------鐧诲綍楠岃瘉鐮侊細 " + oldVcode);
-            if (!Constant.IS_TEST)
-                if (StringUtil.isNullOrEmpty(oldVcode) || !oldVcode.equalsIgnoreCase(vcode)) {
-                    throw new UserAccountException(1, "楠岃瘉鐮侀敊璇紝閲嶆柊杈撳叆");
-                } else {// 楠岃瘉鐮佽緭鍏ユ纭�
-                    redisManager.clearSMSVCode(phone, SMSHistory.TYPE_LOGIN);
-                }
-        }
-
-        JSONObject logInfo = new JSONObject();
-        logInfo.put("appId", appId);
-        logInfo.put("phone", phone);
-        logInfo.put("loginType", loginType);
-        LogHelper.lgoinInfo(logInfo.toString());
-
-        // 鍒ゆ柇鎵嬫満鍙风爜鏄惁琚皝绂�
-        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);
-        }
-        // 娓呯┖闄愬埗
-        redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN);
-        // 娓呯悊娆℃暟
-        String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSLoginCount, phone);
-        redisManager.removeCommonString(key);
-
-        // 閲囩敤redis浜嬪姟闃叉涓�涓墜鏈哄彿澶氭娉ㄥ唽闂
-        String watchKey = StringUtil.Md5("REGISTER:" + phone);
-        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, "璇风◢鍚庡啀璇�");
-            } else {
-                // 鏌ヨ鏄惁瀛樺湪璇ョ數璇濆巻鍙茬敤鎴�
-                UserInfo userInfo = userInfoService.getEffectiveUserInfoByPhone(phone, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
-                if (userInfo != null) {
-                    // 鏇存柊璐︽埛鐧诲綍淇℃伅
-                    updateLonginInfo(userInfo, loginType, ipInfo);
-                } else {
-                    // 缁戝畾寰俊
-                    String keylogin = RedisKeyEnum.getRedisKey(RedisKeyEnum.emptyKey, StringUtil.Md5("phoneLogin:" + phone));
-                    redisManager.cacheCommonString(keylogin, phone, 60 * 20);
-                    throw new UserAccountException(102, keylogin);
-                }
-                return userInfo;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            jedis.del(watchKey);
-            jedis.unwatch();
-            jedis.close();
-        }
-        throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
-    }
-
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public UserInfo loginWinXin(ProxyIP ipInfo, AcceptData acceptData, int loginType, String code,
-                                String appId) throws UserAccountException {
-        // 鏃ュ織淇℃伅
-        JSONObject logInfo = new JSONObject();
-        logInfo.put("appId", appId);
-        logInfo.put("code", code);
-        logInfo.put("loginType", loginType);
-        LogHelper.lgoinInfo(logInfo.toString());
-
-        // 閫氳繃Code鎹㈠彇淇℃伅
-        WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
-        WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUser(code, 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, "璇风◢鍚庡啀璇�");
-            } else {
-                UserInfo userInfo = userInfoService.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid(), SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
-                // 鐩存帴鐢ㄧ殑寰俊鐧诲綍
-                if (userInfo != null) {
-                    LogHelper.test("寰俊unionID瀛樺湪:" + weiXinUser.getUnionid());
-                    // 鏇存柊璐︽埛鐧诲綍淇℃伅
-                    updateLonginInfo(userInfo, loginType,ipInfo );
-                    // 鍒犻櫎閭�璇峰垎浜浘
-                    spreadUserImgService.deleteImgUrl(userInfo.getId());
-                } else {
-                    LogHelper.test("寰俊unionID涓嶅瓨鍦�:" + weiXinUser.getUnionid());
-
-                    String portrait = null;
-                    if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
-                        InputStream asInputStream = HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl());
-                        if (asInputStream != null) {
-                            FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
-                                    String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg",
-                                            weiXinUser.getUnionid(), System.currentTimeMillis() + ""));
-                            if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
-                                portrait = result.getUrl();
-                        } else {
-                            portrait = weiXinUser.getHeadimgurl();
-                        }
-                    }
-
-                    if (StringUtil.isNullOrEmpty(portrait))
-                        portrait = Constant.systemCommonConfig.getDefaultPortrait();
-
-                    // 鍒涘缓鏂拌处鎴�
-                    userInfo = new UserInfo();
-                    userInfo.setPortrait(portrait);
-                    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(loginType);
-                    userInfo.setLastLoginIp(ipInfo.getIp());
-                    userInfo.setState(UserInfo.STATE_NORMAL);
-                    userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
-                    addUser(userInfo);
-
-                    try {
-                        // 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
-                        userInfoExtraService.createUserInfoExtra(userInfo.getId());
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-
-                    userInfoModifyRecordService.addModifyRecord(userInfo.getId(), ModifyTypeEnum.bindWeiXin,
-                            weiXinUser.getUnionid());
-                }
-                return userInfo;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            jedis.del(watchKey);
-            jedis.unwatch();
-            jedis.close();
-        }
-        throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public UserInfo loginWeiXinNew(ProxyIP ipInfo, 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.getWeiXinUser(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);
-        }
-
-        UserInfo userInfo = userInfoService.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid(), SystemInfoUtil.getSystem(acceptData));
-        if (userInfo == null) {
-            String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.emptyKey,
-                    StringUtil.Md5("WXLogin:" + weiXinUser.getUnionid()));
-            redisManager.cacheCommonString(key, JsonUtil.getSimpleGson().toJson(weiXinUser), 60 * 20);
-            throw new UserAccountException(101, key);
-        }
-        // 鏇存柊璐︽埛鐧诲綍淇℃伅
-        updateLonginInfo(userInfo, loginType, ipInfo);
-        Long uid = userInfo.getId();
-        ThreadUtil.run(new Runnable() {
-            public void run() {
-                // 鍒犻櫎閭�璇峰垎浜浘
-                spreadUserImgService.deleteImgUrl(uid);
-            }
-        });
-        return userInfo;
-    }
-
-    /**
-     * 鏇存柊璐︽埛鐧诲綍淇℃伅
-     *
-     * @param userInfo
-     * @param loginType
-     * @param ipInfo
-     */
-    private void updateLonginInfo(UserInfo userInfo, int loginType, ProxyIP ipInfo) {
-        // 璁剧疆鐧诲綍鏃堕棿涓庣櫥褰曠被鍨�
-        UserInfo updateUserInfo = new UserInfo(userInfo.getId());
-        updateUserInfo.setLastLoginTime(System.currentTimeMillis());
-        updateUserInfo.setLoginType(loginType);
-        updateUserInfo.setLastLoginIp(ipInfo.getIp());
-        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
-    }
-
-    @Override
-    public void bindPhoneNew(Long uid, String phone) throws UserAccountException {
-        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
-        if (user == null) {
-            throw new UserAccountException(1, "鐢ㄦ埛涓嶅瓨鍦�");
-        }
-
-        String hasPhone = user.getPhone();
-        if (!StringUtil.isNullOrEmpty(hasPhone) && hasPhone.equals(phone)) {
-            throw new UserAccountException(2, "鎮ㄥ凡缁忕粦瀹氫簡璇ョ數璇濆彿鐮�");
-        }
-
-        UserInfo phoneUser = userInfoService.getEffectiveUserInfoByPhone(phone,user.getSystem());
-        if (phoneUser != null) {
-            throw new UserAccountException(2, "鍙风爜宸茬粡琚崰鐢�");
-        }
-
-        // 鏇存柊鐢佃瘽鍙风爜
-        UserInfo update = new UserInfo(user.getId());
-        update.setPhone(phone);
-        userInfoService.updateByPrimaryKeySelective(update);
-        // 鍔犲叆缁戝畾璁板綍
-        UserAccountBindingHistory history = new UserAccountBindingHistory();
-        history.setContent(phone);
-        history.setType(UserAccountBindingHistory.TYPE_PHONE);
-        history.setUid(uid);
-
-        // 涔嬪墠宸茬粡缁戝畾鐢佃瘽鍙风爜
-        if (!StringUtil.isNullOrEmpty(user.getPhone()))
-            history.setFirst(false);
-        else
-            history.setFirst(true);
-        userAccountBindingHistoryService.addUserAccountBindingHistory(history);
-
-        // 鍙戦�佹秷鎭�
-        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
-
-        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, phone);
-
-    }
-
-    @Transactional(rollbackFor = UserAccountException.class)
-    @Override
-    public void bindWeiXin(AcceptData acceptData, Long uid, String code) throws UserAccountException {
-        WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
-        WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUser(code, wxAccount.getAppId(), wxAccount.getAppSecret());
-        if (weiXinUser == null) {
-            throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
-        }
-
-        String wxUnionId = weiXinUser.getUnionid();
-        if (StringUtil.isNullOrEmpty(wxUnionId)) {
-            throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
-        }
-        bindWeiXin(uid, weiXinUser);
-    }
-
-    @Transactional(rollbackFor = UserAccountException.class)
-    @Override
-    public void bindWeiXin(Long uid, WeiXinUser weiXinUser) throws UserAccountException {
-        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
-        if (user == null) {
-            throw new UserAccountException(1, "鐢ㄦ埛涓嶅瓨鍦�");
-        }
-
-        if (weiXinUser == null) {
-            throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
-        }
-
-        String wxUnionId = weiXinUser.getUnionid();
-        if (StringUtil.isNullOrEmpty(wxUnionId)) {
-            throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
-        }
-
-        String wxUnionIdExist = user.getWxUnionId();
-        if (StringUtil.isNullOrEmpty(wxUnionIdExist)) {
-            UserInfo newUser = userInfoService.getEffectiveUserInfoByWXUnionId(wxUnionId, user.getSystem());
-            if (newUser != null) {
-                throw new UserAccountException(4, "璇ュ井淇″彿宸茶鍏朵粬甯愬彿缁戝畾");
-            }
-        } else if (wxUnionId.equalsIgnoreCase(wxUnionIdExist)) {
-            throw new UserAccountException(3, "寰俊甯愬彿涓�鑷存棤闇�鏇存崲");
-        }
-
-        if (StringUtil.isNullOrEmpty(user.getPhone())) {
-            throw new UserAccountException(5, "璇ュ笎鍙锋病鏈夌粦瀹氭墜鏈哄彿鐮侊紝闇�缁戝畾鎵嬫満鍙风爜鎵嶈兘瀹屾垚寰俊鏇存崲");
-        }
-
-        UserInfo updateUserInfo = new UserInfo(uid);
-        updateUserInfo.setWxName(weiXinUser.getNickname());
-        updateUserInfo.setWxOpenId(weiXinUser.getOpenid());
-        updateUserInfo.setWxPic(weiXinUser.getHeadimgurl());
-        updateUserInfo.setWxUnionId(weiXinUser.getUnionid());
-
-        // 灏嗛粯璁ゆ樀绉版浛鎹㈡垚寰俊鏄电О
-        String defaultNickName = Constant.systemCommonConfig.getDefaultNickName();
-        if (!StringUtil.isNullOrEmpty(defaultNickName) && !StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
-            defaultNickName = defaultNickName + uid;
-            if ((defaultNickName.equals(user.getNickName()) || "鏉挎牀蹇渷".equals(user.getNickName()))) {
-                updateUserInfo.setNickName(weiXinUser.getNickname());
-            }
-        }
-
-        // 灏嗛粯璁ゅご鍍忔浛鎹㈡垚寰俊澶村儚
-        String defaultPortrait = Constant.systemCommonConfig.getDefaultPortrait();
-        if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl()) && !StringUtil.isNullOrEmpty(defaultPortrait)
-                && defaultPortrait.equals(user.getPortrait())) {
-            String headimgurl = weiXinUser.getHeadimgurl();
-            InputStream asInputStream = HttpUtil.getAsInputStream(headimgurl);
-            if (asInputStream == null) {
-                LogHelper.test("寰俊澶村儚涓嬭浇澶辫触: " + weiXinUser.getUnionid() + " " + headimgurl);
-            } else {
-                FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
-                        String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg", weiXinUser.getUnionid(),
-                                System.currentTimeMillis() + ""));
-                if (result != null && !StringUtil.isNullOrEmpty(result.getUrl())) {
-                    headimgurl = result.getUrl();
-                } else {
-                    LogHelper.test("寰俊澶村儚涓婁紶澶辫触: " + weiXinUser.getUnionid() + " " + headimgurl);
-                }
-            }
-            updateUserInfo.setPortrait(headimgurl);
-        }
-        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
-
-        // 鍔犲叆缁戝畾璁板綍
-        UserAccountBindingHistory history = new UserAccountBindingHistory();
-        history.setContent(weiXinUser.getUnionid());
-        history.setType(UserAccountBindingHistory.TYPE_WX);
-        history.setUid(uid);
-
-        // 涔嬪墠宸茬粡缁戝畾鐢佃瘽鍙风爜
-        if (!StringUtil.isNullOrEmpty(user.getWxUnionId()))
-            history.setFirst(false);
-        else
-            history.setFirst(true);
-        userAccountBindingHistoryService.addUserAccountBindingHistory(history);
-
-        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_WX);
-
-        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, wxUnionId);
-    }
-
-    @Override
-    public UserInfo bindPhoneToLogin(ProxyIP ipinfo, AcceptData acceptData, String phone, String key)
-            throws UserAccountException {
-
-        // 鍒ゆ柇鎵嬫満鍙风爜鏄惁琚皝绂�
-        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, "寰俊鎺堟潈澶辨晥锛岃浣跨敤寰俊閲嶆柊鐧诲綍");
-
-        SystemEnum system = SystemInfoUtil.getSystem(acceptData);
-
-        UserInfo userInfo = userInfoService.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid(), system);
-        // 鐩存帴鐢ㄧ殑寰俊鐧诲綍
-        if (userInfo != null)
-            throw new UserAccountException(10, "璇ュ井淇″彿宸茶鍗犵敤");
-
-        String portrait = null;
-        if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
-            InputStream asInputStream = HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl());
-            if (asInputStream != null) {
-                FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
-                        String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg", weiXinUser.getUnionid(),
-                                System.currentTimeMillis() + ""));
-                if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
-                    portrait = result.getUrl();
-            } else {
-                portrait = weiXinUser.getHeadimgurl();
-            }
-        }
-
-        if (StringUtil.isNullOrEmpty(portrait))
-            portrait = Constant.systemCommonConfig.getDefaultPortrait();
-
-        // 鏄惁闇�瑕佸垱寤烘柊璐︽埛
-        UserInfo phoneUser = userInfoService.getEffectiveUserInfoByPhone(phone, system);
-        if (phoneUser != null) {
-            // 缁戝畾寰俊
-            if (StringUtil.isNullOrEmpty(phoneUser.getWxUnionId())) {
-                try {
-                    bindWeiXin(phoneUser.getId(), weiXinUser);
-                } catch (Exception e) {
-                    throw new UserAccountException(1, "寰俊缁戝畾澶辫触");
-                }
-            } else {
-                throw new UserAccountException(1, "璇ュ井淇″凡琚粦瀹�");
-            }
-            userInfo = userInfoService.selectAvailableByPrimaryKey(phoneUser.getId());
-        } else {
-            // 鍒涘缓鏂拌处鎴�
-            userInfo = new UserInfo();
-            userInfo.setPhone(phone);
-            userInfo.setPortrait(portrait);
-            userInfo.setAppId(null);
-            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(ipinfo.getIp());
-            userInfo.setState(UserInfo.STATE_NORMAL);
-            userInfo.setSystem(system);
-            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;
-    }
-
-
-    @Override
-    public UserInfo bindWXToLogin(ProxyIP ipInfo, AcceptData acceptData, String code, String appId, String key) throws UserAccountException {
-        // 鏃ュ織淇℃伅
-        JSONObject logInfo = new JSONObject();
-        logInfo.put("appId", appId);
-        logInfo.put("code", code);
-        logInfo.put("loginType", 2);
-        LogHelper.lgoinInfo(logInfo.toString());
-
-        SystemEnum system = SystemInfoUtil.getSystem(acceptData);
-
-        // 閫氳繃Code鎹㈠彇淇℃伅
-        WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
-        WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUser(code, 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);
-        }
-
-        String phone = redisManager.getCommonString(key);
-        if (StringUtil.isNullOrEmpty(phone))
-            throw new UserAccountException(1, "鎵嬫満鍙风櫥褰曞け鏁堬紝璇蜂娇鍙戦�佺煭淇$櫥褰�");
-
-        // 閲囩敤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, "璇风◢鍚庡啀璇�");
-            } else {
-
-                UserInfo userInfo = userInfoService.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid(), system);
-                // 鐩存帴鐢ㄧ殑寰俊鐧诲綍
-                if (userInfo != null) {
-                    // 缁戝畾寰俊
-                    if (!StringUtil.isNullOrEmpty(userInfo.getPhone()) && !phone.equals(userInfo.getPhone().trim())) {
-                        throw new UserAccountException(1, "璇ュ井淇″凡琚粦瀹�");
-                    }
-                    // 鍒犻櫎閭�璇峰垎浜浘
-                    //spreadUserImgService.deleteImgUrl(userInfo.getId());
-                } else {
-                    LogHelper.test("寰俊unionID涓嶅瓨鍦�:" + weiXinUser.getUnionid());
-
-                    String portrait = null;
-                    if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
-                        InputStream asInputStream = HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl());
-                        if (asInputStream != null) {
-                            FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
-                                    String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg",
-                                            weiXinUser.getUnionid(), System.currentTimeMillis() + ""));
-                            if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
-                                portrait = result.getUrl();
-                        } else {
-                            portrait = weiXinUser.getHeadimgurl();
-                        }
-                    }
-
-                    if (StringUtil.isNullOrEmpty(portrait))
-                        portrait = Constant.systemCommonConfig.getDefaultPortrait();
-
-                    // 鍒涘缓鏂拌处鎴�
-                    userInfo = new UserInfo();
-                    userInfo.setPhone(phone);
-                    userInfo.setPortrait(portrait);
-                    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(ipInfo.getIp());
-                    userInfo.setState(UserInfo.STATE_NORMAL);
-                    userInfo.setSystem(system);
-                    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());
-                        }
-                    });
-                }
-                return userInfo;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            jedis.del(watchKey);
-            jedis.unwatch();
-            jedis.close();
-        }
-        throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
-    }
-
-    @Override
-    public void forbiddenUserAll(Long uid, String reason) {
-        UserInfo currentInfo = userInfoService.selectByPKey(uid);
-        if (currentInfo == null) {
-            return;
-        }
-        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
-            return;
-        }
-
-        currentInfo.setState(UserInfo.STATE_FORBIDDEN);
-        currentInfo.setStateDesc(reason);
-        userInfoService.updateByPrimaryKeySelective(currentInfo);
-
-        // 鎻掑叆璁板綍
-        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_FORBIDDEN, reason);
-
-        // 鍔犲叆灏佺鐨勮处鍙峰垪琛�
-        ForbiddenUserIdentifyCode forbiddenUserIdentifyCode = new ForbiddenUserIdentifyCode();
-        forbiddenUserIdentifyCode.setType(ForbiddenUserIdentifyCodeTypeEnum.wxUnionId);
-        forbiddenUserIdentifyCode.setIdentifyCode(currentInfo.getWxUnionId());
-        forbiddenUserIdentifyCode.setBeiZhu(currentInfo.getWxName());
-        try {
-            forbiddenUserIdentifyCodeService.forbiddenIdentifyCode(forbiddenUserIdentifyCode);
-        } catch (ForbiddenUserIdentifyCodeException e) {
-            e.printStackTrace();
-        }
-
-        // 鐢佃瘽鍙风爜
-        forbiddenUserIdentifyCode = new ForbiddenUserIdentifyCode();
-        forbiddenUserIdentifyCode.setType(ForbiddenUserIdentifyCodeTypeEnum.phone);
-        forbiddenUserIdentifyCode.setIdentifyCode(currentInfo.getPhone());
-        try {
-            forbiddenUserIdentifyCodeService.forbiddenIdentifyCode(forbiddenUserIdentifyCode);
-        } catch (ForbiddenUserIdentifyCodeException e) {
-            e.printStackTrace();
-        }
-
-        // 娣樺疂
-        UserExtraTaoBaoInfo taoBao = userExtraTaoBaoInfoService.getByUid(uid);
-        if (taoBao != null && !StringUtil.isNullOrEmpty(taoBao.getTaoBaoUid())) {
-            forbiddenUserIdentifyCode = new ForbiddenUserIdentifyCode();
-            forbiddenUserIdentifyCode.setType(ForbiddenUserIdentifyCodeTypeEnum.taobaoUid);
-            forbiddenUserIdentifyCode.setIdentifyCode(taoBao.getTaoBaoUid());
-            try {
-                forbiddenUserIdentifyCodeService.forbiddenIdentifyCode(forbiddenUserIdentifyCode);
-            } catch (ForbiddenUserIdentifyCodeException e) {
-                e.printStackTrace();
-            }
-        }
-
-        // 鏌ヨ鏀粯瀹濈粦瀹�
-        List<BindingAccount> list = bindingAccountService.getBindingAccountByUid(uid);
-        if (list != null) {
-            for (BindingAccount ba : list) {
-                forbiddenUserIdentifyCode = new ForbiddenUserIdentifyCode();
-                forbiddenUserIdentifyCode.setType(ForbiddenUserIdentifyCodeTypeEnum.alipayAccount);
-                forbiddenUserIdentifyCode.setIdentifyCode(ba.getAccount());
-                forbiddenUserIdentifyCode.setBeiZhu(ba.getName());
-                try {
-                    forbiddenUserIdentifyCodeService.forbiddenIdentifyCode(forbiddenUserIdentifyCode);
-                } catch (ForbiddenUserIdentifyCodeException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    @Override
-    public void forbiddenUser(Long uid, String reason) {
-        UserInfo currentInfo = userInfoService.selectByPKey(uid);
-        if (currentInfo == null) {
-            return;
-        }
-
-        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
-            return;
-        }
-
-        currentInfo.setState(UserInfo.STATE_FORBIDDEN);
-        currentInfo.setStateDesc(reason);
-        userInfoService.updateByPrimaryKeySelective(currentInfo);
-
-        // 鎻掑叆璁板綍
-        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_FORBIDDEN, reason);
-    }
-
-    @Override
-    public void DeleteUser(Long uid, String reason) {
-        UserInfo currentInfo = userInfoService.selectByPKey(uid);
-        if (currentInfo == null) {
-            return;
-        }
-
-        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
-            return;
-        }
-
-        currentInfo.setState(UserInfo.STATE_DELETE);
-        currentInfo.setStateDesc(reason);
-        userInfoService.updateByPrimaryKeySelective(currentInfo);
-        // 鎻掑叆璁板綍
-        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_DELETE, reason);
-    }
-
-    @Override
-    public void DeleteUserOutOfDate(Long uid, String reason) {
-        UserInfo currentInfo = userInfoService.selectByPKey(uid);
-        if (currentInfo == null) {
-            return;
-        }
-
-        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
-            return;
-        }
-
-        currentInfo.setState(UserInfo.STATE_DELETE_OUT_OF_DATE);
-        currentInfo.setStateDesc(reason);
-        userInfoService.updateByPrimaryKeySelective(currentInfo);
-        // 鎻掑叆璁板綍
-        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_DELETE_OUT_OF_DATE, reason);
-    }
-
-}
+package com.yeshi.fanli.service.impl.user;
+
+import java.io.InputStream;
+import java.util.List;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import com.yeshi.fanli.entity.SystemEnum;
+import com.yeshi.fanli.entity.config.SMSConfig;
+import com.yeshi.fanli.entity.system.BusinessSystem;
+import com.yeshi.fanli.entity.system.ConfigKeyEnum;
+import com.yeshi.fanli.service.inter.config.ConfigService;
+import com.yeshi.fanli.service.inter.config.SystemConfigService;
+import com.yeshi.fanli.util.*;
+import com.yeshi.fanli.vo.taobao.TaoBaoUser;
+import com.yeshi.fanli.vo.user.QQUserInfoVO;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.yeshi.utils.HttpUtil;
+import org.yeshi.utils.JsonUtil;
+import org.yeshi.utils.entity.FileUploadResult;
+import org.yeshi.utils.entity.ProxyIP;
+import org.yeshi.utils.entity.wx.WeiXinUser;
+import org.yeshi.utils.tencentcloud.COSManager;
+
+import com.google.gson.Gson;
+import com.qcloud.cos.model.COSObjectSummary;
+import com.qcloud.cos.model.ObjectListing;
+import com.yeshi.fanli.dto.wx.WXAccountInfoDTO;
+import com.yeshi.fanli.entity.accept.AcceptData;
+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.LoginResult;
+import com.yeshi.fanli.entity.bus.user.SMSHistory;
+import com.yeshi.fanli.entity.bus.user.UserAccountBindingHistory;
+import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
+import com.yeshi.fanli.entity.bus.user.UserInfo;
+import com.yeshi.fanli.entity.bus.user.UserInfoModifyRecord.ModifyTypeEnum;
+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.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.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.factory.msg.MsgAccountDetailFactory;
+import com.yeshi.fanli.util.wx.MyWXLoginUtil;
+
+import net.sf.json.JSONObject;
+import org.yeshi.utils.wx.WXAppLoginUtil;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.Transaction;
+
+@Service
+public class UserAccountServiceImpl implements UserAccountService {
+
+    @Resource
+    private RedisManager redisManager;
+
+    @Resource
+    private UserInfoService userInfoService;
+
+    @Resource
+    private BindingAccountService bindingAccountService;
+
+    @Resource
+    private ThreeSaleSerivce threeSaleSerivce;
+
+    @Resource
+    private SpreadUserImgService spreadUserImgService;
+
+    @Resource
+    private UserAccountMsgNotificationService userAccountMsgNotificationService;
+
+    @Resource
+    private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
+
+    @Resource
+    private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
+
+    @Resource
+    private UserInfoExtraService userInfoExtraService;
+
+    @Resource
+    private UserAccountBindingHistoryService userAccountBindingHistoryService;
+
+    @Resource
+    private UserInfoDeleteRecordService userInfoDeleteRecordService;
+
+
+    @Resource
+    private ConfigService configService;
+
+    @Lazy
+    @Resource
+    private UserInfoModifyRecordService userInfoModifyRecordService;
+
+
+    @Resource
+    private SystemConfigService systemConfigService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public LoginResult login(HttpServletRequest request, AcceptData acceptData, 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");
+        }
+
+        String defaultPortrait = userInfoService.getDefaultPortrait(acceptData.getSystem());
+
+        // 浼氳瘽涓笂娆$櫥褰曠殑鐢ㄦ埛
+        if (wxinstall) {// 瀹夎浜嗗井淇$殑鐘舵��
+            UserInfo lastUser = (UserInfo) session.getAttribute("LAST_LOGIN_USER");
+            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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), tbUserInfo.getOpenid());
+                    // 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
+                    if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
+                        userInfo = null;
+                    if (userInfo == null) {// 鍘熷厛鐨勮处鍙蜂笉瀛樺湪
+                        userInfo = new UserInfo();
+                        userInfo.setAppId(appId);
+                        userInfo.setTbName(tbUserInfo.getTbName());
+                        userInfo.setOpenid(tbUserInfo.getOpenid());
+                        userInfo.setTbPic(tbUserInfo.getTbPic());
+                        userInfo.setNickName(tbUserInfo.getNickName());
+                        userInfo.setPortrait(tbUserInfo.getPortrait());
+                        userInfo.setLoginType(loginType);
+                        userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
+                        session.setAttribute("LAST_LOGIN_USER", userInfo);
+                        // 闇�瑕佸井淇$櫥褰�
+                        return new LoginResult(LoginResult.TYPE_WX, userInfo);
+                    } else {// 鍘熷厛鐨勮处鍙峰瓨鍦�
+                        // 鍒ゅ畾鏄惁缁戝畾浜嗗井淇�
+                        if (StringUtil.isNullOrEmpty(userInfo.getWxUnionId())) {// 娌℃湁缁戝畾寰俊
+                            userInfo.setLoginType(loginType);
+                            session.setAttribute("LAST_LOGIN_USER", userInfo);
+                            // 闇�瑕佸井淇$櫥褰�
+                            return new LoginResult(LoginResult.TYPE_WX, userInfo);
+                        } else {// 缁戝畾浜嗗井淇�
+                            updateLatestLoginTime(userInfo.getId());
+                            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
+                        }
+                    }
+
+                case 2:// 寰俊
+                    // 閫氳繃Code鎹㈠彇淇℃伅
+                    WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
+                    weiXinUser = MyWXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
+                            wxAccount.getAppSecret());
+                    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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), weiXinUser.getUnionid());
+                    // 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
+                    if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
+                        userInfo = null;
+                    // 鐩存帴鐢ㄧ殑寰俊鐧诲綍
+                    if (lastUser == null) {
+                        if (userInfo != null) {
+                            // 浣垮垎閿�鍏崇郴鐢熸晥
+                            threeSaleSerivce.effective(userInfo);
+                            // 鏇存柊澶村儚涓庢樀绉�
+                            UserInfo updateUserInfo = new UserInfo(userInfo.getId());
+                            updateUserInfo.setNickName(weiXinUser.getNickname());
+                            if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl()))
+                                updateUserInfo.setPortrait(weiXinUser.getHeadimgurl());
+                            updateUserInfo.setWxPic(weiXinUser.getHeadimgurl());
+                            updateUserInfo.setWxName(weiXinUser.getNickname());
+                            // 璁剧疆鐧诲綍鏃堕棿涓庣櫥褰曠被鍨�
+                            updateUserInfo.setLastLoginTime(System.currentTimeMillis());
+                            updateUserInfo.setLoginType(loginType);
+                            updateUserInfo.setLastLoginIp(request.getRemoteHost());
+                            // 鏇存柊openId
+                            updateUserInfo.setOpenid(weiXinUser.getOpenid());
+                            userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+                            // 鍒犻櫎閭�璇峰浘鐗�
+                            spreadUserImgService.deleteImgUrl(userInfo.getId());
+                            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
+                        }
+                        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(loginType);
+                        userInfo.setLastLoginIp(request.getRemoteHost());
+                        userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
+                        addUser(userInfo);
+
+                        return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
+                    } else {
+                        // 鏈細璇濋噰鐢ㄨ繃鍏朵粬璐﹀彿鐧诲綍
+                        if (userInfo != null)// 寰俊璐﹀彿瀛樺湪
+                        {
+                            if (lastUser.getLoginType() == 2) {
+                                session.removeAttribute("LAST_LOGIN_USER");
+                                throw new UserAccountException(1002, "寰俊涓嶈兘缁戝畾寰俊");
+                            }
+                            if (lastUser.getLoginType() == 1 && !StringUtil.isNullOrEmpty(userInfo.getOpenid())) {
+                                session.removeAttribute("LAST_LOGIN_USER");
+                                throw new UserAccountException(1003, "璇ュ井淇″凡缁忕粦瀹氫簡娣樺疂璐﹀彿锛岃鍏堣В缁�");
+                            }
+                            if (lastUser.getLoginType() == 3 && !StringUtil.isNullOrEmpty(userInfo.getPhone())) {
+                                session.removeAttribute("LAST_LOGIN_USER");
+                                throw new UserAccountException(1003, "璇ュ井淇″凡缁忕粦瀹氫簡鐢佃瘽鍙风爜锛岃鍏堣В缁�");
+                            }
+
+                            // 鍒犻櫎閭�璇峰浘鐗�
+                            spreadUserImgService.deleteImgUrl(userInfo.getId());
+                            // 杩樻病鏈夌粦瀹氬悓绫诲瀷鐨勮处鍙�
+
+                            // 涓や釜璐﹀彿娌℃湁鍚屾椂鏈夌嫭绔嬬殑UID
+                            if (lastUser.getId() == null || lastUser.getId() == 0
+                                    || lastUser.getId() == userInfo.getId().longValue()) {
+                                // 缁戝畾鍏崇郴
+                                UserInfo updateUserInfo = new UserInfo(userInfo.getId());
+
+                                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());
+                                userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+                                session.removeAttribute("LAST_LOGIN_USER");
+
+                                // 浣垮垎閿�鍏崇郴鐢熸晥
+                                threeSaleSerivce.effective(userInfo);
+
+                                return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
+                            } else {// 涓や釜璐﹀彿鎷ユ湁涓嶅悓鐨刄ID
+                                // 璇㈤棶鏄惁鎵撻��
+                                // 鏆傚瓨寰俊璐﹀彿
+                                // session.setAttribute("WEIXIN_USERINFO",
+                                // userInfo);
+                                session.removeAttribute("LAST_LOGIN_USER");
+                                LoginResult result = new LoginResult(LoginResult.TYPE_CONNECT, lastUser);
+                                result.setMainUser(userInfo);
+                                result.setLessUser(lastUser);
+
+                                // 浣垮垎閿�鍏崇郴鐢熸晥
+                                threeSaleSerivce.effective(userInfo);
+                                return result;
+                            }
+
+                        } else {// 寰俊璐﹀彿涓嶅瓨鍦�
+                            // 鍒涘缓璐﹀彿,缁戝畾璐﹀彿
+                            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());
+                            if (!StringUtil.isNullOrEmpty(lastUser.getPhone()))
+                                userInfo.setPhone(lastUser.getPhone());
+
+                            if (!StringUtil.isNullOrEmpty(lastUser.getOpenid())) {
+                                userInfo.setOpenid(lastUser.getOpenid());
+                                userInfo.setTbName(lastUser.getTbName());
+                                userInfo.setTbPic(lastUser.getTbPic());
+                            }
+                            userInfo.setLastLoginTime(System.currentTimeMillis());
+                            userInfo.setLoginType(loginType);
+                            userInfo.setLastLoginIp(request.getRemoteHost());
+                            userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
+                            addUser(userInfo);
+                            session.removeAttribute("LAST_LOGIN_USER");
+                            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
+                        }
+                    }
+                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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), phone);
+                    // 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
+                    if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
+                        userInfo = null;
+
+                    if (userInfo == null) {// 鍘熷厛鐨勮处鍙蜂笉瀛樺湪
+                        userInfo = new UserInfo();
+                        userInfo.setAppId(appId);
+                        userInfo.setNickName(null);
+                        userInfo.setPortrait(defaultPortrait);
+                        userInfo.setPhone(phone);
+                        userInfo.setLoginType(loginType);
+                        userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
+                        session.setAttribute("LAST_LOGIN_USER", userInfo);
+                        // 璇㈤棶鏄惁缁戝畾寰俊
+                        return new LoginResult(LoginResult.TYPE_WX, userInfo);
+                    } else {// 鍘熷厛鐨勮处鍙峰瓨鍦�
+                        // 鍒ゅ畾鏄惁缁戝畾浜嗗井淇�
+                        if (StringUtil.isNullOrEmpty(userInfo.getWxUnionId())) {// 娌℃湁缁戝畾寰俊
+                            userInfo.setLoginType(loginType);
+                            session.setAttribute("LAST_LOGIN_USER", userInfo);
+                            // 闇�瑕佸井淇$櫥褰�
+                            return new LoginResult(LoginResult.TYPE_WX, userInfo);
+                        } else {// 缁戝畾浜嗗井淇�
+                            updateLatestLoginTime(userInfo.getId());
+                            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
+                        }
+                    }
+                default:
+                    return null;
+            }
+
+        } else {// 娌℃湁瀹夎寰俊
+            LoginResult result = loginNoInstallWX(acceptData, appId, code, phone, tbUserInfo, loginType);
+            if (result.getType() == LoginResult.TYPE_CREATE)
+                session.setAttribute("LAST_LOGIN_USER", result.getUser());
+            return result;
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public LoginResult loginNoInstallWX(AcceptData acceptData, 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());
+
+        String defaultPortrait = userInfoService.getDefaultPortrait(acceptData.getSystem());
+
+        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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), tbUserInfo.getOpenid());
+                break;
+            case 2:// 寰俊
+                // 閫氳繃Code鎹㈠彇淇℃伅
+                WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
+                weiXinUser = MyWXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
+                        wxAccount.getAppSecret());
+                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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), 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(SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()), phone);
+                break;
+        }
+
+        // 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
+        if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
+            userInfo = null;
+
+        if (userInfo != null) {
+            UserInfo updateUserInfo = new UserInfo(userInfo.getId());
+            updateUserInfo.setLastLoginTime(System.currentTimeMillis());
+            userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+            return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
+        } else {// 璇㈤棶鏄惁鍒涘缓鐢ㄦ埛
+            userInfo = new UserInfo();
+            userInfo.setAppId(appId);
+            switch (loginType) {
+                case 1:// 娣樺疂
+                    userInfo.setTbName(tbUserInfo.getNickName());
+                    userInfo.setTbPic(tbUserInfo.getPortrait());
+                    userInfo.setNickName(tbUserInfo.getNickName());
+                    userInfo.setPortrait(tbUserInfo.getPortrait());
+                    break;
+                case 2:// 寰俊
+                    userInfo.setPortrait(weiXinUser.getHeadimgurl());
+                    userInfo.setNickName(weiXinUser.getNickname());
+                    userInfo.setWxName(weiXinUser.getNickname());
+                    userInfo.setWxOpenId(weiXinUser.getOpenid());
+                    userInfo.setWxUnionId(weiXinUser.getUnionid());
+                    userInfo.setWxPic(weiXinUser.getHeadimgurl());
+                    break;
+                case 3:// 鎵嬫満鍙风爜
+                    // 榛樿澶村儚涓庢樀绉�
+                    userInfo.setPortrait(defaultPortrait);
+                    userInfo.setNickName(null);
+                    userInfo.setPhone(phone);
+                    break;
+            }
+            userInfo.setSystem(SystemInfoUtil.getSystem(acceptData));
+            return new LoginResult(LoginResult.TYPE_CREATE, userInfo);
+        }
+    }
+
+
+    /**
+     * 鏍规嵁绯荤粺涓巙nionid瀵绘壘鐢ㄦ埛
+     *
+     * @param system
+     * @param unionId
+     * @return
+     * @throws UserAccountException
+     */
+    @Override
+    public UserInfo getUserInfoByWXUnionId(SystemEnum system, String unionId) throws UserAccountException {
+        if (system == null)
+            throw new UserAccountException(1, "绯荤粺");
+        if (StringUtil.isNullOrEmpty(unionId))
+            throw new UserAccountException(2, "unionId涓虹┖");
+
+        List<UserInfo> list = userInfoService.listBySystemAndWXUnionId(system, unionId);
+        // 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
+        for (int i = 0; i < list.size(); i++) {
+            if (list.get(i).getState() == UserInfo.STATE_NORMAL) {
+                list.remove(i);
+                i--;
+            }
+        }
+        if (list.size() > 0)
+            return list.get(list.size() - 1);
+        else
+            return null;
+    }
+
+
+    /**
+     * 鏍规嵁绯荤粺鍜屾窐瀹濈殑Openid瀵绘壘鐢ㄦ埛
+     *
+     * @param system
+     * @param openId
+     * @return
+     * @throws UserAccountException
+     */
+    public UserInfo getUserInfoByTaoBaoOpenId(SystemEnum system, String openId) throws UserAccountException {
+        if (system == null)
+            throw new UserAccountException(1, "绯荤粺涓虹┖");
+        if (StringUtil.isNullOrEmpty(openId))
+            throw new UserAccountException(2, "openId涓虹┖");
+        List<UserInfo> list = userInfoService.listBySystemAndTaoBaoOpenId(system, openId);
+
+        // 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
+        for (int i = 0; i < list.size(); i++) {
+            if (list.get(i).getState() != UserInfo.STATE_NORMAL) {
+                list.remove(i);
+                i--;
+            }
+        }
+        if (list.size() > 0)
+            return list.get(list.size() - 1);
+        else
+            return null;
+
+    }
+
+    /**
+     * 鏍规嵁绯荤粺鍜岀數璇濆彿鐮佸鎵剧敤鎴�
+     *
+     * @param system
+     * @param phone
+     * @return
+     * @throws UserAccountException
+     */
+    public UserInfo getUserInfoByPhone(SystemEnum system, String phone) throws UserAccountException {
+        if (system == null)
+            throw new UserAccountException(1, "绯荤粺涓虹┖");
+        if (StringUtil.isNullOrEmpty(phone))
+            throw new UserAccountException(2, "phone涓虹┖");
+        List<UserInfo> list = userInfoService.listBySystemAndPhone(system, phone);
+
+        // 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
+        for (int i = 0; i < list.size(); i++) {
+            if (list.get(i).getState() != UserInfo.STATE_NORMAL) {
+                list.remove(i);
+                i--;
+            }
+        }
+        if (list.size() > 0)
+            return list.get(list.size() - 1);
+        else
+            return null;
+
+    }
+
+    private void updateLatestLoginTime(Long uid) {
+        UserInfo userInfo = new UserInfo(uid);
+        userInfo.setLastLoginTime(System.currentTimeMillis());
+        userInfoService.updateByPrimaryKeySelective(userInfo);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void register(UserInfo userInfo) throws UserAccountException {
+        if (!StringUtil.isNullOrEmpty(userInfo.getPhone())) {
+            UserInfo user = getUserInfoByPhone(userInfo.getSystem(), userInfo.getPhone());
+            if (user != null)
+                throw new UserAccountException(50001, "鐢佃瘽鍙风爜宸茬粡琚粦瀹�");
+        }
+
+        if (!StringUtil.isNullOrEmpty(userInfo.getOpenid())) {
+            UserInfo user = getUserInfoByTaoBaoOpenId(userInfo.getSystem(), userInfo.getOpenid());
+            if (user != null)
+                throw new UserAccountException(50002, "娣樺疂鍙峰凡缁忚缁戝畾");
+        }
+
+        if (!StringUtil.isNullOrEmpty(userInfo.getWxUnionId())) {
+            UserInfo user = getUserInfoByWXUnionId(userInfo.getSystem(), userInfo.getWxUnionId());
+            if (user != null)
+                throw new UserAccountException(50003, "寰俊鍙峰凡缁忚娉ㄥ唽");
+        }
+
+        addUser(userInfo);
+    }
+
+    @Transactional
+    @Override
+    public void addUser(UserInfo user) {
+        user.setCreatetime(System.currentTimeMillis());
+        user.setRank(0);
+        if (StringUtil.isNullOrEmpty(user.getPortrait())) {
+            String defaultPortrait = userInfoService.getDefaultPortrait(user.getSystem());
+            user.setPortrait(defaultPortrait);
+        }
+        userInfoService.createUser(user, user.getSystem());
+        // 鏄电О涓虹┖鏃� 榛樿鏄电О
+        if (StringUtil.isNullOrEmpty(user.getNickName())) {
+            UserInfo updateUserInfo = new UserInfo(user.getId());
+            String defaultNickName = userInfoService.getDefaultNickName(user.getSystem(), user.getId());
+            updateUserInfo.setNickName(defaultNickName);
+            userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+        }
+
+        try {
+            // 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
+            userInfoExtraService.createUserInfoExtra(user.getId());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        // 娣诲姞璐﹀彿缁戝畾鍘嗗彶
+        if (!StringUtil.isNullOrEmpty(user.getPhone()))
+            userInfoModifyRecordService.addModifyRecord(user.getId(), ModifyTypeEnum.bindPhone, user.getPhone());
+
+        if (!StringUtil.isNullOrEmpty(user.getWxUnionId()))
+            userInfoModifyRecordService.addModifyRecord(user.getId(), ModifyTypeEnum.bindWeiXin, user.getWxUnionId());
+    }
+
+    @Override
+    public void updateUserSelective(UserInfo user) {
+        userInfoService.updateByPrimaryKeySelective(user);
+    }
+
+    @Override
+    public void bindPhone(Long uid, String phone) throws UserAccountException {
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null)
+            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
+
+        if (!StringUtil.isNullOrEmpty(user.getPhone()))
+            throw new UserAccountException(5, "褰撳墠璐﹀彿宸茬粡缁戝畾浜嗘墜鏈哄彿锛岃鍏堣В缁�");
+
+        UserInfo phoneUser = getUserInfoByPhone(user.getSystem(), phone);
+        if (phoneUser != null)
+            throw new UserAccountException(6, "褰撳墠鐢佃瘽鍙风爜宸茬粡琚粦瀹�");
+
+        UserInfo update = new UserInfo(user.getId());
+        update.setPhone(phone);
+        userInfoService.updateByPrimaryKeySelective(update);
+        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
+
+        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, phone);
+    }
+
+    @Override
+    public void unBindPhone(Long uid, String phone) throws UserAccountException {
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null)
+            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
+
+        if (StringUtil.isNullOrEmpty(user.getPhone()))
+            throw new UserAccountException(4, "灏氭湭缁戝畾鐢佃瘽鍙风爜");
+
+        if (!user.getPhone().equalsIgnoreCase(phone))
+            throw new UserAccountException(4, "鍘熺粦瀹氭墜鏈哄彿杈撳叆閿欒");
+
+        if (StringUtil.isNullOrEmpty(user.getWxUnionId()) && StringUtil.isNullOrEmpty(user.getOpenid()))
+            throw new UserAccountException(5, "涓嶈兘瑙i櫎缁戝畾");
+
+        UserInfo updateUserInfo = new UserInfo(uid);
+        updateUserInfo.setPhone("");
+        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+        userAccountMsgNotificationService.unBindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
+    }
+
+    @Override
+    public void bindTaoBao(Long uid, String tbOpenId, String tbNickName, String tbPortrait)
+            throws UserAccountException {
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null)
+            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
+
+        if (!StringUtil.isNullOrEmpty(user.getOpenid()) && !user.getOpenid().equalsIgnoreCase(tbOpenId))
+            throw new UserAccountException(5, "褰撳墠璐﹀彿宸茬粡缁戝畾浜嗘窐瀹濓紝璇峰厛瑙g粦");
+
+        // 缁戝畾鍚屼竴涓窐瀹濆彿
+        if (!StringUtil.isNullOrEmpty(user.getOpenid()) && user.getOpenid().equalsIgnoreCase(tbOpenId))
+            return;
+
+        UserInfo taoBaoUser = getUserInfoByTaoBaoOpenId(user.getSystem(), tbOpenId);
+        if (taoBaoUser != null)
+            throw new UserAccountException(6, "褰撳墠娣樺疂鍙峰凡缁忚缁戝畾");
+        UserInfo update = new UserInfo(user.getId());
+        update.setOpenid(tbOpenId);
+        update.setTbName(tbNickName);
+        update.setTbPic(tbPortrait);
+        // 濡傛灉娌℃湁缁戝畾寰俊灏变互娣樺疂鐨勫ご鍍忓拰鏄电О浣滀负鐢ㄦ埛鐨勫ご鍍忎笌鏄电О
+        if (StringUtil.isNullOrEmpty(user.getWxUnionId())) {
+            update.setNickName(tbNickName);
+            update.setPortrait(tbPortrait);
+        }
+        userInfoService.updateByPrimaryKeySelective(update);
+
+        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_TB);
+    }
+
+    @Override
+    public void unBindTaoBao(Long uid) throws UserAccountException {
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null)
+            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
+        if (StringUtil.isNullOrEmpty(user.getOpenid()))
+            throw new UserAccountException(5, "褰撳墠璐﹀彿灏氭湭缁戝畾娣樺疂");
+
+        if (StringUtil.isNullOrEmpty(user.getWxUnionId()) && StringUtil.isNullOrEmpty(user.getPhone()))
+            throw new UserAccountException(5, "涓嶈兘鎺ヨЕ缁戝畾");
+
+        UserInfo update = new UserInfo(user.getId());
+        update.setOpenid("");
+        update.setTbName("");
+        update.setTbPic("");
+        // 鍒ゆ柇鏄惁鏈夊井淇$粦瀹�
+        if (StringUtil.isNullOrEmpty(user.getWxUnionId())) {
+            update.setNickName(userInfoService.getDefaultNickName(user.getSystem(), user.getId()));
+            update.setPortrait(userInfoService.getDefaultPortrait(user.getSystem()));
+        }
+
+        userInfoService.updateByPrimaryKeySelective(update);
+
+        userExtraTaoBaoInfoService.unBindUid(uid);
+
+        userAccountMsgNotificationService.unBindingSuccess(uid, MsgAccountDetailFactory.TYPE_TB);
+    }
+
+    @Override
+    public void changeWXBind(AcceptData acceptData, Long uid, String code) throws UserAccountException {
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null)
+            throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
+        WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
+        WeiXinUser weiXinUser = MyWXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
+                wxAccount.getAppSecret());
+        if (weiXinUser == null)
+            throw new UserAccountException(10, "鑾峰彇寰俊鐢ㄦ埛淇℃伅澶辫触");
+        if (weiXinUser.getUnionid().equalsIgnoreCase(user.getWxUnionId()))
+            throw new UserAccountException(12, "浜诧紝璇风櫥褰曞叾瀹冨井淇″彿杩涜鏇存崲缁戝畾");
+
+        UserInfo newUser = getUserInfoByWXUnionId(user.getSystem(), weiXinUser.getUnionid());
+        if (newUser != null)
+            throw new UserAccountException(13, "璇ュ井淇″彿宸茶鍏朵粬璐﹀彿缁戝畾");
+
+        UserInfo updateUserInfo = new UserInfo(uid);
+        updateUserInfo.setWxName(weiXinUser.getNickname());
+        updateUserInfo.setWxOpenId(weiXinUser.getOpenid());
+        updateUserInfo.setWxPic(weiXinUser.getHeadimgurl());
+        updateUserInfo.setWxUnionId(weiXinUser.getUnionid());
+
+        // 灏嗛粯璁ゆ樀绉版浛鎹㈡垚寰俊鏄电О
+        if (!StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
+            String defaultNickName = userInfoService.getDefaultNickName(user.getSystem(), uid);
+            if ((defaultNickName.equals(user.getNickName()) || "鏉挎牀蹇渷".equals(user.getNickName()))) {
+                updateUserInfo.setNickName(weiXinUser.getNickname());
+            }
+        }
+
+        // 灏嗛粯璁ゅご鍍忔浛鎹㈡垚寰俊澶村儚
+        String defaultPortrait = userInfoService.getDefaultPortrait(user.getSystem());
+        if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl()) && !StringUtil.isNullOrEmpty(defaultPortrait)
+                && defaultPortrait.equals(user.getPortrait())) {
+            updateUserInfo.setPortrait(weiXinUser.getHeadimgurl());
+        }
+
+        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+
+        userAccountMsgNotificationService.changeBindingSuccess(uid, MsgAccountDetailFactory.TYPE_WX);
+
+        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, weiXinUser.getUnionid());
+    }
+
+    @Override
+    public void clearUserPortrait(Long uid) {
+        if (uid == null)
+            return;
+        UserInfo user = userInfoService.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)
+            for (COSObjectSummary object : list.getObjectSummaries()) {
+                if (user.getWxPic() != null && !user.getWxPic().contains(object.getKey())) {
+                    COSManager.getInstance().deleteFile(object.getKey());
+                }
+            }
+    }
+
+    @Override
+    public String repairPortrait(Long uid) {
+        if (uid == null)
+            return null;
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null)
+            return null;
+        String prefix = String.format("/portrait/wx/%s_", user.getWxUnionId());
+        ObjectListing list = COSManager.getInstance().getObjectList(prefix, null, 30);
+        // 鏌ヨ澶村儚鏂囦欢鏄惁杩樺瓨鍦�
+        boolean exist = false;
+        if (list != null && list.getObjectSummaries() != null)
+            for (COSObjectSummary object : list.getObjectSummaries()) {
+                if (user.getPortrait().contains(object.getKey())) {
+                    exist = true;
+                    break;
+                }
+            }
+
+        if (!exist && list.getObjectSummaries() != null && list.getObjectSummaries().size() > 0) {
+            COSObjectSummary object = list.getObjectSummaries().get(list.getObjectSummaries().size() - 1);
+            String portrait = String.format("https://%s.file.myqcloud.com/%s", object.getBucketName(), object.getKey());
+            if (!StringUtil.isNullOrEmpty(portrait)) {
+                UserInfo updateUser = new UserInfo(uid);
+                updateUser.setPortrait(portrait);
+                userInfoService.updateByPrimaryKeySelective(updateUser);
+                return portrait;
+            }
+        }
+        return user.getPortrait();
+    }
+
+    @Override
+    public String getMobile(String vcode, String phone, String aliAccessToken, SystemEnum system, int vcodeType) throws UserAccountException {
+        if (!StringUtil.isNullOrEmpty(aliAccessToken)) {
+
+
+            String mobile = AliyunOneKeyLoginUtil.getMobile(aliAccessToken, "");
+            if (StringUtil.isNullOrEmpty(mobile)) {
+                throw new UserAccountException(1, "鎵嬫満鍙疯幏鍙栧け璐�");
+            }
+            return mobile;
+        } else {
+            // 绌洪娓呯悊
+            if (phone == null || phone.trim().length() == 0) {
+                throw new UserAccountException(1, "璇疯緭鍏ユ墜鏈哄彿鐮�");
+            }
+            phone = phone.replaceAll(" ", "");
+            boolean isDemo = false;
+            //鏌ヨ涓婄嚎娴嬭瘯鐨勫彿鐮佷笌楠岃瘉鐮�
+            String demoLogin = configService.getValue(ConfigKeyEnum.demoLoginUser, system);
+            if (!StringUtil.isNullOrEmpty(demoLogin)) {
+                String demoPhone = demoLogin.split("#")[0];
+                String demoCode = demoLogin.split("#")[1];
+                if (phone.equalsIgnoreCase(demoPhone) && demoCode.equalsIgnoreCase(vcode)) {
+                    isDemo = true;
+                }
+            }
+            // 鑻规灉搴旂敤鍟嗗簵涓婄嚎娴嬭瘯鍙风爜
+            if (!isDemo) {
+                if (StringUtil.isNullOrEmpty(vcode)) {
+                    throw new UserAccountException(1, "璇疯緭鍏ラ獙璇佺爜");
+                }
+
+                String oldVcode = redisManager.getSMSVCode(phone, vcodeType);
+                LogHelper.test("----------------------鐧诲綍楠岃瘉鐮侊細 " + oldVcode);
+                if (!Constant.IS_TEST)
+                    if (StringUtil.isNullOrEmpty(oldVcode) || !oldVcode.equalsIgnoreCase(vcode)) {
+                        throw new UserAccountException(1, "楠岃瘉鐮侀敊璇紝閲嶆柊杈撳叆");
+                    } else {// 楠岃瘉鐮佽緭鍏ユ纭�
+                        redisManager.clearSMSVCode(phone, vcodeType);
+                    }
+            }
+            return phone;
+        }
+
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public UserInfo loginPhone(ProxyIP ipInfo, int loginType, String vcode, String phone, String aliAccessToken, BusinessSystem businessSystem)
+            throws UserAccountException {
+        String mobile = getMobile(vcode, phone, aliAccessToken, businessSystem.getSystem(), SMSHistory.TYPE_LOGIN);
+        JSONObject logInfo = new JSONObject();
+        logInfo.put("appId", businessSystem.getAppid());
+        logInfo.put("phone", mobile);
+        logInfo.put("loginType", loginType);
+        LogHelper.lgoinInfo(logInfo.toString());
+
+        // 鍒ゆ柇鎵嬫満鍙风爜鏄惁琚皝绂�
+        ForbiddenUserIdentifyCode identifyCode1 = forbiddenUserIdentifyCodeService
+                .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, mobile);
+        if (identifyCode1 != null && identifyCode1.getEffective() != null && identifyCode1.getEffective()) {
+            throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
+        }
+
+        // 娓呯┖闄愬埗
+        redisManager.clearSMSFrequencyLimit(mobile, SMSHistory.TYPE_LOGIN);
+        // 娓呯悊娆℃暟
+        String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSLoginCount, mobile);
+        redisManager.removeCommonString(key);
+
+        // 閲囩敤redis浜嬪姟闃叉涓�涓墜鏈哄彿澶氭娉ㄥ唽闂
+        String watchKey = StringUtil.Md5("REGISTER:" + mobile);
+        Jedis jedis = redisManager.getJedis();
+        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, "璇风◢鍚庡啀璇�");
+            } else {
+
+                // 鏌ヨ鏄惁瀛樺湪璇ョ數璇濆巻鍙茬敤鎴�
+                UserInfo userInfo = userInfoService.getEffectiveUserInfoByPhone(mobile, businessSystem.getSystem());
+                if (userInfo != null) {
+                    // 鏇存柊璐︽埛鐧诲綍淇℃伅
+                    updateLonginInfo(userInfo, loginType, ipInfo);
+                } else {
+                    userInfo = new UserInfo();
+                    userInfo.setAppId(businessSystem.getAppid());
+                    userInfo.setPortrait(null);
+                    userInfo.setPhone(mobile);
+                    userInfo.setLoginType(loginType);
+                    userInfo.setState(UserInfo.STATE_NORMAL);
+                    userInfo.setSystem(businessSystem.getSystem());
+                    // 鍒涘缓鐢ㄦ埛
+                    addUser(userInfo);
+
+                    try {
+                        // 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
+                        userInfoExtraService.createUserInfoExtra(userInfo.getId());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    userInfoModifyRecordService.addModifyRecord(userInfo.getId(), ModifyTypeEnum.bindPhone, mobile);
+                }
+                return userInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            jedis.del(watchKey);
+            jedis.unwatch();
+            jedis.close();
+        }
+        throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
+    }
+
+    @Override
+    public UserInfo loginTB(ProxyIP ipInfo, TaoBaoUser taoBaoUser, BusinessSystem businessSystem) throws UserAccountException {
+
+        if (StringUtil.isNullOrEmpty(taoBaoUser.getUserid()))
+            throw new UserAccountException(1, "娣樺疂鎺堟潈淇℃伅涓嶅畬鏁�");
+
+        UserInfo userInfo = userInfoService.getEffectiveUserInfoByOpenId(taoBaoUser.getOpenId(), businessSystem.getSystem());
+        if (userInfo != null) {
+            // 鏇存柊璐︽埛鐧诲綍淇℃伅
+            updateLonginInfo(userInfo, 1, ipInfo);
+        } else {
+            userInfo = new UserInfo();
+            userInfo.setNickName(taoBaoUser.getNick());
+            userInfo.setPortrait(taoBaoUser.getAvatarUrl());
+            userInfo.setAppId(businessSystem.getAppid());
+            userInfo.setTaoBaoUid(taoBaoUser.getUserid());
+            userInfo.setOpenid(taoBaoUser.getOpenId());
+            userInfo.setLoginType(1);
+            userInfo.setState(UserInfo.STATE_NORMAL);
+            userInfo.setSystem(businessSystem.getSystem());
+            // 鍒涘缓鐢ㄦ埛
+            addUser(userInfo);
+            try {
+                // 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
+                userInfoExtraService.createUserInfoExtra(userInfo.getId());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return userInfo;
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public UserInfo loginPhoneNew(ProxyIP ipInfo, AcceptData acceptData, int loginType, String vcode, String
+            phone, String appId)
+            throws UserAccountException {
+        // 绌洪娓呯悊
+        if (phone == null || phone.trim().length() == 0) {
+            throw new UserAccountException(1, "璇疯緭鍏ユ墜鏈哄彿鐮�");
+        }
+        phone = phone.replaceAll(" ", "");
+
+        // 鑻规灉搴旂敤鍟嗗簵涓婄嚎娴嬭瘯鍙风爜
+        if ("17316780233".equalsIgnoreCase(phone) && "2581".equalsIgnoreCase(vcode)) {
+            ;
+        } else {
+            if (StringUtil.isNullOrEmpty(vcode)) {
+                throw new UserAccountException(1, "璇疯緭鍏ラ獙璇佺爜");
+            }
+
+            String oldVcode = redisManager.getSMSVCode(phone, SMSHistory.TYPE_LOGIN);
+            LogHelper.test("----------------------鐧诲綍楠岃瘉鐮侊細 " + oldVcode);
+            if (!Constant.IS_TEST)
+                if (StringUtil.isNullOrEmpty(oldVcode) || !oldVcode.equalsIgnoreCase(vcode)) {
+                    throw new UserAccountException(1, "楠岃瘉鐮侀敊璇紝閲嶆柊杈撳叆");
+                } else {// 楠岃瘉鐮佽緭鍏ユ纭�
+                    redisManager.clearSMSVCode(phone, SMSHistory.TYPE_LOGIN);
+                }
+        }
+
+        JSONObject logInfo = new JSONObject();
+        logInfo.put("appId", appId);
+        logInfo.put("phone", phone);
+        logInfo.put("loginType", loginType);
+        LogHelper.lgoinInfo(logInfo.toString());
+
+        // 鍒ゆ柇鎵嬫満鍙风爜鏄惁琚皝绂�
+        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);
+        }
+        // 娓呯┖闄愬埗
+        redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN);
+        // 娓呯悊娆℃暟
+        String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSLoginCount, phone);
+        redisManager.removeCommonString(key);
+
+        // 閲囩敤redis浜嬪姟闃叉涓�涓墜鏈哄彿澶氭娉ㄥ唽闂
+        String watchKey = StringUtil.Md5("REGISTER:" + phone);
+        Jedis jedis = redisManager.getJedis();
+        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, "璇风◢鍚庡啀璇�");
+            } else {
+                // 鏌ヨ鏄惁瀛樺湪璇ョ數璇濆巻鍙茬敤鎴�
+                UserInfo userInfo = userInfoService.getEffectiveUserInfoByPhone(phone, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
+                if (userInfo != null) {
+                    // 鏇存柊璐︽埛鐧诲綍淇℃伅
+                    updateLonginInfo(userInfo, loginType, ipInfo);
+                } else {
+                    // 缁戝畾寰俊
+                    String keylogin = RedisKeyEnum.getRedisKey(RedisKeyEnum.emptyKey, StringUtil.Md5("phoneLogin:" + phone));
+                    redisManager.cacheCommonString(keylogin, phone, 60 * 20);
+                    throw new UserAccountException(102, keylogin);
+                }
+                return userInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            jedis.del(watchKey);
+            jedis.unwatch();
+            jedis.close();
+        }
+        throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public UserInfo loginWeiXin(ProxyIP ipInfo, int loginType, String code,
+                                BusinessSystem businessSystem) throws UserAccountException {
+        // 鏃ュ織淇℃伅
+        JSONObject logInfo = new JSONObject();
+        logInfo.put("appId", businessSystem.getAppid());
+        logInfo.put("code", code);
+        logInfo.put("loginType", loginType);
+        LogHelper.lgoinInfo(logInfo.toString());
+
+        // 閫氳繃Code鎹㈠彇淇℃伅
+        WeiXinUser weiXinUser = WXAppLoginUtil.getWeiXinUser(code, businessSystem.getWxAppId(), businessSystem.getWxAppSecret());
+        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 = redisManager.getJedis();
+        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, "璇风◢鍚庡啀璇�");
+            } else {
+                UserInfo userInfo = userInfoService.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid(), businessSystem.getSystem());
+                // 鐩存帴鐢ㄧ殑寰俊鐧诲綍
+                if (userInfo != null) {
+                    LogHelper.test("寰俊unionID瀛樺湪:" + weiXinUser.getUnionid());
+                    // 鏇存柊璐︽埛鐧诲綍淇℃伅
+                    updateLonginInfo(userInfo, loginType, ipInfo);
+                    // 鍒犻櫎閭�璇峰垎浜浘
+                    spreadUserImgService.deleteImgUrl(userInfo.getId());
+                } else {
+                    LogHelper.test("寰俊unionID涓嶅瓨鍦�:" + weiXinUser.getUnionid());
+
+                    String portrait = null;
+                    if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
+                        InputStream asInputStream = HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl());
+                        if (asInputStream != null) {
+                            FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
+                                    String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg",
+                                            weiXinUser.getUnionid(), System.currentTimeMillis() + ""));
+                            if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
+                                portrait = result.getUrl();
+                        } else {
+                            portrait = weiXinUser.getHeadimgurl();
+                        }
+                    }
+
+                    if (StringUtil.isNullOrEmpty(portrait))
+                        portrait = userInfoService.getDefaultPortrait(businessSystem.getSystem());
+
+                    // 鍒涘缓鏂拌处鎴�
+                    userInfo = new UserInfo();
+                    userInfo.setPortrait(portrait);
+                    userInfo.setAppId(businessSystem.getAppid());
+                    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(loginType);
+                    userInfo.setLastLoginIp(ipInfo.getIp());
+                    userInfo.setState(UserInfo.STATE_NORMAL);
+                    userInfo.setSystem(businessSystem.getSystem());
+                    addUser(userInfo);
+
+                    try {
+                        // 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
+                        userInfoExtraService.createUserInfoExtra(userInfo.getId());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+
+                    userInfoModifyRecordService.addModifyRecord(userInfo.getId(), ModifyTypeEnum.bindWeiXin,
+                            weiXinUser.getUnionid());
+                }
+                return userInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            jedis.del(watchKey);
+            jedis.unwatch();
+            jedis.close();
+        }
+        throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public UserInfo loginWeiXinNew(ProxyIP ipInfo, int loginType, String wxCode,
+                                   BusinessSystem businessSystem) throws UserAccountException {
+        // 鏃ュ織淇℃伅
+        JSONObject logInfo = new JSONObject();
+        logInfo.put("appId", businessSystem.getAppid());
+        logInfo.put("wxCode", wxCode);
+        logInfo.put("loginType", loginType);
+        LogHelper.lgoinInfo(logInfo.toString());
+
+        // 閫氳繃Code鎹㈠彇淇℃伅
+        WeiXinUser weiXinUser = WXAppLoginUtil.getWeiXinUser(wxCode, businessSystem.getWxAppId(), businessSystem.getWxAppSecret());
+        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);
+        }
+
+        UserInfo userInfo = userInfoService.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid(), businessSystem.getSystem());
+        if (userInfo == null) {
+            String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.emptyKey,
+                    "WXLogin#" + StringUtil.Md5(weiXinUser.getUnionid()));
+            redisManager.cacheCommonString(key, JsonUtil.getSimpleGson().toJson(weiXinUser), 60 * 20);
+            throw new UserAccountException(UserAccountException.CODE_NEED_BIND_PHONE, key);
+        }
+        // 鏇存柊璐︽埛鐧诲綍淇℃伅
+        updateLonginInfo(userInfo, loginType, ipInfo);
+        Long uid = userInfo.getId();
+        ThreadUtil.run(new Runnable() {
+            public void run() {
+                // 鍒犻櫎閭�璇峰垎浜浘
+                spreadUserImgService.deleteImgUrl(uid);
+            }
+        });
+        return userInfo;
+    }
+
+    @Override
+    public UserInfo loginQQ(ProxyIP ipInfo, int loginType, QQUserInfoVO qqUserInfo, BusinessSystem businessSystem) throws UserAccountException {
+        // 閫氳繃Code鎹㈠彇淇℃伅
+        if (qqUserInfo == null) {
+            throw new UserAccountException(1, "QQ淇℃伅涓虹┖");
+        }
+
+        UserInfo userInfo = userInfoService.getEffectiveUserInfoByQQOpenId(qqUserInfo.getOpenid(), businessSystem.getSystem());
+        if (userInfo == null) {
+            String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.emptyKey,
+                    "QQLogin#" + StringUtil.Md5(qqUserInfo.getOpenid()));
+            redisManager.cacheCommonString(key, JsonUtil.getSimpleGson().toJson(qqUserInfo), 60 * 20);
+            throw new UserAccountException(UserAccountException.CODE_NEED_BIND_PHONE, key);
+        }
+        // 鏇存柊璐︽埛鐧诲綍淇℃伅
+        updateLonginInfo(userInfo, loginType, ipInfo);
+        Long uid = userInfo.getId();
+        ThreadUtil.run(new Runnable() {
+            public void run() {
+                // 鍒犻櫎閭�璇峰垎浜浘
+                spreadUserImgService.deleteImgUrl(uid);
+            }
+        });
+        return userInfo;
+    }
+
+    /**
+     * 鏇存柊璐︽埛鐧诲綍淇℃伅
+     *
+     * @param userInfo
+     * @param loginType
+     * @param ipInfo
+     */
+    private void updateLonginInfo(UserInfo userInfo, int loginType, ProxyIP ipInfo) {
+        // 璁剧疆鐧诲綍鏃堕棿涓庣櫥褰曠被鍨�
+        UserInfo updateUserInfo = new UserInfo(userInfo.getId());
+        updateUserInfo.setLastLoginTime(System.currentTimeMillis());
+        updateUserInfo.setLoginType(loginType);
+        updateUserInfo.setLastLoginIp(ipInfo.getIp());
+        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+    }
+
+    @Override
+    public void bindPhoneNew(Long uid, String phone) throws UserAccountException {
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null) {
+            throw new UserAccountException(1, "鐢ㄦ埛涓嶅瓨鍦�");
+        }
+
+        String hasPhone = user.getPhone();
+        if (!StringUtil.isNullOrEmpty(hasPhone) && hasPhone.equals(phone)) {
+            throw new UserAccountException(2, "鎮ㄥ凡缁忕粦瀹氫簡璇ョ數璇濆彿鐮�");
+        }
+
+        UserInfo phoneUser = userInfoService.getEffectiveUserInfoByPhone(phone, user.getSystem());
+        if (phoneUser != null) {
+            throw new UserAccountException(2, "鍙风爜宸茬粡琚崰鐢�");
+        }
+
+        // 鏇存柊鐢佃瘽鍙风爜
+        UserInfo update = new UserInfo(user.getId());
+        update.setPhone(phone);
+        userInfoService.updateByPrimaryKeySelective(update);
+        // 鍔犲叆缁戝畾璁板綍
+        UserAccountBindingHistory history = new UserAccountBindingHistory();
+        history.setContent(phone);
+        history.setType(UserAccountBindingHistory.TYPE_PHONE);
+        history.setUid(uid);
+
+        // 涔嬪墠宸茬粡缁戝畾鐢佃瘽鍙风爜
+        if (!StringUtil.isNullOrEmpty(user.getPhone()))
+            history.setFirst(false);
+        else
+            history.setFirst(true);
+        userAccountBindingHistoryService.addUserAccountBindingHistory(history);
+
+        // 鍙戦�佹秷鎭�
+        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
+
+        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, phone);
+
+    }
+
+    @Transactional(rollbackFor = UserAccountException.class)
+    @Override
+    public void bindWeiXin(BusinessSystem system, Long uid, String code) throws UserAccountException {
+        WeiXinUser weiXinUser = WXAppLoginUtil.getWeiXinUser(code, system.getWxAppId(), system.getWxAppSecret());
+        if (weiXinUser == null) {
+            throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
+        }
+
+        String wxUnionId = weiXinUser.getUnionid();
+        if (StringUtil.isNullOrEmpty(wxUnionId)) {
+            throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
+        }
+        bindWeiXin(uid, weiXinUser);
+    }
+
+    @Transactional(rollbackFor = UserAccountException.class)
+    @Override
+    public void bindWeiXin(Long uid, WeiXinUser weiXinUser) throws UserAccountException {
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null) {
+            throw new UserAccountException(1, "鐢ㄦ埛涓嶅瓨鍦�");
+        }
+
+        if (weiXinUser == null) {
+            throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
+        }
+
+        String wxUnionId = weiXinUser.getUnionid();
+        if (StringUtil.isNullOrEmpty(wxUnionId)) {
+            throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
+        }
+
+        String wxUnionIdExist = user.getWxUnionId();
+        if (StringUtil.isNullOrEmpty(wxUnionIdExist)) {
+            UserInfo newUser = userInfoService.getEffectiveUserInfoByWXUnionId(wxUnionId, user.getSystem());
+            if (newUser != null) {
+                throw new UserAccountException(4, "璇ュ井淇″彿宸茶鍏朵粬甯愬彿缁戝畾");
+            }
+        } else if (wxUnionId.equalsIgnoreCase(wxUnionIdExist)) {
+            throw new UserAccountException(3, "寰俊甯愬彿涓�鑷存棤闇�鏇存崲");
+        }
+
+        if (StringUtil.isNullOrEmpty(user.getPhone())) {
+            throw new UserAccountException(5, "璇ュ笎鍙锋病鏈夌粦瀹氭墜鏈哄彿鐮侊紝闇�缁戝畾鎵嬫満鍙风爜鎵嶈兘瀹屾垚寰俊鏇存崲");
+        }
+
+        UserInfo updateUserInfo = new UserInfo(uid);
+        updateUserInfo.setWxName(weiXinUser.getNickname());
+        updateUserInfo.setWxOpenId(weiXinUser.getOpenid());
+        updateUserInfo.setWxPic(weiXinUser.getHeadimgurl());
+        updateUserInfo.setWxUnionId(weiXinUser.getUnionid());
+
+        // 灏嗛粯璁ゆ樀绉版浛鎹㈡垚寰俊鏄电О
+        String defaultNickName = userInfoService.getDefaultNickName(user.getSystem(), user.getId());
+        if (!StringUtil.isNullOrEmpty(defaultNickName) && !StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
+            defaultNickName = defaultNickName + uid;
+            if ((defaultNickName.equals(user.getNickName()) || "鏉挎牀蹇渷".equals(user.getNickName()))) {
+                updateUserInfo.setNickName(weiXinUser.getNickname());
+            }
+        }
+
+        // 灏嗛粯璁ゅご鍍忔浛鎹㈡垚寰俊澶村儚
+        String defaultPortrait = userInfoService.getDefaultPortrait(user.getSystem());
+        if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl()) && !StringUtil.isNullOrEmpty(defaultPortrait)
+                && defaultPortrait.equals(user.getPortrait())) {
+            String headimgurl = weiXinUser.getHeadimgurl();
+            InputStream asInputStream = HttpUtil.getAsInputStream(headimgurl);
+            if (asInputStream == null) {
+                LogHelper.test("寰俊澶村儚涓嬭浇澶辫触: " + weiXinUser.getUnionid() + " " + headimgurl);
+            } else {
+                FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
+                        String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg", weiXinUser.getUnionid(),
+                                System.currentTimeMillis() + ""));
+                if (result != null && !StringUtil.isNullOrEmpty(result.getUrl())) {
+                    headimgurl = result.getUrl();
+                } else {
+                    LogHelper.test("寰俊澶村儚涓婁紶澶辫触: " + weiXinUser.getUnionid() + " " + headimgurl);
+                }
+            }
+            updateUserInfo.setPortrait(headimgurl);
+        }
+        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+
+        // 鍔犲叆缁戝畾璁板綍
+        UserAccountBindingHistory history = new UserAccountBindingHistory();
+        history.setContent(weiXinUser.getUnionid());
+        history.setType(UserAccountBindingHistory.TYPE_WX);
+        history.setUid(uid);
+
+        // 涔嬪墠宸茬粡缁戝畾鐢佃瘽鍙风爜
+        if (!StringUtil.isNullOrEmpty(user.getWxUnionId()))
+            history.setFirst(false);
+        else
+            history.setFirst(true);
+        userAccountBindingHistoryService.addUserAccountBindingHistory(history);
+
+        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_WX);
+
+        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, wxUnionId);
+    }
+
+    @Override
+    public void bindQQ(Long uid, QQUserInfoVO qqUser) throws UserAccountException {
+        UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid);
+        if (user == null) {
+            throw new UserAccountException(1, "鐢ㄦ埛涓嶅瓨鍦�");
+        }
+
+        if (qqUser == null || StringUtil.isNullOrEmpty(qqUser.getOpenid())) {
+            throw new UserAccountException(2, "qq鐢ㄦ埛淇℃伅涓虹┖");
+        }
+
+
+        String qqOpenIdExist = user.getQqOpenId();
+
+        if (StringUtil.isNullOrEmpty(qqOpenIdExist)) {
+            UserInfo newUser = userInfoService.getEffectiveUserInfoByQQOpenId(qqUser.getOpenid(), user.getSystem());
+            if (newUser != null) {
+                throw new UserAccountException(4, "璇Q鍙峰凡琚叾浠栧笎鍙风粦瀹�");
+            }
+        } else if (qqUser.getOpenid().equalsIgnoreCase(qqOpenIdExist)) {
+            throw new UserAccountException(3, "QQ甯愬彿涓�鑷存棤闇�鏇存崲");
+        }
+
+        if (StringUtil.isNullOrEmpty(user.getPhone())) {
+            throw new UserAccountException(5, "璇ュ笎鍙锋病鏈夌粦瀹氭墜鏈哄彿鐮侊紝闇�缁戝畾鎵嬫満鍙风爜鎵嶈兘瀹屾垚QQ鏇存崲");
+        }
+
+        UserInfo updateUserInfo = new UserInfo(uid);
+        updateUserInfo.setQqNickName(qqUser.getNickname());
+        updateUserInfo.setQqOpenId(qqUser.getOpenid());
+
+        // 灏嗛粯璁ゆ樀绉版浛鎹㈡垚寰俊鏄电О
+        String defaultNickName = userInfoService.getDefaultNickName(user.getSystem(), user.getId());
+        if (!StringUtil.isNullOrEmpty(defaultNickName) && !StringUtil.isNullOrEmpty(qqUser.getNickname())) {
+            defaultNickName = defaultNickName + uid;
+            if ((defaultNickName.equals(user.getNickName()) || "鏉挎牀蹇渷".equals(user.getNickName()))) {
+                updateUserInfo.setNickName(qqUser.getNickname());
+            }
+        }
+
+        // 灏嗛粯璁ゅご鍍忔浛鎹㈡垚QQ澶村儚
+        String defaultPortrait = userInfoService.getDefaultPortrait(user.getSystem());
+        if (!StringUtil.isNullOrEmpty(qqUser.getFigureurl_2()) && !StringUtil.isNullOrEmpty(defaultPortrait)
+                && defaultPortrait.equals(user.getPortrait())) {
+            String headimgurl = qqUser.getFigureurl_2();
+            updateUserInfo.setPortrait(headimgurl);
+        }
+        userInfoService.updateByPrimaryKeySelective(updateUserInfo);
+
+        // 鍔犲叆缁戝畾璁板綍
+        UserAccountBindingHistory history = new UserAccountBindingHistory();
+        history.setContent(qqUser.getOpenid());
+        history.setType(UserAccountBindingHistory.TYPE_QQ);
+        history.setUid(uid);
+
+        // 涔嬪墠宸茬粡缁戝畾鐢佃瘽鍙风爜
+        if (!StringUtil.isNullOrEmpty(user.getQqOpenId()))
+            history.setFirst(false);
+        else
+            history.setFirst(true);
+        userAccountBindingHistoryService.addUserAccountBindingHistory(history);
+
+        userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_QQ);
+
+        userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindQQ, user.getQqOpenId());
+    }
+
+    @Override
+    public UserInfo bindPhoneToLogin(ProxyIP ipinfo, AcceptData acceptData, String phone, String key)
+            throws UserAccountException {
+
+        // 鍒ゆ柇鎵嬫満鍙风爜鏄惁琚皝绂�
+        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);
+
+        int loginType = 0;
+        String loginName = "";
+        if (key.contains("QQLogin#")) {
+            //qq鐧诲綍
+            loginType = 4;
+            loginName = "QQ";
+        } else {
+            //寰俊鐧诲綍
+            loginType = 2;
+            loginName = "寰俊";
+        }
+
+
+        String value = redisManager.getCommonString(key);
+        if (StringUtil.isNullOrEmpty(value))
+            throw new UserAccountException(1, String.format("%s鎺堟潈澶辨晥锛岃浣跨敤%s閲嶆柊鐧诲綍", loginName, loginName));
+
+        SystemEnum system = SystemInfoUtil.getSystem(acceptData);
+        String thirdPortrait;
+        String thirdCode;
+        String thirdNickName;
+        QQUserInfoVO qqUser = null;
+        WeiXinUser weiXinUser = null;
+        if (loginType == 4) {
+            qqUser = JsonUtil.getSimpleGson().fromJson(value, QQUserInfoVO.class);
+
+            if (qqUser == null)
+                throw new UserAccountException(1, "QQ鎺堟潈澶辨晥锛岃浣跨敤QQ閲嶆柊鎺堟潈鐧诲綍");
+
+            thirdPortrait = qqUser.getFigureurl_2();
+            thirdCode = qqUser.getOpenid();
+            thirdNickName = qqUser.getNickname();
+
+            UserInfo userInfo = userInfoService.getEffectiveUserInfoByQQOpenId(qqUser.getOpenid(), system);
+            // 鐩存帴鐢ㄧ殑QQ鐧诲綍
+            if (userInfo != null)
+                throw new UserAccountException(10, "璇Q鍙峰凡琚崰鐢�");
+
+        } else {
+            weiXinUser = JsonUtil.getSimpleGson().fromJson(value, WeiXinUser.class);
+            if (weiXinUser == null)
+                throw new UserAccountException(1, "涓夋柟鎺堟潈澶辨晥锛岃浣跨敤涓夋柟閲嶆柊鎺堟潈鐧诲綍");
+
+            thirdPortrait = weiXinUser.getHeadimgurl();
+            thirdCode = weiXinUser.getUnionid();
+            thirdNickName = weiXinUser.getNickname();
+
+            UserInfo userInfo = userInfoService.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid(), system);
+            // 鐩存帴鐢ㄧ殑寰俊鐧诲綍
+            if (userInfo != null)
+                throw new UserAccountException(10, "璇ュ井淇″彿宸茶鍗犵敤");
+        }
+
+        String portrait = null;
+        if (!StringUtil.isNullOrEmpty(thirdPortrait)) {
+            InputStream asInputStream = HttpUtil.getAsInputStream(thirdPortrait);
+            if (asInputStream != null) {
+                String path = "";
+                if (loginType == 4) {
+                    path = String.format(FilePathEnum.userQQPortrait.getPath() + "%s_%s.jpg", thirdCode,
+                            System.currentTimeMillis() + "");
+                } else {
+                    path = String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg", thirdCode,
+                            System.currentTimeMillis() + "");
+                }
+
+                FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream, path);
+                if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
+                    portrait = result.getUrl();
+            } else {
+                portrait = thirdPortrait;
+            }
+        }
+
+        if (StringUtil.isNullOrEmpty(portrait)) {
+            portrait = userInfoService.getDefaultPortrait(system);
+        }
+        // 鏄惁闇�瑕佸垱寤烘柊璐︽埛
+        UserInfo phoneUser = userInfoService.getEffectiveUserInfoByPhone(phone, system);
+        UserInfo userInfo = null;
+        if (phoneUser != null) {
+            // 缁戝畾寰俊
+            if (weiXinUser != null) {
+                if (StringUtil.isNullOrEmpty(phoneUser.getWxUnionId())) {
+                    try {
+                        bindWeiXin(phoneUser.getId(), weiXinUser);
+                    } catch (Exception e) {
+                        throw new UserAccountException(1, "寰俊缁戝畾澶辫触");
+                    }
+                } else {
+                    throw new UserAccountException(1, "璇ュ井淇″凡琚粦瀹�");
+                }
+            }
+            if (qqUser != null) {
+                if (StringUtil.isNullOrEmpty(phoneUser.getQqOpenId())) {
+                    try {
+                        bindQQ(phoneUser.getId(), qqUser);
+                    } catch (Exception e) {
+                        throw new UserAccountException(1, "QQ缁戝畾澶辫触");
+                    }
+                } else {
+                    throw new UserAccountException(1, "璇Q宸茶缁戝畾");
+                }
+            }
+
+            userInfo = userInfoService.selectAvailableByPrimaryKey(phoneUser.getId());
+        } else {
+            // 鍒涘缓鏂拌处鎴�
+            userInfo = new UserInfo();
+            userInfo.setPhone(phone);
+            userInfo.setPortrait(portrait);
+            userInfo.setAppId(null);
+            if (weiXinUser != null) {
+                userInfo.setNickName(weiXinUser.getNickname());
+                userInfo.setWxName(weiXinUser.getNickname());
+                userInfo.setWxOpenId(weiXinUser.getOpenid());
+                userInfo.setWxUnionId(weiXinUser.getUnionid());
+                userInfo.setWxPic(weiXinUser.getHeadimgurl());
+                userInfo.setLoginType(2);
+            }
+
+            if (qqUser != null) {
+                userInfo.setQqOpenId(qqUser.getOpenid());
+                userInfo.setQqNickName(qqUser.getNickname());
+                userInfo.setLoginType(4);
+            }
+            userInfo.setLastLoginTime(System.currentTimeMillis());
+            userInfo.setLastLoginIp(ipinfo.getIp());
+            userInfo.setState(UserInfo.STATE_NORMAL);
+            userInfo.setSystem(system);
+            addUser(userInfo);
+        }
+
+        Long uid = userInfo.getId();
+        final WeiXinUser tempWeiXinUser = weiXinUser;
+        final QQUserInfoVO tempQQUser = qqUser;
+        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);
+                if (tempWeiXinUser != null)
+                    userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, tempWeiXinUser.getUnionid());
+                if (tempQQUser != null)
+                    userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindQQ, tempQQUser.getOpenid());
+            }
+        });
+        // 鍒犻櫎缂撳瓨
+        redisManager.removeCommonString(key);
+
+        return userInfo;
+    }
+
+
+    @Override
+    public UserInfo bindWXToLogin(ProxyIP ipInfo, AcceptData acceptData, String code, String appId, String key) throws
+            UserAccountException {
+        // 鏃ュ織淇℃伅
+        JSONObject logInfo = new JSONObject();
+        logInfo.put("appId", appId);
+        logInfo.put("code", code);
+        logInfo.put("loginType", 2);
+        LogHelper.lgoinInfo(logInfo.toString());
+
+        SystemEnum system = SystemInfoUtil.getSystem(acceptData);
+
+        // 閫氳繃Code鎹㈠彇淇℃伅
+        WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
+        WeiXinUser weiXinUser = WXAppLoginUtil.getWeiXinUser(code, 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);
+        }
+
+        String phone = redisManager.getCommonString(key);
+        if (StringUtil.isNullOrEmpty(phone))
+            throw new UserAccountException(1, "鎵嬫満鍙风櫥褰曞け鏁堬紝璇蜂娇鍙戦�佺煭淇$櫥褰�");
+
+        // 閲囩敤redis浜嬪姟闃叉涓�涓井淇″彿澶氭娉ㄥ唽闂
+        String watchKey = StringUtil.Md5("REGISTER:" + weiXinUser.getUnionid());
+        Jedis jedis = redisManager.getJedis();
+        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, "璇风◢鍚庡啀璇�");
+            } else {
+
+                UserInfo userInfo = userInfoService.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid(), system);
+                // 鐩存帴鐢ㄧ殑寰俊鐧诲綍
+                if (userInfo != null) {
+                    // 缁戝畾寰俊
+                    if (!StringUtil.isNullOrEmpty(userInfo.getPhone()) && !phone.equals(userInfo.getPhone().trim())) {
+                        throw new UserAccountException(1, "璇ュ井淇″凡琚粦瀹�");
+                    }
+                    // 鍒犻櫎閭�璇峰垎浜浘
+                    //spreadUserImgService.deleteImgUrl(userInfo.getId());
+                } else {
+                    LogHelper.test("寰俊unionID涓嶅瓨鍦�:" + weiXinUser.getUnionid());
+
+                    String portrait = null;
+                    if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
+                        InputStream asInputStream = HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl());
+                        if (asInputStream != null) {
+                            FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
+                                    String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg",
+                                            weiXinUser.getUnionid(), System.currentTimeMillis() + ""));
+                            if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
+                                portrait = result.getUrl();
+                        } else {
+                            portrait = weiXinUser.getHeadimgurl();
+                        }
+                    }
+
+                    if (StringUtil.isNullOrEmpty(portrait)) {
+                        portrait = userInfoService.getDefaultPortrait(system);
+                    }
+                    // 鍒涘缓鏂拌处鎴�
+                    userInfo = new UserInfo();
+                    userInfo.setPhone(phone);
+                    userInfo.setPortrait(portrait);
+                    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(ipInfo.getIp());
+                    userInfo.setState(UserInfo.STATE_NORMAL);
+                    userInfo.setSystem(system);
+                    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());
+                        }
+                    });
+                }
+                return userInfo;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            jedis.del(watchKey);
+            jedis.unwatch();
+            jedis.close();
+        }
+        throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
+    }
+
+    @Override
+    public void forbiddenUserAll(Long uid, String reason) {
+        UserInfo currentInfo = userInfoService.selectByPKey(uid);
+        if (currentInfo == null) {
+            return;
+        }
+        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
+            return;
+        }
+
+        currentInfo.setState(UserInfo.STATE_FORBIDDEN);
+        currentInfo.setStateDesc(reason);
+        userInfoService.updateByPrimaryKeySelective(currentInfo);
+
+        // 鎻掑叆璁板綍
+        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_FORBIDDEN, reason);
+
+        // 鍔犲叆灏佺鐨勮处鍙峰垪琛�
+        ForbiddenUserIdentifyCode forbiddenUserIdentifyCode = new ForbiddenUserIdentifyCode();
+        forbiddenUserIdentifyCode.setType(ForbiddenUserIdentifyCodeTypeEnum.wxUnionId);
+        forbiddenUserIdentifyCode.setIdentifyCode(currentInfo.getWxUnionId());
+        forbiddenUserIdentifyCode.setBeiZhu(currentInfo.getWxName());
+        try {
+            forbiddenUserIdentifyCodeService.forbiddenIdentifyCode(forbiddenUserIdentifyCode);
+        } catch (ForbiddenUserIdentifyCodeException e) {
+            e.printStackTrace();
+        }
+
+        // 鐢佃瘽鍙风爜
+        forbiddenUserIdentifyCode = new ForbiddenUserIdentifyCode();
+        forbiddenUserIdentifyCode.setType(ForbiddenUserIdentifyCodeTypeEnum.phone);
+        forbiddenUserIdentifyCode.setIdentifyCode(currentInfo.getPhone());
+        try {
+            forbiddenUserIdentifyCodeService.forbiddenIdentifyCode(forbiddenUserIdentifyCode);
+        } catch (ForbiddenUserIdentifyCodeException e) {
+            e.printStackTrace();
+        }
+
+        // 娣樺疂
+        UserExtraTaoBaoInfo taoBao = userExtraTaoBaoInfoService.getByUid(uid);
+        if (taoBao != null && !StringUtil.isNullOrEmpty(taoBao.getTaoBaoUid())) {
+            forbiddenUserIdentifyCode = new ForbiddenUserIdentifyCode();
+            forbiddenUserIdentifyCode.setType(ForbiddenUserIdentifyCodeTypeEnum.taobaoUid);
+            forbiddenUserIdentifyCode.setIdentifyCode(taoBao.getTaoBaoUid());
+            try {
+                forbiddenUserIdentifyCodeService.forbiddenIdentifyCode(forbiddenUserIdentifyCode);
+            } catch (ForbiddenUserIdentifyCodeException e) {
+                e.printStackTrace();
+            }
+        }
+
+        // 鏌ヨ鏀粯瀹濈粦瀹�
+        List<BindingAccount> list = bindingAccountService.getBindingAccountByUid(uid);
+        if (list != null) {
+            for (BindingAccount ba : list) {
+                forbiddenUserIdentifyCode = new ForbiddenUserIdentifyCode();
+                forbiddenUserIdentifyCode.setType(ForbiddenUserIdentifyCodeTypeEnum.alipayAccount);
+                forbiddenUserIdentifyCode.setIdentifyCode(ba.getAccount());
+                forbiddenUserIdentifyCode.setBeiZhu(ba.getName());
+                try {
+                    forbiddenUserIdentifyCodeService.forbiddenIdentifyCode(forbiddenUserIdentifyCode);
+                } catch (ForbiddenUserIdentifyCodeException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @Override
+    public void unRegisterUser(Long uid,String reason) {
+        UserInfo currentInfo = userInfoService.selectByPKey(uid);
+        if (currentInfo == null) {
+            return;
+        }
+        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
+            return;
+        }
+
+        currentInfo.setState(UserInfo.STATE_FORBIDDEN);
+        currentInfo.setStateDesc(reason);
+        userInfoService.updateByPrimaryKeySelective(currentInfo);
+
+        // 鎻掑叆璁板綍
+        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_DELETE, reason);
+    }
+
+    @Override
+    public void forbiddenUser(Long uid, String reason) {
+        UserInfo currentInfo = userInfoService.selectByPKey(uid);
+        if (currentInfo == null) {
+            return;
+        }
+
+        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
+            return;
+        }
+
+        currentInfo.setState(UserInfo.STATE_FORBIDDEN);
+        currentInfo.setStateDesc(reason);
+        userInfoService.updateByPrimaryKeySelective(currentInfo);
+
+        // 鎻掑叆璁板綍
+        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_FORBIDDEN, reason);
+    }
+
+    @Override
+    public void DeleteUser(Long uid, String reason) {
+        UserInfo currentInfo = userInfoService.selectByPKey(uid);
+        if (currentInfo == null) {
+            return;
+        }
+
+        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
+            return;
+        }
+
+        currentInfo.setState(UserInfo.STATE_DELETE);
+        currentInfo.setStateDesc(reason);
+        userInfoService.updateByPrimaryKeySelective(currentInfo);
+        // 鎻掑叆璁板綍
+        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_DELETE, reason);
+    }
+
+    @Override
+    public void DeleteUserOutOfDate(Long uid, String reason) {
+        UserInfo currentInfo = userInfoService.selectByPKey(uid);
+        if (currentInfo == null) {
+            return;
+        }
+
+        if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
+            return;
+        }
+
+        currentInfo.setState(UserInfo.STATE_DELETE_OUT_OF_DATE);
+        currentInfo.setStateDesc(reason);
+        userInfoService.updateByPrimaryKeySelective(currentInfo);
+        // 鎻掑叆璁板綍
+        userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_DELETE_OUT_OF_DATE, reason);
+    }
+
+}

--
Gitblit v1.8.0