提交 96d9834e authored 作者: huyufan's avatar huyufan

借款判断

上级 0e7da6d2
......@@ -14,8 +14,10 @@ public enum OwnerLoanAccountRunningWaterRecordEnum {
@Getter
@AllArgsConstructor
public enum RunWaterType {
APPROVE_WAIT(10, "运单核销"),
APPROVE_PASS(20, "借款"),
APPROVE_WAIT(10, "借款"),
APPROVE_FROZEN(20, "冻结"),
APPROVE_CHILD_WRITE_OFF(30, "运单核销"),
APPROVE_THAW(40, "解冻"),
;
private final Integer code;
......
......@@ -7,24 +7,36 @@ import com.clx.order.vo.pc.owner.OwnerQuotationDetailVO;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OwnerRunningWaterRecordDao;
import com.clx.performance.dao.loan.OwnerLoanAccountDao;
import com.clx.performance.dao.loan.OwnerLoanAccountRunningWaterRecordDao;
import com.clx.performance.dao.loan.OwnerLoanRecordDao;
import com.clx.performance.dao.loan.OwnerRepaymentDao;
import com.clx.performance.enums.OrderGoodsOverWeightEnum;
import com.clx.performance.enums.OwnerAccountEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.loan.OwnerLoanAccountRunningWaterRecordEnum;
import com.clx.performance.enums.loan.OwnerLoanRecordEnum;
import com.clx.performance.enums.loan.OwnerRePaymentEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.OwnerAccount;
import com.clx.performance.model.OwnerRunningWaterRecord;
import com.clx.performance.model.loan.OwnerLoanAccount;
import com.clx.performance.model.loan.OwnerLoanAccountRunningWaterRecord;
import com.clx.performance.model.loan.OwnerLoanRecord;
import com.clx.performance.model.loan.OwnerRepayment;
import com.clx.user.vo.feign.OwnerInfoFeignVO;
import com.msl.common.base.Optional;
import com.msl.common.exception.ServiceSystemException;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@Component
@AllArgsConstructor
......@@ -40,7 +52,13 @@ public class OrderChildLoanComponent {
private final OwnerRepaymentDao ownerRepaymentDao;
public void getChildDetermine(FeignOrderInfoVO orderInfoVO, OwnerInfoFeignVO ownerInfoFeignVO, OrderGoods orderGoods) {
private final OwnerLoanRecordDao ownerLoanRecordDao;
private final IdGenerateSnowFlake idGenerateSnowFlake;
private final OwnerLoanAccountRunningWaterRecordDao ownerLoanAccountRunningWaterRecordDao;
public void getChildDetermine(FeignOrderInfoVO orderInfoVO, OwnerInfoFeignVO ownerInfoFeignVO, OrderGoods orderGoods, String childNo) {
OwnerQuotationDetailVO quotationDetailVO = orderFeign.getQuotationByOrderNo(orderInfoVO.getOrderNo()).getData();
BigDecimal freightFreezeRate = quotationDetailVO.getFreightFreezeRate();
......@@ -52,13 +70,14 @@ public class OrderChildLoanComponent {
Integer overWeight = orderInfoVO.getOverWeight();
if (OrderGoodsOverWeightEnum.NO.getCode().equals(overWeight)) {
determine(orderGoods.getPendingOrderFreight().multiply(new BigDecimal(35)));
determine(orderGoods.getPendingOrderFreight().multiply(new BigDecimal(35)), ownerInfoFeignVO, childNo);
} else {
determine(orderGoods.getPendingOrderFreight().multiply(new BigDecimal(50)));
determine(orderGoods.getPendingOrderFreight().multiply(new BigDecimal(50)), ownerInfoFeignVO, childNo);
}
}
public void determine(BigDecimal orderChildPrice) {
@Transactional(rollbackFor = Exception.class)
public void determine(BigDecimal orderChildPrice, OwnerInfoFeignVO ownerInfoFeignVO, String childNo) {
List<OwnerRunningWaterRecord> runningWaterRecordList = ownerRunningWaterRecordDao.getOwnerRunningWaterRecord("");
BigDecimal frozen = runningWaterRecordList.stream().filter(item -> {
return item.getRunningWaterType().equals(OwnerAccountEnum.RunningWaterStatus.FROZEN.getCode())
......@@ -84,7 +103,7 @@ public class OrderChildLoanComponent {
}
}
// 进行借款判断
OwnerLoanAccount ownerLoanAccount = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo, null).get();
OwnerLoanAccount ownerLoanAccount = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo, ownerInfoFeignVO.getUserNo()).get();
BigDecimal ownerLoanAccountSum = ownerLoanAccount.getVirtuallyUsableBalance().add(ownerLoanAccount.getFundingUsableBalance());
if (ownerLoanAccountSum.compareTo(orderChildPrice) < 0) {
......@@ -96,6 +115,83 @@ public class OrderChildLoanComponent {
//逾期:不允许
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_SAVE_FAIL, "货主已欠款");
}
List<OwnerLoanRecord> updateList = new LinkedList<>();
//借款扣款:
List<OwnerLoanRecord> ownerLoanRecords = ownerLoanRecordDao.selectLoanBalance(ownerInfoFeignVO.getUserNo());
BigDecimal orderChildPriceTemp = orderChildPrice;
for (OwnerLoanRecord ownerLoanRecord : ownerLoanRecords) {
BigDecimal loanResidueBalance = ownerLoanRecord.getLoanResidueBalance();
if (loanResidueBalance.compareTo(orderChildPriceTemp) >= 0) {
generateFrozenOwnerLoanRunningWater(ownerLoanRecord, childNo, orderChildPrice);
updateList.add(ownerLoanRecord.setLoanResidueBalance(loanResidueBalance.subtract(orderChildPriceTemp)));
break;
} else {
generateFrozenOwnerLoanRunningWater(ownerLoanRecord, childNo, orderChildPrice);
updateList.add(ownerLoanRecord.setLoanResidueBalance(BigDecimal.ZERO));
orderChildPriceTemp = orderChildPriceTemp.subtract(loanResidueBalance);
}
}
for (OwnerLoanRecord update : updateList) {
ownerLoanRecordDao.updateEntityByKey(update);
}
}
public void generateFrozenOwnerLoanRunningWater(OwnerLoanRecord ownerLoanRecord, String childNo, BigDecimal orderChildPrice) {
OwnerLoanAccount update = new OwnerLoanAccount();
while (true) {
ownerLoanAccountUpdate(ownerLoanRecord, orderChildPrice, update);
Integer i = ownerLoanAccountDao.updateAccountCAS(update, LocalDateTime.now(), false);
if (i == 1) {
OwnerLoanAccountRunningWaterRecord waterRecord = new OwnerLoanAccountRunningWaterRecord();
waterRecord.setLoanNo(ownerLoanRecord.getLoanNo());
waterRecord.setOwnerUserName(ownerLoanRecord.getOwnerUserName());
waterRecord.setOwnerUserNo(ownerLoanRecord.getOwnerUserNo());
waterRecord.setMobile(ownerLoanRecord.getMobile());
waterRecord.setRunningWaterNo(idGenerateSnowFlake.nextId(1L));
waterRecord.setChildNo(childNo);
waterRecord.setRunningWaterType(OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_FROZEN.getCode());
waterRecord.setAccountBalance(orderChildPrice);
OwnerLoanAccount account = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo,
ownerLoanRecord.getOwnerUserNo()).get();
waterRecord.setAccountBalance(account.getVirtuallyAccountBalance().add(account.getFundingAccountBalance()));
waterRecord.setUseableBalance(account.getVirtuallyUsableBalance().add(account.getFundingUsableBalance()));
waterRecord.setCreateBy("系统");
ownerLoanAccountRunningWaterRecordDao.saveEntity(waterRecord);
break;
}
}
}
public void ownerLoanAccountUpdate(OwnerLoanRecord ownerLoanRecord, BigDecimal orderChildPrice, OwnerLoanAccount update) {
Integer loanType = ownerLoanRecord.getLoanType();
OwnerLoanAccount account = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo,
ownerLoanRecord.getOwnerUserNo()).get();
if (OwnerLoanRecordEnum.LoanType.VIRTUAL_CURRENCY.getCode().equals(loanType)) {
update.setId(account.getId());
update.setModifiedTime(account.getModifiedTime());
update.setVirtuallyFrozenBalance(orderChildPrice);
update.setVirtuallyUsableBalance(orderChildPrice);
update.setVirtuallyAccountBalance(BigDecimal.ZERO);
update.setFundingAccountBalance(BigDecimal.ZERO);
update.setFundingFrozenBalance(BigDecimal.ZERO);
update.setFundingUsableBalance(BigDecimal.ZERO);
} else {
update.setId(account.getId());
update.setModifiedTime(account.getModifiedTime());
update.setFundingFrozenBalance(orderChildPrice);
update.setFundingUsableBalance(orderChildPrice);
update.setFundingAccountBalance(BigDecimal.ZERO);
update.setVirtuallyFrozenBalance(BigDecimal.ZERO);
update.setVirtuallyUsableBalance(BigDecimal.ZERO);
update.setVirtuallyAccountBalance(BigDecimal.ZERO);
}
}
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.loan.OwnerLoanRecordDao;
import com.clx.performance.enums.loan.OwnerLoanRecordEnum;
import com.clx.performance.mapper.loan.OwnerLoanRecordMapper;
import com.clx.performance.model.loan.OwnerLoanRecord;
import com.clx.performance.param.pc.loan.carrier.PageCarrierOwnerLoanRecordParam;
......@@ -13,6 +14,7 @@ import com.msl.common.dao.impl.BaseDaoImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Objects;
/**
......@@ -53,4 +55,14 @@ public class OwnerLoanRecordDaoImpl extends BaseDaoImpl<OwnerLoanRecordMapper, O
return baseMapper.pageByParam(page,param);
}
@Override
public List<OwnerLoanRecord> selectLoanBalance(Long userNo) {
return baseMapper.selectList(
lQrWrapper().eq(OwnerLoanRecord::getStatus, OwnerLoanRecordEnum.Status.APPROVE_PASS.getCode())
.eq(OwnerLoanRecord::getOwnerUserNo , userNo)
.gt(OwnerLoanRecord::getLoanResidueBalance, 0)
.orderByAsc(OwnerLoanRecord::getId)
);
}
}
......@@ -8,6 +8,8 @@ import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanRecordOfOwner;
import com.clx.performance.vo.pc.loan.carrier.OwnerLoanRecordVO;
import com.msl.common.dao.BaseDao;
import java.util.List;
/**
* @author kavin
......@@ -19,4 +21,5 @@ public interface OwnerLoanRecordDao extends BaseDao<OwnerLoanRecordMapper, Owner
IPage<OwnerLoanRecordVO> pageByParam(PageOwnerLoanRecordOfOwner param);
List<OwnerLoanRecord> selectLoanBalance(Long userNo);
}
......@@ -127,6 +127,9 @@ public class OrderChildSyncTransportListener {
if (subtract.compareTo(BigDecimal.ZERO) <= 0 || ans.compareTo(BigDecimal.ZERO) == 0) {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
BigDecimal settlementFreight = settlementOwnerDetail.getSettlementFreight();
//生成借款标识
} else {
if (subtract.subtract(ans).compareTo(BigDecimal.ZERO) >= 0) {
//账户扣钱并生成扣除流水
......
......@@ -25,12 +25,14 @@ public interface OwnerLoanAccountMapper extends BaseMapper<OwnerLoanAccount> {
)
Integer addAccount(@Param("account") OwnerLoanAccount account, @Param("now") String nowStr);
// @Update("update owner_account set funding_amount = funding_amount - #{account.fundingAmount}," +
// "frozen_balance = frozen_balance + #{account.frozenBalance},account_balance = account_balance - #{account.accountBalance}," +
// "modified_time=#{now}"
// + "where id = #{account.id} and modified_time = #{account.modifiedTime}"
// )
// Integer subAccount(@Param("account") OwnerAccount account, @Param("now") String now);
@Update("update owner_loan_account set funding_account_balance = funding_account_balance - #{account.fundingAccountBalance}," +
",funding_usable_balance = funding_usable_balance - #{account.fundingUsableBalance},funding_frozen_balance = funding_frozen_balance - #{account.fundingFrozenBalance}," +
",virtually_account_balance = virtually_account_balance - #{account.virtuallyAccountBalance},virtually_usable_balance = virtually_usable_balance - #{account.virtuallyUsableBalance}," +
",virtually_frozen_balance = virtually_frozen_balance - #{account.virtuallyFrozenBalance}," +
"modified_time=#{now}"
+ "where id = #{account.id} and modified_time = #{account.modifiedTime}"
)
Integer subAccount(@Param("account") OwnerLoanAccount account, @Param("now") String now);
/**
* @see OwnerLoanAccountSqlProvider#pageByParam(Page, PageOwnerLoanAccountParam)
......
......@@ -64,6 +64,10 @@ public class OwnerLoanRecord implements HasKey<Integer> {
@ApiModelProperty("借款金额")
private BigDecimal loanBalance;
@TableField("loan_residue_balance")
@ApiModelProperty("借款剩余金额")
private BigDecimal loanResidueBalance;
@TableField("borrower")
@ApiModelProperty("借款方")
private String borrower;
......
......@@ -140,12 +140,13 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
ownerLoanRecord.setLoanType(param.getLoanType());
if (OwnerLoanRecordEnum.LoanType.FUND.getCode().equals(param.getLoanType())) {
//资金 TODO 调中信银企直连的产品,从诚联信账户中给鑫祥和执行转账
//资金 TODO 调宁波银企直连的产品,从诚联信账户中给鑫祥和执行转账
NbBankOrderPayResultVO orderPayResultVO = bankService.orderDirectPay(param.getLoanNo() ,
ownerLoanRecord.getLoanBalance().intValue(), "", "", "");
ownerLoanRecord.setRunningWaterOpenNo(orderPayResultVO.getTransSeqNo());
ownerLoanRecord.setMerchantRunningWaterNo(orderPayResultVO.getMerSeqNo());
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.PAYING.getCode());
ownerLoanRecord.setLoanResidueBalance(ownerLoanRecord.getLoanBalance());
} else {
// 虚拟币 直接增加 更改状态审批通过
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.APPROVE_PASS.getCode());
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论