diff --git a/src/controllers/KpiEvaluationController.ts b/src/controllers/KpiEvaluationController.ts new file mode 100644 index 0000000..d78c22b --- /dev/null +++ b/src/controllers/KpiEvaluationController.ts @@ -0,0 +1,94 @@ +import { + Controller, + Get, + Post, + Put, + Delete, + Route, + Security, + Tags, + Body, + Path, + Request, + Example, + SuccessResponse, + Response, + Query, +} from "tsoa"; +import { AppDataSource } from "../database/data-source"; +import HttpSuccess from "../interfaces/http-success"; +import HttpError from "../interfaces/http-error"; +import { Like, Not } from "typeorm"; +import HttpStatusCode from "../interfaces/http-status"; +import { KpiEvaluation, updateKpiEvaluation } from "../entities/kpiEvaluation"; +@Route("api/v1/kpi/evaluation") +@Tags("kpiEvaluation") +@Security("bearerAuth") +@Response( + HttpStatusCode.INTERNAL_SERVER_ERROR, + "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", +) +@SuccessResponse(HttpStatusCode.OK, "สำเร็จ") +export class kpiEvaluationController extends Controller { + private kpiEvaluationRepository = AppDataSource.getRepository(KpiEvaluation); + + // /** + // * API แก้ไขเกณฑ์การประเมิน + // * @param id ไอดีของเกณฑ์การประเมิน + // */ + // @Put("{id}") + // async updateKpiEvaluation( + // @Path() id: string, + // @Body() requestBody: updateKpiEvaluation, + // @Request() request: { user: Record }, + // ) { + // const kpiEvaluation = await this.kpiEvaluationRepository.findOne({ + // where: { id: id }, + // }); + // if (!kpiEvaluation) { + // throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลเกณฑ์การประเมินนี้"); + // } + + // // const chkkpinameGroup = await this.kpiGroupRepository.findOne({ + // // where: { + // // nameGroupKPI: requestBody.nameGroupKPI, + // // }, + // // }); + // // if (chkkpinameGroup) { + // // throw new HttpError(HttpStatusCode.NOT_FOUND, "ชื่อกลุ่มงานนี้มีอยู่ในระบบแล้ว"); + // // } + + // this.kpiEvaluationRepository.merge(kpiEvaluation, requestBody); + // kpiEvaluation.lastUpdateUserId = request.user.sub; + // kpiEvaluation.lastUpdateFullName = request.user.name; + // await this.kpiEvaluationRepository.save(kpiEvaluation); + // return new HttpSuccess(id); + // } + + /** + * API list กลุ่มงาน + * @param page + * @param pageSize + */ + @Get() + async listKpiEvaluation( + @Query("page") page: number = 1, + @Query("pageSize") pageSize: number = 10, + @Query("keyword") keyword?: string, + ) { + let whereClause: any = {}; + + if (keyword !== undefined && keyword !== "") { + whereClause = { + where: [{ nameGroupKPI: Like(`%${keyword}%`) }], + }; + } + + const [kpiEvaluation, total] = await this.kpiEvaluationRepository.findAndCount({ + ...whereClause, + ...(keyword ? {} : { skip: (page - 1) * pageSize, take: pageSize }), + }); + + return new HttpSuccess({ data: kpiEvaluation, total }); + } +} diff --git a/src/entities/kpiCapacity.ts b/src/entities/kpiCapacity.ts new file mode 100644 index 0000000..5ed5c16 --- /dev/null +++ b/src/entities/kpiCapacity.ts @@ -0,0 +1,63 @@ +import { Entity, Column, OneToMany, ManyToOne} from "typeorm"; +import { EntityBase } from "./base/Base"; +import { KpiCapacityDetail } from "./kpiCapacityDetail"; + +enum CapacityType { + HEAD = "HEAD", + GROUP = "GROUP", + EXECUTIVE = "EXECUTIVE", + DIRECTOR = "DIRECTOR", + INSPECTOR = "INSPECTOR", +} + +@Entity("kpiCapacity") +export class KpiCapacity extends EntityBase { + @Column({ + nullable: true, + comment: + "ประเภทสมรรถนะดังนี้ HEAD = สมรรถนะหลัก, GROUP = สมรรถนะประจำกลุ่ม, EXECUTIVE = สมรรถนะประจำผู้บริหารกรุงเทพมหานคร, "+ + "DIRECTOR = สมรรถนะเฉพาะสำหรับตำแหน่ง ผอ., INSPECTOR = สมรรถนะเฉพาะสำหรับตำแหน่งผู้ตรวจราชการ", + type: "enum", + enum: CapacityType, + default: null, + }) + type: CapacityType; + + @Column({ + nullable: true, + comment: "ชื่อสมรรถนะ", + default: null, + }) + name: string; + + @Column({ + type: "longtext", + comment: "คำจำกัดความ", + }) + description: string; + + @OneToMany(() => KpiCapacityDetail, (kpiCapacityDetail) => kpiCapacityDetail.kpiCapacitys) + KpiCapacityDetails: KpiCapacityDetail[]; + +} +export class createKpiCapacity { + @Column() + type: string; + + @Column() + name: string; + + @Column() + description: string; +} + +export class updateKpiCapacity { + @Column() + type: string; + + @Column() + name: string; + + @Column() + description: string; +} diff --git a/src/entities/kpiCapacityDetail.ts b/src/entities/kpiCapacityDetail.ts new file mode 100644 index 0000000..46fd33d --- /dev/null +++ b/src/entities/kpiCapacityDetail.ts @@ -0,0 +1,45 @@ +import { Entity, Column, OneToMany, ManyToOne, JoinColumn} from "typeorm"; +import { EntityBase } from "./base/Base"; +import { KpiCapacity } from "./kpiCapacity"; + +@Entity("kpiCapacityDetail") +export class KpiCapacityDetail extends EntityBase { + @Column({ + type: "longtext", + comment: "คำอธิบายระดับ", + }) + description: string; + + @Column({ + comment: "ระดับ", + }) + level: Number; + + @Column({ + nullable: true, + length: 40, + comment: "คีย์นอก(FK)ของตาราง kpiCapacity", + default: null, + }) + kpiCapacityId: string; + + @ManyToOne(() => KpiCapacity, (kpiCapacity) => kpiCapacity.KpiCapacityDetails) + @JoinColumn({ name: "kpiCapacityId" }) + kpiCapacitys: KpiCapacity; + +} +export class createKpiCapacityDetail { + @Column() + description: string; + + @Column() + level: Number; +} + +export class updateKpiCapacityDetail { + @Column() + description: string; + + @Column() + level: Number; +} diff --git a/src/entities/kpiEvaluation.ts b/src/entities/kpiEvaluation.ts index 147e340..8bf65b0 100644 --- a/src/entities/kpiEvaluation.ts +++ b/src/entities/kpiEvaluation.ts @@ -7,18 +7,17 @@ export class KpiEvaluation extends EntityBase { type: "longtext", comment: "เกณฑ์การประเมิน", }) - name: string; + description: string; @Column({ comment: "ระดับคะแนน", }) level: Number; - } export class createKpiEvaluation { @Column() - name: string; + description: string; @Column() level: Number; @@ -26,8 +25,8 @@ export class createKpiEvaluation { export class updateKpiEvaluation { @Column() - name: string; - + description: string; + @Column() level: Number; } diff --git a/src/migration/1713429631581-add_table-kpiCapacity_and_kpiCapacityDetail.ts b/src/migration/1713429631581-add_table-kpiCapacity_and_kpiCapacityDetail.ts new file mode 100644 index 0000000..b0b0d82 --- /dev/null +++ b/src/migration/1713429631581-add_table-kpiCapacity_and_kpiCapacityDetail.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddTableKpiCapacityAndKpiCapacityDetail1713429631581 implements MigrationInterface { + name = 'AddTableKpiCapacityAndKpiCapacityDetail1713429631581' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`kpiEvaluation\` CHANGE \`name\` \`description\` longtext NOT NULL COMMENT 'เกณฑ์การประเมิน'`); + await queryRunner.query(`CREATE TABLE \`kpiCapacityDetail\` (\`id\` varchar(36) NOT NULL, \`createdAt\` datetime(6) NOT NULL COMMENT 'สร้างข้อมูลเมื่อ' DEFAULT CURRENT_TIMESTAMP(6), \`createdUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่สร้างข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`lastUpdatedAt\` datetime(6) NOT NULL COMMENT 'แก้ไขข้อมูลล่าสุดเมื่อ' DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`lastUpdateUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่แก้ไขข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`createdFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่สร้างข้อมูล' DEFAULT 'string', \`lastUpdateFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่แก้ไขข้อมูลล่าสุด' DEFAULT 'string', \`description\` longtext NOT NULL COMMENT 'คำอธิบายระดับ', \`level\` int NOT NULL COMMENT 'ระดับ', \`kpiCapacityId\` varchar(40) NULL COMMENT 'คีย์นอก(FK)ของตาราง kpiCapacity', PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`kpiCapacity\` (\`id\` varchar(36) NOT NULL, \`createdAt\` datetime(6) NOT NULL COMMENT 'สร้างข้อมูลเมื่อ' DEFAULT CURRENT_TIMESTAMP(6), \`createdUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่สร้างข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`lastUpdatedAt\` datetime(6) NOT NULL COMMENT 'แก้ไขข้อมูลล่าสุดเมื่อ' DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`lastUpdateUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่แก้ไขข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`createdFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่สร้างข้อมูล' DEFAULT 'string', \`lastUpdateFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่แก้ไขข้อมูลล่าสุด' DEFAULT 'string', \`type\` enum ('HEAD', 'GROUP', 'EXECUTIVE', 'DIRECTOR', 'INSPECTOR') NULL COMMENT 'ประเภทสมรรถนะดังนี้ HEAD = สมรรถนะหลัก, GROUP = สมรรถนะประจำกลุ่ม, EXECUTIVE = สมรรถนะประจำผู้บริหารกรุงเทพมหานคร, DIRECTOR = สมรรถนะเฉพาะสำหรับตำแหน่ง ผอ., INSPECTOR = สมรรถนะเฉพาะสำหรับตำแหน่งผู้ตรวจราชการ', \`name\` varchar(255) NULL COMMENT 'ชื่อสมรรถนะ', \`description\` longtext NOT NULL COMMENT 'คำจำกัดความ', PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); + await queryRunner.query(`ALTER TABLE \`kpiCapacityDetail\` ADD CONSTRAINT \`FK_6b230e0f7f808c7489b97af1cbf\` FOREIGN KEY (\`kpiCapacityId\`) REFERENCES \`kpiCapacity\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`kpiCapacityDetail\` DROP FOREIGN KEY \`FK_6b230e0f7f808c7489b97af1cbf\``); + await queryRunner.query(`DROP TABLE \`kpiCapacity\``); + await queryRunner.query(`DROP TABLE \`kpiCapacityDetail\``); + await queryRunner.query(`ALTER TABLE \`kpiEvaluation\` CHANGE \`description\` \`name\` longtext NOT NULL COMMENT 'เกณฑ์การประเมิน'`); + } + +} diff --git a/tsoa.json b/tsoa.json index caa5ec3..8b22a25 100644 --- a/tsoa.json +++ b/tsoa.json @@ -34,6 +34,12 @@ }, { "name": "kpiPeriod", "description": "รอบKpi" + }, + { + "name": "kpiEvaluation", "description": "เกณฑ์การประเมินสมรรถนะ" + }, + { + "name": "kpiCapacity", "description": "สมรรถนะ" } ] },