From da30b7d149a9db2489e1765b92ceb33dddddd93e Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Fri, 6 Mar 2026 14:05:25 +0700 Subject: [PATCH 001/192] fix: file template record --- public/บันทึกผลรายชื่อผู้ผ่านการฝึกอบรม-template.xlsx | Bin 7360 -> 7883 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/บันทึกผลรายชื่อผู้ผ่านการฝึกอบรม-template.xlsx b/public/บันทึกผลรายชื่อผู้ผ่านการฝึกอบรม-template.xlsx index 6c9a531eb35bc07f77474cb8a59b0f94c446b411..fa76e9545aa9f21cfa145d257657008f456f3605 100644 GIT binary patch literal 7883 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 literal 7360 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 From aa3c166c75f847c2088c878bb49482fcdf53abfa Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Fri, 6 Mar 2026 16:25:37 +0700 Subject: [PATCH 002/192] fix(scholarship): show botton update status only status === REPORTED --- .../15_development/components/scholarship/DetailView.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/modules/15_development/components/scholarship/DetailView.vue b/src/modules/15_development/components/scholarship/DetailView.vue index 00dbb28a1..05ec17335 100644 --- a/src/modules/15_development/components/scholarship/DetailView.vue +++ b/src/modules/15_development/components/scholarship/DetailView.vue @@ -772,7 +772,7 @@ onMounted(async () => { -
+
{ @click="onClickUpdateStatus('NOTGRADUATE')" />
-
+
{{ isStatus === "GRADUATE" ? "เรียนจบ" : "เรียนไม่จบ" }}
From 01f47a69b7cee92efc940dc7b510ed2519b713f6 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Fri, 6 Mar 2026 17:19:58 +0700 Subject: [PATCH 003/192] fix: --- .../components/scholarship/DetailView.vue | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/modules/15_development/components/scholarship/DetailView.vue b/src/modules/15_development/components/scholarship/DetailView.vue index 05ec17335..50ea302a7 100644 --- a/src/modules/15_development/components/scholarship/DetailView.vue +++ b/src/modules/15_development/components/scholarship/DetailView.vue @@ -306,7 +306,7 @@ async function fetchDataDetail(id: string) { isStatus.value = data.status; isGov.value = data.citizenId ? true : false; isGuarantor.value = data.guarantorCitizenId ? true : false; - if (isStatus.value !== "PENDING") { + if (isStatus.value === "GRADUATE" || isStatus.value === "NOTGRADUATE") { router.push(`/development/scholarship-detail/${id}`); } }) @@ -678,6 +678,27 @@ async function uploadFileDoc(uploadUrl: string, file: any) { }); } +/** ฟังก์ชั่นแปลงสถานะ */ +function conventStatus(val: string, type: string) { + switch (val) { + case "PENDING": + if (type === "TRAINING") { + return "อยู่ระหว่างฝึกอบรม"; + } else if (type === "DOMESTICE" || type === "STUDY") { + return "อยู่ระหว่างศึกษา"; + } + return ""; + case "REPORTED": + return "รายงานตัวกลับเข้าปฏิบัติราชการแล้ว"; + case "GRADUATE": + return "เรียนจบ"; + case "NOTGRADUATE": + return "เรียนไม่จบ"; + default: + return ""; + } +} + /** ดึงข้อมูลเมื่อคอมโพเนนต์โหลดเสร็จสมบูรณ์ */ onMounted(async () => { if (scholarshipId.value) { @@ -772,27 +793,38 @@ onMounted(async () => {
-
+ +
+
- {{ isStatus === "GRADUATE" ? "เรียนจบ" : "เรียนไม่จบ" }} + {{ conventStatus(isStatus, formBody.scholarshipType) }}
From fbfc801ef9e351887b29b8737b1c434671600aa0 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Fri, 6 Mar 2026 17:23:27 +0700 Subject: [PATCH 004/192] fix --- .forgejo/workflows/ci-cd.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/ci-cd.yaml b/.forgejo/workflows/ci-cd.yaml index b89ae3b44..2bf102922 100644 --- a/.forgejo/workflows/ci-cd.yaml +++ b/.forgejo/workflows/ci-cd.yaml @@ -32,7 +32,11 @@ jobs: ca=["/etc/ssl/certs/ca-certificates.crt"] - name: Tag Version run: | - echo "IMAGE_VERSION=latest" + if [ "${{ github.ref_type }}" == "tag" ]; then + echo "IMAGE_VERSION=${{ github.ref_name }}" >> $GITHUB_ENV + else + echo "IMAGE_VERSION=latest" >> $GITHUB_ENV + fi - name: Login in to registry uses: docker/login-action@v2 with: From 6252f4a6ca79d6a8f79a5092317a74e7a4466cce Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Fri, 6 Mar 2026 17:35:20 +0700 Subject: [PATCH 005/192] fix (scholarship ): disable button edit --- src/modules/15_development/views/Scholarship.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/modules/15_development/views/Scholarship.vue b/src/modules/15_development/views/Scholarship.vue index dc08a04d5..48d94b36c 100644 --- a/src/modules/15_development/views/Scholarship.vue +++ b/src/modules/15_development/views/Scholarship.vue @@ -492,9 +492,17 @@ onMounted(() => { flat dense round - :disable="props.row.status !== 'PENDING'" + :disable=" + props.row.status === 'GRADUATE' || + props.row.status === 'NOTGRADUATE' + " icon="edit" - :color="props.row.status !== 'PENDING' ? 'grey-6' : 'edit'" + :color=" + props.row.status === 'GRADUATE' || + props.row.status === 'NOTGRADUATE' + ? 'grey-6' + : 'edit' + " @click="onClickAddOrView(true, props.row.id)" > แก้ไขข้อมูล From fd05f8c73eb4769db77f69ddaf2f2ce7c3ba0333 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 11 Mar 2026 16:37:32 +0700 Subject: [PATCH 006/192] feat: Assign Command --- src/api/18_command/api.command.ts | 2 + .../18_command/components/DialogAssign.vue | 286 ++++++++++++++++++ .../18_command/components/Main/TableMain.vue | 29 ++ .../18_command/interface/response/Main.ts | 49 +++ 4 files changed, 366 insertions(+) create mode 100644 src/modules/18_command/components/DialogAssign.vue diff --git a/src/api/18_command/api.command.ts b/src/api/18_command/api.command.ts index 5e960210a..56867a5b1 100644 --- a/src/api/18_command/api.command.ts +++ b/src/api/18_command/api.command.ts @@ -28,4 +28,6 @@ export default { commandEditSalary: `${command}/tab2/edit-salary`, commandOperator: `${env.API_URI}/org/commandoperator`, + + commandAssign: (id: string) => `${command}/change-creator/${id}`, }; diff --git a/src/modules/18_command/components/DialogAssign.vue b/src/modules/18_command/components/DialogAssign.vue new file mode 100644 index 000000000..fbe10f73f --- /dev/null +++ b/src/modules/18_command/components/DialogAssign.vue @@ -0,0 +1,286 @@ + + + + + diff --git a/src/modules/18_command/components/Main/TableMain.vue b/src/modules/18_command/components/Main/TableMain.vue index db61c7a70..22970fc17 100644 --- a/src/modules/18_command/components/Main/TableMain.vue +++ b/src/modules/18_command/components/Main/TableMain.vue @@ -12,6 +12,7 @@ import config from "@/app.config"; import type { Pagination } from "@/modules/18_command/interface/index/Main"; import DialogFormCommand from "@/modules/18_command/components/Main/DialogFormCommand.vue"; +import DialogAssign from "@/modules/18_command/components/DialogAssign.vue"; const $q = useQuasar(); const router = useRouter(); @@ -36,6 +37,7 @@ const props = defineProps({ const modalCopy = ref(false); const isCheckPageSize = ref(false); const commandId = ref(""); +const modalAssign = ref(false); async function fetchListCommand() { await props.fetchList?.(); @@ -96,6 +98,7 @@ function onReCommand(id: string) { "ต้องการยืนยืนยันการดึงไปทำคำสั่งใหม่ใช่หรือไม่ ?" ); } + function onDeleteCommand(id: string) { dialogRemove( $q, @@ -120,6 +123,11 @@ function onDeleteCommand(id: string) { ); } +function onAssignCommand(id: string) { + commandId.value = id; + modalAssign.value = true; +} + onMounted(() => { !isCheckPageSize.value && fetchListCommand(); }); @@ -240,6 +248,25 @@ onMounted(() => { + + + +
+ +
หมอบหมายคำสั่ง
+
+
+
+ + + diff --git a/src/modules/18_command/interface/response/Main.ts b/src/modules/18_command/interface/response/Main.ts index 91cdbcd37..24795c013 100644 --- a/src/modules/18_command/interface/response/Main.ts +++ b/src/modules/18_command/interface/response/Main.ts @@ -122,6 +122,54 @@ interface DataOperators { positionSign?: string; } +interface DataProfile { + birthDate: string; + child1: string; + child1DnaId: string; + child1Id: string; + child1ShortName: string; + child2: string; + child2DnaId: string; + child2Id: string; + child2ShortName: string; + child3: string | null; + child3DnaId: string | null; + child3Id: string | null; + child3ShortName: string | null; + child4: string | null; + child4DnaId: string | null; + child4Id: string | null; + child4ShortName: string | null; + citizenId: string; + educationDegree: string | null; + email: string | null; + firstName: string; + id: string; + keycloak: string; + lastName: string; + name: string; + organization: string; + phone: string | null; + posLevelId: string; + posLevelName: string; + posMasterNo: number; + posNo:string; + posTypeId:string; + posTypeName: string; + position: string; + positionLevel: string; + positionLevelName: string; + positionType: string; + positionTypeName: string; + prefix: string; + rank: string; + root: string; + rootDnaId: string; + rootId:string; + rootShortName: string; + salary: number; +} + export type { ResListCommand, DataListCommand, @@ -131,4 +179,5 @@ export type { DataDirector, DataAuthority, DataOperators, + DataProfile }; From 42950b3caf5cff27656c95c8a23a724e81fa91d2 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 11 Mar 2026 16:40:21 +0700 Subject: [PATCH 007/192] fix: file Score Summary --- public/File/บัญชีรวมคะแนน.xlsx | Bin 49341 -> 54513 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/File/บัญชีรวมคะแนน.xlsx b/public/File/บัญชีรวมคะแนน.xlsx index c79f14ffe37fe2a102560ede9b033c81a3ddb381..3fda2b8dce8cf1e641dc3a6131107c751ad7b96a 100644 GIT binary patch delta 23158 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 delta 17881 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 ZD!hdRhM#_Z`2rpY8#D-rOY6_S{uf;|m)ZaT From db35fe06ef440bb7320bc1d01e4303b745baefa6 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Thu, 12 Mar 2026 14:59:27 +0700 Subject: [PATCH 008/192] fix : registry edit --- .../views/edit/components/DialogForm.vue | 56 ++++++++++--------- .../views/edit/components/FormPosition.vue | 7 ++- .../views/edit/components/Table.vue | 2 - 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/modules/04_registryPerson/views/edit/components/DialogForm.vue b/src/modules/04_registryPerson/views/edit/components/DialogForm.vue index 866ec62cd..30ae14be7 100644 --- a/src/modules/04_registryPerson/views/edit/components/DialogForm.vue +++ b/src/modules/04_registryPerson/views/edit/components/DialogForm.vue @@ -295,7 +295,7 @@ async function onDefineData(index: number) { if (newData) { const salaryNew = newData.salaryNew; - const salaryOld = newData.salaryOld; + const salaryOld = newData?.salaryOld; formData.commandCode = salaryNew.commandCode; formData.commandNo = salaryNew.commandNo; @@ -325,32 +325,34 @@ async function onDefineData(index: number) { formData.posNumCodeSit = salaryNew.posNumCodeSit; formData.posNumCodeSitAbb = salaryNew.posNumCodeSitAbb; - formReadonly.commandCode = salaryOld.commandCode; - formReadonly.commandNo = salaryOld.commandNo; - formReadonly.commandYear = salaryOld.commandYear; - formReadonly.commandDateAffect = salaryOld.commandDateAffect; - formReadonly.commandDateSign = salaryOld.commandDateSign; - formReadonly.posNoAbb = salaryOld.posNoAbb; - formReadonly.posNo = salaryOld.posNo; - formReadonly.positionName = salaryOld.positionName; - formReadonly.positionType = salaryOld.positionType; - formReadonly.positionLevel = salaryOld.positionLevel; - formReadonly.positionCee = salaryOld.positionCee; - formReadonly.positionLine = salaryOld.positionLine; - formReadonly.positionPathSide = salaryOld.positionPathSide; - formReadonly.positionExecutive = salaryOld.positionExecutive; - formReadonly.positionExecutiveField = salaryOld.positionExecutiveField; - formReadonly.amount = salaryOld.amount; - formReadonly.positionSalaryAmount = salaryOld.positionSalaryAmount; - formReadonly.mouthSalaryAmount = salaryOld.mouthSalaryAmount; - formReadonly.orgRoot = salaryOld.orgRoot; - formReadonly.orgChild1 = salaryOld.orgChild1; - formReadonly.orgChild2 = salaryOld.orgChild2; - formReadonly.orgChild3 = salaryOld.orgChild3; - formReadonly.orgChild4 = salaryOld.orgChild4; - formReadonly.remark = salaryOld.remark; - formReadonly.posNumCodeSit = salaryOld.posNumCodeSit; - formReadonly.posNumCodeSitAbb = salaryOld.posNumCodeSitAbb; + if (salaryOld) { + formReadonly.commandCode = salaryOld.commandCode; + formReadonly.commandNo = salaryOld.commandNo; + formReadonly.commandYear = salaryOld.commandYear; + formReadonly.commandDateAffect = salaryOld.commandDateAffect; + formReadonly.commandDateSign = salaryOld.commandDateSign; + formReadonly.posNoAbb = salaryOld.posNoAbb; + formReadonly.posNo = salaryOld.posNo; + formReadonly.positionName = salaryOld.positionName; + formReadonly.positionType = salaryOld.positionType; + formReadonly.positionLevel = salaryOld.positionLevel; + formReadonly.positionCee = salaryOld.positionCee; + formReadonly.positionLine = salaryOld.positionLine; + formReadonly.positionPathSide = salaryOld.positionPathSide; + formReadonly.positionExecutive = salaryOld.positionExecutive; + formReadonly.positionExecutiveField = salaryOld.positionExecutiveField; + formReadonly.amount = salaryOld.amount; + formReadonly.positionSalaryAmount = salaryOld.positionSalaryAmount; + formReadonly.mouthSalaryAmount = salaryOld.mouthSalaryAmount; + formReadonly.orgRoot = salaryOld.orgRoot; + formReadonly.orgChild1 = salaryOld.orgChild1; + formReadonly.orgChild2 = salaryOld.orgChild2; + formReadonly.orgChild3 = salaryOld.orgChild3; + formReadonly.orgChild4 = salaryOld.orgChild4; + formReadonly.remark = salaryOld.remark; + formReadonly.posNumCodeSit = salaryOld.posNumCodeSit; + formReadonly.posNumCodeSitAbb = salaryOld.posNumCodeSitAbb; + } } } diff --git a/src/modules/04_registryPerson/views/edit/components/FormPosition.vue b/src/modules/04_registryPerson/views/edit/components/FormPosition.vue index 60a2cf9ff..e46ae2782 100644 --- a/src/modules/04_registryPerson/views/edit/components/FormPosition.vue +++ b/src/modules/04_registryPerson/views/edit/components/FormPosition.vue @@ -33,9 +33,9 @@ const posExecutiveOptions = defineModel("posExecutiveOptions", { required: true, }); -const props = defineProps({ - updateSelectType: { type: Function, defult: () => {} }, -}); +const props = defineProps<{ + updateSelectType?: (value: any) => void; +}>(); /** * ฟิลเตอร์ข้อมูลจาก input @@ -388,6 +388,7 @@ function classInput(val: boolean) { hide-selected fill-input clearable + @clear="formData.positionLevel = ''" input-debounce="0" @update:model-value="props.updateSelectType" @filter="(inputValue: string, diff --git a/src/modules/04_registryPerson/views/edit/components/Table.vue b/src/modules/04_registryPerson/views/edit/components/Table.vue index 2c025f97e..7d99fd725 100644 --- a/src/modules/04_registryPerson/views/edit/components/Table.vue +++ b/src/modules/04_registryPerson/views/edit/components/Table.vue @@ -307,8 +307,6 @@ const isAddPosition = ref(true); // สถานะการเพิ /** function fetch ข้อมูลรายการตำแหน่งเงินเดือน*/ async function fetchData() { isLoad.value = true; - rowsMain.value = []; - rows.value = []; const paht = tabs.value === "PENDING" ? `/${empType.value}/${profileId.value}` From bea848334a3714e798ac6ea0d4a6622382a94d7a Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Thu, 12 Mar 2026 15:11:08 +0700 Subject: [PATCH 009/192] fix(registry-edit) : input autocomplete --- .../views/edit/components/FormPosition.vue | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/modules/04_registryPerson/views/edit/components/FormPosition.vue b/src/modules/04_registryPerson/views/edit/components/FormPosition.vue index e46ae2782..c30fec131 100644 --- a/src/modules/04_registryPerson/views/edit/components/FormPosition.vue +++ b/src/modules/04_registryPerson/views/edit/components/FormPosition.vue @@ -364,6 +364,8 @@ function classInput(val: boolean) { :label="empType === 'officer' ? 'ตำแหน่งในสายงาน' : 'ตำแหน่ง'" :rules="isAddPosition ? [(val: string) => !!val || `${empType === 'officer' ? 'ตำแหน่งในสายงาน' : 'ตำแหน่ง'}` ] :[]" hide-bottom-space + autocomplete="on" + name="positionName" /> @@ -462,6 +464,8 @@ function classInput(val: boolean) { v-model="formData.positionLine" hide-bottom-space :label="`${'สายงาน'}`" + autocomplete="on" + name="positionLine" /> + { size="xs" name="mdi-account-check" /> -
หมอบหมายคำสั่ง
+
มอบหมายคำสั่ง
From 52cfa6e0af5a99f1b533a2431d3c330b1be1874b Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Mon, 16 Mar 2026 10:14:03 +0700 Subject: [PATCH 014/192] fix(registry): add reactive-rules rule prefix rank --- .../detail/PersonalInformation/01_Profile.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/modules/04_registryPerson/components/detail/PersonalInformation/01_Profile.vue b/src/modules/04_registryPerson/components/detail/PersonalInformation/01_Profile.vue index 8f54e02cd..7730029f7 100644 --- a/src/modules/04_registryPerson/components/detail/PersonalInformation/01_Profile.vue +++ b/src/modules/04_registryPerson/components/detail/PersonalInformation/01_Profile.vue @@ -406,6 +406,12 @@ function calculateMinDate() { return today; } +function prefixRankRule() { + return [ + () => !!formData.rank || !!formData.prefix || "กรุณาเลือกคำนำหน้าชื่อ หรือยศ", + ]; +} + /** ดูการเปลี่ยนแปลงของวันเกิดเมื่อมีการเปลี่ยนแปลงจะคำนวนอายูใหม่*/ watch( () => formData.birthDate, @@ -599,7 +605,8 @@ onMounted(() => { class="inputgreen" :options="store.Ops.prefixOps" :label="dataLabel.prefix" - :rules="[(val: string) => !!formData.rank || !!formData.prefix || `${'กรุณาเลือกคำนำหน้าชื่อ หรือยศ'}`]" + :rules="prefixRankRule()" + reactive-rules @filter="(inputValue: string, doneFn: Function) => filterSelector(inputValue, doneFn, 'prefixOps' )" @@ -620,7 +627,8 @@ onMounted(() => { input-debounce="0" option-label="name" option-value="name" - :rules="[(val: string) => !!formData.rank || !!formData.prefix || `${'กรุณาเลือกคำนำหน้าชื่อ หรือยศ'}`]" + :rules="prefixRankRule()" + reactive-rules v-model="formData.rank" class="inputgreen" :options="store.Ops.rankOps" From 1d99705b651cec37be47e12ded423c465d9dafbd Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Tue, 24 Mar 2026 10:01:34 +0700 Subject: [PATCH 015/192] fix(registry-officer): add field leaveSubTypeName and coupleDayLevelCountry form leave --- .../detail/GovernmentInformation/03_Leave.vue | 59 ++++++++++++++++++- .../interface/index/leave.ts | 3 + 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/modules/04_registryPerson/components/detail/GovernmentInformation/03_Leave.vue b/src/modules/04_registryPerson/components/detail/GovernmentInformation/03_Leave.vue index 726ed821a..721542aba 100644 --- a/src/modules/04_registryPerson/components/detail/GovernmentInformation/03_Leave.vue +++ b/src/modules/04_registryPerson/components/detail/GovernmentInformation/03_Leave.vue @@ -202,6 +202,17 @@ const pagination = ref({ const columnsHistory = ref(baseColumns.value); const visibleColumnsHistory = ref(baseVisibleColumns.value); +/** รายการประเภทการลาของ ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน*/ +const leaveSubTypeName = ref(""); +const optionSubTypeName = ref([ + "ศึกษาต่อ", + "ฝึกอบรม", + "ปฎิบัติการวิจัย", + "ดูงาน", +]); + +const coupleDayLevelCountry = ref(""); + /** function fetch ข้อมูลรายการลา*/ async function getData() { showLoader(); @@ -213,6 +224,7 @@ async function getData() { ...item, id: item.id, typeLeave: item.leaveType.name, + codeLeave: item.leaveType.code, code: item.leaveType.refCommandDate, dateStartLeave: item.dateLeaveStart, dateEndLeave: item.dateLeaveEnd, @@ -292,8 +304,10 @@ function openDialogEdit(props: DetailData) { typeLeave.value = { id: props.typeLeaveId, name: props.typeLeave, - code: props.code, + code: props.codeLeave, }; + leaveSubTypeName.value = props.leaveSubTypeName; + coupleDayLevelCountry.value = props.coupleDayLevelCountry; statLeave.value = props.status; reason.value = props.reason; dateRange.value = [ @@ -316,6 +330,10 @@ function onSubmit() { const body = { leaveTypeId: typeLeave.value?.id, + leaveSubTypeName: + typeLeave.value?.code === "LV-008" ? leaveSubTypeName.value : undefined, + coupleDayLevelCountry: + typeLeave.value?.code === "LV-010" ? coupleDayLevelCountry.value : undefined, dateLeaveStart: dateToISO(dateRange.value[0]), dateLeaveEnd: dateToISO(dateRange.value[1]), leaveDays: numLeave.value, @@ -451,6 +469,8 @@ function closeDialog() { dateRange.value = [new Date(), new Date()]; numLeave.value = 1; numUsedLeave.value = 0; + leaveSubTypeName.value = ""; + coupleDayLevelCountry.value = ""; } function statusLeave(val: string) { @@ -741,6 +761,43 @@ onMounted(() => { ) " /> + +
+ + +
Date: Tue, 24 Mar 2026 13:08:17 +0700 Subject: [PATCH 016/192] feat:Change Round Multiple --- .../components/03_ChangeRound/DialogForm.vue | 57 +- .../09_leave/interface/request/changeRound.ts | 2 + .../09_leave/stores/ChangeRoundStore.ts | 2 + .../09_leave/views/03_ChangeRoundMain.vue | 486 +++++++++++------- 4 files changed, 358 insertions(+), 189 deletions(-) diff --git a/src/modules/09_leave/components/03_ChangeRound/DialogForm.vue b/src/modules/09_leave/components/03_ChangeRound/DialogForm.vue index 0448729fb..59a5c8be2 100644 --- a/src/modules/09_leave/components/03_ChangeRound/DialogForm.vue +++ b/src/modules/09_leave/components/03_ChangeRound/DialogForm.vue @@ -27,7 +27,11 @@ const { convertDateToAPI, } = mixin; -const emit = defineEmits(["update:change-page"]); +const emit = defineEmits(["update:change-page", "update:selected"]); + +const isMultiple = defineModel("isMultiple", { + default: false, +}); /**Props */ const props = defineProps({ @@ -40,6 +44,10 @@ const props = defineProps({ type: String, default: "", }, + selectedMultiple: { + type: Array, + default: () => [], + }, }); /**FormData */ @@ -118,18 +126,35 @@ function onSubmit() { async function changeRound() { const formattedDateForAPI = await convertDateToAPI(formData.effectiveDate); - const url = + const urlAPI = props.type == "emp" ? config.API.leaveRoundEMP() : config.API.leaveRound(); showLoader(); - await http - .post(url, { + + const urlFull = isMultiple.value ? urlAPI + `/multiple ` : urlAPI; + let payload: any; + if (isMultiple.value && props.selectedMultiple.length > 0) { + payload = props.selectedMultiple.map((item: any) => ({ + profileId: item.profileId, + roundId: formData.round, + effectiveDate: formattedDateForAPI, + remark: formData.reson, + })); + } else { + payload = { profileId: props.personId, roundId: formData.round, effectiveDate: formattedDateForAPI, remark: formData.reson, - }) + }; + } + await http + .post(urlFull, payload) .then(() => { success($q, "บันทึกข้อมูลเปลี่ยนรอบเวลา"); + if (isMultiple.value) { + emit("update:selected"); + isMultiple.value = false; + } props.closeDialog?.(); }) .catch((err) => { @@ -242,10 +267,10 @@ watch( ? "เปลี่ยนรอบการปฏิบัติงาน" : "ประวัติการเปลี่ยนรอบการปฏิบัติงาน" }} - {{ - props.DataRow ? props.DataRow.fullName : "" - }} + + {{ props.DataRow ? props.DataRow.fullName : "" }} + +
-
+
- รอบปัจจุบัน - {{ - props.DataRow ? `${props.DataRow.currentRound} น.` : "" - }} + + รอบปัจจุบัน + + + {{ props.DataRow ? `${props.DataRow.currentRound} น.` : "" }} +
diff --git a/src/modules/09_leave/interface/request/changeRound.ts b/src/modules/09_leave/interface/request/changeRound.ts index ed8c9347a..b00d7ffba 100644 --- a/src/modules/09_leave/interface/request/changeRound.ts +++ b/src/modules/09_leave/interface/request/changeRound.ts @@ -4,6 +4,8 @@ interface DataPost { lastName: string; page: number; pageSize: number; + selectedNodeId: string | null; + selectNode: string; } interface DataOption { diff --git a/src/modules/09_leave/stores/ChangeRoundStore.ts b/src/modules/09_leave/stores/ChangeRoundStore.ts index eda800a4f..0b883fb4b 100644 --- a/src/modules/09_leave/stores/ChangeRoundStore.ts +++ b/src/modules/09_leave/stores/ChangeRoundStore.ts @@ -138,6 +138,8 @@ export const useChangeRoundDataStore = defineStore( page: dataDetail.page, //หน้า pageSize: dataDetail.pageSize || 10, //จำนวนแถวต่อหน้า keyword: dataDetail.keyword || "", //keyword ค้นหา + selectedNodeId: dataDetail.selectedNodeId, //id ต้นไม้ที่เลือก + selectNode: dataDetail.selectNode, //ระดับต้นไม้ที่เลือก }) .then((res) => { const apiData = res.data.result.data; diff --git a/src/modules/09_leave/views/03_ChangeRoundMain.vue b/src/modules/09_leave/views/03_ChangeRoundMain.vue index fdb7433d5..a123f3f0b 100644 --- a/src/modules/09_leave/views/03_ChangeRoundMain.vue +++ b/src/modules/09_leave/views/03_ChangeRoundMain.vue @@ -7,13 +7,17 @@ import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import { useChangeRoundDataStore } from "@/modules/09_leave/stores/ChangeRoundStore"; import { checkPermission } from "@/utils/permissions"; +import { useStructureTree } from "@/stores/structureTree"; +import { useRoute } from "vue-router"; import type { DataPost } from "@/modules/09_leave/interface/request/changeRound"; import Dialogform from "@/modules/09_leave/components/03_ChangeRound/DialogForm.vue"; /** useStore */ +const route = useRoute(); const mixin = useCounterMixin(); + const { showLoader, hideLoader, @@ -23,6 +27,7 @@ const { dialogConfirm, } = mixin; const dataStore = useChangeRoundDataStore(); +const { fetchStructureTree } = useStructureTree(); /** use */ const $q = useQuasar(); @@ -38,8 +43,23 @@ const formData = reactive({ lastName: "", page: 1, pageSize: 10, + selectedNodeId: null, + selectNode: "", }); +/** โครงสร้างข้อมูลต้นไม้ขององค์กร **/ +const nodeTree = ref([]); +const expanded = ref([]); +const orgTreeId = ref(null); +const filter = ref(""); +const selected = ref([]); +const isMultiple = ref(false); + +/** function fetch ข้อมูลของ Tree*/ +async function fetchDataTree() { + nodeTree.value = await fetchStructureTree(route.meta.Key as string, true); +} + /** * Function openPopup * @param check action edit,history @@ -87,6 +107,7 @@ async function OpenmodalFix(detail: any) { function closeDialog() { modal.value = false; modalFix.value = false; + isMultiple.value = false; } function save() { @@ -120,11 +141,26 @@ function updatePagination(newPagination: any) { /** Function ค้นหาข้อมูล */ async function searchData() { - if (formData.cardId || formData.firstName || formData.lastName) { - await dataStore.fetchDataForCardId(formData); - } else { - dialogMessageNotify($q, "กรุณากรอกข้อมูลอย่างน้อย 1 ช่อง"); - } + await dataStore.fetchDataForCardId(formData); +} + +function onSelectedOrgTree(data: any) { + selected.value = []; + orgTreeId.value = data.orgTreeId; + formData.selectedNodeId = data.orgTreeId; + formData.selectNode = data.orgLevel; + formData.page = 1; + searchData(); +} + +function handleSelectMultiple() { + modal.value = true; + isMultiple.value = true; + editCheck.value = "edit"; +} + +function resetSelected() { + selected.value = []; } watch( @@ -136,6 +172,7 @@ watch( ); onMounted(() => { + fetchDataTree(); dataStore.rows = []; }); @@ -143,181 +180,266 @@ onMounted(() => {
เปลี่ยนแปลงรอบการปฏิบัติงานของข้าราชการ
- -
- -
- ค้นหารายชื่อ + + + + +
+ + +
-
- + - - - ค้นหา + + +
+
+ + +
+ +
+ ค้นหารายชื่อ +
+
+ + + + ค้นหา +
+
+
+
+ ไม่พบข้อมูล
-
-
-
- ไม่พบข้อมูล -
-
- - - - + + +
+ +
@@ -328,6 +450,9 @@ onMounted(() => { :DataRow="DataRow" :personId="DataRow == null ? '' : DataRow.profileId" @update:change-page="dataStore.changePage" + v-model:isMultiple="isMultiple" + :selectedMultiple="selected" + @update:selected="resetSelected" /> @@ -384,4 +509,19 @@ onMounted(() => { .q-table tbody td:before.no-background { background: none; } + +.tree-container { + overflow: auto; + height: 75vh; + border: 1px solid #e6e6e7; + border-radius: 10px; +} + +.my-list-link { + color: rgb(118, 168, 222); + border-radius: 5px; + background: #a3d3fb48 !important; + font-weight: 600; + border: 1px solid rgba(175, 185, 196, 0.217); +} From ecc10e16c9030cbe54d478f64beb9dee1eb50830 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Tue, 24 Mar 2026 16:50:26 +0700 Subject: [PATCH 017/192] feat:absentlate --- src/api/registry/api.registry.ts | 6 + .../GovernmentInformation/08_AbsentLate.vue | 424 ++++++++++++++++++ .../08_DialogAbsentLate.vue | 242 ++++++++++ .../detail/GovernmentInformation/Main.vue | 5 + .../interface/response/Government.ts | 19 +- .../04_registryPerson/stores/AbsentLate.ts | 19 + 6 files changed, 714 insertions(+), 1 deletion(-) create mode 100644 src/modules/04_registryPerson/components/detail/GovernmentInformation/08_AbsentLate.vue create mode 100644 src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue create mode 100644 src/modules/04_registryPerson/stores/AbsentLate.ts diff --git a/src/api/registry/api.registry.ts b/src/api/registry/api.registry.ts index 0cbfc086e..f3378e539 100644 --- a/src/api/registry/api.registry.ts +++ b/src/api/registry/api.registry.ts @@ -272,4 +272,10 @@ export default { profileAssistanceReturn: `${env.API_URI}/placement/repatriation`, profileAssistanceUpdateDelete: (type: string) => `${registryNew}${type}/assistance/update-delete/`, + + profileAbsentLate: (type: string) => `${registryNew}${type}/absent-late`, + profileAbsentLateUpdateDelete: (type: string) => `${registryNew}${type}/absent-late/update-delete`, + profileAbsentLateHistory: (id: string, type: string) => + `${registryNew}${type}/absent-late/history/${id}`, + }; diff --git a/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_AbsentLate.vue b/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_AbsentLate.vue new file mode 100644 index 000000000..1ae40bde9 --- /dev/null +++ b/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_AbsentLate.vue @@ -0,0 +1,424 @@ + + + + + diff --git a/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue b/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue new file mode 100644 index 000000000..3bc7b9c3e --- /dev/null +++ b/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/src/modules/04_registryPerson/components/detail/GovernmentInformation/Main.vue b/src/modules/04_registryPerson/components/detail/GovernmentInformation/Main.vue index da7af1456..3f30cf12e 100644 --- a/src/modules/04_registryPerson/components/detail/GovernmentInformation/Main.vue +++ b/src/modules/04_registryPerson/components/detail/GovernmentInformation/Main.vue @@ -14,6 +14,7 @@ import PerformSpecialWork from "@/modules/04_registryPerson/components/detail/Go import ActingPos from "@/modules/04_registryPerson/components/detail/GovernmentInformation/05_ActingPos.vue"; //รักษาการในตำแหน่ง import HelpGovernmentDetail from "@/modules/04_registryPerson/components/detail/GovernmentInformation/06_HelpGovernment.vue"; //ช่วยราชการ import Postion from "@/modules/04_registryPerson/components/detail/GovernmentInformation/07_Position.vue"; +import AbsentLate from "@/modules/04_registryPerson/components/detail/GovernmentInformation/08_AbsentLate.vue"; import { useRegistryNewDataStore } from "@/modules/04_registryPerson/store"; const empType = ref(pathRegistryEmp(route.name?.toString() ?? "")); @@ -47,6 +48,7 @@ const storeRegistry = useRegistryNewDataStore(); + @@ -76,6 +78,9 @@ const storeRegistry = useRegistryNewDataStore(); :citizen-id="storeRegistry.citizenId" /> + + + { + const statusOps = ref([ + { name: "ขาดราชการ", id: "ABSENT" }, + { name: "มาสาย", id: "LATE" }, + ]); + + const stampTypeOps = ref([ + { name: "เต็มวัน", id: "FULL_DAY" }, + { name: "ครึ่งเช้า", id: "MORNING" }, + { name: "ครึ่งบ่าย ", id: "AFTERNOON" }, + ]); + + return { statusOps, stampTypeOps }; +}); From b70d9948c0b879caec576b321952239953b3d60a Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Tue, 24 Mar 2026 17:30:10 +0700 Subject: [PATCH 018/192] fix : orgTreeDnaId --- src/modules/09_leave/interface/request/changeRound.ts | 2 +- src/modules/09_leave/stores/ChangeRoundStore.ts | 2 +- src/modules/09_leave/views/03_ChangeRoundMain.vue | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/09_leave/interface/request/changeRound.ts b/src/modules/09_leave/interface/request/changeRound.ts index b00d7ffba..7dfc20841 100644 --- a/src/modules/09_leave/interface/request/changeRound.ts +++ b/src/modules/09_leave/interface/request/changeRound.ts @@ -5,7 +5,7 @@ interface DataPost { page: number; pageSize: number; selectedNodeId: string | null; - selectNode: string; + selectedNode: string; } interface DataOption { diff --git a/src/modules/09_leave/stores/ChangeRoundStore.ts b/src/modules/09_leave/stores/ChangeRoundStore.ts index 0b883fb4b..b1370e358 100644 --- a/src/modules/09_leave/stores/ChangeRoundStore.ts +++ b/src/modules/09_leave/stores/ChangeRoundStore.ts @@ -139,7 +139,7 @@ export const useChangeRoundDataStore = defineStore( pageSize: dataDetail.pageSize || 10, //จำนวนแถวต่อหน้า keyword: dataDetail.keyword || "", //keyword ค้นหา selectedNodeId: dataDetail.selectedNodeId, //id ต้นไม้ที่เลือก - selectNode: dataDetail.selectNode, //ระดับต้นไม้ที่เลือก + selectedNode: dataDetail.selectedNode, //ระดับต้นไม้ที่เลือก }) .then((res) => { const apiData = res.data.result.data; diff --git a/src/modules/09_leave/views/03_ChangeRoundMain.vue b/src/modules/09_leave/views/03_ChangeRoundMain.vue index a123f3f0b..415615ef9 100644 --- a/src/modules/09_leave/views/03_ChangeRoundMain.vue +++ b/src/modules/09_leave/views/03_ChangeRoundMain.vue @@ -44,7 +44,7 @@ const formData = reactive({ page: 1, pageSize: 10, selectedNodeId: null, - selectNode: "", + selectedNode: "", }); /** โครงสร้างข้อมูลต้นไม้ขององค์กร **/ @@ -147,8 +147,8 @@ async function searchData() { function onSelectedOrgTree(data: any) { selected.value = []; orgTreeId.value = data.orgTreeId; - formData.selectedNodeId = data.orgTreeId; - formData.selectNode = data.orgLevel; + formData.selectedNodeId = data.orgTreeDnaId; + formData.selectedNode = data.orgLevel; formData.page = 1; searchData(); } From 6f495cca9d59503f8e35b41145816d3b9ba4e07c Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Tue, 24 Mar 2026 17:35:55 +0700 Subject: [PATCH 019/192] fix:add filter rowsPerPage = 3000 --- src/modules/09_leave/views/03_ChangeRoundMain.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/09_leave/views/03_ChangeRoundMain.vue b/src/modules/09_leave/views/03_ChangeRoundMain.vue index 415615ef9..eaf03bcc3 100644 --- a/src/modules/09_leave/views/03_ChangeRoundMain.vue +++ b/src/modules/09_leave/views/03_ChangeRoundMain.vue @@ -136,7 +136,8 @@ function save() { * @param newPagination ข้อมูล Pagination ใหม่ */ function updatePagination(newPagination: any) { - formData.pageSize = newPagination.rowsPerPage; + formData.pageSize = + newPagination.rowsPerPage === 0 ? 3000 : newPagination.rowsPerPage; } /** Function ค้นหาข้อมูล */ @@ -314,7 +315,7 @@ onMounted(() => { dense class="custom-header-table" :visible-columns="dataStore.visibleColumns" - :rows-per-page-options="[10, 25, 50, 100]" + :rows-per-page-options="[0, 10, 25, 50, 100]" @update:pagination="updatePagination" selection="multiple" v-model:selected="selected" From 0a5f64c17ca4f228fa7f785f9b663e5e8f51f42e Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 09:18:51 +0700 Subject: [PATCH 020/192] fix: payload profileEmployeeId --- .../GovernmentInformation/08_DialogAbsentLate.vue | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue b/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue index 3bc7b9c3e..0697b5ad9 100644 --- a/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue +++ b/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue @@ -57,16 +57,23 @@ function onSubmit() { dialogConfirm($q, async () => { try { showLoader(); - const playload = { + const payload = { ...form, stampDate: convertDateToAPI(form.stampDate), - profileId: isStatusEdit.value ? undefined : profileId.value, + profileId: + !isStatusEdit.value && empType.value === "" + ? profileId.value + : undefined, + profileEmployeeId: + !isStatusEdit.value && empType.value !== "" + ? profileId.value + : undefined, }; const method = isStatusEdit.value ? "patch" : "post"; const url = isStatusEdit.value ? config.API.profileAbsentLate(empType.value) + `/${rowId.value}` : config.API.profileAbsentLate(empType.value); - await http[method](url, playload); + await http[method](url, payload); success($q, "บันทึกข้อมูลสำเร็จ"); props.fetchData(); closeDialog(); From c6ea0527c7bcec362e10e8d779b931a88ea21f78 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 09:23:19 +0700 Subject: [PATCH 021/192] fix --- src/modules/09_leave/views/03_ChangeRoundMain.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/09_leave/views/03_ChangeRoundMain.vue b/src/modules/09_leave/views/03_ChangeRoundMain.vue index eaf03bcc3..86f0f1195 100644 --- a/src/modules/09_leave/views/03_ChangeRoundMain.vue +++ b/src/modules/09_leave/views/03_ChangeRoundMain.vue @@ -297,8 +297,8 @@ onMounted(() => {
{ dense class="custom-header-table" :visible-columns="dataStore.visibleColumns" - :rows-per-page-options="[0, 10, 25, 50, 100]" + :rows-per-page-options="[10, 25, 50, 100]" @update:pagination="updatePagination" selection="multiple" v-model:selected="selected" From 8359d1fbcabb014be80b5efa50221be39e8f6269 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 09:32:02 +0700 Subject: [PATCH 022/192] fix: rowsPerPage 100 --- src/modules/09_leave/views/03_ChangeRoundMain.vue | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/modules/09_leave/views/03_ChangeRoundMain.vue b/src/modules/09_leave/views/03_ChangeRoundMain.vue index 86f0f1195..fe7943b22 100644 --- a/src/modules/09_leave/views/03_ChangeRoundMain.vue +++ b/src/modules/09_leave/views/03_ChangeRoundMain.vue @@ -23,7 +23,6 @@ const { hideLoader, success, messageError, - dialogMessageNotify, dialogConfirm, } = mixin; const dataStore = useChangeRoundDataStore(); @@ -42,11 +41,16 @@ const formData = reactive({ firstName: "", lastName: "", page: 1, - pageSize: 10, + pageSize: 100, selectedNodeId: null, selectedNode: "", }); +const pagination = ref({ + page: 1, + rowsPerPage: formData.pageSize, +}); + /** โครงสร้างข้อมูลต้นไม้ขององค์กร **/ const nodeTree = ref([]); const expanded = ref([]); @@ -305,6 +309,7 @@ onMounted(() => { @click="handleSelectMultiple()" />
+ { :visible-columns="dataStore.visibleColumns" :rows-per-page-options="[10, 25, 50, 100]" @update:pagination="updatePagination" + v-model:pagination="pagination" selection="multiple" v-model:selected="selected" > From e9c545a18d9010b8ad85a8cf5ab9aa171b802e66 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 10:20:48 +0700 Subject: [PATCH 023/192] feat: add contact banner --- src/components/Dialogs/DialogDebug.vue | 9 ++++++++- src/views/Error404NotFound.vue | 6 ++++++ src/views/ErrorPermission.vue | 6 ++++++ src/views/MainLayout.vue | 8 ++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/components/Dialogs/DialogDebug.vue b/src/components/Dialogs/DialogDebug.vue index 94c5c349f..cd5b3a78d 100644 --- a/src/components/Dialogs/DialogDebug.vue +++ b/src/components/Dialogs/DialogDebug.vue @@ -391,7 +391,14 @@ function onClose() { - + +
+ *พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ + 088-264-9800 +
+ + +
+ + พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ + 088-264-9800 +
diff --git a/src/views/ErrorPermission.vue b/src/views/ErrorPermission.vue index ec5e14aad..49429875f 100644 --- a/src/views/ErrorPermission.vue +++ b/src/views/ErrorPermission.vue @@ -18,6 +18,12 @@ label="กลับหน้าหลัก" no-caps /> + +
+ + พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ + 088-264-9800 +
diff --git a/src/views/MainLayout.vue b/src/views/MainLayout.vue index 369ddee6d..36b6d7ff7 100644 --- a/src/views/MainLayout.vue +++ b/src/views/MainLayout.vue @@ -1282,6 +1282,14 @@ function onViewDetailNoti(url: string) { + +
+ + พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ + 088-264-9800 +
+
+ From 5f48063ae79424b67e82d7c5f7fdb2c195f8c566 Mon Sep 17 00:00:00 2001 From: waruneeauy Date: Wed, 25 Mar 2026 10:27:45 +0700 Subject: [PATCH 024/192] fix layout and select input --- .../08_DialogAbsentLate.vue | 64 +++++++++++-------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue b/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue index 0697b5ad9..4d0311de3 100644 --- a/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue +++ b/src/modules/04_registryPerson/components/detail/GovernmentInformation/08_DialogAbsentLate.vue @@ -90,6 +90,17 @@ function closeDialog() { modal.value = false; } +watch( + () => form.stampType, + (stampType) => { + if (stampType === "FULL_DAY") { + form.stampAmount = "1.0"; + } else if (stampType === "MORNING" || stampType === "AFTERNOON") { + form.stampAmount = "0.5"; + } + } +); + watch( () => modal.value, (newVal) => { @@ -119,29 +130,31 @@ watch(
-
- +
+
+ +
-
+
-
+
-
+
@@ -229,7 +244,6 @@ watch( label="เหตุผล" hide-bottom-space type="textarea" - :rules="[(val:string) => !!val || `${'กรุณากรอกเหตุผล'}`]" />
From 140553666dc8d6da16310e16a0cc44d69cef429f Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 11:05:28 +0700 Subject: [PATCH 025/192] fix --- src/components/Dialogs/DialogDebug.vue | 10 ++++------ src/components/FooterContact.vue | 13 +++++++++++++ src/views/MainLayout.vue | 9 +++------ 3 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 src/components/FooterContact.vue diff --git a/src/components/Dialogs/DialogDebug.vue b/src/components/Dialogs/DialogDebug.vue index cd5b3a78d..e84ef99da 100644 --- a/src/components/Dialogs/DialogDebug.vue +++ b/src/components/Dialogs/DialogDebug.vue @@ -11,6 +11,7 @@ import http from "@/plugins/http"; import config from "@/app.config"; import DialogHeader from "@/components/DialogHeader.vue"; +import FooterContact from "@/components/FooterContact.vue"; const $q = useQuasar(); const store = usePositionKeycloakStore(); @@ -391,12 +392,9 @@ function onClose() { - -
- *พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ - 088-264-9800 + +
+
+
+ + + พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ + 088-264-9800 + +
+ + + + + diff --git a/src/views/MainLayout.vue b/src/views/MainLayout.vue index 36b6d7ff7..3812a311d 100644 --- a/src/views/MainLayout.vue +++ b/src/views/MainLayout.vue @@ -28,6 +28,7 @@ import { tabList, tabListPlacement } from "../interface/request/main/main"; import LoginLinkage from "@/components/LoginLinkage.vue"; import DialogDebug from "@/components/Dialogs/DialogDebug.vue"; +import FooterContact from "@/components/FooterContact.vue"; // landing page config url const configParam = { @@ -1282,12 +1283,8 @@ function onViewDetailNoti(url: string) { - -
- - พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ - 088-264-9800 -
+ + From 2b0d3340ee4c838ff288d3b6d3d5ae56b87a4a92 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 11:54:34 +0700 Subject: [PATCH 026/192] fix:tel --- src/components/FooterContact.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/FooterContact.vue b/src/components/FooterContact.vue index fe2123415..3aa672f3c 100644 --- a/src/components/FooterContact.vue +++ b/src/components/FooterContact.vue @@ -3,7 +3,8 @@ พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ - 088-264-9800 +
088-264-9800 +
From 59c188a3a99ba5bce70631bc40b9fc136d541a89 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 11:59:14 +0700 Subject: [PATCH 027/192] fix:tel --- src/components/FooterContact.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/FooterContact.vue b/src/components/FooterContact.vue index 3aa672f3c..d8d7236c5 100644 --- a/src/components/FooterContact.vue +++ b/src/components/FooterContact.vue @@ -3,8 +3,9 @@ พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ - 088-264-9800 - + 088-264-9800 +
From c066ee577a8ecc706b7dbf2da90c074d9c572efd Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 12:10:53 +0700 Subject: [PATCH 028/192] fix: style --- src/components/FooterContact.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/FooterContact.vue b/src/components/FooterContact.vue index d8d7236c5..45082f566 100644 --- a/src/components/FooterContact.vue +++ b/src/components/FooterContact.vue @@ -4,7 +4,9 @@ พบปัญหาการใช้งานกรุณาติดต่อผู้ดูแลระบบ 088-264-9800 + >088-264-9800
From 263e122b60cafe089e7c3783a7b6ea28be396569 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 15:05:49 +0700 Subject: [PATCH 029/192] fix: payload multiple --- .../09_leave/components/03_ChangeRound/DialogForm.vue | 8 ++++++++ src/modules/09_leave/stores/ChangeRoundStore.ts | 1 + 2 files changed, 9 insertions(+) diff --git a/src/modules/09_leave/components/03_ChangeRound/DialogForm.vue b/src/modules/09_leave/components/03_ChangeRound/DialogForm.vue index 59a5c8be2..954827e64 100644 --- a/src/modules/09_leave/components/03_ChangeRound/DialogForm.vue +++ b/src/modules/09_leave/components/03_ChangeRound/DialogForm.vue @@ -138,6 +138,14 @@ async function changeRound() { roundId: formData.round, effectiveDate: formattedDateForAPI, remark: formData.reson, + firstName: item.firstName, + lastName: item.lastName, + prefix: item.prefix, + rootDnaId: item.rootDnaId, + child1DnaId: item.child1DnaId, + child2DnaId: item.child2DnaId, + child3DnaId: item.child3DnaId, + child4DnaId: item.child4DnaId, })); } else { payload = { diff --git a/src/modules/09_leave/stores/ChangeRoundStore.ts b/src/modules/09_leave/stores/ChangeRoundStore.ts index b1370e358..4d34b5872 100644 --- a/src/modules/09_leave/stores/ChangeRoundStore.ts +++ b/src/modules/09_leave/stores/ChangeRoundStore.ts @@ -150,6 +150,7 @@ export const useChangeRoundDataStore = defineStore( if (apiData.length > 0) { checkCilck.value = false; rows.value = apiData.map((e: any) => ({ + ...e, profileId: e.profileId, cardId: e.citizenId, fullName: e.fullName, From 5830d2411867149b8fb0958cb504facd56246444 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 16:55:15 +0700 Subject: [PATCH 030/192] refactor(ui): apply +543 year formatting to columns --- src/modules/03_recruiting/views/02_qualify/DisablePeriod.vue | 2 +- .../components/detail/Achievement/03_Insignia.vue | 2 +- src/modules/07_insignia/components/2_Manage/InfoInsignia.vue | 2 +- src/modules/14_KPI/views/01_kpiRound.vue | 2 +- src/modules/15_development/views/EmployeeHistory.vue | 2 +- src/modules/15_development/views/History.vue | 2 +- src/modules/15_development/views/MainPage.vue | 2 +- src/modules/15_development/views/Scholarship.vue | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/modules/03_recruiting/views/02_qualify/DisablePeriod.vue b/src/modules/03_recruiting/views/02_qualify/DisablePeriod.vue index 15ecf3039..d23684dea 100644 --- a/src/modules/03_recruiting/views/02_qualify/DisablePeriod.vue +++ b/src/modules/03_recruiting/views/02_qualify/DisablePeriod.vue @@ -112,7 +112,7 @@ const columns = ref([ headerStyle: "font-size: 14px", style: "font-size: 14px", format(val, row) { - return `${row.year + 543}`; + return `${row.year ? row.year + 543 : "-"}`; }, sort: (a: number, b: number) => b - a, }, diff --git a/src/modules/04_registryPerson/components/detail/Achievement/03_Insignia.vue b/src/modules/04_registryPerson/components/detail/Achievement/03_Insignia.vue index 5da6c11e0..4c5be3b21 100644 --- a/src/modules/04_registryPerson/components/detail/Achievement/03_Insignia.vue +++ b/src/modules/04_registryPerson/components/detail/Achievement/03_Insignia.vue @@ -92,7 +92,7 @@ const baseColumns = ref([ field: "year", headerStyle: "font-size: 14px", style: "font-size: 14px", - format: (v) => v + 543, + format: (v) => (v ? v + 543 : "-"), sort: (a: string, b: string) => a .toString() diff --git a/src/modules/07_insignia/components/2_Manage/InfoInsignia.vue b/src/modules/07_insignia/components/2_Manage/InfoInsignia.vue index 3330aea56..2cf7b60c3 100644 --- a/src/modules/07_insignia/components/2_Manage/InfoInsignia.vue +++ b/src/modules/07_insignia/components/2_Manage/InfoInsignia.vue @@ -35,7 +35,7 @@ const columns = ref([ field: "year", headerStyle: "font-size: 14px", style: "font-size: 14px", - format: (v) => v + 543, + format: (v) => (v ? v + 543 : "-"), }, { name: "receiveDate", diff --git a/src/modules/14_KPI/views/01_kpiRound.vue b/src/modules/14_KPI/views/01_kpiRound.vue index f6db8904d..46502850b 100644 --- a/src/modules/14_KPI/views/01_kpiRound.vue +++ b/src/modules/14_KPI/views/01_kpiRound.vue @@ -44,7 +44,7 @@ const columns = ref([ field: "year", headerStyle: "font-size: 14px", style: "font-size: 14px", - format: (val) => val + 543, + format: (val) => (val ? val + 543 : "-"), }, { name: "durationKPI", diff --git a/src/modules/15_development/views/EmployeeHistory.vue b/src/modules/15_development/views/EmployeeHistory.vue index 87e7f696e..241666999 100644 --- a/src/modules/15_development/views/EmployeeHistory.vue +++ b/src/modules/15_development/views/EmployeeHistory.vue @@ -67,7 +67,7 @@ const columns = ref([ field: "year", headerStyle: "font-size: 14px", style: "font-size: 14px", - format: (v) => v + 543, + format: (v) => (v ? v + 543 : "-"), }, { name: "citizenId", diff --git a/src/modules/15_development/views/History.vue b/src/modules/15_development/views/History.vue index 76a8079ea..a9806406c 100644 --- a/src/modules/15_development/views/History.vue +++ b/src/modules/15_development/views/History.vue @@ -44,7 +44,7 @@ const columns = ref([ field: "year", headerStyle: "font-size: 14px", style: "font-size: 14px", - format: (v) => v + 543, + format: (v) => (v ? v + 543 : "-"), }, { name: "citizenId", diff --git a/src/modules/15_development/views/MainPage.vue b/src/modules/15_development/views/MainPage.vue index 7db45984f..397fd2b99 100644 --- a/src/modules/15_development/views/MainPage.vue +++ b/src/modules/15_development/views/MainPage.vue @@ -75,7 +75,7 @@ const columns = ref([ field: "year", headerStyle: "font-size: 14px", style: "font-size: 14px ; width:10%", - format: (val) => val + 543, + format: (val) => (val ? val + 543 : "-"), }, { name: "projectName", diff --git a/src/modules/15_development/views/Scholarship.vue b/src/modules/15_development/views/Scholarship.vue index 48d94b36c..12e494ddc 100644 --- a/src/modules/15_development/views/Scholarship.vue +++ b/src/modules/15_development/views/Scholarship.vue @@ -32,7 +32,7 @@ const columns = ref([ headerStyle: "font-size: 14px", style: "font-size: 14px", format(val) { - return val + 543; + return val ? val + 543 : "-"; }, }, { From beef941dfda6a02a826cfc85080b90a4cad6439b Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Wed, 25 Mar 2026 17:08:34 +0700 Subject: [PATCH 031/192] fix: insigniaForm.year --- .../components/detail/Achievement/03_Insignia.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/modules/04_registryPerson/components/detail/Achievement/03_Insignia.vue b/src/modules/04_registryPerson/components/detail/Achievement/03_Insignia.vue index 4c5be3b21..e08b1a073 100644 --- a/src/modules/04_registryPerson/components/detail/Achievement/03_Insignia.vue +++ b/src/modules/04_registryPerson/components/detail/Achievement/03_Insignia.vue @@ -920,9 +920,11 @@ onMounted(async () => { :locale="'th'" :enableTimePicker="false" > - + diff --git a/src/modules/14_KPI/views/report.vue b/src/modules/14_KPI/views/report.vue index f723dd697..23d14d89b 100644 --- a/src/modules/14_KPI/views/report.vue +++ b/src/modules/14_KPI/views/report.vue @@ -876,43 +876,6 @@ onMounted(() => {
- - - -
- - -
- -
- -
-
-
-
- diff --git a/src/modules/21_report/views/05_reportSalary.vue b/src/modules/21_report/views/05_reportSalary.vue index dafbfd3be..786f4dd3a 100644 --- a/src/modules/21_report/views/05_reportSalary.vue +++ b/src/modules/21_report/views/05_reportSalary.vue @@ -807,28 +807,6 @@ onMounted(() => {
- -
- -
-
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
diff --git a/src/modules/09_leave/interface/request/work.ts b/src/modules/09_leave/interface/request/work.ts index e69de29bb..c448c9fc9 100644 --- a/src/modules/09_leave/interface/request/work.ts +++ b/src/modules/09_leave/interface/request/work.ts @@ -0,0 +1,6 @@ +interface FormDataProcess { + startDate: Date | null; + endDate: Date | null; +} + +export type { FormDataProcess }; diff --git a/src/modules/09_leave/interface/response/work.ts b/src/modules/09_leave/interface/response/work.ts index 41df27b5f..af055b794 100644 --- a/src/modules/09_leave/interface/response/work.ts +++ b/src/modules/09_leave/interface/response/work.ts @@ -85,4 +85,24 @@ interface FormDetail { checkInLocationName: string; checkOutLocationName: string; } -export type { TableRows, DataResLog, DataResTime, TableRowsTime, FormDetail }; + +interface DataProcess { + id: string; + createdFullName: string; + createdAt: Date | null; + status: string; + startDate: Date | null; + endDate: Date | null; + processingDate: Date | null; + completedDate: Date | null; + errorMessage: string | null; +} + +export type { + TableRows, + DataResLog, + DataResTime, + TableRowsTime, + FormDetail, + DataProcess, +}; diff --git a/src/modules/09_leave/views/02_WorkingMain.vue b/src/modules/09_leave/views/02_WorkingMain.vue index 99387a4bb..fed615baf 100644 --- a/src/modules/09_leave/views/02_WorkingMain.vue +++ b/src/modules/09_leave/views/02_WorkingMain.vue @@ -1,15 +1,26 @@