แก้ไขประเภท ระดับตำแหน่ง และจังหวัด อำเภอ ตำบลให้แสดงฟิลด์ที่เป็นชื่อให้เลือก
This commit is contained in:
parent
9fe91ce49c
commit
b2d59ef698
2 changed files with 182 additions and 10 deletions
|
|
@ -348,6 +348,69 @@ export class ApiManageController extends Controller {
|
||||||
"commandId",
|
"commandId",
|
||||||
]; // ฟิลด์ที่ไม่ต้องการแสดงในผลลัพธ์
|
]; // ฟิลด์ที่ไม่ต้องการแสดงในผลลัพธ์
|
||||||
|
|
||||||
|
// การแทนที่ฟิลด์ ID ด้วยฟิลด์ Name สำหรับ Profile entity
|
||||||
|
private readonly PROFILE_FIELD_REPLACEMENTS: Record<
|
||||||
|
string,
|
||||||
|
{ propertyName: string; type: string; comment: string; joinTable: string; joinField: string }
|
||||||
|
> = {
|
||||||
|
posLevelId: {
|
||||||
|
propertyName: "posLevelName",
|
||||||
|
type: "string",
|
||||||
|
comment: "ระดับตำแหน่ง",
|
||||||
|
joinTable: "PosLevel",
|
||||||
|
joinField: "posLevelName",
|
||||||
|
},
|
||||||
|
posTypeId: {
|
||||||
|
propertyName: "posTypeName",
|
||||||
|
type: "string",
|
||||||
|
comment: "ประเภทตำแหน่ง",
|
||||||
|
joinTable: "PosType",
|
||||||
|
joinField: "posTypeName",
|
||||||
|
},
|
||||||
|
registrationProvinceId: {
|
||||||
|
propertyName: "registrationProvinceName",
|
||||||
|
type: "string",
|
||||||
|
comment: "จังหวัดตามทะเบียนบ้าน",
|
||||||
|
joinTable: "Province",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
registrationDistrictId: {
|
||||||
|
propertyName: "registrationDistrictName",
|
||||||
|
type: "string",
|
||||||
|
comment: "เขตตามทะเบียนบ้าน",
|
||||||
|
joinTable: "District",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
registrationSubDistrictId: {
|
||||||
|
propertyName: "registrationSubDistrictName",
|
||||||
|
type: "string",
|
||||||
|
comment: "แขวงตามทะเบียนบ้าน",
|
||||||
|
joinTable: "SubDistrict",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
currentProvinceId: {
|
||||||
|
propertyName: "currentProvinceName",
|
||||||
|
type: "string",
|
||||||
|
comment: "จังหวัดตามปัจจุบัน",
|
||||||
|
joinTable: "Province",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
currentDistrictId: {
|
||||||
|
propertyName: "currentDistrictName",
|
||||||
|
type: "string",
|
||||||
|
comment: "เขตตามปัจจุบัน",
|
||||||
|
joinTable: "District",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
currentSubDistrictId: {
|
||||||
|
propertyName: "currentSubDistrictName",
|
||||||
|
type: "string",
|
||||||
|
comment: "แขวงตามปัจจุบัน",
|
||||||
|
joinTable: "SubDistrict",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
private validateSuperAdminRole(user: any): void {
|
private validateSuperAdminRole(user: any): void {
|
||||||
if (!user.role.includes("SUPER_ADMIN")) {
|
if (!user.role.includes("SUPER_ADMIN")) {
|
||||||
throw new HttpError(HttpStatusCode.FORBIDDEN, "คุณไม่มีสิทธิ์ในการเข้าถึงข้อมูลนี้");
|
throw new HttpError(HttpStatusCode.FORBIDDEN, "คุณไม่มีสิทธิ์ในการเข้าถึงข้อมูลนี้");
|
||||||
|
|
@ -385,11 +448,8 @@ export class ApiManageController extends Controller {
|
||||||
|
|
||||||
const result = this.entities
|
const result = this.entities
|
||||||
.filter((entity) => entity.system.includes(system))
|
.filter((entity) => entity.system.includes(system))
|
||||||
.map(({ name, repository, description, isMain }) => ({
|
.map(({ name, repository, description, isMain }) => {
|
||||||
tb: name,
|
let columns = repository.metadata.columns
|
||||||
description,
|
|
||||||
isMain: isMain || false,
|
|
||||||
propertys: repository.metadata.columns
|
|
||||||
.filter(
|
.filter(
|
||||||
(column: any) =>
|
(column: any) =>
|
||||||
!column.isPrimary && !this.EXCLUDED_COLUMNS.includes(column.propertyName),
|
!column.isPrimary && !this.EXCLUDED_COLUMNS.includes(column.propertyName),
|
||||||
|
|
@ -399,8 +459,35 @@ export class ApiManageController extends Controller {
|
||||||
type: typeof column.type === "string" ? column.type : "string",
|
type: typeof column.type === "string" ? column.type : "string",
|
||||||
comment: column.comment,
|
comment: column.comment,
|
||||||
key: column.propertyName,
|
key: column.propertyName,
|
||||||
})),
|
}));
|
||||||
}));
|
|
||||||
|
// Special handling for Profile entity - replace ID fields with name fields
|
||||||
|
if (name === "Profile") {
|
||||||
|
const replacementKeys = Object.keys(this.PROFILE_FIELD_REPLACEMENTS);
|
||||||
|
|
||||||
|
// Remove ID fields that should be replaced
|
||||||
|
columns = columns.filter((col: { propertyName: string }) =>
|
||||||
|
!replacementKeys.includes(col.propertyName),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Add the corresponding name fields
|
||||||
|
const nameFields = replacementKeys.map((key) => ({
|
||||||
|
propertyName: this.PROFILE_FIELD_REPLACEMENTS[key].propertyName,
|
||||||
|
type: "string",
|
||||||
|
comment: this.PROFILE_FIELD_REPLACEMENTS[key].comment,
|
||||||
|
key: this.PROFILE_FIELD_REPLACEMENTS[key].propertyName,
|
||||||
|
}));
|
||||||
|
|
||||||
|
columns = [...columns, ...nameFields];
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
tb: name,
|
||||||
|
description,
|
||||||
|
isMain: isMain || false,
|
||||||
|
propertys: columns,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
return new HttpSuccess(result);
|
return new HttpSuccess(result);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,53 @@ export class ApiWebServiceController extends Controller {
|
||||||
private orgRevisionRepository = AppDataSource.getRepository(OrgRevision);
|
private orgRevisionRepository = AppDataSource.getRepository(OrgRevision);
|
||||||
private apiHistoryRepository = AppDataSource.getRepository(ApiHistory);
|
private apiHistoryRepository = AppDataSource.getRepository(ApiHistory);
|
||||||
|
|
||||||
|
// การแทนที่ฟิลด์ ID ด้วยฟิลด์ Name สำหรับ Profile entity
|
||||||
|
private readonly PROFILE_FIELD_REPLACEMENTS: Record<
|
||||||
|
string,
|
||||||
|
{ propertyName: string; joinRelation: string; joinField: string }
|
||||||
|
> = {
|
||||||
|
posLevelName: {
|
||||||
|
propertyName: "posLevelId",
|
||||||
|
joinRelation: "posLevel",
|
||||||
|
joinField: "posLevelName",
|
||||||
|
},
|
||||||
|
posTypeName: {
|
||||||
|
propertyName: "posTypeId",
|
||||||
|
joinRelation: "posType",
|
||||||
|
joinField: "posTypeName",
|
||||||
|
},
|
||||||
|
registrationProvinceName: {
|
||||||
|
propertyName: "registrationProvinceId",
|
||||||
|
joinRelation: "registrationProvince",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
registrationDistrictName: {
|
||||||
|
propertyName: "registrationDistrictId",
|
||||||
|
joinRelation: "registrationDistrict",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
registrationSubDistrictName: {
|
||||||
|
propertyName: "registrationSubDistrictId",
|
||||||
|
joinRelation: "registrationSubDistrict",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
currentProvinceName: {
|
||||||
|
propertyName: "currentProvinceId",
|
||||||
|
joinRelation: "currentProvince",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
currentDistrictName: {
|
||||||
|
propertyName: "currentDistrictId",
|
||||||
|
joinRelation: "currentDistrict",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
currentSubDistrictName: {
|
||||||
|
propertyName: "currentSubDistrictId",
|
||||||
|
joinRelation: "currentSubDistrict",
|
||||||
|
joinField: "name",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* list fields by systems
|
* list fields by systems
|
||||||
* @summary รายการ fields ตาม systems
|
* @summary รายการ fields ตาม systems
|
||||||
|
|
@ -50,7 +97,7 @@ export class ApiWebServiceController extends Controller {
|
||||||
}
|
}
|
||||||
await isPermissionRequest(request, apiName.id);
|
await isPermissionRequest(request, apiName.id);
|
||||||
const offset = (page - 1) * pageSize;
|
const offset = (page - 1) * pageSize;
|
||||||
const propertyKey = apiName.apiAttributes.map((attr) => `${attr.tbName}.${attr.propertyKey}`);
|
let propertyKey = apiName.apiAttributes.map((attr) => `${attr.tbName}.${attr.propertyKey}`);
|
||||||
|
|
||||||
let tbMain: string = "";
|
let tbMain: string = "";
|
||||||
let condition: string = "1=1";
|
let condition: string = "1=1";
|
||||||
|
|
@ -92,6 +139,23 @@ export class ApiWebServiceController extends Controller {
|
||||||
...new Set(propertyKey.map((x) => x.split(".")[0]).filter((tb) => tb !== tbMain)),
|
...new Set(propertyKey.map((x) => x.split(".")[0]).filter((tb) => tb !== tbMain)),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// สำหรับ Profile: ตรวจสอบฟิลด์ที่ต้องการ join และแปลง propertyKey
|
||||||
|
const profileFieldJoins: Record<string, string> = {}; // alias -> relationName
|
||||||
|
if (tbMain === "Profile") {
|
||||||
|
propertyKey = propertyKey.map((key) => {
|
||||||
|
const [table, field] = key.split(".");
|
||||||
|
if (table === "Profile") {
|
||||||
|
const replacement = this.PROFILE_FIELD_REPLACEMENTS[field];
|
||||||
|
if (replacement) {
|
||||||
|
const alias = `${table}_${replacement.joinRelation}`;
|
||||||
|
profileFieldJoins[alias] = replacement.joinRelation;
|
||||||
|
return `${alias}.${replacement.joinField}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const queryBuilder = repo.createQueryBuilder(tbMain);
|
const queryBuilder = repo.createQueryBuilder(tbMain);
|
||||||
|
|
||||||
// join กับตารารอง
|
// join กับตารารอง
|
||||||
|
|
@ -107,6 +171,13 @@ export class ApiWebServiceController extends Controller {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// join สำหรับฟิลด์ Profile ที่ต้องการดึงค่าจากตารางอื่น
|
||||||
|
if (tbMain === "Profile" && Object.keys(profileFieldJoins).length > 0) {
|
||||||
|
Object.entries(profileFieldJoins).forEach(([alias, relationName]) => {
|
||||||
|
queryBuilder.leftJoin(`${tbMain}.${relationName}`, alias);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// // เพิ่ม Main.id เพราะจะใช้ pk ในการแมบและนับจำนวน
|
// // เพิ่ม Main.id เพราะจะใช้ pk ในการแมบและนับจำนวน
|
||||||
// if (!propertyKey.includes(`${Main}.id`)) {
|
// if (!propertyKey.includes(`${Main}.id`)) {
|
||||||
// propertyKey.push(`${Main}.id`);
|
// propertyKey.push(`${Main}.id`);
|
||||||
|
|
@ -141,8 +212,22 @@ export class ApiWebServiceController extends Controller {
|
||||||
|
|
||||||
// split object id ออกก่อน return
|
// split object id ออกก่อน return
|
||||||
const data = items.map((item) => {
|
const data = items.map((item) => {
|
||||||
const { [pk]: removedPk, ...x } = item;
|
const { [pk]: removedPk, ...rest } = item;
|
||||||
return x;
|
|
||||||
|
// สำหรับ Profile: แปลงฟิลด์ที่มาจาก join กลับเป็นชื่อเดิม
|
||||||
|
if (tbMain === "Profile") {
|
||||||
|
const flattened: any = { ...rest };
|
||||||
|
Object.entries(this.PROFILE_FIELD_REPLACEMENTS).forEach(([nameField, config]) => {
|
||||||
|
const alias = `${tbMain}_${config.joinRelation}`;
|
||||||
|
if (rest[alias] && rest[alias][config.joinField] !== undefined) {
|
||||||
|
flattened[nameField] = rest[alias][config.joinField];
|
||||||
|
delete flattened[alias];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return flattened;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rest;
|
||||||
});
|
});
|
||||||
|
|
||||||
// console.log("queryBuilder ===> ", queryBuilder.getQuery());
|
// console.log("queryBuilder ===> ", queryBuilder.getQuery());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue