| | |
| | | <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px"> |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="专业类别" prop="domain"> |
| | | <el-form-item label="专业类别" prop="profession"> |
| | | <!-- <el-cascader--> |
| | | <!-- :disabled="state.disable"--> |
| | | <!-- style="width: 100%"--> |
| | | <!-- v-model="state.form.domain"--> |
| | | <!-- :options="state.expertsType"--> |
| | | <!-- :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false}"--> |
| | | <!-- @change="professionChange"></el-cascader>--> |
| | | <el-cascader |
| | | :disabled="state.disable" |
| | | style="width: 100%" |
| | | v-model="state.form.domain" |
| | | clearable |
| | | :disabled="state.disable" |
| | | v-model="state.form.profession" |
| | | :options="state.expertsType" |
| | | :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }" |
| | | :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}" |
| | | @change="professionChange"></el-cascader> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <el-cascader |
| | | style="width: 100%" |
| | | clearable |
| | | :disabled="state.disable" |
| | | v-model="state.form.deptId" |
| | | :options="state.deptList" |
| | | :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',emitPath: false}"></el-cascader> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="职称或资质证明材料" prop="evidence"> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.evidenceList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证明')" :before-remove="beforeRemove"> |
| | | <el-icon><Plus /></el-icon> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" |
| | | :disabled="state.disable" |
| | | :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')" |
| | | :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' |
| | | v-model:file-list="state.evidenceList" list-type="picture-card" :before-upload="picSize" |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证明')" |
| | | :before-remove="beforeRemove"> |
| | | <el-icon> |
| | | <Plus/> |
| | | </el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div> |
| | | </template> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="2寸免冠证件照"> |
| | | <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" :disabled="state.disable" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'证件照')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证件照')" :before-remove="beforeRemove"> |
| | | <el-icon><Plus /></el-icon> |
| | | <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" :disabled="state.disable" |
| | | method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'证件照')" |
| | | :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' |
| | | v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证件照')" |
| | | :before-remove="beforeRemove"> |
| | | <el-icon> |
| | | <Plus/> |
| | | </el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div> |
| | | </template> |
| | |
| | | <!-- <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>--> |
| | | <!-- </el-radio-group>--> |
| | | <el-checkbox-group v-model="state.form.supportDirectionSafety" :disabled="state.disable"> |
| | | <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox> |
| | | <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ |
| | | item.label |
| | | }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <!-- <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>--> |
| | | <!-- </el-radio-group>--> |
| | | <el-checkbox-group v-model="state.form.supportDirectionPrevention" :disabled="state.disable"> |
| | | <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox> |
| | | <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ |
| | | item.label |
| | | }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <!-- <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>--> |
| | | <!-- </el-radio-group>--> |
| | | <el-checkbox-group v-model="state.form.supportDirectionEmergency" :disabled="state.disable"> |
| | | <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox> |
| | | <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ |
| | | item.label |
| | | }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="工作简历" prop="resumeKey"> |
| | | <el-upload accept=".pdf" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'简历')" :on-exceed="showTip" :limit='8' v-model:file-list="state.resumeList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'简历')" :before-remove="beforeRemove"> |
| | | <el-upload accept=".pdf" multiple :action="state.uploadUrl" :headers="state.header" method="post" |
| | | :disabled="state.disable" |
| | | :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'简历')" |
| | | :on-exceed="showTip" :limit='8' v-model:file-list="state.resumeList" :before-upload="picSize" |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'简历')" |
| | | :before-remove="beforeRemove"> |
| | | <el-button type="primary">点击上传</el-button> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传pdf格式文件尺寸小于5M,最多可上传5份</div> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="发明、著作、学术论文情况(何时、何地出版或发表)"> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.inventionList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'著作')" :before-remove="beforeRemove"> |
| | | <el-icon><Plus /></el-icon> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" |
| | | :disabled="state.disable" |
| | | :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')" |
| | | :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' |
| | | v-model:file-list="state.inventionList" list-type="picture-card" :before-upload="picSize" |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'著作')" |
| | | :before-remove="beforeRemove"> |
| | | <el-icon> |
| | | <Plus/> |
| | | </el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div> |
| | | </template> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="受过何种奖励"> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'奖励')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.rewardList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'奖励')" :before-remove="beforeRemove"> |
| | | <el-icon><Plus /></el-icon> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" |
| | | :disabled="state.disable" |
| | | :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'奖励')" |
| | | :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' |
| | | v-model:file-list="state.rewardList" list-type="picture-card" :before-upload="picSize" |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'奖励')" |
| | | :before-remove="beforeRemove"> |
| | | <el-icon> |
| | | <Plus/> |
| | | </el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div> |
| | | </template> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="应急管理相关工作主要业绩及研究成果"> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'研究')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.achievementList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'研究')" :before-remove="beforeRemove"> |
| | | <el-icon><Plus /></el-icon> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" |
| | | :disabled="state.disable" |
| | | :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'研究')" |
| | | :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' |
| | | v-model:file-list="state.achievementList" list-type="picture-card" :before-upload="picSize" |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'研究')" |
| | | :before-remove="beforeRemove"> |
| | | <el-icon> |
| | | <Plus/> |
| | | </el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div> |
| | | </template> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="专家本人意见" prop="recommendUnitOpinionKey"> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'本人')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.proAdviceList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'本人')" :before-remove="beforeRemove"> |
| | | <el-icon><Plus /></el-icon> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" |
| | | :disabled="state.disable" |
| | | :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'本人')" |
| | | :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' |
| | | v-model:file-list="state.proAdviceList" list-type="picture-card" :before-upload="picSize" |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'本人')" |
| | | :before-remove="beforeRemove"> |
| | | <el-icon> |
| | | <Plus/> |
| | | </el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div> |
| | | </template> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="推荐单位意见" prop="recommendUnitOpinionKey"> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'单位')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.adviceList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'单位')" :before-remove="beforeRemove"> |
| | | <el-icon><Plus /></el-icon> |
| | | <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" |
| | | :disabled="state.disable" |
| | | :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'单位')" |
| | | :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' |
| | | v-model:file-list="state.adviceList" list-type="picture-card" :before-upload="picSize" |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'单位')" |
| | | :before-remove="beforeRemove"> |
| | | <el-icon> |
| | | <Plus/> |
| | | </el-icon> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div> |
| | | </template> |
| | |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="补充说明"> |
| | | <el-input v-model="state.form.remark" type="textarea" :autosize="{ minRows: 2}" :readonly="state.disable"></el-input> |
| | | <el-input v-model="state.form.remark" type="textarea" :autosize="{ minRows: 2}" |
| | | :readonly="state.disable"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="closeAssess" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="assessSubmit(assessFormRef)" size="default" v-preReClick>确认</el-button> |
| | | <el-button type="primary" @click="assessSubmit(assessFormRef)" size="default" |
| | | v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | import { getToken } from "@/utils/auth" |
| | | import {Base64} from "js-base64" |
| | | import {listOutDept} from "@/api/system/dept"; |
| | | |
| | | const emit = defineEmits(["getList"]) |
| | | const dialogVisible = ref(false) |
| | | const imgDialog = ref(false) |
| | |
| | | id: null, |
| | | name:'', |
| | | sex:'', |
| | | profession: [], |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | deptId: null, |
| | | birthday: '', |
| | |
| | | rules:{ |
| | | name:[{ required: true, message: '请填写姓名', trigger: 'blur' }], |
| | | sex:[{ required: true, message: '请选择性别', trigger: 'blur' }], |
| | | domain: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], |
| | | profession: [{required: true, message: '请选择专业类别', trigger: 'blur'}], |
| | | deptId: [{ required: true, message: '请选择业务处室', trigger: 'blur' }], |
| | | birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }], |
| | | phone:[{ required: true, validator: validatePhone, trigger: 'blur' }], |
| | |
| | | onMounted(()=>{ |
| | | }) |
| | | |
| | | const professionChange = (value) => { |
| | | if (!value) { |
| | | state.form.profession = [] |
| | | state.form.bigClassify = null |
| | | state.form.smallClassify = null |
| | | } |
| | | } |
| | | |
| | | const findNodeById = (data,value)=> { |
| | | for (const node of data) { |
| | | if (node.id === value) { |
| | | return node.classifyName; |
| | | } |
| | | if (node.children) { |
| | | const foundNode = findNodeById(node.children, value); |
| | | if (foundNode) { |
| | | return foundNode; |
| | | } |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | const openDialog = (type, value) => { |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='view' ?'查看':'评定' |
| | | getExpertsType() |
| | |
| | | state.form[i] = val[i] |
| | | } |
| | | } |
| | | state.form.profession = [val.bigClassify,val.smallClassify] |
| | | if(val.supportDirectionSafety && val.supportDirectionSafety!==''){ |
| | | state.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i)) |
| | | }else{ |
| | |
| | | }); |
| | | } |
| | | |
| | | const professionChange=(value)=> { |
| | | console.log(value,'val') |
| | | } |
| | | |
| | | |
| | | |
| | | // 图片上传 |
| | | const showTip =()=>{ |
| | |
| | | await formEl.validate(async (valid, fields) => { |
| | | if (valid) { |
| | | let data = JSON.parse(JSON.stringify(state.form)) |
| | | data.bigClassify = data.profession[0] |
| | | data.smallClassify = data.profession[1] |
| | | data.domain = findNodeById(state.expertsType,data.smallClassify) |
| | | data.supportDirectionSafety = Array.isArray(data.supportDirectionSafety)?data.supportDirectionSafety.join(','):'' |
| | | data.supportDirectionPrevention = Array.isArray(data.supportDirectionPrevention)?data.supportDirectionPrevention.join(','):'' |
| | | data.supportDirectionEmergency = Array.isArray(data.supportDirectionEmergency)?data.supportDirectionEmergency.join(','):'' |
| | |
| | | data.achievementKey = state.achievementList.map(i=>i.name).join(',') |
| | | data.personalOpinionKey = state.proAdviceList.map(i=>i.name).join(',') |
| | | data.recommendUnitOpinionKey = state.adviceList.map(i=>i.name).join(',') |
| | | delete data.profession |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res= await addExpertInfo(data) |
| | |
| | | id: null, |
| | | name:'', |
| | | sex:'', |
| | | profession: [], |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | deptId: null, |
| | | birthday: '', |
| | |
| | | :deep(.el-form .el-form-item__label) { |
| | | font-size: 15px; |
| | | } |
| | | |
| | | .file { |
| | | display: flex; |
| | | flex-direction: column; |
| | |
| | | <el-form-item label="手机号:"> |
| | | <el-input v-model.trim="queryParams.phone" placeholder="请输入申报时预留的手机号"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="业务处室:"> |
| | | <el-form-item label="专业领域:"> |
| | | <!-- <el-cascader--> |
| | | <!-- clearable--> |
| | | <!-- placeholder="请选择申请的业务处室"--> |
| | | <!-- v-model="queryParams.deptId"--> |
| | | <!-- :options="deptList"--> |
| | | <!-- :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',checkStrictly: true,emitPath: false}"></el-cascader>--> |
| | | <el-cascader |
| | | clearable |
| | | placeholder="请选择申请的业务处室" |
| | | v-model="queryParams.deptId" |
| | | :options="deptList" |
| | | :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',checkStrictly: true,emitPath: false}"></el-cascader> |
| | | v-model="queryParams.domain" |
| | | :options="expertsType" |
| | | :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }" |
| | | @change="professionChange"></el-cascader> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="onSubmit(formRef)" v-preReClick>进度查询</el-button> |
| | |
| | | import {ElMessage, ElMessageBox} from "element-plus" |
| | | import {verifyPhone, verifyIdCard} from "../../../../utils/validate" |
| | | import { getToken } from "@/utils/auth" |
| | | import {getExpertsList, queryApprove} from "@/api/form"; |
| | | import {getExpertsList, getExpertTypes, queryApprove} from "@/api/form"; |
| | | import {listOutDept} from "@/api/system/dept"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const router = useRouter() |
| | |
| | | queryParams: { |
| | | idCard: '', |
| | | phone: '', |
| | | deptId: null |
| | | domain: '' |
| | | }, |
| | | expertsType: [], |
| | | formRules:{ |
| | | |
| | | }, |
| | | result: {} |
| | | }) |
| | | |
| | | const {queryParams,formRules,result} = toRefs(data) |
| | | const {queryParams,expertsType,formRules,result} = toRefs(data) |
| | | const deptList = ref([]); |
| | | onMounted(()=>{ |
| | | getDepList() |
| | | }) |
| | | |
| | | |
| | | const showProgress = ref(false) |
| | | const formRef = ref() |
| | |
| | | } |
| | | |
| | | onMounted(()=>{ |
| | | |
| | | getExpertsType() |
| | | }) |
| | | |
| | | const getExpertsType = async ()=>{ |
| | | const res = await getExpertTypes() |
| | | if(res.code == 200){ |
| | | data.expertsType = res.data |
| | | }else{ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.msg |
| | | }) |
| | | } |
| | | } |
| | | const professionChange=(value)=> { |
| | | console.log(value,'val') |
| | | } |
| | | const onSubmit = async (formEl)=> { |
| | | if (!formEl) return |
| | | await formEl.validate(async (valid, fields) => { |
| | |
| | | data.queryParams = { |
| | | idCard: '', |
| | | phone: '', |
| | | deptId: null |
| | | domain: '' |
| | | } |
| | | showProgress.value = false |
| | | } |
| | |
| | | <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px"> |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="专业类别" prop="domain"> |
| | | <el-form-item label="专业类别" prop="profession"> |
| | | <el-cascader |
| | | style="width: 100%" |
| | | clearable |
| | | v-model="state.form.domain" |
| | | :disabled="state.disable" |
| | | v-model="state.form.profession" |
| | | :options="state.expertsType" |
| | | :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }" |
| | | :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}" |
| | | @change="professionChange"></el-cascader> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | form:{ |
| | | name:'', |
| | | sex:'', |
| | | profession: [], |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | deptId: null, |
| | | birthday: '', |
| | |
| | | rules:{ |
| | | name:[{ required: true, message: '请填写姓名', trigger: 'blur' }], |
| | | sex:[{ required: true, message: '请选择性别', trigger: 'blur' }], |
| | | domain: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], |
| | | profession: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], |
| | | deptId: [{ required: true, message: '请选择业务处室', trigger: 'blur' }], |
| | | birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }], |
| | | phone:[{ required: true, validator: validatePhone, trigger: 'blur' }], |
| | |
| | | } |
| | | } |
| | | |
| | | const professionChange = (value) => { |
| | | if (!value) { |
| | | state.form.profession = [] |
| | | state.form.bigClassify = null |
| | | state.form.smallClassify = null |
| | | } |
| | | } |
| | | |
| | | const findNodeById = (data,value)=> { |
| | | for (const node of data) { |
| | | if (node.id === value) { |
| | | return node.classifyName; |
| | | } |
| | | if (node.children) { |
| | | const foundNode = findNodeById(node.children, value); |
| | | if (foundNode) { |
| | | return foundNode; |
| | | } |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | function getDepList() { |
| | | listOutDept({}).then(response => { |
| | | state.deptList = proxy.handleTree(response.data, "deptId",'parentId','children'); |
| | | }); |
| | | } |
| | | |
| | | const professionChange=(value)=> { |
| | | console.log(value,'val') |
| | | } |
| | | |
| | | |
| | | |
| | | // 图片上传 |
| | | const showTip =()=>{ |
| | |
| | | await formEl.validate(async (valid, fields) => { |
| | | if (valid) { |
| | | let data = JSON.parse(JSON.stringify(state.form)) |
| | | data.bigClassify = data.profession[0] |
| | | data.smallClassify = data.profession[1] |
| | | data.domain = findNodeById(state.expertsType,data.smallClassify) |
| | | data.supportDirectionSafety = Array.isArray(data.supportDirectionSafety)?data.supportDirectionSafety.join(','):'' |
| | | data.supportDirectionPrevention = Array.isArray(data.supportDirectionPrevention)?data.supportDirectionPrevention.join(','):'' |
| | | data.supportDirectionEmergency = Array.isArray(data.supportDirectionEmergency)?data.supportDirectionEmergency.join(','):'' |
| | |
| | | data.achievementKey = state.achievementList.map(i=>i.name).join(',') |
| | | data.personalOpinionKey = state.proAdviceList.map(i=>i.name).join(',') |
| | | data.recommendUnitOpinionKey = state.adviceList.map(i=>i.name).join(',') |
| | | delete data.profession |
| | | delete data.id |
| | | const res= await addExpertInfo(data) |
| | | if(res.code == 200){ |
| | |
| | | state.form = { |
| | | name:'', |
| | | sex:'', |
| | | profession: [], |
| | | bigClassify: null, |
| | | smallClassify: null, |
| | | domain: '', |
| | | birthday: '', |
| | | phone:'', |
| | |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="计费标准" prop="freightBasis"> |
| | | <el-input v-model.trim="state.form.freightBasis" :readonly="state.disable"><template #append>天/课时</template></el-input> |
| | | <!-- <el-select v-model="state.form.freightBasis" placeholder="计费标准" clearable>--> |
| | | <!-- <el-option :key="0" label="前三天600/天" :value="600"/>--> |
| | | <!-- <el-option :key="1" label="前三天800/天" :value="800"/>--> |
| | | <!-- <el-option :key="1" label="前三天1000/天" :value="1000"/>--> |
| | | <!-- <el-option :key="2" label="前三天1200/天" :value="1200"/>--> |
| | | <!-- <el-option :key="2" label="前三天1500/天" :value="1500"/>--> |
| | | <!-- </el-select>--> |
| | | <el-input v-model.number.trim="state.form.freightBasis" :readonly="state.disable" @input="getExpertFee"><template #append>天/课时</template></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="计费时长" prop="billingDuration"> |
| | | <el-input v-model.number.trim="state.form.billingDuration" type="number" :readonly="state.disable"><template #append>天/课时</template></el-input> |
| | | <el-input v-model.number.trim="state.form.billingDuration" type="number" :readonly="state.disable" @input="getExpertFee"><template #append>天/课时</template></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="应纳税所得额"> |
| | | <el-input v-model.trim="taxIncome" type="number" readonly><template #append>元</template></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="应缴个税"> |
| | | <!-- <el-col :span="8">--> |
| | | <!-- <el-form-item label="应纳税所得额">--> |
| | | <!-- <el-input v-model.trim="taxIncome" type="number" readonly><template #append>元</template></el-input>--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | <el-col :span="12"> |
| | | <el-form-item label="应缴税费"> |
| | | <el-input v-model.trim="taxPay" type="number" readonly><template #append>元</template></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="税后金额"> |
| | | <el-input v-model="afterTaxIncome" type="number" readonly><template #append>元</template></el-input> |
| | | </el-form-item> |
| | |
| | | } |
| | | }) |
| | | |
| | | const getExpertFee = ()=>{ |
| | | if((state.form.freightBasis && state.form.freightBasis > 0) && (state.form.billingDuration && state.form.billingDuration > 0)){ |
| | | state.form.taxExpertFee = state.form.freightBasis * state.form.billingDuration |
| | | } |
| | | } |
| | | |
| | | const taxIncome = computed(()=>{ |
| | | const expertIncomeValue = state.form.taxExpertFee |
| | | if (expertIncomeValue == null || expertIncomeValue === 0 || expertIncomeValue <= 800) { |
| | |
| | | }) |
| | | |
| | | const taxPay = computed(()=>{ |
| | | const taxIncomeValue = taxIncome.value |
| | | if (taxIncomeValue == null || taxIncomeValue === 0) { |
| | | // const taxIncomeValue = taxIncome.value |
| | | // if (taxIncomeValue == null || taxIncomeValue === 0) { |
| | | // return 0 |
| | | // } |
| | | // if (taxIncomeValue <= 20000) { |
| | | // return taxIncomeValue * 0.2 |
| | | // } else if (taxIncomeValue <= 50000) { |
| | | // return taxIncomeValue * 0.3 - 2000 |
| | | // } else { |
| | | // return taxIncomeValue * 0.4 - 7000 |
| | | // } |
| | | |
| | | const expertIncomeValue = state.form.taxExpertFee |
| | | if(expertIncomeValue == null || expertIncomeValue === 0 || expertIncomeValue <= 800){ |
| | | return 0 |
| | | } |
| | | if (taxIncomeValue <= 20000) { |
| | | return taxIncomeValue * 0.2; |
| | | } else if (taxIncomeValue <= 50000) { |
| | | return taxIncomeValue * 0.3 - 2000; |
| | | if(expertIncomeValue / 1.01 - 800>0){ |
| | | return ((expertIncomeValue / 1.01 - 800) * 0.2).toFixed(2) |
| | | } else { |
| | | return taxIncomeValue * 0.4 - 7000; |
| | | return 0 |
| | | } |
| | | }) |
| | | |
| | | const afterTaxIncome = computed(()=>{ |
| | | const expertIncomeValue = state.form.taxExpertFee |
| | | const taxPayValue = taxPay.value |
| | | if ((expertIncomeValue == null || expertIncomeValue == 0)|| (taxPayValue == null || taxPayValue == 0)) { |
| | | if (expertIncomeValue == null || expertIncomeValue == 0) { |
| | | return 0 |
| | | } |
| | | return expertIncomeValue - taxPayValue; |
| | | return (expertIncomeValue - taxPayValue).toFixed(2) |
| | | }) |
| | | |
| | | const openDialog = async (type, value, projectName, projectCheckTime) => { |
| | |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template #default="scope"> |
| | | <el-button type="primary" v-if="scope.row.evaluationState == 0" link @click="openDialog('edit',scope.row)">开始评估</el-button> |
| | | <el-button type="primary" v-if="scope.row.evaluationState == 1" link @click="openDialog('edit',scope.row)">修改评估</el-button> |
| | | <el-button type="primary" v-if="scope.row.evaluationState == 1" link @click="openDialog('edit',scope.row)">查看</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | <el-upload :disabled="projectType==='view' || isView" accept=".pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)"> |
| | | <el-button type="primary">上传附件PDF</el-button> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传文件尺寸小于5M,最多可上传1份</div> |
| | | <div class="el-upload__tip">上传文件尺寸小于15M,最多可上传1份</div> |
| | | </template> |
| | | </el-upload> |
| | | </div> |
| | |
| | | } |
| | | |
| | | const picSize = async (rawFile) => { |
| | | if(rawFile.size / 1024 / 1024 > 5){ |
| | | if(rawFile.size / 1024 / 1024 > 15){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '文件大小不能超过5M' |
| | | message: '文件大小不能超过15M' |
| | | }); |
| | | return false |
| | | } |
| | |
| | | :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)"> |
| | | <el-button type="primary">上传附件PDF</el-button> |
| | | <template #tip> |
| | | <div class="el-upload__tip">上传文件尺寸小于5M,最多可上传1份</div> |
| | | <div class="el-upload__tip">上传文件尺寸小于15M,最多可上传1份</div> |
| | | </template> |
| | | </el-upload> |
| | | </el-form-item> |
| | |
| | | } |
| | | |
| | | const picSize = async (rawFile) => { |
| | | if(rawFile.size / 1024 / 1024 > 5){ |
| | | if(rawFile.size / 1024 / 1024 > 15){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '文件大小不能超过5M' |
| | | message: '文件大小不能超过15M' |
| | | }); |
| | | return false |
| | | } |
| | |
| | | const title = [["自治区应急管理厅外聘专家劳务费发放表"]] |
| | | // 固定一行:填报处室和单位 |
| | | const fixedHeader = [ |
| | | ["填报处室:" + row.deptName, "", "", "", "", "单位:元", "", "", "", "","","",""] |
| | | ["填报处室:" + row.deptName, "", "", "", "", "单位:元", "", "", "", "","",""] |
| | | ] |
| | | if(res.data && res.data[0] && Array.isArray(res.data[0].projectExpertExportResps) && res.data[0].projectExpertExportResps.length>0){ |
| | | let mainData = res.data[0].projectExpertExportResps |
| | | const data = mainData.map((item,index)=>{ |
| | | return [index+1,item.name,item.companyName,item.title,item.idCard,item.freightBasis,item.billingDuration,item.taxExpertFee,item.taxableIncome,item.incomeTaxPayable,item.afterTaxAmount,item.openBank,item.bankCard] |
| | | return [index+1,item.name,item.companyName,item.title,item.idCard,item.freightBasis,item.billingDuration,item.taxExpertFee,item.incomeTaxPayable,item.afterTaxAmount,item.openBank,item.bankCard] |
| | | }) |
| | | |
| | | // 定义表头 |
| | | const headers = [ |
| | | ["序号", "姓名", "工作单位", "职称", "身份证号", "计费标准", "计费时长", "专家费", "应纳税所得额", "应缴个税", "税后金额", "开户银行", "卡号"] |
| | | ["序号", "姓名", "工作单位", "职称", "身份证号", "计费标准", "计费时长", "专家费", "应缴税费", "税后金额", "开户银行", "卡号"] |
| | | ] |
| | | // 固定一行:经办人和负责人 |
| | | const footer = [ |
| | | ["经办人:", "", "", "", "", "处室负责人:", "", "", "", "","","",""] |
| | | ["经办人:", "", "", "", "", "处室负责人:", "", "", "", "","",""] |
| | | ] |
| | | // 创建工作表 |
| | | const ws = XLSX.utils.aoa_to_sheet([ |
| | |
| | | const dataRowCount = data.length; |
| | | // 合并单元格的范围 |
| | | ws['!merges'] = [ |
| | | { s: { r: 0, c: 0 }, e: { r: 0, c: 12 } }, // 合并标题:第1行 0列到12列 |
| | | { s: { r: 0, c: 0 }, e: { r: 0, c: 11 } }, // 合并标题:第1行 0列到12列 |
| | | { s: { r: 1, c: 0 }, e: { r: 1, c: 4 } }, // 合并填报处室:第2行 第0列到4列 |
| | | { s: { r: 1, c: 5 }, e: { r: 1, c: 12 } }, // 合并单位:第2行 第5列到12列 |
| | | { s: { r: 1, c: 5 }, e: { r: 1, c: 11 } }, // 合并单位:第2行 第5列到12列 |
| | | { s: { r: 3 + dataRowCount, c: 0 }, e: { r: 3 + dataRowCount, c: 4 } }, // 合并经办人:最后一行的第0列到4列 |
| | | { s: { r: 3 + dataRowCount, c: 5 }, e: { r: 3 + dataRowCount, c: 12 } }, // 合并负责人:最后一行的第5列到12列 |
| | | { s: { r: 3 + dataRowCount, c: 5 }, e: { r: 3 + dataRowCount, c: 11 } }, // 合并负责人:最后一行的第5列到12列 |
| | | ] |
| | | // 设置标题 |
| | | if (!ws['A1']) ws['A1'] = {}; // 确保 A1 单元格存在 |