yujian
2019-08-27 d8359ddb48dab5cc797a9d552e11fde571f4920c
fanli/src/main/java/com/yeshi/fanli/service/impl/user/BindingAccountServiceImpl.java
@@ -1,6 +1,5 @@
package com.yeshi.fanli.service.impl.user;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
@@ -9,11 +8,6 @@
import javax.annotation.Resource;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -26,18 +20,24 @@
import com.yeshi.fanli.dao.mybatis.BindingAccountMapper;
import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper;
import com.yeshi.fanli.dao.user.BindingAccountDao;
import com.yeshi.fanli.entity.bus.user.AlipayAccountValidNormalHistory;
import com.yeshi.fanli.entity.bus.user.BindingAccount;
import com.yeshi.fanli.entity.bus.user.UserAccountBindingHistory;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.money.UserMoneyDebt;
import com.yeshi.fanli.entity.money.UserMoneyDebt.UserMoneyDebtTypeEnum;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.exception.AlipayAccountException;
import com.yeshi.fanli.exception.AlipayTransferException;
import com.yeshi.fanli.exception.BindingAccountException;
import com.yeshi.fanli.exception.money.UserMoneyDebtException;
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.money.UserMoneyDebtService;
import com.yeshi.fanli.service.inter.msg.UserMoneyMsgNotificationService;
import com.yeshi.fanli.service.inter.user.BindingAccountService;
import com.yeshi.fanli.service.inter.user.UserNotificationService;
import com.yeshi.fanli.service.inter.user.UserAccountBindingHistoryService;
import com.yeshi.fanli.service.inter.user.UserMoneyService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
@@ -46,61 +46,50 @@
@Service
public class BindingAccountServiceImpl implements BindingAccountService {
   @Resource
   private BindingAccountDao bindingAccountDao;
   @Resource
   private BindingAccountMapper bindingAccountMapper;
   @Resource
   private AlipayAccountValidNormalHistoryMapper alipayAccountValidNormalHistoryMapper;
   @Resource
   private UserInfoMapper userInfoMapper;
   @Resource
   private UserNotificationService userNotificationService;
   private UserAccountBindingHistoryService userAccountBindingHistoryService;
   @Resource
   private UserMoneyDetailMapper userMoneyDetailMapper;
   @Resource
   private UserMoneyService userMoneyService;
   @Resource
   private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
   @Resource
   private UserMoneyDebtService userMoneyDebtService;
   public List<BindingAccount> getBindingAccountByUid(long uid) {
      return bindingAccountDao.list("from BindingAccount ba where ba.userInfo.id=?", new Serializable[] { uid });
      return bindingAccountMapper.selectByUid(uid);
   }
   public void addBindingAccount(BindingAccount addAccount) throws BindingAccountException {
      List<BindingAccount> list = bindingAccountDao.list(
            "from BindingAccount ba where ba.userInfo.id=? and ba.type=?",
            new Serializable[] { addAccount.getUserInfo().getId(), addAccount.getType() });
      if (list == null || list.size() == 0) {
         bindingAccountDao.save(addAccount);
      BindingAccount account = bindingAccountMapper.selectByUidAndType(addAccount.getUserInfo().getId(),
            addAccount.getType());
      if (account == null) {
         bindingAccountMapper.insertSelective(addAccount);
      } else {
         throw new BindingAccountException(Constant.BA_EXIST);
      }
   }
   public Integer deleteBindingAccount(final BindingAccount account) {
      return (Integer) bindingAccountDao.excute(new HibernateCallback() {
         public Integer doInHibernate(Session session) throws HibernateException {
            Transaction transaction = session.beginTransaction();
            Query delete = session.createQuery("delete BindingAccount ba where ba.userInfo.id=? and ba.type=?");
            delete.setLong(0, account.getUserInfo().getId());
            delete.setInteger(1, account.getType());
            int update = delete.executeUpdate();
            transaction.commit();
            return update;
         }
      });
   @Transactional
   public Integer deleteBindingAccount(BindingAccount account) {
      BindingAccount oldAccount = bindingAccountMapper.selectByUidAndType(account.getUserInfo().getId(),
            account.getType());
      if (oldAccount != null)
         bindingAccountMapper.deleteByPrimaryKey(oldAccount.getId());
      return 1;
   }
   public BindingAccount getBindingAccountByUidAndType(long uid, int type) {
      List<BindingAccount> list = bindingAccountDao
            .list("from BindingAccount ba where ba.userInfo.id=? and ba.type=?", new Serializable[] { uid, type });
      if (list != null && list.size() != 0) {
         return list.get(0);
      }
      return null;
      BindingAccount account = bindingAccountMapper.selectByUidAndType(uid, type);
      return account;
   }
   @Override
@@ -113,11 +102,11 @@
         bindingAccount.setName(name);
         bindingAccount.setType(BindingAccount.TYPE_ALIPAY);
         bindingAccount.setUserInfo(new UserInfo(uid));
         bindingAccountDao.create(bindingAccount);
         bindingAccountMapper.insertSelective(bindingAccount);
      } else {
         bindingAccount.setName(name);
         bindingAccount.setAccount(account);
         bindingAccountDao.update(bindingAccount);
         bindingAccountMapper.updateByPrimaryKeySelective(bindingAccount);
      }
      return bindingAccount;
   }
@@ -157,13 +146,12 @@
      UserInfo userInfo = userInfoMapper.selectByPrimaryKeyForUpdate(uid);
      if (userInfo.getMyHongBao().compareTo(new BigDecimal("0")) <= 0)
         throw new AlipayAccountException(AlipayAccountException.CODE_NO_MONEY, "你的账户目前没有余额,无需绑定提现帐号。");
         throw new AlipayAccountException(AlipayAccountException.CODE_NO_MONEY, "你的账户无余额,无需绑定提现帐号。");
      // 需要转账验证
      BigDecimal money = new BigDecimal("0.1");
      transferAlipayWithVerify(account, name);
      // 扣款
      userInfoMapper.subHongBaoByUid(uid, money);
      // 转账成功
      // 插入转账成功表
      AlipayAccountValidNormalHistory history = new AlipayAccountValidNormalHistory();
@@ -172,10 +160,10 @@
      history.setName(name);
      history.setUid(uid);
      alipayAccountValidNormalHistoryMapper.insertSelective(history);
      UserMoneyDetail userMoneyDetail = null;
      // 新版资金
      try {
         UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createExtractAccountValid(history, money);
         userMoneyDetailMapper.insert(userMoneyDetail);
         userMoneyDetail = UserMoneyDetailFactory.createExtractAccountValid(history, money);
      } catch (UserMoneyDetailException e) {
         try {
            LogHelper.errorDetailInfo(e);
@@ -184,7 +172,26 @@
         }
      }
      userNotificationService.alipayAccountValidRight(uid, money, account);
      // 余额充足
      if (userInfo.getMyHongBao().compareTo(money) >= 0) {
         // 扣款
         userMoneyService.subUserMoney(uid, money, userMoneyDetail);
         userMoneyMsgNotificationService.alipayAccountValid(history);
      } else {// 余额不足,暂时不扣款,加入借贷关系
         UserMoneyDebt debt = new UserMoneyDebt();
         debt.setCreateTime(new Date());
         debt.setLeftMoney(money);
         debt.setOriginMoney(money);
         debt.setSourceId(history.getId());
         debt.setType(UserMoneyDebtTypeEnum.extractVerify);
         debt.setUid(uid);
         try {
            userMoneyDebtService.addUserMoneyDebt(debt);
         } catch (UserMoneyDebtException e) {
            LogHelper.errorDetailInfo(e, "验证ID:" + history.getId(), "");
         }
      }
   }
