From 8b2191df2f7d94aa299bd43dcbe97c94e5a61bbd Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期三, 20 十一月 2019 14:53:34 +0800
Subject: [PATCH] RocketMQ的消息整改

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java |  887 ++++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 728 insertions(+), 159 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 4e3fad1..63f9ea9 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
@@ -3,7 +3,9 @@
 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;
 
@@ -11,95 +13,86 @@
 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.AccountDetailsMapper;
 import com.yeshi.fanli.dao.mybatis.AccountMessageMapper;
-import com.yeshi.fanli.dao.mybatis.BindingAccountMapper;
-import com.yeshi.fanli.dao.mybatis.MoneyRecordMapper;
-import com.yeshi.fanli.dao.mybatis.PidOrderMapper;
-import com.yeshi.fanli.dao.mybatis.ThreeSaleMapper;
 import com.yeshi.fanli.dao.mybatis.UserConnectHistoryMapper;
 import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
-import com.yeshi.fanli.dao.mybatis.hongbao.HongBaoMapper;
-import com.yeshi.fanli.dao.mybatis.order.OrderItemMapper;
-import com.yeshi.fanli.dao.mybatis.order.OrderMapper;
-import com.yeshi.fanli.entity.bus.user.AccountDetails;
-import com.yeshi.fanli.entity.bus.user.AccountMessage;
+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.HongBao;
 import com.yeshi.fanli.entity.bus.user.LoginResult;
-import com.yeshi.fanli.entity.bus.user.MoneyRecord;
-import com.yeshi.fanli.entity.bus.user.Order;
-import com.yeshi.fanli.entity.bus.user.OrderItem;
+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.entity.taobao.PidOrder;
-import com.yeshi.fanli.exception.UserAccountException;
+import com.yeshi.fanli.exception.user.ForbiddenUserIdentifyCodeException;
+import com.yeshi.fanli.exception.user.UserAccountException;
 import com.yeshi.fanli.log.LogHelper;
-import com.yeshi.fanli.service.inter.hongbao.HongBaoService;
-import com.yeshi.fanli.service.inter.msg.UserAccountMsgNotificationService;
+import com.yeshi.fanli.service.inter.money.extract.BindingAccountService;
 import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
 import com.yeshi.fanli.service.inter.user.SpreadUserImgService;
+import com.yeshi.fanli.service.inter.user.UserAccountBindingHistoryService;
 import com.yeshi.fanli.service.inter.user.UserAccountService;
-import com.yeshi.fanli.service.inter.user.UserExtraTaoBaoInfoService;
+import com.yeshi.fanli.service.inter.user.UserInfoDeleteRecordService;
+import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
+import com.yeshi.fanli.service.inter.user.UserInfoModifyRecordService;
+import com.yeshi.fanli.service.inter.user.UserInfoService;
+import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
+import com.yeshi.fanli.service.inter.user.msg.UserAccountMsgNotificationService;
+import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
 import com.yeshi.fanli.util.Constant;
 import com.yeshi.fanli.util.FileUtil;
+import com.yeshi.fanli.util.RedisManager;
 import com.yeshi.fanli.util.StringUtil;
+import com.yeshi.fanli.util.ThreadUtil;
 import com.yeshi.fanli.util.TimeUtil;
-import com.yeshi.fanli.util.factory.AccountDetailsFactory;
 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 BindingAccountMapper bindingAccountMapper;
+	private UserInfoService userInfoService;
+
+	@Resource
+	private BindingAccountService bindingAccountService;
 
 	@Resource
 	private UserConnectHistoryMapper userConnectHistoryMapper;
 
 	@Resource
