แก้รายงาน (ข้อความและการทำงาน)

This commit is contained in:
Warunee Tamkoo 2025-03-31 10:50:40 +07:00
parent e61eb15d66
commit e5f2e71632
14 changed files with 226 additions and 184 deletions

View file

@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import axios from "axios"; import axios from "axios";
import { ref, onMounted } from "vue"; import { ref } from "vue";
import { VuePDF, usePDF } from "@tato30/vue-pdf"; import { VuePDF, usePDF } from "@tato30/vue-pdf";
import { useQuasar } from "quasar"; import { useQuasar } from "quasar";
@ -17,7 +17,7 @@ import genReportXLSX from "@/plugins/genreportxlsx";
const isReport = ref<boolean>(true); const isReport = ref<boolean>(true);
const mixin = useCounterMixin(); const mixin = useCounterMixin();
const $q = useQuasar(); const $q = useQuasar();
const { showLoader, hideLoader, date2Thai, dateToISO, messageError } = mixin; const { showLoader, hideLoader, messageError } = mixin;
const isLoadPDF = ref<boolean>(false); const isLoadPDF = ref<boolean>(false);
@ -150,9 +150,14 @@ function clearFilter() {
detailReport.value = undefined; detailReport.value = undefined;
} }
</script> </script>
<template> <template>
<div class="toptitle text-dark col-12 row items-center"> <div class="toptitle text-dark col-12 row items-center">
รายงานสถสำหรบการสอบแขงข {{
$route.name == "reportExam"
? "รายงานสรรหา"
: "รายงานสถิติสำหรับการสอบแข่งขัน"
}}
</div> </div>
<q-form greedy @submit.prevent @validation-success="getReportRecruit"> <q-form greedy @submit.prevent @validation-success="getReportRecruit">

View file

