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