提交 b58df0d0 authored 作者: 刘海泉's avatar 刘海泉

增加挂单运费相关代码

上级 d726f37a
......@@ -352,4 +352,59 @@ public class RabbitBeanConfig {
/**
* 监听货单同步到挂单运费表
*/
@Bean
public Queue syncPendingFreight4OrderGoodsQueue() {
return new Queue(RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_QUEUE,
true, false, false);
}
/**
* 监听货单同步到挂单运费表
**/
@Bean
public DirectExchange syncPendingFreight4OrderGoodsExchange() {
return new DirectExchange(RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_EXCHANGE);
}
/**
* 监听货单同步到挂单运费表
*/
@Bean
public Binding syncPendingFreight4OrderGoodsBind() {
return BindingBuilder.bind(syncPendingFreight4OrderGoodsQueue()).to(syncPendingFreight4OrderGoodsExchange())
.with(RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_ROUTING_KEY);
}
/**
* 监听运单同步到挂单运费表
*/
@Bean
public Queue syncPendingFreight4OrderChildQueue() {
return new Queue(RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_QUEUE,
true, false, false);
}
/**
* 监听运单同步到挂单运费表
**/
@Bean
public DirectExchange syncPendingFreight4OrderChildExchange() {
return new DirectExchange(RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_EXCHANGE);
}
/**
* 监听运单同步到挂单运费表
*/
@Bean
public Binding syncPendingFreight4OrderChildBind() {
return BindingBuilder.bind(syncPendingFreight4OrderChildQueue()).to(syncPendingFreight4OrderChildExchange())
.with(RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_ROUTING_KEY);
}
}
......@@ -175,4 +175,29 @@ public class RabbitKeyConstants {
//货单同步挂单运费表queue
public static final String SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_QUEUE = "clx_performance.sync.pending.freight.for.order.goods.queue";
//货单同步挂单运费表exchange
public static final String SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_EXCHANGE = "clx_performance.sync.pending.freight.for.order.goods.exchange";
//货单同步挂单运费表routing_key
public static final String SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_ROUTING_KEY = "clx_performance.sync.pending.freight.for.order.goods.routing.key";
//货单同步挂单运费表queue
public static final String SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_QUEUE = "clx_performance.sync.pending.freight.for.order.child.queue";
//货单同步挂单运费表exchange
public static final String SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_EXCHANGE = "clx_performance.sync.pending.freight.for.order.child.exchange";
//货单同步挂单运费表routing_key
public static final String SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_ROUTING_KEY = "clx_performance.sync.pending.freight.for.order.child.routing.key";
}
......@@ -217,4 +217,6 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int
int countTakeByOrderGoodsNo(String orderGoodsNo);
int countLoadByOrderGoodsNo(String orderGoodsNo);
List<OrderChild> listNoCancelOrderChild(String orderNo);
}
......@@ -13,4 +13,6 @@ import java.math.BigDecimal;
*/
public interface PendingFreightDao extends BaseDao<PendingFreightMapper, PendingFreight, Integer> {
long updateInternalReportData(String orderNo, String name, BigDecimal logisticsFreight);
void updateOrderedAndLoadTruckRate(String orderNo, BigDecimal orderedRate, BigDecimal loadTruckRate);
}
......@@ -721,4 +721,13 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
public int countLoadByOrderGoodsNo(String orderGoodsNo) {
return baseMapper.countLoadByOrderGoodsNo(orderGoodsNo);
}
@Override
public List<OrderChild> listNoCancelOrderChild(String orderNo) {
return list(lQrWrapper()
.eq(OrderChild :: getOrderNo, orderNo)
.lt(OrderChild :: getStatus,OrderChildEnum.Status.DRIVER_CANCEL.getCode())
);
}
}
......@@ -26,4 +26,13 @@ public class PendingFreightDaoImpl extends BaseDaoImpl<PendingFreightMapper, Pen
update.eq(PendingFreight :: getOrderNo,orderNo);
return baseMapper.update(update);
}
@Override
public void updateOrderedAndLoadTruckRate(String orderNo, BigDecimal orderedRate, BigDecimal loadTruckRate) {
LambdaUpdateWrapper<PendingFreight> update = new LambdaUpdateWrapper<>();
update.set(PendingFreight :: getOrderedRate,orderedRate);
update.set(PendingFreight :: getLoadTruckRate,loadTruckRate);
update.eq(PendingFreight :: getOrderNo,orderNo);
baseMapper.update(update);
}
}
package com.clx.performance.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* @ClassName OrderedAndLoadTruckRateDTO
* @Description
* @Author kavin
* @Date 2024/10/18 16:25
* @Version 1.0
*/
@Getter
@Setter
public class OrderedAndLoadTruckRateDTO {
@Schema(description="订单号")
private String orderNo;
@Schema(description="挂单吨数")
private BigDecimal pendingWeight;
@Schema(description="装车吨数")
private BigDecimal loadNet;
@Schema(description="已拉运吨数")
private BigDecimal alreadyTransportWeight;
@Schema(description="接单率")
BigDecimal orderedRate;
@Schema(description="装车率")
BigDecimal loadTruckRate;
}
......@@ -94,6 +94,7 @@ public class OrderChildDtsListener {
}else if(Objects.equals(DtsOperationTypeEnum.UPDATE.getCode(),dataTransportDTO.getOperationType().getCode())){
log.info("修改:{}",after);
syncPerformanceProgress(before,after,DtsOperationTypeEnum.UPDATE.getCode());
syncPendingFreight(before,after);
if(OrderChildEnum.SYNC_STATUS_lIST.contains(after.getStatus()) &&
(!Objects.equals(before.getStatus(),after.getStatus()) ||
!Objects.equals(before.getLoadNet(),after.getLoadNet())) ||
......@@ -291,6 +292,24 @@ public class OrderChildDtsListener {
}
}
//同步挂单运费表-----运单部分
public void syncPendingFreight(OrderChild before,OrderChild after){
//状态发生变化,并且是取消
if((!Objects.equals(before.getStatus(),after.getStatus())
&& after.getStatus() > OrderChildEnum.Status.COMPLETE.getCode())
// 装车吨数发生变化
|| Objects.equals(after.getLoadNet(),before.getLoadNet())
){
log.info("开始发送同步挂单运费表消息,订单号:{},运单号:{}", after.getOrderNo(),after.getChildNo());
Message body = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(after)).getBytes()).build();
rabbitTemplate.send(SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_EXCHANGE,
SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_ROUTING_KEY, body);
log.info("结束发送同步挂单运费表消息,订单号:{},运单号:{}", after.getOrderNo(),after.getChildNo());
}
}
/**
* 后续逻辑处理
* @param before
......
......@@ -89,7 +89,7 @@ public class OrderGoodsDtsListener {
}
}
//同步挂单运费
public void syncPendingFreight(OrderGoods before,OrderGoods after, Integer updateType) {
boolean isSend = false;
if(Objects.equals(updateType,DtsOperationTypeEnum.INSERT.getCode())){
......@@ -99,29 +99,15 @@ public class OrderGoodsDtsListener {
|| !Objects.equals(before.getAlreadyTransportWeight(),after.getAlreadyTransportWeight())
|| !Objects.equals(before.getExtractWeight(),after.getExtractWeight())){
}
}
if(after.getOrderGoodsStatus() >= OrderGoodsStatusEnum.Status.PAYING.getCode()){
if(Objects.equals(updateType,DtsOperationTypeEnum.INSERT.getCode())){
isSend = true;
}
if(Objects.equals(updateType,DtsOperationTypeEnum.UPDATE.getCode())
&& (!Objects.equals(before.getOrderGoodsStatus(),after.getOrderGoodsStatus())
|| !Objects.equals(before.getSeniorLogisticsManagerId(),after.getSeniorLogisticsManagerId())
|| !Objects.equals(before.getExtractWeight(),after.getExtractWeight())
|| !Objects.equals(before.getPendingOrderFreight(),after.getPendingOrderFreight())
)){
isSend = true;
}
if(isSend){
log.info("开始发送同步履约进度表消息,订单号:{},货单号:{}", after.getOrderNo(),after.getOrderGoodsNo());
Message body = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(after)).getBytes()).build();
rabbitTemplate.send(SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_GOODS_EXCHANGE,
SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_GOODS_ROUTING_KEY, body);
log.info("结束发送同步履约进度表消息,订单号:{},货单号:{}", after.getOrderNo(),after.getOrderGoodsNo());
}
}
if(isSend){
log.info("开始发送同步挂单运费表消息,订单号:{},货单号:{}", after.getOrderNo(),after.getOrderGoodsNo());
Message body = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(after)).getBytes()).build();
rabbitTemplate.send(SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_EXCHANGE,
SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_ROUTING_KEY, body);
log.info("结束发送同步挂单运费表消息,订单号:{},货单号:{}", after.getOrderNo(),after.getOrderGoodsNo());
}
}
......
package com.clx.performance.listener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.model.OrderChild;
import com.clx.performance.service.PendingFreightService;
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.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 处理货单取消吨数回填
*/
@Slf4j
@Component
@AllArgsConstructor
public class SyncPendingFreight4OrderChildListener {
private final PendingFreightService pendingFreightService;
@RabbitListener(queues = RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_QUEUE)
public void onMessage(Message message) {
try{
log.info("监听到同步挂单运费表---运单信息部分,消息内容{}", new String(message.getBody()));
OrderChild data = JSON.parseObject(new String(message.getBody()),
new TypeReference<MqWrapper<OrderChild>>() {
}).getData();
pendingFreightService.dealPendingFreight4OrderChild(data.getOrderNo());
}catch (Exception e){
log.info("监听到同步挂单运费表---运单信息部分发生异常,异常原因:{}", ExceptionUtils.getStackTrace(e));
}
}
}
package com.clx.performance.listener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.service.PendingFreightService;
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.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 处理货单取消吨数回填
*/
@Slf4j
@Component
@AllArgsConstructor
public class SyncPendingFreight4OrderGoodsListener {
private final PendingFreightService pendingFreightService;
@RabbitListener(queues = RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_GOODS_QUEUE)
public void onMessage(Message message) {
try{
log.info("监听到同步挂单运费表---货单信息部分,消息内容{}", new String(message.getBody()));
OrderGoods data = JSON.parseObject(new String(message.getBody()),
new TypeReference<MqWrapper<OrderGoods>>() {
}).getData();
pendingFreightService.dealPendingFreight4OrderGoods(data.getOrderNo());
}catch (Exception e){
log.info("监听到同步挂单运费表---货单信息部分发生异常,异常原因:{}", ExceptionUtils.getStackTrace(e));
}
}
}
......@@ -2,7 +2,6 @@ package com.clx.performance.service;
import com.clx.open.sdk.callback.message.OrderInfoMessage;
import com.clx.order.param.mq.SyncPendingFreightInternalReportParam;
import org.springframework.transaction.annotation.Transactional;
/**
* @author kavin
......@@ -12,7 +11,10 @@ import org.springframework.transaction.annotation.Transactional;
public interface PendingFreightService {
void dealPendingFreight4OrderInfo(OrderInfoMessage data);
//处理挂单运费内部上报数据
@Transactional(rollbackFor = Exception.class)
void dealPendingFreight4InternalReport(SyncPendingFreightInternalReportParam param);
void dealPendingFreight4OrderGoods(String orderNo);
void dealPendingFreight4OrderChild(String orderNo);
}
......@@ -3,22 +3,30 @@ package com.clx.performance.service.impl;
import com.clx.open.sdk.callback.message.OrderInfoMessage;
import com.clx.order.param.mq.SyncPendingFreightInternalReportParam;
import com.clx.order.vo.feign.FeignAddressVO;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.PendingFreightDao;
import com.clx.performance.dto.OrderedAndLoadTruckRateDTO;
import com.clx.performance.dto.gd.GdRouteDTO;
import com.clx.performance.enums.ResultEnum;
import com.clx.performance.extranal.user.AddressService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.PendingFreight;
import com.clx.performance.service.PendingFreightService;
import com.clx.performance.service.PerformanceProgressService;
import com.clx.performance.utils.gd.GdService;
import com.msl.common.base.Optional;
import com.msl.common.exception.ServiceSystemException;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
......@@ -36,6 +44,9 @@ public class PendingFreightServiceImpl implements PendingFreightService {
private final PendingFreightDao pendingFreightDao;
private final AddressService addressService;
private final GdService gdService;
private final PerformanceProgressService performanceProgressService;
private final OrderGoodsDao orderGoodsDao;
private final OrderChildDao orderChildDao;
//处理挂单运费订单部分
......@@ -102,9 +113,60 @@ public class PendingFreightServiceImpl implements PendingFreightService {
}
//处理挂单运费货单数据
@Transactional(rollbackFor = Exception.class)
@Override
public void dealPendingFreight4OrderGoods(String orderNo) {
OrderedAndLoadTruckRateDTO dto = calcOrderedAndLoadTruckRate(orderNo);
pendingFreightDao.updateOrderedAndLoadTruckRate(orderNo,dto.getOrderedRate(),dto.getLoadTruckRate());
}
//处理挂单运费运单数据
@Override
public void dealPendingFreight4OrderChild(String orderNo) {
OrderedAndLoadTruckRateDTO dto = calcOrderedAndLoadTruckRate(orderNo);
pendingFreightDao.updateOrderedAndLoadTruckRate(orderNo,dto.getOrderedRate(),dto.getLoadTruckRate());
}
//计算接单率和装车率
public OrderedAndLoadTruckRateDTO calcOrderedAndLoadTruckRate(String orderNo){
List<OrderGoods> orderGoods = orderGoodsDao.listByField(OrderGoods::getOrderNo, orderNo);
BigDecimal pendingWeight = BigDecimal.ZERO; //挂单量
BigDecimal alreadyTransportWeight = BigDecimal.ZERO; //已拉运吨数
BigDecimal orderedRate; //接单率
BigDecimal loadTruckRate; //装车率
BigDecimal loadNet = BigDecimal.ZERO; //总的装车吨数
for (OrderGoods item : orderGoods) {
alreadyTransportWeight = alreadyTransportWeight.add(item.getAlreadyTransportWeight());
pendingWeight = pendingWeight.add(performanceProgressService.calcPendingWeight(item));
}
//计算接单率
orderedRate = alreadyTransportWeight.divide(pendingWeight,3, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
//计算装车率
List<OrderChild> childList = orderChildDao.listNoCancelOrderChild(orderNo);
if(CollectionUtils.isNotEmpty(childList)){
for (OrderChild child : childList) {
if(Objects.nonNull(child.getLoadNet())){
loadNet = loadNet.add(child.getLoadNet());
}
}
}
loadTruckRate = loadNet.divide(pendingWeight,3, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
OrderedAndLoadTruckRateDTO dto = new OrderedAndLoadTruckRateDTO();
dto.setOrderNo(orderNo);
dto.setPendingWeight(pendingWeight);
dto.setAlreadyTransportWeight(alreadyTransportWeight);
dto.setLoadNet(loadNet);
dto.setLoadTruckRate(loadTruckRate);
dto.setOrderedRate(orderedRate);
return dto;
}
public Optional<FeignAddressVO> getAddressDetail(OrderInfoMessage data){
Optional<FeignAddressVO> sendAndReceiveAddress = addressService.getSendAndReceiveAddress(
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论