เพิ่ม Ui ตำแหน่งตอนสร้างรอบสมัคร

This commit is contained in:
Kittapath 2023-04-05 00:59:05 +07:00
parent b42d797c78
commit 3dcdba77a6
14 changed files with 420 additions and 273 deletions

View file

@ -3,17 +3,29 @@ const candidate = `${env.API_URI}/candidate/`
const periodExam = `${env.API_URI}/period-exam/`
export default {
candidateInformation: (examId: string) => `${candidate}information/${examId}`,
candidateAddress: (examId: string) => `${candidate}address/${examId}`,
candidateFamily: (examId: string) => `${candidate}family/${examId}`,
candidateOccupation: (examId: string) => `${candidate}occupation/${examId}`,
candidateEducation: (examId: string) => `${candidate}education/${examId}`,
candidateCareer: (examId: string) => `${candidate}career/${examId}`,
candidateCheckCreate: (examId: string) => `${candidate}check/${examId}`,
candidateRegister: (examId: string) => `${candidate}register/${examId}`,
candidatePayment: (examId: string) => `${candidate}payment/${examId}`,
candidateStatus: (examId: string) => `${candidate}status/${examId}`,
candidateInformation: (examId: string, positionId: string) =>
`${candidate}information/${examId}/${positionId}`,
candidateAddress: (examId: string, positionId: string) =>
`${candidate}address/${examId}/${positionId}`,
candidateFamily: (examId: string, positionId: string) =>
`${candidate}family/${examId}/${positionId}`,
candidateOccupation: (examId: string, positionId: string) =>
`${candidate}occupation/${examId}/${positionId}`,
candidateEducation: (examId: string, positionId: string) =>
`${candidate}education/${examId}/${positionId}`,
candidateCareer: (examId: string, positionId: string) =>
`${candidate}career/${examId}/${positionId}`,
candidateCheckCreate: (examId: string, positionId: string) =>
`${candidate}check/${examId}/${positionId}`,
candidateRegister: (examId: string, positionId: string) =>
`${candidate}register/${examId}/${positionId}`,
candidatePayment: (examId: string, positionId: string) =>
`${candidate}payment-image/${examId}/${positionId}`,
candidateProfile: (examId: string, positionId: string) =>
`${candidate}profile-image/${examId}/${positionId}`,
candidateStatus: (examId: string, positionId: string) =>
`${candidate}status/${examId}/${positionId}`,
periodExamId: (examId: string) => `${periodExam}${examId}`,
candidateId: (examId: string) => `${candidate}${examId}`,
candidateId: (examId: string, positionId: string) => `${candidate}${examId}/${positionId}`,
candidate
}

View file

