|
@@ -86,6 +86,7 @@ import com.sckw.system.api.model.dto.req.DataPermissionFilterReqDto;
|
|
|
import com.sckw.system.api.model.dto.res.*;
|
|
import com.sckw.system.api.model.dto.res.*;
|
|
|
import com.sckw.transport.api.dubbo.TransportRemoteStatisticsService;
|
|
import com.sckw.transport.api.dubbo.TransportRemoteStatisticsService;
|
|
|
import com.sckw.transport.api.dubbo.TransportRemoteService;
|
|
import com.sckw.transport.api.dubbo.TransportRemoteService;
|
|
|
|
|
+import com.sckw.transport.api.model.dto.RawOreOrderExecutionDto;
|
|
|
import com.sckw.transport.api.model.dto.TradeOrderWaybillAggDto;
|
|
import com.sckw.transport.api.model.dto.TradeOrderWaybillAggDto;
|
|
|
import com.sckw.transport.api.model.param.AddLogisticOrderParam;
|
|
import com.sckw.transport.api.model.param.AddLogisticOrderParam;
|
|
|
import com.sckw.transport.api.model.param.LogisticInfo;
|
|
import com.sckw.transport.api.model.param.LogisticInfo;
|
|
@@ -124,6 +125,17 @@ import java.util.stream.Collectors;
|
|
|
@RequiredArgsConstructor
|
|
@RequiredArgsConstructor
|
|
|
public class KwoTradeOrderService {
|
|
public class KwoTradeOrderService {
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Fixed enterprise scope for the public BI dashboard.
|
|
|
|
|
+ */
|
|
|
|
|
+ private static final List<Long> REPORT_ENT_IDS = List.of(
|
|
|
|
|
+ 538038314096136193L,
|
|
|
|
|
+ 538039617157337089L,
|
|
|
|
|
+ 538040297439891457L
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ private static final int ORDER_EXECUTION_DISPLAY_LIMIT = 500;
|
|
|
|
|
+
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false)
|
|
@DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
private RemoteSystemService remoteSystemService;
|
|
private RemoteSystemService remoteSystemService;
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false)
|
|
@DubboReference(version = "1.0.0", group = "design", check = false)
|
|
@@ -2070,7 +2082,7 @@ public class KwoTradeOrderService {
|
|
|
}
|
|
}
|
|
|
List<OrderListResDTO> orders = kwoTradeOrderMapper.tradeOrderExport(dto, dto.getGoodIds(), LoginUserHolder.getAuthUserIdList(), ids);
|
|
List<OrderListResDTO> orders = kwoTradeOrderMapper.tradeOrderExport(dto, dto.getGoodIds(), LoginUserHolder.getAuthUserIdList(), ids);
|
|
|
if (CollUtil.isEmpty(orders)) {
|
|
if (CollUtil.isEmpty(orders)) {
|
|
|
- return Collections.emptyList();
|
|
|
|
|
|
|
+ return new ArrayList<>();
|
|
|
}
|
|
}
|
|
|
Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.TORDER_STATUS.getType(), DictTypeEnum.PICKUP_TYPE.getType(), DictTypeEnum.DELIVERY_TYPE.getType(), DictTypeEnum.TORDER_SOURCE.getType(), DictTypeEnum.TRADE_TYPE.getType()));
|
|
Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.TORDER_STATUS.getType(), DictTypeEnum.PICKUP_TYPE.getType(), DictTypeEnum.DELIVERY_TYPE.getType(), DictTypeEnum.TORDER_SOURCE.getType(), DictTypeEnum.TRADE_TYPE.getType()));
|
|
|
Map<String, String> statusMap, pickupMap, deliveryMap, sourceMap, tradeMap;
|
|
Map<String, String> statusMap, pickupMap, deliveryMap, sourceMap, tradeMap;
|
|
@@ -3058,92 +3070,231 @@ public class KwoTradeOrderService {
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 订单执行情况:已下单未结算({@link TradeOrderStatusEnum}:待审核、进行中、结算中;不含已完成、审核驳回、已取消),最多 500 条,按更新时间倒序
|
|
|
|
|
|
|
+ * 获取贸易订单及原矿物流订单的执行展示列表。
|
|
|
|
|
+ * 主要用于公共BI大屏展示,包含特定企业的贸易订单执行进度和原矿物流订单执行情况。
|
|
|
*
|
|
*
|
|
|
- * @return 订单执行展示列表
|
|
|
|
|
|
|
+ * @return 订单执行展示数据列表
|
|
|
*/
|
|
*/
|
|
|
public List<OrderExecutionDisplayVo> listOrderExecutionDisplay() {
|
|
public List<OrderExecutionDisplayVo> listOrderExecutionDisplay() {
|
|
|
- log.info("开始查询订单执行情况展示列表");
|
|
|
|
|
|
|
+ log.info("开始查询订单执行展示数据");
|
|
|
|
|
|
|
|
- // 1. 查询符合条件的贸易订单列表(待审核、进行中、结算中),限制最多500条,按更新时间倒序
|
|
|
|
|
|
|
+ // 1. 查询原矿物流订单执行数据
|
|
|
|
|
+ List<OrderExecutionDisplayVo> rawOreRows = buildRawOreOrderExecutionDisplayRows(ORDER_EXECUTION_DISPLAY_LIMIT);
|
|
|
|
|
+ log.debug("查询到原矿物流订单执行数据条数: {}", rawOreRows.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 查询指定报表企业范围内的贸易订单ID
|
|
|
|
|
+ List<Long> reportTradeOrderIds = queryReportTradeOrderIds();
|
|
|
|
|
+ if (CollectionUtils.isEmpty(reportTradeOrderIds)) {
|
|
|
|
|
+ log.info("未找到指定报表企业的贸易订单ID,仅返回原矿物流订单数据");
|
|
|
|
|
+ return rawOreRows;
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("找到指定报表企业的贸易订单ID数量: {}", reportTradeOrderIds.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 查询符合条件的贸易订单列表
|
|
|
|
|
+ // 条件:未删除、在指定ID范围内、状态为待审核/进行中/结算中、按更新时间倒序、限制数量
|
|
|
List<KwoTradeOrder> orders = kwoTradeOrderMapper.selectList(
|
|
List<KwoTradeOrder> orders = kwoTradeOrderMapper.selectList(
|
|
|
Wrappers.<KwoTradeOrder>lambdaQuery()
|
|
Wrappers.<KwoTradeOrder>lambdaQuery()
|
|
|
.eq(KwoTradeOrder::getDelFlag, Global.NO)
|
|
.eq(KwoTradeOrder::getDelFlag, Global.NO)
|
|
|
|
|
+ .in(CollectionUtils.isNotEmpty(reportTradeOrderIds), KwoTradeOrder::getId, reportTradeOrderIds)
|
|
|
.in(KwoTradeOrder::getStatus, Arrays.asList(
|
|
.in(KwoTradeOrder::getStatus, Arrays.asList(
|
|
|
TradeOrderStatusEnum.AUDIT.getCode(),
|
|
TradeOrderStatusEnum.AUDIT.getCode(),
|
|
|
TradeOrderStatusEnum.ING.getCode(),
|
|
TradeOrderStatusEnum.ING.getCode(),
|
|
|
TradeOrderStatusEnum.DEAL.getCode()))
|
|
TradeOrderStatusEnum.DEAL.getCode()))
|
|
|
.orderByDesc(KwoTradeOrder::getUpdateTime)
|
|
.orderByDesc(KwoTradeOrder::getUpdateTime)
|
|
|
- .last("LIMIT 500"));
|
|
|
|
|
|
|
+ .last("LIMIT " + ORDER_EXECUTION_DISPLAY_LIMIT));
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(orders)) {
|
|
if (CollectionUtils.isEmpty(orders)) {
|
|
|
- log.info("未查询到符合条件的订单数据");
|
|
|
|
|
- return Collections.emptyList();
|
|
|
|
|
|
|
+ log.info("未查询到符合条件的贸易订单,仅返回原矿物流订单数据");
|
|
|
|
|
+ return rawOreRows;
|
|
|
}
|
|
}
|
|
|
- log.info("查询到 {} 条待处理订单", orders.size());
|
|
|
|
|
|
|
+ log.info("查询到符合条件的贸易订单数量: {}", orders.size());
|
|
|
|
|
|
|
|
- // 2. 提取订单ID列表,批量查询物流运单聚合统计数据
|
|
|
|
|
- List<Long> ids = orders.stream().map(KwoTradeOrder::getId).toList();
|
|
|
|
|
- log.debug("开始批量查询物流运单统计信息,订单ID数量: {}", ids.size());
|
|
|
|
|
- List<TradeOrderWaybillAggDto> aggs = transportRemoteService.aggregateCompletedWaybillStatsByTradeOrderIds(ids);
|
|
|
|
|
|
|
+ // 4. 批量查询贸易订单关联的运单统计信息(已完成运单的趟次、净重等)
|
|
|
|
|
+ List<Long> orderIds = orders.stream().map(KwoTradeOrder::getId).toList();
|
|
|
|
|
+ log.debug("开始批量查询贸易订单运单统计信息,订单ID数量: {}", orderIds.size());
|
|
|
|
|
+ List<TradeOrderWaybillAggDto> aggs = transportRemoteService.aggregateCompletedWaybillStatsByTradeOrderIds(orderIds);
|
|
|
|
|
+ log.debug("查询到贸易订单运单统计信息数量: {}", aggs != null ? aggs.size() : 0);
|
|
|
|
|
|
|
|
- // 3. 将物流统计数据转换为Map,方便后续通过订单ID快速查找
|
|
|
|
|
- Map<Long, TradeOrderWaybillAggDto> aggMap = aggs.stream()
|
|
|
|
|
- .collect(Collectors.toMap(TradeOrderWaybillAggDto::getTOrderId, Function.identity(), (a, b) -> a));
|
|
|
|
|
- log.debug("获取到 {} 条物流运单统计信息", aggMap.size());
|
|
|
|
|
|
|
+ // 5. 将运单统计信息转换为Map,以便通过订单ID快速查找
|
|
|
|
|
+ Map<Long, TradeOrderWaybillAggDto> aggMap = aggs != null ? aggs.stream()
|
|
|
|
|
+ .collect(Collectors.toMap(TradeOrderWaybillAggDto::getTOrderId, Function.identity(), (a, b) -> a))
|
|
|
|
|
+ : Collections.emptyMap();
|
|
|
|
|
|
|
|
- // 4. 组装返回结果
|
|
|
|
|
- List<OrderExecutionDisplayVo> rows = new ArrayList<>(orders.size());
|
|
|
|
|
- for (KwoTradeOrder o : orders) {
|
|
|
|
|
- TradeOrderWaybillAggDto a = aggMap.get(o.getId());
|
|
|
|
|
|
|
+ // 6. 组装贸易订单执行展示数据
|
|
|
|
|
+ List<OrderExecutionDisplayVo> rows = new ArrayList<>(orders.size() + rawOreRows.size());
|
|
|
|
|
+ for (KwoTradeOrder order : orders) {
|
|
|
|
|
+ TradeOrderWaybillAggDto agg = aggMap.get(order.getId());
|
|
|
|
|
|
|
|
// 获取运输趟次,若无数据则默认为0
|
|
// 获取运输趟次,若无数据则默认为0
|
|
|
- int trips = a != null && a.getTripCount() != null ? a.getTripCount() : 0;
|
|
|
|
|
|
|
+ int trips = (agg != null && agg.getTripCount() != null) ? agg.getTripCount() : 0;
|
|
|
|
|
|
|
|
// 获取已装载净重总和,若无数据则默认为0
|
|
// 获取已装载净重总和,若无数据则默认为0
|
|
|
- BigDecimal loadedRaw = a != null && a.getNetWeightSum() != null ? a.getNetWeightSum() : BigDecimal.ZERO;
|
|
|
|
|
|
|
+ BigDecimal loadedWeight = (agg != null && agg.getNetWeightSum() != null) ? agg.getNetWeightSum() : BigDecimal.ZERO;
|
|
|
|
|
|
|
|
// 获取订单计划总量,若无数据则默认为0
|
|
// 获取订单计划总量,若无数据则默认为0
|
|
|
- BigDecimal plannedRaw = o.getAmount() != null ? o.getAmount() : BigDecimal.ZERO;
|
|
|
|
|
|
|
+ BigDecimal plannedAmount = (order.getAmount() != null) ? order.getAmount() : BigDecimal.ZERO;
|
|
|
|
|
|
|
|
- // 计算计划吨数(取整)
|
|
|
|
|
- int plannedTons = Math.max(0, plannedRaw.setScale(0, RoundingMode.HALF_UP).intValue());
|
|
|
|
|
|
|
+ // 计算计划吨数(取整,至少为0)
|
|
|
|
|
+ int plannedTons = Math.max(0, plannedAmount.setScale(0, RoundingMode.HALF_UP).intValue());
|
|
|
|
|
|
|
|
// 计算已装载吨数(保留两位小数)
|
|
// 计算已装载吨数(保留两位小数)
|
|
|
- BigDecimal loadedTons = loadedRaw.setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
+ BigDecimal loadedTons = loadedWeight.setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
// 计算完成率百分比
|
|
// 计算完成率百分比
|
|
|
- BigDecimal rate;
|
|
|
|
|
- if (plannedRaw.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
- // 如果计划量为0或负数,完成率为0
|
|
|
|
|
- rate = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
+ BigDecimal completionRate;
|
|
|
|
|
+ if (plannedAmount.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
+ // 如果计划量为0或负数,防止除以零错误,完成率设为0
|
|
|
|
|
+ completionRate = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
|
|
|
} else {
|
|
} else {
|
|
|
- // 完成率 = (已装载量 / 计划量) * 100,保留两位小数
|
|
|
|
|
- rate = loadedRaw.divide(plannedRaw, 10, RoundingMode.HALF_UP)
|
|
|
|
|
|
|
+ // 完成率 = (已装载量 / 计划量) * 100,中间计算保留10位精度,最终结果保留2位小数
|
|
|
|
|
+ completionRate = loadedWeight.divide(plannedAmount, 10, RoundingMode.HALF_UP)
|
|
|
.multiply(BigDecimal.valueOf(100))
|
|
.multiply(BigDecimal.valueOf(100))
|
|
|
.setScale(2, RoundingMode.HALF_UP);
|
|
.setScale(2, RoundingMode.HALF_UP);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 构建返回对象
|
|
// 构建返回对象
|
|
|
OrderExecutionDisplayVo vo = new OrderExecutionDisplayVo();
|
|
OrderExecutionDisplayVo vo = new OrderExecutionDisplayVo();
|
|
|
- vo.setOrderNo(o.getTOrderNo());
|
|
|
|
|
|
|
+ vo.setOrderNo(order.getTOrderNo());
|
|
|
vo.setPlannedTons(plannedTons);
|
|
vo.setPlannedTons(plannedTons);
|
|
|
vo.setLoadedTons(loadedTons);
|
|
vo.setLoadedTons(loadedTons);
|
|
|
vo.setTripCount(trips);
|
|
vo.setTripCount(trips);
|
|
|
- vo.setCompletionRatePercent(rate);
|
|
|
|
|
|
|
+ vo.setCompletionRatePercent(completionRate);
|
|
|
rows.add(vo);
|
|
rows.add(vo);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- log.info("订单执行情况展示列表组装完成,共 {} 条数据", rows.size());
|
|
|
|
|
|
|
+ // 7. 将原矿物流订单数据追加到列表末尾
|
|
|
|
|
+ rows.addAll(rawOreRows);
|
|
|
|
|
+ log.info("订单执行展示数据组装完成,贸易订单数: {}, 原矿物流订单数: {}, 总数: {}",
|
|
|
|
|
+ orders.size(), rawOreRows.size(), rows.size());
|
|
|
return rows;
|
|
return rows;
|
|
|
}
|
|
}
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 查询属于公共BI大屏固定企业范围的贸易订单ID列表。
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 该方法通过查询 {@link KwoTradeOrderUnitRepository} 获取指定企业ID列表({@link #REPORT_ENT_IDS})
|
|
|
|
|
+ * 关联的贸易订单单位信息,并提取出唯一的贸易订单ID集合。
|
|
|
|
|
+ * </p>
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return 贸易订单ID列表,若无匹配数据则返回空列表
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<Long> queryReportTradeOrderIds() {
|
|
|
|
|
+ log.debug("开始查询公共BI大屏固定企业范围的贸易订单ID,目标企业IDs: {}", REPORT_ENT_IDS);
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 根据固定企业ID列表查询关联的贸易订单单位信息
|
|
|
|
|
+ List<KwoTradeOrderUnit> units = kwoTradeOrderUnitRepository.queryByReportEntIds(REPORT_ENT_IDS);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 若未查询到任何单位信息,直接返回空列表
|
|
|
|
|
+ if (CollectionUtils.isEmpty(units)) {
|
|
|
|
|
+ log.debug("未查询到固定企业范围内的贸易订单单位信息");
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.debug("查询到贸易订单单位信息数量: {}", units.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 流式处理:过滤空对象 -> 提取订单ID -> 过滤空ID -> 去重 -> 转换为List
|
|
|
|
|
+ List<Long> orderIds = units.stream()
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .map(KwoTradeOrderUnit::getTOrderId)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .toList();
|
|
|
|
|
+
|
|
|
|
|
+ log.debug("最终获取到的唯一贸易订单ID数量: {}", orderIds.size());
|
|
|
|
|
+ return orderIds;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 查询增补运力物流合同(手动派车物流合同)
|
|
|
|
|
|
|
+ * 构建原矿物流订单执行展示数据列表。
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 该方法调用远程运输服务,获取指定企业范围({@link #REPORT_ENT_IDS})内的原矿物流订单执行数据,
|
|
|
|
|
+ * 并将其转换为前端展示所需的 {@link OrderExecutionDisplayVo} 对象列表。
|
|
|
|
|
+ * </p>
|
|
|
*
|
|
*
|
|
|
- * @param param
|
|
|
|
|
- * @return
|
|
|
|
|
|
|
+ * @param limit 查询数量限制,用于控制返回的数据条数
|
|
|
|
|
+ * @return 原矿物流订单执行展示数据列表;若查询失败或无数据,则返回空列表
|
|
|
*/
|
|
*/
|
|
|
|
|
+ private List<OrderExecutionDisplayVo> buildRawOreOrderExecutionDisplayRows(int limit) {
|
|
|
|
|
+ log.info("开始构建原矿物流订单执行展示数据,限制数量: {}", limit);
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 1. 调用远程服务查询原矿物流订单执行数据
|
|
|
|
|
+ log.debug("调用远程运输服务查询原矿物流订单,企业IDs: {}, 限制数量: {}", REPORT_ENT_IDS, limit);
|
|
|
|
|
+ List<RawOreOrderExecutionDto> rawOreRows = transportRemoteService.listRawOreOrderExecutionDisplay(REPORT_ENT_IDS, limit);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 判空处理:若无数据,直接返回空列表
|
|
|
|
|
+ if (CollectionUtils.isEmpty(rawOreRows)) {
|
|
|
|
|
+ log.info("未查询到原矿物流订单执行数据");
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ log.debug("查询到原矿物流订单原始数据条数: {}", rawOreRows.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 数据转换:将 DTO 转换为 VO
|
|
|
|
|
+ List<OrderExecutionDisplayVo> result = rawOreRows.stream()
|
|
|
|
|
+ .map(this::buildRawOreOrderExecutionDisplayVo)
|
|
|
|
|
+ .toList();
|
|
|
|
|
+
|
|
|
|
|
+ log.info("原矿物流订单执行展示数据构建完成,最终返回条数: {}", result.size());
|
|
|
|
|
+ return result;
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ // 4. 异常处理:记录错误日志并返回空列表,避免影响主流程(如贸易订单数据的展示)
|
|
|
|
|
+ log.error("构建原矿物流订单执行展示数据失败", e);
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 构建原矿物流订单执行展示视图对象。
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 该方法将远程服务返回的原矿物流订单执行数据 DTO 转换为前端展示所需的 VO 对象。
|
|
|
|
|
+ * 主要包含以下逻辑:
|
|
|
|
|
+ * 1. 处理空值:将计划量和已装载量中的 null 值转换为 BigDecimal.ZERO。
|
|
|
|
|
+ * 2. 计算完成率:避免除以零错误,保留两位小数。
|
|
|
|
|
+ * 3. 数据格式化:计划吨数取整,已装载吨数保留两位小数,趟次处理 null 值。
|
|
|
|
|
+ * </p>
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param row 原矿物流订单执行数据 DTO
|
|
|
|
|
+ * @return 原矿物流订单执行展示视图对象
|
|
|
|
|
+ */
|
|
|
|
|
+ private OrderExecutionDisplayVo buildRawOreOrderExecutionDisplayVo(RawOreOrderExecutionDto row) {
|
|
|
|
|
+ log.debug("开始构建原矿物流订单执行展示VO,物流单号: {}", row != null ? row.getLogisticsOrderNo() : "null");
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 获取并处理计划量,防止空指针
|
|
|
|
|
+ BigDecimal plannedRaw = row.getPlannedAmount() != null ? row.getPlannedAmount() : BigDecimal.ZERO;
|
|
|
|
|
+ // 2. 获取并处理已装载净重总和,防止空指针
|
|
|
|
|
+ BigDecimal loadedRaw = row.getNetWeightSum() != null ? row.getNetWeightSum() : BigDecimal.ZERO;
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 计算完成率百分比
|
|
|
|
|
+ BigDecimal rate;
|
|
|
|
|
+ if (plannedRaw.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
+ // 如果计划量为0或负数,防止除以零,完成率设为0
|
|
|
|
|
+ rate = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
+ log.debug("物流单号: {} 计划量为0或负数,完成率设为0", row.getLogisticsOrderNo());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 正常计算:(已装载量 / 计划量) * 100
|
|
|
|
|
+ // 中间计算保留10位精度以确保准确性,最终结果保留2位小数
|
|
|
|
|
+ rate = loadedRaw.divide(plannedRaw, 10, RoundingMode.HALF_UP)
|
|
|
|
|
+ .multiply(BigDecimal.valueOf(100))
|
|
|
|
|
+ .setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 组装返回对象
|
|
|
|
|
+ OrderExecutionDisplayVo vo = new OrderExecutionDisplayVo();
|
|
|
|
|
+ // 设置物流订单号
|
|
|
|
|
+ vo.setOrderNo(row.getLogisticsOrderNo());
|
|
|
|
|
+ // 设置计划吨数:四舍五入取整,且最小为0
|
|
|
|
|
+ vo.setPlannedTons(Math.max(0, plannedRaw.setScale(0, RoundingMode.HALF_UP).intValue()));
|
|
|
|
|
+ // 设置已装载吨数:保留两位小数
|
|
|
|
|
+ vo.setLoadedTons(loadedRaw.setScale(2, RoundingMode.HALF_UP));
|
|
|
|
|
+ // 设置运输趟次:若为null则默认为0
|
|
|
|
|
+ vo.setTripCount(row.getTripCount() == null ? 0 : row.getTripCount());
|
|
|
|
|
+ // 设置完成率百分比
|
|
|
|
|
+ vo.setCompletionRatePercent(rate);
|
|
|
|
|
+
|
|
|
|
|
+ log.debug("原矿物流订单执行展示VO构建完成,单号: {}, 计划吨: {}, 已装吨: {}, 趟次: {}, 完成率: {}%",
|
|
|
|
|
+ vo.getOrderNo(), vo.getPlannedTons(), vo.getLoadedTons(), vo.getTripCount(), vo.getCompletionRatePercent());
|
|
|
|
|
+
|
|
|
|
|
+ return vo;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public List<ContractLogisticsVO> queryAddContractList(ContractLogisticsQueryParam param) {
|
|
public List<ContractLogisticsVO> queryAddContractList(ContractLogisticsQueryParam param) {
|
|
|
KwoTradeOrder kwoTradeOrder = kwoTradeOrderMapper.selectOne(new LambdaQueryWrapper<KwoTradeOrder>().eq(KwoTradeOrder::getId, param.getTradeOrderId()).eq(KwoTradeOrder::getDelFlag, 0));
|
|
KwoTradeOrder kwoTradeOrder = kwoTradeOrderMapper.selectOne(new LambdaQueryWrapper<KwoTradeOrder>().eq(KwoTradeOrder::getId, param.getTradeOrderId()).eq(KwoTradeOrder::getDelFlag, 0));
|
|
|
if (Objects.isNull(kwoTradeOrder)) {
|
|
if (Objects.isNull(kwoTradeOrder)) {
|