From 3a4eb56629b49f3e73a7c7ac4dbdf19febad2a59 Mon Sep 17 00:00:00 2001 From: Moss <> Date: Fri, 13 Jun 2025 15:20:58 +0700 Subject: [PATCH] =?UTF-8?q?=E0=B9=81=E0=B8=81=E0=B9=89=E0=B8=81=E0=B8=A3?= =?UTF-8?q?=E0=B8=A3=E0=B8=A1=E0=B8=81=E0=B8=B2=E0=B8=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/DirectorController.ts | 14 +++-- src/controllers/EvaluationController.ts | 51 ++++++++++++------- src/entities/Director.ts | 22 ++++---- src/entities/Evaluation.ts | 30 ++++++----- src/entities/evaluation_directors_director.ts | 35 +++++++++++++ .../1749798550561-update30062025603.ts | 20 ++++++++ 6 files changed, 128 insertions(+), 44 deletions(-) create mode 100644 src/entities/evaluation_directors_director.ts create mode 100644 src/migration/1749798550561-update30062025603.ts diff --git a/src/controllers/DirectorController.ts b/src/controllers/DirectorController.ts index fd63984..e524db8 100644 --- a/src/controllers/DirectorController.ts +++ b/src/controllers/DirectorController.ts @@ -22,6 +22,7 @@ import { Not, Brackets } from "typeorm"; import permission from "../interfaces/permission"; import { RequestWithUser } from "../middlewares/user"; import { setLogDataDiff } from "../interfaces/utils"; +import { evaluation_directors_director } from "../entities/evaluation_directors_director"; @Route("api/v1/evaluation/director") @Tags("director") @Security("bearerAuth") @@ -32,6 +33,9 @@ import { setLogDataDiff } from "../interfaces/utils"; @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class DirectorController { private directorRepository = AppDataSource.getRepository(Director); + private evaluation_directors_directorRepository = AppDataSource.getRepository( + evaluation_directors_director, + ); /** * API สำหรับแสดงรายการกรรมการ @@ -200,10 +204,14 @@ export class DirectorController { * */ @Put("duty/{id}") - async updateDuty(@Path() id: string, @Body() body:{duty: string} , @Request() request: RequestWithUser) { + async updateDuty( + @Path() id: string, + @Body() body: { duty: string }, + @Request() request: RequestWithUser, + ) { try { await new permission().PermissionUpdate(request, "SYS_EVA_INFO"); - let director = await this.directorRepository.findOneBy({ id }); + let director = await this.evaluation_directors_directorRepository.findOneBy({ id }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลกรรมการ"); } @@ -212,7 +220,7 @@ export class DirectorController { director.lastUpdateUserId = request.user.sub; director.lastUpdateFullName = request.user.name; director.lastUpdatedAt = new Date(); - await this.directorRepository.save(director, { data: request }); + await this.evaluation_directors_directorRepository.save(director, { data: request }); setLogDataDiff(request, { before, after: director }); return new HttpSuccess(); } catch (error: any) { diff --git a/src/controllers/EvaluationController.ts b/src/controllers/EvaluationController.ts index fe9e173..abd41dd 100644 --- a/src/controllers/EvaluationController.ts +++ b/src/controllers/EvaluationController.ts @@ -36,6 +36,7 @@ import Extension from "../interfaces/extension"; import { Portfolio } from "../entities/Portfolio"; import { Performance } from "../entities/Performance"; import { AnnounceTemplate } from "../entities/AnnounceTemplate"; +import { evaluation_directors_director } from "../entities/evaluation_directors_director"; @Route("api/v1/evaluation") @Tags("evaluation") @@ -58,6 +59,9 @@ export class EvaluationController { private directorRepository = AppDataSource.getRepository(Director); private meetingRepository = AppDataSource.getRepository(Meeting); private announceTemplateRepository = AppDataSource.getRepository(AnnounceTemplate); + private evaluation_directors_directorRepository = AppDataSource.getRepository( + evaluation_directors_director, + ); /** * API ล้างข้อมูล @@ -2221,7 +2225,7 @@ export class EvaluationController { evaluation.step = "PREPARE_DOC_V2"; evaluation.subjectDoc2 = evaluation.subject; evaluation.authorDoc2 = evaluation.author; - evaluation.assignedPosition = evaluation.position; + evaluation.assignedPosition = evaluation.position; //xxxxxxxxxx evaluation.commanderFullnameDoc2 = evaluation.commanderFullname; evaluation.commanderPositionDoc2 = evaluation.commanderPosition; evaluation.commanderAboveFullnameDoc2 = evaluation.commanderAboveFullname; @@ -2478,12 +2482,23 @@ export class EvaluationController { if (!evaluation) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); } - if (!evaluation.directors) { - evaluation.directors = []; + if (!evaluation.evaluation_directors_director) { + evaluation.evaluation_directors_director = []; } body.directors.forEach(async (directorId) => { const director = await this.directorRepository.findOne({ where: { id: directorId } }); - if (director != null) evaluation.directors.push(director); + if (director != null) { + await this.evaluation_directors_directorRepository.save({ + directorId: director.id, + evaluationId: evaluation.id, + createdUserId: request.user.sub, + createdFullName: request.user.name, + lastUpdateUserId: request.user.sub, + lastUpdateFullName: request.user.name, + createdAt: new Date(), + lastUpdatedAt: new Date(), + }); + } }); evaluation.lastUpdateUserId = request.user.sub; @@ -2580,20 +2595,24 @@ export class EvaluationController { const evaluation = await this.evaluationRepository.findOne({ where: { id }, - relations: ["directors", "meetings"], + relations: [ + "evaluation_directors_director", + "evaluation_directors_director.director", + "meetings", + ], }); if (!evaluation) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); } - const directors = evaluation.directors.map((director) => ({ + const directors = evaluation.evaluation_directors_director.map((director) => ({ id: director.id, - prefix: director.prefix, - firstName: director.firstName, - lastName: director.lastName, - position: director.position, + prefix: director.director.prefix, + firstName: director.director.firstName, + lastName: director.director.lastName, + position: director.director.position, positionName: null, - email: director.email, - phone: director.phone, + email: director.director.email, + phone: director.director.phone, duty: director.duty, })); @@ -3104,7 +3123,7 @@ export class EvaluationController { // await new permission().PermissionDelete(request, "SYS_EVA_REQ"); const evaluation = await this.evaluationRepository.findOne({ where: { id }, - relations: ["meetings", "directors"], + relations: ["meetings", "evaluation_directors_director"], }); if (!evaluation) { @@ -3125,11 +3144,7 @@ export class EvaluationController { this.meetingRepository.remove(meeting, { data: request }), ), ); - await Promise.all( - evaluation.directors.map((director) => - this.directorRepository.remove(director, { data: request }), - ), - ); + await this.evaluation_directors_directorRepository.delete({ evaluationId: id }); await this.evaluationRepository.delete({ id }); return new HttpSuccess(); diff --git a/src/entities/Director.ts b/src/entities/Director.ts index 2710d23..d9dfa3b 100644 --- a/src/entities/Director.ts +++ b/src/entities/Director.ts @@ -1,10 +1,7 @@ -import { - Entity, - Column, - ManyToMany, -} from "typeorm"; +import { Entity, Column, ManyToMany, OneToMany, JoinTable } from "typeorm"; import { EntityBase } from "./base/Base"; import { Evaluation } from "./Evaluation"; +import { evaluation_directors_director } from "./evaluation_directors_director"; @Entity("director") export class Director extends EntityBase { @Column({ nullable: true, comment: "คำนำหน้าชื่อ" }) @@ -25,11 +22,18 @@ export class Director extends EntityBase { @Column({ nullable: true, comment: "ตำแหน่ง" }) position: string; - @Column({ nullable: true, comment: "หน้าที่" }) - duty: string; + // @Column({ nullable: true, comment: "หน้าที่" }) + // duty: string; - @ManyToMany(() => Evaluation, (evaluation) => evaluation.directors) - evaluations: Evaluation[]; + // @ManyToMany(() => Evaluation, (evaluation) => evaluation.directors) + // evaluations: Evaluation[]; + + @OneToMany( + () => evaluation_directors_director, + (evaluation_directors_director) => evaluation_directors_director.director, + ) + @JoinTable() + evaluation_directors_director: evaluation_directors_director[]; } export class CreateDirector { diff --git a/src/entities/Evaluation.ts b/src/entities/Evaluation.ts index 65c5baa..b3c4d03 100644 --- a/src/entities/Evaluation.ts +++ b/src/entities/Evaluation.ts @@ -10,6 +10,7 @@ import { Director } from "./Director"; import { Meeting } from "./Meeting"; import { Portfolio } from "./Portfolio"; import { Performance } from "./Performance"; +import { evaluation_directors_director } from "./evaluation_directors_director"; @Entity("evaluation") export class Evaluation extends EntityBase { @@ -201,7 +202,6 @@ export class Evaluation extends EntityBase { @Column({ nullable: true, comment: "ตำแหน่ง ผู้บังคับบัญชาชั้นต้น (จัดเตรียมเอกสารเล่ม 2)" }) commanderPositionDoc2: string; - @Column({ nullable: true, comment: "สังกัดปัจุบัน ผู้บังคับบัญชาชั้นต้น" }) commanderOrg: string; @Column({ nullable: true, comment: "สังกัดเดิม ผู้บังคับบัญชาชั้นต้น" }) @@ -256,13 +256,13 @@ export class Evaluation extends EntityBase { @Column({ nullable: true, comment: "ชื่อเจ้าของผลงาน" }) author: string; - @Column({ type: 'json', nullable: true, comment: 'ชื่อผลงาน' }) + @Column({ type: "json", nullable: true, comment: "ชื่อผลงาน" }) subject: string[]; @Column({ nullable: true, comment: "ชื่อเจ้าของผลงาน2" }) authorDoc2: string; - @Column({ type: 'json', nullable: true, comment: "ชื่อผลงาน2" }) + @Column({ type: "json", nullable: true, comment: "ชื่อผลงาน2" }) subjectDoc2: string[]; @Column({ nullable: true, comment: "ตำแหน่งที่ได้รับมอบหมาย" }) @@ -271,17 +271,15 @@ export class Evaluation extends EntityBase { @Column({ nullable: true, comment: "ผลการประเมิน", default: "PENDING" }) //PENDING,PASS,NOTPASS evaluationResult: string; - @Column({ type: 'text', nullable: true, comment: 'รายละเอียดประกาศ(STEP5)'}) + @Column({ type: "text", nullable: true, comment: "รายละเอียดประกาศ(STEP5)" }) detailAnnounceStep5Body: string; - @Column({ type: 'text', nullable: true, comment: 'รายละเอียดส่วนท้าย(STEP5)'}) + @Column({ type: "text", nullable: true, comment: "รายละเอียดส่วนท้าย(STEP5)" }) detailAnnounceStep5Footer: string; - @Column({ default: false, comment: 'สถานะเช็คการอัพเดทชื่อผลงาน (STEP6)'}) + @Column({ default: false, comment: "สถานะเช็คการอัพเดทชื่อผลงาน (STEP6)" }) isUpdated: boolean; - - @OneToMany(() => EvaluationLogs, (evaluationLogs) => evaluationLogs.evaluation) evaluationLogs: EvaluationLogs[]; @@ -306,15 +304,20 @@ export class Evaluation extends EntityBase { @OneToMany(() => Performance, (performance) => performance.evaluation) performances: Performance[]; - @ManyToMany(() => Director, (director) => director.evaluations) - @JoinTable() - directors: Director[]; + // @ManyToMany(() => Director, (director) => director.evaluations) + // @JoinTable() + // directors: Director[]; @ManyToMany(() => Meeting, (meeting) => meeting.evaluations) @JoinTable() meetings: Meeting[]; - + @OneToMany( + () => evaluation_directors_director, + (evaluation_directors_director) => evaluation_directors_director.evaluation, + ) + @JoinTable() + evaluation_directors_director: evaluation_directors_director[]; } export class CreateEvaluation { @@ -612,7 +615,7 @@ export class CreateEvaluationExpertise { @Column() oc?: string | null; - + @Column() citizenId?: string | null; @@ -639,7 +642,6 @@ export class CreateEvaluationExpertise { @Column() govAge?: string | null; - } export type UpdateEvaluation = Partial; diff --git a/src/entities/evaluation_directors_director.ts b/src/entities/evaluation_directors_director.ts new file mode 100644 index 0000000..402d8d8 --- /dev/null +++ b/src/entities/evaluation_directors_director.ts @@ -0,0 +1,35 @@ +import { Entity, Column, ManyToMany, ManyToOne, JoinColumn } from "typeorm"; +import { EntityBase } from "./base/Base"; +import { Evaluation } from "./Evaluation"; +import { Director } from "./Director"; +@Entity("evaluation_directors_director") +export class evaluation_directors_director extends EntityBase { + @Column({ + comment: "Id การทำรายการระบบประเมิน", + length: 40, + default: "00000000-0000-0000-0000-000000000000", + }) + directorId: string; + + @Column({ + comment: "Id การทำรายการระบบประเมิน", + length: 40, + default: "00000000-0000-0000-0000-000000000000", + }) + evaluationId: string; + + @Column({ + nullable: true, + comment: "หน้าที่", + default: null, + }) + duty: string; + + @ManyToOne(() => Director, (Director) => Director.evaluation_directors_director) + @JoinColumn({ name: "directorId" }) + director: Director; + + @ManyToOne(() => Evaluation, (Evaluation) => Evaluation.evaluation_directors_director) + @JoinColumn({ name: "evaluationId" }) + evaluation: Evaluation; +} diff --git a/src/migration/1749798550561-update30062025603.ts b/src/migration/1749798550561-update30062025603.ts new file mode 100644 index 0000000..02b0b79 --- /dev/null +++ b/src/migration/1749798550561-update30062025603.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Update300620256031749798550561 implements MigrationInterface { + name = 'Update300620256031749798550561' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE \`evaluation_directors_director\` (\`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', \`directorId\` varchar(40) NOT NULL COMMENT 'Id การทำรายการระบบประเมิน' DEFAULT '00000000-0000-0000-0000-000000000000', \`evaluationId\` varchar(40) NOT NULL COMMENT 'Id การทำรายการระบบประเมิน' DEFAULT '00000000-0000-0000-0000-000000000000', \`duty\` varchar(255) NULL COMMENT 'หน้าที่', PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); + await queryRunner.query(`ALTER TABLE \`director\` DROP COLUMN \`duty\``); + await queryRunner.query(`ALTER TABLE \`evaluation_directors_director\` ADD CONSTRAINT \`FK_a1b902762a4a2410a10b6728065\` FOREIGN KEY (\`directorId\`) REFERENCES \`director\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`evaluation_directors_director\` ADD CONSTRAINT \`FK_aee4e7f5076bf5ff10190ddb79b\` FOREIGN KEY (\`evaluationId\`) REFERENCES \`evaluation\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`evaluation_directors_director\` DROP FOREIGN KEY \`FK_aee4e7f5076bf5ff10190ddb79b\``); + await queryRunner.query(`ALTER TABLE \`evaluation_directors_director\` DROP FOREIGN KEY \`FK_a1b902762a4a2410a10b6728065\``); + await queryRunner.query(`ALTER TABLE \`director\` ADD \`duty\` varchar(255) NULL COMMENT 'หน้าที่'`); + await queryRunner.query(`DROP TABLE \`evaluation_directors_director\``); + } + +}