diff --git a/src/api/exam/api.candidate.ts b/src/api/exam/api.candidate.ts index c34aee5..4c06051 100644 --- a/src/api/exam/api.candidate.ts +++ b/src/api/exam/api.candidate.ts @@ -41,5 +41,7 @@ export default { candidateReview: (examId: string, positionId: string) => `${candidate}review/${examId}/${positionId}`, candidate, - candidateBill: (examId: string, positionId: string) => `${candidate}bill/${examId}/${positionId}` + candidateBill: (examId: string, positionId: string) => `${candidate}bill/${examId}/${positionId}`, + + candidateReport: (candidateId: string) => `${env.API_URI_V2}/report/candidate/pdf/${candidateId}` } diff --git a/src/api/index.ts b/src/api/index.ts index 2a454bc..b1d071a 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -2,31 +2,37 @@ import { ref } from 'vue' const env = ref(process.env.NODE_ENV || 'development') -export const apiUrlConfig = import.meta.env.VITE_API_URI_CONFIG +export const apiUrlConfig = `${import.meta.env.VITE_API_URI_CONFIG}/v1` +export const apiUrlConfigV2 = `${import.meta.env.VITE_API_URI_CONFIG}/v2` const config = ref({ development: { // API_URI: 'https://localhost:7007/api/v1', API_URI: apiUrlConfig, + API_URI_V2: apiUrlConfigV2, MEET_URI: 'meet.frappet.com' }, test: { API_URI: 'http://localhost:5010/api/v1', + API_URI_V2: 'http://localhost:5010/api/v2', MEET_URI: 'meet.frappet.com' }, production: { // API_URI: "https://localhost:5010", API_URI: apiUrlConfig, + API_URI_V2: apiUrlConfigV2, MEET_URI: 'meet.frappet.com' } }) const API_URI = ref(config.value[env.value].API_URI) +const API_URI_V2 = ref(config.value[env.value].API_URI_V2) const MEET_URI = ref(config.value[env.value].MEET_URI) export default { env: env.value, config: config.value, API_URI: API_URI.value, + API_URI_V2: API_URI_V2.value, MEET_URI: MEET_URI.value } diff --git a/src/modules/01_exam/components/ExamCard.vue b/src/modules/01_exam/components/ExamCard.vue index 4f8951d..588e419 100644 --- a/src/modules/01_exam/components/ExamCard.vue +++ b/src/modules/01_exam/components/ExamCard.vue @@ -195,6 +195,7 @@ const score_expired = ref(new Date()) const number = ref('') const reviewPoint = ref(0) const review = ref('-') +const candidateId = ref('') onMounted(async () => { await fetchStatus() @@ -232,6 +233,7 @@ const fetchStatus = async () => { positionLevel.value = data.positionLevel reviewPoint.value = data.reviewPoint review.value = data.review == null ? '-' : data.review + candidateId.value = data.id }) .catch((e) => { messageError($q, e) @@ -241,8 +243,33 @@ const fetchStatus = async () => { }) } -const download = () => { - window.print() +const download = async () => { + loaderPage(true) + await http + .get(config.API.candidateReport(candidateId.value), { + responseType: 'blob' + }) + .then((res) => { + const data = res.data + downloadFilePDF(data, `ใบสมัครสอบ.pdf`) + }) + .catch((e) => { + messageError($q, e) + }) + .finally(() => { + loaderPage(false) + }) +} +const downloadFilePDF = async (res: string, fileName: string) => { + const link = document.createElement('a') + link.href = window.URL.createObjectURL( + new Blob([res], { + type: 'application/vnd.ms-excel' + }) + ) + link.setAttribute('download', fileName) + document.body.appendChild(link) + link.click() } diff --git a/src/modules/01_exam/components/ExamForm.vue b/src/modules/01_exam/components/ExamForm.vue index f75b5f6..0e389ce 100644 --- a/src/modules/01_exam/components/ExamForm.vue +++ b/src/modules/01_exam/components/ExamForm.vue @@ -237,110 +237,176 @@ const clickSave = async () => { } const saveData = async () => { - if (defaultInformation.value.profileImg == null || '') { - notifyError($q, 'กรุณาอัพโหลดรูปถ่าย') - return - } - console.log(defaultInformation.value.tel) - await formInformation.value.validate().then(async (suc: boolean) => { - if (suc) { - await formAddress.value.validate().then(async (suc: boolean) => { - if (suc) { - await formEducation.value.validate().then(async (suc: boolean) => { - if (suc) { - await formOccupation.value.validate().then(async (suc: boolean) => { - if (suc) { - await formContact.value.validate().then(async (suc: boolean) => { - if (suc) { - loaderPage(true) - await http - .post(config.API.candidateId(examId.value, positionId.value), { - prefixId: defaultInformation.value.prefixId, - prefixName: defaultInformation.value.prefixId, - lastName: defaultInformation.value.lastname, - dateOfBirth: - defaultInformation.value.birthDate == null - ? null - : dateToISO(defaultInformation.value.birthDate), - citizenId: defaultInformation.value.cardid, - firstName: defaultInformation.value.firstname, - religionId: defaultInformation.value.religionId, - nationality: defaultInformation.value.nationality, - email: defaultInformation.value.email, - mobilePhone: defaultInformation.value.phone, - telephone: defaultInformation.value.tel, - knowledge: defaultInformation.value.knowledge, - occupationOrg: defaultOccupation.value.org, - occupationPile: defaultOccupation.value.pile, - occupationGroup: defaultOccupation.value.group, - occupationSalary: defaultOccupation.value.salary, - occupationPosition: defaultOccupation.value.position, - occupationPositionType: defaultOccupation.value.positionType, - occupationTelephone: defaultOccupation.value.tel, - registAddress: defaultAddress.value.address, - currentAddress: defaultAddress.value.addressC, - registProvinceId: defaultAddress.value.provinceId, - currentProvinceId: defaultAddress.value.provinceIdC, - registDistrictId: defaultAddress.value.districtId, - currentDistrictId: defaultAddress.value.districtIdC, - registSubDistrictId: defaultAddress.value.subdistrictId, - currentSubDistrictId: defaultAddress.value.subdistrictIdC, - registZipCode: defaultAddress.value.code, - currentZipCode: defaultAddress.value.codeC, - registSame: - defaultAddress.value.same == '1' - ? true - : defaultAddress.value.same == '0' - ? false - : null, - educationLevelExamId: defaultEducation.value.educationLevelExamId, - educationName: defaultEducation.value.educationName, - educationMajor: defaultEducation.value.educationMajor, - educationLocation: defaultEducation.value.educationLocation, - educationType: defaultEducation.value.educationType, - educationEndDate: - defaultEducation.value.educationEndDate == null - ? null - : dateToISO(defaultEducation.value.educationEndDate), - educationScores: defaultEducation.value.educationScores, - educationLevelHighId: defaultEducation.value.educationLevelHighId, - - contactprefixId: defaultContact.value.contactprefixId, - contactfirstname: defaultContact.value.contactfirstname, - contactlastname: defaultContact.value.contactlastname, - contactrelations: defaultContact.value.contactrelations, - contacttel: defaultContact.value.contacttel - }) - .then(async () => { - success($q, 'บันทึกข้อมูลส่วนตัวสำเร็จ') - if (saveAuto.value) await saveForm() - await props.fetchStep() - }) - .catch((e) => { - messageError($q, e) - loaderPage(false) - }) - .finally(async () => {}) - } else { - notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') - } - }) - } else { - notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') - } - }) - } else { - notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') - } - }) - } else { - notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') - } - }) - } else { - notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') + if (saveAuto.value == true) { + if (defaultInformation.value.profileImg == null || defaultInformation.value.profileImg == '') { + notifyError($q, 'กรุณาอัพโหลดรูปถ่าย') + return } - }) + await formInformation.value.validate().then(async (suc: boolean) => { + if (suc) { + await formAddress.value.validate().then(async (suc: boolean) => { + if (suc) { + await formEducation.value.validate().then(async (suc: boolean) => { + if (suc) { + await formOccupation.value.validate().then(async (suc: boolean) => { + if (suc) { + await formContact.value.validate().then(async (suc: boolean) => { + if (suc) { + loaderPage(true) + await http + .post(config.API.candidateId(examId.value, positionId.value), { + prefixId: defaultInformation.value.prefixId, + prefixName: defaultInformation.value.prefixId, + lastName: defaultInformation.value.lastname, + dateOfBirth: + defaultInformation.value.birthDate == null + ? null + : dateToISO(defaultInformation.value.birthDate), + citizenId: defaultInformation.value.cardid, + firstName: defaultInformation.value.firstname, + religionId: defaultInformation.value.religionId, + nationality: defaultInformation.value.nationality, + email: defaultInformation.value.email, + mobilePhone: defaultInformation.value.phone, + telephone: defaultInformation.value.tel, + knowledge: defaultInformation.value.knowledge, + occupationOrg: defaultOccupation.value.org, + occupationPile: defaultOccupation.value.pile, + occupationGroup: defaultOccupation.value.group, + occupationSalary: defaultOccupation.value.salary, + occupationPosition: defaultOccupation.value.position, + occupationPositionType: defaultOccupation.value.positionType, + occupationTelephone: defaultOccupation.value.tel, + registAddress: defaultAddress.value.address, + currentAddress: defaultAddress.value.addressC, + registProvinceId: defaultAddress.value.provinceId, + currentProvinceId: defaultAddress.value.provinceIdC, + registDistrictId: defaultAddress.value.districtId, + currentDistrictId: defaultAddress.value.districtIdC, + registSubDistrictId: defaultAddress.value.subdistrictId, + currentSubDistrictId: defaultAddress.value.subdistrictIdC, + registZipCode: defaultAddress.value.code, + currentZipCode: defaultAddress.value.codeC, + registSame: + defaultAddress.value.same == '1' + ? true + : defaultAddress.value.same == '0' + ? false + : null, + educationLevelExamId: defaultEducation.value.educationLevelExamId, + educationName: defaultEducation.value.educationName, + educationMajor: defaultEducation.value.educationMajor, + educationLocation: defaultEducation.value.educationLocation, + educationType: defaultEducation.value.educationType, + educationEndDate: + defaultEducation.value.educationEndDate == null + ? null + : dateToISO(defaultEducation.value.educationEndDate), + educationScores: defaultEducation.value.educationScores, + educationLevelHighId: defaultEducation.value.educationLevelHighId, + + contactprefixId: defaultContact.value.contactprefixId, + contactfirstname: defaultContact.value.contactfirstname, + contactlastname: defaultContact.value.contactlastname, + contactrelations: defaultContact.value.contactrelations, + contacttel: defaultContact.value.contacttel + }) + .then(async () => { + success($q, 'บันทึกข้อมูลส่วนตัวสำเร็จ') + await saveForm() + await props.fetchStep() + }) + .catch((e) => { + messageError($q, e) + loaderPage(false) + }) + .finally(async () => {}) + } else { + notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') + } + }) + } else { + notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') + } + }) + } else { + notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') + } + }) + } else { + notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') + } + }) + } else { + notifyError($q, 'กรุณากรอกข้อมูลให้ครบถ้วน') + } + }) + } else { + loaderPage(true) + await http + .post(config.API.candidateId(examId.value, positionId.value), { + prefixId: defaultInformation.value.prefixId, + prefixName: defaultInformation.value.prefixId, + lastName: defaultInformation.value.lastname, + dateOfBirth: + defaultInformation.value.birthDate == null + ? null + : dateToISO(defaultInformation.value.birthDate), + citizenId: defaultInformation.value.cardid, + firstName: defaultInformation.value.firstname, + religionId: defaultInformation.value.religionId, + nationality: defaultInformation.value.nationality, + email: defaultInformation.value.email, + mobilePhone: defaultInformation.value.phone, + telephone: defaultInformation.value.tel, + knowledge: defaultInformation.value.knowledge, + occupationOrg: defaultOccupation.value.org, + occupationPile: defaultOccupation.value.pile, + occupationGroup: defaultOccupation.value.group, + occupationSalary: defaultOccupation.value.salary, + occupationPosition: defaultOccupation.value.position, + occupationPositionType: defaultOccupation.value.positionType, + occupationTelephone: defaultOccupation.value.tel, + registAddress: defaultAddress.value.address, + currentAddress: defaultAddress.value.addressC, + registProvinceId: defaultAddress.value.provinceId, + currentProvinceId: defaultAddress.value.provinceIdC, + registDistrictId: defaultAddress.value.districtId, + currentDistrictId: defaultAddress.value.districtIdC, + registSubDistrictId: defaultAddress.value.subdistrictId, + currentSubDistrictId: defaultAddress.value.subdistrictIdC, + registZipCode: defaultAddress.value.code, + currentZipCode: defaultAddress.value.codeC, + registSame: + defaultAddress.value.same == '1' ? true : defaultAddress.value.same == '0' ? false : null, + educationLevelExamId: defaultEducation.value.educationLevelExamId, + educationName: defaultEducation.value.educationName, + educationMajor: defaultEducation.value.educationMajor, + educationLocation: defaultEducation.value.educationLocation, + educationType: defaultEducation.value.educationType, + educationEndDate: + defaultEducation.value.educationEndDate == null + ? null + : dateToISO(defaultEducation.value.educationEndDate), + educationScores: defaultEducation.value.educationScores, + educationLevelHighId: defaultEducation.value.educationLevelHighId, + + contactprefixId: defaultContact.value.contactprefixId, + contactfirstname: defaultContact.value.contactfirstname, + contactlastname: defaultContact.value.contactlastname, + contactrelations: defaultContact.value.contactrelations, + contacttel: defaultContact.value.contacttel + }) + .then(async () => { + success($q, 'บันทึกข้อมูลส่วนตัวสำเร็จ') + await props.fetchStep() + }) + .catch((e) => { + messageError($q, e) + loaderPage(false) + }) + .finally(async () => {}) + } } diff --git a/src/modules/01_exam/components/Form/Career.vue b/src/modules/01_exam/components/Form/Career.vue index f166299..e3ebd3d 100644 --- a/src/modules/01_exam/components/Form/Career.vue +++ b/src/modules/01_exam/components/Form/Career.vue @@ -47,9 +47,11 @@ @@ -127,45 +129,45 @@ -->
- - - - - + + + + +
@@ -286,7 +288,7 @@ const org = ref() const startDate = ref(new Date()) const endDate = ref(new Date()) const rangeDate = ref() -const total = ref('0') +const total = ref('-') const myForm = ref() //form data input const edit = ref(true) //เช็คการกดปุ่มแก้ไขใน dialog const modal = ref(false) //modal add detail @@ -308,7 +310,7 @@ const visibleColumns = ref([]) examData.career.columns.length == 0 ? (visibleColumns.value = [ 'position', - /* + /* 'pile', 'org', */ 'type', @@ -449,12 +451,53 @@ const calDate = async () => { }${dayDiff > 0 ? dayDiff + ' วัน ' : ''}` } +const calDateSplit = async (startDate: Date, endDate: Date) => { + let _startDate = new Date(startDate.toISOString().substr(0, 10)) + let _endDate = new Date(endDate.toISOString().substr(0, 10)) + _endDate.setDate(_endDate.getDate() + 1) + if (_startDate > _endDate) { + const swap = _startDate + _startDate = _endDate + _endDate = swap + } + const startYear = _startDate.getFullYear() + const february = (startYear % 4 === 0 && startYear % 100 !== 0) || startYear % 400 === 0 ? 29 : 28 + const daysInMonth = [31, february, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + + let yearDiff = _endDate.getFullYear() - startYear + let monthDiff = _endDate.getMonth() - _startDate.getMonth() + if (monthDiff < 0) { + yearDiff-- + monthDiff += 12 + } + let dayDiff = _endDate.getDate() - _startDate.getDate() + if (dayDiff < 0) { + if (monthDiff > 0) { + monthDiff-- + } else { + yearDiff-- + monthDiff = 11 + } + dayDiff += daysInMonth[_startDate.getMonth()] + } + var obj = { + yearDiff: yearDiff, + monthDiff: monthDiff, + dayDiff: dayDiff + } + return obj +} + const fetchData = async () => { loaderPage(true) await http .get(config.API.candidateCareer(examId.value, positionId.value)) .then((res) => { const data = res.data.result + var yearDiff = 0 + var monthDiff = 0 + var dayDiff = 0 + total.value = '-' rows.value = [] data.map((r: any) => { rows.value.push({ @@ -462,6 +505,22 @@ const fetchData = async () => { startDate: new Date(r.durationStart), endDate: new Date(r.durationEnd) }) + calDateSplit(new Date(r.durationStart), new Date(r.durationEnd)).then((d) => { + yearDiff = yearDiff + d.yearDiff + monthDiff = monthDiff + d.monthDiff + dayDiff = dayDiff + d.dayDiff + if (dayDiff > 30) { + dayDiff = dayDiff % 30 + monthDiff = monthDiff + parseInt((dayDiff / 30).toString()) + } + if (monthDiff > 12) { + monthDiff = monthDiff % 12 + yearDiff = yearDiff + parseInt((monthDiff / 12).toString()) + } + total.value = `${yearDiff > 0 ? yearDiff + ' ปี ' : ''}${ + monthDiff > 0 ? monthDiff + ' เดือน ' : '' + }${dayDiff > 0 ? dayDiff + ' วัน ' : ''}` + }) }) }) .catch((e) => { @@ -723,7 +782,7 @@ const getClass = (val: boolean) => { position: fixed !important; top: auto !important; transform: none !important; - left:auto !important; + left: auto !important; margin-top: 10px; }