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

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

# Conflicts: # performance-web/src/main/java/com/clx/performance/service/OrderChildService.java # performance-web/src/main/java/com/clx/performance/service/impl/OrderChildServiceImpl.java
...@@ -177,6 +177,14 @@ public enum OrderChildEnum { ...@@ -177,6 +177,14 @@ public enum OrderChildEnum {
); );
public static final List<Integer> CARRIER_CAN_CANCEL_STATUS_LIST = Arrays.asList(
Status.CREATED.getCode(),
Status.GO_TO_SEND.getCode(),
Status.ARRIVE_SEND.getCode()
);
public static ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap(); public static ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap();
static { static {
for(OrderChildEnum.Status for(OrderChildEnum.Status
......
package com.clx.performance.param.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
public class OrderChildCarrierBatchCancelParam {
@ApiModelProperty(value = "运单编号集合", example = "")
@NotEmpty(message = "运单编号集合不能为空")
private List<String> childNoList;
@ApiModelProperty(value = "取消原因", example = "信息错误")
private String remark;
}
...@@ -42,4 +42,10 @@ public class RedisConstants { ...@@ -42,4 +42,10 @@ public class RedisConstants {
*/ */
public static final String LINE_WARN_WEATHER = "clx-performance:lineWarn:weather:"; public static final String LINE_WARN_WEATHER = "clx-performance:lineWarn:weather:";
/**
* 订单最后一车
*/
public static final String ORDER_LAST_TRUCK_CHILD = "clx-performance:order:last:truck:child:";
} }
...@@ -2,6 +2,7 @@ package com.clx.performance.controller.pc; ...@@ -2,6 +2,7 @@ package com.clx.performance.controller.pc;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.enums.OrderChildEnum; import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.param.pc.OrderChildCarrierBatchCancelParam;
import com.clx.performance.param.pc.OrderChildCarrierCancelParam; import com.clx.performance.param.pc.OrderChildCarrierCancelParam;
import com.clx.performance.param.pc.PageCarrierOrderChildParam; import com.clx.performance.param.pc.PageCarrierOrderChildParam;
import com.clx.performance.param.pc.PageMonitorOrderChildQCParam; import com.clx.performance.param.pc.PageMonitorOrderChildQCParam;
...@@ -127,4 +128,12 @@ public class CarrierOrderChildController { ...@@ -127,4 +128,12 @@ public class CarrierOrderChildController {
} }
@ApiOperation(value = "批量取消运单", notes = "<br>By:刘海泉")
@PostMapping("/updateCarrierBatchCancel")
public Result<List<String>> updateCarrierBatchCancel(@RequestBody @Validated OrderChildCarrierBatchCancelParam param) {
List<String> cancelFailList = orderChildService.updateCarrierBatchCancel(param);
return Result.ok(cancelFailList);
}
} }
...@@ -8,7 +8,6 @@ import com.clx.performance.param.app.*; ...@@ -8,7 +8,6 @@ import com.clx.performance.param.app.*;
import com.clx.performance.param.app.owner.PageOwnerOrderChildListParam; import com.clx.performance.param.app.owner.PageOwnerOrderChildListParam;
import com.clx.performance.param.feign.CancelOrderGoodsParam; import com.clx.performance.param.feign.CancelOrderGoodsParam;
import com.clx.performance.param.pc.*; import com.clx.performance.param.pc.*;
import com.clx.performance.param.pc.breakcontract.carrier.PageCarrierBreakContractSettlementDriverParam;
import com.clx.performance.vo.app.*; import com.clx.performance.vo.app.*;
import com.clx.performance.vo.app.owner.OwnerOrderChildVO; import com.clx.performance.vo.app.owner.OwnerOrderChildVO;
import com.clx.performance.vo.pc.*; import com.clx.performance.vo.pc.*;
...@@ -108,6 +107,8 @@ public interface OrderChildService { ...@@ -108,6 +107,8 @@ public interface OrderChildService {
void cacheOrderChildExpectData(String childNo, OrderChildExpectDTO expect); void cacheOrderChildExpectData(String childNo, OrderChildExpectDTO expect);
List<String> updateCarrierBatchCancel(OrderChildCarrierBatchCancelParam param);
List<HistoryLineTranVolumeChartVO> getHistoryLineTransportVolume(String orderNo); List<HistoryLineTranVolumeChartVO> getHistoryLineTransportVolume(String orderNo);
} }
...@@ -4,12 +4,11 @@ import com.alibaba.fastjson.JSON; ...@@ -4,12 +4,11 @@ import com.alibaba.fastjson.JSON;
import com.clx.open.sdk.callback.OpenCallBackClient; import com.clx.open.sdk.callback.OpenCallBackClient;
import com.clx.open.sdk.callback.message.OrderChildMessage; import com.clx.open.sdk.callback.message.OrderChildMessage;
import com.clx.open.sdk.enums.ResultStatusEnum; import com.clx.open.sdk.enums.ResultStatusEnum;
import com.clx.order.enums.OrderEnum;
import com.clx.order.enums.ResultEnum; import com.clx.order.enums.ResultEnum;
import com.clx.order.feign.OrderFeign; import com.clx.order.feign.OrderFeign;
import com.clx.order.param.feign.UpdateOrderLastTruckParam;
import com.clx.order.vo.feign.FeignOrderVO; import com.clx.order.vo.feign.FeignOrderVO;
import com.clx.performance.config.ThirdAppConfig; import com.clx.performance.config.ThirdAppConfig;
import com.clx.performance.constant.RedisConstants;
import com.clx.performance.constant.RedissonConstants; import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.OrderChildDao; import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.model.OrderChild; import com.clx.performance.model.OrderChild;
...@@ -22,6 +21,7 @@ import lombok.AllArgsConstructor; ...@@ -22,6 +21,7 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -45,6 +45,7 @@ public class LastTruckServiceImpl implements LastTruckService { ...@@ -45,6 +45,7 @@ public class LastTruckServiceImpl implements LastTruckService {
private final OrderChildStruct orderChildStruct; private final OrderChildStruct orderChildStruct;
private final ThirdAppConfig thirdAppConfig; private final ThirdAppConfig thirdAppConfig;
private final RedissonClient redissonClient; private final RedissonClient redissonClient;
private final RedisTemplate<String, String> redisTemplate;
/** /**
* @Author kavin * @Author kavin
* @Description 判断最后一车的逻辑 * @Description 判断最后一车的逻辑
...@@ -121,18 +122,21 @@ public class LastTruckServiceImpl implements LastTruckService { ...@@ -121,18 +122,21 @@ public class LastTruckServiceImpl implements LastTruckService {
@Override @Override
public OrderChildVO getOrderLastTruck(String orderNo) throws Exception { public OrderChildVO getOrderLastTruck(String orderNo) throws Exception {
FeignOrderVO orderInfo = orderFeign.getOrderInfoFeign(orderNo);
if(Objects.isNull(orderInfo)){
log.error("计算订单最后一车,通过订单号:{},未查询到对应的订单",orderNo);
return null;
}
//为每个货主的订单进行加锁,计算最后一车进行排队,防止多个运单dts监听并发导致最后一车重复计算 //为每个货主的订单进行加锁,计算最后一车进行排队,防止多个运单dts监听并发导致最后一车重复计算
RLock lock = redissonClient.getLock(RedissonConstants.CALC_ORDER_LAST_TRUCK_LOCK + orderNo); RLock lock = redissonClient.getLock(RedissonConstants.CALC_ORDER_LAST_TRUCK_LOCK + orderNo);
try{ try{
FeignOrderVO orderInfo = orderFeign.getOrderInfoFeign(orderNo);
if(Objects.isNull(orderInfo)){ String lastTruckCacheKey = getLastTruckCacheKey(orderNo);
log.error("计算订单最后一车,通过订单号:{},未查询到对应的订单",orderNo);
return null;
}
//已经计算出最后一车,则直接返回运单信息 //已经计算出最后一车,则直接返回运单信息
if(Objects.equals(orderInfo.getLastTruckFlag(), OrderEnum.LastTruckFlag.YES.getCode())){ if(Objects.equals(Boolean.TRUE,redisTemplate.hasKey(lastTruckCacheKey))){
OrderChild child = orderChildDao.getByChildNo(orderInfo.getLastTruckChildNo()).orElseThrow( String childNo = redisTemplate.opsForValue().get(lastTruckCacheKey);
ResultEnum.DATA_NOT_FIND); OrderChild child = orderChildDao.getByChildNo(childNo).orElseThrow(ResultEnum.DATA_NOT_FIND);
return orderChildStruct.convert(child); return orderChildStruct.convert(child);
} }
boolean flag = lock.tryLock(15, 30, TimeUnit.SECONDS); boolean flag = lock.tryLock(15, 30, TimeUnit.SECONDS);
...@@ -148,11 +152,8 @@ public class LastTruckServiceImpl implements LastTruckService { ...@@ -148,11 +152,8 @@ public class LastTruckServiceImpl implements LastTruckService {
//查询最后一车的运单 //查询最后一车的运单
OrderChild child = orderChildDao.getLastTruckChild(orderNo); OrderChild child = orderChildDao.getLastTruckChild(orderNo);
log.info("当前订单计算出最后一车,运单编号:{} ", child.getChildNo()); log.info("当前订单计算出最后一车,运单编号:{} ", child.getChildNo());
//更新订单最后一车 //更新订单最后一车到缓存,并设置有效期为60天
UpdateOrderLastTruckParam param = new UpdateOrderLastTruckParam(); redisTemplate.opsForValue().set(getLastTruckCacheKey(orderNo),child.getChildNo(),60, TimeUnit.DAYS);
param.setOrderNo(orderNo);
param.setChildNo(child.getChildNo());
orderFeign.updateOrderLastTruck(param);
return orderChildStruct.convert(child); return orderChildStruct.convert(child);
} }
return null; return null;
...@@ -161,9 +162,9 @@ public class LastTruckServiceImpl implements LastTruckService { ...@@ -161,9 +162,9 @@ public class LastTruckServiceImpl implements LastTruckService {
lock.unlock(); lock.unlock();
} }
} }
}
public String getLastTruckCacheKey(String orderNo){
return RedisConstants.ORDER_LAST_TRUCK_CHILD + orderNo;
} }
} }
...@@ -63,8 +63,6 @@ import com.clx.performance.utils.zjxl.ZjxlGpsService; ...@@ -63,8 +63,6 @@ import com.clx.performance.utils.zjxl.ZjxlGpsService;
import com.clx.performance.vo.app.*; import com.clx.performance.vo.app.*;
import com.clx.performance.vo.app.owner.OwnerOrderChildVO; import com.clx.performance.vo.app.owner.OwnerOrderChildVO;
import com.clx.performance.vo.pc.*; import com.clx.performance.vo.pc.*;
import com.clx.performance.vo.pc.breakcontract.carrier.PageCarrierBreakContractSettlementDriverVO;
import com.clx.performance.vo.pc.carrier.settle.CarrierPagePlatformServiceFeeConfigVO;
import com.clx.user.enums.driver.DriverInfoEnum; import com.clx.user.enums.driver.DriverInfoEnum;
import com.clx.user.enums.idcard.IdCardEnum; import com.clx.user.enums.idcard.IdCardEnum;
import com.clx.user.feign.DocumentFeign; import com.clx.user.feign.DocumentFeign;
...@@ -3152,4 +3150,105 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -3152,4 +3150,105 @@ public class OrderChildServiceImpl implements OrderChildService {
throw new ServiceSystemException(OCR_RECOGNITION_ERROR); throw new ServiceSystemException(OCR_RECOGNITION_ERROR);
} }
} }
@Override
public List<HistoryLineTranVolumeChartVO> getHistoryLineTransportVolume(String orderNo) {
//查询近一个月与该订单收发货地线路一致的订单
Optional<List<String>> result = orderService.getMonthSameLineOrderList(orderNo);
if(!result.isPresent()){
log.warn("通过订单号:{} 查找相同线路的订单列列表,返回结果:{}",orderNo,result);
throw new ServiceSystemException(ResultEnum.DATA_ERROR,"获取相同线路的订单列表失败");
}
List<BigDecimal> priceList = orderGoodsAdjustmentPriceService.getNoRepeatAdjustmentPriceRecord(result.get());
List<HistoryLineTranVolumeChartVO> charts = new ArrayList<>();
if(CollectionUtils.isEmpty(priceList)){
return charts;
}
//查询相同路线的订单下的所有运单
List<OrderChild> childs = orderChildDao.listCompleteByOrderNos(result.get());
if(CollectionUtils.isEmpty(childs)){
priceList.forEach(item-> charts.add(HistoryLineTranVolumeChartVO.builder()
.pendingOrderFreight(item).number(0).build()));
return charts;
}
LinkedHashMap<BigDecimal,Integer> priceMap =
priceList.stream().collect(Collectors.toMap(item->item,item->0,
(existing, replacement) -> existing, // 如果有冲突的键,则保留现有的键
LinkedHashMap::new));
//进行相同路线运费拉运单数统计
childs.forEach(item->{
if(priceMap.containsKey(item.getFreightPrice())){
priceMap.put(item.getFreightPrice(),priceMap.get(item.getFreightPrice()) + 1);
}
});
for (Map.Entry<BigDecimal, Integer> entry : priceMap.entrySet()) {
charts.add(HistoryLineTranVolumeChartVO.builder().pendingOrderFreight(entry.getKey()).number(
entry.getValue()).build());
}
return charts;
}
@Override
public List<String> updateCarrierBatchCancel(OrderChildCarrierBatchCancelParam param) {
List<OrderChild> orderChildList = orderChildDao.listInField(OrderChild::getChildNo, param.getChildNoList());
List<OrderChild> canCancelOrderChildList = new ArrayList<>(); //可以取消的运单集合
List<OrderChild> notCancelOrderChildList = new ArrayList<>(); //不可以取消的运单集合
//已接单、前往货源地、到达货源地 的运单才可以取消
for (OrderChild child : orderChildList) {
if(OrderChildEnum.CARRIER_CAN_CANCEL_STATUS_LIST.contains(child.getStatus())){
canCancelOrderChildList.add(child);
}else{
notCancelOrderChildList.add(child);
}
}
/* // 禁止取消 (卸车前取消)
if (orderChild.getStatus() >= OrderChildEnum.Status.UNLOAD.getCode()) {
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_CANCEL_FORBID);
}
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).orElseThrow(
PerformanceResultEnum.DATA_NOT_FIND);
// 定向
OrderGoodsTruckBind orderGoodsTruckBind = null;
if (Objects.equals(orderGoods.getPendingOrderWay(), OrderGoodsPendingOrderWayStatusEnum.Status.EXCLUSIVE.getCode())
|| Objects.equals(orderGoods.getPendingOrderWay(), OrderGoodsPendingOrderWayStatusEnum.Status.FLEET_EXCLUSIVE.getCode())) {
orderGoodsTruckBind = orderGoodsTruckBindDao.getByOrderGoodsNoAndTruckNo(orderGoods.getOrderGoodsNo(),
orderChild.getTruckNo()).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
}
orderChild.setCancelRemark(param.getRemark());
orderChild.setCancelTime(LocalDateTime.now());
orderChild.setFinishTime(orderChild.getCancelTime());
orderChild.setStatus(OrderChildEnum.Status.PLATFORM_CANCEL.getCode());
// 返回吨数
updateOrderGoodsAmountReturn(orderChild, orderGoods);
// 取消定向
updateOrderGoodsDirectCancel(orderGoods,orderGoodsTruckBind);
orderChildDao.updateCancel(orderChild);
// 更新出车状态
updateDriverOrderStatusCancel(orderChild.getDriverUserNo(), orderChild.getTruckId());
// 日志
orderChildLogService.saveCarrierOrderChildLog(childNo, OrderChildLogEnum.Type.PLATFORM_CANCEL.getCode(),
OrderChildLogEnum.Type.PLATFORM_CANCEL.getMsg(), loginUserInfo.getUserNo(),
loginUserInfo.getUserName());
// 承运取消后置逻辑
orderChildPostService.orderChildCancelByCarrier(orderChild, UserTypeEnum.CARRIER.getCode(), loginUserInfo.getUserNo(), loginUserInfo.getUserName());*/
return notCancelOrderChildList.stream().map(OrderChild :: getChildNo).collect(Collectors.toList());
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论