@ -1,67 +1,77 @@
<template>
<div class="q-pa-md row items-center justify-center">
<div class="col-xs-12 col-sm-8 col-md-6">
<q-card flat class="q-pa-md q-mb-sm" :class="getClass(status)">
<div v-if="status != 'done'" class="text-orange-6 text-bold">
<q-icon name="mdi-timer-sand" size="22px" color="orange-5" class="q-mr-sm" />เจาหนาทกำลงตรวจสถานทสอบ
</div>
<div v-else class="text-green-6 text-bold">
<q-icon name="mdi-checkbox-marked-circle-outline" size="22px" color="green" class="q-mr-sm" />สมครสอบสำเร
</div>
</q-card>
<div class="q-pa-md row items-center justify-center">
<div class="col-xs-12 col-sm-8 col-md-6">
<q-card flat class="q-pa-md q-mb-sm" :class="getClass(status)">
<div v-if="status != 'done' && status != 'checkPoint'" class="text-orange-6 text-bold">
<q-icon
name="mdi-timer-sand"
size="22px"
color="orange-5"
class="q-mr-sm"
/>
</div>
<div v-else class="text-green-6 text-bold">
<q-icon
name="mdi-checkbox-marked-circle-outline"
size="22px"
color="green"
class="q-mr-sm"
/>
</div>
</q-card>
<q-card bordered flat class="col-12 row">
<div class="text-bold col-12 row q-px-md q-py-sm items-center bg-grey-2">
ตรประจำตวผสอบ
<q-space />
<q-btn dense size="12px" flat color="primary" @click="download" icon="mdi-download">
<q-tooltip>มพตรประจำตวผสอบ</q-tooltip>
</q-btn>
<q-card bordered flat class="col-12 row">
<div class="text-bold col-12 row q-px-md q-py-sm items-center bg-grey-2">
ตรประจำตวผสอบ
<q-space />
<q-btn dense size="12px" flat color="primary" @click="download" icon="mdi-download">
<q-tooltip>มพตรประจำตวผสอบ</q-tooltip>
</q-btn>
</div>
<div class="col-8 q-pa-md">
<div class="q-pt-xs row">
<div class=""> :</div>
<div class="text-black text-bold q-pl-sm">{{ fullName }}</div>
</div>
<div class="col-8 q-pa-md">
<div class="q-pt-xs row">
<div class=""> :</div>
<div class="text-black text-bold q-pl-sm">{{ fullName }}</div>
</div>
<div class="q-pt-xs row">
<div class="">เลขประจำตวสอบ :</div>
<div class="text-black text-bold q-pl-sm">{{ examNumber }}</div>
</div>
<div class="q-pt-xs row">
<div class="">เลขประจำตวประชาชน :</div>
<div class="text-black q-pl-sm">{{ citizenId }}</div>
</div>
<div class="q-pt-xs row">
<div class="">เวลาสอบ :</div>
<div class="text-black q-pl-sm">{{ examTime }}</div>
</div>
<div class="q-pt-xs row">
<div class="">สถานทสอบ :</div>
<div class="text-black q-pl-sm">{{ examLocation }}</div>
</div>
<div class="q-pt-xs row">
<div class="">นท :</div>
<div class="text-black q-pl-sm">{{ floor }}</div>
</div>
<div class="q-pt-xs row">
<div class="">องสอบ :</div>
<div class="text-black q-pl-sm">{{ examRoom }}</div>
</div>
<div class="q-pt-xs row">
<div class="">เลขท :</div>
<div class="text-black q-pl-sm">{{ seatNumber }}</div>
</div>
<div class="q-pt-xs row">
<div class="">เลขประจำตวสอบ :</div>
<div class="text-black text-bold q-pl-sm">{{ examNumber }}</div>
</div>
<div class="q-pt-xs row">
<div class="">เลขประจำตวประชาชน :</div>
<div class="text-black q-pl-sm">{{ citizenId }}</div>
</div>
<div class="q-pt-xs row">
<div class="">เวลาสอบ :</div>
<div class="text-black q-pl-sm">{{ examTime }}</div>
</div>
<div class="q-pt-xs row">
<div class="">สถานทสอบ :</div>
<div class="text-black q-pl-sm">{{ examLocation }}</div>
</div>
<div class="q-pt-xs row">
<div class="">นท :</div>
<div class="text-black q-pl-sm">{{ floor }}</div>
</div>
<div class="q-pt-xs row">
<div class="">องสอบ :</div>
<div class="text-black q-pl-sm">{{ examRoom }}</div>
</div>
<div class="q-pt-xs row">
<div class="">เลขท :</div>
<div class="text-black q-pl-sm">{{ seatNumber }}</div>
</div>
</div>
<q-card-section class="col-4 flex flex-center">
<q-img
class="rounded-borders"
src="https://images.unsplash.com/photo-1438761681033-6461ffad8d80?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8cGVyc29ufGVufDB8fDB8fA%3D%3D&w=1000&q=80"
:ratio="1"
style="max-width: 300px; max-height: 300px"
/>
</q-card-section>
</q-card>
<q-card-section class="col-4 flex flex-center">
<q-img
class="rounded-borders"
src="https://images.unsplash.com/photo-1438761681033-6461ffad8d80?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8cGVyc29ufGVufDB8fDB8fA%3D%3D&w=1000&q=80"
:ratio="1"
style="max-width: 300px; max-height: 300px"
/>
</q-card-section>
</q-card>
</div>
<!-- <q-btn color="positive" @click="testChangeStatus">จัดที่นั่ง</q-btn> -->
</div>
@ -92,7 +102,7 @@ const seatNumber = ref<string>('75')
const download = () => {}
const getClass = (val: string) => {
return val == 'done' ? 'bg-green-1' : 'bg-yellow-2'
return val == 'done' || val == 'checkPoint' ? 'bg-green-1' : 'bg-yellow-2'
}
</script>

View file