@@ -221,6 +228,17 @@
   @Override
   public BindingAccount changeAlipayBindingWithVerify(Long uid, String name, String account)
         throws AlipayTransferException, AlipayApiException, AlipayAccountException {
      BindingAccount bindingAccount = bindingAccountMapper.selectByUidAndType(uid, BindingAccount.TYPE_ALIPAY);
      if (bindingAccount != null) {
         // 验证是否7天内更换了手机号
         UserAccountBindingHistory history = userAccountBindingHistoryService.getLatestHistory(uid,
               UserAccountBindingHistory.TYPE_PHONE);
         // 手机号更换绑定的7天内不能提现
         if (history != null && !history.getFirst()
               && (System.currentTimeMillis() - history.getCreateTime().getTime()) < 1000 * 60 * 60 * 24 * 7L) {
            throw new AlipayAccountException(111, "修改手机号7天内不允许修改支付宝账号");
         }
      }
      try {
         validAlipayAccount(uid, account, name);
@@ -232,7 +250,6 @@
         throw new AlipayAccountException(e1.getCode(), e1.getMsg());
      }
      BindingAccount bindingAccount = bindingAccountMapper.selectByUidAndType(uid, BindingAccount.TYPE_ALIPAY);
      if (bindingAccount == null)// 创建账号
      {
         bindingAccount = new BindingAccount();