BI定时任务修改
This commit is contained in:
@@ -9,6 +9,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
|
||||
@SpringBootApplication(scanBasePackages = {"com.mhd", "com.mhd.bi"})
|
||||
@EnableDiscoveryClient
|
||||
@@ -16,6 +17,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
|
||||
@MapperScan("com.mhd.bi.domain.**.mapper")
|
||||
@Import({SetFeildValueAspect.class, CommonService.class})
|
||||
@EnableAsync
|
||||
@EnableScheduling
|
||||
public class BiApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package com.mhd.bi.domain.biSnapshotSync.repository.mapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
/**
|
||||
* 三张 BI 快照表写入(定时同步任务使用)
|
||||
*/
|
||||
public interface BiSnapshotWriteMapper {
|
||||
|
||||
int insertComprehensiveSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark);
|
||||
|
||||
int insertWarehouseTransportSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark);
|
||||
|
||||
int insertPlatformSurveillanceSnapshot(@Param("payloadJson") String payloadJson, @Param("remark") String remark);
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.mhd.bi.domain.biSnapshotSync.scheduler;
|
||||
|
||||
import com.mhd.bi.domain.biSnapshotSync.service.BiReportSnapshotSyncService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 定时将业务快照写入 BI_COMPREHENSIVE_SNAPSHOT / BI_WAREHOUSE_TRANSPORT_SNAPSHOT / BI_PLATFORM_SURVEILLANCE_SNAPSHOT。
|
||||
* <p>默认关闭,需在配置中设置 {@code mhd.bi.snapshot-sync.enabled=true}。</p>
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
@ConditionalOnProperty(prefix = "mhd.bi.snapshot-sync", name = "enabled", havingValue = "true")
|
||||
public class BiReportSnapshotSyncScheduler {
|
||||
|
||||
private final BiReportSnapshotSyncService biReportSnapshotSyncService;
|
||||
|
||||
@Scheduled(cron = "${mhd.bi.snapshot-sync.cron:0 0 2 * * ?}")
|
||||
public void runSnapshotSync() {
|
||||
log.info("BI 报表快照定时同步开始");
|
||||
biReportSnapshotSyncService.syncAllSnapshots();
|
||||
log.info("BI 报表快照定时同步结束");
|
||||
}
|
||||
}
|
||||
+98
@@ -0,0 +1,98 @@
|
||||
package com.mhd.bi.domain.biSnapshotSync.service;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
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.ComprehensiveSituationVO;
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.WarehouseTransportSituationVO;
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* BI 三张快照表定时同步。
|
||||
* <p><b>当前(临时)</b>:{@code build*} 使用 {@link BiSnapshotWeeklyRandomDataBuilder},每次执行使用新的 {@link Random},
|
||||
* 故<b>同一天多次手动触发、以及每次定时任务执行</b>,生成的模拟数据均<b>不相同</b>(仍在基准 ±20% 内)。</p>
|
||||
* <p><b>后续改造</b>:在三个 {@code build*} 中改为查库/Feign 聚合真实业务并组装 VO。</p>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class BiReportSnapshotSyncService {
|
||||
|
||||
private static final String REMARK_SYNC = "scheduled snapshot-sync";
|
||||
|
||||
private final BiSnapshotWriteMapper biSnapshotWriteMapper;
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
/**
|
||||
* 依次同步三张快照;单表失败不影响其它表,只记日志。
|
||||
*/
|
||||
public void syncAllSnapshots() {
|
||||
syncComprehensiveSnapshot();
|
||||
syncWarehouseTransportSnapshot();
|
||||
syncPlatformSurveillanceSnapshot();
|
||||
}
|
||||
|
||||
public void syncComprehensiveSnapshot() {
|
||||
try {
|
||||
ComprehensiveSituationVO vo = buildComprehensiveSnapshot();
|
||||
String json = objectMapper.writeValueAsString(vo);
|
||||
int rows = biSnapshotWriteMapper.insertComprehensiveSnapshot(json, REMARK_SYNC);
|
||||
if (rows < 1) {
|
||||
log.warn("BI 综合态势快照 INSERT 影响行数为 {},请确认 NGWL_TEST_BI.BI_COMPREHENSIVE_SNAPSHOT 权限及库是否一致", rows);
|
||||
}
|
||||
log.info("BI 综合态势快照已写入, affectedRows={}", rows);
|
||||
} catch (Exception e) {
|
||||
log.error("BI 综合态势快照同步失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
public void syncWarehouseTransportSnapshot() {
|
||||
try {
|
||||
WarehouseTransportSituationVO vo = buildWarehouseTransportSnapshot();
|
||||
String json = objectMapper.writeValueAsString(vo);
|
||||
int rows = biSnapshotWriteMapper.insertWarehouseTransportSnapshot(json, REMARK_SYNC);
|
||||
if (rows < 1) {
|
||||
log.warn("BI 仓储运输快照 INSERT 影响行数为 {},请确认 NGWL_TEST_BI.BI_WAREHOUSE_TRANSPORT_SNAPSHOT", rows);
|
||||
}
|
||||
log.info("BI 仓储运输快照已写入, affectedRows={}", rows);
|
||||
} catch (Exception e) {
|
||||
log.error("BI 仓储运输快照同步失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
public void syncPlatformSurveillanceSnapshot() {
|
||||
try {
|
||||
PlatformSurveillanceVO vo = buildPlatformSurveillanceSnapshot();
|
||||
String json = objectMapper.writeValueAsString(vo);
|
||||
int rows = biSnapshotWriteMapper.insertPlatformSurveillanceSnapshot(json, REMARK_SYNC);
|
||||
if (rows < 1) {
|
||||
log.warn("BI 月台监测快照 INSERT 影响行数为 {},请确认 NGWL_TEST_BI.BI_PLATFORM_SURVEILLANCE_SNAPSHOT", rows);
|
||||
}
|
||||
log.info("BI 月台监测快照已写入, affectedRows={}", rows);
|
||||
} catch (Exception e) {
|
||||
log.error("BI 月台监测快照同步失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO 业务落地:改为查询真实数据组装 VO。临时实现见 {@link BiSnapshotWeeklyRandomDataBuilder#comprehensive(Random)}。
|
||||
*/
|
||||
protected ComprehensiveSituationVO buildComprehensiveSnapshot() {
|
||||
return BiSnapshotWeeklyRandomDataBuilder.comprehensive(new Random());
|
||||
}
|
||||
|
||||
/** TODO 业务落地:改为查询真实数据。临时实现见 {@link BiSnapshotWeeklyRandomDataBuilder#warehouseTransport(Random)}。 */
|
||||
protected WarehouseTransportSituationVO buildWarehouseTransportSnapshot() {
|
||||
return BiSnapshotWeeklyRandomDataBuilder.warehouseTransport(new Random());
|
||||
}
|
||||
|
||||
/** TODO 业务落地:改为查询真实数据。临时实现见 {@link BiSnapshotWeeklyRandomDataBuilder#platformSurveillance(Random)}。 */
|
||||
protected PlatformSurveillanceVO buildPlatformSurveillanceSnapshot() {
|
||||
return BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(new Random());
|
||||
}
|
||||
}
|
||||
+308
@@ -0,0 +1,308 @@
|
||||
package com.mhd.bi.domain.biSnapshotSync.support;
|
||||
|
||||
import com.mhd.bi.interfaces.facadeApi.biReport.vo.ComprehensiveSituationVO;
|
||||
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.platform.*;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* <b>临时</b>:在基准 ±20% 内生成模拟快照(基准对齐 insert_bi_snapshots_alternate_row_dm)。
|
||||
* 调用 {@link #comprehensive(Random)} 等时须传入 {@link Random}:<b>每次 {@code new Random()} 则每次结果不同</b>;
|
||||
* 若需可重复(如单测),可传入 {@link #randomForDate(java.time.LocalDate, long)} 等有固定种子的实例。
|
||||
*/
|
||||
public final class BiSnapshotWeeklyRandomDataBuilder {
|
||||
|
||||
private BiSnapshotWeeklyRandomDataBuilder() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 固定种子(如同日多次一致),适用于单元测试等;生产模拟同步请使用 {@code new Random()}。
|
||||
*/
|
||||
public static Random randomForDate(LocalDate date, long salt) {
|
||||
long epochDay = date.toEpochDay();
|
||||
salt = salt % 1000000007L;
|
||||
return new Random(epochDay * 1_000_003L + salt * 7919L);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 请使用 {@link #randomForDate(LocalDate, long)};历史方法名保留兼容,现已按「自然日」而非 ISO 周。
|
||||
*/
|
||||
@Deprecated
|
||||
public static Random randomForWeekOf(LocalDate date, long salt) {
|
||||
return randomForDate(date, salt);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static Random randomForWeekOf(LocalDate date) {
|
||||
return randomForDate(date, 0L);
|
||||
}
|
||||
|
||||
private static double jitterFactor(Random r) {
|
||||
return 0.8 + r.nextDouble() * 0.4;
|
||||
}
|
||||
|
||||
static int jitterInt(int base, Random r) {
|
||||
return (int) Math.round(base * jitterFactor(r));
|
||||
}
|
||||
|
||||
static long jitterLong(long base, Random r) {
|
||||
return Math.round(base * jitterFactor(r));
|
||||
}
|
||||
|
||||
static double jitterDouble(double base, Random r) {
|
||||
return Math.round(base * jitterFactor(r) * 10.0) / 10.0;
|
||||
}
|
||||
|
||||
static int jitterPercentInt(int base, Random r) {
|
||||
return Math.min(100, Math.max(0, jitterInt(base, r)));
|
||||
}
|
||||
|
||||
private static double jitterPercentDouble(double base, Random r) {
|
||||
double v = base * jitterFactor(r);
|
||||
return Math.min(100.0, Math.max(0.0, Math.round(v * 10.0) / 10.0));
|
||||
}
|
||||
|
||||
private static List<Integer> jitterIntArray(int[] arr, Random r) {
|
||||
return Arrays.stream(arr).map(v -> jitterInt(v, r)).boxed().collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static ComprehensiveSituationVO comprehensive(Random r) {
|
||||
return ComprehensiveSituationVO.builder()
|
||||
.valueAddedServiceIncome(jitterLong(Baseline.COMP_INCOME, r))
|
||||
.inventoryTurnover(Math.max(1, jitterInt(Baseline.COMP_TURNOVER, r)))
|
||||
.orderCount(Math.max(0, jitterInt(Baseline.COMP_ORDERS, r)))
|
||||
.vehicleUtilizationRate(jitterPercentDouble(Baseline.COMP_VEHICLE_PCT, r))
|
||||
.fuelConsumptionPerHundredKm(Math.max(1, jitterInt(Baseline.COMP_FUEL, r)))
|
||||
.incomeTrend(jitterIntArray(Baseline.COMP_INCOME_TREND, r))
|
||||
.build();
|
||||
}
|
||||
|
||||
public static WarehouseTransportSituationVO warehouseTransport(Random r) {
|
||||
List<Integer> dock = new ArrayList<>();
|
||||
for (int v : Baseline.W_DOCK) {
|
||||
dock.add(jitterPercentInt(v, r));
|
||||
}
|
||||
List<Integer> custAmt = new ArrayList<>();
|
||||
for (int v : Baseline.W_CUST_AMT) {
|
||||
custAmt.add(jitterInt(v, r));
|
||||
}
|
||||
return WarehouseTransportSituationVO.builder()
|
||||
.warehouseDistributionOnTimeRate(jitterPercentDouble(Baseline.W_WH_RATE, r))
|
||||
.currentYearOrders(jitterLong(Baseline.W_YEAR_ORD, r))
|
||||
.currentQuarterOrders(Math.max(0, jitterInt(Baseline.W_Q_ORD, r)))
|
||||
.currentMonthOrders(Math.max(0, jitterInt(Baseline.W_M_ORD, r)))
|
||||
.warehouseOrderTrend(jitterIntArray(Baseline.W_WH_TREND, r))
|
||||
.throughput(jitterIntArray(Baseline.W_THROUGH, r))
|
||||
.currentMonthTurnoverRate(Math.max(1, jitterInt(Baseline.W_M_TOR, r)))
|
||||
.currentYearTurnoverRate(Math.max(1, jitterInt(Baseline.W_Y_TOR, r)))
|
||||
.inventoryTurnoverTrend(jitterIntArray(Baseline.W_INV_TR, r))
|
||||
.totalTransportIncome(Math.max(0, jitterInt(Baseline.W_INCOME, r)))
|
||||
.orderCount(Math.max(0, jitterInt(Baseline.W_ORD, r)))
|
||||
.transportTrips(Math.max(0, jitterInt(Baseline.W_TRIPS, r)))
|
||||
.annualTransportVolume(Math.max(0, jitterInt(Baseline.W_VOL, r)))
|
||||
.transportOrderTotal(Math.max(0, jitterInt(Baseline.W_TOT, r)))
|
||||
.crossBorderTransportOrder(Math.max(0, jitterInt(Baseline.W_CB, r)))
|
||||
.domesticTransportOrder(Math.max(0, jitterInt(Baseline.W_DM, r)))
|
||||
.transportTripsTrend(jitterIntArray(Baseline.W_TRIP_TR, r))
|
||||
.vehicleUtilizationRate(jitterIntArray(Baseline.W_VEH_UT, r))
|
||||
.warehouseDockSyncRate(dock)
|
||||
.customerContributionRank(CustomerContributionRankVO.builder()
|
||||
.customerName(Arrays.asList(Baseline.W_CUST_NAMES))
|
||||
.customerAmount(custAmt)
|
||||
.build())
|
||||
.build();
|
||||
}
|
||||
|
||||
public static PlatformSurveillanceVO platformSurveillance(Random r) {
|
||||
List<PlatformVehicleItemVO> vehicles = new ArrayList<>();
|
||||
for (String[] row : Baseline.P_PLATES) {
|
||||
int dur = jitterInt(Integer.parseInt(row[3]), r);
|
||||
vehicles.add(PlatformVehicleItemVO.builder()
|
||||
.plateNumber(row[0])
|
||||
.status(row[1])
|
||||
.platformId(row[2])
|
||||
.platformDuration(Math.max(1, dur))
|
||||
.build());
|
||||
}
|
||||
|
||||
EfficiencyStatisticsVO eff = EfficiencyStatisticsVO.builder()
|
||||
.entryOvertimeRate(jitterPercentInt(Baseline.P_ENT_OT, r))
|
||||
.overtimeCount(Math.max(0, jitterInt(Baseline.P_OT_CNT, r)))
|
||||
.platformOnTimeRate(jitterPercentInt(Baseline.P_PL_OT, r))
|
||||
.avgPlatformDuration(Math.max(0.1, jitterDouble(Baseline.P_AVG_PL, r)))
|
||||
.yardOnTimeRate(jitterPercentInt(Baseline.P_YD_OT, r))
|
||||
.avgYardDuration(Math.max(0.1, jitterDouble(Baseline.P_AVG_YD, r)))
|
||||
.build();
|
||||
|
||||
PlatformOverviewVO overview = PlatformOverviewVO.builder()
|
||||
.totalPlatforms(Math.max(1, jitterInt(Baseline.P_TOT_PL, r)))
|
||||
.currentOccupancyRate(jitterPercentInt(Baseline.P_OCC, r))
|
||||
.operatingPlatforms(Math.max(0, jitterInt(Baseline.P_OP, r)))
|
||||
.todayTasks(Math.max(0, jitterInt(Baseline.P_TASKS, r)))
|
||||
.build();
|
||||
|
||||
VehicleStatusVO vs = VehicleStatusVO.builder()
|
||||
.todayReservedVehicles(Math.max(0, jitterInt(Baseline.P_RESV, r)))
|
||||
.notCheckedIn(Math.max(0, jitterInt(Baseline.P_NC, r)))
|
||||
.operatingVehicles(Math.max(0, jitterInt(Baseline.P_OPV, r)))
|
||||
.completedVehicles(Math.max(0, jitterInt(Baseline.P_DONE, r)))
|
||||
.build();
|
||||
|
||||
List<AvgOperationDurationTrendItemVO> avgTrend = new ArrayList<>();
|
||||
for (int i = 0; i < Baseline.P_MO_LABELS.length; i++) {
|
||||
avgTrend.add(AvgOperationDurationTrendItemVO.builder()
|
||||
.month(Baseline.P_MO_LABELS[i])
|
||||
.yardDuration(Math.max(0.0, jitterDouble(Baseline.P_YD_D[i], r)))
|
||||
.platformDuration(Math.max(0.0, jitterDouble(Baseline.P_PL_D[i], r)))
|
||||
.build());
|
||||
}
|
||||
|
||||
MonthlyTaskStatisticsVO monthly = MonthlyTaskStatisticsVO.builder()
|
||||
.taskTotal(Math.max(0, jitterInt(Baseline.P_MT_TOT, r)))
|
||||
.taskTotalYoY(jitterInt(Baseline.P_MT_YOY, r))
|
||||
.avgTaskDuration(Math.max(0.1, jitterDouble(Baseline.P_MT_AVG, r)))
|
||||
.avgDurationYoY(jitterInt(Baseline.P_MT_AVG_YOY, r))
|
||||
.taskCompletionRate(jitterPercentInt(Baseline.P_MT_CR, r))
|
||||
.completionRateYoY(jitterInt(Baseline.P_MT_CR_YOY, r))
|
||||
.build();
|
||||
|
||||
List<TaskLoadItemVO> load = new ArrayList<>();
|
||||
for (int i = 0; i < Baseline.P_LOAD_T.length; i++) {
|
||||
load.add(TaskLoadItemVO.builder()
|
||||
.time(Baseline.P_LOAD_T[i])
|
||||
.taskCount(Math.max(0, jitterInt(Baseline.P_LOAD_C[i], r)))
|
||||
.build());
|
||||
}
|
||||
|
||||
List<PlatformAlarmTrendItemVO> alarmTrend = new ArrayList<>();
|
||||
for (int i = 0; i < Baseline.P_AL_D.length; i++) {
|
||||
alarmTrend.add(PlatformAlarmTrendItemVO.builder()
|
||||
.date(Baseline.P_AL_D[i])
|
||||
.alarmCount(Math.max(0, jitterInt(Baseline.P_AL_C[i], r)))
|
||||
.build());
|
||||
}
|
||||
|
||||
List<TaskTypeCountItemVO> typeCounts = new ArrayList<>();
|
||||
for (int i = 0; i < Baseline.P_TT_TYPES.length; i++) {
|
||||
typeCounts.add(TaskTypeCountItemVO.builder()
|
||||
.type(Baseline.P_TT_TYPES[i])
|
||||
.count(Math.max(0, jitterInt(Baseline.P_TT_CNT[i], r)))
|
||||
.build());
|
||||
}
|
||||
|
||||
int todayAl = Math.max(0, jitterInt(Baseline.P_AL_TOT, r));
|
||||
int handled = Math.max(0, jitterInt(Baseline.P_AL_H, r));
|
||||
handled = Math.min(handled, todayAl);
|
||||
int unhandled = Math.max(0, todayAl - handled);
|
||||
|
||||
List<PlatformAlarmDistItemVO> dist = new ArrayList<>();
|
||||
for (int i = 0; i < Baseline.P_DIST_T.length; i++) {
|
||||
dist.add(PlatformAlarmDistItemVO.builder()
|
||||
.type(Baseline.P_DIST_T[i])
|
||||
.count(Math.max(0, jitterInt(Baseline.P_DIST_C[i], r)))
|
||||
.build());
|
||||
}
|
||||
|
||||
return PlatformSurveillanceVO.builder()
|
||||
.vehicles(vehicles)
|
||||
.efficiencyStatistics(eff)
|
||||
.platformOverview(overview)
|
||||
.vehicleStatus(vs)
|
||||
.avgOperationDurationTrend(avgTrend)
|
||||
.monthlyTaskStatistics(monthly)
|
||||
.taskLoadStatistics(load)
|
||||
.platformAlarmTrend(alarmTrend)
|
||||
.taskTypeStatistics(TaskTypeStatisticsVO.builder()
|
||||
.totalTasks(Math.max(0, jitterInt(Baseline.P_TT_TOT, r)))
|
||||
.taskTypes(typeCounts)
|
||||
.build())
|
||||
.platformAlarmStatistics(PlatformAlarmStatisticsVO.builder()
|
||||
.todayAlarmTotal(todayAl)
|
||||
.handled(handled)
|
||||
.unhandled(unhandled)
|
||||
.build())
|
||||
.platformAlarmDistribution(dist)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 基准与 SQL 脚本 alternate sample 一致
|
||||
*/
|
||||
private static final class Baseline {
|
||||
static final long COMP_INCOME = 6_185_000L;
|
||||
static final int COMP_TURNOVER = 18;
|
||||
static final int COMP_ORDERS = 50_120;
|
||||
static final double COMP_VEHICLE_PCT = 93.2;
|
||||
static final int COMP_FUEL = 12;
|
||||
static final int[] COMP_INCOME_TREND = {195, 248, 302, 415, 366, 488};
|
||||
|
||||
static final double W_WH_RATE = 96.8;
|
||||
static final long W_YEAR_ORD = 612_800L;
|
||||
static final int W_Q_ORD = 198_600;
|
||||
static final int W_M_ORD = 28_440;
|
||||
static final int[] W_WH_TREND = {82, 91, 77, 68, 103, 89};
|
||||
static final int[] W_THROUGH = {18, 11, 26, 15, 9, 21};
|
||||
static final int W_M_TOR = 4;
|
||||
static final int W_Y_TOR = 5;
|
||||
static final int[] W_INV_TR = {16, 19, 11, 24, 18, 14};
|
||||
static final int W_INCOME = 7_230;
|
||||
static final int W_ORD = 912;
|
||||
static final int W_TRIPS = 601;
|
||||
static final int W_VOL = 22;
|
||||
static final int W_TOT = 5_100;
|
||||
static final int W_CB = 2_680;
|
||||
static final int W_DM = 2_420;
|
||||
static final int[] W_TRIP_TR = {120, 95, 210, 155, 88, 175};
|
||||
static final int[] W_VEH_UT = {520, 410, 380, 500, 590, 480};
|
||||
static final int[] W_DOCK = {96, 91, 82, 75, 99, 88};
|
||||
static final String[] W_CUST_NAMES = {"华东冷链", "华南汽配", "西南快消", "华北家电", "跨境达"};
|
||||
static final int[] W_CUST_AMT = {198, 172, 205, 189, 221};
|
||||
|
||||
static final String[][] P_PLATES = {
|
||||
{"粤A12345", "待入场", "#12", "88"},
|
||||
{"闽D99887", "作业中", "#07", "142"},
|
||||
{"粤B66220", "已离园", "#29", "201"}
|
||||
};
|
||||
static final int P_ENT_OT = 42;
|
||||
static final int P_OT_CNT = 28;
|
||||
static final int P_PL_OT = 88;
|
||||
static final double P_AVG_PL = 3.8;
|
||||
static final int P_YD_OT = 91;
|
||||
static final double P_AVG_YD = 5.2;
|
||||
static final int P_TOT_PL = 58;
|
||||
static final int P_OCC = 62;
|
||||
static final int P_OP = 31;
|
||||
static final int P_TASKS = 418;
|
||||
static final int P_RESV = 2_850;
|
||||
static final int P_NC = 920;
|
||||
static final int P_OPV = 1_180;
|
||||
static final int P_DONE = 1_420;
|
||||
static final String[] P_MO_LABELS = {"5月", "6月", "7月"};
|
||||
static final double[] P_YD_D = {12, 16, 19};
|
||||
static final double[] P_PL_D = {19, 21, 18};
|
||||
static final int P_MT_TOT = 1_820;
|
||||
static final int P_MT_YOY = 8;
|
||||
static final double P_MT_AVG = 5.1;
|
||||
static final int P_MT_AVG_YOY = -3;
|
||||
static final int P_MT_CR = 97;
|
||||
static final int P_MT_CR_YOY = 2;
|
||||
static final String[] P_LOAD_T = {"8时", "10时", "14时"};
|
||||
static final int[] P_LOAD_C = {45, 120, 156};
|
||||
static final String[] P_AL_D = {"1日", "2日", "3日"};
|
||||
static final int[] P_AL_C = {6, 9, 4};
|
||||
static final int P_TT_TOT = 5_100;
|
||||
static final String[] P_TT_TYPES = {"干线发车", "城配到仓", "跨境保税"};
|
||||
static final int[] P_TT_CNT = {2_100, 1_800, 1_200};
|
||||
static final int P_AL_TOT = 9;
|
||||
static final int P_AL_H = 8;
|
||||
static final String[] P_DIST_T = {"仓储-温湿度", "月台-停留超时", "园区-证件异常"};
|
||||
static final int[] P_DIST_C = {120, 95, 77};
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.mhd.bi.interfaces.facadeApi.biReport;
|
||||
|
||||
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.biWarehouseTransport.service.BiWarehouseTransportReportService;
|
||||
@@ -14,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@@ -36,6 +38,16 @@ public class BiReportApi extends BaseController {
|
||||
@Autowired
|
||||
private BiPlatformSurveillanceReportService biPlatformSurveillanceReportService;
|
||||
|
||||
@Autowired
|
||||
private BiReportSnapshotSyncService biReportSnapshotSyncService;
|
||||
|
||||
|
||||
@ApiOperation(value = "手动触发快照同步", notes = "立即写入三张快照表;须带 X-BI-Access-Token")
|
||||
@PostMapping("/snapshotSync/run")
|
||||
public BiApiResult<Void> runSnapshotSyncOnce() {
|
||||
biReportSnapshotSyncService.syncAllSnapshots();
|
||||
return BiApiResult.ok(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 综合态势指标查询(按照 del_flag=1,按 create_time 最新一条)
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
# Tomcat
|
||||
server:
|
||||
port: 8021
|
||||
|
||||
# BI 报表开放接口(/biReport):请求头 X-BI-Access-Token 须与 mhd.bi.access-token 一致
|
||||
mhd:
|
||||
bi:
|
||||
access-token: BI_TOKEN_8x7kL9mN2pQr5vWy3zA6cB
|
||||
|
||||
# Spring
|
||||
spring:
|
||||
application:
|
||||
@@ -18,9 +12,9 @@ spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
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
|
||||
@@ -29,9 +23,9 @@ spring:
|
||||
# username: nacos
|
||||
# password: manhuoda@2023
|
||||
config:
|
||||
# server-addr: 127.0.0.1:8848
|
||||
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
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<?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.biSnapshotSync.repository.mapper.BiSnapshotWriteMapper">
|
||||
|
||||
<insert id="insertComprehensiveSnapshot">
|
||||
insert into NGWL_TEST_BI.BI_COMPREHENSIVE_SNAPSHOT (PAYLOAD_JSON, CREATE_TIME, UPDATE_TIME, DEL_FLAG, REMARK)
|
||||
values (#{payloadJson}, SYSDATE, SYSDATE, 1, #{remark})
|
||||
</insert>
|
||||
|
||||
<insert id="insertWarehouseTransportSnapshot">
|
||||
insert into NGWL_TEST_BI.BI_WAREHOUSE_TRANSPORT_SNAPSHOT (PAYLOAD_JSON, CREATE_TIME, UPDATE_TIME, DEL_FLAG, REMARK)
|
||||
values (#{payloadJson}, SYSDATE, SYSDATE, 1, #{remark})
|
||||
</insert>
|
||||
|
||||
<insert id="insertPlatformSurveillanceSnapshot">
|
||||
insert into NGWL_TEST_BI.BI_PLATFORM_SURVEILLANCE_SNAPSHOT (PAYLOAD_JSON, CREATE_TIME, UPDATE_TIME, DEL_FLAG, REMARK)
|
||||
values (#{payloadJson}, SYSDATE, SYSDATE, 1, #{remark})
|
||||
</insert>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user