From 7e7db2fa55a9a3af46d4fd8ede0dee147f101d64 Mon Sep 17 00:00:00 2001
From: yujian <yujian@163.com>
Date: 星期六, 09 五月 2020 21:41:27 +0800
Subject: [PATCH] 2.1需求

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java |  522 ++++++++++++++++++++++++++++++---------------------------
 1 files changed, 276 insertions(+), 246 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 14ef53e..9b8bdc2 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,11 +1,6 @@
 package com.yeshi.fanli.service.impl.user;
 
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
+import java.io.InputStream;
 import java.util.List;
 
 import javax.annotation.Resource;
@@ -15,23 +10,23 @@
 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;
@@ -39,23 +34,24 @@
 import com.yeshi.fanli.exception.user.ForbiddenUserIdentifyCodeException;
 import com.yeshi.fanli.exception.user.UserAccountException;
 import com.yeshi.fanli.log.LogHelper;
-import com.yeshi.fanli.service.inter.hongbao.ThreeSaleSerivce;
-import com.yeshi.fanli.service.inter.msg.UserAccountMsgNotificationService;
-import com.yeshi.fanli.service.inter.user.BindingAccountService;
+import com.yeshi.fanli.service.inter.money.extract.BindingAccountService;
 import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
 import com.yeshi.fanli.service.inter.user.SpreadUserImgService;
 import com.yeshi.fanli.service.inter.user.UserAccountBindingHistoryService;
 import com.yeshi.fanli.service.inter.user.UserAccountService;
-import com.yeshi.fanli.service.inter.user.UserExtraTaoBaoInfoService;
 import com.yeshi.fanli.service.inter.user.UserInfoDeleteRecordService;
 import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
 import com.yeshi.fanli.service.inter.user.UserInfoModifyRecordService;
 import com.yeshi.fanli.service.inter.user.UserInfoService;
+import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
+import com.yeshi.fanli.service.inter.user.msg.UserAccountMsgNotificationService;
+import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
 import com.yeshi.fanli.util.Constant;
-import com.yeshi.fanli.util.FileUtil;
+import com.yeshi.fanli.util.FilePathEnum;
+import com.yeshi.fanli.util.RedisKeyEnum;
 import com.yeshi.fanli.util.RedisManager;
 import com.yeshi.fanli.util.StringUtil;
-import com.yeshi.fanli.util.TimeUtil;
+import com.yeshi.fanli.util.ThreadUtil;
 import com.yeshi.fanli.util.factory.msg.MsgAccountDetailFactory;
 import com.yeshi.fanli.util.wx.WXLoginUtil;
 
@@ -80,13 +76,7 @@
 	private BindingAccountService bindingAccountService;
 
 	@Resource
-	private UserConnectHistoryMapper userConnectHistoryMapper;
-
-	@Resource
 	private ThreeSaleSerivce threeSaleSerivce;
-
-	@Resource
-	private AccountMessageMapper accountMessageMapper;
 
 	@Resource
 	private SpreadUserImgService spreadUserImgService;
@@ -111,16 +101,16 @@
 
 	@Resource
 	private JedisPool jedisPool;
-	
-	
+
 	@Lazy
 	@Resource
 	private UserInfoModifyRecordService userInfoModifyRecordService;
-	
-	@Transactional
+
+	@Transactional(rollbackFor = Exception.class)
 	@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);
@@ -152,8 +142,7 @@
 				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.getState() != UserInfo.STATE_NORMAL))
 					userInfo = null;
 				if (userInfo == null) {// 鍘熷厛鐨勮处鍙蜂笉瀛樺湪
 					userInfo = new UserInfo();
@@ -182,7 +171,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));
@@ -195,8 +186,8 @@
 				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.getState() != UserInfo.STATE_NORMAL
