人员库

This commit is contained in:
cwchen 2025-10-24 19:48:03 +08:00
parent b0e69564a7
commit c88e93a2a1
5 changed files with 452 additions and 59 deletions

View File

@ -47,6 +47,7 @@ import { encryptWithSM4,decryptWithSM4 } from '@/utils/sm'
import BasicInfoPersonnel from './child/BasicInfo.vue' import BasicInfoPersonnel from './child/BasicInfo.vue'
import QualificationInfoPersonnel from './child/QualificationInfo.vue' import QualificationInfoPersonnel from './child/QualificationInfo.vue'
import OtherInfoPersonnel from './child/OtherInfo.vue' import OtherInfoPersonnel from './child/OtherInfo.vue'
import { addDataAPI, editDataAPI, getDetailDataAPI } from '@/api/enterpriseLibrary/personnel/personnel'
export default { export default {
name: 'PersonnelForm', name: 'PersonnelForm',
components: { components: {
@ -87,34 +88,173 @@ export default {
handlePersonnelPosition(data) { handlePersonnelPosition(data) {
this.personnelPosition = data; this.personnelPosition = data;
}, },
//
getResourceFilePo(fileList) {
let resourceFiles = fileList.map(file => {
return file?.response?.fileRes ? {
...file.response.fileRes,
} : null;
}).filter(item => item !== null);
return resourceFiles && resourceFiles.length > 0 ? resourceFiles[0] : null;
},
//
getBuilderCertificateData(raw) {
return {
professionalType: raw.professionalType,
certificateCode: raw.certificateCode,
certificateLevel: raw.certificateLevel,
certificateValidityPeriod: raw.certificateValidityPeriod[0] + '-' + raw.certificateValidityPeriod[1],
useValidityPeriod: raw.useValidityPeriod[0] + '-' + raw.useValidityPeriod[1],
certificateType:'econstructor_certificate'
}
},
//
getCertificateType(fileList) {
let resourceFiles = fileList.map(file => {
return file?.response?.fileRes ? {
...file.response.fileRes,
} : { ...file };
});
return resourceFiles && resourceFiles.length > 0 ? (resourceFiles[0].businessType || resourceFiles[0].fileType) : '';
},
// BC
getOtherCertificateData(raw) {
return {
certificateCode: raw.certificateCode2,
certificateValidityPeriod: raw.certificateValidityPeriod2[0] + '-' + raw.certificateValidityPeriod2[1],
registerProfessional: raw.registerProfessional,
certificateType: this.getCertificateType(raw.fileList2)
}
},
//
getTitleData(raw) {
return {
titleName: raw.professionalType,
professionalName: raw.professionalType,
certificateCode: raw.certificateCode,
certificateType:'professional_title_certificate'
}
},
// //
async handleSave() { async handleSave() {
//
if (this.isSaving) {
return
}
this.isSaving = true
this.showSaveAnimation = true
try { try {
// //
const [basicInfoPersonnelData, qualificationInfoPersonnelData, otherInfoPersonnelData] = await Promise.all([ const [basicInfoData, qualificationData, otherData] = await Promise.all([
this.$refs.basicInfoPersonnel.validate(), this.$refs.basicInfoPersonnel.validate(),
this.$refs.qualificationInfoPersonnel.validate(), this.$refs.qualificationInfoPersonnel.validate(),
this.$refs.otherInfoPersonnel.validate() this.$refs.otherInfoPersonnel.validate()
]) ])
// //
const formData = { let formData = {
...basicInfoPersonnelData, ...basicInfoData,
...qualificationInfoPersonnelData, allFiles: [
...otherInfoPersonnelData ...basicInfoData.fileList.map(file => JSON.parse(JSON.stringify(file))),
...basicInfoData.fileList2.map(file => JSON.parse(JSON.stringify(file))),
...basicInfoData.fileList3.map(file => JSON.parse(JSON.stringify(file))),
...basicInfoData.fileList4.map(file => JSON.parse(JSON.stringify(file))),
],
delFiles: [
...basicInfoData.delFileList,
]
} }
console.log('所有表单校验通过,完整数据:', formData) console.log('所有表单校验通过,完整数据:', formData)
// //
// await this.saveEnterprise(formData) let allFiles = formData.allFiles.map(file => {
this.$message.success('保存成功') return file?.response?.fileRes ? {
...file.response.fileRes,
} : null;
}).filter(item => item !== null);
//
let personnelCertificateFiles = [];
if(qualificationData.fileList){
//
let obj = {
personnelCertificate: this.getBuilderCertificateData(qualificationData),
resourceFilePo: this.getResourceFilePo(qualificationData.fileList),
delFileList: null,
};
personnelCertificateFiles.push(obj);
}
if(qualificationData.fileList2){
// BC
let obj = {
personnelCertificate: this.getOtherCertificateData(qualificationData),
resourceFilePo: this.getResourceFilePo(qualificationData.fileList2),
delFileList: null,
};
personnelCertificateFiles.push(obj);
}
if(otherData.fileList){
//
let obj = {
personnelCertificate: this.getTitleData(otherData),
resourceFilePo: this.getResourceFilePo(otherData.fileList),
delFileList: otherData.delFileList,
};
personnelCertificateFiles.push(obj);
}
formData.files = allFiles;
formData.enterpriseId = this.enterpriseId;
formData.personnelCertificateFiles = personnelCertificateFiles;
formData.personnelIntroduction = otherData.personnelIntroduction;
//
delete formData.fileList;
delete formData.fileList2;
delete formData.fileList3;
delete formData.fileList4;
delete formData.delFileList;
delete formData.allFiles;
console.log('所有表单校验通过完整数据2222222:', formData)
//
/* const res = await this.savePersonnel(formData)
console.log('res:', res);
if (res.code === 200) {
this.$message.success('保存成功')
this.handleClose()
} */
} catch (error) { } catch (error) {
// console.error(':', error) console.error('保存失败:', error)
this.$message.error(error.message || '请完善表单信息') } finally {
//
this.isSaving = false
this.showSaveAnimation = false
} }
}, },
//
async savePersonnel(formData) {
return new Promise((resolve, reject) => {
if (this.type === 'add') { //
addDataAPI(formData).then(res => {
resolve(res)
}).catch(error => {
reject(error)
})
} else { //
formData.personnelId = this.personnelId;
editDataAPI(formData).then(res => {
resolve(res)
}).catch(error => {
reject(error)
})
}
})
},
// //
handleStartUpload(data) { handleStartUpload(data) {
this.animationText = data this.animationText = data

View File

@ -19,7 +19,8 @@
</el-form-item> </el-form-item>
<!-- 身份证国徽面 --> <!-- 身份证国徽面 -->
<el-form-item label="身份证国徽面" prop="fileList2"> <el-form-item label="身份证国徽面" prop="fileList2">
<UploadFile :fileList="form.fileList2" /> <UploadFile :fileList="form.fileList2" :fileUploadRule="fileUploadRule2" @del-file="handleDelFile"
@file-change="handleFileChange" type="national_emblem_id_card"/>
</el-form-item> </el-form-item>
<el-form-item label="人员姓名" prop="personnelName"> <el-form-item label="人员姓名" prop="personnelName">
<el-input v-model.trim="form.personnelName" placeholder="自动提取" clearable show-word-limit <el-input v-model.trim="form.personnelName" placeholder="自动提取" clearable show-word-limit
@ -39,7 +40,8 @@
</el-form-item> </el-form-item>
<!-- 学历证书 --> <!-- 学历证书 -->
<el-form-item label="学历证书" prop="fileList3"> <el-form-item label="学历证书" prop="fileList3">
<UploadFile :fileList="form.fileList3" uploadType="png、jpg、jpeg、pdf" /> <UploadFile :fileList="form.fileList3" uploadType="png、jpg、jpeg、pdf" :fileUploadRule="fileUploadRule3" @del-file="handleDelFile"
@file-change="handleFileChange" type="academic_certificate"/>
</el-form-item> </el-form-item>
<el-form-item label="毕业院校" prop="graduateSchool"> <el-form-item label="毕业院校" prop="graduateSchool">
<el-input v-model.trim="form.graduateSchool" placeholder="自动提取" clearable show-word-limit <el-input v-model.trim="form.graduateSchool" placeholder="自动提取" clearable show-word-limit
@ -62,7 +64,9 @@
maxlength="11"></el-input> maxlength="11"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="劳动合同" prop="fileList4"> <el-form-item label="劳动合同" prop="fileList4">
<UploadFile :fileList="form.fileList4" uploadType="pdf、doc、docx" maxFileTips="100MB" /> <UploadFile :fileList="form.fileList4" uploadType="pdf、doc、docx" maxFileTips="100MB"
:fileUploadRule="fileUploadRule4" @del-file="handleDelFile"
@file-change="handleFileChange" type="labor_contract"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -98,15 +102,20 @@ export default {
fileList: [], fileList: [],
fileList2: [], fileList2: [],
fileList3: [], fileList3: [],
fileList4: [] fileList4: [],
delFileList: [],
}, },
// OCR // OCR
ocrRuleList: ['face_id_card_portrait'], ocrRuleList: ['face_id_card_portrait','national_emblem_id_card','academic_certificate','labor_contract'],
fileUploadList: [], fileUploadList: [],
// chat_res // chat_res
ocrResultParams: { ocrResultParams: {
"姓名": "personnelName", "姓名": "personnelName",
"公民身份号码": "personnelIdCard", "公民身份号码": "personnelIdCard",
"毕业院校":"graduateSchool",
"毕业专业":"graduationMajor",
"学历":"qualification",
"毕业时间":"graduationDate",
}, },
rules: { rules: {
personnelPosition: [ personnelPosition: [
@ -140,16 +149,16 @@ export default {
{ required: true, message: '请输入联系方式', trigger: 'blur' } { required: true, message: '请输入联系方式', trigger: 'blur' }
], ],
fileList: [ fileList: [
{ required: true, message: '请上传身份证人面像', trigger: 'blur' } { required: true, message: '请上传身份证人面像', trigger: 'change' }
], ],
fileList2: [ fileList2: [
{ required: true, message: '请上传身份证国徽面', trigger: 'blur' } { required: true, message: '请上传身份证国徽面', trigger: 'change' }
], ],
fileList3: [ fileList3: [
{ required: true, message: '请上传学历证书', trigger: 'blur' } { required: true, message: '请上传学历证书', trigger: 'change' }
], ],
fileList4: [ fileList4: [
{ required: true, message: '请上传劳动合同', trigger: 'blur' } { required: true, message: '请上传劳动合同', trigger: 'change' }
], ],
} }
@ -183,7 +192,7 @@ export default {
const foundItem = this.dict.type.identification_tag.find(item => item.value === type); const foundItem = this.dict.type.identification_tag.find(item => item.value === type);
const item = foundItem ? { const item = foundItem ? {
fileUploadType: foundItem.value, fileUploadType: foundItem.value,
fields_json: foundItem.raw.remark, fields_json: type !== 'national_emblem_id_card' ? foundItem.raw.remark : '',
suffix: 'personnel_database' suffix: 'personnel_database'
} : null; } : null;
@ -213,11 +222,17 @@ export default {
}); });
} }
} }
if (type == 'face_id_card_portrait') { if (type == 'face_id_card_portrait') { //
this.form.fileList = file; this.form.fileList = file;
this.$refs.basicInfoForm.validateField(['personnelName', 'personnelIdCard']); this.$refs.basicInfoForm.validateField(['personnelName', 'personnelIdCard']);
}else if (type == 'national_emblem_id_card') { //
this.form.fileList2 = file;
}else if (type == 'academic_certificate') { //
this.form.fileList3 = file;
this.$refs.basicInfoForm.validateField(['graduateSchool', 'graduationMajor', 'qualification', 'graduationDate']);
}else if (type == 'labor_contract') { //
this.form.fileList4 = file;
} }
} }
}, },
// //
@ -226,6 +241,20 @@ export default {
this.form.delFileList.push(file.response.fileRes.uploadPath || file.filePath); this.form.delFileList.push(file.response.fileRes.uploadPath || file.filePath);
}, },
}, },
computed: {
fileUploadRule() {
return this.fileUploadList[0] || {};
},
fileUploadRule2() {
return this.fileUploadList[1] || {};
},
fileUploadRule3() {
return this.fileUploadList[2] || {};
},
fileUploadRule4() {
return this.fileUploadList[3] || {};
}
},
watch: { watch: {
// //
'dict.type.identification_tag': { 'dict.type.identification_tag': {

View File

@ -7,20 +7,25 @@
<el-form :model="form" :rules="rules" ref="accountOpeningCertificateForm" label-width="110px" <el-form :model="form" :rules="rules" ref="accountOpeningCertificateForm" label-width="110px"
label-position="top"> label-position="top">
<el-form-item label="职称证" prop="fileList"> <el-form-item label="职称证" prop="fileList">
<UploadFile :fileList="form.fileList" uploadType="png、jpg、jpeg、pdf"/> <UploadFile :fileList="form.fileList" uploadType="png、jpg、jpeg、pdf"
:fileUploadRule="fileUploadRule" @del-file="handleDelFile"
@file-change="handleFileChange" type="professional_title_certificate"/>
</el-form-item> </el-form-item>
<el-form-item label="职称名称" prop="titleName"> <el-form-item label="职称名称" prop="titleName">
<el-input v-model="form.titleName" placeholder="自动提取"></el-input> <el-input v-model.trim="form.titleName" placeholder="自动提取" clearable show-word-limit
maxlength="32"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="专业名称" prop="professionalName"> <el-form-item label="专业名称" prop="professionalName">
<el-input v-model="form.professionalName" placeholder="自动提取"></el-input> <el-input v-model.trim="form.professionalName" placeholder="自动提取" clearable show-word-limit
maxlength="32"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="证书编号" prop="certificateCode"> <el-form-item label="证书编号" prop="certificateCode">
<el-input v-model="form.certificateCode" placeholder="自动提取"></el-input> <el-input v-model.trim="form.certificateCode" placeholder="自动提取" clearable show-word-limit
maxlength="32"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="人员简介" prop="personnelIntroduction"> <el-form-item label="人员简介" prop="personnelIntroduction">
<el-input type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" class="form-item" <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" class="form-item"
v-model="form.personnelIntroduction" clearable show-word-limit placeholder="请输入人员简介" maxlength="255"></el-input> v-model.trim="form.personnelIntroduction" clearable show-word-limit placeholder="请输入人员简介" maxlength="300"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -31,6 +36,13 @@ import UploadFile from '@/views/common/UploadFile.vue'
export default { export default {
name: 'OtherInfoPersonnel', name: 'OtherInfoPersonnel',
components: { UploadFile }, components: { UploadFile },
dicts: ['identification_tag'],
props: {
detailData: {
type: Object,
default: () => { }
}
},
data() { data() {
return { return {
form: { form: {
@ -39,10 +51,20 @@ export default {
professionalName: '', professionalName: '',
certificateCode: '', certificateCode: '',
personnelIntroduction: '', personnelIntroduction: '',
delFileList: [],
},
// OCR
ocrRuleList: ['professional_title_certificate'],
fileUploadList: [],
// chat_res
ocrResultParams: {
"职称名称": "titleName",
"证书编号": "certificateCode",
"专业名称": "professionalName",
}, },
rules: { rules: {
fileList: [ fileList: [
{ required: true, message: '请上传职称证', trigger: 'blur' } { required: true, message: '请上传职称证', trigger: 'change' }
], ],
titleName: [ titleName: [
{ required: true, message: '请输入职称名称', trigger: 'blur' } { required: true, message: '请输入职称名称', trigger: 'blur' }
@ -53,9 +75,6 @@ export default {
certificateCode: [ certificateCode: [
{ required: true, message: '请输入证书编号', trigger: 'blur' } { required: true, message: '请输入证书编号', trigger: 'blur' }
], ],
personnelIntroduction: [
{ required: true, message: '请输入人员简介', trigger: 'blur' }
],
} }
} }
@ -73,6 +92,65 @@ export default {
}) })
}) })
}, },
// ocr
ocrRule(type) {
const foundItem = this.dict.type.identification_tag.find(item => item.value === type);
const item = foundItem ? {
fileUploadType: foundItem.value,
fields_json: foundItem.raw.remark,
suffix: 'personnel_database'
} : null;
this.fileUploadList.push(item)
},
// ocr
addOcrRule() {
this.ocrRuleList.forEach(item => {
this.ocrRule(item)
})
},
//
handleFileChange(file, type) {
if (file instanceof Array && file.length > 0 && file[0].response) {
const response = file[0].response;
if (response.ocrResult && response.ocrResult.status_code === 200) {
// ocr
const chat_res = response.ocrResult.data?.chat_res;
if (chat_res && typeof chat_res === 'object') {
// chat_res
Object.keys(chat_res).forEach(key => {
let formField = formField = this.ocrResultParams[key];
if (formField && chat_res[key]) {
this.form[formField] = chat_res[key];
}
});
}
}
this.form.fileList = file;
this.$refs.accountOpeningCertificateForm.validateField(['titleName', 'certificateCode', 'professionalName']);
}
},
//
handleDelFile(file) {
console.log(file);
this.form.delFileList.push(file.response.fileRes.uploadPath || file.filePath);
},
},
computed: {
fileUploadRule() {
return this.fileUploadList[0] || {};
},
},
watch: {
//
'dict.type.identification_tag': {
handler(newVal) {
if (newVal && newVal.length > 0) {
this.addOcrRule();
}
},
immediate: true //
},
}, },
} }
</script> </script>