-	private AccountDetailsMapper accountDetailsMapper;
-
-	@Resource
-	private HongBaoMapper hongBaoMapper;
-
-	@Resource
-	private OrderMapper orderMapper;
-
-	@Resource
-	private OrderItemMapper orderItemMapper;
-
-	@Resource
-	private ThreeSaleMapper threeSaleMapper;
-
-	@Resource
-	private PidOrderMapper pidOrderMapper;
-
-	@Resource
-	private HongBaoService hongBaoService;
+	private ThreeSaleSerivce threeSaleSerivce;
 
 	@Resource
 	private AccountMessageMapper accountMessageMapper;
-	@Resource
-	private MoneyRecordMapper moneyRecordMapper;
 
 	@Resource
 	private SpreadUserImgService spreadUserImgService;
@@ -113,10 +106,27 @@
 	@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
 	@Override
-	public LoginResult login(HttpServletRequest request, Boolean first, String appId, String code, String phone,
-			UserInfo tbUserInfo, boolean wxinstall, int loginType) throws UserAccountException {
+	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);
@@ -178,7 +188,9 @@
 
 			case 2:// 寰俊
 					// 閫氳繃Code鎹㈠彇淇℃伅
-				weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(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));
@@ -198,7 +210,7 @@
 				if (lastUser == null) {
 					if (userInfo != null) {
 						// 浣垮垎閿�鍏崇郴鐢熸晥
-						threeSaleMapper.effectThreeSale(userInfo.getId());
+						threeSaleSerivce.effective(userInfo);
 						// 鏇存柊澶村儚涓庢樀绉�
 						UserInfo updateUserInfo = new UserInfo(userInfo.getId());
 						updateUserInfo.setNickName(weiXinUser.getNickname());
@@ -210,6 +222,8 @@
 						updateUserInfo.setLastLoginTime(System.currentTimeMillis());
 						updateUserInfo.setLoginType(loginType);
 						updateUserInfo.setLastLoginIp(request.getRemoteHost());
+						// 鏇存柊openId
+						updateUserInfo.setOpenid(weiXinUser.getOpenid());
 
 						userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
 						// 鍒犻櫎閭�璇峰浘鐗�
@@ -274,7 +288,7 @@
 							session.removeAttribute("LAST_LOGIN_USER");
 
 							// 浣垮垎閿�鍏崇郴鐢熸晥
-							threeSaleMapper.effectThreeSale(userInfo.getId());
+							threeSaleSerivce.effective(userInfo);
 
 							return new LoginResult(LoginResult.TYPE_NORMAL, userInfo);
 						} else {// 涓や釜璐﹀彿鎷ユ湁涓嶅悓鐨刄ID
@@ -288,7 +302,7 @@
 							result.setLessUser(lastUser);
 
 							// 浣垮垎閿�鍏崇郴鐢熸晥
-							threeSaleMapper.effectThreeSale(userInfo.getId());
+							threeSaleSerivce.effective(userInfo);
 							return result;
 						}
 
@@ -359,7 +373,7 @@
 			}
 
 		} else {// 娌℃湁瀹夎寰俊
-			LoginResult result = loginNoInstallWX(appId, code, phone, tbUserInfo, loginType);
+			LoginResult result = loginNoInstallWX(acceptData, appId, code, phone, tbUserInfo, loginType);
 			if (result.getType() == LoginResult.TYPE_CREATE)
 				session.setAttribute("LAST_LOGIN_USER", result.getUser());
 			return result;
@@ -368,8 +382,8 @@
 
 	@Transactional
 	@Override
-	public LoginResult loginNoInstallWX(String appId, String code, String phone, UserInfo tbUserInfo, int loginType)
-			throws UserAccountException {
+	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);
@@ -393,7 +407,9 @@
 			break;
 		case 2:// 寰俊
 				// 閫氳繃Code鎹㈠彇淇℃伅
-			weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code);
+			WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
+			weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, wxAccount.getAppId(),
+					wxAccount.getAppSecret());
 			if (weiXinUser == null)
 				throw new UserAccountException(1001, "鏃犳硶鑾峰彇鍒板井淇′釜浜轰俊鎭�");
 
