BI运输运营专区接口查询

This commit is contained in:
秦鸿展
2026-05-18 16:13:04 +08:00
parent 9fcacbf9af
commit 986808af9a
34 changed files with 992 additions and 18 deletions
@@ -6,6 +6,7 @@ import com.mhd.bi.interfaces.facadeApi.biReport.vo.CustomerContributionRankVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.WarehouseTransportSituationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.WarehouseTransportSituationVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.overall.*; import com.mhd.bi.interfaces.facadeApi.biReport.vo.overall.*;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.*; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.*;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.*;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.*; import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -161,9 +162,48 @@ public final class BiReportSnapshotMapperSupport {
.utilizationRate(WhRealTimeGaugeVO.builder().value("").comparison("").trend("").build()) .utilizationRate(WhRealTimeGaugeVO.builder().value("").comparison("").trend("").build())
.rentalRate(WhRealTimeGaugeVO.builder().value("").comparison("").trend("").build()) .rentalRate(WhRealTimeGaugeVO.builder().value("").comparison("").trend("").build())
.build()) .build())
.mapPopup(WhMapPopupVO.builder() .map(WhWarehouseMapVO.builder()
.warehouseName("").totalArea("").totalSku(0).todayOrders(0) .legend("")
.utilizationRate("").rentalRate("").build()) .nodes(Collections.emptyList())
.build())
.build();
}
public static TransportOperationZoneVO emptyTransportOperationZone() {
TrCapacityCountVO emptyCount = TrCapacityCountVO.builder()
.total(0).todayNew(0).yesterdayNew(0).build();
return TransportOperationZoneVO.builder()
.updateTime("")
.dashboardTitle("")
.activeTab("")
.orderStatistics(TrOrderStatisticsVO.builder().title("").total(0L).trend("").build())
.transportStats(TrTransportStatsVO.builder()
.title("").tripCount(0).volume(0d).volumeUnit("").build())
.orderTypeChart(TrOrderTypeChartVO.builder()
.title("").type("").data(Collections.emptyList()).build())
.tripCountTrend(TrTypedChartVO.builder()
.title("").type("").unit(null).data(Collections.emptyList()).build())
.orderTrend(TrTypedChartVO.builder()
.title("").type("").unit("").data(Collections.emptyList()).build())
.volumeTrend(TrTypedChartVO.builder()
.title("").type("").unit("").data(Collections.emptyList()).build())
.map(TrVehicleMapVO.builder()
.title("")
.legend(TrMapLegendVO.builder().idle(0).working(0).build())
.nodes(Collections.emptyList())
.build())
.enterpriseOperation(TrEnterpriseOperationVO.builder()
.title("").columns(Collections.emptyList()).list(Collections.emptyList()).build())
.capacityStatus(TrCapacityStatusVO.builder()
.title("").staff(emptyCount).vehicles(emptyCount).build())
.cargoCategory(TrCargoCategoryVO.builder()
.title("").totalOrders("").data(Collections.emptyList()).build())
.onTimeRate(TrTypedChartVO.builder()
.title("").type("").unit("").data(Collections.emptyList()).build())
.vehicleUtilization(TrBarChartVO.builder()
.title("").unit("").data(Collections.emptyList()).build())
.transportSummary(TrTransportSummaryVO.builder()
.title("").safeMileage("").avgDeliveryTime("").build())
.build(); .build();
} }
} }
@@ -16,4 +16,6 @@ public interface BiSnapshotWriteMapper {
int insertOverallOperationSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark); int insertOverallOperationSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark);
int insertWarehouseOperationZoneSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark); int insertWarehouseOperationZoneSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark);
int insertTransportOperationZoneSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark);
} }
@@ -8,7 +8,7 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
* 定时将业务快照写入 BI_COMPREHENSIVE_SNAPSHOT / BI_WAREHOUSE_TRANSPORT_SNAPSHOT / BI_PLATFORM_SURVEILLANCE_SNAPSHOT / BI_OVERALL_OPERATION_SNAPSHOT / BI_WAREHOUSE_OPERATION_ZONE_SNAPSHOT。 * 定时将业务快照写入 BI_COMPREHENSIVE_SNAPSHOT / BI_WAREHOUSE_TRANSPORT_SNAPSHOT / BI_PLATFORM_SURVEILLANCE_SNAPSHOT / BI_OVERALL_OPERATION_SNAPSHOT / BI_WAREHOUSE_OPERATION_ZONE_SNAPSHOT / BI_TRANSPORT_OPERATION_ZONE_SNAPSHOT
* <p>默认关闭,需在配置中设置 {@code mhd.bi.snapshot-sync.enabled=true}。</p> * <p>默认关闭,需在配置中设置 {@code mhd.bi.snapshot-sync.enabled=true}。</p>
*/ */
@Slf4j @Slf4j
@@ -3,11 +3,13 @@ package com.mhd.bi.domain.biSnapshotSync.service;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.mhd.bi.domain.biSnapshotSync.repository.mapper.BiSnapshotWriteMapper; import com.mhd.bi.domain.biSnapshotSync.repository.mapper.BiSnapshotWriteMapper;
import com.mhd.bi.domain.biSnapshotSync.support.BiSnapshotWeeklyRandomDataBuilder; import com.mhd.bi.domain.biSnapshotSync.support.BiSnapshotWeeklyRandomDataBuilder;
import com.mhd.bi.domain.biTransportOperationZone.support.TransportOperationZoneDemoData;
import com.mhd.bi.domain.biWarehouseOperationZone.support.WarehouseOperationZoneDemoData; import com.mhd.bi.domain.biWarehouseOperationZone.support.WarehouseOperationZoneDemoData;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.ComprehensiveSituationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.ComprehensiveSituationVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.WarehouseTransportSituationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.WarehouseTransportSituationVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.overall.OverallOperationSituationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.overall.OverallOperationSituationVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.TransportOperationZoneVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.WarehouseOperationZoneVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.WarehouseOperationZoneVO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -16,7 +18,7 @@ import org.springframework.stereotype.Service;
import java.util.Random; import java.util.Random;
/** /**
* BI 快照表定时同步(综合态势 / 仓储运输 / 月台监测 / 总体运营态势 / 仓储运营专区)。 * BI 快照表定时同步(综合态势 / 仓储运输 / 月台监测 / 总体运营态势 / 仓储运营专区 / 运输运营专区)。
* <p><b>当前(临时)</b>{@code build*} 使用 {@link BiSnapshotWeeklyRandomDataBuilder},每次执行使用新的 {@link Random} * <p><b>当前(临时)</b>{@code build*} 使用 {@link BiSnapshotWeeklyRandomDataBuilder},每次执行使用新的 {@link Random}
* 故<b>同一天多次手动触发、以及每次定时任务执行</b>,生成的模拟数据均<b>不相同</b>(仍在基准 ±20% 内)。</p> * 故<b>同一天多次手动触发、以及每次定时任务执行</b>,生成的模拟数据均<b>不相同</b>(仍在基准 ±20% 内)。</p>
* <p><b>后续改造</b>:在各 {@code build*} 中改为查库/Feign 聚合真实业务并组装 VO。</p> * <p><b>后续改造</b>:在各 {@code build*} 中改为查库/Feign 聚合真实业务并组装 VO。</p>
@@ -40,6 +42,7 @@ public class BiReportSnapshotSyncService {
syncPlatformSurveillanceSnapshot(); syncPlatformSurveillanceSnapshot();
syncOverallOperationSnapshot(); syncOverallOperationSnapshot();
syncWarehouseOperationZoneSnapshot(); syncWarehouseOperationZoneSnapshot();
syncTransportOperationZoneSnapshot();
} }
public void syncComprehensiveSnapshot() { public void syncComprehensiveSnapshot() {
@@ -142,4 +145,25 @@ public class BiReportSnapshotSyncService {
protected WarehouseOperationZoneVO buildWarehouseOperationZoneSnapshot() { protected WarehouseOperationZoneVO buildWarehouseOperationZoneSnapshot() {
return WarehouseOperationZoneDemoData.build(); return WarehouseOperationZoneDemoData.build();
} }
public void syncTransportOperationZoneSnapshot() {
try {
TransportOperationZoneVO vo = buildTransportOperationZoneSnapshot();
String json = objectMapper.writeValueAsString(vo);
int rows = biSnapshotWriteMapper.insertTransportOperationZoneSnapshot(json, REMARK_SYNC);
if (rows < 1) {
log.warn("BI 运输运营专区快照 INSERT 影响行数为 {},请确认 NGWL_TEST_BI.BI_TRANSPORT_OPERATION_ZONE_SNAPSHOT", rows);
}
log.info("BI 运输运营专区快照已写入, affectedRows={}", rows);
} catch (Exception e) {
log.error("BI 运输运营专区快照同步失败", e);
}
}
/**
* TODO 业务落地:改为查询真实数据组装 VO。当前为 {@link TransportOperationZoneDemoData} 静态示例。
*/
protected TransportOperationZoneVO buildTransportOperationZoneSnapshot() {
return TransportOperationZoneDemoData.build();
}
} }
@@ -0,0 +1,20 @@
package com.mhd.bi.domain.biTransportOperationZone.repository.mapper;
import com.mhd.bi.domain.biReport.support.BiReportSnapshotMapperSupport;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.TransportOperationZoneVO;
/**
* 运输运营专区:取 NGWL_TEST_BI.BI_TRANSPORT_OPERATION_ZONE_SNAPSHOT 最新 PAYLOAD_JSON 并解析。
*/
public interface BiTransportOperationZoneReportMapper {
String selectLatestPayloadJson();
default TransportOperationZoneVO loadLatestTransportOperationZone() {
return BiReportSnapshotMapperSupport.parsePayload(
selectLatestPayloadJson(),
TransportOperationZoneVO.class,
BiReportSnapshotMapperSupport::emptyTransportOperationZone,
"运输运营专区");
}
}
@@ -0,0 +1,21 @@
package com.mhd.bi.domain.biTransportOperationZone.service;
import com.mhd.bi.domain.biTransportOperationZone.repository.mapper.BiTransportOperationZoneReportMapper;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.TransportOperationZoneVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 南光物流业务经营分析 · 运输运营专区
*/
@Service
public class BiTransportOperationZoneReportService {
@Resource
private BiTransportOperationZoneReportMapper biTransportOperationZoneReportMapper;
public TransportOperationZoneVO loadLatestTransportOperationZone() {
return biTransportOperationZoneReportMapper.loadLatestTransportOperationZone();
}
}
@@ -0,0 +1,164 @@
package com.mhd.bi.domain.biTransportOperationZone.support;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* 运输运营专区快照演示数据(对齐大屏示例 JSON;后续可改为真实聚合)。
*/
public final class TransportOperationZoneDemoData {
private static final DateTimeFormatter UPDATE_TIME_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private TransportOperationZoneDemoData() {
}
public static TransportOperationZoneVO build() {
List<TrOrderTypeMonthItemVO> orderTypeData = Arrays.asList(
TrOrderTypeMonthItemVO.builder().month("1月").crossBorder(30).domestic(25).build(),
TrOrderTypeMonthItemVO.builder().month("2月").crossBorder(40).domestic(35).build(),
TrOrderTypeMonthItemVO.builder().month("3月").crossBorder(20).domestic(30).build(),
TrOrderTypeMonthItemVO.builder().month("4月").crossBorder(35).domestic(40).build(),
TrOrderTypeMonthItemVO.builder().month("5月").crossBorder(50).domestic(45).build(),
TrOrderTypeMonthItemVO.builder().month("6月").crossBorder(60).domestic(55).build(),
TrOrderTypeMonthItemVO.builder().month("7月").crossBorder(70).domestic(65).build()
);
List<TrMonthValuePointVO> tripTrend = Arrays.asList(
point("1月", 120), point("2月", 150), point("3月", 220),
point("4月", 100), point("5月", 140), point("6月", 180)
);
List<TrMonthValuePointVO> orderTrend = Arrays.asList(
point("1月", 100), point("2月", 140), point("3月", 230),
point("4月", 100), point("5月", 140), point("6月", 190)
);
List<TrMonthValuePointVO> volumeTrend = Arrays.asList(
point("1月", 95), point("2月", 90), point("3月", 80),
point("4月", 65), point("5月", 92), point("6月", 88)
);
List<TrMonthValuePointVO> onTimeRate = Arrays.asList(
point("1月", 98), point("2月", 96), point("3月", 85),
point("4月", 70), point("5月", 92), point("6月", 90)
);
List<TrMonthValuePointVO> vehicleUtil = Arrays.asList(
point("1月", 600), point("2月", 460), point("3月", 390),
point("4月", 470), point("5月", 450), point("6月", 620)
);
List<TrEnterpriseRowVO> enterpriseList = Arrays.asList(
row("NO.1", "供应商A", "268.25万", "2400单", 95),
row("NO.2", "供应商B", "258.15万", "1800单", 98),
row("NO.3", "供应商C", "242.32万", "1200单", 13),
row("NO.4", "供应商D", "231.54万", "800单", 12),
row("NO.5", "供应商E", "220.90万", "567单", 15)
);
List<TrCargoCategoryItemVO> cargoItems = Arrays.asList(
TrCargoCategoryItemVO.builder().name("危化").value(25).color("green").build(),
TrCargoCategoryItemVO.builder().name("普货").value(25).color("blue").build(),
TrCargoCategoryItemVO.builder().name("冻品").value(50).color("orange").build()
);
TrMapNodeVO mapNode = TrMapNodeVO.builder()
.id(1L)
.name("通宇作业车辆")
.location(Arrays.asList(113.55, 22.25))
.status("working")
.detail(TrMapNodeDetailVO.builder()
.title("作业详情")
.licensePlate("粤A88888")
.businessUnit("通宇")
.loadingPlace("珠海")
.destination("澳门")
.currentLocation("珠海市")
.updateTime("2026年4月15日 17:52")
.build())
.build();
return TransportOperationZoneVO.builder()
.updateTime(LocalDateTime.now().format(UPDATE_TIME_FMT))
.dashboardTitle("南光物流业务经营分析")
.activeTab("运输运营专区")
.orderStatistics(TrOrderStatisticsVO.builder()
.title("订单统计")
.total(4361L)
.trend("+12.5%")
.build())
.transportStats(TrTransportStatsVO.builder()
.title("运输统计")
.tripCount(240)
.volume(2.6)
.volumeUnit("万吨")
.build())
.orderTypeChart(TrOrderTypeChartVO.builder()
.title("订单类型")
.type("area")
.data(orderTypeData)
.build())
.tripCountTrend(chart("车次趋势", "line", null, tripTrend))
.orderTrend(chart("订单趋势", "area", "", orderTrend))
.volumeTrend(chart("货量趋势", "area", "%", volumeTrend))
.map(TrVehicleMapVO.builder()
.title("车辆实时监控")
.legend(TrMapLegendVO.builder().idle(80).working(200).build())
.nodes(Collections.singletonList(mapNode))
.build())
.enterpriseOperation(TrEnterpriseOperationVO.builder()
.title("企业运营")
.columns(Arrays.asList("序号", "企业名称", "货运量", "处理单量", "准时配送率"))
.list(enterpriseList)
.build())
.capacityStatus(TrCapacityStatusVO.builder()
.title("运力情况")
.staff(capacityCount(718, 0, 0))
.vehicles(capacityCount(507, 0, 0))
.build())
.cargoCategory(TrCargoCategoryVO.builder()
.title("货物品类")
.totalOrders("1000单")
.data(cargoItems)
.build())
.onTimeRate(chart("准时配送率", "line", "%", onTimeRate))
.vehicleUtilization(TrBarChartVO.builder()
.title("出车利用率")
.unit("车次/辆")
.data(vehicleUtil)
.build())
.transportSummary(TrTransportSummaryVO.builder()
.title("运输统计")
.safeMileage("240万公里")
.avgDeliveryTime("平均4小时送达")
.build())
.build();
}
private static TrMonthValuePointVO point(String month, int value) {
return TrMonthValuePointVO.builder().month(month).value(value).build();
}
private static TrTypedChartVO chart(String title, String type, String unit, List<TrMonthValuePointVO> data) {
return TrTypedChartVO.builder().title(title).type(type).unit(unit).data(data).build();
}
private static TrCapacityCountVO capacityCount(int total, int todayNew, int yesterdayNew) {
return TrCapacityCountVO.builder()
.total(total).todayNew(todayNew).yesterdayNew(yesterdayNew).build();
}
private static TrEnterpriseRowVO row(String rank, String name, String volume,
String processedOrders, int onTimeRate) {
return TrEnterpriseRowVO.builder()
.rank(rank).name(name).volume(volume)
.processedOrders(processedOrders).onTimeRate(onTimeRate)
.build();
}
}
@@ -126,13 +126,38 @@ public final class WarehouseOperationZoneDemoData {
.trend("up") .trend("up")
.build()) .build())
.build()) .build())
.mapPopup(WhMapPopupVO.builder() .map(WhWarehouseMapVO.builder()
.warehouseName("通宇保税") .legend("")
.totalArea("2000m2") .nodes(Arrays.asList(
.totalSku(668) mapNode(1L, "君华仓", 113.52, 22.30,
.todayOrders(237) "君华保税仓", "12000m²", 520, 2400, "82%", "36.5%"),
.utilizationRate("85%") mapNode(2L, "通宇仓", 113.55, 22.25,
.rentalRate("37.1%") "通宇保税仓", "2000m²", 668, 237, "85%", "37.1%"),
mapNode(3L, "横琴仓", 113.54, 22.12,
"横琴保税仓", "3500m²", 445, 1200, "78%", "42.0%"),
mapNode(4L, "新南仓", 113.58, 22.20,
"新南保税仓", "2800m²", 390, 800, "80%", "35.8%"),
mapNode(5L, "谷丰仓", 113.48, 22.22,
"谷丰保税仓", "4500m²", 512, 567, "76%", "33.2%")
))
.build())
.build();
}
private static WhMapNodeVO mapNode(long id, String name, double lng, double lat,
String warehouseName, String totalArea, int totalSku,
int todayOrders, String utilizationRate, String rentalRate) {
return WhMapNodeVO.builder()
.id(id)
.name(name)
.location(Arrays.asList(lng, lat))
.detail(WhMapPopupVO.builder()
.warehouseName(warehouseName)
.totalArea(totalArea)
.totalSku(totalSku)
.todayOrders(todayOrders)
.utilizationRate(utilizationRate)
.rentalRate(rentalRate)
.build()) .build())
.build(); .build();
} }
@@ -4,6 +4,7 @@ import com.mhd.bi.domain.biSnapshotSync.service.BiReportSnapshotSyncService;
import com.mhd.bi.domain.biComprehensive.service.BiComprehensiveReportService; import com.mhd.bi.domain.biComprehensive.service.BiComprehensiveReportService;
import com.mhd.bi.domain.biPlatformSurveillance.service.BiPlatformSurveillanceReportService; import com.mhd.bi.domain.biPlatformSurveillance.service.BiPlatformSurveillanceReportService;
import com.mhd.bi.domain.biOverallOperation.service.BiOverallOperationReportService; import com.mhd.bi.domain.biOverallOperation.service.BiOverallOperationReportService;
import com.mhd.bi.domain.biTransportOperationZone.service.BiTransportOperationZoneReportService;
import com.mhd.bi.domain.biWarehouseOperationZone.service.BiWarehouseOperationZoneReportService; import com.mhd.bi.domain.biWarehouseOperationZone.service.BiWarehouseOperationZoneReportService;
import com.mhd.bi.domain.biWarehouseTransport.service.BiWarehouseTransportReportService; import com.mhd.bi.domain.biWarehouseTransport.service.BiWarehouseTransportReportService;
import com.mhd.bi.interfaces.facadeApi.biReport.dto.BiApiResult; import com.mhd.bi.interfaces.facadeApi.biReport.dto.BiApiResult;
@@ -11,6 +12,7 @@ import com.mhd.bi.interfaces.facadeApi.biReport.vo.ComprehensiveSituationVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.WarehouseTransportSituationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.WarehouseTransportSituationVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.overall.OverallOperationSituationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.overall.OverallOperationSituationVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.TransportOperationZoneVO;
import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.WarehouseOperationZoneVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.WarehouseOperationZoneVO;
import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.controller.BaseController;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -48,11 +50,14 @@ public class BiReportApi extends BaseController {
@Autowired @Autowired
private BiWarehouseOperationZoneReportService biWarehouseOperationZoneReportService; private BiWarehouseOperationZoneReportService biWarehouseOperationZoneReportService;
@Autowired
private BiTransportOperationZoneReportService biTransportOperationZoneReportService;
@Autowired @Autowired
private BiReportSnapshotSyncService biReportSnapshotSyncService; private BiReportSnapshotSyncService biReportSnapshotSyncService;
@ApiOperation(value = "手动触发快照同步", notes = "立即写入各 BI 快照表(综合、仓储运输、月台监测、总体运营、仓储运营专区);须带 X-BI-Access-Token") @ApiOperation(value = "手动触发快照同步", notes = "立即写入各 BI 快照表(综合、仓储运输、月台监测、总体运营、仓储运营专区、运输运营专区);须带 X-BI-Access-Token")
@PostMapping("/snapshotSync/run") @PostMapping("/snapshotSync/run")
public BiApiResult<Void> runSnapshotSyncOnce() { public BiApiResult<Void> runSnapshotSyncOnce() {
biReportSnapshotSyncService.syncAllSnapshots(); biReportSnapshotSyncService.syncAllSnapshots();
@@ -88,7 +93,7 @@ public class BiReportApi extends BaseController {
PlatformSurveillanceVO data = biPlatformSurveillanceReportService.loadLatestPlatformSurveillance(); PlatformSurveillanceVO data = biPlatformSurveillanceReportService.loadLatestPlatformSurveillance();
return BiApiResult.ok(data); return BiApiResult.ok(data);
} }
//园区物流大屏接口----------------------------------------------------------------------
/** /**
* 总体运营态势 * 总体运营态势
*/ */
@@ -108,4 +113,14 @@ public class BiReportApi extends BaseController {
WarehouseOperationZoneVO data = biWarehouseOperationZoneReportService.loadLatestWarehouseOperationZone(); WarehouseOperationZoneVO data = biWarehouseOperationZoneReportService.loadLatestWarehouseOperationZone();
return BiApiResult.ok(data); return BiApiResult.ok(data);
} }
/**
* 运输运营专区(大屏「运输运营专区」Tab)
*/
@ApiOperation(value = "运输运营专区查询", notes = "返回 DEL_FLAG=1 且 CREATE_TIME 最新的一条整包 JSON 解析结果")
@GetMapping("/transportOperationZone")
public BiApiResult<TransportOperationZoneVO> transportOperationZone() {
TransportOperationZoneVO data = biTransportOperationZoneReportService.loadLatestTransportOperationZone();
return BiApiResult.ok(data);
}
} }
@@ -14,7 +14,7 @@ public class BiApiResult<T> {
private int code = 200; private int code = 200;
private String msg = "操作成功"; private String message = "操作成功";
private T data; private T data;
@@ -0,0 +1,27 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-柱状图")
public class TrBarChartVO {
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("单位")
private String unit;
@ApiModelProperty("数据")
private List<TrMonthValuePointVO> data;
}
@@ -0,0 +1,28 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-运力计数")
public class TrCapacityCountVO {
@ApiModelProperty("总数")
private Integer total;
@JsonProperty("today_new")
@ApiModelProperty("今日新增")
private Integer todayNew;
@JsonProperty("yesterday_new")
@ApiModelProperty("昨日新增")
private Integer yesterdayNew;
}
@@ -0,0 +1,26 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-运力情况")
public class TrCapacityStatusVO {
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("承运人")
private TrCapacityCountVO staff;
@ApiModelProperty("车辆")
private TrCapacityCountVO vehicles;
}
@@ -0,0 +1,25 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-货物品类项")
public class TrCargoCategoryItemVO {
@ApiModelProperty("品类名称")
private String name;
@ApiModelProperty("占比")
private Integer value;
@ApiModelProperty("颜色标识")
private String color;
}
@@ -0,0 +1,29 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-货物品类")
public class TrCargoCategoryVO {
@ApiModelProperty("标题")
private String title;
@JsonProperty("total_orders")
@ApiModelProperty("订单总量展示")
private String totalOrders;
@ApiModelProperty("品类数据")
private List<TrCargoCategoryItemVO> data;
}
@@ -0,0 +1,27 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-企业运营")
public class TrEnterpriseOperationVO {
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("表头")
private List<String> columns;
@ApiModelProperty("列表")
private List<TrEnterpriseRowVO> list;
}
@@ -0,0 +1,34 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-企业运营行")
public class TrEnterpriseRowVO {
@ApiModelProperty("排名")
private String rank;
@ApiModelProperty("企业名称")
private String name;
@ApiModelProperty("货运量")
private String volume;
@JsonProperty("processed_orders")
@ApiModelProperty("处理单量")
private String processedOrders;
@JsonProperty("on_time_rate")
@ApiModelProperty("准时配送率")
private Integer onTimeRate;
}
@@ -0,0 +1,22 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-地图图例")
public class TrMapLegendVO {
@ApiModelProperty("空闲车辆数")
private Integer idle;
@ApiModelProperty("作业车辆数")
private Integer working;
}
@@ -0,0 +1,43 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-地图节点详情")
public class TrMapNodeDetailVO {
@ApiModelProperty("标题")
private String title;
@JsonProperty("license_plate")
@ApiModelProperty("车牌")
private String licensePlate;
@JsonProperty("business_unit")
@ApiModelProperty("经营单位")
private String businessUnit;
@JsonProperty("loading_place")
@ApiModelProperty("装货地")
private String loadingPlace;
@ApiModelProperty("目的地")
private String destination;
@JsonProperty("current_location")
@ApiModelProperty("当前位置")
private String currentLocation;
@JsonProperty("update_time")
@ApiModelProperty("更新时间")
private String updateTime;
}
@@ -0,0 +1,33 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-地图节点")
public class TrMapNodeVO {
@ApiModelProperty("节点ID")
private Long id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("坐标 [经度, 纬度]")
private List<Double> location;
@ApiModelProperty("状态:idle / working")
private String status;
@ApiModelProperty("详情")
private TrMapNodeDetailVO detail;
}
@@ -0,0 +1,22 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-月度数值点")
public class TrMonthValuePointVO {
@ApiModelProperty("月份")
private String month;
@ApiModelProperty("数值")
private Integer value;
}
@@ -0,0 +1,25 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-订单统计")
public class TrOrderStatisticsVO {
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("订单总数")
private Long total;
@ApiModelProperty("环比增长率")
private String trend;
}
@@ -0,0 +1,28 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-订单类型图")
public class TrOrderTypeChartVO {
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("图表类型")
private String type;
@ApiModelProperty("数据")
private List<TrOrderTypeMonthItemVO> data;
}
@@ -0,0 +1,27 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-订单类型月度项")
public class TrOrderTypeMonthItemVO {
@ApiModelProperty("月份")
private String month;
@JsonProperty("cross_border")
@ApiModelProperty("跨境")
private Integer crossBorder;
@ApiModelProperty("国内")
private Integer domestic;
}
@@ -0,0 +1,31 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-运输统计")
public class TrTransportStatsVO {
@ApiModelProperty("标题")
private String title;
@JsonProperty("trip_count")
@ApiModelProperty("运输车次")
private Integer tripCount;
@ApiModelProperty("运输货量")
private Double volume;
@JsonProperty("volume_unit")
@ApiModelProperty("货量单位")
private String volumeUnit;
}
@@ -0,0 +1,28 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-运输统计总结")
public class TrTransportSummaryVO {
@ApiModelProperty("标题")
private String title;
@JsonProperty("safe_mileage")
@ApiModelProperty("安全里程")
private String safeMileage;
@JsonProperty("avg_delivery_time")
@ApiModelProperty("平均送达时间")
private String avgDeliveryTime;
}
@@ -0,0 +1,30 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-带类型图表")
public class TrTypedChartVO {
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("图表类型")
private String type;
@ApiModelProperty("单位")
private String unit;
@ApiModelProperty("数据")
private List<TrMonthValuePointVO> data;
}
@@ -0,0 +1,27 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区-车辆实时监控地图")
public class TrVehicleMapVO {
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("图例")
private TrMapLegendVO legend;
@ApiModelProperty("节点")
private List<TrMapNodeVO> nodes;
}
@@ -0,0 +1,80 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 南光物流业务经营分析 · 运输运营专区整包 data 与快照 PAYLOAD_JSON 一致
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-运输运营专区")
public class TransportOperationZoneVO {
@ApiModelProperty("数据更新时间")
private String updateTime;
@ApiModelProperty("大屏标题")
private String dashboardTitle;
@ApiModelProperty("当前 Tab")
private String activeTab;
@JsonProperty("order_statistics")
@ApiModelProperty("订单统计")
private TrOrderStatisticsVO orderStatistics;
@JsonProperty("transport_stats")
@ApiModelProperty("运输统计")
private TrTransportStatsVO transportStats;
@JsonProperty("order_type_chart")
@ApiModelProperty("订单类型面积图")
private TrOrderTypeChartVO orderTypeChart;
@JsonProperty("trip_count_trend")
@ApiModelProperty("车次趋势折线图")
private TrTypedChartVO tripCountTrend;
@JsonProperty("order_trend")
@ApiModelProperty("订单趋势面积图")
private TrTypedChartVO orderTrend;
@JsonProperty("volume_trend")
@ApiModelProperty("货量趋势面积图")
private TrTypedChartVO volumeTrend;
@ApiModelProperty("车辆实时监控地图")
private TrVehicleMapVO map;
@JsonProperty("enterprise_operation")
@ApiModelProperty("企业运营表格")
private TrEnterpriseOperationVO enterpriseOperation;
@JsonProperty("capacity_status")
@ApiModelProperty("运力情况")
private TrCapacityStatusVO capacityStatus;
@JsonProperty("cargo_category")
@ApiModelProperty("货物品类环形图")
private TrCargoCategoryVO cargoCategory;
@JsonProperty("on_time_rate")
@ApiModelProperty("准时配送率折线图")
private TrTypedChartVO onTimeRate;
@JsonProperty("vehicle_utilization")
@ApiModelProperty("出车利用率柱状图")
private TrBarChartVO vehicleUtilization;
@JsonProperty("transport_summary")
@ApiModelProperty("运输统计总结")
private TrTransportSummaryVO transportSummary;
}
@@ -68,7 +68,6 @@ public class WarehouseOperationZoneVO {
@ApiModelProperty("实时分析") @ApiModelProperty("实时分析")
private WhRealTimeAnalysisVO realTimeAnalysis; private WhRealTimeAnalysisVO realTimeAnalysis;
@JsonProperty("map_popup") @ApiModelProperty("中间地图仓库点位(nodes 为标注数组)")
@ApiModelProperty("地图弹窗示例数据") private WhWarehouseMapVO map;
private WhMapPopupVO mapPopup;
} }
@@ -0,0 +1,30 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-仓储运营专区-地图点位")
public class WhMapNodeVO {
@ApiModelProperty("点位ID")
private Long id;
@ApiModelProperty("地图标注名称(短名)")
private String name;
@ApiModelProperty("坐标 [经度, 纬度]")
private List<Double> location;
@ApiModelProperty("弹窗详情")
private WhMapPopupVO detail;
}
@@ -0,0 +1,24 @@
package com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("BI-仓储运营专区-地图")
public class WhWarehouseMapVO {
@ApiModelProperty("图例说明")
private String legend;
@ApiModelProperty("仓库点位列表")
private List<WhMapNodeVO> nodes;
}
@@ -27,4 +27,9 @@
insert into NGWL_TEST_BI.BI_WAREHOUSE_OPERATION_ZONE_SNAPSHOT (PAYLOAD_JSON, CREATE_TIME, UPDATE_TIME, DEL_FLAG, REMARK) insert into NGWL_TEST_BI.BI_WAREHOUSE_OPERATION_ZONE_SNAPSHOT (PAYLOAD_JSON, CREATE_TIME, UPDATE_TIME, DEL_FLAG, REMARK)
values (#{payloadJson}, SYSDATE, SYSDATE, 1, #{remark}) values (#{payloadJson}, SYSDATE, SYSDATE, 1, #{remark})
</insert> </insert>
<insert id="insertTransportOperationZoneSnapshot">
insert into NGWL_TEST_BI.BI_TRANSPORT_OPERATION_ZONE_SNAPSHOT (PAYLOAD_JSON, CREATE_TIME, UPDATE_TIME, DEL_FLAG, REMARK)
values (#{payloadJson}, SYSDATE, SYSDATE, 1, #{remark})
</insert>
</mapper> </mapper>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mhd.bi.domain.biTransportOperationZone.repository.mapper.BiTransportOperationZoneReportMapper">
<select id="selectLatestPayloadJson" resultType="java.lang.String">
select PAYLOAD_JSON
from NGWL_TEST_BI.BI_TRANSPORT_OPERATION_ZONE_SNAPSHOT
where DEL_FLAG = 1
order by CREATE_TIME desc nulls last, ID desc
limit 1
</select>
</mapper>