From f899f05527fd1d28ed3c6aefb235455288a87050 Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Tue, 24 Mar 2026 13:08:17 +0700 Subject: [PATCH 1/9] 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 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 2/9] 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 3/9] 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 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 4/9] 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 5/9] 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 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 6/9] 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 7/9] 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 8/9] 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" > - +