@@ -504,27 +520,16 @@
 			throw new UserAccountException(10, String.format("璐︽埛ID:%s 鐨勮祫閲戣秴杩�10鍏冿紝涓轰繚璇佽祫閲戝畨鍏ㄨ鑱旂郴瀹㈡湇鎵撻��", lessUser.getId() + ""));
 
 		// 鍒ゅ畾鏄惁缁戝畾浜嗗悓涓�鏀粯瀹�
-		List<BindingAccount> mainUserAccountList = bindingAccountMapper.selectByUid(mainUser.getId());
-		if (mainUserAccountList != null)
-			for (int i = 0; i < mainUserAccountList.size(); i++) {
-				if (mainUserAccountList.get(i).getType() == BindingAccount.TYPE_WXPAY) {
-					mainUserAccountList.remove(i);
-					i--;
-				}
-			}
-		List<BindingAccount> lessUserAccountList = bindingAccountMapper.selectByUid(lessUser.getId());
-		if (lessUserAccountList != null)
-			for (int i = 0; i < lessUserAccountList.size(); i++) {
-				if (lessUserAccountList.get(i).getType() == BindingAccount.TYPE_WXPAY) {
-					lessUserAccountList.remove(i);
-					i--;
-				}
-			}
+		BindingAccount mainUserAccount = bindingAccountService.getBindingAccountByUidAndType(mainUser.getId(),
+				BindingAccount.TYPE_ALIPAY);
+
+		BindingAccount lessUserAccount = bindingAccountService.getBindingAccountByUidAndType(lessUser.getId(),
+				BindingAccount.TYPE_ALIPAY);
+
 		// 鏈変笉鍚岀殑鏀粯瀹濊处鍙�
 		boolean hasDiffrentAlipayAccount = false;
