package com.hehenian.biz.service.account;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hehenian.biz.common.account.IUserInfoService;
import com.hehenian.biz.common.account.IUserService;
import com.hehenian.biz.common.account.dataobject.AccountUserDo;
import com.hehenian.biz.common.account.dataobject.InviteCodeDo;
import com.hehenian.biz.common.account.dataobject.LoginInfoRelate;
import com.hehenian.biz.common.account.dataobject.PersonDo;
import com.hehenian.biz.common.account.dataobject.PhoneVerifyDo;
import com.hehenian.biz.common.account.dataobject.UserBindDo;
import com.hehenian.biz.common.base.dataobject.NPageDo;
import com.hehenian.biz.common.base.result.IResult;
import com.hehenian.biz.common.base.result.ResultSupport;
import com.hehenian.biz.common.exception.BusinessException;
import com.hehenian.biz.component.account.IPersonComponent;
import com.hehenian.biz.component.account.IPhoneVerifyComponent;
import com.hehenian.biz.component.account.IUserComponent;
import com.hehenian.biz.component.trade.IInvestComponent;
import com.hehenian.biz.component.trade.IOperationLogComponent;
import com.hehenian.biz.component.trade.IRepaymentComponent;
@Service("userService")
public class UserServiceImpl implements IUserService {
private final Logger logger = Logger.getLogger(this.getClass());
@Autowired
private IInvestComponent investComponent;
@Autowired
private IRepaymentComponent repaymentComponent;
private final static Logger LOGGER = Logger.getLogger(UserServiceImpl.class);
@Autowired
private IUserComponent userComponent;
@Autowired
private IOperationLogComponent operationLogComponent;
@Autowired
private IPhoneVerifyComponent phoneVerifyComponent;
@Autowired
private IUserInfoService userInfoService;
@Autowired
private IPersonComponent personComponent;
@Override
public AccountUserDo getById(Long id) {
return userComponent.getById(id);
}
@Override
public NPageDo<Map<String, Object>> queryUserFundRecords(Map<String, Object> searchItems) {
try {
NPageDo<Map<String, Object>> pageDo = new NPageDo<Map<String, Object>>();
long count = userComponent.countUsers(searchItems);
pageDo.setTotalCount(count);
if (count == 0) {
return pageDo;
}
List<Map<String, Object>> userFundRecordList = userComponent.queryUsers(searchItems);
for (Map<String, Object> map : userFundRecordList) {
map.put("usableSum", ((BigDecimal) map.get("usableSum")).doubleValue());
map.put("freezeSum", ((BigDecimal) map.get("freezeSum")).doubleValue());
}
List<Long> userIdList = new ArrayList<Long>();
for (Map<String, Object> map : userFundRecordList) {
userIdList.add((Long) map.get("userId"));
}
// 查询投资的待收本金,待收利息,待收总额
List<Map<String, Object>> userInvestList = investComponent.queryUserInvests(userIdList);
for (Map<String, Object> map : userFundRecordList) {
for (Map<String, Object> userInvestMap : userInvestList) {
if (((Long) map.get("userId")).longValue() == ((Long) userInvestMap.get("userId")).longValue()) {
map.put("dueinCapitalSum", ((BigDecimal) userInvestMap.get("dueinCapitalSum")).doubleValue());
map.put("dueinAccrualSum", ((BigDecimal) userInvestMap.get("dueinAccrualSum")).doubleValue());
map.put("dueinSum", ((BigDecimal) userInvestMap.get("dueinSum")).doubleValue());
break;
}
}
}
// 查询待还金额
List<Map<String, Object>> userRepaymentList = repaymentComponent.queryUserRepayments(userIdList);
for (Map<String, Object> map : userFundRecordList) {
for (Map<String, Object> userRepayment : userRepaymentList) {
if (((Long) map.get("userId")).longValue() == ((Long) userRepayment.get("userId")).longValue()) {
map.put("forRePaySum", ((BigDecimal) userRepayment.get("forRePaySum")).doubleValue());
break;
}
}
}
pageDo.setModelList(userFundRecordList);
return pageDo;
} catch (Exception e) {
logger.error(e.getMessage(), e);
NPageDo<Map<String, Object>> pageDo = new NPageDo<Map<String, Object>>();
pageDo.setTotalCount(0l);
return pageDo;
}
}
@Override
public AccountUserDo findUserByUserName(String username) {
return userComponent.findUserByUserName(username);
}
@Override
public AccountUserDo findUserByPhone(String mobilePhone) {
return userComponent.findUserByPhone(mobilePhone);
}
@Override
public IResult registerUser(AccountUserDo accountUserDo) {
IResult result = new ResultSupport();
AccountUserDo accountUserDo1 = userComponent.findUserByUserName(accountUserDo.getUsername());
if (accountUserDo1 != null) {
result.setSuccess(false);
result.setErrorMessage("用户名已存在");
} else {
if(accountUserDo.getMobilePhone().length()>0){
accountUserDo1 = userComponent.findUserByPhone(accountUserDo.getMobilePhone());
}else{
accountUserDo1=null;
}
if (accountUserDo1 != null) {
result.setSuccess(false);
result.setErrorMessage("手机号已存在");
} else{
if(accountUserDo.getColorid()!=-1L){
accountUserDo1 = userComponent.findUserByColorid(accountUserDo.getColorid()+"");
}else{
accountUserDo1=null;
}
if(accountUserDo1 != null){
result.setSuccess(false);
result.setErrorMessage("彩之云ID已存在");
}else {
try {
if(accountUserDo.getColorid()==-1){
accountUserDo.setColorid(null);
}
Long userId = userComponent.saveUser(accountUserDo);
// 新注册业务:支持手机、账号及第三方登录
if (userId != null) {
LoginInfoRelate lir = null;
// 如果账号和手机号一样,则以手机号为登录标识
if (!accountUserDo.getUsername().equals(accountUserDo.getMobilePhone())) {
lir = new LoginInfoRelate();
lir.setLoginInfo(accountUserDo.getUsername());
lir.setUserId(userId.intValue());
lir.setType(1); // 普通用户名
userInfoService.insert(lir);
}
if(accountUserDo.getMobilePhone().length()>0){
lir = new LoginInfoRelate();
lir.setLoginInfo(accountUserDo.getMobilePhone());
lir.setUserId(userId.intValue());
lir.setType(2); // 手机号码
userInfoService.insert(lir);
}
}
// end
result.setSuccess(true);
result.setModel(userId);
} catch (BusinessException e) {
result.setSuccess(false);
result.setErrorMessage(e.getMessage());
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
result.setSuccess(false);
result.setErrorMessage("保存用户信息失败");
}
}
}
}
return result;
}
@Override
public AccountUserDo loginWithPwd(String username, String password) {
AccountUserDo accountUserDo = userComponent.findUserByUserNamePwd(username, password);
return login(accountUserDo);
}
@Override public AccountUserDo findUserByUserNamePwd(String username, String password) {
return userComponent.findUserByUserNamePwd(username, password);
}
@Override
public AccountUserDo loginWithId(Long userId) {
AccountUserDo accountUserDo = userComponent.getById(userId);
return login(accountUserDo);
}
private AccountUserDo login(AccountUserDo accountUserDo) {
if (accountUserDo != null) {
PhoneVerifyDo phoneVerify = phoneVerifyComponent.findPhoneVerify(accountUserDo.getId());
if (phoneVerify != null) {
accountUserDo.setPhoneHasVerify(true);
} else {
accountUserDo.setPhoneHasVerify(false);
}
// 记录用户登录日志
operationLogComponent.addOperationLog("t_user", accountUserDo.getUsername(), 2, "", 0.0, "用户登录", 1);
}
return accountUserDo;
}
@Override
public UserBindDo findUserBindByPartner(int partnerId, String partnerUserId) {
return userComponent.findUserBindByPartner(partnerId, partnerUserId);
}
@Override
public int saveUserBind(UserBindDo userBindDo) {
return userComponent.saveUserBind(userBindDo);
}
private static final Random RANDOM = new Random();
@Override
public Long bindNewUser(AccountUserDo accountUserDo, UserBindDo userBindDo) {
AccountUserDo userByUserName = userComponent.findUserByUserName(accountUserDo.getUsername());
while (userByUserName != null) {
accountUserDo.setUsername(userByUserName.getUsername() + RANDOM.nextInt(10));
userByUserName = userComponent.findUserByUserName(accountUserDo.getUsername());
}
return userComponent.saveNewUserBind(accountUserDo, userBindDo);
}
@Override
public UserBindDo findUserBindByUser(int partnerId, Long userId) {
return userComponent.findUserBindByUser(partnerId, userId);
}
@Override
public int updateUserPhone(Long id, String mobilePhone) {
return userComponent.updateUserPhone(id, mobilePhone);
}
/**
* 根据彩生活用户ID 获取用户ID
* @param colorId
* @return
*/
@Override
public AccountUserDo getUserByColorId(Long colorId){
return userComponent.getUserByColorId(colorId);
}
@Override
public int updatePersonPhone(Long id, String mobilePhone) {
return userComponent.updatePersonPhone(id, mobilePhone);
}
@Override
public InviteCodeDo findInviteCodeByDO(InviteCodeDo inviteCode) {
return userComponent.findInviteCodeByDO(inviteCode);
}
@Override
public int updateInviteCode(InviteCodeDo inviteCode) {
return userComponent.updateInviteCode(inviteCode);
}
@Override
public int updateUserPassword(Long userId, String password, String type) {
return userComponent.updateUserPassword(userId, password, type);
}
@Override
public int updatePayPassword(Long userId, String password) {
return userComponent.updatePayPassword(userId, password);
}
@Override
public AccountUserDo getByIdNo(String idNo) {
return userComponent.getByIdNo(idNo);
}
@Override
public AccountUserDo findUserByEmail(String email) {
return this.userComponent.findUserByEmail(email);
}
@Override
public long setReferee(String recommendId, String userId) {
return this.userComponent.setReferee(recommendId, userId);
}
@Override
public void saveUserReffer(String reffer, Long userId) {
this.userComponent.saveUserReffer(reffer, userId);
}
@Override
public long updateUserUsrCust(Long userId, Long usrCustId, String email, String idNo, String realName) {
return this.userComponent.updateUserUsrCust(userId, usrCustId, email, idNo, realName);
}
@Override
public void joinHyh(String realName, String idNo, long userId) {
}
/**
* 自动注册 登录
* @param refferee 推荐人ID , 没有给 -1
* @param userName 注册用户名
* @param mobilePhone 注册手机
* @param pwd 密码
* @param source 来源, 100 代表贷款端用户
* @param colorid 彩之云ID
* @return AccountUserDo 用户对象
*/
@Override
public IResult<AccountUserDo> register(long refferee, String userName, String mobilePhone,String pwd, int source , long colorid) {
IResult<AccountUserDo> result = null;
//处理参数
if(StringUtils.isBlank(userName)) {
userName = "user_"+mobilePhone;
}
if(StringUtils.isBlank(pwd)) {
pwd = pwd;
}
if(source == 0 ) {
source = 100;
}
if(refferee == 0 ) {
refferee = -1;
}
if(colorid == 0) {
colorid = -1;
}
//end 处理参数
AccountUserDo accountUserDo = new AccountUserDo();
accountUserDo.setUsername(userName);
accountUserDo.setMobilePhone(mobilePhone);
accountUserDo.setPassword(pwd);
accountUserDo.setDealpwd(pwd);
accountUserDo.setColorid(colorid);
accountUserDo.setVipStatus(2);
accountUserDo.setVipCreateTime(new Date());
//处理推荐人
if (refferee > 0) {
if (userComponent.getById(refferee) == null) {
AccountUserDo accountUserDo1 = userComponent.findUserByPhone(refferee + "");
if (accountUserDo1 != null) {
refferee = accountUserDo1.getId();
} else {
result.setSuccess(false);
result.setErrorMessage( "推荐人不存在,请重新填写");
result = new ResultSupport<AccountUserDo>(false);
return result;
}
}
}
accountUserDo.setReffer(refferee + "");
accountUserDo.setCreateTime(new Date());
accountUserDo.setSource(source);
//注册
result = registerUser(accountUserDo);
//写登录日志
if (!result.isSuccess()) {
if(result.getErrorMessage().equals("用户名已存在")){
accountUserDo=userComponent.findUserByUserName(userName);
}else if (result.getErrorMessage().equals("手机号已存在")){
accountUserDo=userComponent.findUserByPhone(mobilePhone);
}else if (result.getErrorMessage().equals("彩之云ID已存在")){
accountUserDo=userComponent.findUserByColorid(colorid+"");
}
}
accountUserDo = loginWithPwd(accountUserDo.getUsername(), accountUserDo.getPassword());
accountUserDo.setPerson(personComponent.getByUserId(accountUserDo.getId()));
result.setModel(accountUserDo);
return result;
}
/**
* 自动注册后更新个人信息
* @param user AccountUserDo对象
* @param realName 真实姓名
* @param idNo 身份证号码
* @param mobile 手机
* @return
*/
@Override
public PersonDo updatePerson(AccountUserDo user, String realName, String idNo , String mobile) {
PersonDo person = new PersonDo();
person.setUserId(user.getId());
person.setRealName(realName);
person.setIdNo(idNo);
person.setTelephone(mobile);
person.setCellPhone(mobile);
personComponent.updatePersonByUserId(person);
return person;
}
/**
* 自动注册后插入彩生活信息到t_colourlife_info
* @param user AccountUserDo对象
* @param colourId 彩生活id
* @param cid 小区id
* @param cname 小区名称
* @param caddress 小区地址
* @return
*/
@Override
public void updateColourlifeInfo(Long id, Long colourId, Long cid, String cname, String caddress) {
userComponent.updateColourlifeInfo(id,colourId,cid,cname,caddress);
}
}