From 6e374d7992a61f76b36c76a20fbcbb3e32cb0f2e Mon Sep 17 00:00:00 2001 From: Bright Date: Thu, 13 Feb 2025 10:28:05 +0700 Subject: [PATCH 01/10] report 3 (test) --- src/controllers/ReportController.ts | 32 +++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 26a76b1..deb87af 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Post, Route, Security, Tags, Body, Path } from "tsoa"; +import { Controller, Get, Post, Route, Security, Tags, Body, Path, Query } from "tsoa"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import HttpError from "../interfaces/http-error"; @@ -563,14 +563,38 @@ export class ReportController extends Controller { * */ @Get("report3") - async report3() { - + async report3( + @Query("year") year: number, + @Query("rootId") rootId?: string, + ) { + const [development, total] = await AppDataSource.getRepository(DevelopmentScholarship) + .createQueryBuilder("developmentScholarship") + .leftJoinAndSelect("developmentScholarship.posLevel", "posLevel") + .leftJoinAndSelect("developmentScholarship.posType", "posType") + .andWhere( + year !== 0 && year != null && year != undefined + ? "developmentScholarship.scholarshipYear = :scholarshipYear" + : "1=1", + { scholarshipYear: year }, + ) + .andWhere( + rootId != "" && rootId != null && rootId != undefined + ? "developmentScholarship.rootId = :rootId" + : "1=1", + { rootId: rootId }, + ) + .orderBy("developmentScholarship.scholarshipYear", "DESC") + .addOrderBy("developmentScholarship.createdAt", "DESC") + .getManyAndCount(); return new HttpSuccess({ template: "reportFund3", reportName: "reportFund3", data: { - data: "", + year: year ? Extension.ToThaiNumber(year.toString()) : "-", + root: null, + developments: development, + total: total }, }); } From 5882e21a41536cdb457539dd881b1b1bce6e90ea Mon Sep 17 00:00:00 2001 From: Bright Date: Thu, 13 Feb 2025 11:15:13 +0700 Subject: [PATCH 02/10] update report3 --- src/controllers/ReportController.ts | 78 ++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 23 deletions(-) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index deb87af..5aaa802 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -567,34 +567,66 @@ export class ReportController extends Controller { @Query("year") year: number, @Query("rootId") rootId?: string, ) { - const [development, total] = await AppDataSource.getRepository(DevelopmentScholarship) - .createQueryBuilder("developmentScholarship") - .leftJoinAndSelect("developmentScholarship.posLevel", "posLevel") - .leftJoinAndSelect("developmentScholarship.posType", "posType") - .andWhere( - year !== 0 && year != null && year != undefined - ? "developmentScholarship.scholarshipYear = :scholarshipYear" - : "1=1", - { scholarshipYear: year }, - ) - .andWhere( - rootId != "" && rootId != null && rootId != undefined - ? "developmentScholarship.rootId = :rootId" - : "1=1", - { rootId: rootId }, - ) - .orderBy("developmentScholarship.scholarshipYear", "DESC") - .addOrderBy("developmentScholarship.createdAt", "DESC") - .getManyAndCount(); + const developments = await AppDataSource.getRepository(DevelopmentScholarship) + .createQueryBuilder("developmentScholarship") + .leftJoinAndSelect("developmentScholarship.posLevel", "posLevel") + .leftJoinAndSelect("developmentScholarship.posType", "posType") + .andWhere( + year !== 0 && year != null && year != undefined + ? "developmentScholarship.scholarshipYear = :scholarshipYear" + : "1=1", + { scholarshipYear: year }, + ) + .andWhere( + rootId != "" && rootId != null && rootId != undefined + ? "developmentScholarship.rootId = :rootId" + : "1=1", + { rootId: rootId }, + ) + .orderBy("developmentScholarship.scholarshipYear", "DESC") + .addOrderBy("developmentScholarship.createdAt", "DESC") + .getMany(); + + const mapData = developments.map((item, idx:number) => ({ + no: Extension.ToThaiNumber((idx+1).toString()), + institution: item.educationalInstitution ? item.educationalInstitution : "-", + scholarshipType: item.scholarshipType ? item.scholarshipType : "-", + degreeLevel: item.degreeLevel ? item.degreeLevel : "-", + course: item.course ? item.course : "-", + field: item.field ? item.field : "-", + fullName: `${item.prefix}${item.firstName} ${item.lastName}`, + position: item.position ? item.position : "-", + posLevel: item.posLevel ? item.posLevel.posLevelName : "-", + totalPeriod: item.totalPeriod ? item.totalPeriod : "-", + budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toString()) : "๐" //toLocaleString + })); + + const sum = developments + .filter(x => x.budgetApprove) + .reduce((acc, item) => acc + (Number(item.budgetApprove)), 0); return new HttpSuccess({ template: "reportFund3", reportName: "reportFund3", data: { - year: year ? Extension.ToThaiNumber(year.toString()) : "-", - root: null, - developments: development, - total: total + year: year ? Extension.ToThaiNumber((year+543).toString()) : "-", + root: developments.length > 0 ? developments[0].root : "-", + data: mapData.length > 0 + ? mapData + : [{ + no: "-", + institution: "-", + scholarshipType: "-", + degreeLevel: "-", + course: "-", + field: "-", + fullName: "-", + position: "-", + posLevel: "-", + totalPeriod: "-", + budgetApprove: "-", + }], + sum: sum ? Extension.ToThaiNumber(sum.toString()): "-" }, }); } From a455c14ce6d7850169545357e9afd7510df25564 Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Thu, 13 Feb 2025 17:34:19 +0700 Subject: [PATCH 03/10] update --- src/controllers/ReportController.ts | 116 +++++++++++++++++++++++- src/entities/view/viewDevScholarship.ts | 26 ++++++ src/interfaces/extension.ts | 43 +++++++++ 3 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 src/entities/view/viewDevScholarship.ts diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index deb87af..5819489 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -623,14 +623,75 @@ export class ReportController extends Controller { * */ @Get("report5") - async report5() { + async report5( + @Query("year") year: number, + // @Query("rootId") rootId: string, + ) { + + const [development, total] = await AppDataSource.getRepository(DevelopmentScholarship) + .createQueryBuilder("developmentScholarship") + .leftJoinAndSelect("developmentScholarship.posLevel", "posLevel") + .leftJoinAndSelect("developmentScholarship.posType", "posType") + .leftJoinAndSelect("developmentScholarship.posLevelguarantor", "posLevelguarantor") + .leftJoinAndSelect("developmentScholarship.posTypeguarantor", "posTypeguarantor") + // .where("developmentScholarship.rootId = :rootId", { rootId: rootId }) + .andWhere( + year !== 0 && year != null && year != undefined + ? "developmentScholarship.scholarshipYear = :scholarshipYear" + : "1=1", + { scholarshipYear: year }, + ) + .andWhere( + "developmentScholarship.scholarshipType = :scholarshipType", { scholarshipType: "RESEARCH" }, + ) + .orderBy("developmentScholarship.scholarshipYear", "DESC") + .addOrderBy("developmentScholarship.createdAt", "DESC") + .getManyAndCount(); + + const totalBudgetApprove = development.reduce((sum, item) => sum + Number(item.budgetApprove), 0); + const formattedData = development.map((item, index) => { + const rawPath = [ + item.course == "-" ? null : item.course, + item.field == "-" ? null : item.course + ]; + + const courseAndfield = rawPath + .filter((path) => path !== undefined && path !== null) + .join("/"); + + const date = [ + Extension.ToThaiNumber(Extension.ToThaiShortDate(item.startDate)), + Extension.ToThaiNumber(Extension.ToThaiShortDate(item.endDate)) + ]; + + const dateDulation = date + .filter((path) => path !== undefined && path !== null) + .join(" - "); + + return { + no: Extension.ToThaiNumber((index + 1).toString()), + id: item.id, + studyTopic: item.studyTopic ? item.studyTopic : "-", + fullName: item.prefix + item.firstName + " " + item.lastName, + position: item.position, + posLevel: item.posLevel ? item.posLevel.posLevelName : "-", + courseAndfield: courseAndfield ?? "-", + place: item.studyPlace ? item.studyPlace : "-", + country: item.studyCountry ? item.studyCountry : "-", + startAndendDate: dateDulation, + budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toString()) : "-", + }; + }); return new HttpSuccess({ template: "reportFund5", reportName: "reportFund5", data: { - data: "", + year: Extension.ToThaiNumber(year.toString()), + data: formattedData, + total: Extension.ToThaiNumber(total.toString()), + totalBudgetApprove: Extension.ToThaiNumber(totalBudgetApprove.toString()), }, }); } @@ -641,8 +702,57 @@ export class ReportController extends Controller { * */ @Get("report6") - async report6() { + async report6( + @Query("year") year: number, + ) { + const degree = [ + "ปริญญาเอก", + "ปริญญาโท", + "ปริญญาตรี", + "ปวส.", + "ปวช.", + "ม.6", + "ม.3", + ]; + + + // const totalBudgetApprove = development.reduce((sum, item) => sum + Number(item.budgetApprove), 0); + // const formattedData = development.map((item, index) => { + // const rawPath = [ + // item.course == "-" ? null : item.course, + // item.field == "-" ? null : item.course + // ]; + // const courseAndfield = rawPath + // .filter((path) => path !== undefined && path !== null) + // .join("/"); + + // const date = [ + // Extension.ToThaiNumber(Extension.ToThaiShortDate(item.startDate)), + // Extension.ToThaiNumber(Extension.ToThaiShortDate(item.endDate)) + // ]; + + // const dateDulation = date + // .filter((path) => path !== undefined && path !== null) + // .join(" - "); + + // return { + // no: Extension.ToThaiNumber((index + 1).toString()), + // id: item.id, + // rootId: item.rootId, + // root: item.root, + // degree: item.degreeLevel, + // // studyTopic: item.studyTopic ? item.studyTopic : "-", + // // fullName: item.prefix + item.firstName + " " + item.lastName, + // // position: item.position, + // // posLevel: item.posLevel ? item.posLevel.posLevelName : "-", + // // courseAndfield: courseAndfield ?? "-", + // // place: item.studyPlace ? item.studyPlace : "-", + // // country: item.studyCountry ? item.studyCountry : "-", + // // startAndendDate: dateDulation, + // // budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toString()) : "-", + // }; + // }); return new HttpSuccess({ template: "reportFund6", diff --git a/src/entities/view/viewDevScholarship.ts b/src/entities/view/viewDevScholarship.ts new file mode 100644 index 0000000..4b66501 --- /dev/null +++ b/src/entities/view/viewDevScholarship.ts @@ -0,0 +1,26 @@ +import { ViewColumn, ViewEntity } from "typeorm"; + +@ViewEntity({ + expression: `SELECT MAX(\`rootId\`) AS rootId, + MAX(\`root\`) AS root,\`degreeLevel\`, + COUNT(*) AS numberOfRecords, + COUNT(DISTINCT \`scholarshipType\`) AS numberOfScholarshipTypes, + SUM(\`budgetApprove\`) AS totalBudgetApprove + FROM \`developmentScholarship\` + GROUP BY \`rootId\`,\`degreeLevel\` + `, +}) + +export class viewProfileEvaluation { + @ViewColumn() + rootId: string; + @ViewColumn() + root: string; + @ViewColumn() + numberOfRecords: number; + @ViewColumn() + numberOfScholarshipTypes: number; + @ViewColumn() + totalBudgetApprove: number; + } + diff --git a/src/interfaces/extension.ts b/src/interfaces/extension.ts index 5de8bd4..f8a28d1 100644 --- a/src/interfaces/extension.ts +++ b/src/interfaces/extension.ts @@ -30,6 +30,37 @@ class Extension { } } + public static ToThaiShortMonth(value: number) { + switch (value) { + case 1: + return "ม.ค."; + case 2: + return "ก.พ."; + case 3: + return "มี.ค."; + case 4: + return "เม.ย."; + case 5: + return "พ.ค."; + case 6: + return "มิ.ย."; + case 7: + return "ก.ค."; + case 8: + return "ส.ค."; + case 9: + return "ก.ย."; + case 10: + return "ต.ค."; + case 11: + return "พ.ย."; + case 12: + return "ธ.ค."; + default: + return ""; + } + } + public static ToThaiYear(value: number) { if (value < 2400) return value + 543; else return value; @@ -86,6 +117,18 @@ class Extension { } return sum; } + + public static ToThaiShortDate(value: Date) { + let yy = value.getFullYear() < 2400 ? value.getFullYear() + 543 : value.getFullYear(); + return ( + value.getDate() + + " " + + Extension.ToThaiShortMonth(value.getMonth() + 1) + + " " + + yy.toString().slice(-2) + ); + } + } export default Extension; From 92855fac400ddb93d927a14c7ba96d73d66f6ba1 Mon Sep 17 00:00:00 2001 From: Bright Date: Thu, 13 Feb 2025 17:38:17 +0700 Subject: [PATCH 04/10] update 3 4 --- src/controllers/ReportController.ts | 155 ++++++++++++++++++++++++++-- 1 file changed, 148 insertions(+), 7 deletions(-) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 5aaa802..9c367fe 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -586,11 +586,23 @@ export class ReportController extends Controller { .orderBy("developmentScholarship.scholarshipYear", "DESC") .addOrderBy("developmentScholarship.createdAt", "DESC") .getMany(); - + const mapData = developments.map((item, idx:number) => ({ no: Extension.ToThaiNumber((idx+1).toString()), institution: item.educationalInstitution ? item.educationalInstitution : "-", - scholarshipType: item.scholarshipType ? item.scholarshipType : "-", + scholarshipType: item.scholarshipType ? + item.scholarshipType == "DOMESTICE" + ? "การศึกษาในประเทศ" + : item.scholarshipType == "NOABROAD" + ? "ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรที่ไม่มีการไปต่างประเทศ)" + : item.scholarshipType == "ABROAD" + ? "ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรที่มีการไปต่างประเทศ)" + : item.scholarshipType == "EXECUTIVE" + ? "ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรประเภทนักบริหาร)" + : item.scholarshipType == "RESEARCH" + ? "ศึกษา ฝึกอบรม ประชุม ดูงาน และปฏิบัติการวิจัย ณ ต่างประเทศ" + : "-" + : "-", degreeLevel: item.degreeLevel ? item.degreeLevel : "-", course: item.course ? item.course : "-", field: item.field ? item.field : "-", @@ -598,7 +610,7 @@ export class ReportController extends Controller { position: item.position ? item.position : "-", posLevel: item.posLevel ? item.posLevel.posLevelName : "-", totalPeriod: item.totalPeriod ? item.totalPeriod : "-", - budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toString()) : "๐" //toLocaleString + budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toLocaleString()) : "๐" })); const sum = developments @@ -610,7 +622,7 @@ export class ReportController extends Controller { reportName: "reportFund3", data: { year: year ? Extension.ToThaiNumber((year+543).toString()) : "-", - root: developments.length > 0 ? developments[0].root : "-", + root: rootId ? developments.length > 0 ? developments.find(x => x.root != "")?.root: "-" : "-", data: mapData.length > 0 ? mapData : [{ @@ -626,7 +638,7 @@ export class ReportController extends Controller { totalPeriod: "-", budgetApprove: "-", }], - sum: sum ? Extension.ToThaiNumber(sum.toString()): "-" + sum: sum ? Extension.ToThaiNumber(sum.toLocaleString()): "-" }, }); } @@ -637,14 +649,143 @@ export class ReportController extends Controller { * */ @Get("report4") - async report4() { + async report4( + @Query("year") year: number, + ) { + const developments = await AppDataSource.getRepository(DevelopmentScholarship) + .createQueryBuilder("developmentScholarship") + .andWhere( + year !== 0 && year != null && year != undefined + ? "developmentScholarship.scholarshipYear = :scholarshipYear" + : "1=1", + { scholarshipYear: year }, + ) + .orderBy("developmentScholarship.scholarshipYear", "DESC") + .addOrderBy("developmentScholarship.createdAt", "DESC") + .getMany(); + // const _develop = await this.developmentScholarshipRepository.find({ + // where: { + // scholarshipYear: year ? year : Not(IsNull()) + // }, + // order: { "scholarshipYear" : "DESC" } + // }) + const groupDevelopment = Array.isArray(developments) && developments.length > 0 + ? developments.reduce((acc:any, current:any, idx:number) => { + const root = current.root || ""; + if (!acc[root]) { + acc[root] = { + // rootId, + no: (idx+1), + root: root, + Bachelor : 0, + BachelorHight: 0, + Master: 0, + Doctor: 0, + DomesticeCourseCount: 0, + DomesticeProfileCount: 0, + DomesticeBudgetApprove: 0, + NoAbroadCourseCount: 0, + NoAbroadDProfileCount: 0, + NoAbroadBudgetApprove: 0, + AbroadCourseCount: 0, + AbroadProfileCount: 0, + AbroadBudgetApprove: 0, + ExecutiveCourseCount: 0, + ExecutiveProfileCount: 0, + ExecutiveBudgetApprove: 0, + TotalCourseCount: 0, + TotalProfileCount: 0, + TotalBudgetApprove: 0, + }; + } + + switch (current.scholarshipType) { + case "DOMESTICE": + acc[root].DomesticeCourseCount++; + acc[root].DomesticeProfileCount++; + acc[root].DomesticeBudgetApprove += current.budgetApprove || 0; + break; + case "NOABROAD": + acc[root].NoAbroadCourseCount++; + acc[root].NoAbroadProfileCount++; + acc[root].NoAbroadBudgetApprove += current.budgetApprove || 0; + break; + case "ABROAD": + acc[root].AbroadCourseCount++; + acc[root].AbroadProfileCount++; + acc[root].AbroadBudgetApprove += current.budgetApprove || 0; + break; + case "EXECUTIVE": + acc[root].ExecutiveCourseCount++; + acc[root].ExecutiveProfileCount++; + acc[root].ExecutiveBudgetApprove += current.budgetApprove || 0; + break; + } + + acc[root].TotalCourseCount = acc[root].DomesticeCourseCount + acc[root].NoAbroadCourseCount + acc[root].AbroadCourseCount + acc[root].ExecutiveCourseCount; + acc[root].TotalProfileCount = acc[root].DomesticeProfileCount + acc[root].NoAbroadProfileCount + acc[root].AbroadProfileCount + acc[root].ExecutiveProfileCount; + acc[root].TotalBudgetApprove = acc[root].DomesticeBudgetApprove + acc[root].NoAbroadBudgetApprove + acc[root].AbroadBudgetApprove + acc[root].ExecutiveBudgetApprove; + + return acc; + }, {}) + : []; + + const _group = Object.values(groupDevelopment); return new HttpSuccess({ template: "reportFund4", reportName: "reportFund4", data: { - data: "", + year: year ? Extension.ToThaiNumber((year+543).toString()) : "-", + data: Array.isArray(_group) + ? _group.map((x:any, idx:number) => ({ + // no: Extension.ToThaiNumber((idx+1).toString()), + // root: x.root ? x.root : "-", + // Bachelor : "-", + // BachelorHight: "-", + // Master: "-", + // Doctor: "-", + // DomesticeCourseCount: x.DomesticeCourseCount ? Extension.ToThaiNumber(x.DomesticeCourseCount) : "๐", + // DomesticeProfileCount: x.DomesticeProfileCount ? Extension.ToThaiNumber(x.DomesticeProfileCount) : "๐", + // DomesticeBudgetApprove: x.DomesticeBudgetApprove ? Extension.ToThaiNumber(x.DomesticeBudgetApprove) : "๐", + // NoAbroadCourseCount: x.NoAbroadCourseCount ? Extension.ToThaiNumber(x.NoAbroadCourseCount) : "๐", + // NoAbroadDProfileCount: x.NoAbroadDProfileCount ? Extension.ToThaiNumber(x.NoAbroadDProfileCount) : "๐", + // NoAbroadBudgetApprove: x.NoAbroadBudgetApprove ? Extension.ToThaiNumber(x.NoAbroadBudgetApprove) : "๐", + // AbroadCourseCount: x.AbroadCourseCount ? Extension.ToThaiNumber(x.AbroadCourseCount) : "๐", + // AbroadProfileCount: x.AbroadProfileCount ? Extension.ToThaiNumber(x.AbroadProfileCount) : "๐", + // AbroadBudgetApprove: x.AbroadBudgetApprove ? Extension.ToThaiNumber(x.AbroadBudgetApprove) : "๐", + // ExecutiveCourseCount: x.ExecutiveCourseCount ? Extension.ToThaiNumber(x.ExecutiveCourseCount) : "๐", + // ExecutiveProfileCount: x.ExecutiveProfileCount ? Extension.ToThaiNumber(x.ExecutiveProfileCount) : "๐", + // ExecutiveBudgetApprove: x.ExecutiveBudgetApprove ? Extension.ToThaiNumber(x.ExecutiveBudgetApprove) : "๐", + // TotalCourseCount: x.TotalCourseCount ? Extension.ToThaiNumber(x.TotalCourseCount) : "๐", + // TotalProfileCount: x.TotalProfileCount ? Extension.ToThaiNumber(x.TotalProfileCount) : "๐", + // TotalBudgetApprove: x.TotalBudgetApprove ? Extension.ToThaiNumber(x.TotalBudgetApprove) : "๐", + })) + : [{ + no: "-", + root: "-", + Bachelor : "-", + BachelorHight: "-", + Master: "-", + Doctor: "-", + DomesticeCourseCount: "-", + DomesticeProfileCount: "-", + DomesticeBudgetApprove: "-", + NoAbroadCourseCount: "-", + NoAbroadDProfileCount: "-", + NoAbroadBudgetApprove: "-", + AbroadCourseCount: "-", + AbroadProfileCount: "-", + AbroadBudgetApprove: "-", + ExecutiveCourseCount: "-", + ExecutiveProfileCount: "-", + ExecutiveBudgetApprove: "-", + TotalCourseCount: "-", + TotalProfileCount: "-", + TotalBudgetApprove: "-", + }], + totalRoot: Array.isArray(_group) ? Extension.ToThaiNumber(_group.length.toLocaleString()) : "-" }, }); } From 88af7fcbb04baff75ade9ba5da6fd9e5157e382b Mon Sep 17 00:00:00 2001 From: Bright Date: Thu, 13 Feb 2025 17:53:34 +0700 Subject: [PATCH 05/10] migrate --- src/controllers/ReportController.ts | 48 +++++++++++------------ src/migration/1739443292907-updateView.ts | 23 +++++++++++ 2 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 src/migration/1739443292907-updateView.ts diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index deb9e91..966c571 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -676,7 +676,6 @@ export class ReportController extends Controller { const root = current.root || ""; if (!acc[root]) { acc[root] = { - // rootId, no: (idx+1), root: root, Bachelor : 0, @@ -739,29 +738,30 @@ export class ReportController extends Controller { data: { year: year ? Extension.ToThaiNumber((year+543).toString()) : "-", data: Array.isArray(_group) - ? _group.map((x:any, idx:number) => ({ - // no: Extension.ToThaiNumber((idx+1).toString()), - // root: x.root ? x.root : "-", - // Bachelor : "-", - // BachelorHight: "-", - // Master: "-", - // Doctor: "-", - // DomesticeCourseCount: x.DomesticeCourseCount ? Extension.ToThaiNumber(x.DomesticeCourseCount) : "๐", - // DomesticeProfileCount: x.DomesticeProfileCount ? Extension.ToThaiNumber(x.DomesticeProfileCount) : "๐", - // DomesticeBudgetApprove: x.DomesticeBudgetApprove ? Extension.ToThaiNumber(x.DomesticeBudgetApprove) : "๐", - // NoAbroadCourseCount: x.NoAbroadCourseCount ? Extension.ToThaiNumber(x.NoAbroadCourseCount) : "๐", - // NoAbroadDProfileCount: x.NoAbroadDProfileCount ? Extension.ToThaiNumber(x.NoAbroadDProfileCount) : "๐", - // NoAbroadBudgetApprove: x.NoAbroadBudgetApprove ? Extension.ToThaiNumber(x.NoAbroadBudgetApprove) : "๐", - // AbroadCourseCount: x.AbroadCourseCount ? Extension.ToThaiNumber(x.AbroadCourseCount) : "๐", - // AbroadProfileCount: x.AbroadProfileCount ? Extension.ToThaiNumber(x.AbroadProfileCount) : "๐", - // AbroadBudgetApprove: x.AbroadBudgetApprove ? Extension.ToThaiNumber(x.AbroadBudgetApprove) : "๐", - // ExecutiveCourseCount: x.ExecutiveCourseCount ? Extension.ToThaiNumber(x.ExecutiveCourseCount) : "๐", - // ExecutiveProfileCount: x.ExecutiveProfileCount ? Extension.ToThaiNumber(x.ExecutiveProfileCount) : "๐", - // ExecutiveBudgetApprove: x.ExecutiveBudgetApprove ? Extension.ToThaiNumber(x.ExecutiveBudgetApprove) : "๐", - // TotalCourseCount: x.TotalCourseCount ? Extension.ToThaiNumber(x.TotalCourseCount) : "๐", - // TotalProfileCount: x.TotalProfileCount ? Extension.ToThaiNumber(x.TotalProfileCount) : "๐", - // TotalBudgetApprove: x.TotalBudgetApprove ? Extension.ToThaiNumber(x.TotalBudgetApprove) : "๐", - })) + ? _group + // ? _group.map((x:any) => ({ + // no: x.no ? Extension.ToThaiNumber(x.no) : "-", + // root: x.root ? x.root : "-", + // Bachelor : "-", + // BachelorHight: "-", + // Master: "-", + // Doctor: "-", + // DomesticeCourseCount: x.DomesticeCourseCount ? Extension.ToThaiNumber(x.DomesticeCourseCount) : "-", + // DomesticeProfileCount: x.DomesticeProfileCount ? Extension.ToThaiNumber(x.DomesticeProfileCount) : "-", + // DomesticeBudgetApprove: x.DomesticeBudgetApprove ? Extension.ToThaiNumber(x.DomesticeBudgetApprove) : "-", + // NoAbroadCourseCount: x.NoAbroadCourseCount ? Extension.ToThaiNumber(x.NoAbroadCourseCount) : "-", + // NoAbroadDProfileCount: x.NoAbroadDProfileCount ? Extension.ToThaiNumber(x.NoAbroadDProfileCount) : "-", + // NoAbroadBudgetApprove: x.NoAbroadBudgetApprove ? Extension.ToThaiNumber(x.NoAbroadBudgetApprove) : "-", + // AbroadCourseCount: x.AbroadCourseCount ? Extension.ToThaiNumber(x.AbroadCourseCount) : "-", + // AbroadProfileCount: x.AbroadProfileCount ? Extension.ToThaiNumber(x.AbroadProfileCount) : "-", + // AbroadBudgetApprove: x.AbroadBudgetApprove ? Extension.ToThaiNumber(x.AbroadBudgetApprove) : "-", + // ExecutiveCourseCount: x.ExecutiveCourseCount ? Extension.ToThaiNumber(x.ExecutiveCourseCount) : "-", + // ExecutiveProfileCount: x.ExecutiveProfileCount ? Extension.ToThaiNumber(x.ExecutiveProfileCount) : "-", + // ExecutiveBudgetApprove: x.ExecutiveBudgetApprove ? Extension.ToThaiNumber(x.ExecutiveBudgetApprove) : "-", + // TotalCourseCount: x.TotalCourseCount ? Extension.ToThaiNumber(x.TotalCourseCount) : "-", + // TotalProfileCount: x.TotalProfileCount ? Extension.ToThaiNumber(x.TotalProfileCount) : "-", + // TotalBudgetApprove: x.TotalBudgetApprove ? Extension.ToThaiNumber(x.TotalBudgetApprove) : "-", + // })) : [{ no: "-", root: "-", diff --git a/src/migration/1739443292907-updateView.ts b/src/migration/1739443292907-updateView.ts new file mode 100644 index 0000000..abfef72 --- /dev/null +++ b/src/migration/1739443292907-updateView.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateView1739443292907 implements MigrationInterface { + name = 'UpdateView1739443292907' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE VIEW \`view_profile_evaluation\` AS SELECT MAX(\`rootId\`) AS rootId, + MAX(\`root\`) AS root,\`degreeLevel\`, + COUNT(*) AS numberOfRecords, + COUNT(DISTINCT \`scholarshipType\`) AS numberOfScholarshipTypes, + SUM(\`budgetApprove\`) AS totalBudgetApprove + FROM \`developmentScholarship\` + GROUP BY \`rootId\`,\`degreeLevel\` + `); + await queryRunner.query(`INSERT INTO \`bma_ehr_development_demo\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["bma_ehr_development_demo","VIEW","view_profile_evaluation","SELECT MAX(`rootId`) AS rootId, \n MAX(`root`) AS root,`degreeLevel`,\n COUNT(*) AS numberOfRecords, \n COUNT(DISTINCT `scholarshipType`) AS numberOfScholarshipTypes,\n SUM(`budgetApprove`) AS totalBudgetApprove\n FROM `developmentScholarship`\n GROUP BY `rootId`,`degreeLevel`"]); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DELETE FROM \`bma_ehr_development_demo\`.\`typeorm_metadata\` WHERE \`type\` = ? AND \`name\` = ? AND \`schema\` = ?`, ["VIEW","view_profile_evaluation","bma_ehr_development_demo"]); + await queryRunner.query(`DROP VIEW \`view_profile_evaluation\``); + } + +} From 29fca33c2e6e3cb123edabbdf3299d12ded07f54 Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Thu, 13 Feb 2025 18:01:34 +0700 Subject: [PATCH 06/10] fix --- src/entities/view/viewDevScholarship.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/entities/view/viewDevScholarship.ts b/src/entities/view/viewDevScholarship.ts index 4b66501..e85ef4e 100644 --- a/src/entities/view/viewDevScholarship.ts +++ b/src/entities/view/viewDevScholarship.ts @@ -11,7 +11,7 @@ import { ViewColumn, ViewEntity } from "typeorm"; `, }) -export class viewProfileEvaluation { +export class viewDevScholarship { @ViewColumn() rootId: string; @ViewColumn() From 4dc2f476d2290722862304d7e09edb88f84a02c9 Mon Sep 17 00:00:00 2001 From: Bright Date: Thu, 13 Feb 2025 18:07:32 +0700 Subject: [PATCH 07/10] update report + migrate --- src/controllers/ReportController.ts | 15 +++++++++------ src/migration/1739444714910-updateView.ts | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 src/migration/1739444714910-updateView.ts diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 966c571..a28d90b 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -24,7 +24,10 @@ export class ReportController extends Controller { * @param {string} type type ประเภท report */ @Get("main") - async GetReportDevelopemtMain(/*@Path() type: string*/) { + async GetReportDevelopemtMain( + @Query("year") year?: number, + @Query("rootId") rootId?: string, + ) { // const _type = type.trim().toUpperCase(); const formattedData = { @@ -564,7 +567,7 @@ export class ReportController extends Controller { */ @Get("report3") async report3( - @Query("year") year: number, + @Query("year") year?: number, @Query("rootId") rootId?: string, ) { const developments = await AppDataSource.getRepository(DevelopmentScholarship) @@ -650,7 +653,7 @@ export class ReportController extends Controller { */ @Get("report4") async report4( - @Query("year") year: number, + @Query("year") year?: number, ) { const developments = await AppDataSource.getRepository(DevelopmentScholarship) .createQueryBuilder("developmentScholarship") @@ -797,7 +800,7 @@ export class ReportController extends Controller { */ @Get("report5") async report5( - @Query("year") year: number, + @Query("year") year?: number, // @Query("rootId") rootId: string, ) { @@ -861,7 +864,7 @@ export class ReportController extends Controller { template: "reportFund5", reportName: "reportFund5", data: { - year: Extension.ToThaiNumber(year.toString()), + year: year ? Extension.ToThaiNumber(year.toString()) : "-", data: formattedData, total: Extension.ToThaiNumber(total.toString()), totalBudgetApprove: Extension.ToThaiNumber(totalBudgetApprove.toString()), @@ -876,7 +879,7 @@ export class ReportController extends Controller { */ @Get("report6") async report6( - @Query("year") year: number, + @Query("year") year?: number, ) { const degree = [ "ปริญญาเอก", diff --git a/src/migration/1739444714910-updateView.ts b/src/migration/1739444714910-updateView.ts new file mode 100644 index 0000000..ab12b2e --- /dev/null +++ b/src/migration/1739444714910-updateView.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateView1739444714910 implements MigrationInterface { + name = 'UpdateView1739444714910' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE VIEW \`view_dev_scholarship\` AS SELECT MAX(\`rootId\`) AS rootId, + MAX(\`root\`) AS root,\`degreeLevel\`, + COUNT(*) AS numberOfRecords, + COUNT(DISTINCT \`scholarshipType\`) AS numberOfScholarshipTypes, + SUM(\`budgetApprove\`) AS totalBudgetApprove + FROM \`developmentScholarship\` + GROUP BY \`rootId\`,\`degreeLevel\` + `); + await queryRunner.query(`INSERT INTO \`bma_ehr_development_demo\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["bma_ehr_development_demo","VIEW","view_dev_scholarship","SELECT MAX(`rootId`) AS rootId, \n MAX(`root`) AS root,`degreeLevel`,\n COUNT(*) AS numberOfRecords, \n COUNT(DISTINCT `scholarshipType`) AS numberOfScholarshipTypes,\n SUM(`budgetApprove`) AS totalBudgetApprove\n FROM `developmentScholarship`\n GROUP BY `rootId`,`degreeLevel`"]); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DELETE FROM \`bma_ehr_development_demo\`.\`typeorm_metadata\` WHERE \`type\` = ? AND \`name\` = ? AND \`schema\` = ?`, ["VIEW","view_dev_scholarship","bma_ehr_development_demo"]); + await queryRunner.query(`DROP VIEW \`view_dev_scholarship\``); + } + +} From 08bf5e53c6e0e0cf2371479703be7a8ba6ab0c04 Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Thu, 13 Feb 2025 18:08:39 +0700 Subject: [PATCH 08/10] fix --- src/controllers/ReportController.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 966c571..7eac2d6 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -10,12 +10,13 @@ import { PosLevel } from "../entities/PosLevel"; import Extension from "../interfaces/extension"; import { DevelopmentScholarship } from "../entities/DevelopmentScholarship"; import { IsNull, Not } from "typeorm"; +import { viewDevScholarship } from "../entities/view/viewDevScholarship"; @Route("api/v1/development/report") @Tags("Report") @Security("bearerAuth") export class ReportController extends Controller { private developmentScholarshipRepository = AppDataSource.getRepository(DevelopmentScholarship); - + private viewDevScholarship = AppDataSource.getRepository(viewDevScholarship); /** * API Report รายการโครงการ/หลักสูตรการฝึกอบรมที่หน่วยงานของกรุงเทพมหานครเป็นผู้จัด * @@ -861,7 +862,7 @@ export class ReportController extends Controller { template: "reportFund5", reportName: "reportFund5", data: { - year: Extension.ToThaiNumber(year.toString()), + year: Extension.ToThaiNumber((year+543).toString()), data: formattedData, total: Extension.ToThaiNumber(total.toString()), totalBudgetApprove: Extension.ToThaiNumber(totalBudgetApprove.toString()), @@ -888,6 +889,12 @@ export class ReportController extends Controller { "ม.3", ]; + // const development = await this.viewDevScholarship.find({ + // where:{ + // degreeLevel: In(degree), + // } + // }) + // const totalBudgetApprove = development.reduce((sum, item) => sum + Number(item.budgetApprove), 0); // const formattedData = development.map((item, index) => { @@ -931,6 +938,7 @@ export class ReportController extends Controller { template: "reportFund6", reportName: "reportFund6", data: { + year: Extension.ToThaiNumber((year+543).toString()), data: "", }, }); From 896928d3c7e45be096885de678ecd0df6cffe0cf Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Thu, 13 Feb 2025 18:43:36 +0700 Subject: [PATCH 09/10] update --- src/controllers/ReportController.ts | 60 +++++++++---------- src/entities/view/viewDevScholarship.ts | 2 + ...739446719623-update_viewDevScholarship.ts} | 12 ++-- 3 files changed, 37 insertions(+), 37 deletions(-) rename src/migration/{1739443292907-updateView.ts => 1739446719623-update_viewDevScholarship.ts} (51%) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 8e44261..2790f38 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -9,7 +9,7 @@ import { PosType } from "../entities/PosType"; import { PosLevel } from "../entities/PosLevel"; import Extension from "../interfaces/extension"; import { DevelopmentScholarship } from "../entities/DevelopmentScholarship"; -import { IsNull, Not } from "typeorm"; +import { In, IsNull, Not } from "typeorm"; import { viewDevScholarship } from "../entities/view/viewDevScholarship"; @Route("api/v1/development/report") @Tags("Report") @@ -742,30 +742,30 @@ export class ReportController extends Controller { data: { year: year ? Extension.ToThaiNumber((year+543).toString()) : "-", data: Array.isArray(_group) - ? _group - // ? _group.map((x:any) => ({ - // no: x.no ? Extension.ToThaiNumber(x.no) : "-", - // root: x.root ? x.root : "-", - // Bachelor : "-", - // BachelorHight: "-", - // Master: "-", - // Doctor: "-", - // DomesticeCourseCount: x.DomesticeCourseCount ? Extension.ToThaiNumber(x.DomesticeCourseCount) : "-", - // DomesticeProfileCount: x.DomesticeProfileCount ? Extension.ToThaiNumber(x.DomesticeProfileCount) : "-", - // DomesticeBudgetApprove: x.DomesticeBudgetApprove ? Extension.ToThaiNumber(x.DomesticeBudgetApprove) : "-", - // NoAbroadCourseCount: x.NoAbroadCourseCount ? Extension.ToThaiNumber(x.NoAbroadCourseCount) : "-", - // NoAbroadDProfileCount: x.NoAbroadDProfileCount ? Extension.ToThaiNumber(x.NoAbroadDProfileCount) : "-", - // NoAbroadBudgetApprove: x.NoAbroadBudgetApprove ? Extension.ToThaiNumber(x.NoAbroadBudgetApprove) : "-", - // AbroadCourseCount: x.AbroadCourseCount ? Extension.ToThaiNumber(x.AbroadCourseCount) : "-", - // AbroadProfileCount: x.AbroadProfileCount ? Extension.ToThaiNumber(x.AbroadProfileCount) : "-", - // AbroadBudgetApprove: x.AbroadBudgetApprove ? Extension.ToThaiNumber(x.AbroadBudgetApprove) : "-", - // ExecutiveCourseCount: x.ExecutiveCourseCount ? Extension.ToThaiNumber(x.ExecutiveCourseCount) : "-", - // ExecutiveProfileCount: x.ExecutiveProfileCount ? Extension.ToThaiNumber(x.ExecutiveProfileCount) : "-", - // ExecutiveBudgetApprove: x.ExecutiveBudgetApprove ? Extension.ToThaiNumber(x.ExecutiveBudgetApprove) : "-", - // TotalCourseCount: x.TotalCourseCount ? Extension.ToThaiNumber(x.TotalCourseCount) : "-", - // TotalProfileCount: x.TotalProfileCount ? Extension.ToThaiNumber(x.TotalProfileCount) : "-", - // TotalBudgetApprove: x.TotalBudgetApprove ? Extension.ToThaiNumber(x.TotalBudgetApprove) : "-", - // })) + // ? _group + ? _group.map((x:any) => ({ + no: x.no ? Extension.ToThaiNumber(x.no.toString()) : "-", + root: x.root ? x.root : "-", + Bachelor : "-", + BachelorHight: "-", + Master: "-", + Doctor: "-", + DomesticeCourseCount: x.DomesticeCourseCount ? Extension.ToThaiNumber(x.DomesticeCourseCount.toLocaleString()) : "-", + DomesticeProfileCount: x.DomesticeProfileCount ? Extension.ToThaiNumber(x.DomesticeProfileCount.toLocaleString()) : "-", + DomesticeBudgetApprove: x.DomesticeBudgetApprove ? Extension.ToThaiNumber(x.DomesticeBudgetApprove.toLocaleString()) : "-", + NoAbroadCourseCount: x.NoAbroadCourseCount ? Extension.ToThaiNumber(x.NoAbroadCourseCount.toLocaleString()) : "-", + NoAbroadDProfileCount: x.NoAbroadDProfileCount ? Extension.ToThaiNumber(x.NoAbroadDProfileCount.toLocaleString()) : "-", + NoAbroadBudgetApprove: x.NoAbroadBudgetApprove ? Extension.ToThaiNumber(x.NoAbroadBudgetApprove.toLocaleString()) : "-", + AbroadCourseCount: x.AbroadCourseCount ? Extension.ToThaiNumber(x.AbroadCourseCount.toLocaleString()) : "-", + AbroadProfileCount: x.AbroadProfileCount ? Extension.ToThaiNumber(x.AbroadProfileCount.toLocaleString()) : "-", + AbroadBudgetApprove: x.AbroadBudgetApprove ? Extension.ToThaiNumber(x.AbroadBudgetApprove.toLocaleString()) : "-", + ExecutiveCourseCount: x.ExecutiveCourseCount ? Extension.ToThaiNumber(x.ExecutiveCourseCount.toLocaleString()) : "-", + ExecutiveProfileCount: x.ExecutiveProfileCount ? Extension.ToThaiNumber(x.ExecutiveProfileCount.toLocaleString()) : "-", + ExecutiveBudgetApprove: x.ExecutiveBudgetApprove ? Extension.ToThaiNumber(x.ExecutiveBudgetApprove.toLocaleString()) : "-", + TotalCourseCount: x.TotalCourseCount ? Extension.ToThaiNumber(x.TotalCourseCount.toLocaleString()) : "-", + TotalProfileCount: x.TotalProfileCount ? Extension.ToThaiNumber(x.TotalProfileCount.toLocaleString()) : "-", + TotalBudgetApprove: x.TotalBudgetApprove ? Extension.ToThaiNumber(x.TotalBudgetApprove.toLocaleString()) : "-", + })) : [{ no: "-", root: "-", @@ -856,7 +856,7 @@ export class ReportController extends Controller { place: item.studyPlace ? item.studyPlace : "-", country: item.studyCountry ? item.studyCountry : "-", startAndendDate: dateDulation, - budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toString()) : "-", + budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toLocaleString()) : "-", }; }); @@ -867,8 +867,8 @@ export class ReportController extends Controller { data: { year: year?Extension.ToThaiNumber((year+543).toString()):"", data: formattedData, - total: Extension.ToThaiNumber(total.toString()), - totalBudgetApprove: Extension.ToThaiNumber(totalBudgetApprove.toString()), + total: Extension.ToThaiNumber(total.toLocaleString()), + totalBudgetApprove: Extension.ToThaiNumber(totalBudgetApprove.toLocaleString()), }, }); } @@ -893,9 +893,7 @@ export class ReportController extends Controller { ]; // const development = await this.viewDevScholarship.find({ - // where:{ - // degreeLevel: In(degree), - // } + // }) diff --git a/src/entities/view/viewDevScholarship.ts b/src/entities/view/viewDevScholarship.ts index e85ef4e..5d3ea65 100644 --- a/src/entities/view/viewDevScholarship.ts +++ b/src/entities/view/viewDevScholarship.ts @@ -17,6 +17,8 @@ export class viewDevScholarship { @ViewColumn() root: string; @ViewColumn() + degreeLevel: string; + @ViewColumn() numberOfRecords: number; @ViewColumn() numberOfScholarshipTypes: number; diff --git a/src/migration/1739443292907-updateView.ts b/src/migration/1739446719623-update_viewDevScholarship.ts similarity index 51% rename from src/migration/1739443292907-updateView.ts rename to src/migration/1739446719623-update_viewDevScholarship.ts index abfef72..9a1acbc 100644 --- a/src/migration/1739443292907-updateView.ts +++ b/src/migration/1739446719623-update_viewDevScholarship.ts @@ -1,10 +1,10 @@ import { MigrationInterface, QueryRunner } from "typeorm"; -export class UpdateView1739443292907 implements MigrationInterface { - name = 'UpdateView1739443292907' +export class UpdateViewDevScholarship1739446719623 implements MigrationInterface { + name = 'UpdateViewDevScholarship1739446719623' public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE VIEW \`view_profile_evaluation\` AS SELECT MAX(\`rootId\`) AS rootId, + await queryRunner.query(`CREATE VIEW \`view_dev_scholarship\` AS SELECT MAX(\`rootId\`) AS rootId, MAX(\`root\`) AS root,\`degreeLevel\`, COUNT(*) AS numberOfRecords, COUNT(DISTINCT \`scholarshipType\`) AS numberOfScholarshipTypes, @@ -12,12 +12,12 @@ export class UpdateView1739443292907 implements MigrationInterface { FROM \`developmentScholarship\` GROUP BY \`rootId\`,\`degreeLevel\` `); - await queryRunner.query(`INSERT INTO \`bma_ehr_development_demo\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["bma_ehr_development_demo","VIEW","view_profile_evaluation","SELECT MAX(`rootId`) AS rootId, \n MAX(`root`) AS root,`degreeLevel`,\n COUNT(*) AS numberOfRecords, \n COUNT(DISTINCT `scholarshipType`) AS numberOfScholarshipTypes,\n SUM(`budgetApprove`) AS totalBudgetApprove\n FROM `developmentScholarship`\n GROUP BY `rootId`,`degreeLevel`"]); + await queryRunner.query(`INSERT INTO \`bma_ehr_development_demo\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["bma_ehr_development_demo","VIEW","view_dev_scholarship","SELECT MAX(`rootId`) AS rootId, \n MAX(`root`) AS root,`degreeLevel`,\n COUNT(*) AS numberOfRecords, \n COUNT(DISTINCT `scholarshipType`) AS numberOfScholarshipTypes,\n SUM(`budgetApprove`) AS totalBudgetApprove\n FROM `developmentScholarship`\n GROUP BY `rootId`,`degreeLevel`"]); } public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DELETE FROM \`bma_ehr_development_demo\`.\`typeorm_metadata\` WHERE \`type\` = ? AND \`name\` = ? AND \`schema\` = ?`, ["VIEW","view_profile_evaluation","bma_ehr_development_demo"]); - await queryRunner.query(`DROP VIEW \`view_profile_evaluation\``); + await queryRunner.query(`DELETE FROM \`bma_ehr_development_demo\`.\`typeorm_metadata\` WHERE \`type\` = ? AND \`name\` = ? AND \`schema\` = ?`, ["VIEW","view_dev_scholarship","bma_ehr_development_demo"]); + await queryRunner.query(`DROP VIEW \`view_dev_scholarship\``); } } From 724a41a6a0895fdc956d0fceff7454fd7eef8108 Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Thu, 13 Feb 2025 20:02:25 +0700 Subject: [PATCH 10/10] update --- src/controllers/ReportController.ts | 126 ++++++++++++++++++---------- 1 file changed, 81 insertions(+), 45 deletions(-) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 2790f38..5fce29f 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -11,6 +11,7 @@ import Extension from "../interfaces/extension"; import { DevelopmentScholarship } from "../entities/DevelopmentScholarship"; import { In, IsNull, Not } from "typeorm"; import { viewDevScholarship } from "../entities/view/viewDevScholarship"; +import { isNotEmittedStatement } from "typescript"; @Route("api/v1/development/report") @Tags("Report") @Security("bearerAuth") @@ -886,61 +887,96 @@ export class ReportController extends Controller { "ปริญญาเอก", "ปริญญาโท", "ปริญญาตรี", - "ปวส.", - "ปวช.", - "ม.6", - "ม.3", ]; - // const development = await this.viewDevScholarship.find({ + const development = await this.viewDevScholarship.find({ + where: { + rootId: Not(IsNull()), + degreeLevel: In(degree), + }, + }); - // }) - - - // const totalBudgetApprove = development.reduce((sum, item) => sum + Number(item.budgetApprove), 0); - // const formattedData = development.map((item, index) => { - // const rawPath = [ - // item.course == "-" ? null : item.course, - // item.field == "-" ? null : item.course - // ]; + const groupedData = development.reduce((acc:any, item:any) => { + const { rootId, root, degreeLevel, scholarshipType, budgetApprove } = item; - // const courseAndfield = rawPath - // .filter((path) => path !== undefined && path !== null) - // .join("/"); - - // const date = [ - // Extension.ToThaiNumber(Extension.ToThaiShortDate(item.startDate)), - // Extension.ToThaiNumber(Extension.ToThaiShortDate(item.endDate)) - // ]; - - // const dateDulation = date - // .filter((path) => path !== undefined && path !== null) - // .join(" - "); - - // return { - // no: Extension.ToThaiNumber((index + 1).toString()), - // id: item.id, - // rootId: item.rootId, - // root: item.root, - // degree: item.degreeLevel, - // // studyTopic: item.studyTopic ? item.studyTopic : "-", - // // fullName: item.prefix + item.firstName + " " + item.lastName, - // // position: item.position, - // // posLevel: item.posLevel ? item.posLevel.posLevelName : "-", - // // courseAndfield: courseAndfield ?? "-", - // // place: item.studyPlace ? item.studyPlace : "-", - // // country: item.studyCountry ? item.studyCountry : "-", - // // startAndendDate: dateDulation, - // // budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toString()) : "-", - // }; - // }); + if (!acc[rootId]) { + acc[rootId] = { + root, + rootId, + degreeLevel1: { + numberOfRecords: 0, + numberOfScholarshipTypes: 0, + totalBudgetApprove: 0, + }, + degreeLevel2: { + numberOfRecords: 0, + numberOfScholarshipTypes: 0, + totalBudgetApprove: 0, + }, + degreeLevel3: { + numberOfRecords: 0, + numberOfScholarshipTypes: 0, + totalBudgetApprove: 0, + }, + }; + } + + if (degreeLevel === "ปริญญาตรี") { + acc[rootId].degreeLevel1.numberOfRecords += Number(item.numberOfRecords); + acc[rootId].degreeLevel1.numberOfScholarshipTypes += Number(item.numberOfScholarshipTypes); + acc[rootId].degreeLevel1.totalBudgetApprove += Number(item.totalBudgetApprove); + } else if (degreeLevel === "ปริญญาโท") { + acc[rootId].degreeLevel2.numberOfRecords += Number(item.numberOfRecords); + acc[rootId].degreeLevel2.numberOfScholarshipTypes += Number(item.numberOfScholarshipTypes); + acc[rootId].degreeLevel2.totalBudgetApprove += Number(item.totalBudgetApprove); + } else if (degreeLevel === "ปริญญาเอก") { + acc[rootId].degreeLevel3.numberOfRecords += Number(item.numberOfRecords); + acc[rootId].degreeLevel3.numberOfScholarshipTypes += Number(item.numberOfScholarshipTypes); + acc[rootId].degreeLevel3.totalBudgetApprove += Number(item.totalBudgetApprove); + } + + return acc; + }, {}); + const formattedData = Object.values(groupedData).map((item: any, index: any) => { + const sumnumberOfRecords = item.degreeLevel1.numberOfRecords + item.degreeLevel2.numberOfRecords + item.degreeLevel3.numberOfRecords; + const sumnumberOfScholarshipTypes = item.degreeLevel1.numberOfScholarshipTypes + item.degreeLevel2.numberOfScholarshipTypes + item.degreeLevel3.numberOfScholarshipTypes; + const sumtotalBudgetApprove = item.degreeLevel1.totalBudgetApprove + item.degreeLevel2.totalBudgetApprove + item.degreeLevel3.totalBudgetApprove; + + return { + no: index ? Extension.ToThaiNumber((index + 1).toString()) : "๑", + rootId: item.rootId ? item.rootId : "-", + root: item.root ? item.root : "-", + degreeLevel1: "ปริญญาตรี", + numberOfRecords1: item.degreeLevel1.numberOfRecords ? Extension.ToThaiNumber(item.degreeLevel1.numberOfRecords.toString()) : "-", + numberOfScholarshipTypes1: item.degreeLevel1.numberOfScholarshipTypes ? Extension.ToThaiNumber(item.degreeLevel1.numberOfScholarshipTypes.toString()) : "-", + totalBudgetApprove1: item.degreeLevel1.totalBudgetApprove ? Extension.ToThaiNumber(item.degreeLevel1.totalBudgetApprove.toLocaleString()) : "-", + + degreeLevel2: "ปริญญาโท", + numberOfRecords2: item.degreeLevel2.numberOfRecords ? Extension.ToThaiNumber(item.degreeLevel2.numberOfRecords.toString()) : "-", + numberOfScholarshipTypes2: item.degreeLevel2.numberOfScholarshipTypes ? Extension.ToThaiNumber(item.degreeLevel2.numberOfScholarshipTypes.toString()) : "-", + totalBudgetApprove2: item.degreeLevel2.totalBudgetApprove ? Extension.ToThaiNumber(item.degreeLevel2.totalBudgetApprove.toLocaleString()) : "-", + + degreeLevel3: "ปริญญาเอก", + numberOfRecords3: item.degreeLevel3.numberOfRecords ? Extension.ToThaiNumber(item.degreeLevel3.numberOfRecords.toString()) : "-", + numberOfScholarshipTypes3: item.degreeLevel3.numberOfScholarshipTypes ? Extension.ToThaiNumber(item.degreeLevel3.numberOfScholarshipTypes.toString()) : "-", + totalBudgetApprove3: item.degreeLevel3.totalBudgetApprove ? Extension.ToThaiNumber(item.degreeLevel3.totalBudgetApprove.toLocaleString()) : "-", + + totalNumberOfRecords: Extension.ToThaiNumber(sumnumberOfRecords.toString()), + totalNumberOfScholarshipTypes: Extension.ToThaiNumber(sumnumberOfScholarshipTypes.toString()), + totalTotalBudgetApprove: Extension.ToThaiNumber(sumtotalBudgetApprove.toLocaleString()) + }; + }); + const uniqueRoots = new Set(formattedData.map(item => item.root)); + const numberOfORG = uniqueRoots.size; + return new HttpSuccess({ template: "reportFund6", reportName: "reportFund6", data: { year: year?Extension.ToThaiNumber((year+543).toString()):"", - data: "", + data: formattedData, + coutOrg: numberOfORG?Extension.ToThaiNumber(numberOfORG.toString())+" หน่วยงาน":"๐ หน่วยงาน" }, }); }