@ -206,7 +206,7 @@ onMounted(() => {
<template> <template>
<div class="toptitle text-dark col-12 row items-center"> <div class="toptitle text-dark col-12 row items-center">
รายงานบรรจ แตงต าย โอน รายงานการบรรจ แตงต าย โอน
</div> </div>
<q-form greedy @submit.prevent @validation-success="fetchDataReport"> <q-form greedy @submit.prevent @validation-success="fetchDataReport">

View file

@ -228,7 +228,7 @@ onMounted(() => {
<template> <template>
<div class="toptitle text-dark col-12 row items-center"> <div class="toptitle text-dark col-12 row items-center">
รายงานนจากราชการ รายงานการนจากราชการ
</div> </div>
<q-form greedy @submit.prevent @validation-success="fetchDataReport"> <q-form greedy @submit.prevent @validation-success="fetchDataReport">

View file

@ -349,13 +349,13 @@ onMounted(async () => {
<div class="col-12"> <div class="col-12">
<q-card class="q-pa-sm"> <q-card class="q-pa-sm">
<div class="row q-col-gutter-sm no-wrap"> <div class="row q-col-gutter-sm no-wrap">
<div class="col-lg-2 col-md-3 col-sm-3 col-xs-12"> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
<q-select <q-select
outlined outlined
dense dense
v-model="employeeClass" v-model="employeeClass"
:options="employeeClassOption" :options="employeeClassOption"
label="สถานภาพ" label="ประเภทตำแหน่ง"
emit-value emit-value
map-options map-options
option-label="name" option-label="name"

View file

@ -11,8 +11,8 @@ const SpecialTimeMain = () =>
import("@/modules/09_leave/views/04_SpecialTimeMain.vue"); import("@/modules/09_leave/views/04_SpecialTimeMain.vue");
const leaveReport = () => import("@/modules/09_leave/views/06_ReportMain.vue"); const leaveReport = () => import("@/modules/09_leave/views/06_ReportMain.vue");
const CheckinReport = () => // const CheckinReport = () =>
import("@/modules/09_leave/views/07_ReportCheckin.vue"); // import("@/modules/09_leave/views/!07_ReportCheckin.vue");
export default [ export default [
{ {
path: "/round-time", path: "/round-time",
@ -96,9 +96,9 @@ export default [
}, },
{ {
path: "/checkinReport", path: "/checkin-report",
name: "checkinReport", name: "checkinReport",
component: CheckinReport, component: leaveReport,
meta: { meta: {
Auth: true, Auth: true,
Key: "SYS_WORK_REPORT", Key: "SYS_WORK_REPORT",

View file

@ -45,26 +45,49 @@ const dateMonth = ref<DataDateMonthObject>({
year: new Date().getFullYear(), year: new Date().getFullYear(),
}); });
const pageName = ref<string>(route.name as string);
const dateWeek = ref<Date[]>(getCurrentWeek()); const dateWeek = ref<Date[]>(getCurrentWeek());
const date = ref<Date>(new Date()); const date = ref<Date>(new Date());
const typeReport = ref<string>(""); const typeReport = ref<string>("");
const optionReport = ref<DataOption[]>([]); const optionReport = ref<DataOption[]>([]);
const optionReportMain = ref<DataOption[]>([ const optionReportMain = ref<DataOption[]>(
{ route.name?.toString() === "reportLeave"
id: "3", ? [
name: "รายงานการเข้างาน", {
}, id: "3",
{ name: "รายงานการเข้างาน",
id: "4", },
name: "รายงานการเข้างานสาย", {
}, id: "4",
{ id: "1", name: "รายงานการลางานตามประเภทการลา" }, name: "รายงานการเข้างานสาย",
{ },
id: "2", { id: "1", name: "รายงานการลางานตามประเภทการลา" },
name: "รายงานการลางาน จำแนกตามเพศ ประเภทการลา หน่วยงาน/ส่วนราชการ", {
}, id: "2",
]); name: "รายงานการลางาน จำแนกตามเพศ ประเภทการลา หน่วยงาน/ส่วนราชการ",
},
]
: route.name?.toString() === "leaveReport"
? [
{ id: "1", name: "รายงานการลางานตามประเภทการลา" },
{
id: "2",
name: "รายงานการลางาน จำแนกตามเพศ ประเภทการลา หน่วยงาน/ส่วนราชการ",
},
]
: [
{
id: "3",
name: "รายงานการเข้างาน",
},
{
id: "4",
name: "รายงานการเข้างานสาย",
},
]
);
const employeeClass = ref<string>("officer"); const employeeClass = ref<string>("officer");
const yearType = ref<string>("FULL"); const yearType = ref<string>("FULL");
@ -380,14 +403,22 @@ onMounted(() => {
</script> </script>
<template> <template>
<div class="toptitle text-dark col-12 row items-center">ญชแสดงวนลา</div> <div class="toptitle text-dark col-12 row items-center">
{{
pageName === "reportLeave"
? "รายงานบันทึกเวลาและการลา"
: pageName === "leaveReport"
? "รายงานสถิติการลา"
: "รายงานสถิติการลงเวลา"
}}
</div>
<q-form greedy @submit.prevent @validation-success="onSearch"> <q-form greedy @submit.prevent @validation-success="onSearch">
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">
<div class="col-12"> <div class="col-12">
<q-card class="q-pa-sm"> <q-card class="q-pa-sm">
<div class="row q-col-gutter-sm no-wrap"> <div class="row q-col-gutter-sm no-wrap">
<div class="col-lg-2 col-md-3 col-sm-3 col-xs-12"> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
<q-select <q-select
outlined outlined
dense dense
@ -624,7 +655,6 @@ onMounted(() => {
<div class="row q-col-gutter-y-xs"> <div class="row q-col-gutter-y-xs">
<div class="text-grey-8 text-caption">เลอกชวงเวลา</div> <div class="text-grey-8 text-caption">เลอกชวงเวลา</div>
<div class="col-12"> <div class="col-12">
<q-select <q-select
class="bg-white" class="bg-white"
dense dense

View file

@ -298,14 +298,16 @@ onMounted(async () => {
</script> </script>
<template> <template>
<div class="toptitle text-dark col-12 row items-center">รายงานว</div> <div class="toptitle text-dark col-12 row items-center">
รายงานการดำเนนการทางว
</div>
<q-form greedy @submit.prevent @validation-success="onUpdateFilter"> <q-form greedy @submit.prevent @validation-success="onUpdateFilter">
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">
<div class="col-12"> <div class="col-12">
<q-card class="q-pa-sm"> <q-card class="q-pa-sm">
<div class="row q-col-gutter-sm no-wrap"> <div class="row q-col-gutter-sm no-wrap">
<div class="col-lg-2 col-md-3 col-sm-3 col-xs-12"> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
<q-select <q-select
outlined outlined
dense dense

View file

@ -509,7 +509,7 @@ onMounted(() => {
<template> <template>
<div class="toptitle text-dark col-12 row items-center"> <div class="toptitle text-dark col-12 row items-center">
รายงานประเมนผลการปฏราชการระดบบคคล รายงานการประเมนผลฯ ระดบบคคล
</div> </div>
<q-form greedy @submit.prevent @validation-success="fetchReport"> <q-form greedy @submit.prevent @validation-success="fetchReport">
@ -655,7 +655,7 @@ onMounted(() => {
</template> </template>
</datepicker> </datepicker>
</div> </div>
<div class="col-12"><q-separator/></div> <div class="col-12"><q-separator /></div>
<div class="col-12 q-px-sm"> <div class="col-12 q-px-sm">
<q-select <q-select
ref="roundRef" ref="roundRef"
@ -681,8 +681,11 @@ onMounted(() => {
" "
/> />
</div> </div>
<div class="col-12"><q-separator/></div> <div class="col-12"><q-separator /></div>
<div class="col-12 q-pb-xs q-px-sm" v-if="typeReport !== 'KPI8'"> <div
class="col-12 q-pb-xs q-px-sm"
v-if="typeReport !== 'KPI8'"
>
<q-select <q-select
class="bg-white" class="bg-white"
:disable="roundOp.length === 0" :disable="roundOp.length === 0"

View file

@ -16,7 +16,7 @@ import type { OrgRevision } from "@/modules/02_organization/interface/response/o
import TreeView from "@/modules/21_report/components/01_org/Main.vue"; import TreeView from "@/modules/21_report/components/01_org/Main.vue";
import StructureView from "@/modules/02_organization/components/StructureMain.vue"; import StructureView from "@/modules/02_organization/components/StructureMain.vue";
import StructureOrgMain from "@/modules/02_organization/components/StructureOrgMain.vue"; import StructureOrgMain from "@/modules/02_organization/components/StructureOrgMain.vue";
import DialogHeader from "@/components/DialogHeader.vue"; // import DialogHeader from "@/components/DialogHeader.vue";
/** use*/ /** use*/
const $q = useQuasar(); const $q = useQuasar();
@ -34,8 +34,8 @@ const historyId = ref<string>(""); // ID ประวัติโครงสร
const labelHistory = ref<string>("ประวัติโครงสร้าง"); // const labelHistory = ref<string>("ประวัติโครงสร้าง"); //
const count = ref<number>(0); const count = ref<number>(0);
const modalCommand = ref<boolean>(false); // // const modalCommand = ref<boolean>(false); //
const modalRemark = ref<boolean>(false); // // const modalRemark = ref<boolean>(false); //
/** /**
* function เรยกขอมลโครงสราง แบบปนและ แบบราง * function เรยกขอมลโครงสราง แบบปนและ แบบราง
@ -99,19 +99,19 @@ async function fetchHistory() {
}); });
} }
/** // /**
* function openPopup เพมโครงสร // * function openPopup
* @param type ประเภทการเพมโครงาสร // * @param type
*/ // */
function ocClickAddStructure(type: string) { // function ocClickAddStructure(type: string) {
modalNewStructure.value = !modalNewStructure.value; // modalNewStructure.value = !modalNewStructure.value;
typeStructure.value = type; // typeStructure.value = type;
} // }
/** function openPopup ตั้งเวลาเผยแพร่ */ // /** function openPopup */
function onClickDateTime() { // function onClickDateTime() {
modalDateTime.value = !modalDateTime.value; // modalDateTime.value = !modalDateTime.value;
} // }
/** /**
* function เปดประวโครงสราง * function เปดประวโครงสราง
@ -125,18 +125,18 @@ function onClickHistory(id: string, name: string) {
count.value++; count.value++;
} }
async function workflowSystem() { // async function workflowSystem() {
http // http
.get(config.API.workflowKeycloakSystem("SYS_ORG")) // .get(config.API.workflowKeycloakSystem("SYS_ORG"))
.then((res) => { // .then((res) => {
const data = res.data.result; // const data = res.data.result;
store.isOfficer = data.isOfficer; // store.isOfficer = data.isOfficer;
store.isStaff = data.isStaff; // store.isStaff = data.isStaff;
}) // })
.catch((e) => { // .catch((e) => {
messageError($q, e); // messageError($q, e);
}); // });
} // }
async function fetchCheckIslock(id: string) { async function fetchCheckIslock(id: string) {
http http
@ -150,20 +150,20 @@ async function fetchCheckIslock(id: string) {
}); });
} }
watch( // watch(
() => store.typeOrganizational, // () => store.typeOrganizational,
() => { // () => {
if ( // if (
store.typeOrganizational === "draft" && // store.typeOrganizational === "draft" &&
store.isOfficer === null && // store.isOfficer === null &&
store.isStaff === null // store.isStaff === null
) { // ) {
workflowSystem(); // workflowSystem();
} else if (store.typeOrganizational === "draft") { // } else if (store.typeOrganizational === "draft") {
store.rootId = ""; // store.rootId = "";
} // }
} // }
); // );
/** /**
* lifecycleHook ทำงานเมอมการเรยกใช Components * lifecycleHook ทำงานเมอมการเรยกใช Components
@ -177,11 +177,11 @@ onMounted(async () => {
<template> <template>
<div class="row items-center"> <div class="row items-center">
<div class="toptitle text-dark row items-center q-py-xs"> <div class="toptitle text-dark row items-center q-py-xs">
รายงานโครงสรางตรากำล รายงานโครงสรางและกรอบตรากำล
</div> </div>
<q-space /> <q-space />
<div <!-- <div
class="toptitle row items-center" class="toptitle row items-center"
v-if="store.typeOrganizational === 'draft'" v-if="store.typeOrganizational === 'draft'"
> >
@ -202,11 +202,11 @@ onMounted(async () => {
@click="onClickDateTime" @click="onClickDateTime"
> >
</q-btn> </q-btn>
</div> </div> -->
</div> </div>
<q-card flat bordered> <q-card flat bordered>
<div class="q-pa-xl" v-if="!isStatusData"> <!-- <div class="q-pa-xl" v-if="!isStatusData">
<q-card <q-card
flat flat
bordered bordered
@ -244,57 +244,57 @@ onMounted(async () => {
</q-card> </q-card>
</div> </div>
<div v-else> <div v-else> -->
<q-card class="my-card"> <q-card class="my-card">
<q-card-section class="q-pa-sm"> <q-card-section class="q-pa-sm">
<q-toolbar class="q-gutter-md items-center" style="padding: 0px"> <q-toolbar class="q-gutter-md items-center" style="padding: 0px">
<q-btn-group outline> <q-btn-group outline>
<q-btn
dense
class="q-px-md"
:outline="store.typeOrganizational === 'current' ? false : true"
color="blue"
label="ปัจจุบัน"
:disable="store.activeId == '' || store.activeId == null"
@click="
(store.typeOrganizational = 'current'),
(labelHistory = 'ประวัติโครงสร้าง')
"
/>
<q-btn-dropdown
v-if="
checkPermission($route)?.attrOwnership == 'OWNER' &&
itemHistory.length > 0
"
dense
class="q-px-md"
color="blue"
:label="labelHistory"
@click="store.typeOrganizational = 'old'"
:outline="store.typeOrganizational === 'old' ? false : true"
>
<q-list>
<q-item
dense
clickable
v-close-popup
v-for="(item, index) in itemHistory"
:key="index"
@click="onClickHistory(item.id, item.name)"
>
<q-item-section>
<q-item-label
>{{ item.orgRevisionCreatedAt }}
{{ item.name }}</q-item-label
>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
</q-btn-group>
<q-btn <q-btn
dense
class="q-px-md"
:outline="store.typeOrganizational === 'current' ? false : true"
color="blue"
label="ปัจจุบัน"
:disable="store.activeId == '' || store.activeId == null"
@click="
(store.typeOrganizational = 'current'),
(labelHistory = 'ประวัติโครงสร้าง')
"
/>
<q-btn-dropdown
v-if="
checkPermission($route)?.attrOwnership == 'OWNER' &&
itemHistory.length > 0
"
dense
class="q-px-md"
color="blue"
:label="labelHistory"
@click="store.typeOrganizational = 'old'"
:outline="store.typeOrganizational === 'old' ? false : true"
>
<q-list>
<q-item
dense
clickable
v-close-popup
v-for="(item, index) in itemHistory"
:key="index"
@click="onClickHistory(item.id, item.name)"
>
<q-item-section>
<q-item-label
>{{ item.orgRevisionCreatedAt }}
{{ item.name }}</q-item-label
>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
</q-btn-group>
<!-- <q-btn
v-if="store.remark" v-if="store.remark"
flat flat
round round
@ -303,59 +303,59 @@ onMounted(async () => {
@click="modalRemark = true" @click="modalRemark = true"
> >
<q-tooltip>หมายเหต</q-tooltip> <q-tooltip>หมายเหต</q-tooltip>
</q-btn> </q-btn> -->
<q-space /> <q-space />
<q-btn <q-btn
flat flat
dense dense
:color="store.statusView === 'list' ? 'grey-7' : 'grey-4'" :color="store.statusView === 'list' ? 'grey-7' : 'grey-4'"
icon="mdi-file-tree" icon="mdi-file-tree"
@click="store.statusView = 'list'" @click="store.statusView = 'list'"
/>
<q-separator inset vertical />
<q-btn
flat
dense
icon="mdi-sitemap"
:color="store.statusView === 'tree' ? 'grey-7' : 'grey-4'"
@click="store.statusView = 'tree'"
/>
<q-separator inset vertical />
<q-btn
flat
dense
icon="mdi-account-group"
:color="store.statusView === 'org' ? 'grey-7' : 'grey-4'"
@click="store.statusView = 'org'"
/>
</q-toolbar>
</q-card-section>
<q-separator />
<q-card-section style="padding: 0px">
<q-tab-panels v-model="store.statusView" animated>
<q-tab-panel name="list" style="padding: 0px">
<TreeView
v-if="store.statusView === 'list'"
v-model:historyId="historyId"
v-model:count="count"
/> />
<q-separator inset vertical /> </q-tab-panel>
<q-btn
flat
dense
icon="mdi-sitemap"
:color="store.statusView === 'tree' ? 'grey-7' : 'grey-4'"
@click="store.statusView = 'tree'"
/>
<q-separator inset vertical />
<q-btn
flat
dense
icon="mdi-account-group"
:color="store.statusView === 'org' ? 'grey-7' : 'grey-4'"
@click="store.statusView = 'org'"
/>
</q-toolbar>
</q-card-section>
<q-separator />
<q-card-section style="padding: 0px">
<q-tab-panels v-model="store.statusView" animated>
<q-tab-panel name="list" style="padding: 0px">
<TreeView
v-if="store.statusView === 'list'"
v-model:historyId="historyId"
v-model:count="count"
/>
</q-tab-panel>
<q-tab-panel name="tree" style="padding: 0px"> <q-tab-panel name="tree" style="padding: 0px">
<StructureView v-if="store.statusView === 'tree'" /> <StructureView v-if="store.statusView === 'tree'" />
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="org" style="padding: 0px"> <q-tab-panel name="org" style="padding: 0px">
<StructureOrgMain v-if="store.statusView === 'org'" /> <StructureOrgMain v-if="store.statusView === 'org'" />
</q-tab-panel> </q-tab-panel>
</q-tab-panels> </q-tab-panels>
</q-card-section> </q-card-section>
</q-card> </q-card>
</div> <!-- </div> -->
</q-card> </q-card>
<q-dialog v-model="modalRemark"> <!-- <q-dialog v-model="modalRemark">
<q-card style="width: 300px"> <q-card style="width: 300px">
<DialogHeader tittle="หมายเหตุ" :close="() => (modalRemark = false)" /> <DialogHeader tittle="หมายเหตุ" :close="() => (modalRemark = false)" />
@ -368,7 +368,7 @@ onMounted(async () => {
</div> </div>
</q-card-section> </q-card-section>
</q-card> </q-card>
</q-dialog> </q-dialog> -->
</template> </template>
<style scoped></style> <style scoped></style>

View file

@ -832,7 +832,7 @@ watch(
<div class="row col-12 q-gutter-sm"> <div class="row col-12 q-gutter-sm">
<q-card class="col-12 q-pa-sm"> <q-card class="col-12 q-pa-sm">
<div class="row col-12 q-col-gutter-sm no-wrap"> <div class="row col-12 q-col-gutter-sm no-wrap">
<div class="col-lg-2 col-md-3 col-sm-3 col-xs-12"> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
<q-select <q-select
outlined outlined
dense dense

View file

@ -220,7 +220,7 @@ onMounted(async () => {
<template> <template>
<div class="toptitle text-dark col-12 row items-center"> <div class="toptitle text-dark col-12 row items-center">
รายงานโครงการ/หลกสตรการฝกอบรมทหนวยงานของกรงเทพมหานครเปนผ รายงานการพฒนาบคลากร/การศกษาต
</div> </div>
<q-form greedy @submit.prevent @validation-success="getReport"> <q-form greedy @submit.prevent @validation-success="getReport">

View file

@ -161,7 +161,7 @@ onMounted(() => {
<template> <template>
<div class="toptitle text-dark col-12 row items-center"> <div class="toptitle text-dark col-12 row items-center">
รายงานประเมนบคคล รายงานระบบประเมนบคคล
</div> </div>
<q-form greedy @submit.prevent @validation-success="fetchReport"> <q-form greedy @submit.prevent @validation-success="fetchReport">
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">

View file

@ -301,20 +301,22 @@ onMounted(() => {
</script> </script>
<template> <template>
<div class="toptitle text-dark col-12 row items-center">รายงานเงนเดอน</div> <div class="toptitle text-dark col-12 row items-center">
รายงานระบบเงนเดอน
</div>
<q-form greedy @submit.prevent @validation-success="fetchReportPDF"> <q-form greedy @submit.prevent @validation-success="fetchReportPDF">
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">
<div class="col-12"> <div class="col-12">
<q-card class="q-pa-sm"> <q-card class="q-pa-sm">
<div class="row q-col-gutter-sm no-wrap"> <div class="row q-col-gutter-sm no-wrap">
<div class="col-lg-2 col-md-3 col-sm-3 col-xs-12"> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
<q-select <q-select
outlined outlined
dense dense
v-model="employeeClass" v-model="employeeClass"
:options="employeeClassOption" :options="employeeClassOption"
label="สภานภาพ" label="ประเภทตำแหน่ง"
emit-value emit-value
map-options map-options
option-label="name" option-label="name"