feat: add position and salary review

This commit is contained in:
Warunee Tamkoo 2026-01-27 16:21:25 +07:00
parent 226469dd85
commit 9f5d1f7913
9 changed files with 1589 additions and 79 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,76 @@
interface DataSalaryPos {
avatar: string;
avatarName: string;
citizenId: string;
firstName: string;
id: string;
lastName: string;
org: string;
orgRevisionId: string;
orgRootShortName: string;
posExecutive: string;
posLevel: string;
posLevelId: string;
posNo: string;
posType: string;
posTypeId: string;
position: string;
prefix: string;
rank: string;
root: string;
rootId: string;
statusCheckEdit: string;
type: string;
}
interface DataPosition {
no?: number;
amount: number;
amountSpecial: number;
commandCode: string;
commandDateAffect: Date;
commandDateSign: Date;
commandId: string;
commandName: string;
commandNo: string;
commandYear: number;
createdAt: string;
createdFullName: string;
createdUserId: string;
dateGovernment: string;
id: string;
isDelete: boolean;
isEdit: boolean;
isEntry: boolean;
isGovernment: string;
lastUpdateFullName: string;
lastUpdateUserId: string;
lastUpdatedAt: string;
mouthSalaryAmount: number;
order: number;
orgChild1: string;
orgChild2: string;
orgChild3: string;
orgChild4: string;
orgRoot: string;
posNo: string;
posNoAbb: string;
positionCee: string;
positionExecutive: string;
positionLevel: string;
positionLine: string;
positionName: string;
positionPathSide: string;
positionSalaryAmount: number;
positionType: string;
profileEmployeeId: string;
profileId: string;
refId: number;
remark: string;
salaryId: string;
status: string;
posNumCodeSitAbb: string;
posNumCodeSit: string;
}
export type { DataSalaryPos, DataPosition };

View file

@ -0,0 +1,155 @@
interface Pagination {
rowsPerPage: number;
}
interface DataOption {
id: string;
name: string;
}
interface DataOption2 {
id: number;
name: string;
}
interface DataOptionSys {
id: string;
name: string;
system: string;
}
interface DataOptionInsignia {
id: string;
name: string;
typeId: string;
typeName: string;
}
interface DataOptionEducation {
label: string;
value: boolean;
}
interface DataOptionEducationLevel {
label: string;
value: string;
}
interface zipCodeOption {
id: string;
name: string;
zipCode: string;
}
interface InformationOps {
prefixOps: DataOption[];
rankOps: DataOption[];
genderOps: DataOption[];
bloodOps: DataOption[];
statusOps: DataOption[];
religionOps: DataOption[];
employeeClassOps: DataOption[];
employeeTypeOps: DataOption[];
}
interface AddressOps {
provinceOps: DataOption[];
districtOps: DataOption[];
districtCOps: DataOption[];
subdistrictOps: zipCodeOption[];
subdistrictCOps: zipCodeOption[];
}
interface InsigniaOps {
insigniaOptions: DataOptionInsignia[];
}
interface ItemTab {
name: string;
icon: string;
label: string;
}
interface Request {
createdAt: string;
createdFullName: string;
detail: string;
fullname: string;
id: string;
idcard: string;
lastUpdateFullName: string;
lastUpdatedAt: string;
profileId: string;
remark: string;
status: string;
topic: string;
}
interface InsigniasType {
id: string;
createdAt: Date;
createdUserId: string;
lastUpdatedAt: Date;
lastUpdateUserId: string;
createdFullName: string;
lastUpdateFullName: string;
name: string;
isActive: boolean;
insignias: InsigniasTypeSub[];
}
interface InsigniasTypeSub {
id: string;
createdAt: Date;
createdUserId: string;
lastUpdatedAt: Date;
lastUpdateUserId: string;
createdFullName: string;
lastUpdateFullName: string;
name: string;
shortName: string;
level: string;
isActive: string;
note: string;
insigniaTypeId: string;
}
interface ResFileData {
downloadUrl: string;
fileName: string;
path: string;
pathname: string;
}
interface DataHistory {
[key: string]: string | number | Date | boolean;
}
interface DataCommandCode {
id: string;
createdAt: Date;
lastUpdatedAt: Date;
createdFullName: string;
lastUpdateFullName: string;
name: string;
code: number;
}
export type {
Pagination,
DataOption,
DataOption2,
DataOptionInsignia,
zipCodeOption,
InformationOps,
AddressOps,
InsigniaOps,
DataOptionSys,
ItemTab,
DataOptionEducation,
DataOptionEducationLevel,
Request,
InsigniasType,
InsigniasTypeSub,
ResFileData,
DataHistory,
DataCommandCode,
};

