Commit 2e1b7cd1 by Leo Zheng

给左边部分的API增加注释

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