提交 447715a2 authored 作者: huyufan's avatar huyufan

接单借款判断

上级 90e6271a
package com.clx.performance.component;
import cn.hutool.json.JSONUtil;
import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.order.vo.pc.owner.OwnerQuotationDetailVO;
......@@ -18,7 +19,6 @@ 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;
......@@ -28,18 +28,18 @@ import com.clx.user.vo.feign.OwnerInfoFeignVO;
import com.msl.common.base.Optional;
import com.msl.common.exception.ServiceSystemException;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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
@Slf4j
public class OrderChildLoanComponent {
private final OrderFeign orderFeign;
......@@ -58,27 +58,40 @@ public class OrderChildLoanComponent {
private final OwnerLoanAccountRunningWaterRecordDao ownerLoanAccountRunningWaterRecordDao;
public void getChildDetermine(FeignOrderInfoVO orderInfoVO, OwnerInfoFeignVO ownerInfoFeignVO, OrderGoods orderGoods, String childNo) {
/**
* 接单校验判断
* @param orderInfoVO
* @param ownerInfoFeignVO
* @param orderGoods
* @param childNo
*/
@Transactional(rollbackFor = Exception.class)
public void getChildDetermine(FeignOrderInfoVO orderInfoVO, OwnerInfoFeignVO ownerInfoFeignVO, OrderGoods orderGoods,
String childNo) {
log.info("1.接单校验判断");
OwnerQuotationDetailVO quotationDetailVO = orderFeign.getQuotationByOrderNo(orderInfoVO.getOrderNo()).getData();
BigDecimal freightFreezeRate = quotationDetailVO.getFreightFreezeRate();
if (freightFreezeRate.compareTo(BigDecimal.ONE) == 0) {
//百分百预付不需要考虑借款账户
log.info("2.百分百预付不需要考虑借款账户");
return;
}
//发货-是否可超标准 0 否 1 是
Integer overWeight = orderInfoVO.getOverWeight();
if (OrderGoodsOverWeightEnum.NO.getCode().equals(overWeight)) {
determine(orderGoods.getPendingOrderFreight().multiply(new BigDecimal(35)), ownerInfoFeignVO, childNo);
log.info("3.进行标吨判断");
determine(orderGoods.getPendingOrderFreight().multiply(new BigDecimal(35)), ownerInfoFeignVO, orderGoods.getOrderNo(), childNo);
} else {
determine(orderGoods.getPendingOrderFreight().multiply(new BigDecimal(50)), ownerInfoFeignVO, childNo);
log.info("3.进行超吨判断");
determine(orderGoods.getPendingOrderFreight().multiply(new BigDecimal(50)), ownerInfoFeignVO, orderGoods.getOrderNo(), childNo);
}
}
@Transactional(rollbackFor = Exception.class)
public void determine(BigDecimal orderChildPrice, OwnerInfoFeignVO ownerInfoFeignVO, String childNo) {
List<OwnerRunningWaterRecord> runningWaterRecordList = ownerRunningWaterRecordDao.getOwnerRunningWaterRecord("");
public void determine(BigDecimal orderChildPrice, OwnerInfoFeignVO ownerInfoFeignVO, String orderNo, String childNo) {
log.info("4.预估运费{},货主{},订单号{},运单号{}", orderChildPrice, ownerInfoFeignVO.getUserNo(), orderNo, childNo);
List<OwnerRunningWaterRecord> runningWaterRecordList = ownerRunningWaterRecordDao.getOwnerRunningWaterRecord(orderNo);
BigDecimal frozen = runningWaterRecordList.stream().filter(item -> {
return item.getRunningWaterType().equals(OwnerAccountEnum.RunningWaterStatus.FROZEN.getCode())
&& item.getAccountType().equals(OwnerAccountEnum.AccountTypeStatus.PREPAID_FREIGHT_ACCOUNT.getCode())
......@@ -91,42 +104,52 @@ public class OrderChildLoanComponent {
;
}).map(OwnerRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal subtract = frozen.subtract(takeOut);
log.info("5.查询预付运费相关流水:订单冻结预付运费{}, 扣除流水{}", frozen, takeOut);
if (subtract.compareTo(BigDecimal.ZERO) > 0) {
//查询未结算的运单(没有产生扣除流水的运单)
List<OrderChild> orderChildList = orderChildDao.selectInTransitOrderChildLtUnsettle("");
List<OrderChild> orderChildList = orderChildDao.selectInTransitOrderChildLtUnsettle(orderNo);
BigDecimal orderChildSum = orderChildList.stream().map(OrderChild::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal ans = subtract.subtract(orderChildSum);
log.info("6.当前订单冻结的预付运费还有剩余, 查询查询未结算的运单(没有产生扣除流水的运单)总计{},账户剩余{}", orderChildSum, subtract);
if (ans.compareTo(BigDecimal.ZERO) >= 0 && ans.compareTo(orderChildPrice) >= 0) {
//预付运费够
log.info("7.预付运费足够,不限制");
return;
}
}
log.info("8.预付运费不够,开始进行借款判断");
// 进行借款判断
OwnerLoanAccount ownerLoanAccount = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo, ownerInfoFeignVO.getUserNo()).get();
BigDecimal ownerLoanAccountSum = ownerLoanAccount.getVirtuallyUsableBalance().add(ownerLoanAccount.getFundingUsableBalance());
if (ownerLoanAccountSum.compareTo(orderChildPrice) < 0) {
log.info("9.当前货主借款账户总计{},小于预估运费{}", ownerLoanAccountSum, orderChildPrice);
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_SAVE_FAIL, "货主已欠款");
}
//借款账户钱够,判断是否逾期
log.info("10.借款账户钱够,判断是否逾期");
Optional<OwnerRepayment> optional = ownerRepaymentDao.getLimitOneByField(OwnerRepayment::getBeOverdue, OwnerRePaymentEnum.BeOverdue.YES.getCode());
if (optional.isPresent()) {
//逾期:不允许
log.info("11.当前货主存在逾期借款");
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();
log.info("12.当前预估运费金额:{},借款单号{},借款剩余金额{}", orderChildPriceTemp, ownerLoanRecord.getLoanNo(), loanResidueBalance);
if (loanResidueBalance.compareTo(orderChildPriceTemp) >= 0) {
log.info("当前借款单的剩余金额足够预估运费金额");
generateFrozenOwnerLoanRunningWater(ownerLoanRecord, childNo, orderChildPrice);
updateList.add(ownerLoanRecord.setLoanResidueBalance(loanResidueBalance.subtract(orderChildPriceTemp)));
break;
} else {
log.info("当前借款单的剩余金额不够抵扣预估运费金额,先进行扣除当前借款所有剩余");
generateFrozenOwnerLoanRunningWater(ownerLoanRecord, childNo, orderChildPrice);
updateList.add(ownerLoanRecord.setLoanResidueBalance(BigDecimal.ZERO));
orderChildPriceTemp = orderChildPriceTemp.subtract(loanResidueBalance);
......@@ -141,11 +164,14 @@ public class OrderChildLoanComponent {
}
//生成借款冻结流水
public void generateFrozenOwnerLoanRunningWater(OwnerLoanRecord ownerLoanRecord, String childNo, BigDecimal orderChildPrice) {
log.info("13.生成借款冻结流水");
OwnerLoanAccount update = new OwnerLoanAccount();
while (true) {
ownerLoanAccountUpdate(ownerLoanRecord, orderChildPrice, update);
Integer i = ownerLoanAccountDao.updateAccountCAS(update, LocalDateTime.now(), false);
log.info("CAS更新结果:{}", i);
if (i == 1) {
OwnerLoanAccountRunningWaterRecord waterRecord = new OwnerLoanAccountRunningWaterRecord();
waterRecord.setLoanNo(ownerLoanRecord.getLoanNo());
......@@ -161,6 +187,7 @@ public class OrderChildLoanComponent {
waterRecord.setAccountBalance(account.getVirtuallyAccountBalance().add(account.getFundingAccountBalance()));
waterRecord.setUseableBalance(account.getVirtuallyUsableBalance().add(account.getFundingUsableBalance()));
waterRecord.setCreateBy("系统");
log.info("14.生成借款账户流水信息:{}", JSONUtil.parse(waterRecord));
ownerLoanAccountRunningWaterRecordDao.saveEntity(waterRecord);
break;
}
......@@ -168,11 +195,14 @@ public class OrderChildLoanComponent {
}
//借款账户信息更新
public void ownerLoanAccountUpdate(OwnerLoanRecord ownerLoanRecord, BigDecimal orderChildPrice, OwnerLoanAccount update) {
log.info("执行CAS前置借款账户信息赋值");
Integer loanType = ownerLoanRecord.getLoanType();
OwnerLoanAccount account = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo,
ownerLoanRecord.getOwnerUserNo()).get();
if (OwnerLoanRecordEnum.LoanType.VIRTUAL_CURRENCY.getCode().equals(loanType)) {
log.info("进行虚拟货币信息赋值");
update.setId(account.getId());
update.setModifiedTime(account.getModifiedTime());
update.setVirtuallyFrozenBalance(orderChildPrice);
......@@ -183,6 +213,7 @@ public class OrderChildLoanComponent {
update.setFundingFrozenBalance(BigDecimal.ZERO);
update.setFundingUsableBalance(BigDecimal.ZERO);
} else {
log.info("进行资金信息赋值");
update.setId(account.getId());
update.setModifiedTime(account.getModifiedTime());
update.setFundingFrozenBalance(orderChildPrice);
......
......@@ -27,8 +27,7 @@ public class OwnerLoanAccountDaoImpl extends BaseDaoImpl<OwnerLoanAccountMapper,
if (flag) {
return baseMapper.addAccount(account, nowStr);
} else {
return null;
// return baseMapper.subAccount(account, nowStr);
return baseMapper.subAccount(account, nowStr);
}
}
......
......@@ -55,6 +55,11 @@ public class OwnerLoanRecordDaoImpl extends BaseDaoImpl<OwnerLoanRecordMapper, O
return baseMapper.pageByParam(page,param);
}
/**
* 查询审批通过并且未用完的借款
* @param userNo
* @return
*/
@Override
public List<OwnerLoanRecord> selectLoanBalance(Long userNo) {
return baseMapper.selectList(
......
......@@ -8,6 +8,7 @@ import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignAddressVO;
import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.performance.component.GoodsOrderTruckRecordComponent;
import com.clx.performance.component.OrderChildLoanComponent;
import com.clx.performance.constant.RedisConstants;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.*;
......@@ -153,17 +154,7 @@ public class OrderChildServiceImpl implements OrderChildService {
private FeignPaymentService feignPaymentService;
@Autowired
private TruckService truckService;
@Autowired
private ZjxlGpsService zjxlGpsService;
@Autowired
private UserService userService;
@Autowired
private OwnerRunningWaterRecordDao ownerRunningWaterRecordDao;
private OrderChildLoanComponent orderChildLoanComponent;
@Override
public SaveOrderChildVO saveOrderChild(OrderChildSaveParam param) {
......@@ -265,7 +256,6 @@ public class OrderChildServiceImpl implements OrderChildService {
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(orderGoods.getOrderNo()).orElseThrow(PerformanceResultEnum.ORDER_INVALID);
OwnerInfoFeignVO ownerInfo = ownerInfoService.getOwnerInfo(orderInfo.getOwnerUserNo());
// // 车型限制
// FeignOrderInfoVO orderInfo = orderService.getOrderInfo(orderGoods.getOrderNo()).orElseThrow
// (PerformanceResultEnum.DATA_NOT_FIND);
......@@ -312,8 +302,8 @@ public class OrderChildServiceImpl implements OrderChildService {
throw new ServiceSystemException(PerformanceResultEnum.ORDER_WEIGHT_LACK);
}
//TODO 借款账户相关限制
//接单判断
orderChildLoanComponent.getChildDetermine(orderInfo, ownerInfo, orderGoods, childNo);
OrderChild orderChild = new OrderChild();
orderChild.setChildNo(childNo);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论