Merge branch 'develop' into adiDev

This commit is contained in:
AdisakKanthawilang 2024-11-21 11:39:21 +07:00
commit fb3dd54518
10 changed files with 467 additions and 109 deletions

View file

@ -3446,6 +3446,7 @@ export class CommandController extends Controller {
RemarkHorizontal?: any | null; RemarkHorizontal?: any | null;
RemarkVertical?: any | null; RemarkVertical?: any | null;
CommandYear?: any | null; CommandYear?: any | null;
CommandExcecuteDate?: Date | null;
}[]; }[];
}, },
) { ) {
@ -3515,7 +3516,9 @@ export class CommandController extends Controller {
"/" +*/ "/" +*/
_organizationNew ?? "-", _organizationNew ?? "-",
// date: Extension.ToThaiShortDate_noPrefix(new Date()), // date: Extension.ToThaiShortDate_noPrefix(new Date()),
dateStart: "-", dateStart: item.CommandExcecuteDate
? Extension.ToThaiShortDate(item.CommandExcecuteDate)
: "-",
dateEnd: "-", dateEnd: "-",
order: order:
posMasterAct.posMasterOrder == null posMasterAct.posMasterOrder == null

View file

@ -95,7 +95,6 @@ export class OrganizationController extends Controller {
activeName: orgRevisionActive == null ? null : orgRevisionActive.orgRevisionName, activeName: orgRevisionActive == null ? null : orgRevisionActive.orgRevisionName,
draftId: orgRevisionDraf == null ? null : orgRevisionDraf.id, draftId: orgRevisionDraf == null ? null : orgRevisionDraf.id,
draftName: orgRevisionDraf == null ? null : orgRevisionDraf.orgRevisionName, draftName: orgRevisionDraf == null ? null : orgRevisionDraf.orgRevisionName,
orgPublishDate: orgRevisionDraf == null ? null : orgRevisionDraf.orgPublishDate, orgPublishDate: orgRevisionDraf == null ? null : orgRevisionDraf.orgPublishDate,
isPublic: orgRevisionDraf == null || orgRevisionDraf.orgRevisionName == null ? false : true, isPublic: orgRevisionDraf == null || orgRevisionDraf.orgRevisionName == null ? false : true,
}; };

View file

@ -337,6 +337,105 @@ export class PositionController extends Controller {
return new HttpSuccess(posDict.id); return new HttpSuccess(posDict.id);
} }
/**
* API
*
* @summary (ADMIN)
*
*/
@Put("position/executive/{id}")
@Example([
{
positionName: "นักบริหาร",
positionField: "บริหาร",
posTypeId: "08db9e81-fc46-4e95-8b33-be4ca0016abf",
posLevelId: "08db9e81-fc46-4e95-8b33-be4ca0016abf",
posExecutiveId: "08db9e81-fc46-4e95-8b33-be4ca0016abf",
positionExecutiveField: "นักบริหาร",
positionArea: "บริหาร",
},
])
async updatePositionExecutive(
@Path() id: string,
@Body()
requestBody: UpdatePosDict,
@Request() request: RequestWithUser,
) {
// await new permission().PermissionUpdate(request, "SYS_ORG");
const posDict = await this.posDictRepository.findOne({
where: { id: id },
});
if (!posDict) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
}
const checkPosTypeId = await this.posTypeRepository.findOne({
where: { id: requestBody.posTypeId },
});
if (!checkPosTypeId) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล PosTypeId");
}
const checkPosLevelId = await this.posLevelRepository.findOne({
where: { id: requestBody.posLevelId },
});
if (!checkPosLevelId) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล PosLevelId");
}
const _null: any = null;
if (requestBody.posExecutiveId == "") {
requestBody.posExecutiveId = _null;
}
if (requestBody.posExecutiveId != null && requestBody.posExecutiveId != "") {
const checkPosExecutiveId = await this.posExecutiveRepository.findOne({
where: { id: requestBody.posExecutiveId },
});
if (!checkPosExecutiveId) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล PosExecutiveId");
}
}
const rowRepeated = await this.posDictRepository.findOne({
where: {
id: Not(id),
posDictName: requestBody.posDictName,
posDictField: requestBody.posDictField,
posTypeId: requestBody.posTypeId,
posLevelId: requestBody.posLevelId,
posExecutiveId: requestBody.posExecutiveId ? requestBody.posExecutiveId : "",
posDictExecutiveField: requestBody.posDictExecutiveField
? requestBody.posDictExecutiveField
: "",
posDictArea: requestBody.posDictArea ? requestBody.posDictArea : "",
isSpecial: requestBody.isSpecial,
},
});
if (rowRepeated) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ข้อมูล Row นี้มีอยู่ในระบบแล้ว");
}
const before = structuredClone(posDict);
Object.assign(posDict, requestBody);
posDict.lastUpdateUserId = request.user.sub;
posDict.lastUpdateFullName = request.user.name;
posDict.lastUpdatedAt = new Date();
posDict.posDictName = requestBody.posDictName;
posDict.posDictField = requestBody.posDictField;
posDict.posTypeId = requestBody.posTypeId;
posDict.posLevelId = requestBody.posLevelId;
posDict.posExecutiveId = requestBody.posExecutiveId ? requestBody.posExecutiveId : null;
posDict.posDictExecutiveField = requestBody.posDictExecutiveField
? requestBody.posDictExecutiveField
: "";
posDict.posDictArea = requestBody.posDictArea ? requestBody.posDictArea : "";
posDict.isSpecial = requestBody.isSpecial;
// this.posDictRepository.merge(posDict, requestBody);
await this.posDictRepository.save(posDict, { data: request });
setLogDataDiff(request, { before, after: posDict });
return new HttpSuccess();
}
/** /**
* API * API
* *
@ -1122,13 +1221,13 @@ export class PositionController extends Controller {
where: { posMasterId: posMaster.id }, where: { posMasterId: posMaster.id },
relations: ["posType", "posLevel", "posExecutive"], relations: ["posType", "posLevel", "posExecutive"],
// order: { lastUpdatedAt: "ASC" }, // order: { lastUpdatedAt: "ASC" },
order: { order: {
posType: { posType: {
posTypeRank: "ASC" posTypeRank: "ASC",
}, },
posLevel: { posLevel: {
posLevelRank: "ASC" posLevelRank: "ASC",
} },
}, },
}); });
const formattedData = { const formattedData = {
@ -1423,7 +1522,7 @@ export class PositionController extends Controller {
.andWhere(checkChildConditions) .andWhere(checkChildConditions)
.andWhere(typeCondition) .andWhere(typeCondition)
.andWhere(revisionCondition); .andWhere(revisionCondition);
}) }),
) )
.orWhere( .orWhere(
new Brackets((qb) => { new Brackets((qb) => {
@ -1438,13 +1537,13 @@ export class PositionController extends Controller {
.andWhere(checkChildConditions) .andWhere(checkChildConditions)
.andWhere(typeCondition) .andWhere(typeCondition)
.andWhere(revisionCondition); .andWhere(revisionCondition);
}) }),
) )
.orderBy("posMaster.posMasterOrder", "ASC") .orderBy("posMaster.posMasterOrder", "ASC")
.skip((body.page - 1) * body.pageSize) .skip((body.page - 1) * body.pageSize)
.take(body.pageSize) .take(body.pageSize)
.getManyAndCount(); .getManyAndCount();
//แก้ค้นหา //แก้ค้นหา
let _position: any[] = []; let _position: any[] = [];
let x: any = null; let x: any = null;
@ -2007,6 +2106,8 @@ export class PositionController extends Controller {
profilePostype: type == null || type.posTypeName == null ? null : type.posTypeName, profilePostype: type == null || type.posTypeName == null ? null : type.posTypeName,
profilePoslevel: level == null || level.posLevelName == null ? null : level.posLevelName, profilePoslevel: level == null || level.posLevelName == null ? null : level.posLevelName,
authRoleId: posMaster.authRoleId, authRoleId: posMaster.authRoleId,
isCondition: posMaster.isCondition,
conditionReason: posMaster.conditionReason,
authRoleName: authRoleName:
authRoleName == null || authRoleName.roleName == null ? null : authRoleName.roleName, authRoleName == null || authRoleName.roleName == null ? null : authRoleName.roleName,
positions: positions.map((position: any) => ({ positions: positions.map((position: any) => ({

View file

@ -13,6 +13,7 @@ import { OrgChild4 } from "../entities/OrgChild4";
import { PosType } from "../entities/PosType"; import { PosType } from "../entities/PosType";
import { PosLevel } from "../entities/PosLevel"; import { PosLevel } from "../entities/PosLevel";
import { PosMaster } from "../entities/PosMaster"; import { PosMaster } from "../entities/PosMaster";
import { EmployeePosMaster } from "../entities/EmployeePosMaster";
import Extension from "../interfaces/extension"; import Extension from "../interfaces/extension";
import { LeaveType } from "../entities/LeaveType"; import { LeaveType } from "../entities/LeaveType";
import HttpStatus from "../interfaces/http-status"; import HttpStatus from "../interfaces/http-status";
@ -33,6 +34,7 @@ export class ReportController extends Controller {
private posTypepository = AppDataSource.getRepository(PosType); private posTypepository = AppDataSource.getRepository(PosType);
private posLevelRepository = AppDataSource.getRepository(PosLevel); private posLevelRepository = AppDataSource.getRepository(PosLevel);
private posMasterRepository = AppDataSource.getRepository(PosMaster); private posMasterRepository = AppDataSource.getRepository(PosMaster);
private empPosMasterRepository = AppDataSource.getRepository(EmployeePosMaster);
/** /**
* API Report1 * API Report1
@ -6246,7 +6248,6 @@ export class ReportController extends Controller {
@Get("report4/{rootId}") @Get("report4/{rootId}")
async findReport4(@Path() rootId: string) { async findReport4(@Path() rootId: string) {
const orgRootData = await this.orgRootRepository.findOne({ const orgRootData = await this.orgRootRepository.findOne({
where: { id: rootId } where: { id: rootId }
}); });
@ -6262,56 +6263,212 @@ export class ReportController extends Controller {
.addOrderBy("posLevel.posLevelRank", "ASC") .addOrderBy("posLevel.posLevelRank", "ASC")
.getMany(); .getMany();
const _posMaster = posMaster.map((x) => ({ const _posMaster = posMaster
type: [...new Set(x.positions.flatMap((y) => y.posType.posTypeName))].join(","), .map((x) => ({
typeRank: [...new Set(x.positions.flatMap((y) => y.posType.posTypeRank))].join(""), type: [...new Set(x.positions.flatMap((y) => y.posType.posTypeName))].join(","),
level: [...new Set(x.positions.flatMap((y) => y.posLevel.posLevelName))].join(","), typeRank: [...new Set(x.positions.flatMap((y) => y.posType.posTypeRank))].join(""),
levelRank: [...new Set(x.positions.flatMap((y) => `${y.posType.posTypeRank}${y.posLevel.posLevelRank}`))].join(""), level: [...new Set(x.positions.flatMap((y) => y.posLevel.posLevelName))].join(","),
})) levelRank: [...new Set(x.positions.flatMap((y) => `${y.posType.posTypeRank}${y.posLevel.posLevelRank}`))].join(""),
// .sort((x:any, y:any) => parseInt(x.typeRank) - parseInt(y.typeRank)) }))
// .sort((x:any, y:any) => parseInt(x.levelRank) - parseInt(y.levelRank));
const groupedData = _posMaster.reduce((acc:any, curr:any) => {
// console.log("XXX: ",_posMaster) const key = `${curr.type}|${curr.typeRank}|${curr.level}|${curr.levelRank}`;
const groupPosMaster = _posMaster.reduce((total: any, idx: any) => { if (!acc[key]) {
const sortedLevel = idx.level.split(",").sort().join(","); acc[key] = { ...curr, total: 1 };
const key = `${idx.type}-${sortedLevel}`; } else {
acc[key].total += 1;
if (!total[key]) {
total[key] = {
type: idx.type,
typeRank: idx.typeRank,
level: sortedLevel,
LeaveType: idx.levelRank,
total: 0,
remark: ""
};
} }
total[key].total += 1; return acc;
return total;
}, {}); }, {});
let result = Object.values(groupPosMaster)
.sort((x:any, y:any) => parseInt(x.typeRank) - parseInt(y.typeRank))
.sort((x:any, y:any) => parseInt(x.levelRank) - parseInt(y.levelRank));;
// let _TypeTemp = "";
// result = result.map((item: any) => {
// if (item.type === _TypeTemp) {
// return { ...item, type: "" };
// }
// _TypeTemp = item.type;
// return item;
// });
let result = Object.values(groupedData)
.map((x: any) => ({
type: x.type,
typeRank: parseInt(x.typeRank),
level: x.level,
levelRank: parseInt(x.levelRank),
total: x.total,
remark: "",
}))
.sort((x, y) => {
if (x.typeRank !== y.typeRank) {
return x.typeRank - y.typeRank;
}
return x.levelRank - y.levelRank;
});
let tmpType: string = "";
let allTotal: number = 0;
let total: number = 0;
let _total: number = 0;
let _reslut = new Array();
result.forEach((x:any, idx:number) => {
allTotal += x.total;
total += x.total;
if(x.type === tmpType) {
_reslut.push({
...x,
type: ""
})
}else {
if(x.type !== tmpType && tmpType != "") {
_total = total - x.total;
_reslut.push({
type: "",
typeRank: "",
level: "รวม",
levelRank: "",
total: _total,
remark: "",
})
total = x.total;
_total = 0;
}
_reslut.push({
...x
})
}
tmpType = x.type;
});
_reslut.push({
type: "",
typeRank: "",
level: "รวม",
levelRank: "",
total: total,
remark: "",
})
_reslut.push({
type: "",
typeRank: "",
level: "รวมทั้งสิ้น",
levelRank: "",
total: allTotal,
remark: "",
});
return new HttpSuccess({ return new HttpSuccess({
template: "report4", template: "report4",
reportName: "report4", reportName: "report4",
data: { data: {
dateCurrent: Extension.ToThaiShortDate(new Date()), dateCurrent: Extension.ToThaiShortDate(new Date()),
rootName: orgRootData ? orgRootData.orgRootName : "-", rootName: orgRootData ? orgRootData.orgRootName : "-",
data: result data: _reslut
} }
}); });
}
@Get("report4-employee/{rootId}")
async findReportEmp4(@Path() rootId: string) {
const orgRootData = await this.orgRootRepository.findOne({
where: { id: rootId }
});
if (!orgRootData) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
const posMaster = await this.empPosMasterRepository
.createQueryBuilder("posMaster")
.leftJoinAndSelect("posMaster.positions", "position")
.leftJoinAndSelect("position.posType", "posType")
.leftJoinAndSelect("position.posLevel", "posLevel")
.where("posMaster.orgRootId = :rootId", { rootId })
.orderBy("posType.posTypeRank", "ASC")
.addOrderBy("posLevel.posLevelRank", "ASC")
.getMany();
const _posMaster = posMaster
.map((x) => ({
type: [...new Set(x.positions.flatMap((y) => y.posType.posTypeName))].join(","),
typeRank: [...new Set(x.positions.flatMap((y) => y.posType.posTypeRank))].join(""),
level: [...new Set(x.positions.flatMap((y) => y.posLevel.posLevelName))].join(","),
levelRank: [...new Set(x.positions.flatMap((y) => `${y.posType.posTypeRank}${y.posLevel.posLevelRank}`))].join(""),
}))
const groupedData = _posMaster.reduce((acc:any, curr:any) => {
const key = `${curr.type}|${curr.typeRank}|${curr.level}|${curr.levelRank}`;
if (!acc[key]) {
acc[key] = { ...curr, total: 1 };
} else {
acc[key].total += 1;
}
return acc;
}, {});
let result = Object.values(groupedData)
.map((x: any) => ({
type: x.type,
typeRank: parseInt(x.typeRank),
level: x.level,
levelRank: parseInt(x.levelRank),
total: x.total,
remark: "",
}))
.sort((x, y) => {
if (x.typeRank !== y.typeRank) {
return x.typeRank - y.typeRank;
}
return x.levelRank - y.levelRank;
});
let tmpType: string = "";
let allTotal: number = 0;
let total: number = 0;
let _total: number = 0;
let _reslut = new Array();
result.forEach((x:any, idx:number) => {
allTotal += x.total;
total += x.total;
if(x.type === tmpType) {
_reslut.push({
...x,
type: ""
})
}else {
if(x.type !== tmpType && tmpType != "") {
_total = total - x.total;
_reslut.push({
type: "",
typeRank: "",
level: "รวม",
levelRank: "",
total: _total,
remark: "",
})
total = x.total;
_total = 0;
}
_reslut.push({
...x
})
}
tmpType = x.type;
});
_reslut.push({
type: "",
typeRank: "",
level: "รวม",
levelRank: "",
total: total,
remark: "",
})
_reslut.push({
type: "",
typeRank: "",
level: "รวมทั้งสิ้น",
levelRank: "",
total: allTotal,
remark: "",
});
return new HttpSuccess({
template: "report4",
reportName: "report4",
data: {
dateCurrent: Extension.ToThaiShortDate(new Date()),
rootName: orgRootData ? orgRootData.orgRootName : "-",
data: _reslut
}
});
} }
} }

View file

@ -435,58 +435,62 @@ export class KeycloakController extends Controller {
) { ) {
let condition: any = {}; let condition: any = {};
if (req.user.role.includes("ADMIN")) { if (req.user.role.includes("ADMIN") && !req.user.role.includes("SUPER_ADMIN")) {
const profile = await this.profileRepo.findOne({ const profile = await this.profileRepo.findOne({
relations:[ relations: ["current_holders", "current_holders.orgRevision"],
"current_holders", where: {
"current_holders.orgRevision",
],
where: {
keycloak: req.user.sub, keycloak: req.user.sub,
current_holders:{ current_holders: {
orgRevision:{ orgRevision: {
orgRevisionIsCurrent: true, orgRevisionIsCurrent: true,
orgRevisionIsDraft: false orgRevisionIsDraft: false,
} },
} },
} },
}); });
if(profile?.current_holders[0].orgRootId && profile?.current_holders[0].orgChild1Id == null){ if (
condition = profile?.current_holders[0]?.orgRootId &&
`current_holders.orgRootId = '${profile?.current_holders[0].orgRootId}' profile?.current_holders[0]?.orgChild1Id == null
) {
condition = `current_holders.orgRootId = '${profile?.current_holders[0]?.orgRootId}'
and current_holders.orgChild1Id IS NULL and current_holders.orgChild1Id IS NULL
and current_holders.orgChild2Id IS NULL and current_holders.orgChild2Id IS NULL
and current_holders.orgChild3Id IS NULL and current_holders.orgChild3Id IS NULL
and current_holders.orgChild4Id IS NULL`; and current_holders.orgChild4Id IS NULL`;
}else if(profile?.current_holders[0].orgChild1Id && profile?.current_holders[0].orgChild2Id == null){ } else if (
condition = profile?.current_holders[0]?.orgChild1Id &&
`current_holders.orgRootId = '${profile?.current_holders[0].orgRootId}' profile?.current_holders[0]?.orgChild2Id == null
and current_holders.orgChild1Id '${profile?.current_holders[0].orgChild1Id}' ) {
condition = `current_holders.orgRootId = '${profile?.current_holders[0]?.orgRootId}'
and current_holders.orgChild1Id = '${profile?.current_holders[0]?.orgChild1Id}'
and current_holders.orgChild2Id IS NULL and current_holders.orgChild2Id IS NULL
and current_holders.orgChild3Id IS NULL and current_holders.orgChild3Id IS NULL
and current_holders.orgChild4Id IS NULL`; and current_holders.orgChild4Id IS NULL`;
}else if(profile?.current_holders[0].orgChild2Id && profile?.current_holders[0].orgChild3Id == null){ } else if (
condition = profile?.current_holders[0]?.orgChild2Id &&
`current_holders.orgRootId = '${profile?.current_holders[0].orgRootId}' profile?.current_holders[0]?.orgChild3Id == null
and current_holders.orgChild1Id '${profile?.current_holders[0].orgChild1Id}' ) {
and current_holders.orgChild2Id '${profile?.current_holders[0].orgChild2Id}' condition = `current_holders.orgRootId = '${profile?.current_holders[0]?.orgRootId}'
and current_holders.orgChild1Id = '${profile?.current_holders[0]?.orgChild1Id}'
and current_holders.orgChild2Id = '${profile?.current_holders[0]?.orgChild2Id}'
and current_holders.orgChild3Id IS NULL and current_holders.orgChild3Id IS NULL
and current_holders.orgChild4Id IS NULL`; and current_holders.orgChild4Id IS NULL`;
}else if(profile?.current_holders[0].orgChild3Id && profile?.current_holders[0].orgChild4Id == null){ } else if (
condition = profile?.current_holders[0]?.orgChild3Id &&
`current_holders.orgRootId = '${profile?.current_holders[0].orgRootId}' profile?.current_holders[0]?.orgChild4Id == null
and current_holders.orgChild1Id '${profile?.current_holders[0].orgChild1Id}' ) {
and current_holders.orgChild2Id '${profile?.current_holders[0].orgChild2Id}' condition = `current_holders.orgRootId = '${profile?.current_holders[0]?.orgRootId}'
and current_holders.orgChild3Id '${profile?.current_holders[0].orgChild3Id}' and current_holders.orgChild1Id = '${profile?.current_holders[0]?.orgChild1Id}'
and current_holders.orgChild2Id = '${profile?.current_holders[0]?.orgChild2Id}'
and current_holders.orgChild3Id = '${profile?.current_holders[0]?.orgChild3Id}'
and current_holders.orgChild4Id IS NULL`; and current_holders.orgChild4Id IS NULL`;
}else if(profile?.current_holders[0].orgChild4Id){ } else if (profile?.current_holders[0]?.orgChild4Id) {
condition = condition = `current_holders.orgRootId = '${profile?.current_holders[0]?.orgRootId}'
`current_holders.orgRootId = '${profile?.current_holders[0].orgRootId}' and current_holders.orgChild1Id = '${profile?.current_holders[0]?.orgChild1Id}'
and current_holders.orgChild1Id '${profile?.current_holders[0].orgChild1Id}' and current_holders.orgChild2Id = '${profile?.current_holders[0]?.orgChild2Id}'
and current_holders.orgChild2Id '${profile?.current_holders[0].orgChild2Id}' and current_holders.orgChild3Id = '${profile?.current_holders[0]?.orgChild3Id}'
and current_holders.orgChild3Id '${profile?.current_holders[0].orgChild3Id}' and current_holders.orgChild4Id = '${profile?.current_holders[0]?.orgChild4Id}'`;
and current_holders.orgChild4Id '${profile?.current_holders[0].orgChild4Id}'`;
} }
} }
let profiles: any = []; let profiles: any = [];

View file

@ -188,7 +188,7 @@ export class WorkflowController extends Controller {
let profileNow = _workflow.stateOperatorUsers let profileNow = _workflow.stateOperatorUsers
.filter((x) => _state.stateOperators.map((s) => s.operator).includes(x.operator)) .filter((x) => _state.stateOperators.map((s) => s.operator).includes(x.operator))
.map((x) => ({ .map((x) => ({
receiverUserId: x.profileId, receiverUserId: x.profileType == "OFFICER" ? x.profileId : x.profileEmployeeId,
notiLink: "", notiLink: "",
})); }));
await new CallAPI() await new CallAPI()
@ -313,7 +313,15 @@ export class WorkflowController extends Controller {
system: string; system: string;
}, },
) { ) {
const stateOperatorUser = await this.stateOperatorUserRepo.findOne({ const workflow = await this.workflowRepo.findOne({
where: {
refId: body.refId,
sysName: body.system,
},
});
if (!workflow) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่สามารถดำเนินการกระบวนการนี้ได้");
let stateOperatorUser = await this.stateOperatorUserRepo.findOne({
where: { where: {
workflow: { workflow: {
refId: body.refId, refId: body.refId,
@ -325,13 +333,20 @@ export class WorkflowController extends Controller {
}, },
relations: ["workflow"], relations: ["workflow"],
}); });
const workflow = await this.workflowRepo.findOne({ if (stateOperatorUser) {
where: { stateOperatorUser = await this.stateOperatorUserRepo.findOne({
refId: body.refId, where: {
sysName: body.system, workflow: {
}, refId: body.refId,
}); sysName: body.system,
if (!workflow) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่สามารถดำเนินการกระบวนการนี้ได้"); },
profileEmployee: {
keycloak: req.user.sub,
},
},
relations: ["workflow"],
});
}
const operator = await this.stateOperatorRepo.findOne({ const operator = await this.stateOperatorRepo.findOne({
where: { where: {
operator: stateOperatorUser?.operator || "", operator: stateOperatorUser?.operator || "",
@ -424,7 +439,16 @@ export class WorkflowController extends Controller {
system: string; system: string;
}, },
) { ) {
const stateOperatorUserNow = await this.stateOperatorUserRepo.findOne({ const workflow = await this.workflowRepo.findOne({
where: {
refId: body.refId,
sysName: body.system,
},
relations: ["stateOperatorUsers"],
});
if (!workflow) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่สามารถดำเนินการกระบวนการนี้ได้");
let stateOperatorUserNow = await this.stateOperatorUserRepo.findOne({
where: { where: {
workflow: { workflow: {
refId: body.refId, refId: body.refId,
@ -435,7 +459,20 @@ export class WorkflowController extends Controller {
}, },
}, },
}); });
const stateOperatorUser = await this.stateOperatorUserRepo.find({ if (stateOperatorUserNow == null) {
stateOperatorUserNow = await this.stateOperatorUserRepo.findOne({
where: {
workflow: {
refId: body.refId,
sysName: body.system,
},
profileEmployee: {
keycloak: req.user.sub,
},
},
});
}
let stateOperatorUser = await this.stateOperatorUserRepo.find({
where: { where: {
workflow: { workflow: {
refId: body.refId, refId: body.refId,
@ -447,17 +484,22 @@ export class WorkflowController extends Controller {
operator: stateOperatorUserNow?.operator || "", operator: stateOperatorUserNow?.operator || "",
}, },
}); });
if (stateOperatorUser == null) {
stateOperatorUser = await this.stateOperatorUserRepo.find({
where: {
workflow: {
refId: body.refId,
sysName: body.system,
},
profileEmployee: {
keycloak: Not(req.user.sub),
},
operator: stateOperatorUserNow?.operator || "",
},
});
}
await this.stateOperatorUserRepo.remove(stateOperatorUser); await this.stateOperatorUserRepo.remove(stateOperatorUser);
const workflow = await this.workflowRepo.findOne({
where: {
refId: body.refId,
sysName: body.system,
},
relations: ["stateOperatorUsers"],
});
if (!workflow) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่สามารถดำเนินการกระบวนการนี้ได้");
const state = await this.stateRepo.findOne({ const state = await this.stateRepo.findOne({
where: { where: {
id: workflow.stateId, id: workflow.stateId,
@ -476,7 +518,7 @@ export class WorkflowController extends Controller {
let profileNow = workflow.stateOperatorUsers let profileNow = workflow.stateOperatorUsers
.filter((x) => state.stateOperators.map((s) => s.operator).includes(x.operator)) .filter((x) => state.stateOperators.map((s) => s.operator).includes(x.operator))
.map((x) => ({ .map((x) => ({
receiverUserId: x.profileId, receiverUserId: x.profileType == "OFFICER" ? x.profileId : x.profileEmployeeId,
notiLink: "", notiLink: "",
})); }));
await new CallAPI() await new CallAPI()
@ -496,7 +538,7 @@ export class WorkflowController extends Controller {
let profileNext = workflow.stateOperatorUsers let profileNext = workflow.stateOperatorUsers
.filter((x) => _state.stateOperators.map((s) => s.operator).includes(x.operator)) .filter((x) => _state.stateOperators.map((s) => s.operator).includes(x.operator))
.map((x) => ({ .map((x) => ({
receiverUserId: x.profileId, receiverUserId: x.profileType == "OFFICER" ? x.profileId : x.profileEmployeeId,
notiLink: "", notiLink: "",
})); }));
await new CallAPI() await new CallAPI()
@ -656,7 +698,7 @@ export class WorkflowController extends Controller {
stateUserComment.state.stateOperators.map((s) => s.operator).includes(x.operator), stateUserComment.state.stateOperators.map((s) => s.operator).includes(x.operator),
) )
.map((x) => ({ .map((x) => ({
receiverUserId: x.profileId, receiverUserId: x.profileType == "OFFICER" ? x.profileId : x.profileEmployeeId,
notiLink: "", notiLink: "",
})); }));
await new CallAPI() await new CallAPI()

View file

@ -17,6 +17,13 @@ export class OrgRevision extends EntityBase {
}) })
orgRevisionName: string; orgRevisionName: string;
@Column({
comment: "หมายเหตุ",
length: 255,
default: null,
})
remark: string;
@Column({ @Column({
comment: "สถานะเป็นโครงสร้างปัจจุบันหรือไม่", comment: "สถานะเป็นโครงสร้างปัจจุบันหรือไม่",
default: false, default: false,
@ -82,5 +89,8 @@ export class CreateOrgRevision {
@Column("uuid") @Column("uuid")
orgRevisionId?: string; orgRevisionId?: string;
@Column()
remark: string;
} }
export type UpdateOrgRevision = Partial<OrgRevision>; export type UpdateOrgRevision = Partial<OrgRevision>;

View file

@ -0,0 +1,14 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class UpdateWorkflowAddEmployee1732085607231 implements MigrationInterface {
name = 'UpdateWorkflowAddEmployee1732085607231'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE \`workflow\` DROP COLUMN \`profileType\``);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE \`workflow\` ADD \`profileType\` varchar(255) NULL COMMENT 'ผู้ใช้งาน'`);
}
}

View file

@ -0,0 +1,14 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class UpdateWorkflowAddEmployee11732087058773 implements MigrationInterface {
name = 'UpdateWorkflowAddEmployee11732087058773'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE \`workflow\` ADD \`profileType\` varchar(255) NULL COMMENT 'ผู้ใช้งาน'`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE \`workflow\` DROP COLUMN \`profileType\``);
}
}

View file

@ -0,0 +1,14 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class UpdataOrgAddRemark1732163306077 implements MigrationInterface {
name = 'UpdataOrgAddRemark1732163306077'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE \`orgRevision\` ADD \`remark\` varchar(255) NULL COMMENT 'หมายเหตุ'`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE \`orgRevision\` DROP COLUMN \`remark\``);
}
}