วินัยรองรับลูกจ้างประจำ กทม.

This commit is contained in:
setthawutttty 2024-12-18 16:39:42 +07:00
parent 77a3e7b57f
commit 9bb81be90d
20 changed files with 370 additions and 106 deletions

View file

@ -66,6 +66,7 @@ export default {
// ค้นหาคนตามเงื่อนไข // ค้นหาคนตามเงื่อนไข
orgSearchPersonal: () => `${organization}/profile/search-personal`, orgSearchPersonal: () => `${organization}/profile/search-personal`,
orgSearchPersonalByType: (type:string) => `${organization}/profile${type}/search-personal`,
/** บรรจุแต่งตั้ง*/ /** บรรจุแต่งตั้ง*/
orgPosPlacement: `${orgPos}/placement/search`, orgPosPlacement: `${orgPos}/placement/search`,

View file

@ -87,8 +87,8 @@ export default {
`${discipline}/director/${disciplineId}/${id}`, `${discipline}/director/${disciplineId}/${id}`,
/** ผู้ถูกพักราชการ */ /** ผู้ถูกพักราชการ */
suspendMain: (page: number, pageSize: number, keyword: string) => suspendMain: (page: number, pageSize: number, keyword: string,type:string) =>
`${suspend}?page=${page}&pageSize=${pageSize}&keyword=${keyword}`, `${suspend}?page=${page}&pageSize=${pageSize}&keyword=${keyword}&profileType=${type}`,
suspendById: (id: string) => `${suspend}/${id}`, suspendById: (id: string) => `${suspend}/${id}`,
suspendReport: () => `${suspend}/report`, suspendReport: () => `${suspend}/report`,

View file

@ -46,6 +46,12 @@ const type = ref<string>("citizenId");
const search = ref<string>(""); const search = ref<string>("");
const selected = ref<any>([]); const selected = ref<any>([]);
const employeeClass = ref<string>("officer");
const employeeClassOption = ref<typeOp[]>([
{ id: "officer", name: "ข้าราชการ กทม. สามัญ" },
{ id: "employee", name: "ลูกจ้างประจำ กทม." },
]);
const typeOps = ref<typeOp[]>([ const typeOps = ref<typeOp[]>([
{ id: "citizenId", name: "เลขประจำตัวประชาชน" }, { id: "citizenId", name: "เลขประจำตัวประชาชน" },
{ id: "fullName", name: "ชื่อ-นามสกุล" }, { id: "fullName", name: "ชื่อ-นามสกุล" },
@ -97,6 +103,7 @@ const emit = defineEmits(["returnData"]);
async function close() { async function close() {
props.close(); props.close();
rows.value = []; rows.value = [];
employeeClass.value = "officer";
search.value = ""; search.value = "";
} }
@ -111,8 +118,9 @@ function savePost() {
/** save data หลังจาก ยืนยัน */ /** save data หลังจาก ยืนยัน */
function saveData() { function saveData() {
props.save(); props.save(selected.value, employeeClass.value);
emit("returnData", selected.value); rows.value = [];
employeeClass.value = "officer";
} }
const searchRef = ref<any>(null); const searchRef = ref<any>(null);
@ -129,11 +137,14 @@ async function getSearch() {
showLoader(); showLoader();
const body = { const body = {
fieldName: type.value, fieldName: type.value,
keyword: search.value ? search.value.trim():'', keyword: search.value ? search.value.trim() : "",
}; };
await http await http
.post( .post(
config.API.orgSearchPersonal()+`?page=${pagination.value.page}&pageSize=${pagination.value.rowsPerPage}`, config.API.orgSearchPersonalByType(
employeeClass.value == "officer" ? "" : "-employee"
) +
`?page=${pagination.value.page}&pageSize=${pagination.value.rowsPerPage}`,
body body
) )
.then((res) => { .then((res) => {
@ -233,7 +244,23 @@ watch(
</q-toolbar> </q-toolbar>
<q-separator /> <q-separator />
<q-card-section class="q-pa-md scroll" style="max-height: 80vh"> <q-card-section class="q-pa-md scroll" style="max-height: 80vh">
<div class="row col-12 q-col-gutter-sm items-start q-mb-sm"> <div class="row q-col-gutter-sm items-start q-mb-sm">
<div class="col-12 col-sm-5 col-md-3">
<q-select
label="สถานภาพ"
v-model="employeeClass"
:options="employeeClassOption"
emit-value
dense
map-options
outlined
option-label="name"
option-value="id"
@update:model-value="rows = []"
/>
</div>
</div>
<div class="row q-col-gutter-sm items-start q-mb-sm">
<div class="col-12 col-sm-5 col-md-3"> <div class="col-12 col-sm-5 col-md-3">
<q-select <q-select
label="ค้นหาจาก" label="ค้นหาจาก"
@ -275,7 +302,7 @@ watch(
<div class="full-width"> <div class="full-width">
<d-table <d-table
ref="table" ref="table"
:columns="mainStore.columnsRespondent" :columns="mainStore.columnsRespondent?.filter((item:any)=>item.name !== 'profileType')"
:rows="rows" :rows="rows"
row-key="personId" row-key="personId"
flat flat
@ -357,6 +384,7 @@ watch(
props.row.salary ? props.row.salary.toLocaleString() : "-" props.row.salary ? props.row.salary.toLocaleString() : "-"
}} }}
</div> </div>
<div v-else> <div v-else>
{{ col.value }} {{ col.value }}
</div> </div>

View file

@ -2,7 +2,7 @@
import { ref } from "vue"; import { ref } from "vue";
import { useQuasar } from "quasar"; import { useQuasar } from "quasar";
import { useRouter } from "vue-router"; import { useRouter,useRoute } from "vue-router";
import { useCounterMixin } from "@/stores/mixin"; import { useCounterMixin } from "@/stores/mixin";
import http from "@/plugins/http"; import http from "@/plugins/http";
import config from "@/app.config"; import config from "@/app.config";
@ -22,6 +22,7 @@ import DialogHeader from "@/components/DialogHeader.vue";
//use //use
const myForm = ref<QForm>(); const myForm = ref<QForm>();
const router = useRouter(); const router = useRouter();
const route = useRoute();
const $q = useQuasar(); const $q = useQuasar();
const { showLoader, hideLoader, messageError, date2Thai } = useCounterMixin(); const { showLoader, hideLoader, messageError, date2Thai } = useCounterMixin();
@ -29,7 +30,7 @@ const { showLoader, hideLoader, messageError, date2Thai } = useCounterMixin();
const modal = defineModel<boolean>("modal", { required: true }); // popup const modal = defineModel<boolean>("modal", { required: true }); // popup
// //
const employeeClass = ref<string>(""); // const employeeClass = ref<string>(route.name == "registryNew" ? 'officer':'perm'); //
const typeKeyword = ref<string>(""); const typeKeyword = ref<string>("");
const Keyword = ref<string>(""); const Keyword = ref<string>("");
const positionKeyword = ref<string>(""); const positionKeyword = ref<string>("");
@ -252,23 +253,23 @@ function closeDialog() {
<template> <template>
<q-dialog v-model="modal" persistent> <q-dialog v-model="modal" persistent>
<q-card style="width: 850px; max-width: 80vw"> <q-card style="width: 60vw; max-width: 80vw">
<DialogHeader :tittle="'ประวัติถือครองตำแหน่ง'" :close="closeDialog" /> <DialogHeader :tittle="'ประวัติถือครองตำแหน่ง'" :close="closeDialog" />
<q-separator /> <q-separator />
<q-card-section class="q-pa-sm"> <q-card-section class="q-pa-sm">
<q-form ref="myForm"> <q-form ref="myForm">
<div class="col-12 bg-grey-2 q-pa-sm"> <div class="bg-grey-2 q-pa-sm">
<div class="col-12 row q-pb-sm q-col-gutter-sm items-center"></div> <div class="row q-col-gutter-sm no-warp full-width">
<q-toolbar> <div class="col-3">
<div class="row q-col-gutter-sm">
<q-select <q-select
hide-bottom-space hide-bottom-space
:rules="[(val:string) => !!val || `${'กรุณาเลือก ประเภท'}`]" :rules="[(val:string) => !!val || `${'กรุณาเลือก ประเภท'}`]"
outlined outlined
dense dense
lazy-rules lazy-rules
bg-color="white"
v-model="employeeClass" v-model="employeeClass"
emit-value emit-value
map-options map-options
@ -279,15 +280,17 @@ function closeDialog() {
use-input use-input
input-debounce="0" input-debounce="0"
@update:model-value="changeEmployeeClass" @update:model-value="changeEmployeeClass"
style="width: 250px"
/> />
</div>
<div class="col-3">
<q-select <q-select
hide-bottom-space hide-bottom-space
:rules="[(val:string) => !!val || `${'กรุณาเลือก ฟิลด์ที่จะค้น'}`]" :rules="[(val:string) => !!val || `${'กรุณาเลือก ฟิลด์ที่จะค้น'}`]"
outlined outlined
dense dense
lazy-rules lazy-rules
bg-color="white"
v-model="typeKeyword" v-model="typeKeyword"
emit-value emit-value
map-options map-options
@ -298,19 +301,61 @@ function closeDialog() {
use-input use-input
input-debounce="0" input-debounce="0"
@update:model-value="selectTypeKeyword(typeKeyword)" @update:model-value="selectTypeKeyword(typeKeyword)"
/>
</div>
<div class="col-3" v-if="typeKeyword === 'no'">
<q-input
outlined
dense
bg-color="white"
v-model="Keyword"
placeholder="ตำแหน่งเลขที่"
:rules="[(val:string) => !!val || `${'กรุณากรอก ตำแหน่งเลขที่'}`]"
hide-bottom-space
style="width: 250px" style="width: 250px"
/> />
</div> </div>
<q-space /> <div class="col-3" v-if="typeKeyword === 'position'">
<q-btn <q-select
outline hide-bottom-space
color="primary" :rules="[(val:string) => !!val || `${'กรุณาเลือก ตำแหน่ง'}`]"
label="ค้นหา" outlined
@click="clickSearch(employeeClass)" dense
icon="mdi-magnify" v-model="positionKeyword"
/> emit-value
</q-toolbar> bg-color="white"
map-options
:options="options"
option-label="name"
option-value="id"
:label="`${' เลือกตำแหน่ง'}`"
use-input
input-debounce="0"
@filter="filterFn"
style="width: 250px"
behavior="menu"
>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
ไมอม
</q-item-section>
</q-item>
</template></q-select
>
</div>
<div :class="typeKeyword ? 'col-3':'col-3 offset-3'">
<q-btn
class="on-right bg-white full-width"
outline
color="primary"
label="ค้นหา"
@click="clickSearch(employeeClass)"
icon="mdi-magnify"
/>
</div>
</div>
</div> </div>
<div class="col-12 q-mt-sm"> <div class="col-12 q-mt-sm">

View file

@ -82,8 +82,9 @@ function fetchOptionGroup() {
/** /**
* function fetch รายชอขอมลทะเบยนประว * function fetch รายชอขอมลทะเบยนประว
*/ */
function fetchDataPerson() { async function fetchDataPerson() {
showLoader(); showLoader();
dataPersonMain.value = [];
let queryParams: QueryParams = { let queryParams: QueryParams = {
page: store.formFilter.page, page: store.formFilter.page,
pageSize: store.formFilter.pageSize, pageSize: store.formFilter.pageSize,
@ -129,58 +130,67 @@ function fetchDataPerson() {
queryParams.isAll = store.formFilter.isAll; queryParams.isAll = store.formFilter.isAll;
} }
http await http
.get( .get(
config.API.registryNew(empType.value !== "officer" ? "-employee" : ""), config.API.registryNew(empType.value !== "officer" ? "-employee" : ""),
{ params: queryParams } { params: queryParams }
) )
.then((res) => { .then(async (res) => {
const dataList = await res.data.result.data;
maxPage.value = Math.ceil( maxPage.value = Math.ceil(
res.data.result.total / store.formFilter.pageSize res.data.result.total / store.formFilter.pageSize
); );
dataPersonMain.value = res.data.result.data; dataPersonMain.value = dataList;
total.value = res.data.result.total; total.value = res.data.result.total;
isShowBtnFilter.value = true; isShowBtnFilter.value = true;
insertAvatar(res.data.result.data); if (dataList) {
insertAvatar(dataList).then(() => {
hideLoader();
});
}
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
})
.finally(() => {
hideLoader(); hideLoader();
}); })
.finally(() => {});
} }
/** /**
* function fetch ปโปรไฟล * function fetch ปโปรไฟล
* @param items อมลคน * @param items อมลคน
*/ */
function insertAvatar(items: DataPerson[]) { async function insertAvatar(items: DataPerson[]) {
items.map((x: DataPerson, index: number) => { await Promise.all(
if (x.avatarName != null) { items.map(async (x: DataPerson, index: number) => {
http try {
.get( if (x.avatarName != null) {
config.API.fileByFile("ทะเบียนประวัติ", "โปรไฟล์", x.id, x.avatarName) const img = await http.get(
) config.API.fileByFile(
.then((img) => { "ทะเบียนประวัติ",
"โปรไฟล์",
x.id,
x.avatarName
)
);
dataPersonMain.value[index] = { dataPersonMain.value[index] = {
...x, ...x,
avatar: img.data.downloadUrl, avatar: img.data.downloadUrl,
}; };
}) } else {
.catch(() => {
dataPersonMain.value[index] = { dataPersonMain.value[index] = {
...x, ...x,
avatar: avatar, avatar: avatar,
}; };
}); }
} else { } catch (error) {
dataPersonMain.value[index] = { dataPersonMain.value[index] = {
...x, ...x,
avatar: avatar, avatar: avatar,
}; };
} }
}); })
);
} }
/** /**

View file

@ -86,6 +86,15 @@ const columns = ref<QTableProps["columns"]>([
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
}, },
{
name: "profileType",
align: "left",
label: "สถานภาพ",
sortable: false,
field: "profileType",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{ {
name: "idcard", name: "idcard",
align: "left", align: "left",
@ -157,6 +166,7 @@ const columns = ref<QTableProps["columns"]>([
/** หัวข้อที่เเสดงในตาราง */ /** หัวข้อที่เเสดงในตาราง */
const visibleColumns = ref<string[]>([ const visibleColumns = ref<string[]>([
"no", "no",
"profileType",
"idcard", "idcard",
"name", "name",
"posNo", "posNo",

View file

@ -201,10 +201,10 @@ function upLoadFileDoc() {
* งกนเพมรายชอผกสอบสวนจาก popup มายงรายการผกสอบสวนหนาหล * งกนเพมรายชอผกสอบสวนจาก popup มายงรายการผกสอบสวนหนาหล
* @param data อมลรายชอผกสอบสวนเป array * @param data อมลรายชอผกสอบสวนเป array
*/ */
async function addPerson(data: any) { async function addPerson(data: any, type?: string) {
toggleModal(); toggleModal();
changeFormData(); changeFormData();
await mainStore.fetchData(data); await mainStore.fetchData(data, type);
} }
/** ดึงข้อมูล active */ /** ดึงข้อมูล active */
@ -629,6 +629,13 @@ onMounted(async () => {
: "-" : "-"
}} }}
</div> </div>
<div v-else-if="col.name === 'profileType'">
{{
props.row.profileType
? mainStore.convertType(props.row.profileType)
: "-"
}}
</div>
<div v-else> <div v-else>
{{ col.value }} {{ col.value }}
</div> </div>
@ -1101,7 +1108,6 @@ onMounted(async () => {
:close="toggleModal" :close="toggleModal"
:save="addPerson" :save="addPerson"
:selected-data="mainStore.rowsAdd" :selected-data="mainStore.rowsAdd"
@returnData="handleSave"
/> />
<PopupPersonal <PopupPersonal

View file

@ -10,7 +10,7 @@ import { useInvestigateFactStore } from "@/modules/11_discipline/store/Investiga
import { useDisciplineMainStore } from "@/modules/11_discipline/store/Main"; import { useDisciplineMainStore } from "@/modules/11_discipline/store/Main";
import type { ArrayPersonAdd } from "@/modules/11_discipline/interface/response/investigate"; import type { ArrayPersonAdd } from "@/modules/11_discipline/interface/response/investigate";
import type { FormData } from "@/modules/11_discipline/interface/request/investigateFact"; import type { FormData } from "@/modules/11_discipline/interface/request/InvestigateFact";
import type { import type {
FormData as FormDataComplaint, FormData as FormDataComplaint,
ArrayPerson, ArrayPerson,

View file

@ -11,7 +11,7 @@ import { useInvestigateDisStore } from "@/modules/11_discipline/store/Investigat
import { useInvestigateFactStore } from "@/modules/11_discipline/store/InvestigateFactStore"; import { useInvestigateFactStore } from "@/modules/11_discipline/store/InvestigateFactStore";
import { useDisciplineMainStore } from "@/modules/11_discipline/store/Main"; import { useDisciplineMainStore } from "@/modules/11_discipline/store/Main";
import type { FormData } from "@/modules/11_discipline/interface/request/investigateFact"; import type { FormData } from "@/modules/11_discipline/interface/request/InvestigateFact";
import type { OptionData } from "@/modules/07_insignia/interface/index/Main"; import type { OptionData } from "@/modules/07_insignia/interface/index/Main";
import CalandarDialog from "@/modules/11_discipline/components/2_InvestigateFacts/CalandarDialog.vue"; import CalandarDialog from "@/modules/11_discipline/components/2_InvestigateFacts/CalandarDialog.vue";
@ -33,7 +33,7 @@ const checkRoutePermisson = ref<boolean>(
const id = ref<string>(route.params.id as string); const id = ref<string>(route.params.id as string);
const modalPerson = ref<boolean>(false); const modalPerson = ref<boolean>(false);
const toggleModal = () => (modalPerson.value = !modalPerson.value); const toggleModal = () => (modalPerson.value = !modalPerson.value);
const isEmpType = ref<string>('')
/**เรียกใช้ store */ /**เรียกใช้ store */
const investigateFactStore = useInvestigateFactStore(); const investigateFactStore = useInvestigateFactStore();
const mainStore = useDisciplineMainStore(); const mainStore = useDisciplineMainStore();
@ -313,16 +313,8 @@ function confirmDelete(id: string) {
.finally(() => {}); .finally(() => {});
} }
async function addPerson(data: any) { async function addPerson(data: any, type: string) {
await mainStore.fetchData(data); await mainStore.fetchData(data, type);
}
/**
* งช บคาจาก คอมโพเเนน
* @param returnData าทไดนมา
*/
function handleSave(returnData: any) {
addPerson(returnData);
changeFormData(); changeFormData();
toggleModal(); toggleModal();
} }
@ -552,9 +544,10 @@ async function saveDuty(id: string, duty: string, resolution: string) {
} }
/** ดูข้อมูลในทะเบียนประวัติ */ /** ดูข้อมูลในทะเบียนประวัติ */
function onclickViewinfo(id: string) { function onclickViewinfo(id: string,type:string) {
modalPersonal.value = true; modalPersonal.value = true;
personId.value = id; personId.value = id;
isEmpType.value = type
} }
/** อัพเดต ปิด/เปิดเมนู ทะเบียนประวัติ */ /** อัพเดต ปิด/เปิดเมนู ทะเบียนประวัติ */
@ -658,6 +651,7 @@ watch(props.data, async () => {
idcard: person.idcard, idcard: person.idcard,
name: person.name, name: person.name,
prefix: person.prefix, prefix: person.prefix,
profileType: person.profileType,
firstName: person.firstName, firstName: person.firstName,
lastName: person.lastName, lastName: person.lastName,
position: person.position, position: person.position,
@ -958,7 +952,12 @@ onMounted(async () => {
round round
color="info" color="info"
icon="mdi-eye" icon="mdi-eye"
@click="onclickViewinfo(props.row.personId)" @click="
onclickViewinfo(
props.row.personId,
props.row.profileType
)
"
> >
<q-tooltip>อมลในทะเบยนประว</q-tooltip> <q-tooltip>อมลในทะเบยนประว</q-tooltip>
</q-btn> </q-btn>
@ -994,6 +993,13 @@ onMounted(async () => {
<div v-else-if="col.name === 'salary'"> <div v-else-if="col.name === 'salary'">
{{ props.row.salary.toLocaleString() }} {{ props.row.salary.toLocaleString() }}
</div> </div>
<div v-else-if="col.name === 'profileType'">
{{
props.row.profileType
? mainStore.convertType(props.row.profileType)
: "-"
}}
</div>
<div v-else> <div v-else>
{{ col.value ?? "-" }} {{ col.value ?? "-" }}
</div> </div>
@ -1755,7 +1761,7 @@ onMounted(async () => {
btn-title="เพิ่มรายชื่อผู้ถูกร้องเรียน" btn-title="เพิ่มรายชื่อผู้ถูกร้องเรียน"
:close="toggleModal" :close="toggleModal"
:selected-data="mainStore.rowsAdd" :selected-data="mainStore.rowsAdd"
@returnData="handleSave" :save="addPerson"
/> />
<DialogDirector <DialogDirector
@ -1796,6 +1802,7 @@ onMounted(async () => {
:modal="modalPersonal" :modal="modalPersonal"
:id="personId" :id="personId"
@update:modal="updatemodalPersonal" @update:modal="updatemodalPersonal"
v-model:is-employee="isEmpType"
/> />
</template> </template>

View file

@ -18,7 +18,7 @@ import type {
ArrayPerson, ArrayPerson,
ArrayFileList, ArrayFileList,
} from "@/modules/11_discipline/interface/request/complaint"; } from "@/modules/11_discipline/interface/request/complaint";
import type { FormData as FormInvestigateFact } from "@/modules/11_discipline/interface/request/investigateFact"; import type { FormData as FormInvestigateFact } from "@/modules/11_discipline/interface/request/InvestigateFact";
import PopupSendToNext from "@/modules/11_discipline/components/PopupSendToNext.vue"; import PopupSendToNext from "@/modules/11_discipline/components/PopupSendToNext.vue";
import FormComplaints from "@/modules/11_discipline/components/1_Complaint/Form.vue"; // import FormComplaints from "@/modules/11_discipline/components/1_Complaint/Form.vue"; //

View file

@ -56,6 +56,7 @@ const calendarModal = ref<boolean>(false);
const calendarModalclose = () => (calendarModal.value = !calendarModal.value); const calendarModalclose = () => (calendarModal.value = !calendarModal.value);
const modalPopup = ref<boolean>(false); const modalPopup = ref<boolean>(false);
const isEmpType = ref<string>("");
const checkRoutePermisson = ref<boolean>( const checkRoutePermisson = ref<boolean>(
route.name == "disciplineDisciplinaryDetail" route.name == "disciplineDisciplinaryDetail"
); );
@ -286,6 +287,7 @@ async function fetchDatadetail() {
id: person.id, id: person.id,
idcard: person.idcard, idcard: person.idcard,
name: person.name, name: person.name,
profileType: person.profileType,
prefix: person.prefix, prefix: person.prefix,
firstName: person.firstName, firstName: person.firstName,
lastName: person.lastName, lastName: person.lastName,
@ -334,6 +336,7 @@ async function fetchDatadetail() {
idcard: person.idcard, idcard: person.idcard,
name: person.name, name: person.name,
prefix: person.prefix, prefix: person.prefix,
profileType: person.profileType,
firstName: person.firstName, firstName: person.firstName,
lastName: person.lastName, lastName: person.lastName,
posLevelName: person.posLevelName, posLevelName: person.posLevelName,
@ -397,14 +400,6 @@ function returnCount(num: number) {
async function addPerson(data: any) { async function addPerson(data: any) {
await mainStore.fetchData(data); await mainStore.fetchData(data);
}
/**
* งช บคาจาก คอมโพเเนน
* @param returnData าทไดนมา
*/
function handleSave(returnData: any) {
addPerson(returnData);
changeFormData(); changeFormData();
toggleModal(); toggleModal();
} }
@ -630,9 +625,10 @@ async function saveDuty(id: string, duty: string, resolution: string) {
}); });
} }
function onclickViewinfo(id: string) { function onclickViewinfo(id: string, type: string) {
modalPersonal.value = true; modalPersonal.value = true;
personId.value = id; personId.value = id;
isEmpType.value = type;
} }
function updatemodalPersonal(modal: boolean) { function updatemodalPersonal(modal: boolean) {
@ -918,7 +914,12 @@ onMounted(async () => {
round round
color="info" color="info"
icon="mdi-eye" icon="mdi-eye"
@click="onclickViewinfo(props.row.personId)" @click="
onclickViewinfo(
props.row.personId,
props.row.profileType
)
"
> >
<q-tooltip>อมลในทะเบยนประว</q-tooltip> <q-tooltip>อมลในทะเบยนประว</q-tooltip>
</q-btn> </q-btn>
@ -955,6 +956,13 @@ onMounted(async () => {
<div v-else-if="col.name === 'salary'"> <div v-else-if="col.name === 'salary'">
{{ props.row.salary.toLocaleString() }} {{ props.row.salary.toLocaleString() }}
</div> </div>
<div v-else-if="col.name === 'profileType'">
{{
props.row.profileType
? mainStore.convertType(props.row.profileType)
: "-"
}}
</div>
<div v-else> <div v-else>
{{ col.value ? col.value : "-" }} {{ col.value ? col.value : "-" }}
</div> </div>
@ -1946,7 +1954,6 @@ onMounted(async () => {
:close="toggleModal" :close="toggleModal"
:save="addPerson" :save="addPerson"
:selected-data="mainStore.rowsAdd" :selected-data="mainStore.rowsAdd"
@returnData="handleSave"
/> />
<DialogDirector <DialogDirector
@ -1986,6 +1993,7 @@ onMounted(async () => {
:modal="modalPersonal" :modal="modalPersonal"
:id="personId" :id="personId"
@update:modal="updatemodalPersonal" @update:modal="updatemodalPersonal"
v-model:is-employee="isEmpType"
/> />
</template> </template>

View file

@ -7,6 +7,7 @@ import config from "@/app.config";
import { useCounterMixin } from "@/stores/mixin"; import { useCounterMixin } from "@/stores/mixin";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { useCommandMainStore } from "@/modules/18_command/store/Main"; import { useCommandMainStore } from "@/modules/18_command/store/Main";
import { useDisciplineMainStore } from "@/modules/11_discipline/store/Main";
import type { ListCommand } from "@/modules/18_command/interface/index/Main"; import type { ListCommand } from "@/modules/18_command/interface/index/Main";
import type { ResponseData } from "@/modules/05_placement/interface/response/Transfer"; import type { ResponseData } from "@/modules/05_placement/interface/response/Transfer";
@ -18,6 +19,8 @@ import DialogCreateCommand from "@/modules/18_command/components/DialogCreateCom
const $q = useQuasar(); const $q = useQuasar();
const route = useRoute(); const route = useRoute();
const mainStore = useDisciplineMainStore();
const storeCommand = useCommandMainStore(); const storeCommand = useCommandMainStore();
const mixin = useCounterMixin(); const mixin = useCounterMixin();
const { const {
@ -278,7 +281,13 @@ watch(
<div v-else-if="col.name === 'salary'"> <div v-else-if="col.name === 'salary'">
{{ props.row.salary.toLocaleString() }} {{ props.row.salary.toLocaleString() }}
</div> </div>
<div v-else-if="col.name === 'profileType'">
{{
props.row.profileType
? mainStore.convertType(props.row.profileType)
: "-"
}}
</div>
<div v-else> <div v-else>
{{ col.value ?? "-" }} {{ col.value ?? "-" }}
</div> </div>

View file

@ -9,13 +9,13 @@ import { useCounterMixin } from "@/stores/mixin";
import { useDisciplineResultStore } from "@/modules/11_discipline/store/ResultStore"; import { useDisciplineResultStore } from "@/modules/11_discipline/store/ResultStore";
import { useDisciplineMainStore } from "@/modules/11_discipline/store/Main"; import { useDisciplineMainStore } from "@/modules/11_discipline/store/Main";
import type { DataListRow } from "@/modules/11_discipline/interface/request/result"; import type { DataListRow } from "@/modules/11_discipline/interface/request/Result";
import type { import type {
FormData as FormDataComplaint, FormData as FormDataComplaint,
ArrayPerson, ArrayPerson,
ArrayFileList, ArrayFileList,
} from "@/modules/11_discipline/interface/request/complaint"; } from "@/modules/11_discipline/interface/request/complaint";
import type { FormData as FormInvestigateFact } from "@/modules/11_discipline/interface/request/investigateFact"; import type { FormData as FormInvestigateFact } from "@/modules/11_discipline/interface/request/InvestigateFact";
import DialogSendToCommand from "@/modules/11_discipline/components/4_Result/DialogSendToCommand.vue"; import DialogSendToCommand from "@/modules/11_discipline/components/4_Result/DialogSendToCommand.vue";
import FormComplaints from "@/modules/11_discipline/components/1_Complaint/Form.vue"; // import FormComplaints from "@/modules/11_discipline/components/1_Complaint/Form.vue"; //

View file

@ -13,13 +13,14 @@ import type {
FormData, FormData,
FormRef, FormRef,
DataOption, DataOption,
} from "@/modules/11_discipline/interface/request/result"; } from "@/modules/11_discipline/interface/request/Result";
import DialogHistory from "@/modules/11_discipline/components/4_Result/DialogHistory.vue"; import DialogHistory from "@/modules/11_discipline/components/4_Result/DialogHistory.vue";
import PopupPersonal from "@/components/Dialogs/PopupPersonalNew.vue"; import PopupPersonal from "@/components/Dialogs/PopupPersonalNew.vue";
const mainStore = useDisciplineMainStore(); const mainStore = useDisciplineMainStore();
const isEmpType = ref<string>('')
const dataStore = useDisciplineResultStore(); const dataStore = useDisciplineResultStore();
const mixin = useCounterMixin(); const mixin = useCounterMixin();
const { const {
@ -227,9 +228,10 @@ function closeDetail() {
} }
/** เปิดรายละเอียด */ /** เปิดรายละเอียด */
function onclickViewinfo(id: string) { function onclickViewinfo(id: string,type:string) {
modalPersonal.value = true; modalPersonal.value = true;
personId.value = id; personId.value = id;
isEmpType.value = type
} }
function updatemodalPersonal(modal: boolean) { function updatemodalPersonal(modal: boolean) {
@ -394,7 +396,7 @@ watch(
round round
color="info" color="info"
icon="mdi-eye" icon="mdi-eye"
@click="onclickViewinfo(props.row.personId)" @click="onclickViewinfo(props.row.personId,props.row.profileType)"
> >
<q-tooltip>อมลในทะเบยนประว</q-tooltip> <q-tooltip>อมลในทะเบยนประว</q-tooltip>
</q-btn> </q-btn>
@ -431,6 +433,13 @@ watch(
: "" : ""
}} }}
</div> </div>
<div v-else-if="col.name === 'profileType'">
{{
props.row.profileType
? mainStore.convertType(props.row.profileType)
: "-"
}}
</div>
<div v-else> <div v-else>
{{ col.value }} {{ col.value }}
</div> </div>
@ -644,6 +653,7 @@ watch(
<PopupPersonal <PopupPersonal
:modal="modalPersonal" :modal="modalPersonal"
:id="personId" :id="personId"
v-model:is-employee="isEmpType"
@update:modal="updatemodalPersonal" @update:modal="updatemodalPersonal"
/> />

View file

@ -6,7 +6,7 @@ import { useCounterMixin } from "@/stores/mixin";
import { useCommandMainStore } from "@/modules/18_command/store/Main"; import { useCommandMainStore } from "@/modules/18_command/store/Main";
import type { QTableProps } from "quasar"; import type { QTableProps } from "quasar";
import type { dataType } from "@/modules/11_discipline/interface/response/Suspend"; import type { dataType } from "@/modules/11_discipline/interface/response/suspend";
import type { ListCommand } from "@/modules/18_command/interface/index/Main"; import type { ListCommand } from "@/modules/18_command/interface/index/Main";
import DialogHeader from "@/components/DialogHeader.vue"; import DialogHeader from "@/components/DialogHeader.vue";
@ -56,6 +56,15 @@ const columns = ref<QTableProps["columns"]>([
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
}, },
{
name: "profileType",
align: "left",
label: "สถานภาพ",
sortable: true,
field: "profileType",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{ {
name: "name", name: "name",
align: "left", align: "left",
@ -106,6 +115,7 @@ const columns = ref<QTableProps["columns"]>([
/** คอลัมน์ที่แสดง */ /** คอลัมน์ที่แสดง */
const visibleColumns = ref<string[]>([ const visibleColumns = ref<string[]>([
"no", "no",
"profileType",
"name", "name",
"position", "position",
"positionLevel", "positionLevel",
@ -154,6 +164,15 @@ function serchDataTable() {
); );
} }
function convertType(val: string) {
switch (val) {
case "OFFICER":
return "ข้าราชการ กทม. สามัญ";
case "EMPLOYEE":
return "ลูกจ้างประจำ กทม.";
}
}
/** /**
* เม props.modal เป true * เม props.modal เป true
* กำหนดให selected เปนคาวางและกำหนด filter ประเภทตำแหนงตามประเภทการสอบ * กำหนดให selected เปนคาวางและกำหนด filter ประเภทตำแหนงตามประเภทการสอบ
@ -270,6 +289,13 @@ watch(
<div v-if="col.name == 'no'"> <div v-if="col.name == 'no'">
{{ props.rowIndex + 1 }} {{ props.rowIndex + 1 }}
</div> </div>
<div v-else-if="col.name === 'profileType'">
{{
props.row.profileType
? convertType(props.row.profileType.toUpperCase())
: "-"
}}
</div>
<div v-else> <div v-else>
{{ col.value ? col.value : "-" }} {{ col.value ? col.value : "-" }}
</div> </div>

View file

@ -8,7 +8,10 @@ import config from "@/app.config";
import { useCounterMixin } from "@/stores/mixin"; import { useCounterMixin } from "@/stores/mixin";
import { useDisciplineSuspendStore } from "@/modules/11_discipline/store/SuspendStore"; import { useDisciplineSuspendStore } from "@/modules/11_discipline/store/SuspendStore";
import type { dataType } from "@/modules/11_discipline/interface/response/Suspend"; import type {
dataType,
DataOption,
} from "@/modules/11_discipline/interface/response/suspend";
import type { QTableProps } from "quasar"; import type { QTableProps } from "quasar";
import DialogSendToCommand from "@/modules/11_discipline/components/7_ListSuspend/DialogSendToCommand.vue"; import DialogSendToCommand from "@/modules/11_discipline/components/7_ListSuspend/DialogSendToCommand.vue";
@ -21,11 +24,18 @@ const router = useRouter();
const mixin = useCounterMixin(); const mixin = useCounterMixin();
const { messageError, showLoader, hideLoader, success } = mixin; const { messageError, showLoader, hideLoader, success } = mixin;
const employeeClass = ref<string>("");
const employeeClassOption = ref<DataOption[]>([
{ id: "", name: "ทั้งหมด" },
{ id: "OFFICER", name: "ข้าราชการ กทม. สามัญ" },
{ id: "EMPLOYEE", name: "ลูกจ้างประจำ กทม." },
]);
const modal = ref<boolean>(false); const modal = ref<boolean>(false);
/** คอลัมน์ที่แสดง */ /** คอลัมน์ที่แสดง */
const visibleColumns = ref<string[]>([ const visibleColumns = ref<string[]>([
"no", "no",
"profileType",
"title", "title",
"name", "name",
"positionType", "positionType",
@ -52,6 +62,15 @@ const columns = ref<QTableProps["columns"]>([
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
}, },
{
name: "profileType",
align: "left",
label: "สถานภาพ",
sortable: true,
field: "profileType",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{ {
name: "title", name: "title",
align: "left", align: "left",
@ -165,7 +184,8 @@ async function getList() {
config.API.suspendMain( config.API.suspendMain(
pagination.value.page, pagination.value.page,
pagination.value.rowsPerPage, pagination.value.rowsPerPage,
filterKeyword.value.trim() filterKeyword.value.trim(),
employeeClass.value
) )
) )
.then(async (res) => { .then(async (res) => {
@ -205,6 +225,15 @@ watch(
} }
); );
function convertType(val: string) {
switch (val) {
case "OFFICER":
return "ข้าราชการ กทม. สามัญ";
case "EMPLOYEE":
return "ลูกจ้างประจำ กทม.";
}
}
/** เรียกใช้งานเมื่อเริ่มหน้าเว็ป */ /** เรียกใช้งานเมื่อเริ่มหน้าเว็ป */
onMounted(async () => { onMounted(async () => {
await getList(); await getList();
@ -221,7 +250,23 @@ onMounted(async () => {
<q-separator /> <q-separator />
<div class="row q-pa-md"> <div class="row q-pa-md">
<div class="col-12"> <div class="col-12">
<div class="row col-12 q-col-gutter-sm"> <div class="row col-12 q-col-gutter-sm items-center">
<div>
<q-select
v-model="employeeClass"
outlined
dense
options-dense
emit-value
map-options
:options="employeeClassOption"
option-value="id"
option-label="name"
label="สถานภาพ"
style="min-width: 250px"
@update:model-value="getList"
/>
</div>
<div> <div>
<q-btn <q-btn
v-if="checkPermission($route)?.attrIsUpdate" v-if="checkPermission($route)?.attrIsUpdate"
@ -346,6 +391,13 @@ onMounted(async () => {
<div v-else-if="col.name === 'title'" class="table_ellipsis"> <div v-else-if="col.name === 'title'" class="table_ellipsis">
{{ props.row.title ? props.row.title : "-" }} {{ props.row.title ? props.row.title : "-" }}
</div> </div>
<div v-else-if="col.name === 'profileType'">
{{
props.row.profileType
? convertType(props.row.profileType.toUpperCase())
: "-"
}}
</div>
<div <div
v-else-if="col.name === 'organization'" v-else-if="col.name === 'organization'"
class="table_ellipsis" class="table_ellipsis"

View file

@ -6,11 +6,13 @@ import { useCounterMixin } from "@/stores/mixin";
import DialogHeader from "@/components/DialogHeader.vue"; import DialogHeader from "@/components/DialogHeader.vue";
import DialogCreateCommand from "@/modules/18_command/components/DialogCreateCommand.vue"; import DialogCreateCommand from "@/modules/18_command/components/DialogCreateCommand.vue";
import { useDisciplineMainStore } from "@/modules/11_discipline/store/Main";
const modal = defineModel<boolean>("modal", { required: true }); const modal = defineModel<boolean>("modal", { required: true });
const mixin = useCounterMixin(); const mixin = useCounterMixin();
const $q = useQuasar(); const $q = useQuasar();
const { dialogConfirm, dialogMessageNotify, onSearchDataTable } = mixin; const { dialogConfirm, dialogMessageNotify, onSearchDataTable } = mixin;
const mainStore = useDisciplineMainStore();
const dataMapToSend = computed(() => { const dataMapToSend = computed(() => {
return selected.value.map((i: any) => ({ return selected.value.map((i: any) => ({
@ -214,7 +216,13 @@ watch(
<div v-if="col.name == 'no'"> <div v-if="col.name == 'no'">
{{ props.rowIndex + 1 }} {{ props.rowIndex + 1 }}
</div> </div>
<div v-else-if="col.name === 'profileType'">
{{
props.row.profileType
? mainStore.convertType(props.row.profileType)
: "-"
}}
</div>
<div v-else> <div v-else>
{{ col.value }} {{ col.value }}
</div> </div>

View file

@ -19,6 +19,7 @@ interface listData {
offenseDetails: string; offenseDetails: string;
disciplinaryFaultLevel: string; disciplinaryFaultLevel: string;
disciplinaryCaseFault: string; disciplinaryCaseFault: string;
profileType: string;
} }
interface dataType { interface dataType {

View file

@ -44,6 +44,15 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
}, },
{
name: "profileType",
align: "left",
label: "สถานภาพ",
sortable: true,
field: "profileType",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{ {
name: "idcard", name: "idcard",
align: "left", align: "left",
@ -115,6 +124,7 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
/** หัวข้อที่เเสดงในตารางผู้ถูกร้องเรียน */ /** หัวข้อที่เเสดงในตารางผู้ถูกร้องเรียน */
const visibleColumnsRespondent = ref<string[]>([ const visibleColumnsRespondent = ref<string[]>([
"no", "no",
"profileType",
"idcard", "idcard",
"name", "name",
"posNo", "posNo",
@ -125,16 +135,17 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
]); ]);
/** หัวตารางกรรมการ */ /** หัวตารางกรรมการ */
// {
// name: "info",
// align: "left",
// label: "",
// sortable: false,
// field: "info",
// headerStyle: "font-size: 14px",
// style: "font-size: 14px",
// },
const columnsDirector = ref<QTableProps["columns"]>([ const columnsDirector = ref<QTableProps["columns"]>([
{
name: "info",
align: "left",
label: "",
sortable: false,
field: "info",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{ {
name: "no", name: "no",
align: "left", align: "left",
@ -144,6 +155,15 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
}, },
{
name: "profileType",
align: "left",
label: "สถานภาพ",
sortable: true,
field: "profileType",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{ {
name: "idcard", name: "idcard",
align: "left", align: "left",
@ -220,9 +240,10 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
]); ]);
/** หัวข้อที่เเสดงในตารางกรรมการ */ /** หัวข้อที่เเสดงในตารางกรรมการ */
// "info",
const visibleColumnsDirector = ref<string[]>([ const visibleColumnsDirector = ref<string[]>([
"info",
"no", "no",
"profileType",
"idcard", "idcard",
"name", "name",
"posNo", "posNo",
@ -407,8 +428,13 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
* POPUP * POPUP
* @param data * @param data
*/ */
async function fetchData(data: ArrayPersonAdd[]) { async function fetchData(data: ArrayPersonAdd[], type?: string) {
const dataList: any = data.map((item: any) => ({ const dataList: any = data.map((item: any) => ({
profileType: item.profileType
? item.profileType
: type == "officer"
? "OFFICER"
: "EMPLOYEE",
id: item.id, id: item.id,
idcard: item.idcard, idcard: item.idcard,
name: item.name, name: item.name,
@ -442,7 +468,13 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
posLevelId: item.posLevelId, posLevelId: item.posLevelId,
posLevelName: item.posLevelName, posLevelName: item.posLevelName,
})); }));
rowsAdd.value = dataList;
const newItems = dataList.filter(
(newItem: any) => !rowsAdd.value.some((existingItem: any) => existingItem.personId === newItem.personId)
);
// เพิ่มข้อมูลใหม่เข้า rowsAdd
rowsAdd.value = [...rowsAdd.value, ...newItems];
} }
/** /**
@ -454,6 +486,7 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
id: item.id, id: item.id,
idcard: item.idcard, idcard: item.idcard,
name: item.name, name: item.name,
profileType: item.profileType,
prefix: item.prefix, prefix: item.prefix,
firstName: item.firstName, firstName: item.firstName,
lastName: item.lastName, lastName: item.lastName,
@ -488,6 +521,14 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
rowsSend.value = dataList; rowsSend.value = dataList;
} }
function convertType(val: string) {
switch (val) {
case "OFFICER":
return "ข้าราชการ กทม. สามัญ";
case "EMPLOYEE":
return "ลูกจ้างประจำ กทม.";
}
}
return { return {
complainantoptionsMain, complainantoptionsMain,
convertFault, convertFault,
@ -513,5 +554,6 @@ export const useDisciplineMainStore = defineStore("disciplineMainStore", () => {
pathDiscip, pathDiscip,
pathComplaintsChannal, pathComplaintsChannal,
pathDirector, pathDirector,
convertType,
}; };
}); });

View file

@ -7,7 +7,7 @@ import type {
listData, listData,
dataType, dataType,
DataOption, DataOption,
} from "@/modules/11_discipline/interface/response/Suspend"; } from "@/modules/11_discipline/interface/response/suspend";
import type { QTableProps } from "quasar"; import type { QTableProps } from "quasar";
export const useDisciplineSuspendStore = defineStore( export const useDisciplineSuspendStore = defineStore(
@ -38,6 +38,7 @@ export const useDisciplineSuspendStore = defineStore(
name: `${item.prefix}${item.firstName} ${item.lastName}`, name: `${item.prefix}${item.firstName} ${item.lastName}`,
prefix: item.prefix, prefix: item.prefix,
firstName: item.firstName, firstName: item.firstName,
profileType: item.profileType,
lastName: item.lastName, lastName: item.lastName,
organization: item.organization, organization: item.organization,
position: item.position, position: item.position,