提交 4c16a48e authored 作者: huyufan's avatar huyufan

借款到账后执行重新借款标志处理

上级 b82a7e71
......@@ -54,6 +54,25 @@ public enum OwnerLoanRecordEnum {
}
}
@Getter
@AllArgsConstructor
public enum LoanFlag {
NO_LOAN(0, "未借款"),
LOAN(2, "已借款"),
RE_PAY(3, "已还款"),
;
private final Integer code;
private final String msg;
public static Optional<LoanFlag> 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(LoanFlag::getMsg).orElse(null);
}
}
@Getter
@AllArgsConstructor
......
package com.clx.performance;
package com.clx.performance.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -8,9 +8,9 @@ import javax.validation.constraints.NotNull;
@Data
public class OwnerLoanPayNotifyMqParam {
@NotNull(message = "借款单号不能为空")
@ApiModelProperty("借款单号")
private String loanNo;
@NotNull(message = "流水号不能为空")
@ApiModelProperty("流水号")
private String merSeqNo;
@ApiModelProperty("支付状态")
private Integer payStatus;
......
......@@ -20,6 +20,7 @@ import com.clx.performance.enums.loan.OwnerLoanAccountRunningWaterRecordEnum;
import com.clx.performance.enums.loan.OwnerLoanRecordEnum;
import com.clx.performance.enums.loan.OwnerRePaymentEnum;
import com.clx.performance.enums.settle.SettlementOwnerEnum;
import com.clx.performance.enums.settle.SettlementWayEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.OwnerRunningWaterRecord;
......@@ -43,6 +44,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Component
......@@ -170,8 +172,16 @@ public class OrderChildLoanComponent {
* @param settlementOwnerDetail
*/
@Transactional(rollbackFor = Exception.class)
public void childLoanConfirmAfterProcess(SettlementDriverDetail settlementDriverDetail, SettlementOwnerDetail settlementOwnerDetail) {
public void childLoanConfirmAfterProcess(SettlementDriverDetail settlementDriverDetail, SettlementOwnerDetail settlementOwnerDetail, OrderChild orderChild) {
log.info("1.运单确认收货后借款相关处理执行");
OwnerQuotationDetailVO quotationDetailVO = orderFeign.getQuotationByOrderNo(settlementDriverDetail.getOrderNo()).getData();
BigDecimal freightFreezeRate = quotationDetailVO.getFreightFreezeRate();
if (freightFreezeRate.compareTo(BigDecimal.ONE) == 0) {
//百分百预付不需要考虑借款账户
log.info("1.1百分百预付不需要考虑借款账户");
return;
}
if (SettlementOwnerEnum.InvoiceType.ORDINARY.getCode().equals(settlementDriverDetail.getInvoiceType())) {
log.info("2.当前不是网运单,不需要处理借款标识");
return;
......@@ -182,10 +192,15 @@ public class OrderChildLoanComponent {
return;
}
String childNo = settlementDriverDetail.getChildNo();
List<OwnerLoanAccountRunningWaterRecord> runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByOrderNoAndRunningWaterType
(childNo, OwnerLoanAccountRunningWaterRecordEnum.RunWaterType.APPROVE_FROZEN.getCode());
settlementDriverDetail.setLoanFlag(1);
//已借款
settlementDriverDetail.setLoanFlag(OwnerLoanRecordEnum.LoanFlag.LOAN.getCode());
// 抵扣金额
settlementOwnerDetail.setLoanFreight(settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
settlementOwnerDetail.setLoanFreight(settlementOwnerDetail.getSettlementFreight());
log.info("4.查询当前运单号:{}, 当前货主,{}, 此运单借款冻结记录:{}", childNo, settlementOwnerDetail.getOwnerUserNo(), JSONUtil.parse(runningWaterRecordList));
......@@ -198,7 +213,7 @@ public class OrderChildLoanComponent {
param.setChildNo(childNo);
param.setSettlementDriverDetail(settlementDriverDetail);
param.setSettlementOwnerDetail(settlementOwnerDetail);
//扣钱,获取锁,此处有可能钱不够,抛异常,走网络货运重试
//扣钱,获取锁,此处有可能钱不够,抛异常,
getLoanBalanceLock(param);
runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByOrderNoAndRunningWaterType
......@@ -237,7 +252,7 @@ public class OrderChildLoanComponent {
param.setChildNo(childNo);
param.setSettlementDriverDetail(settlementDriverDetail);
param.setSettlementOwnerDetail(settlementOwnerDetail);
//扣钱,获取锁,此处有可能钱不够,抛异常,走网络货运重试
//扣钱,获取锁,此处有可能钱不够,抛异常,
getLoanBalanceLock(param);
runningWaterRecordList = ownerLoanAccountRunningWaterRecordDao.getListByOrderNoAndRunningWaterType
......@@ -386,4 +401,17 @@ public class OrderChildLoanComponent {
}
}
}
/**
* 结算金额
*/
private BigDecimal settlementFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,结算金额=实际净重*平台运费报价-预付运费-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getPrepayFreight()).subtract(settlementOwnerDetail.getLossFreight());
} else { //订单结算方式为“卸车净重”时,结算金额=实际净重*平台运费报价-预付运费
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).subtract(settlementOwnerDetail.getPrepayFreight());
}
}
}
......@@ -89,4 +89,8 @@ public class RabbitKeyConstants {
public static final String OWNER_LOAN_PAY_ROUTE_KEY ="clx-performance.loan.pay.route.key";
public static final String OWNER_LOAN_PAY_QUEUE ="clx-performance.loan.pay.queue";
public static final String OWNER_LOAN_ROUTE_KEY ="clx-performance.loan.route.key";
public static final String OWNER_LOAN_QUEUE ="clx-performance.loan.queue";
}
......@@ -30,6 +30,7 @@ public class BankTradeDaoImpl extends BaseDaoImpl<BankTradeMapper, BankTrade, In
return Optional.of(merchantRunningWaterNo)
.map(item -> lQrWrapper()
.eq(BankTrade::getMerchantRunningWaterNo, item)
.orderByDesc(BankTrade::getId)
.last("limit 1")
)
.map(super::getOne);
......
package com.clx.performance.dao.impl.loan;
import com.clx.performance.dao.loan.OrderChildLoanRetryRecordDao;
import com.clx.performance.mapper.loan.OrderChildLoanRetryRecordMapper;
import com.clx.performance.model.loan.OrderChildLoanRetryRecord;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author kavin
* Date 2024-02-21
* Time 19:58
*/
@Repository
public class OrderChildLoanRetryRecordDaoImpl extends BaseDaoImpl<OrderChildLoanRetryRecordMapper, OrderChildLoanRetryRecord, Integer> implements OrderChildLoanRetryRecordDao {
@Override
public List<OrderChildLoanRetryRecord> selectListByIdAsc() {
return baseMapper.selectList(lQrWrapper().orderByAsc(OrderChildLoanRetryRecord::getId));
}
}
......@@ -80,4 +80,5 @@ public class SettlementDriverDetailDaoImpl extends BaseDaoImpl<SettlementDriverD
public List<SettlementDriverDetail> findByDriverSettlementIds(List<Integer> ids) {
return baseMapper.findByDriverSettlementIds(ids);
}
}
......@@ -154,4 +154,5 @@ public class SettlementOwnerDetailDaoImpl extends BaseDaoImpl<SettlementOwnerDet
.set(SettlementOwnerDetail :: getSettlementNo,settlementNo)
);
}
}
package com.clx.performance.dao.loan;
import com.clx.performance.mapper.loan.OrderChildLoanRetryRecordMapper;
import com.clx.performance.model.loan.OrderChildLoanRetryRecord;
import com.msl.common.dao.BaseDao;
import java.util.List;
/**
* @author kavin
* Date 2024-02-21
* Time 19:58
*/
public interface OrderChildLoanRetryRecordDao extends BaseDao<OrderChildLoanRetryRecordMapper, OrderChildLoanRetryRecord, Integer> {
List<OrderChildLoanRetryRecord> selectListByIdAsc();
}
......@@ -30,4 +30,5 @@ public interface SettlementDriverDetailDao extends BaseDao<SettlementDriverDetai
List<SettlementDriverDetail> listUnPay(LocalDateTime beginTime);
List<SettlementDriverDetail> findByDriverSettlementIds(List<Integer> ids);
}
......@@ -46,4 +46,5 @@ public interface SettlementOwnerDetailDao extends BaseDao<SettlementOwnerDetailM
List<SettlementOwnerDetail> selectListByOrderNo(String orderNo);
void updateSettlementMerge(String settlementNo, List<String> settlementNos);
}
package com.clx.performance.dto;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import lombok.Data;
@Data
public class OwnerLoanMqDTO {
private SettlementOwnerDetail settlementOwnerDetail;
private SettlementDriverDetail settlementDriverDetail;
private OrderChild orderChild;
}
package com.clx.performance.event;
import cn.hutool.json.JSONUtil;
import com.clx.performance.dao.loan.OrderChildLoanRetryRecordDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.model.loan.OrderChildLoanRetryRecord;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@AllArgsConstructor
public class SettlementListener {
private final SettlementOwnerDetailDao settlementOwnerDetailDao;
private final SettlementDriverDetailDao settlementDriverDetailDao;
private final OrderChildLoanRetryRecordDao orderChildLoanRetryRecordDao;
@EventListener(classes = {SettlementUpdateEvent.class})
public void listen(SettlementUpdateEvent event) {
SettlementOwnerDetail settlementOwnerDetail = event.getSettlementOwnerDetail();
SettlementDriverDetail settlementDriverDetail = event.getSettlementDriverDetail();
log.info("当前货主结算信息{},车主结算信息:{}", JSONUtil.parse(settlementOwnerDetail), JSONUtil.parse(settlementDriverDetail));
settlementOwnerDetailDao.updateInvoiceType(settlementOwnerDetail);
settlementDriverDetailDao.updateInvoiceTypeAndPrepayFreightFlag(settlementDriverDetail);
OrderChildLoanRetryRecord entity = new OrderChildLoanRetryRecord();
entity.setSettlementOwnerId(settlementOwnerDetail.getId());
entity.setSettlementDriverId(settlementDriverDetail.getId());
// 保存重试记录
orderChildLoanRetryRecordDao.saveEntity(entity);
}
}
package com.clx.performance.event;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import org.springframework.context.ApplicationEvent;
public class SettlementUpdateEvent extends ApplicationEvent {
private SettlementDriverDetail settlementDriverDetail;
private SettlementOwnerDetail settlementOwnerDetail;
/**
* Create a new {@code ApplicationEvent}.
*
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public SettlementUpdateEvent(Object source) {
super(source);
}
public SettlementUpdateEvent(Object source, SettlementDriverDetail settlementDriverDetail, SettlementOwnerDetail settlementOwnerDetail) {
super(source);
this.settlementDriverDetail = settlementDriverDetail;
this.settlementOwnerDetail = settlementOwnerDetail;
}
public SettlementDriverDetail getSettlementDriverDetail() {
return settlementDriverDetail;
}
public void setSettlementDriverDetail(SettlementDriverDetail settlementDriverDetail) {
this.settlementDriverDetail = settlementDriverDetail;
}
public SettlementOwnerDetail getSettlementOwnerDetail() {
return settlementOwnerDetail;
}
public void setSettlementOwnerDetail(SettlementOwnerDetail settlementOwnerDetail) {
this.settlementOwnerDetail = settlementOwnerDetail;
}
}
......@@ -12,6 +12,7 @@ import com.clx.performance.dao.OwnerRunningWaterRecordDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.OrderChildSyncDTO;
import com.clx.performance.dto.OwnerLoanMqDTO;
import com.clx.performance.enums.*;
import com.clx.performance.enums.settle.SettlementDriverEnum;
import com.clx.performance.enums.settle.SettlementOwnerDetailEnum;
......@@ -29,7 +30,10 @@ import com.msl.common.dto.HttpDTO;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
......@@ -64,9 +68,7 @@ public class OrderChildSyncTransportListener {
private final OrderChildSyncTransportInvoiceRecordDao orderChildSyncTransportInvoiceRecordDao;
private final SettlementMqService settlementMqService;
private final OrderChildLoanComponent orderChildLoanComponent;
private final RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitKeyConstants.ORDER_CHILD_SYNC_TRANSPORT_QUEUE)
public void onMessage(String message) {
......@@ -164,8 +166,6 @@ public class OrderChildSyncTransportListener {
settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode());
}
// 结算金额
settlementOwnerDetail.setSettlementFreight(settlementFreightCalc(orderChild.getSettlementWay(), settlementOwnerDetail));
if (SettlementOwnerEnum.InvoiceType.ORDINARY.getCode().equals(invoiceType)) {
if (settlementOwnerDetail.getSettlementFreight().compareTo(BigDecimal.ZERO) == 0) {
......@@ -179,16 +179,15 @@ public class OrderChildSyncTransportListener {
settlementOwnerDetail.setInvoiceType(invoiceType);
settlementDriverDetail.setInvoiceType(invoiceType);
//生成借款标识
orderChildLoanComponent.childLoanConfirmAfterProcess(settlementDriverDetail, settlementOwnerDetail);
log.info("当前货主结算信息{},车主结算信息:{}", JSONUtil.parse(settlementOwnerDetail), JSONUtil.parse(settlementDriverDetail));
settlementOwnerDetailDao.updateInvoiceType(settlementOwnerDetail);
settlementDriverDetailDao.updateInvoiceTypeAndPrepayFreightFlag(settlementDriverDetail);
// 发送mq 通过开票标识
settlementMqService.invoiceTypeSync(orderChild.getChildNo(), invoiceType);
}
//货主借款监听器处理
OwnerLoanMqDTO dto = new OwnerLoanMqDTO();
dto.setSettlementOwnerDetail(settlementOwnerDetail);
dto.setSettlementDriverDetail(settlementDriverDetail);
dto.setOrderChild(orderChild);
Message message = MessageBuilder.withBody(JSONUtil.parse(dto).toString().getBytes()).build();
rabbitTemplate.send(
RabbitKeyConstants.OWNER_LOAN_EXCHANGE, RabbitKeyConstants.OWNER_LOAN_ROUTE_KEY, message
); }
private void generateTakeOutRunningWatter(OrderChild orderChild, BigDecimal ans, SettlementOwnerDetail settlementOwnerDetail, SettlementDriverDetail settlementDriverDetail) {
OwnerAccount account = null;
......@@ -252,17 +251,7 @@ public class OrderChildSyncTransportListener {
}
}
/**
* 结算金额
*/
private BigDecimal settlementFreightCalc(Integer settlementWay, SettlementOwnerDetail settlementOwnerDetail) {
if (Objects.equals(settlementWay, SettlementWayEnum.WayType.LOAD.getCode())) { //订单结算方式为“装车净重”时,结算金额=实际净重*平台运费报价-预付运费-货损金额。
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice())
.subtract(settlementOwnerDetail.getPrepayFreight()).subtract(settlementOwnerDetail.getLossFreight());
} else { //订单结算方式为“卸车净重”时,结算金额=实际净重*平台运费报价-预付运费
return settlementOwnerDetail.getWeight().multiply(settlementOwnerDetail.getFreightPrice()).subtract(settlementOwnerDetail.getPrepayFreight());
}
}
/**
* 开票金额
......
package com.clx.performance.listener;
import cn.hutool.json.JSONUtil;
import com.clx.performance.component.OrderChildLoanComponent;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.OwnerLoanMqDTO;
import com.clx.performance.enums.loan.OwnerLoanRecordEnum;
import com.clx.performance.event.SettlementUpdateEvent;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.service.settle.SettlementMqService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
/**
* 处理货主借款监听器
*/
@Slf4j
@Component
@AllArgsConstructor
public class OwnerLoanListener {
private final OrderChildLoanComponent orderChildLoanComponent;
private final SettlementMqService settlementMqService;
private final ApplicationEventPublisher applicationEventPublisher;
private final SettlementOwnerDetailDao settlementOwnerDetailDao;
private final SettlementDriverDetailDao settlementDriverDetailDao;
@RabbitListener(queues = RabbitKeyConstants.OWNER_LOAN_QUEUE)
public void onMessage(String message) {
log.info("处理货主借款监听器执行,数据为{}", message);
OwnerLoanMqDTO param = JSONUtil.toBean(message, OwnerLoanMqDTO.class);
SettlementOwnerDetail settlementOwnerDetail = param.getSettlementOwnerDetail();
SettlementDriverDetail settlementDriverDetail = param.getSettlementDriverDetail();
OrderChild orderChild = param.getOrderChild();
try {
//生成借款标识
orderChildLoanComponent.childLoanConfirmAfterProcess(settlementDriverDetail, settlementOwnerDetail, orderChild);
} catch (Exception e) {
log.error("处理货主借款监听器执行异常,数据为{}", message, e);
//未借款
settlementDriverDetail.setLoanFlag(OwnerLoanRecordEnum.LoanFlag.NO_LOAN.getCode());
applicationEventPublisher.publishEvent(new SettlementUpdateEvent(this, settlementDriverDetail, settlementOwnerDetail));
throw e;
}
settlementOwnerDetailDao.updateInvoiceType(settlementOwnerDetail);
settlementDriverDetailDao.updateInvoiceTypeAndPrepayFreightFlag(settlementDriverDetail);
// 发送mq 通过开票标识
settlementMqService.invoiceTypeSync(settlementDriverDetail.getChildNo(), settlementDriverDetail.getInvoiceType());
}
}
package com.clx.performance.listener;
import cn.hutool.json.JSONUtil;
import com.clx.performance.OwnerLoanPayNotifyMqParam;
import com.clx.performance.param.OwnerLoanPayNotifyMqParam;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.enums.nbbank.NbBankStatusEnum;
import com.clx.performance.service.loan.OwnerLoanRecordService;
......@@ -29,11 +29,11 @@ public class OwnerLoanPayNotifyListener {
if (Objects.equals(param.getPayStatus(), NbBankStatusEnum.Status.SUCCESS.getCode())) {
// 支付成功
ownerLoanRecordService.paySuccess(param.getLoanNo());
ownerLoanRecordService.paySuccess(param.getMerSeqNo());
}
else if (Objects.equals(param.getPayStatus(), NbBankStatusEnum.Status.FAIL.getCode())) {
// 支付失败
ownerLoanRecordService.payFail(param.getLoanNo());
ownerLoanRecordService.payFail(param.getMerSeqNo());
}
}
}
package com.clx.performance.mapper.loan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.loan.OrderChildLoanRetryRecord;
/**
* @author kavin
* Date 2024-02-21
* Time 19:58
*/
public interface OrderChildLoanRetryRecordMapper extends BaseMapper<OrderChildLoanRetryRecord> {
}
......@@ -36,6 +36,7 @@ public class BankTrade implements HasKey<Integer> {
private String remark; //备注
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
private String relationNo;
@KeyColumn("id")
@Override
......
package com.clx.performance.model.loan;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
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 io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author kavin
* Date 2024-02-21
* Time 19:58
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("order_child_loan_retry_record")
public class OrderChildLoanRetryRecord implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("settlement_driver_id")
@ApiModelProperty("车主计费主键")
private Integer settlementDriverId;
@TableField("settlement_owner_id")
@ApiModelProperty("货主计费主键")
private Integer settlementOwnerId;
@TableField("create_time")
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@TableField("modified_time")
@ApiModelProperty("修改时间")
private LocalDateTime modifiedTime;
@Override
@KeyColumn("id")
public Integer gainKey() {
return this.id;
}
}
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.OrderChildLoanRetryRecordDao;
import com.clx.performance.dao.loan.OwnerLoanAccountDao;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.dao.settle.SettlementOwnerDetailDao;
import com.clx.performance.dto.OwnerLoanMqDTO;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.breakcontract.BreakContractSettlementDriver;
import com.clx.performance.model.loan.OrderChildLoanRetryRecord;
import com.clx.performance.model.loan.OwnerLoanAccount;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.model.settle.SettlementOwnerDetail;
import com.clx.performance.param.pc.loan.carrier.PageOwnerLoanAccountParam;
import com.clx.performance.service.loan.OwnerLoanAccountService;
import com.clx.performance.struct.loan.OwnerLoanAccountStruct;
......@@ -14,10 +27,14 @@ import com.msl.user.data.UserSessionData;
import com.msl.user.utils.TokenUtil;
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.util.List;
/**
* @author kavin
......@@ -27,12 +44,22 @@ import java.math.BigDecimal;
@Service
@Slf4j
@AllArgsConstructor
public class OwnerLoanAccountServiceImpl implements OwnerLoanAccountService {
public class OwnerLoanAccountServiceImpl implements OwnerLoanAccountService {
private final OwnerLoanAccountDao ownerLoanAccountDao;
private final OwnerLoanAccountStruct ownerLoanAccountStruct;
private final OrderChildDao orderChildDao;
private final SettlementDriverDetailDao settlementDriverDetailDao;
private final SettlementOwnerDetailDao settlementOwnerDetailDao;
private final OrderChildLoanRetryRecordDao orderChildLoanRetryRecordDao;
private final RabbitTemplate rabbitTemplate;
@Transactional(rollbackFor = Exception.class)
@Override
public void openOwnerLoanAccount(Long ownerUserNo, String ownerUserName, String mobile) {
......@@ -63,12 +90,40 @@ public class OwnerLoanAccountServiceImpl implements OwnerLoanAccountService {
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
Optional<OwnerLoanAccount> optional = ownerLoanAccountDao.getOneByField(OwnerLoanAccount::getOwnerUserNo,
loginUserInfo.getUserNo());
if(!optional.isPresent()){
if (!optional.isPresent()) {
return OwnerAccountVO.builder().openAccount(0).build();
}
OwnerLoanAccount ownerLoanAccount = optional.get();
OwnerLoanAccount ownerLoanAccount = optional.get();
OwnerAccountVO ownerAccountVO = ownerLoanAccountStruct.convertVO(ownerLoanAccount);
ownerAccountVO.setOpenAccount(1);
return ownerAccountVO;
}
/**
* 货主借款后执行阻塞流程的相关运单
*
* @param ownerUserNo
*/
@Override
public void orderChildLoanProcess(Long ownerUserNo) {
List<OrderChildLoanRetryRecord> orderChildLoanRetryRecordList = orderChildLoanRetryRecordDao.selectListByIdAsc();
for (OrderChildLoanRetryRecord retryRecord : orderChildLoanRetryRecordList) {
//生成借款标识
SettlementDriverDetail settlementDriverDetail = settlementDriverDetailDao.getEntityByKey(retryRecord.getSettlementDriverId()).get();
SettlementOwnerDetail settlementOwnerDetail = settlementOwnerDetailDao.getEntityByKey(retryRecord.getSettlementOwnerId()).get();
OrderChild orderChild = orderChildDao.getByChildNo(settlementDriverDetail.getChildNo()).get();
OwnerLoanMqDTO dto = new OwnerLoanMqDTO();
dto.setSettlementOwnerDetail(settlementOwnerDetail);
dto.setSettlementDriverDetail(settlementDriverDetail);
dto.setOrderChild(orderChild);
//货主借款监听器处理
Message message = MessageBuilder.withBody(JSONUtil.parse(dto).toString().getBytes()).build();
rabbitTemplate.send(
RabbitKeyConstants.OWNER_LOAN_EXCHANGE, RabbitKeyConstants.OWNER_LOAN_ROUTE_KEY, message
);
orderChildLoanRetryRecordDao.deleteByKey(retryRecord.getId());
}
}
}
......@@ -180,6 +180,7 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
// 更新借款支付信息
ownerLoanRecordDao.updatePay(ownerLoanRecord);
bankTrade.setRelationNo(ownerLoanRecord.getLoanNo().toString());
bankTrade.setOrderType(BankTradeEnum.OrderType.OWNER_LOAN_RECORD.getCode());
bankTrade.setAmount(ownerLoanRecord.getLoanBalance());
bankTrade.setMerchantRunningWaterNo(ownerLoanRecord.getMerchantRunningWaterNo());
......@@ -496,11 +497,12 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
@Override
@Transactional(rollbackFor = Exception.class)
public void payFail(String loanNo) {
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, loanNo)
public void payFail(String merSeqNo) {
BankTrade bankTrade = bankTradeDao.selectByMerchantRunningWaterNo(merSeqNo).get();
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, bankTrade.getRelationNo())
.orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (Objects.equals(ownerLoanRecord.getStatus(), OwnerLoanRecordEnum.Status.PAYING.getCode())) {
log.info("借款单非支付中状态, loanNo:{}", loanNo);
log.info("借款单非支付中状态, loanNo:{}", bankTrade.getRelationNo());
return;
}
......@@ -512,12 +514,14 @@ public class OwnerLoanRecordServiceImpl implements OwnerLoanRecordService {
@Override
@Transactional(rollbackFor = Exception.class)
public void paySuccess(String loanNo) {
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, loanNo)
public void paySuccess(String merSeqNo) {
BankTrade bankTrade = bankTradeDao.selectByMerchantRunningWaterNo(merSeqNo).get();
OwnerLoanRecord ownerLoanRecord = ownerLoanRecordDao.getOneByField(OwnerLoanRecord::getLoanNo, bankTrade.getRelationNo())
.orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
if (Objects.equals(ownerLoanRecord.getStatus(), OwnerLoanRecordEnum.Status.PAYING.getCode())) {
log.info("借款单非支付中状态, loanNo:{}", loanNo);
log.info("借款单非支付中状态, loanNo:{}", bankTrade.getRelationNo());
return;
}
......
......@@ -3,6 +3,7 @@ package com.clx.performance.service.impl.settle;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.settle.SettlementDriverDetailDao;
import com.clx.performance.enums.loan.OwnerLoanRecordEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.settle.SettlementDriverDetail;
import com.clx.performance.param.pc.driver.PageCarrierSettlementDriverDetailParam;
......@@ -58,7 +59,6 @@ public class SettlementDriverDetailServiceImpl implements SettlementDriverDetai
// 预付运费
settlementDriverDetail.setPrepayFreight(BigDecimal.ZERO);
// 结算金额
settlementDriverDetail.setSettlementFreight(settlementFreightCalc(settlementDriverDetail.getFreight(), settlementDriverDetail.getLossFreight()));
......
......@@ -2,7 +2,7 @@ package com.clx.performance.service.impl.thirdparty.nbbank;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.clx.performance.OwnerLoanPayNotifyMqParam;
import com.clx.performance.param.OwnerLoanPayNotifyMqParam;
import com.clx.performance.component.IdGenerateSnowFlake;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.dao.loan.BankTradeDao;
......@@ -10,11 +10,9 @@ import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.loan.BankTradeEnum;
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.NbBankThirdpartyService;
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.NbBankOrderResultVO;
import com.msl.common.exception.ServiceSystemException;
......@@ -87,7 +85,7 @@ public class NbBankServiceImpl implements NbBankService {
@Override
public NbBankOrderPayResultVO orderDirectPay(Long loanNo, Integer amount,
String payAcctOpenBankId, String payAcctNo, String payAcctNm) {
String merSeqNo = String.valueOf(loanNo);
String merSeqNo = idGenerateSnowFlake.nextIdToString(1L);
String merDtTm = LocalDateTimeUtils.formatTime();
String closeDtTm = LocalDateTimeUtils.formatTime(LocalDateTimeUtils.parseTime(merDtTm).plusDays(30));
......@@ -240,7 +238,7 @@ public class NbBankServiceImpl implements NbBankService {
// 货主借款支付回调
if (Objects.equals(bankTrade.getOrderType(), BankTradeEnum.OrderType.OWNER_LOAN_RECORD.getCode())){
OwnerLoanPayNotifyMqParam param = new OwnerLoanPayNotifyMqParam();
param.setLoanNo(merSeqNo);
param.setMerSeqNo(merSeqNo);
param.setPayStatus(transStatus);
Message message = MessageBuilder.withBody(JSONUtil.parse(param).toString().getBytes()).build();
......
......@@ -17,4 +17,6 @@ public interface OwnerLoanAccountService {
IPage<CarrierOwnerLoanAccountVO> pageOwnerLoanAccount(PageOwnerLoanAccountParam param);
OwnerAccountVO getOwnerLoanAccount();
void orderChildLoanProcess(Long ownerUserNo);
}
......@@ -42,9 +42,9 @@ public interface OwnerLoanRecordService {
void updateOwnerLoanRecordRepay(CarrierOwnerLoanRecordRepayParam param);
void updateOwnerLoanRecordPayCancel(CarrierOwnerLoanRecordPayCancelParam param);
void payFail(String loanNo);
void payFail(String merSeqNo);
void paySuccess(String loanNo);
void paySuccess(String merSeqNo);
void ownerLoanRecordRetryPay(String loanNo);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论