-		if (mainUserAccountList != null && mainUserAccountList.size() > 0 && lessUserAccountList != null
-				&& lessUserAccountList.size() > 0) {
-			if (!mainUserAccountList.get(0).getAccount().equalsIgnoreCase(lessUserAccountList.get(0).getAccount()))
+		if (mainUserAccount != null && lessUserAccount != null) {
+			if (!mainUserAccount.getAccount().equalsIgnoreCase(lessUserAccount.getAccount()))
 				hasDiffrentAlipayAccount = true;
 		}
 
@@ -564,52 +569,12 @@
 		userInfoMapper.connectUser(mainUser.getId(), lessUser.getId());
 
 		// 鏌ヨ鏄惁鏈夊浣欑殑鏂颁汉绾㈠寘
-		List<HongBao> list = hongBaoMapper.selectByUidAndType(mainUser.getId(), HongBao.TYPE_XINREN);
 		int subCount = 0;
 		int addCount = 0;
-		for (HongBao hb : list) {
-			if (hb.getMoney().compareTo(new BigDecimal(0)) > 0)
-				addCount++;
-			if (hb.getMoney().compareTo(new BigDecimal(0)) < 0)
-				subCount++;
-		}
-
-		// 鏈�2涓垨鑰�2涓互涓婄殑鏂颁汉绾㈠寘
-		if (addCount - subCount > 1) {
-			// 鎵i櫎涓�涓柊浜虹孩鍖�
-			AccountDetails accountDetails = new AccountDetails();
-			accountDetails.setCreateTime(TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
-			accountDetails.setExtract(null);
-			accountDetails.setMoney("-" + list.get(1).getMoney().toString());
-			accountDetails.setOrderItem(null);
-			accountDetails.setTitle(" 璐﹀彿鍚堝苟鎵i櫎閲嶅鏂颁汉绾㈠寘");
-			accountDetails.setType(AccountDetailsFactory.TUIKUAN);
-			accountDetails.setUserInfo(mainUser);
-			accountDetailsMapper.insertSelective(accountDetails);
-
-			AccountMessage accountMessage = new AccountMessage();
-			accountMessage.setContent(" 璐﹀彿鍚堝苟鎵i櫎閲嶅鏂颁汉绾㈠寘" + list.get(1).getMoney().toString() + "鍏�");
-			accountMessage.setCreateTime(System.currentTimeMillis());
-			accountMessage.setIsOpen(false);
-			accountMessage.setSystemMsgId(0);
-			accountMessage.setTitle(" 璐﹀彿鍚堝苟鎵i櫎閲嶅鏂颁汉绾㈠寘");
-			accountMessage.setUserInfo(mainUser);
-			accountMessageMapper.insertSelective(accountMessage);
-
-			userInfoMapper.subHongBaoByUid(mainUser.getId(), list.get(1).getMoney());
-
-			HongBao hongBao = new HongBao(mainUser, new BigDecimal(0).subtract(list.get(1).getMoney()), null,
-					HongBao.TYPE_XINREN, HongBao.STATE_YILINGQU, System.currentTimeMillis(), System.currentTimeMillis(),
-					System.currentTimeMillis(), null, "璐﹀彿鍚堝苟鎵i櫎");
-
-			hongBaoMapper.insertSelective(hongBao);
-
-			MoneyRecord moneyRecord = new MoneyRecord(mainUser, hongBao, list.get(1).getMoney(), "璐﹀彿鍚堝苟鎵i櫎閲嶅鏂颁汉绾㈠寘", "璐﹀彿鍚堝苟",
-					System.currentTimeMillis(), 2);
-			moneyRecordMapper.insertSelective(moneyRecord);
-		}
 
 		userAccountMsgNotificationService.connectSuccess(mainUser.getId(), lessUser.getId());
+
+		userInfoDeleteRecordService.addDeleteRecord(lessUser.getId(), UserInfo.STATE_DELETE, "鍒犻櫎锛氳处鍙疯鎵撻�氬垹闄�");
 	}
 
 	/**
@@ -619,6 +584,7 @@
 	 * @param unionId
 	 * @return
 	 */
+	@Override
 	public UserInfo getUserInfoByWXUnionId(String appId, String unionId) throws UserAccountException {
 		if (StringUtil.isNullOrEmpty(appId))
 			throw new UserAccountException(1, "appId涓虹┖");
@@ -727,8 +693,10 @@
 		addUser(userInfo);
 	}
 
+	@Transactional
 	@Override
 	public void addUser(UserInfo user) {
+
 		Long maxUid = userInfoMapper.getMaxUid();
 		if (maxUid == null)
 			maxUid = 100000L;
@@ -742,16 +710,28 @@
 		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);
 		}
 
-		// 娣诲姞鏂颁汉绾㈠寘
-		hongBaoService.setNewUserHongBaoMyBatis(user, 1);
+		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
@@ -761,7 +741,7 @@
 
 	@Override
 	public void bindPhone(Long uid, String phone) throws UserAccountException {
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		if (user == null)
 			throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
 
@@ -776,11 +756,13 @@
 		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.selectByPrimaryKey(uid);
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		if (user == null)
 			throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
 
@@ -802,7 +784,7 @@
 	@Override
 	public void bindTaoBao(Long uid, String tbOpenId, String tbNickName, String tbPortrait)
 			throws UserAccountException {
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		if (user == null)
 			throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
 
@@ -832,7 +814,7 @@
 
 	@Override
 	public void unBindTaoBao(Long uid) throws UserAccountException {
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		if (user == null)
 			throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
 		if (StringUtil.isNullOrEmpty(user.getOpenid()))
@@ -859,11 +841,13 @@
 	}
 
 	@Override
-	public void changeWXBind(Long uid, String code) throws UserAccountException {
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+	public void changeWXBind(AcceptData acceptData, Long uid, String code) throws UserAccountException {
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		if (user == null)
 			throw new UserAccountException(4, "鐢ㄦ埛涓嶅瓨鍦�");
-		WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code);
+		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()))
@@ -871,25 +855,35 @@
 
 		UserInfo newUser = getUserInfoByWXUnionId(user.getAppId(), weiXinUser.getUnionid());
 		if (newUser != null)
-			throw new UserAccountException(13, "浜诧紝浣犺鏇存崲缁戝畾鐨勫井淇″彿宸茶鍏朵粬璐﹀彿缁戝畾");
+			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());
-		updateUserInfo.setNickName(weiXinUser.getNickname());
-		updateUserInfo.setPortrait(weiXinUser.getHeadimgurl());
-		if (StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
-			updateUserInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
+
+		// 灏嗛粯璁ゆ樀绉版浛鎹㈡垚寰俊鏄电О
+		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());
+			}
 		}
 
