package com.xzx.gc.user.service;
|
|
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.NumberUtil;
|
import com.xzx.gc.common.constant.Constants;
|
import com.xzx.gc.common.exception.RestException;
|
import com.xzx.gc.common.utils.BusinessUtil;
|
import com.xzx.gc.entity.CityPartner;
|
import com.xzx.gc.entity.PartnerAccount;
|
import com.xzx.gc.entity.PartnerAccountLog;
|
import com.xzx.gc.model.admin.AccountLogModel;
|
import com.xzx.gc.model.admin.PartnerAccountLogModel;
|
import com.xzx.gc.model.admin.PartnerAccountModel;
|
import com.xzx.gc.user.mapper.CityPartnerMapper;
|
import com.xzx.gc.user.mapper.PartnerAccountMapper;
|
import com.xzx.gc.util.DoubleUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
|
@Service
|
@Transactional
|
@Slf4j
|
public class PartnerAccountService {
|
|
@Autowired
|
private PartnerAccountMapper partnerAccountMapper;
|
|
@Autowired
|
private CityPartnerMapper cityPartnerMapper;
|
|
|
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);
|
}
|
|
public PartnerAccount findByUserId(String userId){
|
PartnerAccount partnerAccount=new PartnerAccount();
|
partnerAccount.setUserId(userId);
|
partnerAccount.setDelFlag(0);
|
return partnerAccountMapper.selectOne(partnerAccount);
|
}
|
|
|
public void update(PartnerAccount partnerAccount){
|
partnerAccountMapper.updateByPrimaryKeySelective(partnerAccount);
|
}
|
|
|
public void updateAddMoneyByPartnerId(String partnerId,BigDecimal money){
|
partnerAccountMapper.updateAddMoneyByPartnerId(partnerId,money);
|
}
|
|
|
public void insertPartnerAccountLog(PartnerAccountModel accountModel, String type, BigDecimal money, String payOrderId, String packageType) {
|
//写入日志
|
AccountLogModel log = new AccountLogModel();
|
boolean flag = true;
|
if(null!=accountModel.getAddType()&&!"".equals(accountModel.getAddType())){
|
log.setNewMoney(DoubleUtil.roundTwo(new BigDecimal(accountModel.getHbb()).add(money).toString()));
|
|
}else{
|
flag = false;
|
log.setNewMoney(DoubleUtil.roundTwo(new BigDecimal(accountModel.getHbb()).subtract(money).toString()));
|
|
}
|
CityPartner partner = cityPartnerMapper.queryEntityByUserIds(accountModel.getUserId());
|
PartnerAccountLogModel partnerLog = new PartnerAccountLogModel();
|
partnerLog.setFlowNo(payOrderId);
|
partnerLog.setCreateTime(DateUtil.now());
|
partnerLog.setApproverStatus("1");
|
if(type.equals("14")){
|
if(!flag){
|
partnerLog.setMoney(DoubleUtil.roundTwo(money.multiply(new BigDecimal("-1")).toString()));
|
|
}else{
|
partnerLog.setMoney(DoubleUtil.roundTwo(money.toString()));
|
|
}
|
|
}else{
|
if(!flag){
|
partnerLog.setMoney(DoubleUtil.roundTwo(money.multiply(new BigDecimal("-1")).toString()));
|
|
}else{
|
partnerLog.setMoney(DoubleUtil.roundTwo(money.toString()));
|
|
}
|
}
|
partnerLog.setHbb(log.getNewMoney());
|
partnerLog.setDelFlag(0);
|
partnerLog.setAccountId(accountModel.getAccount());
|
partnerLog.setAccountMoney(DoubleUtil.roundTwo(accountModel.getHbb() + ""));
|
partnerLog.setUserName(partner.getPartnerName());
|
if (null != packageType) {
|
partnerLog.setType(packageType);
|
|
} else {
|
if(type.equals("9")){
|
partnerLog.setType("12");
|
}else if(type.equals("8")){
|
partnerLog.setType("7");
|
}else{
|
partnerLog.setType("1");
|
}
|
}
|
partnerLog.setUserPhone(partner.getMobilePhone());
|
partnerLog.setRoleName("城市合伙人");
|
partnerAccountMapper.addPartnerAccountLog(partnerLog);
|
}
|
|
/**
|
* 根据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);
|
}
|
}
|