hrms-mgt/src/modules/02_organization/store/organizational.ts
2026-06-05 10:57:37 +07:00

233 lines
7.6 KiB
TypeScript

import { defineStore } from "pinia";
import { reactive, ref } from "vue";
import http from "@/plugins/http";
import config from "@/app.config";
/** importType*/
import type {
DataActive,
SumPosition,
PosMaster,
PosMaster2,
} from "@/modules/02_organization/interface/response/organizational";
export const useOrganizational = defineStore("organizationalStore", () => {
const typeOrganizational = ref<string>("current"); // ประเภทโครงสร้าง
const statusView = ref<string>("list"); // การแสดงผล รายการ,map
const rootId = ref<string>("");
const isOfficer = ref<boolean | null>(null);
const isStaff = ref<boolean | null>(null);
const remark = ref<string>("");
const dataActive = ref<DataActive>(); //ข้อมูลโครงสร้าง
const activeId = ref<string>(); // id โครงสร้างปัจจุบัน
const draftId = ref<string>(); // id แบบร่างโครงสร้าง
const historyId = ref<string>(); // id ประวัติโครงสร้าง
const historyDnaOrgId = ref<string>(""); // id ของโครงสร้างสำหรับใช้ในเมนูสืบทอดตำแหน่ง
const isPublic = ref<boolean>(false); // การเผยแพร่
const treeId = ref<string>(); // id โหนด
const level = ref<number>(); // ระดับโหนด
const orgPublishDate = ref<Date | null>(null); // วันเผยแพร่
const isLock = ref<boolean>(false);
const sumPosition = reactive({
total: 0,
use: 0,
vacant: 0,
totalRoot: 0,
useRoot: 0,
vacantRoot: 0,
});
/**
* ฟังก์ชันกำหนดจำนวนข้อมูลตำแหน่ง
* @param data ข้อมุลจำนวนตำแหน่ง
*/
function getSumPosition(data: SumPosition) {
sumPosition.total = data.totalPosition;
sumPosition.totalRoot = data.totalRootPosition ? data.totalRootPosition : 0;
if (typeOrganizational.value == "draft") {
sumPosition.use = data.totalPositionNextUse;
sumPosition.useRoot = data.totalRootPositionNextUse
? data.totalRootPositionNextUse
: 0;
sumPosition.vacant = data.totalPositionNextVacant;
sumPosition.vacantRoot = data.totalRootPositionNextVacant
? data.totalRootPositionNextVacant
: 0;
} else {
sumPosition.use = data.totalPositionCurrentUse;
sumPosition.useRoot = data.totalRootPositionCurrentUse
? data.totalRootPositionCurrentUse
: 0;
sumPosition.vacant = data.totalPositionCurrentVacant;
sumPosition.vacantRoot = data.totalRootPositionCurrentVacant
? data.totalRootPositionCurrentVacant
: 0;
}
}
/**
* ฟังก์ชันกำหนดข้อมูลโครงสร้าง
* @param data ข้อมูลโครงสร้าง
*/
async function fetchDataActive(data: DataActive) {
dataActive.value = data;
activeId.value = data.activeId;
draftId.value = data.draftId;
isPublic.value = data.isPublic;
orgPublishDate.value = data.orgPublishDate;
}
/**
* ฟังก์ชันประมวลผลข้อมูลตำแหน่ง
* @param data ข้อมูลตำแหน่ง
* @returns ข้อมูลตำแหน่งที่ผ่านการประมวลผลแล้ว
*/
function fetchPosMaster(data: PosMaster[]) {
const newPosMaster: PosMaster2[] = data.map((e: PosMaster) => ({
...e,
positionIsSelected:
typeOrganizational.value === "draft" && e.fullNameNextHolder !== null
? e.fullNameNextHolder
: typeOrganizational.value !== "draft" &&
e.fullNameCurrentHolder !== null
? e.fullNameCurrentHolder
: "ว่าง",
posMasterNo:
e.orgShortname +
(e.posMasterNoPrefix ? e.posMasterNoPrefix : "") +
(e.posMasterNo ? ` ${e.posMasterNo}` : "") +
(e.posMasterNoSuffix ? e.posMasterNoSuffix : ""),
positionName: e.isSit ? e.profilePosition : e.positionName,
posTypeName: e.isSit ? e.profilePostype : e.posTypeName,
posLevelName: e.isSit ? e.profilePoslevel : e.posLevelName,
posExecutiveName: e.posExecutiveName,
isSit: e.isSit,
orgShortname: e.orgShortname,
posMasterNoPrefix: e.posMasterNoPrefix,
posMasterNoSuffix: e.posMasterNoSuffix,
posMasterNoMain: e.posMasterNo,
}));
return newPosMaster || [];
}
/**
* ฟังก์ชันตรวจสอบและแปลงค่าประเภทระดับ
* @param type ประเภทระดับ
* @returns ชื่อประเภทระดับ
*/
async function checkLevel(type: number) {
switch (type) {
case 0:
return "Root";
case 1:
return "Child1";
case 2:
return "Child2";
case 3:
return "Child3";
default:
return "Child4";
}
}
/**
* ฟังก์ชันตรวจสอบและแปลงค่าระดับหน่วยงาน
* @param type ระดับหน่วยงาน
* @returns ชื่อประระดับหน่วยงาน
*/
function convertType(type: string) {
switch (type) {
case "DEPARTMENT":
return "ระดับสำนัก";
case "OFFICE":
return "ระดับกอง/สำนักงาน/ส่วนราชการ/โรงพยาบาล/เทียบเท่ากอง";
case "DIVISION":
return "ระดับส่วน/กลุ่มภารกิจ";
case "SECTION":
return "ระดับฝ่าย/กลุ่มงาน";
default:
return "-";
}
}
/**
* ฟังก์ชันแปลงค่าสถานะรายละเอียดโครงสร้าง
* @param type สถานะ
* @returns ชือสถานะ
*/
function convertStatus(type: string) {
switch (type) {
case "current":
return "ปกติ";
case "draft":
return "แบบร่าง";
case "old":
return "ยุบเลิก";
default:
return "-";
}
}
const cachedData = ref<Record<string, any>>({});
/**
* ฟังก์ชันดึงข้อมูลโครงสร้าง
* @param keyId id โครงสร้าง
*/
async function fetchDataTree(keyId: string) {
// ตรวจสอบว่ามีข้อมูลใน cache แล้วหรือไม่
if (cachedData.value[keyId]) {
return cachedData.value[keyId];
}
// ถ้าไม่มีข้อมูลใน cache หรือ forceRefresh เป็น true ให้ดึงข้อมูลจาก API
try {
const res = await http.get(config.API.orgByid(keyId));
const result = res.data.result;
// เก็บข้อมูลใน cache
cachedData.value[keyId] = result;
return result;
} catch (error) {
console.error("Error fetching data tree:", error);
return [];
}
}
return {
typeOrganizational,
statusView,
//
fetchDataActive,
checkLevel,
convertType,
draftId,
activeId,
historyId,
treeId,
level,
isPublic,
orgPublishDate,
fetchPosMaster,
sumPosition,
getSumPosition,
isOfficer,
isStaff,
rootId,
isLock,
remark,
convertStatus,
fetchDataTree,
historyDnaOrgId,
};
});