From a0398c93544c070b73e042fd636345c87078127e Mon Sep 17 00:00:00 2001 From: Bright Date: Wed, 16 Oct 2024 16:34:36 +0700 Subject: [PATCH 01/13] =?UTF-8?q?fix=20=E0=B8=AD=E0=B8=AD=E0=B8=81?= =?UTF-8?q?=E0=B8=84=E0=B8=B3=E0=B8=AA=E0=B8=B1=E0=B9=88=E0=B8=87,=20email?= =?UTF-8?q?=20keycloak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/CommandController.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index 8f291634..91a95124 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -2286,7 +2286,7 @@ export class CommandController extends Controller { const userKeycloakId = await createUser(profile.citizenId, profile.citizenId, { firstName: profile.firstName, lastName: profile.lastName, - email: profile.email, + // email: profile.email, }); if (typeof userKeycloakId !== "string") { throw new Error(userKeycloakId.errorMessage); @@ -2305,6 +2305,7 @@ export class CommandController extends Controller { ); if (!result) throw new Error("Failed. Cannot set user's role."); profile.keycloak = userKeycloakId; + profile.email = item.bodyProfile.email; await this.profileRepository.save(profile); setLogDataDiff(req, { before, after: profile }); } @@ -2773,7 +2774,7 @@ export class CommandController extends Controller { case "C-PM-05": return "/placement/appointment/appoint/report"; case "C-PM-06": - return "/placement/appointment/slip/report"; + return "/placement/slip/report"; case "C-PM-07": return "/placement/appointment/move/report"; case "C-PM-08": @@ -2839,7 +2840,7 @@ export class CommandController extends Controller { case "C-PM-38": return "/org/command/command38/officer/report"; case "C-PM-39": - return "/placement/slip/report"; + return "/placement/appointment/slip/report"; case "C-PM-40": return "/org/command/command40/officer/report"; case "C-PM-41": From 238ab9dba2b0578e653656bafb9202e29d1cac6c Mon Sep 17 00:00:00 2001 From: kittapath Date: Wed, 16 Oct 2024 17:15:55 +0700 Subject: [PATCH 02/13] =?UTF-8?q?=E0=B8=AA=E0=B8=A3=E0=B9=89=E0=B8=B2?= =?UTF-8?q?=E0=B8=87=20workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/WorkflowController.ts | 68 +++++++++++++++++++++++---- src/entities/StateOperatorUser.ts | 8 ---- src/entities/Workflow.ts | 8 ---- 3 files changed, 58 insertions(+), 26 deletions(-) diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 5e5837aa..3a261a56 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -14,6 +14,8 @@ import { StateUserComment } from "../entities/StateUserComment"; import { MetaWorkflow } from "../entities/MetaWorkflow"; import { MetaState } from "../entities/MetaState"; import { MetaStateOperator } from "../entities/MetaStateOperator"; +import { PosMasterAssign } from "../entities/PosMasterAssign"; +import { PosMaster } from "../entities/PosMaster"; @Route("api/v1/org/workflow") @Tags("Workflow") @@ -29,6 +31,7 @@ export class WorkflowController extends Controller { private metaWorkflowRepo = AppDataSource.getRepository(MetaWorkflow); private metaStateRepo = AppDataSource.getRepository(MetaState); private metaStateOperatorRepo = AppDataSource.getRepository(MetaStateOperator); + private posMasterRepo = AppDataSource.getRepository(PosMaster); @Post("add-workflow") public async checkWorkflow( @@ -66,12 +69,19 @@ export class WorkflowController extends Controller { lastUpdatedAt: new Date(), }; const workflow = new Workflow(); - Object.assign(workflow, { ...metaWorkflow, id: undefined, ...meta }); - this.workflowRepo.save(workflow); + Object.assign(workflow, { + ...metaWorkflow, + id: undefined, + ...meta, + ...body, + system: body.sysName, + }); + await this.workflowRepo.save(workflow); const metaState = await this.metaStateRepo.find({ where: { metaWorkflowId: metaWorkflow.id, }, + order: { order: "ASC" }, }); await Promise.all( @@ -79,15 +89,19 @@ export class WorkflowController extends Controller { const state = new State(); Object.assign(state, { ...item, id: undefined, workflowId: workflow.id, ...meta }); await this.stateRepo.save(state); + if (state.order == 1) { + workflow.stateId = state.id; + await this.workflowRepo.save(workflow); + } const metaStateOperator = await this.metaStateOperatorRepo.find({ where: { metaStateId: item.id, }, }); await Promise.all( - metaStateOperator.map(async (item) => { + metaStateOperator.map(async (item1) => { const stateOperator = new StateOperator(); - Object.assign(stateOperator, { ...item, id: undefined, stateId: state.id, ...meta }); + Object.assign(stateOperator, { ...item1, id: undefined, stateId: state.id, ...meta }); await this.stateOperatorRepo.save(stateOperator); }), ); @@ -97,12 +111,46 @@ export class WorkflowController extends Controller { const stateOperatorUser = new StateOperatorUser(); Object.assign(stateOperatorUser, { profileId: profile.id, - operator: "OWNER", + operator: "Owner", order: 1, workflowId: workflow.id, ...meta, }); await this.stateOperatorUserRepo.save(stateOperatorUser); + + const profileOfficer = await this.posMasterRepo.find({ + where: { + posMasterAssigns: { assignId: body.sysName }, + orgRevision: { orgRevisionIsDraft: false, orgRevisionIsCurrent: true }, + }, + relations: ["orgChild1"], + }); + await Promise.all( + profileOfficer.map(async (item, i) => { + if (item.orgChild1 == null || item.orgChild1.isOfficer == false) { + const stateOperatorUser = new StateOperatorUser(); + Object.assign(stateOperatorUser, { + profileId: profile.id, + operator: "Officer", + order: i + 2, + workflowId: workflow.id, + ...meta, + }); + await this.stateOperatorUserRepo.save(stateOperatorUser); + } else { + const stateOperatorUser = new StateOperatorUser(); + Object.assign(stateOperatorUser, { + profileId: profile.id, + operator: "PersonnelOfficer", + order: i + 2, + workflowId: workflow.id, + ...meta, + }); + await this.stateOperatorUserRepo.save(stateOperatorUser); + } + }), + ); + return new HttpSuccess(); } @@ -174,7 +222,7 @@ export class WorkflowController extends Controller { const workflow = await this.workflowRepo.findOne({ where: { refId: body.refId, - system: body.system, + sysName: body.system, }, relations: ["stateOperatorUsers"], }); @@ -207,7 +255,7 @@ export class WorkflowController extends Controller { where: { workflow: { refId: body.refId, - system: body.system, + sysName: body.system, }, profile: { keycloak: req.user.sub, @@ -254,7 +302,7 @@ export class WorkflowController extends Controller { where: { workflow: { refId: body.refId, - system: body.system, + sysName: body.system, }, }, order: { order: "ASC", stateUserComments: { order: "ASC" } }, @@ -282,7 +330,7 @@ export class WorkflowController extends Controller { where: { workflow: { refId: body.refId, - system: body.system, + sysName: body.system, }, profile: { keycloak: req.user.sub, @@ -295,7 +343,7 @@ export class WorkflowController extends Controller { const workflow = await this.workflowRepo.findOne({ where: { refId: body.refId, - system: body.system, + sysName: body.system, }, relations: ["stateOperatorUsers"], }); diff --git a/src/entities/StateOperatorUser.ts b/src/entities/StateOperatorUser.ts index d9f2d6a8..6d5c4294 100644 --- a/src/entities/StateOperatorUser.ts +++ b/src/entities/StateOperatorUser.ts @@ -21,14 +21,6 @@ export class StateOperatorUser extends EntityBase { }) order: number; - @Column({ - nullable: true, - comment: "ผู้ดำเนินการ", - length: 255, - default: null, - }) - refId: string; - @Column({ nullable: true, length: 40, diff --git a/src/entities/Workflow.ts b/src/entities/Workflow.ts index 0c6090d6..e6804bf2 100644 --- a/src/entities/Workflow.ts +++ b/src/entities/Workflow.ts @@ -13,14 +13,6 @@ export class Workflow extends EntityBase { }) refId: string; - @Column({ - nullable: true, - comment: "system", - length: 255, - default: null, - }) - system: string; - @Column({ nullable: true, comment: "ชื่อ flow", From b933666c8d203aea25a4d2feb547ebd3466dbc71 Mon Sep 17 00:00:00 2001 From: kittapath Date: Wed, 16 Oct 2024 17:49:55 +0700 Subject: [PATCH 03/13] delete user in state --- src/controllers/WorkflowController.ts | 8 ++++---- .../1729073909711-add_table_workflow8.ts | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 src/migration/1729073909711-add_table_workflow8.ts diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 3a261a56..a37a95c5 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -16,6 +16,7 @@ import { MetaState } from "../entities/MetaState"; import { MetaStateOperator } from "../entities/MetaStateOperator"; import { PosMasterAssign } from "../entities/PosMasterAssign"; import { PosMaster } from "../entities/PosMaster"; +import { Not } from "typeorm"; @Route("api/v1/org/workflow") @Tags("Workflow") @@ -326,19 +327,18 @@ export class WorkflowController extends Controller { system: string; }, ) { - const stateOperatorUser = await this.stateOperatorUserRepo.findOne({ + const stateOperatorUser = await this.stateOperatorUserRepo.find({ where: { workflow: { refId: body.refId, sysName: body.system, }, profile: { - keycloak: req.user.sub, + keycloak: Not(req.user.sub), }, }, }); - if (!stateOperatorUser) - throw new HttpError(HttpStatus.NOT_FOUND, "ผู้ใช้งานนี้ไม่มีหน้าที่ในกระบวนการนี้"); + await this.stateOperatorUserRepo.remove(stateOperatorUser); const workflow = await this.workflowRepo.findOne({ where: { diff --git a/src/migration/1729073909711-add_table_workflow8.ts b/src/migration/1729073909711-add_table_workflow8.ts new file mode 100644 index 00000000..17efd713 --- /dev/null +++ b/src/migration/1729073909711-add_table_workflow8.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddTableWorkflow81729073909711 implements MigrationInterface { + name = 'AddTableWorkflow81729073909711' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`workflow\` DROP COLUMN \`system\``); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` DROP COLUMN \`refId\``); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` ADD \`refId\` varchar(255) NULL COMMENT 'ผู้ดำเนินการ'`); + await queryRunner.query(`ALTER TABLE \`workflow\` ADD \`system\` varchar(255) NULL COMMENT 'system'`); + } + +} From 7cada3195d4556f175251eb9b12d53a533dbf2fe Mon Sep 17 00:00:00 2001 From: kittapath Date: Thu, 17 Oct 2024 09:46:55 +0700 Subject: [PATCH 04/13] =?UTF-8?q?=E0=B8=AB=E0=B8=B2=E0=B8=9C=E0=B8=B9?= =?UTF-8?q?=E0=B9=89=E0=B8=9A=E0=B8=B1=E0=B8=87=E0=B8=84=E0=B8=B1=E0=B8=9A?= =?UTF-8?q?=E0=B8=9A=E0=B8=B1=E0=B8=8D=E0=B8=8A=E0=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/WorkflowController.ts | 50 ++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index a37a95c5..36d65ece 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Post, Request, Route, Security, Tags } from "tsoa"; +import { Body, Controller, Get, Path, Post, Request, Route, Security, Tags } from "tsoa"; import { AppDataSource } from "../database/data-source"; import { RequestWithUser } from "../middlewares/user"; import HttpError from "../interfaces/http-error"; @@ -16,7 +16,7 @@ import { MetaState } from "../entities/MetaState"; import { MetaStateOperator } from "../entities/MetaStateOperator"; import { PosMasterAssign } from "../entities/PosMasterAssign"; import { PosMaster } from "../entities/PosMaster"; -import { Not } from "typeorm"; +import { IsNull, Not } from "typeorm"; @Route("api/v1/org/workflow") @Tags("Workflow") @@ -131,7 +131,7 @@ export class WorkflowController extends Controller { if (item.orgChild1 == null || item.orgChild1.isOfficer == false) { const stateOperatorUser = new StateOperatorUser(); Object.assign(stateOperatorUser, { - profileId: profile.id, + profileId: item.current_holderId, operator: "Officer", order: i + 2, workflowId: workflow.id, @@ -141,7 +141,7 @@ export class WorkflowController extends Controller { } else { const stateOperatorUser = new StateOperatorUser(); Object.assign(stateOperatorUser, { - profileId: profile.id, + profileId: item.current_holderId, operator: "PersonnelOfficer", order: i + 2, workflowId: workflow.id, @@ -266,7 +266,8 @@ export class WorkflowController extends Controller { }); if (!stateOperatorUser) throw new HttpError(HttpStatus.NOT_FOUND, "ผู้ใช้งานนี้ไม่มีหน้าที่ในกระบวนการนี้"); - + console.log(stateOperatorUser.operator); + console.log(stateOperatorUser.workflow.stateId); const operator = await this.stateOperatorRepo.findOne({ where: { operator: stateOperatorUser.operator, @@ -586,4 +587,43 @@ export class WorkflowController extends Controller { profileId: stateUserComment?.profileId || null, }); } + + /** + * + * + */ + @Get("commander") + async getProfilePlacement(@Request() req: RequestWithUser) { + const posMasterUser = await this.posMasterRepo.findOne({ + where: { + orgRevision: { orgRevisionIsCurrent: false, orgRevisionIsDraft: true }, + current_holder: { keycloak: req.user.sub }, + }, + }); + if (!posMasterUser || !posMasterUser.orgRootId) + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบตำแหน่งผู้ใช้งาน"); + + const posMasters = await this.posMasterRepo.find({ + where: { + orgRevision: { orgRevisionIsCurrent: false, orgRevisionIsDraft: true }, + isDirector: true, + current_holderId: Not(IsNull()), + orgRootId: posMasterUser.orgRootId, + }, + relations: ["current_holder", "orgRoot"], + }); + + let _posMasters = posMasters.map((data) => ({ + id: data.current_holderId, + prefix: data.current_holder.prefix, + firstName: data.current_holder.firstName, + lastName: data.current_holder.lastName, + position: data.current_holder.position, + posLevel: data.current_holder.posLevel, + posType: data.current_holder.posType, + orgRoot: data.orgRoot.orgRootName, + })); + + return new HttpSuccess(_posMasters); + } } From 437632f39c1e998f6b02e54e81065f91f92397eb Mon Sep 17 00:00:00 2001 From: kittapath Date: Thu, 17 Oct 2024 09:55:06 +0700 Subject: [PATCH 05/13] no message --- src/controllers/WorkflowController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 36d65ece..39410525 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -596,7 +596,7 @@ export class WorkflowController extends Controller { async getProfilePlacement(@Request() req: RequestWithUser) { const posMasterUser = await this.posMasterRepo.findOne({ where: { - orgRevision: { orgRevisionIsCurrent: false, orgRevisionIsDraft: true }, + orgRevision: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, current_holder: { keycloak: req.user.sub }, }, }); @@ -605,7 +605,7 @@ export class WorkflowController extends Controller { const posMasters = await this.posMasterRepo.find({ where: { - orgRevision: { orgRevisionIsCurrent: false, orgRevisionIsDraft: true }, + orgRevision: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, isDirector: true, current_holderId: Not(IsNull()), orgRootId: posMasterUser.orgRootId, From a53cf4212f572e4f2656712c2198060cb3f03950 Mon Sep 17 00:00:00 2001 From: kittapath Date: Thu, 17 Oct 2024 10:38:32 +0700 Subject: [PATCH 06/13] report 10 --- src/controllers/CommandController.ts | 59 +++++++++++++-------------- src/controllers/WorkflowController.ts | 3 +- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index 91a95124..4b030940 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -19,7 +19,7 @@ import HttpSuccess from "../interfaces/http-success"; import HttpStatusCode from "../interfaces/http-status"; import HttpError from "../interfaces/http-error"; import { Command } from "../entities/Command"; -import { Brackets, LessThan, MoreThan, Double, In, Not ,Between } from "typeorm"; +import { Brackets, LessThan, MoreThan, Double, In, Not, Between } from "typeorm"; import { CommandType } from "../entities/CommandType"; import { CommandSend } from "../entities/CommandSend"; import { Profile, CreateProfileAllFields } from "../entities/Profile"; @@ -1013,11 +1013,10 @@ export class CommandController extends Controller { if (command.commandExcecuteDate == null) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบวันที่คำสั่งมีผล"); - let profiles = command && command.commandRecives.length > 0 - ? command.commandRecives - .filter((x) => x.profileId != null) - .map((x) => x.profileId) - : []; + let profiles = + command && command.commandRecives.length > 0 + ? command.commandRecives.filter((x) => x.profileId != null).map((x) => x.profileId) + : []; await new CallAPI() .PostData(request, "/placement/noti/profiles", { @@ -1073,12 +1072,12 @@ export class CommandController extends Controller { const command = await this.commandRepository.find({ relations: ["commandType", "commandRecives"], - where:{ + where: { commandExcecuteDate: Between(today, tomorrow), - status: "WAITING" - } + status: "WAITING", + }, }); - + const data = { client_id: "gettoken", client_secret: process.env.AUTH_ACCOUNT_SECRET, @@ -1100,27 +1099,27 @@ export class CommandController extends Controller { ]); if (_data == null) { return new HttpError(HttpStatus.UNAUTHORIZED, "ชื่อผู้ใช้งานหรือรหัสผ่านไม่ถูกต้อง"); - } + } command.forEach(async (x) => { - const path = this.commandTypePath(x.commandType.code); - if (path == null) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบประเภทคำสั่งนี้ในระบบ"); - const msg = { - data: { - id: x.id, - status: "REPORTED", - lastUpdateUserId: "system", - lastUpdateFullName: "system", - // lastUpdateUserId: _data.user.sub, - // lastUpdateFullName: _data.user.name, - lastUpdatedAt: new Date(), - }, - user: _data.user, - token: _data.access_token, - }; - sendToQueue(msg); - }) - + const path = this.commandTypePath(x.commandType.code); + if (path == null) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบประเภทคำสั่งนี้ในระบบ"); + const msg = { + data: { + id: x.id, + status: "REPORTED", + lastUpdateUserId: "system", + lastUpdateFullName: "system", + // lastUpdateUserId: _data.user.sub, + // lastUpdateFullName: _data.user.name, + lastUpdatedAt: new Date(), + }, + user: _data.user, + token: _data.access_token, + }; + sendToQueue(msg); + }); + return new HttpSuccess(); } @@ -2782,7 +2781,7 @@ export class CommandController extends Controller { case "C-PM-09": return "/retirement/other/out/report"; case "C-PM-10": - return "/xxxxxx"; + return "/probation/report/command10/officer/report"; case "C-PM-11": return "/probation/report/command11/officer/report"; case "C-PM-12": diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 39410525..3bbd31dc 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Path, Post, Request, Route, Security, Tags } from "tsoa"; +import { Body, Controller, Get, Post, Request, Route, Security, Tags } from "tsoa"; import { AppDataSource } from "../database/data-source"; import { RequestWithUser } from "../middlewares/user"; import HttpError from "../interfaces/http-error"; @@ -14,7 +14,6 @@ import { StateUserComment } from "../entities/StateUserComment"; import { MetaWorkflow } from "../entities/MetaWorkflow"; import { MetaState } from "../entities/MetaState"; import { MetaStateOperator } from "../entities/MetaStateOperator"; -import { PosMasterAssign } from "../entities/PosMasterAssign"; import { PosMaster } from "../entities/PosMaster"; import { IsNull, Not } from "typeorm"; From d91a0bb9d9a9b5d4d8432b73b29e7ef6c4389633 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Thu, 17 Oct 2024 10:47:10 +0700 Subject: [PATCH 07/13] add comment --- .env.example | 27 +++++++++++++++++++-------- src/controllers/DPISController.ts | 3 +++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.env.example b/.env.example index 9efa9164..2e7bc341 100644 --- a/.env.example +++ b/.env.example @@ -1,23 +1,34 @@ AUTH_REALM_URL=https://id.frappet.synology.me/realms/bma-ehr -AUTH_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvYg0ZJvH6HgNOzyPp7PCvY3bJwD9WdsNn6gZbuvIfqJQZ8iSH1t0p3fgODO/fqwcj9UFeh1bVFOSjuW+JpnPehROqzt81KNl9zLLNXoN4LimReQHaMM3dU7DCbRylgVCouIDvObyjg8G+Cy5lZvFKWym/DPwGVpSdbvDZJ83qxq2dp7GJXS8PhOvA+MB1K009/jW5pBTUwNArLjoFccr+gIYIiOJDg2rYyIF3fDkwyWkuxr6xRt10+BRJytselwy/18kbDuJxVPaapdgTXI6wLzx7HWcDk30n5EvhJEumnIPpRst8gucqNYmB4MH+vsyoxV5WLuO3qmVRzFbtAppRQIDAQAB +AUTH_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1/QAH75nWgiRzWCTrGJv8q2A7z0qggC2IQ9Sva/Ok1RxeGE/ED2m4ELbF5B9MtugyXYGMUBXaKhooMpTE3wyR1OwsUlv/GtYSmMuKUnsSEXklsP8nIq8gZkCvISOVdvIC4ng5aZ5nBcp9cQ3eVbz4dfZcbLzcqLIIkxQmFBK0m1eFL5IdNj8Ac7U4eH4ylOckOu174f35NnFH6wDva6Iic3EXapMcE2BnXXCTajk2dmlWAzH13ybQBgHDfrOtulrmn1CzQxe9WUJes4qX5z72N05KsHvtUObaeN6cb+mIeH36GdysqgAdd2hhKkgUFXwtLPzldtrEc7xVyf3OLEg1QIDAQAB AUTH_PREFERRED_MODE=online AUTH_ACCOUNT_SECRET=qsFwDb5anVoXKKwoeivrByIn9VYWQNRn + APP_HOST=0.0.0.0 -APP_PORT=13001 -DB_HOST=192.168.1.80 -DB_PORT=3306 +APP_PORT=3001 + +DB_HOST=192.168.1.81 +DB_PORT=4063 DB_USERNAME=root DB_PASSWORD=adminVM123 -DB_NAME=bma_ehr_organization_demo +DB_NAME=bma_ehr_organization + +# DB_HOST=192.168.1.81 +# DB_PORT=4063 +# DB_USERNAME=root +# DB_PASSWORD=adminVM123 +# DB_NAME=bma_ehr_organization + KC_URL=https://id.frappet.synology.me KC_REALM=bma-ehr KC_SERVICE_ACCOUNT_CLIENT_ID=bma-ehr-dev KC_SERVICE_ACCOUNT_SECRET=f2mp7Xj4nz6gbgITve9J7AHXZI8dRhOd API_URL=https://bma-ehr.frappet.synology.me/api/v1 -REDIS_HOST=192.168.1.81 -REDIS_PORT=6379 + ELASTICSEARCH_INDEX=bma-ehr-log-index ELASTICSEARCH_PROTOCOL=http -ELASTICSEARCH_HOST=192.168.1.40 +ELASTICSEARCH_HOST=192.168.1.90 ELASTICSEARCH_PORT=9200 + +REDIS_HOST=192.168.1.81 +REDIS_PORT=6379 API_KEY=fKRL16yyEgbyTEJdsMw2h64tGSCmkW685PRtM3CygzX1JOSdptT9UJtpgWwKM8FybRTJups3GTFwj27ZRvlPdIkv3XgCoVJaD5LmR06ozuEPvCCRSdp2WFthg08V5xHc56fTPfZLpr1VmXrhd6dvYhHIqKkQUJR02Rlkss11cLRWEQOssEFVA4xdu2J5DIRO1EM5m7wRRvEwcDB4mYRXD9HH52SMq6iYqUWEWsMwLdbk7QW9yYESUEuzMW5gWrb6vIeWZxJV5bTz1PcWUyR7eO9Fyw1F5DiQYc9JgzTC1mW7cv31fEtTtrfbJYKIb5EbWilqIEUKC6A0UKBDDek35ML0006cqRVm0pvdOH6jeq7VQyYrhdXe59dBEyhYGUIfozoVBvW7Up4QBuOMjyPjSqJPlMBKwaseptfrblxQV1AOOivSBpf1ZcQyOZ8JktRtKUDSuXsmG0lsXwFlI3JCeSHdpVdgZWFYcJPegqfrB6KotR02t9AVkpLs1ZWrixwz \ No newline at end of file diff --git a/src/controllers/DPISController.ts b/src/controllers/DPISController.ts index 597a997b..2923becc 100644 --- a/src/controllers/DPISController.ts +++ b/src/controllers/DPISController.ts @@ -8,6 +8,9 @@ import HttpError from "../interfaces/http-error"; import HttpStatus from "../interfaces/http-status"; interface DPISResponse { + /** + * สถานะ + */ status: number; message: string; result?: DPISResult; From c5790110212f4cf9233c43da46a1a9089a4d1a61 Mon Sep 17 00:00:00 2001 From: kittapath Date: Thu, 17 Oct 2024 11:06:58 +0700 Subject: [PATCH 08/13] =?UTF-8?q?=E0=B9=81=E0=B8=81=E0=B9=89=20=E0=B8=B4?= =?UTF-8?q?=E0=B8=99=E0=B8=81=E0=B8=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/WorkflowController.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 3bbd31dc..24710642 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -307,13 +307,25 @@ export class WorkflowController extends Controller { }, }, order: { order: "ASC", stateUserComments: { order: "ASC" } }, - relations: ["stateUserComments"], + relations: ["stateUserComments", "stateUserComments.profile"], }); const _state = state.map((x) => ({ stateId: x.id, stateNo: x.order, stateName: x.name, - stateUserComments: x.stateUserComments, + stateUserComments: x.stateUserComments.map((x) => ({ + id: x.id, + prefix: x.profile.prefix, + firstName: x.profile.firstName, + lastName: x.profile.lastName, + profileId: x.profileId, + isAcceptSetting: x.isAcceptSetting, + isApproveSetting: x.isApproveSetting, + isReasonSetting: x.isReasonSetting, + isAccept: x.isAccept, + isApprove: x.isApprove, + reason: x.reason, + })), })); return new HttpSuccess(_state); } From b4e188e7dd033188e01fa27e79f85aa9a7169172 Mon Sep 17 00:00:00 2001 From: kittapath Date: Thu, 17 Oct 2024 11:33:35 +0700 Subject: [PATCH 09/13] =?UTF-8?q?=E0=B9=81=E0=B8=81=E0=B9=89=20=20workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/WorkflowController.ts | 12 ++++++++++++ src/entities/StateOperatorUser.ts | 3 +-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 24710642..c8757430 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -339,6 +339,17 @@ export class WorkflowController extends Controller { system: string; }, ) { + const stateOperatorUserNow = await this.stateOperatorUserRepo.findOne({ + where: { + workflow: { + refId: body.refId, + sysName: body.system, + }, + profile: { + keycloak: req.user.sub, + }, + }, + }); const stateOperatorUser = await this.stateOperatorUserRepo.find({ where: { workflow: { @@ -348,6 +359,7 @@ export class WorkflowController extends Controller { profile: { keycloak: Not(req.user.sub), }, + operator: stateOperatorUserNow?.operator || "", }, }); await this.stateOperatorUserRepo.remove(stateOperatorUser); diff --git a/src/entities/StateOperatorUser.ts b/src/entities/StateOperatorUser.ts index 6d5c4294..2fb40199 100644 --- a/src/entities/StateOperatorUser.ts +++ b/src/entities/StateOperatorUser.ts @@ -1,6 +1,5 @@ -import { Entity, Column, ManyToOne, JoinColumn, OneToMany } from "typeorm"; +import { Entity, Column, ManyToOne, JoinColumn } from "typeorm"; import { EntityBase } from "./base/Base"; -import { StateOperator } from "./StateOperator"; import { Workflow } from "./Workflow"; import { Profile } from "./Profile"; From 6ab149f7a3916338eff2ae2bcc71bf8fb2ac663c Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Thu, 17 Oct 2024 11:34:03 +0700 Subject: [PATCH 10/13] add org search --- src/controllers/DPISController.ts | 59 +++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/controllers/DPISController.ts b/src/controllers/DPISController.ts index 2923becc..1d3ad25f 100644 --- a/src/controllers/DPISController.ts +++ b/src/controllers/DPISController.ts @@ -3,6 +3,7 @@ import { Controller, Example, Get, Path, Response, Route, SuccessResponse, Tags import { DateTime } from "@elastic/elasticsearch/lib/api/types"; import { Double } from "typeorm"; import { AppDataSource } from "../database/data-source"; +import { OrgRevision } from "../entities/OrgRevision"; import { Profile } from "../entities/Profile"; import HttpError from "../interfaces/http-error"; import HttpStatus from "../interfaces/http-status"; @@ -12,7 +13,15 @@ interface DPISResponse { * สถานะ */ status: number; + + /** + * ข้อความตอบกลับ + */ message: string; + + /** + * ผลลัพธ์การค้นหา + */ result?: DPISResult; } @@ -36,6 +45,7 @@ interface DPISResult { educations: ProfileEducationResult[]; leaves: ProfileLeaveResult[]; salaries: ProfileSalaryResult[]; + organization: ProfileOrgResult; } interface ProfileLeaveResult { @@ -45,6 +55,33 @@ interface ProfileLeaveResult { totalLeave: number; } +interface ProfileOrgResult { + /** + * ผลลัพธ์การค้นหา + */ + orgRootName: string; + + /** + * กองระดับ 1 + */ + orgChild1Name: string; + + /** + * กองระดับ 2 + */ + orgChild2Name: string; + + /** + * กองระดับ 3 + */ + orgChild3Name: string; + + /** + * กองระดับ 4 + */ + orgChild4Name: string; +} + interface ProfileEducationResult { country: string; degree: string; @@ -73,6 +110,7 @@ interface ProfileSalaryResult { @SuccessResponse(HttpStatus.OK, "สำเร็จ") export class DPISController extends Controller { private profileRepo = AppDataSource.getRepository(Profile); + private orgRevisionRepo = AppDataSource.getRepository(OrgRevision); /** * แสดงข้อมูลข้าราชการจากเลขประจำตัวประชาชน @@ -104,6 +142,13 @@ export class DPISController extends Controller { leaveReason: null, positionLevel: "ปฏิบัติงาน", positionType: "ทั่วไป", + organization: { + orgRootName: "", + orgChild1Name: "", + orgChild2Name: "", + orgChild3Name: "", + orgChild4Name: "", + }, educations: [], salaries: [ { @@ -147,8 +192,10 @@ export class DPISController extends Controller { profileSalary: true, profileEducations: true, profileLeaves: true, + current_holders: true, }, where: { citizenId: citizenId }, + //relations: ["current_holders", "current_holders.orgRoot"], order: { profileSalary: { date: "DESC", @@ -162,6 +209,10 @@ export class DPISController extends Controller { }, }); if (!profile) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + const findRevision = await this.orgRevisionRepo.findOne({ + where: { orgRevisionIsCurrent: true }, + }); + var current_holder = profile.current_holders?.find((x) => x.orgRevisionId == findRevision?.id); const mapProfile: DPISResult = { citizenId: profile.citizenId, @@ -181,6 +232,14 @@ export class DPISController extends Controller { positionLevel: profile.posLevel ? profile.posLevel.posLevelName : "", positionType: profile.posType ? profile.posType.posTypeName : "", + organization: { + orgRootName: current_holder?.orgRoot?.orgRootName || "", + orgChild1Name: current_holder?.orgChild1?.orgChild1Name || "", + orgChild2Name: current_holder?.orgChild2?.orgChild2Name || "", + orgChild3Name: current_holder?.orgChild3?.orgChild3Name || "", + orgChild4Name: current_holder?.orgChild4?.orgChild4Name || "", + }, + // educations educations: profile.profileEducations.map((item) => { return { From 5947b19f9efbc787714f0f8532eafba70ce18595 Mon Sep 17 00:00:00 2001 From: kittapath Date: Thu, 17 Oct 2024 12:10:23 +0700 Subject: [PATCH 11/13] check state --- src/controllers/WorkflowController.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index c8757430..c249ca64 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -265,8 +265,6 @@ export class WorkflowController extends Controller { }); if (!stateOperatorUser) throw new HttpError(HttpStatus.NOT_FOUND, "ผู้ใช้งานนี้ไม่มีหน้าที่ในกระบวนการนี้"); - console.log(stateOperatorUser.operator); - console.log(stateOperatorUser.workflow.stateId); const operator = await this.stateOperatorRepo.findOne({ where: { operator: stateOperatorUser.operator, @@ -274,8 +272,25 @@ export class WorkflowController extends Controller { }, relations: ["state"], }); - if (!operator) - throw new HttpError(HttpStatus.NOT_FOUND, "ผู้ใช้งานนี้ไม่มีหน้าที่ในขั้นตอนนี้"); + if (!operator) { + const state = await this.stateRepo.findOne({ + where: { + id: stateOperatorUser.workflow.stateId, + }, + }); + return new HttpSuccess({ + stateId: state?.id || null, + stateNo: state?.order || null, + stateName: state?.name || null, + operator: stateOperatorUser.operator, + can_view: false, + can_update: false, + can_operate: false, + can_change_state: false, + can_delete: false, + can_cancel: false, + }); + } return new HttpSuccess({ stateId: operator.state.id, stateNo: operator.state.order, From 41e82a92f9c5e648a5954cc63cf7439f899f8451 Mon Sep 17 00:00:00 2001 From: kittapath Date: Thu, 17 Oct 2024 13:51:57 +0700 Subject: [PATCH 12/13] no message --- src/controllers/CommandController.ts | 2 +- src/controllers/ProfileController.ts | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index 4b030940..33ef6533 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -262,7 +262,7 @@ export class CommandController extends Controller { commandYear: _data.commandYear, commandAffectDate: _data.commandAffectDate, commandExcecuteDate: _data.commandExcecuteDate, - assignFullName: _data.createdFullName, + assignFullName: null, //xxxxxxxxxxxxxxx createdFullName: _data.createdFullName, status: _data.status, issue: _data.issue, diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index 178f4584..2b4120ce 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -3514,10 +3514,10 @@ export class ProfileController extends Controller { }, relations: ["orgChild1"], }); - if (posMasters == null || posMasters.orgRoot == null) { + if (posMasters == null || posMasters.orgChild1 == null) { return new HttpSuccess(false); } - return new HttpSuccess(posMasters); + return new HttpSuccess(posMasters.orgChild1.isOfficer); } /** @@ -3978,12 +3978,18 @@ export class ProfileController extends Controller { // await new permission().PermissionOrgUserGet(request, "SYS_REGISTRY_OFFICER", id);//ไม่แน่ใจOFFปิดไว้ก่อน const profile = await this.profileRepo.findOne({ where: { id: id }, - relations: ["posLevel", "posType", "current_holders", "current_holders.orgRoot", "profileSalary"], + relations: [ + "posLevel", + "posType", + "current_holders", + "current_holders.orgRoot", + "profileSalary", + ], order: { profileSalary: { order: "DESC", - } - } + }, + }, }); if (!profile) { throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลบุคคลนี้ในระบบ"); From 3d8b66d3cc9cb84949931900e38c77c4d0dfedd6 Mon Sep 17 00:00:00 2001 From: kittapath Date: Thu, 17 Oct 2024 15:13:59 +0700 Subject: [PATCH 13/13] =?UTF-8?q?=E0=B8=AA=E0=B8=81=E0=B8=88=20=E0=B8=A1?= =?UTF-8?q?=E0=B8=AD=E0=B8=9A=E0=B8=AB=E0=B8=A1=E0=B8=B2=E0=B8=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/WorkflowController.ts | 30 ++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index c249ca64..e92d8327 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Post, Request, Route, Security, Tags } from "tsoa"; +import { Body, Controller, Get, Path, Post, Request, Route, Security, Tags } from "tsoa"; import { AppDataSource } from "../database/data-source"; import { RequestWithUser } from "../middlewares/user"; import HttpError from "../interfaces/http-error"; @@ -664,4 +664,32 @@ export class WorkflowController extends Controller { return new HttpSuccess(_posMasters); } + + /** + * API เช็ค สกจ + * + * @summary เช็ค สกจ + * + */ + @Get("keycloak/isofficer/{system}") + async getIsOfficerByKeycloak(@Path() system: string, @Request() req: RequestWithUser) { + const profile = await this.profileRepo.findOne({ + where: { + keycloak: req.user.sub, + }, + }); + if (!profile) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลผู้ใช้งาน"); + + const profileOfficer = await this.posMasterRepo.findOne({ + where: { + posMasterAssigns: { assignId: system }, + orgRevision: { orgRevisionIsDraft: false, orgRevisionIsCurrent: true }, + current_holderId: profile.id, + }, + relations: ["orgChild1"], + }); + if (!profileOfficer) return new HttpSuccess({ isOfficer: false, isStaff: false }); + let isOfficer = profileOfficer.orgChild1 == null ? false : profileOfficer.orgChild1.isOfficer; + return new HttpSuccess({ isOfficer: isOfficer, isStaff: !isOfficer }); + } }