import { Controller, Get, Post, Put, Delete, Route, Security, Tags, Body, Path, Request, SuccessResponse, Response, } from "tsoa"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import HttpError from "../interfaces/http-error"; import HttpStatusCode from "../interfaces/http-status"; import { KpiRole, createKpiRole, updateKpiRole } from "../entities/kpiRole"; import CallAPI from "../interfaces/call-api"; import { KpiPeriod } from "../entities/kpiPeriod"; import { Brackets, IsNull, Like } from "typeorm"; import { KpiRoleHistory } from "../entities/kpiRoleHistory"; import permission from "../interfaces/permission"; import { RequestWithUser } from "../middlewares/user"; import { setLogDataDiff } from "../interfaces/utils"; @Route("api/v1/kpi/role") @Tags("kpiRole") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class kpiRoleController extends Controller { private kpiRoleRepository = AppDataSource.getRepository(KpiRole); private kpiRoleHistoryRepository = AppDataSource.getRepository(KpiRoleHistory); private kpiPeriodRepository = AppDataSource.getRepository(KpiPeriod); /** * สร้างตัวชี้วัดตามตำแหน่ง * @param requestBody * @param request */ @Post() async createKpiRole(@Body() requestBody: createKpiRole, @Request() request: RequestWithUser) { await new permission().PermissionCreate(request, "SYS_EVA_INDICATOR"); const kpiRole = Object.assign(new KpiRole(), requestBody); if (requestBody.year != null && requestBody.period != null && requestBody.period != "") { const kpiPeriod = await this.kpiPeriodRepository .createQueryBuilder("kpiPeriod") .where("kpiPeriod.year = :year", { year: requestBody.year }) .andWhere("kpiPeriod.durationKPI = :durationKPI", { durationKPI: requestBody.period }) .getOne(); const year = requestBody.year && parseInt(requestBody.year) > 0 ? parseInt(requestBody.year) + 543 : "ดังกล่าว"; if (!kpiPeriod) { throw new HttpError( HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลรอบการประเมินนี้ในปีงบประมาณ" + year, ); } } await new CallAPI() .PostData(request, "/org/find/all", { node: requestBody.node, nodeId: requestBody.nodeId, }) .then((x) => { kpiRole.root = x.root; kpiRole.rootId = x.rootId; kpiRole.rootDnaId = x.rootDnaId; kpiRole.rootShortName = x.rootShortName; kpiRole.child1 = requestBody.node <= 0 ? null : x.child1; kpiRole.child1Id = requestBody.node <= 0 ? null : x.child1Id; kpiRole.child1DnaId = requestBody.node <= 0 ? null : x.child1DnaId; kpiRole.child1ShortName = requestBody.node <= 0 ? null : x.child1ShortName; kpiRole.child2 = requestBody.node <= 1 ? null : x.child2; kpiRole.child2Id = requestBody.node <= 1 ? null : x.child2Id; kpiRole.child2DnaId = requestBody.node <= 1 ? null : x.child2DnaId; kpiRole.child2ShortName = requestBody.node <= 1 ? null : x.child2ShortName; kpiRole.child3 = requestBody.node <= 2 ? null : x.child3; kpiRole.child3Id = requestBody.node <= 2 ? null : x.child3Id; kpiRole.child3DnaId = requestBody.node <= 2 ? null : x.child3DnaId; kpiRole.child3ShortName = requestBody.node <= 2 ? null : x.child3ShortName; kpiRole.child4 = requestBody.node <= 3 ? null : x.child4; kpiRole.child4Id = requestBody.node <= 3 ? null : x.child4Id; kpiRole.child4DnaId = requestBody.node <= 3 ? null : x.child4DnaId; kpiRole.child4ShortName = requestBody.node <= 3 ? null : x.child4ShortName; }) .catch((x) => {}); let maxIncludingRole: any; if (requestBody.node == 0) { maxIncludingRole = await this.kpiRoleRepository .createQueryBuilder("kpiRole") .select("MAX(kpiRole.including)", "maxIncluding") .where("kpiRole.rootId = :rootId AND kpiRole.child1Id IS NULL", { rootId: requestBody.nodeId, }) .andWhere("kpiRole.position LIKE :position", { position: `%${requestBody.position}%`, }) .andWhere("kpiRole.year = :year", { year: requestBody.year, }) .andWhere("kpiRole.period = :period", { period: requestBody.period, }) .getRawOne(); } else if (requestBody.node == 1) { maxIncludingRole = await this.kpiRoleRepository .createQueryBuilder("kpiRole") .select("MAX(kpiRole.including)", "maxIncluding") .where("kpiRole.child1Id = :child1Id AND kpiRole.child2Id IS NULL", { child1Id: requestBody.nodeId, }) .andWhere("kpiRole.position LIKE :position", { position: `%${requestBody.position}%`, }) .andWhere("kpiRole.year = :year", { year: requestBody.year, }) .andWhere("kpiRole.period = :period", { period: requestBody.period, }) .getRawOne(); } else if (requestBody.node == 2) { maxIncludingRole = await this.kpiRoleRepository .createQueryBuilder("kpiRole") .select("MAX(kpiRole.including)", "maxIncluding") .where("kpiRole.child2Id = :child2Id AND kpiRole.child3Id IS NULL", { child2Id: requestBody.nodeId, }) .andWhere("kpiRole.position LIKE :position", { position: `%${requestBody.position}%`, }) .andWhere("kpiRole.year = :year", { year: requestBody.year, }) .andWhere("kpiRole.period = :period", { period: requestBody.period, }) .getRawOne(); } else if (requestBody.node == 3) { maxIncludingRole = await this.kpiRoleRepository .createQueryBuilder("kpiRole") .select("MAX(kpiRole.including)", "maxIncluding") .where("kpiRole.child3Id = :child3Id AND kpiRole.child4Id IS NULL", { child3Id: requestBody.nodeId, }) .andWhere("kpiRole.position LIKE :position", { position: `%${requestBody.position}%`, }) .andWhere("kpiRole.year = :year", { year: requestBody.year, }) .andWhere("kpiRole.period = :period", { period: requestBody.period, }) .getRawOne(); } else if (requestBody.node == 4) { maxIncludingRole = await this.kpiRoleRepository .createQueryBuilder("kpiRole") .select("MAX(kpiRole.including)", "maxIncluding") .where("kpiRole.child4Id = :child4Id", { child4Id: requestBody.nodeId, }) .andWhere("kpiRole.position LIKE :position", { position: `%${requestBody.position}%`, }) .andWhere("kpiRole.year = :year", { year: requestBody.year, }) .andWhere("kpiRole.period = :period", { period: requestBody.period, }) .getRawOne(); } const before = null; kpiRole.including = maxIncludingRole.maxIncluding + 1; kpiRole.createdUserId = request.user.sub; kpiRole.createdFullName = request.user.name; kpiRole.lastUpdateUserId = request.user.sub; kpiRole.lastUpdateFullName = request.user.name; kpiRole.createdAt = new Date(); kpiRole.lastUpdatedAt = new Date(); await this.kpiRoleRepository.save(kpiRole, { data: request }); setLogDataDiff(request, { before, after: kpiRole }); const history = new KpiRoleHistory(); history.kpiRoleId = kpiRole.id; history.createdUserId = request.user.sub; history.createdFullName = request.user.name; history.lastUpdateUserId = request.user.sub; history.lastUpdateFullName = request.user.name; history.createdAt = new Date(); history.lastUpdatedAt = new Date(); await this.kpiRoleHistoryRepository.save(history, { data: request }); setLogDataDiff(request, { before, after: kpiRole }); return new HttpSuccess(kpiRole.id); } /** * API แก้ไขตัวชี้วัดตามตำแหน่ง * @param id * @param requestBody * @param request */ @Put("{id}") async updateKpiRole( @Path() id: string, @Body() requestBody: updateKpiRole, @Request() request: RequestWithUser, ) { await new permission().PermissionUpdate(request, "SYS_EVA_INDICATOR"); const kpiRole = await this.kpiRoleRepository.findOne({ where: { id: id }, }); if (!kpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } if (requestBody.year != null) { const kpiPeriod = await this.kpiPeriodRepository .createQueryBuilder("kpiPeriod") .where("kpiPeriod.year = :year", { year: requestBody.year }) .andWhere(requestBody.period ? "kpiPeriod.durationKPI = :durationKPI" : "1=1", { durationKPI: requestBody.period, }) .getOne(); if (!kpiPeriod) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งในรอบการประเมินนี้"); } } Object.assign(kpiRole, requestBody); await new CallAPI() .PostData(request, "/org/find/all", { node: requestBody.node, nodeId: requestBody.nodeId, }) .then((x) => { kpiRole.root = x.root; kpiRole.rootId = x.rootId; kpiRole.rootDnaId = x.rootDnaId; kpiRole.rootShortName = x.rootShortName; kpiRole.child1 = requestBody.node <= 0 ? null : x.child1; kpiRole.child1Id = requestBody.node <= 0 ? null : x.child1Id; kpiRole.child1DnaId = requestBody.node <= 0 ? null : x.child1DnaId; kpiRole.child1ShortName = requestBody.node <= 0 ? null : x.child1ShortName; kpiRole.child2 = requestBody.node <= 1 ? null : x.child2; kpiRole.child2Id = requestBody.node <= 1 ? null : x.child2Id; kpiRole.child2DnaId = requestBody.node <= 1 ? null : x.child2DnaId; kpiRole.child2ShortName = requestBody.node <= 1 ? null : x.child2ShortName; kpiRole.child3 = requestBody.node <= 2 ? null : x.child3; kpiRole.child3Id = requestBody.node <= 2 ? null : x.child3Id; kpiRole.child3DnaId = requestBody.node <= 2 ? null : x.child3DnaId; kpiRole.child3ShortName = requestBody.node <= 2 ? null : x.child3ShortName; kpiRole.child4 = requestBody.node <= 3 ? null : x.child4; kpiRole.child4Id = requestBody.node <= 3 ? null : x.child4Id; kpiRole.child4DnaId = requestBody.node <= 3 ? null : x.child4DnaId; kpiRole.child4ShortName = requestBody.node <= 3 ? null : x.child4ShortName; }) .catch((x) => {}); let before = null; before = structuredClone(kpiRole); kpiRole.createdUserId = request.user.sub; kpiRole.createdFullName = request.user.name; kpiRole.lastUpdateUserId = request.user.sub; kpiRole.lastUpdateFullName = request.user.name; kpiRole.createdAt = new Date(); kpiRole.lastUpdatedAt = new Date(); await this.kpiRoleRepository.save(kpiRole, { data: request }); setLogDataDiff(request, { before, after: kpiRole }); before = null; const history = new KpiRoleHistory(); history.kpiRoleId = kpiRole.id; history.createdUserId = request.user.sub; history.createdFullName = request.user.name; history.lastUpdateUserId = request.user.sub; history.lastUpdateFullName = request.user.name; history.createdAt = new Date(); history.lastUpdatedAt = new Date(); await this.kpiRoleHistoryRepository.save(history, { data: request }); setLogDataDiff(request, { before, after: kpiRole }); return new HttpSuccess(id); } /** * API ตัวชี้วัดตามตำแหน่ง * @param id Guid, *Id ตัวชี้วัดตามตำแหน่ง */ @Get("edit/{id}") async GetKpiRoleByIdEdit(@Request() request: RequestWithUser, @Path() id: string) { let _workflow = await new permission().Workflow(request, id, "SYS_EVA_INDICATOR"); if (_workflow == false) await new permission().PermissionGet(request, "SYS_EVA_INDICATOR"); const kpiRole = await this.kpiRoleRepository.findOne({ where: { id: id }, relations: { kpiPeriod: true }, }); if (!kpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } let node = null; let nodeId = null; let nodeDnaId = null; let nodeName = null; if (kpiRole.child4Id != null) { node = 4; nodeId = kpiRole.child4Id; nodeDnaId = kpiRole.child4DnaId; nodeName = kpiRole.child4; } else if (kpiRole.child3Id != null) { node = 3; nodeId = kpiRole.child3Id; nodeDnaId = kpiRole.child3DnaId; nodeName = kpiRole.child3; } else if (kpiRole.child2Id != null) { node = 2; nodeId = kpiRole.child2Id; nodeDnaId = kpiRole.child2DnaId; nodeName = kpiRole.child2; } else if (kpiRole.child1Id != null) { node = 1; nodeId = kpiRole.child1Id; nodeDnaId = kpiRole.child1DnaId; nodeName = kpiRole.child1; } else if (kpiRole.rootId != null) { node = 0; nodeId = kpiRole.rootId; nodeDnaId = kpiRole.rootDnaId; nodeName = kpiRole.root; } const formattedData = { id: kpiRole.id, // year: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.year, // round: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.durationKPI, year: kpiRole.year == null ? null : kpiRole.year, round: kpiRole.period == null ? null : kpiRole.period, kpiPeriodId: kpiRole.kpiPeriodId, including: kpiRole.including, includingName: kpiRole.includingName, target: kpiRole.target, unit: kpiRole.unit, weight: kpiRole.weight, achievement1: kpiRole.achievement1, achievement2: kpiRole.achievement2, achievement3: kpiRole.achievement3, achievement4: kpiRole.achievement4, achievement5: kpiRole.achievement5, meaning: kpiRole.meaning, formula: kpiRole.formula, root: kpiRole.rootId, child1: kpiRole.child1Id, child2: kpiRole.child2Id, child3: kpiRole.child3Id, child4: kpiRole.child4Id, rootDna: kpiRole.rootDnaId, child1Dna: kpiRole.child1DnaId, child2Dna: kpiRole.child2DnaId, child3Dna: kpiRole.child3DnaId, child4Dna: kpiRole.child4DnaId, node: node, nodeId: nodeId, nodeDnaId: nodeDnaId, nodeName: nodeName, orgRevisionId: kpiRole.orgRevisionId, position: kpiRole.position, documentInfoEvidence: kpiRole.documentInfoEvidence, }; return new HttpSuccess(formattedData); } /** * API ตัวชี้วัดตามตำแหน่ง * @param id Guid, *Id ตัวชี้วัดตามตำแหน่ง */ @Get("{id}") async GetKpiRoleById(@Request() request: RequestWithUser, @Path() id: string) { const kpiRole = await this.kpiRoleRepository.findOne({ where: { id: id }, relations: { kpiPeriod: true }, }); if (!kpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } let node = null; let nodeId = null; let nodeDnaId = null; let nodeName = null; if (kpiRole.child4Id != null) { node = 4; nodeId = kpiRole.child4Id; nodeDnaId = kpiRole.child4DnaId; nodeName = kpiRole.child4; } else if (kpiRole.child3Id != null) { node = 3; nodeId = kpiRole.child3Id; nodeDnaId = kpiRole.child3DnaId; nodeName = kpiRole.child3; } else if (kpiRole.child2Id != null) { node = 2; nodeId = kpiRole.child2Id; nodeDnaId = kpiRole.child2DnaId; nodeName = kpiRole.child2; } else if (kpiRole.child1Id != null) { node = 1; nodeId = kpiRole.child1Id; nodeDnaId = kpiRole.child1DnaId; nodeName = kpiRole.child1; } else if (kpiRole.rootId != null) { node = 0; nodeId = kpiRole.rootId; nodeDnaId = kpiRole.rootDnaId; nodeName = kpiRole.root; } const formattedData = { id: kpiRole.id, // year: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.year, // round: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.durationKPI, year: kpiRole.year == null ? null : kpiRole.year, round: kpiRole.period == null ? null : kpiRole.period, kpiPeriodId: kpiRole.kpiPeriodId, including: kpiRole.including, includingName: kpiRole.includingName, target: kpiRole.target, unit: kpiRole.unit, weight: kpiRole.weight, achievement1: kpiRole.achievement1, achievement2: kpiRole.achievement2, achievement3: kpiRole.achievement3, achievement4: kpiRole.achievement4, achievement5: kpiRole.achievement5, meaning: kpiRole.meaning, formula: kpiRole.formula, root: kpiRole.rootId, child1: kpiRole.child1Id, child2: kpiRole.child2Id, child3: kpiRole.child3Id, child4: kpiRole.child4Id, rootDna: kpiRole.rootDnaId, child1Dna: kpiRole.child1DnaId, child2Dna: kpiRole.child2DnaId, child3Dna: kpiRole.child3DnaId, child4Dna: kpiRole.child4DnaId, node: node, nodeId: nodeId, nodeDnaId: nodeDnaId, nodeName: nodeName, orgRevisionId: kpiRole.orgRevisionId, position: kpiRole.position, documentInfoEvidence: kpiRole.documentInfoEvidence, }; return new HttpSuccess(formattedData); } /** * API list ตัวชี้วัดตามตำแหน่ง * @param page * @param pageSize * @param keyword */ @Post("search") async listKpiRole( @Request() request: RequestWithUser, @Body() requestBody: { page: number; pageSize: number; year?: string | null; period?: string | null; nodeId?: string | null; node?: number | null; position?: string | null; keyword?: string | null; isAll?: boolean | false; // isNull?: boolean | false; }, ) { let condition = ""; let parameters: any = {}; if (requestBody.isAll === false) { switch (requestBody.node) { case 0: condition = "kpiRole.rootDnaId LIKE :nodeId AND kpiRole.child1DnaId IS NULL"; break; case 1: condition = "kpiRole.child1DnaId LIKE :nodeId AND kpiRole.child2DnaId IS NULL"; break; case 2: condition = "kpiRole.child2DnaId LIKE :nodeId AND kpiRole.child3DnaId IS NULL"; break; case 3: condition = "kpiRole.child3DnaId LIKE :nodeId AND kpiRole.child4DnaId IS NULL"; break; case 4: condition = "kpiRole.child4DnaId LIKE :nodeId"; break; default: condition = "1=1"; break; } parameters.nodeId = `%${requestBody.nodeId}%`; } else { switch (requestBody.node) { case 0: condition = "kpiRole.rootDnaId LIKE :nodeId"; break; case 1: condition = "kpiRole.child1DnaId LIKE :nodeId"; break; case 2: condition = "kpiRole.child2DnaId LIKE :nodeId"; break; case 3: condition = "kpiRole.child3DnaId LIKE :nodeId"; break; case 4: condition = "kpiRole.child4DnaId LIKE :nodeId"; break; default: condition = "1=1"; break; } parameters.nodeId = `%${requestBody.nodeId}%`; } // if (requestBody.year && requestBody.period && requestBody.isNull === true) { // condition += ` AND (kpiRole.year LIKE :year OR kpiRole.year IS NULL) AND (kpiRole.period LIKE :period OR kpiRole.period IS NULL)`; // parameters.year = `%${requestBody.year}%`; // parameters.period = `%${requestBody.period}%`; // } const [kpiRole, total] = await AppDataSource.getRepository(KpiRole) .createQueryBuilder("kpiRole") .leftJoinAndSelect("kpiRole.kpiPeriod", "kpiPeriod") .andWhere(condition, parameters) // .andWhere( // requestBody.year && requestBody.period // ? "kpiRole.year LIKE :year AND kpiRole.period LIKE :period" // : "1=1", // { // year: `%${requestBody.year}%`, // period: `%${requestBody.period}%`, // }, // ) .andWhere(requestBody.year ? "kpiRole.year LIKE :year" : "1=1", { year: `%${requestBody.year}%`, }) .andWhere(requestBody.period ? "kpiRole.period LIKE :period" : "1=1", { period: `%${requestBody.period}%`, }) .andWhere(requestBody.position != undefined ? "kpiRole.position LIKE :position" : "1=1", { position: `%${requestBody.position}%`, }) .andWhere( new Brackets((qb) => { qb.orWhere("kpiRole.including LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.includingName LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.year LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.period LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }); }), ) .select([ "kpiRole.id", "kpiPeriod.year", "kpiPeriod.durationKPI", "kpiRole.including", "kpiRole.includingName", "kpiRole.createdAt", ]) .orderBy("kpiRole.createdAt", "DESC") .skip((requestBody.page - 1) * requestBody.pageSize) .take(requestBody.pageSize) .getManyAndCount(); return new HttpSuccess({ data: kpiRole, total }); } /** * API list ตัวชี้วัดตามตำแหน่ง * @param page * @param pageSize * @param keyword */ @Post("search-kpi-role") async searchKpiRole( @Request() request: RequestWithUser, @Body() requestBody: { page: number; pageSize: number; year?: string | null; period?: string | null; nodeId?: string | null; node?: number | null; position?: string | null; keyword?: string | null; isAll?: boolean | false; }, ) { let _data = await new permission().PermissionList(request, "SYS_KPI_LIST"); let condition = ""; let parameters: any = {}; if (requestBody.isAll === false) { switch (requestBody.node) { case 0: condition = "kpiRole.rootDnaId LIKE :nodeId AND kpiRole.child1DnaId IS NULL"; break; case 1: condition = "kpiRole.child1DnaId LIKE :nodeId AND kpiRole.child2DnaId IS NULL"; break; case 2: condition = "kpiRole.child2DnaId LIKE :nodeId AND kpiRole.child3DnaId IS NULL"; break; case 3: condition = "kpiRole.child3DnaId LIKE :nodeId AND kpiRole.child4DnaId IS NULL"; break; case 4: condition = "kpiRole.child4DnaId LIKE :nodeId"; break; default: condition = "1=1"; break; } parameters.nodeId = `%${requestBody.nodeId}%`; } else { switch (requestBody.node) { case 0: condition = "kpiRole.rootDnaId LIKE :nodeId"; break; case 1: condition = "kpiRole.child1DnaId LIKE :nodeId"; break; case 2: condition = "kpiRole.child2DnaId LIKE :nodeId"; break; case 3: condition = "kpiRole.child3DnaId LIKE :nodeId"; break; case 4: condition = "kpiRole.child4DnaId LIKE :nodeId"; break; default: condition = "1=1"; break; } parameters.nodeId = `%${requestBody.nodeId}%`; } const [kpiRole, total] = await AppDataSource.getRepository(KpiRole) .createQueryBuilder("kpiRole") .leftJoinAndSelect("kpiRole.kpiPeriod", "kpiPeriod") .andWhere(condition, parameters) .andWhere(requestBody.year ? "kpiRole.year LIKE :year" : "1=1", { year: `%${requestBody.year}%`, }) .andWhere(requestBody.period ? "kpiRole.period LIKE :period" : "1=1", { period: `%${requestBody.period}%`, }) .andWhere(requestBody.position != undefined ? "kpiRole.position LIKE :position" : "1=1", { position: `%${requestBody.position}%`, }) .andWhere( new Brackets((qb) => { qb.orWhere("kpiRole.including LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.includingName LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.year LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.period LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }); }), ) .select([ "kpiRole.id", "kpiPeriod.year", "kpiPeriod.durationKPI", "kpiRole.including", "kpiRole.includingName", "kpiRole.createdAt", ]) .orderBy("kpiRole.createdAt", "DESC") .skip((requestBody.page - 1) * requestBody.pageSize) .take(requestBody.pageSize) .getManyAndCount(); return new HttpSuccess({ data: kpiRole, total }); } /** * API list ตัวชี้วัดตามตำแหน่ง * @param page * @param pageSize * @param keyword */ @Post("search-edit") async listKpiRoleEdit( @Request() request: RequestWithUser, @Body() requestBody: { page: number; pageSize: number; year?: string | null; period?: string | null; nodeId?: string | null; node?: number | null; position?: string | null; keyword?: string | null; isAll?: boolean | false; // isNull?: boolean | false; sortBy?: string, descending?: boolean, }, ) { let _data = await new permission().PermissionList(request, "SYS_EVA_INDICATOR"); let condition = ""; let parameters: any = {}; if (requestBody.isAll === false) { switch (requestBody.node) { case 0: condition = "kpiRole.rootDnaId LIKE :nodeId AND kpiRole.child1DnaId IS NULL"; break; case 1: condition = "kpiRole.child1DnaId LIKE :nodeId AND kpiRole.child2DnaId IS NULL"; break; case 2: condition = "kpiRole.child2DnaId LIKE :nodeId AND kpiRole.child3DnaId IS NULL"; break; case 3: condition = "kpiRole.child3DnaId LIKE :nodeId AND kpiRole.child4DnaId IS NULL"; break; case 4: condition = "kpiRole.child4DnaId LIKE :nodeId"; break; default: condition = "1=1"; break; } parameters.nodeId = `%${requestBody.nodeId}%`; } else { switch (requestBody.node) { case 0: condition = "kpiRole.rootDnaId LIKE :nodeId"; break; case 1: condition = "kpiRole.child1DnaId LIKE :nodeId"; break; case 2: condition = "kpiRole.child2DnaId LIKE :nodeId"; break; case 3: condition = "kpiRole.child3DnaId LIKE :nodeId"; break; case 4: condition = "kpiRole.child4DnaId LIKE :nodeId"; break; default: condition = "1=1"; break; } parameters.nodeId = `%${requestBody.nodeId}%`; } // if (requestBody.year && requestBody.period && requestBody.isNull === true) { // condition += ` AND (kpiRole.year LIKE :year OR kpiRole.year IS NULL) AND (kpiRole.period LIKE :period OR kpiRole.period IS NULL)`; // parameters.year = `%${requestBody.year}%`; // parameters.period = `%${requestBody.period}%`; // } let query = await AppDataSource.getRepository(KpiRole) .createQueryBuilder("kpiRole") .leftJoinAndSelect("kpiRole.kpiPeriod", "kpiPeriod") .andWhere(condition, parameters) // .andWhere( // requestBody.year && requestBody.period // ? "kpiRole.year LIKE :year AND kpiRole.period LIKE :period" // : "1=1", // { // year: `%${requestBody.year}%`, // period: `%${requestBody.period}%`, // }, // ) .andWhere(requestBody.year ? "kpiRole.year LIKE :year" : "1=1", { year: `%${requestBody.year}%`, }) .andWhere(requestBody.period ? "kpiRole.period LIKE :period" : "1=1", { period: `%${requestBody.period}%`, }) .andWhere(requestBody.position != undefined ? "kpiRole.position LIKE :position" : "1=1", { position: `%${requestBody.position}%`, }) .andWhere( new Brackets((qb) => { qb.orWhere("kpiRole.including LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.includingName LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.year LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) .orWhere("kpiRole.period LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }); }), ) .select([ "kpiRole.id", "kpiPeriod.year", "kpiPeriod.durationKPI", "kpiRole.including", "kpiRole.includingName", "kpiRole.createdAt", ]) .orderBy("kpiRole.createdAt", "DESC") if (requestBody.sortBy) { query = query.orderBy( `kpiRole.${requestBody.sortBy}`, requestBody.descending ? "DESC" : "ASC" ); } const [kpiRole, total] = await query .skip((requestBody.page - 1) * requestBody.pageSize) .take(requestBody.pageSize) .getManyAndCount(); return new HttpSuccess({ data: kpiRole, total }); } /** * API ลบตัวชี้วัดตามตำแหน่ง * @param id */ @Delete("{id}") async deleteKpiRole(@Path() id: string, @Request() request: RequestWithUser) { await new permission().PermissionDelete(request, "SYS_EVA_INDICATOR"); const kpiRole = await this.kpiRoleRepository.findOne({ where: { id: id }, }); if (!kpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } let type = 0; if (kpiRole.child1Id != null) { type = 1; } else if (kpiRole.child2Id != null) { type = 2; } else if (kpiRole.child3Id != null) { type = 3; } else if (kpiRole.child4Id != null) { type = 4; } await this.kpiRoleHistoryRepository.delete({ kpiRoleId: id }); await this.kpiRoleRepository.remove(kpiRole, { data: request }); if (kpiRole) { let remainingKpiRoles: any; if (type == 0) { remainingKpiRoles = await this.kpiRoleRepository.find({ where: { rootId: kpiRole.rootId, child1Id: IsNull(), position: Like(`%${kpiRole.position}%`), }, order: { including: "ASC", }, }); } else if (type == 1) { remainingKpiRoles = await this.kpiRoleRepository.find({ where: { child1Id: kpiRole.child1Id, child2Id: IsNull(), position: Like(`%${kpiRole.position}%`), }, order: { including: "ASC", }, }); } else if (type == 2) { remainingKpiRoles = await this.kpiRoleRepository.find({ where: { child2Id: kpiRole.child2Id, child3Id: IsNull(), position: Like(`%${kpiRole.position}%`), }, order: { including: "ASC", }, }); } else if (type == 3) { remainingKpiRoles = await this.kpiRoleRepository.find({ where: { child3Id: kpiRole.child3Id, child4Id: IsNull(), position: Like(`%${kpiRole.position}%`), }, order: { including: "ASC", }, }); } else if (type == 4) { remainingKpiRoles = await this.kpiRoleRepository.find({ where: { child4Id: kpiRole.child4Id, position: Like(`%${kpiRole.position}%`), }, order: { including: "ASC", }, }); } remainingKpiRoles.forEach((kpiRole: any, index: any) => { kpiRole.including = index + 1; }); remainingKpiRoles.lastUpdateUserId = request.user.sub; remainingKpiRoles.lastUpdateFullName = request.user.name; remainingKpiRoles.lastUpdatedAt = new Date(); await this.kpiRoleRepository.save(remainingKpiRoles, { data: request }); } return new HttpSuccess(); } /** * API ประวัดิตัวชี้วัดตามตำแหน่ง * @param id Guid, *Id ประวัดิตัวชี้วัดตามตำแหน่ง */ @Get("history/{id}") async GetHistory(@Request() request: RequestWithUser, @Path() id: string) { let _data = await new permission().PermissionList(request, "SYS_EVA_INDICATOR"); const kpiRoleHistory = await this.kpiRoleHistoryRepository.find({ where: { kpiRoleId: id }, order: { createdAt: "ASC", }, }); if (!kpiRoleHistory) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลประวัดิตัวชี้วัดตามตำแหน่งนี้"); } return new HttpSuccess(kpiRoleHistory); } }