Merge branch 'develop' into dev
All checks were successful
Build & Deploy on Dev / build (push) Successful in 3m2s

This commit is contained in:
DESKTOP-1R2VSQH\Lenovo ThinkPad E490 2026-02-24 13:40:33 +07:00
commit 32dfa12ef1
5 changed files with 228 additions and 43 deletions

View file

@ -178,6 +178,8 @@ export default {
`${workflow}/keycloak/isofficer/${type}`,
positionCondition: `${orgPos}/master/position-condition`,
positionConditionEmp: `${organization}/employee/pos/master/position-condition`,
keycloakLogSSO: `${organization}/keycloak/log/sso`,

View file

@ -1,5 +1,5 @@
<script setup lang="ts">
import { ref, reactive, watch } from "vue";
import { ref, reactive, watch, computed } from "vue";
import { useQuasar } from "quasar";
import http from "@/plugins/http";
@ -63,6 +63,16 @@ const props = defineProps({
positionHolderInfo: { type: Object, default: () => ({}) },
});
const titlePopup = computed(() => {
return props.actionType === "ADD"
? "เพิ่มอัตรากำลัง"
: props.actionType === "EDIT"
? "แก้ไขอัตรากำลัง"
: props.actionType === "COPY"
? "คัดลอกอัตรากำลัง"
: "";
});
const isReadonly = ref<boolean>(false); //
const isEdit = ref<boolean>(false); //
const modalAdd = ref<boolean>(false); //
@ -582,12 +592,7 @@ watch(
<template>
<q-dialog v-model="props.modal" persistent>
<q-card style="min-width: 80vw">
<DialogHeader
:tittle="
props.actionType === 'ADD' ? 'เพิ่มอัตรากำลัง' : 'แก้ไขอัตรากำลัง'
"
:close="close"
/>
<DialogHeader :tittle="titlePopup" :close="close" />
<q-separator />
<q-form greedy @submit.prevent @validation-success="onSubmit">
<q-card-section class="q-pa-sm fixed-height">

View file

@ -0,0 +1,118 @@
<script setup lang="ts">
import { reactive, watch } from "vue";
import { useQuasar } from "quasar";
import { useCounterMixin } from "@/stores/mixin";
import config from "@/app.config";
import http from "@/plugins/http";
import type { PropType } from "vue";
import type { DataPositionCondition } from "@/modules/19_condition/interface/response/Main";
import type { FormPositionCondition } from "@/modules/19_condition/interface/request/Main";
import DialogHeader from "@/components/DialogHeader.vue";
const $q = useQuasar();
const { showLoader, hideLoader, messageError, success, dialogConfirm } =
useCounterMixin();
const modal = defineModel<boolean>("modal", { required: true });
const props = defineProps({
fetchData: { type: Function, required: true },
dataCondition: {
type: Object as PropType<DataPositionCondition>,
default: () => ({}),
},
});
const formData = reactive<FormPositionCondition>({
isCondition: false,
conditionReason: "",
});
function onCloseDialog() {
modal.value = false;
formData.isCondition = false;
formData.conditionReason = "";
}
function onSubmit() {
dialogConfirm($q, async () => {
showLoader();
formData.conditionReason =
formData.isCondition === false ? "" : formData.conditionReason; //
await http
.put(
config.API.positionConditionEmp + `/${props?.dataCondition?.id}`,
formData
)
.then(async () => {
onCloseDialog();
await props.fetchData?.();
success($q, "บันทึกข้อมูลสำเร็จ");
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
});
}
watch(modal, () => {
if (modal.value) {
if (props.dataCondition) {
formData.isCondition = props.dataCondition.isCondition;
formData.conditionReason = props.dataCondition.conditionReason;
}
}
});
</script>
<template>
<q-dialog v-model="modal" persistent>
<q-card style="min-width: 30vw">
<q-form greedy @submit.prevent @validation-success="onSubmit">
<DialogHeader
:tittle="`จัดการตำแหน่งติดเงื่อนไข`"
:close="onCloseDialog"
/>
<q-separator />
<q-card-section class="q-pt-none">
<div class="row q--col-gutter-sm">
<div class="col-12">
<q-checkbox
color="primary"
keep-color
v-model="formData.isCondition"
label="ตำแหนงตดเงอนไข
"
/>
</div>
<div class="col-12">
<q-input
dense
outlined
v-model="formData.conditionReason"
label="หมายเหตุ"
type="textarea"
class="inputgreen"
/>
</div>
</div>
</q-card-section>
<q-separator />
<q-card-actions align="right">
<q-btn label="บันทึก" color="secondary" type="submit"
><q-tooltip>นทกขอม</q-tooltip></q-btn
>
</q-card-actions>
</q-form>
</q-card>
</q-dialog>
</template>
<style scoped></style>

View file

@ -1,5 +1,5 @@
<script setup lang="ts">
import { ref, reactive, watch } from "vue";
import { ref, reactive, watch, computed } from "vue";
import { useQuasar } from "quasar";
import { useCounterMixin } from "@/stores/mixin";
@ -49,6 +49,16 @@ const props = defineProps({
shortName: { type: String, required: true },
});
const titlePopup = computed(() => {
return props.actionType === "ADD"
? "เพิ่มอัตรากำลัง"
: props.actionType === "EDIT"
? "แก้ไขอัตรากำลัง"
: props.actionType === "COPY"
? "คัดลอกอัตรากำลัง"
: "";
});
const modalAdd = ref<boolean>(false); //
const isEdit = ref<boolean>(false); //
const isReadonly = ref<boolean>(false); //
@ -192,10 +202,10 @@ function onSubmit() {
};
try {
const url =
props.actionType === "ADD"
props.actionType === "ADD" || props.actionType === "COPY"
? config.API.orgPosMasterEmp
: config.API.orgPosMasterByIdEmp(props.rowId);
await http[props.actionType === "ADD" ? "post" : "put"](url, body);
await http[props.actionType === "ADD" || props.actionType === "COPY" ? "post" : "put"](url, body);
await props.getSummary?.();
await props.fetchDataTable?.(
reqMaster.value.id,
@ -349,12 +359,7 @@ watch(
<template>
<q-dialog v-model="props.modal" persistent>
<q-card style="min-width: 80vw">
<DialogHeader
:tittle="
props.actionType === 'ADD' ? 'เพิ่มอัตรากำลัง' : 'แก้ไขอัตรากำลัง'
"
:close="close"
/>
<DialogHeader :tittle="titlePopup" :close="close" />
<q-separator />
<q-form greedy @submit.prevent @validation-success="onSubmit">
<q-card-section class="q-pa-sm fixed-height">

View file

@ -10,9 +10,7 @@ import genreport from "@/plugins/genreportxlsx";
import config from "@/app.config";
import http from "@/plugins/http";
/**
* importType
*/
/** importType*/
import type { QTableProps } from "quasar";
import type {
ListMenu,
@ -22,10 +20,9 @@ import type {
import type { FilterMaster } from "@/modules/16_positionEmployee/interface/request/organizational";
import type { PosMaster2 } from "@/modules/16_positionEmployee/interface/response/organizational";
import type { DataPosition } from "@/modules/16_positionEmployee/interface/index/organizational";
import type { DataPositionCondition } from "@/modules/19_condition/interface/response/Main";
/**
* importComponents
*/
/** importComponents*/
import DialogFormPosotion from "@/modules/16_positionEmployee/components/DialogFormPosition.vue";
import DialogPositionDetail from "@/modules/16_positionEmployee/components/DialogPositionDetail.vue";
import DialogSort from "@/modules/16_positionEmployee/components/DialogSortPosition.vue";
@ -34,18 +31,15 @@ import DialogHistoryPos from "@/modules/16_positionEmployee/components/DialogHis
import DialogSelectPerson from "@/modules/16_positionEmployee/components/DialogSelectPerson.vue";
import DialogSuccession from "@/modules/16_positionEmployee/components/DialogSuccession.vue";
import PopupPersonal from "@/components/Dialogs/PopupPersonalNew.vue";
import DialogCondition from "@/modules/16_positionEmployee/components/DialogCondition.vue";
/**
* ues
*/
/** ues*/
const $q = useQuasar();
const store = usePositionEmp();
const { showLoader, hideLoader, messageError, success, dialogRemove } =
useCounterMixin();
/**
* prosp
*/
/** prosp*/
const nodeTree = defineModel<any>("nodeTree", { required: true });
const orgLevel = defineModel<number>("orgLevel", { required: true });
const treeId = defineModel<string>("treeId", { required: true });
@ -72,9 +66,7 @@ const props = defineProps({
},
});
/**
* modal popup
*/
/** modal popup*/
const modalPerson = ref<boolean>(false); // popup
const personalId = ref<string>(""); // id
const dialogDetail = ref<boolean>(false); //
@ -84,6 +76,8 @@ const modalSort = ref<boolean>(false); // จัดลำดับ
const modalDialogMMove = ref<boolean>(false); //
const modalDialogSuccession = ref<boolean>(false); //
const modalDialogHistoryPos = ref<boolean>(false); //
const modalCondition = ref<boolean>(false); //
const dataCondition = ref<DataPositionCondition>();
const rowId = ref<string>("");
const actionType = ref<string>("");
@ -101,6 +95,18 @@ const listMenu = ref<ListMenu[]>([
type: "EDIT",
color: "edit",
},
{
label: "คัดลอก",
icon: "content_copy",
type: "COPY",
color: "blue-6",
},
{
label: "จัดการตำแหน่งติดเงื่อนไข",
icon: "mdi-account-alert",
type: "CONDITION",
color: "deep-orange",
},
{
label: "ลบ",
icon: "delete",
@ -229,9 +235,7 @@ function onClickDelete(id: string) {
});
}
/**
* fdunction ดลำดบตำแหน
*/
/** function เปิด popup จัดลำดับตำแหน่ง*/
function onClickSort() {
modalSort.value = true;
}
@ -274,9 +278,7 @@ function openSelectPerson(data: DataPosition[]) {
dataDetailPos.value = data;
}
/**
* ลบคนครอง
*/
/** function ลบคนครอง*/
function removePerson(id: string) {
dialogRemove(
$q,
@ -307,15 +309,14 @@ function removePerson(id: string) {
/**
* function openPopup บทอดตำแหน
* @param id องการ
*/
function onClickInherit(id: string) {
modalDialogSuccession.value = !modalDialogSuccession.value;
rowId.value = id;
}
/**
* งขอมลสถจำนวนดานบน
*/
/** ดึงข้อมูลสถิติจำนวนด้านบน*/
function getSummary() {
showLoader();
http
@ -348,9 +349,13 @@ function getSummary() {
});
}
/** function DownloadReport*/
/**
* function DownloadReport
* @param val ประเภทเอกสารทองการดาวนโหลด
* @param name อเอกสารทองการดาวนโหลด
*
*/
async function onClickDownloadReport(val: string, name: string) {
// API
showLoader();
await http
.get(config.API.orgReport(val) + `/${treeId.value}`)
@ -373,6 +378,34 @@ const pagination = ref({
rowsPerPage: reqMaster.value.pageSize,
});
/**
* function เป popup ดการตำแหนงตดเงอนไข
* @param data อมลตำแหน
*/
function onClickCodition(data: any) {
dataCondition.value = {
conditionReason: data.conditionReason
? data.conditionReason.replace(/ /g, " \n")
: "",
id: data.id,
isCondition: data.isCondition,
orgShortname: data.orgShortname,
posMasterNo: Number(data.posMasterNo),
posMasterNoPrefix: data.posMasterNoPrefix,
posMasterNoSuffix: data.posMasterNoSuffix,
profilePosition: data.profilePosition,
profilePoslevel: data.profilePoslevel,
profilePostype: data.profilePostype,
positions: [],
};
modalCondition.value = true;
}
/** function fetchข้อมูลใหม่*/
async function fetchDataCondition() {
props.fetchDataTable?.(reqMaster.value.id, reqMaster.value.type, false);
}
watch(
() => modalDialogMMove.value,
() => {
@ -585,6 +618,10 @@ watch(
? onClickHistoryPos(props.row.id)
: item.type === 'INHERIT'
? onClickInherit(props.row.id)
: item.type === 'COPY'
? onClickPosition('COPY', props.row.id)
: item.type === 'CONDITION'
? onClickCodition(props.row)
: null
"
>
@ -616,7 +653,12 @@ watch(
</q-menu>
</q-btn>
</q-td>
<q-td v-for="col in props.cols" :key="col.name" :props="props">
<q-td
v-for="col in props.cols"
:key="col.name"
:props="props"
:class="props.row.isCondition ? 'text-red' : ''"
>
<div v-if="col.name == 'no'">
{{
(reqMaster.page - 1) * Number(reqMaster.pageSize) +
@ -664,6 +706,12 @@ watch(
>
<q-tooltip>อมลในทะเบยนประว</q-tooltip>
</q-btn>
{{
props.row.isCondition && props.row.conditionReason
? `\r(${props.row.conditionReason})`
: ""
}}
</div>
<div v-else>
{{ col.value ? col.value : "-" }}
@ -750,6 +798,13 @@ watch(
@update:modal="(value:any)=>{modalPerson = value}"
:type="'employee'"
/>
<!-- ดการตำแหนงตดเงอนไข -->
<DialogCondition
v-model:modal="modalCondition"
:fetch-data="fetchDataCondition"
:data-condition="dataCondition"
/>
</template>
<style lang="scss" scoped>