提交 33f09f63 authored 作者: liuhaiquan's avatar liuhaiquan

Merge remote-tracking branch 'origin/v10.7_borrowing_and_repayment_20240118'…

Merge remote-tracking branch 'origin/v10.7_borrowing_and_repayment_20240118' into v10.7_borrowing_and_repayment_20240118
...@@ -117,12 +117,18 @@ public enum PerformanceResultEnum implements ResultEnum { ...@@ -117,12 +117,18 @@ public enum PerformanceResultEnum implements ResultEnum {
BORROWER_DELETE_ENABLE_ERROR(1702, "无法删除启用数据"), BORROWER_DELETE_ENABLE_ERROR(1702, "无法删除启用数据"),
BORROWER_CONFIG_BORROWER_ID_EXIST(1703, "数据重复,请核实后重新提交"), BORROWER_CONFIG_BORROWER_ID_EXIST(1703, "数据重复,请核实后重新提交"),
BORROWER_CONFIG_DELETE_ENABLE_ERROR(1704, "无法删除启用数据"), BORROWER_CONFIG_DELETE_ENABLE_ERROR(1704, "无法删除启用数据"),
BORROWER_CONFIG_TYPE_NOT_SUPPORT_ERROR(1705, "借款类型不支持"),
NB_BANK_API_ERROR(1800, "宁波银行api调用失败"), NB_BANK_API_ERROR(1800, "宁波银行api调用失败"),
NB_BANK_NOTIFY_ERROR(1801, "宁波银行回调失败"), NB_BANK_NOTIFY_ERROR(1801, "宁波银行回调失败"),
NB_BANK_PAY_TYPE_ERROR(1802, "支付方式不支持"), NB_BANK_PAY_TYPE_ERROR(1802, "支付方式不支持"),
NB_BANK_ORDER_PAY_ERROR(1803, "宁波银行订单支付失败"), NB_BANK_ORDER_PAY_ERROR(1803, "宁波银行订单支付失败"),
GET_LOAN_RECORD(1901, "货主借款失败"),
OWNER_LOAN_RECORD_PAY_STATUS_ERROR(1850, "状态已变更无法支付"),
; ;
private final int code; private final int code;
private final String msg; private final String msg;
......
package com.clx.performance.enums.loan;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
public enum BankTradeEnum {
;
@Getter
@AllArgsConstructor
public enum TradeType {
ORDER_DIRECT_PAY(1, "订单支付"),
ORDER_TRANSFER_PAY(2, "转账支付"),
;
private final Integer code;
private final String msg;
public static Optional<TradeType> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> Objects.equals(e.code , code)).findFirst();
}
public static String getMsgByCode(Integer code) {
return getByCode(code).map(TradeType::getMsg).orElse(null);
}
}
@Getter
@AllArgsConstructor
public enum OrderType {
OWNER_LOAN_RECORD(1, "货主借款"),
;
private final Integer code;
private final String msg;
public static Optional<OrderType> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> Objects.equals(e.code , code)).findFirst();
}
public static String getMsgByCode(Integer code) {
return getByCode(code).map(OrderType::getMsg).orElse(null);
}
}
}
...@@ -14,10 +14,10 @@ public enum OwnerLoanAccountRunningWaterRecordEnum { ...@@ -14,10 +14,10 @@ public enum OwnerLoanAccountRunningWaterRecordEnum {
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum RunWaterType { public enum RunWaterType {
APPROVE_WAIT(10, "借款"), APPROVE_WAIT(80, "借款"),
APPROVE_FROZEN(20, "冻结"), APPROVE_FROZEN(90, "冻结"),
APPROVE_CHILD_WRITE_OFF(30, "运单核销"), APPROVE_CHILD_WRITE_OFF(100, "运单核销"),
APPROVE_THAW(40, "解冻"), APPROVE_THAW(110, "解冻"),
; ;
private final Integer code; private final Integer code;
......
...@@ -54,4 +54,24 @@ public enum OwnerLoanRecordEnum { ...@@ -54,4 +54,24 @@ public enum OwnerLoanRecordEnum {
} }
} }
@Getter
@AllArgsConstructor
public enum PayChannel {
ORDER_DIRECT_PAY(1, "订单支付"),
ORDER_TRANSFER_PAY(2, "转账支付"),
;
private final Integer code;
private final String msg;
public static Optional<PayChannel> getByCode(Integer code) {
return Arrays.stream(values()).filter(e ->Objects.equals(e.code, code)).findFirst();
}
public static String getMsgByCode(Integer code) {
return getByCode(code).map(PayChannel::getMsg).orElse(null);
}
}
} }
...@@ -20,4 +20,8 @@ public class CarrierOwnerLoanRecordApproveParam { ...@@ -20,4 +20,8 @@ public class CarrierOwnerLoanRecordApproveParam {
@ApiModelProperty("1:虚拟货币 2:资金") @ApiModelProperty("1:虚拟货币 2:资金")
private Integer loanType; private Integer loanType;
@ApiModelProperty("支付通道:1订单支付 2转账支付")
private Integer payChannel;
} }
package com.clx.performance.param.pc.loan.carrier;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CarrierOwnerLoanRecordPayCancelParam {
@ApiModelProperty("借款单号")
private Long loanNo;
}
package com.clx.performance.param.pc.loan.carrier;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CarrierOwnerLoanRecordPayParam {
@ApiModelProperty("借款单号")
private Long loanNo;
@ApiModelProperty("支付通道:1订单支付 2转账支付")
private Integer payChannel;
}
package com.clx.performance.param.pc.loan.carrier;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CarrierOwnerLoanRecordRepayParam {
@ApiModelProperty("借款单号")
private Long loanNo;
@ApiModelProperty("支付通道:1订单支付 2转账支付")
private Integer payChannel;
}
...@@ -66,6 +66,8 @@ public class OwnerLoanRecordVO { ...@@ -66,6 +66,8 @@ public class OwnerLoanRecordVO {
@ApiModelProperty("借款方") @ApiModelProperty("借款方")
private String borrower; private String borrower;
@ApiModelProperty("借出方ID")
private String lendingPartyId;
@ApiModelProperty("借出方") @ApiModelProperty("借出方")
private String lendingParty; private String lendingParty;
......
...@@ -6,11 +6,13 @@ import cn.hutool.json.JSONUtil; ...@@ -6,11 +6,13 @@ import cn.hutool.json.JSONUtil;
import com.clx.order.feign.OrderFeign; import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignOrderInfoVO; import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.order.vo.pc.owner.OwnerQuotationDetailVO; import com.clx.order.vo.pc.owner.OwnerQuotationDetailVO;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.OrderChildDao; import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OwnerRunningWaterRecordDao; import com.clx.performance.dao.OwnerRunningWaterRecordDao;
import com.clx.performance.dao.loan.OwnerLoanAccountDao; import com.clx.performance.dao.loan.OwnerLoanAccountDao;
import com.clx.performance.dao.loan.OwnerLoanAccountRunningWaterRecordDao; import com.clx.performance.dao.loan.OwnerLoanAccountRunningWaterRecordDao;
import com.clx.performance.dao.loan.OwnerRepaymentDao; import com.clx.performance.dao.loan.OwnerRepaymentDao;
import com.clx.performance.dto.LoanBalanceDTO;
import com.clx.performance.enums.OrderGoodsOverWeightEnum; import com.clx.performance.enums.OrderGoodsOverWeightEnum;
import com.clx.performance.enums.OwnerAccountEnum; import com.clx.performance.enums.OwnerAccountEnum;
import com.clx.performance.enums.PerformanceResultEnum; import com.clx.performance.enums.PerformanceResultEnum;
...@@ -32,12 +34,16 @@ import com.msl.common.base.Optional; ...@@ -32,12 +34,16 @@ import com.msl.common.base.Optional;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
@Component @Component
@AllArgsConstructor @AllArgsConstructor
...@@ -60,6 +66,8 @@ public class OrderChildLoanComponent { ...@@ -60,6 +66,8 @@ public class OrderChildLoanComponent {
private final OwnerLoanRecordService ownerLoanRecordService; private final OwnerLoanRecordService ownerLoanRecordService;
private final RedissonClient redissonClient;
/** /**
* 接单校验判断 * 接单校验判断
* *
...@@ -121,7 +129,7 @@ public class OrderChildLoanComponent { ...@@ -121,7 +129,7 @@ public class OrderChildLoanComponent {
orderChildSum = orderGoods.getPendingOrderFreight().multiply(new BigDecimal(50)).multiply(new BigDecimal(size)); orderChildSum = orderGoods.getPendingOrderFreight().multiply(new BigDecimal(50)).multiply(new BigDecimal(size));
} }
BigDecimal ans = subtract.subtract(orderChildSum); BigDecimal ans = subtract.subtract(orderChildSum);
log.info("6.当前订单冻结的预付运费还有剩余, 查询查询未结算的运单(没有产生扣除流水的运单)总计{},账户剩余{}", orderChildSum, subtract); log.info("6.当前订单冻结的预付运费还有剩余, 查询查询未结算的运单(没有产生扣除流水的运单)总计{},订单冻结预付运费剩余{}", orderChildSum, subtract);
if (ans.compareTo(BigDecimal.ZERO) >= 0) { if (ans.compareTo(BigDecimal.ZERO) >= 0) {
//预付运费够 //预付运费够
...@@ -147,19 +155,21 @@ public class OrderChildLoanComponent { ...@@ -147,19 +155,21 @@ public class OrderChildLoanComponent {
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_SAVE_FAIL, "货主已欠款"); throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_SAVE_FAIL, "货主已欠款");
} }
//TODO 加锁
//查询审批通过并且未用完的借款 //查询审批通过并且未用完的借款
ownerLoanRecordService.getLoanBalance(orderChildPrice, ownerInfoFeignVO.getUserNo(), childNo); LoanBalanceDTO param = new LoanBalanceDTO();
param.setOrderChildPrice(orderChildPrice);
param.setOwnerUserNo(ownerLoanAccount.getOwnerUserNo());
param.setChildNo(childNo);
getLoanBalanceLock(param);
} }
/** /**
* 运单确认人借款相关处理执行 * 运单确认借款相关处理执行
*
* @param settlementDriverDetail * @param settlementDriverDetail
* @param settlementOwnerDetail * @param settlementOwnerDetail
*/ */
@Transactional(rollbackFor = Exception.class)
public void childLoanConfirmAfterProcess(SettlementDriverDetail settlementDriverDetail, SettlementOwnerDetail settlementOwnerDetail) { public void childLoanConfirmAfterProcess(SettlementDriverDetail settlementDriverDetail, SettlementOwnerDetail settlementOwnerDetail) {
log.info("1.运单确认收货后借款相关处理执行"); log.info("1.运单确认收货后借款相关处理执行");
if (SettlementOwnerEnum.InvoiceType.ORDINARY.getCode().equals(settlementDriverDetail.getInvoiceType())) { if (SettlementOwnerEnum.InvoiceType.ORDINARY.getCode().equals(settlementDriverDetail.getInvoiceType())) {
...@@ -181,11 +191,16 @@ public class OrderChildLoanComponent { ...@@ -181,11 +191,16 @@ public class OrderChildLoanComponent {
log.info("4.查询当前运单号:{}, 当前货主,{}, 此运单借款冻结记录:{}", childNo, settlementOwnerDetail.getOwnerUserNo(), JSONUtil.parse(runningWaterRecordList)); log.info("4.查询当前运单号:{}, 当前货主,{}, 此运单借款冻结记录:{}", childNo, settlementOwnerDetail.getOwnerUserNo(), JSONUtil.parse(runningWaterRecordList));
if (CollectionUtil.isEmpty(runningWaterRecordList)) { if (CollectionUtil.isEmpty(runningWaterRecordList)) {
//说明当初没借款,预付运费够,但是真实结算后,预付运费不够,走此逻辑 //说明当初没借款,预付运费够,但是真实结算后,预付运费不够,走此逻辑
try { log.info("4.1 说明当初没借款,预付运费够,但是真实结算后,预付运费不够,走此逻辑");
ownerLoanRecordService.getLoanBalance(settlementOwnerDetail.getSettlementFreight(), settlementDriverDetail.getDriverUserNo(), childNo); LoanBalanceDTO param = new LoanBalanceDTO();
} catch (Exception e) { param.setOrderChildPrice(settlementOwnerDetail.getSettlementFreight());
//TODO 钱不够需要流程卡死 param.setOwnerUserNo(settlementOwnerDetail.getOwnerUserNo());
} param.setChildNo(childNo);
param.setSettlementDriverDetail(settlementDriverDetail);
param.setSettlementOwnerDetail(settlementOwnerDetail);
//扣钱,获取锁,此处有可能钱不够,抛异常,走网络货运重试
getLoanBalanceLock(param);
runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByOrderNoAndRunningWaterType runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByOrderNoAndRunningWaterType
(childNo, OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_FROZEN.getCode()); (childNo, OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_FROZEN.getCode());
childWriteOffOwnerLoanAccount(runningWaterRecordList); childWriteOffOwnerLoanAccount(runningWaterRecordList);
...@@ -193,10 +208,14 @@ public class OrderChildLoanComponent { ...@@ -193,10 +208,14 @@ public class OrderChildLoanComponent {
BigDecimal alterationBalance = runningWaterRecordList.stream().map(OwnerLoanAccountRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal alterationBalance = runningWaterRecordList.stream().map(OwnerLoanAccountRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
if (alterationBalance.compareTo(settlementOwnerDetail.getSettlementFreight()) == 0) { if (alterationBalance.compareTo(settlementOwnerDetail.getSettlementFreight()) == 0) {
log.info("4.2 相等直接生成运单核销");
//相等直接生成运单核销 //相等直接生成运单核销
childWriteOffOwnerLoanAccount(runningWaterRecordList); childWriteOffOwnerLoanAccount(runningWaterRecordList);
} else if (alterationBalance.compareTo(settlementOwnerDetail.getSettlementFreight()) > 0) { } else if (alterationBalance.compareTo(settlementOwnerDetail.getSettlementFreight()) > 0) {
//大于,则生成核销后,释放冻结的借款 //大于,则生成核销后,释放冻结的借款
log.info("4.3 大于,则生成核销后,释放冻结的借款");
BigDecimal thawBigdecimal = settlementOwnerDetail.getSettlementFreight().subtract(alterationBalance); BigDecimal thawBigdecimal = settlementOwnerDetail.getSettlementFreight().subtract(alterationBalance);
OwnerLoanAccountRunningWaterRecord entity = runningWaterRecordList.get(runningWaterRecordList.size() - 1); OwnerLoanAccountRunningWaterRecord entity = runningWaterRecordList.get(runningWaterRecordList.size() - 1);
Long loanNo = entity.getLoanNo(); Long loanNo = entity.getLoanNo();
...@@ -207,15 +226,23 @@ public class OrderChildLoanComponent { ...@@ -207,15 +226,23 @@ public class OrderChildLoanComponent {
//多余的金额需要生成解冻流水 //多余的金额需要生成解冻流水
thawOwnerLoanAccount(loanNo, loanType, entity.getOwnerUserNo(), entity.getOwnerUserName(), entity.getMobile(), entity.getChildNo(), thawBigdecimal.negate()); thawOwnerLoanAccount(loanNo, loanType, entity.getOwnerUserNo(), entity.getOwnerUserName(), entity.getMobile(), entity.getChildNo(), thawBigdecimal.negate());
} else { } else {
log.info("4.4 冻结的借款不够了");
BigDecimal subtract = alterationBalance.subtract(settlementOwnerDetail.getSettlementFreight()); BigDecimal subtract = alterationBalance.subtract(settlementOwnerDetail.getSettlementFreight());
// 冻结的借款不够了 // 冻结的借款不够了
try {
ownerLoanRecordService.getLoanBalance(subtract.negate(), settlementDriverDetail.getDriverUserNo(), childNo); LoanBalanceDTO param = new LoanBalanceDTO();
} catch (Exception e) { param.setOrderChildPrice(subtract.negate());
//TODO 钱不够需要流程卡死 param.setOwnerUserNo(settlementOwnerDetail.getOwnerUserNo());
} param.setChildNo(childNo);
param.setSettlementDriverDetail(settlementDriverDetail);
param.setSettlementOwnerDetail(settlementOwnerDetail);
//扣钱,获取锁,此处有可能钱不够,抛异常,走网络货运重试
getLoanBalanceLock(param);
runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByOrderNoAndRunningWaterType runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByOrderNoAndRunningWaterType
(childNo, OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_FROZEN.getCode()); (childNo, OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_FROZEN.getCode());
log.info("4.5新查询出冻结借款记录:{}", JSONUtil.parse(runningWaterRecordList));
childWriteOffOwnerLoanAccount(runningWaterRecordList); childWriteOffOwnerLoanAccount(runningWaterRecordList);
} }
...@@ -260,7 +287,7 @@ public class OrderChildLoanComponent { ...@@ -260,7 +287,7 @@ public class OrderChildLoanComponent {
waterRecord.setLoanType(loanType); waterRecord.setLoanType(loanType);
waterRecord.setRunningWaterNo(idGenerateSnowFlake.nextId(1L)); waterRecord.setRunningWaterNo(idGenerateSnowFlake.nextId(1L));
waterRecord.setChildNo(childNo); waterRecord.setChildNo(childNo);
waterRecord.setRunningWaterType(OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_CHILD_WRITE_OFF.getCode()); waterRecord.setRunningWaterType(OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_THAW.getCode());
waterRecord.setAlterationBalance(balance); waterRecord.setAlterationBalance(balance);
account = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo, account = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo,
...@@ -277,6 +304,7 @@ public class OrderChildLoanComponent { ...@@ -277,6 +304,7 @@ public class OrderChildLoanComponent {
} }
public void childWriteOffOwnerLoanAccount(List<OwnerLoanAccountRunningWaterRecord> frozenList) { public void childWriteOffOwnerLoanAccount(List<OwnerLoanAccountRunningWaterRecord> frozenList) {
log.info("5. 执行核销扣除,相关流水{}", JSONUtil.parse(frozenList));
while (true) { while (true) {
int flag = 0; int flag = 0;
List<OwnerLoanAccountRunningWaterRecord> saveList = new LinkedList<>(); List<OwnerLoanAccountRunningWaterRecord> saveList = new LinkedList<>();
...@@ -304,7 +332,7 @@ public class OrderChildLoanComponent { ...@@ -304,7 +332,7 @@ public class OrderChildLoanComponent {
update.setVirtuallyFrozenBalance(BigDecimal.ZERO); update.setVirtuallyFrozenBalance(BigDecimal.ZERO);
update.setVirtuallyUsableBalance(BigDecimal.ZERO); update.setVirtuallyUsableBalance(BigDecimal.ZERO);
} }
//核抵扣 //核抵扣
Integer i = ownerLoanAccountDao.childWriteOffOwnerLoanAccountCAS(update, LocalDateTime.now()); Integer i = ownerLoanAccountDao.childWriteOffOwnerLoanAccountCAS(update, LocalDateTime.now());
if (i <= 0) { if (i <= 0) {
...@@ -338,4 +366,24 @@ public class OrderChildLoanComponent { ...@@ -338,4 +366,24 @@ public class OrderChildLoanComponent {
} }
} }
public void getLoanBalanceLock(LoanBalanceDTO dto) {
RLock lock = null;
try {
lock = redissonClient.getLock(RedissonConstants.ORDER_CHILD_LOAN_OWNER_USERID_LOCK + dto.getOwnerUserNo());
boolean flag = lock.tryLock(15, 30, TimeUnit.SECONDS);
if (!flag) {
throw new ServiceSystemException(PerformanceResultEnum.GET_LOAN_RECORD);
}
ownerLoanRecordService.getLoanBalance(dto);
} catch (Exception e) {
throw new ServiceSystemException(PerformanceResultEnum.GET_LOAN_RECORD, e.getMessage());
} finally {
if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
} }
...@@ -12,13 +12,13 @@ import org.springframework.context.annotation.Configuration; ...@@ -12,13 +12,13 @@ import org.springframework.context.annotation.Configuration;
public class PaymentFromConfig { public class PaymentFromConfig {
//借款订单模版编号 //借款订单模版编号
private Long loanOrderTemplateNo; private String loanOrderTemplateNo;
//借款转账模版编号 //借款转账模版编号
private Long loanTransferTemplateNo; private String loanTransferTemplateNo;
//还款订单模版编号 //还款订单模版编号
private Long repaymentOrderTemplateNo; private String repaymentOrderTemplateNo;
//还款转账模版编号 //还款转账模版编号
private Long repaymentTransferTemplateNo; private String repaymentTransferTemplateNo;
} }
...@@ -10,4 +10,6 @@ public class RedissonConstants { ...@@ -10,4 +10,6 @@ public class RedissonConstants {
//货主违约结算单支付锁 //货主违约结算单支付锁
public static final String BREAK_CONTRACT_SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK = "clx-performance:breakContractSettlementOwner:batchPay:id:"; public static final String BREAK_CONTRACT_SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK = "clx-performance:breakContractSettlementOwner:batchPay:id:";
public static final String ORDER_CHILD_LOAN_OWNER_USERID_LOCK = "clx-performance:orderChild:loan:ownerUserId:";
} }
package com.clx.performance.controller.pc.loan.carrier; package com.clx.performance.controller.pc.loan.carrier;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.param.pc.loan.carrier.CarrierOwnerLoanRecordApproveParam; import com.clx.performance.param.pc.loan.carrier.*;
import com.clx.performance.param.pc.loan.carrier.PageCarrierOwnerLoanRecordParam;
import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanRecordOfOwner;
import com.clx.performance.param.pc.loan.owner.ExportPaymentApplicationFormParam; import com.clx.performance.param.pc.loan.owner.ExportPaymentApplicationFormParam;
import com.clx.performance.service.loan.OwnerLoanRecordService; import com.clx.performance.service.loan.OwnerLoanRecordService;
import com.clx.performance.vo.pc.loan.carrier.CarrierCashierInfoVO; import com.clx.performance.vo.pc.loan.carrier.CarrierCashierInfoVO;
...@@ -90,4 +88,25 @@ public class CarrierOwnerLoanRecordController { ...@@ -90,4 +88,25 @@ public class CarrierOwnerLoanRecordController {
return Result.ok(url); return Result.ok(url);
} }
@ApiOperation(value = "借款支付",notes = "<br>By:艾庆国")
@PostMapping("/updateOwnerLoanRecordPay")
public Result<Object> updateOwnerLoanRecordPay(@RequestBody @Validated CarrierOwnerLoanRecordPayParam param) {
ownerLoanRecordService.updateOwnerLoanRecordPay(param);
return Result.ok();
}
@ApiOperation(value = "借款重新支付",notes = "<br>By:艾庆国")
@PostMapping("/updateOwnerLoanRecordRepay")
public Result<Object> updateOwnerLoanRecordRepay(@RequestBody @Validated CarrierOwnerLoanRecordRepayParam param) {
ownerLoanRecordService.updateOwnerLoanRecordRepay(param);
return Result.ok();
}
@ApiOperation(value = "借款支付取消",notes = "<br>By:艾庆国")
@PostMapping("/updateOwnerLoanRecordPayCancel")
public Result<Object> updateOwnerLoanRecordPayCancel(@RequestBody @Validated CarrierOwnerLoanRecordPayCancelParam param) {
ownerLoanRecordService.updateOwnerLoanRecordPayCancel(param);
return Result.ok();
}
} }
package com.clx.performance.dao.impl.loan;
import com.clx.performance.dao.loan.BankTradeDao;
import com.clx.performance.mapper.loan.BankTradeMapper;
import com.clx.performance.model.loan.BankTrade;
import com.msl.common.base.Optional;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
/**
* @Author: aiqinguo
* @Description:
* @Date: 2024/01/17 13:42:57
* @Version: 1.0
*/
@Repository
public class BankTradeDaoImpl extends BaseDaoImpl<BankTradeMapper, BankTrade, Integer> implements BankTradeDao {
@Override
public boolean updateStatus(BankTrade item) {
return update(lUdWrapper()
.eq(BankTrade::getId, item.getId())
.set(BankTrade::getStatus, item.getStatus())
);
}
@Override
public Optional<BankTrade> selectByMerchantRunningWaterNo(String merchantRunningWaterNo) {
return Optional.of(merchantRunningWaterNo)
.map(item -> lQrWrapper()
.eq(BankTrade::getMerchantRunningWaterNo, item)
.last("limit 1")
)
.map(super::getOne);
}
}
...@@ -10,6 +10,7 @@ import com.clx.performance.model.loan.OwnerLoanRecord; ...@@ -10,6 +10,7 @@ import com.clx.performance.model.loan.OwnerLoanRecord;
import com.clx.performance.param.pc.loan.carrier.PageCarrierOwnerLoanRecordParam; import com.clx.performance.param.pc.loan.carrier.PageCarrierOwnerLoanRecordParam;
import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanRecordOfOwner; import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanRecordOfOwner;
import com.clx.performance.vo.pc.loan.carrier.OwnerLoanRecordVO; import com.clx.performance.vo.pc.loan.carrier.OwnerLoanRecordVO;
import com.msl.common.base.Optional;
import com.msl.common.dao.impl.BaseDaoImpl; import com.msl.common.dao.impl.BaseDaoImpl;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -70,5 +71,40 @@ public class OwnerLoanRecordDaoImpl extends BaseDaoImpl<OwnerLoanRecordMapper, O ...@@ -70,5 +71,40 @@ public class OwnerLoanRecordDaoImpl extends BaseDaoImpl<OwnerLoanRecordMapper, O
); );
} }
@Override
public Optional<OwnerLoanRecord> selectByMerchantRunningWaterNo(String merchantRunningWaterNo) {
return Optional.of(merchantRunningWaterNo)
.map(item -> lQrWrapper()
.eq(OwnerLoanRecord::getMerchantRunningWaterNo, item)
)
.map(super::getOne);
}
@Override
public boolean updatePay(OwnerLoanRecord item) {
return update(lUdWrapper()
.eq(OwnerLoanRecord::getId, item.getId())
.set(OwnerLoanRecord::getStatus, item.getStatus())
.set(OwnerLoanRecord::getRunningWaterOpenNo, item.getRunningWaterOpenNo())
.set(OwnerLoanRecord::getMerchantRunningWaterNo, item.getMerchantRunningWaterNo())
.set(OwnerLoanRecord::getRemittanceIdentificationCode, item.getRemittanceIdentificationCode())
.set(OwnerLoanRecord::getLoanResidueBalance, item.getLoanResidueBalance())
.set(OwnerLoanRecord::getLendingParty, item.getLendingParty())
.set(OwnerLoanRecord::getLendingPartyAccount, item.getLendingPartyAccount())
);
}
@Override
public boolean updatePaySuccess(OwnerLoanRecord item) {
return false;
}
@Override
public boolean updatePayFail(OwnerLoanRecord item) {
return false;
}
} }
...@@ -31,6 +31,7 @@ public class SettlementDriverDetailDaoImpl extends BaseDaoImpl<SettlementDriverD ...@@ -31,6 +31,7 @@ public class SettlementDriverDetailDaoImpl extends BaseDaoImpl<SettlementDriverD
.set(SettlementDriverDetail::getInvoiceType, item.getInvoiceType()) .set(SettlementDriverDetail::getInvoiceType, item.getInvoiceType())
.set(SettlementDriverDetail::getPrepayFreight, item.getPrepayFreight()) .set(SettlementDriverDetail::getPrepayFreight, item.getPrepayFreight())
.set(SettlementDriverDetail::getPrepayFreightFlag, item.getPrepayFreightFlag()) .set(SettlementDriverDetail::getPrepayFreightFlag, item.getPrepayFreightFlag())
.set(SettlementDriverDetail::getLoanFlag, item.getLoanFlag())
); );
} }
......
...@@ -36,6 +36,7 @@ public class SettlementOwnerDetailDaoImpl extends BaseDaoImpl<SettlementOwnerDet ...@@ -36,6 +36,7 @@ public class SettlementOwnerDetailDaoImpl extends BaseDaoImpl<SettlementOwnerDet
.set(SettlementOwnerDetail::getSettlementFreight, item.getSettlementFreight()) .set(SettlementOwnerDetail::getSettlementFreight, item.getSettlementFreight())
.set(SettlementOwnerDetail::getFinalPaymentStatus, item.getFinalPaymentStatus()) .set(SettlementOwnerDetail::getFinalPaymentStatus, item.getFinalPaymentStatus())
.set(SettlementOwnerDetail::getPrepayFreight, item.getPrepayFreight()) .set(SettlementOwnerDetail::getPrepayFreight, item.getPrepayFreight())
.set(SettlementOwnerDetail::getLoanFreight, item.getLoanFreight())
); );
} }
......
package com.clx.performance.dao.loan;
import com.clx.performance.mapper.loan.BankTradeMapper;
import com.clx.performance.model.loan.BankTrade;
import com.msl.common.base.Optional;
import com.msl.common.dao.BaseDao;
/**
* @Author: aiqinguo
* @Description:
* @Date: 2024/01/17 13:42:57
* @Version: 1.0
*/
public interface BankTradeDao extends BaseDao<BankTradeMapper, BankTrade, Integer> {
boolean updateStatus(BankTrade item);
Optional<BankTrade> selectByMerchantRunningWaterNo(String merchantRunningWaterNo);
}
...@@ -6,6 +6,7 @@ import com.clx.performance.model.loan.OwnerLoanRecord; ...@@ -6,6 +6,7 @@ import com.clx.performance.model.loan.OwnerLoanRecord;
import com.clx.performance.param.pc.loan.carrier.PageCarrierOwnerLoanRecordParam; import com.clx.performance.param.pc.loan.carrier.PageCarrierOwnerLoanRecordParam;
import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanRecordOfOwner; import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanRecordOfOwner;
import com.clx.performance.vo.pc.loan.carrier.OwnerLoanRecordVO; import com.clx.performance.vo.pc.loan.carrier.OwnerLoanRecordVO;
import com.msl.common.base.Optional;
import com.msl.common.dao.BaseDao; import com.msl.common.dao.BaseDao;
import java.util.List; import java.util.List;
...@@ -23,5 +24,10 @@ public interface OwnerLoanRecordDao extends BaseDao<OwnerLoanRecordMapper, Owner ...@@ -23,5 +24,10 @@ public interface OwnerLoanRecordDao extends BaseDao<OwnerLoanRecordMapper, Owner
List<OwnerLoanRecord> selectLoanBalance(Long userNo); List<OwnerLoanRecord> selectLoanBalance(Long userNo);
Optional<OwnerLoanRecord> selectByMerchantRunningWaterNo(String merchantRunningWaterNo);
boolean updatePay(OwnerLoanRecord item);
boolean updatePaySuccess(OwnerLoanRecord item);
boolean updatePayFail(OwnerLoanRecord item);
} }
package com.clx.performance.dto;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class LoanBalanceDTO {
private BigDecimal orderChildPrice;
private Long ownerUserNo;
private String childNo;
private SettlementDriverDetail settlementDriverDetail;
private SettlementOwnerDetail settlementOwnerDetail;
}
...@@ -28,6 +28,7 @@ import com.clx.performance.service.settle.SettlementMqService; ...@@ -28,6 +28,7 @@ import com.clx.performance.service.settle.SettlementMqService;
import com.msl.common.dto.HttpDTO; import com.msl.common.dto.HttpDTO;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -74,7 +75,7 @@ public class OrderChildSyncTransportListener { ...@@ -74,7 +75,7 @@ public class OrderChildSyncTransportListener {
try { try {
transportOrderChildProcess(orderChild); transportOrderChildProcess(orderChild);
} catch (Exception e) { } catch (Exception e) {
log.info("当前OrderChildSyncTransportListener监听同步网络货运失败,运单号{}, 错误信息{}", orderChild.getChildNo(), e.getMessage()); log.info("当前OrderChildSyncTransportListener监听同步网络货运失败,运单号{}, 错误信息{}", orderChild.getChildNo(), ExceptionUtils.getStackTrace(e));
OrderChildSyncTransportInvoiceRecord entity = new OrderChildSyncTransportInvoiceRecord(); OrderChildSyncTransportInvoiceRecord entity = new OrderChildSyncTransportInvoiceRecord();
entity.setChildNo(orderChild.getChildNo()); entity.setChildNo(orderChild.getChildNo());
...@@ -103,8 +104,6 @@ public class OrderChildSyncTransportListener { ...@@ -103,8 +104,6 @@ public class OrderChildSyncTransportListener {
public void extracted(OrderChild orderChild, OrderChildSyncDTO bean, String remark, public void extracted(OrderChild orderChild, OrderChildSyncDTO bean, String remark,
SettlementOwnerDetail settlementOwnerDetail, SettlementOwnerDetail settlementOwnerDetail,
Integer invoiceType, SettlementDriverDetail settlementDriverDetail) { Integer invoiceType, SettlementDriverDetail settlementDriverDetail) {
// 结算金额
settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
if (null != bean && bean.getCode() == 0) { if (null != bean && bean.getCode() == 0) {
log.info("当前OrderChildSyncTransportListener监听同步网络货运成功,运单号为{}", orderChild.getChildNo()); log.info("当前OrderChildSyncTransportListener监听同步网络货运成功,运单号为{}", orderChild.getChildNo());
...@@ -165,6 +164,8 @@ public class OrderChildSyncTransportListener { ...@@ -165,6 +164,8 @@ public class OrderChildSyncTransportListener {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO); settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode()); settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode());
} }
// 结算金额
settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
if (SettlementOwnerEnum.InvoiceType.ORDINARY.getCode().equals(invoiceType)) { if (SettlementOwnerEnum.InvoiceType.ORDINARY.getCode().equals(invoiceType)) {
if (settlementOwnerDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) { if (settlementOwnerDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
...@@ -177,6 +178,7 @@ public class OrderChildSyncTransportListener { ...@@ -177,6 +178,7 @@ public class OrderChildSyncTransportListener {
} }
settlementOwnerDetail.setInvoiceType(invoiceType); settlementOwnerDetail.setInvoiceType(invoiceType);
settlementDriverDetail.setInvoiceType(invoiceType); settlementDriverDetail.setInvoiceType(invoiceType);
//生成借款标识 //生成借款标识
orderChildLoanComponent.childLoanConfirmAfterProcess(settlementDriverDetail, settlementOwnerDetail); orderChildLoanComponent.childLoanConfirmAfterProcess(settlementDriverDetail, settlementOwnerDetail);
......
package com.clx.performance.mapper.loan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.loan.BankTrade;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author: aiqinguo
* @Description:
* @Date: 2024/01/17 13:42:57
* @Version: 1.0
*/
@Mapper
public interface BankTradeMapper extends BaseMapper<BankTrade> {
}
\ No newline at end of file
...@@ -18,9 +18,11 @@ import org.apache.ibatis.annotations.Update; ...@@ -18,9 +18,11 @@ import org.apache.ibatis.annotations.Update;
*/ */
public interface OwnerLoanAccountMapper extends BaseMapper<OwnerLoanAccount> { public interface OwnerLoanAccountMapper extends BaseMapper<OwnerLoanAccount> {
@Update("update owner_loan_account set funding_amount = funding_amount + #{account.fundingAmount}" @Update("update owner_loan_account set funding_account_balance = funding_account_balance + #{account.fundingAccountBalance}" +
+ ",virtually_amount = virtually_amount + #{account.virtuallyAmount}" ",funding_usable_balance = funding_usable_balance + #{account.fundingUsableBalance},funding_frozen_balance = funding_frozen_balance + #{account.fundingFrozenBalance}" +
+ ",modified_time= #{now}" ",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}" + "where id = #{account.id} and modified_time = #{account.modifiedTime}"
) )
Integer addAccount(@Param("account") OwnerLoanAccount account, @Param("now") String nowStr); Integer addAccount(@Param("account") OwnerLoanAccount account, @Param("now") String nowStr);
...@@ -47,7 +49,7 @@ public interface OwnerLoanAccountMapper extends BaseMapper<OwnerLoanAccount> { ...@@ -47,7 +49,7 @@ public interface OwnerLoanAccountMapper extends BaseMapper<OwnerLoanAccount> {
",modified_time=#{now}" ",modified_time=#{now}"
+ "where id = #{account.id} and modified_time = #{account.modifiedTime}" + "where id = #{account.id} and modified_time = #{account.modifiedTime}"
) )
Integer childWriteOffOwnerLoanAccountCAS(OwnerLoanAccount account, String nowStr); Integer childWriteOffOwnerLoanAccountCAS(@Param("account") OwnerLoanAccount account, @Param("now") String nowStr);
@Update("update owner_loan_account set funding_account_balance = funding_account_balance + #{account.fundingAccountBalance}" + @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}" + ",funding_usable_balance = funding_usable_balance + #{account.fundingUsableBalance},funding_frozen_balance = funding_frozen_balance - #{account.fundingFrozenBalance}" +
...@@ -56,5 +58,5 @@ public interface OwnerLoanAccountMapper extends BaseMapper<OwnerLoanAccount> { ...@@ -56,5 +58,5 @@ public interface OwnerLoanAccountMapper extends BaseMapper<OwnerLoanAccount> {
",modified_time=#{now}" ",modified_time=#{now}"
+ "where id = #{account.id} and modified_time = #{account.modifiedTime}" + "where id = #{account.id} and modified_time = #{account.modifiedTime}"
) )
Integer thawOwnerLoanAccountCAS(OwnerLoanAccount account, String nowStr); Integer thawOwnerLoanAccountCAS(@Param("account") OwnerLoanAccount account, @Param("now") String nowStr);
} }
package com.clx.performance.model.loan;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.msl.common.config.KeyColumn;
import com.msl.common.model.HasKey;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @Author: aiqinguo
* @Description:
* @Date: 2024/02/06 15:31:16
* @Version: 1.0
*/
@Getter
@Setter
@NoArgsConstructor
@TableName(autoResultMap = true)
public class BankTrade implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id; //id
private Integer orderType; //订单类型
private Integer tradeType; //交易类型
private String merchantRunningWaterNo; //商户流水号
private String runningWaterOpenNo; //交易流水号(第三方)
private BigDecimal amount; //金额
private Integer status; //状态
private String remark; //备注
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
@KeyColumn("id")
@Override
public Integer gainKey() {
return id;
}
}
\ No newline at end of file
...@@ -68,6 +68,10 @@ public class OwnerLoanRecord implements HasKey<Integer> { ...@@ -68,6 +68,10 @@ public class OwnerLoanRecord implements HasKey<Integer> {
@ApiModelProperty("借款剩余金额") @ApiModelProperty("借款剩余金额")
private BigDecimal loanResidueBalance; private BigDecimal loanResidueBalance;
@TableField("borrower_id")
@ApiModelProperty("借款方Id")
private Integer borrowerId;
@TableField("borrower") @TableField("borrower")
@ApiModelProperty("借款方") @ApiModelProperty("借款方")
private String borrower; private String borrower;
...@@ -80,6 +84,10 @@ public class OwnerLoanRecord implements HasKey<Integer> { ...@@ -80,6 +84,10 @@ public class OwnerLoanRecord implements HasKey<Integer> {
@ApiModelProperty("汇款识别码") @ApiModelProperty("汇款识别码")
private String remittanceIdentificationCode; private String remittanceIdentificationCode;
@TableField("lending_party_id")
@ApiModelProperty("借出方ID")
private String lendingPartyId;
@TableField("lending_party") @TableField("lending_party")
@ApiModelProperty("借出方") @ApiModelProperty("借出方")
private String lendingParty; private String lendingParty;
......
...@@ -14,19 +14,17 @@ import com.clx.performance.dao.loan.OwnerLoanAccountDao; ...@@ -14,19 +14,17 @@ import com.clx.performance.dao.loan.OwnerLoanAccountDao;
import com.clx.performance.dao.loan.OwnerLoanAccountRunningWaterRecordDao; import com.clx.performance.dao.loan.OwnerLoanAccountRunningWaterRecordDao;
import com.clx.performance.dao.loan.OwnerLoanRecordDao; import com.clx.performance.dao.loan.OwnerLoanRecordDao;
import com.clx.performance.dao.loan.OwnerRepaymentDao; import com.clx.performance.dao.loan.OwnerRepaymentDao;
import com.clx.performance.dto.LoanBalanceDTO;
import com.clx.performance.dao.loan.*;
import com.clx.performance.enums.PerformanceResultEnum; import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.RunningWaterTypeEnum; import com.clx.performance.enums.RunningWaterTypeEnum;
import com.clx.performance.enums.loan.BankTradeEnum;
import com.clx.performance.enums.loan.OwnerLoanAccountRunningWaterRecordEnum; import com.clx.performance.enums.loan.OwnerLoanAccountRunningWaterRecordEnum;
import com.clx.performance.enums.loan.OwnerLoanRecordEnum; import com.clx.performance.enums.loan.OwnerLoanRecordEnum;
import com.clx.performance.enums.loan.OwnerRePaymentEnum; import com.clx.performance.enums.loan.OwnerRePaymentEnum;
import com.clx.performance.model.OwnerBindCardRecord; import com.clx.performance.model.OwnerBindCardRecord;
import com.clx.performance.model.loan.OwnerLoanAccount; import com.clx.performance.model.loan.*;
import com.clx.performance.model.loan.OwnerLoanAccountRunningWaterRecord; import com.clx.performance.param.pc.loan.carrier.*;
import com.clx.performance.model.loan.OwnerLoanRecord;
import com.clx.performance.model.loan.OwnerRepayment;
import com.clx.performance.param.pc.loan.carrier.CarrierOwnerLoanRecordApproveParam;
import com.clx.performance.param.pc.loan.carrier.PageCarrierOwnerLoanRecordParam;
import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanRecordOfOwner;
import com.clx.performance.param.pc.loan.owner.ExportPaymentApplicationFormParam; import com.clx.performance.param.pc.loan.owner.ExportPaymentApplicationFormParam;
import com.clx.performance.param.pc.loan.owner.OwnerLoanRecordParam; import com.clx.performance.param.pc.loan.owner.OwnerLoanRecordParam;
import com.clx.performance.service.loan.OwnerLoanRecordService; import com.clx.performance.service.loan.OwnerLoanRecordService;
...@@ -52,13 +50,17 @@ import com.msl.user.data.UserSessionData; ...@@ -52,13 +50,17 @@ import com.msl.user.data.UserSessionData;
import com.msl.user.utils.TokenUtil; import com.msl.user.utils.TokenUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T; import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -71,6 +73,7 @@ import java.util.stream.Collectors; ...@@ -71,6 +73,7 @@ import java.util.stream.Collectors;
@AllArgsConstructor @AllArgsConstructor
public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
private final BorrowerConfigDao borrowerConfigDao;
private final OwnerLoanRecordDao ownerLoanRecordDao; private final OwnerLoanRecordDao ownerLoanRecordDao;
private final OwnerLoanRecordStruct ownerLoanRecordStruct; private final OwnerLoanRecordStruct ownerLoanRecordStruct;
...@@ -89,6 +92,8 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -89,6 +92,8 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
private final BorrowerDao borrowerDao; private final BorrowerDao borrowerDao;
private final BankTradeDao bankTradeDao;
private final OwnerFeign ownerFeign; private final OwnerFeign ownerFeign;
private final ContractEvidenceFeign contractEvidenceFeign; private final ContractEvidenceFeign contractEvidenceFeign;
...@@ -107,8 +112,6 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -107,8 +112,6 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
} }
@Override @Override
public void ownerLoanRecordSubmit(OwnerLoanRecordParam param) { public void ownerLoanRecordSubmit(OwnerLoanRecordParam param) {
...@@ -140,29 +143,66 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -140,29 +143,66 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
public void ownerLoanRecordApprove(CarrierOwnerLoanRecordApproveParam param) { public void ownerLoanRecordApprove(CarrierOwnerLoanRecordApproveParam param) {
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, param.getLoanNo()).get(); OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, param.getLoanNo()).get();
if (param.getStatus()) { if (param.getStatus()) {
borrowerConfigDao.selectByBorrowerIdAndType(ownerLoanRecord.getBorrowerId(), param.getLoanType())
.orElseThrow(PerformanceResultEnum.BORROWER_CONFIG_TYPE_NOT_SUPPORT_ERROR);
Borrower borrower = borrowerDao.getEntityByKey(ownerLoanRecord.getBorrowerId())
.orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
//同意 //同意
ownerLoanRecord.setLoanType(param.getLoanType()); ownerLoanRecord.setLoanType(param.getLoanType());
if (OwnerLoanRecordEnum.LoanType.FUND.getCode().equals(param.getLoanType())) { if (OwnerLoanRecordEnum.LoanType.FUND.getCode().equals(param.getLoanType())) {
//资金 TODO 调宁波银企直连的产品,从诚联信账户中给鑫祥和执行转账 //资金
NbBankOrderPayResultVO orderPayResultVO = bankService.orderDirectPay(param.getLoanNo() , BankTrade bankTrade = new BankTrade();
ownerLoanRecord.getLoanBalance().intValue(), "", "", ""); if (OwnerLoanRecordEnum.PayChannel.ORDER_DIRECT_PAY.getCode().equals(param.getPayChannel())) {
// 订单支付
NbBankOrderPayResultVO orderPayResultVO = bankService.orderDirectPay(param.getLoanNo(),
ownerLoanRecord.getLoanBalance().intValue(), borrower.getOpenBankId(), borrower.getBankCardNo(), borrower.getName());
ownerLoanRecord.setRunningWaterOpenNo(orderPayResultVO.getTransSeqNo());
ownerLoanRecord.setMerchantRunningWaterNo(orderPayResultVO.getMerSeqNo());
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.PAYING.getCode());
ownerLoanRecord.setLoanResidueBalance(ownerLoanRecord.getLoanBalance());
ownerLoanRecord.setLendingParty(borrower.getName());
ownerLoanRecord.setLendingPartyAccount(borrower.getBankCardNo());
bankTrade.setTradeType(BankTradeEnum.TradeType.ORDER_DIRECT_PAY.getCode());
}
else {
// 转账支付
NbBankOrderPayResultVO orderPayResultVO = bankService.orderTransferPay(ownerLoanRecord.getLoanBalance().intValue());
ownerLoanRecord.setRunningWaterOpenNo(orderPayResultVO.getTransSeqNo()); ownerLoanRecord.setRunningWaterOpenNo(orderPayResultVO.getTransSeqNo());
ownerLoanRecord.setMerchantRunningWaterNo(orderPayResultVO.getMerSeqNo()); ownerLoanRecord.setMerchantRunningWaterNo(orderPayResultVO.getMerSeqNo());
ownerLoanRecord.setRemittanceIdentificationCode(orderPayResultVO.getSignNo());
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.PAYING.getCode()); ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.PAYING.getCode());
ownerLoanRecord.setLoanResidueBalance(ownerLoanRecord.getLoanBalance()); ownerLoanRecord.setLoanResidueBalance(ownerLoanRecord.getLoanBalance());
bankTrade.setTradeType(BankTradeEnum.TradeType.ORDER_TRANSFER_PAY.getCode());
}
// 更新借款支付信息
ownerLoanRecordDao.updatePay(ownerLoanRecord);
bankTrade.setOrderType(BankTradeEnum.OrderType.OWNER_LOAN_RECORD.getCode());
bankTrade.setAmount(ownerLoanRecord.getLoanBalance());
bankTrade.setMerchantRunningWaterNo(ownerLoanRecord.getMerchantRunningWaterNo());
bankTrade.setRunningWaterOpenNo(ownerLoanRecord.getRunningWaterOpenNo());
// 保存银行交易记录
bankTradeDao.saveEntity(bankTrade);
} else { } else {
// 虚拟币 直接增加 更改状态审批通过 // 虚拟币 直接增加 更改状态审批通过
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.APPROVE_PASS.getCode()); ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.APPROVE_PASS.getCode());
}
while (true) { while (true) {
OwnerLoanAccount ownerLoanAccount = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo, OwnerLoanAccount ownerLoanAccount = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo,
ownerLoanRecord.getOwnerUserNo()).get(); ownerLoanRecord.getOwnerUserNo()).get();
OwnerLoanAccount entity = new OwnerLoanAccount(); OwnerLoanAccount entity = new OwnerLoanAccount();
entity.setId(ownerLoanAccount.getId()); entity.setId(ownerLoanAccount.getId());
/* entity.setVirtuallyAmount(ownerLoanRecord.getLoanBalance()); entity.setFundingAccountBalance(BigDecimal.ZERO);
entity.setFundingAmount(BigDecimal.ZERO);*/ entity.setFundingFrozenBalance(BigDecimal.ZERO);
entity.setFundingUsableBalance(BigDecimal.ZERO);
entity.setVirtuallyAccountBalance(ownerLoanRecord.getLoanBalance());
entity.setVirtuallyFrozenBalance(BigDecimal.ZERO);
entity.setVirtuallyUsableBalance(ownerLoanRecord.getLoanBalance());
entity.setModifiedTime(ownerLoanAccount.getModifiedTime()); entity.setModifiedTime(ownerLoanAccount.getModifiedTime());
Integer flag = ownerLoanAccountDao.updateAccountCAS(entity, LocalDateTime.now(), true); Integer flag = ownerLoanAccountDao.updateAccountCAS(entity, LocalDateTime.now(), true);
if (flag == 1) { if (flag == 1) {
...@@ -173,6 +213,7 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -173,6 +213,7 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
break; break;
} }
} }
}
} else { } else {
//拒绝 //拒绝
...@@ -192,6 +233,7 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -192,6 +233,7 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
/** /**
* 生成借款流水 * 生成借款流水
*
* @param ownerLoanRecord * @param ownerLoanRecord
*/ */
private void initOwnerLoanRunningWaterRecord(OwnerLoanRecord ownerLoanRecord) { private void initOwnerLoanRunningWaterRecord(OwnerLoanRecord ownerLoanRecord) {
...@@ -213,6 +255,7 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -213,6 +255,7 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
/** /**
* 生成还款记录 * 生成还款记录
*
* @param ownerLoanRecord * @param ownerLoanRecord
*/ */
private void initOwnerRepayment(OwnerLoanRecord ownerLoanRecord) { private void initOwnerRepayment(OwnerLoanRecord ownerLoanRecord) {
...@@ -241,14 +284,14 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -241,14 +284,14 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
@Override @Override
public OwnerLoanRecordDetail getOwnerLoanRecordDetail() { public OwnerLoanRecordDetail getOwnerLoanRecordDetail() {
List<BorrowerSelectVO> borrowerList = borrowerDao.selectAllBorrowConfig(); List<BorrowerSelectVO> borrowerList = borrowerDao.selectAllBorrowConfig();
Map<String,BorrowerSelectVO> map = new TreeMap<>(); Map<String, BorrowerSelectVO> map = new TreeMap<>();
for (BorrowerSelectVO item : borrowerList) { for (BorrowerSelectVO item : borrowerList) {
if(map.containsKey(item.getName())){ if (map.containsKey(item.getName())) {
if(Objects.equals(item.getType(),OwnerLoanRecordEnum.LoanType.VIRTUAL_CURRENCY.getCode())){ if (Objects.equals(item.getType(), OwnerLoanRecordEnum.LoanType.VIRTUAL_CURRENCY.getCode())) {
map.put(item.getName(),item); map.put(item.getName(), item);
} }
}else{ } else {
map.put(item.getName(),item); map.put(item.getName(), item);
} }
} }
OwnerLoanRecordDetail detail = new OwnerLoanRecordDetail(); OwnerLoanRecordDetail detail = new OwnerLoanRecordDetail();
...@@ -262,8 +305,8 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -262,8 +305,8 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
detail.setCompanyName(ownerInfoFeignVO.getCompanyName()); detail.setCompanyName(ownerInfoFeignVO.getCompanyName());
//收款方 //收款方
List<PayeeVO> payeeList =ClxPayeeConfig.payeeList.stream().map( List<PayeeVO> payeeList = ClxPayeeConfig.payeeList.stream().map(
item-> PayeeVO.builder().name(item.getName()).account(item.getAccount()).id(item.getId()).build() item -> PayeeVO.builder().name(item.getName()).account(item.getAccount()).id(item.getId()).build()
).collect(Collectors.toList()); ).collect(Collectors.toList());
detail.setPayeeList(payeeList); detail.setPayeeList(payeeList);
...@@ -271,8 +314,6 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -271,8 +314,6 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
} }
@Override @Override
public CarrierCashierInfoVO getCashierInfo(Integer id) { public CarrierCashierInfoVO getCashierInfo(Integer id) {
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getEntityByKey(id).orElseThrow( OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getEntityByKey(id).orElseThrow(
...@@ -312,13 +353,14 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -312,13 +353,14 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
PerformanceResultEnum.DATA_NOT_FIND); PerformanceResultEnum.DATA_NOT_FIND);
ExportOwnerLoanRecordVO exportOwnerLoanRecordVO = ownerLoanRecordStruct.convert(ownerLoanRecord); ExportOwnerLoanRecordVO exportOwnerLoanRecordVO = ownerLoanRecordStruct.convert(ownerLoanRecord);
//货主借款: 收款方鑫祥和 付款方为诚联信 借款方为货主 //货主借款: 收款方鑫祥和 付款方为诚联信 借款方为货主
Map<String,String> map = JSON.parseObject(JSON.toJSONString(exportOwnerLoanRecordVO), new TypeReference<Map<String,String>>(){}); Map<String, String> map = JSON.parseObject(JSON.toJSONString(exportOwnerLoanRecordVO), new TypeReference<Map<String, String>>() {
});
// 创建合同 // 创建合同
GenerateContractParam feignParam = new GenerateContractParam(); GenerateContractParam feignParam = new GenerateContractParam();
if(Objects.equals(OwnerRePaymentEnum.Channel.ORDER.getCode(),param.getPayWay())){ if (Objects.equals(OwnerRePaymentEnum.Channel.ORDER.getCode(), param.getPayWay())) {
feignParam.setTemplateNo(paymentFromConfig.getLoanOrderTemplateNo()); feignParam.setTemplateNo(Long.valueOf(paymentFromConfig.getLoanOrderTemplateNo()));
}else{ } else {
feignParam.setTemplateNo(paymentFromConfig.getLoanTransferTemplateNo()); feignParam.setTemplateNo(Long.valueOf(paymentFromConfig.getLoanTransferTemplateNo()));
} }
feignParam.setParametersValueMap(map); feignParam.setParametersValueMap(map);
...@@ -329,31 +371,38 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -329,31 +371,38 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void getLoanBalance(BigDecimal orderChildPrice, Long userNo, String childNo) { public void getLoanBalance(LoanBalanceDTO param) {
BigDecimal orderChildPrice = param.getOrderChildPrice();
Long userNo = param.getOwnerUserNo();
String childNo = param.getChildNo();
log.info("执行借款,借款金额{}, 货主编号:{}, 运单号:{}", orderChildPrice, userNo, childNo); log.info("执行借款,借款金额{}, 货主编号:{}, 运单号:{}", orderChildPrice, userNo, childNo);
//TODO 需要加锁处理
List<OwnerLoanRecord> updateList = new LinkedList<>(); List<OwnerLoanRecord> updateList = new LinkedList<>();
List<OwnerLoanRecord> ownerLoanRecords = ownerLoanRecordDao.selectLoanBalance(userNo); List<OwnerLoanRecord> ownerLoanRecords = ownerLoanRecordDao.selectLoanBalance(userNo);
BigDecimal orderChildPriceTemp = orderChildPrice; BigDecimal orderChildPriceTemp = orderChildPrice;
log.info("查询ownerLoanRecords:{}", JSONUtil.parse(ownerLoanRecords));
for (OwnerLoanRecord ownerLoanRecord : ownerLoanRecords) { for (OwnerLoanRecord ownerLoanRecord : ownerLoanRecords) {
BigDecimal loanResidueBalance = ownerLoanRecord.getLoanResidueBalance(); BigDecimal loanResidueBalance = ownerLoanRecord.getLoanResidueBalance();
log.info("当前借款金额:{},借款单号{},借款剩余金额{}", orderChildPriceTemp, ownerLoanRecord.getLoanNo(), loanResidueBalance); log.info("当前借款金额:{},借款单号{},借款剩余金额{}", orderChildPriceTemp, ownerLoanRecord.getLoanNo(), loanResidueBalance);
if (loanResidueBalance.compareTo(orderChildPriceTemp) >= 0) { if (loanResidueBalance.compareTo(orderChildPriceTemp) >= 0) {
log.info("当前借款单的剩余金额足够借款金额"); log.info("当前借款单的剩余金额足够借款金额");
generateFrozenOwnerLoanRunningWater(ownerLoanRecord, childNo, orderChildPrice); generateFrozenOwnerLoanRunningWater(ownerLoanRecord, childNo, orderChildPriceTemp);
updateList.add(ownerLoanRecord.setLoanResidueBalance(loanResidueBalance.subtract(orderChildPriceTemp))); updateList.add(ownerLoanRecord.setLoanResidueBalance(loanResidueBalance.subtract(orderChildPriceTemp)));
orderChildPriceTemp = BigDecimal.ZERO; orderChildPriceTemp = BigDecimal.ZERO;
break; break;
} else { } else {
log.info("当前借款单的剩余金额不够抵扣借款金额,先进行扣除当前借款所有剩余"); log.info("当前借款单的剩余金额不够抵扣借款金额,先进行扣除当前借款所有剩余");
generateFrozenOwnerLoanRunningWater(ownerLoanRecord, childNo, orderChildPrice); generateFrozenOwnerLoanRunningWater(ownerLoanRecord, childNo, loanResidueBalance);
updateList.add(ownerLoanRecord.setLoanResidueBalance(BigDecimal.ZERO)); updateList.add(ownerLoanRecord.setLoanResidueBalance(BigDecimal.ZERO));
orderChildPriceTemp = orderChildPriceTemp.subtract(loanResidueBalance); orderChildPriceTemp = orderChildPriceTemp.subtract(loanResidueBalance);
} }
log.info("当前orderChildPriceTemp:{}", orderChildPriceTemp);
} }
if (orderChildPriceTemp.compareTo(BigDecimal.ZERO) != 0) { if (orderChildPriceTemp.compareTo(BigDecimal.ZERO) != 0) {
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_SAVE_FAIL, "货主货款不足"); //当前钱不够,需要记录,流程卡死,不往下走
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "执行借款发现:货主货款不足");
} }
for (OwnerLoanRecord update : updateList) { for (OwnerLoanRecord update : updateList) {
...@@ -362,6 +411,111 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -362,6 +411,111 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
log.info("执行借款成功,借款金额{}, 货主编号:{}, 运单号:{}", orderChildPrice, userNo, childNo); log.info("执行借款成功,借款金额{}, 货主编号:{}, 运单号:{}", orderChildPrice, userNo, childNo);
} }
@Override
public void updateOwnerLoanRecordPay(CarrierOwnerLoanRecordPayParam param) {
}
@Override
public void updateOwnerLoanRecordRepay(CarrierOwnerLoanRecordRepayParam param) {
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, param.getLoanNo())
.orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (!Objects.equals(ownerLoanRecord.getStatus(), OwnerLoanRecordEnum.Status.PAY_FAIL.getCode())){
throw new ServiceSystemException(PerformanceResultEnum.OWNER_LOAN_RECORD_PAY_STATUS_ERROR);
}
borrowerConfigDao.selectByBorrowerIdAndType(ownerLoanRecord.getBorrowerId(), OwnerLoanRecordEnum.LoanType.FUND.getCode())
.orElseThrow(PerformanceResultEnum.BORROWER_CONFIG_TYPE_NOT_SUPPORT_ERROR);
Borrower borrower = borrowerDao.getEntityByKey(ownerLoanRecord.getBorrowerId())
.orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
BankTrade bankTrade = new BankTrade();
if (OwnerLoanRecordEnum.PayChannel.ORDER_DIRECT_PAY.getCode().equals(param.getPayChannel())) {
//资金 TODO 调宁波银企直连的产品,从诚联信账户中给鑫祥和执行转账
// 订单支付
NbBankOrderPayResultVO orderPayResultVO = bankService.orderDirectPay(param.getLoanNo(),
ownerLoanRecord.getLoanBalance().intValue(), borrower.getOpenBankId(), borrower.getBankCardNo(), borrower.getName());
ownerLoanRecord.setRunningWaterOpenNo(orderPayResultVO.getTransSeqNo());
ownerLoanRecord.setMerchantRunningWaterNo(orderPayResultVO.getMerSeqNo());
ownerLoanRecord.setRemittanceIdentificationCode(null);
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.PAYING.getCode());
ownerLoanRecord.setLoanResidueBalance(ownerLoanRecord.getLoanBalance());
ownerLoanRecord.setLendingParty(borrower.getName());
ownerLoanRecord.setLendingPartyAccount(borrower.getBankCardNo());
bankTrade.setTradeType(BankTradeEnum.TradeType.ORDER_DIRECT_PAY.getCode());
}
else {
//资金 TODO 调宁波银企直连的产品,从诚联信账户中给鑫祥和执行转账
// 转账支付
NbBankOrderPayResultVO orderPayResultVO = bankService.orderTransferPay(ownerLoanRecord.getLoanBalance().intValue());
ownerLoanRecord.setRunningWaterOpenNo(orderPayResultVO.getTransSeqNo());
ownerLoanRecord.setMerchantRunningWaterNo(orderPayResultVO.getMerSeqNo());
ownerLoanRecord.setRemittanceIdentificationCode(orderPayResultVO.getSignNo());
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.PAYING.getCode());
ownerLoanRecord.setLoanResidueBalance(ownerLoanRecord.getLoanBalance());
ownerLoanRecord.setLendingParty(null);
ownerLoanRecord.setLendingPartyAccount(null);
bankTrade.setTradeType(BankTradeEnum.TradeType.ORDER_TRANSFER_PAY.getCode());
}
// 更新借款支付信息
ownerLoanRecordDao.updatePay(ownerLoanRecord);
bankTrade.setOrderType(BankTradeEnum.OrderType.OWNER_LOAN_RECORD.getCode());
bankTrade.setAmount(ownerLoanRecord.getLoanBalance());
bankTrade.setMerchantRunningWaterNo(ownerLoanRecord.getMerchantRunningWaterNo());
bankTrade.setRunningWaterOpenNo(ownerLoanRecord.getRunningWaterOpenNo());
// 保存银行交易记录
bankTradeDao.saveEntity(bankTrade);
}
@Override
public void updateOwnerLoanRecordPayCancel(CarrierOwnerLoanRecordPayCancelParam param) {
}
@Override
public void payFail(String loanNo){
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, loanNo)
.orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (Objects.equals(ownerLoanRecord.getStatus(), OwnerLoanRecordEnum.Status.PAYING.getCode())){
log.info("借款单非支付中状态, loanNo:{}", loanNo);
return;
}
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.PAY_FAIL.getCode());
ownerLoanRecordDao.updatePaySuccess(ownerLoanRecord);
}
@Override
public void paySuccess(String loanNo){
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, loanNo)
.orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (Objects.equals(ownerLoanRecord.getStatus(), OwnerLoanRecordEnum.Status.PAYING.getCode())){
log.info("借款单非支付中状态, loanNo:{}", loanNo);
return;
}
ownerLoanRecord.setStatus(OwnerLoanRecordEnum.Status.PAY_SUCCESS.getCode());
ownerLoanRecordDao.updatePaySuccess(ownerLoanRecord);
}
public void generateFrozenOwnerLoanRunningWater(OwnerLoanRecord ownerLoanRecord, String childNo, BigDecimal orderChildPrice) { public void generateFrozenOwnerLoanRunningWater(OwnerLoanRecord ownerLoanRecord, String childNo, BigDecimal orderChildPrice) {
log.info("13.生成借款冻结流水"); log.info("13.生成借款冻结流水");
OwnerLoanAccount update = new OwnerLoanAccount(); OwnerLoanAccount update = new OwnerLoanAccount();
...@@ -386,7 +540,9 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService { ...@@ -386,7 +540,9 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
waterRecord.setUseAbleBalance(account.getVirtuallyUsableBalance().add(account.getFundingUsableBalance())); waterRecord.setUseAbleBalance(account.getVirtuallyUsableBalance().add(account.getFundingUsableBalance()));
waterRecord.setFrozenBalance(account.getVirtuallyFrozenBalance().add(account.getFundingFrozenBalance())); waterRecord.setFrozenBalance(account.getVirtuallyFrozenBalance().add(account.getFundingFrozenBalance()));
waterRecord.setCreateBy("系统"); waterRecord.setCreateBy("系统");
log.info("开始生成流水");
ownerLoanAccountRunningWaterRecordDao.saveEntity(waterRecord); ownerLoanAccountRunningWaterRecordDao.saveEntity(waterRecord);
log.info("生成流水成功");
break; break;
} }
} }
......
...@@ -108,9 +108,9 @@ public class OwnerRepaymentServiceImpl implements OwnerRepaymentService { ...@@ -108,9 +108,9 @@ public class OwnerRepaymentServiceImpl implements OwnerRepaymentService {
// 创建合同 // 创建合同
GenerateContractParam feignParam = new GenerateContractParam(); GenerateContractParam feignParam = new GenerateContractParam();
if(Objects.equals(OwnerRePaymentEnum.Channel.ORDER.getCode(),param.getPayWay())){ if(Objects.equals(OwnerRePaymentEnum.Channel.ORDER.getCode(),param.getPayWay())){
feignParam.setTemplateNo(paymentFromConfig.getRepaymentOrderTemplateNo()); feignParam.setTemplateNo(Long.valueOf(paymentFromConfig.getRepaymentOrderTemplateNo()));
}else{ }else{
feignParam.setTemplateNo(paymentFromConfig.getRepaymentTransferTemplateNo()); feignParam.setTemplateNo(Long.valueOf(paymentFromConfig.getRepaymentTransferTemplateNo()));
} }
feignParam.setParametersValueMap(map); feignParam.setParametersValueMap(map);
......
...@@ -2,11 +2,16 @@ package com.clx.performance.service.impl.thirdparty.nbbank; ...@@ -2,11 +2,16 @@ package com.clx.performance.service.impl.thirdparty.nbbank;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.clx.performance.component.IdGenerateSnowFlake; import com.clx.performance.component.IdGenerateSnowFlake;
import com.clx.performance.dao.loan.BankTradeDao;
import com.clx.performance.enums.PerformanceResultEnum; import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.loan.BankTradeEnum;
import com.clx.performance.enums.nbbank.NbBankStatusEnum; import com.clx.performance.enums.nbbank.NbBankStatusEnum;
import com.clx.performance.model.loan.BankTrade;
import com.clx.performance.service.loan.OwnerLoanRecordService;
import com.clx.performance.service.thirdparty.nbbank.NbBankService; import com.clx.performance.service.thirdparty.nbbank.NbBankService;
import com.clx.performance.service.thirdparty.nbbank.NbBankThirdpartyService; import com.clx.performance.service.thirdparty.nbbank.NbBankThirdpartyService;
import com.clx.performance.utils.LocalDateTimeUtils; import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.utils.SpringContextUtils;
import com.clx.performance.vo.pc.nbbank.NbBankOrderPayResultVO; import com.clx.performance.vo.pc.nbbank.NbBankOrderPayResultVO;
import com.clx.performance.vo.pc.nbbank.NbBankOrderResultVO; import com.clx.performance.vo.pc.nbbank.NbBankOrderResultVO;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
...@@ -16,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -16,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Objects;
/** /**
* 易付通 * 易付通
...@@ -24,6 +30,9 @@ import java.math.BigDecimal; ...@@ -24,6 +30,9 @@ import java.math.BigDecimal;
@Service @Service
public class NbBankServiceImpl implements NbBankService { public class NbBankServiceImpl implements NbBankService {
@Autowired
private BankTradeDao bankTradeDao;
@Autowired @Autowired
private NbBankThirdpartyService bankThirdpartyService; private NbBankThirdpartyService bankThirdpartyService;
...@@ -69,7 +78,7 @@ public class NbBankServiceImpl implements NbBankService { ...@@ -69,7 +78,7 @@ public class NbBankServiceImpl implements NbBankService {
@Override @Override
public NbBankOrderPayResultVO orderDirectPay(Long loanNo, Integer amount, public NbBankOrderPayResultVO orderDirectPay(Long loanNo, Integer amount,
String payAcctOpenBankId, String payAcctNo, String payAcctNm) { String payAcctOpenBankId, String payAcctNo, String payAcctNm) {
String merSeqNo = idGenerateSnowFlake.nextIdToString(3L); String merSeqNo = String.valueOf(loanNo);
String merDtTm = LocalDateTimeUtils.formatTime(); String merDtTm = LocalDateTimeUtils.formatTime();
String closeDtTm = LocalDateTimeUtils.formatTime(LocalDateTimeUtils.parseTime(merDtTm).plusDays(30)); String closeDtTm = LocalDateTimeUtils.formatTime(LocalDateTimeUtils.parseTime(merDtTm).plusDays(30));
...@@ -214,6 +223,30 @@ public class NbBankServiceImpl implements NbBankService { ...@@ -214,6 +223,30 @@ public class NbBankServiceImpl implements NbBankService {
log.info("宁波银行支付回调, merSeqNo:{}, transSeqNo:{}, trxAmt:{}, realTrxAmt:{}, transSeqNo:{}, signNo:{}", log.info("宁波银行支付回调, merSeqNo:{}, transSeqNo:{}, trxAmt:{}, realTrxAmt:{}, transSeqNo:{}, signNo:{}",
merSeqNo, transSeqNo, trxAmt, realTrxAmt, transStatus, signNo); merSeqNo, transSeqNo, trxAmt, realTrxAmt, transStatus, signNo);
BankTrade bankTrade = bankTradeDao.selectByMerchantRunningWaterNo(merSeqNo).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
bankTrade.setStatus(transStatus);
// 更新状态
bankTradeDao.updateStatus(bankTrade);
// 货主借款支付回调
if (Objects.equals(bankTrade.getOrderType(), BankTradeEnum.OrderType.OWNER_LOAN_RECORD.getCode())){
if (Objects.equals(transStatus, NbBankStatusEnum.Status.SUCCESS.getCode())) {
SpringContextUtils.getBeanByClass(OwnerLoanRecordService.class).paySuccess(merSeqNo);
}
else if (Objects.equals(transStatus, NbBankStatusEnum.Status.FAIL.getCode())) {
SpringContextUtils.getBeanByClass(OwnerLoanRecordService.class).payFail(merSeqNo);
}
else {
// TODO 其它情况
}
}
else {
}
} }
/** /**
......
package com.clx.performance.service.loan; package com.clx.performance.service.loan;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.param.pc.loan.carrier.CarrierOwnerLoanRecordApproveParam; import com.clx.performance.dto.LoanBalanceDTO;
import com.clx.performance.param.pc.loan.carrier.PageCarrierOwnerLoanRecordParam; import com.clx.performance.param.pc.loan.carrier.*;
import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanRecordOfOwner;
import com.clx.performance.param.pc.loan.owner.ExportPaymentApplicationFormParam; import com.clx.performance.param.pc.loan.owner.ExportPaymentApplicationFormParam;
import com.clx.performance.param.pc.loan.owner.OwnerLoanRecordParam; import com.clx.performance.param.pc.loan.owner.OwnerLoanRecordParam;
import com.clx.performance.vo.pc.loan.carrier.OwnerLoanRecordVO;
import com.clx.performance.vo.pc.loan.carrier.CarrierCashierInfoVO; import com.clx.performance.vo.pc.loan.carrier.CarrierCashierInfoVO;
import com.clx.performance.vo.pc.loan.carrier.CarrierTransferPaymentDetailVO;
import com.clx.performance.vo.pc.loan.carrier.OwnerLoanRecordVO;
import com.clx.performance.vo.pc.loan.carrier.OwnerOrderPaymentDetailVO; import com.clx.performance.vo.pc.loan.carrier.OwnerOrderPaymentDetailVO;
import com.clx.performance.vo.pc.loan.owner.OwnerLoanRecordDetail; import com.clx.performance.vo.pc.loan.owner.OwnerLoanRecordDetail;
import com.clx.performance.vo.pc.loan.carrier.CarrierTransferPaymentDetailVO;
import java.math.BigDecimal;
/** /**
* @author kavin * @author kavin
...@@ -38,5 +37,12 @@ public interface OwnerLoanRecordService { ...@@ -38,5 +37,12 @@ public interface OwnerLoanRecordService {
String savePaymentApplicationForm(ExportPaymentApplicationFormParam param); String savePaymentApplicationForm(ExportPaymentApplicationFormParam param);
void getLoanBalance(BigDecimal orderChildPrice, Long userNo, String childNo); void getLoanBalance(LoanBalanceDTO param);
void updateOwnerLoanRecordPay(CarrierOwnerLoanRecordPayParam param);
void updateOwnerLoanRecordRepay(CarrierOwnerLoanRecordRepayParam param);
void updateOwnerLoanRecordPayCancel(CarrierOwnerLoanRecordPayCancelParam param);
void payFail(String loanNo);
void paySuccess(String loanNo);
} }
...@@ -19,7 +19,7 @@ public class OwnerLoanRecordSqlProvider { ...@@ -19,7 +19,7 @@ public class OwnerLoanRecordSqlProvider {
" running_water_open_no as runningWaterOpenNo, merchant_running_water_no as merchantRunningWaterNo, " + " running_water_open_no as runningWaterOpenNo, merchant_running_water_no as merchantRunningWaterNo, " +
" loan_no as loanNo, loan_type as loanType, loan_balance as loanBalance, " + " loan_no as loanNo, loan_type as loanType, loan_balance as loanBalance, " +
" borrower, borrower_account as borrowerAccount, remittance_identification_code as remittanceIdentificationCode, " + " borrower, borrower_account as borrowerAccount, remittance_identification_code as remittanceIdentificationCode, " +
" lending_party as lendingParty, lending_party_account as lendingPartyAccount, " + " lending_party_id as lendingPartyId, lending_party as lendingParty, lending_party_account as lendingPartyAccount, " +
" payee, payee_account as payeeAccount, " + " payee, payee_account as payeeAccount, " +
" status, " + " status, " +
" date_format(approve_time, '%Y-%m-%d %H:%i:%s') as approveTime, approve_by as approveBy, " + " date_format(approve_time, '%Y-%m-%d %H:%i:%s') as approveTime, approve_by as approveBy, " +
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论