Merge branch 'develop'

This commit is contained in:
Warunee Tamkoo 2025-05-07 23:23:16 +07:00
commit 75f5cc4ca1
3 changed files with 204 additions and 75 deletions

View file

@ -55,14 +55,34 @@ interface MainListResponse {
} }
interface DataOptions { interface DataOptions {
id:string id: string;
name:string name: string;
} }
interface RowsType {
commanders: SeqTypeRow[];
approvers: SeqTypeRow[];
}
interface SeqTypeRow {
seq: number;
prefix: string;
firstName: string;
lastName: string;
positionName: string;
profileId: string;
keycloakId: string;
approveStatus: string;
comment: string;
rejectDate: Date | null;
}
export type { export type {
QuestionDescription, QuestionDescription,
OptionQuestions, OptionQuestions,
OptionQuestions2, OptionQuestions2,
MainList, MainList,
MainListResponse, MainListResponse,
DataOptions DataOptions,
RowsType,
SeqTypeRow,
}; };

View file

@ -4,9 +4,9 @@ export const useRestDataStore = defineStore("Rest", () => {
const statusText = (val: string) => { const statusText = (val: string) => {
switch (val) { switch (val) {
case "WAITTING": case "WAITTING":
return "รอดำเนินการ"; return "ใหม่";
case "PENDING": case "PENDING":
return "เลือกตำแหน่งแล้ว"; return "รอดำเนินการ";
case "APPROVE": case "APPROVE":
return "อนุมัติ"; return "อนุมัติ";
case "REJECT": case "REJECT":
@ -16,7 +16,7 @@ export const useRestDataStore = defineStore("Rest", () => {
case "WAITING": case "WAITING":
return "รอออกคำสั่ง"; return "รอออกคำสั่ง";
case "DONE": case "DONE":
return "ออกคำสั่งเสร็จแล้ว"; return "ออกคำสั่งเสร็จสิ้น";
case "DONECANCEL": case "DONECANCEL":
return "ยกเลิกการลาออก"; return "ยกเลิกการลาออก";
case "CANCEL": case "CANCEL":
@ -28,7 +28,20 @@ export const useRestDataStore = defineStore("Rest", () => {
} }
}; };
function convertStatusText(val: string) {
switch (val) {
case "PENDING":
return "รอดำเนินการ";
case "APPROVE":
return "อนุญาต";
case "REJECT":
return "ยับยั้ง";
}
}
return { return {
statusText, statusText,
convertStatusText
}; };
}); });

View file

@ -1,15 +1,20 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { useQuasar } from "quasar"; import { useQuasar } from "quasar";
import type { QForm } from "quasar"; import type { QForm, QTableProps } from "quasar";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import http from "@/plugins/http"; import http from "@/plugins/http";
import config from "@/app.config"; import config from "@/app.config";
import { useRestDataStore } from "@/modules/03_retire/store";
import { useCounterMixin } from "@/stores/mixin"; import { useCounterMixin } from "@/stores/mixin";
import { useDataStore } from "@/stores/data"; import { useDataStore } from "@/stores/data";
import type { DataOptions } from "@/modules/03_retire/interface/Main"; import type {
DataOptions,
RowsType,
SeqTypeRow,
} from "@/modules/03_retire/interface/Main";
import Dialog from "@/modules/03_retire/views/DialogRetire.vue"; import Dialog from "@/modules/03_retire/views/DialogRetire.vue";
import Header from "@/components/DialogHeader.vue"; import Header from "@/components/DialogHeader.vue";
@ -18,6 +23,8 @@ import Workflow from "@/components/Workflow/Main.vue";
const $q = useQuasar(); const $q = useQuasar();
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const store = useRestDataStore();
const { convertStatusText } = store;
const link = ref<string>(""); const link = ref<string>("");
const dataStore = useDataStore(); const dataStore = useDataStore();
const routeName = router.currentRoute.value.name; const routeName = router.currentRoute.value.name;
@ -37,6 +44,7 @@ const id = ref<string>(
? route.params.id.toString() ? route.params.id.toString()
: "" : ""
); // id path ); // id path
const rowsApprover = ref<RowsType>();
const myform = ref<QForm | null>(null); //form const myform = ref<QForm | null>(null); //form
const tranferOrg = ref(""); // const tranferOrg = ref(""); //
const dateCommand = ref<Date>(new Date()); // const dateCommand = ref<Date>(new Date()); //
@ -73,6 +81,69 @@ const dataDetail = ref<any>({});
const modalWorkflow = ref<boolean>(false); const modalWorkflow = ref<boolean>(false);
const columnsCommanders = ref<QTableProps["columns"]>([
{
name: "no",
align: "left",
label: "ลำดับ",
sortable: true,
field: "no",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "fullName",
align: "left",
label: "ชื่อ-นามสกุล",
sortable: true,
field: "fullName",
format(val, row) {
return `${row.prefix}${row.firstName} ${row.lastName}`;
},
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "positionName",
align: "left",
label: "ตำแหน่ง",
sortable: true,
field: "positionName",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "approveStatus",
align: "left",
label: "สถานะ",
sortable: true,
field: "approveStatus",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "comment",
align: "left",
label: "ความคิดเห็นและเหตุผล",
field: "comment",
sortable: true,
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "rejectDate",
align: "left",
label: "วันสุดท้ายที่ยับยั้ง",
field: "rejectDate",
sortable: true,
headerStyle: "font-size: 14px",
style: "font-size: 14px",
format(val, row) {
return `${row.rejectDate ? date2Thai(row.rejectDate) : "-"}`;
},
},
]);
/** /**
* งกนเปลยนเป string ของ status * งกนเปลยนเป string ของ status
* @param val value ของ status true/false * @param val value ของ status true/false
@ -159,6 +230,10 @@ async function fectDataresign(id: string) {
noteReason.value = data.reason; noteReason.value = data.reason;
remark.value = data.remark; remark.value = data.remark;
rowsApprover.value = {
commanders: data.commanders,
approvers: data.approvers,
};
files.value = data.docs; files.value = data.docs;
dataDetail.value = data; dataDetail.value = data;
}) })
@ -521,52 +596,56 @@ onMounted(async () => {
</div> </div>
</div> </div>
<q-separator /> <q-separator />
<div class="row col-12 q-pa-md"> <div class="col-12">
<div class="col-12 row bg-white q-col-gutter-md"> <d-table
<div class="col-xs-6 row items-start"> ref="table"
<div class="col-12 text-top">สถานะ</div> :columns="columnsCommanders"
<div class="col-12 text-detail"> :rows="rowsApprover?.commanders ?? []"
{{ row-key="key"
dataDetail.commanderReject !== null flat
? statusOrder(dataDetail.commanderReject) bordered
: "-" :paging="true"
}} dense
</div> :rows-per-page-options="[1, 25, 50, 100]"
</div>
<div class="col-xs-6 row items-start">
<div class="col-12 text-top">นสดทายทบย</div>
<div class="col-12 text-detail">
{{
dataDetail.commanderRejectDate !== null
? date2Thai(dataDetail.commanderRejectDate)
: "-"
}}
</div>
</div>
<div class="col-xs-12 row items-start">
<div class="col-12 text-top">ความคดเหนและเหตผล</div>
<div
class="col-12 text-detail"
v-if="dataDetail.commanderReject === false"
> >
{{ <template v-slot:header="props">
dataDetail.commanderApproveReason !== null <q-tr :props="props">
? dataDetail.commanderApproveReason <q-th
: "-" v-for="col in props.cols"
}} :key="col.name"
</div> :props="props"
<div
class="col-12 text-detail"
v-if="dataDetail.commanderReject === true"
> >
<span class="text-weight-medium">{{
col.label
}}</span>
</q-th>
</q-tr>
</template>
<template v-slot:body="props">
<q-tr :props="props" class="cursor-pointer">
<q-td
v-for="col in props.cols"
:key="col.name"
:props="props"
>
<div v-if="col.name == 'no'">
{{ props.rowIndex + 1 }}
</div>
<div v-else-if="col.name == 'approveStatus'">
{{ {{
dataDetail.commanderRejectReason !== null props.row.approveStatus
? dataDetail.commanderRejectReason ? convertStatusText(props.row.approveStatus)
: "-" : "-"
}} }}
</div> </div>
<div v-else>
{{ col.value ? col.value : "-" }}
</div> </div>
</div> </q-td>
</q-tr>
</template>
</d-table>
</div> </div>
</q-card> </q-card>
</div> </div>
@ -584,12 +663,28 @@ onMounted(async () => {
<q-separator /> <q-separator />
<div class="row col-12 q-pa-md"> <div class="row col-12 q-pa-md">
<div class="col-12 row bg-white q-col-gutter-md"> <div class="col-12 row bg-white q-col-gutter-md">
<div class="col-xs-6 row items-start">
<div class="col-12 text-top"> - นามสก</div>
<div class="col-12 text-detail">
{{
rowsApprover &&
rowsApprover.approvers &&
rowsApprover.approvers[0]?.firstName
? `${rowsApprover?.approvers[0].prefix}${rowsApprover?.approvers[0].firstName} ${rowsApprover?.approvers[0].lastName}`
: "-"
}}
</div>
</div>
<div class="col-xs-6 row items-start"> <div class="col-xs-6 row items-start">
<div class="col-12 text-top">สถานะ</div> <div class="col-12 text-top">สถานะ</div>
<div class="col-12 text-detail"> <div class="col-12 text-detail">
{{ {{
dataDetail.oligarchReject !== null rowsApprover &&
? statusOrder(dataDetail.oligarchReject) rowsApprover.approvers &&
rowsApprover.approvers[0]?.approveStatus
? convertStatusText(
rowsApprover?.approvers[0].approveStatus
)
: "-" : "-"
}} }}
</div> </div>
@ -598,31 +693,22 @@ onMounted(async () => {
<div class="col-12 text-top">นสดทายทบย</div> <div class="col-12 text-top">นสดทายทบย</div>
<div class="col-12 text-detail"> <div class="col-12 text-detail">
{{ {{
dataDetail.oligarchRejectDate !== null rowsApprover &&
? date2Thai(dataDetail.oligarchRejectDate) rowsApprover.approvers &&
rowsApprover.approvers[0]?.rejectDate
? date2Thai(rowsApprover?.approvers[0].rejectDate)
: "-" : "-"
}} }}
</div> </div>
</div> </div>
<div class="col-xs-12 row items-start"> <div class="col-xs-12 row items-start">
<div class="col-12 text-top">ความคดเหนและเหตผล</div> <div class="col-12 text-top">ความคดเหนและเหตผล</div>
<div <div class="col-12 text-detail">
class="col-12 text-detail"
v-if="dataDetail.oligarchReject == false"
>
{{ {{
dataDetail.oligarchApproveReason !== null rowsApprover &&
? dataDetail.oligarchApproveReason rowsApprover.approvers &&
: "-" rowsApprover.approvers[0]?.comment
}} ? rowsApprover?.approvers[0].comment
</div>
<div
class="col-12 text-detail"
v-else-if="dataDetail.oligarchReject == true"
>
{{
dataDetail.oligarchRejectReason !== null
? dataDetail.oligarchRejectReason
: "-" : "-"
}} }}
</div> </div>
@ -691,3 +777,13 @@ onMounted(async () => {
</q-card> </q-card>
</q-dialog> </q-dialog>
</template> </template>
<style scoped>
.text-top {
color: gray;
font-weight: 400;
padding-bottom: 3px;
}
.text-detail {
font-weight: 500;
}
</style>