-		if (StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
-			updateUserInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
+		// 灏嗛粯璁ゅご鍍忔浛鎹㈡垚寰俊澶村儚
+		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
@@ -899,21 +893,12 @@
 				TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMddHHmmss"));
 
 		// 澶囦唤鐢ㄦ埛淇℃伅
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 
-		// 澶囦唤璧勯噾鏄庣粏
-		List<AccountDetails> accountDetailsList = accountDetailsMapper.selectByUid(uid);
-		// 澶囦唤绾㈠寘淇℃伅
-		List<HongBao> hongBaoList = hongBaoMapper.selectByUid(uid);
-		// 澶囦唤璁㈠崟锛屽瓙璁㈠崟淇℃伅
-		List<Order> orderList = orderMapper.selectByUid(uid);
-		List<OrderItem> orderItemList = orderItemMapper.selectByUid(uid);
+		// TODO 澶囦唤璧勯噾鏄庣粏
 
 		// 澶囦唤閭�璇峰叧绯�
-		List<ThreeSale> threeSaleList = threeSaleMapper.selectByUid(uid);
-
-		// 澶囦唤鍒嗕韩璧�
-		List<PidOrder> pidOrderList = pidOrderMapper.selectByUid(uid);
+		List<ThreeSale> threeSaleList = new ArrayList<>();
 
 		FileWriter fw = null;
 		try {
@@ -923,23 +908,8 @@
 			fw.write("#UserInfo" + "\r\n");
 			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(user) + "\r\n");
 
-			fw.write("#AccountDetails" + "\r\n");
-			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(accountDetailsList) + "\r\n");
-
-			fw.write("#HongBao" + "\r\n");
-			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(hongBaoList) + "\r\n");
-
-			fw.write("#Order" + "\r\n");
-			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(orderList) + "\r\n");
-
-			fw.write("#OrderItem" + "\r\n");
-			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(orderItemList) + "\r\n");
-
 			fw.write("#ThreeSale" + "\r\n");
 			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(threeSaleList) + "\r\n");
-
-			fw.write("#PidOrder" + "\r\n");
-			fw.write(JsonUtil.getSimpleGsonWithDate().toJson(pidOrderList) + "\r\n");
 
 			fw.close();
 
@@ -960,7 +930,7 @@
 	public void clearUserPortrait(Long uid) {
 		if (uid == null)
 			return;
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		String prefix = String.format("/portrait/wx/%s_", user.getWxUnionId());
 		ObjectListing list = COSManager.getInstance().getObjectList(prefix, null, 30);
 		if (list != null && list.getObjectSummaries() != null)
@@ -975,7 +945,7 @@
 	public String repairPortrait(Long uid) {
 		if (uid == null)
 			return null;
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		if (user == null)
 			return null;
 		String prefix = String.format("/portrait/wx/%s_", user.getWxUnionId());
@@ -1004,4 +974,603 @@
 		return user.getPortrait();
 	}
 
+	@Transactional
+	@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
+	@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
+	@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);
+	}
 }

--
Gitblit v1.8.0