@ -74,6 +74,7 @@ const statusEdit = ref<boolean>(false)
const acceptTermOfUse = ref<boolean>(false)
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const formInformation = ref<any>({})
const formAddress = ref<any>({})
const formFamily = ref<any>({})
@ -102,7 +103,7 @@ const saveForm = async () => {
//saveform
loader.value = true
await http
.get(config.API.candidateRegister(examId.value))
.get(config.API.candidateRegister(examId.value, positionId.value))
.then(() => {
success($q, 'สมัครสอบสำเร็จสำเร็จ')
})
@ -135,7 +136,7 @@ const saveData = async () => {
type.value = defaultOccupation.value.other
loader.value = true
await http
.post(config.API.candidateId(examId.value), {
.post(config.API.candidateId(examId.value, positionId.value), {
prefixId: defaultInformation.value.prefixId,
lastName: defaultInformation.value.lastname,
citizenProvinceId: defaultInformation.value.provinceId,

View file

@ -1,138 +1,159 @@
<template>
<div class="col-12">
<div class="row q-px-sm">
<div class="text-bold text-subtitle1 q-pb-md">เลอกวการชำระเง</div>
<div class="row col-12 q-gutter-y-md q-mb-lg">
<q-list bordered class="col-12 rounded-borders">
<q-item tag="label" v-ripple class="q-pa-md">
<q-item-section avatar>
<q-icon name="mdi-cellphone-settings" color="positive" size="30px" />
</q-item-section>
<q-item-section>
<q-item-label class="text-weight-medium text-subtitle1">โอนเงนผานมอถ</q-item-label>
<q-item-label caption class="gt-xs">อนหลงแจงการโอนภายใน 24 วโมง</q-item-label>
</q-item-section>
<q-item-section avatar class="gt-xs">
<q-avatar size="32px">
<q-img src="@/assets/krungthai.png" class="col-12"/>
</q-avatar>
</q-item-section>
<q-item-section side>
<q-radio v-model="pay" val="teal" color="blue" />
</q-item-section>
</q-item>
<q-separator v-show="pay == 'teal'" />
<q-slide-transition :duration="100" class="">
<div v-show="pay == 'teal'" class="q-pa-md bg-grey-1">
<div class="row q-col-gutter-sm">
<div class=" col-xs-12 col-sm-7">
<q-card bordered class="items-start q-pa-md row q-mb-sm" style="height: 300px">
<div class="row col-12">
<div class="col-12 row no-wrap items-center">
<q-avatar size="50px">
<q-img src="@/assets/krungthai.png"/>
</q-avatar>
<div class="column q-pl-md">
<strong>ธนาคารกรงไทย</strong>
สำนกงานทรพยากรบคคล
<div>387-3-94793-0</div>
</div>
</div>
<div class="col-12">
<q-separator class="q-my-md"/>
<div class="q-pb-sm">
<span class="text-weight-medium">อบญช :</span>
<span class="text-blue q-pl-sm">สำนกงานทรพยากรบคคล</span>
</div>
<div class="q-pb-sm">
<span class="text-weight-medium">ธนาคารกรงไทย :</span>
<span class="text-blue q-pl-sm"> 387-3-94793-0</span>
</div>
<div class="q-pb-sm">
<span class="text-weight-medium">รหสใบสงซ :</span>
<span class="text-blue q-pl-sm">12837495985900</span>
</div>
<div>
<span class="text-weight-medium">ยอดสทธ (บาท) :</span>
<span class="text-blue q-pl-sm text-bold">200.00</span>
</div>
</div>
<div class="col-12 text-grey-6 q-mt-xl">
** าตองการเเกไขหลกฐานการโอนเง กรณาอปโหลดซ
<div class="text-bold text-subtitle1 q-pb-md">เลอกวการชำระเง</div>
<div class="row col-12 q-gutter-y-md q-mb-lg">
<q-list bordered class="col-12 rounded-borders">
<q-item tag="label" v-ripple class="q-pa-md">
<q-item-section avatar>
<q-icon name="mdi-cellphone-settings" color="positive" size="30px" />
</q-item-section>
<q-item-section>
<q-item-label class="text-weight-medium text-subtitle1"
>โอนเงนผานมอถ</q-item-label
>
<q-item-label caption class="gt-xs"
>อนหลงแจงการโอนภายใน 24 วโมง</q-item-label
>
</q-item-section>
<q-item-section avatar class="gt-xs">
<q-avatar size="32px">
<q-img src="@/assets/krungthai.png" class="col-12" />
</q-avatar>
</q-item-section>
<q-item-section side>
<q-radio v-model="pay" val="teal" color="blue" />
</q-item-section>
</q-item>
<q-separator v-show="pay == 'teal'" />
<q-slide-transition :duration="100" class="">
<div v-show="pay == 'teal'" class="q-pa-md bg-grey-1">
<div class="row q-col-gutter-sm">
<div class="col-xs-12 col-sm-7">
<q-card bordered class="items-start q-pa-md row q-mb-sm" style="height: 300px">
<div class="row col-12">
<div class="col-12 row no-wrap items-center">
<q-avatar size="50px">
<q-img src="@/assets/krungthai.png" />
</q-avatar>
<div class="column q-pl-md">
<strong>ธนาคารกรงไทย</strong>
สำนกงานทรพยากรบคคล
<div>387-3-94793-0</div>
</div>
</div>
</q-card>
</div>
<div class=" col-xs-12 col-sm-5">
<label for="file-upload" class="col-12 row"><!-- :src="img" -->
<q-img src="@/assets/ex_slip.jpeg" fit="contain" style="min-height: 300px; max-height: 300px;" class="col-12 bg-white">
<div class="absolute-bottom text-center">หลกฐานชำระเง</div>
</q-img>
</label>
<input id="file-upload" type="file" />
</div>
<div class="col-12">
<q-separator class="q-my-md" />
<div class="q-pb-sm">
<span class="text-weight-medium">อบญช :</span>
<span class="text-blue q-pl-sm">สำนกงานทรพยากรบคคล</span>
</div>
<div class="q-pb-sm">
<span class="text-weight-medium">ธนาคารกรงไทย :</span>
<span class="text-blue q-pl-sm"> 387-3-94793-0</span>
</div>
<div class="q-pb-sm">
<span class="text-weight-medium">รหสใบสงซ :</span>
<span class="text-blue q-pl-sm">12837495985900</span>
</div>
<div>
<span class="text-weight-medium">ยอดสทธ (บาท) :</span>
<span class="text-blue q-pl-sm text-bold">200.00</span>
</div>
</div>
<div class="col-12 text-grey-6 q-mt-xl">
** าตองการเเกไขหลกฐานการโอนเง กรณาอปโหลดซ
</div>
</div>
</q-card>
</div>
<div class="col-xs-12 col-sm-5">
<label for="file-upload" class="col-12 row"
><!-- :src="img" -->
<q-img
src="@/assets/ex_slip.jpeg"
fit="contain"
style="min-height: 300px; max-height: 300px"
class="col-12 bg-white"
>
<div class="absolute-bottom text-center">หลกฐานชำระเง</div>
</q-img>
</label>
<input id="file-upload" type="file" />
</div>
</div>
</q-slide-transition>
</q-list>
</div>
</q-slide-transition>
</q-list>
<q-list bordered class="col-12 rounded-borders">
<q-item tag="label" v-ripple class="q-pa-md">
<q-item-section avatar>
<q-icon name="mdi-cash" color="positive" size="30px" />
</q-item-section>
<q-item-section>
<q-item-label class="text-weight-medium text-subtitle1">โอนเงนผานทางเครอง ATM / เคานเตอรธนาคาร</q-item-label>
<q-item-label caption class="gt-xs">อนนทหลงชำระ</q-item-label>
</q-item-section>
<q-item-section avatar class="gt-xs">
<q-avatar size="32px">
<q-img src="@/assets/krungthai.png" class="col-12"/>
</q-avatar>
</q-item-section>
<q-item-section side>
<q-radio v-model="pay" val="orange" color="blue" />
</q-item-section>
</q-item>
<q-separator v-show="pay == 'orange'" />
<q-slide-transition :duration="100">
<div v-show="pay == 'orange'" class="q-pa-md bg-grey-1">
<q-card bordered class="q-pa-md">
<div class="q-pb-sm">
<span class="text-weight-medium">รหสใบสงซ :</span>
<span class="text-blue q-pl-sm">12837495985900</span>
</div>
<div>
<span class="text-weight-medium">ยอดสทธ (บาท) :</span>
<span class="text-blue q-pl-sm text-bold">200.00</span>
</div>
<q-btn
color="blue"
icon="print"
class="q-px-md q-mt-md"
outline
dense
label="พิมพ์ใบแจ้งการชำระเงิน"
/>
</q-card>
<div class="q-pt-md q-pb-xs text-bold">ธนาคารกรงไทย</div>
<div class="q-pb-md">สอดบตร ATM กดรหสและเลอกรายการ</div>
<ul class="q-gutter-y-sm">
<li>นท 1 บรการอนๆ</li>
<li>นท 2 ชำระคาบรการ</li>
<li>นท 3 ระบรหสบร</li>
<li>นท 4 เลอกบญชชำระเง ญชของตวทานวาเปนบญชออมทรพย หร กระแสรายว</li>
<li>นท 5 ใสรหสบรทฯ <span class="text-blue text-bold">2111</span> และ ใส Ref No.1 นดวยเครองหมายจ ( . ) แลวตามดวย Ref No.2 (ใน "ใบแจ้งการชำระเงิน")</li>
<li>ยกตวอยางเช Ref No.1 012345 และ Ref No.2 308833องใส เป 012345.308833</li>
<li>นท 6 ใสจำนวนเงนทชำระรวมหนวยสตางค</li>
<li>นท 7 ตรวจสอบรายการ</li>
</ul>
</div>
</q-slide-transition>
</q-list>
</div>
<!-- <q-card flat class="q-pa-md text-left row q-mb-md" :class="getClass(status)">
<q-list bordered class="col-12 rounded-borders">
<q-item tag="label" v-ripple class="q-pa-md">
<q-item-section avatar>
<q-icon name="mdi-cash" color="positive" size="30px" />
</q-item-section>
<q-item-section>
<q-item-label class="text-weight-medium text-subtitle1"
>โอนเงนผานทางเครอง ATM / เคานเตอรธนาคาร</q-item-label
>
<q-item-label caption class="gt-xs">อนนทหลงชำระ</q-item-label>
</q-item-section>
<q-item-section avatar class="gt-xs">
<q-avatar size="32px">
<q-img src="@/assets/krungthai.png" class="col-12" />
</q-avatar>
</q-item-section>
<q-item-section side>
<q-radio v-model="pay" val="orange" color="blue" />
</q-item-section>
</q-item>
<q-separator v-show="pay == 'orange'" />
<q-slide-transition :duration="100">
<div v-show="pay == 'orange'" class="q-pa-md bg-grey-1">
<q-card bordered class="q-pa-md">
<div class="q-pb-sm">
<span class="text-weight-medium">รหสใบสงซ :</span>
<span class="text-blue q-pl-sm">12837495985900</span>
</div>
<div>
<span class="text-weight-medium">ยอดสทธ (บาท) :</span>
<span class="text-blue q-pl-sm text-bold">200.00</span>
</div>
<q-btn
color="blue"
icon="print"
class="q-px-md q-mt-md"
outline
dense
label="พิมพ์ใบแจ้งการชำระเงิน"
/>
</q-card>
<div class="q-pt-md q-pb-xs text-bold">ธนาคารกรงไทย</div>
<div class="q-pb-md">สอดบตร ATM กดรหสและเลอกรายการ</div>
<ul class="q-gutter-y-sm">
<li>นท 1 บรการอนๆ</li>
<li>นท 2 ชำระคาบรการ</li>
<li>นท 3 ระบรหสบร</li>
<li>
นท 4 เลอกบญชชำระเง ญชของตวทานวาเปนบญชออมทรพย หร
กระแสรายว
</li>
<li>
นท 5 ใสรหสบรทฯ <span class="text-blue text-bold">2111</span> และ ใส
Ref No.1 นดวยเครองหมายจ ( . ) แลวตามดวย Ref No.2 (ใน
"ใบแจ้งการชำระเงิน")
</li>
<li>
ยกตวอยางเช Ref No.1 012345 และ Ref No.2 308833องใส เป
012345.308833
</li>
<li>นท 6 ใสจำนวนเงนทชำระรวมหนวยสตางค</li>
<li>นท 7 ตรวจสอบรายการ</li>
</ul>
</div>
</q-slide-transition>
</q-list>
</div>
<!-- <q-card flat class="q-pa-md text-left row q-mb-md" :class="getClass(status)">
<div class="text-bold col-12" :class="getFontColor(status)">
{{ message(status) }}
</div>
@ -141,7 +162,7 @@
</div>
</q-card> -->
<!-- <q-file
<!-- <q-file
borderless
v-model="fileData"
stack-label
@ -152,9 +173,9 @@
<div class="absolute-bottom text-center">หลกฐานชำระเง</div>
</q-img>
</q-file> -->
</div>
</div>
<!-- <div class="q-pa-md text-center col-12" v-if="status == 'payment' || status == 'rejectPayment'">
</div>
<!-- <div class="q-pa-md text-center col-12" v-if="status == 'payment' || status == 'rejectPayment'">
<q-btn
color="primary"
@ -165,13 +186,13 @@
<div class="text-black text-center q-pb-lg q-pt-sm col-12 text-deep-orange">
<q-icon name="mdi-alert" size="18px" color="deep-orange" class="q-mr-sm" />าตองการเเกไขหลกฐานการโอนเงนกรณาอปโหลดซ
</div> -->
<div class="row col-12 justify-center">
<q-btn
:color="pay === null ? 'grey': 'primary'"
:disable="pay === null"
style="width: 200px;"
label="แจ้งการชำระเงิน"
/>
<div class="row col-12 justify-center">
<q-btn
:color="pay === null ? 'grey' : 'primary'"
:disable="pay === null"
style="width: 200px"
label="แจ้งการชำระเงิน"
/>
</div>
</template>
@ -204,6 +225,7 @@ const loader = ref<boolean>(false)
const pay = ref(null)
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const uploadImg = (file: any) => {
fileData.value = null
@ -216,7 +238,7 @@ const uploadImg = (file: any) => {
const clickPayment = async () => {
loader.value = true
await http
.get(config.API.candidatePayment(examId.value))
.get(config.API.candidatePayment(examId.value, positionId.value))
.then(() => {
success($q, 'ส่งหลักฐานชำระเงินสำเร็จ')
})
@ -235,6 +257,8 @@ const getClass = (val: string) => {
return 'bg-red-2'
case 'checkSeat':
return 'bg-light-green-3'
case 'checkPoint':
return 'bg-light-green-3'
case 'done':
return 'bg-light-green-3'
default:
@ -251,6 +275,8 @@ const message = (val: string) => {
return 'หลักฐานการชำระเงินผิดพลาด'
case 'checkSeat':
return 'ตรวจสอบเเล้ว'
case 'checkPoint':
return 'ตรวจสอบเเล้ว'
case 'done':
return 'ตรวจสอบเเล้ว'
default:
@ -267,6 +293,8 @@ const getFontColor = (val: string) => {
return 'text-red-12'
case 'checkSeat':
return 'text-green'
case 'checkPoint':
return 'text-green'
case 'done':
return 'text-green'
default:

View file

@ -97,8 +97,12 @@
/>
</div>
<div class="col-xs-12 q-gutter-sm items-center flex q-mb-sm row">
<div class="text-bold" v-if="$q.screen.gt.xs">ที่อยู่ปัจจุบันตรงกับที่อยู่ตามทะเบียนบ้าน</div>
<div class="text-bold col-12 q-pt-sm" v-else>ที่อยู่ปัจจุบันตรงกับที่อยู่ตามทะเบียนบ้าน</div>
<div class="text-bold" v-if="$q.screen.gt.xs">
อยจจนตรงกบทอยตามทะเบยนบาน
</div>
<div class="text-bold col-12 q-pt-sm" v-else>
อยจจนตรงกบทอยตามทะเบยนบาน
</div>
<q-radio
v-model="defaultAddress.same"
checked-icon="task_alt"
@ -233,6 +237,7 @@ const props = defineProps({
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const edit = ref<boolean>(true)
const myform = ref<any>({})
const loader = ref<boolean>(false)
@ -266,7 +271,7 @@ onMounted(async () => {
const fetchData = async () => {
// loader.value = true;
await http
.get(config.API.candidateAddress(examId.value))
.get(config.API.candidateAddress(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
defaultAddress.value.address = data.registAddress

View file

@ -224,6 +224,7 @@ const editRow = ref<boolean>(false) //เช็คมีการแก้ไข
const checkValidate = ref<boolean>(false) //validate data
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const rows = ref<RequestItemsObject[]>([])
const filter = ref<string>('') //search data table
@ -292,7 +293,7 @@ onMounted(async () => {
const fetchData = async () => {
loader.value = true
await http
.get(config.API.candidateCareer(examId.value))
.get(config.API.candidateCareer(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
rows.value = []
@ -429,7 +430,7 @@ const clickSave = async () => {
const saveData = async () => {
loader.value = true
await http
.post(config.API.candidateCareer(examId.value), {
.post(config.API.candidateCareer(examId.value, positionId.value), {
name: location.value,
position: position.value,
salary: salary.value,

View file

@ -229,6 +229,7 @@ const checkValidate = ref<boolean>(false) //validate data ผ่านหรื
const rows = ref<RequestItemsObject[]>([])
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const filter = ref<string>('') //search data table
const visibleColumns = ref<String[]>([])
@ -297,7 +298,7 @@ onMounted(async () => {
const fetchData = async () => {
loader.value = true
await http
.get(config.API.candidateEducation(examId.value))
.get(config.API.candidateEducation(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
rows.value = []
@ -455,7 +456,7 @@ const clickSave = async () => {
const saveData = async () => {
loader.value = true
await http
.post(config.API.candidateEducation(examId.value), {
.post(config.API.candidateEducation(examId.value, positionId.value), {
educationLevelId: educationLevelId.value,
major: major.value,
scores: scores.value,

View file

@ -282,6 +282,7 @@ const edit = ref<boolean>(true)
const myform = ref<any>({})
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const loader = ref<boolean>(false)
const emit = defineEmits(['update:form'])
@ -301,7 +302,7 @@ onMounted(async () => {
const fetchData = async () => {
loader.value = true
await http
.get(config.API.candidateFamily(examId.value))
.get(config.API.candidateFamily(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
defaultFamily.value.prefixIdC = data.marryPrefixId

View file

@ -381,6 +381,7 @@ const { date2Thai, calAge } = mixin
const districtOptions = ref<DataOption[]>([])
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const edit = ref<boolean>(true)
const myform = ref<any>({})
const disabledPic = ref<boolean>(false)
@ -406,7 +407,7 @@ onMounted(async () => {
const fetchData = async () => {
loader.value = true
await http
.get(config.API.candidateInformation(examId.value))
.get(config.API.candidateInformation(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
defaultInformation.value.prefixId = data.prefixId

View file

@ -268,6 +268,7 @@ const myform = ref<any>({})
const loader = ref<boolean>(false)
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const emit = defineEmits(['update:form'])
@ -286,7 +287,7 @@ onMounted(async () => {
const fetchData = async () => {
loader.value = true
await http
.get(config.API.candidateOccupation(examId.value))
.get(config.API.candidateOccupation(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
defaultOccupation.value.status = data.occupationType

View file

@ -12,7 +12,7 @@ export default [
// }
// },
{
path: '/exam/:id',
path: '/exam/:id/:positionId',
name: 'examDetail',
component: Detail,
meta: {

View file

@ -49,7 +49,7 @@
</q-step>
</q-stepper>
<q-dialog :model-value="modalConsend" persistent>
<q-card :style="$q.screen.gt.xs ? 'min-width: 55vw':'min-width: 80vw'">
<q-card :style="$q.screen.gt.xs ? 'min-width: 55vw' : 'min-width: 80vw'">
<Conference :ok="consendOk" :close="consenClose" />
</q-card>
</q-dialog>
@ -57,6 +57,9 @@
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import { useCounterMixin } from '@/stores/mixin'
import { useQuasar } from 'quasar'
import { useExamDataStore } from '@/modules/01_exam/store'
import http from '@/plugins/http'
import config from '@/app.config'
@ -64,38 +67,50 @@ import ExamForm from '@/modules/01_exam/components/ExamForm.vue'
import ExamPayment from '@/modules/01_exam/components/ExamPayment.vue'
import ExamFinished from '@/modules/01_exam/components/ExamFinished.vue'
import Conference from '@/modules/01_exam/components/Conference.vue'
import { useRoute } from 'vue-router'
const $q = useQuasar()
const store = useExamDataStore()
const mixin = useCounterMixin()
const { modalError } = mixin
const step = ref<number>(1)
const stepRaw = ref<number>(1)
const tittle = ref<string>('')
const route = useRoute()
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
const loader = ref<boolean>(false)
const status = ref<string>('register')
const modalConsend = ref<boolean>(false)
onMounted(async () => {
stepRaw.value = 3
step.value = 3
/* await fetchPeriodExam()
await candidateCheck() */
// stepRaw.value = 3
// step.value = 3
await fetchPeriodExam()
await candidateCheck()
})
const candidateCheck = async () => {
loader.value = true
await http
.get(config.API.candidateCheckCreate(examId.value))
.get(config.API.candidateCheckCreate(examId.value, positionId.value))
.then(async (res) => {
const data = res.data.result
store.consend = data
if (store.consend == true) {
await fetchStep()
store.consend = data.consend
const poition = data.positionExam
if (poition == true) {
modalError(
$q,
'คุณได้สมัครสอบตำแหน่งอื่นในรอบนี้แล้ว',
'คุณได้สมัครสอบตำแหน่งอื่นในรอบนี้แล้ว'
)
} else {
modalConsend.value = true
stepRaw.value = 2
step.value = 2
if (store.consend == true) {
await fetchStep()
} else {
modalConsend.value = true
stepRaw.value = 2
step.value = 2
}
}
})
.catch(() => {})
@ -107,7 +122,7 @@ const candidateCheck = async () => {
const fetchStep = async () => {
loader.value = true
await http
.get(config.API.candidateStatus(examId.value))
.get(config.API.candidateStatus(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
status.value = data
@ -132,6 +147,9 @@ const fetchStep = async () => {
} else if (data == 'checkSeat') {
stepRaw.value = 4
step.value = 4
} else if (data == 'checkPoint') {
stepRaw.value = 4
step.value = 4
} else if (data == 'done') {
stepRaw.value = 4
step.value = 4

View file

@ -364,6 +364,31 @@ export const useCounterMixin = defineStore('mixin', () => {
}
}
const statusCandidate = (val: string) => {
switch (val) {
case 'register':
return 'ยังไม่สมัครสอบ'
case 'checkRegister':
return 'รอเจ้าหน้าที่ตรวจสอบข้อมูล'
case 'payment':
return 'ชำระค่าสมัครสอบ'
case 'rejectRegister':
return 'คุณสมบัติสมัครสอบไม่ผ่าน'
case 'checkPayment':
return 'รอเจ้าหน้าที่ตรวจสอบหลักฐานชำระเงิน'
case 'rejectPayment':
return 'หลักฐานชำระเงินไม่ถูกต้อง'
case 'checkSeat':
return 'รอเจ้าหน้าที่จัดที่นั่งสอบ'
case 'checkPoint':
return 'รอเจ้าหน้าที่สรุปคะแนนสอบ'
case 'done':
return 'สอบคัดเลือกสำเร็จ'
default:
return '-'
}
}
/**
* 2
* @param val
@ -414,6 +439,7 @@ export const useCounterMixin = defineStore('mixin', () => {
monthThaiRange,
modalDelete,
modalConfirm,
modalError
modalError,
statusCandidate
}
})

View file

@ -1,19 +1,31 @@
<script setup lang="ts">
import { useQuasar } from 'quasar'
import { ref } from 'vue'
import { onMounted, ref } from 'vue'
// import keycloak from '@/plugins/keycloak'
import { useRoute } from 'vue-router'
import { menuList, options, notiList } from '../interface/main/index'
import keycloak from '@/plugins/keycloak'
import { useCounterMixin } from '@/stores/mixin'
import http from '@/plugins/http'
import config from '@/app.config'
const route = useRoute()
const $q = useQuasar()
const mixin = useCounterMixin() //
const { statusCandidate } = mixin
const miniState = ref<boolean>(false)
const active = ref<number>(0)
const drawerL = ref<boolean>(false)
const fullname = ref<string>('')
const notiTrigger = ref<boolean>(false)
const loader = ref<boolean>(false)
const status = ref<string>('register')
const examId = ref<string>(route.params.id.toString())
const positionId = ref<string>(route.params.positionId.toString())
onMounted(async () => {
await fetchStatus()
})
const toggleBtnLeft = () => {
if (window.innerWidth < 1024) {
@ -51,6 +63,20 @@ const doLogout = () => {
})
}
const fetchStatus = async () => {
loader.value = true
await http
.get(config.API.candidateStatus(examId.value, positionId.value))
.then((res) => {
const data = res.data.result
status.value = data
})
.catch(() => {})
.finally(() => {
loader.value = false
})
}
/**
* งชอผใชงานจาก keycloak
*/
@ -67,30 +93,45 @@ const doLogout = () => {
<q-layout view="lHh LpR lff" class="bgColor text-dark">
<!-- header -->
<q-header flat class="bg-white text-white row justify-center header" height-hint="7">
<q-toolbar style="padding:0% 2%" class="col-xs-12 col-sm-11 col-md-11 col-lg-10">
<q-toolbar-title shrink class="row items-center no-wrap">
<q-btn flat class="bg-white" dense round>
<q-avatar size="35px">
<img src="../assets/logo.png" />
</q-avatar>
</q-btn>
<div class="row q-ml-md text-dark" v-if="$q.screen.gt.xs">
<div class="col-12 textline1">
ระบบทรพยากรบคคล
</div>
<div class="text-caption textline2">
กรงเทพมหานคร
</div>
</div>
</q-toolbar-title>
<q-space/>
<q-btn v-if="$q.screen.gt.xs" class="bg-amber-1 text-amber-9" icon="mdi-logout-variant" size="12px" label="ออกจากระบบ" flat v-close-popup @click="doLogout" />
<q-btn v-else class="bg-amber-1 text-amber-9" icon="mdi-logout-variant" flat v-close-popup @click="doLogout" />
</q-toolbar>
</q-header>
<q-toolbar style="padding: 0% 2%" class="col-xs-12 col-sm-11 col-md-11 col-lg-10">
<q-toolbar-title shrink class="row items-center no-wrap">
<q-btn flat class="bg-white" dense round>
<q-avatar size="35px">
<img src="../assets/logo.png" />
</q-avatar>
</q-btn>
<div class="row q-ml-md text-dark" v-if="$q.screen.gt.xs">
<div class="col-12 textline1">ระบบทรพยากรบคคล</div>
<div class="text-caption textline2">กรงเทพมหานคร</div>
</div>
</q-toolbar-title>
<q-space />
<q-badge outline color="blue" class="q-mr-md text-bold">
{{ statusCandidate(status) }}
</q-badge>
<q-btn
v-if="$q.screen.gt.xs"
class="bg-amber-1 text-amber-9"
icon="mdi-logout-variant"
size="12px"
label="ออกจากระบบ"
flat
v-close-popup
@click="doLogout"
/>
<q-btn
v-else
class="bg-amber-1 text-amber-9"
icon="mdi-logout-variant"
flat
v-close-popup
@click="doLogout"
/>
</q-toolbar>
</q-header>
<!-- end header -->
<q-page-container class="row justify-center">
<q-page style="padding:1.5% 2%" class="col-xs-12 col-sm-11 col-md-11 col-lg-10">
<q-page style="padding: 1.5% 2%" class="col-xs-12 col-sm-11 col-md-11 col-lg-10">
<router-view :key="$route.fullPath" />
</q-page>
</q-page-container>
@ -99,10 +140,10 @@ const doLogout = () => {
<style>
.bgColor {
/* background-image: url("../assets/bg.png");
/* background-image: url("../assets/bg.png");
background-size: cover;
background-size: 100%; */
background: #F6F9FA;
background: #f6f9fa;
}
.tabNative {
@ -118,14 +159,14 @@ const doLogout = () => {
}
.q-card {
box-shadow: 3px 3px 20px -10px rgba(151, 150, 150, 0.261) ;
box-shadow: 3px 3px 20px -10px rgba(151, 150, 150, 0.261);
}
.q-card--bordered {
border: 1px solid #92b4c847;
box-shadow: none !important;
}
.q-stepper{
box-shadow: 3px 3px 20px -10px rgba(151, 150, 150, 0.261) ;
.q-stepper {
box-shadow: 3px 3px 20px -10px rgba(151, 150, 150, 0.261);
}
.q-menu {
box-shadow: 3px 3px 10px 1px rgba(95, 95, 95, 0.15) !important;
@ -140,7 +181,8 @@ const doLogout = () => {
border-radius: 5px;
}
.q-field--outlined .q-field__control:before,.q-field .q-field__control:before{
.q-field--outlined .q-field__control:before,
.q-field .q-field__control:before {
border-color: #c8d3db;
}
.q-field--outlined .q-icon {
@ -167,17 +209,17 @@ const doLogout = () => {
background-color: #a8bbbf;
}
.header{
.header {
border-bottom: 1px solid #92b4c847;
height: 50px;
}
.textline1{
font-size: 0.90rem;
line-height:1.2rem !important;
.textline1 {
font-size: 0.9rem;
line-height: 1.2rem !important;
font-weight: 500;
}
.textline2{
line-height:1rem !important;
.textline2 {
line-height: 1rem !important;
font-weight: 400;
color: #96a9ad;
}