ประเมินผล

This commit is contained in:
DESKTOP-1R2VSQH\Lenovo ThinkPad E490 2023-12-19 17:04:39 +07:00
parent ac007dfc26
commit bdae7034e9
11 changed files with 488 additions and 125 deletions

View file

@ -14,13 +14,15 @@ const store = useEvaluateStore();
flat
ref="stepper"
:bordered="false"
header-nav
>
<q-step
keep-alive
:name="1"
prefix="1"
title="ตรวจสอบคุณสมบัติ"
:done="store.step > 1"
:done="store.currentStep >= 1"
:disable="store.currentStep < 1"
>
</q-step>
@ -28,7 +30,8 @@ const store = useEvaluateStore();
:name="2"
prefix="2"
title="จัดเตรียมเอกสารเล่ม 1"
:done="store.step > 2"
:done="store.currentStep >= 2"
:disable="store.currentStep < 2"
>
</q-step>
@ -36,7 +39,8 @@ const store = useEvaluateStore();
:name="3"
prefix="3"
title="ตรวจสอบเอกสารเล่ม 1"
:done="store.step > 3"
:done="store.currentStep >= 3"
:disable="store.currentStep < 3"
>
</q-step>
@ -44,7 +48,8 @@ const store = useEvaluateStore();
:name="4"
prefix="4"
title="รอตรวจสอบคุณสมบัติ"
:done="store.step > 4"
:done="store.currentStep >= 4"
:disable="store.currentStep < 4"
>
</q-step>
@ -52,7 +57,8 @@ const store = useEvaluateStore();
:name="5"
prefix="5"
title="ประกาศบนเว็บไซต์"
:done="store.step > 5"
:done="store.currentStep >= 5"
:disable="store.currentStep < 5"
>
</q-step>
@ -60,7 +66,8 @@ const store = useEvaluateStore();
:name="6"
prefix="6"
title="จัดเตรียมเอกสารเล่ม 2"
:done="store.step > 6"
:done="store.currentStep >= 6"
:disable="store.currentStep < 6"
>
</q-step>
@ -68,14 +75,27 @@ const store = useEvaluateStore();
:name="7"
prefix="7"
title="ตรวจสอบเอกสารเล่ม 2"
:done="store.step > 7"
:done="store.currentStep >= 7"
:disable="store.currentStep < 7"
>
</q-step>
<q-step :name="8" prefix="8" title="รอพิจารณาผล" :done="store.step > 8">
<q-step
:name="8"
prefix="8"
title="รอพิจารณาผล"
:done="store.currentStep >= 8"
:disable="store.currentStep < 8"
>
</q-step>
<q-step :name="9" prefix="9" title="เสร็จสิ้น" :done="store.step > 9">
<q-step
:name="9"
prefix="9"
title="เสร็จสิ้น"
:done="store.currentStep >= 9"
:disable="store.currentStep < 9"
>
</q-step>
</q-stepper>
</template>

View file