View File

@ -4,28 +4,48 @@
<img src="@/assets/enterpriseLibrary/basic-info.png" alt="资质信息"> <img src="@/assets/enterpriseLibrary/basic-info.png" alt="资质信息">
<span>资质信息</span> <span>资质信息</span>
</div> </div>
<el-form :model="form" :rules="rules" ref="legalPersonForm" label-width="110px" label-position="top"> <el-form :model="form" :rules="rules" ref="qualificationInfoForm" label-width="110px" label-position="top">
<!-- 建造师证书 --> <!-- 建造师证书 -->
<template v-if="isProjectManager"> <template v-if="isProjectManager">
<el-form-item label="建造师证书" prop="fileList"> <el-form-item label="建造师证书" prop="fileList">
<UploadFile :fileList="form.fileList" uploadType="png、jpg、jpeg、pdf"/> <UploadFile :fileList="form.fileList" uploadType="png、jpg、jpeg、pdf" :fileUploadRule="fileUploadRule"
@del-file="handleDelFile" @file-change="handleFileChange" type="constructor_certificate" />
</el-form-item> </el-form-item>
<el-form-item label="专业类型" prop="professionalType"> <el-form-item label="专业类型" prop="professionalType">
<el-input v-model="form.professionalType" placeholder="自动提取"></el-input> <el-input v-model.trim="form.professionalType" placeholder="自动提取" clearable show-word-limit
maxlength="32"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="证书编号" prop="certificateCode"> <el-form-item label="证书编号" prop="certificateCode">
<el-input v-model="form.certificateCode" placeholder="自动提取"></el-input> <el-input v-model.trim="form.certificateCode" placeholder="自动提取" clearable show-word-limit
maxlength="32"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="级别" prop="certificateLevel"> <el-form-item label="级别" prop="certificateLevel">
<el-input v-model="form.certificateLevel" placeholder="自动提取"></el-input> <el-input v-model.trim="form.certificateLevel" placeholder="自动提取" clearable show-word-limit
maxlength="32"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="证书有效期" prop="certificateValidityPeriod"> <el-form-item label="证书有效期" prop="certificateValidityPeriod">
<el-input v-model="form.certificateValidityPeriod" placeholder="自动提取"></el-input> <el-date-picker
v-model="form.certificateValidityPeriod"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
class="form-item">
</el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="使用有效期" prop="useValidityPeriod"> <el-form-item label="使用有效期" prop="useValidityPeriod">
<el-input v-model="form.useValidityPeriod" placeholder="自动提取"></el-input> <el-date-picker
v-model="form.useValidityPeriod"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
class="form-item">
</el-date-picker>
</el-form-item> </el-form-item>
</template> </template>
@ -33,16 +53,26 @@
<!-- 安全考核B证安全考核C证其他人员证书 --> <!-- 安全考核B证安全考核C证其他人员证书 -->
<template> <template>
<el-form-item :label="certificateName" prop="fileList2"> <el-form-item :label="certificateName" prop="fileList2">
<UploadFile :fileList="form.fileList2" uploadType="png、jpg、jpeg、pdf"/> <UploadFile :fileList="form.fileList2" uploadType="png、jpg、jpeg、pdf"
:fileUploadRule="fileUploadRule2" @del-file="handleDelFile" @file-change="handleFileChange"
:type="otherType" />
</el-form-item> </el-form-item>
<el-form-item label="证书编号" prop="certificateCode2"> <el-form-item label="证书编号" prop="certificateCode2">
<el-input v-model="form.certificateCode2" placeholder="自动提取"></el-input> <el-input v-model.trim="form.certificateCode2" placeholder="自动提取"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="证书有效期" prop="certificateValidityPeriod2"> <el-form-item label="证书有效期" prop="certificateValidityPeriod2">
<el-input v-model="form.certificateValidityPeriod2" placeholder="自动提取"></el-input> <el-date-picker
v-model="form.certificateValidityPeriod2"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
class="form-item">
</el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="注册专业" prop="registerProfessional"> <el-form-item label="注册专业" prop="registerProfessional">
<el-input v-model="form.registerProfessional" placeholder="自动提取"></el-input> <el-input v-model.trim="form.registerProfessional" placeholder="自动提取"></el-input>
</el-form-item> </el-form-item>
</template> </template>
@ -57,6 +87,7 @@ import UploadFile from '@/views/common/UploadFile.vue'
export default { export default {
name: 'QualificationInfoPersonnel', name: 'QualificationInfoPersonnel',
components: { UploadFile }, components: { UploadFile },
dicts: ['personnel_position', 'identification_tag'],
props: { props: {
personnelPosition: { personnelPosition: {
type: Object, type: Object,
@ -66,7 +97,10 @@ export default {
qualification: '建造师证书、安全考核B证' qualification: '建造师证书、安全考核B证'
}) })
}, },
detailData: {
type: Object,
default: () => { }
}
}, },
data() { data() {
return { return {
@ -81,7 +115,23 @@ export default {
registerProfessional: '', registerProfessional: '',
fileList: [], fileList: [],
fileList2: [], fileList2: [],
delFileList: [],
}, },
// OCR
ocrRuleList: ['constructor_certificate', 'safety_assessment_certificate_b'],
fileUploadList: [],
// chat_res
ocrResultParams: {
"专业类型": "professionalType",
"证书编号": "certificateCode",
"级别": "certificateLevel",
},
ocrResultParams2: {
"证书编号": "certificateCode2",
"注册专业": "registerProfessional",
},
// B
otherType:'safety_assessment_certificate_b',
rules: { rules: {
professionalType: [ professionalType: [
{ required: true, message: '请输入专业类型', trigger: 'blur' } { required: true, message: '请输入专业类型', trigger: 'blur' }
@ -109,10 +159,10 @@ export default {
{ required: true, message: '请输入注册专业', trigger: 'blur' } { required: true, message: '请输入注册专业', trigger: 'blur' }
], ],
fileList: [ fileList: [
{ required: true, message: '请上传建造师证书', trigger: 'blur' } { required: true, message: '请上传建造师证书', trigger: 'change' }
], ],
fileList2: [ fileList2: [
{ required: true, message: '请上传安全考核B证', trigger: 'blur' } { required: true, message: '请上传安全考核B证', trigger: 'change' }
], ],
} }
} }
@ -155,7 +205,7 @@ export default {
{ required: true, message: '请上传安全考核B证', trigger: 'blur' } { required: true, message: '请上传安全考核B证', trigger: 'blur' }
], ],
} }
}else{ } else {
this.rules = { this.rules = {
certificateCode2: [ certificateCode2: [
{ required: true, message: '请输入证书编号', trigger: 'blur' } { required: true, message: '请输入证书编号', trigger: 'blur' }
@ -173,13 +223,13 @@ export default {
} }
// //
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.legalPersonForm.clearValidate(); this.$refs.qualificationInfoForm.clearValidate();
}) })
}, },
// //
validate() { validate() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.$refs.legalPersonForm.validate((valid) => { this.$refs.qualificationInfoForm.validate((valid) => {
if (valid) { if (valid) {
resolve(this.form) // resolve(this.form) //
} else { } else {
@ -188,21 +238,103 @@ export default {
}) })
}) })
}, },
getOtherType() {
const result = this.personnelPosition.qualification.split('、').filter(item => !item.includes('建造师证书'));
const firstMatch = this.dict.type.identification_tag.find(item =>
result.includes(item.label)
);
this.otherType = firstMatch ? firstMatch.value : '';
const item = this.getRuleItem(this.otherType);
this.fileUploadList.splice(1, 1, item);
},
// ocr
ocrRule(type) {
const item = this.getRuleItem(type);
this.fileUploadList.push(item)
},
// ocr
getRuleItem(type) {
const foundItem = this.dict.type.identification_tag.find(item => item.value === type);
const item = foundItem ? {
fileUploadType: foundItem.value,
fields_json: foundItem.raw.remark,
suffix: 'personnel_database'
} : null;
return item;
},
// ocr
addOcrRule() {
this.ocrRuleList.forEach(item => {
this.ocrRule(item)
})
},
//
handleFileChange(file, type) {
if (file instanceof Array && file.length > 0 && file[0].response) {
const response = file[0].response;
if (response.ocrResult && response.ocrResult.status_code === 200) {
// ocr
const chat_res = response.ocrResult.data?.chat_res;
if (chat_res && typeof chat_res === 'object') {
// chat_res
Object.keys(chat_res).forEach(key => {
let formField = null;
if(type === this.otherType){
formField = this.ocrResultParams2[key];
}else{
formField = this.ocrResultParams[key];
}
if (formField && chat_res[key]) {
this.form[formField] = chat_res[key];
}
});
}
}
if (type == 'constructor_certificate') { //
this.form.fileList = file;
this.$refs.qualificationInfoForm.validateField(['professionalType', 'certificateCode', 'certificateLevel']);
}else{ // b c
this.form.fileList2 = file;
this.$refs.qualificationInfoForm.validateField(['certificateCode2', 'registerProfessional']);
}
}
},
//
handleDelFile(file) {
console.log(file);
this.form.delFileList.push(file.response.fileRes.uploadPath || file.filePath);
},
}, },
watch: { watch: {
personnelPosition: { personnelPosition: {
handler(newVal) { handler(newVal) {
console.log(newVal); console.log(newVal);
this.switchValidate(newVal); this.switchValidate(newVal);
this.getOtherType();
this.form.fileList = [];
this.form.fileList2 = [];
}, },
immediate: true },
//
'dict.type.identification_tag': {
handler(newVal) {
if (newVal && newVal.length > 0) {
this.addOcrRule();
}
},
immediate: true //
}, },
}, },
computed: { computed: {
// //
isProjectManager() { isProjectManager() {
console.log(this.personnelPosition.value === 'project_manager'); console.log(this.personnelPosition.value === 'project_manager');
return this.personnelPosition.value === 'project_manager'; return this.personnelPosition.value === 'project_manager';
}, },
// //
@ -210,6 +342,14 @@ export default {
const result = this.personnelPosition.qualification.split('、').filter(item => !item.includes('建造师证书')); const result = this.personnelPosition.qualification.split('、').filter(item => !item.includes('建造师证书'));
return result[0]; return result[0];
}, },
fileUploadRule() {
return this.fileUploadList[0] || {};
},
fileUploadRule2() {
return this.fileUploadList[1] || {};
},
} }
} }
</script> </script>
@ -225,4 +365,7 @@ export default {
font-size: 20px; font-size: 20px;
} }
} }
.form-item {
width: 100%;
}
</style> </style>