+							))
 					userInfo = null;
 				// 鐩存帴鐢ㄧ殑寰俊鐧诲綍
 				if (lastUser == null) {
@@ -214,6 +205,8 @@
 						updateUserInfo.setLastLoginTime(System.currentTimeMillis());
 						updateUserInfo.setLoginType(loginType);
 						updateUserInfo.setLastLoginIp(request.getRemoteHost());
+						// 鏇存柊openId
+						updateUserInfo.setOpenid(weiXinUser.getOpenid());
 
 						userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
 						// 鍒犻櫎閭�璇峰浘鐗�
@@ -332,8 +325,7 @@
 				userInfo = getUserInfoByPhone(appId, phone);
 				// 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
 				if (userInfo != null && userInfo.getState() != null
-						&& (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
-								|| userInfo.getState() == UserInfo.STATE_DELETE))
+						&& (userInfo.getState() != UserInfo.STATE_NORMAL))
 					userInfo = null;
 
 				if (userInfo == null) {// 鍘熷厛鐨勮处鍙蜂笉瀛樺湪
@@ -363,17 +355,17 @@
 			}
 
 		} 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;
 		}
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@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);
@@ -397,7 +389,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, "鏃犳硶鑾峰彇鍒板井淇′釜浜轰俊鎭�");
 
@@ -420,8 +414,7 @@
 		}
 
 		// 鍒ゆ柇鐢ㄦ埛鏄惁琚垹闄�
-		if (userInfo != null && userInfo.getState() != null && (userInfo.getState() == UserInfo.STATE_DELETE_OUT_OF_DATE
-				|| userInfo.getState() == UserInfo.STATE_DELETE))
+		if (userInfo != null && userInfo.getState() != null && (userInfo.getState() != UserInfo.STATE_NORMAL))
 			userInfo = null;
 
 		if (userInfo != null) {
@@ -458,112 +451,6 @@
 		}
 	}
 
-	@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
-	@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瀵绘壘鐢ㄦ埛
@@ -582,8 +469,7 @@
 		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) {
+			if (list.get(i).getState() == UserInfo.STATE_NORMAL) {
 				list.remove(i);
 				i--;
 			}
@@ -610,8 +496,7 @@
 
 		// 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
 		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) {
+			if (list.get(i).getState() != UserInfo.STATE_NORMAL) {
 				list.remove(i);
 				i--;
 			}
@@ -639,8 +524,7 @@
 
 		// 鍓旈櫎琚垹闄ゆ帀鐨勭敤鎴�
 		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) {
+			if (list.get(i).getState() !=UserInfo.STATE_NORMAL) {
 				list.remove(i);
 				i--;
 			}
@@ -658,6 +542,7 @@
 		userInfoMapper.updateByPrimaryKeySelective(userInfo);
 	}
 
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void register(UserInfo userInfo) throws UserAccountException {
 		if (!StringUtil.isNullOrEmpty(userInfo.getPhone())) {
@@ -681,6 +566,7 @@
 		addUser(userInfo);
 	}
 
+	@Transactional
 	@Override
 	public void addUser(UserInfo user) {
 
@@ -698,7 +584,7 @@
 		if (StringUtil.isNullOrEmpty(user.getPortrait()))
 			user.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
 		userInfoMapper.insertSelective(user);
-		
+
 		// 鏄电О涓虹┖鏃� 榛樿鏄电О
 		if (StringUtil.isNullOrEmpty(user.getNickName())) {
 			UserInfo updateUserInfo = new UserInfo(user.getId());
@@ -712,14 +598,13 @@
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-		
-		
-		if (!StringUtil.isNullOrEmpty(user.getPhone())) 
+
+		// 娣诲姞璐﹀彿缁戝畾鍘嗗彶
+		if (!StringUtil.isNullOrEmpty(user.getPhone()))
 			userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, user.getPhone());
-		
-		if (!StringUtil.isNullOrEmpty(user.getWxUnionId())) 
+
+		if (!StringUtil.isNullOrEmpty(user.getWxUnionId()))
 			userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindWeiXin, user.getWxUnionId());
-		
 	}
 
 	@Override
