interface接口:只声名成员方法,不做实现
implement实现:实现接口(接口可实现多个)
extends继承类:可重写父类的方法(类只能继承一个)
class类:声明并实现方法
super:调用父类的方法,引用父类的构造函数
export enum TaskEnum {
ACCNPP,
AVEFVC,
QIMonthly,
NPPSLOPE,
FVCSLOPE,
QISLOPE,
BIOMASS,
BIOMASSSLOPE
}
const TEND = ["上", "中", "下"];
export class TaskFactory {
static getTask(initTask, taskEnum: TaskEnum): Task {
switch (taskEnum) {
case TaskEnum.ACCNPP:
if (initTask) {
let task = initTask["ACCNPP"];
class ACCNPP extends BaseTask {
readonly task_type = TaskEnum.ACCNPP;
readonly title_add = task["title_add"];
readonly task_name = task["task_name"];
readonly task_url = task["task_url"];
public style_name = task["style_name"];
}
return new ACCNPP();
}
break;
}
}
export interface TaskParam {
sy: string;
ey: string;
sm: string;
em: string;
reso?: string;
type: string;
asy?: string;
aey?: string;
remake?: string;
forestType?: string;
sat?: string
}
export interface Task {
readonly task_type: TaskEnum;
readonly title_add: string;
readonly task_name: string;
readonly task_url: string;
style_name: string;
taskParam: TaskParam;
initTaskParam(year: number, syear: number, winter: boolean, sDate: Date, eDate: Date, reso: string, sat: string, type: string, asy: string, aey: string, forestType: string)
analysisTaskParam(args: string)
translateDate(winter?: boolean): string;
translateType(): string;
initProductRuleName(style?: number, coverage?: string, formatter?: string): string;
getProductStartDate(dateStr: string, sIndex: number, eIndex: number): string;
getTitle(): string;
getStyle(style?: number): string;
isTaskParamNull(): boolean;
initGridInfoName(coverage?: string, formatter?: string, type?: string, argv?: string): string;
}
class BaseTask implements Task {
readonly task_type: TaskEnum;
readonly title_add: string;
readonly task_name: string;
readonly task_url: string;
public style_name: string;
private _taskParam: TaskParam;
public set taskParam(taskParam: TaskParam) {
this._taskParam = taskParam;
}
public get taskParam(): TaskParam {
if (!this._taskParam) {
throw new Error("taskParam is " + this._taskParam);
}
return this._taskParam;
}
getTitle(): string {
try {
return this.translateDate() + this.title;
} catch (error) {
return this.title;
}
}
getStyle(): string {
try {
return this.style_name;
} catch (error) {
return this.style_name;
}
}
isTaskParamNull(): boolean {
try {
return this.taskParam == null
} catch (error) {
return true;
}
}
initTaskParam(sDate: Date, eDate: Date, reso: string,) {
this.taskParam = {
meteo_type: this.meteo_type,
sy: sDate.getFullYear().toString(),
ey: eDate.getFullYear().toString(),
sm: (sDate.getMonth() + 1).toString().padStart(2, "0"),
em: (eDate.getMonth() + 1).toString().padStart(2, "0"),
vege_type: this.vege_type,
type: this.type,
reso: reso
}
return this.taskParam;
}
analysisTaskParam(args: string) {
try {
this.taskParam = null;
if (!args) {
console.warn("args is empty");
return;
}
let taskParam: TaskParam = JSON.parse(args) as TaskParam;
if (taskParam.meteo_type == this.meteo_type && taskParam.type == this.type && taskParam.vege_type == this.vege_type && taskParam.ey && taskParam.sy && taskParam.em.length == 2 && taskParam.sm.length == 2) {
if (this.isYears == "false" && taskParam.sy != taskParam.ey) { return }
if (this.isYears == "true" && taskParam.sy == taskParam.ey) { return }
this.taskParam = taskParam;
}
} catch (error) {
return;
}
}
translateType() {
try {
return this.title;
} catch (error) {
return;
}
}
translateDate(): string {
if (this.isYears == 'true') {
return `${this.taskParam.sy}年-${this.taskParam.ey}年${Number(this.taskParam.sm)}月-${Number(this.taskParam.em)}月`;
} else {
return `${this.taskParam.sy}年${Number(this.taskParam.sm)}月-${Number(this.taskParam.em)}月`;
}
}
initProductRuleName(coverage = "CHN", formatter = "img") {
let year = Number(this.taskParam.ey)
let eMonth = Number(this.taskParam.em)
let dayCount = ((new Date(year, eMonth, 1).getTime() - new Date(year, eMonth - 1, 1).getTime()) / 24 / 3600 / 1000).toString().padStart(2, "0");
let style = this.getStyle() == 'TAV' && this.taskParam.type == '2' ? 'AVETAV' : this.getStyle();
return `Z_AGME_C_BABJ_${this.taskParam.ey}${this.taskParam.em.padStart(2, "0")}${dayCount}000000_P_CAGMSS_WCRMECO_SCOP-${style}-${this.taskParam.sy}${this.taskParam.sm.padStart(2, "0")}01000000_1KM_${coverage.toUpperCase()}_L88_PD_000_00.${formatter.toLowerCase()}`;
}
getProductStartDate(dateStr: string, sIndex: number, eIndex: number) {
return dateStr.split("-")[dateStr.split("-").length - 1].substring(sIndex, eIndex);
}
static getTask(initTask, taskEnum: TaskEnum): Task {
switch (taskEnum) {
case TaskEnum.ACCNPP:
if (initTask) {
let task = initTask["ACCNPP"];
class ACCNPP extends BaseTask {
readonly task_type = TaskEnum.ACCNPP;
readonly title_add = task["title_add"];
readonly task_name = task["task_name"];
readonly task_url = task["task_url"];
public style_name = task["style_name"];
}
return new ACCNPP();
}
break;
case TaskEnum.AVGQW:
if (initTask) {
let task = initTask["AVGQW"];
return new AVGQW(task);
}
break;
}
}
class AVGQW extends BaseTask {
readonly task_type = TaskEnum.AVGQW;
readonly isYears: string;
readonly title: string;
readonly meteo_type: string;
readonly type: string;
readonly vege_type: string;
readonly task_name: string;
readonly task_url: string;
public style_name: string;
constructor(json) {
super();
this.isYears = json.isYears;
this.title = json.title;
this.meteo_type = json.meteo_type;
this.type = json.type;
this.vege_type = json.vege_type;
this.task_name = json.task_name;
this.task_url = json.task_url;
this.style_name = json.style_name;
}
}```