Commit b3ce4f36 by zhengyoujia

Merge branch 'test' into 'master'

Test

See merge request !8
parents 5061a810 05bd5f06
.idea .idea
/out /out
/node_modules /node_modules
/test /src/__test__
/public /public
/logs /logs
/video /video
/files /files
*test* src/__test__
*.logs *.logs
*.zip *.zip
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
moduleFileExtensions: ['ts', 'tsx', 'js'],
transform: {
'^.+\\.(ts|tsx)$': 'ts-jest',
},
testMatch: [
'**/src/**/*.test.(ts|tsx)',
],
globals: {
'ts-jest': {
tsconfig: 'tsconfig.json',
},
},
};
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
"xml2js": "^0.4.23" "xml2js": "^0.4.23"
}, },
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "jest"
}, },
"author": "cjj", "author": "cjj",
"license": "ISC", "license": "ISC",
...@@ -41,5 +41,11 @@ ...@@ -41,5 +41,11 @@
"video/**/*" "video/**/*"
], ],
"outputPath": "dist" "outputPath": "dist"
},
"devDependencies": {
"@types/jest": "^29.5.12",
"jest": "^29.7.0",
"ts-jest": "^29.1.5",
"typescript": "^5.5.3"
} }
} }
import { randomStatusGenerator } from "../../../util/randomStatusGenerator";
import mapToObj from "../../../util/mapToObj";
import {abstractDataStrategyLeft} from "./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', '');
}
execute(): any {
this.gateStatusMap.forEach((value, key, map) => {
map.set(key, randomStatusGenerator.getRandomStatus());
});
return mapToObj(this.gateStatusMap);
}
getGateStatusMap() {
return this.gateStatusMap;
}
}
\ No newline at end of file
...@@ -6,7 +6,7 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -6,7 +6,7 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
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.');
} }
const sightData = this.extractor.getData(sightVisitorFlowByHourStrategy.FILENAME, sightVisitorFlowByHourStrategy.SHEETNAME); const sightData = this.extractor.getData(sightVisitorFlowByHourStrategy.FILENAME, sightVisitorFlowByHourStrategy.SHEETNAME);
return mapToObj(this.getVisitorFlowByHour(sightData, params.query.sight, params.query.date)); return mapToObj(this.getVisitorFlowByHour(sightData, params.query.sight, params.query.date));
...@@ -20,7 +20,6 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -20,7 +20,6 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
data.forEach(row => { data.forEach(row => {
const rowDate = excelSerialToJSDate(row['游玩时间']); const rowDate = excelSerialToJSDate(row['游玩时间']);
const rowHour = rowDate.getHours();
let rowDateString = ''; let rowDateString = '';
try { try {
rowDateString = rowDate.toISOString().split('T')[0]; rowDateString = rowDate.toISOString().split('T')[0];
...@@ -30,6 +29,7 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -30,6 +29,7 @@ export class sightVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
} }
const rowSight = row['景点名称']; const rowSight = row['景点名称'];
rowDate.setHours(rowDate.getHours() - sightVisitorFlowByHourStrategy.TIMEDIFFERENCE); rowDate.setHours(rowDate.getHours() - sightVisitorFlowByHourStrategy.TIMEDIFFERENCE);
const rowHour = rowDate.getHours();
if (rowDateString == date && rowSight == sight) { if (rowDateString == date && rowSight == sight) {
visitorCount.set(rowHour, (visitorCount.get(rowHour) || 0) + 1); visitorCount.set(rowHour, (visitorCount.get(rowHour) || 0) + 1);
......
...@@ -7,7 +7,7 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -7,7 +7,7 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
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 parameters are required'); throw new Error('Date parameter is required.');
} }
const sightData = this.extractor.getData(totalVisitorFlowByHourStrategy.FILENAME, totalVisitorFlowByHourStrategy.SHEETNAME); const sightData = this.extractor.getData(totalVisitorFlowByHourStrategy.FILENAME, totalVisitorFlowByHourStrategy.SHEETNAME);
return mapToObj(this.getTotalVisitorFlowByHour(sightData, params.query.date)); return mapToObj(this.getTotalVisitorFlowByHour(sightData, params.query.date));
...@@ -21,7 +21,6 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -21,7 +21,6 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
data.forEach(row => { data.forEach(row => {
const rowDate = excelSerialToJSDate(row['游玩时间']); const rowDate = excelSerialToJSDate(row['游玩时间']);
const rowHour = rowDate.getHours();
let rowDateString = ''; let rowDateString = '';
try { try {
rowDateString = rowDate.toISOString().split('T')[0]; rowDateString = rowDate.toISOString().split('T')[0];
...@@ -29,7 +28,10 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft { ...@@ -29,7 +28,10 @@ export class totalVisitorFlowByHourStrategy extends abstractDataStrategyLeft {
catch (e) { catch (e) {
rowDateString = 'invalid time'; rowDateString = 'invalid time';
} }
rowDate.setHours(rowDate.getHours() - totalVisitorFlowByHourStrategy.TIMEDIFFERENCE);
rowDate.setHours(rowDate.getHours() - 8);
const rowHour = rowDate.getHours();
if (rowDateString == date) { if (rowDateString == date) {
visitorCount.set(rowHour, (visitorCount.get(rowHour) || 0) + 1); visitorCount.set(rowHour, (visitorCount.get(rowHour) || 0) + 1);
......
...@@ -20,7 +20,7 @@ export abstract class abstractDataStrategyRight implements dataStrategy { ...@@ -20,7 +20,7 @@ export abstract class abstractDataStrategyRight implements dataStrategy {
protected paramsCheck(params) { protected paramsCheck(params) {
if (!params || !params.query || !params.query.year) { if (!params || !params.query || !params.query.year) {
throw new Error('Year parameters are required'); throw new Error('Year parameter is required.');
} }
} }
......
import {abstractDataStrategyRight} from "./abstractDataStrategyRight";
import excelSerialToJSDate from "../../../util/excelDateToJSDate";
import getRandomNumber from "../../../util/randomNumberGenerator";
export class dispatchTimeStrategy extends abstractDataStrategyRight {
execute(params?: any): any {
this.paramsCheck(params);
return this.getAverageDispatchTime(this.eventData, params.query.year);
}
private getAverageDispatchTime(data: any, year: number) {
let count = 0, time = 0;
data.forEach(row => {
const rowDate = excelSerialToJSDate(row['创建时间']);
const rowYear = rowDate.getFullYear();
if (rowYear == year) {
if (row['处置状态'] == '待调度') {
time = getRandomNumber(0.5, 1.7, 1);
count++;
}
}
})
return time / count;
}
}
\ No newline at end of file
...@@ -16,6 +16,7 @@ export class eventMonthDistributionStrategy extends abstractDataStrategyRight { ...@@ -16,6 +16,7 @@ export class eventMonthDistributionStrategy extends abstractDataStrategyRight {
data.forEach(row => { data.forEach(row => {
const rowDate = excelSerialToJSDate(row['创建时间']); const rowDate = excelSerialToJSDate(row['创建时间']);
rowDate.setHours(rowDate.getHours() - eventMonthDistributionStrategy.TIMEDIFFERENCE);
const rowYear = rowDate.getFullYear(); const rowYear = rowDate.getFullYear();
const rowMonth = rowDate.getMonth(); const rowMonth = rowDate.getMonth();
......
...@@ -16,10 +16,9 @@ export class eventTimeDistributionStrategy extends abstractDataStrategyRight { ...@@ -16,10 +16,9 @@ export class eventTimeDistributionStrategy extends abstractDataStrategyRight {
data.forEach(row => { data.forEach(row => {
const rowDate = excelSerialToJSDate(row['创建时间']); const rowDate = excelSerialToJSDate(row['创建时间']);
rowDate.setHours(rowDate.getHours() - eventTimeDistributionStrategy.TIMEDIFFERENCE);
const rowHour = rowDate.getHours() const rowHour = rowDate.getHours()
const rowYear = rowDate.getFullYear(); const rowYear = rowDate.getFullYear();
rowDate.setHours(rowDate.getHours() - eventTimeDistributionStrategy.TIMEDIFFERENCE);
if (rowYear == year) { if (rowYear == year) {
eventCount.set(rowHour, (eventCount.get(rowHour) || 0) + 1); eventCount.set(rowHour, (eventCount.get(rowHour) || 0) + 1);
} }
......
...@@ -38,7 +38,7 @@ export class strategyFactory { ...@@ -38,7 +38,7 @@ export class strategyFactory {
'getEventSubCategoryCount': eventSubCategoryCountStrategy, 'getEventSubCategoryCount': eventSubCategoryCountStrategy,
'getEventSourceCount': eventSrcStrategy, 'getEventSourceCount': eventSrcStrategy,
'getGridEventCount': gridEventCountStrategy, 'getGridEventCount': gridEventCountStrategy,
'getEventProcessingTime': eventProcessingTimeStrategy 'getEventProcessingTime': eventProcessingTimeStrategy,
}; };
static createStrategy(type: string): dataStrategy { static createStrategy(type: string): dataStrategy {
......
...@@ -20,7 +20,6 @@ export class DataExtractor { ...@@ -20,7 +20,6 @@ export class DataExtractor {
private loadAllData(): void { private loadAllData(): void {
const dirPath = join(__dirname, '../../src/data'); const dirPath = join(__dirname, '../../src/data');
const files = readdirSync(dirPath).filter(file => file.endsWith('.xlsx')); const files = readdirSync(dirPath).filter(file => file.endsWith('.xlsx'));
console.log(dirPath);
files.forEach(file => { files.forEach(file => {
const filePath = join(dirPath, file); const filePath = join(dirPath, 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