@@ -729,7 +614,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, "鐢ㄦ埛涓嶅瓨鍦�");
 
@@ -744,14 +629,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, "鐢ㄦ埛涓嶅瓨鍦�");
 
@@ -773,7 +657,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, "鐢ㄦ埛涓嶅瓨鍦�");
 
@@ -803,7 +687,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()))
@@ -830,11 +714,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()))
@@ -842,19 +728,19 @@
 
 		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());
-		
+
 		// 灏嗛粯璁ゆ樀绉版浛鎹㈡垚寰俊鏄电О
 		String defaultNickName = Constant.systemCommonConfig.getDefaultNickName();
 		if (!StringUtil.isNullOrEmpty(defaultNickName) && !StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
 			defaultNickName = defaultNickName + uid;
-			if ((defaultNickName.equals(user.getNickName()) || "杩斿埄鍒�".equals(user.getNickName()))) {
+			if ((defaultNickName.equals(user.getNickName()) || "鏉挎牀蹇渷".equals(user.getNickName()))) {
 				updateUserInfo.setNickName(weiXinUser.getNickname());
 			}
 		}
@@ -865,60 +751,19 @@
 				&& 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.selectByPrimaryKey(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.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)
@@ -933,7 +778,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());
@@ -962,7 +807,7 @@
 		return user.getPortrait();
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public UserInfo loginPhone(HttpServletRequest request, int loginType, String vcode, String phone, String appId)
 			throws UserAccountException {
@@ -1008,7 +853,9 @@
 		// 娓呯┖闄愬埗
 		redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN);
 		// 娓呯悊娆℃暟
-		redisManager.removeCommonString("sendMSNLoginCount" + phone);
+		String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.SMSLoginCount, phone);
+		redisManager.removeCommonString(key);
+
 
 		// 閲囩敤redis浜嬪姟闃叉涓�涓墜鏈哄彿澶氭娉ㄥ唽闂
 		String watchKey = StringUtil.Md5("REGISTER:" + phone);
@@ -1023,7 +870,7 @@
 			if (exec == null || exec.size() == 0) {
 				throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
 			} else {
-				
+
 				// 鏌ヨ鏄惁瀛樺湪璇ョ數璇濆巻鍙茬敤鎴�
 				UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByPhone(phone);
 				if (userInfo != null) {
@@ -1032,7 +879,7 @@
 				} else {
 					userInfo = new UserInfo();
 					userInfo.setAppId(appId);
-					//userInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
+					// userInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
 					userInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
 					userInfo.setPhone(phone);
 					userInfo.setLoginType(loginType);
@@ -1046,10 +893,10 @@
 					} catch (Exception e) {
 						e.printStackTrace();
 					}
-					
+
 					userInfoModifyRecordService.addModifyRecord(userInfo.getId(), ModifyTypeEnum.bindPhone, phone);
 				}
-			
+
 				return userInfo;
 			}
 		} catch (Exception e) {
@@ -1057,15 +904,15 @@
 		} finally {
 			jedis.del(watchKey);
 			jedis.unwatch();
-			jedisPool.returnResource(jedis);
+			jedis.close();
 		}
 		throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
