hrms-user/src/modules/08_KPI/components/Tab/01_Assessment.vue

245 lines
6.7 KiB
Vue
Raw Normal View History

2024-04-09 15:22:23 +07:00
<script setup lang="ts">
import { ref, onMounted, computed } from "vue";
import { useQuasar } from "quasar";
import { useRoute } from "vue-router";
import DialogListCriteria from "@/modules/08_KPI/components/Tab/Dialog/DialogListCriteria.vue";
import config from "@/app.config";
import http from "@/plugins/http";
2024-04-09 15:22:23 +07:00
2024-04-22 18:14:48 +07:00
import Work from "@/modules/08_KPI/components/Tab/Topic/01_Indicator.vue";
import Competency from "@/modules/08_KPI/components/Tab/Topic/02_Competency.vue";
2024-04-09 15:22:23 +07:00
import { useCounterMixin } from "@/stores/mixin";
import { useKpiDataStore } from "@/modules/08_KPI/store";
import type { ListCriteria } from "@/modules/08_KPI/interface/request/index";
const dataListCriteria = ref<ListCriteria[]>([]);
const modalCriteria = ref<boolean>(false);
const $q = useQuasar();
const route = useRoute();
const { showLoader, hideLoader, messageError } = useCounterMixin();
const store = useKpiDataStore();
const evaluationId = ref<string>(route.params.id.toString());
2024-04-09 15:22:23 +07:00
const rows_01 = ref<any[]>();
const rows_02 = ref<any[]>();
const rows_03 = ref<any[]>();
const totalResults1 = ref<number>(0);
const totalResults2 = ref<number>(0);
const totalResults3 = ref<number>(0);
// const resultWork = ref<number>(0);
2024-04-09 15:22:23 +07:00
function fetchListPlanned() {
showLoader();
http
.get(config.API.kpiAchievement("planned") + `?id=${evaluationId.value}`)
.then((res) => {
const data = res.data.result;
const newRow = data.map((e: any) => ({
...e,
evaluationResults: (e.point / 5) * e.weight,
}));
rows_01.value = newRow;
2024-04-25 16:29:38 +07:00
if (newRow.length > 0) {
const result = newRow.reduce(
(sum: number, e: any) => sum + e.evaluationResults,
0
);
const weight = newRow.reduce(
(sum: number, e: any) => sum + e.weight,
0
);
totalResults1.value = (result * 60) / weight;
}
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
2024-04-09 15:22:23 +07:00
function fetchListRole() {
showLoader();
http
.get(config.API.kpiAchievement("role") + `?id=${evaluationId.value}`)
.then((res) => {
const data = res.data.result;
const newRow = data.map((e: any) => ({
...e,
evaluationResults: (e.point / 5) * e.weight,
}));
rows_02.value = newRow;
2024-04-25 16:29:38 +07:00
if (newRow.length > 0) {
const result = newRow.reduce(
(sum: number, e: any) => sum + e.evaluationResults,
0
);
const weight = newRow.reduce(
(sum: number, e: any) => sum + e.weight,
0
);
totalResults2.value = (result * 60) / weight;
}
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
2024-04-09 15:22:23 +07:00
}
function fetchAssigned() {
showLoader();
http
.get(config.API.kpiAchievement("special") + `?id=${evaluationId.value}`)
.then((res) => {
const data = res.data.result;
const newRow = data.map((e: any) => ({
...e,
evaluationResults: (e.point / 5) * e.weight,
}));
rows_03.value = newRow;
2024-04-25 16:29:38 +07:00
if (newRow.length > 0) {
const result = newRow.reduce(
(sum: number, e: any) => sum + e.evaluationResults,
0
);
const weight = newRow.reduce(
(sum: number, e: any) => sum + e.weight,
0
);
totalResults3.value = (result * 20) / weight;
}
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
function onInfo() {
modalCriteria.value = true;
}
const resultWork = computed(() => {
const total = totalResults1.value + totalResults2.value + totalResults3.value;
2024-04-25 16:29:38 +07:00
return total.toFixed(2);
});
function getCriteria() {
http
.get(config.API.KpiEvaluationInfo)
.then((res) => {
const data = res.data.result.data;
dataListCriteria.value = data;
})
.catch((e) => {
messageError($q, e);
})
.finally(() => {
hideLoader();
});
}
2024-04-09 15:22:23 +07:00
onMounted(() => {
getCriteria()
fetchListPlanned();
fetchListRole();
fetchAssigned();
2024-04-09 15:22:23 +07:00
});
</script>
2024-04-22 18:14:48 +07:00
2024-04-09 15:22:23 +07:00
<template>
<q-scroll-area
style="height: 100vh"
class="bg-white row col-12 text-dark q-pa-md"
>
2024-04-19 15:30:39 +07:00
<div class="text-weight-bold text-body2">
<span class="txt-under text-blue-6">องคประกอบท 1</span>
<span class="q-ml-sm"> ผลสมฤทธของงาน</span>
2024-04-09 15:22:23 +07:00
</div>
<div class="q-gutter-md q-mt-sm">
<!-- องคประกอบท 1 -->
<Work
v-model:data="rows_01"
:title="`1. งานตามแผนปฏิบัติราชการประจำปี`"
:page="1"
:fetchList="fetchListPlanned"
:total="totalResults1"
/>
<Work
v-model:data="rows_02"
:title="`2. งานตามหน้าที่ความรับผิดชอบหลัก`"
:page="2"
:fetchList="fetchListRole"
:total="totalResults2"
/>
<Work
v-model:data="rows_03"
:title="`3. งานที่ได้รับมอบหมายพิเศษ`"
:page="3"
:fetchList="fetchAssigned"
:total="totalResults3"
/>
2024-04-19 15:30:39 +07:00
<div class="row text-body2 text-weight-bold">
<!-- <div class="col-6 text-center row justify-center">
2024-04-09 15:22:23 +07:00
<span>รวมผลการประเม (อยละ) 100</span>
2024-04-19 15:30:39 +07:00
<div class="text-primary q-pl-md">{{ total }}</div>
</div> -->
<div class="col-12 text-center row justify-center">
<span>สรปผลการประเมนผลสมฤทธของงาน (คะแนนเต 80 คะแนน)</span>
<div class="text-primary q-pl-md">{{ resultWork }}</div>
2024-04-09 15:22:23 +07:00
</div>
</div>
2024-04-19 15:30:39 +07:00
<q-separator size="3px" class="q-my-lg" />
2024-04-09 15:22:23 +07:00
<!-- องคประกอบท 2 -->
2024-04-19 15:30:39 +07:00
<div class="text-weight-bold text-body2 q-mb-sm">
<span class="txt-under text-blue-6">องคประกอบท 2</span>
<span class="q-ml-sm"> พฤตกรรมการปฎราชการ (สมรรถนะ)</span>
<q-btn
flat
icon="info"
color="info"
round
class="q-ml-xs"
@click="onInfo"
>
<q-tooltip>เกณฑการประเม</q-tooltip>
</q-btn>
2024-04-09 15:22:23 +07:00
</div>
<Competency v-model:dataListCriteria="dataListCriteria"/>
2024-04-09 15:22:23 +07:00
</div>
</q-scroll-area>
<DialogListCriteria v-model:modal="modalCriteria" v-model:dataListCriteria="dataListCriteria"/>
2024-04-09 15:22:23 +07:00
</template>
2024-04-22 18:14:48 +07:00
2024-04-09 15:22:23 +07:00
<style scoped>
.txt-under {
text-decoration: underline;
}
</style>