| | |
| | | package com.yeshi.fanli.service.impl.user;
|
| | |
|
| | | import java.io.Serializable;
|
| | | import java.math.BigDecimal;
|
| | | import java.util.Calendar;
|
| | | import java.util.Date;
|
| | |
| | |
|
| | | 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;
|
| | |
|
| | |
| | | import com.alipay.api.DefaultAlipayClient;
|
| | | import com.alipay.api.request.AlipayFundTransToaccountTransferRequest;
|
| | | import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
|
| | | import com.yeshi.fanli.dao.mybatis.AccountDetailsMapper;
|
| | | import com.yeshi.fanli.dao.mybatis.AlipayAccountValidNormalHistoryMapper;
|
| | | 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.AccountDetails;
|
| | | 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.AccountDetailsFactory;
|
| | | import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
|
| | |
|
| | | import net.sf.json.JSONObject;
|
| | |
|
| | | @Service
|
| | | public class BindingAccountServiceImpl implements BindingAccountService {
|
| | |
|
| | | @Resource
|
| | | private BindingAccountDao bindingAccountDao;
|
| | | @Resource
|
| | | private BindingAccountMapper bindingAccountMapper;
|
| | | @Resource
|
| | |
| | | @Resource
|
| | | private UserInfoMapper userInfoMapper;
|
| | | @Resource
|
| | | private AccountDetailsMapper accountDetailsMapper;
|
| | | @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
|
| | |
| | | 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;
|
| | | }
|
| | |
| | |
|
| | | 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();
|
| | |
| | | history.setName(name);
|
| | | history.setUid(uid);
|
| | | alipayAccountValidNormalHistoryMapper.insertSelective(history);
|
| | | // 资金记录 站内信
|
| | | AccountDetails accountDetails = AccountDetailsFactory.create("-" + money.toString(),
|
| | | AccountDetailsFactory.VALID_ALIPAY_ACCOUNT, null, null, new UserInfo(uid));
|
| | | accountDetailsMapper.insertSelective(accountDetails);
|
| | | UserMoneyDetail userMoneyDetail = null;
|
| | | // 新版资金
|
| | | try {
|
| | | UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createExtractAccountValid(history, money);
|
| | | userMoneyDetail.setId(accountDetails.getId());
|
| | | userMoneyDetailMapper.insert(userMoneyDetail);
|
| | | userMoneyDetail = UserMoneyDetailFactory.createExtractAccountValid(history, money);
|
| | | } catch (UserMoneyDetailException e) {
|
| | | try {
|
| | | LogHelper.errorDetailInfo(e);
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | 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(), "");
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | |
| | | @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);
|
| | |
| | | throw new AlipayAccountException(e1.getCode(), e1.getMsg());
|
| | | }
|
| | |
|
| | | BindingAccount bindingAccount = bindingAccountMapper.selectByUidAndType(uid, BindingAccount.TYPE_ALIPAY);
|
| | | if (bindingAccount == null)// 创建账号
|
| | | {
|
| | | bindingAccount = new BindingAccount();
|