-	public UserInfo loginWinXin(HttpServletRequest request, int loginType, String code, String appId)
-			throws UserAccountException {
+	public UserInfo loginWinXin(HttpServletRequest request, AcceptData acceptData, int loginType, String code,
+			String appId) throws UserAccountException {
 		// 鏃ュ織淇℃伅
 		JSONObject logInfo = new JSONObject();
 		logInfo.put("appId", appId);
@@ -1074,7 +921,8 @@
 		LogHelper.lgoinInfo(logInfo.toString());
 
 		// 閫氳繃Code鎹㈠彇淇℃伅
-		WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(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, "寰俊甯愬彿鎺堟潈澶辫触");
 		}
@@ -1111,9 +959,27 @@
 					spreadUserImgService.deleteImgUrl(userInfo.getId());
 				} else {
 					LogHelper.test("寰俊unionID涓嶅瓨鍦�:" + weiXinUser.getUnionid());
+
+					String portrait = null;
+					if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl())) {
+						InputStream asInputStream = HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl());
+						if (asInputStream != null) {
+							FileUploadResult result = COSManager.getInstance().uploadFile(asInputStream,
+									String.format(FilePathEnum.userWXPortrait.getPath() + "%s_%s.jpg", weiXinUser.getUnionid(),
+											System.currentTimeMillis() + ""));
+							if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
+								portrait = result.getUrl();
+						} else {
+							portrait = weiXinUser.getHeadimgurl();
+						}
+					}
+
+					if (StringUtil.isNullOrEmpty(portrait))
+						portrait = Constant.systemCommonConfig.getDefaultPortrait();
+
 					// 鍒涘缓鏂拌处鎴�
 					userInfo = new UserInfo();
-					userInfo.setPortrait(weiXinUser.getHeadimgurl());
+					userInfo.setPortrait(portrait);
 					userInfo.setAppId(appId);
 					userInfo.setNickName(weiXinUser.getNickname());
 					userInfo.setWxName(weiXinUser.getNickname());
@@ -1132,8 +998,9 @@
 					} catch (Exception e) {
 						e.printStackTrace();
 					}
-					
-					userInfoModifyRecordService.addModifyRecord(userInfo.getId(), ModifyTypeEnum.bindWeiXin, weiXinUser.getUnionid());
+
+					userInfoModifyRecordService.addModifyRecord(userInfo.getId(), ModifyTypeEnum.bindWeiXin,
+							weiXinUser.getUnionid());
 				}
 				return userInfo;
 			}
