<template> <app-container> <el-form v-loading="formLoading" ref="dataForm" :label-position="labelPosition" :rules="rules" :model="personForm" size="small" class="main-form" label-width="120px"> <el-collapse v-model="activeNames"> <el-collapse-item title="基本信息" name="1"> <el-row> <el-col :span="16"> <el-row :gutter="20"> <el-col :span="11"> <el-form-item label="员工编号" prop="personCode"> <el-input v-model.trim="personForm.personCode" :disabled="dialogStatus!='create'" type="text" placeholder="必填"/> </el-form-item> </el-col> <el-col :span="11" > <el-form-item label="身份证号" prop="idCardNo"> <el-input v-model.trim="personForm.idCardNo" :disabled="dialogStatus!='create'" type="text" placeholder="必填"/> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="11"> <el-form-item label="姓名" prop="name"> <el-input v-model.trim="personForm.name" :disabled="dialogStatus!='create'" type="text" placeholder="必填"/> </el-form-item> </el-col> <el-col :span="11" > <el-form-item :disabled="dialogStatus!='create'" label="出生日期" prop="birthday"> <el-date-picker v-model="personForm.birthday" :disabled="dialogStatus!='create'" type="date" style="width: 100%" value-format="yyyy-MM-dd" placeholder="选择日期"/> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="11"> <el-form-item label="性别" prop="sex"> <el-select v-model="personForm.sex" :disabled="dialogStatus=='info'" placeholder="性别" clearable> <el-option v-for="item in sexList" :key="item.value" :label="item.name" :value="item.value"/> </el-select> </el-form-item> </el-col> <el-col :span="11" > <el-form-item label="民族" prop="nation"> <el-select v-model="personForm.nation" :disabled="dialogStatus=='info'" placeholder="民族" clearable> <el-option v-for="item in nationList" :key="item.value" :label="item.name" :value="item.value"/> </el-select> </el-form-item> </el-col> </el-row> <el-row v-if="personType=='1'" :gutter="20"> <el-col :span="11"> <el-form-item label="组织机构" prop="deptid"> <dept-select v-model="personForm.deptid" :disabled="dialogStatus=='info'" :need-top="false" placeholder="单位/部门"/> </el-form-item> </el-col> <el-col :span="11" > <el-form-item label="岗位" prop="duty"> <el-select v-model="personForm.duty" :disabled="dialogStatus=='info'" placeholder="岗位" clearable> <el-option v-for="item in dutyList" :key="item.id" :label="item.name" :value="item.name"/> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="22"> <el-form-item label="住址" prop="address"> <el-input v-model.trim="personForm.ext.address" :disabled="dialogStatus=='info'" type="text" placeholder=""/> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="22"> <el-form-item label="备注" prop="remarks"> <el-input v-model.trim="personForm.remarks" :disabled="dialogStatus=='info'" type="text" placeholder=""/> </el-form-item> </el-col> </el-row> </el-col> <el-col :span="6" :offset="2"> <el-row> <div class="avatar"> <el-image :src="photo!==''?photo:defaultPhoto" fit="cover" style="width: 130px; height: 175px"/> </div> </el-row> <el-row v-if="dialogStatus!='info'"> <el-upload ref="upload" :before-upload="handleBeforeUpload" :on-success="handleSuccess" :http-request="uploadFile" :show-file-list="false" class="avatar-uploader" action="string" accept=".jpg,.jpeg,.png"> <el-button type="primary">点击上传照片</el-button> </el-upload> </el-row> </el-col> </el-row> </el-collapse-item> <el-collapse-item title="工作经历" name="2"> <el-row v-if="dialogStatus!='info'" style="margin-bottom: 10px"> <el-col :span="24"> <el-button size="mini" icon="el-icon-plus" type="primary" plain @click="addLine('experience')">新增一行</el-button> </el-col> </el-row> <el-table :data="workExperience" style="width: 100%" border> <el-table-column label="开始时间" width="200"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.startdate }}</span> <!--<span v-else><el-date-picker v-model="scope.row.startdate" value-format="yyyy-MM-dd" type="date" size="small" placeholder="选择开始日期"/></span>--> <span v-else><el-input v-model="scope.row.startdate" size="small" placeholder="时间格式: yyyy-MM-dd"/></span> </template> </el-table-column> <el-table-column label="结束时间" width="200"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.enddate }}</span> <!--<span v-else><el-date-picker v-model="scope.row.enddate" value-format="yyyy-MM-dd" type="date" placeholder="选择开始日期" size="small"/></span>--> <span v-else><el-input v-model="scope.row.enddate" size="small" placeholder="时间格式: yyyy-MM-dd"/></span> </template> </el-table-column> <el-table-column label="工作单位" width="280"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.enterprise }}</span> <span v-else><el-input v-model="scope.row.enterprise" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="职务" width="180"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.duty }}</span> <span v-else><el-input v-model="scope.row.duty" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="备注"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.notes }}</span> <span v-else><el-input v-model="scope.row.notes" size="small" placeholder="非必填"/></span> </template> </el-table-column> <el-table-column v-if="dialogStatus!='info'" label="操作" width="100"> <template slot-scope="scope"> <el-button icon="el-icon-delete" size="small" type="danger" plain @click="workExperience.splice(scope.$index,1)">删除</el-button> </template> </el-table-column> </el-table> </el-collapse-item> <el-collapse-item title="教育经历" name="3"> <el-row v-if="dialogStatus!='info'" style="margin-bottom: 10px"> <el-col :span="24"> <el-button size="mini" type="primary" icon="el-icon-plus" plain @click="addLine('study')">新增一行</el-button> </el-col> </el-row> <el-table :data="studyExperience" style="width: 100%" border> <el-table-column label="开始时间" width="200"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.startdate }}</span> <span v-else><el-date-picker v-model="scope.row.startdate" value-format="yyyy-MM-dd" type="date" size="small" placeholder="选择开始日期"/></span> </template> </el-table-column> <el-table-column label="结束时间" width="200"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.enddate }}</span> <span v-else><el-date-picker v-model="scope.row.enddate" value-format="yyyy-MM-dd" type="date" placeholder="选择结束日期" size="small"/></span> </template> </el-table-column> <el-table-column label="学校" width="280"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.school }}</span> <span v-else><el-input v-model="scope.row.school" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="类别" width="180"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.major }}</span> <span v-else><el-input v-model="scope.row.major" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="备注"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.notes }}</span> <span v-else><el-input v-model="scope.row.notes" size="small" placeholder="非必填"/></span> </template> </el-table-column> <el-table-column v-if="dialogStatus!='info'" label="操作" width="100"> <template slot-scope="scope"> <el-button icon="el-icon-delete" size="small" type="danger" plain @click="studyExperience.splice(scope.$index,1)">删除</el-button> </template> </el-table-column> </el-table> </el-collapse-item> <el-collapse-item title="社会关系" name="4"> <el-row v-if="dialogStatus!='info'" style="margin-bottom: 10px"> <el-col :span="24"> <el-button size="mini" icon="el-icon-plus" type="primary" plain @click="addLine('social')">新增一行</el-button> </el-col> </el-row> <el-table :data="socialRelation" style="width: 100%" border> <el-table-column label="关系" width="180"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.relation }}</span> <span v-else><el-input v-model="scope.row.relation" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="姓名" width="180"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.name }}</span> <span v-else><el-input v-model="scope.row.name" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="出生年月" width="190"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.birth }}</span> <span v-else><el-date-picker v-model="scope.row.birth" value-format="yyyy-MM" type="month" size="small" placeholder="选择出生年月"/></span> </template> </el-table-column> <el-table-column label="政治面貌"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.politicalStatus }}</span> <span v-else><el-input v-model="scope.row.politicalStatus" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="工作单位及职务"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.work }}</span> <span v-else><el-input v-model="scope.row.work" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column v-if="dialogStatus!='info'" label="操作" width="100"> <template slot-scope="scope"> <el-button icon="el-icon-delete" size="small" type="danger" plain @click="socialRelation.splice(scope.$index,1)">删除</el-button> </template> </el-table-column> </el-table> </el-collapse-item> <el-collapse-item title="证书信息" name="5"> <el-row v-if="dialogStatus!='info'" style="margin-bottom: 10px"> <el-col :span="24"> <el-button size="mini" icon="el-icon-plus" type="primary" plain @click="addLine('certificate')">新增一行</el-button> </el-col> </el-row> <el-table :data="certificateInfo" style="width: 100%" border> <el-table-column label="证书名称"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.name }}</span> <span v-else><el-input v-model="scope.row.name" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="颁证单位"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.unit }}</span> <span v-else><el-input v-model="scope.row.unit" size="small" placeholder="必填"/></span> </template> </el-table-column> <el-table-column label="颁证时间" width="190"> <template slot-scope="scope"> <span v-if="dialogStatus=='info'">{{ scope.row.date }}</span> <span v-else><el-date-picker v-model="scope.row.date" type="month" value-format="yyyy-MM" size="small" placeholder="选择颁证时间"/></span> </template> </el-table-column> <el-table-column v-if="dialogStatus!='info'" label="操作" width="100"> <template slot-scope="scope"> <el-button icon="el-icon-delete" size="small" type="danger" plain @click="certificateInfo.splice(scope.$index,1)">删除</el-button> </template> </el-table-column> </el-table> </el-collapse-item> </el-collapse> </el-form> <div v-if="dialogStatus!='info'" style="height: 120px;"> <el-row type="flex" justify="center"> <el-col :span="15" style="text-align:center"> <el-button v-show="!isEditMode" size="medium" @click="resetForm"> 重置 </el-button> <el-button :disabled="!canSave" type="primary" size="medium" style="margin-left: 20px;" @click="saveData"> 保存 </el-button> </el-col> </el-row> </div> </app-container> </template> <script> import DeptSelect from '@/components/DeptSelect' import { Uploadimg } from '@/api/common' import { addPerson, updatePerson, personInfo, getSexType, getNationType } from '@/api/system/person' import { getBirthdayByIdNO, getSexByIdNO } from '@/utils/dataAnalysis' import { getPostList } from '@/api/system/post' export default { name: 'AddPerson', components: { DeptSelect }, data() { const validateIDCard = (rule, value, callback) => { if (value !== '') { if ((/^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/).test(value) === false) { callback(new Error('请输入合法的身份证号')) } else { callback() } } else { callback(new Error('身份证号不能为空')) } } return { dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update,info isEditMode: false, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 personType: '1', // 人员角色,1为员工,0为访客 canSave: true, // 是否可以点击保存,当点击后该值置为false,直到后台返回结果再置为true isSave: false, // 当点击保存按钮后,并返回200结果,置为true,表示已经保存 personForm: { id: '', // 人员id idCardNo: '', // 身份证号 name: '', // 姓名 deptid: '', // 单位/部门 remarks: '', // 备注 duty: '', // 岗位 sex: '', // 性别 personType: '1', // 人员类型 birthday: '', // 出生日期 nation: '', // 民族 photo: '', ext: { address: ''// 住址 } }, // 表单 workExperience: [{ enterprise: '', duty: '', startdate: '', enddate: '', notes: '' }], // 工作经历 studyExperience: [{ school: '', major: '', startdate: '', enddate: '', notes: '' }], // 教育经历 socialRelation: [{ name: '', // 姓名 relation: '', // 关系 birth: '', // 生日 work: '', // 工作单位及职务 politicalStatus: '' // 政治面貌 }], // 社会关系 certificateInfo: [{ name: '', unit: '', date: '' }], // 证书信息 photo: '', // 图片路径 defaultPhoto: require('@/assets/global_images/photo.png'), // 默认图片路径 fileList: [], imageList: [], sexList: [], // 性别列表 dutyList: [], // 岗位列表 nationList: [], // 民族列表 rules: { personCode: [{ required: true, message: '员工编号必填', trigger: ['blur', 'change'] }], name: [{ required: true, message: '姓名必填', trigger: ['blur', 'change'] }], idCardNo: [{ required: true, validator: validateIDCard, trigger: ['blur', 'change'] }], deptid: [{ required: true, message: '单位/部门必选', trigger: 'change' }], duty: [{ required: true, message: '岗位必选', trigger: 'change' }], sex: [{ required: true, message: '性别必选', trigger: 'blur' }], birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }] }, dialogVisible: false, labelPosition: 'right', deptShowTop: false, // 权属单位下拉是否显示顶级 deptShow: true, formLoading: false, activeNames: ['1', '2', '3', '4', '5'] // 折叠面板展开index } }, watch: { 'personForm.idCardNo': function(val) { this.personForm.birthday = getBirthdayByIdNO(val) this.personForm.sex = getSexByIdNO(val) } }, mounted() { this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取岗位列表 this.fetchNationType() // 获取民族列表 if (this.$route.query && this.$route.query.type) { const type = this.$route.query.type this.dialogStatus = type this.isSave = false // isSave置为false,表示没有点击过保存按钮 if (type === 'create') { this.isEditMode = false // 不是编辑页面 } else if (type === 'update') { this.isEditMode = true // 是编辑页面 this.fetchData(this.$route.query.id) } else if (type === 'info') { this.isEditMode = false this.fetchData(this.$route.query.id) } } }, activated() { if (this.$route.query && this.$route.query.type) { this.isSave = false // isSave置为false,表示没有点击过保存按钮 const type = this.$route.query.type if (type === 'create') { this.isEditMode = false this.canSave = true } else if (type === 'update') { this.isEditMode = true this.canSave = true this.fetchData(this.$route.query.id) } } // if (this.$route.query.personType) { // this.personType = this.$route.query.personType // this.personForm.personType = this.$route.query.personType // } }, methods: { // 取消 cancel() { this.dialogFormVisible = false this.fileList = [] // 清除验证 this.$nextTick(() => { this.$refs['dataForm'].clearValidate() }) }, fetchData(id) { this.formLoading = true const base_url = this.baseConfig.baseUrl + 'static/' personInfo(id).then(response => { const personForm = response.data this.personForm = { id: personForm.id, // 人员id personCode: personForm.personCode, // 人员编号 idCardNo: personForm.idCardNo, // 身份证号 name: personForm.name, // 姓名 deptid: personForm.deptid, // 单位/部门 remarks: personForm.remarks, // 备注 duty: personForm.duty, // 岗位 sex: personForm.sex, // 性别 personType: personForm.personType, // 人员类型 birthday: personForm.birthday, // 出生日期 nation: personForm.nation, // 民族 photo: personForm.photo, ext: { address: personForm.ext.address// 住址 } } // 解析教育、工作经历,社会关系,证书信息 this.workExperience = JSON.parse(personForm.ext.workExperience) this.studyExperience = JSON.parse(personForm.ext.studyExperience) this.socialRelation = JSON.parse(personForm.ext.socialRelation) this.certificateInfo = JSON.parse(personForm.ext.certificateInfo) // 解析照片 if (personForm.photo !== '') { this.photo = base_url + personForm.photo } this.formLoading = false }) }, // 点击新增行 addLine(type) { if (type === 'experience') { this.workExperience.push({ enterprise: '', duty: '', startdate: '', enddate: '', notes: '' }) } else if (type === 'study') { this.studyExperience.push({ school: '', major: '', startdate: '', enddate: '', notes: '' }) // 教育经历 } else if (type === 'social') { this.socialRelation.push({ name: '', // 姓名 relation: '', // 关系 birth: '', // 生日 work: '', // 工作单位及职务 politicalStatus: '' // 政治面貌 }) // 社会关系 } else if (type === 'certificate') { this.certificateInfo.push({ name: '', unit: '', date: '' }) } }, // 重置表单 resetForm() { this.personForm = { idCardNo: '', // 身份证号 name: '', // 姓名 deptid: '', // 单位/部门 remarks: '', // 备注 duty: '', // 岗位 sex: '', // 性别 personType: '1', // 人员类型 birthday: '', // 出生日期 nation: '', // 民族 photo: '', ext: { address: '', // 住址 workExperience: '', studyExperience: '' } } this.workExperience = [{ enterprise: '', duty: '', startdate: '', enddate: '', notes: '' }] this.studyExperience = [{ school: '', major: '', startdate: '', enddate: '', notes: '' }] this.socialRelation = [{ name: '', relation: '', birth: '', work: '', politicalStatus: '' }] this.certificateInfo = [{ name: '', unit: '', date: '' }] // 证书信息 this.photo = '' // 清除验证 this.$nextTick(() => { this.$refs['dataForm'].clearValidate() }) }, // 保存数据 saveData: function() { // 照片不为空则对照片进行处理 if (this.photo !== '') { if (this.photo.startsWith('http')) { // 上传的普通图片 let index = this.photo.indexOf('/static/') if (index !== -1) { index += 8 } this.personForm.photo = this.photo.substring(index) } else if (this.photo.startsWith('data:image')) { // 读卡器读的base64图片 this.personForm.photo = this.photo } } // 遍历教育、工作经历,社会关系,证书信息 if (this.workExperience) { // 过滤空的 this.workExperience = this.workExperience.filter(item => item.startdate !== '' && item.enterprice !== '') this.personForm.ext.workExperience = JSON.stringify(this.workExperience) } if (this.studyExperience) { // 过滤空的 this.studyExperience = this.studyExperience.filter(item => item.startdate !== '' && item.school !== '') this.personForm.ext.studyExperience = JSON.stringify(this.studyExperience) } if (this.socialRelation) { // 过滤空的 this.socialRelation = this.socialRelation.filter(item => item.name !== '' && item.relation !== '') this.personForm.ext.socialRelation = JSON.stringify(this.socialRelation) } if (this.certificateInfo) { // 过滤空的 this.certificateInfo = this.certificateInfo.filter(item => item.name !== '' && item.unit !== '') this.personForm.ext.certificateInfo = JSON.stringify(this.certificateInfo) } this.$refs['dataForm'].validate((valid) => { if (valid) { // 如果新增页面未保存,则调用add // 如果是新增页面已经保存,则调用update // 其他情况均为修改页面 if (this.isSave === false && this.isEditMode === false) { addPerson(this.personForm).then(response => { if (response.code === 200) { // 保存用户id this.personForm.id = response.data.id this.personForm.personCode = response.data.code this.isSave = true this.$message.success('保存成功!') this.$store.state.tagsView.visitedViews.splice(this.$store.state.tagsView.visitedViews.findIndex(item => item.path === this.$route.path), 1) this.$router.go(-1) } this.canSave = true }).catch(() => { this.canSave = true }) } else { updatePerson(this.personForm).then(response => { if (response.code === 200) { this.$message.success('保存成功!') this.$store.state.tagsView.visitedViews.splice(this.$store.state.tagsView.visitedViews.findIndex(item => item.path === this.$route.path), 1) this.$router.go(-1) } }) } } }) }, // 图片上传 uploadFile(file) { console.log('uploadFile:' + file.file.name) const base_url = this.baseConfig.baseUrl + 'static/' Uploadimg(file).then(res => { if (res.code === 200) { this.photo = base_url + res.data } else { this.$message.warning(res.message) } }) }, // 上传前判断文件格式及大小 handleBeforeUpload(file) { const isJPG = (file.type === 'image/jpeg') || (file.type === 'image/png') let res = true const isLt2M = file.size / 1024 / 1024 < 5 if (!isJPG) { this.$message.error('上传图片只能是 JPG 或 PNG 格式!') res = false } if (!isLt2M) { this.$message.error('上传图片大小不能超过 5MB!') res = false } return res }, // 上传成功后回显 handleSuccess(response, file) { console.log('handleSuccess') const base_url = this.baseConfig.baseUrl + 'static/' if (response.code === 200) { this.photo = base_url + response.data } else { this.$message.warning(response.message) } }, // 获取性别 fetchSexType() { getSexType().then(response => { this.sexList = response.data }) }, // 获取岗位 fetchDutyType() { getPostList().then(response => { this.dutyList = response.data }) }, // 获取民族 fetchNationType() { getNationType().then(response => { this.nationList = response.data }) } } } </script> <style rel="stylesheet/scss" lang="scss" > .hide .el-upload--picture-card { display: none; } .main-form{ margin: 0px 0px; padding: 30px; overflow: auto; } .el-date-editor.el-input, .el-date-editor.el-input__inner{ width:100%; } .el-dialog{ width:700px } .el-select{ width: 100%; } .line{ width: 50px; margin-left: 5px; } .hide .el-upload-–picture-card{ display: none; } .imgBox{ width: 100%; text-align: center; } .avatar-uploader .el-upload { margin-left: 12px; margin-top: 10px; cursor: pointer; position: relative; overflow: hidden; } .avatar-uploader .el-upload:hover { border-color: #409EFF; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 178px; height: 238px; line-height: 238px; text-align: center; } .avatar { margin: 10px; display: block; } .id-card-btn{ width:126px; margin-left: 12px; margin-top: 20px; } </style>