diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java index 9fa3ed755..1f283297c 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java @@ -4,6 +4,8 @@ import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; import java.util.List; @@ -31,4 +33,10 @@ public interface BiPlatformRealDataMapper { /** 任务负荷(今日 24 小时) */ List queryTaskLoadToday(); + + /** 今日预约-业务类型统计(按 businessName 分组统计今日预约数量) */ + List queryTodayBusinessTypeStats(); + + /** 月台监控-按楼层统计月台车辆(楼层、月台数量、今日预约车辆、当前作业车辆) */ + List queryPlatformFloorStats(); } \ No newline at end of file diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealBusinessTypeStatPO.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealBusinessTypeStatPO.java new file mode 100644 index 000000000..d9df6ab91 --- /dev/null +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealBusinessTypeStatPO.java @@ -0,0 +1,20 @@ +package com.mhd.bi.domain.biPlatformRealData.repository.po; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 今日预约-业务类型统计(真实数据,来自 TEST_NGWL_YMS.QMS_MAIN_BUSINESS) + * 按业务类型分组统计今日预约数量 + */ +@Data +public class RealBusinessTypeStatPO implements Serializable { + private static final long serialVersionUID = 1L; + + /** 业务类型名称(qms_main_business.businessName) */ + private String businessName; + + /** 今日预约数量 */ + private Long count; +} diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformFloorStatPO.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformFloorStatPO.java new file mode 100644 index 000000000..c3c600faf --- /dev/null +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformFloorStatPO.java @@ -0,0 +1,26 @@ +package com.mhd.bi.domain.biPlatformRealData.repository.po; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 月台监控-月台车辆统计(按楼层分组) + * 数据来源:TEST_NGWL_YMS.QMS_WINDOW_INFO(楼层+月台)与 QMS_MAIN_BUSINESS(当日预约/作业) + */ +@Data +public class RealPlatformFloorStatPO implements Serializable { + private static final long serialVersionUID = 1L; + + /** 楼层(从叫号月台 WINDOW_NAME 解析,如 S1-01 -> F1) */ + private String floorNo; + + /** 该楼层的月台数量 */ + private Long platformCount; + + /** 今日预约车辆数(按 WINDOW_NAME 关联楼层) */ + private Long todayReservedVehicles; + + /** 当前作业车辆数(FLOW_STATUS IN 5,6,7,8,9,10) */ + private Long operatingVehicles; +} diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java index a3c52b08d..9e2470dc6 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java @@ -1,22 +1,30 @@ package com.mhd.bi.domain.biPlatformRealData.service; +import com.fasterxml.jackson.databind.ObjectMapper; import com.mhd.bi.domain.biPlatformRealData.repository.mapper.BiPlatformRealDataMapper; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformVehiclePO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformOverviewPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; +import com.mhd.bi.domain.biPlatformSurveillance.repository.mapper.BiPlatformSurveillanceReportMapper; +import com.mhd.bi.domain.biSnapshotSync.repository.mapper.BiSnapshotWriteMapper; import com.mhd.bi.domain.biSnapshotSync.support.BiSnapshotWeeklyRandomDataBuilder; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformVehicleItemVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.TaskLoadItemVO; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Random; /** @@ -30,6 +38,96 @@ public class BiPlatformRealDataService { @Resource private BiPlatformRealDataMapper biPlatformRealDataMapper; + @Resource + private BiSnapshotWriteMapper biSnapshotWriteMapper; + + @Resource + private BiPlatformSurveillanceReportMapper biPlatformSurveillanceReportMapper; + + @Resource + private ObjectMapper objectMapper; + + private static final String REMARK_REALTIME = "realtime platform-surveillance"; + + /** + * 实时组装月台监测数据;仅当真实业务数据(YMS 库查出的字段)发生变化时, + * 才覆盖更新 BI_PLATFORM_SURVEILLANCE_SNAPSHOT 快照表最新一条后返回。 + * 写死字段变化不触发更新;表中尚无记录时插入一条兜底。 + */ + public PlatformSurveillanceVO buildRealTimePlatformSurveillanceAndPersist() { + PlatformSurveillanceVO vo = buildRealTimePlatformSurveillance(); + try { + String fullJson = objectMapper.writeValueAsString(vo); + String fingerprint = realDataFingerprint(vo); + + String latestJson = biPlatformSurveillanceReportMapper.selectLatestPayloadJson(); + if (StringUtils.isNotBlank(latestJson)) { + PlatformSurveillanceVO latestVo = objectMapper.readValue(latestJson.trim(), PlatformSurveillanceVO.class); + if (Objects.equals(fingerprint, realDataFingerprint(latestVo))) { + log.info("BI 月台监测真实业务数据未变化,跳过落库"); + return vo; + } + } + + int rows = biSnapshotWriteMapper.updateLatestPlatformSurveillanceSnapshot(fullJson, REMARK_REALTIME); + if (rows < 1) { + // 表中无最新记录可更新,插入一条兜底 + biSnapshotWriteMapper.insertPlatformSurveillanceSnapshot(fullJson, REMARK_REALTIME); + } + log.info("BI 月台监测实时数据已落库(覆盖最新, 数据变化), affectedRows={}", rows); + } catch (Exception e) { + log.error("BI 月台监测实时数据落库失败", e); + } + return vo; + } + + /** + * 提取月台监测的「真实业务数据」指纹(仅含 YMS 库查出的字段),用于判断业务数据是否变化。 + * 写死/随机字段不纳入指纹,故其变化不会触发更新。 + */ + private String realDataFingerprint(PlatformSurveillanceVO vo) throws Exception { + Map fp = new LinkedHashMap<>(); + if (vo.getPlatformOverview() != null) { + fp.put("totalPlatforms", vo.getPlatformOverview().getTotalPlatforms()); + fp.put("operatingPlatforms", vo.getPlatformOverview().getOperatingPlatforms()); + fp.put("todayTasks", vo.getPlatformOverview().getTodayTasks()); + } + if (vo.getVehicleStatus() != null) { + fp.put("todayReservedVehicles", vo.getVehicleStatus().getTodayReservedVehicles()); + fp.put("notCheckedIn", vo.getVehicleStatus().getNotCheckedIn()); + fp.put("operatingVehicles", vo.getVehicleStatus().getOperatingVehicles()); + fp.put("completedVehicles", vo.getVehicleStatus().getCompletedVehicles()); + } + if (vo.getMonthlyTaskStatistics() != null) { + fp.put("taskTotal", vo.getMonthlyTaskStatistics().getTaskTotal()); + } + if (vo.getVehicles() != null) { + List> vehicles = new ArrayList<>(); + for (PlatformVehicleItemVO v : vo.getVehicles()) { + Map m = new LinkedHashMap<>(); + m.put("appointmentTime", v.getAppointmentTime()); + m.put("workFloor", v.getWorkFloor()); + m.put("plateNumber", v.getPlateNumber()); + m.put("status", v.getStatus()); + m.put("platformId", v.getPlatformId()); + m.put("platformDuration", v.getPlatformDuration()); + vehicles.add(m); + } + fp.put("vehicles", vehicles); + } + if (vo.getTaskLoadStatistics() != null) { + List> loads = new ArrayList<>(); + for (TaskLoadItemVO item : vo.getTaskLoadStatistics()) { + Map m = new LinkedHashMap<>(); + m.put("time", item.getTime()); + m.put("taskCount", item.getTaskCount()); + loads.add(m); + } + fp.put("taskLoadStatistics", loads); + } + return objectMapper.writeValueAsString(fp); + } + public List queryVehicles() { try { return biPlatformRealDataMapper.queryVehicles(); @@ -106,12 +204,39 @@ public class BiPlatformRealDataService { } } + /** + * 今日预约-业务类型统计:按业务类型分组统计今日预约数量。 + * 例:今日预约航空打板 3 条 → 返回 {businessName:"航空打板", count:3} + */ + public List queryTodayBusinessTypeStats() { + try { + return biPlatformRealDataMapper.queryTodayBusinessTypeStats(); + } catch (Exception e) { + log.error("【YMS】统计今日业务类型失败: {}", e.getMessage(), e); + return java.util.Collections.emptyList(); + } + } + + /** + * 月台监控-按楼层统计月台车辆:返回 {floorNo, platformCount, todayReservedVehicles, operatingVehicles} + * 实时查 YMS 库,不落库。 + */ + public List queryPlatformFloorStats() { + try { + return biPlatformRealDataMapper.queryPlatformFloorStats(); + } catch (Exception e) { + log.error("【YMS】月台监控按楼层统计失败: {}", e.getMessage(), e); + return java.util.Collections.emptyList(); + } + } + /** * 实时组装月台监测数据:真实字段查 YMS 库,写死字段保留静态值。 * 每次调用实时查库,不经过快照表。 */ public PlatformSurveillanceVO buildRealTimePlatformSurveillance() { - Random r = new Random(); + // 固定种子,保证写死字段每次生成值一致(真实字段随后实时覆盖) + Random r = new Random(20260825L); PlatformSurveillanceVO template = BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(r); // 作业车辆列表 diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biSnapshotSync/repository/mapper/BiSnapshotWriteMapper.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biSnapshotSync/repository/mapper/BiSnapshotWriteMapper.java index 10d4dfcfa..bf895ebbe 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biSnapshotSync/repository/mapper/BiSnapshotWriteMapper.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biSnapshotSync/repository/mapper/BiSnapshotWriteMapper.java @@ -13,6 +13,8 @@ public interface BiSnapshotWriteMapper { int insertPlatformSurveillanceSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark); + int updateLatestPlatformSurveillanceSnapshot(@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); diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biSnapshotSync/service/BiReportSnapshotSyncService.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biSnapshotSync/service/BiReportSnapshotSyncService.java index 6df016cbf..b682590a2 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biSnapshotSync/service/BiReportSnapshotSyncService.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biSnapshotSync/service/BiReportSnapshotSyncService.java @@ -150,7 +150,8 @@ public class BiReportSnapshotSyncService { /** TODO 业务落地:部分字段改为真实数据,其余仍写死。 */ protected PlatformSurveillanceVO buildPlatformSurveillanceSnapshot() { - Random r = new Random(); + // 固定种子,保证写死字段每次生成值一致(真实字段随后实时覆盖) + Random r = new Random(20260825L); // 写死数据复用原 builder PlatformSurveillanceVO template = BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(r); diff --git a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java index 4aa56c70f..0375dc7d6 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java +++ b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java @@ -4,6 +4,8 @@ import com.mhd.bi.domain.biSnapshotSync.service.BiReportSnapshotSyncService; import com.mhd.bi.domain.biComprehensive.service.BiComprehensiveReportService; import com.mhd.bi.domain.biPlatformSurveillance.service.BiPlatformSurveillanceReportService; import com.mhd.bi.domain.biPlatformRealData.service.BiPlatformRealDataService; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; import com.mhd.bi.domain.biOverallOperation.service.BiOverallOperationReportService; import com.mhd.bi.domain.biHkMacaoServiceZone.service.BiHkMacaoServiceZoneReportService; import com.mhd.bi.domain.biTransportOperationZone.service.BiTransportOperationZoneReportService; @@ -30,6 +32,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** * BI 报表接口 */ @@ -96,12 +100,32 @@ public class BiReportApi extends BaseController { } /** - * 月台监测指标查询(实时查 YMS 库,真实字段 + 写死字段) + * 月台监测指标查询(实时查 YMS 库,真实字段 + 写死字段),并落库一条到 BI_PLATFORM_SURVEILLANCE_SNAPSHOT */ - @ApiOperation(value = "月台监测指标查询", notes = "每次调用实时查询 YMS 库组装;部分字段为真实业务数据,部分为写死数据") + @ApiOperation(value = "月台监测指标查询", notes = "每次调用实时查询 YMS 库组装并写入快照表;部分字段为真实业务数据,部分为写死数据") @GetMapping("/platformSurveillance") public BiApiResult platformSurveillance() { - PlatformSurveillanceVO data = biPlatformRealDataService.buildRealTimePlatformSurveillance(); + PlatformSurveillanceVO data = biPlatformRealDataService.buildRealTimePlatformSurveillanceAndPersist(); + return BiApiResult.ok(data); + } + + /** + * 今日预约-业务类型统计(实时查 YMS 库,不落库) + */ + @ApiOperation(value = "今日预约业务类型统计", notes = "按业务类型分组统计今日预约数量,实时查询 YMS 库,不落库;例:航空打板 3 条") + @GetMapping("/businessTypeStats") + public BiApiResult> businessTypeStats() { + List data = biPlatformRealDataService.queryTodayBusinessTypeStats(); + return BiApiResult.ok(data); + } + + /** + * 月台监控-按楼层统计月台车辆(实时查 YMS 库,不落库) + */ + @ApiOperation(value = "月台车辆统计(按楼层)", notes = "按楼层统计月台数量、今日预约车辆、当前作业车辆,实时查询 YMS 库,不落库") + @GetMapping("/platformFloorStats") + public BiApiResult> platformFloorStats() { + List data = biPlatformRealDataService.queryPlatformFloorStats(); return BiApiResult.ok(data); } //园区物流大屏接口---------------------------------------------------------------------- diff --git a/mhd-bi/src/main/resources/bootstrap.yml b/mhd-bi/src/main/resources/bootstrap.yml index 8f1e2c236..b949b746f 100644 --- a/mhd-bi/src/main/resources/bootstrap.yml +++ b/mhd-bi/src/main/resources/bootstrap.yml @@ -14,19 +14,19 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 # server-addr: 10.102.192.5:6848 username: nacos password: manhuoda@2023 #线上正式环境 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 # username: nacos # password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml index 6397c6612..883d07526 100644 --- a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml +++ b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml @@ -46,11 +46,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND TRUNC(ENTRY_TIME) = TRUNC(SYSDATE) - + + + + + +