@@ -1142,9 +1009,53 @@
 		} finally {
 			jedis.del(watchKey);
 			jedis.unwatch();
-			jedisPool.returnResource(jedis);
+			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 key = RedisKeyEnum.getRedisKey(RedisKeyEnum.emptyKey, StringUtil.Md5("WXLogin:" + weiXinUser.getUnionid()));
+			redisManager.cacheCommonString(key, JsonUtil.getSimpleGson().toJson(weiXinUser), 60 * 20);
+			throw new UserAccountException(101, key);
+		}
+		// 鏇存柊璐︽埛鐧诲綍淇℃伅
+		updateLonginInfo(userInfo, loginType, request);
+		Long uid = userInfo.getId();
+		ThreadUtil.run(new Runnable() {
+			public void run() {
+				// 鍒犻櫎閭�璇峰垎浜浘
+				spreadUserImgService.deleteImgUrl(uid);
+			}
+		});
+		return userInfo;
 	}
 
 	/**
@@ -1165,7 +1076,7 @@
 
 	@Override
 	public void bindPhoneNew(Long uid, String phone) throws UserAccountException {
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		if (user == null) {
 			throw new UserAccountException(1, "鐢ㄦ埛涓嶅瓨鍦�");
 		}
@@ -1199,19 +1110,38 @@
 
 		// 鍙戦�佹秷鎭�
 		userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_PHONE);
-		
+
 		userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindPhone, phone);
-		
+
 	}
 
+	@Transactional(rollbackFor=UserAccountException.class)
 	@Override
-	public void bindWeiXin(Long uid, String code) throws UserAccountException {
-		UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
+	public void bindWeiXin(AcceptData acceptData, Long uid, String code) throws UserAccountException {
+		WXAccountInfoDTO wxAccount = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
+		WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUser(code, wxAccount.getAppId(), wxAccount.getAppSecret());
+		if (weiXinUser == null) {
+			throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
+		}
+
+		String wxUnionId = weiXinUser.getUnionid();
+		if (StringUtil.isNullOrEmpty(wxUnionId)) {
+			throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
+		}
+		bindWeiXin(uid, weiXinUser);
+	}
+	
+	
+	
+	
+	@Transactional(rollbackFor=UserAccountException.class)
+	@Override
+	public void bindWeiXin(Long uid,WeiXinUser weiXinUser) throws UserAccountException {
+		UserInfo user = userInfoMapper.selectAvailableByPrimaryKey(uid);
 		if (user == null) {
 			throw new UserAccountException(1, "鐢ㄦ埛涓嶅瓨鍦�");
 		}
-
-		WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code);
+		
 		if (weiXinUser == null) {
 			throw new UserAccountException(2, "寰俊甯愬彿鎺堟潈澶辫触");
 		}
@@ -1227,7 +1157,7 @@
 			if (newUser != null) {
 				throw new UserAccountException(4, "璇ュ井淇″彿宸茶鍏朵粬甯愬彿缁戝畾");
 			}
-		} else if (wxUnionId.equals(wxUnionIdExist)) {
+		} else if (wxUnionId.equalsIgnoreCase(wxUnionIdExist)) {
 			throw new UserAccountException(3, "寰俊甯愬彿涓�鑷存棤闇�鏇存崲");
 		}
 
@@ -1245,16 +1175,29 @@
 		String defaultNickName = Constant.systemCommonConfig.getDefaultNickName();
 		if (!StringUtil.isNullOrEmpty(defaultNickName) && !StringUtil.isNullOrEmpty(weiXinUser.getNickname())) {
 			defaultNickName = defaultNickName + uid;
-			if ((defaultNickName.equals(user.getNickName()) || "杩斿埄鍒�".equals(user.getNickName()))) {
+			if ((defaultNickName.equals(user.getNickName()) || "鏉挎牀蹇渷".equals(user.getNickName()))) {
 				updateUserInfo.setNickName(weiXinUser.getNickname());
 			}
 		}
-		
+
 		// 灏嗛粯璁ゅご鍍忔浛鎹㈡垚寰俊澶村儚
 		String defaultPortrait = Constant.systemCommonConfig.getDefaultPortrait();
 		if (!StringUtil.isNullOrEmpty(weiXinUser.getHeadimgurl()) && !StringUtil.isNullOrEmpty(defaultPortrait)
 				&& defaultPortrait.equals(user.getPortrait())) {
-			updateUserInfo.setPortrait(weiXinUser.getHeadimgurl());
+			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);
 		}
 		userInfoMapper.updateByPrimaryKeySelective(updateUserInfo);
 
@@ -1272,9 +1215,94 @@
 		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(FilePathEnum.userWXPortrait.getPath() +"%s_%s.jpg", weiXinUser.getUnionid(), System.currentTimeMillis() + ""));
+				if (result != null && !StringUtil.isNullOrEmpty(result.getUrl()))
+					portrait = result.getUrl();
+			} else {
+				portrait = weiXinUser.getHeadimgurl();
+			}
+		}
+
+		if (StringUtil.isNullOrEmpty(portrait))
+			portrait = Constant.systemCommonConfig.getDefaultPortrait();
+
+		// 鍒涘缓鏂拌处鎴�
+		userInfo = new UserInfo();
+		userInfo.setPhone(phone);
+		userInfo.setPortrait(portrait);
+		userInfo.setAppId(appId);
+		userInfo.setNickName(weiXinUser.getNickname());
+		userInfo.setWxName(weiXinUser.getNickname());
+		userInfo.setWxOpenId(weiXinUser.getOpenid());
+		userInfo.setWxUnionId(weiXinUser.getUnionid());
+		userInfo.setWxPic(weiXinUser.getHeadimgurl());
+		userInfo.setLastLoginTime(System.currentTimeMillis());
+		userInfo.setLoginType(2);
+		userInfo.setLastLoginIp(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
@@ -1399,4 +1427,6 @@
 		// 鎻掑叆璁板綍
 		userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_DELETE_OUT_OF_DATE, reason);
 	}
+
+
 }

--
Gitblit v1.8.0