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 | 3473 ++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 1,896 insertions(+), 1,577 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 f04b8c3..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,1577 +1,1896 @@
-package com.yeshi.fanli.service.impl.user;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-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.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.AccountMessageMapper;
-import com.yeshi.fanli.dao.mybatis.UserConnectHistoryMapper;
-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.ThreeSale;
-import com.yeshi.fanli.entity.bus.user.UserAccountBindingHistory;
-import com.yeshi.fanli.entity.bus.user.UserConnectHistory;
-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.Constant;
-import com.yeshi.fanli.util.FileUtil;
-import com.yeshi.fanli.util.RedisManager;
-import com.yeshi.fanli.util.StringUtil;
-import com.yeshi.fanli.util.ThreadUtil;
-import com.yeshi.fanli.util.TimeUtil;
-import com.yeshi.fanli.util.factory.msg.MsgAccountDetailFactory;
-import com.yeshi.fanli.util.wx.WXLoginUtil;
-
-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 UserConnectHistoryMapper userConnectHistoryMapper;
-
-	@Resource
-	private ThreeSaleSerivce threeSaleSerivce;
-
-	@Resource
-	private AccountMessageMapper accountMessageMapper;
-
-	@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(appId, tbUserInfo.getOpenid());
-				// 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-				if (userInfo != null && userInfo.getState() != null
-						&& (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
-								|| userInfo.getState() == UserInfo.STATE_DELETE))
-					userInfo = null;
-				if (userInfo == null) {// 鍘熷厛鐨勮处鍙蜂笉瀛樺湪
-					userInfo = new UserInfo();
-					userInfo.setAppId(appId);
-					userInfo.setTbName(tbUserInfo.getTbName());
-					userInfo.setOpenid(tbUserInfo.getOpenid());
-					userInfo.setTbPic(tbUserInfo.getTbPic());
-					userInfo.setNickName(tbUserInfo.getNickName());
-					userInfo.setPortrait(tbUserInfo.getPortrait());
-					userInfo.setLoginType(loginType);
-					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(appId, weiXinUser.getUnionid());
-				// 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-				if (userInfo != null && userInfo.getState() != null
-						&& (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
-								|| userInfo.getState() == UserInfo.STATE_DELETE))
-					userInfo = null;
-				// 鐩存帴鐢ㄧ殑寰俊鐧诲綍
-				if (lastUser == null) {
-					if (userInfo != null) {
-						// 浣垮垎閿�鍏崇郴鐢熸晥
-						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());
-
-						userInfoMapper.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());
-					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());
-							userInfoMapper.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());
-						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(appId, phone);
-				// 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-				if (userInfo != null && userInfo.getState() != null
-						&& (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
-								|| userInfo.getState() == UserInfo.STATE_DELETE))
-					userInfo = null;
-
-				if (userInfo == null) {// 鍘熷厛鐨勮处鍙蜂笉瀛樺湪
-					userInfo = new UserInfo();
-					userInfo.setAppId(appId);
-					userInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
-					userInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
-					userInfo.setPhone(phone);
-					userInfo.setLoginType(loginType);
-					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(appId, 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(appId, weiXinUser.getUnionid());
-			break;
-		case 3:// 鎵嬫満鍙风爜
-				// 鍒ゆ柇鏄惁琚皝绂�
-			ForbiddenUserIdentifyCode identifyCode1 = forbiddenUserIdentifyCodeService
-					.listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, phone);
-			if (identifyCode1 != null && identifyCode1.getEffective() != null && identifyCode1.getEffective())
-				throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
-			userInfo = getUserInfoByPhone(appId, phone);
-			break;
-		}
-
-		// 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-		if (userInfo != null && userInfo.getState() != null && (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
-				|| userInfo.getState() == UserInfo.STATE_DELETE))
-			userInfo = null;
-
-		if (userInfo != null) {
-			UserInfo updateUserInfo = new UserInfo(userInfo.getId());
-			updateUserInfo.setLastLoginTime(System.currentTimeMillis());
-			userInfoMapper.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;
-			}
-			return new LoginResult(LoginResult.TYPE_CREATE, userInfo);
-		}
-	}
-
-	@Override
-	public void connectUsers(HttpSession session) throws UserAccountException {
-		UserInfo mainUser = (UserInfo) session.getAttribute("WEIXIN_USERINFO");
-		UserInfo lessUser = (UserInfo) session.getAttribute("LAST_LOGIN_USER");
-
-		int lessUserLoginType = lessUser.getLoginType();
-
-		if (mainUser == null || lessUser == null || mainUser.getId() == null || lessUser.getId() == null)
-			throw new UserAccountException(30001, "缂哄皯鎵撻�氳处鍙�");
-
-		mainUser = userInfoMapper.selectByPrimaryKeyForUpdate(mainUser.getId());
-		lessUser = userInfoMapper.selectByPrimaryKeyForUpdate(lessUser.getId());
-
-		session.removeAttribute("WEIXIN_USERINFO");
-		session.removeAttribute("LAST_LOGIN_USER");
-
-		if (mainUser == null || lessUser == null)
-			throw new UserAccountException(30002, "缂哄皯鎵撻�氳处鍙�");
-
-		// 鍒ゆ柇鏄惁鏈夌粦瀹氱浉鍚岀被鍨嬬殑璐﹀彿
-		if (lessUserLoginType == 1) {// 娆¤处鍙蜂互娣樺疂鐧诲綍
-			if (!StringUtil.isNullOrEmpty(mainUser.getPhone()) && !StringUtil.isNullOrEmpty(lessUser.getPhone())
-					&& !lessUser.getPhone().equalsIgnoreCase(mainUser.getPhone()))
-				throw new UserAccountException(30003, "璇峰厛瑙i櫎鍏朵腑涓�涓处鍙风殑鎵嬫満缁戝畾");
-
-		} else if (lessUserLoginType == 3) {// 娆¤处鍙蜂互鎵嬫満鍙风櫥褰�
-			if (!StringUtil.isNullOrEmpty(mainUser.getOpenid()) && !StringUtil.isNullOrEmpty(lessUser.getOpenid())
-					&& !lessUser.getOpenid().equalsIgnoreCase(mainUser.getOpenid()))
-				throw new UserAccountException(30003, "璇峰厛瑙i櫎鍏朵腑涓�涓处鍙风殑娣樺疂缁戝畾");
-		}
-		connectUsers(mainUser, lessUser);
-	}
-
-	@Transactional(rollbackFor=Exception.class)
-	@Override
-	public void connectUsers(UserInfo mainUser, UserInfo lessUser) throws UserAccountException {
-		mainUser = userInfoMapper.selectByPrimaryKeyForUpdate(mainUser.getId());
-		lessUser = userInfoMapper.selectByPrimaryKeyForUpdate(lessUser.getId());
-
-		if (!StringUtil.isNullOrEmpty(mainUser.getOpenid()) && !StringUtil.isNullOrEmpty(lessUser.getOpenid()))
-			throw new UserAccountException(9, "涓や釜璐﹀彿閮界粦瀹氫簡娣樺疂锛岃瑙g粦鍏朵腑涓�涓�");
-
-		if (!StringUtil.isNullOrEmpty(mainUser.getPhone()) && !StringUtil.isNullOrEmpty(lessUser.getPhone()))
-			throw new UserAccountException(9, "涓や釜璐﹀彿閮界粦瀹氫簡鎵嬫満鍙风爜锛岃瑙g粦鍏朵腑涓�涓�");
-
-		if (lessUser.getMyHongBao().compareTo(new BigDecimal("10")) >= 0
-				&& mainUser.getMyHongBao().compareTo(new BigDecimal("10")) > 0)
-			throw new UserAccountException(10, String.format("璐︽埛ID:%s 鐨勮祫閲戣秴杩�10鍏冿紝涓轰繚璇佽祫閲戝畨鍏ㄨ鑱旂郴瀹㈡湇鎵撻��", lessUser.getId() + ""));
-
-		// 鍒ゅ畾鏄惁缁戝畾浜嗗悓涓�鏀粯瀹�
-		BindingAccount mainUserAccount = bindingAccountService.getBindingAccountByUidAndType(mainUser.getId(),
-				BindingAccount.TYPE_ALIPAY);
-
-		BindingAccount lessUserAccount = bindingAccountService.getBindingAccountByUidAndType(lessUser.getId(),
-				BindingAccount.TYPE_ALIPAY);
-
-		// 鏈変笉鍚岀殑鏀粯瀹濊处鍙�
-		boolean hasDiffrentAlipayAccount = false;
-		if (mainUserAccount != null && lessUserAccount != null) {
-			if (!mainUserAccount.getAccount().equalsIgnoreCase(lessUserAccount.getAccount()))
-				hasDiffrentAlipayAccount = true;
-		}
-
-		if (hasDiffrentAlipayAccount)
-			throw new UserAccountException(10, "涓や釜璐︽埛閮界粦瀹氫簡鏀粯瀹濓紝璇峰厛瑙g粦鍏朵腑涓�涓�");
-
-		// 鍒ゅ畾鏄惁鏈夐噸鍙犵殑璐﹀彿
-		UserInfo updateUser = new UserInfo(mainUser.getId());
-		if (!StringUtil.isNullOrEmpty(lessUser.getOpenid())) {
-			updateUser.setOpenid(lessUser.getOpenid());
-			updateUser.setTbName(lessUser.getTbName());
-			updateUser.setTbPic(lessUser.getTbPic());
-		}
-
-		if (!StringUtil.isNullOrEmpty(lessUser.getPhone())) {
-			updateUser.setPhone(lessUser.getPhone());
-		}
-
-		// 澶囦唤鍘熸潵鐨勭敤鎴蜂俊鎭�
-		String logUrl = backupUserImportantInfo(lessUser.getId());
-
-		// 娣诲姞鎵撻�氳褰�
-		UserConnectHistory userConnectHistory = new UserConnectHistory();
-		userConnectHistory.setCreateTime(new Date());
-		userConnectHistory.setLessUser(lessUser);
-		userConnectHistory.setMainUser(mainUser);
-		userConnectHistory.setLogUrl(logUrl);
-		userConnectHistoryMapper.insertSelective(userConnectHistory);
-
-		userInfoMapper.updateByPrimaryKeySelective(updateUser);
-		// 鍒犻櫎鍘熸潵鐨勮处鍙�
-		UserInfo updateLessUser = new UserInfo(lessUser.getId());
-		updateLessUser.setState(UserInfo.STATE_DELETE);
-		updateLessUser.setStateDesc("璐﹀彿琚墦閫氬垹闄�");
-		userInfoMapper.updateByPrimaryKeySelective(updateLessUser);
-		// 铻嶅悎涓氬姟
-		userInfoMapper.connectUser(mainUser.getId(), lessUser.getId());
-
-		// 鏌ヨ鏄惁鏈夊浣欑殑鏂颁汉绾㈠寘
-		int subCount = 0;
-		int addCount = 0;
-
-		userAccountMsgNotificationService.connectSuccess(mainUser.getId(), lessUser.getId());
-
-		userInfoDeleteRecordService.addDeleteRecord(lessUser.getId(), UserInfo.STATE_DELETE, "鍒犻櫎锛氳处鍙疯鎵撻�氬垹闄�");
-	}
-
-	/**
-	 * 鏍规嵁绯荤粺涓巙nionid瀵绘壘鐢ㄦ埛
-	 * 
-	 * @param appId
-	 * @param unionId
-	 * @return
-	 */
-	@Override
-	public UserInfo getUserInfoByWXUnionId(String appId, String unionId) throws UserAccountException {
-		if (StringUtil.isNullOrEmpty(appId))
-			throw new UserAccountException(1, "appId涓虹┖");
-		if (StringUtil.isNullOrEmpty(unionId))
-			throw new UserAccountException(2, "unionId涓虹┖");
-
-		List<UserInfo> list = userInfoMapper.listByAppIdAndWXUnionId(appId, unionId);
-		// 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
-		for (int i = 0; i < list.size(); i++) {
-			if (list.get(i).getState() == UserInfo.STATE_DELETE
-					|| list.get(i).getState() == UserInfo.STATE_DELETE_OUT_OF_DATE) {
-				list.remove(i);
-				i--;
-			}
-		}
-		if (list.size() > 0)
-			return list.get(list.size() - 1);
-		else
-			return null;
-	}
-
-	/**
-	 * 鏍规嵁绯荤粺鍜屾窐瀹濈殑Openid瀵绘壘鐢ㄦ埛
-	 * 
-	 * @param appId
-	 * @param openId
-	 * @return
-	 */
-	public UserInfo getUserInfoByTaoBaoOpenId(String appId, String openId) throws UserAccountException {
-		if (StringUtil.isNullOrEmpty(appId))
-			throw new UserAccountException(1, "appId涓虹┖");
-		if (StringUtil.isNullOrEmpty(openId))
-			throw new UserAccountException(2, "openId涓虹┖");
-		List<UserInfo> list = userInfoMapper.listByAppIdAndTaoBaoOpenId(appId, openId);
-
-		// 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
-		for (int i = 0; i < list.size(); i++) {
-			if (list.get(i).getState() == UserInfo.STATE_DELETE
-					|| list.get(i).getState() == UserInfo.STATE_DELETE_OUT_OF_DATE) {
-				list.remove(i);
-				i--;
-			}
-		}
-		if (list.size() > 0)
-			return list.get(list.size() - 1);
-		else
-			return null;
-
-	}
-
-	/**
-	 * 鏍规嵁绯荤粺鍜岀數璇濆彿鐮佸鎵剧敤鎴�
-	 * 
-	 * @param appId
-	 * @param phone
-	 * @return
-	 */
-	public UserInfo getUserInfoByPhone(String appId, String phone) throws UserAccountException {
-		if (StringUtil.isNullOrEmpty(appId))
-			throw new UserAccountException(1, "appId涓虹┖");
-		if (StringUtil.isNullOrEmpty(phone))
-			throw new UserAccountException(2, "phone涓虹┖");
-		List<UserInfo> list = userInfoMapper.listByAppIdAndPhone(appId, phone);
-
-		// 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
-		for (int i = 0; i < list.size(); i++) {
-			if (list.get(i).getState() == UserInfo.STATE_DELETE
-					|| list.get(i).getState() == UserInfo.STATE_DELETE_OUT_OF_DATE) {
-				list.remove(i);
-				i--;
-			}
-		}
-		if (list.size() > 0)
-			return list.get(list.size() - 1);
-		else
-			return null;
-
-	}
-
-	private void updateLatestLoginTime(Long uid) {
-		UserInfo userInfo = new UserInfo(uid);
-		userInfo.setLastLoginTime(System.currentTimeMillis());
-		userInfoMapper.updateByPrimaryKeySelective(userInfo);
-	}
-
-	@Transactional(rollbackFor=Exception.class)
-	@Override
-	public void register(UserInfo userInfo) throws UserAccountException {
-		if (!StringUtil.isNullOrEmpty(userInfo.getPhone())) {
-			UserInfo user = getUserInfoByPhone(userInfo.getAppId(), userInfo.getPhone());
-			if (user != null)
-				throw new UserAccountException(50001, "鐢佃瘽鍙风爜宸茬粡琚粦瀹�");
-		}
-
-		if (!StringUtil.isNullOrEmpty(userInfo.getOpenid())) {
-			UserInfo user = getUserInfoByTaoBaoOpenId(userInfo.getAppId(), userInfo.getOpenid());
-			if (user != null)
-				throw new UserAccountException(50002, "娣樺疂鍙峰凡缁忚缁戝畾");
-		}
-
-		if (!StringUtil.isNullOrEmpty(userInfo.getWxUnionId())) {
-			UserInfo user = getUserInfoByWXUnionId(userInfo.getAppId(), userInfo.getWxUnionId());
-			if (user != null)
-				throw new UserAccountException(50003, "寰俊鍙峰凡缁忚娉ㄥ唽");
-		}
-
-		addUser(userInfo);
-	}
-
-	@Transactional
-	@Override
-	public void addUser(UserInfo user) {
-
-		Long maxUid = userInfoMapper.getMaxUid();
-		if (maxUid == null)
-			maxUid = 100000L;
-		long dd = (long) (Math.random() * 100);
-		if (dd == 0) {
-			dd = 1;
-		}
-		long uid = maxUid + dd;
-		user.setId(uid);
-		user.setCreatetime(System.currentTimeMillis());
-		user.setRank(0);
-		if (StringUtil.isNullOrEmpty(user.getPortrait()))
-			user.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
-		userInfoMapper.insertSelective(user);
-
-		// 鏄电О涓虹┖鏃� 榛樿鏄电О
-		if (StringUtil.isNullOrEmpty(user.getNickName())) {
-			UserInfo updateUserInfo = new UserInfo(user.getId());
-			updateUserInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName() + user.getId());
-			userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
-		}
-
-		try {
-			// 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
-			userInfoExtraService.createUserInfoExtra(user.getId());
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		// 娣诲姞璐﹀彿缁戝畾鍘嗗彶
-		if (!StringUtil.isNullOrEmpty(user.getPhone()))
-			userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, user.getPhone());
-
-		if (!StringUtil.isNullOrEmpty(user.getWxUnionId()))
-			userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, user.getWxUnionId());
-	}
-
-	@Override
-	public void updateUserSelective(UserInfo user) {
-		userInfoMapper.updateByPrimaryKeySelective(user);
-	}
-
-	@Override
-	public void bindPhone(Long uid, String phone) throws UserAccountException {
-		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
-		if (user == null)
-			throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
-
-		if (!StringUtil.isNullOrEmpty(user.getPhone()))
-			throw new UserAccountException(5, "褰撳墠璐﹀彿宸茬粡缁戝畾浜嗘墜鏈哄彿锛岃鍏堣В缁�");
-
-		UserInfo phoneUser = getUserInfoByPhone(user.getAppId(), phone);
-		if (phoneUser != null)
-			throw new UserAccountException(6, "褰撳墠鐢佃瘽鍙风爜宸茬粡琚粦瀹�");
-
-		UserInfo update = new UserInfo(user.getId());
-		update.setPhone(phone);
-		userInfoMapper.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 = userInfoMapper.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("");
-		userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
-		userAccountMsgNotificationService.unBindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
-	}
-
-	@Override
-	public void bindTaoBao(Long uid, String tbOpenId, String tbNickName, String tbPortrait)
-			throws UserAccountException {
-		UserInfo user = userInfoMapper.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.getAppId(), 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);
-		}
-		userInfoMapper.updateByPrimaryKeySelective(update);
-
-		userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_TB);
-	}
-
-	@Override
-	public void unBindTaoBao(Long uid) throws UserAccountException {
-		UserInfo user = userInfoMapper.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());
-		}
-
-		userInfoMapper.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 = userInfoMapper.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.getAppId(), 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());
-		}
-
-		userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
-
-		userAccountMsgNotificationService.changeBindingSuccess(uid, MsgAccountDetailFactory.TYPE_WX);
-
-		userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, weiXinUser.getUnionid());
-	}
-
-	@Override
-	public String backupUserImportantInfo(Long uid) {
-
-		String logPath = String.format(FileUtil.getCacheDir() + "/benfen_%s_" + uid + ".log",
-				TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMddHHmmss"));
-
-		// 澶囦唤鐢ㄦ埛淇℃伅
-		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
-
-		// TODO 澶囦唤璧勯噾鏄庣粏
-
-		// 澶囦唤閭�璇峰叧绯�
-		List<ThreeSale> threeSaleList = new ArrayList<>();
-
-		FileWriter fw = null;
-		try {
-			// 璁剧疆涓�:True,琛ㄧず鍐欏叆鐨勬椂鍊欒拷鍔犳暟鎹�
-			fw = new FileWriter(new File(logPath), true);
-
-			fw.write("#UserInfo" + "\r\n");
-			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(user) + "\r\n");
-
-			fw.write("#ThreeSale" + "\r\n");
-			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(threeSaleList) + "\r\n");
-
-			fw.close();
-
-			String logUrl = COSManager.getInstance()
-					.uploadFile(new File(logPath), "beifen/" + new File(logPath).getName()).getUrl();
-			return logUrl;
-		} catch (IOException e) {
-			e.printStackTrace();
-		} finally {
-			if (new File(logPath).exists())
-				new File(logPath).delete();
-		}
-
-		return null;
-	}
-
-	@Override
-	public void clearUserPortrait(Long uid) {
-		if (uid == null)
-			return;
-		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
-		String prefix = String.format("/portrait/wx/%s_", user.getWxUnionId());
-		ObjectListing list = COSManager.getInstance().getObjectList(prefix, null, 30);
-		if (list != null && list.getObjectSummaries() != null)
-			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 = userInfoMapper.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);
-				userInfoMapper.updateByPrimaryKeySelective(updateUser);
-				return portrait;
-			}
-		}
-
-		return user.getPortrait();
-	}
-
-	@Transactional(rollbackFor=Exception.class)
-	@Override
-	public UserInfo loginPhone(HttpServletRequest request, 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);
-		// 娓呯悊娆℃暟
-		redisManager.removeCommonString("sendMSNLoginCount" + phone);
-
-		// 閲囩敤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 = userInfoMapper.getEffectiveUserInfoByPhone(phone);
-				if (userInfo != null) {
-					// 鏇存柊璐︽埛鐧诲綍淇℃伅
-					updateLonginInfo(userInfo, loginType, request);
-				} 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);
-					// 鍒涘缓鐢ㄦ埛
-					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 loginWinXin(HttpServletRequest request, 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 = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
-				// 鐩存帴鐢ㄧ殑寰俊鐧诲綍
-				if (userInfo != null) {
-					LogHelper.test("寰俊unionID瀛樺湪:" + weiXinUser.getUnionid());
-					// 鏇存柊璐︽埛鐧诲綍淇℃伅
-					updateLonginInfo(userInfo, loginType, request);
-					// 鍒犻櫎閭�璇峰垎浜浘
-					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("/portrait/wx/%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(request.getRemoteHost());
-					userInfo.setState(UserInfo.STATE_NORMAL);
-					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(HttpServletRequest request, AcceptData acceptData, int loginType, String wxCode,
-			String appId) throws UserAccountException {
-		// 鏃ュ織淇℃伅
-		JSONObject logInfo = new JSONObject();
-		logInfo.put("appId", appId);
-		logInfo.put("wxCode", wxCode);
-		logInfo.put("loginType", loginType);
-		LogHelper.lgoinInfo(logInfo.toString());
-
-		// 閫氳繃Code鎹㈠彇淇℃伅
-		WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
-		WeiXinUser weiXinUser = WXLoginUtil.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 = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
-		if (userInfo == null) {
-			String longinKey = StringUtil.Md5("WXLogin:" + weiXinUser.getUnionid());
-			redisManager.cacheCommonString(longinKey, JsonUtil.getSimpleGson().toJson(weiXinUser), 60 * 20);
-			throw new UserAccountException(101, longinKey);
-		}
-		// 鏇存柊璐︽埛鐧诲綍淇℃伅
-		updateLonginInfo(userInfo, loginType, request);
-		Long uid = userInfo.getId();
-		ThreadUtil.run(new Runnable() {
-			public void run() {
-				// 鍒犻櫎閭�璇峰垎浜浘
-				spreadUserImgService.deleteImgUrl(uid);
-			}
-		});
-		return userInfo;
-	}
-
-	/**
-	 * 鏇存柊璐︽埛鐧诲綍淇℃伅
-	 * 
-	 * @param userInfo
-	 * @param loginType
-	 * @param request
-	 */
-	public void updateLonginInfo(UserInfo userInfo, int loginType, HttpServletRequest request) {
-		// 璁剧疆鐧诲綍鏃堕棿涓庣櫥褰曠被鍨�
-		UserInfo updateUserInfo = new UserInfo(userInfo.getId());
-		updateUserInfo.setLastLoginTime(System.currentTimeMillis());
-		updateUserInfo.setLoginType(loginType);
-		updateUserInfo.setLastLoginIp(request.getRemoteHost());
-		userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
-	}
-
-	@Override
-	public void bindPhoneNew(Long uid, String phone) throws UserAccountException {
-		UserInfo user = userInfoMapper.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 = userInfoMapper.getEffectiveUserInfoByPhone(phone);
-		if (phoneUser != null) {
-			throw new UserAccountException(2, "鍙风爜宸茬粡琚崰鐢�");
-		}
-
-		// 鏇存柊鐢佃瘽鍙风爜
-		UserInfo update = new UserInfo(user.getId());
-		update.setPhone(phone);
-		userInfoMapper.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);
-
-	}
-
-	@Override
-	public void bindWeiXin(AcceptData acceptData, Long uid, String code) throws UserAccountException {
-		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
-		if (user == null) {
-			throw new UserAccountException(1, "鐢ㄦ埛涓嶅瓨鍦�");
-		}
-		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, "寰俊甯愬彿鎺堟潈澶辫触");
-		}
-
-		String wxUnionIdExist = user.getWxUnionId();
-		if (StringUtil.isNullOrEmpty(wxUnionIdExist)) {
-			UserInfo newUser = userInfoMapper.getEffectiveUserInfoByWXUnionId(wxUnionId);
-			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("/portrait/wx/%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);
-		}
-		userInfoMapper.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(String phone, String key, String appId, HttpServletRequest request)
-			throws UserAccountException {
-		UserInfo phoneUser = userInfoMapper.getEffectiveUserInfoByPhone(phone);
-		if (phoneUser != null)
-			throw new UserAccountException(1, "鍙风爜宸茬粡琚崰鐢�");
-
-		// 鍒ゆ柇鎵嬫満鍙风爜鏄惁琚皝绂�
-		ForbiddenUserIdentifyCode identifyCode1 = forbiddenUserIdentifyCodeService
-				.listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, phone);
-		if (identifyCode1 != null && identifyCode1.getEffective() != null && identifyCode1.getEffective())
-			throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
-
-		String value = redisManager.getCommonString(key);
-		if (StringUtil.isNullOrEmpty(value))
-			throw new UserAccountException(1, "寰俊鎺堟潈澶辨晥锛岃浣跨敤寰俊閲嶆柊鐧诲綍");
-
-		WeiXinUser weiXinUser = JsonUtil.getSimpleGson().fromJson(value, WeiXinUser.class);
-		if (weiXinUser == null)
-			throw new UserAccountException(1, "寰俊鎺堟潈澶辨晥锛岃浣跨敤寰俊閲嶆柊鐧诲綍");
-
-		UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
-		// 鐩存帴鐢ㄧ殑寰俊鐧诲綍
-		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("/portrait/wx/%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(request.getRemoteHost());
-		userInfo.setState(UserInfo.STATE_NORMAL);
-		addUser(userInfo);
-
-		Long uid = userInfo.getId();
-		ThreadUtil.run(new Runnable() {
-			public void run() {
-				try {
-					// 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
-					userInfoExtraService.createUserInfoExtra(uid);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-
-				// 鍔犲叆缁戝畾璁板綍
-				UserAccountBindingHistory history = new UserAccountBindingHistory();
-				history.setContent(phone);
-				history.setType(UserAccountBindingHistory.TYPE_PHONE);
-				history.setUid(uid);
-				history.setFirst(true);
-				userAccountBindingHistoryService.addUserAccountBindingHistory(history);
-
-				userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, phone);
-				userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, weiXinUser.getUnionid());
-			}
-		});
-		// 鍒犻櫎缂撳瓨
-		redisManager.removeCommonString(key);
-
-		return userInfo;
-	}
-
-	@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