hrms-user/src/modules/08_KPI/views/mainEvaluator.vue

408 lines
12 KiB
Vue
Raw Normal View History

2024-04-22 09:39:04 +07:00
<script setup lang="ts">
2024-08-29 17:42:11 +07:00
import { ref, onMounted, watch } from "vue";
2024-04-22 09:39:04 +07:00
import { useRouter } from "vue-router";
import { useQuasar } from "quasar";
2024-09-10 11:42:43 +07:00
import type { QTableProps } from "quasar";
import config from "@/app.config";
import http from "@/plugins/http";
2024-09-10 11:42:43 +07:00
import { useCounterMixin } from "@/stores/mixin";
import { useKpiDataStore } from "@/modules/08_KPI/store";
2024-04-22 09:39:04 +07:00
import type {
DataOptions,
Pagination,
} from "@/modules/08_KPI/interface/index/Main";
import type {
ResRound,
ResEvaluatorAssessor,
} from "@/modules/08_KPI/interface/response/index";
2024-04-22 09:39:04 +07:00
import TabAll from "@/modules/08_KPI/components/Evaluator/01_TabAll.vue";
import TabOther from "@/modules/08_KPI/components/Evaluator/02_TabOther.vue";
const $q = useQuasar();
2024-04-22 09:39:04 +07:00
const router = useRouter();
const store = useKpiDataStore();
const { showLoader, hideLoader, messageError, date2Thai } = useCounterMixin();
const dataListMain = ref<ResEvaluatorAssessor[]>([]);
2024-04-22 09:39:04 +07:00
const roundOp = ref<DataOptions[]>([]);
2024-04-22 09:39:04 +07:00
const visibleColumns = ref<string[]>([
"name",
"createdAt",
"evaluationStatus",
2024-05-08 18:13:15 +07:00
"evaluationResults",
]);
2024-04-22 09:39:04 +07:00
const columns = ref<QTableProps["columns"]>([
{
name: "name",
align: "left",
2024-08-14 10:09:23 +07:00
label: "ผู้ขอรับการประเมิน",
2024-04-22 09:39:04 +07:00
sortable: true,
field: "name",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "createdAt",
2024-04-22 09:39:04 +07:00
align: "left",
label: "วันที่สร้างแบบประเมิน",
sortable: true,
field: "createdAt",
2024-04-22 09:39:04 +07:00
headerStyle: "font-size: 14px",
style: "font-size: 14px",
format: (v) => date2Thai(v),
2024-04-22 09:39:04 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "evaluationStatus",
2024-04-22 09:39:04 +07:00
align: "left",
label: "สถานะการประเมิน",
sortable: true,
field: "evaluationStatus",
2024-04-22 09:39:04 +07:00
headerStyle: "font-size: 14px",
style: "font-size: 14px",
2024-05-08 18:13:15 +07:00
format: (v) => store.convertStatus(v),
2024-04-22 09:39:04 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
2024-05-08 18:13:15 +07:00
name: "evaluationResults",
2024-04-22 09:39:04 +07:00
align: "left",
label: "ผลการประเมิน",
sortable: true,
2024-05-08 18:13:15 +07:00
field: "evaluationResults",
2024-04-22 09:39:04 +07:00
headerStyle: "font-size: 14px",
style: "font-size: 14px",
format: (v) => store.convertResults(v),
2024-04-22 09:39:04 +07:00
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
]);
const totalList = ref<number>(0);
const maxPage = ref<number>(1);
2024-09-10 11:42:43 +07:00
/**
* งขอมลรายการขอรบประเมนผลการปฏราชการระดบบคคล
* @param type
*/
2024-08-29 17:42:11 +07:00
async function fetchRoundOption(type: boolean = false) {
showLoader();
2024-08-29 17:42:11 +07:00
await http
.get(
config.API.kpiPeriod +
`?page=${1}&pageSize=${10}&keyword=${""}&year=${store.yearRound}`
)
2024-08-29 17:42:11 +07:00
.then(async (res) => {
const data = await res.data.result.data;
const list = data.map((e: ResRound) => ({
id: e.id,
name:
e.durationKPI === "OCT"
2024-07-12 13:33:29 +07:00
? "รอบที่ 2 ตุลาคม"
: e.durationKPI === "APR"
2024-07-12 13:33:29 +07:00
? "รอบที่ 1 เมษายน"
: "",
}));
roundOp.value = list;
if (type) {
store.formQuery.round = "";
}
2024-08-29 17:42:11 +07:00
await fetchList();
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
2024-09-10 11:42:43 +07:00
/** ดึงข้อมูล list */
2024-08-29 17:42:11 +07:00
async function fetchList() {
showLoader();
const body = {
page: store.formQuery.page,
pageSize: store.formQuery.pageSize,
kpiPeriodId: store.formQuery.round,
keyword: store.formQuery.keyword,
status:
store.tabMainevaluator === "2"
? "NEW"
: store.tabMainevaluator === "4"
? "APPROVE"
: store.tabMainevaluator === "5"
2024-05-16 16:15:57 +07:00
? "EVALUATING_EVALUATOR"
: store.tabMainevaluator === "6"
2024-06-26 13:36:22 +07:00
? "SUMMARY"
: undefined,
reqedit: store.tabMainevaluator === "3" ? "NEW" : undefined,
};
2024-08-29 17:42:11 +07:00
await http
.post(config.API.kpiEvaluation + `/admin`, body)
2024-08-29 17:42:11 +07:00
.then(async (res) => {
const data = await res.data.result;
maxPage.value = Math.ceil(data.total / store.formQuery.pageSize);
totalList.value = data.total;
dataListMain.value = data.data;
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
2024-09-10 11:42:43 +07:00
/** เลือกรอบการประเมิน */
function changRound() {
store.formQuery.page = 1;
fetchList();
}
/**
* function updatePagination
* @param newPagination อม Pagination ใหม
*/
function updatePagination(newPagination: Pagination) {
store.formQuery.page = 1;
store.formQuery.pageSize = newPagination.rowsPerPage;
2024-04-22 09:39:04 +07:00
}
2024-09-10 11:42:43 +07:00
/** เปลี่ยน tab */
2024-07-09 12:46:38 +07:00
async function onChangTab() {
store.formQuery.page = 1;
2024-08-29 17:42:11 +07:00
dataListMain.value = [];
store.selected = [];
await fetchList();
}
2024-09-10 11:42:43 +07:00
watch(
() => store.formQuery.pageSize,
() => {
fetchList();
}
);
2024-04-22 09:39:04 +07:00
onMounted(async () => {
2024-08-29 17:42:11 +07:00
await fetchRoundOption();
2024-04-22 09:39:04 +07:00
});
</script>
<template>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
2024-04-22 09:39:04 +07:00
<q-btn
icon="mdi-arrow-left"
unelevated
round
dense
flat
color="primary"
class="q-mr-sm"
@click="router.push(`/`)"
/>
รายการการประเมนผลการปฏราชการระดบบคคล
</div>
2024-08-29 17:42:11 +07:00
2024-04-22 09:39:04 +07:00
<div class="col-12">
<q-card bordered class="q-pa-md">
2024-05-24 13:52:58 +07:00
<div class="items-center col-12 row q-col-gutter-sm q-mb-sm">
<datepicker
class="col-md-1 col-xs-12"
menu-class-name="modalfix"
v-model="store.yearRound"
:locale="'th'"
autoApply
year-picker
:enableTimePicker="false"
2024-10-30 14:40:02 +07:00
@update:model-value=" store.formQuery.page = 1,fetchRoundOption(true)"
2024-05-24 13:52:58 +07:00
>
<template #year="{ year }">{{ year + 543 }}</template>
<template #year-overlay-value="{ value }">{{
parseInt(value + 543)
}}</template>
<template #trigger>
<q-input
dense
lazy-rules
outlined
hide-bottom-space
:model-value="
!!store.yearRound ? store.yearRound + 543 : null
"
:label="`${'ปีงบประมาณ'}`"
>
<template v-slot:prepend>
<q-icon
name="event"
class="cursor-pointer"
style="color: var(--q-primary)"
>
</q-icon>
</template>
</q-input>
</template>
</datepicker>
<q-select
class="col-md-2 col-xs-12"
v-model="store.formQuery.round"
outlined
label="รอบการประเมิน"
dense
option-label="name"
option-value="id"
:options="roundOp"
emit-value
map-options
@update:model-value="changRound"
/>
2024-04-22 09:39:04 +07:00
<q-space />
2024-05-24 13:52:58 +07:00
<q-input
class="col-md-2 col-xs-12"
outlined
dense
v-model="store.formQuery.keyword"
label="ค้นหาผู้ขอรับการประเมิน"
@keydown.enter.prevent="changRound"
>
<template v-slot:append>
<q-icon
v-if="store.formQuery.keyword !== ''"
name="clear"
class="cursor-pointer"
@click="(store.formQuery.keyword = ''), changRound()"
/>
<q-icon v-else name="search" color="grey-5" />
</template>
</q-input>
<q-select
class="col-md-1 col-xs-12"
v-model="visibleColumns"
multiple
outlined
dense
options-dense
:display-value="$q.lang.table.columns"
emit-value
map-options
:options="columns"
option-value="name"
2024-11-05 16:40:01 +07:00
style="min-width: 140px"
2024-05-24 13:52:58 +07:00
/>
</div>
<div class="col-12">
<q-card bordered class="q-mt-sm">
<q-tabs
v-model="store.tabMainevaluator"
inline-label
align="left"
class="text-grey"
active-color="primary"
indicator-color="primary"
>
<q-tab name="1" label="รายการทั้งหมด" @click="onChangTab" />
2024-05-14 09:50:52 +07:00
<q-tab name="2" label="รออนุมัติข้อตกลง" @click="onChangTab" />
<q-tab
name="3"
label="รออนุมัติแก้ไขข้อตกลง"
@click="onChangTab"
/>
2024-06-26 13:36:22 +07:00
<q-tab name="5" label="รายงานผลสำเร็จ" @click="onChangTab" />
<q-tab name="6" label="สรุปผลการประเมิน" @click="onChangTab" />
</q-tabs>
<q-separator />
<q-tab-panels v-model="store.tabMainevaluator" animated>
<q-tab-panel name="1">
<TabAll
:columns="columns"
:visibleColumns="visibleColumns"
:rows="dataListMain"
:formQuery="store.formQuery"
:total="totalList"
:maxPage="maxPage"
:updatePagination="updatePagination"
:fetchList="fetchList"
/>
</q-tab-panel>
<q-tab-panel name="2">
<TabOther
:columns="columns"
:visibleColumns="visibleColumns"
:rows="dataListMain"
:formQuery="store.formQuery"
:total="totalList"
:maxPage="maxPage"
:updatePagination="updatePagination"
:fetchList="fetchList"
/>
</q-tab-panel>
<q-tab-panel name="3">
<TabOther
:columns="columns"
:visibleColumns="visibleColumns"
:rows="dataListMain"
:formQuery="store.formQuery"
:total="totalList"
:maxPage="maxPage"
:updatePagination="updatePagination"
:fetchList="fetchList"
/>
</q-tab-panel>
<q-tab-panel name="5">
<TabOther
:columns="columns"
:visibleColumns="visibleColumns"
:rows="dataListMain"
:formQuery="store.formQuery"
:total="totalList"
:maxPage="maxPage"
:updatePagination="updatePagination"
:fetchList="fetchList"
/>
</q-tab-panel>
2024-05-16 16:15:57 +07:00
<q-tab-panel name="6">
<TabOther
:columns="columns"
:visibleColumns="visibleColumns"
:rows="dataListMain"
:formQuery="store.formQuery"
:total="totalList"
:maxPage="maxPage"
:updatePagination="updatePagination"
:fetchList="fetchList"
/>
</q-tab-panel>
</q-tab-panels>
</q-card>
</div>
2024-04-22 09:39:04 +07:00
</q-card>
</div>
</div>
</div>
</template>
2024-06-26 13:36:22 +07:00
2024-04-22 09:39:04 +07:00
<style scoped lang="scss">
.icon-color {
color: #4154b3;
}
</style>