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

Merge remote-tracking branch 'origin/v20.8_add_sub_weight_20240805' into dev

package com.clx.performance.vo.feign;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.math.BigDecimal;
/**
* @ClassName OrderExtractWeightVO
* @Description
* @Author kavin
* @Date 2024/8/5 11:54
* @Version 1.0
*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class OrderExtractWeightVO {
@ApiModelProperty("用车需求: 1平台车辆 2部分平台车辆 3自有车辆")
private Integer truckDemand;
@ApiModelProperty("平台承运吨数")
private BigDecimal platformCarryWeight;
@ApiModelProperty("自有承运吨数")
private BigDecimal ownCarryWeight;
@ApiModelProperty("平台可提取吨数")
private BigDecimal platCanExtractWeight;
@ApiModelProperty("自有可提取吨数")
private BigDecimal ownCanExtractWeight;
}
......@@ -16,4 +16,9 @@ public class RedissonConstants {
public static final String OWNER_LOAN_EVENT_USERID_LOCK = "clx-performance:ownerLoanEvent:ownerUserId:";
public static final String CALC_ORDER_LAST_TRUCK_LOCK = "clx-performance:order:last:truck:orderNo:";
}
package com.clx.performance.controller.pc;
import com.clx.performance.service.LastTruckService;
import com.clx.performance.vo.app.OrderChildVO;
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.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
/**
* @ClassName OrderWeightController
* @Description
* @Author kavin
* @Date 2024/8/5 11:45
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping(value="/pc/lastTruck")
@Validated
@Api(tags = "最后一车")
@AllArgsConstructor
public class LastTruckController {
private final LastTruckService lastTruckService;
@ApiOperation(value = "查询订单下的最后一车",notes = "<br>By:刘海泉")
@GetMapping("/getOrderLastTruck")
public Result<OrderChildVO> getOrderLastTruck(@RequestParam("orderNo")
@NotBlank(message = "订单编号不能为空") String orderNo) throws Exception{
return Result.ok(lastTruckService.getOrderLastTruck(orderNo));
}
}
package com.clx.performance.controller.pc;
import com.clx.performance.service.OrderGoodsWeightService;
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.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
/**
* @ClassName OrderWeightController
* @Description
* @Author kavin
* @Date 2024/8/5 11:45
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping(value="/pc/orderGoods/weight")
@Validated
@Api(tags = "货单量查询")
@AllArgsConstructor
public class OrderGoodsWeightController {
private final OrderGoodsWeightService orderGoodsWeightService;
@ApiOperation(value = "查询货单可提取量",notes = "<br>By:刘海泉")
@GetMapping("/getOrderGoodsCanExtractWeight")
public Result<BigDecimal> getOrderGoodsCanExtractWeight(@RequestParam("orderGoodsNo")
@NotBlank(message = "货单编号不能为空") String orderGoodsNo) {
return Result.ok(orderGoodsWeightService.getOrderGoodsCanExtractWeight(orderGoodsNo));
}
}
package com.clx.performance.controller.pc;
import com.clx.performance.service.OrderWeightService;
import com.clx.performance.vo.feign.OrderExtractWeightVO;
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.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
/**
* @ClassName OrderWeightController
* @Description
* @Author kavin
* @Date 2024/8/5 11:45
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping(value="/pc/order/weight")
@Validated
@Api(tags = "订单量查询")
@AllArgsConstructor
public class OrderWeightController {
private final OrderWeightService orderWeightService;
@ApiOperation(value = "查询订单可提取量",notes = "<br>By:刘海泉")
@GetMapping("/getOrderCanExtractWeight")
public Result<OrderExtractWeightVO> getOrderCanExtractWeight(@RequestParam("orderNo")
@NotBlank(message = "订单编号不能为空") String orderNo) {
return Result.ok(orderWeightService.getOrderCanExtractWeight(orderNo));
}
@ApiOperation(value = "查询订单剩余量",notes = "<br>By:刘海泉")
@GetMapping("/getOrderResidueWeight")
public Result<BigDecimal> getOrderResidueWeight(@RequestParam("orderNo")
@NotBlank(message = "订单编号不能为空") String orderNo) {
return Result.ok(orderWeightService.getOrderResidueWeight(orderNo));
}
}
package com.clx.performance.service;
import com.clx.performance.model.OrderChild;
import com.clx.performance.vo.app.OrderChildVO;
import com.msl.common.result.Result;
public interface LastTruckService {
......@@ -14,4 +15,8 @@ public interface LastTruckService {
Result<?> syncLastTruckChild4OrderTrigger(String orderNo);
OrderChildVO getOrderLastTruck(String orderNo) throws Exception;
}
package com.clx.performance.service;
import java.math.BigDecimal;
public interface OrderGoodsWeightService {
BigDecimal getOrderGoodsCanExtractWeight(String orderGoodsNo);
}
package com.clx.performance.service;
import com.clx.performance.vo.feign.OrderExtractWeightVO;
import java.math.BigDecimal;
public interface OrderWeightService {
OrderExtractWeightVO getOrderCanExtractWeight(String orderNo);
BigDecimal getOrderResidueWeight(String orderNo);
}
......@@ -4,20 +4,29 @@ import com.alibaba.fastjson.JSON;
import com.clx.open.sdk.callback.OpenCallBackClient;
import com.clx.open.sdk.callback.message.OrderChildMessage;
import com.clx.open.sdk.enums.ResultStatusEnum;
import com.clx.order.enums.OrderEnum;
import com.clx.order.enums.ResultEnum;
import com.clx.order.feign.OrderFeign;
import com.clx.order.param.feign.UpdateOrderLastTruckParam;
import com.clx.order.vo.feign.FeignOrderVO;
import com.clx.performance.config.ThirdAppConfig;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.model.OrderChild;
import com.clx.performance.service.LastTruckService;
import com.clx.performance.struct.OrderChildStruct;
import com.clx.performance.vo.app.OrderChildVO;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.result.Result;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @ClassName LastTruckServiceImpl
......@@ -35,6 +44,7 @@ public class LastTruckServiceImpl implements LastTruckService {
private final OrderChildDao orderChildDao;
private final OrderChildStruct orderChildStruct;
private final ThirdAppConfig thirdAppConfig;
private final RedissonClient redissonClient;
/**
* @Author kavin
* @Description 判断最后一车的逻辑
......@@ -105,5 +115,55 @@ public class LastTruckServiceImpl implements LastTruckService {
return syncLastTruckChild(child);
}
return Result.ok("订单完成/完结状态下未查询最后一车,订单编号:" + orderNo);
}
//调用此方法前查订单是否存在最后一车,存在则不进行该方法调用
@Override
public OrderChildVO getOrderLastTruck(String orderNo) throws Exception {
//为每个货主的订单进行加锁,计算最后一车进行排队,防止多个运单dts监听并发导致最后一车重复计算
RLock lock = redissonClient.getLock(RedissonConstants.CALC_ORDER_LAST_TRUCK_LOCK + orderNo);
try{
FeignOrderVO orderInfo = orderFeign.getOrderInfoFeign(orderNo);
if(Objects.isNull(orderInfo)){
log.error("计算订单最后一车,通过订单号:{},未查询到对应的订单",orderNo);
return null;
}
//已经计算出最后一车,则直接返回运单信息
if(Objects.equals(orderInfo.getLastTruckFlag(), OrderEnum.LastTruckFlag.YES.getCode())){
OrderChild child = orderChildDao.getByChildNo(orderInfo.getLastTruckChildNo()).orElseThrow(
ResultEnum.DATA_NOT_FIND);
return orderChildStruct.convert(child);
}
boolean flag = lock.tryLock(15, 30, TimeUnit.SECONDS);
if (!flag) {
throw new ServiceSystemException(ResultEnum.TRY_LOCK_ERROR,"计算最后一车请求排队超时");
}
BigDecimal weight = orderChildDao.listAfterArrayReceiveChild(orderNo);
log.info("计算订单最后一车,订单号:{} ,计算是否到达可计算最后一车标准,运单累计拉运吨数:{}, 订单拉运吨数:{}",
orderNo,weight,orderInfo.getTransportWeight());
if(Objects.nonNull(weight) && weight.subtract(orderInfo.getTransportWeight()).compareTo(BigDecimal.ZERO) >= 0){
//查询最后一车的运单
OrderChild child = orderChildDao.getLastTruckChild(orderNo);
log.info("当前订单计算出最后一车,运单编号:{} ", child.getChildNo());
//更新订单最后一车
UpdateOrderLastTruckParam param = new UpdateOrderLastTruckParam();
param.setOrderNo(orderNo);
param.setChildNo(child.getChildNo());
orderFeign.updateOrderLastTruck(param);
return orderChildStruct.convert(child);
}
return null;
}finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
}
package com.clx.performance.service.impl;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.enums.ResultEnum;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.service.OrderGoodsWeightService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* @ClassName OrderGoodsWeightServiceImpl
* @Description
* @Author kavin
* @Date 2024/8/5 14:16
* @Version 1.0
*/
@Slf4j
@Service
@AllArgsConstructor
public class OrderGoodsWeightServiceImpl implements OrderGoodsWeightService {
private final OrderGoodsDao orderGoodsDao;
@Override
public BigDecimal getOrderGoodsCanExtractWeight(String orderGoodsNo) {
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderGoodsNo).orElseThrow(ResultEnum.DATA_NOT_FIND);
return orderGoods.getExtractWeight().subtract(orderGoods.getAlreadyTransportWeight());
}
}
package com.clx.performance.service.impl;
import com.clx.order.enums.VehicleUsageEnum;
import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.enums.ResultEnum;
import com.clx.performance.enums.TruckDemandEnum;
import com.clx.performance.extranal.user.OrderService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.service.OrderWeightService;
import com.clx.performance.vo.feign.OrderExtractWeightVO;
import com.msl.common.exception.ServiceSystemException;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
/**
* @ClassName OrderWeightServiceImpl
* @Description
* @Author kavin
* @Date 2024/8/5 11:52
* @Version 1.0
*/
@Slf4j
@Service
@AllArgsConstructor
public class OrderWeightServiceImpl implements OrderWeightService {
private final OrderService orderService;
private final OrderGoodsDao orderGoodsDao;
private final OrderChildDao orderChildDao;
@Override
public OrderExtractWeightVO getOrderCanExtractWeight(String orderNo) {
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(orderNo).orElseThrow(
PerformanceResultEnum.DATA_NOT_FIND);
List<OrderGoods> orderGoodsList = orderGoodsDao.listByField(OrderGoods::getOrderNo, orderNo);
if(CollectionUtils.isEmpty(orderGoodsList)){
return OrderExtractWeightVO.builder().truckDemand(orderInfo.getTruckDemand())
.ownCarryWeight(orderInfo.getOwnCarryWeight()).platformCarryWeight(orderInfo.getPlatformCarryWeight())
.ownCanExtractWeight(orderInfo.getOwnCarryWeight()).platCanExtractWeight(orderInfo.getPlatformCarryWeight())
.build();
}
//已发布的自有车辆吨数
BigDecimal ownOrderGoodsWeight = BigDecimal.ZERO;
//已发布的平台车辆吨数
BigDecimal platOrderGoodsWeight = BigDecimal.ZERO;
for (OrderGoods item : orderGoodsList) {
if(Objects.equals(item.getVehicleUsage(), VehicleUsageEnum.Status.OWN.getCode())){
ownOrderGoodsWeight = ownOrderGoodsWeight.add(item.getExtractWeight());
}
if(Objects.equals(item.getVehicleUsage(), VehicleUsageEnum.Status.PLATFORM.getCode())){
platOrderGoodsWeight = platOrderGoodsWeight.add(item.getExtractWeight());
}
}
if(Objects.equals(orderInfo.getTruckDemand(), TruckDemandEnum.TruckType.PLATFORM_CAR.getCode())){
return OrderExtractWeightVO.builder().truckDemand(orderInfo.getTruckDemand())
.platformCarryWeight(orderInfo.getPlatformCarryWeight())
.platCanExtractWeight(orderInfo.getTransportWeight().subtract(platOrderGoodsWeight))
.build();
}
if(Objects.equals(orderInfo.getTruckDemand(), TruckDemandEnum.TruckType.OWNER_CAR.getCode())){
return OrderExtractWeightVO.builder().truckDemand(orderInfo.getTruckDemand())
.ownCarryWeight(orderInfo.getOwnCarryWeight())
.ownCanExtractWeight(orderInfo.getTransportWeight().subtract(ownOrderGoodsWeight))
.build();
}
if(Objects.equals(orderInfo.getTruckDemand(), TruckDemandEnum.TruckType.PLATFORM_ANY_CAR.getCode())){
//因为自有车辆的货单必须一次性全部提取,所有只要自有车辆吨数,剩下的吨数则为平台可提取吨数
BigDecimal ownCanExtractWeight = BigDecimal.ZERO;
BigDecimal platCanExtractWeight;
if(ownOrderGoodsWeight.compareTo(BigDecimal.ZERO) == 0 ){
//自有的车辆未发布货单,自有可提取吨数则为订单上自有可提取的吨数
ownCanExtractWeight = orderInfo.getOwnCarryWeight();
//平台可提取吨数 = 承运吨数 - 自有可提取吨数 - 平台已提取的吨数
platCanExtractWeight = orderInfo.getTransportWeight().subtract(ownCanExtractWeight).
subtract(platOrderGoodsWeight);
}else{
//平台可提取吨数 = 承运吨数 - 自有已经提取吨数 - 平台已提取的吨数
platCanExtractWeight = orderInfo.getTransportWeight().subtract(ownOrderGoodsWeight).
subtract(platOrderGoodsWeight);
}
return OrderExtractWeightVO.builder().truckDemand(orderInfo.getTruckDemand())
.ownCarryWeight(orderInfo.getOwnCarryWeight())
.platformCarryWeight(orderInfo.getPlatformCarryWeight())
.ownCanExtractWeight(ownCanExtractWeight)
.platCanExtractWeight(platCanExtractWeight)
.build();
}else{
log.warn("订单号:{} 的用车需求未知",orderNo);
throw new ServiceSystemException(ResultEnum.DATA_ERROR,"未知的用车需求");
}
}
@Override
public BigDecimal getOrderResidueWeight(String orderNo) {
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(orderNo).orElseThrow(
PerformanceResultEnum.DATA_NOT_FIND);
List<OrderChild> orderChildList = orderChildDao.listByField(OrderChild::getOrderNo, orderNo);
if(CollectionUtils.isEmpty(orderChildList)){
return orderInfo.getTransportWeight();
}
BigDecimal alreadyWeight = BigDecimal.ZERO; //该订单下已经拉运的重量
for (OrderChild child : orderChildList) {
if(Objects.nonNull(child.getLoadNet())){
alreadyWeight = alreadyWeight.add(child.getLoadNet());
}else{
alreadyWeight = alreadyWeight.add(child.getWeight());
}
}
return orderInfo.getTransportWeight().subtract(alreadyWeight);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论