Commit 2e1b7cd1 by Leo Zheng

给左边部分的API增加注释

parent 176e3a5b
/**寿州古城智慧调度事件态势感知 */ /**
* getData.ts
* 该文件定义了用于处理请求并根据不同策略发送响应的函数。
*/
// 导入 strategyFactory,以便根据请求内容创建适当的策略。
import { strategyFactory } from "./strategies/strategyFactory"; import { strategyFactory } from "./strategies/strategyFactory";
/** /**
* 主界面 * 处理获取数据的主要请求。
* @param req * @param req - 请求对象,包含查询参数。
* @param res * @param res - 响应对象,用于将结果发送回客户端。
*/ */
export function getData(req, res) { export function getData(req, res) {
const strategy = strategyFactory.createStrategy(req.query.content) // 根据请求查询内容创建策略。
const strategy = strategyFactory.createStrategy(req.query.content);
// 使用请求参数执行策略并获取结果。
let ret = strategy.execute(req); let ret = strategy.execute(req);
// 将结果发送回客户端。
res.send(ret); res.send(ret);
} }
/**
* 一个简单的测试函数,用于检查服务器是否正常工作。
* @param req - 请求对象。
* @param res - 响应对象。
*/
export function test(req, res) { export function test(req, res) {
res.send("Success!"); res.send("Success!");
} }
\ No newline at end of file
import { DataExtractor } from "../../util/dataExtractor"; /**
* dataStrategy.ts
* 该文件定义了一个数据策略接口。
*/
/**
* 数据策略接口,所有具体策略类都需要实现该接口。
*/
export interface dataStrategy { export interface dataStrategy {
/**
* 执行策略的方法。
* @param params - 可选参数。
* @returns 执行结果。
*/
execute(params?: any): any; execute(params?: any): any;
} }
\ No newline at end of file
/**
* abstractDataStrategyLeft.ts
* 该文件定义了一个抽象类,用于左侧数据策略的基础实现。
*/
import { dataStrategy } from "../dataStrategy"; import { dataStrategy } from "../dataStrategy";
import {DataExtractor} from "../../../util/dataExtractor"; import { DataExtractor } from "../../../util/dataExtractor";
/**
* 抽象数据策略左侧类,所有具体策略类都需要继承该抽象类。
*/
export abstract class abstractDataStrategyLeft implements dataStrategy { export abstract class abstractDataStrategyLeft implements dataStrategy {
// 实例化数据提取器
extractor = DataExtractor.getInstance(); extractor = DataExtractor.getInstance();
static readonly FILENAME = '票务系统.xlsx'; static readonly FILENAME = '票务系统.xlsx';
static readonly SHEETNAME = '票务系统-订单主表'; static readonly SHEETNAME = '票务系统-订单主表';
static readonly TIMEDIFFERENCE = 8; static readonly TIMEDIFFERENCE = 8;
execute(params?: any): any { /**
} * 执行策略的方法,具体实现由子类提供。
* @param params - 可选参数。
} */
\ No newline at end of file abstract execute(params?: any): any;
}
/**
* gateStatusStrategy.ts
* 该文件定义了门状态策略的具体实现。
*/
import { randomStatusGenerator } from "../../../util/randomStatusGenerator"; import { randomStatusGenerator } from "../../../util/randomStatusGenerator";
import mapToObj from "../../../util/mapToObj"; import mapToObj from "../../../util/mapToObj";
import {abstractDataStrategyLeft} from "./abstractDataStrategyLeft"; import { abstractDataStrategyLeft } from "./abstractDataStrategyLeft";
/**
* 门状态策略类,继承自 abstractDataStrategyLeft。
*/
export class gateStatusStrategy extends abstractDataStrategyLeft { export class gateStatusStrategy extends abstractDataStrategyLeft {
private gateStatusMap: Map<string, string> = new Map(); private gateStatusMap: Map<string, string> = new Map();
constructor() { constructor() {
super(); super();
// 初始化门状态映射
this.gateStatusMap.set('south', ''); this.gateStatusMap.set('south', '');
this.gateStatusMap.set('east', ''); this.gateStatusMap.set('east', '');
this.gateStatusMap.set('west', ''); this.gateStatusMap.set('west', '');
this.gateStatusMap.set('north', ''); this.gateStatusMap.set('north', '');
} }
/**
* 执行门状态策略,生成随机的门状态。
* @returns 门状态的对象表示。
*/
execute(): any { execute(): any {
this.gateStatusMap.forEach((value, key, map) => { this.gateStatusMap.forEach((value, key, map) => {
map.set(key, randomStatusGenerator.getRandomStatus()); map.set(key, randomStatusGenerator.getRandomStatus());
...@@ -19,8 +34,11 @@ export class gateStatusStrategy extends abstractDataStrategyLeft { ...@@ -19,8 +34,11 @@ export class gateStatusStrategy extends abstractDataStrategyLeft {
return mapToObj(this.gateStatusMap); return mapToObj(this.gateStatusMap);
} }
/**
* 获取门状态映射。
* @returns 门状态映射。
*/
getGateStatusMap() { getGateStatusMap() {
return this.gateStatusMap; return this.gateStatusMap;
} }
}
}
\ No newline at end of file
/**
* guchengLoadStrategy.ts
* 该文件定义了古城负载状态策略的具体实现。
*/
import { randomStatusGenerator } from "../../../util/randomStatusGenerator"; import { randomStatusGenerator } from "../../../util/randomStatusGenerator";
import {abstractDataStrategyLeft} from "./abstractDataStrategyLeft"; import { abstractDataStrategyLeft } from "./abstractDataStrategyLeft";
/**
* 古城负载策略类,继承自 abstractDataStrategyLeft。
*/
export class guchengLoadStrategy extends abstractDataStrategyLeft { export class guchengLoadStrategy extends abstractDataStrategyLeft {
/**
* 执行古城负载策略,生成随机的负载状态。
* @returns 随机的负载状态。
*/
execute(): any { execute(): any {
return randomStatusGenerator.getRandomStatus(); return randomStatusGenerator.getRandomStatus();
} }
} }
\ No newline at end of file
/**
* sightVisitorFlowByDayStrategy.ts
* 该文件定义了按天计算的游客流量策略的具体实现。
*/
import { randomStatusGenerator } from "../../../util/randomStatusGenerator"; import { randomStatusGenerator } from "../../../util/randomStatusGenerator";
import excelSerialToJSDate from "../../../util/excelDateToJSDate"; import excelSerialToJSDate from "../../../util/excelDateToJSDate";
import {abstractDataStrategyLeft} from "./abstractDataStrategyLeft"; import {abstractDataStrategyLeft} from "./abstractDataStrategyLeft";
/**
* 按天计算的游客流量策略类,继承自 abstractDataStrategyLeft。
*/
export class sightVisitorFlowByDayStrategy extends abstractDataStrategyLeft { export class sightVisitorFlowByDayStrategy extends abstractDataStrategyLeft {
/**
* 执行按天计算的游客流量策略。
* @param params - 请求参数,包含日期信息。
* @returns 每小时的游客流量映射。
*/
execute(params?: any): any { execute(params?: any): any {
if (!params || !params.query || !params.query.date) { if (!params || !params.query || !params.query.date) {
throw new Error("Date parameter is required.") throw new Error("Date parameter is required.")
...@@ -11,11 +24,17 @@ export class sightVisitorFlowByDayStrategy extends abstractDataStrategyLeft { ...@@ -11,11 +24,17 @@ export class sightVisitorFlowByDayStrategy extends abstractDataStrategyLeft {
return this.getVisitorFlowByDay(sightData, params.query.date); return this.getVisitorFlowByDay(sightData, params.query.date);
} }
/**
* 获取指定日期所有景点的游客流量和景点状态。
* @param data - 从数据源提取的数据。
* @param date - 指定日期。
* @returns 每小时的游客流量映射。
*/
private getVisitorFlowByDay(data: any, date: string) { private getVisitorFlowByDay(data: any, date: string) {
const visitorCount: { [sight: string]: { count: number, status: string } } = {}; const visitorCount: { [sight: string]: { count: number, status: string } } = {};
data.forEach(row => { data.forEach(row => {
const rowDate = excelSerialToJSDate(row['游玩时间']); const rowDate = excelSerialToJSDate(row['游玩时间']);
let rowDateString = ''; let rowDateString;
try { try {
rowDateString = rowDate.toISOString().split('T')[0]; rowDateString = rowDate.toISOString().split('T')[0];
} }
......
/**
* sightVisitorFlowPerHourStrategy.ts
* 该文件定义了每小时计算的游客流量策略的具体实现,获取制定景点在指定日期的每小时游客流量。
*/
import excelSerialToJSDate from "../../../util/excelDateToJSDate"; import excelSerialToJSDate from "../../../util/excelDateToJSDate";
import mapToObj from "../../../util/mapToObj"; import mapToObj from "../../../util/mapToObj";
import {abstractDataStrategyLeft} from "./abstractDataStrategyLeft"; import {abstractDataStrategyLeft} from "./abstractDataStrategyLeft";
/**
* 每小时计算的游客流量策略类,继承自 abstractDataStrategyLeft。
*/
export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft { export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
/**
* 执行每小时计算的游客流量策略。
* @param params - 请求参数,包含景点和日期信息。
* @returns 指定景点指定日期的每小时的游客流量映射。
*/
execute(params?: any): any { execute(params?: any): any {
if (!params || !params.query || !params.query.date || !params.query.sight) { if (!params || !params.query || !params.query.date || !params.query.sight) {
throw new Error('Date and sight parameters are required.'); throw new Error('Date and sight parameters are required.');
...@@ -12,6 +25,13 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -12,6 +25,13 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
return mapToObj(this.getVisitorFlowByHour(sightData, params.query.sight, params.query.date)); return mapToObj(this.getVisitorFlowByHour(sightData, params.query.sight, params.query.date));
} }
/**
* 获取指定日期的每小时游客流量。
* @param data - 从数据源提取的数据。
* @param date - 指定日期。
* @param sight - 指定景点。
* @returns 指定景点指定日期的每小时的游客流量映射。
*/
private getVisitorFlowByHour(data: any, sight: string, date: string) { private getVisitorFlowByHour(data: any, sight: string, date: string) {
const visitorCount: Map<number, number> = new Map(); const visitorCount: Map<number, number> = new Map();
for (let hour = 0; hour < 24; hour++) { for (let hour = 0; hour < 24; hour++) {
...@@ -20,7 +40,7 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -20,7 +40,7 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
data.forEach(row => { data.forEach(row => {
const rowDate = excelSerialToJSDate(row['游玩时间']); const rowDate = excelSerialToJSDate(row['游玩时间']);
let rowDateString = ''; let rowDateString;
try { try {
rowDateString = rowDate.toISOString().split('T')[0]; rowDateString = rowDate.toISOString().split('T')[0];
} }
......
/**
* totalVisitorFlowByHourStrategy.ts
* 该文件定义了按小时计算的总游客流量策略的具体实现,获取指定日期整个景区的各类人群客流量分布
*/
import excelSerialToJSDate from "../../../util/excelDateToJSDate"; import excelSerialToJSDate from "../../../util/excelDateToJSDate";
import mapToObj from "../../../util/mapToObj"; import mapToObj from "../../../util/mapToObj";
import {abstractDataStrategyLeft} from "./abstractDataStrategyLeft"; import {abstractDataStrategyLeft} from "./abstractDataStrategyLeft";
/**
* 按小时计算的总游客流量策略类,继承自 abstractDataStrategyLeft。
*/
export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft { export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
/**
* 执行按小时计算的总游客流量策略。
* @param params - 请求参数,包含日期信息。
* @returns 全景区各类每小时各类游客流量。
*/
execute(params?: any): any { execute(params?: any): any {
if (!params || !params.query || !params.query.date) { if (!params || !params.query || !params.query.date) {
throw new Error('Date parameter is required.'); throw new Error('Date parameter is required.');
...@@ -13,15 +25,29 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -13,15 +25,29 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
return mapToObj(this.getTotalVisitorFlowByHour(sightData, params.query.date)); return mapToObj(this.getTotalVisitorFlowByHour(sightData, params.query.date));
} }
/**
* 获取指定日期的每小时总游客流量。
* @param data - 从数据源提取的数据。
* @param date - 指定日期。
* @returns 全景区各类每小时各类游客流量。
*/
private getTotalVisitorFlowByHour(data: any, date: string) { private getTotalVisitorFlowByHour(data: any, date: string) {
const visitorCount: Map<number, number> = new Map(); console.log("here!");
for (let hour = 0; hour < 24; hour++) { const visitorCount: Map<string, Map<number, number>> = new Map();
visitorCount.set(hour, 0); visitorCount.set('儿童', new Map());
} visitorCount.set('其他', new Map());
visitorCount.set('学生', new Map());
visitorCount.set('老人', new Map());
visitorCount.forEach((value) => {
for (let hour = 0; hour < 24; hour++) {
value.set(hour, 0);
}
});
data.forEach(row => { data.forEach(row => {
const rowDate = excelSerialToJSDate(row['游玩时间']); const rowDate = excelSerialToJSDate(row['游玩时间']);
let rowDateString = ''; let rowDateString;
try { try {
rowDateString = rowDate.toISOString().split('T')[0]; rowDateString = rowDate.toISOString().split('T')[0];
} }
...@@ -32,9 +58,9 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -32,9 +58,9 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
rowDate.setHours(rowDate.getHours() - 8); rowDate.setHours(rowDate.getHours() - 8);
const rowHour = rowDate.getHours(); const rowHour = rowDate.getHours();
if (rowDateString == date) { if (rowDateString == date) {
visitorCount.set(rowHour, (visitorCount.get(rowHour) || 0) + 1); visitorCount.set(row['订单游客类型'],visitorCount.get(row['订单游客类型']).set(rowHour, (visitorCount.get(row['订单游客类型']).get(rowHour) || 0) + 1));
console.log(row['订单游客类型'], 'set!');
} }
}); });
return visitorCount; return visitorCount;
......
/**
* totalVisitorFlowStrategy.ts
* 该文件定义了总游客流量策略的具体实现。
*/
import excelSerialToJSDate from "../../../util/excelDateToJSDate"; import excelSerialToJSDate from "../../../util/excelDateToJSDate";
import mapToObj from "../../../util/mapToObj"; import mapToObj from "../../../util/mapToObj";
import { abstractDataStrategyLeft } from "./abstractDataStrategyLeft"; import { abstractDataStrategyLeft } from "./abstractDataStrategyLeft";
/**
* 总游客流量策略类,继承自 abstractDataStrategyLeft。
*/
export class totalVisitorFlowStrategy extends abstractDataStrategyLeft { export class totalVisitorFlowStrategy extends abstractDataStrategyLeft {
/**
* 执行总游客流量策略。
* @param params - 请求参数,包含日期信息。
* @returns 每小时的全景区各类游客流量。
*/
execute(params?: any): any { execute(params?: any): any {
if (!params || !params.query || !params.query.date) { if (!params || !params.query || !params.query.date) {
throw new Error("Date parameter is required.") throw new Error("Date parameter is required.")
...@@ -12,13 +25,19 @@ export class totalVisitorFlowStrategy extends abstractDataStrategyLeft { ...@@ -12,13 +25,19 @@ export class totalVisitorFlowStrategy extends abstractDataStrategyLeft {
return mapToObj(this.getTotalVisitorByDay(sightData, params.query.date)); return mapToObj(this.getTotalVisitorByDay(sightData, params.query.date));
} }
/**
* 获取指定日期的每小时总游客流量。
* @param data - 从数据源提取的数据。
* @param date - 指定日期。
* @returns 每小时的全景区各类游客流量。
*/
private getTotalVisitorByDay(data: any, date: string) { private getTotalVisitorByDay(data: any, date: string) {
const visitorCount: Map<string, number> = new Map(); const visitorCount: Map<string, number> = new Map();
visitorCount.set('total', 0); visitorCount.set('total', 0);
data.forEach(row => { data.forEach(row => {
const rowDate = excelSerialToJSDate(row['游玩时间']); const rowDate = excelSerialToJSDate(row['游玩时间']);
let rowDateString = ''; let rowDateString;
try { try {
rowDateString = rowDate.toISOString().split('T')[0]; rowDateString = rowDate.toISOString().split('T')[0];
} }
......
import {dataStrategy} from "./dataStrategy"; /**
* strategyFactory.ts
* 该文件定义了策略工厂类,用于创建各种数据策略。
*/
import {sightVisitorFlowByDayStrategy} from "./left/sightVisitorFlowByDayStrategy"; import { dataStrategy } from "./dataStrategy";
import {gateStatusStrategy} from "./left/gateStatusStrategy";
import {sightVisitorFlowByHourStrategy} from "./left/sightVisitorFlowPerHourStrategy";
import {guchengLoadStrategy} from "./left/guchengLoadStrategy";
import {totalVisitorFlowStrategy} from "./left/totalVisitorFlowStrategy";
import {totalVisitorFlowByHourStrategy} from "./left/totalVisitorFlowByHourStrategy";
import {currentEventStrategy} from "./middle/currentEventStrategy"; // 导入具体策略类
import {totalEventCountStrategy} from "./middle/totalEventCountStrategy"; import { sightVisitorFlowByDayStrategy } from "./left/sightVisitorFlowByDayStrategy";
import {allEventDataStrategy} from "./middle/eventDataStrategy"; import { gateStatusStrategy } from "./left/gateStatusStrategy";
import { sightVisitorFlowByHourStrategy } from "./left/sightVisitorFlowPerHourStrategy";
import { guchengLoadStrategy } from "./left/guchengLoadStrategy";
import { totalVisitorFlowStrategy } from "./left/totalVisitorFlowStrategy";
import { totalVisitorFlowByHourStrategy } from "./left/totalVisitorFlowByHourStrategy";
import { currentEventStrategy } from "./middle/currentEventStrategy";
import { totalEventCountStrategy } from "./middle/totalEventCountStrategy";
import {getEventCountByYearStrategy} from "./right/getEventCountByYearStrategy"; import { getEventCountByYearStrategy } from "./right/getEventCountByYearStrategy";
import {eventTimeDistributionStrategy} from "./right/eventTimeDistributionStrategy"; import { eventTimeDistributionStrategy } from "./right/eventTimeDistributionStrategy";
import {eventMonthDistributionStrategy} from "./right/eventMonthDistributionStrategy"; import { eventMonthDistributionStrategy } from "./right/eventMonthDistributionStrategy";
import {eventCategoryCountStrategy} from "./right/eventCategoryCountStrategy"; import { eventCategoryCountStrategy } from "./right/eventCategoryCountStrategy";
import {eventSubCategoryCountStrategy} from "./right/eventSubCategoryCountStrategy"; import { eventSubCategoryCountStrategy } from "./right/eventSubCategoryCountStrategy";
import {eventSrcStrategy} from "./right/eventSrcStrategy"; import { eventSrcStrategy } from "./right/eventSrcStrategy";
import {gridEventCountStrategy} from "./right/gridEventCountStrategy"; import { gridEventCountStrategy } from "./right/gridEventCountStrategy";
import {eventProcessingTimeStrategy} from "./right/eventProcessingTimeStrategy"; import { eventProcessingTimeStrategy } from "./right/eventProcessingTimeStrategy";
import {allEventDataStrategy} from "./middle/eventDataStrategy";
/**
* 策略工厂类,用于创建和管理各种数据策略。
*/
export class strategyFactory { export class strategyFactory {
/**
* 存储策略类型与其对应类的映射。
*/
private static strategies: { [key: string]: new () => dataStrategy } = { private static strategies: { [key: string]: new () => dataStrategy } = {
'allEvents': allEventDataStrategy, 'allEvents': allEventDataStrategy,
'sightVisitorFlowByDay': sightVisitorFlowByDayStrategy, 'sightVisitorFlowByDay': sightVisitorFlowByDayStrategy,
...@@ -41,16 +53,27 @@ export class strategyFactory { ...@@ -41,16 +53,27 @@ export class strategyFactory {
'getEventProcessingTime': eventProcessingTimeStrategy, 'getEventProcessingTime': eventProcessingTimeStrategy,
}; };
/**
* 创建并返回指定类型的策略实例。
* @param type - 策略类型的字符串标识。
* @returns 创建的策略实例。
* @throws 如果策略类型无效则抛出错误。
*/
static createStrategy(type: string): dataStrategy { static createStrategy(type: string): dataStrategy {
const StrategyClass = this.strategies[type]; const StrategyClass = this.strategies[type];
console.log(type, 'created!');
if (!StrategyClass) { if (!StrategyClass) {
throw new Error('Invalid strategy type.'); throw new Error('Invalid strategy type.');
} }
return new StrategyClass(); return new StrategyClass();
} }
/**
* 注册一个新的策略。
* @param type - 策略类型的字符串标识。
* @param strategy - 策略类。
*/
static registerStrategy(type: string, strategy: new () => dataStrategy) { static registerStrategy(type: string, strategy: new () => dataStrategy) {
this.strategies[type] = strategy; this.strategies[type] = strategy;
} }
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment