@@ -56,7 +56,7 @@ public class GeneratorCodeKingbaseConfig { | |||
} | |||
public static void main(String[] args) { | |||
generate("Liuxinxin", "expert", PATH_LXX, "expert_intention_work_region"); | |||
generate("Liuxinxin", "expert", PATH_LXX, "expert_avoid_company"); | |||
} | |||
} |
@@ -0,0 +1,226 @@ | |||
package com.ningdatech.pmapi.expert.assembler; | |||
import com.ningdatech.pmapi.expert.model.*; | |||
import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | |||
import com.ningdatech.pmapi.expert.model.dto.*; | |||
import com.ningdatech.pmapi.meta.constant.DictExpertInfoTypeEnum; | |||
import com.ningdatech.pmapi.meta.constant.ExpertTagEnum; | |||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||
import org.apache.commons.collections4.CollectionUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Objects; | |||
import java.util.stream.Collectors; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午5:19 | |||
*/ | |||
public class ExpertInfoCmdAssembler { | |||
public static ExpertFullInfoSaveCmd buildExpertFullInfoSaveCmd(Long userId | |||
, ExpertBasicInfo expertBasicInfo, ExpertEduInfo expertEduInfo | |||
, ExpertJobInfo expertJobInfo, ExpertProfessionalInfo expertProfessionalInfo) { | |||
ExpertFullInfoSaveCmd expertFullInfoSaveCmd = new ExpertFullInfoSaveCmd(); | |||
ExpertUserFullInfoDTO expertUserInfoDTO = buildExpertUserFullInfoDTO( | |||
expertBasicInfo, expertEduInfo, expertJobInfo, expertProfessionalInfo, null, null); | |||
List<ExpertDictionaryDTO> expertDictionaryList = | |||
buildExpertDictionaryList(expertBasicInfo, expertEduInfo, expertJobInfo, expertProfessionalInfo, null); | |||
List<ExpertTagDTO> expertTagList = buildExpertTagList(expertProfessionalInfo, expertBasicInfo, null); | |||
// 专家履职意向(区域编码) | |||
List<ExpertRegionDTO> expertIntentionWorkRegionInfo = buildExpertRegionList(expertBasicInfo); | |||
List<ExpertAvoidCompanyDTO> expertAvoidCompanyList = buildExpertAvoidCompanyList(expertProfessionalInfo); | |||
expertFullInfoSaveCmd.setUserId(userId); | |||
expertFullInfoSaveCmd.setExpertUserInfoDTO(expertUserInfoDTO); | |||
expertFullInfoSaveCmd.setExpertDictionaryList(expertDictionaryList); | |||
expertFullInfoSaveCmd.setExpertTagList(expertTagList); | |||
expertFullInfoSaveCmd.setExpertIntentionWorkRegionInfo(expertIntentionWorkRegionInfo); | |||
expertFullInfoSaveCmd.setExpertAvoidCompanyList(expertAvoidCompanyList); | |||
return expertFullInfoSaveCmd; | |||
} | |||
private static List<ExpertAvoidCompanyDTO> buildExpertAvoidCompanyList(ExpertProfessionalInfo professionalInfo) { | |||
List<ExpertAvoidCompanyDTO> expertAvoidCompanyList = new ArrayList<>(); | |||
List<ExpertAvoidCompanyInfo> avoidCompanyList = professionalInfo.getAvoidCompanyList(); | |||
if (CollectionUtils.isNotEmpty(avoidCompanyList)) { | |||
expertAvoidCompanyList = avoidCompanyList.stream().map(r -> { | |||
ExpertAvoidCompanyDTO expertAvoidCompanyDTO = new ExpertAvoidCompanyDTO(); | |||
expertAvoidCompanyDTO.setCompanyName(r.getCompanyName()); | |||
expertAvoidCompanyDTO.setCompanyUniqCode(r.getCompanyUniqCode()); | |||
return expertAvoidCompanyDTO; | |||
}).collect(Collectors.toList()); | |||
} | |||
return expertAvoidCompanyList; | |||
} | |||
private static List<ExpertRegionDTO> buildExpertRegionList(ExpertBasicInfo basicInfo) { | |||
List<ExpertRegionInfo> expertIntentionWorkRegions = basicInfo.getExpertIntentionWorkRegions(); | |||
if (CollectionUtils.isEmpty(expertIntentionWorkRegions)) { | |||
return new ArrayList<>(); | |||
} | |||
return expertIntentionWorkRegions.stream().map(r -> { | |||
ExpertRegionDTO expertRegionDTO = new ExpertRegionDTO(); | |||
expertRegionDTO.setRegionCode(r.getRegionCode()); | |||
expertRegionDTO.setRegionLevel(r.getRegionLevel()); | |||
return expertRegionDTO; | |||
}).collect(Collectors.toList()); | |||
} | |||
private static List<ExpertTagDTO> buildExpertTagList(ExpertProfessionalInfo professionalInfo | |||
, ExpertBasicInfo basicInfo, ExpertOtherInfo otherInfo) { | |||
List<TagFieldInfo> goodAt = professionalInfo.getGoodAt(); | |||
List<TagFieldInfo> technicalExpertise = professionalInfo.getTechnicalExpertise(); | |||
List<TagFieldInfo> industrySector = professionalInfo.getIndustrySector(); | |||
List<TagFieldInfo> expertSource = basicInfo.getExpertSource(); | |||
List<TagFieldInfo> other = new ArrayList<>(); | |||
if (Objects.nonNull(otherInfo)) { | |||
other = otherInfo.getOther(); | |||
} | |||
List<TagFieldInfo> tagFieldInfoList = new ArrayList<>(); | |||
assemblerTagExpertInfoFieldName(tagFieldInfoList, goodAt, ExpertTagEnum.GOOD_AT); | |||
assemblerTagExpertInfoFieldName(tagFieldInfoList, technicalExpertise, ExpertTagEnum.TECHNICAL_EXPERTISE); | |||
assemblerTagExpertInfoFieldName(tagFieldInfoList, industrySector, ExpertTagEnum.INDUSTRY_SECTOR); | |||
assemblerTagExpertInfoFieldName(tagFieldInfoList, expertSource, ExpertTagEnum.EXPERT_SOURCE); | |||
assemblerTagExpertInfoFieldName(tagFieldInfoList, other, ExpertTagEnum.OTHER); | |||
return tagFieldInfoList.stream().map(r -> { | |||
ExpertTagDTO expertTagDTO = new ExpertTagDTO(); | |||
expertTagDTO.setTagCode(r.getTagCode()); | |||
expertTagDTO.setExpertInfoField(r.getTagFieldName()); | |||
return expertTagDTO; | |||
}).collect(Collectors.toList()); | |||
} | |||
private static void assemblerTagExpertInfoFieldName(List<TagFieldInfo> allTagFieldInfoList | |||
, List<TagFieldInfo> originalTagFieldInfoList, ExpertTagEnum tagExpertInfoFieldEnum) { | |||
if (CollectionUtils.isNotEmpty(originalTagFieldInfoList)) { | |||
originalTagFieldInfoList = originalTagFieldInfoList.stream().map(r -> { | |||
r.setTagFieldName(tagExpertInfoFieldEnum.getKey()); | |||
return r; | |||
}).collect(Collectors.toList()); | |||
allTagFieldInfoList.addAll(originalTagFieldInfoList); | |||
} | |||
} | |||
private static List<ExpertDictionaryDTO> buildExpertDictionaryList(ExpertBasicInfo basicInfo, ExpertEduInfo eduInfo | |||
, ExpertJobInfo jobInfo, ExpertProfessionalInfo professionalInfo, ExpertRecommendInfo recommendInfo) { | |||
List<DictionaryFieldInfo> political = basicInfo.getPolitical(); | |||
List<DictionaryFieldInfo> expertType = basicInfo.getExpertType(); | |||
List<DictionaryFieldInfo> edu = eduInfo.getEdu(); | |||
List<DictionaryFieldInfo> degree = eduInfo.getDegree(); | |||
List<DictionaryFieldInfo> jobStatus = jobInfo.getJobStatus(); | |||
List<DictionaryFieldInfo> companyAttribute = jobInfo.getCompanyAttribute(); | |||
List<DictionaryFieldInfo> administrativeRank = jobInfo.getAdministrativeRank(); | |||
List<DictionaryFieldInfo> titleLevel = professionalInfo.getTitleLevel(); | |||
List<DictionaryFieldInfo> recommendedWay = new ArrayList<>(); | |||
if (Objects.nonNull(recommendInfo)) { | |||
recommendedWay = recommendInfo.getRecommendedWay(); | |||
} | |||
List<DictionaryFieldInfo> dictionaryFieldInfoList = new ArrayList<>(); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, political, DictExpertInfoTypeEnum.POLITICAL); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, expertType, DictExpertInfoTypeEnum.EXPERT_TYPE); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, edu, DictExpertInfoTypeEnum.EDU); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, degree, DictExpertInfoTypeEnum.DEGREE); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, jobStatus, DictExpertInfoTypeEnum.JOB_STATUS); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, companyAttribute, DictExpertInfoTypeEnum.COMPANY_ATTRIBUTE); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, administrativeRank, DictExpertInfoTypeEnum.ADMINISTRATIVE_RANK); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, titleLevel, DictExpertInfoTypeEnum.TITLE_LEVEL); | |||
assemblerDictionaryFieldName(dictionaryFieldInfoList, recommendedWay, DictExpertInfoTypeEnum.RECOMMENDED_WAY); | |||
return dictionaryFieldInfoList.stream().map(r -> { | |||
ExpertDictionaryDTO expertDictionaryDTO = new ExpertDictionaryDTO(); | |||
expertDictionaryDTO.setDictionaryCode(r.getDictionaryCode()); | |||
expertDictionaryDTO.setExpertInfoField(r.getDictionaryFieldName()); | |||
return expertDictionaryDTO; | |||
}).collect(Collectors.toList()); | |||
} | |||
private static void assemblerDictionaryFieldName( | |||
List<DictionaryFieldInfo> allDictionaryFieldInfoList, List<DictionaryFieldInfo> originalDictionaryFieldInfoList | |||
, DictExpertInfoTypeEnum dictExpertInfoTypeEnum) { | |||
if (CollectionUtils.isNotEmpty(originalDictionaryFieldInfoList)) { | |||
originalDictionaryFieldInfoList = originalDictionaryFieldInfoList.stream().map(r -> { | |||
r.setDictionaryFieldName(dictExpertInfoTypeEnum.getKey()); | |||
return r; | |||
}).collect(Collectors.toList()); | |||
allDictionaryFieldInfoList.addAll(originalDictionaryFieldInfoList); | |||
} | |||
} | |||
private static ExpertUserFullInfoDTO buildExpertUserFullInfoDTO(ExpertBasicInfo basicInfo, ExpertEduInfo eduInfo | |||
, ExpertJobInfo jobInfo, ExpertProfessionalInfo professionalInfo, ExpertRecommendInfo recommendInfo, ExpertOtherInfo otherInfo) { | |||
ExpertUserFullInfoDTO expertUserFullInfoDTO = new ExpertUserFullInfoDTO(); | |||
expertUserFullInfoDTO.setIsDingUser(basicInfo.getIsDingUser()); | |||
expertUserFullInfoDTO.setPhoneNo(basicInfo.getPhoneNo()); | |||
expertUserFullInfoDTO.setGender(basicInfo.getGender()); | |||
expertUserFullInfoDTO.setName(basicInfo.getName()); | |||
if (Objects.nonNull(basicInfo.getAvatarFile())) { | |||
expertUserFullInfoDTO.setAvatarFileId(basicInfo.getAvatarFile().getFileId()); | |||
} | |||
expertUserFullInfoDTO.setIdCard(basicInfo.getIdCard()); | |||
expertUserFullInfoDTO.setOfficePhone(basicInfo.getOfficePhone()); | |||
expertUserFullInfoDTO.setBirth(basicInfo.getBirth()); | |||
expertUserFullInfoDTO.setBankNo(basicInfo.getBankNo()); | |||
expertUserFullInfoDTO.setBank(basicInfo.getBank()); | |||
expertUserFullInfoDTO.setEmail(basicInfo.getEmail()); | |||
expertUserFullInfoDTO.setHometown(basicInfo.getHometown()); | |||
expertUserFullInfoDTO.setNationality(basicInfo.getNationality()); | |||
if (Objects.nonNull(otherInfo)) { | |||
expertUserFullInfoDTO.setRemark(otherInfo.getRemark()); | |||
} | |||
expertUserFullInfoDTO.setSchool(eduInfo.getSchool()); | |||
expertUserFullInfoDTO.setGraduatedAt(eduInfo.getGraduatedAt()); | |||
expertUserFullInfoDTO.setAcademicTitle(eduInfo.getAcademicTitle()); | |||
if (CollectionUtils.isNotEmpty(eduInfo.getGraduationCertificateFile())) { | |||
expertUserFullInfoDTO.setGraduationCertificateFileIdList(eduInfo.getGraduationCertificateFile().stream().map(FileBasicInfo::getFileId).collect(Collectors.toList())); | |||
} | |||
if (CollectionUtils.isNotEmpty(eduInfo.getDegreeCertificateFile())) { | |||
expertUserFullInfoDTO.setDegreeCertificateFileIdList(eduInfo.getDegreeCertificateFile().stream().map(FileBasicInfo::getFileId).collect(Collectors.toList())); | |||
} | |||
expertUserFullInfoDTO.setRetiredAt(jobInfo.getRetiredAt()); | |||
expertUserFullInfoDTO.setCompany(jobInfo.getCompany()); | |||
expertUserFullInfoDTO.setLegalEntityCode(jobInfo.getLegalEntityCode()); | |||
expertUserFullInfoDTO.setAdministrativeDuties(jobInfo.getAdministrativeDuties()); | |||
expertUserFullInfoDTO.setStartWorkAt(jobInfo.getStartWorkAt()); | |||
expertUserFullInfoDTO.setAddress(jobInfo.getAddress()); | |||
expertUserFullInfoDTO.setExperience(jobInfo.getExperience()); | |||
expertUserFullInfoDTO.setTechnicalTitles(professionalInfo.getTechnicalTitles()); | |||
if (CollectionUtils.isNotEmpty(professionalInfo.getTitleCertificateFile())) { | |||
expertUserFullInfoDTO.setTitleCertificateFileIdList(professionalInfo.getTitleCertificateFile().stream().map(FileBasicInfo::getFileId).collect(Collectors.toList())); | |||
} | |||
expertUserFullInfoDTO.setAwards(professionalInfo.getAwards()); | |||
expertUserFullInfoDTO.setRecognitionReward(professionalInfo.getRecognitionReward()); | |||
if (Objects.nonNull(basicInfo.getExpertRegionInfo())) { | |||
expertUserFullInfoDTO.setRegionCode(basicInfo.getExpertRegionInfo().getRegionCode()); | |||
expertUserFullInfoDTO.setRegionLevel(basicInfo.getExpertRegionInfo().getRegionLevel()); | |||
} | |||
// 推荐证明材料单独装配 | |||
if (Objects.nonNull(recommendInfo)) { | |||
List<FileBasicInfo> recommendationProofFile = recommendInfo.getRecommendationProofFile(); | |||
if (CollectionUtils.isNotEmpty(recommendationProofFile)) { | |||
expertUserFullInfoDTO | |||
.setRecommendationProofFileIdList( | |||
recommendationProofFile.stream().map(FileBasicInfo::getFileId).collect(Collectors.toList())); | |||
} | |||
} | |||
return expertUserFullInfoDTO; | |||
} | |||
} |
@@ -0,0 +1,44 @@ | |||
package com.ningdatech.pmapi.expert.constant; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Getter; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午4:21 | |||
*/ | |||
@AllArgsConstructor | |||
@Getter | |||
public enum ExpertAccountStatusEnum { | |||
/** | |||
* 可用 | |||
*/ | |||
AVAILABLE("available"), | |||
/** | |||
* 冻结中 | |||
*/ | |||
FREEZE("freeze"), | |||
/** | |||
* 已出库 | |||
*/ | |||
DELIVERY("delivery"), | |||
/** | |||
* 申请中 | |||
*/ | |||
APPLYING("applying"); | |||
private final String key; | |||
public static ExpertAccountStatusEnum of(String key) { | |||
for (ExpertAccountStatusEnum statusEnum : ExpertAccountStatusEnum.values()) { | |||
if (statusEnum.key.equals(key)) { | |||
return statusEnum; | |||
} | |||
} | |||
throw new IllegalArgumentException(String.format("Illegal ExpertAccountStatusEnum = %s", key)); | |||
} | |||
} |
@@ -0,0 +1,31 @@ | |||
package com.ningdatech.pmapi.expert.constant; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Getter; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/26 上午9:26 | |||
*/ | |||
@AllArgsConstructor | |||
@Getter | |||
public enum ExpertUserInfoStepEnum { | |||
/** | |||
* 待提交信息 | |||
*/ | |||
INFORMATION_TO_BE_SUBMITTED("information_to_be_submitted"), | |||
/** | |||
* 已提交基本信息 | |||
*/ | |||
BASIC_INFORMATION_SUBMITTED("basic_information_submitted"), | |||
/** | |||
* 已提交证明材料 | |||
*/ | |||
EVIDENCE_HAS_BEEN_SUBMITTED("evidence_has_been_submitted"); | |||
private final String key; | |||
} |
@@ -0,0 +1,20 @@ | |||
package com.ningdatech.pmapi.expert.controller; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.stereotype.Controller; | |||
/** | |||
* <p> | |||
* 前端控制器 | |||
* </p> | |||
* | |||
* @author Liuxinxin | |||
* @since 2023-02-23 | |||
*/ | |||
@Controller | |||
@RequestMapping("/pmapi.expert/expert-avoid-company") | |||
public class ExpertAvoidCompanyController { | |||
} |
@@ -1,20 +1,40 @@ | |||
package com.ningdatech.pmapi.expert.controller; | |||
import com.ningdatech.pmapi.expert.manage.ExpertManage; | |||
import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import org.springframework.web.bind.annotation.PostMapping; | |||
import org.springframework.web.bind.annotation.RequestBody; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RestController; | |||
import org.springframework.stereotype.Controller; | |||
import javax.validation.Valid; | |||
/** | |||
* <p> | |||
* 前端控制器 | |||
* 前端控制器 | |||
* </p> | |||
* | |||
* @author Liuxinxin | |||
* @since 2023-02-22 | |||
*/ | |||
@Controller | |||
@RestController | |||
@Api(tags = "专家管理相关接口") | |||
@RequestMapping("/api/v1/expert") | |||
@RequiredArgsConstructor | |||
public class ExpertController { | |||
private final ExpertManage expertManage; | |||
@PostMapping("/basic-info-submit") | |||
@ApiOperation("填写基本信息接口(专家报名使用))") | |||
public void expertBasicInfoSubmit(@Valid @RequestBody ExpertUserBasicInfoSubmitRequest request) { | |||
// ExpertUserInfoValidator.expertUserBasicInfoSubmitRequestValidate(request); | |||
expertManage.expertBasicInfoSubmit(request); | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
package com.ningdatech.pmapi.expert.entity; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import io.swagger.annotations.ApiModel; | |||
import lombok.Data; | |||
import java.io.Serializable; | |||
import java.time.LocalDateTime; | |||
/** | |||
* <p> | |||
* | |||
* </p> | |||
* | |||
* @author Liuxinxin | |||
* @since 2023-02-23 | |||
*/ | |||
@TableName("expert_avoid_company") | |||
@ApiModel(value = "ExpertAvoidCompany对象", description = "") | |||
@Data | |||
public class ExpertAvoidCompany implements Serializable { | |||
private static final long serialVersionUID = 1L; | |||
private Long id; | |||
private LocalDateTime createOn; | |||
private LocalDateTime updateOn; | |||
private Long userId; | |||
private String companyName; | |||
private String companyUniqCode; | |||
} |
@@ -45,7 +45,7 @@ public class ExpertUserFullInfo implements Serializable { | |||
private String expertName; | |||
private String avatarFileId; | |||
private Long avatarFileId; | |||
private String idCard; | |||
@@ -75,7 +75,7 @@ public class ExpertUserFullInfo implements Serializable { | |||
private String administrativeDuties; | |||
private String startWorkAt; | |||
private LocalDateTime startWorkAt; | |||
private String address; | |||
@@ -0,0 +1,113 @@ | |||
package com.ningdatech.pmapi.expert.helper; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.ningdatech.pmapi.expert.model.*; | |||
import com.ningdatech.pmapi.meta.helper.DictionaryCache; | |||
import com.ningdatech.pmapi.meta.helper.TagCache; | |||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO; | |||
import com.ningdatech.pmapi.meta.model.dto.TagDTO; | |||
import com.ningdatech.pmapi.sys.model.dto.RegionDTO; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Component; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Objects; | |||
/** | |||
* @author liuxinxin | |||
* @date 2023/2/23 上午9:18 | |||
*/ | |||
@Component | |||
public class ExpertManageHelper { | |||
// @Autowired | |||
// private RegionCache regionCache; | |||
@Autowired | |||
private TagCache tagCache; | |||
@Autowired | |||
private DictionaryCache dictionaryCache; | |||
/** | |||
* 校验区域code | |||
* | |||
* @param expertRegionInfo | |||
*/ | |||
public void expertRegionInfoCheck(ExpertRegionInfo expertRegionInfo) { | |||
// // todo 必须为叶子节点编码 | |||
// String regionCode = expertRegionInfo.getRegionCode(); | |||
// Integer regionLevel = expertRegionInfo.getRegionLevel(); | |||
// RegionDTO regionDTO = regionCache.getByCodeAndLevel(regionCode, regionLevel); | |||
// if (Objects.isNull(regionDTO)) { | |||
// throw new BadRequestException("illegal regionInfo"); | |||
// } | |||
} | |||
/** | |||
* 校验标签code是否合法 | |||
* | |||
* @param expertProfessionalInfo | |||
* @param expertBasicInfo | |||
*/ | |||
public void tagFieldCheck(ExpertProfessionalInfo expertProfessionalInfo, ExpertBasicInfo expertBasicInfo) { | |||
List<TagFieldInfo> goodAt = expertProfessionalInfo.getGoodAt(); | |||
List<TagFieldInfo> technicalExpertise = expertProfessionalInfo.getTechnicalExpertise(); | |||
List<TagFieldInfo> industrySector = expertProfessionalInfo.getIndustrySector(); | |||
List<TagFieldInfo> expertSource = expertBasicInfo.getExpertSource(); | |||
List<TagFieldInfo> tagFieldInfoList = new ArrayList<>(); | |||
tagFieldInfoList.addAll(goodAt); | |||
tagFieldInfoList.addAll(technicalExpertise); | |||
tagFieldInfoList.addAll(industrySector); | |||
tagFieldInfoList.addAll(expertSource); | |||
for (TagFieldInfo tagFieldInfo : tagFieldInfoList) { | |||
String tagCode = tagFieldInfo.getTagCode(); | |||
TagDTO tagCodeDTO = tagCache.getByTagCode(tagCode); | |||
if (Objects.isNull(tagCodeDTO)) { | |||
throw new BizException("illegal tagCode: tagField=" + tagFieldInfo.getTagFieldName() + ",tagCode=" + tagCode); | |||
} | |||
} | |||
} | |||
/** | |||
* 校验字典code是否合法 | |||
* | |||
* @param expertBasicInfo | |||
* @param expertEduInfo | |||
* @param expertJobInfo | |||
*/ | |||
public void dictionaryFieldCheck(ExpertBasicInfo expertBasicInfo, ExpertEduInfo expertEduInfo | |||
, ExpertJobInfo expertJobInfo) { | |||
List<DictionaryFieldInfo> political = expertBasicInfo.getPolitical(); | |||
List<DictionaryFieldInfo> edu = expertEduInfo.getEdu(); | |||
List<DictionaryFieldInfo> degree = expertEduInfo.getDegree(); | |||
List<DictionaryFieldInfo> jobStatus = expertJobInfo.getJobStatus(); | |||
List<DictionaryFieldInfo> companyAttribute = expertJobInfo.getCompanyAttribute(); | |||
List<DictionaryFieldInfo> administrativeRank = expertJobInfo.getAdministrativeRank(); | |||
List<DictionaryFieldInfo> dictionaryFieldInfoList = new ArrayList<>(); | |||
dictionaryFieldInfoList.addAll(political); | |||
dictionaryFieldInfoList.addAll(edu); | |||
dictionaryFieldInfoList.addAll(degree); | |||
dictionaryFieldInfoList.addAll(jobStatus); | |||
dictionaryFieldInfoList.addAll(companyAttribute); | |||
dictionaryFieldInfoList.addAll(administrativeRank); | |||
for (DictionaryFieldInfo dictionaryFieldInfo : dictionaryFieldInfoList) { | |||
String dictionaryFieldName = dictionaryFieldInfo.getDictionaryFieldName(); | |||
String dictionaryCode = dictionaryFieldInfo.getDictionaryCode(); | |||
DictionaryDTO dictionaryDTO = dictionaryCache.getByCode(dictionaryCode); | |||
if (Objects.isNull(dictionaryDTO)) { | |||
throw new BizException("illegal dictionaryCode: dictionaryFieldName=" + dictionaryFieldName + ",dictionaryCode=" + dictionaryCode); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,78 @@ | |||
package com.ningdatech.pmapi.expert.manage; | |||
import com.ningdatech.pmapi.expert.assembler.ExpertInfoCmdAssembler; | |||
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | |||
import com.ningdatech.pmapi.expert.constant.ExpertUserInfoStepEnum; | |||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||
import com.ningdatech.pmapi.expert.helper.ExpertManageHelper; | |||
import com.ningdatech.pmapi.expert.model.ExpertBasicInfo; | |||
import com.ningdatech.pmapi.expert.model.ExpertEduInfo; | |||
import com.ningdatech.pmapi.expert.model.ExpertJobInfo; | |||
import com.ningdatech.pmapi.expert.model.ExpertProfessionalInfo; | |||
import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | |||
import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | |||
import com.ningdatech.pmapi.expert.service.ExpertInfoService; | |||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||
import com.ningdatech.pmapi.user.util.LoginUserUtil; | |||
import lombok.RequiredArgsConstructor; | |||
import org.springframework.stereotype.Component; | |||
import java.util.List; | |||
import java.util.Objects; | |||
/** | |||
* @author liuxinxin | |||
* @date 2023/2/23 上午8:55 | |||
*/ | |||
@Component | |||
@RequiredArgsConstructor | |||
public class ExpertManage { | |||
private final ExpertManageHelper expertManageHelper; | |||
private final IExpertUserFullInfoService iExpertUserFullInfoService; | |||
private final ExpertInfoService expertInfoService; | |||
/** | |||
* 填写基本信息,只有专家自己可用 | |||
* | |||
* @param request | |||
*/ | |||
public void expertBasicInfoSubmit(ExpertUserBasicInfoSubmitRequest request) { | |||
// 用户id | |||
Long userId = LoginUserUtil.getUserId(); | |||
ExpertBasicInfo basicInfo = request.getBasicInfo(); | |||
// 校验区域编码合法性 校验履职意向编码合法性 | |||
ExpertRegionInfo expertRegionInfo = basicInfo.getExpertRegionInfo(); | |||
expertManageHelper.expertRegionInfoCheck(expertRegionInfo); | |||
List<ExpertRegionInfo> expertIntentionWorkRegions = basicInfo.getExpertIntentionWorkRegions(); | |||
for (ExpertRegionInfo expertIntentionWorkRegion : expertIntentionWorkRegions) { | |||
expertManageHelper.expertRegionInfoCheck(expertIntentionWorkRegion); | |||
} | |||
ExpertEduInfo eduInfo = request.getEduInfo(); | |||
ExpertJobInfo jobInfo = request.getJobInfo(); | |||
ExpertProfessionalInfo professionalInfo = request.getProfessionalInfo(); | |||
// 校验标签字段 | |||
expertManageHelper.tagFieldCheck(professionalInfo, basicInfo); | |||
// 校验字典字段 | |||
expertManageHelper.dictionaryFieldCheck(basicInfo, eduInfo, jobInfo); | |||
// 判断专家提交状态,判断是否可以进行此操作 | |||
ExpertUserFullInfo expertUserFullInfo = iExpertUserFullInfoService.getByUserId(userId); | |||
boolean submitBasicInfoStatusEnable = Objects.isNull(expertUserFullInfo) | |||
|| (ExpertAccountStatusEnum.APPLYING.getKey().equals(expertUserFullInfo.getExpertAccountStatus()) | |||
&& !ExpertUserInfoStepEnum.EVIDENCE_HAS_BEEN_SUBMITTED.getKey().equals(expertUserFullInfo.getUserInfoStep())); | |||
if (submitBasicInfoStatusEnable) { | |||
// 新建 保存 | |||
ExpertFullInfoSaveCmd expertFullInfoSaveCmd = ExpertInfoCmdAssembler | |||
.buildExpertFullInfoSaveCmd(userId, basicInfo, eduInfo, jobInfo, professionalInfo); | |||
expertInfoService.saveExpertInfo(expertFullInfoSaveCmd); | |||
} | |||
} | |||
} |
@@ -0,0 +1,16 @@ | |||
package com.ningdatech.pmapi.expert.mapper; | |||
import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany; | |||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||
/** | |||
* <p> | |||
* Mapper 接口 | |||
* </p> | |||
* | |||
* @author Liuxinxin | |||
* @since 2023-02-23 | |||
*/ | |||
public interface ExpertAvoidCompanyMapper extends BaseMapper<ExpertAvoidCompany> { | |||
} |
@@ -0,0 +1,5 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
<mapper namespace="com.ningdatech.pmapi.expert.mapper.ExpertAvoidCompanyMapper"> | |||
</mapper> |
@@ -0,0 +1,34 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotBlank; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午2:03 | |||
* 专家信息字典字段信息 | |||
*/ | |||
@Data | |||
@ApiModel("字典字段信息") | |||
public class DictionaryFieldInfo { | |||
/** | |||
* 字段名称 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty("字典字段名称") | |||
private String dictionaryFieldName; | |||
/** | |||
* 字典code | |||
*/ | |||
@ApiModelProperty(value = "字典code") | |||
private String dictionaryCode; | |||
@ApiModelProperty(value = "字典code含义", required = false) | |||
private String dictionaryName; | |||
} |
@@ -0,0 +1,22 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotBlank; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午2:16 | |||
*/ | |||
@Data | |||
public class ExpertAvoidCompanyInfo { | |||
@NotBlank | |||
@ApiModelProperty("公司名称") | |||
private String companyName; | |||
@ApiModelProperty("公司唯一标识 即 调用获取组织架构的树状结构(单位筛选列表) 接口是对应公司的 organizationCode") | |||
private String companyUniqCode; | |||
} |
@@ -0,0 +1,147 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.Email; | |||
import javax.validation.constraints.NotBlank; | |||
import javax.validation.constraints.NotEmpty; | |||
import javax.validation.constraints.NotNull; | |||
import java.time.LocalDateTime; | |||
import java.util.List; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午1:44 | |||
* 专家信息中的基本信息一栏 | |||
*/ | |||
@Data | |||
@ApiModel(value = "ExpertBasicInfo", description = "专家基本信息") | |||
public class ExpertBasicInfo { | |||
/** | |||
* 是否浙政钉用户Y/N | |||
*/ | |||
@NotNull | |||
@ApiModelProperty(value = "是否浙政钉用户Y/N") | |||
private Boolean isDingUser; | |||
/** | |||
* 手机号 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(value = "手机号") | |||
private String phoneNo; | |||
/** | |||
* 专家姓名 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(value = "专家姓名") | |||
private String name; | |||
/** | |||
* 免冠照图片地址 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(value = "免冠照图片文件") | |||
private FileBasicInfo avatarFile; | |||
/** | |||
* 性别 0,1:女,男 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(value = "性别 0,1:女,男") | |||
private String gender; | |||
/** | |||
* 政治面貌(字典code) | |||
*/ | |||
@NotNull | |||
@ApiModelProperty(value = "政治面貌(字典code)") | |||
private List<DictionaryFieldInfo> political; | |||
/** | |||
* 身份证号码 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(value = "身份证号码") | |||
private String idCard; | |||
/** | |||
* 办公电话 | |||
*/ | |||
@ApiModelProperty(value = "办公电话") | |||
private String officePhone; | |||
/** | |||
* 出生日期 | |||
*/ | |||
@NotNull | |||
@ApiModelProperty(value = "出生日期") | |||
private LocalDateTime birth; | |||
/** | |||
* 开户银行 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(value = "开户银行") | |||
private String bank; | |||
/** | |||
* 银行卡号 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(value = "银行卡号") | |||
private String bankNo; | |||
/** | |||
* 电子邮箱 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(value = "电子邮箱") | |||
private String email; | |||
/** | |||
* 专家来源(标签code) | |||
*/ | |||
@NotNull | |||
@ApiModelProperty(value = "专家来源(标签code)") | |||
private List<TagFieldInfo> expertSource; | |||
/** | |||
* 专家层级 | |||
*/ | |||
@NotNull | |||
@ApiModelProperty(value = "专家层级") | |||
private ExpertRegionInfo expertRegionInfo; | |||
/** | |||
* 履职意向 | |||
*/ | |||
@NotEmpty | |||
@ApiModelProperty(value = "履职意向") | |||
private List<ExpertRegionInfo> expertIntentionWorkRegions; | |||
/** | |||
* 专家类型(内外围) | |||
*/ | |||
@ApiModelProperty(value = "专家类型(内外围)") | |||
private List<DictionaryFieldInfo> expertType; | |||
/** | |||
* 籍贯 | |||
*/ | |||
@ApiModelProperty(value = "籍贯") | |||
private String hometown; | |||
/** | |||
* 民族 | |||
*/ | |||
@ApiModelProperty(value = "民族") | |||
private String nationality; | |||
} |
@@ -0,0 +1,66 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotBlank; | |||
import javax.validation.constraints.NotNull; | |||
import java.time.LocalDateTime; | |||
import java.util.List; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午1:50 | |||
*/ | |||
@Data | |||
@ApiModel(value = "ExpertEduInfo", description = "学历信息") | |||
public class ExpertEduInfo { | |||
/** | |||
* 毕业院校 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty("毕业院校") | |||
private String school; | |||
/** | |||
* 毕业时间 | |||
*/ | |||
@NotNull | |||
@ApiModelProperty("毕业时间") | |||
private LocalDateTime graduatedAt; | |||
/** | |||
* 所学专业 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty("所学专业") | |||
private String academicTitle; | |||
/** | |||
* 学历(字典code) | |||
*/ | |||
@NotNull | |||
@ApiModelProperty("学历(字典code)") | |||
private List<DictionaryFieldInfo> edu; | |||
/** | |||
* 毕业证附件信息 | |||
*/ | |||
@ApiModelProperty("毕业证附件信息") | |||
private List<FileBasicInfo> graduationCertificateFile; | |||
/** | |||
* 学位(字典code) | |||
*/ | |||
@NotNull | |||
@ApiModelProperty("学位(字典code)") | |||
private List<DictionaryFieldInfo> degree; | |||
/** | |||
* 学位证附件信息 | |||
*/ | |||
@ApiModelProperty("学位证附件信息") | |||
private List<FileBasicInfo> degreeCertificateFile; | |||
} |
@@ -0,0 +1,91 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotBlank; | |||
import javax.validation.constraints.NotNull; | |||
import java.time.LocalDateTime; | |||
import java.util.List; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午1:58 | |||
*/ | |||
@Data | |||
@ApiModel(value = "ExpertJobInfo", description = "职业信息") | |||
public class ExpertJobInfo { | |||
/** | |||
* 在职状态(字典code) | |||
*/ | |||
@NotNull | |||
@ApiModelProperty("在职状态(字典code)") | |||
private List<DictionaryFieldInfo> jobStatus; | |||
/** | |||
* 退休时间 | |||
*/ | |||
@ApiModelProperty("退休时间") | |||
private LocalDateTime retiredAt; | |||
/** | |||
* 工作单位 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty("工作单位,组织结构name") | |||
private String company; | |||
@ApiModelProperty("工作单位,前端使用标识") | |||
private String companyUniqCode; | |||
/** | |||
* 单位法人编号 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty(" 单位法人编号") | |||
private String legalEntityCode; | |||
/** | |||
* 行政职务 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty("行政职务") | |||
private String administrativeDuties; | |||
/** | |||
* 开始工作时间 | |||
*/ | |||
@NotNull | |||
@ApiModelProperty("开始工作时间") | |||
private LocalDateTime startWorkAt; | |||
/** | |||
* 行政职级(字典code) | |||
*/ | |||
@NotNull | |||
@ApiModelProperty("行政职级(字典code)") | |||
private List<DictionaryFieldInfo> administrativeRank; | |||
/** | |||
* 单位类型(字典code) | |||
*/ | |||
@NotNull | |||
@ApiModelProperty("单位类型(字典code)") | |||
private List<DictionaryFieldInfo> companyAttribute; | |||
/** | |||
* 工作地址 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty("工作地址") | |||
private String address; | |||
/** | |||
* 工作经历 | |||
*/ | |||
@NotBlank | |||
@ApiModelProperty("工作经历") | |||
private String experience; | |||
} |
@@ -0,0 +1,22 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import java.util.List; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/8/19 下午6:43 | |||
*/ | |||
@Data | |||
@ApiModel(description = "其他信息") | |||
public class ExpertOtherInfo { | |||
@ApiModelProperty(value = "其他标签(标签code)") | |||
private List<TagFieldInfo> other; | |||
@ApiModelProperty(value = "备注") | |||
private String remark; | |||
} |
@@ -0,0 +1,56 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotBlank; | |||
import javax.validation.constraints.NotNull; | |||
import java.util.List; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午2:07 | |||
*/ | |||
@Data | |||
@ApiModel(description = "专业信息") | |||
public class ExpertProfessionalInfo { | |||
@NotBlank | |||
@ApiModelProperty(value = "技术职称") | |||
private String technicalTitles; | |||
@NotNull | |||
@ApiModelProperty(value = "职称级别") | |||
private List<DictionaryFieldInfo> titleLevel; | |||
@ApiModelProperty(value = "职称证明") | |||
private List<FileBasicInfo> titleCertificateFile; | |||
@NotNull | |||
@ApiModelProperty(value = "擅长方向(标签code)") | |||
private List<TagFieldInfo> goodAt; | |||
@NotNull | |||
@ApiModelProperty(value = "技术专长(标签code)") | |||
private List<TagFieldInfo> technicalExpertise; | |||
@NotBlank | |||
@ApiModelProperty(value = " 获奖情况") | |||
private String awards; | |||
@NotNull | |||
@ApiModelProperty(value = "行业领域(标签code)") | |||
private List<TagFieldInfo> industrySector; | |||
@NotBlank | |||
@ApiModelProperty(value = "表彰奖励") | |||
private String recognitionReward; | |||
@ApiModelProperty(value = "回避单位列表") | |||
private List<ExpertAvoidCompanyInfo> avoidCompanyList; | |||
@ApiModelProperty(value = "其他标签") | |||
private List<TagFieldInfo> other; | |||
} |
@@ -0,0 +1,25 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import java.util.List; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/27 上午11:52 | |||
*/ | |||
@Data | |||
@ApiModel(description = "推荐信息") | |||
public class ExpertRecommendInfo { | |||
/** | |||
* 推荐方式 | |||
*/ | |||
@ApiModelProperty("推荐方式") | |||
private List<DictionaryFieldInfo> recommendedWay; | |||
@ApiModelProperty("推荐证明材料") | |||
private List<FileBasicInfo> recommendationProofFile; | |||
} |
@@ -0,0 +1,24 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午1:55 | |||
* 用于包装使用 | |||
*/ | |||
@Data | |||
@ApiModel("文件信息基类") | |||
public class FileBasicInfo { | |||
@ApiModelProperty("文件id") | |||
private Long fileId; | |||
@ApiModelProperty("文件url") | |||
private String url; | |||
@ApiModelProperty("文件名") | |||
private String fileName; | |||
} |
@@ -0,0 +1,24 @@ | |||
package com.ningdatech.pmapi.expert.model; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午2:12 | |||
*/ | |||
@Data | |||
@ApiModel("标签信息") | |||
public class TagFieldInfo { | |||
@ApiModelProperty("标签字段名称") | |||
private String tagFieldName; | |||
@ApiModelProperty("标签字段code") | |||
private String tagCode; | |||
@ApiModelProperty(value = "标签code含义", required = false) | |||
private String tagName; | |||
} | |||
@@ -0,0 +1,32 @@ | |||
package com.ningdatech.pmapi.expert.model.cmd; | |||
import com.ningdatech.pmapi.expert.model.dto.*; | |||
import lombok.Data; | |||
import java.util.List; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午4:41 | |||
*/ | |||
@Data | |||
public class ExpertFullInfoSaveCmd { | |||
private Long userId; | |||
private ExpertUserFullInfoDTO expertUserInfoDTO; | |||
private List<ExpertDictionaryDTO> expertDictionaryList; | |||
private List<ExpertTagDTO> expertTagList; | |||
/** | |||
* 专家履职意向(区域编码) | |||
*/ | |||
private List<ExpertRegionDTO> expertIntentionWorkRegionInfo; | |||
/** | |||
* 回避单位列表 | |||
*/ | |||
private List<ExpertAvoidCompanyDTO> expertAvoidCompanyList; | |||
} |
@@ -0,0 +1,20 @@ | |||
package com.ningdatech.pmapi.expert.model.dto; | |||
import lombok.Data; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午5:14 | |||
*/ | |||
@Data | |||
public class ExpertAvoidCompanyDTO { | |||
/** | |||
* 公司名称 | |||
*/ | |||
private String companyName; | |||
/** | |||
* 公司唯一标识 | |||
*/ | |||
private String companyUniqCode; | |||
} |
@@ -0,0 +1,30 @@ | |||
package com.ningdatech.pmapi.expert.model.dto; | |||
import lombok.Data; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午5:13 | |||
*/ | |||
@Data | |||
public class ExpertDictionaryDTO { | |||
/** | |||
* 字典编码 | |||
*/ | |||
private String dictionaryCode; | |||
/** | |||
* 手机对应专家信息字段号 | |||
* 政治面貌 political | |||
* 专家来源 expert_source | |||
* 学历 edu | |||
* 学位 degree | |||
* 在职状态 job_status | |||
* 行政职级 administrative_rank | |||
* 内外围(专家类型) expert_type | |||
* 单位类型 company_attribute | |||
* 职称级别 title_level | |||
*/ | |||
private String expertInfoField; | |||
} |
@@ -0,0 +1,14 @@ | |||
package com.ningdatech.pmapi.expert.model.dto; | |||
import lombok.Data; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午5:10 | |||
*/ | |||
@Data | |||
public class ExpertRegionDTO { | |||
private String regionCode; | |||
private Integer regionLevel; | |||
} |
@@ -0,0 +1,21 @@ | |||
package com.ningdatech.pmapi.expert.model.dto; | |||
import lombok.Data; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午5:13 | |||
*/ | |||
@Data | |||
public class ExpertTagDTO { | |||
/** | |||
* 标签code | |||
*/ | |||
private String tagCode; | |||
/** | |||
* 对应专家信息字段 | |||
*/ | |||
private String expertInfoField; | |||
} |
@@ -0,0 +1,205 @@ | |||
package com.ningdatech.pmapi.expert.model.dto; | |||
import lombok.Data; | |||
import java.time.LocalDateTime; | |||
import java.util.List; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午4:43 | |||
*/ | |||
@Data | |||
public class ExpertUserFullInfoDTO { | |||
private Long id; | |||
/** | |||
* 用户id | |||
*/ | |||
private Long userId; | |||
/** | |||
* 专家账号状态 | |||
*/ | |||
private String expertAccountStatus; | |||
/** | |||
* 是否浙政钉用户Y/N | |||
*/ | |||
private Boolean isDingUser; | |||
/** | |||
* 专家信息提交步骤 | |||
* 0,1,2 | |||
* 0 :待提交信息 1: 已提交基本信息 2:已提交推荐证明 | |||
*/ | |||
private Integer userInfoStep; | |||
/** | |||
* 手机号 | |||
*/ | |||
private String phoneNo; | |||
/** | |||
* 性别 | |||
* 0,1 女,男 | |||
*/ | |||
private String gender; | |||
/** | |||
* 姓名 | |||
*/ | |||
private String name; | |||
/** | |||
* 免冠照图片文件地址 | |||
*/ | |||
private Long avatarFileId; | |||
/** | |||
* 身份证号码 | |||
*/ | |||
private String idCard; | |||
/** | |||
* 办公电话 | |||
*/ | |||
private String officePhone; | |||
/** | |||
* 出生日期 | |||
*/ | |||
private LocalDateTime birth; | |||
/** | |||
* 银行卡号 | |||
*/ | |||
private String bankNo; | |||
/** | |||
* 开户银行 | |||
*/ | |||
private String bank; | |||
/** | |||
* 电子邮箱 | |||
*/ | |||
private String email; | |||
/** | |||
* 毕业院校 | |||
*/ | |||
private String school; | |||
/** | |||
* 毕业时间 | |||
*/ | |||
private LocalDateTime graduatedAt; | |||
/** | |||
* 所学专业 | |||
*/ | |||
private String academicTitle; | |||
/** | |||
* 毕业证 文件id | |||
*/ | |||
private List<Long> graduationCertificateFileIdList; | |||
/** | |||
* 学位证 文件id | |||
*/ | |||
private List<Long> degreeCertificateFileIdList; | |||
/** | |||
* 退休时间 | |||
*/ | |||
private LocalDateTime retiredAt; | |||
/** | |||
* 工作单位 | |||
*/ | |||
private String company; | |||
/** | |||
* 工作单位前端使用标识 | |||
*/ | |||
private String companyUniqCode; | |||
/** | |||
* 单位法人编号 | |||
*/ | |||
private String legalEntityCode; | |||
/** | |||
* 行政职务 | |||
*/ | |||
private String administrativeDuties; | |||
/** | |||
* 开始工作时间 | |||
*/ | |||
private LocalDateTime startWorkAt; | |||
/** | |||
* 工作地址 | |||
*/ | |||
private String address; | |||
/** | |||
* 工作经历 | |||
*/ | |||
private String experience; | |||
/** | |||
* 技术职称 | |||
*/ | |||
private String technicalTitles; | |||
/** | |||
* 职称证明 | |||
* 文件id | |||
*/ | |||
private List<Long> titleCertificateFileIdList; | |||
/** | |||
* 获奖情况 | |||
*/ | |||
private String awards; | |||
/** | |||
* 表彰奖励 | |||
*/ | |||
private String recognitionReward; | |||
/** | |||
* 推荐证明材料文件id | |||
*/ | |||
private List<Long> recommendationProofFileIdList; | |||
/** | |||
* 专家层级(区域编码) | |||
*/ | |||
private String regionCode; | |||
/** | |||
* 区域级别 | |||
*/ | |||
private Integer regionLevel; | |||
/** | |||
* 专家管理员审核备注 | |||
*/ | |||
private String remark; | |||
/** | |||
* 籍贯 | |||
*/ | |||
private String hometown; | |||
/** | |||
* 民族 | |||
*/ | |||
private String nationality; | |||
} |
@@ -0,0 +1,36 @@ | |||
package com.ningdatech.pmapi.expert.model.req; | |||
import com.ningdatech.pmapi.expert.model.ExpertBasicInfo; | |||
import com.ningdatech.pmapi.expert.model.ExpertEduInfo; | |||
import com.ningdatech.pmapi.expert.model.ExpertJobInfo; | |||
import com.ningdatech.pmapi.expert.model.ExpertProfessionalInfo; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotNull; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/25 下午2:21 | |||
*/ | |||
@Data | |||
@ApiModel(value = "ExpertUserBasicInfoSubmitRequest", description = "专家基本信息填写入参") | |||
public class ExpertUserBasicInfoSubmitRequest { | |||
@NotNull | |||
@ApiModelProperty("基本信息") | |||
private ExpertBasicInfo basicInfo; | |||
@NotNull | |||
@ApiModelProperty("学历信息") | |||
private ExpertEduInfo eduInfo; | |||
@NotNull | |||
@ApiModelProperty("职业信息") | |||
private ExpertJobInfo jobInfo; | |||
@NotNull | |||
@ApiModelProperty("专业信息") | |||
private ExpertProfessionalInfo professionalInfo; | |||
} |
@@ -0,0 +1,14 @@ | |||
package com.ningdatech.pmapi.expert.service; | |||
import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午4:39 | |||
*/ | |||
public interface ExpertInfoService { | |||
void saveExpertInfo(ExpertFullInfoSaveCmd cmd); | |||
} |
@@ -0,0 +1,16 @@ | |||
package com.ningdatech.pmapi.expert.service; | |||
import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany; | |||
import com.baomidou.mybatisplus.extension.service.IService; | |||
/** | |||
* <p> | |||
* 服务类 | |||
* </p> | |||
* | |||
* @author Liuxinxin | |||
* @since 2023-02-23 | |||
*/ | |||
public interface IExpertAvoidCompanyService extends IService<ExpertAvoidCompany> { | |||
} |
@@ -13,4 +13,12 @@ import com.baomidou.mybatisplus.extension.service.IService; | |||
*/ | |||
public interface IExpertUserFullInfoService extends IService<ExpertUserFullInfo> { | |||
/** | |||
* 查询用户信息 | |||
* | |||
* @param userId 用户ID | |||
* @return / | |||
**/ | |||
ExpertUserFullInfo getByUserId(Long userId); | |||
} |
@@ -0,0 +1,20 @@ | |||
package com.ningdatech.pmapi.expert.service.impl; | |||
import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany; | |||
import com.ningdatech.pmapi.expert.mapper.ExpertAvoidCompanyMapper; | |||
import com.ningdatech.pmapi.expert.service.IExpertAvoidCompanyService; | |||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||
import org.springframework.stereotype.Service; | |||
/** | |||
* <p> | |||
* 服务实现类 | |||
* </p> | |||
* | |||
* @author Liuxinxin | |||
* @since 2023-02-23 | |||
*/ | |||
@Service | |||
public class ExpertAvoidCompanyServiceImpl extends ServiceImpl<ExpertAvoidCompanyMapper, ExpertAvoidCompany> implements IExpertAvoidCompanyService { | |||
} |
@@ -0,0 +1,219 @@ | |||
package com.ningdatech.pmapi.expert.service.impl; | |||
import com.alibaba.fastjson.JSONObject; | |||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.ningdatech.pmapi.common.constant.BoolDisplayEnum; | |||
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | |||
import com.ningdatech.pmapi.expert.constant.ExpertUserInfoStepEnum; | |||
import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany; | |||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||
import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | |||
import com.ningdatech.pmapi.expert.model.dto.*; | |||
import com.ningdatech.pmapi.expert.service.ExpertInfoService; | |||
import com.ningdatech.pmapi.expert.service.IExpertAvoidCompanyService; | |||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||
import com.ningdatech.pmapi.meta.model.entity.ExpertDictionary; | |||
import com.ningdatech.pmapi.meta.model.entity.ExpertTag; | |||
import com.ningdatech.pmapi.meta.service.IExpertDictionaryService; | |||
import com.ningdatech.pmapi.meta.service.IExpertTagService; | |||
import lombok.RequiredArgsConstructor; | |||
import org.apache.commons.collections4.CollectionUtils; | |||
import org.springframework.stereotype.Component; | |||
import org.springframework.transaction.annotation.Transactional; | |||
import java.time.LocalDateTime; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Objects; | |||
import java.util.stream.Collectors; | |||
/** | |||
* @author liuxinxin | |||
* @date 2022/7/22 下午4:39 | |||
*/ | |||
@Component | |||
@RequiredArgsConstructor | |||
public class ExpertInfoServiceImpl implements ExpertInfoService { | |||
private final IExpertUserFullInfoService iExpertUserFullInfoService; | |||
private final IExpertTagService iExpertTagService; | |||
private final IExpertDictionaryService iExpertDictionaryService; | |||
private final IExpertAvoidCompanyService iExpertAvoidCompanyService; | |||
/** | |||
* 用户第一次申请修改,仅在专家用户状态为applying 状态时调用 | |||
* | |||
* @param cmd | |||
*/ | |||
@Override | |||
@Transactional(rollbackFor = Exception.class) | |||
public void saveExpertInfo(ExpertFullInfoSaveCmd cmd) { | |||
Long userId = cmd.getUserId(); | |||
List<ExpertAvoidCompanyDTO> expertAvoidCompanyList = cmd.getExpertAvoidCompanyList(); | |||
List<ExpertDictionaryDTO> expertDictionaryList = cmd.getExpertDictionaryList(); | |||
List<ExpertRegionDTO> expertIntentionWorkRegionInfoList = cmd.getExpertIntentionWorkRegionInfo(); | |||
List<ExpertTagDTO> expertTagList = cmd.getExpertTagList(); | |||
ExpertUserFullInfoDTO expertUserInfoDTO = cmd.getExpertUserInfoDTO(); | |||
ExpertUserFullInfo expertUserFullInfo = iExpertUserFullInfoService.getByUserId(userId); | |||
ExpertUserFullInfo saveExpertUserFullInfo = buildSaveExpertUserFullInfo(expertUserInfoDTO); | |||
if (Objects.nonNull(expertUserFullInfo)) { | |||
// 专家信息审核通过之前,所有信息无需备份 | |||
iExpertUserFullInfoService.removeById(expertUserFullInfo.getId()); | |||
// 删除所有专家标签字段 | |||
LambdaQueryWrapper<ExpertTag> expertTagRemove = Wrappers.lambdaQuery(ExpertTag.class) | |||
.eq(ExpertTag::getUserId, userId); | |||
iExpertTagService.remove(expertTagRemove); | |||
// 删除所有专家字典字段 | |||
LambdaQueryWrapper<ExpertDictionary> expertDictionaryRemove = Wrappers.lambdaQuery(ExpertDictionary.class) | |||
.eq(ExpertDictionary::getUserId, userId); | |||
iExpertDictionaryService.remove(expertDictionaryRemove); | |||
// 删除所有专家履职意向申请 | |||
// TODO 补充审核逻辑 | |||
// LambdaQueryWrapper<ExpertMetaApply> expertMetaApplyRemove = Wrappers.lambdaQuery(ExpertMetaApply.class) | |||
// .eq(ExpertMetaApply::getUserId, userId) | |||
// .eq(ExpertMetaApply::getApplyType, ExpertApplyTypeEnum.EXPERT_INTENTION_JOIN.getKey()) | |||
// .eq(ExpertMetaApply::getDisplayEnable, BoolDisplayEnum.N.name()); | |||
// iExpertMetaApplyService.remove(expertMetaApplyRemove); | |||
// 删除回避单位 | |||
LambdaQueryWrapper<ExpertAvoidCompany> expertAvoidCompanyRemove = Wrappers.lambdaQuery(ExpertAvoidCompany.class) | |||
.eq(ExpertAvoidCompany::getUserId, userId); | |||
iExpertAvoidCompanyService.remove(expertAvoidCompanyRemove); | |||
} | |||
saveExpertUserFullInfo.setUserId(userId); | |||
saveExpertUserFullInfo.setExpertAccountStatus(ExpertAccountStatusEnum.APPLYING.getKey()); | |||
saveExpertUserFullInfo.setUserInfoStep(ExpertUserInfoStepEnum.BASIC_INFORMATION_SUBMITTED.getKey()); | |||
saveExpertUserFullInfo.setUpdateOn(LocalDateTime.now()); | |||
saveExpertUserFullInfo.setCreateOn(LocalDateTime.now()); | |||
iExpertUserFullInfoService.save(saveExpertUserFullInfo); | |||
// 保存所有专家标签字段 | |||
List<ExpertTag> saveExpertTagList = buildSaveExpertTagList(userId, expertTagList); | |||
if (CollectionUtils.isNotEmpty(saveExpertTagList)) { | |||
iExpertTagService.saveBatch(saveExpertTagList); | |||
} | |||
// 保存所有专家字典字段 | |||
List<ExpertDictionary> saveExpertDictionaryList = buildSaveExpertDictionaryList(userId, expertDictionaryList); | |||
if (CollectionUtils.isNotEmpty(saveExpertDictionaryList)) { | |||
iExpertDictionaryService.saveBatch(saveExpertDictionaryList); | |||
} | |||
// 保存所有专家履职意向申请 | |||
// TODO 补充审核逻辑 | |||
// List<ExpertMetaApply> saveExpertIntentionWorkRegionApplyList = buildSaveExpertIntentionWorkRegionApplyList(userId, expertIntentionWorkRegionInfoList); | |||
// if (CollectionUtils.isNotEmpty(saveExpertDictionaryList)) { | |||
// iExpertMetaApplyService.saveBatch(saveExpertIntentionWorkRegionApplyList); | |||
// } | |||
// 保存所有专家回避单位 | |||
List<ExpertAvoidCompany> saveExpertAvoidCompanyList = buildSaveExpertAvoidCompanyList(userId, expertAvoidCompanyList); | |||
if (CollectionUtils.isNotEmpty(saveExpertAvoidCompanyList)) { | |||
iExpertAvoidCompanyService.saveBatch(saveExpertAvoidCompanyList); | |||
} | |||
} | |||
private ExpertUserFullInfo buildSaveExpertUserFullInfo(ExpertUserFullInfoDTO expertUserInfoDTO) { | |||
ExpertUserFullInfo expertUserFullInfo = new ExpertUserFullInfo(); | |||
if (Objects.nonNull(expertUserInfoDTO.getIsDingUser())) { | |||
expertUserFullInfo.setIsDingUser(expertUserInfoDTO.getIsDingUser() ? BoolDisplayEnum.Y.name() : BoolDisplayEnum.N.name()); | |||
} | |||
expertUserFullInfo.setPhoneNo(expertUserInfoDTO.getPhoneNo()); | |||
expertUserFullInfo.setGender(expertUserInfoDTO.getGender()); | |||
expertUserFullInfo.setExpertName(expertUserInfoDTO.getName()); | |||
expertUserFullInfo.setAvatarFileId(expertUserInfoDTO.getAvatarFileId()); | |||
expertUserFullInfo.setIdCard(expertUserInfoDTO.getIdCard()); | |||
expertUserFullInfo.setOfficePhone(expertUserInfoDTO.getOfficePhone()); | |||
expertUserFullInfo.setBirth(expertUserInfoDTO.getBirth()); | |||
expertUserFullInfo.setBankNo(expertUserInfoDTO.getBankNo()); | |||
expertUserFullInfo.setBank(expertUserInfoDTO.getBank()); | |||
expertUserFullInfo.setEmail(expertUserInfoDTO.getEmail()); | |||
expertUserFullInfo.setHometown(expertUserInfoDTO.getHometown()); | |||
expertUserFullInfo.setNationality(expertUserInfoDTO.getNationality()); | |||
expertUserFullInfo.setSchool(expertUserInfoDTO.getSchool()); | |||
expertUserFullInfo.setGraduatedAt(expertUserInfoDTO.getGraduatedAt()); | |||
expertUserFullInfo.setAcademicTitle(expertUserInfoDTO.getAcademicTitle()); | |||
if (CollectionUtils.isNotEmpty(expertUserInfoDTO.getGraduationCertificateFileIdList())) { | |||
expertUserFullInfo.setGraduationCertificateFileIdList(JSONObject.toJSONString(expertUserInfoDTO.getGraduationCertificateFileIdList())); | |||
} | |||
if (CollectionUtils.isNotEmpty(expertUserInfoDTO.getDegreeCertificateFileIdList())) { | |||
expertUserFullInfo.setDegreeCertificateFileIdList(JSONObject.toJSONString(expertUserInfoDTO.getDegreeCertificateFileIdList())); | |||
} | |||
expertUserFullInfo.setRetiredAt(expertUserInfoDTO.getRetiredAt()); | |||
expertUserFullInfo.setCompany(expertUserInfoDTO.getCompany()); | |||
expertUserFullInfo.setLegalEntityCode(expertUserInfoDTO.getLegalEntityCode()); | |||
expertUserFullInfo.setAdministrativeDuties(expertUserInfoDTO.getAdministrativeDuties()); | |||
expertUserFullInfo.setStartWorkAt(expertUserInfoDTO.getStartWorkAt()); | |||
expertUserFullInfo.setAddress(expertUserInfoDTO.getAddress()); | |||
expertUserFullInfo.setExperience(expertUserInfoDTO.getExperience()); | |||
expertUserFullInfo.setTechnicalTitles(expertUserInfoDTO.getTechnicalTitles()); | |||
if (CollectionUtils.isNotEmpty(expertUserInfoDTO.getTitleCertificateFileIdList())) { | |||
expertUserFullInfo.setTitleCertificateFileIdList(JSONObject.toJSONString(expertUserInfoDTO.getTitleCertificateFileIdList())); | |||
} | |||
expertUserFullInfo.setAwards(expertUserInfoDTO.getAwards()); | |||
expertUserFullInfo.setRecognitionReward(expertUserInfoDTO.getRecognitionReward()); | |||
expertUserFullInfo.setRegionCode(expertUserInfoDTO.getRegionCode()); | |||
expertUserFullInfo.setRegionLevel(expertUserInfoDTO.getRegionLevel()); | |||
if (CollectionUtils.isNotEmpty(expertUserInfoDTO.getRecommendationProofFileIdList())) { | |||
expertUserFullInfo.setRecommendationProofFileIdList(JSONObject.toJSONString(expertUserInfoDTO.getRecommendationProofFileIdList())); | |||
} | |||
expertUserFullInfo.setRemark(expertUserInfoDTO.getRemark()); | |||
return expertUserFullInfo; | |||
} | |||
private List<ExpertTag> buildSaveExpertTagList(Long userId, List<ExpertTagDTO> expertTagList) { | |||
if (CollectionUtils.isEmpty(expertTagList)) { | |||
return new ArrayList<>(); | |||
} | |||
return expertTagList.stream().map(r -> { | |||
ExpertTag expertTag = new ExpertTag(); | |||
expertTag.setExpertInfoField(r.getExpertInfoField()); | |||
expertTag.setTagCode(r.getTagCode()); | |||
expertTag.setCreateOn(LocalDateTime.now()); | |||
expertTag.setUpdateOn(LocalDateTime.now()); | |||
expertTag.setUserId(userId); | |||
return expertTag; | |||
}).collect(Collectors.toList()); | |||
} | |||
private List<ExpertDictionary> buildSaveExpertDictionaryList(Long userId, List<ExpertDictionaryDTO> expertDictionaryList) { | |||
if (CollectionUtils.isEmpty(expertDictionaryList)) { | |||
return new ArrayList<>(); | |||
} | |||
return expertDictionaryList.stream().map(r -> { | |||
ExpertDictionary expertDictionary = new ExpertDictionary(); | |||
expertDictionary.setUserId(userId); | |||
expertDictionary.setExpertInfoField(r.getExpertInfoField()); | |||
expertDictionary.setDictionaryCode(r.getDictionaryCode()); | |||
expertDictionary.setUpdateOn(LocalDateTime.now()); | |||
expertDictionary.setCreateOn(LocalDateTime.now()); | |||
return expertDictionary; | |||
}).collect(Collectors.toList()); | |||
} | |||
private List<ExpertAvoidCompany> buildSaveExpertAvoidCompanyList(Long userId, List<ExpertAvoidCompanyDTO> expertAvoidCompanyList) { | |||
if (CollectionUtils.isEmpty(expertAvoidCompanyList)) { | |||
return new ArrayList<>(); | |||
} | |||
return expertAvoidCompanyList.stream().map(r -> { | |||
ExpertAvoidCompany expertAvoidCompany = new ExpertAvoidCompany(); | |||
expertAvoidCompany.setCompanyName(r.getCompanyName()); | |||
expertAvoidCompany.setUserId(userId); | |||
expertAvoidCompany.setCompanyUniqCode(r.getCompanyUniqCode()); | |||
expertAvoidCompany.setCreateOn(LocalDateTime.now()); | |||
expertAvoidCompany.setUpdateOn(LocalDateTime.now()); | |||
return expertAvoidCompany; | |||
}).collect(Collectors.toList()); | |||
} | |||
} |
@@ -1,11 +1,17 @@ | |||
package com.ningdatech.pmapi.expert.service.impl; | |||
import cn.hutool.core.collection.CollUtil; | |||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||
import com.ningdatech.pmapi.expert.mapper.NdExpertUserFullInfoMapper; | |||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||
import org.springframework.stereotype.Service; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* 服务实现类 | |||
@@ -17,4 +23,9 @@ import org.springframework.stereotype.Service; | |||
@Service | |||
public class ExpertUserFullInfoServiceImpl extends ServiceImpl<NdExpertUserFullInfoMapper, ExpertUserFullInfo> implements IExpertUserFullInfoService { | |||
@Override | |||
public ExpertUserFullInfo getByUserId(Long userId) { | |||
return getOne(Wrappers.<ExpertUserFullInfo>lambdaQuery().eq(ExpertUserFullInfo::getUserId, userId)); | |||
} | |||
} |