提交 56237241 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
......@@ -132,7 +132,7 @@ public enum PerformanceResultEnum implements ResultEnum {
OWNER_LOAN_RECORD_CANCEL_STATUS_ERROR(1851, "状态已变更无法取消"),
OWNER_LOAN_RECORD_ADJUST_STATUS_ERROR(1851, "状态已变更无法核销"),
OWNER_LOAN_RECORD_PAY_WAIT_ERROR(1852,"当前借款单状态不是待付款"),
OWNER_LOAN_PAYMENT_STATUS_ERROR(1851, "状态已变变更"),
OWNER_LOAN_PAYMENT_STATUS_ERROR(1851, "执行借款审批失败,请稍后重试"),
;
private final int code;
......
......@@ -179,6 +179,7 @@ public class OrderChildLoanComponent {
param.setOrderChildPrice(orderChildPrice);
param.setOwnerUserNo(ownerLoanAccount.getOwnerUserNo());
param.setChildNo(childNo);
param.setEventFlag(false);
getLoanBalanceLock(param);
}
......
......@@ -12,4 +12,7 @@ public class RedissonConstants {
public static final String ORDER_CHILD_LOAN_OWNER_USERID_LOCK = "clx-performance:orderChild:loan:ownerUserId:";
public static final String ORDER_CHILD_LOAN_RECORD_LOAN_NO_LOCK = "clx-performance:loanRecordApprove:loanNo:";
}
package com.clx.performance.controller.pc.loan.carrier;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.param.pc.loan.carrier.*;
import com.clx.performance.param.pc.loan.owner.ExportPaymentApplicationFormParam;
import com.clx.performance.service.loan.OwnerLoanRecordService;
......@@ -10,17 +13,21 @@ import com.clx.performance.vo.pc.loan.carrier.OwnerLoanRecordVO;
import com.clx.performance.vo.pc.loan.carrier.CarrierTransferPaymentDetailVO;
import com.msl.common.base.PageData;
import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.concurrent.TimeUnit;
@Slf4j
@RestController
......@@ -32,6 +39,8 @@ public class CarrierOwnerLoanRecordController {
private final OwnerLoanRecordService ownerLoanRecordService;
private final RedissonClient redissonClient;
@ApiOperation(value = "借款审批列表",notes = "<br>By:刘海泉")
@PostMapping("/pageOwnerLoanRecord")
......@@ -44,7 +53,24 @@ public class CarrierOwnerLoanRecordController {
@ApiOperation(value = "借款审批(虚拟币直接增加,资金需要跳收银台提交申请)",notes = "<br>By:胡宇帆")
@PostMapping("/ownerLoanRecordApprove")
public Result<Object> ownerLoanRecordApprove(@RequestBody @Validated CarrierOwnerLoanRecordApproveParam param) {
ownerLoanRecordService.ownerLoanRecordApprove(param);
RLock lock = null;
try {
lock = redissonClient.getLock(RedissonConstants.ORDER_CHILD_LOAN_RECORD_LOAN_NO_LOCK + param.getLoanNo());
boolean flag = lock.tryLock(5, 4, TimeUnit.SECONDS);
if (!flag) {
throw new ServiceSystemException(PerformanceResultEnum.OWNER_LOAN_PAYMENT_STATUS_ERROR);
}
ownerLoanRecordService.ownerLoanRecordApprove(param);
} catch (Exception e) {
log.info("借款审批异常,param:{}, lock:{}", param, JSONUtil.parse(lock));
throw new ServiceSystemException(PerformanceResultEnum.OWNER_LOAN_PAYMENT_STATUS_ERROR, e.getMessage());
} finally {
if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
return Result.ok();
}
......
......@@ -20,4 +20,10 @@ public class OrderChildLoanRetryRecordDaoImpl extends BaseDaoImpl<OrderChildLoan
public List<OrderChildLoanRetryRecord> selectListByOwnerUserNoAndIdAsc(Long userNo) {
return baseMapper.selectList(lQrWrapper().eq(OrderChildLoanRetryRecord::getOwnerUserNo, userNo).orderByAsc(OrderChildLoanRetryRecord::getId));
}
@Override
public OrderChildLoanRetryRecord selectOneByOwnerIdAndDriverId(Integer ownerId, Integer driverId) {
return baseMapper.selectOne(lQrWrapper().eq(OrderChildLoanRetryRecord::getSettlementOwnerId, ownerId)
.eq(OrderChildLoanRetryRecord::getSettlementDriverId, driverId));
}
}
......@@ -79,6 +79,8 @@ public class OwnerRepaymentDaoImpl extends BaseDaoImpl<OwnerRepaymentMapper, Own
.set(OwnerRepayment::getCloseOrderTime, ownerRepayment.getCloseOrderTime())
.set(OwnerRepayment::getPayment,ownerRepayment.getPayment())
.set(OwnerRepayment::getPaymentAccount,ownerRepayment.getPaymentAccount())
.set(OwnerRepayment::getOperateBy, ownerRepayment.getOperateBy())
.set(OwnerRepayment::getOperateTime, ownerRepayment.getOperateTime())
);
......
......@@ -14,4 +14,6 @@ import java.util.List;
public interface OrderChildLoanRetryRecordDao extends BaseDao<OrderChildLoanRetryRecordMapper, OrderChildLoanRetryRecord, Integer> {
List<OrderChildLoanRetryRecord> selectListByOwnerUserNoAndIdAsc(Long userNo);
OrderChildLoanRetryRecord selectOneByOwnerIdAndDriverId(Integer ownerId, Integer driverId);
}
......@@ -67,13 +67,19 @@ public class EventListenerComponent {
log.info("当前货主结算信息{},车主结算信息:{}", JSONUtil.parse(settlementOwnerDetail), JSONUtil.parse(settlementDriverDetail));
settlementOwnerDetailDao.updateInvoiceType(settlementOwnerDetail);
settlementDriverDetailDao.updateInvoiceTypeAndPrepayFreightFlag(settlementDriverDetail);
Integer ownerId = settlementOwnerDetail.getId();
Integer driverId = settlementDriverDetail.getId();
OrderChildLoanRetryRecord record = orderChildLoanRetryRecordDao.selectOneByOwnerIdAndDriverId(ownerId, driverId);
if (record == null) {
OrderChildLoanRetryRecord entity = new OrderChildLoanRetryRecord();
entity.setSettlementOwnerId(ownerId);
entity.setSettlementDriverId(driverId);
entity.setOwnerUserNo(settlementOwnerDetail.getOwnerUserNo());
// 保存重试记录
orderChildLoanRetryRecordDao.saveEntity(entity);
}
OrderChildLoanRetryRecord entity = new OrderChildLoanRetryRecord();
entity.setSettlementOwnerId(settlementOwnerDetail.getId());
entity.setSettlementDriverId(settlementDriverDetail.getId());
entity.setOwnerUserNo(settlementOwnerDetail.getOwnerUserNo());
// 保存重试记录
orderChildLoanRetryRecordDao.saveEntity(entity);
}
@EventListener(classes = {OwnerRepaymentUpdateEvent.class})
......
package com.clx.performance.service.impl.loan;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.component.OrderChildLoanComponent;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.loan.*;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.OwnerLoanMqDTO;
import com.clx.performance.dao.loan.BankTradeDao;
import com.clx.performance.dao.loan.OwnerLoanAccountDao;
import com.clx.performance.dao.loan.OwnerLoanRecordDao;
import com.clx.performance.dao.loan.OwnerRepaymentDao;
import com.clx.performance.enums.OwnerAccountEnum;
import com.clx.performance.enums.loan.BankTradeEnum;
import com.clx.performance.enums.loan.OwnerLoanAccountApproveEnum;
import com.clx.performance.enums.loan.OwnerLoanRecordEnum;
import com.clx.performance.enums.loan.OwnerRePaymentEnum;
import com.clx.performance.extranal.user.OwnerInfoService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.breakcontract.BreakContractSettlementDriver;
import com.clx.performance.model.loan.*;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.model.loan.BankTrade;
import com.clx.performance.model.loan.OwnerLoanAccount;
import com.clx.performance.model.loan.OwnerLoanRecord;
import com.clx.performance.model.loan.OwnerRepayment;
import com.clx.performance.param.pc.loan.carrier.OwnerRepaymentParam;
import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanAccountParam;
import com.clx.performance.service.loan.OwnerLoanAccountService;
......@@ -33,18 +26,13 @@ import com.msl.common.base.Optional;
import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.user.data.UserSessionData;
import com.msl.user.utils.TokenUtil;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author kavin
......@@ -141,6 +129,9 @@ public class OwnerLoanAccountServiceImpl implements OwnerLoanAccountService {
ownerRepayment.setPayment(ownerInfo.getName());
ownerRepayment.setPaymentAccount(ownerInfo.getOwnerBankAccount());
ownerRepayment.setOperateBy(TokenUtil.getLoginUserInfo().getUserName());
ownerRepayment.setOperateTime(LocalDateTime.now());
// 更新还款支付信息
ownerRepaymentDao.updateRePay(ownerRepayment);
......
......@@ -29,7 +29,6 @@ import com.clx.performance.dto.LoanBalanceDTO;
import com.clx.performance.dao.loan.*;
import com.clx.performance.dto.OwnerLoanMqDTO;
import com.clx.performance.enums.PerformanceResultEnum;
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.OwnerLoanRecordEnum;
......@@ -185,7 +184,12 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
@Override
@Transactional(rollbackFor = Exception.class)
public void ownerLoanRecordApprove(CarrierOwnerLoanRecordApproveParam param) {
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, param.getLoanNo()).get();
if (!ownerLoanRecord.getStatus().equals(OwnerLoanRecordEnum.Status.APPROVE_WAIT.getCode())) {
log.info("当前借款单单号:{},状态:{}", ownerLoanRecord.getLoanNo(), ownerLoanRecord.getStatus());
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND);
}
if (param.getStatus()) {
borrowerConfigDao.selectByBorrowerIdAndType(ownerLoanRecord.getBorrowerId(), param.getLoanType())
.orElseThrow(PerformanceResultEnum.BORROWER_CONFIG_TYPE_NOT_SUPPORT_ERROR);
......@@ -315,7 +319,6 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
*/
private void initOwnerLoanRunningWaterRecord(OwnerLoanRecord ownerLoanRecord) {
OwnerLoanAccount ownerLoanAccount = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo, ownerLoanRecord.getOwnerUserNo()).get();
log.info("当前ownerLoanAccount{}", JSONUtil.parse(ownerLoanAccount));
ownerLoanRecordDao.updateEntityByKey(ownerLoanRecord);
OwnerLoanAccountRunningWaterRecord record = new OwnerLoanAccountRunningWaterRecord()
.setOwnerUserNo(ownerLoanRecord.getOwnerUserNo())
......@@ -526,10 +529,9 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
if (orderChildPriceTemp.compareTo(BigDecimal.ZERO) != 0) {
//当前钱不够,需要记录,流程卡死,不往下走
if (param.getEventFlag()) {
//此刻说明是确认收货后触发的逻辑,需要是否之前冻结的借款
applicationEventPublisher.publishEvent(new OwnerLoanThawEvent(this, param.getChildNo()));
}
log.info("当前运单货款不足,运单号{},开始执行解冻操作", childNo);
applicationEventPublisher.publishEvent(new OwnerLoanThawEvent(this, childNo));
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "执行借款发现:货主货款不足");
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论