View File

@ -40,23 +40,23 @@
</div> </div>
<!-- 人员信息卡片 --> <!-- 人员信息卡片 -->
<div class="personnel-card" v-for="(personnel, index) in personnelList" :key="index"> <div class="personnel-card" v-for="item in personnelList" :key="item.personnelId">
<div class="personnel-header"> <div class="personnel-header">
<h3 class="personnel-name">{{ personnel.name }}</h3> <h3 class="personnel-name">{{ item.personnelName }}</h3>
</div> </div>
<div class="personnel-info"> <div class="personnel-info">
<div class="info-item"> <div class="info-item">
<span class="label">职位</span> <span class="label">职位</span>
<span class="value">{{ personnel.position }}</span> <span class="value">{{ item.personnelPosition }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="label">从业年限</span> <span class="label">从业年限</span>
<span class="value">{{ personnel.experience }}</span> <span class="value">{{ item.employmentYears }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="label">入职时间</span> <span class="label">入职时间</span>
<span class="value">{{ personnel.entryDate }}</span> <span class="value">{{ item.employmentDate }}</span>
</div> </div>
</div> </div>
@ -107,7 +107,8 @@ export default {
personnelName: '', personnelName: '',
personnelPosition: '', personnelPosition: '',
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10,
enterpriseId: decryptWithSM4(this.$route.query.enterpriseId)
}, },
total: 100, total: 100,
personnelList: [], personnelList: [],
@ -120,6 +121,8 @@ export default {
methods: { methods: {
// //
getList() { getList() {
console.log(this.queryParams);
listAPI(this.queryParams).then(res => { listAPI(this.queryParams).then(res => {
if (res.code === 200) { if (res.code === 200) {
this.personnelList = res.rows; this.personnelList = res.rows;