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

Merge remote-tracking branch 'origin/v19.4_order_performance_progress_20240712' into test

# Conflicts: # performance-web/src/main/java/com/clx/performance/dao/OrderChildDao.java # performance-web/src/main/java/com/clx/performance/dao/OrderGoodsDao.java # performance-web/src/main/java/com/clx/performance/dao/impl/OrderChildDaoImpl.java # performance-web/src/main/java/com/clx/performance/dao/impl/OrderGoodsDaoImpl.java # performance-web/src/main/java/com/clx/performance/listener/OrderChildDtsListener.java # performance-web/src/main/java/com/clx/performance/service/OrderChildService.java # performance-web/src/main/java/com/clx/performance/service/OrderGoodsService.java # performance-web/src/main/java/com/clx/performance/service/impl/OrderChildServiceImpl.java Former-commit-id: 91a05d06
...@@ -179,7 +179,8 @@ public enum OrderChildEnum { ...@@ -179,7 +179,8 @@ public enum OrderChildEnum {
public static ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap(); public static ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap();
static { static {
for(OrderChildEnum.Status orderChildStatusEnum : OrderChildEnum.Status.values()){ for(OrderChildEnum.Status
orderChildStatusEnum : OrderChildEnum.Status.values()){
map.put(orderChildStatusEnum.getCode(), orderChildStatusEnum.getName()); map.put(orderChildStatusEnum.getCode(), orderChildStatusEnum.getName());
} }
} }
......
...@@ -96,6 +96,14 @@ public enum OrderEnum { ...@@ -96,6 +96,14 @@ public enum OrderEnum {
} }
return null; return null;
} }
public static String getNameByCode(Integer code) {
for(OverWeight type: OverWeight.values()){
if(Objects.equals(type.code,code)){
return type.getName();
}
}
return null;
}
} }
......
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
public enum PerformanceProgressEnum {
;
//1:进行中的线路(不分页) 2:已结束线路 3:全部线路
@Getter
@AllArgsConstructor
public enum Tab {
IN_PROCESS(1, "进行中的线路"),
END(2, "已结束线路"),
ALL(3, "全部线路"),
;
private final Integer code;
private final String name;
public static Optional<Tab> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(Tab::getName).orElse(null);
}
}
@Getter
@AllArgsConstructor
public enum LogType {
TODAY_EXPECT_COMPLETE(1, "今日预计完成吨数"),
TRADE_REQUIRE_ARRIVE_STATION_TIME(2, "交易要求到站时间"),
TRANSPORT_EXPECT_ARRIVE_STATION_TIME(3, "调度备注/跟进措施"),
ABNORMAL_REMARK(4, "异常备注"),
PERFORMANCE_ABNORMAL_REASON(5, "履约异常原因"),
DISPATCH_FOLLOW(6, "物流预计到站时间"),
;
private final Integer code;
private final String name;
public static Optional<LogType> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(LogType::getName).orElse(null);
}
}
}
package com.clx.performance.param.pc.carrier;
import com.msl.common.base.PageParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* @ClassName PagePerformanceProgress
* @Description
* @Author kavin
* @Date 2024/7/12 16:29
* @Version 1.0
*/
@Getter
@Setter
public class PagePerformanceProgress extends PageParam {
@ApiModelProperty(value = "Tab类型 1:进行中的线路(不分页) 2:已结束线路 3:全部线路", example = "")
private Integer tab;
}
package com.clx.performance.param.pc.carrier;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
* @ClassName UpdatePerformanceProgressParam
* @Description
* @Author kavin
* @Date 2024/7/16 10:29
* @Version 1.0
*/
@Getter
@Setter
public class UpdatePerformanceProgressParam {
@NotNull(message = "id不能为空")
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("今日预计完成吨数")
private BigDecimal todayExpectComplete;
@ApiModelProperty("交易要求到站时间")
private String tradeRequireArriveStationTime;
@ApiModelProperty("物流预计到站时间")
private String transportExpectArriveStationTime;
@ApiModelProperty("异常备注")
private String abnormalRemark;
@ApiModelProperty("履约异常原因")
private String performanceAbnormalReason;
@ApiModelProperty("调度备注/跟进措施")
private String dispatchFollow;
}
package com.clx.performance.vo.pc;
import com.msl.common.convertor.type.MoneyOutConvert;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.math.BigDecimal;
@Getter
@Setter
@NoArgsConstructor
public class DriverFreightPriceChartVO {
@ApiModelProperty("挂单运费")
@MoneyOutConvert
private BigDecimal pendingOrderFreight;
@ApiModelProperty("运费生效时间")
private String creatTime;
}
\ No newline at end of file
package com.clx.performance.vo.pc;
import com.msl.common.convertor.type.MoneyOutConvert;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.math.BigDecimal;
@Getter
@Setter
@NoArgsConstructor
public class DriverFreightPriceVO {
@ApiModelProperty("货单编号")
private String orderGoodsNo;
@ApiModelProperty("挂单运费")
@MoneyOutConvert
private BigDecimal pendingOrderFreight;
}
\ No newline at end of file
package com.clx.performance.vo.pc;
import com.msl.common.convertor.type.MoneyOutConvert;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.math.BigDecimal;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class HistoryLineTranVolumeChartVO {
@ApiModelProperty("挂单运费")
@MoneyOutConvert
private BigDecimal pendingOrderFreight;
@ApiModelProperty("拉运单数")
private Integer number;
}
\ No newline at end of file
package com.clx.performance.vo.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class OrderGoodsPendingVO {
@ApiModelProperty("货单编号")
private String orderGoodsNo;
@ApiModelProperty("挂单时间")
private String pendingOrderTime;
}
\ No newline at end of file
package com.clx.performance.vo.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* @ClassName UpdatePerformanceProgressParam
* @Description
* @Author kavin
* @Date 2024/7/16 10:29
* @Version 1.0
*/
@Getter
@Setter
public class PerformanceProgressDetailVO {
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("今日预计完成吨数")
private BigDecimal todayExpectComplete;
@ApiModelProperty("交易要求到站时间")
private String tradeRequireArriveStationTime;
@ApiModelProperty("物流预计到站时间")
private String transportExpectArriveStationTime;
@ApiModelProperty("异常备注")
private String abnormalRemark;
@ApiModelProperty("履约异常原因")
private String performanceAbnormalReason;
@ApiModelProperty("调度备注/跟进措施")
private String dispatchFollow;
}
package com.clx.performance.vo.pc;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* @ClassName PerformanceProgressOperationLog
* @Description
* @Author kavin
* @Date 2024/7/16 11:07
* @Version 1.0
*/
@Getter
@Setter
public class PerformanceProgressOperationLogVO {
@ApiModelProperty("操作时间")
private String createTime;
@ApiModelProperty("操作人")
private String createName;
@ApiModelProperty("操作内容")
private String operateContent;
}
package com.clx.performance.vo.pc;
import com.clx.performance.enums.OrderEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
@Getter
@Setter
public class PerformanceProgressVO{
private Integer id;
@ApiModelProperty("排序")
private Integer seq;
@ApiModelProperty("订单编号")
private String orderNo;
@ApiModelProperty("订单状态: 0待报价 1客户确认中 2报价已确认 3平台已承接 4已取消 5暂停 6拒绝承运 7 挂单中 8运输中 9订单已完成 10 已失效")
private Integer orderStatus;
@ApiModelProperty("发货-地址id")
private Integer sendAddressId;
@ApiModelProperty("货源地简称")
private String sendAddressShorter;
@ApiModelProperty("货源地-标准地址id")
private Integer sendSystemAddressId;
@ApiModelProperty("货源地-标准地址简称")
private String sendSystemAddressShorter;
@ApiModelProperty("高级物流经理姓名数组")
private String seniorLogisticsManagerName;
@ApiModelProperty("货物类型编码")
private String goodsTypeCode;
@ApiModelProperty("货物类型名称")
private String goodsTypeName;
@ApiModelProperty("货物名称id")
private Integer goodsNameId;
@ApiModelProperty("货物名称")
private String goodsName;
@ApiModelProperty("煤源位置")
private String sendAddress;
@ApiModelProperty("是否C类煤源 0 否 1 是")
private Integer sendOverStandard;
@ApiModelProperty("是否C类煤源 0 否 1 是")
private String sendOverStandardMsg;
public String getSendOverStandardMsg(){
return OrderEnum.OverWeight.getNameByCode(sendOverStandard);
}
@ApiModelProperty("司机运费")
private BigDecimal driverFreightPrice;
@ApiModelProperty("任务吨数")
private BigDecimal taskWeight;
@ApiModelProperty("挂单吨数")
private BigDecimal pendingWeight;
@ApiModelProperty("接单车数")
private Integer orderedTruckNum;
@ApiModelProperty("到达货源地车数")
private Integer arriveSendTruckNum;
@ApiModelProperty("装车车数")
private Integer loadTruckNum;
@ApiModelProperty("卸车车数")
private Integer unloadTruckNum;
@ApiModelProperty("在途车数")
private Integer onTheWayTruckNum;
@ApiModelProperty("接单率")
private BigDecimal orderedRate;
@ApiModelProperty("任务完成率")
private BigDecimal taskCompleteRatio;
@ApiModelProperty("矿发吨数")
private BigDecimal sumLoadWeight;
@ApiModelProperty("到站吨数")
private BigDecimal sumUnloadWeight;
@ApiModelProperty("在途吨数")
private BigDecimal sumOnTheWayWeight;
@ApiModelProperty("今日预计完成吨数")
private BigDecimal todayExpectComplete;
@ApiModelProperty("异常备注")
private String abnormalRemark;
@ApiModelProperty("履约异常原因")
private String performanceAbnormalReason;
@ApiModelProperty("调度备注/跟进措施")
private String dispatchFollow;
@ApiModelProperty("重车运距(公里)")
private BigDecimal orderDistance;
@ApiModelProperty("可拉运时间段")
private String transportTimeSlot;
@ApiModelProperty("挂单时间")
private String pendingTime;
@ApiModelProperty("交易要求到站时间")
private String tradeRequireArriveStationTime;
@ApiModelProperty("物流要求到站时间")
private String transportExpectArriveStationTime;
@ApiModelProperty("测算运费")
private BigDecimal predictionFreightPrice;
@ApiModelProperty("创建时间")
private String createTime;
@ApiModelProperty("修改时间")
private String modifiedTime;
}
...@@ -222,4 +222,83 @@ public class RabbitBeanConfig { ...@@ -222,4 +222,83 @@ public class RabbitBeanConfig {
return BindingBuilder.bind(ownerLoanThawQueue()).to(ownerLoanExchange()).with(RabbitKeyConstants.OWNER_LOAN_THAW_ROUTE_KEY); return BindingBuilder.bind(ownerLoanThawQueue()).to(ownerLoanExchange()).with(RabbitKeyConstants.OWNER_LOAN_THAW_ROUTE_KEY);
} }
/**
* 监听货单同步履约进度表
*/
@Bean
public Queue syncPerformanceProgress4OrderGoodsQueue() {
return new Queue(RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_GOODS_QUEUE,
true, false, false);
}
/**
* 监听货单同步履约进度表
**/
@Bean
public DirectExchange syncPerformanceProgress4OrderGoodsExchange() {
return new DirectExchange(RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_GOODS_EXCHANGE);
}
/**
* 监听货单同步履约进度表
*/
@Bean
public Binding syncPerformanceProgress4OrderGoodsBind() {
return BindingBuilder.bind(syncPerformanceProgress4OrderGoodsQueue()).to(syncPerformanceProgress4OrderGoodsExchange())
.with(RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_GOODS_ROUTING_KEY);
}
/**
* 监听运单同步履约进度表
*/
@Bean
public Queue syncPerformanceProgress4OrderChildQueue() {
return new Queue(RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_QUEUE,
true, false, false);
}
/**
* 监听运单同步履约进度表
**/
@Bean
public DirectExchange syncPerformanceProgress4OrderChildExchange() {
return new DirectExchange(RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_EXCHANGE);
}
/**
* 监听运单同步履约进度表
*/
@Bean
public Binding syncPerformanceProgress4OrderChildBind() {
return BindingBuilder.bind(syncPerformanceProgress4OrderChildQueue()).to(syncPerformanceProgress4OrderChildExchange())
.with(RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_ROUTING_KEY);
}
/**
* 保存货单调价表
*/
@Bean
public Queue saveOrderGoodsAdjustmentPriceQueue() {
return new Queue(RabbitKeyConstants.SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_QUEUE,
true, false, false);
}
/**
* 保存货单调价表
**/
@Bean
public DirectExchange saveOrderGoodsAdjustmentPriceExchange() {
return new DirectExchange(RabbitKeyConstants.SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_EXCHANGE);
}
/**
*保存货单调价表
*/
@Bean
public Binding saveOrderGoodsAdjustmentPriceBind() {
return BindingBuilder.bind(saveOrderGoodsAdjustmentPriceQueue()).to(saveOrderGoodsAdjustmentPriceExchange())
.with(RabbitKeyConstants.SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_ROUTING_KEY);
}
} }
...@@ -110,4 +110,43 @@ public class RabbitKeyConstants { ...@@ -110,4 +110,43 @@ public class RabbitKeyConstants {
//货主结算单数据同步货主客户端 需要手动创建对列交换机 //货主结算单数据同步货主客户端 需要手动创建对列交换机
public static final String CLX_PERFORMANCE_SETTLEMENT_OWNER_QUEUE = "clx_performance.settlement_owner_queue"; public static final String CLX_PERFORMANCE_SETTLEMENT_OWNER_QUEUE = "clx_performance.settlement_owner_queue";
//同步履约进度表消息----订单部分
public static final String SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_INFO_QUEUE = "clx_order.sync.performance.progress.for.order.info.queue";
//货单同步履约进度表queue
public static final String SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_GOODS_QUEUE = "clx_performance.sync.performance.progress.for.order.goods.queue";
//货单同步履约进度表exchange
public static final String SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_GOODS_EXCHANGE = "clx_performance.sync.performance.progress.for.order.goods.exchange";
//货单同步履约进度表routing_key
public static final String SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_GOODS_ROUTING_KEY = "clx_performance.sync.performance.progress.for.order.goods.routing.key";
//运单同步履约进度表queue
public static final String SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_QUEUE = "clx_performance.sync.performance.progress.for.order.child.queue";
//运单同步履约进度表exchange
public static final String SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_EXCHANGE = "clx_performance.sync.performance.progress.for.order.child.exchange";
//运单同步履约进度表routing_key
public static final String SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_ROUTING_KEY = "clx_performance.sync.performance.progress.for.order.child.routing.key";
//保存货单调价记录queue
public static final String SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_QUEUE = "clx_performance.save.order.goods.adjustment.price.queue";
//保存货单调价记录exchange
public static final String SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_EXCHANGE = "clx_performance.save.order.goods.adjustment.price.exchange";
//保存货单调价记录routing_key
public static final String SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_ROUTING_KEY = "clx_performance.save.order.goods.adjustment.price.routing.key";
} }
...@@ -118,4 +118,12 @@ public class CarrierOrderChildController { ...@@ -118,4 +118,12 @@ public class CarrierOrderChildController {
} }
@ApiOperation(value = "履约进度表-历史线路拉运量", notes = "<br>By:l刘海泉")
@GetMapping("/getHistoryLineTransportVolume")
public Result<List<HistoryLineTranVolumeChartVO>> getHistoryLineTransportVolume(@NotBlank(message = "订单编号不能为空") String orderNo) {
return Result.ok(orderChildService.getHistoryLineTransportVolume(orderNo));
}
} }
...@@ -8,11 +8,10 @@ import com.clx.performance.constant.RedisConstants; ...@@ -8,11 +8,10 @@ import com.clx.performance.constant.RedisConstants;
import com.clx.performance.enums.PerformanceResultEnum; import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.param.pc.*; import com.clx.performance.param.pc.*;
import com.clx.performance.service.OrderChildService; import com.clx.performance.service.OrderChildService;
import com.clx.performance.service.OrderGoodsAdjustmentPriceService;
import com.clx.performance.service.OrderGoodsService; import com.clx.performance.service.OrderGoodsService;
import com.clx.performance.service.OrderGoodsTruckBindService; import com.clx.performance.service.OrderGoodsTruckBindService;
import com.clx.performance.vo.pc.OrderChildPCVO; import com.clx.performance.vo.pc.*;
import com.clx.performance.vo.pc.OrderGoodsEditVO;
import com.clx.performance.vo.pc.OrderGoodsVO;
import com.msl.common.base.PageData; import com.msl.common.base.PageData;
import com.msl.common.convertor.aspect.UnitCovert; import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
...@@ -27,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -27,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
...@@ -68,6 +68,9 @@ public class GoodsOrderController { ...@@ -68,6 +68,9 @@ public class GoodsOrderController {
@Autowired @Autowired
private OrderGoodsTruckBindService orderGoodsTruckBindService; private OrderGoodsTruckBindService orderGoodsTruckBindService;
@Autowired
private OrderGoodsAdjustmentPriceService orderGoodsAdjustmentPriceService;
@ApiOperation(value = "提交货单", notes = "<br>By:胡宇帆") @ApiOperation(value = "提交货单", notes = "<br>By:胡宇帆")
@PostMapping("/saveGoodsOrder") @PostMapping("/saveGoodsOrder")
@UnitCovert(result = false) @UnitCovert(result = false)
...@@ -190,4 +193,35 @@ public class GoodsOrderController { ...@@ -190,4 +193,35 @@ public class GoodsOrderController {
} }
@ApiOperation(value = "司机运费列表", notes = "<br>By:刘海泉")
@GetMapping("/getDriverFreightPriceList")
@UnitCovert(param = false)
public Result<List<DriverFreightPriceVO>> getDriverFreightPriceList(@RequestParam(value = "orderNo")
@NotBlank(message = "订单编号不能为空") String orderNo) {
List<DriverFreightPriceVO> list = orderGoodsService.getDriverFreightPriceList(orderNo);
return Result.ok(list);
}
@ApiOperation(value = "订单下挂单时间列表", notes = "<br>By:刘海泉")
@GetMapping("/getOrderGoodsPendingList")
public Result<List<OrderGoodsPendingVO>> getOrderGoodsPendingList(@RequestParam(value = "orderNo")
@NotBlank(message = "订单编号不能为空") String orderNo) {
List<OrderGoodsPendingVO> list = orderGoodsService.getOrderGoodsPendingList(orderNo);
return Result.ok(list);
}
@ApiOperation(value = "司机运费记录柱形图", notes = "<br>By:刘海泉")
@GetMapping("/getDriverFreightPriceChart")
@UnitCovert(param = false)
public Result<List<DriverFreightPriceChartVO>> getDriverFreightPriceChart(@RequestParam(value = "orderNo")
@NotBlank(message = "订单编号不能为空") String orderNo) {
List<DriverFreightPriceChartVO> list = orderGoodsAdjustmentPriceService.getDriverFreightPriceChart(orderNo);
return Result.ok(list);
}
} }
package com.clx.performance.controller.pc.carrier;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.param.pc.carrier.PagePerformanceProgress;
import com.clx.performance.param.pc.carrier.UpdatePerformanceProgressParam;
import com.clx.performance.service.PerformanceProgressService;
import com.clx.performance.vo.pc.PerformanceProgressDetailVO;
import com.clx.performance.vo.pc.PerformanceProgressOperationLogVO;
import com.clx.performance.vo.pc.PerformanceProgressVO;
import com.msl.common.base.PageData;
import com.msl.common.convertor.aspect.UnitCovert;
import com.msl.common.result.Result;
import com.msl.user.data.UserSessionData;
import com.msl.user.utils.TokenUtil;
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.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@Slf4j
@RestController
@RequestMapping(value="/pc/carrier/performanceProgress")
@Validated
@Api(tags = "承运端-履约进度表")
@AllArgsConstructor
public class CarrierPerformanceProgressController {
private final PerformanceProgressService performanceProgressService;
@ApiOperation(value = "履约进度表列表",notes = "<br>By:刘海泉")
@PostMapping("/pagePerformanceProgress")
@UnitCovert(param = false)
public Result<PageData<PerformanceProgressVO>> pagePerformanceProgress(@RequestBody @Validated PagePerformanceProgress param) {
IPage<PerformanceProgressVO> page = performanceProgressService.pagePerformanceProgress(param);
return Result.page(page.getRecords(),page.getTotal(),page.getPages());
}
@ApiOperation(value = "进行中数据调整顺序",notes = "<br>By:刘海泉")
@GetMapping("/updateAdjustOrder")
public Result<Object> updateAdjustOrder(
@RequestParam("adjustOrderOneId") @NotNull(message = "调整订单1的id不能为空") Integer adjustOrderId,
@RequestParam("adjustOrderTwoId") @NotNull(message = "调整订单2的id不能为空") Integer adjustOrderBeforeId
) {
performanceProgressService.updateAdjustOrder(adjustOrderId,adjustOrderBeforeId);
return Result.ok();
}
@ApiOperation(value = "编辑履约进度",notes = "<br>By:刘海泉")
@PostMapping("/updatePerformanceProgress")
public Result<Object> updatePerformanceProgress(@RequestBody @Validated UpdatePerformanceProgressParam param) {
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
performanceProgressService.updatePerformanceProgress(param,loginUserInfo.getUserNo(),loginUserInfo.getUserName());
return Result.ok();
}
@ApiOperation(value = "获取履约进度详情",notes = "<br>By:刘海泉")
@GetMapping("/getPerformanceProgressDetail")
public Result<PerformanceProgressDetailVO> getPerformanceProgressDetail(@RequestParam("id") @NotNull(message = "id不能为空") Integer id) {
PerformanceProgressDetailVO vo = performanceProgressService.getPerformanceProgressDetail(id);
return Result.ok(vo);
}
@ApiOperation(value = "获取履约进度编辑日志列表",notes = "<br>By:刘海泉")
@GetMapping("/getOperationLog")
public Result<List<PerformanceProgressOperationLogVO>> getOperationLog(@RequestParam("orderNo") @NotBlank(message = "订单编号不能为空") String orderNo) {
List<PerformanceProgressOperationLogVO> list = performanceProgressService.getOperationLog(orderNo);
return Result.ok(list);
}
}
...@@ -201,4 +201,8 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int ...@@ -201,4 +201,8 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int
List<CancelOrderGoodsWeightDTO> statisticsCancelOrderGoodsWeight(List<String> childNos); List<CancelOrderGoodsWeightDTO> statisticsCancelOrderGoodsWeight(List<String> childNos);
List<OrderChild> listBeforeUnloadOrderChild(LocalDateTime startTime,LocalDateTime endTime); List<OrderChild> listBeforeUnloadOrderChild(LocalDateTime startTime,LocalDateTime endTime);
List<OrderChild> listBeforeCompleteByOrderNo(String orderNo);
List<OrderChild> listCompleteByOrderNos(List<String> strings);
} }
package com.clx.performance.dao;
import com.msl.common.dao.BaseDao;
import com.clx.performance.mapper.OrderGoodsAdjustmentPriceMapper;
import com.clx.performance.model.OrderGoodsAdjustmentPrice;
import java.util.List;
/**
* @author kavin
* Date 2024-07-18
* Time 17:04
*/
public interface OrderGoodsAdjustmentPriceDao extends BaseDao<OrderGoodsAdjustmentPriceMapper, OrderGoodsAdjustmentPrice, Integer> {
List<OrderGoodsAdjustmentPrice> selectByOrderNoList(List<String> orderNoList);
}
...@@ -110,4 +110,6 @@ public interface OrderGoodsDao extends BaseDao<OrderGoodsMapper, OrderGoods, Int ...@@ -110,4 +110,6 @@ public interface OrderGoodsDao extends BaseDao<OrderGoodsMapper, OrderGoods, Int
void batchCancelOrderGoods(List<CancelOrderGoodsWeightDTO> cancelOrderGoodsWeight); void batchCancelOrderGoods(List<CancelOrderGoodsWeightDTO> cancelOrderGoodsWeight);
void updateAlreadyLoadWeight(BigDecimal alreadyLoadWeight, String orderGoodsNo); void updateAlreadyLoadWeight(BigDecimal alreadyLoadWeight, String orderGoodsNo);
List<OrderGoods> listAfterCreatedByOrderNo(String orderNo);
} }
package com.clx.performance.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.performance.mapper.PerformanceProgressMapper;
import com.clx.performance.model.PerformanceProgress;
import com.clx.performance.param.pc.carrier.PagePerformanceProgress;
import com.msl.common.dao.BaseDao;
import java.util.List;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
public interface PerformanceProgressDao extends BaseDao<PerformanceProgressMapper, PerformanceProgress, Integer> {
IPage<PerformanceProgress> pagePerformanceProgress(List<Integer> statusList, PagePerformanceProgress param);
void updateRecordOrder(Long seq,boolean isUp);
long getMaxSeq();
}
package com.clx.performance.dao;
import com.clx.performance.mapper.PerformanceProgressLogMapper;
import com.clx.performance.model.PerformanceProgressLog;
import com.msl.common.dao.BaseDao;
import java.util.List;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
public interface PerformanceProgressLogDao extends BaseDao<PerformanceProgressLogMapper, PerformanceProgressLog, Integer> {
List<PerformanceProgressLog> getOperationLog(String orderNo);
}
...@@ -670,4 +670,20 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild, ...@@ -670,4 +670,20 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
.le(OrderChild :: getCreateTime,endTime) .le(OrderChild :: getCreateTime,endTime)
); );
} }
@Override
public List<OrderChild> listBeforeCompleteByOrderNo(String orderNo) {
return list(lQrWrapper()
.eq(OrderChild :: getOrderNo,orderNo)
.le(OrderChild :: getStatus,OrderChildEnum.Status.COMPLETE.getCode())
);
}
@Override
public List<OrderChild> listCompleteByOrderNos(List<String> orderNoList) {
return list(lQrWrapper()
.in(OrderChild :: getOrderNo,orderNoList)
.le(OrderChild :: getStatus,OrderChildEnum.Status.COMPLETE.getCode())
);
}
} }
package com.clx.performance.dao.impl;
import com.clx.performance.dao.OrderGoodsAdjustmentPriceDao;
import com.clx.performance.mapper.OrderGoodsAdjustmentPriceMapper;
import com.clx.performance.model.OrderGoodsAdjustmentPrice;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author kavin
* Date 2024-07-18
* Time 17:04
*/
@Repository
public class OrderGoodsAdjustmentPriceDaoImpl extends BaseDaoImpl<OrderGoodsAdjustmentPriceMapper, OrderGoodsAdjustmentPrice, Integer> implements OrderGoodsAdjustmentPriceDao {
@Override
public List<OrderGoodsAdjustmentPrice> selectByOrderNoList(List<String> orderNoList) {
return baseMapper.selectList(lQrWrapper().in(OrderGoodsAdjustmentPrice::getOrderNo, orderNoList)
.orderByAsc(OrderGoodsAdjustmentPrice :: getCreateTime)
);
}
}
...@@ -310,4 +310,13 @@ public class OrderGoodsDaoImpl extends BaseDaoImpl<OrderGoodsMapper, OrderGoods, ...@@ -310,4 +310,13 @@ public class OrderGoodsDaoImpl extends BaseDaoImpl<OrderGoodsMapper, OrderGoods,
public void updateAlreadyLoadWeight(BigDecimal alreadyLoadWeight, String orderGoodsNo) { public void updateAlreadyLoadWeight(BigDecimal alreadyLoadWeight, String orderGoodsNo) {
baseMapper.updateAlreadyLoadWeight(alreadyLoadWeight,orderGoodsNo); baseMapper.updateAlreadyLoadWeight(alreadyLoadWeight,orderGoodsNo);
} }
@Override
public List<OrderGoods> listAfterCreatedByOrderNo(String orderNo) {
return baseMapper.selectList(lQrWrapper().eq(OrderGoods::getOrderNo, orderNo)
.ne(OrderGoods::getOrderGoodsStatus,OrderGoodsStatusEnum.Status.CREATED.getCode())
.orderByDesc(OrderGoods :: getPendingOrderTime)
);
}
} }
package com.clx.performance.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.dao.PerformanceProgressDao;
import com.clx.performance.mapper.PerformanceProgressMapper;
import com.clx.performance.model.PerformanceProgress;
import com.clx.performance.param.pc.carrier.PagePerformanceProgress;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
@Repository
public class PerformanceProgressDaoImpl extends BaseDaoImpl<PerformanceProgressMapper, PerformanceProgress, Integer> implements PerformanceProgressDao {
@Override
public IPage<PerformanceProgress> pagePerformanceProgress(List<Integer> statusList, PagePerformanceProgress param){
Page<PerformanceProgress> page = Page.of(param.getPage(), param.getPageSize());
LambdaQueryWrapper<PerformanceProgress> query = new LambdaQueryWrapper<>();
query.in(PerformanceProgress :: getOrderStatus,statusList);
//最新接单的seq最大,所以这里降序排序
query.orderByDesc(PerformanceProgress :: getSeq);
return baseMapper.selectPage(page,query);
}
@Override
public void updateRecordOrder(Long seq,boolean isUp) {
LambdaUpdateWrapper<PerformanceProgress> update = new LambdaUpdateWrapper<>();
if(isUp){
update.gt(PerformanceProgress :: getSeq,seq);
}else{
update.ge(PerformanceProgress :: getSeq,seq);
}
update.setSql("seq = seq + 1");
baseMapper.update(null,update);
}
@Override
public long getMaxSeq() {
LambdaQueryWrapper<PerformanceProgress> query = new LambdaQueryWrapper<>();
return baseMapper.selectCount(query);
}
}
package com.clx.performance.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.clx.performance.dao.PerformanceProgressLogDao;
import com.clx.performance.mapper.PerformanceProgressLogMapper;
import com.clx.performance.model.PerformanceProgressLog;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
@Repository
public class PerformanceProgressLogDaoImpl extends BaseDaoImpl<PerformanceProgressLogMapper, PerformanceProgressLog, Integer> implements PerformanceProgressLogDao {
@Override
public List<PerformanceProgressLog> getOperationLog(String orderNo) {
LambdaQueryWrapper<PerformanceProgressLog> query = new LambdaQueryWrapper<>();
query.eq(PerformanceProgressLog :: getOrderNo,orderNo);
query.orderByDesc(PerformanceProgressLog :: getId);
return baseMapper.selectList(query);
}
}
package com.clx.performance.extranal.user; package com.clx.performance.extranal.user;
import com.clx.order.vo.feign.FeignAddressVO; import com.clx.order.vo.feign.FeignAddressVO;
import com.clx.order.vo.feign.SystemAddressVO;
import com.msl.common.base.Optional; import com.msl.common.base.Optional;
public interface AddressService { public interface AddressService {
Optional<FeignAddressVO> getSendAndReceiveAddress(Integer sendAddressId, Integer receiveAddressId); Optional<FeignAddressVO> getSendAndReceiveAddress(Integer sendAddressId, Integer receiveAddressId);
Optional<SystemAddressVO> getSystemAddress(Integer addressId);
} }
...@@ -4,8 +4,14 @@ import com.clx.order.vo.feign.FeignOrderInfoVO; ...@@ -4,8 +4,14 @@ import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.msl.common.base.Optional; import com.msl.common.base.Optional;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
public interface OrderService { public interface OrderService {
Optional<FeignOrderInfoVO> getOrderInfo(@RequestParam String orderNo); Optional<FeignOrderInfoVO> getOrderInfo(@RequestParam String orderNo);
Optional<List<String>> getMonthSameLineOrderList(String orderNo);
} }
...@@ -2,6 +2,7 @@ package com.clx.performance.extranal.user.impl; ...@@ -2,6 +2,7 @@ package com.clx.performance.extranal.user.impl;
import com.clx.order.feign.AddressFeign; import com.clx.order.feign.AddressFeign;
import com.clx.order.vo.feign.FeignAddressVO; import com.clx.order.vo.feign.FeignAddressVO;
import com.clx.order.vo.feign.SystemAddressVO;
import com.clx.performance.extranal.user.AddressService; import com.clx.performance.extranal.user.AddressService;
import com.msl.common.base.Optional; import com.msl.common.base.Optional;
import com.msl.common.result.Result; import com.msl.common.result.Result;
...@@ -22,4 +23,10 @@ public class AddressServiceImpl implements AddressService { ...@@ -22,4 +23,10 @@ public class AddressServiceImpl implements AddressService {
.map(Result::getData); .map(Result::getData);
} }
@Override
public Optional<SystemAddressVO> getSystemAddress(Integer addressId) {
return Optional.ofNullable(addressFeign.getSystemAddress(addressId))
.filter(Result::succeed)
.map(Result::getData);
}
} }
...@@ -9,6 +9,8 @@ import lombok.AllArgsConstructor; ...@@ -9,6 +9,8 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
@Slf4j @Slf4j
@AllArgsConstructor @AllArgsConstructor
...@@ -22,4 +24,11 @@ public class OrderServiceImpl implements OrderService { ...@@ -22,4 +24,11 @@ public class OrderServiceImpl implements OrderService {
.filter(Result::succeed) .filter(Result::succeed)
.map(Result::getData); .map(Result::getData);
} }
@Override
public Optional<List<String>> getMonthSameLineOrderList(String orderNo) {
return Optional.ofNullable(orderFeign.getMonthSameLineOrderList(orderNo))
.filter(Result::succeed)
.map(Result::getData);
}
} }
...@@ -11,6 +11,7 @@ import com.clx.order.enums.OrderEnum; ...@@ -11,6 +11,7 @@ import com.clx.order.enums.OrderEnum;
import com.clx.order.enums.SyncPlatformEnum; import com.clx.order.enums.SyncPlatformEnum;
import com.clx.order.feign.OrderFeign; import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignOrderVO; import com.clx.order.vo.feign.FeignOrderVO;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.config.ThirdAppConfig; import com.clx.performance.config.ThirdAppConfig;
import com.clx.performance.constant.RabbitKeyConstants; import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.dao.OrderChildImageDao; import com.clx.performance.dao.OrderChildImageDao;
...@@ -25,6 +26,7 @@ import com.clx.performance.model.OrderChild; ...@@ -25,6 +26,7 @@ import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderChildImage; import com.clx.performance.model.OrderChildImage;
import com.clx.performance.service.LastTruckService; import com.clx.performance.service.LastTruckService;
import com.clx.user.feign.TruckFeign; import com.clx.user.feign.TruckFeign;
import com.clx.performance.struct.OrderChildStruct;
import com.clx.user.vo.feign.FeignDriverTruckModelVo; import com.clx.user.vo.feign.FeignDriverTruckModelVo;
import com.clx.user.vo.feign.TruckInfoFeignVo; import com.clx.user.vo.feign.TruckInfoFeignVo;
import com.msl.common.enums.ResultCodeEnum; import com.msl.common.enums.ResultCodeEnum;
...@@ -35,7 +37,9 @@ import lombok.extern.slf4j.Slf4j; ...@@ -35,7 +37,9 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.core.Message; import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -45,6 +49,8 @@ import java.math.BigDecimal; ...@@ -45,6 +49,8 @@ import java.math.BigDecimal;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import static com.clx.performance.constant.RabbitKeyConstants.*;
@Slf4j @Slf4j
@Component @Component
@AllArgsConstructor @AllArgsConstructor
...@@ -59,6 +65,8 @@ public class OrderChildDtsListener { ...@@ -59,6 +65,8 @@ public class OrderChildDtsListener {
private final OrderGoodsDao orderGoodsDao; private final OrderGoodsDao orderGoodsDao;
private final OrderChildStruct orderChildStruct;
private final RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitKeyConstants.CLX_PERFORMANCE_ORDER_CHILD_QUEUE) @RabbitListener(queues = RabbitKeyConstants.CLX_PERFORMANCE_ORDER_CHILD_QUEUE)
...@@ -69,12 +77,13 @@ public class OrderChildDtsListener { ...@@ -69,12 +77,13 @@ public class OrderChildDtsListener {
DataTransportDTO dataTransportDTO = JSON.parseObject(msg, DataTransportDTO.class); DataTransportDTO dataTransportDTO = JSON.parseObject(msg, DataTransportDTO.class);
log.info("DTS消息同步开始, database:clx_performance.order_child, 实体:{}", dataTransportDTO); log.info("DTS消息同步开始, database:clx_performance.order_child, 实体:{}", dataTransportDTO);
log.info("操作类型:{}",dataTransportDTO.getOperationType().getCode()); log.info("操作类型:{}",dataTransportDTO.getOperationType().getCode());
OrderChildMessage before = DtsMapConvertUtil.convert(dataTransportDTO.getBeforeMap(), new OrderChildMessage()); OrderChild before = DtsMapConvertUtil.convert(dataTransportDTO.getBeforeMap(), new OrderChild());
OrderChildMessage after = DtsMapConvertUtil.convert(dataTransportDTO.getAfterMap(), new OrderChildMessage()); OrderChild after = DtsMapConvertUtil.convert(dataTransportDTO.getAfterMap(), new OrderChild());
thirdpartySync(DtsMapConvertUtil.convert(dataTransportDTO.getAfterMap(), new OrderChildSyncMessage())); thirdpartySync(DtsMapConvertUtil.convert(dataTransportDTO.getAfterMap(), new OrderChildSyncMessage()));
if(Objects.equals(DtsOperationTypeEnum.INSERT.getCode(),dataTransportDTO.getOperationType().getCode())){ if(Objects.equals(DtsOperationTypeEnum.INSERT.getCode(),dataTransportDTO.getOperationType().getCode())){
syncPerformanceProgress(before,after,DtsOperationTypeEnum.INSERT.getCode());
//同步after数据 //同步after数据
log.info("新增:{}",after); log.info("新增:{}",after);
if(OrderChildEnum.SYNC_STATUS_lIST.contains(after.getStatus()) && !Objects.equals(before.getStatus(),after.getStatus())){ if(OrderChildEnum.SYNC_STATUS_lIST.contains(after.getStatus()) && !Objects.equals(before.getStatus(),after.getStatus())){
...@@ -82,6 +91,7 @@ public class OrderChildDtsListener { ...@@ -82,6 +91,7 @@ public class OrderChildDtsListener {
} }
}else if(Objects.equals(DtsOperationTypeEnum.UPDATE.getCode(),dataTransportDTO.getOperationType().getCode())){ }else if(Objects.equals(DtsOperationTypeEnum.UPDATE.getCode(),dataTransportDTO.getOperationType().getCode())){
log.info("修改:{}",after); log.info("修改:{}",after);
syncPerformanceProgress(before,after,DtsOperationTypeEnum.UPDATE.getCode());
if(OrderChildEnum.SYNC_STATUS_lIST.contains(after.getStatus()) && if(OrderChildEnum.SYNC_STATUS_lIST.contains(after.getStatus()) &&
(!Objects.equals(before.getStatus(),after.getStatus()) || (!Objects.equals(before.getStatus(),after.getStatus()) ||
!Objects.equals(before.getLoadNet(),after.getLoadNet())) || !Objects.equals(before.getLoadNet(),after.getLoadNet())) ||
...@@ -107,12 +117,15 @@ public class OrderChildDtsListener { ...@@ -107,12 +117,15 @@ public class OrderChildDtsListener {
} }
} }
public void orderChildChangeAfter(OrderChild orderChild){
public void orderChildChangeAfter(OrderChildMessage after){ FeignOrderVO orderInfoFeign = orderFeign.getOrderInfoFeign(orderChild.getOrderNo());
FeignOrderVO orderInfoFeign = orderFeign.getOrderInfoFeign(after.getOrderNo());
if (orderInfoFeign == null) { if (orderInfoFeign == null) {
return; return;
} }
OrderChildMessage after = orderChildStruct.convertMessage(orderChild);
//同步交易平台的运单 //同步交易平台的运单
if(Objects.equals(orderInfoFeign.getOrderSource(), SyncPlatformEnum.Source.TRADE_PLATFORM.getCode())){ if(Objects.equals(orderInfoFeign.getOrderSource(), SyncPlatformEnum.Source.TRADE_PLATFORM.getCode())){
...@@ -275,4 +288,26 @@ public class OrderChildDtsListener { ...@@ -275,4 +288,26 @@ public class OrderChildDtsListener {
} }
//同步履约进度表-----运单部分
public void syncPerformanceProgress(OrderChild before,OrderChild after, Integer updateType){
boolean isSend = false;
if(Objects.equals(updateType,DtsOperationTypeEnum.INSERT.getCode())){
isSend = true;
}
if(Objects.equals(updateType,DtsOperationTypeEnum.UPDATE.getCode()) &&
(!Objects.equals(before.getStatus(),after.getStatus()) ||
!Objects.equals(before.getLoadNet(),after.getLoadNet())) ||
!Objects.equals(before.getUnloadNet(),after.getUnloadNet())
){
isSend = true;
}
if(isSend){
log.info("开始发送同步履约进度表消息,订单号:{},运单号:{}", after.getOrderNo(),after.getChildNo());
Message body = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(after)).getBytes()).build();
rabbitTemplate.send(SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_EXCHANGE,
SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_ROUTING_KEY, body);
log.info("结束发送同步履约进度表消息,订单号:{},运单号:{}", after.getOrderNo(),after.getChildNo());
}
}
} }
...@@ -3,6 +3,7 @@ package com.clx.performance.listener; ...@@ -3,6 +3,7 @@ package com.clx.performance.listener;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.clx.order.enums.UpdateEnum; import com.clx.order.enums.UpdateEnum;
import com.clx.order.enums.VehicleUsageEnum; import com.clx.order.enums.VehicleUsageEnum;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.component.GoodsOrderTruckRecordComponent; import com.clx.performance.component.GoodsOrderTruckRecordComponent;
import com.clx.performance.component.OrderCancelComponent; import com.clx.performance.component.OrderCancelComponent;
import com.clx.performance.constant.RabbitKeyConstants; import com.clx.performance.constant.RabbitKeyConstants;
...@@ -11,18 +12,24 @@ import com.clx.performance.dto.dts.DataTransportDTO; ...@@ -11,18 +12,24 @@ import com.clx.performance.dto.dts.DataTransportDTO;
import com.clx.performance.enums.DtsOperationTypeEnum; import com.clx.performance.enums.DtsOperationTypeEnum;
import com.clx.performance.enums.OrderGoodsLogsEnum; import com.clx.performance.enums.OrderGoodsLogsEnum;
import com.clx.performance.enums.OrderGoodsPendingOrderWayStatusEnum; import com.clx.performance.enums.OrderGoodsPendingOrderWayStatusEnum;
import com.clx.performance.enums.OrderGoodsStatusEnum;
import com.clx.performance.model.OrderGoods; import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.OrderGoodsAdjustmentPrice;
import com.clx.performance.service.OrderGoodsLogService; import com.clx.performance.service.OrderGoodsLogService;
import com.msl.common.utils.DtsMapConvertUtil; import com.msl.common.utils.DtsMapConvertUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message; import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Objects; import java.util.Objects;
import static com.clx.performance.constant.RabbitKeyConstants.*;
@Slf4j @Slf4j
@Component @Component
@AllArgsConstructor @AllArgsConstructor
...@@ -32,7 +39,7 @@ public class OrderGoodsDtsListener { ...@@ -32,7 +39,7 @@ public class OrderGoodsDtsListener {
private final GoodsOrderTruckRecordComponent goodsOrderTruckRecordComponent; private final GoodsOrderTruckRecordComponent goodsOrderTruckRecordComponent;
private final OrderGoodsDao orderGoodsDao; private final OrderGoodsDao orderGoodsDao;
private final OrderGoodsLogService orderGoodsLogService; private final OrderGoodsLogService orderGoodsLogService;
private final RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitKeyConstants.CLX_PERFORMANCE_ORDER_GOODS_QUEUE) @RabbitListener(queues = RabbitKeyConstants.CLX_PERFORMANCE_ORDER_GOODS_QUEUE)
...@@ -46,9 +53,13 @@ public class OrderGoodsDtsListener { ...@@ -46,9 +53,13 @@ public class OrderGoodsDtsListener {
if(Objects.equals(DtsOperationTypeEnum.INSERT.getCode(),dataTransportDTO.getOperationType().getCode())){ if(Objects.equals(DtsOperationTypeEnum.INSERT.getCode(),dataTransportDTO.getOperationType().getCode())){
//同步after数据 //同步after数据
log.info("新增:{}",JSON.toJSONString(after)); log.info("新增:{}",JSON.toJSONString(after));
syncPerformanceProgress(before,after,DtsOperationTypeEnum.INSERT.getCode());
sendSaveOrderGoodsAdjustmentPriceMessage(before,after,DtsOperationTypeEnum.INSERT.getCode());
}else if(Objects.equals(DtsOperationTypeEnum.UPDATE.getCode(),dataTransportDTO.getOperationType().getCode())){ }else if(Objects.equals(DtsOperationTypeEnum.UPDATE.getCode(),dataTransportDTO.getOperationType().getCode())){
log.info("修改:{}",JSON.toJSONString(after)); log.info("修改:{}",JSON.toJSONString(after));
backFillOrderWeight(after); backFillOrderWeight(after);
syncPerformanceProgress(before,after,DtsOperationTypeEnum.UPDATE.getCode());
sendSaveOrderGoodsAdjustmentPriceMessage(before,after,DtsOperationTypeEnum.UPDATE.getCode());
}else if(Objects.equals(DtsOperationTypeEnum.DELETE.getCode(),dataTransportDTO.getOperationType().getCode())){ }else if(Objects.equals(DtsOperationTypeEnum.DELETE.getCode(),dataTransportDTO.getOperationType().getCode())){
//数据删除 //数据删除
log.info("删除:{}",JSON.toJSONString(before)); log.info("删除:{}",JSON.toJSONString(before));
...@@ -82,4 +93,66 @@ public class OrderGoodsDtsListener { ...@@ -82,4 +93,66 @@ public class OrderGoodsDtsListener {
after.getOrderNo(),after.getOrderGoodsNo(),after.getResidueTransportWeight()); after.getOrderNo(),after.getOrderGoodsNo(),after.getResidueTransportWeight());
} }
} }
public void syncPerformanceProgress(OrderGoods before,OrderGoods after, Integer updateType) {
boolean isSend = false;
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.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());
}
}
}
//保存货单调价记录
public void sendSaveOrderGoodsAdjustmentPriceMessage(OrderGoods before,OrderGoods after, Integer updateType){
boolean isSend = false;
//插入的货单是挂单中状态的
if(Objects.equals(updateType,DtsOperationTypeEnum.INSERT.getCode()) &&
Objects.equals(after.getOrderGoodsStatus(),OrderGoodsStatusEnum.Status.PAYING.getCode())){
isSend = true;
}
//货单状态发生变化(从已挂单变成挂单中) || 挂单中状态的挂单运费发生变化
if(Objects.equals(updateType,DtsOperationTypeEnum.UPDATE.getCode()) &&
//货单状态发生变化(从已挂单变成挂单中)
(
(Objects.equals(before.getOrderGoodsStatus(),OrderGoodsStatusEnum.Status.CREATED.getCode()) &&
Objects.equals(before.getOrderGoodsStatus(),OrderGoodsStatusEnum.Status.PAYING.getCode()))
|| //挂单中之后的状态的挂单运费发生变化
(after.getOrderGoodsStatus() >= OrderGoodsStatusEnum.Status.PAYING.getCode() &&
!Objects.equals(before.getPendingOrderFreight(),after.getPendingOrderFreight()))
)
){
isSend = true;
}
if(isSend){
log.info("开始发送货单调整挂单运费消息,订单号:{},货单号:{}", after.getOrderNo(),after.getOrderGoodsNo());
OrderGoodsAdjustmentPrice message = new OrderGoodsAdjustmentPrice();
message.setOrderNo(after.getOrderNo());
message.setOrderGoodsNo(after.getOrderGoodsNo());
message.setAmount(after.getPendingOrderFreight());
message.setPreAmount(Objects.nonNull(before) ? before.getPendingOrderFreight() : BigDecimal.ZERO);
Message body = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(message)).getBytes()).build();
rabbitTemplate.send(SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_EXCHANGE,
SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_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.OrderGoodsAdjustmentPrice;
import com.clx.performance.service.OrderGoodsAdjustmentPriceService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.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 SaveOrderGoodsAdjustmentPriceListener {
private final OrderGoodsAdjustmentPriceService orderGoodsAdjustmentPriceService;
@RabbitListener(queues = RabbitKeyConstants.SAVE_ORDER_GOODS_ADJUSTMENT_PRICE_QUEUE)
public void onMessage(Message message) {
try{
log.info("监听到保存货单挂单运费调整记录,消息内容{}", new String(message.getBody()));
OrderGoodsAdjustmentPrice data = JSON.parseObject(new String(message.getBody()),
new TypeReference<MqWrapper<OrderGoodsAdjustmentPrice>>() {
}).getData();
orderGoodsAdjustmentPriceService.saveOrderGoodsAdjustmentPrice(data);
}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.OrderChild;
import com.clx.performance.service.PerformanceProgressService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.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 SyncPerformanceProgress4OrderChildListener {
private final PerformanceProgressService performanceProgressService;
@RabbitListener(queues = RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_CHILD_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();
performanceProgressService.dealPerformanceProgress4OrderChild(data);
}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.PerformanceProgressService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.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 SyncPerformanceProgress4OrderGoodsListener {
private final PerformanceProgressService performanceProgressService;
@RabbitListener(queues = RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_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();
performanceProgressService.dealPerformanceProgress4OrderGoods(data);
}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.open.sdk.callback.message.OrderInfoMessage;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.service.PerformanceProgressService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.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 SyncPerformanceProgress4OrderInfoListener {
private final PerformanceProgressService performanceProgressService;
@RabbitListener(queues = RabbitKeyConstants.SYNC_PERFORMANCE_PROGRESS_FOR_ORDER_INFO_QUEUE)
public void onMessage(Message message) {
try{
log.info("监听到同步履约进度表---订单信息部分,消息内容{}", new String(message.getBody()));
OrderInfoMessage data = JSON.parseObject(new String(message.getBody()),
new TypeReference<MqWrapper<OrderInfoMessage>>() {
}).getData();
performanceProgressService.dealPerformanceProgress4OrderInfo(data);
}catch (Exception e){
log.info("监听到同步履约进度表---订单信息部分发生异常,异常原因:{}", ExceptionUtils.getStackTrace(e));
}
}
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.OrderGoodsAdjustmentPrice;
/**
* @author kavin
* Date 2024-07-18
* Time 17:04
*/
public interface OrderGoodsAdjustmentPriceMapper extends BaseMapper<OrderGoodsAdjustmentPrice> {
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.PerformanceProgressLog;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
public interface PerformanceProgressLogMapper extends BaseMapper<PerformanceProgressLog> {
}
package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.PerformanceProgress;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
public interface PerformanceProgressMapper extends BaseMapper<PerformanceProgress> {
}
package com.clx.performance.model;
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.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author kavin
* Date 2024-07-18
* Time 17:04
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("order_goods_adjustment_price")
public class OrderGoodsAdjustmentPrice implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("order_no")
@ApiModelProperty("订单编号")
private String orderNo;
@TableField("order_goods_no")
@ApiModelProperty("货单编码")
private String orderGoodsNo;
@TableField("pre_amount")
@ApiModelProperty("上次金额 ")
private BigDecimal preAmount;
@TableField("amount")
@ApiModelProperty("本次调价金额")
private BigDecimal amount;
@TableField("create_time")
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@Override
@KeyColumn("id")
public Integer gainKey() {
return this.id;
}
}
package com.clx.performance.model;
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.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("performance_progress")
public class PerformanceProgress implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("seq")
@ApiModelProperty("排序")
private Long seq;
@TableField("order_no")
@ApiModelProperty("订单编号")
private String orderNo;
@TableField("order_status")
@ApiModelProperty("订单状态: 0待报价 1客户确认中 2报价已确认 3平台已承接 4已取消 5暂停 6拒绝承运 7 挂单中 8运输中 9订单已完成 10 已失效")
private Integer orderStatus;
@TableField("send_address_id")
@ApiModelProperty("发货-地址id")
private Integer sendAddressId;
@TableField("send_address_shorter")
@ApiModelProperty("货源地简称")
private String sendAddressShorter;
@TableField("send_system_address_id")
@ApiModelProperty("货源地-标准地址id")
private Integer sendSystemAddressId;
@TableField("send_system_address_shorter")
@ApiModelProperty("货源地-标准地址简称")
private String sendSystemAddressShorter;
@TableField("senior_logistics_manager_name")
@ApiModelProperty("高级物流经理姓名数组")
private String seniorLogisticsManagerName;
@TableField("goods_type_code")
@ApiModelProperty("货物类型编码")
private String goodsTypeCode;
@TableField("goods_type_name")
@ApiModelProperty("货物类型名称")
private String goodsTypeName;
@TableField("goods_name_id")
@ApiModelProperty("货物名称id")
private Integer goodsNameId;
@TableField("goods_name")
@ApiModelProperty("货物名称")
private String goodsName;
@TableField("send_address")
@ApiModelProperty("煤源位置")
private String sendAddress;
@TableField("send_over_standard")
@ApiModelProperty("是否C类煤源 0 否 1 是")
private Integer sendOverStandard;
@TableField("driver_freight_price")
@ApiModelProperty("司机运费")
private BigDecimal driverFreightPrice;
@TableField("task_weight")
@ApiModelProperty("任务吨数")
private BigDecimal taskWeight;
@TableField("pending_weight")
@ApiModelProperty("挂单吨数")
private BigDecimal pendingWeight;
@TableField("ordered_truck_num")
@ApiModelProperty("接单车数")
private Integer orderedTruckNum;
@TableField("arrive_send_truck_num")
@ApiModelProperty("到达货源地车数")
private Integer arriveSendTruckNum;
@TableField("load_truck_num")
@ApiModelProperty("装车车数")
private Integer loadTruckNum;
@TableField("unload_truck_num")
@ApiModelProperty("卸车车数")
private Integer unloadTruckNum;
@TableField("on_the_way_truck_num")
@ApiModelProperty("在途车数")
private Integer onTheWayTruckNum;
@TableField("ordered_rate")
@ApiModelProperty("接单率")
private BigDecimal orderedRate;
@TableField("task_complete_ratio")
@ApiModelProperty("任务完成率")
private BigDecimal taskCompleteRatio;
@TableField("sum_load_weight")
@ApiModelProperty("矿发吨数")
private BigDecimal sumLoadWeight;
@TableField("sum_unload_weight")
@ApiModelProperty("到站吨数")
private BigDecimal sumUnloadWeight;
@TableField("sum_on_the_way_weight")
@ApiModelProperty("在途吨数")
private BigDecimal sumOnTheWayWeight;
@TableField("today_expect_complete")
@ApiModelProperty("今日预计完成吨数")
private BigDecimal todayExpectComplete;
@TableField("abnormal_remark")
@ApiModelProperty("异常备注")
private String abnormalRemark;
@TableField("performance_abnormal_reason")
@ApiModelProperty("履约异常原因")
private String performanceAbnormalReason;
@TableField("dispatch_follow")
@ApiModelProperty("调度备注/跟进措施")
private String dispatchFollow;
@TableField("order_distance")
@ApiModelProperty("重车运距(公里)")
private BigDecimal orderDistance;
@TableField("transport_time_slot")
@ApiModelProperty("可拉运时间段")
private String transportTimeSlot;
@TableField("pending_time")
@ApiModelProperty("挂单时间")
private LocalDateTime pendingTime;
@TableField("trade_require_arrive_station_time")
@ApiModelProperty("交易要求到站时间")
private String tradeRequireArriveStationTime;
@TableField("transport_expect_arrive_station_time")
@ApiModelProperty("物流预计到站时间")
private String transportExpectArriveStationTime;
@TableField("prediction_freight_price")
@ApiModelProperty("测算运费")
private BigDecimal predictionFreightPrice;
@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.model;
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-07-12
* Time 16:02
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("performance_progress_log")
public class PerformanceProgressLog implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("order_no")
@ApiModelProperty("订单编号")
private String orderNo;
@TableField("operate_type")
@ApiModelProperty("操作类型")
private Integer operateType;
@TableField("operate_content")
@ApiModelProperty("操作内容")
private String operateContent;
@TableField("create_by")
@ApiModelProperty("操作人编号")
private Long createBy;
@TableField("create_name")
@ApiModelProperty("操作人名称")
private String createName;
@TableField("create_time")
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@Override
@KeyColumn("id")
public Integer gainKey() {
return this.id;
}
}
...@@ -107,4 +107,6 @@ public interface OrderChildService { ...@@ -107,4 +107,6 @@ public interface OrderChildService {
List<OrderChildExpectDTO> getOrderChildExpect(String orderChildNo); List<OrderChildExpectDTO> getOrderChildExpect(String orderChildNo);
void cacheOrderChildExpectData(String childNo, OrderChildExpectDTO expect); void cacheOrderChildExpectData(String childNo, OrderChildExpectDTO expect);
List<HistoryLineTranVolumeChartVO> getHistoryLineTransportVolume(String orderNo);
} }
package com.clx.performance.service;
import com.clx.performance.model.OrderGoodsAdjustmentPrice;
import com.clx.performance.vo.pc.DriverFreightPriceChartVO;
import java.math.BigDecimal;
import java.util.List;
/**
* @author kavin
* Date 2024-07-18
* Time 17:04
*/
public interface OrderGoodsAdjustmentPriceService {
void saveOrderGoodsAdjustmentPrice(OrderGoodsAdjustmentPrice item);
List<DriverFreightPriceChartVO> getDriverFreightPriceChart(String orderNo);
List<DriverFreightPriceChartVO> getAdjacentPosDuplicateRemoveAdjustmentPriceRecord(List<String> orderNoList);
List<BigDecimal> getNoRepeatAdjustmentPriceRecord(List<String> orderNoList);
}
...@@ -11,7 +11,9 @@ import com.clx.performance.param.pc.*; ...@@ -11,7 +11,9 @@ import com.clx.performance.param.pc.*;
import com.clx.performance.vo.app.OrderGoodsAPPVO; import com.clx.performance.vo.app.OrderGoodsAPPVO;
import com.clx.performance.vo.feign.FreightEstimateVO; import com.clx.performance.vo.feign.FreightEstimateVO;
import com.clx.performance.vo.feign.OrderGoodsFeignVO; import com.clx.performance.vo.feign.OrderGoodsFeignVO;
import com.clx.performance.vo.pc.DriverFreightPriceVO;
import com.clx.performance.vo.pc.OrderGoodsEditVO; import com.clx.performance.vo.pc.OrderGoodsEditVO;
import com.clx.performance.vo.pc.OrderGoodsPendingVO;
import com.clx.performance.vo.pc.OrderGoodsVO; import com.clx.performance.vo.pc.OrderGoodsVO;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -108,4 +110,8 @@ public interface OrderGoodsService { ...@@ -108,4 +110,8 @@ public interface OrderGoodsService {
void updateFrightPrice(String orderGoodsNo,BigDecimal pendingOrderFreight); void updateFrightPrice(String orderGoodsNo,BigDecimal pendingOrderFreight);
BigDecimal cancelOrderGoods(CancelOrderGoodsParam param); BigDecimal cancelOrderGoods(CancelOrderGoodsParam param);
List<DriverFreightPriceVO> getDriverFreightPriceList(String orderNo);
List<OrderGoodsPendingVO> getOrderGoodsPendingList(String orderNo);
} }
package com.clx.performance.service;
import com.clx.performance.enums.PerformanceProgressEnum;
import com.clx.performance.model.PerformanceProgressLog;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
public interface PerformanceProgressLogService {
PerformanceProgressLog generateLog(String orderNo, PerformanceProgressEnum.LogType logType, Object content,
Long userNo, String userName);
}
package com.clx.performance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.clx.open.sdk.callback.message.OrderInfoMessage;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.PerformanceProgress;
import com.clx.performance.param.pc.carrier.PagePerformanceProgress;
import com.clx.performance.param.pc.carrier.UpdatePerformanceProgressParam;
import com.clx.performance.vo.pc.PerformanceProgressDetailVO;
import com.clx.performance.vo.pc.PerformanceProgressOperationLogVO;
import com.clx.performance.vo.pc.PerformanceProgressVO;
import java.util.List;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
public interface PerformanceProgressService {
IPage<PerformanceProgressVO> pagePerformanceProgress(PagePerformanceProgress param);
void updateAdjustOrder(Integer adjustOrderId, Integer adjustOrderBeforeId);
void saveOrUpdatePerformanceProgress(PerformanceProgress item);
void updatePerformanceProgress(UpdatePerformanceProgressParam param, Long userNo, String userName);
PerformanceProgressDetailVO getPerformanceProgressDetail(Integer id);
List<PerformanceProgressOperationLogVO> getOperationLog(String orderNo);
void dealPerformanceProgress4OrderInfo(OrderInfoMessage data);
void dealPerformanceProgress4OrderGoods(OrderGoods data);
void dealPerformanceProgress4OrderChild(OrderChild data);
}
...@@ -4,10 +4,9 @@ import cn.hutool.json.JSONUtil; ...@@ -4,10 +4,9 @@ import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.order.enums.InvoicingCompanyEnum;
import com.clx.order.enums.OrderEnum; import com.clx.order.enums.OrderEnum;
import com.clx.order.enums.QuotationEnum; import com.clx.order.enums.ResultEnum;
import com.clx.order.enums.VehicleUsageEnum; import com.clx.order.enums.*;
import com.clx.order.feign.OrderFeign; import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignAddressVO; import com.clx.order.vo.feign.FeignAddressVO;
import com.clx.order.vo.feign.FeignOrderInfoVO; import com.clx.order.vo.feign.FeignOrderInfoVO;
...@@ -230,6 +229,9 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -230,6 +229,9 @@ public class OrderChildServiceImpl implements OrderChildService {
@Autowired @Autowired
private QuotationService quotationService; private QuotationService quotationService;
@Autowired
OrderGoodsAdjustmentPriceService orderGoodsAdjustmentPriceService;
@Autowired @Autowired
private OcrRecognitionDao ocrRecognitionDao; private OcrRecognitionDao ocrRecognitionDao;
@Autowired @Autowired
...@@ -2999,4 +3001,45 @@ public class OrderChildServiceImpl implements OrderChildService { ...@@ -2999,4 +3001,45 @@ 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;
}
} }
package com.clx.performance.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.clx.order.enums.ResultEnum;
import com.clx.order.feign.OrderFeign;
import com.clx.performance.dao.OrderGoodsAdjustmentPriceDao;
import com.clx.performance.extranal.user.OrderService;
import com.clx.performance.model.OrderGoodsAdjustmentPrice;
import com.clx.performance.service.OrderGoodsAdjustmentPriceService;
import com.clx.performance.vo.pc.DriverFreightPriceChartVO;
import com.msl.common.base.Optional;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.DateUtils;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @author kavin
* Date 2024-07-18
* Time 17:04
*/
@Service
@Slf4j
@AllArgsConstructor
public class OrderGoodsAdjustmentPriceServiceImpl implements OrderGoodsAdjustmentPriceService {
private final OrderGoodsAdjustmentPriceDao orderGoodsAdjustmentPriceDao;
private final OrderFeign orderFeign;
private final OrderService orderService;
@Transactional(rollbackFor = Exception.class)
@Override
public void saveOrderGoodsAdjustmentPrice(OrderGoodsAdjustmentPrice item){
orderGoodsAdjustmentPriceDao.saveEntity(item);
}
@Override
public List<DriverFreightPriceChartVO> getDriverFreightPriceChart(String orderNo) {
//查询近一个月与该订单收发货地线路一致的订单
Optional<List<String>> result = orderService.getMonthSameLineOrderList(orderNo);
if(!result.isPresent()){
log.warn("通过订单号:{} 查找相同线路的订单列列表,返回结果:{}",orderNo,result);
throw new ServiceSystemException(ResultEnum.DATA_ERROR,"获取相同线路的订单列表失败");
}
//相邻位置相同则取同一条
return this.getAdjacentPosDuplicateRemoveAdjustmentPriceRecord(result.get());
}
@Override
public List<DriverFreightPriceChartVO> getAdjacentPosDuplicateRemoveAdjustmentPriceRecord(List<String> orderNoList){
List<OrderGoodsAdjustmentPrice> list = orderGoodsAdjustmentPriceDao.selectByOrderNoList(orderNoList);
List<DriverFreightPriceChartVO> chartResult = new ArrayList<>();
//相邻的多条记录调价相同,则保留一条,不相同则生成新的一条
if(CollectionUtil.isNotEmpty(list)){
DriverFreightPriceChartVO chart;
BigDecimal preAdjustmentPrice = BigDecimal.ZERO;
for (OrderGoodsAdjustmentPrice item : list) {
//上次的价格和本次的价格发生了变化
if(preAdjustmentPrice.compareTo(item.getAmount()) != 0){
chart = new DriverFreightPriceChartVO();
chart.setPendingOrderFreight(item.getAmount());
chart.setCreatTime(DateUtils.formatDateTime(item.getCreateTime()).get());
chartResult.add(chart);
preAdjustmentPrice = item.getAmount();
}
}
}
return chartResult;
}
@Override
public List<BigDecimal> getNoRepeatAdjustmentPriceRecord(List<String> orderNoList){
List<OrderGoodsAdjustmentPrice> list = orderGoodsAdjustmentPriceDao.selectByOrderNoList(orderNoList);
List<BigDecimal> chartResult = new ArrayList<>();
//相邻的多条记录调价相同,则保留一条,不相同则生成新的一条
if(CollectionUtil.isNotEmpty(list)){
for (OrderGoodsAdjustmentPrice item : list) {
//去重操作
if(!chartResult.contains(item.getAmount())){
chartResult.add(item.getAmount());
}
}
}
return chartResult;
}
}
...@@ -40,11 +40,12 @@ import com.clx.performance.vo.app.OrderGoodsAPPVO; ...@@ -40,11 +40,12 @@ import com.clx.performance.vo.app.OrderGoodsAPPVO;
import com.clx.performance.vo.feign.FreightEstimateVO; import com.clx.performance.vo.feign.FreightEstimateVO;
import com.clx.performance.vo.feign.OrderGoodsFeignVO; import com.clx.performance.vo.feign.OrderGoodsFeignVO;
import com.clx.performance.vo.mq.OrderTruckBindCancelParam; import com.clx.performance.vo.mq.OrderTruckBindCancelParam;
import com.clx.performance.vo.pc.DriverFreightPriceVO;
import com.clx.performance.vo.pc.OrderGoodsEditVO; import com.clx.performance.vo.pc.OrderGoodsEditVO;
import com.clx.performance.vo.pc.OrderGoodsPendingVO;
import com.clx.performance.vo.pc.OrderGoodsVO; import com.clx.performance.vo.pc.OrderGoodsVO;
import com.clx.user.enums.driver.DriverInfoEnum; import com.clx.user.enums.driver.DriverInfoEnum;
import com.clx.user.feign.UserClxFeign; import com.clx.user.feign.UserClxFeign;
import com.github.mustachejava.ObjectHandler;
import com.msl.common.base.Optional; import com.msl.common.base.Optional;
import com.msl.common.enums.ResultCodeEnum; import com.msl.common.enums.ResultCodeEnum;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
...@@ -1069,4 +1070,19 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea ...@@ -1069,4 +1070,19 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea
return totalCancelWeight; return totalCancelWeight;
} }
@Override
public List<DriverFreightPriceVO> getDriverFreightPriceList(String orderNo) {
List<OrderGoods> orderGoods = orderGoodsDao.listAfterCreatedByOrderNo(orderNo);
return orderGoodsStruct.convertDriverFreightList(orderGoods);
}
@Override
public List<OrderGoodsPendingVO> getOrderGoodsPendingList(String orderNo) {
List<OrderGoods> orderGoods = orderGoodsDao.listAfterCreatedByOrderNo(orderNo);
//升序排序
List<OrderGoods> sort = orderGoods.stream().sorted(Comparator.comparing(OrderGoods::getPendingOrderTime))
.collect(Collectors.toList());
return orderGoodsStruct.convertOrderGoodsPendingList(sort);
}
} }
package com.clx.performance.service.impl;
import com.clx.performance.enums.PerformanceProgressEnum;
import com.clx.performance.model.PerformanceProgressLog;
import com.clx.performance.service.PerformanceProgressLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
@Service
@Slf4j
public class PerformanceProgressLogServiceImpl implements PerformanceProgressLogService {
@Override
public PerformanceProgressLog generateLog(String orderNo, PerformanceProgressEnum.LogType logType,
Object content, Long userNo, String userName) {
PerformanceProgressLog log = new PerformanceProgressLog();
log.setOrderNo(orderNo);
log.setOperateType(logType.getCode());
log.setOperateContent(logType.getName() + ":" + content);
log.setCreateBy(userNo);
log.setCreateName(userName);
return log;
}
}
package com.clx.performance.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.open.sdk.callback.message.OrderInfoMessage;
import com.clx.order.vo.feign.FeignAddressVO;
import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.order.vo.feign.SystemAddressVO;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.PerformanceProgressDao;
import com.clx.performance.dao.PerformanceProgressLogDao;
import com.clx.performance.dto.gd.GdRouteDTO;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.enums.OrderEnum;
import com.clx.performance.enums.PerformanceProgressEnum;
import com.clx.performance.enums.ResultEnum;
import com.clx.performance.extranal.user.AddressService;
import com.clx.performance.extranal.user.OrderService;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.PerformanceProgress;
import com.clx.performance.model.PerformanceProgressLog;
import com.clx.performance.param.pc.carrier.PagePerformanceProgress;
import com.clx.performance.param.pc.carrier.UpdatePerformanceProgressParam;
import com.clx.performance.service.PerformanceProgressLogService;
import com.clx.performance.service.PerformanceProgressService;
import com.clx.performance.struct.PerformanceProgressLogStruct;
import com.clx.performance.struct.PerformanceProgressStruct;
import com.clx.performance.utils.gd.GdService;
import com.clx.performance.vo.pc.PerformanceProgressDetailVO;
import com.clx.performance.vo.pc.PerformanceProgressOperationLogVO;
import com.clx.performance.vo.pc.PerformanceProgressVO;
import com.msl.common.base.Optional;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.DateUtils;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
/**
* @author kavin
* Date 2024-07-12
* Time 16:02
*/
@Service
@Slf4j
@AllArgsConstructor
public class PerformanceProgressServiceImpl implements PerformanceProgressService {
private final PerformanceProgressDao performanceProgressDao;
private final PerformanceProgressStruct performanceProgressStruct;
private final PerformanceProgressLogDao performanceProgressLogDao;
private final PerformanceProgressLogStruct performanceProgressLogStruct;
private final PerformanceProgressLogService performanceProgressLogService;
private final AddressService addressService;
private final GdService gdService;
private final OrderGoodsDao orderGoodsDao;
private final OrderChildDao orderChildDao;
private final OrderService orderService;
public static List<Integer> inProcessStatusList;
public static List<Integer> endStatusList ;
public static List<Integer> allStatusList ;
static {
inProcessStatusList = Arrays.asList(
OrderEnum.Status.PLATFORM_UNDERTAKING.getCode(),
OrderEnum.Status.SUSPEND.getCode(),
OrderEnum.Status.ON_ORDER.getCode(),
OrderEnum.Status.IN_TRANSIT.getCode());
endStatusList = Arrays.asList(
OrderEnum.Status.SUCCESS.getCode(),
OrderEnum.Status.COMPLETED.getCode());
allStatusList = Arrays.asList(
OrderEnum.Status.PLATFORM_UNDERTAKING.getCode(),
OrderEnum.Status.SUSPEND.getCode(),
OrderEnum.Status.ON_ORDER.getCode(),
OrderEnum.Status.IN_TRANSIT.getCode(),
OrderEnum.Status.SUCCESS.getCode(),
OrderEnum.Status.COMPLETED.getCode());
}
@Override
public IPage<PerformanceProgressVO> pagePerformanceProgress(PagePerformanceProgress param) {
IPage<PerformanceProgress> page = new Page<>();
IPage<PerformanceProgressVO> returnPage = new Page<>();
if(Objects.equals(param.getTab(), PerformanceProgressEnum.Tab.IN_PROCESS.getCode())){
param.setPage(1);
param.setPageSize(10000);
page = performanceProgressDao.pagePerformanceProgress(inProcessStatusList,param);
}else if(Objects.equals(param.getTab(), PerformanceProgressEnum.Tab.END.getCode())){
page = performanceProgressDao.pagePerformanceProgress(endStatusList,param);
}else if(Objects.equals(param.getTab(), PerformanceProgressEnum.Tab.ALL.getCode())){
page = performanceProgressDao.pagePerformanceProgress(allStatusList,param);
}
if(CollectionUtils.isEmpty(page.getRecords())){
return returnPage;
}
List<PerformanceProgressVO> records = performanceProgressStruct.convertList(page.getRecords());
returnPage.setPages(page.getPages());
returnPage.setTotal(page.getTotal());
returnPage.setRecords(records);
//如果查询的是 已结束线路,则不需要计算,直接返回
if(Objects.equals(param.getTab(), PerformanceProgressEnum.Tab.END.getCode())){
return returnPage;
}
returnPage.getRecords().forEach(item ->{
//TODO 进行订单运费预估调用 开发批量调用的接口。 订单完结完成后把运费预估查询出来的数据存入到数据库,后续不再实时查询
if(inProcessStatusList.contains(item.getOrderStatus())){ //进行中的订单线路
}
});
return returnPage;
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateAdjustOrder(Integer adjustOrderId, Integer adjustOrderBeforeId) {
Optional<PerformanceProgress> one = performanceProgressDao.getEntityByKey(adjustOrderId);
//如果上调,这条记录传的是移动数据后面的记录id,如果下调,这条记录传的是移动数据前面的记录id
Optional<PerformanceProgress> two = performanceProgressDao.getEntityByKey(adjustOrderBeforeId);
if(!one.isPresent() || !two.isPresent()){
throw new ServiceSystemException(ResultEnum.DATA_NOT_FIND);
}
boolean isUp = false;
//通过seq判断是上调还是下调
if(one.get().getSeq() < two.get().getSeq()){
isUp = true;
}
//上调:大于two 这条记录的seq + 1 ; 下调:大于等于two这条记录的seq + 1 ;
performanceProgressDao.updateRecordOrder(two.get().getSeq(),isUp);
if(isUp){ //上调
//调整的记录使用 two 的seq + 1;
PerformanceProgress updateOne = new PerformanceProgress();
updateOne.setId(one.get().getId());
updateOne.setSeq(two.get().getSeq() + 1);
performanceProgressDao.updateEntityByKey(updateOne);
}else{ //下调
//调整的记录使用 two 的seq;
PerformanceProgress updateOne = new PerformanceProgress();
updateOne.setId(one.get().getId());
updateOne.setSeq(two.get().getSeq());
performanceProgressDao.updateEntityByKey(updateOne);
}
}
//通过dts监听订单、货单、运单表进行更新履约进度表的数据
@Override
public void saveOrUpdatePerformanceProgress(PerformanceProgress item) {
Optional<PerformanceProgress> optional = performanceProgressDao.getOneByField(PerformanceProgress::getOrderNo,
item.getOrderNo());
if(optional.isPresent()){
item.setId(optional.get().getId());
performanceProgressDao.updateEntityByKey(item);
}else{
performanceProgressDao.saveEntity(item);
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updatePerformanceProgress(UpdatePerformanceProgressParam param, Long userNo, String userName) {
PerformanceProgress item = performanceProgressDao.getEntityByKey(param.getId()).
orElseThrow(ResultEnum.DATA_NOT_FIND);
PerformanceProgress update = new PerformanceProgress();
update.setId(param.getId());
List<PerformanceProgressLog> logs = new ArrayList<>();
boolean change = false;
BigDecimal todayExpectComplete = Objects.nonNull(item.getTodayExpectComplete())
?item.getTodayExpectComplete():BigDecimal.ZERO;
if(Objects.nonNull(param.getTodayExpectComplete())
&& todayExpectComplete.compareTo(param.getTodayExpectComplete()) != 0){
PerformanceProgressLog log = performanceProgressLogService.generateLog(item.getOrderNo(),
PerformanceProgressEnum.LogType.TODAY_EXPECT_COMPLETE,
param.getTodayExpectComplete(),userNo,userName);
update.setTodayExpectComplete(param.getTodayExpectComplete());
logs.add(log);
change = true;
}
if(!StringUtils.equals(item.getTradeRequireArriveStationTime(),param.getTradeRequireArriveStationTime())){
PerformanceProgressLog log = performanceProgressLogService.generateLog(item.getOrderNo(),
PerformanceProgressEnum.LogType.TRADE_REQUIRE_ARRIVE_STATION_TIME,
param.getTradeRequireArriveStationTime(),userNo,userName);
update.setTradeRequireArriveStationTime(param.getTradeRequireArriveStationTime());
logs.add(log);
change = true;
}
if(!StringUtils.equals(item.getTransportExpectArriveStationTime(),param.getTransportExpectArriveStationTime())){
PerformanceProgressLog log = performanceProgressLogService.generateLog(item.getOrderNo(),
PerformanceProgressEnum.LogType.TRADE_REQUIRE_ARRIVE_STATION_TIME,
param.getTransportExpectArriveStationTime(),userNo,userName);
update.setTransportExpectArriveStationTime(param.getTransportExpectArriveStationTime());
logs.add(log);
change = true;
}
if(!StringUtils.equals(item.getAbnormalRemark(),param.getAbnormalRemark())){
PerformanceProgressLog log = performanceProgressLogService.generateLog(item.getOrderNo(),
PerformanceProgressEnum.LogType.ABNORMAL_REMARK,
param.getAbnormalRemark(),userNo,userName);
update.setAbnormalRemark(param.getAbnormalRemark());
logs.add(log);
change = true;
}
if(!StringUtils.equals(item.getPerformanceAbnormalReason(),param.getPerformanceAbnormalReason())){
PerformanceProgressLog log = performanceProgressLogService.generateLog(item.getOrderNo(),
PerformanceProgressEnum.LogType.PERFORMANCE_ABNORMAL_REASON,
param.getPerformanceAbnormalReason(),userNo,userName);
update.setPerformanceAbnormalReason(param.getPerformanceAbnormalReason());
logs.add(log);
change = true;
}
if(!StringUtils.equals(item.getDispatchFollow(),param.getDispatchFollow())){
PerformanceProgressLog log = performanceProgressLogService.generateLog(item.getOrderNo(),
PerformanceProgressEnum.LogType.DISPATCH_FOLLOW,
param.getDispatchFollow(),userNo,userName);
update.setDispatchFollow(param.getDispatchFollow());
logs.add(log);
change = true;
}
if(change){
performanceProgressDao.updateEntityByKey(update);
performanceProgressLogDao.saveBatchList(logs);
}
}
@Override
public PerformanceProgressDetailVO getPerformanceProgressDetail(Integer id) {
PerformanceProgress item = performanceProgressDao.getEntityByKey(id).orElseThrow(ResultEnum.DATA_NOT_FIND);
return performanceProgressStruct.convert(item);
}
@Override
public List<PerformanceProgressOperationLogVO> getOperationLog(String orderNo) {
List<PerformanceProgressLog> list = performanceProgressLogDao.getOperationLog(orderNo);
return performanceProgressLogStruct.convertList(list);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void dealPerformanceProgress4OrderInfo(OrderInfoMessage data) {
//如果取消,删除履约进度表这条记录
if(Objects.equals(data.getOrderStatus(),OrderEnum.Status.CANCELED.getCode())){
performanceProgressDao.deleteByField(PerformanceProgress::getOrderNo,data.getOrderNo());
}
Optional<PerformanceProgress> optional = performanceProgressDao.getOneByField(PerformanceProgress::getOrderNo,
data.getOrderNo());
PerformanceProgress item = new PerformanceProgress();
item.setOrderStatus(data.getOrderStatus());
item.setGoodsTypeCode(data.getGoodsTypeCode());
item.setGoodsTypeName(data.getGoodsTypeName());
item.setGoodsNameId(data.getGoodsNameId());
item.setGoodsName(data.getGoodsName());
item.setSendOverStandard(data.getOverWeight());
item.setTaskWeight(data.getTransportWeight().subtract(new BigDecimal(35)));
item.setPendingWeight(data.getTransportWeight().subtract(data.getResidueWeight()));
item.setTransportTimeSlot(DateUtils.formatDateTime(data.getTransportBeginTime()).get() + "至" +
DateUtils.formatDateTime(data.getTransportEndTime()).get());
if(Objects.equals(data.getOrderStatus(),OrderEnum.Status.COMPLETED.getCode()) ||
Objects.equals(data.getOrderStatus(),OrderEnum.Status.SUCCESS.getCode())
){
//TODO 计算测算运费
}
if(optional.isPresent()){
item.setId(optional.get().getId());
if(Objects.nonNull(data.getSendSystemAddressId()) &&
!Objects.equals(optional.get().getSendSystemAddressId(),data.getSendSystemAddressId())){
item.setSendSystemAddressId(data.getSendSystemAddressId());
item.setSendSystemAddressShorter(getSystemAddressShorter(data.getSendSystemAddressId()));
}
performanceProgressDao.updateEntityByKey(item);
}else{
//查询最大的seq
long seq = performanceProgressDao.getMaxSeq();
item.setSeq(seq + 1);
Optional<FeignAddressVO> sendAndReceiveAddress = addressService.getSendAndReceiveAddress(
data.getSendAddressId(), data.getReveiveAddressId());
if (!sendAndReceiveAddress.isPresent()) {
log.warn("通过发货地址Id:{},收货地址Id:{} 查询对应的地址信息结果:{}",
data.getSendAddressId(),data.getReveiveAddressId(),sendAndReceiveAddress);
throw new ServiceSystemException(ResultEnum.DATA_ERROR,"履约进度表订单对应的收发货地址信息为空");
}
FeignAddressVO.Address sendAddress = sendAndReceiveAddress.get().getSendAddress();
FeignAddressVO.Address receiveAddress = sendAndReceiveAddress.get().getReceiveAddress();
BigDecimal distance = null;
//重车运距(收发货地址距离)
try{
List<GdRouteDTO> route = gdService.getRoute(sendAddress.getLongitude(), sendAddress.getLatitude(),
receiveAddress.getLongitude(), receiveAddress.getLatitude());
if (!route.isEmpty()){
distance = new BigDecimal(route.get(0).getDistance() /1000);
}
}catch (Exception e){
log.warn("订单计算重车运距失败,订单号:{},失败原因:{}",data.getOrderNo(), ExceptionUtils.getStackTrace(e));
}
item.setOrderDistance(distance);
item.setOrderNo(data.getOrderNo());
if(Objects.nonNull(data.getSendSystemAddressId())){
item.setSendSystemAddressId(data.getSendSystemAddressId());
item.setSendSystemAddressShorter(getSystemAddressShorter(data.getSendSystemAddressId()));
}
item.setSendAddressId(data.getSendAddressId());
item.setSendAddressShorter(data.getSendAddressShorter());
item.setSendAddress(sendAddress.getProvince()+sendAddress.getCity()+sendAddress.getCounty()
+ sendAddress.getAddress());
performanceProgressDao.saveEntity(item);
}
}
private String getSystemAddressShorter(Integer addressId){
Optional<SystemAddressVO> systemAddress = addressService.getSystemAddress(addressId);
if (!systemAddress.isPresent()) {
log.warn("通过发货系统地址Id:{},查询对应的地址信息结果:{}",
addressId,systemAddress);
throw new ServiceSystemException(ResultEnum.DATA_ERROR,"履约进度表订单对应的系统发货地址信息为空");
}
return systemAddress.get().getAddressShorter();
}
//履约进度表----货单部分
@Override
public void dealPerformanceProgress4OrderGoods(OrderGoods data) {
Optional<PerformanceProgress> optional = performanceProgressDao.getOneByField(PerformanceProgress::getOrderNo,
data.getOrderNo());
if(!optional.isPresent()){
log.error("货单对应的订单信息不存在,订单号:{},货单号:{}",data.getOrderNo(),data.getOrderGoodsNo());
throw new ServiceSystemException(ResultEnum.DATA_NOT_FIND);
}
//根据挂单时间倒序排序
List<OrderGoods> orderGoods = orderGoodsDao.listAfterCreatedByOrderNo(data.getOrderNo());
if(CollectionUtils.isEmpty(orderGoods)){
return;
}
Set<String> seniorLogisticsManagerNameSet = new HashSet<>();
BigDecimal pendingOrderFreight = null; //最新的货单的司机运费,取消的也算
LocalDateTime firstPendingTime = null; //挂单时间,取消的也算
for(OrderGoods item : orderGoods){
seniorLogisticsManagerNameSet.add(item.getSeniorLogisticsManagerName());
if(Objects.isNull(pendingOrderFreight)){
pendingOrderFreight = item.getPendingOrderFreight();
}
//最后一个挂单中的货单的挂单时间为最早的挂单时间
firstPendingTime = item.getPendingOrderTime();
}
PerformanceProgress update = new PerformanceProgress();
update.setId(optional.get().getId());
update.setSeniorLogisticsManagerName(JSON.toJSONString(new ArrayList<>(seniorLogisticsManagerNameSet)));
update.setDriverFreightPrice(pendingOrderFreight);
update.setPendingTime(firstPendingTime);
performanceProgressDao.updateEntityByKey(update);
}
//履约进度表----运单部分
@Override
public void dealPerformanceProgress4OrderChild(OrderChild data) {
Optional<PerformanceProgress> optional = performanceProgressDao.getOneByField(PerformanceProgress::getOrderNo,
data.getOrderNo());
if(!optional.isPresent()){
log.error("运单对应的订单信息不存在,订单号:{},运单号:{}",data.getOrderNo(),data.getChildNo());
throw new ServiceSystemException(ResultEnum.DATA_NOT_FIND);
}
FeignOrderInfoVO orderInfo = orderService.getOrderInfo(data.getOrderNo()).get();
//取完成之前的运单数据
List<OrderChild> orderChildList = orderChildDao.listBeforeCompleteByOrderNo(data.getOrderNo());
int orderedTruckNum = orderChildList.size(); //接单车数
int arriveSendTruckNum = 0; //到达货源地车数
int loadTruckNum = 0; //装车车数
int unloadTruckNum = 0; //卸车车数
int onTheWayTruckNum ; // 在途车数
BigDecimal orderedRate; //接单率
BigDecimal taskCompleteRatio ; //任务完成率
BigDecimal sumLoadWeight = BigDecimal.ZERO; //矿发吨数
BigDecimal sumUnloadWeight = BigDecimal.ZERO; //到站吨数
BigDecimal sumOnTheWayWeight ; //在途吨数
BigDecimal orderedWeight = BigDecimal.ZERO; //接单吨数
for (OrderChild child : orderChildList) {
if(child.getStatus() >= OrderChildEnum.Status.ARRIVE_SEND.getCode()){
arriveSendTruckNum = arriveSendTruckNum + 1;
}
if(child.getStatus() >= OrderChildEnum.Status.LOAD.getCode()){
loadTruckNum = loadTruckNum + 1;
sumLoadWeight = sumLoadWeight.add(child.getLoadNet());
orderedWeight = orderedWeight.add(child.getLoadNet());
}else{
orderedWeight = orderedWeight.add(child.getWeight());
}
if(child.getStatus() >= OrderChildEnum.Status.UNLOAD.getCode()){
unloadTruckNum = unloadTruckNum + 1;
sumUnloadWeight = sumUnloadWeight.add(child.getWeight());
}
}
//在途吨数 = 矿发量 - 到站量
sumOnTheWayWeight = sumLoadWeight.subtract(sumUnloadWeight);
//在途车辆数 = 装车车数 - 卸车车数
onTheWayTruckNum = loadTruckNum - unloadTruckNum;
//接单率 = 接单吨数 / 挂单吨数
orderedRate = orderedWeight .divide(optional.get().getPendingWeight(),3, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
//任务完成率 = 到站量 / 任务量
taskCompleteRatio = sumUnloadWeight.divide(orderInfo.getTransportWeight(),3, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
PerformanceProgress update = new PerformanceProgress();
update.setId(optional.get().getId());
update.setOrderedTruckNum(orderedTruckNum);
update.setArriveSendTruckNum(arriveSendTruckNum);
update.setLoadTruckNum(loadTruckNum);
update.setUnloadTruckNum(unloadTruckNum);
update.setOnTheWayTruckNum(onTheWayTruckNum);
update.setOrderedRate(orderedRate);
update.setTaskCompleteRatio(taskCompleteRatio);
update.setSumLoadWeight(sumLoadWeight);
update.setSumUnloadWeight(sumUnloadWeight);
update.setSumOnTheWayWeight(sumOnTheWayWeight);
performanceProgressDao.updateEntityByKey(update);
}
}
...@@ -2,6 +2,8 @@ package com.clx.performance.struct; ...@@ -2,6 +2,8 @@ package com.clx.performance.struct;
import com.clx.performance.model.OrderGoods; import com.clx.performance.model.OrderGoods;
import com.clx.performance.vo.feign.OrderGoodsFeignVO; import com.clx.performance.vo.feign.OrderGoodsFeignVO;
import com.clx.performance.vo.pc.DriverFreightPriceVO;
import com.clx.performance.vo.pc.OrderGoodsPendingVO;
import com.clx.performance.vo.pc.OrderGoodsVO; import com.clx.performance.vo.pc.OrderGoodsVO;
import com.clx.performance.vo.pc.linewarn.LineWarnTraceVO; import com.clx.performance.vo.pc.linewarn.LineWarnTraceVO;
import com.msl.common.utils.DateStructUtil; import com.msl.common.utils.DateStructUtil;
...@@ -23,4 +25,9 @@ public interface OrderGoodsStruct { ...@@ -23,4 +25,9 @@ public interface OrderGoodsStruct {
@Mapping(target = "receiveAddress", source = "receiveAddressShorter") @Mapping(target = "receiveAddress", source = "receiveAddressShorter")
LineWarnTraceVO convertLineWarnTraceVO(OrderGoods item); LineWarnTraceVO convertLineWarnTraceVO(OrderGoods item);
List<DriverFreightPriceVO> convertDriverFreightList(List<OrderGoods> orderGoods);
List<OrderGoodsPendingVO> convertOrderGoodsPendingList(List<OrderGoods> orderGoods);
} }
package com.clx.performance.struct;
import com.clx.performance.model.PerformanceProgressLog;
import com.clx.performance.vo.pc.PerformanceProgressOperationLogVO;
import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils;
import org.mapstruct.Mapper;
import java.util.List;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class})
public interface PerformanceProgressLogStruct {
List<PerformanceProgressOperationLogVO> convertList(List<PerformanceProgressLog> list);
}
package com.clx.performance.struct;
import com.clx.performance.model.PerformanceProgress;
import com.clx.performance.vo.pc.PerformanceProgressDetailVO;
import com.clx.performance.vo.pc.PerformanceProgressVO;
import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils;
import org.mapstruct.Mapper;
import java.util.List;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class})
public interface PerformanceProgressStruct {
List<PerformanceProgressVO> convertList(List<PerformanceProgress> records);
PerformanceProgressDetailVO convert(PerformanceProgress item);
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论