ปรับ Eva

This commit is contained in:
DESKTOP-1R2VSQH\Lenovo ThinkPad E490 2025-04-23 10:29:50 +07:00
parent c3d24fdc33
commit f8cd032c0b
11 changed files with 1254 additions and 798 deletions

View file

@ -54,6 +54,8 @@ export default {
dataUserSalary: `${profileOrg}/salary/user`, dataUserSalary: `${profileOrg}/salary/user`,
dataUserSalaryByType: (type: string) => `${org}/profile${type}/salary/user`, dataUserSalaryByType: (type: string) => `${org}/profile${type}/salary/user`,
dataUserAssessments: `${profileOrg}/assessments/user`, dataUserAssessments: `${profileOrg}/assessments/user`,
dataUserPortfolio: `${env.API_URI}/development/portfolio/user`,
dataUserPerformance: `${env.API_URI}/evaluation/performance/user`,
dataUserNopaid: `${profileOrg}/nopaid/user`, dataUserNopaid: `${profileOrg}/nopaid/user`,
dataUserNopaidByType: (type: string) => `${org}/profile${type}/nopaid/user`, dataUserNopaidByType: (type: string) => `${org}/profile${type}/nopaid/user`,
@ -61,8 +63,7 @@ export default {
dataUserCertificateByType: (emType: string, type: string) => dataUserCertificateByType: (emType: string, type: string) =>
`${org}/profile${emType}/${type}/user`, `${org}/profile${emType}/${type}/user`,
dataUserEvaByType: (type: string) => dataUserEvaByType: (type: string) => `${org}/profile/${type}/user`,
`${org}/profile/${type}/user`,
dataUserOther: `${profileOrg}/other/user`, dataUserOther: `${profileOrg}/other/user`,
dataUserOtherByType: (type: string) => `${org}/profile${type}/other/user`, dataUserOtherByType: (type: string) => `${org}/profile${type}/other/user`,

View file

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted, watch } from "vue"; import { ref, reactive, onMounted, watch, nextTick } from "vue";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { useQuasar } from "quasar"; import { useQuasar } from "quasar";
@ -71,7 +71,7 @@ async function onCilckNextStep() {
store.step === 1 store.step === 1
? checkSelectForm() ? checkSelectForm()
: store.step === 2 || store.step === 6 : store.step === 2 || store.step === 6
? validateForm() ? onSubmitFormData()
: store.step == 3 || store.step == 7 : store.step == 3 || store.step == 7
? dialogConfirm( ? dialogConfirm(
$q, $q,
@ -85,35 +85,44 @@ async function onCilckNextStep() {
} }
/** function validateForm Step 2,4*/ /** function validateForm Step 2,4*/
async function validateForm() { async function onSubmitFormData() {
store.checkFileupload = !store.checkFileupload; store.checkFileupload = !store.checkFileupload;
const emptyValues = downloadFileRef.value.filter((e: string) => e === ""); console.log(store.statusUpload6);
const hasError = [];
for (const key in formCommandRef) { if (store.step === 2) {
if (Object.prototype.hasOwnProperty.call(formCommandRef, key)) { if (!store.statusUpload) {
const property = formCommandRef[key]; saveStep2();
if (property.value && typeof property.value.validate === "function") { } else {
const isValid = property.value.validate(); if (!downloadFile.value.some((e: string) => e === "")) {
hasError.push(isValid);
}
}
}
if (hasError.every((result) => result === true)) {
if (emptyValues.length > 0 && store.statusUpload === true) {
} else if (store.step === 2) {
if (store.statusUpload === false) {
saveStep2();
} else {
nextTostep3(); nextTostep3();
} }
}
} else {
if (!store.statusUpload6) {
saveStep6();
} else { } else {
if (store.statusUpload6 === false) { if (!downloadFile.value.some((e: string) => e === "")) {
saveStep6();
} else {
nextTostep7(); nextTostep7();
} }
} }
} }
// const emptyValues = downloadFileRef.value.filter((e: string) => e === "");
// const hasError = [];
// for (const key in formCommandRef) {
// if (Object.prototype.hasOwnProperty.call(formCommandRef, key)) {
// const property = formCommandRef[key];
// if (property.value && typeof property.value.validate === "function") {
// const isValid = property.value.validate();
// hasError.push(isValid);
// }
// }
// }
// if (hasError.every((result) => result === true)) {
// if (emptyValues.length > 0 && store.statusUpload === true) {
// }
// }
} }
const pdfSrc = ref<any>(); const pdfSrc = ref<any>();
@ -250,19 +259,7 @@ function checkSelectForm() {
/** function บันทักตรวจสอบคุณสมบัติ*/ /** function บันทักตรวจสอบคุณสมบัติ*/
async function saveStep1() { async function saveStep1() {
showLoader(); showLoader();
const salaries = formDetail.value.salaries.map((e: any) => ({ const salaries = formDetail.value.salaries.map((e: any) => ({
// amount: e.amount,
// date: e.date,
// mouthSalaryAmount: e.mouthSalaryAmount ? e.mouthSalaryAmount : 0,
// posNo: e.posNo,
// position: e.position,
// positionSalaryAmount: e.positionSalaryAmount ? e.positionSalaryAmount : 0,
// refCommandDate: e.refCommandDate,
// refCommandNo: e.refCommandNo ? e.refCommandNo : "",
// salaryClass: e.salaryClass ? e.salaryClass : "",
// salaryRef: e.salaryRef ? e.salaryRef : "",
// salaryStatus: e.salaryStatus ? e.salariesStatus : "",
profileId: e.profileId, profileId: e.profileId,
commandCode: e.commandCode, commandCode: e.commandCode,
commandNo: e.commandNo, commandNo: e.commandNo,
@ -317,16 +314,32 @@ async function saveStep1() {
startDate: e.startDate, startDate: e.startDate,
})); }));
const assessments = formDetail.value.assessments.map((e: any) => ({ const certificates = formDetail.value.certificates.map((e: any) => ({
date: e.date, ...e,
point1: e.point1,
point1Total: e.point1Total,
point2: e.point2,
point2Total: e.point2Total,
pointSum: e.pointSum,
pointSumTotal: e.pointSumTotal,
})); }));
const trainings = formDetail.value.trainings.map((e: any) => ({
...e,
}));
const performances = formDetail.value.assessments.map(
({ id, ...rest }: any) => ({
...rest,
})
);
const portfolios = formDetail.value.experience.map(
({
id,
lastUpdatedAt,
lastUpdateFullName,
createdFullName,
createdAt,
...rest
}: any) => ({
...rest,
})
);
const evaluateType = route.params.type.toString(); const evaluateType = route.params.type.toString();
const form = { const form = {
root: formDetail.value.root, root: formDetail.value.root,
@ -353,10 +366,11 @@ async function saveStep1() {
isHaveMinPeriodOrHoldPos: formSpec.isHaveMinPeriodOrHoldPos, isHaveMinPeriodOrHoldPos: formSpec.isHaveMinPeriodOrHoldPos,
reason: "", reason: "",
educations: [...educations], educations: [...educations],
certificates: [...formDetail.value.certificates], certificates: [...certificates],
salaries: [...salaries], salaries: [...salaries],
trainings: [...formDetail.value.trainings], trainings: [...trainings],
assessments: [...assessments], performances: [...performances],
portfolios: [...portfolios],
}; };
await http await http
@ -378,41 +392,20 @@ const statusUpload = ref<boolean>(false);
const formCommand = reactive<FormCommand>({ const formCommand = reactive<FormCommand>({
commanderFullname: "", commanderFullname: "",
commanderPosition: "", commanderPosition: "",
commanderPositionOld: "",
commanderOrg: "",
commanderOrgOld: "",
commanderAboveFullname: "", commanderAboveFullname: "",
commanderAbovePosition: "", commanderAbovePosition: "",
commanderAbovePositionOld: "",
commanderAboveOrgOld: "",
commanderAboveOrg: "",
author: "", author: "",
subject: "", subject: [],
assignedPosition: "", assignedPosition: "",
}); });
const commanderFullnameRef = ref<object | null>(null); const downloadFile = ref<string[]>([]);
const commanderPositionRef = ref<object | null>(null);
const commanderAboveFullnameRef = ref<object | null>(null);
const commanderAbovePositionRef = ref<object | null>(null);
const fileEvaluation1Ref = ref<object | null>(null);
const fileEvaluation2Ref = ref<object | null>(null);
const fileEvaluation3Ref = ref<object | null>(null);
const fileEvaluation4Ref = ref<object | null>(null);
const fileEvaluation5Ref = ref<object | null>(null);
const fileEvaluation6Ref = ref<object | null>(null);
const performanceRef = ref<object | null>(null);
const performanceOwnerRef = ref<object | null>(null);
const assignedPositionRef = ref<object | null>(null);
const formCommandRef: FormCommandRef = {
commanderFullname: commanderFullnameRef,
commanderPosition: commanderPositionRef,
commanderAboveFullname: commanderAboveFullnameRef,
commanderAbovePosition: commanderAbovePositionRef,
fileEvaluation1: fileEvaluation1Ref,
fileEvaluation2: fileEvaluation2Ref,
fileEvaluation3: fileEvaluation3Ref,
fileEvaluation4: fileEvaluation4Ref,
fileEvaluation5: fileEvaluation5Ref,
fileEvaluation6: fileEvaluation6Ref,
performance: performanceRef,
performanceOwner: performanceOwnerRef,
assignedPosition: assignedPositionRef,
};
const downloadFileRef = ref<any>();
/** /**
* function ปเดท ผลงาน,เซนเอกสาร, Ref * function ปเดท ผลงาน,เซนเอกสาร, Ref
* @param val เซนเอกสาร * @param val เซนเอกสาร
@ -421,38 +414,22 @@ const downloadFileRef = ref<any>();
function updateformCommand(val: any, ref: any) { function updateformCommand(val: any, ref: any) {
formCommand.commanderFullname = val.commanderFullname; formCommand.commanderFullname = val.commanderFullname;
formCommand.commanderPosition = val.commanderPosition; formCommand.commanderPosition = val.commanderPosition;
formCommand.commanderPositionOld = val.commanderPositionOld;
formCommand.commanderOrg = val.commanderOrg;
formCommand.commanderOrgOld = val.commanderOrgOld;
formCommand.commanderAboveFullname = val.commanderAboveFullname; formCommand.commanderAboveFullname = val.commanderAboveFullname;
formCommand.commanderAbovePosition = val.commanderAbovePosition; formCommand.commanderAbovePosition = val.commanderAbovePosition;
formCommand.commanderAbovePositionOld = val.commanderAbovePositionOld;
formCommand.commanderAboveOrgOld = val.commanderAboveOrgOld;
formCommand.commanderAboveOrg = val.commanderAboveOrg;
formCommand.author = val.author; formCommand.author = val.author;
formCommand.subject = val.subject; formCommand.subject = val.subject;
formCommand.assignedPosition = val.assignedPosition; formCommand.assignedPosition = val.assignedPosition;
commanderFullnameRef.value = ref.commanderFullnameRef; downloadFile.value = ref.downloadFile;
commanderPositionRef.value = ref.commanderPositionRef;
commanderAboveFullnameRef.value = ref.commanderAboveFullnameRef;
commanderAbovePositionRef.value = ref.commanderAbovePositionRef;
fileEvaluation1Ref.value = ref.fileEvaluation1Ref;
fileEvaluation2Ref.value = ref.fileEvaluation2Ref;
fileEvaluation3Ref.value = ref.fileEvaluation3Ref;
fileEvaluation4Ref.value = ref.fileEvaluation4Ref;
fileEvaluation5Ref.value = ref.fileEvaluation5Ref;
fileEvaluation6Ref.value = ref.fileEvaluation6Ref;
downloadFileRef.value = ref.downloadFile;
performanceRef.value = ref.performance;
performanceOwnerRef.value = ref.performanceOwner;
assignedPositionRef.value = ref.assignedPosition;
statusUpload.value = ref.statusUpload; statusUpload.value = ref.statusUpload;
} }
/** function บันทึกข้อมูล ผลงานม,ผู้เซ็นเอกสาร*/ /** function บันทึกข้อมูล ผลงานม,ผู้เซ็นเอกสาร*/
async function saveStep2() { async function saveStep2() {
const body = {
commanderFullname: formCommand.commanderFullname,
commanderPosition: formCommand.commanderPosition,
commanderAboveFullname: formCommand.commanderAboveFullname,
commanderAbovePosition: formCommand.commanderAbovePosition,
author: formCommand.author,
subject: formCommand.subject,
};
dialogConfirm( dialogConfirm(
$q, $q,
async () => { async () => {
@ -465,7 +442,7 @@ async function saveStep2() {
route.params.id.toString(), route.params.id.toString(),
"director" "director"
), ),
body { ...formCommand, assignedPosition: undefined }
) )
.then(() => { .then(() => {
route.params.id && fetchCheckStep(route.params.id.toString()); route.params.id && fetchCheckStep(route.params.id.toString());
@ -530,8 +507,14 @@ async function saveStep6() {
const body = { const body = {
commanderAboveFullnameDoc2: formCommand.commanderAboveFullname, commanderAboveFullnameDoc2: formCommand.commanderAboveFullname,
commanderAbovePositionDoc2: formCommand.commanderAbovePosition, commanderAbovePositionDoc2: formCommand.commanderAbovePosition,
commanderAbovePositionOldDoc2: formCommand.commanderAbovePositionOld,
commanderAboveOrgOldDoc2: formCommand.commanderAboveOrgOld,
commanderAboveOrgDoc2: formCommand.commanderAboveOrg,
commanderFullnameDoc2: formCommand.commanderFullname, commanderFullnameDoc2: formCommand.commanderFullname,
commanderPositionDoc2: formCommand.commanderPosition, commanderPositionDoc2: formCommand.commanderPosition,
commanderPositionOldDoc2: formCommand.commanderPositionOld,
commanderOrgDoc2: formCommand.commanderOrg,
commanderOrgOldDoc2: formCommand.commanderOrgOld,
authorDoc2: formCommand.author, authorDoc2: formCommand.author,
subjectDoc2: formCommand.subject, subjectDoc2: formCommand.subject,
assignedPosition: formCommand.assignedPosition, assignedPosition: formCommand.assignedPosition,
@ -679,164 +662,172 @@ onMounted(async () => {
</div> </div>
</div> </div>
</div> </div>
<q-form
<div class="col-xs-12 col-sm-9 q-pa-md" v-if="showLoadStatus"> class="col-xs-12 col-sm-9"
<div class="col-12 row items-center"> greedy
<div class="toptitle2"> @submit.prevent
{{ store.step }}.{{ store.title[store.step - 1] }} @validation-success="onCilckNextStep"
>
<div class="col-xs-12 col-sm-9 q-pa-md" v-if="showLoadStatus">
<div class="col-12 row items-center">
<div class="toptitle2">
{{ store.step }}.{{ store.title[store.step - 1] }}
</div>
<q-space />
<div>
<q-btn
v-if="store.step === 1"
:href="externalLink"
target="_blank"
outline
color="blue"
dense
class="q-px-md"
no-caps
>
ตรวจสอบคณสมบ ..
</q-btn>
</div>
</div> </div>
<q-space /> <div class="col-12 q-pt-sm">
<div> <div class="q-col-gutter-md col-12 row">
<q-btn <div
v-if="store.step === 1" :class="
:href="externalLink" store.step === 2 ||
target="_blank" store.step === 4 ||
outline store.step === 5 ||
color="blue" store.step === 6 ||
dense store.step === 8 ||
class="q-px-md" store.step === 9
no-caps ? 'col-12 row'
> : 'col-xs-12 col-sm-5 row'
ตรวจสอบคณสมบ ..
</q-btn>
</div>
</div>
<div class="col-12 q-pt-sm">
<div class="q-col-gutter-md col-12 row">
<div
:class="
store.step === 2 ||
store.step === 4 ||
store.step === 5 ||
store.step === 6 ||
store.step === 8 ||
store.step === 9
? 'col-12 row'
: 'col-xs-12 col-sm-5 row'
"
>
<q-card
flat
bordered
class="col-12 shadow-0"
:style="
$q.screen.lt.sm
? ''
: 'max-height: 60vh; overflow: scroll;'
" "
> >
<Step1 <q-card
v-if="store.step === 1" flat
@update:spec="updateCheckSpec" bordered
:data="formDataStep1" class="col-12 shadow-0"
:educations="formDetail?.educations" :style="
/> $q.screen.lt.sm
<Step2 ? ''
v-if="store.step === 2" : 'max-height: 60vh; overflow: scroll;'
@update:form="updateformCommand" "
/> >
<Step3 <Step1
v-if="store.step === 3" v-if="store.step === 1"
@update:file="updateFilePDF" @update:spec="updateCheckSpec"
/> :data="formDataStep1"
<Step4 v-if="store.step === 4" /> :educations="formDetail?.educations"
<Step5 v-if="store.step === 5" /> />
<Step6 <Step2
v-if="store.step === 6" v-if="store.step === 2"
@update:form="updateformCommand" @update:form="updateformCommand"
/> />
<Step7 <Step3
v-if="store.step === 7" v-if="store.step === 3"
@update:file="updateFilePDF" @update:file="updateFilePDF"
/> />
<Step8 v-if="store.step === 8" /> <Step4 v-if="store.step === 4" />
<Step9 v-if="store.step === 9" /> <Step5 v-if="store.step === 5" />
</q-card> <Step6
</div> v-if="store.step === 6"
<div @update:form="updateformCommand"
class="col-xs-12 col-sm-7" />
v-if=" <Step7
store.step === 1 || store.step === 3 || store.step === 7 v-if="store.step === 7"
" @update:file="updateFilePDF"
> />
<div class="col-12"> <Step8 v-if="store.step === 8" />
<ViewStep1 <Step9 v-if="store.step === 9" />
v-if="store.step === 1" </q-card>
@update:formDeital="updateFormDetail" </div>
:data="formDataStep1" <div
/> class="col-xs-12 col-sm-7"
<ViewStep3 v-if="
v-if="store.step === 3 && pdfSrc" store.step === 1 || store.step === 3 || store.step === 7
:pdfSrc="pdfSrc" "
:urlDownloadFile="urlDownloadFile" >
/> <div class="col-12">
<ViewStep7 <ViewStep1
v-if="store.step === 7 && pdfSrc" v-if="store.step === 1"
:pdfSrc="pdfSrc" @update:formDeital="updateFormDetail"
:urlDownloadFile="urlDownloadFile" :data="formDataStep1"
/> />
<ViewStep3
v-if="store.step === 3 && pdfSrc"
:pdfSrc="pdfSrc"
:urlDownloadFile="urlDownloadFile"
/>
<ViewStep7
v-if="store.step === 7 && pdfSrc"
:pdfSrc="pdfSrc"
:urlDownloadFile="urlDownloadFile"
/>
</div>
</div> </div>
</div> </div>
</div> </div>
<q-card-actions
class="q-pt-sm q-pa-none q-gutter-sm"
align="right"
>
<q-btn
v-if="
store.step >= store.currentStep &&
store.statusUpload === false &&
store.step !== 3 &&
store.step !== 4 &&
store.step !== 5 &&
store.step !== 7 &&
store.step !== 8 &&
store.step !== 9
"
unelevated
:label="
store.step === 2 || store.step === 6
? 'บันทึกข้อมูล'
: 'ดำเนินการต่อ'
"
color="public"
type="submit"
/>
<q-btn
v-else-if="
store.step >= store.currentStep &&
(store.step == 3 || store.step == 7)
"
unelevated
label="ยื่นเอกสาร"
color="public"
type="submit"
/>
<q-btn
v-if="
store.step >= store.currentStep &&
store.step == 2 &&
store.statusUpload
"
unelevated
label="ดำเนินการต่อ"
color="public"
type="submit"
/>
<q-btn
v-if="
store.step >= store.currentStep &&
store.step == 6 &&
store.statusUpload
"
unelevated
label="ดำเนินการต่อ"
color="public"
type="submit"
/>
</q-card-actions>
</div> </div>
<q-card-actions class="q-pt-sm q-pa-none q-gutter-sm" align="right"> </q-form>
<q-btn
v-if="
store.step >= store.currentStep &&
store.statusUpload === false &&
store.step !== 3 &&
store.step !== 4 &&
store.step !== 5 &&
store.step !== 7 &&
store.step !== 8 &&
store.step !== 9
"
unelevated
:label="
store.step === 2 || store.step === 6
? 'บันทึกข้อมูล'
: 'ดำเนินการต่อ'
"
color="public"
@click="onCilckNextStep()"
/>
<q-btn
v-else-if="
store.step >= store.currentStep &&
(store.step == 3 || store.step == 7)
"
unelevated
label="ยื่นเอกสาร"
color="public"
@click="onCilckNextStep()"
/>
<q-btn
v-if="
store.step >= store.currentStep &&
store.step == 2 &&
store.statusUpload
"
unelevated
label="ดำเนินการต่อ"
color="public"
@click="onCilckNextStep()"
/>
<q-btn
v-if="
downloadFileRef &&
store.step >= store.currentStep &&
store.step == 6 &&
store.statusUpload
"
unelevated
label="ดำเนินการต่อ"
color="public"
@click="onCilckNextStep()"
/>
</q-card-actions>
</div>
</q-card> </q-card>
</div> </div>
</div> </div>

View file

@ -31,26 +31,53 @@ const emit = defineEmits(["update:form"]);
const formCommand = reactive<FormCommand>({ const formCommand = reactive<FormCommand>({
commanderFullname: "", commanderFullname: "",
commanderPosition: "", commanderPosition: "",
commanderPositionOld: "",
commanderOrg: "",
commanderOrgOld: "",
commanderAboveFullname: "", commanderAboveFullname: "",
commanderAbovePosition: "", commanderAbovePosition: "",
commanderAbovePositionOld: "",
commanderAboveOrgOld: "",
commanderAboveOrg: "",
author: "", author: "",
subject: "", subject: [""],
assignedPosition: "", assignedPosition: "",
}); });
/** formRef */ const formTemplates = ref<any[]>([
const commanderFullnameRef = ref<object | null>(null); {
const commanderPositionRef = ref<object | null>(null); code: "EV1_005",
const commanderAboveFullnameRef = ref<object | null>(null); templateName: "template-1",
const commanderAbovePositionRef = ref<object | null>(null); title: "แบบพิจารณาคุณสมบัติบุคคล",
const fileEvaluation1Ref = ref<object | null>(null); fileName: "1-แบบพิจารณาคุณสมบัติบุคคล",
const fileEvaluation2Ref = ref<object | null>(null); downloadFile: "",
const fileEvaluation3Ref = ref<object | null>(null); file: null,
const fileEvaluation4Ref = ref<object | null>(null); },
const fileEvaluation5Ref = ref<object | null>(null); {
const fileEvaluation6Ref = ref<object | null>(null); code: "EV1_006",
const performanceRef = ref<object | null>(null); templateName: "template-2",
const performanceOwnerRef = ref<object | null>(null); title: "แบบแสดงรายละเอียดการเสนอผลงาน",
fileName: "2-แบบแสดงรายละเอียดการเสนอผลงาน",
downloadFile: "",
file: null,
},
{
code: "EV1_008",
templateName: "template-4",
title: "แบบประเมินคุณลักษณะบุคคล",
fileName: "4-แบบประเมินคุณลักษณะบุคคล",
downloadFile: "",
file: null,
},
{
code: "EV1_010",
templateName: "template-6",
title: "ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11)",
fileName: "6-ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11)",
downloadFile: "",
file: null,
},
]);
/** /**
* function updateFormref * function updateFormref
@ -58,39 +85,12 @@ const performanceOwnerRef = ref<object | null>(null);
*/ */
function updateInput(val: any) { function updateInput(val: any) {
const ref = { const ref = {
commanderFullnameRef: commanderFullnameRef.value, statusUpload: false,
commanderPositionRef: commanderPositionRef.value, downloadFile: formTemplates.value.map((e) => e.downloadFile),
commanderAboveFullnameRef: commanderAboveFullnameRef.value,
commanderAbovePositionRef: commanderAbovePositionRef.value,
fileEvaluation1Ref: fileEvaluation1Ref.value,
fileEvaluation2Ref: fileEvaluation2Ref.value,
fileEvaluation3Ref: fileEvaluation3Ref.value,
fileEvaluation4Ref: fileEvaluation4Ref.value,
fileEvaluation5Ref: fileEvaluation5Ref.value,
fileEvaluation6Ref: fileEvaluation6Ref.value,
downloadFile: [
downloadFile1.value,
downloadFile2.value,
downloadFile3.value,
downloadFile4.value,
downloadFile5.value,
downloadFile6.value,
],
performance: performanceRef.value,
performanceOwner: performanceOwnerRef.value,
statusUpload: store.statusUpload,
}; };
emit("update:form", val, ref); // emit("update:form", val, ref); //
} }
/** ตัวแปร file*/
const fileEvaluation1 = ref<File | null>();
const fileEvaluation2 = ref<File | null>();
const fileEvaluation3 = ref<File | null>();
const fileEvaluation4 = ref<File | null>();
const fileEvaluation5 = ref<File | null>();
const fileEvaluation6 = ref<File | null>();
const modalView = ref<boolean>(false); const modalView = ref<boolean>(false);
const numOfPages = ref<number>(0); const numOfPages = ref<number>(0);
const page = ref<number>(1); const page = ref<number>(1);
@ -123,13 +123,13 @@ async function onClickDowloadFile(
fileName: string fileName: string
) { ) {
showLoader(); showLoader();
const body = { const body = {
template: tp, template: tp,
reportName: templateName, reportName: templateName,
data: profile.value, data: profile.value,
}; };
await genReport(body, fileName); // await genReport(body, fileName); //
hideLoader();
} }
/** /**
@ -170,10 +170,9 @@ async function fetchPathUpload(
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
hideLoader();
}) })
.finally(() => { .finally(() => {
// hideLoader(); hideLoader();
}); });
} }
} }
@ -195,9 +194,6 @@ async function uploadfile(uploadUrl: string, file: any) {
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
})
.finally(() => {
hideLoader();
}); });
} }
@ -206,16 +202,20 @@ async function uploadfile(uploadUrl: string, file: any) {
* @param id evaluate ID * @param id evaluate ID
*/ */
function fetcheSigner(id: string) { function fetcheSigner(id: string) {
showLoader();
http http
.get(config.API.evaluationSignerDoc1(id)) .get(config.API.evaluationSignerDoc1(id))
.then((res) => { .then((res) => {
const data = res.data.result; const data = res.data.result;
formCommand.commanderFullname = data.commanderFullname; formCommand.commanderFullname = data.commanderFullname;
formCommand.commanderPosition = data.commanderPosition; formCommand.commanderPosition = data.commanderPosition;
formCommand.commanderPositionOld = data.commanderPositionOld;
formCommand.commanderOrg = data.commanderOrg;
formCommand.commanderOrgOld = data.commanderOrgOld;
formCommand.commanderAboveFullname = data.commanderAboveFullname; formCommand.commanderAboveFullname = data.commanderAboveFullname;
formCommand.commanderAbovePosition = data.commanderAbovePosition; formCommand.commanderAbovePosition = data.commanderAbovePosition;
formCommand.commanderAbovePositionOld = data.commanderAbovePositionOld;
formCommand.commanderAboveOrgOld = data.commanderAboveOrgOld;
formCommand.commanderAboveOrg = data.commanderAboveOrg;
formCommand.author = data.author; formCommand.author = data.author;
formCommand.subject = data.subject; formCommand.subject = data.subject;
store.statusUpload = true; store.statusUpload = true;
@ -223,11 +223,6 @@ function fetcheSigner(id: string) {
.catch(() => { .catch(() => {
store.statusUpload = false; store.statusUpload = false;
getCommander(); getCommander();
})
.finally(() => {
setTimeout(() => {
hideLoader();
}, 2000);
}); });
} }
@ -236,7 +231,6 @@ function fetcheSigner(id: string) {
* @param id evaluate ID * @param id evaluate ID
*/ */
async function fetchCheckSpec(id: string) { async function fetchCheckSpec(id: string) {
showLoader();
await http await http
.get(config.API.evaluationReportCheckspecByid(id)) .get(config.API.evaluationReportCheckspecByid(id))
.then((res) => { .then((res) => {
@ -245,85 +239,31 @@ async function fetchCheckSpec(id: string) {
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
})
.finally(() => {
setTimeout(() => {
hideLoader();
}, 2000);
}); });
} }
const downloadFile1 = ref<string>("");
const downloadFile2 = ref<string>("");
const downloadFile3 = ref<string>("");
const downloadFile4 = ref<string>("");
const downloadFile5 = ref<string>("");
const downloadFile6 = ref<string>("");
/** /**
* function ดาวนโหลดไฟล * function ดาวนโหลดไฟล
* @param fileName อไฟล * @param fileName อไฟล
*/ */
async function downloadFile(fileName: string) { async function downloadFile(fileName: string) {
// showLoader();
await http await http
.get(config.API.loadFileDocument("เล่ม 1", evaluateId.value, fileName)) .get(config.API.loadFileDocument("เล่ม 1", evaluateId.value, fileName))
.then((res) => { .then((res) => {
if (fileName === "1-แบบพิจารณาคุณสมบัติบุคคล") { const index = formTemplates.value.findIndex(
downloadFile1.value = res.data.downloadUrl; (item) => item.fileName === fileName
// fileEvaluation1.value = res.data.upload; );
} else if (fileName === "2-แบบแสดงรายละเอียดการเสนอผลงาน") { if (index !== -1) {
downloadFile2.value = res.data.downloadUrl; formTemplates.value[index].downloadFile = res.data.downloadUrl;
// fileEvaluation2.value = res.data.upload;
} else if (
fileName ===
"3-แบบตรวจสอบความถูกต้องครบถ้วนของข้อมูลเพื่อประกอบการคัดเลือกบุคคล (เอกสารแบบ ก)"
) {
downloadFile3.value = res.data.downloadUrl;
// fileEvaluation3.value = res.data.upload;
} else if (fileName === "4-แบบประเมินคุณลักษณะบุคคล") {
downloadFile4.value = res.data.downloadUrl;
// fileEvaluation4.value = res.data.upload;
} else if (
fileName === "5-แบบสรุปข้อมูลของผู้ขอรับการคัดเลือก (เอกสารหมายเลข 9)"
) {
downloadFile5.value = res.data.downloadUrl;
// fileEvaluation5.value = res.data.upload;
} else if (fileName === "6-ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11)") {
downloadFile6.value = res.data.downloadUrl;
// fileEvaluation6.value = res.data.upload;
} }
}) })
.finally(() => { .finally(() => {
const ref = { const ref = {
commanderFullnameRef: commanderFullnameRef.value,
commanderPositionRef: commanderPositionRef.value,
commanderAboveFullnameRef: commanderAboveFullnameRef.value,
commanderAbovePositionRef: commanderAbovePositionRef.value,
fileEvaluation1Ref: fileEvaluation1Ref.value,
fileEvaluation2Ref: fileEvaluation2Ref.value,
fileEvaluation3Ref: fileEvaluation3Ref.value,
fileEvaluation4Ref: fileEvaluation4Ref.value,
fileEvaluation5Ref: fileEvaluation5Ref.value,
fileEvaluation6Ref: fileEvaluation6Ref.value,
performance: performanceRef.value,
performanceOwner: performanceOwnerRef.value,
downloadFile: [
downloadFile1.value,
downloadFile2.value,
downloadFile3.value,
downloadFile4.value,
downloadFile5.value,
downloadFile6.value,
],
statusUpload: false, statusUpload: false,
downloadFile: formTemplates.value.map((e) => e.downloadFile),
}; };
emit("update:form", formCommand, ref); emit("update:form", formCommand, ref);
setTimeout(() => {
hideLoader();
}, 2000);
}); });
} }
@ -339,32 +279,24 @@ function getCommander() {
}) })
.catch((e) => { .catch((e) => {
console.log(e); console.log(e);
// messageError($q, e);
}); });
} }
function onAddSubject() {
formCommand.subject.push("");
}
function onDeleteSubject(index: number) {
formCommand.subject.splice(index, 1);
}
/** callback function */ /** callback function */
watch( watch(
() => store.checkFileupload, () => store.checkFileupload,
() => { () => {
const fileEvaluationValues = [ for (let i = 0; i < formTemplates.value.length; i++) {
fileEvaluation1, if (formTemplates.value[i].downloadFile === "") {
fileEvaluation2, formTemplates.value[i].file = null;
fileEvaluation3,
fileEvaluation4,
fileEvaluation5,
fileEvaluation6,
];
const downloadFileValues = [
downloadFile1,
downloadFile2,
downloadFile3,
downloadFile4,
downloadFile5,
downloadFile6,
];
for (let i = 0; i < downloadFileValues.length; i++) {
if (downloadFileValues[i].value === "") {
fileEvaluationValues[i].value = null;
} }
} }
} }
@ -385,19 +317,29 @@ onMounted(async () => {
if (user) { if (user) {
formCommand.author = user.name; formCommand.author = user.name;
} }
showLoader();
await Promise.all([ try {
fetcheSigner(evaluateId.value), showLoader();
fetchCheckSpec(evaluateId.value), await Promise.all([
downloadFile("1-แบบพิจารณาคุณสมบัติบุคคล"), fetcheSigner(evaluateId.value),
downloadFile("2-แบบแสดงรายละเอียดการเสนอผลงาน"), fetchCheckSpec(evaluateId.value),
downloadFile( formTemplates.value.forEach((e) => {
"3-แบบตรวจสอบความถูกต้องครบถ้วนของข้อมูลเพื่อประกอบการคัดเลือกบุคคล (เอกสารแบบ ก)" downloadFile(e.fileName);
), }),
downloadFile("4-แบบประเมินคุณลักษณะบุคคล"), // downloadFile("1-"),
downloadFile("5-แบบสรุปข้อมูลของผู้ขอรับการคัดเลือก (เอกสารหมายเลข 9)"), // downloadFile("2-"),
downloadFile("6-ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11)"), // downloadFile(
]); // "3- ( )"
// ),
// downloadFile("4-"),
// downloadFile("5- ( 9)"),
// downloadFile("6- ( 11)"),
]);
} catch (error) {
console.log(error);
} finally {
hideLoader();
}
}); });
</script> </script>
@ -412,32 +354,67 @@ onMounted(async () => {
<div class="col-12"><q-separator /></div> <div class="col-12"><q-separator /></div>
<div class="col-12 q-pa-sm"> <div class="col-12 q-pa-sm">
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">
<q-input <div class="col-12">
:readonly="store.currentStep != 2 || store.statusUpload" <q-input
ref="performanceRef" :readonly="store.currentStep != 2 || store.statusUpload"
dense dense
class="col-xs-12 col-sm-6" outlined
outlined v-model="formCommand.author"
label="ชื่อผลงาน" @update:model-value="updateInput(formCommand)"
v-model="formCommand.subject" label="เจ้าของผลงาน"
@update:model-value="updateInput(formCommand)" :rules="[(val:string) => !!val || `${'กรุณากรอกเจ้าของผลงาน'}`]"
:rules="[(val:string) => !!val || `${'กรุณากรอกชื่อผลงาน'}`]" lazy-rules
lazy-rules hide-bottom-space
hide-bottom-space />
/> </div>
<q-input <div
:readonly="store.currentStep != 2 || store.statusUpload" class="col-12"
ref="performanceOwnerRef" v-if="store.currentStep === 2 && !store.statusUpload"
class="col-xs-12 col-sm-6" >
dense <q-btn
outlined flat
v-model="formCommand.author" round
@update:model-value="updateInput(formCommand)" color="primary"
label="เจ้าของผลงาน" icon="add"
:rules="[(val:string) => !!val || `${'กรุณากรอกเจ้าของผลงาน'}`]" @click="onAddSubject"
lazy-rules >
hide-bottom-space <q-tooltip>เพมชอผลงาน</q-tooltip>
/> </q-btn>
</div>
<div
class="row col-12 q-col-gutter-sm"
v-for="(item, index) in formCommand.subject"
:key="index"
>
<div class="col-11">
<q-input
:readonly="store.currentStep != 2 || store.statusUpload"
dense
outlined
label="ชื่อผลงาน"
v-model="formCommand.subject[index]"
@update:model-value="updateInput(formCommand)"
:rules="[(val:string) => !!val || `${'กรุณากรอกชื่อผลงาน'}`]"
lazy-rules
hide-bottom-space
/>
</div>
<div
class="row col-1 items-centet justify-center"
v-if="index !== 0"
>
<q-btn
v-if="store.currentStep === 2 && !store.statusUpload"
flat
round
color="red"
icon="delete"
@click="onDeleteSubject(index)"
>
<q-tooltip>ลบ</q-tooltip>
</q-btn>
</div>
</div>
</div> </div>
</div> </div>
</q-card> </q-card>
@ -459,7 +436,6 @@ onMounted(async () => {
<div class="row col-12 q-col-gutter-sm q-pa-sm"> <div class="row col-12 q-col-gutter-sm q-pa-sm">
<q-input <q-input
:readonly="store.currentStep != 2 || store.statusUpload" :readonly="store.currentStep != 2 || store.statusUpload"
ref="commanderFullnameRef"
dense dense
class="col-xs-12 col-sm-6" class="col-xs-12 col-sm-6"
outlined outlined
@ -470,19 +446,58 @@ onMounted(async () => {
lazy-rules lazy-rules
hide-bottom-space hide-bottom-space
/> />
<q-input <div class="col-12">
:readonly="store.currentStep != 2 || store.statusUpload" <div class="row col-12 q-col-gutter-sm">
ref="commanderPositionRef" <q-input
class="col-xs-12 col-sm-6" :readonly="store.currentStep != 2 || store.statusUpload"
dense class="col-xs-6 col-sm-3"
outlined dense
v-model="formCommand.commanderPosition" outlined
@update:model-value="updateInput(formCommand)" v-model="formCommand.commanderPosition"
label="ตำแหน่ง" @update:model-value="updateInput(formCommand)"
:rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]" label="ตำแหน่ง"
lazy-rules :rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]"
hide-bottom-space lazy-rules
/> hide-bottom-space
/>
<q-input
:readonly="store.currentStep != 2 || store.statusUpload"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderPositionOld"
@update:model-value="updateInput(formCommand)"
label="ตำแหน่งเดิม"
:rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่งเดิม'}`]"
lazy-rules
hide-bottom-space
/>
<q-input
:readonly="store.currentStep != 2 || store.statusUpload"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderOrg"
@update:model-value="updateInput(formCommand)"
label="สังกัด"
:rules="[(val:string) => !!val || `${'กรุณากรอกสังกัด'}`]"
lazy-rules
hide-bottom-space
/>
<q-input
:readonly="store.currentStep != 2 || store.statusUpload"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderOrgOld"
@update:model-value="updateInput(formCommand)"
label="สังกัดเดิม"
:rules="[(val:string) => !!val || `${'กรุณากรอกสังกัดเดิม'}`]"
lazy-rules
hide-bottom-space
/>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -494,7 +509,6 @@ onMounted(async () => {
<div class="row col-12 q-col-gutter-md q-pa-sm"> <div class="row col-12 q-col-gutter-md q-pa-sm">
<q-input <q-input
:readonly="store.currentStep != 2 || store.statusUpload" :readonly="store.currentStep != 2 || store.statusUpload"
ref="commanderAboveFullnameRef"
dense dense
class="col-xs-12 col-sm-6" class="col-xs-12 col-sm-6"
outlined outlined
@ -505,19 +519,59 @@ onMounted(async () => {
@update:model-value="updateInput(formCommand)" @update:model-value="updateInput(formCommand)"
hide-bottom-space hide-bottom-space
/> />
<q-input
:readonly="store.currentStep != 2 || store.statusUpload" <div class="col-12">
ref="commanderAbovePositionRef" <div class="row col-12 q-col-gutter-sm">
class="col-xs-12 col-sm-6" <q-input
dense :readonly="store.currentStep != 2 || store.statusUpload"
outlined class="col-xs-6 col-sm-3"
v-model="formCommand.commanderAbovePosition" dense
label="ตำแหน่ง" outlined
:rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]" v-model="formCommand.commanderAbovePosition"
lazy-rules label="ตำแหน่ง"
hide-bottom-space :rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]"
@update:model-value="updateInput(formCommand)" lazy-rules
/> hide-bottom-space
@update:model-value="updateInput(formCommand)"
/>
<q-input
:readonly="store.currentStep != 2 || store.statusUpload"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderAbovePositionOld"
label="ตำแหน่งเดิม"
:rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่งเดิม'}`]"
lazy-rules
hide-bottom-space
@update:model-value="updateInput(formCommand)"
/>
<q-input
:readonly="store.currentStep != 2 || store.statusUpload"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderAboveOrg"
label="สังกัด"
:rules="[(val:string) => !!val || `${'กรุณากรอกสังกัด'}`]"
lazy-rules
hide-bottom-space
@update:model-value="updateInput(formCommand)"
/>
<q-input
:readonly="store.currentStep != 2 || store.statusUpload"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderAboveOrgOld"
label="สังกัดเดิม"
:rules="[(val:string) => !!val || `${'กรุณากรอกสังกัดเดิม'}`]"
lazy-rules
hide-bottom-space
@update:model-value="updateInput(formCommand)"
/>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -527,8 +581,97 @@ onMounted(async () => {
<!-- v-if="store.statusUpload --> <!-- v-if="store.statusUpload -->
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">
<div
class="col-6"
v-if="store.currentStep === 2"
v-for="(item, index) in formTemplates"
:key="index"
>
<q-card bordered class="cardSp1">
<div
class="text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm col-12 row items-center"
>
<div>{{ item.title }}</div>
<q-space />
<div>
<q-btn
flat
dense
icon="download"
color="indigo"
@click="
onClickDowloadFile(item.code, item.templateName, item.title)
"
>
<q-tooltip> ดาวนโหลดตนแบบ </q-tooltip></q-btn
>
</div>
<div>
<q-btn
v-if="item.downloadFile != ''"
:href="item.downloadFile"
target="_blank"
class="q-ml-sm"
color="blue"
flat
dense
icon="visibility"
>
<q-tooltip> ไฟลเอกสาร </q-tooltip></q-btn
>
</div>
</div>
<div class="col-12"><q-separator /></div>
<div class="row">
<div class="col-12 q-pa-sm">
<div class="row q-col-gutter-md col-12">
<q-file
v-model="item.file"
:disable="!store.statusUpload"
class="col-xs-12 col-sm-12"
label="อัปโหลดไฟล์"
outlined
dense
lazy-rules
hide-bottom-space
accept=".pdf"
:rules="
item.downloadFile === ''
? [(val:any) => !!val || 'กรุณาเลือกไฟล์']
: []
"
>
<template v-slot:prepend>
<q-icon name="attach_file" />
</template>
<template v-slot:after>
<q-btn
:disable="!store.statusUpload"
flat
round
dense
color="primary"
icon="mdi-upload"
@click="
fetchPathUpload(
'เล่ม 1',
evaluateId,
item.fileName,
item.file
)
"
><q-tooltip>ปโหลดไฟล</q-tooltip></q-btn
>
</template>
</q-file>
</div>
</div>
</div>
</q-card>
</div>
<!-- แบบพจารณาคณสมบคคล --> <!-- แบบพจารณาคณสมบคคล -->
<div class="col-6" v-if="store.currentStep === 2"> <!-- <div class="col-6" v-if="store.currentStep === 2">
<q-card bordered class="cardSp1"> <q-card bordered class="cardSp1">
<div <div
class="text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm col-12 row items-center" class="text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm col-12 row items-center"
@ -615,10 +758,10 @@ onMounted(async () => {
</div> </div>
</div> </div>
</q-card> </q-card>
</div> </div> -->
<!-- แบบแสดงรายละเอยดการเสนอผลงาน --> <!-- แบบแสดงรายละเอยดการเสนอผลงาน -->
<div class="col-6" v-if="store.currentStep === 2"> <!-- <div class="col-6" v-if="store.currentStep === 2">
<q-card bordered class="cardSp1"> <q-card bordered class="cardSp1">
<div <div
class="text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm col-12 row items-center" class="text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm col-12 row items-center"
@ -705,10 +848,10 @@ onMounted(async () => {
</div> </div>
</div> </div>
</q-card> </q-card>
</div> </div> -->
<!-- แบบตรวจสอบความถกตองครบถวนของขอมลเพอประกอบการคดเลอกบคคล (เอกสารแบบ ) --> <!-- แบบตรวจสอบความถกตองครบถวนของขอมลเพอประกอบการคดเลอกบคคล (เอกสารแบบ ) -->
<div class="col-6" v-if="store.currentStep === 2"> <!-- <div class="col-6" v-if="store.currentStep === 2">
<q-card bordered class="cardSp1"> <q-card bordered class="cardSp1">
<div <div
class="col-12 row text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm no-wrap" class="col-12 row text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm no-wrap"
@ -795,10 +938,10 @@ onMounted(async () => {
</div> </div>
</div> </div>
</q-card> </q-card>
</div> </div> -->
<!-- แบบสรปขอมลของผขอรบการคดเลอก (เอกสารหมายเลข 9) --> <!-- แบบสรปขอมลของผขอรบการคดเลอก (เอกสารหมายเลข 9) -->
<div class="col-6" v-if="store.currentStep === 2"> <!-- <div class="col-6" v-if="store.currentStep === 2">
<q-card bordered class="cardSp1"> <q-card bordered class="cardSp1">
<div <div
class="col-12 row text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm no-wrap" class="col-12 row text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm no-wrap"
@ -884,10 +1027,10 @@ onMounted(async () => {
</div> </div>
</div> </div>
</q-card> </q-card>
</div> </div> -->
<!-- แบบประเมนคณลกษณะบคคล --> <!-- แบบประเมนคณลกษณะบคคล -->
<div class="col-6" v-if="store.currentStep === 2"> <!-- <div class="col-6" v-if="store.currentStep === 2">
<q-card bordered class="cardSp1"> <q-card bordered class="cardSp1">
<div <div
class="col-12 row text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm items-center" class="col-12 row text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm items-center"
@ -972,10 +1115,10 @@ onMounted(async () => {
</div> </div>
</div> </div>
</q-card> </q-card>
</div> </div> -->
<!--ผลงานทจะสงประเม (เอกสารหมายเลข 11) --> <!--ผลงานทจะสงประเม (เอกสารหมายเลข 11) -->
<div class="col-6" v-if="store.currentStep === 2"> <!-- <div class="col-6" v-if="store.currentStep === 2">
<q-card bordered class="cardSp1"> <q-card bordered class="cardSp1">
<div <div
class="col-12 row text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm items-center" class="col-12 row text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm items-center"
@ -1060,7 +1203,7 @@ onMounted(async () => {
</div> </div>
</div> </div>
</q-card> </q-card>
</div> </div> -->
</div> </div>
</div> </div>

View file

@ -22,13 +22,23 @@ const evaluateId = ref<string>(route.params.id.toString());
const emit = defineEmits(["update:file"]); const emit = defineEmits(["update:file"]);
const selectedItem = ref(1); const selectedItem = ref(1);
const fileName = ref([ const formTemplates = ref([
"1-แบบพิจารณาคุณสมบัติบุคคล", {
"2-แบบแสดงรายละเอียดการเสนอผลงาน", title: "แบบพิจารณาคุณสมบัติบุคคล",
"3-แบบตรวจสอบความถูกต้องครบถ้วนของข้อมูลเพื่อประกอบการคัดเลือกบุคคล (เอกสารแบบ ก)", fileName: "1-แบบพิจารณาคุณสมบัติบุคคล",
"4-แบบประเมินคุณลักษณะบุคคล", },
"5-แบบสรุปข้อมูลของผู้ขอรับการคัดเลือก (เอกสารหมายเลข 9)", {
"6-ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11)", title: "แบบแสดงรายละเอียดการเสนอผลงาน",
fileName: "2-แบบแสดงรายละเอียดการเสนอผลงาน",
},
{
title: "แบบประเมินคุณลักษณะบุคคล",
fileName: "4-แบบประเมินคุณลักษณะบุคคล",
},
{
title: "ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11)",
fileName: "6-ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11)",
},
]); ]);
/** /**
@ -38,7 +48,7 @@ const fileName = ref([
function handleItemClick(itemNumber: number) { function handleItemClick(itemNumber: number) {
store.tabPanels = itemNumber.toString(); store.tabPanels = itemNumber.toString();
selectedItem.value = itemNumber; selectedItem.value = itemNumber;
fetchDocument(fileName.value[itemNumber - 1]); fetchDocument(formTemplates.value[itemNumber - 1].fileName);
} }
/** /**
@ -50,14 +60,14 @@ async function fetchDocument(fileName: string) {
evaluateId.value && evaluateId.value &&
(await http (await http
.get(config.API.loadFileDocument("เล่ม 1", evaluateId.value, fileName)) .get(config.API.loadFileDocument("เล่ม 1", evaluateId.value, fileName))
.then((res) => { .then(async (res) => {
downloadFile(res.data.downloadUrl); await downloadFile(res.data.downloadUrl);
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
}) })
.finally(() => { .finally(() => {
showLoader(); hideLoader();
})); }));
} }
@ -66,7 +76,6 @@ async function fetchDocument(fileName: string) {
* @param url งกดาวนโหลดไฟล * @param url งกดาวนโหลดไฟล
*/ */
async function downloadFile(url: string) { async function downloadFile(url: string) {
showLoader();
await axios await axios
.get(url, { .get(url, {
responseType: "blob", responseType: "blob",
@ -81,84 +90,28 @@ async function downloadFile(url: string) {
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
})
.finally(() => {
hideLoader();
}); });
} }
/** HooK lifecycle*/ /** HooK lifecycle*/
onMounted(async () => { onMounted(async () => {
await fetchDocument(fileName.value[selectedItem.value - 1]); await fetchDocument(formTemplates.value[selectedItem.value - 1].fileName);
}); });
</script> </script>
<template> <template>
<q-list separator> <q-list separator>
<q-item <q-item
v-for="(item, index) in formTemplates"
:key="index"
clickable clickable
v-ripple v-ripple
:active="selectedItem === 1 ? true : false" :active="selectedItem === index + 1 ? true : false"
active-class="text-primary" active-class="text-primary"
@click="handleItemClick(1)" @click="handleItemClick(index + 1)"
class="cursor-pointer" class="cursor-pointer"
> >
<q-item-section>แบบพจารณาคณสมบคคล</q-item-section> <q-item-section>{{ item.title }}</q-item-section>
</q-item>
<q-item
clickable
v-ripple
:active="selectedItem === 2 ? true : false"
active-class="text-primary"
@click="handleItemClick(2)"
class="cursor-pointer"
>
<q-item-section>แบบแสดงรายละเอยดการเสนอผลงาน</q-item-section>
</q-item>
<q-item
clickable
v-ripple
:active="selectedItem === 3 ? true : false"
active-class="text-primary"
@click="handleItemClick(3)"
class="cursor-pointer"
>
<q-item-section
>แบบตรวจสอบความถกตองครบถวนของขอมลเพอประกอบการคดเลอกบคคล
(เอกสารแบบ )</q-item-section
>
</q-item>
<q-item
clickable
v-ripple
:active="selectedItem === 4 ? true : false"
active-class="text-primary"
@click="handleItemClick(4)"
class="cursor-pointer"
>
<q-item-section> แบบประเมนคณลกษณะบคคล </q-item-section>
</q-item>
<q-item
clickable
v-ripple
:active="selectedItem === 5 ? true : false"
active-class="text-primary"
@click="handleItemClick(5)"
class="cursor-pointer"
>
<q-item-section>
แบบสรปขอมลของผขอรบการคดเลอก (เอกสารหมายเลข 9)
</q-item-section>
</q-item>
<q-item
clickable
v-ripple
:active="selectedItem === 6 ? true : false"
active-class="text-primary"
@click="handleItemClick(6)"
class="cursor-pointer"
>
<q-item-section> ผลงานทจะสงประเม (เอกสารหมายเลข 11) </q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</template> </template>

View file

@ -1,7 +1,215 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from "vue"; import { ref, onMounted } from "vue";
import { useQuasar } from "quasar";
import axios from "axios";
import http from "@/plugins/http";
import config from "@/app.config";
import genReport from "@/plugins/genreport";
import { useRoute } from "vue-router";
import { useCounterMixin } from "@/stores/mixin";
import { useEvaluateStore } from "@/modules/06_evaluate/store";
const $q = useQuasar();
const route = useRoute();
const store = useEvaluateStore();
const { showLoader, hideLoader, messageError, success } = useCounterMixin();
const formTemplates = ref<any[]>([
{
code: "EV1_005",
templateName: "template-1",
title: "แบบพิจารณาคุณสมบัติบุคคล (ฉบับแก้ไข)",
fileName: "1-แบบพิจารณาคุณสมบัติบุคคล (ฉบับแก้ไข)",
downloadFile: "",
file: null,
},
{
code: "EV1_006",
templateName: "template-2",
title: "แบบแสดงรายละเอียดการเสนอผลงาน (ฉบับแก้ไข)",
fileName: "2-แบบแสดงรายละเอียดการเสนอผลงาน (ฉบับแก้ไข)",
downloadFile: "",
file: null,
},
{
code: "EV1_008",
templateName: "template-4",
title: "แบบประเมินคุณลักษณะบุคคล (ฉบับแก้ไข)",
fileName: "4-แบบประเมินคุณลักษณะบุคคล (ฉบับแก้ไข)",
downloadFile: "",
file: null,
},
{
code: "EV1_010",
templateName: "template-6",
title: "ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11) (ฉบับแก้ไข)",
fileName: "6-ผลงานที่จะส่งประเมิน (เอกสารหมายเลข 11) (ฉบับแก้ไข)",
downloadFile: "",
file: null,
},
]);
const evaluateId = ref<string>(route.params.id.toString());
const status = ref<string>("WAIT_CHECK_DOC_V1"); const status = ref<string>("WAIT_CHECK_DOC_V1");
const profile = ref<any>();
const author = ref<string>("");
const subject = ref<string>("");
/**
* function
* @param id evaluate ID
*/
async function fetchCheckSpec(id: string) {
await http
.get(config.API.evaluationReportCheckspecByid(id))
.then((res) => {
const data = res.data.result;
profile.value = data;
})
.catch((err) => {
messageError($q, err);
});
}
/**
* function fecth รายชอผเซนเอกสาร
* @param id evaluate ID
*/
function fetcheSigner(id: string) {
http
.get(config.API.evaluationSignerDoc1(id))
.then((res) => {
const data = res.data.result;
author.value = data.author;
subject.value = data.subject;
})
.catch((err) => {
messageError($q, err);
});
}
/**
* funcion ดาวนโหลดไฟล
* @param tp templatname
* @param templateName
* @param fileName ไฟล
*/
async function onClickDowloadFile(
tp: string,
templateName: string,
fileName: string
) {
showLoader();
const body = {
template: tp,
reportName: templateName,
data: profile.value,
};
await genReport(body, fileName); //
hideLoader();
}
/**
* function fetch งกปโหลดไฟล
* @param volume เล
* @param id evaluate ID
* @param type ประเภทไฟล
* @param file ไฟล
*/
async function fetchPathUpload(
volume: string,
id: string | undefined,
type: string,
file: any
) {
const body = {
fileList: {
fileName: type,
metadata: {
subject: subject.value,
author: author.value,
},
},
};
if (id && file) {
showLoader();
await http
.post(config.API.loadPathDocument(volume, id), body)
.then(async (res) => {
const foundKey: string | undefined = Object.keys(res.data).find(
(key) =>
res.data[key]?.fileName !== undefined &&
res.data[key]?.fileName !== ""
);
foundKey && (await uploadfile(res.data[foundKey]?.uploadUrl, file));
await downloadFile(type);
})
.catch((err) => {
messageError($q, err);
})
.finally(() => {
hideLoader();
});
}
}
/**
* functoin ปโหลดไฟล
* @param uploadUrl link ปโหลด
* @param file ไฟล
*/
async function uploadfile(uploadUrl: string, file: any) {
await axios
.put(uploadUrl, file, {
headers: {
"Content-Type": file.type,
},
})
.then(() => {
success($q, "อัปโหลไฟล์สำเร็จ");
})
.catch((err) => {
messageError($q, err);
});
}
/**
* function ดาวนโหลดไฟล
* @param fileName อไฟล
*/
async function downloadFile(fileName: string) {
await http
.get(config.API.loadFileDocument("เล่ม 1", evaluateId.value, fileName))
.then((res) => {
const index = formTemplates.value.findIndex(
(item) => item.fileName === fileName
);
if (index !== -1) {
formTemplates.value[index].downloadFile = res.data.downloadUrl;
}
});
}
/**lifecycle Hooks*/
onMounted(async () => {
try {
showLoader();
await Promise.all([
fetcheSigner(evaluateId.value),
fetchCheckSpec(evaluateId.value),
formTemplates.value.forEach((e) => {
downloadFile(e.fileName);
}),
]);
} catch (error) {
console.log(error);
} finally {
hideLoader();
}
});
</script> </script>
<template> <template>
@ -15,6 +223,91 @@ const status = ref<string>("WAIT_CHECK_DOC_V1");
style="font-size: 16px" style="font-size: 16px"
/> />
</div> </div>
<div class="row q-col-gutter-sm q-pa-sm">
<div class="col-6" v-for="(item, index) in formTemplates" :key="index">
<q-card bordered class="cardSp1">
<div
class="text-weight-medium bg-grey-1 q-py-sm q-pl-md q-pr-sm col-12 row items-center"
>
<div>{{ item.title }}</div>
<q-space />
<!-- <div>
<q-btn
flat
dense
icon="download"
color="indigo"
@click="
onClickDowloadFile(item.code, item.templateName, item.title)
"
>
<q-tooltip> ดาวนโหลดตนแบบ </q-tooltip></q-btn
>
</div> -->
<div>
<q-btn
v-if="item.downloadFile != ''"
:href="item.downloadFile"
target="_blank"
class="q-ml-sm"
color="blue"
flat
dense
icon="visibility"
>
<q-tooltip> ไฟลเอกสาร </q-tooltip></q-btn
>
</div>
</div>
<div class="col-12"><q-separator /></div>
<div class="row" v-if="store.currentStep === 4">
<div class="col-12 q-pa-sm">
<div class="row q-col-gutter-md col-12">
<q-file
v-model="item.file"
class="col-xs-12 col-sm-12"
label="อัปโหลดไฟล์"
outlined
dense
lazy-rules
hide-bottom-space
accept=".pdf"
:rules="
item.downloadFile === ''
? [(val:any) => !!val || 'กรุณาเลือกไฟล์']
: []
"
>
<template v-slot:prepend>
<q-icon name="attach_file" />
</template>
<template v-slot:after>
<q-btn
:disable="!item.file"
flat
round
dense
color="primary"
icon="mdi-upload"
@click="
fetchPathUpload(
'เล่ม 1',
evaluateId,
item.fileName,
item.file
)
"
><q-tooltip>ปโหลดไฟล</q-tooltip></q-btn
>
</template>
</q-file>
</div>
</div>
</div>
</q-card>
</div>
</div>
</template> </template>
<style scoped></style> <style scoped></style>

View file

@ -34,36 +34,25 @@ const fileEvaluation1 = ref<any>();
const formCommand = reactive<FormCommand>({ const formCommand = reactive<FormCommand>({
commanderFullname: "", commanderFullname: "",
commanderPosition: "", commanderPosition: "",
commanderPositionOld: "",
commanderOrg: "",
commanderOrgOld: "",
commanderAboveFullname: "", commanderAboveFullname: "",
commanderAbovePosition: "", commanderAbovePosition: "",
commanderAbovePositionOld: "",
commanderAboveOrgOld: "",
commanderAboveOrg: "",
author: "", author: "",
subject: "", subject: [""],
assignedPosition: "", assignedPosition: "",
}); });
/** ref input*/
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 fileEvaluation1Ref = ref<object | null>(null);
const performanceRef = ref<object | null>(null);
const performanceOwnerRef = ref<object | null>(null);
const assignedPositionRef = ref<object | null>(null);
const modalView = ref<boolean>(false); const modalView = ref<boolean>(false);
/** function อัปเดท ผลงาน,ผู้เซ็นเอกสาร*/ /** function อัปเดท ผลงาน,ผู้เซ็นเอกสาร*/
function updateInput(value: any) { function updateInput(value: any) {
const ref = { const ref = {
commanderFullnameRef: commanderFullnameRef.value,
commanderPositionRef: commanderPositionRef.value,
commanderAboveFullnameRef: commanderAboveFullnameRef.value,
commanderAbovePositionRef: commanderAbovePositionRef.value,
fileEvaluation1Ref: fileEvaluation1Ref.value,
downloadFile: [downloadUrl.value], downloadFile: [downloadUrl.value],
performance: performanceRef.value,
performanceOwner: performanceOwnerRef.value,
assignedPosition: assignedPositionRef.value,
}; };
emit("update:form", value, ref); emit("update:form", value, ref);
} }
@ -146,17 +135,25 @@ async function fetcheSigner(id: string) {
const data = res.data.result; const data = res.data.result;
formCommand.commanderFullname = data.commanderFullnameDoc2; formCommand.commanderFullname = data.commanderFullnameDoc2;
formCommand.commanderPosition = data.commanderPositionDoc2; formCommand.commanderPosition = data.commanderPositionDoc2;
formCommand.commanderPositionOld = data.commanderPositionOldDoc2;
formCommand.commanderOrg = data.commanderOrgDoc2;
formCommand.commanderOrgOld = data.commanderOrgOldDoc2;
formCommand.commanderAboveFullname = data.commanderAboveFullnameDoc2; formCommand.commanderAboveFullname = data.commanderAboveFullnameDoc2;
formCommand.commanderAbovePosition = data.commanderAbovePositionDoc2; formCommand.commanderAbovePosition = data.commanderAbovePositionDoc2;
formCommand.commanderAbovePositionOld =
data.commanderAbovePositionOldDoc2;
formCommand.commanderAboveOrgOld = data.commanderAboveOrgOldDoc2;
formCommand.commanderAboveOrg = data.commanderAboveOrgDoc2;
formCommand.author = data.authorDoc2; formCommand.author = data.authorDoc2;
formCommand.subject = data.subjectDoc2; formCommand.subject = data.subjectDoc2;
formCommand.assignedPosition = data.assignedPosition; formCommand.assignedPosition = data.assignedPosition;
store.statusUpload6 = data.commanderFullnameDoc2 === null ? false : true; store.statusUpload6 = data.isUpdated;
}) })
.catch(() => { .catch((err) => {
store.statusUpload6 = false; messageError($q, err);
getCommander(); // store.statusUpload6 = false;
// getCommander();
}) })
.finally(() => { .finally(() => {
hideLoader(); hideLoader();
@ -181,28 +178,17 @@ async function fetchCheckDate() {
const downloadUrl = ref<string>(""); const downloadUrl = ref<string>("");
/** function เช็คไฟล์อัปโหลด*/ /** function เช็คไฟล์อัปโหลด*/
function checkDoc() { async function checkDoc() {
// showLoader(); await http
http
.get( .get(
config.API.loadFileDocument("เล่ม 2", evaluateId.value, "1-เอกสารเล่ม 2") config.API.loadFileDocument("เล่ม 2", evaluateId.value, "1-เอกสารเล่ม 2")
) )
.then((res: any) => { .then((res: any) => {
downloadUrl.value = res.data.downloadUrl; downloadUrl.value = res.data.downloadUrl;
}) })
.catch(() => {})
.finally(() => { .finally(() => {
// hideLoader();
const ref = { const ref = {
commanderFullnameRef: commanderFullnameRef.value,
commanderPositionRef: commanderPositionRef.value,
commanderAboveFullnameRef: commanderAboveFullnameRef.value,
commanderAbovePositionRef: commanderAbovePositionRef.value,
fileEvaluation1Ref: fileEvaluation1Ref.value,
downloadFile: [downloadUrl.value], downloadFile: [downloadUrl.value],
performance: performanceRef.value,
performanceOwner: performanceOwnerRef.value,
assignedPosition: assignedPositionRef.value,
}; };
emit("update:form", formCommand, ref); emit("update:form", formCommand, ref);
@ -221,8 +207,15 @@ function getCommander() {
}) })
.catch((e) => { .catch((e) => {
messageError($q, e); messageError($q, e);
}) });
.finally(() => {}); }
function onAddSubject() {
formCommand.subject.push("");
}
function onDeleteSubject(index: number) {
formCommand.subject.splice(index, 1);
} }
watch( watch(
@ -273,27 +266,12 @@ onMounted(async () => {
<q-card bordered class="shadow-0" style="border: 1px solid #d6dee1"> <q-card bordered class="shadow-0" style="border: 1px solid #d6dee1">
<div class="text-weight-medium bg-grey-1 q-py-sm q-px-md">ผลงาน</div> <div class="text-weight-medium bg-grey-1 q-py-sm q-px-md">ผลงาน</div>
<div class="col-12"><q-separator /></div> <div class="col-12"><q-separator /></div>
<div class="col-12"> <div class="col-12 q-pa-sm">
<div class="row q-col-gutter-sm col-12"> <div class="row q-col-gutter-sm">
<div class="col-xs-12 col-sm-12 row"> <div class="col-12 row q-col-gutter-sm">
<div class="row col-12 q-col-gutter-sm q-pa-sm"> <div class="col-6">
<q-input <q-input
:readonly="store.currentStep != 6" :readonly="store.currentStep != 6 || store.statusUpload6"
ref="performanceRef"
dense
class="col-xs-12 col-sm-6"
outlined
label="ชื่อผลงาน"
v-model="formCommand.subject"
@update:model-value="updateInput(formCommand)"
:rules="[(val:string) => !!val || `${'กรุณากรอกชื่อผลงาน'}`]"
hide-bottom-space
lazy-rules
/>
<q-input
:readonly="store.currentStep != 6"
ref="performanceOwnerRef"
class="col-xs-12 col-sm-6"
dense dense
outlined outlined
v-model="formCommand.author" v-model="formCommand.author"
@ -303,9 +281,10 @@ onMounted(async () => {
:rules="[(val:string) => !!val || `${'กรุณากรอกเจ้าของผลงาน'}`]" :rules="[(val:string) => !!val || `${'กรุณากรอกเจ้าของผลงาน'}`]"
lazy-rules lazy-rules
/> />
</div>
<div class="col-6">
<q-input <q-input
:readonly="store.currentStep != 6" :readonly="store.currentStep != 6 || store.statusUpload6"
ref="assignedPositionRef"
class="col-xs-12 col-sm-6" class="col-xs-12 col-sm-6"
dense dense
outlined outlined
@ -314,12 +293,62 @@ onMounted(async () => {
label="ตำแหน่งที่ได้รับ" label="ตำแหน่งที่ได้รับ"
hide-bottom-space hide-bottom-space
:rules="[ :rules="[
(val:string) => !!val || `${'กรุณากรอกตำแหน่งที่ได้รับ'}`, (val:string) => !!val || `${'กรุณากรอกตำแหน่งที่ได้รับ'}`,
]" ]"
lazy-rules lazy-rules
/> />
</div> </div>
</div> </div>
<div
class="col-12"
v-if="store.currentStep === 6 && !store.statusUpload6"
>
<q-btn
flat
round
color="primary"
icon="add"
@click="onAddSubject"
>
<q-tooltip>เพมชอผลงาน</q-tooltip>
</q-btn>
</div>
<div
class="row col-12 q-col-gutter-sm"
v-for="(item, index) in formCommand.subject"
:key="index"
>
<div class="col-11">
<q-input
:readonly="store.currentStep != 6 || store.statusUpload6"
dense
outlined
label="ชื่อผลงาน"
v-model="formCommand.subject[index]"
@update:model-value="updateInput(formCommand)"
:rules="[(val:string) => !!val || `${'กรุณากรอกชื่อผลงาน'}`]"
hide-bottom-space
lazy-rules
/>
</div>
<div
class="row col-1 items-centet justify-center"
v-if="index !== 0"
>
<q-btn
v-if="store.currentStep === 6 && !store.statusUpload6"
flat
round
color="red"
icon="delete"
@click="onDeleteSubject(index)"
>
<q-tooltip>ลบ</q-tooltip>
</q-btn>
</div>
</div>
</div> </div>
</div> </div>
</q-card> </q-card>
@ -340,8 +369,7 @@ onMounted(async () => {
</div> </div>
<div class="row col-12 q-col-gutter-sm q-pa-sm"> <div class="row col-12 q-col-gutter-sm q-pa-sm">
<q-input <q-input
:readonly="store.currentStep != 6" :readonly="store.currentStep != 6 || store.statusUpload6"
ref="commanderFullnameRef"
dense dense
class="col-xs-12 col-sm-6" class="col-xs-12 col-sm-6"
outlined outlined
@ -352,19 +380,68 @@ onMounted(async () => {
lazy-rules lazy-rules
hide-bottom-space hide-bottom-space
/> />
<q-input <div class="col-12">
:readonly="store.currentStep != 6" <div class="row col-12 q-col-gutter-sm">
ref="commanderPositionRef" <q-input
class="col-xs-12 col-sm-6" :readonly="
dense store.currentStep != 6 || store.statusUpload6
outlined "
v-model="formCommand.commanderPosition" class="col-xs-6 col-sm-3"
@update:model-value="updateInput(formCommand)" dense
label="ตำแหน่ง" outlined
:rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]" v-model="formCommand.commanderPosition"
lazy-rules @update:model-value="updateInput(formCommand)"
hide-bottom-space label="ตำแหน่ง"
/> :rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]"
lazy-rules
hide-bottom-space
/>
<q-input
:readonly="
store.currentStep != 6 || store.statusUpload6
"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderPositionOld"
@update:model-value="updateInput(formCommand)"
label="ตำแหน่งเดิม"
:rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่งเดิม'}`]"
lazy-rules
hide-bottom-space
/>
<q-input
:readonly="
store.currentStep != 6 || store.statusUpload6
"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderOrg"
@update:model-value="updateInput(formCommand)"
label="สังกัด"
:rules="[(val:string) => !!val || `${'กรุณากรอกสังกัด'}`]"
lazy-rules
hide-bottom-space
/>
<q-input
:readonly="
store.currentStep != 6 || store.statusUpload6
"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderOrgOld"
@update:model-value="updateInput(formCommand)"
label="สังกัดเดิม"
:rules="[(val:string) => !!val || `${'กรุณากรอกสังกัดเดิม'}`]"
lazy-rules
hide-bottom-space
/>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -376,8 +453,7 @@ onMounted(async () => {
</div> </div>
<div class="row col-12 q-col-gutter-sm q-pa-sm"> <div class="row col-12 q-col-gutter-sm q-pa-sm">
<q-input <q-input
:readonly="store.currentStep != 6" :readonly="store.currentStep != 6 || store.statusUpload6"
ref="commanderAboveFullnameRef"
dense dense
class="col-xs-12 col-sm-6" class="col-xs-12 col-sm-6"
outlined outlined
@ -388,19 +464,67 @@ onMounted(async () => {
@update:model-value="updateInput(formCommand)" @update:model-value="updateInput(formCommand)"
hide-bottom-space hide-bottom-space
/> />
<q-input
:readonly="store.currentStep != 6" <div class="col-12">
ref="commanderAbovePositionRef" <div class="row col-12 q-col-gutter-sm">
class="col-xs-12 col-sm-6" <q-input
dense :readonly="
outlined store.currentStep != 6 || store.statusUpload6
v-model="formCommand.commanderAbovePosition" "
label="ตำแหน่ง" class="col-xs-6 col-sm-3"
:rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]" dense
lazy-rules outlined
@update:model-value="updateInput(formCommand)" v-model="formCommand.commanderAbovePosition"
hide-bottom-space label="ตำแหน่ง"
/> :rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่ง'}`]"
lazy-rules
@update:model-value="updateInput(formCommand)"
hide-bottom-space
/>
<q-input
:readonly="
store.currentStep != 6 || store.statusUpload6
"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderAbovePositionOld"
label="ตำแหน่งเดิม"
:rules="[(val:string) => !!val || `${'กรุณากรอกตำแหน่งเดิม'}`]"
lazy-rules
hide-bottom-space
@update:model-value="updateInput(formCommand)"
/>
<q-input
:readonly="
store.currentStep != 6 || store.statusUpload6
"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderAboveOrg"
label="สังกัด"
:rules="[(val:string) => !!val || `${'กรุณากรอกสังกัด'}`]"
lazy-rules
hide-bottom-space
@update:model-value="updateInput(formCommand)"
/>
<q-input
:readonly="
store.currentStep != 6 || store.statusUpload6
"
class="col-xs-6 col-sm-3"
dense
outlined
v-model="formCommand.commanderAboveOrgOld"
label="สังกัดเดิม"
:rules="[(val:string) => !!val || `${'กรุณากรอกสังกัดเดิม'}`]"
lazy-rules
hide-bottom-space
@update:model-value="updateInput(formCommand)"
/>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -434,7 +558,6 @@ onMounted(async () => {
<div class="col-12"> <div class="col-12">
<q-file <q-file
:disable="!store.statusUpload6" :disable="!store.statusUpload6"
ref="fileEvaluation1Ref"
v-model="fileEvaluation1" v-model="fileEvaluation1"
class="col-12" class="col-12"
outlined outlined

View file

@ -35,11 +35,14 @@ async function fetchDocument() {
"1-เอกสารเล่ม 2" "1-เอกสารเล่ม 2"
) )
) )
.then((res) => { .then(async (res) => {
downloadFile(res.data.downloadUrl); await downloadFile(res.data.downloadUrl);
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
})
.finally(() => {
hideLoader();
})); }));
} }

View file

@ -69,20 +69,20 @@ async function fetchPathUpload(
showLoader(); showLoader();
await http await http
.post(config.API.loadPathDocument(volume, id), body) .post(config.API.loadPathDocument(volume, id), body)
.then((res) => { .then(async (res) => {
const foundKey: string | undefined = Object.keys(res.data).find( const foundKey: string | undefined = Object.keys(res.data).find(
(key) => (key) =>
res.data[key]?.fileName !== undefined && res.data[key]?.fileName !== undefined &&
res.data[key]?.fileName !== "" res.data[key]?.fileName !== ""
); );
foundKey && uploadfile(res.data[foundKey]?.uploadUrl, file); foundKey && (await uploadfile(res.data[foundKey]?.uploadUrl, file));
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
})
.finally(() => {
hideLoader(); hideLoader();
}); });
// .finally(() => {
// });
} }
} }
@ -103,16 +103,12 @@ async function uploadfile(uploadUrl: string, file: any) {
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
})
.finally(() => {
hideLoader();
}); });
} }
const downloadUrl = ref<string>(""); const downloadUrl = ref<string>("");
/** function เช็คไฟล์อัปโหลด*/ /** function เช็คไฟล์อัปโหลด*/
function checkDoc() { function checkDoc() {
showLoader();
http http
.get( .get(
config.API.loadFileDocument( config.API.loadFileDocument(
@ -123,12 +119,6 @@ function checkDoc() {
) )
.then((res: any) => { .then((res: any) => {
downloadUrl.value = res.data.downloadUrl; downloadUrl.value = res.data.downloadUrl;
})
.catch((e) => {
// messageError($q, e);
})
.finally(() => {
hideLoader();
}); });
} }
@ -141,7 +131,6 @@ const assignedPosition = ref<string>("");
* @param id ประเม * @param id ประเม
*/ */
async function fetcheSigner(id: string) { async function fetcheSigner(id: string) {
showLoader();
await http await http
.get(config.API.evaluationSignerDoc2(id)) .get(config.API.evaluationSignerDoc2(id))
.then((res) => { .then((res) => {
@ -151,16 +140,21 @@ async function fetcheSigner(id: string) {
assignedPosition.value = data.assignedPosition; assignedPosition.value = data.assignedPosition;
evaluationResult.value = data.evaluationResult; evaluationResult.value = data.evaluationResult;
}) })
.catch(() => {}) .catch((err) => {
.finally(() => { messageError($q, err);
hideLoader();
}); });
} }
/** lifecycleHook*/ /** lifecycleHook*/
onMounted(async () => { onMounted(async () => {
await checkDoc(); try {
await fetcheSigner(evaluateId.value); showLoader();
await Promise.all([checkDoc(), fetcheSigner(evaluateId.value)]);
} catch (error) {
console.log(error);
} finally {
hideLoader();
}
}); });
</script> </script>
@ -178,7 +172,7 @@ onMounted(async () => {
/> />
</div> </div>
<div class="col-12"> <div class="col-12" v-if="(store.currentStep !== 8 && downloadUrl) || store.currentStep == 8 ">
<q-card class="shadow-0" bordered> <q-card class="shadow-0" bordered>
<div class="row col-12 bg-grey-1 q-px-sm q-py-xs items-center"> <div class="row col-12 bg-grey-1 q-px-sm q-py-xs items-center">
<div class="text-weight-medium">เอกสารเล 2 (ฉบบแกไข)</div> <div class="text-weight-medium">เอกสารเล 2 (ฉบบแกไข)</div>

View file

@ -69,11 +69,10 @@ const formDetail = reactive<any>({
/** function เรียกข้อมูลตรวจสอบคุณสมบัติ*/ /** function เรียกข้อมูลตรวจสอบคุณสมบัติ*/
async function fetchDetail() { async function fetchDetail() {
showLoader();
await http await http
.get(config.API.positionBykeycloak()) .get(config.API.positionBykeycloak())
.then((res) => { .then(async (res) => {
const data = res.data.result; const data = await res.data.result;
formDetail.root = data.root; formDetail.root = data.root;
formDetail.rootId = data.rootId; formDetail.rootId = data.rootId;
formDetail.userId = data.id; formDetail.userId = data.id;
@ -89,58 +88,62 @@ async function fetchDetail() {
formDetail.birthDate = data.birthDate; formDetail.birthDate = data.birthDate;
// formDetail.govAge = data.govAge; // // formDetail.govAge = data.govAge; //
formDetail.salary = data.salary; formDetail.salary = data.salary;
await fetchDataAllDetail();
http.get(config.API.dataUserEducations).then((res) => {
formDetail.educations = res.data.result;
});
http.get(config.API.dataUserCertificate("certificate")).then((res) => {
formDetail.certificates = res.data.result.map(
(e: CertificatesForm) => ({
certificateNo: e.certificateNo,
certificateType: e.certificateType,
expireDate: e.expireDate,
issueDate: e.issueDate,
issuer: e.issuer,
})
);
});
http.get(config.API.dataUserSalary).then((res) => {
formDetail.salaries = res.data.result;
});
http.get(config.API.dataUserCertificate("training")).then((res) => {
formDetail.trainings = res.data.result.map((e: any) => ({
dateOrder: e.dateOrder,
department: e.department,
duration: e.duration,
endDate: e.endDate,
name: e.name,
numberOrder: e.numberOrder,
place: e.place,
startDate: e.startDate,
topic: e.topic,
yearly: e.yearly,
}));
});
http.get(config.API.dataUserAssessments).then((res) => {
formDetail.assessments = res.data.result;
});
emit("update:formDeital", formDetail); emit("update:formDeital", formDetail);
}) })
.catch((err) => { .catch((err) => {
messageError($q, err); messageError($q, err);
})
.finally(() => {
setTimeout(() => {
hideLoader();
}, 2500);
}); });
} }
async function fetchDataAllDetail() {
//
http.get(config.API.dataUserEducations).then((res) => {
formDetail.educations = res.data.result;
});
//
http.get(config.API.dataUserCertificate("certificate")).then((res) => {
formDetail.certificates = res.data.result.map((e: CertificatesForm) => ({
certificateNo: e.certificateNo,
certificateType: e.certificateType,
expireDate: e.expireDate,
issueDate: e.issueDate,
issuer: e.issuer,
}));
});
//
http.get(config.API.dataUserSalary).then((res) => {
formDetail.salaries = res.data.result;
});
//
http.get(config.API.dataUserCertificate("training")).then((res) => {
formDetail.trainings = res.data.result.map((e: any) => ({
dateOrder: e.dateOrder,
department: e.department,
duration: e.duration,
endDate: e.endDate,
name: e.name,
numberOrder: e.numberOrder,
place: e.place,
startDate: e.startDate,
topic: e.topic,
yearly: e.yearly,
}));
});
http.get(config.API.dataUserPerformance).then((res) => {
formDetail.assessments = res.data.result;
});
http.get(config.API.dataUserPortfolio).then((res) => {
formDetail.experience = res.data.result;
});
}
/** /**
* function fetchData ตรวจสอบคณสมบ * function fetchData ตรวจสอบคณสมบ
* @param id ประเม * @param id ประเม
@ -178,7 +181,8 @@ async function fetchCheckSpec(data: any) {
topic: e.topic, topic: e.topic,
yearly: e.yearly, yearly: e.yearly,
})); }));
formDetail.assessments = data.assessments; formDetail.assessments = data.performances;
formDetail.experience = data.portfolios;
} }
/** /**
@ -195,7 +199,6 @@ function formattedNumber(x: number) {
/** get data */ /** get data */
function getData() { function getData() {
showLoader();
http http
.get(config.API.dataUserGovernment) .get(config.API.dataUserGovernment)
.then(async (res) => { .then(async (res) => {
@ -207,28 +210,30 @@ function getData() {
}) })
.catch((e) => { .catch((e) => {
messageError($q, e); messageError($q, e);
})
.finally(() => {
setTimeout(() => {
hideLoader();
}, 2500);
}); });
} }
onMounted(async () => { onMounted(async () => {
const promises = []; try {
showLoader();
const promises = [];
if (route.name === "evaluate-add") { if (route.name === "evaluate-add") {
promises.push(fetchDetail()); promises.push(fetchDetail());
}
if (props.data) {
promises.push(fetchCheckSpec(props.data));
}
promises.push(getData());
await Promise.all(promises);
} catch (error) {
console.log(error);
} finally {
hideLoader();
} }
if (props.data) {
promises.push(fetchCheckSpec(props.data));
}
promises.push(getData());
await Promise.all(promises);
}); });
</script> </script>
@ -537,7 +542,6 @@ onMounted(async () => {
</q-tr> </q-tr>
</template> </template>
</d-table> </d-table>
<!-- <TableData :columns="columnSalaries" :row="formDetail.salaries" /> -->
</div> </div>
</q-card> </q-card>
@ -561,7 +565,7 @@ onMounted(async () => {
<TableData <TableData
class="col-12" class="col-12"
:columns="columnExperience" :columns="columnExperience"
:row="formDetail.trainings" :row="formDetail.experience"
/> />
</q-card> </q-card>
@ -570,13 +574,12 @@ onMounted(async () => {
<span class="q-ml-lg q-my-sm">ผลงานทเคยเสนอขอประเม (าม)</span> <span class="q-ml-lg q-my-sm">ผลงานทเคยเสนอขอประเม (าม)</span>
</div> </div>
<div class="col-12"><q-separator /></div> <div class="col-12"><q-separator /></div>
<div class="col-12 q-pa-sm">-</div> <div class="col-10">
<!-- <div class="col-10">
<TableData <TableData
:columns="columnAssessments" :columns="columnAssessments"
:row="formDetail.assessments" :row="formDetail.assessments"
/> />
</div> --> </div>
</q-card> </q-card>
</div> </div>
</q-card> </q-card>

View file

@ -38,10 +38,16 @@ interface FormSpec {
interface FormCommand { interface FormCommand {
commanderFullname: string; commanderFullname: string;
commanderPosition: string; commanderPosition: string;
commanderPositionOld: string;
commanderOrgOld: string;
commanderOrg: string;
commanderAboveFullname: string; commanderAboveFullname: string;
commanderAbovePosition: string; commanderAbovePosition: string;
commanderAbovePositionOld: string;
commanderAboveOrgOld: string;
commanderAboveOrg: string;
author: string; author: string;
subject: string; subject: string[];
assignedPosition: string; assignedPosition: string;
} }
@ -134,5 +140,5 @@ export type {
ListMenu, ListMenu,
FormRef, FormRef,
FormData, FormData,
FormCommandSe FormCommandSe,
}; };

View file

@ -360,94 +360,40 @@ export const useEvaluateDetailStore = defineStore("evaluateDetailStore", () => {
//ผลงานที่เคยเสนอขอประเมิน (ถ้ามี) //ผลงานที่เคยเสนอขอประเมิน (ถ้ามี)
const columnAssessments = ref<QTableProps["columns"]>([ const columnAssessments = ref<QTableProps["columns"]>([
{ {
name: "date", name: "year",
align: "left", align: "left",
label: "วันที่ได้รับ", label: "ปี พ.ศ.",
sortable: true, sortable: true,
field: "date", field: "year",
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
format: (v) => date2Thai(v),
}, },
{ {
name: "point1Total", name: "type",
align: "left", align: "left",
label: "ส่วนที่1 (น้ำหนัก)", label: "ระดับตอนที่ยื่นขอ",
sortable: true, sortable: true,
field: "point1Total", field: "type",
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
}, },
{ {
name: "point1", name: "subject",
align: "left", align: "left",
label: "ผลประเมินส่วนที่1 (คะแนน)", label: "เรื่อง/ชื่อเรื่อง",
sortable: true, sortable: true,
field: "point1", field: "subject",
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
}, },
{ {
name: "point2Total", name: "evaluationResult",
align: "left", align: "left",
label: "ส่วนที่2 (น้ำหนัก)", label: "ผลการประเมิน (ผ่าน/ไม่ผ่าน)",
sortable: true, sortable: true,
field: "point2Total", field: "evaluationResult",
headerStyle: "font-size: 14px", headerStyle: "font-size: 14px",
style: "font-size: 14px", style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "point2",
align: "left",
label: "ผลประเมินส่วนที่2 (คะแนน)",
sortable: true,
field: "point2",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "pointSumTotal",
align: "left",
label: "ผลรวม (น้ำหนัก)",
sortable: true,
field: "pointSumTotal",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "pointSum",
align: "left",
label: "ผลประเมินรวม (คะแนน)",
sortable: true,
field: "pointSum",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
},
{
name: "name",
align: "left",
label: "ผลประเมิน",
sortable: true,
field: "name",
format(val, row) {
return `${textPoint(row.pointSum)} ${textRangePoint(row.pointSum)}`;
},
headerStyle: "font-size: 14px",
style: "font-size: 14px",
sort: (a: string, b: string) =>
a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
}, },
]); ]);