diff --git a/src/modules/05_placement/components/PersonalList/DialogDetail.vue b/src/modules/05_placement/components/PersonalList/DialogDetail.vue index 56cc9b3c4..13aa09aef 100644 --- a/src/modules/05_placement/components/PersonalList/DialogDetail.vue +++ b/src/modules/05_placement/components/PersonalList/DialogDetail.vue @@ -3,6 +3,7 @@ import { ref, watch } from "vue"; import { useQuasar } from "quasar"; import { useCounterMixin } from "@/stores/mixin"; +import { calculateAge } from "@/utils/function"; import http from "@/plugins/http"; import config from "@/app.config"; @@ -38,6 +39,20 @@ const props = defineProps({ const rows = ref([]); const personalForm = ref(); +const age = ref(""); //อายุ + +// ข้อมูลแปลงจาก ID เป็นชื่อ +const currentProvinceName = ref(""); +const currentDistrictName = ref(""); +const currentSubDistrictName = ref(""); +const registProvinceName = ref(""); +const registDistrictName = ref(""); +const registSubDistrictName = ref(""); + +// Cache ข้อมูล +const provincesCache = ref([]); +const districtsCache = ref>(new Map()); // key: provinceId, value: districts[] +const subDistrictsCache = ref>(new Map()); // key: districtId, value: subDistricts[] /**หัวตาราง */ const columns = ref([ @@ -87,11 +102,20 @@ const columns = ref([ * ฟังก์ชันดึงข้อมูลรายละเอียด */ async function fetchData() { + // Reset ข้อมูลเก่าก่อนโหลดข้อมูลใหม่ + resetData(); + showLoader(); await http .get(config.API.getDatapersonal(props.personalId)) .then((res) => { personalForm.value = res.data.result; + if (res.data.result.dateOfBirth) { + // กำหนดอายุ ส่งวันเกิดไปคำนวน + age.value = calculateAge(res.data.result.dateOfBirth); + } else { + age.value = null; + } personalForm.value?.education.map((e: Education) => { rows.value.push({ university: e.institute, @@ -107,6 +131,159 @@ async function fetchData() { .finally(() => { hideLoader(); }); + + // แปลง ID เป็นชื่อ + await convertAddressIds(); +} + +/** + * Reset ข้อมูลทุกครั้งที่เปิดคนใหม่ + */ +function resetData() { + // Reset ข้อมูลส่วนตัว + personalForm.value = undefined; + age.value = ""; + rows.value = []; + + // Reset ข้อมูลที่อยู่ + currentProvinceName.value = ""; + currentDistrictName.value = ""; + currentSubDistrictName.value = ""; + registProvinceName.value = ""; + registDistrictName.value = ""; + registSubDistrictName.value = ""; +} + +/** + * ฟังก์ชันแปลง ID เป็นชื่อจริงของที่อยู่ (แบบ optimize) + */ +async function convertAddressIds() { + if (!personalForm.value) return; + + try { + // โหลดข้อมูลจังหวัดครั้งเดียวถ้ายังไม่มี + await loadProvinces(); + + // แปลงข้อมูลที่อยู่ปัจจุบัน + if (personalForm.value.currentProvinceId && personalForm.value.currentProvinceId.trim() !== "") { + currentProvinceName.value = getProvinceNameFromCache( + personalForm.value.currentProvinceId + ); + + if (personalForm.value.currentDistrictId && personalForm.value.currentDistrictId.trim() !== "") { + currentDistrictName.value = await getDistrictNameOptimized( + personalForm.value.currentProvinceId, + personalForm.value.currentDistrictId + ); + + if (personalForm.value.currentSubDistrictId && personalForm.value.currentSubDistrictId.trim() !== "") { + currentSubDistrictName.value = await getSubDistrictNameOptimized( + personalForm.value.currentDistrictId, + personalForm.value.currentSubDistrictId + ); + } + } + } + + // แปลงข้อมูลที่อยู่ตามทะเบียน + if (personalForm.value.registProvinceId && personalForm.value.registProvinceId.trim() !== "") { + registProvinceName.value = getProvinceNameFromCache( + personalForm.value.registProvinceId + ); + + if (personalForm.value.registDistrictId && personalForm.value.registDistrictId.trim() !== "") { + registDistrictName.value = await getDistrictNameOptimized( + personalForm.value.registProvinceId, + personalForm.value.registDistrictId + ); + + if (personalForm.value.registSubDistrictId && personalForm.value.registSubDistrictId.trim() !== "") { + registSubDistrictName.value = await getSubDistrictNameOptimized( + personalForm.value.registDistrictId, + personalForm.value.registSubDistrictId + ); + } + } + } + } catch (error) { + console.error("Error converting address IDs:", error); + } +} + +/** + * โหลดข้อมูลจังหวัดทั้งหมด (ครั้งเดียว) + */ +async function loadProvinces() { + if (provincesCache.value.length === 0) { + try { + const res = await http.get(config.API.province); + provincesCache.value = res.data.result; + } catch (error) { + console.error("Error loading provinces:", error); + } + } +} + +/** + * ดึงชื่อจังหวัดจาก cache + */ +function getProvinceNameFromCache(provinceId: string): string { + const province = provincesCache.value.find( + (p: any) => p.id.toString() === provinceId + ); + return province ? province.name : "-"; +} + +/** + * ดึงชื่ออำเภอแบบ optimize (เรียก API เฉพาะจังหวัดที่ต้องการ) + * @param provinceId ID ของจังหวัด + * @param districtId ID ของอำเภอ + */ +async function getDistrictNameOptimized( + provinceId: string, + districtId: string +): Promise { + try { + // เช็ค cache ว่ามีข้อมูล districts ของ province นี้หรือไม่ + if (!districtsCache.value.has(provinceId)) { + const res = await http.get(config.API.listDistrict(provinceId)); + districtsCache.value.set(provinceId, res.data.result.districts); + } + + const districts = districtsCache.value.get(provinceId) || []; + const district = districts.find((d: any) => d.id.toString() === districtId); + return district ? district.name : "-"; + } catch (error) { + console.error("Error loading district:", error); + return "-"; + } +} + +/** + * ดึงชื่อตำบลแบบ optimize (เรียก API เฉพาะอำเภอที่ต้องการ) + * @param districtId ID ของอำเภอ + * @param subDistrictId ID ของตำบล + */ +async function getSubDistrictNameOptimized( + districtId: string, + subDistrictId: string +): Promise { + try { + // เช็ค cache ว่ามีข้อมูล subDistricts ของ district นี้หรือไม่ + if (!subDistrictsCache.value.has(districtId)) { + const res = await http.get(config.API.listSubDistrict(districtId)); + subDistrictsCache.value.set(districtId, res.data.result.subDistricts); + } + + const subDistricts = subDistrictsCache.value.get(districtId) || []; + const subDistrict = subDistricts.find( + (sd: any) => sd.id.toString() === subDistrictId + ); + return subDistrict ? subDistrict.name : "-"; + } catch (error) { + console.error("Error loading subdistrict:", error); + return "-"; + } } /** @@ -131,7 +308,7 @@ function formBmaofficer(val: string) { */ async function close() { props.close(); - rows.value = []; + resetData(); // Reset ข้อมูลเมื่อปิด dialog } /** @@ -170,30 +347,58 @@ watch(props, () => {
-
เลขประจำตัวประชาชน
-
วัน/เดือน/ปีเกิด
+
เลขประจำตัวประชาชน
+
วัน/เดือน/ปีเกิด
+
อายุ
+
สัญชาติ
+
หมู่เลือด
-
+
{{ personalForm?.idCard }}
-
+
{{ date2Thai(personalForm?.dateOfBirth) }}
+
+ {{ age ? age : "-" }} +
+
+ {{ + personalForm?.nationality ? personalForm.nationality : "-" + }} +
+
+ {{ + personalForm?.bloodGroup ? personalForm.bloodGroup : "-" + }} +
-
ชื่อ-นามสกุล
-
เพศ
+
ชื่อ-นามสกุล
+
เพศ
+
เชื้อชาติ
+
ศาสนา
+
เบอร์โทรศัพท์
-
+
{{ personalForm?.fullName }}
-
+
{{ personalForm?.gender }}
+
+ {{ personalForm?.race ? personalForm.race : "-" }} +
+
+ {{ personalForm?.religion ? personalForm.religion : "-" }} +
+
+ {{ personalForm?.telephone ? personalForm.telephone : "-" }} +
@@ -203,9 +408,90 @@ watch(props, () => {
ภูมิลำเนา
-
ที่อยู่
-
- {{ personalForm?.registAddress }} + +
+
+ ที่อยู่ปัจจุบัน +
+
+
+
ที่อยู่
+
จังหวัด
+
เขต/อำเภอ
+
แขวง/ตำบล
+
รหัสไปรษณีย์
+
+
+
+ {{ + personalForm?.currentAddress + ? personalForm.currentAddress + : "-" + }} +
+
+ {{ currentProvinceName ? currentProvinceName : "-" }} +
+
+ {{ currentDistrictName ? currentDistrictName : "-" }} +
+
+ {{ + currentSubDistrictName ? currentSubDistrictName : "-" + }} +
+
+ {{ + personalForm?.currentZipCode + ? personalForm.currentZipCode + : "-" + }} +
+
+
+
+ + +
+
+ ที่อยู่ตามทะเบียนบ้าน +
+
+
+
ที่อยู่
+
จังหวัด
+
เขต/อำเภอ
+
แขวง/ตำบล
+
รหัสไปรษณีย์
+
+
+
+ {{ + personalForm?.registAddress + ? personalForm.registAddress + : "-" + }} +
+
+ {{ registProvinceName ? registProvinceName : "-" }} +
+
+ {{ registDistrictName ? registDistrictName : "-" }} +
+
+ {{ + registSubDistrictName ? registSubDistrictName : "-" + }} +
+
+ {{ + personalForm?.registZipCode + ? personalForm.registZipCode + : "-" + }} +
+
+
diff --git a/src/modules/12_evaluatePersonal/components/Detail/viewTab2/CardMeet.vue b/src/modules/12_evaluatePersonal/components/Detail/viewTab2/CardMeet.vue index 7a6973420..cf4611de5 100644 --- a/src/modules/12_evaluatePersonal/components/Detail/viewTab2/CardMeet.vue +++ b/src/modules/12_evaluatePersonal/components/Detail/viewTab2/CardMeet.vue @@ -213,7 +213,9 @@ function handleDelete(meetingId: string) { dialogRemove($q, async () => { showLoader(); try { - await http.delete(config.API.evaluationMain() + `/del-meeting/${id.value}/${meetingId}`); + await http.delete( + config.API.evaluationMain() + `/del-meeting/${id.value}/${meetingId}` + ); await props.fetchData(); await success($q, "ลบสำเร็จ"); } catch (error) { @@ -289,7 +291,7 @@ watch(