View file

@ -17,6 +17,8 @@ const requestEditMain = () =>
import("@/modules/10_registry/views/requestEditMain.vue");
const requestEditDetail = () =>
import("@/modules/10_registry/views/requestEditDetail.vue");
const positionReviewPage = () =>
import("@/modules/10_registry/views/positionReview.vue");
export default [
{
@ -93,4 +95,15 @@ export default [
Key: [10],
},
},
// ตรวจสอบข้อมูลตำแหน่งและเงินเดือน
{
path: "/registry/position-review",
name: "position-review",
component: positionReviewPage,
meta: {
Auth: true,
Key: [10],
},
},
];

View file

@ -12,7 +12,7 @@ const {} = mixin;
export const useGovernmentPosDataStore = defineStore("GovernmentPos", () => {
// commandCode ขอตำแหน่ง
const positionCode = ref<number[]>([
0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16,
0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 20,
]);
const commandCodeData = ref<DataOption[]>([]);

View file

@ -52,11 +52,11 @@ async function onClickDownloadKp7(type: string) {
type === "FULL"
? config.API.profileReportId(
store.profileId,
dataStore.officerType == "OFFICER" ? "profile" : "profile-employee"
dataStore.officerType == "OFFICER" ? "profile" : "profile-employee",
)
: config.API.profileKp7ShortId(
store.profileId,
dataStore.officerType == "OFFICER" ? "profile" : "profile-employee"
dataStore.officerType == "OFFICER" ? "profile" : "profile-employee",
);
const fileName = type === "FULL" ? "ทปอ. สามัญ" : "ประวัติแบบย่อ";
await http
@ -78,11 +78,6 @@ const clickBack = () => {
router.push(`/`);
};
/** ฟังก์ชัน redirect ไปหน้ารายการคำร้องขอแก้ไขข้อมูล*/
function redirectToPagePetition() {
router.push(`/registry/request-edit`);
}
function onMobile(type: string) {
router.push(`/registry/${type}`);
}
@ -103,10 +98,20 @@ function onMobile(type: string) {
@click="clickBack"
/>
อมลทะเบยนประว <q-space />
<q-btn
color="blue-6"
icon="mdi-eye"
label="ตรวจสอบข้อมูลตำแหน่งและเงินเดือน"
class="q-mr-sm"
@click="() => router.push('/registry/position-review')"
>
<q-tooltip>ไปยงหนาตรวจสอบขอมลตำแหนงและเงนเดอน</q-tooltip>
</q-btn>
<q-btn
color="primary"
label="ยื่นคำร้องขอแก้ไขข้อมูล"
@click="redirectToPagePetition"
@click="() => router.push('/registry/request-edit')"
>
<q-tooltip>นคำรองขอแกไขขอม</q-tooltip>
</q-btn>

View file

@ -0,0 +1,197 @@
<script setup lang="ts">
import { ref, onMounted } from "vue";
// import { useQuasar } from "quasar";
// import http from "@/plugins/http";
// import config from "@/app.config";
// import { useCounterMixin } from "@/stores/mixin";
import { useRoute, useRouter } from "vue-router";
// import { useDataStore } from "@/stores/data";
/** importType*/
// import type { DataProfile } from "@/modules/04_registryPerson/interface/index/Edit";
import Table from "@/modules/10_registry/components/PositionReview/Table.vue";
// import DialogEdit from "@/modules/04_registryPerson/views/edit/components/DialogEdit.vue";
// const dataStore = useDataStore();
// const $q = useQuasar();
// const { showLoader, hideLoader, messageError, dialogConfirm, success } =
// useCounterMixin();
// const route = useRoute();
const router = useRouter();
const tabs = ref<string>("CHECKED");
const statusCheckEdit = ref<string>("");
// const empType = ref<string>(dataStore.officerType);
// const profileId = ref<string>(dataStore.profileId);
const isConfirmEdit = ref<boolean>(false); //
// const isConfirmDone = ref<boolean>(false); //
// const modalEdit = ref<boolean>(false);
// const modalHistory = ref<boolean>(false);
/** function ยืนยันเสร็จสิ้นการแก้ไข*/
// function onConfirmEdit() {
// dialogConfirm(
// $q,
// () => {
// showLoader();
// http
// .post(config.API.salaryTemp + `/confirm-edit`, {
// profileId: profileId.value,
// type: empType.value?.toLocaleUpperCase(),
// })
// .then(async () => {
// success($q, "");
// })
// .catch((err) => {
// messageError($q, err);
// })
// .finally(() => {
// hideLoader();
// });
// },
// "",
// "?",
// );
// }
/** function ยืนยันข้อมูลถูกต้อง*/
// function onConfirmDone() {
// dialogConfirm(
// $q,
// () => {
// showLoader();
// http
// .post(config.API.salaryTemp + `/confirm-done`, {
// profileId: profileId.value,
// type: empType.value?.toLocaleUpperCase(),
// })
// .then(async () => {
// success($q, "");
// })
// .catch((err) => {
// messageError($q, err);
// })
// .finally(() => {
// hideLoader();
// });
// },
// "",
// "",
// );
// }
</script>
<template>
<div class="row items-center q-gutter-sm q-mb-xs">
<div class="toptitle text-white row items-center q-py-xs">
<q-btn
icon="mdi-arrow-left"
unelevated
round
dense
flat
color="primary"
class="q-mr-sm"
@click="router.go(-1)"
/>
รายการประวตำแหน/เงนเดอน
</div>
</div>
<q-card flat bordered>
<!-- <q-separator v-if="isConfirmEdit || isConfirmDone" />
<q-card-section v-if="isConfirmEdit || isConfirmDone">
<div class="row q-col-gutter-sm justify-center">
<div class="row items-center" v-if="isConfirmEdit">
<q-btn
:disable="
statusCheckEdit === 'EDITED' || statusCheckEdit === 'CHECKED'
"
:color="
statusCheckEdit === 'EDITED' || statusCheckEdit === 'CHECKED'
? 'grey'
: 'public'
"
outline
label="ยืนยันการแก้ไขสำเร็จ"
@click.stop.prevent="onConfirmEdit"
/>
<q-btn
flat
label="ประวัติการดำเนินการ"
class="q-ml-md"
color="blue"
@click="modalHistory = true"
/>
</div>
<div
class="row items-center"
v-if="isConfirmDone && statusCheckEdit === 'EDITED'"
>
<q-btn
color="public"
outline
label="ยืนยันข้อมูลถูกต้อง"
@click.stop.prevent="onConfirmDone"
/>
<q-btn
flat
label="ตีกลับให้แก้ไข"
class="q-ml-md"
color="blue"
@click="modalEdit = true"
/>
</div>
</div>
</q-card-section> -->
<q-separator />
<q-card-section>
<!-- <q-tabs
v-model="tabs"
dense
align="left"
inline-label
class="bg-white text-grey"
active-color="primary"
indicator-color="primary"
>
<q-tab name="PENDING" label="รายการตำแหน่ง/เงินเดือนที่กำลังแก้ไข" />
<q-tab
name="CHECKED"
label="แสดงรายการตำแหน่ง/เงินเดือนหลังจากแก้ไขแล้ว"
/>
</q-tabs>
<q-separator />
<q-tab-panels v-model="tabs" animated>
<q-tab-panel name="PENDING">
<Table
:tabs="tabs"
:status-check-edit="statusCheckEdit"
:is-confirm-edit="isConfirmEdit"
/>
</q-tab-panel>
<q-tab-panel name="CHECKED"> -->
<Table
:tabs="tabs"
:status-check-edit="statusCheckEdit"
:is-confirm-edit="isConfirmEdit"
/>
<!-- </q-tab-panel>
</q-tab-panels> -->
</q-card-section>
</q-card>
<!-- <DialogEdit
v-model:modal="modalEdit"
:emp-type="empType"
:fetch-data="fetchDataProfile"
/> -->
</template>
<style scoped></style>