@ -4,6 +4,7 @@ import { useQuasar } from "quasar";
import evaluationFunctions from "@/modules/06_evaluate/stores/evaluationFunction";
import type {
FormSpec,
FormCommand,
FormCommandRef,
} from "@/modules/06_evaluate/interface/evalute";
@ -33,28 +34,45 @@ const mixin = useCounterMixin();
const $q = useQuasar();
const { dialogConfirm, showLoader, hideLoader, messageError } = mixin;
const { fetchCheckStatus, saveEvaluation } = evaluationFunctions;
const { fetchCheckStatus, saveEvaluation, nextPrapare, nextCheckDoc } =
evaluationFunctions;
const props = defineProps({
title: {
type: String,
},
});
const externalLink =
"https://accreditation.ocsc.go.th/accreditation/search/curriculum";
const formCommand = reactive<FormCommand>({
elementaryFullName: "",
elementaryPosition: "",
abovelevelFullname: "",
abovelevelPosition: "",
const formSpec = reactive<FormSpec>({
isEducationalQft: false, //
isGovermantServiceHtr: false, //
isOperatingExp: false, //
isMinPeriodOfTenure: false, //
isHaveSpecificQft: false, //
isHaveProLicense: false, //
isHaveMinPeriodOrHoldPos: false, //
});
const elementaryFullNameRef = ref<object | null>(null);
const elementaryPositonRef = ref<object | null>(null);
const abovelevelFullnameRef = ref<object | null>(null);
const abovelevelPositionRef = ref<object | null>(null);
const formCommand = reactive<FormCommand>({
commanderFullname: "",
commanderPosition: "",
commanderAboveFullname: "",
commanderAbovePosition: "",
});
const commanderFullnameRef = ref<object | null>(null);
const commanderPositionRef = ref<object | null>(null);
const commanderAboveFullnameRef = ref<object | null>(null);
const commanderAbovePositionRef = ref<object | null>(null);
const formCommandRef: FormCommandRef = {
elementaryFullName: elementaryFullNameRef,
elementaryPosition: elementaryPositonRef,
abovelevelFullname: abovelevelFullnameRef,
abovelevelPosition: abovelevelPositionRef,
commanderFullname: commanderFullnameRef,
commanderPosition: commanderPositionRef,
commanderAboveFullname: commanderAboveFullnameRef,
commanderAbovePosition: commanderAbovePositionRef,
};
async function onCilckNextStep() {
@ -90,16 +108,13 @@ async function onCilckNextStep() {
"ยืนยันการดำเนินการ",
"ต้องการยืนยันการดำเนินการต่อใช่หรือไม่?"
);
// functionCreateDoc?.();
// store.step < 9 &&
}
function onCilckprPeviousStep() {
store.step > 1 &&
async function onCilckprPeviousStep(type: string) {
store.step < 9 &&
dialogConfirm(
$q,
() => {
async () => {
store.step--;
},
"ยืนยันการย้อนกลับ",
@ -107,16 +122,41 @@ function onCilckprPeviousStep() {
);
}
function updateformCommand(val: any, ref: any) {
formCommand.elementaryFullName = val.elementaryFullName;
formCommand.elementaryPosition = val.elementaryPosition;
formCommand.abovelevelFullname = val.abovelevelFullname;
formCommand.abovelevelPosition = val.abovelevelPosition;
async function saveStep1() {
saveEvaluation(formSpec);
}
elementaryFullNameRef.value = ref.elementaryFullNameRef;
elementaryPositonRef.value = ref.elementaryPositonRef;
abovelevelFullnameRef.value = ref.abovelevelFullnameRef;
abovelevelPositionRef.value = ref.abovelevelPositionRef;
async function updateCheckSpec(data: FormSpec) {
formSpec.isEducationalQft = data.isEducationalQft;
formSpec.isGovermantServiceHtr = data.isGovermantServiceHtr;
formSpec.isOperatingExp = data.isOperatingExp;
formSpec.isMinPeriodOfTenure = data.isMinPeriodOfTenure;
formSpec.isHaveSpecificQft = data.isHaveSpecificQft;
formSpec.isHaveProLicense = data.isHaveProLicense;
formSpec.isHaveMinPeriodOrHoldPos = data.isHaveMinPeriodOrHoldPos;
}
async function saveStep2() {
dialogConfirm(
$q,
() => {
nextPrapare("approve", formCommand);
},
"ยืนยันการดำเนินการ",
"ต้องการยืนยันการดำเนินการต่อใช่หรือไม่?"
);
}
function updateformCommand(val: any, ref: any) {
formCommand.commanderFullname = val.commanderFullname;
formCommand.commanderPosition = val.commanderPosition;
formCommand.commanderAboveFullname = val.commanderAboveFullname;
formCommand.commanderAbovePosition = val.commanderAbovePosition;
commanderFullnameRef.value = ref.commanderFullnameRef;
commanderPositionRef.value = ref.commanderPositionRef;
commanderAboveFullnameRef.value = ref.commanderAboveFullnameRef;
commanderAbovePositionRef.value = ref.commanderAbovePositionRef;
}
async function validateStep2() {
@ -137,21 +177,8 @@ async function validateStep2() {
}
}
async function saveStep1() {
saveEvaluation("test");
}
async function saveStep2() {
dialogConfirm(
$q,
() => {
store.step++;
},
"ยืนยันการดำเนินการ",
"ต้องการยืนยันการดำเนินการต่อใช่หรือไม่?"
);
}
async function saveStep3() {
console.log("Save 3");
nextCheckDoc("approve");
}
async function saveStep4() {
console.log("Save 4");
@ -198,7 +225,7 @@ onMounted(async () => {
<template>
<div class="row q-col-gutter-md">
<div class="col-xs-12 col-sm-3">
<div class="toptitle">ประเมนชำนาญการ</div>
<div class="toptitle">{{ props.title }}</div>
<Stepper />
<div class="text-center">
@ -216,7 +243,7 @@ onMounted(async () => {
<div class="col-12 row">
<div class="col-9">
<div class="toptitle">
{{ store.step }}.{{ store.titel[store.step - 1] }}
{{ store.step }}.{{ store.title[store.step - 1] }}
</div>
</div>
<div class="col-3 text-right">
@ -233,7 +260,7 @@ onMounted(async () => {
</div>
</div>
<div class="row q-col-gutter-md col-12">
<div class="row q-col-gutter-md col-12" v-if="store.showLoadStatus">
<div
:class="
store.step === 2 ||
@ -248,8 +275,16 @@ onMounted(async () => {
>
<q-card flat bordered class="col-12 q-pa-md">
<q-card-section>
<Step1 v-if="store.step === 1" />
<Step2 v-if="store.step === 2" @update:form="updateformCommand" />
<Step1
v-if="store.step === 1"
@update:spec="updateCheckSpec"
:evaluateId="store.evaluateId"
/>
<Step2
v-if="store.step === 2"
@update:form="updateformCommand"
:evaluateId="store.evaluateId"
/>
<Step3 v-if="store.step === 3" />
<Step4 v-if="store.step === 4" />
<Step5 v-if="store.step === 5" />
@ -273,15 +308,16 @@ onMounted(async () => {
</div>
</div>
<div class="q-mt-md q-gutter-md" align="right">
<q-btn
<!-- <q-btn
v-if="store.step !== 1"
unelevated
outline
label="ย้อนกลับ"
color="public"
@click="onCilckprPeviousStep"
/>
@click="onCilckprPeviousStep('reject')"
/> -->
<q-btn
v-if="store.step !== 4"
unelevated
label="ดำเนินการต่อ"
color="public"

View file

@ -86,7 +86,7 @@ onMounted(async () => {
<div class="col-xs-12 col-sm-9">
<div class="toptitle">
{{ store.step }}.{{ store.titel[store.step - 1] }}
{{ store.step }}.{{ store.title[store.step - 1] }}
</div>
<div class="row q-col-gutter-md col-12">
<div

View file

@ -1,5 +1,23 @@
<script setup lang="ts">
import { reactive } from "vue";
import { reactive, onMounted } from "vue";
import { useQuasar } from "quasar";
import http from "@/plugins/http";
import config from "@/app.config";
import { useCounterMixin } from "@/stores/mixin";
const mixin = useCounterMixin();
const $q = useQuasar();
const { showLoader, hideLoader, messageError } = mixin;
const props = defineProps({
evaluateId: {
type: String,
},
});
const emit = defineEmits(["update:spec"]);
const formData = reactive<any>({
isEducationalQft: false, //
@ -10,6 +28,35 @@ const formData = reactive<any>({
isHaveProLicense: false, //
isHaveMinPeriodOrHoldPos: false, // ]
});
async function updateValue() {
emit("update:spec", formData);
}
async function fetchCheckSpec(id: string) {
showLoader();
await http
.get(config.API.evaluationCheckspecByid(id))
.then((res) => {
const data = res.data.result;
formData.isEducationalQft = data.IsEducationalQft;
formData.isGovermantServiceHtr = data.IsGovermantServiceHtr;
formData.isOperatingExp = data.IsOperatingExp;
formData.isMinPeriodOfTenure = data.IsMinPeriodOfTenure;
formData.isHaveSpecificQft = data.IsHaveSpecificQft;
formData.isHaveProLicense = data.IsHaveProLicense;
formData.isHaveMinPeriodOrHoldPos = data.IsHaveMinPeriodOrHoldPos;
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
onMounted(() => {
props.evaluateId && fetchCheckSpec(props.evaluateId);
});
</script>
<template>
@ -20,6 +67,7 @@ const formData = reactive<any>({
keep-color
color="primary"
v-model="formData.isEducationalQft"
@update:model-value="updateValue"
/>
</q-item-section>
<q-item-section>
@ -32,6 +80,7 @@ const formData = reactive<any>({
keep-color
color="primary"
v-model="formData.isGovermantServiceHtr"
@update:model-value="updateValue"
/>
</q-item-section>
<q-item-section>
@ -44,6 +93,7 @@ const formData = reactive<any>({
keep-color
color="primary"
v-model="formData.isOperatingExp"
@update:model-value="updateValue"
/>
</q-item-section>
<q-item-section>
@ -56,6 +106,7 @@ const formData = reactive<any>({
keep-color
color="primary"
v-model="formData.isMinPeriodOfTenure"
@update:model-value="updateValue"
/>
</q-item-section>
<q-item-section>
@ -70,6 +121,7 @@ const formData = reactive<any>({
keep-color
color="primary"
v-model="formData.isHaveSpecificQft"
@update:model-value="updateValue"
/>
</q-item-section>
<q-item-section>
@ -85,6 +137,7 @@ const formData = reactive<any>({
keep-color
color="primary"
v-model="formData.isHaveProLicense"
@update:model-value="updateValue"
/>
</q-item-section>
<q-item-section>
@ -101,6 +154,7 @@ const formData = reactive<any>({
keep-color
color="primary"
v-model="formData.isHaveMinPeriodOrHoldPos"
@update:model-value="updateValue"
/>
</q-item-section>
<q-item-section>

View file

@ -4,7 +4,7 @@ import keycloak from "@/plugins/keycloak";
import http from "@/plugins/http";
import config from "@/app.config";
import genReport from "@/plugins/genreport";
import { useQuasar } from "quasar";
import { useQuasar, type StringDictionary } from "quasar";
import type { FormCommand } from "@/modules/06_evaluate/interface/evalute";
@ -19,26 +19,32 @@ const fullName = ref<string>(
keycloak.tokenParsed ? keycloak.tokenParsed.name!.toString() : ""
);
const props = defineProps({
evaluateId: {
type: String,
},
});
const emit = defineEmits(["update:form"]);
const formCommand = reactive<FormCommand>({
elementaryFullName: "",
elementaryPosition: "",
abovelevelFullname: "",
abovelevelPosition: "",
commanderFullname: "",
commanderPosition: "",
commanderAboveFullname: "",
commanderAbovePosition: "",
});
const elementaryFullNameRef = ref<object | null>(null);
const elementaryPositonRef = ref<object | null>(null);
const abovelevelFullnameRef = ref<object | null>(null);
const abovelevelPositionRef = ref<object | null>(null);
const commanderFullnameRef = ref<object | null>(null);
const commanderPositionRef = ref<object | null>(null);
const commanderAboveFullnameRef = ref<object | null>(null);
const commanderAbovePositionRef = ref<object | null>(null);
const updateInput = (value: any) => {
const ref = {
elementaryFullNameRef: elementaryFullNameRef.value,
elementaryPositonRef: elementaryPositonRef.value,
abovelevelFullnameRef: abovelevelFullnameRef.value,
abovelevelPositionRef: abovelevelPositionRef.value,
commanderFullnameRef: commanderFullnameRef.value,
commanderPositionRef: commanderPositionRef.value,
commanderAboveFullnameRef: commanderAboveFullnameRef.value,
commanderAbovePositionRef: commanderAbovePositionRef.value,
};
emit("update:form", value, ref);
};
@ -95,14 +101,36 @@ async function onClickDowloadFile(
await genReport(body, fileName);
}
onMounted(() => {
async function fetchPathUpload(volume: string, id: string) {
showLoader();
const body = {
fileList: [
"1-แบบพิจารณาคุณสมบัติบุคคล",
"2-แบบแสดงรายละเอียดการเสนอผลงาน",
"3-แบบตรวจสอบความถูกต้องครบถ้วนของข้อมูล",
"4-แบบประเมินคุณลักษณะบุคคล",
"5-แบบสรุปข้อมูลของผู้ขอรับการคัดเลือก",
"6-ผลงานที่จะส่งประเมิน",
],
};
await http
.post(config.API.loadPathDocument(volume, id), body)
.then((res) => {})
.catch((err) => {})
.finally(() => {
hideLoader();
});
}
onMounted(async () => {
const ref = {
elementaryFullNameRef: elementaryFullNameRef.value,
elementaryPositonRef: elementaryPositonRef.value,
abovelevelFullnameRef: abovelevelFullnameRef.value,
abovelevelPositionRef: abovelevelPositionRef.value,
commanderFullnameRef: commanderFullnameRef.value,
commanderPositionRef: commanderPositionRef.value,
commanderAboveFullnameRef: commanderAboveFullnameRef.value,
commanderAbovePositionRef: commanderAbovePositionRef.value,
};
emit("update:form", formCommand, ref);
props.evaluateId && (await fetchPathUpload("เล่ม 1", props.evaluateId));
});
</script>
@ -520,22 +548,22 @@ onMounted(() => {
</div>
<div class="row col-12 q-col-gutter-md q-pa-sm">
<q-input
ref="elementaryFullNameRef"
ref="commanderFullnameRef"
dense
class="col-xs-12 col-sm-6"
outlined
label="ชื่อ-นามสกุล"
v-model="formCommand.elementaryFullName"
v-model="formCommand.commanderFullname"
@update:model-value="updateInput(formCommand)"
:rules="[(val) => !!val || `${'กรุณากรอกชื่อ-นามสกุล'}`]"
lazy-rules
/>
<q-input
ref="elementaryPositonRef"
ref="commanderPositionRef"
class="col-xs-12 col-sm-6"
dense
outlined
v-model="formCommand.elementaryPosition"
v-model="formCommand.commanderPosition"
@update:model-value="updateInput(formCommand)"
label="ตำแหน่ง"
:rules="[(val) => !!val || `${'กรุณากรอกตำแหน่ง'}`]"
@ -552,22 +580,22 @@ onMounted(() => {
</div>
<div class="row col-12 q-col-gutter-md q-pa-sm">
<q-input
ref="abovelevelFullnameRef"
ref="commanderAboveFullnameRef"
dense
class="col-xs-12 col-sm-6"
outlined
v-model="formCommand.abovelevelFullname"
v-model="formCommand.commanderAboveFullname"
label="ชื่อ-นามสกุล"
:rules="[(val) => !!val || `${'กรุณากรอกชื่อ-นามสกุล'}`]"
lazy-rules
@update:model-value="updateInput(formCommand)"
/>
<q-input
ref="abovelevelPositionRef"
ref="commanderAbovePositionRef"
class="col-xs-12 col-sm-6"
dense
outlined
v-model="formCommand.abovelevelPosition"
v-model="formCommand.commanderAbovePosition"
label="ตำแหน่ง"
:rules="[(val) => !!val || `${'กรุณากรอกตำแหน่ง'}`]"
lazy-rules

View file

@ -48,7 +48,7 @@ function onClickViewPDF(file: any) {
<q-tooltip> ไฟลเอกสาร </q-tooltip></q-btn
>
</div>
<div class="col-xs-12 col-sm-11 row">
<div class="col-xs-12 col-sm-10 row">
<q-file
v-model="fileEvaluation1"
class="col-12"
@ -63,7 +63,7 @@ function onClickViewPDF(file: any) {
</template>
</q-file>
</div>
<div class="col-1 self-center text-center">
<div class="col-2 self-center text-center q-pl-none">
<q-btn flat round dense color="primary" icon="mdi-upload"
><q-tooltip>ปโหลดไฟล</q-tooltip></q-btn
>