| package com.xzx.gc.pay.service;  | 
|   | 
| import cn.hutool.core.convert.Convert;  | 
| import cn.hutool.core.util.NumberUtil;  | 
| import com.xzx.gc.common.constant.Constants;  | 
| import com.xzx.gc.common.exception.RestException;  | 
| import com.xzx.gc.entity.PartnerAccount;  | 
| import com.xzx.gc.entity.PartnerAccountLog;  | 
| import com.xzx.gc.pay.mapper.PartnerAccountMapper;  | 
| import lombok.extern.slf4j.Slf4j;  | 
| import org.springframework.beans.factory.annotation.Autowired;  | 
| import org.springframework.stereotype.Service;  | 
| import org.springframework.transaction.annotation.Transactional;  | 
| import tk.mybatis.mapper.entity.Example;  | 
|   | 
| import java.math.BigDecimal;  | 
|   | 
| @Service  | 
| @Transactional  | 
| @Slf4j  | 
| public class PartnerAccountService {  | 
|   | 
|     @Autowired  | 
|     private PartnerAccountMapper partnerAccountMapper;  | 
|   | 
|   | 
|     public PartnerAccount findByPartnerId(String partnerId){  | 
|         PartnerAccount partnerAccount=new PartnerAccount();  | 
|         partnerAccount.setPartnerId(partnerId);  | 
|         partnerAccount.setDelFlag(Constants.DEL_NOT_FLAG);  | 
|         PartnerAccount partnerAccount1 = partnerAccountMapper.selectOne(partnerAccount);  | 
|         return partnerAccount1;  | 
|     }  | 
|   | 
|   | 
|   | 
|     public PartnerAccount findByAccount(String accountId){  | 
|         PartnerAccount partnerAccount=new PartnerAccount();  | 
|         partnerAccount.setAccount(accountId);  | 
|         partnerAccount.setDelFlag(0);  | 
|         return partnerAccountMapper.selectOne(partnerAccount);  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 根据money变化自动判断增长 及优先额度再是环保币的规则  | 
|      */  | 
|     public PartnerAccountLog updateAll(String accountId, BigDecimal money){  | 
|         PartnerAccountLog partnerAccountLog=new PartnerAccountLog();  | 
|         PartnerAccount byAccount = findByAccount(accountId);  | 
|         String hbb = byAccount.getHbb();  | 
|         String fixed=byAccount.getFixedLimit();  | 
|         String over=byAccount.getOverdraftLimit();  | 
|         if(money.compareTo(BigDecimal.ZERO)>0){  | 
|             money=money.abs();  | 
|             //增长  | 
|             BigDecimal limit = Convert.toBigDecimal(fixed);  | 
|             BigDecimal v = NumberUtil.add(money, Convert.toBigDecimal(over));  | 
|             //查询账户信息  | 
|             if (v.compareTo(limit) > 0) {  | 
|                 //将额度填充完   再补money  | 
|                 BigDecimal actualMoney = NumberUtil.sub(v, limit);  | 
|                 updateAddMoneyResetFixLimitByAccountId(accountId,actualMoney,limit);  | 
|                 partnerAccountLog.setAccountMoney(hbb);  | 
|                 partnerAccountLog.setMoney(actualMoney.toString());  | 
|                 partnerAccountLog.setOldLimit(over);  | 
|                 partnerAccountLog.setManageLimit(NumberUtil.sub(limit,Convert.toBigDecimal(over)).toString());  | 
|             } else {  | 
|                 //直接补额度  | 
|                 updateAddMoneyLimitByAccountId(accountId,null,money);  | 
|                 partnerAccountLog.setOldLimit(over);  | 
|                 partnerAccountLog.setManageLimit(money.toString());  | 
|             }  | 
|   | 
|         } else if(money.compareTo(BigDecimal.ZERO)<0){  | 
|             money=money.abs();  | 
|             if(NumberUtil.add(Convert.toBigDecimal(hbb,Constants.MONEY_INIT),Convert.toBigDecimal(over,Constants.MONEY_INIT)).compareTo(money)<0){  | 
|                 throw new RestException(-1,"打包站账户余额不足");  | 
|             }  | 
|             //判断要操作金额是否是在可用额度 和 环保币的和之内  | 
|             if (NumberUtil.isLessOrEqual(money, Convert.toBigDecimal(over))) {//支付金额小于等于支付额度  优先扣除支付额度  | 
|                 partnerAccountMapper.updateReduceMoneyLimitByAccountId(accountId,null,money);  | 
|                 partnerAccountLog.setOldLimit(over);  | 
|                 partnerAccountLog.setManageLimit("-"+money.toString());  | 
|             } else if (NumberUtil.isGreater(money, Convert.toBigDecimal(over))) {   //支付金额大于支付额度 也是优先扣除额度变为0  剩下的用余额扣除  | 
|                 BigDecimal actualMoney = NumberUtil.sub(money, Convert.toBigDecimal(over));  | 
|                 partnerAccountMapper.updateReduceMoneyResetLimitByAccountId(accountId,Convert.toBigDecimal(actualMoney));  | 
|                 partnerAccountLog.setAccountMoney(hbb);  | 
|                 partnerAccountLog.setMoney("-"+actualMoney);  | 
|                 partnerAccountLog.setOldLimit(over);  | 
|                 partnerAccountLog.setManageLimit("-"+over);  | 
|             }  | 
|         }  | 
|         return partnerAccountLog;  | 
|   | 
|     }  | 
|   | 
|   | 
|     public void updateAddMoneyLimitByAccountId(String accountId,BigDecimal money,BigDecimal over){  | 
|         partnerAccountMapper.updateAddMoneyLimitByAccountId(accountId,money,over);  | 
|     }  | 
|   | 
|     public void updateAddMoneyResetFixLimitByAccountId(String accountId,BigDecimal money,BigDecimal over){  | 
|         partnerAccountMapper.updateAddMoneyResetFixLimitByAccountId(accountId,money,over);  | 
|     }  | 
|   | 
|   | 
|     public void updateReduceMoneyByPartnerId(String partnerId,BigDecimal money){  | 
|         //判断合伙人账户的钱是否足够  | 
|         PartnerAccount byPartnerId = findByPartnerId(partnerId);  | 
|         BigDecimal bigDecimal = Convert.toBigDecimal(byPartnerId.getHbb(),Constants.MONEY_INIT);  | 
|         if(bigDecimal.compareTo(money)<0){  | 
|             throw new RestException(-1,"合伙人账户余额不足");  | 
|         }  | 
|         partnerAccountMapper.updateReduceMoneyByPartnerId(partnerId,money);  | 
|     }  | 
|   | 
|   | 
|   | 
|     public void updateByAccount(PartnerAccount partnerAccount){  | 
|         Example example=new Example(PartnerAccount.class);  | 
|         Example.Criteria criteria = example.createCriteria();  | 
|         criteria.andEqualTo("account",partnerAccount.getAccount());  | 
|         criteria.andEqualTo("delFlag","0");  | 
|         partnerAccountMapper.updateByExampleSelective(partnerAccount,example);  | 
|     }  | 
| }  |