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);
|
}
|
}
|