From 7b83f91d731e30f8d3aea9b9cc159cd72b695f76 Mon Sep 17 00:00:00 2001 From: kittapath Date: Wed, 9 Oct 2024 16:20:43 +0700 Subject: [PATCH] no message --- src/controllers/CommandController.ts | 4 + src/controllers/ProfileController.ts | 5 + src/controllers/WorkflowController.ts | 143 +++++++++++++++--- src/entities/StateOperator.ts | 3 - src/entities/StateOperatorUser.ts | 36 +++-- src/entities/Workflow.ts | 4 + .../1728465477520-add_table_workflow3.ts | 26 ++++ 7 files changed, 185 insertions(+), 36 deletions(-) create mode 100644 src/migration/1728465477520-add_table_workflow3.ts diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index 7ccf2203..5c320875 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -121,6 +121,7 @@ export class CommandController extends Controller { */ @Get("list") async GetResult( + @Request() request: RequestWithUser, @Query("page") page: number = 1, @Query("pageSize") pageSize: number = 10, @Query() keyword: string = "", @@ -130,6 +131,9 @@ export class CommandController extends Controller { ) { const [commands, total] = await this.commandRepository .createQueryBuilder("command") + .andWhere("command.createdUserId = :createdUserId", { + createdUserId: request.user.sub, + }) .andWhere( status != null && status != undefined && status != "" ? "command.status IN (:...status)" diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index 4aa78e2b..3b382b3e 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -4828,6 +4828,7 @@ export class ProfileController extends Controller { const isProbation: boolean = true; const [findProfile, total] = await AppDataSource.getRepository(Profile) .createQueryBuilder("profile") + .leftJoinAndSelect("profile.profileSalary", "profileSalary") .leftJoinAndSelect("profile.posLevel", "posLevel") .leftJoinAndSelect("profile.posType", "posType") .leftJoinAndSelect("profile.current_holders", "current_holders") @@ -4942,6 +4943,10 @@ export class ProfileController extends Controller { lastName: item.lastName, position: item.position, idcard: item.citizenId, + refCommandNo: + item.profileSalary.sort((a, b) => b.order - a.order).length == 0 + ? null + : item.profileSalary.sort((a, b) => b.order - a.order)[0].refCommandNo, posLevelName: item.posLevel == null ? null : item.posLevel.posLevelName, posTypeName: item.posType == null ? null : item.posType.posTypeName, posNo: posMaster == null ? null : `${posMaster.posMasterNo}${shortName}`, diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 8121499a..139cc11a 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -7,6 +7,9 @@ import HttpSuccess from "../interfaces/http-success"; import { Workflow } from "../entities/Workflow"; import { State } from "../entities/State"; import { StateOperator } from "../entities/StateOperator"; +import { StateOperatorUser } from "../entities/StateOperatorUser"; +import CallAPI from "../interfaces/call-api"; +import { Profile } from "../entities/Profile"; @Route("api/v1/org/workflow") @Tags("AuthRole") @@ -15,6 +18,56 @@ export class WorkflowController extends Controller { private workflowRepo = AppDataSource.getRepository(Workflow); private stateRepo = AppDataSource.getRepository(State); private stateOperatorRepo = AppDataSource.getRepository(StateOperator); + private stateOperatorUserRepo = AppDataSource.getRepository(StateOperatorUser); + private profileRepo = AppDataSource.getRepository(Profile); + + @Post("check-workflow") + public async checkWorkflow( + @Request() req: RequestWithUser, + @Body() + body: { + sysName: string; + posLevelName: string; + posTypeName: string; + profiles: { + profile: string; + operator: string; + order: number; + }[]; + }, + ) { + const workflow = await this.workflowRepo.findOne({ + where: { + sysName: body.sysName, + posLevelName: body.posLevelName, + posTypeName: body.posTypeName, + }, + relations: ["states"], + }); + if (!workflow) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบกระบวนการนี้ได้"); + await Promise.all( + body.profiles.map(async (item) => { + const operatoeUser = new StateOperatorUser(); + operatoeUser.profile = item.profile; + operatoeUser.operator = item.operator.trim().toLocaleUpperCase(); + operatoeUser.order = item.order; + operatoeUser.workflowId = workflow.id; + operatoeUser.createdUserId = req.user.sub; + operatoeUser.createdFullName = req.user.name; + operatoeUser.createdAt = new Date(); + operatoeUser.lastUpdateUserId = req.user.sub; + operatoeUser.lastUpdateFullName = req.user.name; + operatoeUser.lastUpdatedAt = new Date(); + await this.stateOperatorUserRepo.save(operatoeUser); + }), + ); + return new HttpSuccess({ + workflowId: workflow.id, + stateId: workflow.states.sort((a, b) => a.order - b.order)[0].id, + // stateName: workflow.states.sort((a, b) => a.order - b.order)[0].name, + // stateType: workflow.states.sort((a, b) => a.order - b.order)[0].type, + }); + } @Post("check-iscan") public async checkIsCan( @@ -23,20 +76,29 @@ export class WorkflowController extends Controller { body: { workflowId: string; stateId: string; - operator: string; + profile: string; action: string; }, ) { + const stateOperatorUser = await this.stateOperatorUserRepo.findOne({ + where: { + profile: body.profile, + workflowId: body.workflowId, + }, + }); + if (!stateOperatorUser) + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่สามารถดำเนินการกระบวนการนี้ได้"); + const operator = await this.stateOperatorRepo.findOne({ where: { - operator: body.operator, + operator: stateOperatorUser.operator, state: { id: body.stateId, workflow: { id: body.workflowId } }, }, }); if (!operator) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); let isCan = false; - switch (body.action) { + switch (body.action.trim().toLocaleUpperCase()) { case "VIEW": isCan = operator.canView; case "UPDATE": @@ -63,32 +125,38 @@ export class WorkflowController extends Controller { } } - @Post("check-workflow") - public async checkWorkflow( + @Post("check-iscan-all") + public async checkIsCanAll( @Request() req: RequestWithUser, @Body() body: { - sysName: string; - posLevelName: string; - posTypeName: string; + workflowId: string; + stateId: string; }, ) { - const workflow = await this.workflowRepo.findOne({ + const profile = await this.profileRepo.findOne({ where: { - sysName: body.sysName, - posLevelName: body.posLevelName, - posTypeName: body.posTypeName, + keycloak: req.user.sub, }, - relations: ["states"], }); - if (!workflow) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + if (!profile) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + const stateOperatorUser = await this.stateOperatorUserRepo.findOne({ + where: { + profile: profile.id, + workflowId: body.workflowId, + }, + }); + if (!stateOperatorUser) + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่สามารถดำเนินการกระบวนการนี้ได้"); - return new HttpSuccess({ - workflowId: workflow.id, - stateId: workflow.states.sort((a, b) => a.order - b.order)[0].id, - stateName: workflow.states.sort((a, b) => a.order - b.order)[0].name, - stateType: workflow.states.sort((a, b) => a.order - b.order)[0].type, + const operator = await this.stateOperatorRepo.findOne({ + where: { + operator: stateOperatorUser.operator, + state: { id: body.stateId, workflow: { id: body.workflowId } }, + }, }); + if (!operator) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + return new HttpSuccess(operator); } @Post("state-next") @@ -103,6 +171,7 @@ export class WorkflowController extends Controller { where: { id: body.stateId, }, + relations: ["stateOperators", "workflow", "workflow.stateOperatorUsers"], }); if (!state) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); const _state = await this.stateRepo.findOne({ @@ -110,7 +179,43 @@ export class WorkflowController extends Controller { order: state.order + 1, workflowId: state.workflowId, }, + relations: ["stateOperators"], }); + //noti + let profileNow = state.workflow.stateOperatorUsers + .filter((x) => state.stateOperators.map((s) => s.operator).includes(x.operator)) + .map((x) => x.profile); + await new CallAPI() + .PostData(req, "/placement/noti/profiles", { + subject: `รายการถูกส่ง`, + body: `รายการถูกส่ง`, + receiverUserId: profileNow, + payload: "", //แนบไฟล์ + isSendMail: true, + isSendInbox: true, + receiveDate: new Date(), + }) + .catch((error) => { + console.error("Error calling API:", error); + }); + if (_state != null) { + let profileNext = state.workflow.stateOperatorUsers + .filter((x) => _state.stateOperators.map((s) => s.operator).includes(x.operator)) + .map((x) => x.profile); + await new CallAPI() + .PostData(req, "/placement/noti/profiles", { + subject: `ได้รับรายการ`, + body: `ได้รับรายการ`, + receiverUserId: profileNext, + payload: "", //แนบไฟล์ + isSendMail: true, + isSendInbox: true, + receiveDate: new Date(), + }) + .catch((error) => { + console.error("Error calling API:", error); + }); + } return new HttpSuccess({ stateId: _state?.id || null, diff --git a/src/entities/StateOperator.ts b/src/entities/StateOperator.ts index 5438ece9..4e0406d3 100644 --- a/src/entities/StateOperator.ts +++ b/src/entities/StateOperator.ts @@ -72,7 +72,4 @@ export class StateOperator extends EntityBase { @ManyToOne(() => State, (state) => state.stateOperators) @JoinColumn({ name: "stateId" }) state: State; - - @OneToMany(() => StateOperatorUser, (stateOperatorUser) => stateOperatorUser.stateOperator) - stateOperatorUsers: StateOperatorUser[]; } diff --git a/src/entities/StateOperatorUser.ts b/src/entities/StateOperatorUser.ts index dd4bc5cc..5c890dd7 100644 --- a/src/entities/StateOperatorUser.ts +++ b/src/entities/StateOperatorUser.ts @@ -5,6 +5,14 @@ import { Workflow } from "./Workflow"; @Entity("stateOperatorUser") export class StateOperatorUser extends EntityBase { + @Column({ + nullable: true, + comment: "ผู้ดำเนินการ", + length: 255, + default: null, + }) + operator: string; + @Column({ nullable: true, comment: "", @@ -13,30 +21,30 @@ export class StateOperatorUser extends EntityBase { }) profile: string; - @Column({ - nullable: true, - comment: "", - length: 255, - default: null, - }) - type: string; //commander - @Column({ nullable: true, comment: "ลำดับ", default: null, }) - order: number; // + order: number; + + @Column({ + nullable: true, + comment: "ผู้ดำเนินการ", + length: 255, + default: null, + }) + refId: string; @Column({ nullable: true, length: 40, - comment: "คีย์นอก(FK)ของตาราง stateOperator", + comment: "คีย์นอก(FK)ของตาราง workflow", default: null, }) - stateOperatorId: string; + workflowId: string; - @ManyToOne(() => StateOperator, (stateOperator) => stateOperator.stateOperatorUsers) - @JoinColumn({ name: "stateOperatorId" }) - stateOperator: StateOperator; + @ManyToOne(() => Workflow, (workflow) => workflow.stateOperatorUsers) + @JoinColumn({ name: "workflowId" }) + workflow: Workflow; } diff --git a/src/entities/Workflow.ts b/src/entities/Workflow.ts index 4b1ffa1b..c41d442c 100644 --- a/src/entities/Workflow.ts +++ b/src/entities/Workflow.ts @@ -1,6 +1,7 @@ import { Entity, Column, OneToMany } from "typeorm"; import { EntityBase } from "./base/Base"; import { State } from "./State"; +import { StateOperatorUser } from "./StateOperatorUser"; @Entity("workflow") export class Workflow extends EntityBase { @@ -46,4 +47,7 @@ export class Workflow extends EntityBase { default: null, }) posTypeName: string; + + @OneToMany(() => StateOperatorUser, (stateOperatorUser) => stateOperatorUser.workflow) + stateOperatorUsers: StateOperatorUser[]; } diff --git a/src/migration/1728465477520-add_table_workflow3.ts b/src/migration/1728465477520-add_table_workflow3.ts new file mode 100644 index 00000000..24dfbcb9 --- /dev/null +++ b/src/migration/1728465477520-add_table_workflow3.ts @@ -0,0 +1,26 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddTableWorkflow31728465477520 implements MigrationInterface { + name = 'AddTableWorkflow31728465477520' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` DROP FOREIGN KEY \`FK_bef7391c37f03a3b809406beebf\``); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` DROP COLUMN \`stateOperatorId\``); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` DROP COLUMN \`type\``); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` ADD \`operator\` varchar(255) NULL COMMENT 'ผู้ดำเนินการ'`); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` ADD \`refId\` varchar(255) NULL COMMENT 'ผู้ดำเนินการ'`); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` ADD \`workflowId\` varchar(40) NULL COMMENT 'คีย์นอก(FK)ของตาราง workflow'`); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` ADD CONSTRAINT \`FK_9499ff9ae0444f59f19800aca05\` FOREIGN KEY (\`workflowId\`) REFERENCES \`workflow\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` DROP FOREIGN KEY \`FK_9499ff9ae0444f59f19800aca05\``); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` DROP COLUMN \`workflowId\``); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` DROP COLUMN \`refId\``); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` DROP COLUMN \`operator\``); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` ADD \`type\` varchar(255) NULL`); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` ADD \`stateOperatorId\` varchar(40) NULL COMMENT 'คีย์นอก(FK)ของตาราง stateOperator'`); + await queryRunner.query(`ALTER TABLE \`stateOperatorUser\` ADD CONSTRAINT \`FK_bef7391c37f03a3b809406beebf\` FOREIGN KEY (\`stateOperatorId\`) REFERENCES \`stateOperator\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + +}