@@ -46,7 +46,7 @@ public class GeneratorCodeKingbaseConfig { | |||||
path + "/com/ningdatech/pmapi/" + packageName + "/mapper")); | path + "/com/ningdatech/pmapi/" + packageName + "/mapper")); | ||||
}) | }) | ||||
.strategyConfig(builder -> { | .strategyConfig(builder -> { | ||||
builder.addTablePrefix("wflow"); | |||||
builder.addTablePrefix(""); | |||||
// 设置需要生成的表名 | // 设置需要生成的表名 | ||||
builder.addInclude(tableNames); | builder.addInclude(tableNames); | ||||
}) | }) | ||||
@@ -56,7 +56,11 @@ public class GeneratorCodeKingbaseConfig { | |||||
} | } | ||||
public static void main(String[] args) { | public static void main(String[] args) { | ||||
<<<<<<< HEAD | |||||
generate("Liuxinxin", "expert", PATH_LXX, "expert_avoid_company"); | generate("Liuxinxin", "expert", PATH_LXX, "expert_avoid_company"); | ||||
======= | |||||
generate("Liuxinxin", "expert", PATH_LXX, "expert_meta_apply"); | |||||
>>>>>>> 3fc1952d747d914fc53e00cda93621feed6be50f | |||||
} | } | ||||
} | } |
@@ -0,0 +1,19 @@ | |||||
package com.ningdatech.pmapi.common.config; | |||||
import lombok.Data; | |||||
import org.springframework.boot.context.properties.ConfigurationProperties; | |||||
import org.springframework.context.annotation.Configuration; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/9/9 下午5:37 | |||||
*/ | |||||
@Data | |||||
@Configuration | |||||
@ConfigurationProperties(prefix = "organization") | |||||
public class DingOrganizationProperties { | |||||
private List<String> deptVisibleScopes = new ArrayList<>(); | |||||
} |
@@ -0,0 +1,35 @@ | |||||
package com.ningdatech.pmapi.common.constant; | |||||
/** | |||||
* @description: 常量 | |||||
* @author: LiuXinXin | |||||
* @date: 2022/5/5 17:31 | |||||
*/ | |||||
public interface CommonConst { | |||||
String COOKIE_KEY = "ND_JSESSION"; | |||||
Integer EXPORT_PAGE_NUMBER = 1; | |||||
Integer EXPORT_PAGE_SIZE = 100000; | |||||
String CALL_STATUS = "status"; | |||||
String CALL_STATUS_OK_VALUE = "ok"; | |||||
Integer COMMENT_MAX_SIZE = 163; | |||||
Integer SUB_COMMENT_SIZE_MIN = 0; | |||||
Integer SUB_COMMENT_SIZE_MAX = 160; | |||||
String PROJECT_DECLARE = "项目申报"; | |||||
String UNIT_INNER_AUDIT = "单位内部审核"; | |||||
String PRELIMINARY_PREVIEW = "项目预审"; | |||||
String DEPT_UNITED_REVIEW = "部门联审"; | |||||
String ANNUAL_PLAN = "年度计划"; | |||||
String CONSTRUCTION_PLAN_REVIEW = "建设方案评审"; | |||||
String PROJECT_APPROVAL = "立项批复"; | |||||
String TENDER_PURCHASE = "招标采购"; | |||||
String PROJECT_PRELIMINARY_INSPECTION = "项目初验"; | |||||
String PROJECT_FINAL_INSPECTION = "项目终验"; | |||||
String ARCHIVED = "归档"; | |||||
} |
@@ -1,36 +0,0 @@ | |||||
package com.ningdatech.pmapi.common.constant; | |||||
/** | |||||
* @description: 常量 | |||||
* @author: LiuXinXin | |||||
* @date: 2022/5/5 17:31 | |||||
*/ | |||||
public class CommonConstant { | |||||
public static final String COOKIE_KEY = "ND_JSESSION"; | |||||
public static final Integer EXPORT_PAGE_NUMBER = 1; | |||||
public static final Integer EXPORT_PAGE_SIZE = 100000; | |||||
public static final String CALL_STATUS = "status"; | |||||
public static final String CALL_STATUS_OK_VALUE = "ok"; | |||||
public static final Integer COMMENT_MAX_SIZE = 163; | |||||
public static final Integer SUB_COMMENT_SIZE_MIN = 0; | |||||
public static final Integer SUB_COMMENT_SIZE_MAX = 160; | |||||
public static final String PROJECT_DECLARE = "项目申报"; | |||||
public static final String UNIT_INNER_AUDIT = "单位内部审核"; | |||||
public static final String PRELIMINARY_PREVIEW = "项目预审"; | |||||
public static final String DEPT_UNITED_REVIEW = "部门联审"; | |||||
public static final String ANNUAL_PLAN = "年度计划"; | |||||
public static final String CONSTRUCTION_PLAN_REVIEW = "建设方案评审"; | |||||
public static final String PROJECT_APPROVAL = "立项批复"; | |||||
public static final String TENDER_PURCHASE = "招标采购"; | |||||
public static final String PROJECT_PRELIMINARY_INSPECTION = "项目初验"; | |||||
public static final String PROJECT_FINAL_INSPECTION = "项目终验"; | |||||
public static final String ARCHIVED = "归档"; | |||||
} |
@@ -8,7 +8,7 @@ import com.ningdatech.basic.util.StrPool; | |||||
* | * | ||||
* @author PoffyZhang | * @author PoffyZhang | ||||
*/ | */ | ||||
public interface DefValConstants { | |||||
public interface DefValConst { | |||||
/** | /** | ||||
* 默认的根节点path | * 默认的根节点path | ||||
@@ -30,28 +30,5 @@ public interface DefValConstants { | |||||
* 字典占位符 | * 字典占位符 | ||||
*/ | */ | ||||
String DICT_PLACEHOLDER = "###"; | String DICT_PLACEHOLDER = "###"; | ||||
/** | |||||
* 浙江省的region_id | |||||
*/ | |||||
Long ZJREGION_ID = 116L; | |||||
/** | |||||
* 城市 level | |||||
*/ | |||||
Integer CITY_REGION_LEVEL = 2; | |||||
/** | |||||
* 区的 level | |||||
*/ | |||||
Integer QU_REGION_LEVEL = 3; | |||||
/** | |||||
* 驾驶员异常数据GPS字符串起始偏移量 | |||||
*/ | |||||
Integer GPS_START_OFFSET = 5; | |||||
/** | |||||
* 驾驶员异常数据GPS字符串结尾偏移量 | |||||
*/ | |||||
Integer GPS_END_OFFSET = 69; | |||||
} | } |
@@ -6,7 +6,7 @@ package com.ningdatech.pmapi.common.constant; | |||||
* @author CMM | * @author CMM | ||||
* @since 2023/02/01 14:49 | * @since 2023/02/01 14:49 | ||||
*/ | */ | ||||
public interface DingConstant { | |||||
public interface DingConst { | |||||
/** | /** | ||||
* 工作通知 | * 工作通知 | ||||
*/ | */ |
@@ -1,7 +1,5 @@ | |||||
package com.ningdatech.pmapi.common.constant; | package com.ningdatech.pmapi.common.constant; | ||||
import io.swagger.models.auth.In; | |||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
/** | /** | ||||
@@ -10,7 +8,7 @@ import java.math.BigDecimal; | |||||
* @author CMM | * @author CMM | ||||
* @since 2023/01/19 10:31 | * @since 2023/01/19 10:31 | ||||
*/ | */ | ||||
public interface ProjectDeclareConstants { | |||||
public interface ProjectDeclareConst { | |||||
/** | /** | ||||
* 基本信息 | * 基本信息 |
@@ -0,0 +1,19 @@ | |||||
package com.ningdatech.pmapi.common.constant; | |||||
/** | |||||
* <p> | |||||
* RegionLevelConst | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 13:57 2023/3/1 | |||||
*/ | |||||
public interface RegionLevelConst { | |||||
int PROVINCE = 1; | |||||
int CITY = 2; | |||||
int COUNTY = 3; | |||||
} |
@@ -5,7 +5,7 @@ package com.ningdatech.pmapi.common.constant; | |||||
* @since 2023/02/07 16:24 | * @since 2023/02/07 16:24 | ||||
*/ | */ | ||||
public class StateMachineConstants { | |||||
public class StateMachineConst { | |||||
public static final String PROJECT_DECLARE = "projectDeclare"; | public static final String PROJECT_DECLARE = "projectDeclare"; | ||||
public static final String LI_SHUI_CITY_AREA_CODE = "331100"; | public static final String LI_SHUI_CITY_AREA_CODE = "331100"; |
@@ -1,4 +1,4 @@ | |||||
package com.ningdatech.pmapi.common.constant; | |||||
package com.ningdatech.pmapi.common.enumeration; | |||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import lombok.Getter; | import lombok.Getter; |
@@ -0,0 +1,111 @@ | |||||
package com.ningdatech.pmapi.common.helper; | |||||
import com.ningdatech.pmapi.sys.model.dto.RegionDTO; | |||||
import com.ningdatech.pmapi.sys.model.dto.RegionTreeDTO; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
/** | |||||
* <p> | |||||
* RegionCacheHelper - | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 13:50 2023/3/1 | |||||
*/ | |||||
public interface RegionCacheHelper { | |||||
/** | |||||
* 获取完整的区域树状结构 | |||||
* | |||||
* @return / | |||||
*/ | |||||
List<RegionTreeDTO> all(); | |||||
/** | |||||
* 获取用于前端回显示使用的unionList 仅用于返回前端的时候使用 | |||||
* | |||||
* @param code 区域编码 | |||||
* @param level 区域层级 | |||||
* @return | |||||
*/ | |||||
String getUnionPathStr(String code, Integer level); | |||||
/** | |||||
* 原专家库数据导入使用 返回名称区域Map | |||||
* | |||||
* @return | |||||
*/ | |||||
Map<String, RegionDTO> getNameRegionMap(); | |||||
/** | |||||
* key.getRegionCode() + "###" + key.getRegionLevel() ,regionMap.get(key) | |||||
* | |||||
* @return | |||||
*/ | |||||
Map<String, RegionDTO> getRegionMap(); | |||||
/** | |||||
* 获取市级区域列表 | |||||
* | |||||
* @return | |||||
*/ | |||||
List<RegionDTO> getMunicipalRegion(); | |||||
/** | |||||
* 获取省级区域列表 | |||||
* | |||||
* @return / | |||||
*/ | |||||
List<RegionDTO> getProvincialRegion(); | |||||
/** | |||||
* 根据区域code 区域层级获取 区域类 | |||||
* | |||||
* @param code 区域编码 | |||||
* @param level 区域层级 | |||||
* @return / | |||||
*/ | |||||
RegionDTO getByCodeAndLevel(String code, int level); | |||||
/** | |||||
* 根据传入的地区code与level获取所有上层地区集合 | |||||
* 按照level升序排列 | |||||
* | |||||
* @param code 地区编码 | |||||
* @param level 地区层级 | |||||
* @return / | |||||
*/ | |||||
List<RegionDTO> listParents(String code, int level); | |||||
/** | |||||
* 获取所有区域编码「parent -> child」 | |||||
* | |||||
* @param regionCode 区域编码 | |||||
* @param regionLevel 级别 | |||||
* @return / | |||||
*/ | |||||
List<String> getRegionCodes(String regionCode, int regionLevel); | |||||
/** | |||||
* 获取当前区域所有的子集 | |||||
* | |||||
* @param code 区域编码 | |||||
* @param level 级别 | |||||
* @return / | |||||
*/ | |||||
List<String> getAllChildrenRegionCodeList(String code, int level); | |||||
/** | |||||
* 获取 根节点 区域层级编码 | |||||
* | |||||
* @return / | |||||
*/ | |||||
String getParentCodeRoot(); | |||||
} |
@@ -0,0 +1,59 @@ | |||||
package com.ningdatech.pmapi.common.helper; | |||||
import com.ningdatech.pmapi.meta.model.bo.RegionContainsBO; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/12/21 下午5:37 | |||||
* 区域限制帮助类 | |||||
*/ | |||||
public interface RegionLimitHelper { | |||||
/** | |||||
* 管理员 是否包含 专家层级校验 | |||||
* | |||||
* @param expertUserId / | |||||
* @param expertAdminUserId / | |||||
* @return / | |||||
*/ | |||||
Boolean regionContainsCheck(Long expertUserId, Long expertAdminUserId); | |||||
/** | |||||
* 校验层级包含关系 | |||||
* | |||||
* @param regionContainsBOList / | |||||
* @param regionCode / | |||||
* @param regionLevel / | |||||
* @return / | |||||
*/ | |||||
Boolean regionContains(List<RegionContainsBO> regionContainsBOList, String regionCode, Integer regionLevel); | |||||
/** | |||||
* 查询操作 包含区域包含列表装配 | |||||
* | |||||
* @param queryRegionContainBo 查询区域范围列表 | |||||
* @param expertAdminContainsRegionList 专家管理员可管理的区域范围列表 | |||||
* @return / | |||||
*/ | |||||
List<RegionContainsBO> queryContainsRegionAssembler(RegionContainsBO queryRegionContainBo, List<RegionContainsBO> expertAdminContainsRegionList); | |||||
/** | |||||
* 根据 区域层级-区域编码 获取区域包含列表 | |||||
* | |||||
* @param regionLevel 区域层级 | |||||
* @param regionCode 区域编码 | |||||
* @return / | |||||
*/ | |||||
RegionContainsBO getContainsRegionBo(Integer regionLevel, String regionCode); | |||||
/** | |||||
* 根据专家管理员用户id 获取专家管理员管辖区域列表 | |||||
* | |||||
* @param expertAdminUserId 专家管理员用户id | |||||
* @return / | |||||
*/ | |||||
List<RegionContainsBO> getExpertAdminContainsRegion(Long expertAdminUserId); | |||||
} |
@@ -22,4 +22,6 @@ public interface UserInfoHelper { | |||||
UserFullInfoDTO getUserFullInfo(Long userId); | UserFullInfoDTO getUserFullInfo(Long userId); | ||||
String getUserName(Long userId); | |||||
} | } |
@@ -0,0 +1,138 @@ | |||||
package com.ningdatech.pmapi.common.helper.basic; | |||||
import com.github.benmanes.caffeine.cache.Caffeine; | |||||
import com.github.benmanes.caffeine.cache.LoadingCache; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | |||||
import com.ningdatech.pmapi.common.model.RegionMapKey; | |||||
import com.ningdatech.pmapi.sys.convert.RegionConverter; | |||||
import com.ningdatech.pmapi.sys.model.dto.RegionDTO; | |||||
import com.ningdatech.pmapi.sys.model.dto.RegionTreeDTO; | |||||
import com.ningdatech.pmapi.sys.service.IRegionService; | |||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.springframework.beans.factory.InitializingBean; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import java.util.*; | |||||
import java.util.concurrent.ConcurrentHashMap; | |||||
import java.util.concurrent.TimeUnit; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* <p> | |||||
* AbstractRegionCache | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:41 2023/3/1 | |||||
*/ | |||||
public abstract class AbstractRegionCache implements InitializingBean, RegionCacheHelper { | |||||
@Autowired | |||||
private IRegionService regionService; | |||||
/** | |||||
* 当前支持最大层级 | |||||
*/ | |||||
private static final int REGION_LEVEL_MAX = 3; | |||||
private LoadingCache<String, List<RegionTreeDTO>> regionsCache; | |||||
/** | |||||
* 中国行政区划编码 | |||||
*/ | |||||
private static final String PARENT_CODE_ROOT = "100000"; | |||||
protected Map<RegionMapKey, RegionDTO> regionMap; | |||||
@Override | |||||
public void afterPropertiesSet() { | |||||
regionsCache = Caffeine.newBuilder() | |||||
.expireAfterWrite(10, TimeUnit.MINUTES) | |||||
.refreshAfterWrite(5, TimeUnit.MINUTES) | |||||
.build(key -> { | |||||
// 查询全部 | |||||
List<RegionDTO> regionDTOList = regionService.all(); | |||||
if (regionDTOList.isEmpty()) { | |||||
throw BizException.wrap("区域元数据不能为空"); | |||||
} | |||||
regionMap = buildCacheMap(regionDTOList); | |||||
List<RegionDTO> regionInLevel = regionMap.values().stream() | |||||
.filter(regionDTO -> { | |||||
// 只过滤出小于等于level的region | |||||
if (Objects.isNull(regionDTO.getRegionLevel())) { | |||||
return false; | |||||
} | |||||
return Integer.parseInt(key) >= regionDTO.getRegionLevel(); | |||||
}).collect(Collectors.toList()); | |||||
List<RegionTreeDTO> treeDtos = RegionConverter.toRegionTreeDTOList(regionInLevel); | |||||
return toTreeStructure(treeDtos); | |||||
}); | |||||
warmUp(); | |||||
} | |||||
protected List<RegionTreeDTO> getByLevel(int level) { | |||||
return regionsCache.get(String.valueOf(level)); | |||||
} | |||||
private Map<RegionMapKey, RegionDTO> buildCacheMap(List<RegionDTO> regionDTOList) { | |||||
Map<RegionMapKey, RegionDTO> regionDtoMap = new ConcurrentHashMap<>(256); | |||||
regionDTOList.forEach(region -> { | |||||
RegionMapKey key = RegionMapKey.builder() | |||||
.regionCode(region.getRegionCode()) | |||||
.regionLevel(region.getRegionLevel()) | |||||
.build(); | |||||
regionDtoMap.put(key, region); | |||||
}); | |||||
return regionDtoMap; | |||||
} | |||||
private List<RegionTreeDTO> toTreeStructure(List<RegionTreeDTO> rootList) { | |||||
List<RegionTreeDTO> nodeList = new ArrayList<>(); | |||||
for (RegionTreeDTO treeNode : rootList) { | |||||
if (PARENT_CODE_ROOT.equals(treeNode.getParentCode()) || Objects.isNull(treeNode.getParentCode())) { | |||||
nodeList.add(treeNode); | |||||
} | |||||
treeNode.setChildren(getChildren(treeNode.getRegionCode(), treeNode.getLevel(), rootList)); | |||||
} | |||||
return nodeList; | |||||
} | |||||
private List<RegionTreeDTO> getChildren(String regionCode, int regionLevel, List<RegionTreeDTO> list) { | |||||
List<RegionTreeDTO> childList = new ArrayList<>(); | |||||
for (RegionTreeDTO regionTreeDTO : list) { | |||||
if (regionCode.equals(regionTreeDTO.getParentCode()) && regionLevel + 1 == regionTreeDTO.getLevel()) { | |||||
childList.add(regionTreeDTO); | |||||
} | |||||
} | |||||
for (RegionTreeDTO regionTreeDTO : childList) { | |||||
regionTreeDTO.setChildren(getChildren(regionTreeDTO.getRegionCode(), regionTreeDTO.getLevel(), list)); | |||||
} | |||||
if (CollectionUtils.isEmpty(childList)) { | |||||
return Collections.emptyList(); | |||||
} | |||||
childList.sort(Comparator.comparing(RegionTreeDTO::getRegionCode)); | |||||
return childList; | |||||
} | |||||
private void warmUp() { | |||||
for (int level = 1; level <= REGION_LEVEL_MAX; level++) { | |||||
getByLevel(level); | |||||
} | |||||
} | |||||
protected List<RegionTreeDTO> getCopyListByLevel(int level) { | |||||
List<RegionTreeDTO> regionTreeDtos = regionsCache.get(String.valueOf(level)); | |||||
List<RegionTreeDTO> copyRegionTreeDtos = new ArrayList<>(); | |||||
if (CollectionUtils.isNotEmpty(regionTreeDtos)) { | |||||
copyRegionTreeDtos.addAll(regionTreeDtos); | |||||
} | |||||
return copyRegionTreeDtos; | |||||
} | |||||
@Override | |||||
public String getParentCodeRoot() { | |||||
return PARENT_CODE_ROOT; | |||||
} | |||||
} |
@@ -0,0 +1,44 @@ | |||||
package com.ningdatech.pmapi.common.helper.basic; | |||||
import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | |||||
import com.ningdatech.pmapi.common.helper.RegionLimitHelper; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||||
import lombok.AllArgsConstructor; | |||||
import java.util.Objects; | |||||
/** | |||||
* <p> | |||||
* AbstractRegionLimitHelper | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:35 2023/3/1 | |||||
*/ | |||||
@AllArgsConstructor | |||||
public abstract class AbstractRegionLimitHelper implements RegionLimitHelper { | |||||
protected final RegionCacheHelper regionCacheHelper; | |||||
protected final IExpertUserFullInfoService expertUserFullInfoService; | |||||
/** | |||||
* 根据 专家用户id 获取专家层级 | |||||
* | |||||
* @param expertUserId / | |||||
* @return / | |||||
*/ | |||||
protected ExpertRegionInfo getExpertRegionInfo(Long expertUserId) { | |||||
ExpertUserFullInfo userFullInfo = expertUserFullInfoService.getByUserId(expertUserId); | |||||
if (Objects.isNull(userFullInfo)) { | |||||
return new ExpertRegionInfo(); | |||||
} | |||||
ExpertRegionInfo regionInfo = new ExpertRegionInfo(); | |||||
regionInfo.setRegionCode(userFullInfo.getRegionCode()); | |||||
regionInfo.setRegionLevel(userFullInfo.getRegionLevel()); | |||||
return regionInfo; | |||||
} | |||||
} |
@@ -0,0 +1,122 @@ | |||||
package com.ningdatech.pmapi.common.helper.impl; | |||||
import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | |||||
import com.ningdatech.pmapi.common.helper.basic.AbstractRegionLimitHelper; | |||||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||||
import com.ningdatech.pmapi.meta.model.bo.RegionContainsBO; | |||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/1 下午2:27 | |||||
*/ | |||||
@Component | |||||
public class RegionLimitHelperImpl extends AbstractRegionLimitHelper { | |||||
private static final Logger logger = LoggerFactory.getLogger(RegionLimitHelperImpl.class); | |||||
public RegionLimitHelperImpl(RegionCacheHelper regionCacheHelper, IExpertUserFullInfoService expertUserFullInfoService) { | |||||
super(regionCacheHelper, expertUserFullInfoService); | |||||
} | |||||
public static Boolean contains(Integer adminRegionLevel, List<String> adminAllContainsRegionCodes | |||||
, Integer expertRegionLevel, String expertRegionCode) { | |||||
for (String adminAllContainsRegionCode : adminAllContainsRegionCodes) { | |||||
if (adminAllContainsRegionCode.equals(expertRegionCode) && adminRegionLevel >= expertRegionLevel) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
@Override | |||||
public Boolean regionContainsCheck(Long expertUserId, Long expertAdminUserId) { | |||||
List<RegionContainsBO> expertAdminContainsRegion = getExpertAdminContainsRegion(expertAdminUserId); | |||||
ExpertRegionInfo expertRegionInfo = getExpertRegionInfo(expertUserId); | |||||
return regionContains(expertAdminContainsRegion, expertRegionInfo.getRegionCode(), expertRegionInfo.getRegionLevel()); | |||||
} | |||||
@Override | |||||
public Boolean regionContains(List<RegionContainsBO> regionContainsBOList, String regionCode, Integer regionLevel) { | |||||
for (RegionContainsBO regionContainsBO : regionContainsBOList) { | |||||
Integer parentRegionTreeLevel = regionContainsBO.getParentRegionTreeLevel(); | |||||
List<String> containsRegionCodeList = regionContainsBO.getContainsRegionCodeList(); | |||||
for (String containsRegionCode : containsRegionCodeList) { | |||||
if (containsRegionCode.equals(regionCode) && parentRegionTreeLevel <= regionLevel) { | |||||
return true; | |||||
} | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
@Override | |||||
public List<RegionContainsBO> queryContainsRegionAssembler(RegionContainsBO queryRegionContainBo, List<RegionContainsBO> expertAdminContainsRegionList) { | |||||
List<RegionContainsBO> resultBoList = new ArrayList<>(); | |||||
if (Objects.nonNull(queryRegionContainBo)) { | |||||
resultBoList.add(queryRegionContainBo); | |||||
Integer parentRegionTreeLevel = queryRegionContainBo.getParentRegionTreeLevel(); | |||||
List<String> containsRegionCodeList = queryRegionContainBo.getContainsRegionCodeList(); | |||||
// 查询取并级 | |||||
if (CollectionUtils.isNotEmpty(expertAdminContainsRegionList)) { | |||||
for (RegionContainsBO regionContainsBO : expertAdminContainsRegionList) { | |||||
regionContainsBO.setParentRegionTreeLevel(parentRegionTreeLevel); | |||||
List<String> regionCodeList = regionContainsBO.getContainsRegionCodeList(); | |||||
regionCodeList = regionCodeList.stream().filter(containsRegionCodeList::contains).collect(Collectors.toList()); | |||||
if (CollectionUtils.isNotEmpty(regionCodeList)) { | |||||
regionContainsBO.setContainsRegionCodeList(regionCodeList); | |||||
resultBoList.add(regionContainsBO); | |||||
} | |||||
} | |||||
} | |||||
return resultBoList; | |||||
} else { | |||||
return expertAdminContainsRegionList; | |||||
} | |||||
} | |||||
@Override | |||||
public RegionContainsBO getContainsRegionBo(Integer regionLevel, String regionCode) { | |||||
List<String> regionCodes = regionCacheHelper | |||||
.getAllChildrenRegionCodeList(regionCode, regionLevel); | |||||
RegionContainsBO regionContainsBO = new RegionContainsBO(); | |||||
regionContainsBO.setContainsRegionCodeList(regionCodes); | |||||
regionContainsBO.setParentRegionTreeLevel(regionLevel); | |||||
return regionContainsBO; | |||||
} | |||||
@Override | |||||
public List<RegionContainsBO> getExpertAdminContainsRegion(Long expertAdminUserId) { | |||||
if (Objects.isNull(expertAdminUserId)) { | |||||
logger.error("getExpertAdminContainsRegion expertAdminUserId is null"); | |||||
return new ArrayList<>(); | |||||
} | |||||
// TODO | |||||
/*LambdaQueryWrapper<ExpertAdminRegion> expertAdminRegionEq = Wrappers.lambdaQuery(ExpertAdminRegion.class) | |||||
.eq(ExpertAdminRegion::getUserId, expertAdminUserId); | |||||
List<ExpertAdminRegion> expertAdminRegionList = iExpertAdminRegionService.list(expertAdminRegionEq); | |||||
List<RegionContainsBO> regionContainsBOList = new ArrayList<>(); | |||||
for (ExpertAdminRegion expertAdminRegion : expertAdminRegionList) { | |||||
List<String> regionCodes = regionCacheHelper | |||||
.getAllChildrenRegionCodeList(expertAdminRegion.getRegionCode(), expertAdminRegion.getRegionLevel()); | |||||
RegionContainsBO regionContainsBO = new RegionContainsBO(); | |||||
regionContainsBO.setContainsRegionCodeList(regionCodes); | |||||
regionContainsBO.setParentRegionTreeLevel(expertAdminRegion.getRegionLevel()); | |||||
regionContainsBOList.add(regionContainsBO); | |||||
}*/ | |||||
return null; | |||||
} | |||||
} |
@@ -0,0 +1,205 @@ | |||||
package com.ningdatech.pmapi.common.helper.impl; | |||||
import cn.hutool.core.lang.Assert; | |||||
import com.ningdatech.basic.util.CollUtils; | |||||
import com.ningdatech.pmapi.common.helper.basic.AbstractRegionCache; | |||||
import com.ningdatech.pmapi.common.model.RegionMapKey; | |||||
import com.ningdatech.pmapi.sys.model.dto.RegionDTO; | |||||
import com.ningdatech.pmapi.sys.model.dto.RegionTreeDTO; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.*; | |||||
import java.util.concurrent.ConcurrentHashMap; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/22 上午8:58 | |||||
* 构建地区码 地区树 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
public class RegionsCacheImpl extends AbstractRegionCache { | |||||
@Override | |||||
public List<RegionTreeDTO> all() { | |||||
return getByLevel(3); | |||||
} | |||||
@Override | |||||
public List<String> getAllChildrenRegionCodeList(String code, int level) { | |||||
List<RegionTreeDTO> regionTreeDTOList = all(); | |||||
Set<String> childrenRegionCodeSet = new HashSet<>(); | |||||
childrenRegionCodeSet.add(code); | |||||
RegionTreeDTO currentRegionTree = getCurrentRegionTree(code, level, regionTreeDTOList); | |||||
if (Objects.isNull(currentRegionTree)) { | |||||
List<String> childrenRegionCodeList = new ArrayList<>(); | |||||
childrenRegionCodeList.add(code); | |||||
return childrenRegionCodeList; | |||||
} | |||||
getAllChildrenRegionCodeList(currentRegionTree.getChildren(), childrenRegionCodeSet); | |||||
return new ArrayList<>(childrenRegionCodeSet); | |||||
} | |||||
private RegionTreeDTO getCurrentRegionTree(String code, int level, List<RegionTreeDTO> regionTreeDtos) { | |||||
for (RegionTreeDTO regionTreeDTO : regionTreeDtos) { | |||||
if (level == regionTreeDTO.getLevel() && code.equals(regionTreeDTO.getRegionCode())) { | |||||
return regionTreeDTO; | |||||
} | |||||
if (CollectionUtils.isNotEmpty(regionTreeDTO.getChildren())) { | |||||
return getCurrentRegionTree(code, level, regionTreeDTO.getChildren()); | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
private void getAllChildrenRegionCodeList(List<RegionTreeDTO> regionTreeDtos, Set<String> childrenRegionCodeSet) { | |||||
if (CollectionUtils.isEmpty(regionTreeDtos)) { | |||||
return; | |||||
} | |||||
for (RegionTreeDTO regionTreeDTO : regionTreeDtos) { | |||||
childrenRegionCodeSet.add(regionTreeDTO.getRegionCode()); | |||||
getAllChildrenRegionCodeList(regionTreeDTO.getChildren(), childrenRegionCodeSet); | |||||
} | |||||
} | |||||
@Override | |||||
public List<String> getRegionCodes(String regionCode, int regionLevel) { | |||||
RegionTreeDTO regionTreeNode = getTreeByRegionAndCode(null, regionCode, regionLevel); | |||||
Assert.notNull(regionTreeNode, "不存在此级别区域信息:{}", regionLevel); | |||||
List<String> regionCodes = new ArrayList<>(); | |||||
if (regionTreeNode != null) { | |||||
regionCodes.addAll(CollUtils.fieldList(treeToList(Collections.singletonList(regionTreeNode)), RegionTreeDTO::getRegionCode)); | |||||
} | |||||
if (!regionCodes.contains(regionCode)) { | |||||
regionCodes.add(regionCode); | |||||
} | |||||
return regionCodes; | |||||
} | |||||
protected List<RegionTreeDTO> treeToList(List<RegionTreeDTO> treeList) { | |||||
ArrayList<RegionTreeDTO> result = new ArrayList<>(); | |||||
treeList.forEach(w -> { | |||||
result.add(w); | |||||
if (CollectionUtils.isNotEmpty(w.getChildren())) { | |||||
result.addAll(treeToList(w.getChildren())); | |||||
} | |||||
}); | |||||
return result; | |||||
} | |||||
/** | |||||
* 获取某一个地区开始的层级树 | |||||
* | |||||
* @param list 地区集合 | |||||
* @param code 地区编码 | |||||
* @param level 地区层级 | |||||
* @return / | |||||
*/ | |||||
protected RegionTreeDTO getTreeByRegionAndCode(List<RegionTreeDTO> list, String code, int level) { | |||||
if (CollectionUtils.isEmpty(list)) { | |||||
list = super.getCopyListByLevel(3); | |||||
if (CollectionUtils.isEmpty(list)) { | |||||
return null; | |||||
} | |||||
} | |||||
Optional<RegionTreeDTO> first = list.stream() | |||||
.filter(w -> w.getRegionCode().equals(code) && w.getLevel() == level) | |||||
.findFirst(); | |||||
if (first.isPresent()) { | |||||
return first.get(); | |||||
} | |||||
for (RegionTreeDTO dto : list) { | |||||
if (CollectionUtils.isEmpty(dto.getChildren())) { | |||||
continue; | |||||
} | |||||
RegionTreeDTO temp = getTreeByRegionAndCode(dto.getChildren(), code, level); | |||||
if (temp != null) { | |||||
return temp; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
@Override | |||||
public List<RegionDTO> listParents(String code, int level) { | |||||
List<RegionDTO> result = new ArrayList<>(); | |||||
RegionDTO dto = regionMap.get(RegionMapKey.of(code, level)); | |||||
result.add(0, dto); | |||||
if (dto.getParentCode().equals(super.getParentCodeRoot())) { | |||||
return result; | |||||
} | |||||
result.addAll(0, listParents(dto.getParentCode(), dto.getRegionLevel() - 1)); | |||||
return result; | |||||
} | |||||
@Override | |||||
public RegionDTO getByCodeAndLevel(String code, int level) { | |||||
return regionMap.get(RegionMapKey.of(code, level)); | |||||
} | |||||
@Override | |||||
public List<RegionDTO> getProvincialRegion() { | |||||
List<RegionDTO> provincialRegionList = new ArrayList<>(); | |||||
regionMap.values().forEach(v -> { | |||||
if (v.getRegionCode().equals(v.getParentCode()) && v.getRegionLevel() == 2) { | |||||
provincialRegionList.add(v); | |||||
} | |||||
}); | |||||
return provincialRegionList; | |||||
} | |||||
@Override | |||||
public List<RegionDTO> getMunicipalRegion() { | |||||
List<RegionDTO> municipalRegionList = new ArrayList<>(); | |||||
regionMap.values().forEach(v -> { | |||||
if (v.getRegionCode().equals(v.getParentCode()) && v.getRegionLevel() == 3) { | |||||
municipalRegionList.add(v); | |||||
} | |||||
}); | |||||
return municipalRegionList; | |||||
} | |||||
@Override | |||||
public Map<String, RegionDTO> getRegionMap() { | |||||
Map<String, RegionDTO> regionDtoMap = new ConcurrentHashMap<>(512); | |||||
regionMap.forEach((k, v) -> regionDtoMap.put(k.getRegionCode() + "###" + k.getRegionLevel(), v)); | |||||
return regionDtoMap; | |||||
} | |||||
@Override | |||||
public Map<String, RegionDTO> getNameRegionMap() { | |||||
Map<String, RegionDTO> nameRegionDtoMap = new ConcurrentHashMap<>(512); | |||||
regionMap.forEach((k, v) -> nameRegionDtoMap.put(v.getRegionName(), v)); | |||||
return nameRegionDtoMap; | |||||
} | |||||
@Override | |||||
public String getUnionPathStr(String code, Integer level) { | |||||
if (StringUtils.isBlank(code) || Objects.isNull(level)) { | |||||
return null; | |||||
} | |||||
List<String> unionPathStrList = new ArrayList<>(); | |||||
buildUnionPathStrList(code, level, unionPathStrList); | |||||
Collections.reverse(unionPathStrList); | |||||
if (CollectionUtils.isEmpty(unionPathStrList)) { | |||||
return null; | |||||
} | |||||
return String.join("@@", unionPathStrList); | |||||
} | |||||
protected void buildUnionPathStrList(String code, Integer level, List<String> unionPathStrList) { | |||||
if (level <= 0 || super.getParentCodeRoot().equals(code)) { | |||||
return; | |||||
} | |||||
RegionDTO regionDTO = regionMap.get(RegionMapKey.of(code, level)); | |||||
unionPathStrList.add(regionDTO.getRegionCode() + "##" + regionDTO.getRegionName() + "##" + regionDTO.getRegionLevel()); | |||||
if (!super.getParentCodeRoot().equals(regionDTO.getParentCode())) { | |||||
buildUnionPathStrList(regionDTO.getParentCode(), level - 1, unionPathStrList); | |||||
} | |||||
} | |||||
} |
@@ -30,4 +30,11 @@ public class UserInfoHelperImpl implements UserInfoHelper { | |||||
UserFullInfoDTO userFullInfo = userAuthLoginManage.getUserFullInfo(userId); | UserFullInfoDTO userFullInfo = userAuthLoginManage.getUserFullInfo(userId); | ||||
return userFullInfo; | return userFullInfo; | ||||
} | } | ||||
@Override | |||||
public String getUserName(Long userId) { | |||||
UserFullInfoDTO userFullInfo = userAuthLoginManage.getUserFullInfo(userId); | |||||
String realName = userFullInfo.getRealName(); | |||||
return realName; | |||||
} | |||||
} | } |
@@ -0,0 +1,22 @@ | |||||
package com.ningdatech.pmapi.common.model; | |||||
import lombok.Data; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/4 上午11:19 | |||||
*/ | |||||
@Data | |||||
public class CommonPageReq { | |||||
private static final long serialVersionUID = 1L; | |||||
private int pageSize; | |||||
private int pageNumber; | |||||
public int getOffset() { | |||||
return (this.getPageNumber() - 1) * this.getPageSize(); | |||||
} | |||||
public int getLimit() { | |||||
return this.getPageSize(); | |||||
} | |||||
} |
@@ -0,0 +1,59 @@ | |||||
package com.ningdatech.pmapi.common.model; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import lombok.experimental.Tolerate; | |||||
import java.util.Objects; | |||||
/** | |||||
* <p> | |||||
* RegionMapKey | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 13:54 2023/3/1 | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
@AllArgsConstructor | |||||
public class RegionMapKey { | |||||
public static RegionMapKey of(String regionCode, int regionLevel) { | |||||
return new RegionMapKey(regionCode, regionLevel); | |||||
} | |||||
@Tolerate | |||||
public RegionMapKey() { | |||||
} | |||||
/** | |||||
* 区域码 | |||||
*/ | |||||
private String regionCode; | |||||
/** | |||||
* 地区级别 | |||||
*/ | |||||
private Integer regionLevel; | |||||
@Override | |||||
public boolean equals(Object o) { | |||||
if (this == o) { | |||||
return true; | |||||
} | |||||
if (o == null || getClass() != o.getClass()) { | |||||
return false; | |||||
} | |||||
RegionMapKey regionMapKey = (RegionMapKey) o; | |||||
return regionCode.equals(regionMapKey.getRegionCode()) && | |||||
regionLevel.equals(regionMapKey.getRegionLevel()); | |||||
} | |||||
@Override | |||||
public int hashCode() { | |||||
return Objects.hash(regionCode, regionLevel); | |||||
} | |||||
} |
@@ -1,6 +1,6 @@ | |||||
package com.ningdatech.pmapi.common.statemachine.action; | package com.ningdatech.pmapi.common.statemachine.action; | ||||
import com.ningdatech.pmapi.common.constant.StateMachineConstants; | |||||
import com.ningdatech.pmapi.common.constant.StateMachineConst; | |||||
import com.ningdatech.pmapi.common.statemachine.builder.ProjectDeclareStateMachineBuilder; | import com.ningdatech.pmapi.common.statemachine.builder.ProjectDeclareStateMachineBuilder; | ||||
import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils; | import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils; | ||||
import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; | import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; | ||||
@@ -23,7 +23,7 @@ import org.springframework.statemachine.annotation.WithStateMachine; | |||||
@WithStateMachine(id = ProjectDeclareStateMachineBuilder.MACHINEID_TO) | @WithStateMachine(id = ProjectDeclareStateMachineBuilder.MACHINEID_TO) | ||||
public class ProjectDeclareAction { | public class ProjectDeclareAction { | ||||
private static final String PROJECT_DECLARE = StateMachineConstants.PROJECT_DECLARE; | |||||
private static final String PROJECT_DECLARE = StateMachineConst.PROJECT_DECLARE; | |||||
@OnTransition(source = "UNDER_INTERNAL_AUDIT", target = "PENDING_PREQUALIFICATION") | @OnTransition(source = "UNDER_INTERNAL_AUDIT", target = "PENDING_PREQUALIFICATION") | ||||
public void UNDER_INTERNAL_PASS(Message<ProjectStatusChangeEvent> message) { | public void UNDER_INTERNAL_PASS(Message<ProjectStatusChangeEvent> message) { | ||||
@@ -1,6 +1,6 @@ | |||||
package com.ningdatech.pmapi.common.statemachine.action; | package com.ningdatech.pmapi.common.statemachine.action; | ||||
import com.ningdatech.pmapi.common.constant.StateMachineConstants; | |||||
import com.ningdatech.pmapi.common.constant.StateMachineConst; | |||||
import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils; | import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils; | ||||
import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; | import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; | ||||
import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; | import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; | ||||
@@ -18,7 +18,7 @@ import org.springframework.statemachine.action.Action; | |||||
@Slf4j | @Slf4j | ||||
public class ProjectDeclareChoiceAction implements Action<ProjectStatusEnum, ProjectStatusChangeEvent> { | public class ProjectDeclareChoiceAction implements Action<ProjectStatusEnum, ProjectStatusChangeEvent> { | ||||
private static final String PROJECT_DECLARE = StateMachineConstants.PROJECT_DECLARE; | |||||
private static final String PROJECT_DECLARE = StateMachineConst.PROJECT_DECLARE; | |||||
@Override | @Override | ||||
public void execute(StateContext<ProjectStatusEnum, ProjectStatusChangeEvent> stateContext) { | public void execute(StateContext<ProjectStatusEnum, ProjectStatusChangeEvent> stateContext) { | ||||
@@ -1,6 +1,6 @@ | |||||
package com.ningdatech.pmapi.common.statemachine.factory; | package com.ningdatech.pmapi.common.statemachine.factory; | ||||
import com.ningdatech.pmapi.common.constant.StateMachineConstants; | |||||
import com.ningdatech.pmapi.common.constant.StateMachineConst; | |||||
import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils; | import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils; | ||||
import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; | import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; | ||||
import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; | import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; | ||||
@@ -16,7 +16,7 @@ import org.springframework.statemachine.guard.Guard; | |||||
*/ | */ | ||||
public class ProjectDeclareGuardFactory { | public class ProjectDeclareGuardFactory { | ||||
private static final String PROJECT_DECLARE = StateMachineConstants.PROJECT_DECLARE; | |||||
private static final String PROJECT_DECLARE = StateMachineConst.PROJECT_DECLARE; | |||||
public class PendingPreQualificationChoiceGuard implements Guard<ProjectStatusEnum, ProjectStatusChangeEvent> { | public class PendingPreQualificationChoiceGuard implements Guard<ProjectStatusEnum, ProjectStatusChangeEvent> { | ||||
@Override | @Override | ||||
@@ -1,8 +1,8 @@ | |||||
package com.ningdatech.pmapi.common.statemachine.util; | package com.ningdatech.pmapi.common.statemachine.util; | ||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.pmapi.common.constant.ProjectDeclareConstants; | |||||
import com.ningdatech.pmapi.common.constant.StateMachineConstants; | |||||
import com.ningdatech.pmapi.common.constant.ProjectDeclareConst; | |||||
import com.ningdatech.pmapi.common.constant.StateMachineConst; | |||||
import com.ningdatech.pmapi.common.statemachine.builder.ProjectDeclareStateMachineBuilder; | import com.ningdatech.pmapi.common.statemachine.builder.ProjectDeclareStateMachineBuilder; | ||||
import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; | import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; | ||||
import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; | import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; | ||||
@@ -32,7 +32,7 @@ import java.util.Objects; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class StateMachineUtils { | public class StateMachineUtils { | ||||
private static final String PROJECT_DECLARE = StateMachineConstants.PROJECT_DECLARE; | |||||
private static final String PROJECT_DECLARE = StateMachineConst.PROJECT_DECLARE; | |||||
private final ProjectDeclareStateMachineBuilder projectDeclareStateMachineBuilder; | private final ProjectDeclareStateMachineBuilder projectDeclareStateMachineBuilder; | ||||
@@ -70,7 +70,7 @@ public class StateMachineUtils { | |||||
* @since 2023/02/07 17:13 | * @since 2023/02/07 17:13 | ||||
*/ | */ | ||||
public static boolean judgeDeclareAmount(Project project) { | public static boolean judgeDeclareAmount(Project project) { | ||||
int flag = project.getDeclareAmount().compareTo(ProjectDeclareConstants.Number.DECLARE_AMOUNT_JUDGEMENT); | |||||
int flag = project.getDeclareAmount().compareTo(ProjectDeclareConst.Number.DECLARE_AMOUNT_JUDGEMENT); | |||||
if (flag > 0 || flag == 0) { | if (flag > 0 || flag == 0) { | ||||
return true; | return true; | ||||
} | } | ||||
@@ -87,7 +87,7 @@ public class StateMachineUtils { | |||||
*/ | */ | ||||
public static boolean isCityProject(Project project) { | public static boolean isCityProject(Project project) { | ||||
String areaCode = project.getAreaCode(); | String areaCode = project.getAreaCode(); | ||||
if (areaCode.equals(StateMachineConstants.LI_SHUI_CITY_AREA_CODE)) { | |||||
if (areaCode.equals(StateMachineConst.LI_SHUI_CITY_AREA_CODE)) { | |||||
return true; | return true; | ||||
} | } | ||||
return false; | return false; | ||||
@@ -71,7 +71,6 @@ public class EmployeeBatchGetTask { | |||||
GenericResult<Page<OrganizationEmployeePosition>> firstPageGenericResult = zwddClient.pageOrganizationEmployeePositions(query); | GenericResult<Page<OrganizationEmployeePosition>> firstPageGenericResult = zwddClient.pageOrganizationEmployeePositions(query); | ||||
Page<OrganizationEmployeePosition> data = firstPageGenericResult.getData(); | Page<OrganizationEmployeePosition> data = firstPageGenericResult.getData(); | ||||
if (CollUtil.isNotEmpty(data.getData())) { | if (CollUtil.isNotEmpty(data.getData())) { | ||||
allOrganizationEmployeePositionList.addAll(data.getData()); | allOrganizationEmployeePositionList.addAll(data.getData()); | ||||
} | } | ||||
Long totalSize = data.getTotalSize(); | Long totalSize = data.getTotalSize(); | ||||
@@ -0,0 +1,475 @@ | |||||
package com.ningdatech.pmapi.expert.assembler; | |||||
//import com.ningdatech.emapi.common.enumeration.BoolDisplayEnum; | |||||
//import com.ningdatech.emapi.common.helper.RegionCache; | |||||
//import com.ningdatech.emapi.common.utils.JSONObject; | |||||
//import com.ningdatech.emapi.expert.constants.DictExpertInfoTypeEnum; | |||||
//import com.ningdatech.emapi.expert.constants.ExpertApplyTypeEnum; | |||||
//import com.ningdatech.emapi.expert.constants.ExpertTagEnum; | |||||
//import com.ningdatech.emapi.expert.entity.*; | |||||
//import com.ningdatech.emapi.expert.entity.domain.*; | |||||
//import com.ningdatech.emapi.expert.entity.dto.*; | |||||
//import com.ningdatech.emapi.expert.entity.vo.ExpertFullInfoVO; | |||||
//import com.ningdatech.emapi.sys.file.entity.FileBasicInfo; | |||||
//import com.ningdatech.emapi.sys.file.entity.vo.result.AttachFileVo; | |||||
//import com.ningdatech.emapi.sys.meta.entity.RegionDtoMapKey; | |||||
//import com.ningdatech.emapi.sys.meta.entity.dto.DictionaryDTO; | |||||
//import com.ningdatech.emapi.sys.meta.entity.dto.TagDTO; | |||||
//import com.ningdatech.emapi.sys.meta.helper.DictionaryCache; | |||||
//import com.ningdatech.emapi.sys.meta.helper.TagCache; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.ningdatech.file.entity.vo.result.AttachFileVo; | |||||
import com.ningdatech.pmapi.common.enumeration.BoolDisplayEnum; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyTypeEnum; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertIntentionWorkRegion; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertMetaApply; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||||
import com.ningdatech.pmapi.expert.model.*; | |||||
import com.ningdatech.pmapi.expert.model.dto.*; | |||||
import com.ningdatech.pmapi.expert.model.vo.ExpertFullInfoVO; | |||||
import com.ningdatech.pmapi.meta.constant.DictExpertInfoTypeEnum; | |||||
import com.ningdatech.pmapi.meta.constant.ExpertTagEnum; | |||||
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.meta.model.entity.ExpertDictionary; | |||||
import com.ningdatech.pmapi.meta.model.entity.ExpertTag; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.*; | |||||
import java.util.function.Function; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/27 上午10:46 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class ExpertUserInfoAssembler { | |||||
private final TagCache tagCache; | |||||
private final DictionaryCache dictionaryCache; | |||||
// private final RegionCache regionCache; | |||||
public ExpertFullInfoVO buildExpertFullInfoVO(List<AttachFileVo> attachFiles | |||||
, ExpertFullInfoAllDTO expertUserFullInfoAll) { | |||||
ExpertUserFullInfoDTO expertUserInfoDTO = expertUserFullInfoAll.getExpertUserInfoDTO(); | |||||
// 字典字典段map | |||||
Map<String, List<DictionaryFieldInfo>> dictionaryFieldInfoMap = | |||||
buildDictionaryFieldInfoMap(expertUserFullInfoAll.getExpertDictionaryList()); | |||||
// 专家文件资料map | |||||
Map<Long, FileBasicInfo> fileBasicInfoMap = buildFileBasicInfoMap(attachFiles); | |||||
// 专家标签字段map | |||||
Map<String, List<TagFieldInfo>> tagFieldInfoMap = buildTagFieldInfoMap(expertUserFullInfoAll.getExpertTagList()); | |||||
// 专家履职意向地 | |||||
List<ExpertRegionDTO> expertIntentionWorkRegionInfo = | |||||
expertUserFullInfoAll.getExpertIntentionWorkRegionInfo(); | |||||
// 专家回避单位列表 | |||||
List<ExpertAvoidCompanyDTO> expertAvoidCompanyList = expertUserFullInfoAll.getExpertAvoidCompanyList(); | |||||
// 基本信息 | |||||
ExpertBasicInfo basicInfo = buildExpertBasicInfo(expertUserInfoDTO, dictionaryFieldInfoMap, tagFieldInfoMap, expertIntentionWorkRegionInfo, fileBasicInfoMap); | |||||
// 学历信息 | |||||
ExpertEduInfo eduInfo = buildExpertEduInfo(expertUserInfoDTO, dictionaryFieldInfoMap, fileBasicInfoMap); | |||||
// 职业信息 | |||||
ExpertJobInfo jobInfo = buildExpertJobInfo(expertUserInfoDTO, dictionaryFieldInfoMap); | |||||
// 专业信息 | |||||
ExpertProfessionalInfo professionalInfo = | |||||
buildExpertProfessionalInfo(expertUserInfoDTO, dictionaryFieldInfoMap, tagFieldInfoMap | |||||
, fileBasicInfoMap, expertAvoidCompanyList); | |||||
// 推荐信息 | |||||
ExpertRecommendInfo recommendInfo = new ExpertRecommendInfo(); | |||||
recommendInfo.setRecommendedWay(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.RECOMMENDED_WAY.getKey())); | |||||
recommendInfo.setRecommendationProofFile( | |||||
getFileBasicInfoList(fileBasicInfoMap, expertUserInfoDTO.getRecommendationProofFileIdList())); | |||||
// 其他信息 | |||||
ExpertOtherInfo otherInfo = new ExpertOtherInfo(); | |||||
otherInfo.setOther(tagFieldInfoMap.get(ExpertTagEnum.OTHER.getKey())); | |||||
otherInfo.setRemark(expertUserInfoDTO.getRemark()); | |||||
// 专家申请履职意向展示列表 | |||||
List<ExpertRegionInfo> expertApplyIntentionWorkRegions = expertUserFullInfoAll.getExpertApplyIntentionWorkRegionInfo().stream().map(r -> { | |||||
ExpertRegionInfo expertApplyIntentionWorkRegion = new ExpertRegionInfo(); | |||||
expertApplyIntentionWorkRegion.setRegionLevel(r.getRegionLevel()); | |||||
expertApplyIntentionWorkRegion.setRegionCode(r.getRegionCode()); | |||||
// expertApplyIntentionWorkRegion.setRegionName(regionCache.getUnionPathStr(r.getRegionCode(), r.getRegionLevel())); | |||||
return expertApplyIntentionWorkRegion; | |||||
}).collect(Collectors.toList()); | |||||
ExpertFullInfoVO expertFullInfoVO = new ExpertFullInfoVO(); | |||||
expertFullInfoVO.setUserId(expertUserInfoDTO.getUserId()); | |||||
expertFullInfoVO.setBasicInfo(basicInfo); | |||||
expertFullInfoVO.setEduInfo(eduInfo); | |||||
expertFullInfoVO.setJobInfo(jobInfo); | |||||
expertFullInfoVO.setProfessionalInfo(professionalInfo); | |||||
expertFullInfoVO.setRecommendInfo(recommendInfo); | |||||
expertFullInfoVO.setExpertOtherInfo(otherInfo); | |||||
expertFullInfoVO.setExpertApplyIntentionWorkRegions(expertApplyIntentionWorkRegions); | |||||
return expertFullInfoVO; | |||||
} | |||||
public static Map<Long, FileBasicInfo> buildFileBasicInfoMap(List<AttachFileVo> attachFiles) { | |||||
return attachFiles.stream().map(r -> { | |||||
FileBasicInfo fileBasicInfo = new FileBasicInfo(); | |||||
fileBasicInfo.setFileId(r.getFileId()); | |||||
fileBasicInfo.setFileName(r.getOriginalFileName()); | |||||
return fileBasicInfo; | |||||
}).collect(Collectors.toMap(FileBasicInfo::getFileId, Function.identity())); | |||||
} | |||||
public Map<String, List<TagFieldInfo>> buildTagFieldInfoMap(List<ExpertTagDTO> expertTagList) { | |||||
return expertTagList.stream().map(r -> { | |||||
TagFieldInfo tagFieldInfo = new TagFieldInfo(); | |||||
tagFieldInfo.setTagCode(r.getTagCode()); | |||||
tagFieldInfo.setTagFieldName(r.getExpertInfoField()); | |||||
TagDTO tagDTO = tagCache.getByTagCode(r.getTagCode()); | |||||
if (Objects.nonNull(tagDTO)) { | |||||
tagFieldInfo.setTagName(tagDTO.getTagName()); | |||||
} | |||||
return tagFieldInfo; | |||||
}).collect(Collectors.groupingBy(TagFieldInfo::getTagFieldName)); | |||||
} | |||||
public Map<String, List<DictionaryFieldInfo>> buildDictionaryFieldInfoMap(List<ExpertDictionaryDTO> expertDictionaryList) { | |||||
return expertDictionaryList.stream().map(r -> { | |||||
DictionaryFieldInfo dictionaryFieldInfo = new DictionaryFieldInfo(); | |||||
dictionaryFieldInfo.setDictionaryFieldName(r.getExpertInfoField()); | |||||
dictionaryFieldInfo.setDictionaryCode(r.getDictionaryCode()); | |||||
DictionaryDTO dictionaryDTO = dictionaryCache.getByCode(r.getDictionaryCode()); | |||||
if (Objects.nonNull(dictionaryDTO)) { | |||||
dictionaryFieldInfo.setDictionaryName(dictionaryDTO.getName()); | |||||
} | |||||
return dictionaryFieldInfo; | |||||
}).collect(Collectors.groupingBy(DictionaryFieldInfo::getDictionaryFieldName)); | |||||
} | |||||
public static ExpertProfessionalInfo buildExpertProfessionalInfo(ExpertUserFullInfoDTO expertUserInfoDTO | |||||
, Map<String, List<DictionaryFieldInfo>> dictionaryFieldInfoMap, Map<String, List<TagFieldInfo>> tagFieldInfoMap | |||||
, Map<Long, FileBasicInfo> fileBasicInfoMap, List<ExpertAvoidCompanyDTO> expertAvoidCompanyList) { | |||||
ExpertProfessionalInfo professionalInfo = new ExpertProfessionalInfo(); | |||||
professionalInfo.setTechnicalTitles(expertUserInfoDTO.getTechnicalTitles()); | |||||
professionalInfo.setTitleLevel(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.TITLE_LEVEL.getKey())); | |||||
professionalInfo.setTitleCertificateFile(getFileBasicInfoList(fileBasicInfoMap, expertUserInfoDTO.getTitleCertificateFileIdList())); | |||||
professionalInfo.setGoodAt(tagFieldInfoMap.get(ExpertTagEnum.GOOD_AT.getKey())); | |||||
professionalInfo.setTechnicalExpertise(tagFieldInfoMap.get(ExpertTagEnum.TECHNICAL_EXPERTISE.getKey())); | |||||
professionalInfo.setAwards(expertUserInfoDTO.getAwards()); | |||||
professionalInfo.setIndustrySector(tagFieldInfoMap.get(ExpertTagEnum.INDUSTRY_SECTOR.getKey())); | |||||
professionalInfo.setRecognitionReward(expertUserInfoDTO.getRecognitionReward()); | |||||
professionalInfo.setAvoidCompanyList(expertAvoidCompanyList.stream().map(r -> { | |||||
ExpertAvoidCompanyInfo expertAvoidCompanyInfo = new ExpertAvoidCompanyInfo(); | |||||
expertAvoidCompanyInfo.setCompanyName(r.getCompanyName()); | |||||
expertAvoidCompanyInfo.setCompanyUniqCode(r.getCompanyUniqCode()); | |||||
return expertAvoidCompanyInfo; | |||||
}).collect(Collectors.toList())); | |||||
return professionalInfo; | |||||
} | |||||
public static ExpertJobInfo buildExpertJobInfo(ExpertUserFullInfoDTO expertUserInfoDTO | |||||
, Map<String, List<DictionaryFieldInfo>> dictionaryFieldInfoMap) { | |||||
ExpertJobInfo jobInfo = new ExpertJobInfo(); | |||||
jobInfo.setJobStatus(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.JOB_STATUS.getKey())); | |||||
jobInfo.setRetiredAt(expertUserInfoDTO.getRetiredAt()); | |||||
jobInfo.setCompany(expertUserInfoDTO.getCompany()); | |||||
jobInfo.setCompanyUniqCode(expertUserInfoDTO.getCompanyUniqCode()); | |||||
jobInfo.setLegalEntityCode(expertUserInfoDTO.getLegalEntityCode()); | |||||
jobInfo.setAdministrativeDuties(expertUserInfoDTO.getAdministrativeDuties()); | |||||
jobInfo.setStartWorkAt(expertUserInfoDTO.getStartWorkAt()); | |||||
jobInfo.setAdministrativeRank(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.ADMINISTRATIVE_RANK.getKey())); | |||||
jobInfo.setCompanyAttribute(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.COMPANY_ATTRIBUTE.getKey())); | |||||
jobInfo.setAddress(expertUserInfoDTO.getAddress()); | |||||
jobInfo.setExperience(expertUserInfoDTO.getExperience()); | |||||
return jobInfo; | |||||
} | |||||
public static ExpertEduInfo buildExpertEduInfo(ExpertUserFullInfoDTO expertUserInfoDTO | |||||
, Map<String, List<DictionaryFieldInfo>> dictionaryFieldInfoMap, Map<Long, FileBasicInfo> fileBasicInfoMap) { | |||||
// 学历信息 | |||||
ExpertEduInfo eduInfo = new ExpertEduInfo(); | |||||
eduInfo.setSchool(expertUserInfoDTO.getSchool()); | |||||
eduInfo.setGraduatedAt(expertUserInfoDTO.getGraduatedAt()); | |||||
eduInfo.setAcademicTitle(expertUserInfoDTO.getAcademicTitle()); | |||||
eduInfo.setEdu(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.EDU.getKey())); | |||||
eduInfo.setGraduationCertificateFile(getFileBasicInfoList(fileBasicInfoMap | |||||
, expertUserInfoDTO.getGraduationCertificateFileIdList())); | |||||
eduInfo.setDegree(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.DEGREE.getKey())); | |||||
eduInfo.setDegreeCertificateFile(getFileBasicInfoList(fileBasicInfoMap, expertUserInfoDTO.getDegreeCertificateFileIdList())); | |||||
return eduInfo; | |||||
} | |||||
public static List<FileBasicInfo> getFileBasicInfoList(Map<Long, FileBasicInfo> fileBasicInfoMap, List<Long> fileIdList) { | |||||
if (CollectionUtils.isEmpty(fileIdList)) { | |||||
return new ArrayList<>(); | |||||
} | |||||
List<FileBasicInfo> fileBasicInfoList = new ArrayList<>(); | |||||
for (Long fileId : fileIdList) { | |||||
FileBasicInfo fileBasicInfo = fileBasicInfoMap.get(fileId); | |||||
if (Objects.nonNull(fileBasicInfo)) { | |||||
fileBasicInfoList.add(fileBasicInfo); | |||||
} | |||||
} | |||||
return fileBasicInfoList; | |||||
} | |||||
public static FileBasicInfo getFileBasicInfo(Map<Long, FileBasicInfo> fileBasicInfoMap, Long fileId) { | |||||
if (Objects.isNull(fileId)) { | |||||
return null; | |||||
} | |||||
FileBasicInfo fileBasicInfo = fileBasicInfoMap.get(fileId); | |||||
return fileBasicInfo; | |||||
} | |||||
public ExpertBasicInfo buildExpertBasicInfo(ExpertUserFullInfoDTO expertUserInfoDTO | |||||
, Map<String, List<DictionaryFieldInfo>> dictionaryFieldInfoMap | |||||
, Map<String, List<TagFieldInfo>> tagFieldInfoMap | |||||
, List<ExpertRegionDTO> expertIntentionWorkRegionInfo | |||||
, Map<Long, FileBasicInfo> fileBasicInfoMap) { | |||||
//专家层级 | |||||
ExpertRegionInfo expertRegionInfo = new ExpertRegionInfo(); | |||||
expertRegionInfo.setRegionLevel(expertUserInfoDTO.getRegionLevel()); | |||||
expertRegionInfo.setRegionCode(expertUserInfoDTO.getRegionCode()); | |||||
// 基本信息 | |||||
ExpertBasicInfo basicInfo = new ExpertBasicInfo(); | |||||
basicInfo.setIsDingUser(expertUserInfoDTO.getIsDingUser()); | |||||
basicInfo.setPhoneNo(expertUserInfoDTO.getPhoneNo()); | |||||
basicInfo.setName(expertUserInfoDTO.getName()); | |||||
basicInfo.setAvatarFile(getFileBasicInfo(fileBasicInfoMap, expertUserInfoDTO.getAvatarFileId())); | |||||
basicInfo.setGender(expertUserInfoDTO.getGender()); | |||||
basicInfo.setPolitical(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.POLITICAL.getKey())); | |||||
basicInfo.setIdCard(expertUserInfoDTO.getIdCard()); | |||||
basicInfo.setOfficePhone(expertUserInfoDTO.getPhoneNo()); | |||||
basicInfo.setBirth(expertUserInfoDTO.getBirth()); | |||||
basicInfo.setBank(expertUserInfoDTO.getBank()); | |||||
basicInfo.setBankNo(expertUserInfoDTO.getBankNo()); | |||||
basicInfo.setEmail(expertUserInfoDTO.getEmail()); | |||||
basicInfo.setHometown(expertUserInfoDTO.getHometown()); | |||||
basicInfo.setNationality(expertUserInfoDTO.getNationality()); | |||||
basicInfo.setExpertSource(tagFieldInfoMap.get(ExpertTagEnum.EXPERT_SOURCE.getKey())); | |||||
if (Objects.nonNull(expertRegionInfo)) { | |||||
// expertRegionInfo.setRegionName(regionCache.getUnionPathStr(expertRegionInfo.getRegionCode(), expertRegionInfo.getRegionLevel())); | |||||
basicInfo.setExpertRegionInfo(expertRegionInfo); | |||||
} | |||||
basicInfo.setExpertIntentionWorkRegions(expertIntentionWorkRegionInfo.stream().map(r -> { | |||||
ExpertRegionInfo expertIntentionWorkRegion = new ExpertRegionInfo(); | |||||
expertIntentionWorkRegion.setRegionCode(r.getRegionCode()); | |||||
expertIntentionWorkRegion.setRegionLevel(r.getRegionLevel()); | |||||
// expertIntentionWorkRegion.setRegionName(regionCache.getUnionPathStr(r.getRegionCode(), r.getRegionLevel())); | |||||
return expertIntentionWorkRegion; | |||||
}).collect(Collectors.toList())); | |||||
basicInfo.setExpertType(dictionaryFieldInfoMap.get(DictExpertInfoTypeEnum.EXPERT_TYPE.getKey())); | |||||
return basicInfo; | |||||
} | |||||
public static ExpertFullInfoAllDTO buildExpertFullInfoAllDTO(ExpertUserFullInfo expertUserFullInfo | |||||
, List<ExpertTag> expertTagList | |||||
, List<ExpertDictionary> expertDictionaryList | |||||
, List<ExpertIntentionWorkRegion> expertIntentionWorkRegionList | |||||
, List<ExpertMetaApply> expertMetaApplyList | |||||
, List<ExpertAvoidCompany> expertAvoidCompanyList) { | |||||
ExpertUserFullInfoDTO expertUserFullInfoDTO = buildExpertUserFullInfoDTO(expertUserFullInfo); | |||||
List<ExpertDictionaryDTO> expertDictionaryDTOList = buildExpertDictionaryDTOList(expertDictionaryList); | |||||
List<ExpertTagDTO> expertTagDTOList = buildExpertTagDTOList(expertTagList); | |||||
List<ExpertRegionDTO> expertIntentionWorkRegionInfo = buildExpertIntentionWorkRegionInfo(expertIntentionWorkRegionList); | |||||
// 专家申请履职意向展示列表 | |||||
List<ExpertRegionDTO> expertApplyIntentionWorkRegionInfo = buildExpertApplyIntentionWorkRegionInfo(expertIntentionWorkRegionList, expertMetaApplyList); | |||||
List<ExpertAvoidCompanyDTO> expertAvoidCompanyDTOList = buildExpertAvoidCompanyDTOList(expertAvoidCompanyList); | |||||
ExpertFullInfoAllDTO expertFullInfoAllDTO = new ExpertFullInfoAllDTO(); | |||||
expertFullInfoAllDTO.setUserId(expertUserFullInfo.getUserId()); | |||||
expertFullInfoAllDTO.setExpertUserInfoDTO(expertUserFullInfoDTO); | |||||
expertFullInfoAllDTO.setExpertDictionaryList(expertDictionaryDTOList); | |||||
expertFullInfoAllDTO.setExpertTagList(expertTagDTOList); | |||||
expertFullInfoAllDTO.setExpertIntentionWorkRegionInfo(expertIntentionWorkRegionInfo); | |||||
expertFullInfoAllDTO.setExpertApplyIntentionWorkRegionInfo(expertApplyIntentionWorkRegionInfo); | |||||
expertFullInfoAllDTO.setExpertAvoidCompanyList(expertAvoidCompanyDTOList); | |||||
return expertFullInfoAllDTO; | |||||
} | |||||
private static List<ExpertRegionDTO> buildExpertApplyIntentionWorkRegionInfo(List<ExpertIntentionWorkRegion> expertIntentionWorkRegionList | |||||
, List<ExpertMetaApply> expertMetaApplyList) { | |||||
HashSet<RegionDtoMapKey> set = new HashSet(); | |||||
for (ExpertIntentionWorkRegion expertIntentionWorkRegion : expertIntentionWorkRegionList) { | |||||
RegionDtoMapKey regionDtoMapKey = new RegionDtoMapKey(); | |||||
regionDtoMapKey.setRegionCode(expertIntentionWorkRegion.getRegionCode()); | |||||
regionDtoMapKey.setRegionLevel(expertIntentionWorkRegion.getRegionLevel()); | |||||
set.add(regionDtoMapKey); | |||||
} | |||||
for (ExpertMetaApply expertMetaApply : expertMetaApplyList) { | |||||
String applyType = expertMetaApply.getApplyType(); | |||||
RegionDtoMapKey regionDtoMapKey = new RegionDtoMapKey(); | |||||
regionDtoMapKey.setRegionCode(expertMetaApply.getRegionCode()); | |||||
regionDtoMapKey.setRegionLevel(expertMetaApply.getRegionLevel()); | |||||
ExpertApplyTypeEnum typeEnum = ExpertApplyTypeEnum.of(applyType); | |||||
switch (typeEnum) { | |||||
case EXPERT_INTENTION_LEAVE: { | |||||
set.remove(regionDtoMapKey); | |||||
} | |||||
break; | |||||
case EXPERT_INTENTION_JOIN: { | |||||
set.add(regionDtoMapKey); | |||||
} | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
} | |||||
return set.stream().map(r -> { | |||||
ExpertRegionDTO expertRegionDTO = new ExpertRegionDTO(); | |||||
expertRegionDTO.setRegionCode(r.getRegionCode()); | |||||
expertRegionDTO.setRegionLevel(r.getRegionLevel()); | |||||
return expertRegionDTO; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
private static List<ExpertAvoidCompanyDTO> buildExpertAvoidCompanyDTOList(List<ExpertAvoidCompany> expertAvoidCompanyList) { | |||||
return expertAvoidCompanyList.stream().map(r -> { | |||||
ExpertAvoidCompanyDTO expertAvoidCompanyDTO = new ExpertAvoidCompanyDTO(); | |||||
expertAvoidCompanyDTO.setCompanyUniqCode(r.getCompanyUniqCode()); | |||||
expertAvoidCompanyDTO.setCompanyName(r.getCompanyName()); | |||||
return expertAvoidCompanyDTO; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
private static List<ExpertRegionDTO> buildExpertIntentionWorkRegionInfo(List<ExpertIntentionWorkRegion> expertIntentionWorkRegionList) { | |||||
return expertIntentionWorkRegionList.stream().map(r -> { | |||||
ExpertRegionDTO expertRegionDTO = new ExpertRegionDTO(); | |||||
expertRegionDTO.setRegionLevel(r.getRegionLevel()); | |||||
expertRegionDTO.setRegionCode(r.getRegionCode()); | |||||
return expertRegionDTO; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
private static List<ExpertTagDTO> buildExpertTagDTOList(List<ExpertTag> expertTagList) { | |||||
return expertTagList.stream().map(r -> { | |||||
ExpertTagDTO expertTagDTO = new ExpertTagDTO(); | |||||
expertTagDTO.setExpertInfoField(r.getExpertInfoField()); | |||||
expertTagDTO.setTagCode(r.getTagCode()); | |||||
return expertTagDTO; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
private static List<ExpertDictionaryDTO> buildExpertDictionaryDTOList(List<ExpertDictionary> expertDictionaryList) { | |||||
return expertDictionaryList.stream().map(r -> { | |||||
ExpertDictionaryDTO expertDictionaryDTO = new ExpertDictionaryDTO(); | |||||
expertDictionaryDTO.setExpertInfoField(r.getExpertInfoField()); | |||||
expertDictionaryDTO.setDictionaryCode(r.getDictionaryCode()); | |||||
return expertDictionaryDTO; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
public static ExpertUserFullInfoDTO buildExpertUserFullInfoDTO(ExpertUserFullInfo expertUserFullInfo) { | |||||
ExpertUserFullInfoDTO expertUserFullInfoDTO = new ExpertUserFullInfoDTO(); | |||||
expertUserFullInfoDTO.setIsDingUser(BoolDisplayEnum.judgeBoolean(expertUserFullInfo.getIsDingUser())); | |||||
expertUserFullInfoDTO.setPhoneNo(expertUserFullInfo.getPhoneNo()); | |||||
expertUserFullInfoDTO.setGender(expertUserFullInfo.getGender()); | |||||
expertUserFullInfoDTO.setName(expertUserFullInfo.getExpertName()); | |||||
expertUserFullInfoDTO.setAvatarFileId(expertUserFullInfo.getAvatarFileId()); | |||||
expertUserFullInfoDTO.setIdCard(expertUserFullInfo.getIdCard()); | |||||
expertUserFullInfoDTO.setOfficePhone(expertUserFullInfo.getOfficePhone()); | |||||
expertUserFullInfoDTO.setBirth(expertUserFullInfo.getBirth()); | |||||
expertUserFullInfoDTO.setBankNo(expertUserFullInfo.getBankNo()); | |||||
expertUserFullInfoDTO.setBank(expertUserFullInfo.getBank()); | |||||
expertUserFullInfoDTO.setEmail(expertUserFullInfo.getEmail()); | |||||
expertUserFullInfoDTO.setHometown(expertUserFullInfo.getHometown()); | |||||
expertUserFullInfoDTO.setNationality(expertUserFullInfo.getNationality()); | |||||
expertUserFullInfoDTO.setSchool(expertUserFullInfo.getSchool()); | |||||
expertUserFullInfoDTO.setGraduatedAt(expertUserFullInfo.getGraduatedAt()); | |||||
expertUserFullInfoDTO.setAcademicTitle(expertUserFullInfo.getAcademicTitle()); | |||||
if (StringUtils.isNotBlank(expertUserFullInfo.getGraduationCertificateFileIdList())) { | |||||
expertUserFullInfoDTO.setGraduationCertificateFileIdList(JSONObject.parseArray(expertUserFullInfo.getGraduationCertificateFileIdList(), Long.class)); | |||||
} | |||||
if (StringUtils.isNotBlank(expertUserFullInfo.getDegreeCertificateFileIdList())) { | |||||
expertUserFullInfoDTO.setDegreeCertificateFileIdList(JSONObject.parseArray(expertUserFullInfo.getDegreeCertificateFileIdList(), Long.class)); | |||||
} | |||||
expertUserFullInfoDTO.setRetiredAt(expertUserFullInfo.getRetiredAt()); | |||||
expertUserFullInfoDTO.setCompany(expertUserFullInfo.getCompany()); | |||||
// expertUserFullInfoDTO.setCompanyUniqCode(expertUserFullInfo.getCompanyUniqCode()); | |||||
expertUserFullInfoDTO.setLegalEntityCode(expertUserFullInfo.getLegalEntityCode()); | |||||
expertUserFullInfoDTO.setAdministrativeDuties(expertUserFullInfo.getAdministrativeDuties()); | |||||
expertUserFullInfoDTO.setStartWorkAt(expertUserFullInfo.getStartWorkAt()); | |||||
expertUserFullInfoDTO.setAddress(expertUserFullInfo.getAddress()); | |||||
expertUserFullInfoDTO.setExperience(expertUserFullInfo.getExperience()); | |||||
expertUserFullInfoDTO.setTechnicalTitles(expertUserFullInfo.getTechnicalTitles()); | |||||
if (StringUtils.isNotBlank(expertUserFullInfo.getTitleCertificateFileIdList())) { | |||||
expertUserFullInfoDTO.setTitleCertificateFileIdList(JSONObject.parseArray(expertUserFullInfo.getTitleCertificateFileIdList(), Long.class)); | |||||
} | |||||
expertUserFullInfoDTO.setAwards(expertUserFullInfo.getAwards()); | |||||
expertUserFullInfoDTO.setRecognitionReward(expertUserFullInfo.getRecognitionReward()); | |||||
expertUserFullInfoDTO.setRegionCode(expertUserFullInfo.getRegionCode()); | |||||
expertUserFullInfoDTO.setRegionLevel(expertUserFullInfo.getRegionLevel()); | |||||
if (StringUtils.isNotBlank(expertUserFullInfo.getRecommendationProofFileIdList())) { | |||||
expertUserFullInfoDTO.setRecommendationProofFileIdList(JSONObject.parseArray(expertUserFullInfo.getRecommendationProofFileIdList(), Long.class)); | |||||
} | |||||
expertUserFullInfoDTO.setRemark(expertUserFullInfo.getRemark()); | |||||
return expertUserFullInfoDTO; | |||||
} | |||||
// public static ExpertAdminExpertManageListDTO buildExpertAdminExpertManageListDTO(ExpertUserFullInfo expertUserFullInfo | |||||
// , Map<Long, List<ExpertDictionary>> expertDictionaryMap, Map<Long, List<ExpertTag>> expertTagMap) { | |||||
// Long userId = expertUserFullInfo.getUserId(); | |||||
// ExpertAdminExpertManageListDTO expertAdminExpertManageListDTO = new ExpertAdminExpertManageListDTO(); | |||||
// expertAdminExpertManageListDTO.setUserId(expertUserFullInfo.getUserId()); | |||||
// expertAdminExpertManageListDTO.setExpertName(expertUserFullInfo.getName()); | |||||
// expertAdminExpertManageListDTO.setPhoneNo(expertUserFullInfo.getPhoneNo()); | |||||
// expertAdminExpertManageListDTO.setIsDingUser(BoolDisplayEnum.judgeBoolean(expertUserFullInfo.getIsDingUser())); | |||||
// expertAdminExpertManageListDTO.setCompany(expertUserFullInfo.getCompany()); | |||||
// expertAdminExpertManageListDTO.setLegalEntityCode(expertUserFullInfo.getLegalEntityCode()); | |||||
// expertAdminExpertManageListDTO.setExpertAccountStatus(expertUserFullInfo.getExpertAccountStatus()); | |||||
// | |||||
// // 装配字典数据 | |||||
// List<ExpertDictionary> userExpertDictionaryList = Objects.isNull(expertDictionaryMap.get(userId)) ? new ArrayList<>() : expertDictionaryMap.get(userId); | |||||
// Map<String, List<ExpertDictionary>> fieldExpertDictionaryMap = userExpertDictionaryList.stream().collect(Collectors.groupingBy(ExpertDictionary::getExpertInfoField)); | |||||
// expertAdminExpertManageListDTO.setExpertType( | |||||
// DictionaryAssembler.toDictionaryFieldInfoList(fieldExpertDictionaryMap.get(DictExpertInfoTypeEnum.EXPERT_TYPE.getKey()))); | |||||
// expertAdminExpertManageListDTO.setCompanyAttribute( | |||||
// DictionaryAssembler.toDictionaryFieldInfoList(fieldExpertDictionaryMap.get(DictExpertInfoTypeEnum.COMPANY_ATTRIBUTE.getKey()))); | |||||
// expertAdminExpertManageListDTO.setTitleLevel( | |||||
// DictionaryAssembler.toDictionaryFieldInfoList(fieldExpertDictionaryMap.get(DictExpertInfoTypeEnum.TITLE_LEVEL.getKey()))); | |||||
// // 装配标签数据 | |||||
// List<ExpertTag> expertTagList = Objects.isNull(expertTagMap.get(userId)) ? new ArrayList<>() : expertTagMap.get(userId); | |||||
// Map<String, List<ExpertTag>> fieldExpertTagMap = expertTagList.stream().collect(Collectors.groupingBy(ExpertTag::getExpertInfoField)); | |||||
// expertAdminExpertManageListDTO.setExpertSource( | |||||
// TagAssembler.toTagFieldInfoList(fieldExpertTagMap.get(ExpertTagEnum.EXPERT_SOURCE.getKey()))); | |||||
// | |||||
// if (StringUtils.isNotBlank(expertUserFullInfo.getRegionCode()) && Objects.nonNull(expertUserFullInfo.getRegionLevel())) { | |||||
// ExpertRegionInfo expertRegionInfo = new ExpertRegionInfo(); | |||||
// expertRegionInfo.setRegionLevel(expertUserFullInfo.getRegionLevel()); | |||||
// expertRegionInfo.setRegionCode(expertUserFullInfo.getRegionCode()); | |||||
// expertAdminExpertManageListDTO.setExpertRegionInfo(expertRegionInfo); | |||||
// } | |||||
// | |||||
// // 以下数据为专家excel导出使用 | |||||
// expertAdminExpertManageListDTO.setGender(expertUserFullInfo.getGender()); | |||||
// expertAdminExpertManageListDTO.setBirth(expertUserFullInfo.getBirth()); | |||||
// expertAdminExpertManageListDTO.setHometown(expertUserFullInfo.getHometown()); | |||||
// expertAdminExpertManageListDTO.setNationality(expertUserFullInfo.getNationality()); | |||||
// expertAdminExpertManageListDTO.setPolitical( | |||||
// DictionaryAssembler.toDictionaryFieldInfoList(fieldExpertDictionaryMap.get(DictExpertInfoTypeEnum.POLITICAL.getKey()))); | |||||
// expertAdminExpertManageListDTO.setIdCard(expertUserFullInfo.getIdCard()); | |||||
// expertAdminExpertManageListDTO.setBankNo(expertUserFullInfo.getBankNo()); | |||||
// expertAdminExpertManageListDTO.setEdu( | |||||
// DictionaryAssembler.toDictionaryFieldInfoList(fieldExpertDictionaryMap.get(DictExpertInfoTypeEnum.EDU.getKey()))); | |||||
// expertAdminExpertManageListDTO.setRecommendedWay( | |||||
// DictionaryAssembler.toDictionaryFieldInfoList(fieldExpertDictionaryMap.get(DictExpertInfoTypeEnum.RECOMMENDED_WAY.getKey()))); | |||||
// return expertAdminExpertManageListDTO; | |||||
// | |||||
// } | |||||
} |
@@ -0,0 +1,39 @@ | |||||
package com.ningdatech.pmapi.expert.assembler; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertMetaApply; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||||
import com.ningdatech.pmapi.meta.model.bo.RegionContainsBO; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/10 下午5:36 | |||||
*/ | |||||
public class RegionWrapperAssembler { | |||||
public static void expertUserFullInfoRegionContainsWrapperAssembler(LambdaQueryWrapper<ExpertUserFullInfo> wrapperQuery, List<RegionContainsBO> containsRegionList) { | |||||
for (RegionContainsBO regionContainsBO : containsRegionList) { | |||||
List<String> containsRegionCodeList = regionContainsBO.getContainsRegionCodeList(); | |||||
Integer parentRegionTreeLevel = regionContainsBO.getParentRegionTreeLevel(); | |||||
if (CollectionUtils.isNotEmpty(containsRegionCodeList)) { | |||||
wrapperQuery.and(wrapper -> wrapper.in(ExpertUserFullInfo::getRegionCode, containsRegionCodeList) | |||||
.ge(ExpertUserFullInfo::getRegionLevel, parentRegionTreeLevel)); | |||||
} | |||||
} | |||||
} | |||||
public static void expertMetaApplyRegionContainsWrapperAssembler(LambdaQueryWrapper<ExpertMetaApply> wrapperQuery, List<RegionContainsBO> containsRegionList) { | |||||
for (RegionContainsBO regionContainsBO : containsRegionList) { | |||||
List<String> containsRegionCodeList = regionContainsBO.getContainsRegionCodeList(); | |||||
Integer parentRegionTreeLevel = regionContainsBO.getParentRegionTreeLevel(); | |||||
if (CollectionUtils.isNotEmpty(containsRegionCodeList)) { | |||||
wrapperQuery.and(wrapper -> wrapper.in(ExpertMetaApply::getRegionCode, containsRegionCodeList) | |||||
.ge(ExpertMetaApply::getRegionLevel, parentRegionTreeLevel)); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,45 @@ | |||||
package com.ningdatech.pmapi.expert.constant; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 下午1:38 | |||||
*/ | |||||
@AllArgsConstructor | |||||
@Getter | |||||
public enum ExpertApplyStatusEnum { | |||||
// 待审核 | |||||
PENDING_REVIEW("pending_review"), | |||||
// 审核通过 | |||||
PASSED("passed"), | |||||
// 审核不通过 | |||||
REFUSED("refused"), | |||||
// 已撤销 | |||||
REVOKED("revoked"); | |||||
private final String key; | |||||
public static boolean contains(String key) { | |||||
if (StringUtils.isBlank(key)) { | |||||
return false; | |||||
} | |||||
for (ExpertApplyStatusEnum statusEnum : ExpertApplyStatusEnum.values()) { | |||||
if (statusEnum.key.equals(key)) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
public static ExpertApplyStatusEnum of(String key) { | |||||
for (ExpertApplyStatusEnum statusEnum : ExpertApplyStatusEnum.values()) { | |||||
if (statusEnum.key.equals(key)) { | |||||
return statusEnum; | |||||
} | |||||
} | |||||
throw new IllegalArgumentException(String.format("Illegal ExpertApplyStatusEnum = %s", key)); | |||||
} | |||||
} |
@@ -0,0 +1,52 @@ | |||||
package com.ningdatech.pmapi.expert.constant; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 下午1:40 | |||||
* 专家审核申请类型 | |||||
*/ | |||||
@AllArgsConstructor | |||||
@Getter | |||||
public enum ExpertApplyTypeEnum { | |||||
// 专家入库 | |||||
EXPERT_STORAGE("expert_storage"), | |||||
// 专家出库 | |||||
EXPERT_DELIVERY("expert_delivery"), | |||||
// 专家履职意向加入 | |||||
EXPERT_INTENTION_JOIN("expert_intention_join"), | |||||
// 专家履职意向退出 | |||||
EXPERT_INTENTION_LEAVE("expert_intention_leave"), | |||||
// 长期请假申请 | |||||
LONG_TERM_LEAVE("long_term_leave"), | |||||
// 专家信息修改申请 | |||||
EXPERT_INFO_MODIFY("expert_info_modify"); | |||||
private final String key; | |||||
public static boolean contains(String key) { | |||||
if (StringUtils.isBlank(key)) { | |||||
return false; | |||||
} | |||||
for (ExpertApplyTypeEnum typeEnum : ExpertApplyTypeEnum.values()) { | |||||
if (typeEnum.key.equals(key)) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
public static ExpertApplyTypeEnum of(String key) { | |||||
for (ExpertApplyTypeEnum typeEnum : ExpertApplyTypeEnum.values()) { | |||||
if (typeEnum.key.equals(key)) { | |||||
return typeEnum; | |||||
} | |||||
} | |||||
throw new IllegalArgumentException(String.format("IllegalExpertApplyTypeEnum = %s", key)); | |||||
} | |||||
} |
@@ -0,0 +1,50 @@ | |||||
package com.ningdatech.pmapi.expert.constant; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 下午1:40 | |||||
* 专家 申请类型用于前端筛选时入参展示 | |||||
*/ | |||||
@AllArgsConstructor | |||||
@Getter | |||||
public enum ExpertApplyTypeQueryEnum { | |||||
// 专家入库 | |||||
EXPERT_STORAGE("expert_storage"), | |||||
// 专家出库 | |||||
EXPERT_DELIVERY("expert_delivery"), | |||||
// 专家履职意变更 | |||||
EXPERT_INTENTION_CHANGE("expert_intention_change"), | |||||
// 长期请假申请 | |||||
LONG_TERM_LEAVE("long_term_leave"), | |||||
// 专家信息修改申请 | |||||
EXPERT_INFO_MODIFY("expert_info_modify"); | |||||
private final String key; | |||||
public static boolean contains(String key) { | |||||
if (StringUtils.isBlank(key)) { | |||||
return false; | |||||
} | |||||
for (ExpertApplyTypeQueryEnum typeEnum : ExpertApplyTypeQueryEnum.values()) { | |||||
if (typeEnum.key.equals(key)) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
public static ExpertApplyTypeQueryEnum of(String key) { | |||||
for (ExpertApplyTypeQueryEnum typeEnum : ExpertApplyTypeQueryEnum.values()) { | |||||
if (typeEnum.key.equals(key)) { | |||||
return typeEnum; | |||||
} | |||||
} | |||||
throw new IllegalArgumentException(String.format("ExpertApplyTypeQueryEnum = %s", key)); | |||||
} | |||||
} |
@@ -0,0 +1,49 @@ | |||||
package com.ningdatech.pmapi.expert.constant; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/4 上午11:14 | |||||
*/ | |||||
@AllArgsConstructor | |||||
@Getter | |||||
public enum QueryExpertAccountStatusEnum { | |||||
/** | |||||
* 冻结中 | |||||
*/ | |||||
FREEZING("freezing"), | |||||
/** | |||||
* 正常 | |||||
*/ | |||||
NORMAL("normal"); | |||||
private final String key; | |||||
public static boolean contains(String key) { | |||||
if (StringUtils.isBlank(key)) { | |||||
return false; | |||||
} | |||||
for (QueryExpertAccountStatusEnum statusEnum : QueryExpertAccountStatusEnum.values()) { | |||||
if (statusEnum.key.equals(key)) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
public static QueryExpertAccountStatusEnum of(String key) { | |||||
for (QueryExpertAccountStatusEnum statusEnum : QueryExpertAccountStatusEnum.values()) { | |||||
if (statusEnum.key.equals(key)) { | |||||
return statusEnum; | |||||
} | |||||
} | |||||
throw new IllegalArgumentException(String.format("Illegal QueryExpertAccountStatusEnum = %s", key)); | |||||
} | |||||
} |
@@ -1,20 +0,0 @@ | |||||
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,15 +1,18 @@ | |||||
package com.ningdatech.pmapi.expert.controller; | package com.ningdatech.pmapi.expert.controller; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.pmapi.expert.manage.ExpertAdminManage; | |||||
import com.ningdatech.pmapi.expert.manage.ExpertManage; | import com.ningdatech.pmapi.expert.manage.ExpertManage; | ||||
import com.ningdatech.pmapi.expert.model.ExpertAdminExpertManageQuery; | |||||
import com.ningdatech.pmapi.expert.model.req.ExpertRecommendProofSubmitRequest; | |||||
import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | ||||
import com.ningdatech.pmapi.expert.model.vo.ExpertAdminExpertManageListVO; | |||||
import com.ningdatech.pmapi.expert.model.vo.ExpertFullInfoVO; | |||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.RequiredArgsConstructor; | 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.web.bind.annotation.*; | |||||
import javax.validation.Valid; | import javax.validation.Valid; | ||||
@@ -28,6 +31,7 @@ import javax.validation.Valid; | |||||
public class ExpertController { | public class ExpertController { | ||||
private final ExpertManage expertManage; | private final ExpertManage expertManage; | ||||
private final ExpertAdminManage expertAdminManage; | |||||
@PostMapping("/basic-info-submit") | @PostMapping("/basic-info-submit") | ||||
@ApiOperation("填写基本信息接口(专家报名使用))") | @ApiOperation("填写基本信息接口(专家报名使用))") | ||||
@@ -36,5 +40,23 @@ public class ExpertController { | |||||
expertManage.expertBasicInfoSubmit(request); | expertManage.expertBasicInfoSubmit(request); | ||||
} | } | ||||
@PostMapping("/recommend-proof-submit") | |||||
@ApiOperation("推荐证明提交接口(专家报名使用)") | |||||
public void expertRecommendProofSubmit(@Valid @RequestBody ExpertRecommendProofSubmitRequest request) { | |||||
expertManage.expertRecommendProofSubmit(request); | |||||
} | |||||
@GetMapping("/detail") | |||||
@ApiOperation("专家获取专家详细信息") | |||||
public ExpertFullInfoVO getExpertFullInfoDetail() { | |||||
return expertManage.getExpertFullInfoDetail(null); | |||||
} | |||||
@PostMapping("/expert-library/list") | |||||
@ApiOperation("专家库列表查询接口") | |||||
public PageVo<ExpertAdminExpertManageListVO> getExpertLibraryList( | |||||
@RequestBody @Valid ExpertAdminExpertManageQuery expertAdminExpertManageQuery) { | |||||
return expertAdminManage.getExpertLibraryList(expertAdminExpertManageQuery); | |||||
} | |||||
} | } |
@@ -1,20 +0,0 @@ | |||||
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-22 | |||||
*/ | |||||
@Controller | |||||
@RequestMapping("/pmapi.expert/expert-intention-work-region") | |||||
public class ExpertIntentionWorkRegionController { | |||||
} |
@@ -0,0 +1,61 @@ | |||||
package com.ningdatech.pmapi.expert.controller; | |||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.pmapi.expert.manage.ExpertMetaApplyManage; | |||||
import com.ningdatech.pmapi.expert.model.cmd.MetaApplyListQuery; | |||||
import com.ningdatech.pmapi.expert.model.req.MetaApplyResultRequest; | |||||
import com.ningdatech.pmapi.expert.model.vo.ExpertApplyMetaVO; | |||||
import com.ningdatech.pmapi.expert.model.vo.MetaApplyResultVo; | |||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.validation.annotation.Validated; | |||||
import org.springframework.web.bind.annotation.*; | |||||
import javax.validation.Valid; | |||||
/** | |||||
* <p> | |||||
* 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author Liuxinxin | |||||
* @since 2023-03-01 | |||||
*/ | |||||
@RestController | |||||
@RequestMapping("/api/v1/apply/meta/") | |||||
@Validated | |||||
@RequiredArgsConstructor | |||||
@Api(value = "ExpertMetaApplyController", tags = "专家申请管理相关接口") | |||||
public class ExpertMetaApplyController { | |||||
private final ExpertMetaApplyManage expertMetaApplyManage; | |||||
@PostMapping("/list") | |||||
@ApiOperation(value = "审核列表筛选") | |||||
public PageVo<ExpertApplyMetaVO> metaApplyListQuery(@RequestBody @Valid MetaApplyListQuery metaApplyListQuery) { | |||||
// ExpertMetaApplyValidator.metaApplyListQueryValidate(metaApplyListQuery); | |||||
return expertMetaApplyManage.metaApplyListQuery(metaApplyListQuery); | |||||
} | |||||
@PostMapping("/result") | |||||
@ApiOperation(value = "审核结果处理") | |||||
public void metaApplyResult(@RequestBody @Valid MetaApplyResultRequest applyResultRequest) { | |||||
expertMetaApplyManage.metaApplyResult(applyResultRequest); | |||||
} | |||||
@PostMapping("/revoke/{applyId}") | |||||
@ApiOperation(value = "申请撤销") | |||||
public void metaApplyRevoke(@PathVariable Long applyId) { | |||||
expertMetaApplyManage.metaApplyRevoke(applyId); | |||||
} | |||||
@ApiOperation("申请审核详情") | |||||
@GetMapping("/detail/{applyId}") | |||||
public MetaApplyResultVo applyAuditDetail(@PathVariable Long applyId) { | |||||
return expertMetaApplyManage.metaApplyResult(applyId); | |||||
} | |||||
} |
@@ -0,0 +1,61 @@ | |||||
package com.ningdatech.pmapi.expert.entity; | |||||
import com.baomidou.mybatisplus.annotation.IdType; | |||||
import com.baomidou.mybatisplus.annotation.TableId; | |||||
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-03-01 | |||||
*/ | |||||
@TableName("expert_meta_apply") | |||||
@ApiModel(value = "ExpertMetaApply对象", description = "") | |||||
@Data | |||||
public class ExpertMetaApply implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@TableId(type = IdType.AUTO) | |||||
private Long id; | |||||
private LocalDateTime createOn; | |||||
private LocalDateTime updateOn; | |||||
private Long createBy; | |||||
private Long updateBy; | |||||
private String applyType; | |||||
private Long userId; | |||||
private Long approverUserId; | |||||
private String applyStatus; | |||||
private LocalDateTime reviewTime; | |||||
private String auditOpinion; | |||||
private String regionCode; | |||||
private String approver; | |||||
private Integer regionLevel; | |||||
private Long applicantId; | |||||
private String extraMaterial; | |||||
private String displayEnable; | |||||
} |
@@ -11,7 +11,7 @@ import java.time.LocalDateTime; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
* | |||||
* | |||||
* </p> | * </p> | ||||
* | * | ||||
* @author Liuxinxin | * @author Liuxinxin | ||||
@@ -0,0 +1,46 @@ | |||||
package com.ningdatech.pmapi.expert.helper; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertFullInfoAllDTO; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertUserFullInfoDTO; | |||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/28 上午10:18 | |||||
*/ | |||||
@Component | |||||
public class ExpertInfoCommonHelper { | |||||
/** | |||||
* 获取专家的所有文件id | |||||
* 头像,学位证书,毕业证书,推荐证明材料,职称证明 | |||||
* | |||||
* @param expertUserFullInfoAll | |||||
* @return | |||||
*/ | |||||
public List<Long> getExpertFileIdList(ExpertFullInfoAllDTO expertUserFullInfoAll) { | |||||
ExpertUserFullInfoDTO expertUserInfoDTO = expertUserFullInfoAll.getExpertUserInfoDTO(); | |||||
List<Long> fileIdList = new ArrayList<>(); | |||||
if (Objects.nonNull(expertUserInfoDTO.getAvatarFileId())) { | |||||
fileIdList.add(expertUserInfoDTO.getAvatarFileId()); | |||||
} | |||||
if (CollectionUtils.isNotEmpty(expertUserInfoDTO.getDegreeCertificateFileIdList())) { | |||||
fileIdList.addAll(expertUserInfoDTO.getDegreeCertificateFileIdList()); | |||||
} | |||||
if (CollectionUtils.isNotEmpty(expertUserInfoDTO.getGraduationCertificateFileIdList())) { | |||||
fileIdList.addAll(expertUserInfoDTO.getGraduationCertificateFileIdList()); | |||||
} | |||||
if (CollectionUtils.isNotEmpty(expertUserInfoDTO.getRecommendationProofFileIdList())) { | |||||
fileIdList.addAll(expertUserInfoDTO.getRecommendationProofFileIdList()); | |||||
} | |||||
if (CollectionUtils.isNotEmpty(expertUserInfoDTO.getTitleCertificateFileIdList())) { | |||||
fileIdList.addAll(expertUserInfoDTO.getTitleCertificateFileIdList()); | |||||
} | |||||
return fileIdList; | |||||
} | |||||
} |
@@ -0,0 +1,142 @@ | |||||
package com.ningdatech.pmapi.expert.manage; | |||||
import cn.hutool.core.collection.CollectionUtil; | |||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.pmapi.common.helper.RegionLimitHelper; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | |||||
import com.ningdatech.pmapi.expert.constant.QueryExpertAccountStatusEnum; | |||||
import com.ningdatech.pmapi.expert.helper.PermissionCheckHelper; | |||||
import com.ningdatech.pmapi.expert.model.ExpertAdminExpertManageQuery; | |||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertAdminExpertManageQueryCmd; | |||||
import com.ningdatech.pmapi.expert.model.query.ExpertDictionaryQuery; | |||||
import com.ningdatech.pmapi.expert.model.query.ExpertTagQuery; | |||||
import com.ningdatech.pmapi.expert.model.vo.ExpertAdminExpertManageListVO; | |||||
import com.ningdatech.pmapi.meta.constant.DictExpertInfoTypeEnum; | |||||
import com.ningdatech.pmapi.meta.constant.ExpertTagEnum; | |||||
import com.ningdatech.pmapi.meta.model.bo.RegionContainsBO; | |||||
import com.ningdatech.pmapi.user.util.LoginUserUtil; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/3/1 下午2:12 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class ExpertAdminManage { | |||||
private final PermissionCheckHelper permissionCheckHelper; | |||||
private final RegionLimitHelper regionLimitHelper; | |||||
/** | |||||
* 专家管理员使用 专家库列表查询 | |||||
* | |||||
* @param query | |||||
* @return | |||||
*/ | |||||
public PageVo<ExpertAdminExpertManageListVO> getExpertLibraryList(ExpertAdminExpertManageQuery query) { | |||||
Long userId = LoginUserUtil.getUserId(); | |||||
ExpertAdminExpertManageQueryCmd expertAdminExpertManageQueryCmd = buildExpertAdminExpertManageQueryCmd(query, userId); | |||||
// CommonPage<ExpertAdminExpertManageListDTO> pageResult = | |||||
// expertAdminManageService.getExpertLibraryList(expertAdminExpertManageQueryCmd); | |||||
// | |||||
// PageVo<ExpertAdminExpertManageListVO> pageVo = new PageVo<>(); | |||||
// pageVo.setTotal(pageResult.getItemsTotal()); | |||||
// pageVo.setRecords(expertAdminExpertManageAssembler.toExpertAdminExpertManageListVOList(pageResult.getItems())); | |||||
// return pageVo; | |||||
return null; | |||||
} | |||||
private ExpertAdminExpertManageQueryCmd buildExpertAdminExpertManageQueryCmd(ExpertAdminExpertManageQuery query, Long userId) { | |||||
ExpertAdminExpertManageQueryCmd expertAdminExpertManageQueryCmd = new ExpertAdminExpertManageQueryCmd(); | |||||
expertAdminExpertManageQueryCmd.setPageNumber(query.getPageNumber()); | |||||
expertAdminExpertManageQueryCmd.setPageSize(query.getPageSize()); | |||||
if (StringUtils.isNotBlank(query.getExpertName())) { | |||||
expertAdminExpertManageQueryCmd.setExpertName(query.getExpertName()); | |||||
} | |||||
if (StringUtils.isNotBlank(query.getCompany())) { | |||||
expertAdminExpertManageQueryCmd.setCompany(query.getCompany()); | |||||
} | |||||
List<ExpertDictionaryQuery> expertDictionaryQueryList = new ArrayList<>(); | |||||
if (StringUtils.isNotBlank(query.getTitleLevelDictionaryCode())) { | |||||
ExpertDictionaryQuery expertDictionaryQuery = new ExpertDictionaryQuery(); | |||||
expertDictionaryQuery.setExpertInfoField(DictExpertInfoTypeEnum.TITLE_LEVEL.getKey()); | |||||
expertDictionaryQuery.setDictionaryCodeList(CollectionUtil.toList(query.getTitleLevelDictionaryCode())); | |||||
expertDictionaryQueryList.add(expertDictionaryQuery); | |||||
} | |||||
if (StringUtils.isNotBlank(query.getCompanyAttributeDictionaryCode())) { | |||||
ExpertDictionaryQuery expertDictionaryQuery = new ExpertDictionaryQuery(); | |||||
expertDictionaryQuery.setExpertInfoField(DictExpertInfoTypeEnum.COMPANY_ATTRIBUTE.getKey()); | |||||
expertDictionaryQuery.setDictionaryCodeList(CollectionUtil.toList(query.getCompanyAttributeDictionaryCode())); | |||||
expertDictionaryQueryList.add(expertDictionaryQuery); | |||||
} | |||||
if (StringUtils.isNotBlank(query.getExpertTypeDictionaryCode())) { | |||||
ExpertDictionaryQuery expertDictionaryQuery = new ExpertDictionaryQuery(); | |||||
expertDictionaryQuery.setExpertInfoField(DictExpertInfoTypeEnum.EXPERT_TYPE.getKey()); | |||||
expertDictionaryQuery.setDictionaryCodeList(CollectionUtil.toList(query.getExpertTypeDictionaryCode())); | |||||
expertDictionaryQueryList.add(expertDictionaryQuery); | |||||
} | |||||
List<ExpertTagQuery> expertTagQueryList = new ArrayList<>(); | |||||
if (StringUtils.isNotBlank(query.getExpertSourceTagCode())) { | |||||
ExpertTagQuery expertTagQuery = new ExpertTagQuery(); | |||||
expertTagQuery.setExpertInfoField(ExpertTagEnum.EXPERT_SOURCE.getKey()); | |||||
expertTagQuery.setTagCodeList(CollectionUtil.toList(query.getExpertSourceTagCode())); | |||||
expertTagQueryList.add(expertTagQuery); | |||||
} | |||||
if (StringUtils.isNotBlank(query.getGoodAtTagCode())) { | |||||
ExpertTagQuery expertTagQuery = new ExpertTagQuery(); | |||||
expertTagQuery.setExpertInfoField(ExpertTagEnum.GOOD_AT.getKey()); | |||||
expertTagQuery.setTagCodeList(CollectionUtil.toList(query.getGoodAtTagCode())); | |||||
expertTagQueryList.add(expertTagQuery); | |||||
} | |||||
if (StringUtils.isNotBlank(query.getExpertAccountStatus())) { | |||||
QueryExpertAccountStatusEnum queryExpertAccountStatusEnum = QueryExpertAccountStatusEnum.of(query.getExpertAccountStatus()); | |||||
switch (queryExpertAccountStatusEnum) { | |||||
case NORMAL: | |||||
expertAdminExpertManageQueryCmd | |||||
.setExpertAccountStatusList(CollectionUtil.toList(ExpertAccountStatusEnum.AVAILABLE)); | |||||
break; | |||||
case FREEZING: | |||||
expertAdminExpertManageQueryCmd | |||||
.setExpertAccountStatusList(CollectionUtil.toList(ExpertAccountStatusEnum.FREEZE)); | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
} else { | |||||
expertAdminExpertManageQueryCmd | |||||
.setExpertAccountStatusList(CollectionUtil.toList(ExpertAccountStatusEnum.AVAILABLE, ExpertAccountStatusEnum.FREEZE)); | |||||
} | |||||
List<RegionContainsBO> expertAdminContainsRegionList = new ArrayList<>(); | |||||
// 如果为超级管理员,可以查看所有的专家,包括没有层级的专家 | |||||
if (!permissionCheckHelper.isSuperAdmin()) { | |||||
expertAdminContainsRegionList = regionLimitHelper.getExpertAdminContainsRegion(userId); | |||||
} | |||||
List<RegionContainsBO> containsRegion = new ArrayList<>(); | |||||
if (Objects.nonNull(query.getExpertRegionInfo())) { | |||||
RegionContainsBO containsRegionBo = regionLimitHelper.getContainsRegionBo(query.getExpertRegionInfo().getRegionLevel() | |||||
, query.getExpertRegionInfo().getRegionCode()); | |||||
containsRegion = regionLimitHelper.queryContainsRegionAssembler(containsRegionBo, expertAdminContainsRegionList); | |||||
} else { | |||||
containsRegion = expertAdminContainsRegionList; | |||||
} | |||||
expertAdminExpertManageQueryCmd.setExpertDictionaryQueryList(expertDictionaryQueryList); | |||||
expertAdminExpertManageQueryCmd.setExpertTagQueryList(expertTagQueryList); | |||||
expertAdminExpertManageQueryCmd.setIsDingUser(query.getIsDingUser()); | |||||
expertAdminExpertManageQueryCmd.setRegionContainsList(containsRegion); | |||||
expertAdminExpertManageQueryCmd.setPageSize(query.getPageSize()); | |||||
expertAdminExpertManageQueryCmd.setPageNumber(query.getPageNumber()); | |||||
return expertAdminExpertManageQueryCmd; | |||||
} | |||||
} |
@@ -1,25 +1,36 @@ | |||||
package com.ningdatech.pmapi.expert.manage; | package com.ningdatech.pmapi.expert.manage; | ||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.ningdatech.file.entity.vo.result.AttachFileVo; | |||||
import com.ningdatech.file.service.FileService; | |||||
import com.ningdatech.pmapi.expert.assembler.ExpertInfoCmdAssembler; | import com.ningdatech.pmapi.expert.assembler.ExpertInfoCmdAssembler; | ||||
import com.ningdatech.pmapi.expert.assembler.ExpertUserInfoAssembler; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | ||||
import com.ningdatech.pmapi.expert.constant.ExpertUserInfoStepEnum; | import com.ningdatech.pmapi.expert.constant.ExpertUserInfoStepEnum; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | ||||
import com.ningdatech.pmapi.expert.helper.ExpertInfoCommonHelper; | |||||
import com.ningdatech.pmapi.expert.helper.ExpertManageHelper; | 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.*; | |||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | ||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertRecommendProofSaveCmd; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertDictionaryDTO; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertFullInfoAllDTO; | |||||
import com.ningdatech.pmapi.expert.model.req.ExpertRecommendProofSubmitRequest; | |||||
import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | ||||
import com.ningdatech.pmapi.expert.model.vo.ExpertFullInfoVO; | |||||
import com.ningdatech.pmapi.expert.service.ExpertInfoService; | import com.ningdatech.pmapi.expert.service.ExpertInfoService; | ||||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | ||||
import com.ningdatech.pmapi.meta.constant.DictExpertInfoTypeEnum; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | ||||
import com.ningdatech.pmapi.user.util.LoginUserUtil; | import com.ningdatech.pmapi.user.util.LoginUserUtil; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import java.util.ArrayList; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Objects; | import java.util.Objects; | ||||
import java.util.stream.Collectors; | |||||
/** | /** | ||||
* @author liuxinxin | * @author liuxinxin | ||||
@@ -31,10 +42,11 @@ import java.util.Objects; | |||||
public class ExpertManage { | public class ExpertManage { | ||||
private final ExpertManageHelper expertManageHelper; | private final ExpertManageHelper expertManageHelper; | ||||
private final IExpertUserFullInfoService iExpertUserFullInfoService; | private final IExpertUserFullInfoService iExpertUserFullInfoService; | ||||
private final ExpertInfoService expertInfoService; | private final ExpertInfoService expertInfoService; | ||||
private final ExpertInfoCommonHelper expertInfoCommonHelper; | |||||
private final FileService fileService; | |||||
private final ExpertUserInfoAssembler expertUserInfoAssembler; | |||||
/** | /** | ||||
@@ -75,4 +87,51 @@ public class ExpertManage { | |||||
} | } | ||||
public void expertRecommendProofSubmit(ExpertRecommendProofSubmitRequest request) { | |||||
// 用户id | |||||
Long expertUserId = LoginUserUtil.getUserId(); | |||||
ExpertUserFullInfo expertUserFullInfo = iExpertUserFullInfoService.getByUserId(expertUserId); | |||||
// 判断专家状态,是否可以进行证明材料提交 | |||||
if (Objects.isNull(expertUserFullInfo) | |||||
|| !ExpertAccountStatusEnum.APPLYING.getKey().equals(expertUserFullInfo.getExpertAccountStatus()) | |||||
|| ExpertUserInfoStepEnum.EVIDENCE_HAS_BEEN_SUBMITTED.getKey().equals(expertUserFullInfo.getUserInfoStep())) { | |||||
throw new BizException("当前状态无法提交证明材料"); | |||||
} | |||||
// 根据用户id 获取用户信息,获取手机号校验 验证码是否正确 | |||||
String phoneNo = expertUserFullInfo.getPhoneNo(); | |||||
String verificationCode = request.getVerificationCode(); | |||||
// 证明材料提交 | |||||
List<FileBasicInfo> recommendProofFile = request.getRecommendProofFile(); | |||||
List<DictionaryFieldInfo> recommendedWayList = request.getRecommendedWay(); | |||||
ExpertRecommendProofSaveCmd expertRecommendProofSaveCmd = new ExpertRecommendProofSaveCmd(); | |||||
if (CollectionUtils.isNotEmpty(recommendProofFile)) { | |||||
expertRecommendProofSaveCmd.setRecommendationProofFileIdList(recommendProofFile.stream().map(FileBasicInfo::getFileId).collect(Collectors.toList())); | |||||
} | |||||
List<ExpertDictionaryDTO> recommendedWayDictionaryDTOList = new ArrayList<>(); | |||||
if (CollectionUtils.isNotEmpty(recommendedWayList)) { | |||||
recommendedWayDictionaryDTOList = recommendedWayList.stream().map(r -> { | |||||
ExpertDictionaryDTO expertDictionaryDTO = new ExpertDictionaryDTO(); | |||||
expertDictionaryDTO.setDictionaryCode(r.getDictionaryCode()); | |||||
expertDictionaryDTO.setExpertInfoField(DictExpertInfoTypeEnum.RECOMMENDED_WAY.getKey()); | |||||
return expertDictionaryDTO; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
expertRecommendProofSaveCmd.setRecommendedWay(recommendedWayDictionaryDTOList); | |||||
expertRecommendProofSaveCmd.setUserId(expertUserId); | |||||
expertInfoService.expertRecommendProofSave(expertRecommendProofSaveCmd); | |||||
} | |||||
public ExpertFullInfoVO getExpertFullInfoDetail(Long expertUserId) { | |||||
Long currentUserId = LoginUserUtil.getUserId(); | |||||
if (Objects.isNull(expertUserId)) { | |||||
expertUserId = currentUserId; | |||||
} | |||||
ExpertFullInfoAllDTO expertUserFullInfoAll = expertInfoService.getExpertUserFullInfoAll(expertUserId); | |||||
if (Objects.isNull(expertUserFullInfoAll)) { | |||||
return null; | |||||
} | |||||
List<Long> fileIdList = expertInfoCommonHelper.getExpertFileIdList(expertUserFullInfoAll); | |||||
List<AttachFileVo> attachFiles = fileService.getByIds(fileIdList); | |||||
return expertUserInfoAssembler.buildExpertFullInfoVO(attachFiles, expertUserFullInfoAll); } | |||||
} | } |
@@ -0,0 +1,527 @@ | |||||
package com.ningdatech.pmapi.expert.manage; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import cn.hutool.core.collection.CollectionUtil; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.basic.util.CollUtils; | |||||
import com.ningdatech.pmapi.common.enumeration.BoolDisplayEnum; | |||||
import com.ningdatech.pmapi.common.helper.RegionLimitHelper; | |||||
import com.ningdatech.pmapi.common.helper.UserInfoHelper; | |||||
import com.ningdatech.pmapi.common.util.BizUtils; | |||||
import com.ningdatech.pmapi.expert.assembler.RegionWrapperAssembler; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyStatusEnum; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyTypeEnum; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyTypeQueryEnum; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertMetaApply; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||||
import com.ningdatech.pmapi.expert.model.DictionaryFieldInfo; | |||||
import com.ningdatech.pmapi.expert.model.TagFieldInfo; | |||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertAdminExpertManageQueryCmd; | |||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertStorageDealCmd; | |||||
import com.ningdatech.pmapi.expert.model.cmd.MetaApplyListQuery; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertDictionaryDTO; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertTagDTO; | |||||
import com.ningdatech.pmapi.expert.model.query.ExpertDictionaryQuery; | |||||
import com.ningdatech.pmapi.expert.model.req.MetaApplyResultRequest; | |||||
import com.ningdatech.pmapi.expert.model.vo.ExpertApplyMetaVO; | |||||
import com.ningdatech.pmapi.expert.model.vo.MetaApplyResultVo; | |||||
import com.ningdatech.pmapi.expert.service.ExpertInfoService; | |||||
import com.ningdatech.pmapi.expert.service.IExpertMetaApplyService; | |||||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||||
import com.ningdatech.pmapi.meta.constant.DictExpertInfoTypeEnum; | |||||
import com.ningdatech.pmapi.meta.helper.DictionaryCache; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||||
import com.ningdatech.pmapi.meta.model.bo.RegionContainsBO; | |||||
import com.ningdatech.pmapi.meta.model.dto.DictionaryDTO; | |||||
import com.ningdatech.pmapi.meta.model.entity.ExpertDictionary; | |||||
import com.ningdatech.pmapi.meta.service.IExpertDictionaryService; | |||||
import com.ningdatech.pmapi.user.util.LoginUserUtil; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
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.Map; | |||||
import java.util.Objects; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/3/1 上午10:38 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class ExpertMetaApplyManage { | |||||
private final IExpertMetaApplyService iMetaApplyService; | |||||
private final IExpertDictionaryService expertDictionaryService; | |||||
// private final IExpertAdminManageService ExpertAdminManageService; | |||||
private final IExpertUserFullInfoService userFullInfoService; | |||||
private final DictionaryCache dictionaryCache; | |||||
private final ExpertInfoService expertInfoService; | |||||
private final UserInfoHelper userInfoHelper; | |||||
private final RegionLimitHelper regionLimitHelper; | |||||
public PageVo<ExpertApplyMetaVO> metaApplyListQuery(MetaApplyListQuery req) { | |||||
Long expertAdminUserId = LoginUserUtil.getUserId(); | |||||
// 查找符合专家条件的用户id | |||||
List<RegionContainsBO> viewRegions = regionLimitHelper.getExpertAdminContainsRegion(expertAdminUserId); | |||||
ExpertAdminExpertManageQueryCmd queryCmd = buildExpertAdminExpertManageQueryCmd(req, viewRegions); | |||||
// TODO | |||||
// List<Long> filterExpertUserIdList = expertAdminManageService.filterExpertUserIdList(queryCmd); | |||||
List<Long> filterExpertUserIdList = new ArrayList<>(); | |||||
if (CollUtil.isEmpty(filterExpertUserIdList)) { | |||||
return PageVo.empty(); | |||||
} | |||||
LambdaQueryWrapper<ExpertMetaApply> expertMetaApplyListQuery = | |||||
buildMetaApplyListQueryWrapper(req, filterExpertUserIdList, viewRegions); | |||||
RegionWrapperAssembler.expertMetaApplyRegionContainsWrapperAssembler(expertMetaApplyListQuery, viewRegions); | |||||
Page<ExpertMetaApply> pageResult = iMetaApplyService.page(req.page(), expertMetaApplyListQuery); | |||||
PageVo<ExpertApplyMetaVO> result = new PageVo<>(); | |||||
result.setTotal(pageResult.getTotal()); | |||||
BizUtils.notEmpty(pageResult.getRecords(), records -> { | |||||
List<Long> expertIds = CollUtils.fieldList(records, ExpertMetaApply::getUserId); | |||||
// 根据用户id 获取专家基本信息 | |||||
List<ExpertUserFullInfo> expertList = userFullInfoService.listByUserIds(expertIds); | |||||
Map<Long, ExpertUserFullInfo> expertMap = CollUtils.listToMap(expertList, ExpertUserFullInfo::getUserId); | |||||
List<ExpertDictionary> expertDictList = expertDictionaryService.listByUserId(expertIds, DictExpertInfoTypeEnum.TITLE_LEVEL); | |||||
Map<Long, List<ExpertDictionary>> dictMap = CollUtils.group(expertDictList, ExpertDictionary::getUserId); | |||||
result.setRecords(buildExpertApplyMetaVOList(records, expertMap, dictMap)); | |||||
}); | |||||
return result; | |||||
} | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public void metaApplyResult(MetaApplyResultRequest req) { | |||||
Long applyId = req.getApplyId(); | |||||
ExpertMetaApply expertMetaApply = iMetaApplyService.getById(applyId); | |||||
Long userId = LoginUserUtil.getUserId(); | |||||
// 校验专家管理员区域权限,是否可以审核当前专家申请 | |||||
// permissionCheckHelper.operationPermissionsCheck(userId, expertMetaApply.getUserId()); | |||||
String applyStatus = expertMetaApply.getApplyStatus(); | |||||
if (!ExpertApplyStatusEnum.PENDING_REVIEW.getKey().equals(applyStatus)) { | |||||
throw BizException.wrap("apply is already processed"); | |||||
} | |||||
ExpertApplyTypeEnum applyType = ExpertApplyTypeEnum.of(expertMetaApply.getApplyType()); | |||||
boolean applyResult = req.getApplyResult(); | |||||
switch (applyType) { | |||||
// 专家入库 | |||||
case EXPERT_STORAGE: { | |||||
ExpertStorageDealCmd expertStorageDealCmd = buildExpertStorageDealCmd(req, expertMetaApply.getUserId(), expertMetaApply); | |||||
expertInfoService.expertStorageDeal(expertStorageDealCmd); | |||||
// 专家入库时,需要先审核专家入库,入库成功后,再履职意向审核,如果履职意向跟专家层级是同一层级的,就直接同意不需要审核 | |||||
if (applyResult) { | |||||
Long expertUserId = expertMetaApply.getUserId(); | |||||
// ExpertRegionInfo expertRegionInfo = expertUserInfoHelper.getExpertRegionInfo(expertUserId); | |||||
// Integer regionLevel = expertRegionInfo.getRegionLevel(); | |||||
// String regionCode = expertRegionInfo.getRegionCode(); | |||||
List<ExpertMetaApply> expertJoinApplyList = iMetaApplyService.list(Wrappers.lambdaQuery(ExpertMetaApply.class) | |||||
.eq(ExpertMetaApply::getUserId, expertUserId) | |||||
.eq(ExpertMetaApply::getApplyStatus, ExpertApplyStatusEnum.PENDING_REVIEW.getKey()) | |||||
.eq(ExpertMetaApply::getApplyType, ExpertApplyTypeEnum.EXPERT_INTENTION_JOIN.getKey()) | |||||
.eq(ExpertMetaApply::getDisplayEnable, BoolDisplayEnum.Y.name())); | |||||
// .eq(ExpertMetaApply::getRegionLevel, regionLevel) | |||||
// .eq(ExpertMetaApply::getRegionCode, regionCode)); | |||||
BizUtils.notEmpty(expertJoinApplyList, list -> list.forEach(r -> { | |||||
MetaApplyResultRequest resultRequest = new MetaApplyResultRequest(); | |||||
resultRequest.setApplyId(r.getId()); | |||||
resultRequest.setApplyResult(true); | |||||
resultRequest.setAuditOpinion("同意"); | |||||
metaApplyResult(resultRequest); | |||||
})); | |||||
} | |||||
} | |||||
break; | |||||
// 专家出库 | |||||
case EXPERT_DELIVERY: | |||||
// ExpertDeliveryDealCmd expertDeliveryDealCmd = buildExpertDeliveryDealCmd(req, expertMetaApply.getUserId()); | |||||
// expertInfoService.expertDeliveryDeal(expertDeliveryDealCmd); | |||||
break; | |||||
// 长期请假 | |||||
case LONG_TERM_LEAVE: | |||||
// leaveManage.leaveAuditCallback(req.getApplyResult(), applyId); | |||||
break; | |||||
// 专家信息审核 | |||||
case EXPERT_INFO_MODIFY: | |||||
// ExpertInfoModifyApplyDealCmd applyDealCmd = buildExpertInfoModifyApplyDealCmd(req, expertMetaApply.getUserId(), applyId); | |||||
// expertInfoService.expertInfoModifyDeal(applyDealCmd); | |||||
break; | |||||
// 专家履职意向加入/离开 | |||||
case EXPERT_INTENTION_JOIN: | |||||
case EXPERT_INTENTION_LEAVE: | |||||
// ExpertIntentionApplyDealCmd expertIntentionApplyDealCmd = buildExpertIntentionApplyDealCmd(req, expertMetaApply); | |||||
// expertInfoService.expertIntentionApplyDeal(expertIntentionApplyDealCmd); | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
Long expertUserId = expertMetaApply.getUserId(); | |||||
String auditOpinion = req.getAuditOpinion(); | |||||
// 发送审核结果短信 | |||||
// sendApplyResultNotify(applyType, applyResult, auditOpinion, expertUserId); | |||||
// 更新申请结果 | |||||
expertMetaApply.setApproverUserId(userId); | |||||
String adminUserName = userInfoHelper.getUserName(userId); | |||||
expertMetaApply.setApprover(adminUserName); | |||||
expertMetaApply.setAuditOpinion(auditOpinion); | |||||
expertMetaApply.setApplyStatus(applyResult ? ExpertApplyStatusEnum.PASSED.getKey() : ExpertApplyStatusEnum.REFUSED.getKey()); | |||||
expertMetaApply.setReviewTime(LocalDateTime.now()); | |||||
expertMetaApply.setUpdateOn(LocalDateTime.now()); | |||||
iMetaApplyService.saveOrUpdate(expertMetaApply); | |||||
} | |||||
public MetaApplyResultVo metaApplyResult(Long applyId) { | |||||
ExpertMetaApply metaApply = iMetaApplyService.getById(applyId); | |||||
if (Objects.isNull(metaApply)) { | |||||
throw BizException.wrap("当前审核不存在"); | |||||
} | |||||
MetaApplyResultVo metaApplyResultVo = MetaApplyResultVo.builder() | |||||
.applyTime(metaApply.getCreateOn()) | |||||
.auditor(metaApply.getApprover()) | |||||
.expertUserId(metaApply.getUserId()) | |||||
.auditOption(metaApply.getAuditOpinion()) | |||||
.auditStatus(metaApply.getApplyStatus()) | |||||
.auditTime(metaApply.getReviewTime()) | |||||
.build(); | |||||
String extraMaterialStr = metaApply.getExtraMaterial(); | |||||
// if (StringUtils.isNotBlank(extraMaterialStr)) { | |||||
// ExtraMaterialDO extraMaterialDO = JSONObject.parseObject(extraMaterialStr, ExtraMaterialDO.class); | |||||
// ModifyApplyExtraInfo modifyApplyExtraInfo = new ModifyApplyExtraInfo(); | |||||
// BizUtils.notEmpty(extraMaterialDO.getEvidenceList(), list -> { | |||||
// List<Long> fileIdList = CollUtils.fieldList(list, FileBasicInfo::getFileId); | |||||
// List<AttachFileVo> attachFiles = fileService.getByIds(fileIdList); | |||||
// List<FileBasicInfo> tempList = attachFiles.stream().map(r -> { | |||||
// FileBasicInfo fileBasicInfo = new FileBasicInfo(); | |||||
// fileBasicInfo.setFileId(r.getFileId()); | |||||
// fileBasicInfo.setFileName(r.getOriginalFileName()); | |||||
// return fileBasicInfo; | |||||
// }).collect(Collectors.toList()); | |||||
// modifyApplyExtraInfo.setEvidenceList(tempList); | |||||
// }); | |||||
// modifyApplyExtraInfo.setFactSheet(extraMaterialDO.getFactSheet()); | |||||
// metaApplyResultVo.setModifyApplyExtraInfo(modifyApplyExtraInfo); | |||||
// } | |||||
String applyType = metaApply.getApplyType(); | |||||
ExpertApplyTypeEnum applyTypeEnum = ExpertApplyTypeEnum.of(applyType); | |||||
switch (applyTypeEnum) { | |||||
// case EXPERT_INFO_MODIFY: | |||||
// buildInfoModifyApplyDisplayVO(metaApplyResultVo, metaApply); | |||||
// break; | |||||
case EXPERT_INTENTION_JOIN: | |||||
case EXPERT_INTENTION_LEAVE: | |||||
buildIntentionApplyDisplayVO(metaApplyResultVo, metaApply, applyTypeEnum); | |||||
break; | |||||
case EXPERT_DELIVERY: | |||||
case LONG_TERM_LEAVE: | |||||
case EXPERT_STORAGE: | |||||
default: | |||||
break; | |||||
} | |||||
metaApplyResultVo.setApplyType(applyTypeTrans(applyTypeEnum)); | |||||
return metaApplyResultVo; | |||||
} | |||||
public void metaApplyRevoke(Long applyId) { | |||||
Long userId = LoginUserUtil.getUserId(); | |||||
ExpertMetaApply expertMetaApply = iMetaApplyService.getById(applyId); | |||||
if (Objects.isNull(expertMetaApply)) { | |||||
throw new BizException("apply not exist"); | |||||
} | |||||
if (!expertMetaApply.getUserId().equals(userId)) { | |||||
throw new BizException("has not right to operate"); | |||||
} | |||||
String applyStatus = expertMetaApply.getApplyStatus(); | |||||
ExpertApplyStatusEnum expertApplyStatusEnum = ExpertApplyStatusEnum.of(applyStatus); | |||||
if (!ExpertApplyStatusEnum.PENDING_REVIEW.equals(expertApplyStatusEnum)) { | |||||
throw new BizException("apply is already deal"); | |||||
} | |||||
expertMetaApply.setApplyStatus(ExpertApplyStatusEnum.REVOKED.getKey()); | |||||
expertMetaApply.setUpdateOn(LocalDateTime.now()); | |||||
iMetaApplyService.updateById(expertMetaApply); | |||||
} | |||||
private void buildIntentionApplyDisplayVO(MetaApplyResultVo metaApplyResultVo, ExpertMetaApply metaApply, ExpertApplyTypeEnum applyTypeEnum) { | |||||
String regionCode = metaApply.getRegionCode(); | |||||
Integer regionLevel = metaApply.getRegionLevel(); | |||||
// String unionPathStr = regionCache.getUnionPathStr(regionCode, regionLevel); | |||||
MetaApplyResultVo.IntentionApplyDisplayVO intentionApplyDisplayVO = new MetaApplyResultVo.IntentionApplyDisplayVO(); | |||||
intentionApplyDisplayVO.setExpertApplyId(metaApply.getId()); | |||||
ExpertRegionInfo expertRegionInfo = new ExpertRegionInfo(); | |||||
expertRegionInfo.setRegionCode(regionCode); | |||||
expertRegionInfo.setRegionLevel(regionLevel); | |||||
// expertRegionInfo.setRegionName(unionPathStr); | |||||
switch (applyTypeEnum) { | |||||
case EXPERT_INTENTION_LEAVE: { | |||||
intentionApplyDisplayVO.setReduceExpertRegion(expertRegionInfo); | |||||
} | |||||
break; | |||||
case EXPERT_INTENTION_JOIN: { | |||||
intentionApplyDisplayVO.setAddExpertRegion(expertRegionInfo); | |||||
} | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
metaApplyResultVo.setIntentionApplyDisplayVo(intentionApplyDisplayVO); | |||||
} | |||||
// private void buildInfoModifyApplyDisplayVO(MetaApplyResultVo metaApplyResultVo, ExpertMetaApply infoModifyApply) { | |||||
// InfoModifyApplyDisplayVO infoModifyApplyDisplayVo = new InfoModifyApplyDisplayVO(); | |||||
// if (Objects.nonNull(infoModifyApply)) { | |||||
// Long metaApplyId = infoModifyApply.getId(); | |||||
// LambdaQueryWrapper<ExpertSensitiveInfoModifyDetailRecord> eq = Wrappers.lambdaQuery(ExpertSensitiveInfoModifyDetailRecord.class) | |||||
// .eq(ExpertSensitiveInfoModifyDetailRecord::getMetaApplyId, metaApplyId); | |||||
// ExpertSensitiveInfoModifyDetailRecord one = iExpertSensitiveInfoModifyDetailRecordService.getOne(eq); | |||||
// String originalJson = null; | |||||
// if (StringUtils.isNotBlank(one.getOriginalJson())) { | |||||
// originalJson = GzipUtils.uncompress(one.getOriginalJson()); | |||||
// } | |||||
// List<SensitiveModifySegment> sensitiveModifySegments = JSONUtils.parseArray(originalJson, SensitiveModifySegment.class); | |||||
// | |||||
// infoModifyApplyDisplayVo.setExpertApplyId(metaApplyId); | |||||
// List<InfoModifyApplyDisplayVO.InfoModifyApplyDisplayValue> displayValueList = new ArrayList<>(); | |||||
// for (SensitiveModifySegment segment : sensitiveModifySegments) { | |||||
// InfoModifyApplyDisplayVO.InfoModifyApplyDisplayValue displayValue = sensitiveModifySegmentParser.getDisplayValue(segment); | |||||
// displayValueList.add(displayValue); | |||||
// } | |||||
// infoModifyApplyDisplayVo.setInfoModifyApplyDisplayValueList(displayValueList); | |||||
// metaApplyResultVo.setInfoModifyApplyDisplayVo(infoModifyApplyDisplayVo); | |||||
// } | |||||
// } | |||||
private String applyTypeTrans(ExpertApplyTypeEnum applyTypeEnum) { | |||||
switch (applyTypeEnum) { | |||||
case EXPERT_INTENTION_JOIN: | |||||
case EXPERT_INTENTION_LEAVE: { | |||||
return ExpertApplyTypeQueryEnum.EXPERT_INTENTION_CHANGE.getKey(); | |||||
} | |||||
case EXPERT_INFO_MODIFY: { | |||||
return ExpertApplyTypeQueryEnum.EXPERT_INFO_MODIFY.getKey(); | |||||
} | |||||
case LONG_TERM_LEAVE: { | |||||
return ExpertApplyTypeQueryEnum.LONG_TERM_LEAVE.getKey(); | |||||
} | |||||
case EXPERT_DELIVERY: { | |||||
return ExpertApplyTypeQueryEnum.EXPERT_DELIVERY.getKey(); | |||||
} | |||||
case EXPERT_STORAGE: { | |||||
return ExpertApplyTypeQueryEnum.EXPERT_STORAGE.getKey(); | |||||
} | |||||
default: | |||||
return null; | |||||
} | |||||
} | |||||
private List<String> applyTypeTrans(ExpertApplyTypeQueryEnum applyTypeQueryEnum) { | |||||
List<String> applyTypeList = new ArrayList<>(); | |||||
switch (applyTypeQueryEnum) { | |||||
case EXPERT_INTENTION_CHANGE: { | |||||
applyTypeList.add(ExpertApplyTypeEnum.EXPERT_INTENTION_JOIN.getKey()); | |||||
applyTypeList.add(ExpertApplyTypeEnum.EXPERT_INTENTION_LEAVE.getKey()); | |||||
} | |||||
break; | |||||
case EXPERT_INFO_MODIFY: { | |||||
applyTypeList.add(ExpertApplyTypeEnum.EXPERT_INFO_MODIFY.getKey()); | |||||
} | |||||
break; | |||||
case LONG_TERM_LEAVE: { | |||||
applyTypeList.add(ExpertApplyTypeEnum.LONG_TERM_LEAVE.getKey()); | |||||
} | |||||
break; | |||||
case EXPERT_DELIVERY: { | |||||
applyTypeList.add(ExpertApplyTypeEnum.EXPERT_DELIVERY.getKey()); | |||||
} | |||||
break; | |||||
case EXPERT_STORAGE: { | |||||
applyTypeList.add(ExpertApplyTypeEnum.EXPERT_STORAGE.getKey()); | |||||
} | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
return applyTypeList; | |||||
} | |||||
private ExpertAdminExpertManageQueryCmd buildExpertAdminExpertManageQueryCmd(MetaApplyListQuery query, List<RegionContainsBO> expertAdminContainsRegionList) { | |||||
ExpertAdminExpertManageQueryCmd expertAdminExpertManageQueryCmd = new ExpertAdminExpertManageQueryCmd(); | |||||
expertAdminExpertManageQueryCmd.setPageNumber(query.getPageNumber()); | |||||
expertAdminExpertManageQueryCmd.setPageSize(query.getPageSize()); | |||||
if (StringUtils.isNotBlank(query.getExpertName())) { | |||||
expertAdminExpertManageQueryCmd.setExpertName(query.getExpertName()); | |||||
} | |||||
if (StringUtils.isNotBlank(query.getCompanyName())) { | |||||
expertAdminExpertManageQueryCmd.setCompany(query.getCompanyName()); | |||||
} | |||||
List<ExpertDictionaryQuery> expertDictionaryQueryList = new ArrayList<>(); | |||||
if (StringUtils.isNotBlank(query.getTitleLevelDictionaryCode())) { | |||||
ExpertDictionaryQuery expertDictionaryQuery = new ExpertDictionaryQuery(); | |||||
expertDictionaryQuery.setExpertInfoField(DictExpertInfoTypeEnum.TITLE_LEVEL.getKey()); | |||||
expertDictionaryQuery.setDictionaryCodeList(CollectionUtil.toList(query.getTitleLevelDictionaryCode())); | |||||
expertDictionaryQueryList.add(expertDictionaryQuery); | |||||
} | |||||
List<RegionContainsBO> containsRegion; | |||||
if (Objects.nonNull(query.getExpertRegion())) { | |||||
RegionContainsBO containsRegionBo = regionLimitHelper.getContainsRegionBo(query.getExpertRegion().getRegionLevel() | |||||
, query.getExpertRegion().getRegionCode()); | |||||
containsRegion = regionLimitHelper.queryContainsRegionAssembler(containsRegionBo, expertAdminContainsRegionList); | |||||
} else { | |||||
containsRegion = expertAdminContainsRegionList; | |||||
} | |||||
expertAdminExpertManageQueryCmd.setExpertDictionaryQueryList(expertDictionaryQueryList); | |||||
expertAdminExpertManageQueryCmd.setRegionContainsList(containsRegion); | |||||
expertAdminExpertManageQueryCmd.setPageSize(query.getPageSize()); | |||||
expertAdminExpertManageQueryCmd.setPageNumber(query.getPageNumber()); | |||||
return expertAdminExpertManageQueryCmd; | |||||
} | |||||
/** | |||||
* 装配 专家审核列表筛选返回VO | |||||
* | |||||
* @param expertMetaApplyList / | |||||
* @param expertUserFullInfoMap / | |||||
* @param expertDictionaryListMap / | |||||
* @return / | |||||
*/ | |||||
private List<ExpertApplyMetaVO> buildExpertApplyMetaVOList(List<ExpertMetaApply> expertMetaApplyList | |||||
, Map<Long, ExpertUserFullInfo> expertUserFullInfoMap | |||||
, Map<Long, List<ExpertDictionary>> expertDictionaryListMap) { | |||||
List<ExpertApplyMetaVO> expertApplyMetaVOList = new ArrayList<>(); | |||||
for (ExpertMetaApply expertMetaApply : expertMetaApplyList) { | |||||
ExpertApplyMetaVO expertApplyMetaVO = new ExpertApplyMetaVO(); | |||||
Long userId = expertMetaApply.getUserId(); | |||||
ExpertUserFullInfo expertUserFullInfo = expertUserFullInfoMap.get(userId); | |||||
expertApplyMetaVO.setId(expertMetaApply.getId()); | |||||
expertApplyMetaVO.setUserId(userId); | |||||
expertApplyMetaVO.setApplyStatus(expertMetaApply.getApplyStatus()); | |||||
String applyType = expertMetaApply.getApplyType(); | |||||
if (Objects.nonNull(applyType)) { | |||||
expertApplyMetaVO.setApplyType(applyTypeTrans(ExpertApplyTypeEnum.of(applyType))); | |||||
} | |||||
expertApplyMetaVO.setName(expertUserFullInfo.getExpertName()); | |||||
// RegionDTO regionDTO = regionCache.getByCodeAndLevel(expertUserFullInfo.getRegionCode(), expertUserFullInfo.getRegionLevel()); | |||||
ExpertRegionInfo expertRegionInfo = new ExpertRegionInfo(); | |||||
expertRegionInfo.setRegionCode(expertUserFullInfo.getRegionCode()); | |||||
expertRegionInfo.setRegionLevel(expertUserFullInfo.getRegionLevel()); | |||||
// expertRegionInfo.setRegionName(regionDTO.getRegionName()); | |||||
expertApplyMetaVO.setExpertRegionInfo(expertRegionInfo); | |||||
List<ExpertDictionary> expertDictionaryList = expertDictionaryListMap.get(userId); | |||||
if (CollectionUtils.isNotEmpty(expertDictionaryList)) { | |||||
expertApplyMetaVO.setTitleLevel(expertDictionaryList.stream().map(r -> { | |||||
DictionaryDTO dictionaryDTO = dictionaryCache.getByCode(r.getDictionaryCode()); | |||||
DictionaryFieldInfo dictionaryFieldInfo = new DictionaryFieldInfo(); | |||||
dictionaryFieldInfo.setDictionaryCode(r.getDictionaryCode()); | |||||
dictionaryFieldInfo.setDictionaryFieldName(r.getExpertInfoField()); | |||||
if (Objects.nonNull(dictionaryDTO)) { | |||||
dictionaryFieldInfo.setDictionaryName(dictionaryDTO.getName()); | |||||
} | |||||
return dictionaryFieldInfo; | |||||
}).collect(Collectors.toList())); | |||||
} | |||||
expertApplyMetaVO.setCompany(expertUserFullInfo.getCompany()); | |||||
expertApplyMetaVO.setPhoneNo(expertUserFullInfo.getPhoneNo()); | |||||
expertApplyMetaVO.setApplyTime(expertMetaApply.getCreateOn()); | |||||
expertApplyMetaVOList.add(expertApplyMetaVO); | |||||
} | |||||
return expertApplyMetaVOList; | |||||
} | |||||
private LambdaQueryWrapper<ExpertMetaApply> buildMetaApplyListQueryWrapper(MetaApplyListQuery applyListReq, | |||||
List<Long> expertIdList, | |||||
List<RegionContainsBO> viewRegions) { | |||||
// 审核类型 | |||||
List<String> applyTypeList = new ArrayList<>(); | |||||
if (CollUtil.isNotEmpty(applyListReq.getApplyTypeList())) { | |||||
List<ExpertApplyTypeQueryEnum> applyTypeQueryEnumList = applyListReq.getApplyTypeList(); | |||||
for (ExpertApplyTypeQueryEnum applyTypeQueryEnum : applyTypeQueryEnumList) { | |||||
applyTypeList.addAll(applyTypeTrans(applyTypeQueryEnum)); | |||||
} | |||||
} | |||||
// 审核结果 | |||||
List<String> applyStatusList = new ArrayList<>(); | |||||
if (CollUtil.isNotEmpty(applyListReq.getApplyStatusList())) { | |||||
applyStatusList = CollUtils.fieldList(applyListReq.getApplyStatusList(), ExpertApplyStatusEnum::getKey); | |||||
; | |||||
} | |||||
LocalDateTime applyStartTime = applyListReq.getApplyStartTime(); | |||||
LocalDateTime applyEndTime = applyListReq.getApplyEndTime(); | |||||
// 不展示撤回的申请记录 | |||||
LambdaQueryWrapper<ExpertMetaApply> expertMetaApplyListQuery = Wrappers.lambdaQuery(ExpertMetaApply.class) | |||||
.in(CollectionUtils.isNotEmpty(applyTypeList), ExpertMetaApply::getApplyType, applyTypeList) | |||||
.in(CollectionUtils.isNotEmpty(applyStatusList), ExpertMetaApply::getApplyStatus, applyStatusList) | |||||
.in(ExpertMetaApply::getDisplayEnable, BoolDisplayEnum.Y.name()) | |||||
.in(CollectionUtils.isNotEmpty(expertIdList), ExpertMetaApply::getUserId, expertIdList) | |||||
.gt(Objects.nonNull(applyStartTime), ExpertMetaApply::getCreateOn, applyStartTime) | |||||
.lt(Objects.nonNull(applyEndTime), ExpertMetaApply::getCreateOn, applyEndTime) | |||||
.ne(ExpertMetaApply::getApplyStatus, ExpertApplyStatusEnum.REVOKED.getKey()) | |||||
.orderByDesc(ExpertMetaApply::getCreateOn); | |||||
RegionWrapperAssembler.expertMetaApplyRegionContainsWrapperAssembler(expertMetaApplyListQuery, viewRegions); | |||||
return expertMetaApplyListQuery; | |||||
} | |||||
private ExpertStorageDealCmd buildExpertStorageDealCmd( | |||||
MetaApplyResultRequest applyResultRequest, Long expertUserId, ExpertMetaApply expertMetaApply) { | |||||
MetaApplyResultRequest.StorageApplyResultExtraInfo extraInfo = applyResultRequest.getStorageApplyResultExtraInfo(); | |||||
ExpertStorageDealCmd expertStorageDealCmd = new ExpertStorageDealCmd(); | |||||
Boolean applyResult = applyResultRequest.getApplyResult(); | |||||
expertStorageDealCmd.setApplyResult(applyResult); | |||||
if (Objects.nonNull(extraInfo)) { | |||||
List<DictionaryFieldInfo> expertType = extraInfo.getExpertType(); | |||||
if (CollectionUtils.isNotEmpty(expertType)) { | |||||
expertStorageDealCmd.setExpertType(extraInfo.getExpertType().stream().map(r -> { | |||||
ExpertDictionaryDTO expertDictionaryDTO = new ExpertDictionaryDTO(); | |||||
expertDictionaryDTO.setExpertInfoField(r.getDictionaryFieldName()); | |||||
expertDictionaryDTO.setDictionaryCode(r.getDictionaryCode()); | |||||
return expertDictionaryDTO; | |||||
}).collect(Collectors.toList())); | |||||
} | |||||
List<TagFieldInfo> other = extraInfo.getOther(); | |||||
if (CollectionUtils.isNotEmpty(other)) { | |||||
expertStorageDealCmd.setOther(extraInfo.getOther().stream().map(r -> { | |||||
ExpertTagDTO expertTagDTO = new ExpertTagDTO(); | |||||
expertTagDTO.setExpertInfoField(r.getTagFieldName()); | |||||
expertTagDTO.setTagCode(r.getTagCode()); | |||||
return expertTagDTO; | |||||
}).collect(Collectors.toList())); | |||||
} | |||||
expertStorageDealCmd.setRemark(extraInfo.getRemark()); | |||||
} | |||||
expertStorageDealCmd.setExpertUserId(expertUserId); | |||||
expertStorageDealCmd.setJoinRegionCode(expertMetaApply.getRegionCode()); | |||||
expertStorageDealCmd.setJoinRegionLevel(expertMetaApply.getRegionLevel()); | |||||
return expertStorageDealCmd; | |||||
} | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.pmapi.expert.mapper; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertMetaApply; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
/** | |||||
* <p> | |||||
* Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author Liuxinxin | |||||
* @since 2023-03-01 | |||||
*/ | |||||
public interface ExpertMetaApplyMapper extends BaseMapper<ExpertMetaApply> { | |||||
} |
@@ -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.ExpertMetaApplyMapper"> | |||||
</mapper> |
@@ -0,0 +1,48 @@ | |||||
package com.ningdatech.pmapi.expert.model; | |||||
import com.ningdatech.basic.model.PagePo; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/4 上午10:18 | |||||
*/ | |||||
@Data | |||||
@ApiModel("专家库筛选接口") | |||||
public class ExpertAdminExpertManageQuery extends PagePo { | |||||
@ApiModelProperty("专家姓名(精准匹配)") | |||||
private String expertName; | |||||
@ApiModelProperty("工作单位(模糊匹配)") | |||||
private String company; | |||||
@ApiModelProperty("职称级别字典编码") | |||||
private String titleLevelDictionaryCode; | |||||
@ApiModelProperty("单位属性字典编码") | |||||
private String companyAttributeDictionaryCode; | |||||
@ApiModelProperty(value = "专家账号状态", allowableValues = "冻结:freezing,正常:normal") | |||||
private String expertAccountStatus; | |||||
@ApiModelProperty("区域信息") | |||||
private ExpertRegionInfo expertRegionInfo; | |||||
@ApiModelProperty(value = "是否浙政钉用户") | |||||
private Boolean isDingUser; | |||||
@ApiModelProperty("内外围字典编码") | |||||
private String expertTypeDictionaryCode; | |||||
@ApiModelProperty("专家来源标签编码") | |||||
private String expertSourceTagCode; | |||||
@ApiModelProperty("擅长方向标签编码") | |||||
private String goodAtTagCode; | |||||
} |
@@ -0,0 +1,29 @@ | |||||
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 下午4:18 | |||||
* 提交修改申请额外信息 | |||||
*/ | |||||
@Data | |||||
@ApiModel("提交修改申请额外信息,保存于expert_meta_apply表的 extra_material 字段") | |||||
public class ExtraMaterialDO { | |||||
/** | |||||
* 情况说明 | |||||
*/ | |||||
@ApiModelProperty("申请说明") | |||||
private String factSheet; | |||||
/** | |||||
* 证明材料 | |||||
*/ | |||||
@ApiModelProperty("证明材料") | |||||
private List<FileBasicInfo> evidenceList; | |||||
} |
@@ -0,0 +1,41 @@ | |||||
package com.ningdatech.pmapi.expert.model; | |||||
import lombok.Data; | |||||
import java.util.Objects; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/22 上午10:07 | |||||
*/ | |||||
@Data | |||||
public class RegionDtoMapKey { | |||||
/** | |||||
* 区域码 | |||||
*/ | |||||
private String regionCode; | |||||
/** | |||||
* 地区级别 | |||||
*/ | |||||
private Integer regionLevel; | |||||
@Override | |||||
public boolean equals(Object o) { | |||||
if (this == o) { | |||||
return true; | |||||
} | |||||
if (o == null || getClass() != o.getClass()) { | |||||
return false; | |||||
} | |||||
RegionDtoMapKey regionDtoMapKey = (RegionDtoMapKey) o; | |||||
return regionCode.equals(regionDtoMapKey.getRegionCode()) && | |||||
regionLevel.equals(regionDtoMapKey.getRegionLevel()); | |||||
} | |||||
@Override | |||||
public int hashCode() { | |||||
return Objects.hash(regionCode, regionLevel); | |||||
} | |||||
} |
@@ -0,0 +1,37 @@ | |||||
//package com.ningdatech.pmapi.expert.model.cmd; | |||||
// | |||||
//import com.ningdatech.emapi.expert.entity.bo.ExpertInfoSensitiveFieldCheckBO; | |||||
//import com.ningdatech.emapi.expert.entity.dto.*; | |||||
//import lombok.Data; | |||||
// | |||||
//import java.util.List; | |||||
// | |||||
///** | |||||
// * @author liuxinxin | |||||
// * @date 2022/7/28 下午2:43 | |||||
// */ | |||||
//@Data | |||||
//public class AdminModifyExpertInfoCmd { | |||||
// | |||||
// private Long userId; | |||||
// | |||||
// private ExpertUserFullInfoDTO expertUserInfoDTO; | |||||
// | |||||
// private List<ExpertDictionaryDTO> expertDictionaryList; | |||||
// | |||||
// private List<ExpertTagDTO> expertTagList; | |||||
// | |||||
// /** | |||||
// * 专家履职意向(区域编码) | |||||
// */ | |||||
// private List<ExpertRegionDTO> expertIntentionWorkRegionInfo; | |||||
// | |||||
// /** | |||||
// * 回避单位列表 | |||||
// */ | |||||
// private List<ExpertAvoidCompanyDTO> expertAvoidCompanyList; | |||||
// | |||||
// private ExpertInfoSensitiveFieldCheckBO expertInfoSensitiveFieldCheckBO; | |||||
// | |||||
// private ModifyApplyExtraInfoDTO modifyApplyExtraInfo; | |||||
//} |
@@ -0,0 +1,62 @@ | |||||
package com.ningdatech.pmapi.expert.model.cmd; | |||||
import com.ningdatech.pmapi.common.model.CommonPageReq; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | |||||
import com.ningdatech.pmapi.expert.model.query.ExpertDictionaryQuery; | |||||
import com.ningdatech.pmapi.expert.model.query.ExpertTagQuery; | |||||
import com.ningdatech.pmapi.meta.model.bo.RegionContainsBO; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/4 上午11:11 | |||||
*/ | |||||
@Data | |||||
public class ExpertAdminExpertManageQueryCmd extends CommonPageReq { | |||||
@ApiModelProperty("专家姓名(精准匹配)") | |||||
private String expertName; | |||||
@ApiModelProperty("工作单位(模糊匹配)") | |||||
private String company; | |||||
@ApiModelProperty("专家账号状态") | |||||
private List<ExpertAccountStatusEnum> expertAccountStatusList; | |||||
/** | |||||
* 区域编码 | |||||
*/ | |||||
@ApiModelProperty("区域编码") | |||||
private String regionCode; | |||||
/** | |||||
* 区域级别 | |||||
*/ | |||||
@ApiModelProperty("区域级别") | |||||
private Integer regionLevel; | |||||
/** | |||||
* 专家管理区域范围 | |||||
*/ | |||||
List<RegionContainsBO> regionContainsList; | |||||
/** | |||||
* 专家字典信息 | |||||
*/ | |||||
private List<ExpertDictionaryQuery> expertDictionaryQueryList; | |||||
/** | |||||
* 专家标签信息 | |||||
*/ | |||||
private List<ExpertTagQuery> expertTagQueryList; | |||||
/** | |||||
* 是否为钉用户 | |||||
*/ | |||||
private Boolean isDingUser; | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.pmapi.expert.model.cmd; | |||||
import lombok.Data; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 下午6:28 | |||||
* 专家出库审核处理cmd | |||||
*/ | |||||
@Data | |||||
public class ExpertDeliveryDealCmd { | |||||
private Long expertUserId; | |||||
private Boolean applyResult; | |||||
} |
@@ -0,0 +1,18 @@ | |||||
package com.ningdatech.pmapi.expert.model.cmd; | |||||
import lombok.Data; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/28 下午5:35 | |||||
*/ | |||||
@Data | |||||
public class ExpertInfoModifyApplyDealCmd { | |||||
private Long expertUserId; | |||||
private Boolean applyResult; | |||||
private Long applyId; | |||||
} |
@@ -0,0 +1,37 @@ | |||||
//package com.ningdatech.pmapi.expert.model.cmd; | |||||
// | |||||
//import com.ningdatech.emapi.expert.entity.bo.ExpertInfoSensitiveFieldCheckBO; | |||||
//import com.ningdatech.emapi.expert.entity.dto.*; | |||||
//import lombok.Data; | |||||
// | |||||
//import java.util.List; | |||||
// | |||||
///** | |||||
// * @author liuxinxin | |||||
// * @date 2022/7/28 下午2:43 | |||||
// */ | |||||
//@Data | |||||
//public class ExpertInfoModifyCmd { | |||||
// | |||||
// private Long userId; | |||||
// | |||||
// private ExpertUserFullInfoDTO expertUserInfoDTO; | |||||
// | |||||
// private List<ExpertDictionaryDTO> expertDictionaryList; | |||||
// | |||||
// private List<ExpertTagDTO> expertTagList; | |||||
// | |||||
// /** | |||||
// * 专家履职意向(区域编码) | |||||
// */ | |||||
// private List<ExpertRegionDTO> expertIntentionWorkRegionInfo; | |||||
// | |||||
// /** | |||||
// * 回避单位列表 | |||||
// */ | |||||
// private List<ExpertAvoidCompanyDTO> expertAvoidCompanyList; | |||||
// | |||||
// private ExpertInfoSensitiveFieldCheckBO expertInfoSensitiveFieldCheckBO; | |||||
// | |||||
// private ModifyApplyExtraInfoDTO modifyApplyExtraInfo; | |||||
//} |
@@ -0,0 +1,22 @@ | |||||
//package com.ningdatech.pmapi.expert.model.cmd; | |||||
// | |||||
//import com.ningdatech.emapi.expert.constants.ExpertApplyTypeEnum; | |||||
//import lombok.Data; | |||||
// | |||||
///** | |||||
// * @author liuxinxin | |||||
// * @date 2022/7/27 上午9:06 | |||||
// */ | |||||
//@Data | |||||
//public class ExpertIntentionApplyDealCmd { | |||||
// | |||||
// private Long expertUserId; | |||||
// | |||||
// private Boolean applyResult; | |||||
// | |||||
// ExpertApplyTypeEnum applyTypeEnum; | |||||
// | |||||
// private String expertRegionCode; | |||||
// | |||||
// private Integer expertRegionLevel; | |||||
//} |
@@ -0,0 +1,22 @@ | |||||
package com.ningdatech.pmapi.expert.model.cmd; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertDictionaryDTO; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/25 下午4:59 | |||||
*/ | |||||
@Data | |||||
public class ExpertRecommendProofSaveCmd { | |||||
private Long userId; | |||||
private List<Long> recommendationProofFileIdList; | |||||
private List<ExpertDictionaryDTO> recommendedWay; | |||||
} |
@@ -0,0 +1,36 @@ | |||||
package com.ningdatech.pmapi.expert.model.cmd; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertDictionaryDTO; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertTagDTO; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 下午5:40 | |||||
*/ | |||||
@Data | |||||
public class ExpertStorageDealCmd { | |||||
private Long expertUserId; | |||||
private Boolean applyResult; | |||||
private String joinRegionCode; | |||||
private Integer joinRegionLevel; | |||||
/** | |||||
* 专家类型(内外围) | |||||
*/ | |||||
private List<ExpertDictionaryDTO> expertType; | |||||
/** | |||||
* 其他标签(标签code) | |||||
*/ | |||||
private List<ExpertTagDTO> other; | |||||
private String remark; | |||||
} |
@@ -0,0 +1,46 @@ | |||||
package com.ningdatech.pmapi.expert.model.cmd; | |||||
import com.ningdatech.basic.model.PagePo; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyStatusEnum; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyTypeQueryEnum; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 下午2:35 | |||||
*/ | |||||
@Data | |||||
@ApiModel("申请列表查询请求") | |||||
public class MetaApplyListQuery extends PagePo { | |||||
@ApiModelProperty("审核类型") | |||||
private List<ExpertApplyTypeQueryEnum> applyTypeList; | |||||
@ApiModelProperty("审核结果") | |||||
private List<ExpertApplyStatusEnum> applyStatusList; | |||||
@ApiModelProperty("工作单位") | |||||
private String companyName; | |||||
@ApiModelProperty("专家姓名") | |||||
private String expertName; | |||||
@ApiModelProperty("职称级别字典编码") | |||||
private String titleLevelDictionaryCode; | |||||
@ApiModelProperty("专家层级") | |||||
private ExpertRegionInfo expertRegion; | |||||
@ApiModelProperty("筛选开始时间") | |||||
private LocalDateTime applyStartTime; | |||||
@ApiModelProperty("筛选结束时间") | |||||
private LocalDateTime applyEndTime; | |||||
} |
@@ -0,0 +1,60 @@ | |||||
//package com.ningdatech.pmapi.expert.model.cmd; | |||||
// | |||||
//import com.ningdatech.emapi.expert.entity.dto.ExpertAdminRegionDTO; | |||||
//import lombok.Data; | |||||
// | |||||
//import java.util.List; | |||||
// | |||||
///** | |||||
// * @author liuxinxin | |||||
// * @date 2022/8/1 上午10:54 | |||||
// */ | |||||
//@Data | |||||
//public class SaveExpertAdminCmd { | |||||
// | |||||
// /** | |||||
// * 用户id | |||||
// */ | |||||
// private Long userId; | |||||
// | |||||
// /** | |||||
// * 是否浙政钉用户Y/N | |||||
// */ | |||||
// private Boolean isDingUser; | |||||
// | |||||
// /** | |||||
// * 手机号 | |||||
// */ | |||||
// private String phoneNo; | |||||
// | |||||
// /** | |||||
// * 用户名称 | |||||
// */ | |||||
// private String name; | |||||
// | |||||
// /** | |||||
// * 工作单位 | |||||
// */ | |||||
// private String company; | |||||
// | |||||
// /** | |||||
// * 公司唯一标识 | |||||
// */ | |||||
// private String companyUniqCode; | |||||
// | |||||
// /** | |||||
// * 层级 | |||||
// */ | |||||
// private List<ExpertAdminRegionDTO> regionInfoList; | |||||
// | |||||
// /** | |||||
// * 用户状态(启用/关闭) | |||||
// */ | |||||
// private Boolean isEnable; | |||||
// | |||||
// /** | |||||
// * 操作者id | |||||
// */ | |||||
// private Long operatorId; | |||||
// | |||||
//} |
@@ -0,0 +1,39 @@ | |||||
package com.ningdatech.pmapi.expert.model.dto; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/27 上午10:22 | |||||
* 专家全量信息表,包含履职意向,专家字典信息,专家标签信息,回避单位信息 | |||||
*/ | |||||
@Data | |||||
public class ExpertFullInfoAllDTO { | |||||
private Long userId; | |||||
private ExpertUserFullInfoDTO expertUserInfoDTO; | |||||
private List<ExpertDictionaryDTO> expertDictionaryList; | |||||
private List<ExpertTagDTO> expertTagList; | |||||
/** | |||||
* 专家履职意向(区域编码) | |||||
*/ | |||||
private List<ExpertRegionDTO> expertIntentionWorkRegionInfo; | |||||
/** | |||||
* 专家申请履职意向展示列表 | |||||
*/ | |||||
private List<ExpertRegionDTO> expertApplyIntentionWorkRegionInfo; | |||||
/** | |||||
* 回避单位列表 | |||||
*/ | |||||
private List<ExpertAvoidCompanyDTO> expertAvoidCompanyList; | |||||
} |
@@ -0,0 +1,17 @@ | |||||
package com.ningdatech.pmapi.expert.model.query; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/5 上午11:16 | |||||
*/ | |||||
@Data | |||||
public class ExpertDictionaryQuery { | |||||
private String expertInfoField; | |||||
private List<String> dictionaryCodeList; | |||||
} |
@@ -0,0 +1,17 @@ | |||||
package com.ningdatech.pmapi.expert.model.query; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/5 上午11:16 | |||||
*/ | |||||
@Data | |||||
public class ExpertTagQuery { | |||||
private String expertInfoField; | |||||
private List<String> tagCodeList; | |||||
} |
@@ -0,0 +1,59 @@ | |||||
package com.ningdatech.pmapi.expert.model.query; | |||||
import com.ningdatech.pmapi.meta.model.bo.RegionContainsBO; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/5 上午10:52 | |||||
*/ | |||||
@Data | |||||
public class ListExpertQuery { | |||||
private Integer limit; | |||||
private Integer offset; | |||||
/** | |||||
* 专家姓名(精准匹配) | |||||
*/ | |||||
private String expertName; | |||||
/** | |||||
* 工作单位(模糊匹配) | |||||
*/ | |||||
private String company; | |||||
/** | |||||
* 专家账号状态 | |||||
*/ | |||||
private List<String> expertAccountStatusList; | |||||
/** | |||||
* 区域编码 | |||||
*/ | |||||
private String regionCode; | |||||
/** | |||||
* 区域级别 | |||||
*/ | |||||
private Integer regionLevel; | |||||
/** | |||||
* 专家管理区域范围 | |||||
*/ | |||||
List<RegionContainsBO> regionContainsList; | |||||
/** | |||||
* 专家字典信息 | |||||
*/ | |||||
private List<ExpertDictionaryQuery> expertDictionaryQueryList; | |||||
/** | |||||
* 专家标签信息 | |||||
*/ | |||||
private List<ExpertTagQuery> expertTagQueryList; | |||||
private Boolean isDingUser; | |||||
} |
@@ -0,0 +1,31 @@ | |||||
package com.ningdatech.pmapi.expert.model.req; | |||||
import com.ningdatech.pmapi.expert.model.DictionaryFieldInfo; | |||||
import com.ningdatech.pmapi.expert.model.FileBasicInfo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import javax.validation.constraints.NotBlank; | |||||
import javax.validation.constraints.NotEmpty; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/22 下午5:49 | |||||
*/ | |||||
@Data | |||||
@ApiModel("专家证明材料提交Request") | |||||
public class ExpertRecommendProofSubmitRequest { | |||||
@NotEmpty | |||||
@ApiModelProperty("推荐方式") | |||||
private List<DictionaryFieldInfo> recommendedWay; | |||||
@ApiModelProperty("推荐证明材料") | |||||
private List<FileBasicInfo> recommendProofFile; | |||||
@NotBlank | |||||
@ApiModelProperty("短信验证码") | |||||
private String verificationCode; | |||||
} |
@@ -0,0 +1,49 @@ | |||||
package com.ningdatech.pmapi.expert.model.req; | |||||
import com.ningdatech.pmapi.expert.model.DictionaryFieldInfo; | |||||
import com.ningdatech.pmapi.expert.model.TagFieldInfo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import org.springframework.validation.annotation.Validated; | |||||
import javax.validation.constraints.NotNull; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 下午4:20 | |||||
* 申请结果请求基类 | |||||
*/ | |||||
@Data | |||||
@Validated | |||||
public class MetaApplyResultRequest { | |||||
@NotNull | |||||
@ApiModelProperty("申请id") | |||||
private Long applyId; | |||||
@NotNull | |||||
@ApiModelProperty("审核结果") | |||||
private Boolean applyResult; | |||||
@ApiModelProperty("审核意见") | |||||
private String auditOpinion; | |||||
@ApiModelProperty("入库审核额外参数,只有入库审核结果审批才需要填写") | |||||
private StorageApplyResultExtraInfo storageApplyResultExtraInfo; | |||||
@Data | |||||
@ApiModel("入库审核额外参数") | |||||
public static class StorageApplyResultExtraInfo { | |||||
@ApiModelProperty("专家类型-内外围") | |||||
private List<DictionaryFieldInfo> expertType; | |||||
@ApiModelProperty("其他标签(标签code)") | |||||
private List<TagFieldInfo> other; | |||||
@ApiModelProperty("备注") | |||||
private String remark; | |||||
} | |||||
} |
@@ -0,0 +1,56 @@ | |||||
package com.ningdatech.pmapi.expert.model.vo; | |||||
import com.ningdatech.pmapi.expert.model.DictionaryFieldInfo; | |||||
import com.ningdatech.pmapi.expert.model.TagFieldInfo; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/8/4 上午11:04 | |||||
*/ | |||||
@Data | |||||
@ApiModel("专家库列表查询返回model") | |||||
public class ExpertAdminExpertManageListVO { | |||||
@ApiModelProperty(value = "用户id") | |||||
private Long userId; | |||||
@ApiModelProperty(value = "专家姓名") | |||||
private String expertName; | |||||
@ApiModelProperty(value = "职称级别") | |||||
private List<DictionaryFieldInfo> titleLevel; | |||||
@ApiModelProperty("工作单位") | |||||
private String company; | |||||
@ApiModelProperty(" 单位法人编号") | |||||
private String legalEntityCode; | |||||
@ApiModelProperty("单位类型(字典code)") | |||||
private List<DictionaryFieldInfo> companyAttribute; | |||||
@ApiModelProperty(value = "手机号") | |||||
private String phoneNo; | |||||
@ApiModelProperty(value = "专家类型(内外围)") | |||||
private List<DictionaryFieldInfo> expertType; | |||||
@ApiModelProperty(value = "专家层级") | |||||
private ExpertRegionInfo expertRegionInfo; | |||||
@ApiModelProperty(value = "是否浙政钉用户") | |||||
private Boolean isDingUser; | |||||
@ApiModelProperty(value = "专家账号状态", allowableValues = "冻结:freezing,正常:normal") | |||||
private String expertAccountStatus; | |||||
@ApiModelProperty(value = "专家来源") | |||||
private List<TagFieldInfo> expertSource; | |||||
} |
@@ -0,0 +1,76 @@ | |||||
package com.ningdatech.pmapi.expert.model.vo; | |||||
import com.ningdatech.pmapi.expert.model.DictionaryFieldInfo; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 上午11:17 | |||||
* 专家审核列表展示VO基础类 | |||||
*/ | |||||
@Data | |||||
@ApiModel("审核列表展示VO") | |||||
public class ExpertApplyMetaVO { | |||||
@ApiModelProperty("id") | |||||
private Long id; | |||||
@ApiModelProperty("用户id") | |||||
private Long userId; | |||||
/** | |||||
* 审核结果 | |||||
*/ | |||||
@ApiModelProperty("审核结果") | |||||
private String applyStatus; | |||||
/** | |||||
* 审核类型 | |||||
*/ | |||||
@ApiModelProperty("审核类型") | |||||
private String applyType; | |||||
/** | |||||
* 专家姓名 | |||||
*/ | |||||
@ApiModelProperty("专家姓名") | |||||
private String name; | |||||
/** | |||||
* 专家层级 | |||||
*/ | |||||
@ApiModelProperty("专家层级") | |||||
private ExpertRegionInfo expertRegionInfo; | |||||
/** | |||||
* 职称级别 | |||||
*/ | |||||
@ApiModelProperty("职称级别") | |||||
private List<DictionaryFieldInfo> titleLevel; | |||||
/** | |||||
* 工作单位 | |||||
*/ | |||||
@ApiModelProperty("工作单位") | |||||
private String company; | |||||
/** | |||||
* 手机号 | |||||
*/ | |||||
@ApiModelProperty("手机号") | |||||
private String phoneNo; | |||||
/** | |||||
* 申请时间 | |||||
*/ | |||||
@ApiModelProperty("申请时间") | |||||
private LocalDateTime applyTime; | |||||
} |
@@ -0,0 +1,45 @@ | |||||
package com.ningdatech.pmapi.expert.model.vo; | |||||
import 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.NotEmpty; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/25 下午1:43 | |||||
*/ | |||||
@Data | |||||
@ApiModel("专家全量信息") | |||||
public class ExpertFullInfoVO { | |||||
@ApiModelProperty("专家用户id") | |||||
private Long userId; | |||||
@ApiModelProperty("基本信息") | |||||
private ExpertBasicInfo basicInfo; | |||||
@ApiModelProperty("学历信息") | |||||
private ExpertEduInfo eduInfo; | |||||
@ApiModelProperty("职业信息") | |||||
private ExpertJobInfo jobInfo; | |||||
@ApiModelProperty("专业信息") | |||||
private ExpertProfessionalInfo professionalInfo; | |||||
@ApiModelProperty("推荐信息") | |||||
private ExpertRecommendInfo recommendInfo; | |||||
@ApiModelProperty("其他信息") | |||||
private ExpertOtherInfo expertOtherInfo; | |||||
@NotEmpty | |||||
@ApiModelProperty("专家申请履职意向展示列表") | |||||
private List<ExpertRegionInfo> expertApplyIntentionWorkRegions; | |||||
} |
@@ -0,0 +1,70 @@ | |||||
package com.ningdatech.pmapi.expert.model.vo; | |||||
import com.ningdatech.pmapi.meta.model.ExpertRegionInfo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import java.time.LocalDateTime; | |||||
/** | |||||
* <p> | |||||
* LeaveAuditInfoVo | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 13:46 2022/8/12 | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
@ApiModel("审核详情返回参数") | |||||
public class MetaApplyResultVo { | |||||
@ApiModelProperty("审核人") | |||||
private String auditor; | |||||
@ApiModelProperty("审核时间") | |||||
private LocalDateTime auditTime; | |||||
@ApiModelProperty("审核意见") | |||||
private String auditOption; | |||||
@ApiModelProperty("审核状态") | |||||
private String auditStatus; | |||||
@ApiModelProperty("申请时间") | |||||
private LocalDateTime applyTime; | |||||
@ApiModelProperty("申请类型") | |||||
private String applyType; | |||||
@ApiModelProperty("专家用户userId") | |||||
private Long expertUserId; | |||||
// @ApiModelProperty("额外的材料") | |||||
// private ModifyApplyExtraInfo modifyApplyExtraInfo; | |||||
// | |||||
// @ApiModelProperty("信息修改申请展示列表-只有审核类型为信息变更审核时才有值") | |||||
// private InfoModifyApplyDisplayVO infoModifyApplyDisplayVo; | |||||
@ApiModelProperty("履职意向修改申请展示列表-只有审核类型为履职意向变更时才会有值") | |||||
private IntentionApplyDisplayVO intentionApplyDisplayVo; | |||||
@Data | |||||
@ApiModel("履职意向修改申请展示列表") | |||||
public static class IntentionApplyDisplayVO { | |||||
@ApiModelProperty("审核申请id") | |||||
private Long expertApplyId; | |||||
@ApiModelProperty("履职意向增加") | |||||
private ExpertRegionInfo addExpertRegion; | |||||
@ApiModelProperty("履职意向减少") | |||||
private ExpertRegionInfo reduceExpertRegion; | |||||
} | |||||
} |
@@ -1,6 +1,9 @@ | |||||
package com.ningdatech.pmapi.expert.service; | package com.ningdatech.pmapi.expert.service; | ||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | ||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertRecommendProofSaveCmd; | |||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertStorageDealCmd; | |||||
import com.ningdatech.pmapi.expert.model.dto.ExpertFullInfoAllDTO; | |||||
/** | /** | ||||
* @author liuxinxin | * @author liuxinxin | ||||
@@ -11,4 +14,22 @@ public interface ExpertInfoService { | |||||
void saveExpertInfo(ExpertFullInfoSaveCmd cmd); | void saveExpertInfo(ExpertFullInfoSaveCmd cmd); | ||||
/** | |||||
* 专家报名提交 推荐证明材料 | |||||
* | |||||
* @param expertRecommendProofSaveCmd | |||||
*/ | |||||
void expertRecommendProofSave(ExpertRecommendProofSaveCmd expertRecommendProofSaveCmd); | |||||
/** | |||||
* 根据user_id 获取用户全量信息 | |||||
* | |||||
* @param userId | |||||
* @return | |||||
*/ | |||||
ExpertFullInfoAllDTO getExpertUserFullInfoAll(Long userId); | |||||
void expertStorageDeal(ExpertStorageDealCmd cmd); | |||||
} | } | ||||
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.pmapi.expert.service; | |||||
import com.baomidou.mybatisplus.extension.service.IService; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertMetaApply; | |||||
/** | |||||
* <p> | |||||
* 服务类 | |||||
* </p> | |||||
* | |||||
* @author Liuxinxin | |||||
* @since 2023-03-01 | |||||
*/ | |||||
public interface IExpertMetaApplyService extends IService<ExpertMetaApply> { | |||||
} |
@@ -32,4 +32,14 @@ public interface IExpertUserFullInfoService extends IService<ExpertUserFullInfo> | |||||
**/ | **/ | ||||
List<ExpertUserFullInfo> listByUserId(List<Long> userId); | List<ExpertUserFullInfo> listByUserId(List<Long> userId); | ||||
/** | |||||
* 批量查询专家用户信息 | |||||
* | |||||
* @param userIds 用户ID | |||||
* @return / | |||||
*/ | |||||
List<ExpertUserFullInfo> listByUserIds(List<Long> userIds); | |||||
} | } |
@@ -2,17 +2,24 @@ package com.ningdatech.pmapi.expert.service.impl; | |||||
import com.alibaba.fastjson.JSONObject; | import com.alibaba.fastjson.JSONObject; | ||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.pmapi.common.constant.BoolDisplayEnum; | |||||
import com.ningdatech.pmapi.common.enumeration.BoolDisplayEnum; | |||||
import com.ningdatech.pmapi.expert.assembler.ExpertUserInfoAssembler; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | ||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyStatusEnum; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyTypeEnum; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertUserInfoStepEnum; | import com.ningdatech.pmapi.expert.constant.ExpertUserInfoStepEnum; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany; | import com.ningdatech.pmapi.expert.entity.ExpertAvoidCompany; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertIntentionWorkRegion; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertMetaApply; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | ||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | ||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertRecommendProofSaveCmd; | |||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertStorageDealCmd; | |||||
import com.ningdatech.pmapi.expert.model.dto.*; | 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.expert.service.*; | |||||
import com.ningdatech.pmapi.meta.constant.DictExpertInfoTypeEnum; | |||||
import com.ningdatech.pmapi.meta.model.entity.ExpertDictionary; | import com.ningdatech.pmapi.meta.model.entity.ExpertDictionary; | ||||
import com.ningdatech.pmapi.meta.model.entity.ExpertTag; | import com.ningdatech.pmapi.meta.model.entity.ExpertTag; | ||||
import com.ningdatech.pmapi.meta.service.IExpertDictionaryService; | import com.ningdatech.pmapi.meta.service.IExpertDictionaryService; | ||||
@@ -24,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Collections; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Objects; | import java.util.Objects; | ||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
@@ -37,12 +45,11 @@ import java.util.stream.Collectors; | |||||
public class ExpertInfoServiceImpl implements ExpertInfoService { | public class ExpertInfoServiceImpl implements ExpertInfoService { | ||||
private final IExpertUserFullInfoService iExpertUserFullInfoService; | private final IExpertUserFullInfoService iExpertUserFullInfoService; | ||||
private final IExpertTagService iExpertTagService; | private final IExpertTagService iExpertTagService; | ||||
private final IExpertDictionaryService iExpertDictionaryService; | private final IExpertDictionaryService iExpertDictionaryService; | ||||
private final IExpertAvoidCompanyService iExpertAvoidCompanyService; | private final IExpertAvoidCompanyService iExpertAvoidCompanyService; | ||||
private final IExpertIntentionWorkRegionService iExpertIntentionWorkRegionService; | |||||
private final IExpertMetaApplyService iExpertMetaApplyService; | |||||
/** | /** | ||||
@@ -75,12 +82,12 @@ public class ExpertInfoServiceImpl implements ExpertInfoService { | |||||
.eq(ExpertDictionary::getUserId, userId); | .eq(ExpertDictionary::getUserId, userId); | ||||
iExpertDictionaryService.remove(expertDictionaryRemove); | 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<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) | LambdaQueryWrapper<ExpertAvoidCompany> expertAvoidCompanyRemove = Wrappers.lambdaQuery(ExpertAvoidCompany.class) | ||||
.eq(ExpertAvoidCompany::getUserId, userId); | .eq(ExpertAvoidCompany::getUserId, userId); | ||||
@@ -104,11 +111,11 @@ public class ExpertInfoServiceImpl implements ExpertInfoService { | |||||
} | } | ||||
// 保存所有专家履职意向申请 | // 保存所有专家履职意向申请 | ||||
// TODO 补充审核逻辑 | |||||
// List<ExpertMetaApply> saveExpertIntentionWorkRegionApplyList = buildSaveExpertIntentionWorkRegionApplyList(userId, expertIntentionWorkRegionInfoList); | |||||
// if (CollectionUtils.isNotEmpty(saveExpertDictionaryList)) { | |||||
// iExpertMetaApplyService.saveBatch(saveExpertIntentionWorkRegionApplyList); | |||||
// } | |||||
// 审核逻辑 | |||||
List<ExpertMetaApply> saveExpertIntentionWorkRegionApplyList = buildSaveExpertIntentionWorkRegionApplyList(userId, expertIntentionWorkRegionInfoList); | |||||
if (CollectionUtils.isNotEmpty(saveExpertDictionaryList)) { | |||||
iExpertMetaApplyService.saveBatch(saveExpertIntentionWorkRegionApplyList); | |||||
} | |||||
// 保存所有专家回避单位 | // 保存所有专家回避单位 | ||||
List<ExpertAvoidCompany> saveExpertAvoidCompanyList = buildSaveExpertAvoidCompanyList(userId, expertAvoidCompanyList); | List<ExpertAvoidCompany> saveExpertAvoidCompanyList = buildSaveExpertAvoidCompanyList(userId, expertAvoidCompanyList); | ||||
if (CollectionUtils.isNotEmpty(saveExpertAvoidCompanyList)) { | if (CollectionUtils.isNotEmpty(saveExpertAvoidCompanyList)) { | ||||
@@ -216,4 +223,153 @@ public class ExpertInfoServiceImpl implements ExpertInfoService { | |||||
}).collect(Collectors.toList()); | }).collect(Collectors.toList()); | ||||
} | } | ||||
@Override | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public void expertRecommendProofSave(ExpertRecommendProofSaveCmd cmd) { | |||||
// 保存专家证明材料 | |||||
Long userId = cmd.getUserId(); | |||||
ExpertUserFullInfo expertUserFullInfo = iExpertUserFullInfoService.getByUserId(userId); | |||||
expertUserFullInfo.setRecommendationProofFileIdList(JSONObject.toJSONString(cmd.getRecommendationProofFileIdList())); | |||||
expertUserFullInfo.setUpdateOn(LocalDateTime.now()); | |||||
expertUserFullInfo.setUserInfoStep(ExpertUserInfoStepEnum.EVIDENCE_HAS_BEEN_SUBMITTED.getKey()); | |||||
iExpertUserFullInfoService.saveOrUpdate(expertUserFullInfo); | |||||
List<ExpertDictionaryDTO> recommendedWayList = cmd.getRecommendedWay(); | |||||
if (CollectionUtils.isNotEmpty(recommendedWayList)) { | |||||
List<ExpertDictionary> saveExpertDictionaryList = recommendedWayList.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()); | |||||
iExpertDictionaryService.saveBatch(saveExpertDictionaryList); | |||||
} | |||||
// 创建入库申请 | |||||
ExpertMetaApply expertRegionApply = new ExpertMetaApply(); | |||||
expertRegionApply.setApplyType(ExpertApplyTypeEnum.EXPERT_STORAGE.getKey()); | |||||
expertRegionApply.setApplyStatus(ExpertApplyStatusEnum.PENDING_REVIEW.getKey()); | |||||
expertRegionApply.setRegionCode(expertUserFullInfo.getRegionCode()); | |||||
expertRegionApply.setRegionLevel(expertUserFullInfo.getRegionLevel()); | |||||
expertRegionApply.setUserId(userId); | |||||
expertRegionApply.setDisplayEnable(BoolDisplayEnum.Y.name()); | |||||
iExpertMetaApplyService.save(expertRegionApply); | |||||
} | |||||
@Override | |||||
public ExpertFullInfoAllDTO getExpertUserFullInfoAll(Long userId) { | |||||
ExpertUserFullInfo expertUserFullInfo = iExpertUserFullInfoService.getByUserId(userId); | |||||
if (Objects.isNull(expertUserFullInfo)) { | |||||
return null; | |||||
} | |||||
// 所有专家标签字段 | |||||
List<ExpertTag> expertTagList = iExpertTagService | |||||
.list(Wrappers.lambdaQuery(ExpertTag.class).eq(ExpertTag::getUserId, userId)); | |||||
// 所有专家字典字段 | |||||
List<ExpertDictionary> expertDictionaryList = iExpertDictionaryService | |||||
.list(Wrappers.lambdaQuery(ExpertDictionary.class).eq(ExpertDictionary::getUserId, userId)); | |||||
// 专家履职意向列表 | |||||
List<ExpertIntentionWorkRegion> expertIntentionWorkRegionList = iExpertIntentionWorkRegionService | |||||
.list(Wrappers.lambdaQuery(ExpertIntentionWorkRegion.class).eq(ExpertIntentionWorkRegion::getUserId, userId)); | |||||
// 专家履职意向申请列表 | |||||
List<ExpertMetaApply> expertMetaApplyList = iExpertMetaApplyService.list(Wrappers.lambdaQuery(ExpertMetaApply.class) | |||||
.eq(ExpertMetaApply::getUserId, userId) | |||||
.eq(ExpertMetaApply::getApplyStatus, ExpertApplyStatusEnum.PENDING_REVIEW.getKey()) | |||||
.in(ExpertMetaApply::getApplyType, ExpertApplyTypeEnum.EXPERT_INTENTION_JOIN.getKey(), ExpertApplyTypeEnum.EXPERT_INTENTION_LEAVE.getKey())); | |||||
// 所有专家回避单位 | |||||
List<ExpertAvoidCompany> expertAvoidCompanyList = iExpertAvoidCompanyService | |||||
.list(Wrappers.lambdaQuery(ExpertAvoidCompany.class).eq(ExpertAvoidCompany::getUserId, userId)); | |||||
return ExpertUserInfoAssembler.buildExpertFullInfoAllDTO(expertUserFullInfo, expertTagList, expertDictionaryList | |||||
, expertIntentionWorkRegionList, expertMetaApplyList, expertAvoidCompanyList); | |||||
} | |||||
private List<ExpertMetaApply> buildSaveExpertIntentionWorkRegionApplyList(Long userId, List<ExpertRegionDTO> expertIntentionWorkRegionInfoList) { | |||||
if (CollectionUtils.isEmpty(expertIntentionWorkRegionInfoList)) { | |||||
return new ArrayList<>(); | |||||
} | |||||
return expertIntentionWorkRegionInfoList.stream().map(r -> { | |||||
ExpertMetaApply expertMetaApply = new ExpertMetaApply(); | |||||
expertMetaApply.setApplyType(ExpertApplyTypeEnum.EXPERT_INTENTION_JOIN.getKey()); | |||||
expertMetaApply.setApplyStatus(ExpertApplyStatusEnum.PENDING_REVIEW.getKey()); | |||||
expertMetaApply.setRegionCode(r.getRegionCode()); | |||||
expertMetaApply.setRegionLevel(r.getRegionLevel()); | |||||
expertMetaApply.setUserId(userId); | |||||
expertMetaApply.setDisplayEnable(BoolDisplayEnum.N.name()); | |||||
expertMetaApply.setUpdateOn(LocalDateTime.now()); | |||||
expertMetaApply.setCreateOn(LocalDateTime.now()); | |||||
return expertMetaApply; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
/** | |||||
* 专家入库审核 | |||||
* | |||||
* @param cmd | |||||
*/ | |||||
@Override | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public void expertStorageDeal(ExpertStorageDealCmd cmd) { | |||||
boolean applyResult = cmd.getApplyResult(); | |||||
Long expertUserId = cmd.getExpertUserId(); | |||||
ExpertUserFullInfo expertUserFullInfo = iExpertUserFullInfoService.getByUserId(expertUserId); | |||||
if (applyResult) { | |||||
// 修改专家状态为可用 | |||||
expertUserFullInfo.setExpertAccountStatus(ExpertAccountStatusEnum.AVAILABLE.getKey()); | |||||
expertUserFullInfo.setRemark(cmd.getRemark()); | |||||
expertUserFullInfo.setRegionCode(cmd.getJoinRegionCode()); | |||||
expertUserFullInfo.setRegionLevel(cmd.getJoinRegionLevel()); | |||||
// 保存所有专家标签字段 | |||||
List<ExpertTag> saveExpertTagList = buildSaveExpertTagList(expertUserId, cmd.getOther()); | |||||
iExpertTagService.saveBatch(saveExpertTagList); | |||||
// 保存所有专家字典字段 | |||||
List<ExpertDictionaryDTO> expertType = cmd.getExpertType(); | |||||
if (CollectionUtils.isNotEmpty(expertType)) { | |||||
expertType = expertType.stream().peek(r -> r.setExpertInfoField(DictExpertInfoTypeEnum.EXPERT_TYPE.getKey())).collect(Collectors.toList()); | |||||
List<ExpertDictionary> saveExpertDictionaryList = buildSaveExpertDictionaryList(expertUserId, expertType); | |||||
iExpertDictionaryService.saveBatch(saveExpertDictionaryList); | |||||
} | |||||
// 修改履职意向申请状态 | |||||
LambdaUpdateWrapper<ExpertMetaApply> set = Wrappers.lambdaUpdate(ExpertMetaApply.class).eq(ExpertMetaApply::getUserId, expertUserId) | |||||
.eq(ExpertMetaApply::getApplyType, ExpertApplyTypeEnum.EXPERT_INTENTION_JOIN.getKey()) | |||||
.eq(ExpertMetaApply::getApplyStatus, ExpertApplyStatusEnum.PENDING_REVIEW.getKey()) | |||||
.eq(ExpertMetaApply::getDisplayEnable, BoolDisplayEnum.N.name()) | |||||
.set(ExpertMetaApply::getDisplayEnable, BoolDisplayEnum.Y.name()); | |||||
iExpertMetaApplyService.update(set); | |||||
} else { | |||||
expertUserFullInfo.setUserInfoStep(ExpertUserInfoStepEnum.INFORMATION_TO_BE_SUBMITTED.getKey()); | |||||
} | |||||
if (applyResult) { | |||||
// 补充专家 专家角色 TODO | |||||
// SysRole sysRole = roleService.getOne(Wrappers.lambdaQuery(SysRole.class) | |||||
// .eq(SysRole::getCode, SysRoleEnum.EXPERT.getKey())); | |||||
// if (Objects.nonNull(sysRole)) { | |||||
// Long roleId = sysRole.getRoleId(); | |||||
// LambdaQueryWrapper<SysUsersRoles> eq = Wrappers.lambdaQuery(SysUsersRoles.class) | |||||
// .eq(SysUsersRoles::getUserId, expertUserFullInfo.getUserId()) | |||||
// .eq(SysUsersRoles::getRoleId, sysRole.getRoleId()); | |||||
// SysUsersRoles one = userRoleService.getOne(eq); | |||||
// if (Objects.isNull(one)) { | |||||
// SysUsersRoles sysUsersRolesSaveRecord = new SysUsersRoles(); | |||||
// sysUsersRolesSaveRecord.setUserId(expertUserFullInfo.getUserId()); | |||||
// sysUsersRolesSaveRecord.setRoleId(roleId); | |||||
// userRoleService.saveAndReloadRoleListForToken(Collections.singletonList(sysUsersRolesSaveRecord), false); | |||||
// } | |||||
// } | |||||
} | |||||
iExpertUserFullInfoService.saveOrUpdate(expertUserFullInfo); | |||||
} | |||||
} | } |
@@ -0,0 +1,20 @@ | |||||
package com.ningdatech.pmapi.expert.service.impl; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertMetaApply; | |||||
import com.ningdatech.pmapi.expert.mapper.ExpertMetaApplyMapper; | |||||
import com.ningdatech.pmapi.expert.service.IExpertMetaApplyService; | |||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||||
import org.springframework.stereotype.Service; | |||||
/** | |||||
* <p> | |||||
* 服务实现类 | |||||
* </p> | |||||
* | |||||
* @author Liuxinxin | |||||
* @since 2023-03-01 | |||||
*/ | |||||
@Service | |||||
public class ExpertMetaApplyServiceImpl extends ServiceImpl<ExpertMetaApplyMapper, ExpertMetaApply> implements IExpertMetaApplyService { | |||||
} |
@@ -33,4 +33,9 @@ public class ExpertUserFullInfoServiceImpl extends ServiceImpl<NdExpertUserFullI | |||||
return list(Wrappers.<ExpertUserFullInfo>lambdaQuery().in(ExpertUserFullInfo::getUserId, userIds)); | return list(Wrappers.<ExpertUserFullInfo>lambdaQuery().in(ExpertUserFullInfo::getUserId, userIds)); | ||||
} | } | ||||
@Override | |||||
public List<ExpertUserFullInfo> listByUserIds(List<Long> userIds) { | |||||
return list(Wrappers.<ExpertUserFullInfo>lambdaQuery().in(ExpertUserFullInfo::getUserId, userIds)); | |||||
} | |||||
} | } |
@@ -2,8 +2,7 @@ package com.ningdatech.pmapi.meeting.builder; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.user.entity.UserInfo; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -19,10 +18,10 @@ public class ExpertInviteBuilder { | |||||
} | } | ||||
public static MeetingExpert getExpertByRandom(Long meetingId, ExpertUserFullInfo user, Long ruleId) { | public static MeetingExpert getExpertByRandom(Long meetingId, ExpertUserFullInfo user, Long ruleId) { | ||||
return getExpertBasic(meetingId, user, ruleId, ExpertInviteType.RANDOM); | |||||
return getExpertBasic(meetingId, user, ruleId, ExpertInviteTypeEnum.RANDOM); | |||||
} | } | ||||
private static MeetingExpert getExpertBasic(Long meetingId, ExpertUserFullInfo user, Long ruleId, ExpertInviteType type) { | |||||
private static MeetingExpert getExpertBasic(Long meetingId, ExpertUserFullInfo user, Long ruleId, ExpertInviteTypeEnum type) { | |||||
MeetingExpert expert = new MeetingExpert(); | MeetingExpert expert = new MeetingExpert(); | ||||
expert.setMeetingId(meetingId); | expert.setMeetingId(meetingId); | ||||
expert.setMobile(user.getPhoneNo()); | expert.setMobile(user.getPhoneNo()); | ||||
@@ -34,7 +33,7 @@ public class ExpertInviteBuilder { | |||||
} | } | ||||
public static MeetingExpert getExpertByAppoint(Long meetingId, ExpertUserFullInfo user, Long ruleId) { | public static MeetingExpert getExpertByAppoint(Long meetingId, ExpertUserFullInfo user, Long ruleId) { | ||||
return getExpertBasic(meetingId, user, ruleId, ExpertInviteType.APPOINT); | |||||
return getExpertBasic(meetingId, user, ruleId, ExpertInviteTypeEnum.APPOINT); | |||||
} | } | ||||
} | } |
@@ -4,7 +4,6 @@ package com.ningdatech.pmapi.meeting.controller; | |||||
import com.ningdatech.basic.model.IdVo; | import com.ningdatech.basic.model.IdVo; | ||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.log.annotation.WebLog; | import com.ningdatech.log.annotation.WebLog; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingBasicDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.req.*; | import com.ningdatech.pmapi.meeting.entity.req.*; | ||||
import com.ningdatech.pmapi.meeting.entity.vo.*; | import com.ningdatech.pmapi.meeting.entity.vo.*; | ||||
import com.ningdatech.pmapi.meeting.manage.MeetingManage; | import com.ningdatech.pmapi.meeting.manage.MeetingManage; | ||||
@@ -33,27 +32,27 @@ public class MeetingController { | |||||
private final MeetingManage meetingManage; | private final MeetingManage meetingManage; | ||||
@PostMapping("/save") | |||||
@ApiOperation("新建会议") | |||||
@PostMapping("/create") | |||||
@ApiOperation(value = "新建会议") | |||||
@WebLog(value = "新建会议") | @WebLog(value = "新建会议") | ||||
public IdVo<Long> meetingCreate(@Valid @RequestBody MeetingBasicDTO req) { | |||||
return meetingManage.save(req); | |||||
public IdVo<Long> meetingCreate(@Valid @RequestBody MeetingCreateReq req) { | |||||
return meetingManage.meetingCreateAndInviteExpert(req); | |||||
} | } | ||||
@PostMapping("/expertInviteByCreate") | @PostMapping("/expertInviteByCreate") | ||||
@ApiOperation("新建会议-专家抽取") | |||||
@ApiOperation(value = "新建会议-专家抽取", hidden = true) | |||||
@WebLog(value = "新建会议-专家抽取") | @WebLog(value = "新建会议-专家抽取") | ||||
public void expertInviteByCreate(@Valid @RequestBody ExpertInviteCreateReq po) { | |||||
public void expertInviteByCreate(@Valid @RequestBody ExpertInviteReq po) { | |||||
meetingManage.expertInviteByCreate(po); | meetingManage.expertInviteByCreate(po); | ||||
} | } | ||||
@ApiOperation("专家抽取数量校验") | @ApiOperation("专家抽取数量校验") | ||||
@PostMapping("/expertCountOnChange") | @PostMapping("/expertCountOnChange") | ||||
public ExpertCountOnChangeVO expertCountOnChange(@RequestBody ExpertInviteCreateReq po) { | |||||
public ExpertCountOnChangeVO expertCountOnChange(@RequestBody ExpertInviteReq po) { | |||||
return meetingManage.expertCountOnChange(po); | return meetingManage.expertCountOnChange(po); | ||||
} | } | ||||
@ApiOperation("专家抽取员事务列表") | |||||
@ApiOperation("专家抽取员会议列表") | |||||
@GetMapping("/meetingListByManager") | @GetMapping("/meetingListByManager") | ||||
@WebLog(value = "专家抽取员事务列表") | @WebLog(value = "专家抽取员事务列表") | ||||
public PageVo<MeetingByManagerVO> meetingListByManager(MeetingListReq po) { | public PageVo<MeetingByManagerVO> meetingListByManager(MeetingListReq po) { | ||||
@@ -74,21 +73,6 @@ public class MeetingController { | |||||
return meetingManage.getMeetingBasicInfo(meetingId); | return meetingManage.getMeetingBasicInfo(meetingId); | ||||
} | } | ||||
@ApiOperation("会议结果上传") | |||||
@PostMapping("/uploadMeetingResult") | |||||
@WebLog(value = "会议结果上传") | |||||
public void uploadMeetingResult(@Valid @RequestBody MeetingResultReq po) { | |||||
meetingManage.uploadMeetingResult(po); | |||||
} | |||||
@ApiOperation("会议结果详情") | |||||
@GetMapping("/detail/{meetingId}/meetingResult") | |||||
@WebLog(value = "会议结果详情况") | |||||
public MeetingResultVO meetingResultDetail(@PathVariable Long meetingId) { | |||||
return meetingManage.meetingResultDetail(meetingId); | |||||
} | |||||
@ApiOperation("邀请情况详情") | @ApiOperation("邀请情况详情") | ||||
@GetMapping("/detail/{meetingId}/inviteDetail") | @GetMapping("/detail/{meetingId}/inviteDetail") | ||||
@WebLog(value = "邀请情况详请") | @WebLog(value = "邀请情况详请") | ||||
@@ -0,0 +1,20 @@ | |||||
package com.ningdatech.pmapi.meeting.controller; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.stereotype.Controller; | |||||
/** | |||||
* <p> | |||||
* 会议评审内部项目表 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-28 | |||||
*/ | |||||
@Controller | |||||
@RequestMapping("/pmapi.meeting/meeting-inner-project") | |||||
public class MeetingInnerProjectController { | |||||
} |
@@ -0,0 +1,20 @@ | |||||
package com.ningdatech.pmapi.meeting.controller; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.stereotype.Controller; | |||||
/** | |||||
* <p> | |||||
* 会议评审外部项目 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-28 | |||||
*/ | |||||
@Controller | |||||
@RequestMapping("/pmapi.meeting/meeting-outer-project") | |||||
public class MeetingOuterProjectController { | |||||
} |
@@ -35,11 +35,14 @@ public class ExpertInviteAvoidRule implements Serializable { | |||||
@ApiModelProperty("回避专家ID") | @ApiModelProperty("回避专家ID") | ||||
private String expertIds; | private String expertIds; | ||||
@ApiModelProperty("回避单位名称") | |||||
private String companyIds; | |||||
@ApiModelProperty("回避单位ID") | |||||
private String avoidUnitIds; | |||||
@ApiModelProperty("回避本单位同事") | |||||
private Boolean avoidMates; | |||||
@ApiModelProperty("回避条线ID") | |||||
private String avoidOrgIds; | |||||
@ApiModelProperty("每周参与次数") | |||||
private Integer weekInviteCount; | |||||
@ApiModelProperty("创建人ID") | @ApiModelProperty("创建人ID") | ||||
private Long createBy; | private Long createBy; | ||||
@@ -81,20 +81,13 @@ public class Meeting implements Serializable { | |||||
@ApiModelProperty("是否停止随机邀请") | @ApiModelProperty("是否停止随机邀请") | ||||
private Boolean inviteStopped; | private Boolean inviteStopped; | ||||
@ApiModelProperty("是否进行了专家抽取") | |||||
private Boolean invited; | |||||
@ApiModelProperty("取消说明") | |||||
private String cancelRemark; | |||||
@ApiModelProperty("举办单位") | @ApiModelProperty("举办单位") | ||||
private String holdOrg; | private String holdOrg; | ||||
@ApiModelProperty("举办单位ID") | @ApiModelProperty("举办单位ID") | ||||
private String holdOrgCode; | private String holdOrgCode; | ||||
public String getHoldCompanyBracket() { | |||||
return "(" + this.getHoldOrg() + ")"; | |||||
} | |||||
@ApiModelProperty("是否为内部项目") | |||||
private Boolean isInnerProject; | |||||
} | } |
@@ -0,0 +1,37 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.domain; | |||||
import com.baomidou.mybatisplus.annotation.IdType; | |||||
import com.baomidou.mybatisplus.annotation.TableId; | |||||
import com.baomidou.mybatisplus.annotation.TableName; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* 会议评审内部项目表 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-28 | |||||
*/ | |||||
@Data | |||||
@TableName("meeting_inner_project") | |||||
@ApiModel(value = "MeetingInnerProject对象", description = "会议评审内部项目表") | |||||
public class MeetingInnerProject implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("主键") | |||||
@TableId(type = IdType.AUTO) | |||||
private Long id; | |||||
@ApiModelProperty("会议ID") | |||||
private Long meetingId; | |||||
@ApiModelProperty("项目ID") | |||||
private Long projectId; | |||||
} |
@@ -0,0 +1,61 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.domain; | |||||
import com.baomidou.mybatisplus.annotation.*; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
import java.math.BigDecimal; | |||||
import java.time.LocalDateTime; | |||||
/** | |||||
* <p> | |||||
* 会议评审外部项目 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-28 | |||||
*/ | |||||
@Data | |||||
@TableName("meeting_outer_project") | |||||
@ApiModel(value = "MeetingOuterProject对象", description = "会议评审外部项目") | |||||
public class MeetingOuterProject implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("主键") | |||||
@TableId(type = IdType.AUTO) | |||||
private Long id; | |||||
@ApiModelProperty("项目名称") | |||||
private String projectName; | |||||
@ApiModelProperty("申报单位") | |||||
private String buildOrg; | |||||
@ApiModelProperty("项目类型") | |||||
private String projectType; | |||||
@ApiModelProperty("预算年度") | |||||
private Integer projectYear; | |||||
@ApiModelProperty("申报金额") | |||||
private BigDecimal declareAmount; | |||||
@ApiModelProperty("会议ID") | |||||
private Long meetingId; | |||||
@TableField(fill = FieldFill.INSERT) | |||||
private Long createBy; | |||||
@TableField(fill = FieldFill.INSERT) | |||||
private LocalDateTime createOn; | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||||
private Long updateBy; | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||||
private LocalDateTime updateOn; | |||||
} |
@@ -6,12 +6,11 @@ import lombok.Data; | |||||
import javax.validation.constraints.NotEmpty; | import javax.validation.constraints.NotEmpty; | ||||
import javax.validation.constraints.NotNull; | import javax.validation.constraints.NotNull; | ||||
import java.util.Collections; | |||||
import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
* <p> | * <p> | ||||
* AvoidInfoDto | |||||
* 专家邀请回避规则 | |||||
* </p> | * </p> | ||||
* | * | ||||
* @author WendyYang | * @author WendyYang | ||||
@@ -23,38 +22,17 @@ public class AvoidInfoDTO { | |||||
@ApiModelProperty("回避单位") | @ApiModelProperty("回避单位") | ||||
@NotEmpty(message = "回避单位不能为空", groups = {AbstractInviteRule.RuleSave.class}) | @NotEmpty(message = "回避单位不能为空", groups = {AbstractInviteRule.RuleSave.class}) | ||||
private List<String> companyIds; | |||||
private List<String> avoidUnitIdList; | |||||
@ApiModelProperty("是否回避同单位其他专家") | |||||
@NotNull(message = "是否回避同单位其他专家不能为空") | |||||
private Boolean avoidMates; | |||||
@ApiModelProperty("回避条线") | |||||
@NotEmpty(message = "回避条线不能为空", groups = {AbstractInviteRule.RuleSave.class}) | |||||
private List<String> avoidOrgIdList; | |||||
@ApiModelProperty("回避专家ID") | |||||
private List<Long> expertIds; | |||||
@ApiModelProperty("每周邀请次数") | |||||
private Integer weekInviteCount; | |||||
/** | |||||
* 返回一个默认值,仅在前端未传值时使用 | |||||
* | |||||
* @return / | |||||
*/ | |||||
public static AvoidInfoDTO defVal() { | |||||
AvoidInfoDTO val = new AvoidInfoDTO(); | |||||
val.setAvoidMates(false); | |||||
val.setCompanyIds(Collections.emptyList()); | |||||
val.setExpertIds(Collections.emptyList()); | |||||
return val; | |||||
} | |||||
public void initDefVal() { | |||||
if (this.avoidMates == null) { | |||||
this.setAvoidMates(false); | |||||
} | |||||
if (this.companyIds == null) { | |||||
this.setCompanyIds(Collections.emptyList()); | |||||
} | |||||
if (this.expertIds == null) { | |||||
this.setExpertIds(Collections.emptyList()); | |||||
} | |||||
} | |||||
@ApiModelProperty("回避专家") | |||||
@NotEmpty(message = "回避专家不能为空", groups = {AbstractInviteRule.RuleSave.class}) | |||||
private List<Long> expertIds; | |||||
} | } |
@@ -1,6 +1,5 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.dto; | package com.ningdatech.pmapi.meeting.entity.dto; | ||||
import com.alibaba.excel.annotation.format.DateTimeFormat; | |||||
import com.fasterxml.jackson.annotation.JsonFormat; | import com.fasterxml.jackson.annotation.JsonFormat; | ||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
@@ -9,6 +8,7 @@ import lombok.Data; | |||||
import javax.validation.constraints.NotEmpty; | import javax.validation.constraints.NotEmpty; | ||||
import javax.validation.constraints.NotNull; | import javax.validation.constraints.NotNull; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.List; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -22,6 +22,10 @@ import java.time.LocalDateTime; | |||||
@ApiModel("会议基本信息") | @ApiModel("会议基本信息") | ||||
public class MeetingBasicDTO { | public class MeetingBasicDTO { | ||||
@NotNull(message = "是否是系统内部项目不能为空") | |||||
@ApiModelProperty("是否是系统内部项目") | |||||
private Boolean isInnerProject; | |||||
@NotEmpty(message = "事务名称不能为空") | @NotEmpty(message = "事务名称不能为空") | ||||
@ApiModelProperty("事务名称") | @ApiModelProperty("事务名称") | ||||
private String name; | private String name; | ||||
@@ -50,10 +54,16 @@ public class MeetingBasicDTO { | |||||
@NotEmpty(message = "联系人不能为空") | @NotEmpty(message = "联系人不能为空") | ||||
@ApiModelProperty("联系人") | @ApiModelProperty("联系人") | ||||
private String contacter; | |||||
private String connecter; | |||||
@NotEmpty(message = "联系方式不能为空") | @NotEmpty(message = "联系方式不能为空") | ||||
@ApiModelProperty("联系方式") | @ApiModelProperty("联系方式") | ||||
private String contact; | private String contact; | ||||
@ApiModelProperty("内部项目ID") | |||||
private List<Long> projectIdList; | |||||
@ApiModelProperty("外部项目") | |||||
private List<MeetingReviewProjectDTO> projects; | |||||
} | } |
@@ -0,0 +1,32 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.dto; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* MeetingEvalProjectDTO | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:18 2023/2/28 | |||||
*/ | |||||
@Data | |||||
public class MeetingReviewProjectDTO { | |||||
@ApiModelProperty("项目名称") | |||||
private String projectName; | |||||
@ApiModelProperty("预算年度") | |||||
private Integer projectYear; | |||||
@ApiModelProperty("项目类型") | |||||
private String projectType; | |||||
@ApiModelProperty("申报金额") | |||||
private String declareAmount; | |||||
@ApiModelProperty("申报单位") | |||||
private String buildOrg; | |||||
} |
@@ -13,7 +13,7 @@ import java.util.Arrays; | |||||
* @since 10:11 2022/7/26 | * @since 10:11 2022/7/26 | ||||
*/ | */ | ||||
@Getter | @Getter | ||||
public enum ExpertInviteType { | |||||
public enum ExpertInviteTypeEnum { | |||||
/** | /** | ||||
* 专家抽取类型 | * 专家抽取类型 | ||||
@@ -24,12 +24,16 @@ public enum ExpertInviteType { | |||||
private final Integer code; | private final Integer code; | ||||
private final String name; | private final String name; | ||||
ExpertInviteType(Integer code, String name) { | |||||
ExpertInviteTypeEnum(Integer code, String name) { | |||||
this.code = code; | this.code = code; | ||||
this.name = name; | this.name = name; | ||||
} | } | ||||
public static ExpertInviteType getByCode(Integer code) { | |||||
public boolean eq(Integer code) { | |||||
return this.getCode().equals(code); | |||||
} | |||||
public static ExpertInviteTypeEnum getByCode(Integer code) { | |||||
return Arrays.stream(values()) | return Arrays.stream(values()) | ||||
.filter(w -> w.getCode().equals(code)) | .filter(w -> w.getCode().equals(code)) | ||||
.findFirst() | .findFirst() |
@@ -1,6 +1,5 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.req; | package com.ningdatech.pmapi.meeting.entity.req; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.AbstractInviteRule; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.AppointInviteRuleDTO; | import com.ningdatech.pmapi.meeting.entity.dto.AppointInviteRuleDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | ||||
@@ -22,15 +21,19 @@ import java.util.List; | |||||
*/ | */ | ||||
@Data | @Data | ||||
@ApiModel("专家抽取新家实体") | @ApiModel("专家抽取新家实体") | ||||
public class ExpertInviteCreateReq { | |||||
public class ExpertInviteReq { | |||||
@NotNull(message = "会议ID不能为空", groups = {AbstractInviteRule.RuleSave.class, AbstractInviteRule.CountCheck.class}) | |||||
@ApiModelProperty("会议ID") | @ApiModelProperty("会议ID") | ||||
private Long meetingId; | private Long meetingId; | ||||
@NotNull(message = "抽取类型不能为空") | |||||
@ApiModelProperty("抽取类型:1 随机抽取、2 指定抽取") | |||||
private Integer inviteType; | |||||
@Valid | @Valid | ||||
@NotNull(message = "回避信息不能为空") | |||||
@ApiModelProperty("回避信息") | @ApiModelProperty("回避信息") | ||||
private AvoidInfoDTO avoidInfo; | |||||
private AvoidInfoDTO avoidRule; | |||||
@Valid | @Valid | ||||
@ApiModelProperty("随机抽取规则") | @ApiModelProperty("随机抽取规则") |
@@ -0,0 +1,31 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.req; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingBasicDTO; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import javax.validation.Valid; | |||||
import javax.validation.constraints.NotNull; | |||||
/** | |||||
* <p> | |||||
* MeetingCreateReq | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:33 2023/2/28 | |||||
*/ | |||||
@Data | |||||
public class MeetingCreateReq { | |||||
@Valid | |||||
@NotNull(message = "会议基本信息不能为空") | |||||
@ApiModelProperty("会议基本信息") | |||||
private MeetingBasicDTO meetingBasicInfo; | |||||
@Valid | |||||
@NotNull(message = "会议邀请规则不能为空") | |||||
@ApiModelProperty("会议邀请规则") | |||||
private ExpertInviteReq expertInviteRule; | |||||
} |
@@ -0,0 +1,27 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.vo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 指定邀请规则 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 11:26 2023/3/1 | |||||
*/ | |||||
@Data | |||||
@ApiModel("指定邀请规则") | |||||
public class AppointRuleVO { | |||||
@ApiModelProperty("邀请说明") | |||||
private String inviteDesc; | |||||
@ApiModelProperty("指定邀请专家") | |||||
private List<ExpertBasicInfoVO> experts; | |||||
} |
@@ -0,0 +1,33 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.vo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 回避信息 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 11:25 2023/3/1 | |||||
*/ | |||||
@Data | |||||
@ApiModel("回避信息") | |||||
public class AvoidInfoVO { | |||||
@ApiModelProperty("回避单位") | |||||
private List<String> avoidUnitIds; | |||||
@ApiModelProperty("回避条线") | |||||
private List<String> avoidOrgIds; | |||||
@ApiModelProperty("每周邀请次数") | |||||
private Integer weekInviteCount; | |||||
@ApiModelProperty("回避专家") | |||||
private List<ExpertBasicInfoVO> experts; | |||||
} |
@@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | import lombok.Data; | ||||
import lombok.EqualsAndHashCode; | import lombok.EqualsAndHashCode; | ||||
import java.util.ArrayList; | |||||
import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
@@ -57,25 +56,25 @@ public class ExpertInviteDetailVO { | |||||
} | } | ||||
@ApiModelProperty("参与数量总计") | @ApiModelProperty("参与数量总计") | ||||
private Integer attendTotal = 0; | |||||
private Integer attendTotal; | |||||
@ApiModelProperty("随机邀请参与数量") | @ApiModelProperty("随机邀请参与数量") | ||||
private Integer randomAttend = 0; | |||||
private Integer randomAttend; | |||||
@ApiModelProperty("指定邀请参与数量") | @ApiModelProperty("指定邀请参与数量") | ||||
private Integer appointAttend = 0; | |||||
private Integer appointAttend; | |||||
@ApiModelProperty("是否已停止邀请") | @ApiModelProperty("是否已停止邀请") | ||||
private Boolean invitedStopped; | private Boolean invitedStopped; | ||||
@ApiModelProperty("最终参与名单") | @ApiModelProperty("最终参与名单") | ||||
private List<ExpertAttendListItemVO> attendList = new ArrayList<>(); | |||||
private List<ExpertAttendListItemVO> attendList; | |||||
@ApiModelProperty("随机邀请名单") | @ApiModelProperty("随机邀请名单") | ||||
private List<RandomInviteListItemVO> randomInviteList = new ArrayList<>(); | |||||
private List<RandomInviteListItemVO> randomInviteList; | |||||
@ApiModelProperty("指定邀请名单") | @ApiModelProperty("指定邀请名单") | ||||
private List<RandomInviteListItemVO> appointInviteList = new ArrayList<>(); | |||||
private List<RandomInviteListItemVO> appointInviteList; | |||||
public void addAttendList(ExpertAttendListItemVO attend) { | public void addAttendList(ExpertAttendListItemVO attend) { | ||||
this.attendList.add(attend); | this.attendList.add(attend); | ||||
@@ -16,57 +16,15 @@ import java.util.List; | |||||
@Data | @Data | ||||
public class InviteRuleDetailVO { | public class InviteRuleDetailVO { | ||||
@ApiModelProperty("是否创建邀请规则") | |||||
private Boolean invited; | |||||
private Integer inviteType; | |||||
@ApiModelProperty("随机邀请规则") | @ApiModelProperty("随机邀请规则") | ||||
private List<RandomInviteRuleVO> randomRules; | private List<RandomInviteRuleVO> randomRules; | ||||
@ApiModelProperty("是否有指定抽取规则") | |||||
private Boolean hasAppointRule; | |||||
@ApiModelProperty("指定抽取规则") | @ApiModelProperty("指定抽取规则") | ||||
private AppointRuleVo appointRule; | |||||
@ApiModelProperty("是否有回避规则") | |||||
private Boolean hasAvoidInfo; | |||||
private AppointRuleVO appointRule; | |||||
@ApiModelProperty("回避信息") | @ApiModelProperty("回避信息") | ||||
private AvoidInfoVo avoidInfo; | |||||
@Data | |||||
public static class AvoidInfoVo { | |||||
private List<String> companyIds; | |||||
private Boolean avoidMates; | |||||
private List<ExpertBasicInfoVO> experts; | |||||
} | |||||
@Data | |||||
public static class AppointRuleVo { | |||||
private String inviteDesc; | |||||
private List<ExpertBasicInfoVO> experts; | |||||
} | |||||
public Boolean setAndGetHasAppointRule(Boolean hasAppointRule) { | |||||
this.hasAppointRule = hasAppointRule; | |||||
return this.hasAppointRule; | |||||
} | |||||
public Boolean setAndGetHasAvoidInfo(Boolean hasAvoidInfo) { | |||||
this.hasAvoidInfo = hasAvoidInfo; | |||||
return this.hasAvoidInfo; | |||||
} | |||||
public Boolean setAndGetInvited(Boolean invited) { | |||||
this.invited = invited; | |||||
return this.invited; | |||||
} | |||||
private AvoidInfoVO avoidInfo; | |||||
} | } |
@@ -1,8 +1,7 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.vo; | package com.ningdatech.pmapi.meeting.entity.vo; | ||||
import com.alibaba.fastjson.annotation.JSONField; | import com.alibaba.fastjson.annotation.JSONField; | ||||
import com.ningdatech.file.entity.vo.result.AttachFileVo; | |||||
import com.ningdatech.pmapi.sys.model.dto.RegionDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.req.ExpertInviteReq; | |||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.Builder; | import lombok.Builder; | ||||
@@ -10,7 +9,6 @@ import lombok.Data; | |||||
import lombok.experimental.Tolerate; | import lombok.experimental.Tolerate; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.List; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -29,35 +27,36 @@ public class MeetingDetailBasicVO { | |||||
public MeetingDetailBasicVO() { | public MeetingDetailBasicVO() { | ||||
} | } | ||||
private Long id; | |||||
private Long meetingId; | |||||
@ApiModelProperty("会议名称") | @ApiModelProperty("会议名称") | ||||
private String name; | |||||
private String meetingName; | |||||
@ApiModelProperty("会议类型名称") | @ApiModelProperty("会议类型名称") | ||||
private String typeName; | private String typeName; | ||||
@ApiModelProperty("会议类型代码") | @ApiModelProperty("会议类型代码") | ||||
private String type; | |||||
private String meetingType; | |||||
@ApiModelProperty("开始时间") | @ApiModelProperty("开始时间") | ||||
@JSONField(format = "yyyy-MM-dd HH:mm") | @JSONField(format = "yyyy-MM-dd HH:mm") | ||||
private LocalDateTime startTime; | private LocalDateTime startTime; | ||||
@ApiModelProperty("结束时间") | |||||
@ApiModelProperty("评委到场时间") | |||||
@JSONField(format = "yyyy-MM-dd HH:mm") | @JSONField(format = "yyyy-MM-dd HH:mm") | ||||
private LocalDateTime endTime; | |||||
private LocalDateTime judgesAttendanceTime; | |||||
@ApiModelProperty("会议耗时") | |||||
private Integer meetingUsageTime; | |||||
@ApiModelProperty("联系人") | @ApiModelProperty("联系人") | ||||
private String connecter; | private String connecter; | ||||
@ApiModelProperty("创建人") | @ApiModelProperty("创建人") | ||||
private String author; | |||||
private List<RegionDTO> regions; | |||||
private String creator; | |||||
@ApiModelProperty("地点") | |||||
private String address; | |||||
@ApiModelProperty("评审地点") | |||||
private String meetingAddress; | |||||
@ApiModelProperty("联系方式") | @ApiModelProperty("联系方式") | ||||
private String contact; | private String contact; | ||||
@@ -65,33 +64,19 @@ public class MeetingDetailBasicVO { | |||||
@ApiModelProperty("创建时间") | @ApiModelProperty("创建时间") | ||||
private LocalDateTime createOn; | private LocalDateTime createOn; | ||||
@ApiModelProperty("会议说明") | |||||
private String description; | |||||
@ApiModelProperty("相关材料") | |||||
private List<AttachFileVo> attachments; | |||||
@ApiModelProperty("备注") | |||||
private String remark; | |||||
@ApiModelProperty("会议状态") | @ApiModelProperty("会议状态") | ||||
private Integer status; | private Integer status; | ||||
@ApiModelProperty("专家出席状态") | |||||
private Integer attendStatus; | |||||
@ApiModelProperty("取消说明") | @ApiModelProperty("取消说明") | ||||
private String cancelRemark; | private String cancelRemark; | ||||
@ApiModelProperty("创建人") | @ApiModelProperty("创建人") | ||||
private String createBy; | private String createBy; | ||||
private Boolean invited; | |||||
@ApiModelProperty("抽取单位") | @ApiModelProperty("抽取单位") | ||||
private String holdOrg; | private String holdOrg; | ||||
@ApiModelProperty("是否已确认下发会议通知名单") | |||||
private Boolean sendMeetingNotice; | |||||
@ApiModelProperty("抽取信息") | |||||
private InviteRuleDetailVO inviteRule; | |||||
} | } |
@@ -1,10 +1,17 @@ | |||||
package com.ningdatech.pmapi.meeting.helper; | package com.ningdatech.pmapi.meeting.helper; | ||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.AbstractInviteRule; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.AppointInviteRuleDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | ||||
@@ -12,7 +19,9 @@ import com.ningdatech.pmapi.meeting.service.IMeetingExpertService; | |||||
import com.ningdatech.pmapi.meeting.service.IMeetingService; | import com.ningdatech.pmapi.meeting.service.IMeetingService; | ||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.util.Assert; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.*; | import java.util.*; | ||||
@@ -32,6 +41,7 @@ public class ExpertInviteHelper { | |||||
private final IMeetingService meetingService; | private final IMeetingService meetingService; | ||||
private final IMeetingExpertService meetingExpertService; | private final IMeetingExpertService meetingExpertService; | ||||
private final IExpertUserFullInfoService expertUserFullInfoService; | |||||
/** | /** | ||||
* 获取时间段内被抽中的专家(通知中、确认参加) | * 获取时间段内被抽中的专家(通知中、确认参加) | ||||
@@ -77,4 +87,29 @@ public class ExpertInviteHelper { | |||||
return expertIds; | return expertIds; | ||||
} | } | ||||
public Map<Long, ExpertUserFullInfo> checkAppointExpert(AppointInviteRuleDTO appointRule) { | |||||
if (appointRule == null) { | |||||
return Collections.emptyMap(); | |||||
} | |||||
List<ExpertUserFullInfo> expertInfos = expertUserFullInfoService.listByUserId(appointRule.getExpertIds()); | |||||
return CollUtils.listToMap(expertInfos, ExpertUserFullInfo::getUserId); | |||||
} | |||||
/** | |||||
* 构建邀请规则 | |||||
* | |||||
* @param rule 邀请规则 | |||||
* @param meetingId 会议ID | |||||
* @return {@link ExpertInviteRule} | |||||
* @author WendyYang | |||||
**/ | |||||
public static ExpertInviteRule getExpertInviteRule(AbstractInviteRule rule, Long meetingId) { | |||||
ExpertInviteRule result = new ExpertInviteRule(); | |||||
result.setInviteRule(JSONObject.toJSONString(rule)); | |||||
result.setInviteCount(rule.getCount()); | |||||
result.setInviteType(rule.getInviteType()); | |||||
result.setMeetingId(meetingId); | |||||
return result; | |||||
} | |||||
} | } |
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.pmapi.common.util.BizUtils; | import com.ningdatech.pmapi.common.util.BizUtils; | ||||
import com.ningdatech.pmapi.common.util.StrUtils; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | ||||
import com.ningdatech.pmapi.expert.service.ExpertInfoService; | import com.ningdatech.pmapi.expert.service.ExpertInfoService; | ||||
@@ -16,6 +15,7 @@ import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingBasicDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.req.MeetingListReq; | import com.ningdatech.pmapi.meeting.entity.req.MeetingListReq; | ||||
@@ -50,6 +50,14 @@ public class MeetingManageHelper { | |||||
private final IExpertInviteRuleService inviteRuleService; | private final IExpertInviteRuleService inviteRuleService; | ||||
private final IExpertInviteAvoidRuleService inviteAvoidRuleService; | private final IExpertInviteAvoidRuleService inviteAvoidRuleService; | ||||
public void checkReviewProject(MeetingBasicDTO meetingBasic) { | |||||
if (meetingBasic.getIsInnerProject()) { | |||||
Assert.notEmpty(meetingBasic.getProjectIdList(), "评审项目不能为空"); | |||||
} else { | |||||
Assert.notEmpty(meetingBasic.getProjects(), "评审项目不能为空"); | |||||
} | |||||
} | |||||
/** | /** | ||||
* 获取专家出席会议的状态 | * 获取专家出席会议的状态 | ||||
* | * | ||||
@@ -80,7 +88,6 @@ public class MeetingManageHelper { | |||||
.connecter(meeting.getConnecter()) | .connecter(meeting.getConnecter()) | ||||
.contact(meeting.getContact()) | .contact(meeting.getContact()) | ||||
.status(meeting.getStatus()) | .status(meeting.getStatus()) | ||||
.invited(meeting.getInvited()) | |||||
.holdOrg(meeting.getHoldOrg()) | .holdOrg(meeting.getHoldOrg()) | ||||
.build(); | .build(); | ||||
} | } | ||||
@@ -134,11 +141,12 @@ public class MeetingManageHelper { | |||||
public AvoidInfoDTO getAvoidInfoDto(Long meetingId) { | public AvoidInfoDTO getAvoidInfoDto(Long meetingId) { | ||||
ExpertInviteAvoidRule avoidRule = inviteAvoidRuleService.getByMeetingId(meetingId); | ExpertInviteAvoidRule avoidRule = inviteAvoidRuleService.getByMeetingId(meetingId); | ||||
AvoidInfoDTO avoidInfoDto = new AvoidInfoDTO(); | |||||
avoidInfoDto.setAvoidMates(avoidRule.getAvoidMates()); | |||||
avoidInfoDto.setExpertIds(BizUtils.splitToLong(avoidRule.getExpertIds())); | |||||
avoidInfoDto.setCompanyIds(StrUtils.split(avoidRule.getCompanyIds())); | |||||
return avoidInfoDto; | |||||
AvoidInfoDTO result = new AvoidInfoDTO(); | |||||
result.setAvoidOrgIdList(StrUtil.split(avoidRule.getAvoidOrgIds(), ",")); | |||||
result.setExpertIds(BizUtils.splitToLong(avoidRule.getExpertIds())); | |||||
result.setAvoidUnitIdList(StrUtil.split(avoidRule.getAvoidUnitIds(), ",")); | |||||
result.setWeekInviteCount(result.getWeekInviteCount()); | |||||
return result; | |||||
} | } | ||||
public void saveAvoidInfo(Long meetingId, List<Long> expertIds) { | public void saveAvoidInfo(Long meetingId, List<Long> expertIds) { | ||||
@@ -159,16 +167,12 @@ public class MeetingManageHelper { | |||||
AvoidInfoDTO avoidRule = getAvoidInfoDto(meetingId); | AvoidInfoDTO avoidRule = getAvoidInfoDto(meetingId); | ||||
Map<String, Integer> countMap = new HashMap<>(16); | Map<String, Integer> countMap = new HashMap<>(16); | ||||
experts.forEach(expert -> { | experts.forEach(expert -> { | ||||
if (avoidRule.getCompanyIds().contains(expert.getCompany())) { | |||||
if (avoidRule.getAvoidUnitIdList().contains(expert.getCompany())) { | |||||
throw BizException.wrap("回避单位的专家不可出现在指定邀请名单中"); | throw BizException.wrap("回避单位的专家不可出现在指定邀请名单中"); | ||||
} | } | ||||
if (CollectionUtils.isNotEmpty(avoidRule.getExpertIds()) && avoidRule.getExpertIds().contains(expert.getUserId())) { | if (CollectionUtils.isNotEmpty(avoidRule.getExpertIds()) && avoidRule.getExpertIds().contains(expert.getUserId())) { | ||||
throw BizException.wrap("已回避的专家不可被指定邀请"); | throw BizException.wrap("已回避的专家不可被指定邀请"); | ||||
} | } | ||||
if (avoidRule.getAvoidMates()) { | |||||
Integer oldValue = countMap.put(expert.getCompany(), 1); | |||||
Assert.isNull(oldValue, "不可选择同单位的多个专家"); | |||||
} | |||||
// 校验专家状态 | // 校验专家状态 | ||||
ExpertAccountStatusEnum accountStatus = ExpertAccountStatusEnum.of(expert.getExpertAccountStatus()); | ExpertAccountStatusEnum accountStatus = ExpertAccountStatusEnum.of(expert.getExpertAccountStatus()); | ||||
if (!accountStatus.equals(ExpertAccountStatusEnum.AVAILABLE)) { | if (!accountStatus.equals(ExpertAccountStatusEnum.AVAILABLE)) { | ||||
@@ -13,7 +13,7 @@ import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.CountConfirmByMeetingIdDTO; | import com.ningdatech.pmapi.meeting.entity.dto.CountConfirmByMeetingIdDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatusByDashboard; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatusByDashboard; | ||||
import com.ningdatech.pmapi.meeting.entity.req.MeetingCalenderReq; | import com.ningdatech.pmapi.meeting.entity.req.MeetingCalenderReq; | ||||
@@ -202,7 +202,7 @@ public class DashboardManage { | |||||
item.setExpertMeetingId(w.getId()); | item.setExpertMeetingId(w.getId()); | ||||
Meeting meeting = meetingMap.get(w.getMeetingId()); | Meeting meeting = meetingMap.get(w.getMeetingId()); | ||||
item.setMeetingName(meeting.getName()); | item.setMeetingName(meeting.getName()); | ||||
item.setInviteType(ExpertInviteType.getByCode(w.getInviteType()).getName()); | |||||
item.setInviteType(ExpertInviteTypeEnum.getByCode(w.getInviteType()).getName()); | |||||
item.setStatus(w.getStatus()); | item.setStatus(w.getStatus()); | ||||
item.setStartTime(meeting.getStartTime()); | item.setStartTime(meeting.getStartTime()); | ||||
item.setEndTime(meeting.getEndTime()); | item.setEndTime(meeting.getEndTime()); | ||||
@@ -1,7 +1,6 @@ | |||||
package com.ningdatech.pmapi.meeting.manage; | package com.ningdatech.pmapi.meeting.manage; | ||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
@@ -16,7 +15,10 @@ import com.ningdatech.pmapi.meeting.builder.ExpertInviteBuilder; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.*; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.ExpertChooseDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.ExpertDictChooseDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | ||||
import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | ||||
@@ -35,13 +37,14 @@ import org.apache.commons.collections4.Predicate; | |||||
import org.apache.commons.lang3.ObjectUtils; | import org.apache.commons.lang3.ObjectUtils; | ||||
import org.apache.commons.lang3.RandomUtils; | import org.apache.commons.lang3.RandomUtils; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.util.Assert; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.*; | import java.util.*; | ||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
import java.util.stream.Stream; | import java.util.stream.Stream; | ||||
import static com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper.getExpertInviteRule; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
* 专家邀请管理 | * 专家邀请管理 | ||||
@@ -149,7 +152,7 @@ public class ExpertInviteManage { | |||||
return null; | return null; | ||||
} | } | ||||
// 处理专家回避单位 与 抽取回避单位是否相同 | // 处理专家回避单位 与 抽取回避单位是否相同 | ||||
List<Long> avoidCompanyExpertIds = avoidCompanyExpertIds(avoidInfo.getCompanyIds()); | |||||
List<Long> avoidCompanyExpertIds = avoidCompanyExpertIds(avoidInfo.getAvoidUnitIdList()); | |||||
// 聚合用户ID | // 聚合用户ID | ||||
List<Long> expertIdsIn = new ArrayList<>(); | List<Long> expertIdsIn = new ArrayList<>(); | ||||
@@ -261,10 +264,10 @@ public class ExpertInviteManage { | |||||
} | } | ||||
boolean avoid = avoidInfo != null; | boolean avoid = avoidInfo != null; | ||||
boolean avoidExpert = avoid && CollUtil.isNotEmpty(avoidInfo.getExpertIds()); | boolean avoidExpert = avoid && CollUtil.isNotEmpty(avoidInfo.getExpertIds()); | ||||
boolean avoidCompany = avoid && CollUtil.isNotEmpty(avoidInfo.getCompanyIds()); | |||||
boolean avoidCompany = avoid && CollUtil.isNotEmpty(avoidInfo.getAvoidUnitIdList()); | |||||
Set<String> tmpAvoidCompany = new HashSet<>(); | Set<String> tmpAvoidCompany = new HashSet<>(); | ||||
if (avoidCompany) { | if (avoidCompany) { | ||||
List<String> companyIds = avoidInfo.getCompanyIds(); | |||||
List<String> companyIds = avoidInfo.getAvoidUnitIdList(); | |||||
for (String companyId : companyIds) { | for (String companyId : companyIds) { | ||||
if (companyId.contains(",")) { | if (companyId.contains(",")) { | ||||
String[] splitCompanyIds = companyId.split(","); | String[] splitCompanyIds = companyId.split(","); | ||||
@@ -277,16 +280,11 @@ public class ExpertInviteManage { | |||||
} | } | ||||
} | } | ||||
// 回避信息 | // 回避信息 | ||||
if (CollUtil.isNotEmpty(appointExpertIds) && avoid && avoidInfo.getAvoidMates()) { | |||||
// 如果设置了回避本单位同事且手动指定了专家,则对应的单位需要排除 | |||||
List<ExpertUserFullInfo> appointUsers = expertUserFullInfoService.listByUserId(appointExpertIds); | |||||
tmpAvoidCompany.addAll(CollUtils.fieldList(appointUsers, ExpertUserFullInfo::getCompany)); | |||||
} | |||||
LambdaQueryWrapper<ExpertUserFullInfo> query = buildBaseExpertQuery(); | LambdaQueryWrapper<ExpertUserFullInfo> query = buildBaseExpertQuery(); | ||||
query.notIn(!tmpAvoidCompany.isEmpty(), ExpertUserFullInfo::getCompany, tmpAvoidCompany); | query.notIn(!tmpAvoidCompany.isEmpty(), ExpertUserFullInfo::getCompany, tmpAvoidCompany); | ||||
if (avoidCompany) { | if (avoidCompany) { | ||||
query.notExists("select 1 from expert_avoid_company eac where eac.user_id = expert_user_full_info.user_id" + | query.notExists("select 1 from expert_avoid_company eac where eac.user_id = expert_user_full_info.user_id" + | ||||
" and company_name in ({0})", CollUtils.joinByComma(avoidInfo.getCompanyIds())); | |||||
" and company_name in ({0})", CollUtils.joinByComma(avoidInfo.getAvoidUnitIdList())); | |||||
} | } | ||||
// 处理专家层级 | // 处理专家层级 | ||||
addRegionLimit(query, randomRule); | addRegionLimit(query, randomRule); | ||||
@@ -326,21 +324,11 @@ public class ExpertInviteManage { | |||||
if (userFullInfos.isEmpty()) { | if (userFullInfos.isEmpty()) { | ||||
return result; | return result; | ||||
} | } | ||||
if (avoid && avoidInfo.getAvoidMates()) { | |||||
// 回避同单位其他专家 | |||||
Map<String, List<ExpertUserFullInfo>> userFullInfoMap = CollUtils.group(userFullInfos, ExpertUserFullInfo::getCompany); | |||||
result.setTotal(userFullInfoMap.size()); | |||||
if (randomRule.getCount() == null || userFullInfoMap.size() >= randomRule.getCount()) { | |||||
List<ExpertUserFullInfo> userFullInfoList = inviteGroupByCompany(userFullInfoMap, randomRule.getCount()); | |||||
result.setExperts(userFullInfoList); | |||||
} | |||||
} else { | |||||
result.setTotal(userFullInfos.size()); | |||||
// count为空表示数量校验 | |||||
if (randomRule.getCount() == null || result.getTotal() >= randomRule.getCount()) { | |||||
List<ExpertUserFullInfo> userFullInfoList = inviteWithoutCompany(userFullInfos, randomRule.getCount()); | |||||
result.setExperts(userFullInfoList); | |||||
} | |||||
result.setTotal(userFullInfos.size()); | |||||
// count为空表示数量校验 | |||||
if (randomRule.getCount() == null || result.getTotal() >= randomRule.getCount()) { | |||||
List<ExpertUserFullInfo> userFullInfoList = inviteWithoutCompany(userFullInfos, randomRule.getCount()); | |||||
result.setExperts(userFullInfoList); | |||||
} | } | ||||
return result; | return result; | ||||
} | } | ||||
@@ -369,9 +357,9 @@ public class ExpertInviteManage { | |||||
return result; | return result; | ||||
} | } | ||||
LambdaQueryWrapper<ExpertUserFullInfo> query = buildBaseExpertQuery(); | LambdaQueryWrapper<ExpertUserFullInfo> query = buildBaseExpertQuery(); | ||||
query.notIn(ExpertUserFullInfo::getCompany, avoidInfo.getCompanyIds()); | |||||
query.notIn(ExpertUserFullInfo::getCompany, avoidInfo.getAvoidUnitIdList()); | |||||
query.notExists("select 1 from expert_avoid_company eac where eac.user_id = expert_user_full_info.user_id" + | query.notExists("select 1 from expert_avoid_company eac where eac.user_id = expert_user_full_info.user_id" + | ||||
" and company_name in ({0})", CollUtils.joinByComma(avoidInfo.getCompanyIds())); | |||||
" and company_name in ({0})", CollUtils.joinByComma(avoidInfo.getAvoidOrgIdList())); | |||||
// 处理专家层级 | // 处理专家层级 | ||||
if (ObjectUtils.allNotNull(randomRule.getExpertRegionCode(), randomRule.getExpertRegionLevel())) { | if (ObjectUtils.allNotNull(randomRule.getExpertRegionCode(), randomRule.getExpertRegionLevel())) { | ||||
@@ -440,23 +428,10 @@ public class ExpertInviteManage { | |||||
removeExpertIds.add(replacedExpertId); | removeExpertIds.add(replacedExpertId); | ||||
} | } | ||||
List<Long> tempExpertIds = CollUtils.fieldList(removeExpertByCompany, MeetingExpert::getExpertId); | List<Long> tempExpertIds = CollUtils.fieldList(removeExpertByCompany, MeetingExpert::getExpertId); | ||||
if (avoidInfo.getAvoidMates()) { | |||||
if (!tempExpertIds.isEmpty()) { | |||||
Set<String> confirmedCompany = userFullInfos.stream() | |||||
.filter(w -> tempExpertIds.contains(w.getUserId())) | |||||
.map(ExpertUserFullInfo::getCompany).collect(Collectors.toSet()); | |||||
userFullInfos.removeIf(w -> confirmedCompany.contains(w.getCompany())); | |||||
} | |||||
userFullInfos.removeIf(w -> removeExpertIds.contains(w.getUserId())); | |||||
Map<String, List<ExpertUserFullInfo>> groupByCompany = CollUtils.group(userFullInfos, ExpertUserFullInfo::getCompany); | |||||
result.setTotal(groupByCompany.size()); | |||||
result.setExperts(inviteGroupByCompany(groupByCompany, count)); | |||||
} else { | |||||
// 移除确认参加、通知中的、拒绝参加、已取消 | |||||
userFullInfos.removeIf(w -> tempExpertIds.contains(w.getUserId()) || removeExpertIds.contains(w.getUserId())); | |||||
result.setTotal(userFullInfos.size()); | |||||
result.setExperts(inviteWithoutCompany(userFullInfos, count)); | |||||
} | |||||
// 移除确认参加、通知中的、拒绝参加、已取消 | |||||
userFullInfos.removeIf(w -> tempExpertIds.contains(w.getUserId()) || removeExpertIds.contains(w.getUserId())); | |||||
result.setTotal(userFullInfos.size()); | |||||
result.setExperts(inviteWithoutCompany(userFullInfos, count)); | |||||
return result; | return result; | ||||
} | } | ||||
@@ -569,78 +544,27 @@ public class ExpertInviteManage { | |||||
} | } | ||||
/** | /** | ||||
* 构建邀请规则 | |||||
* | |||||
* @param inviteRule 邀请规则 | |||||
* @param meetingId 会议ID | |||||
* @return {@link ExpertInviteRule} | |||||
* @author WendyYang | |||||
**/ | |||||
private static ExpertInviteRule getExpertInviteRule(AbstractInviteRule inviteRule, Long meetingId) { | |||||
ExpertInviteRule rule = new ExpertInviteRule(); | |||||
rule.setInviteRule(JSONObject.toJSONString(inviteRule)); | |||||
rule.setInviteCount(inviteRule.getCount()); | |||||
rule.setInviteType(inviteRule.getInviteType()); | |||||
rule.setMeetingId(meetingId); | |||||
return rule; | |||||
} | |||||
public Map<Long, ExpertUserFullInfo> checkAppointExpertConflictWithAvoidRule(AppointInviteRuleDTO appointRule, AvoidInfoDTO avoidRule) { | |||||
if (appointRule == null) { | |||||
return Collections.emptyMap(); | |||||
} | |||||
List<ExpertUserFullInfo> expertInfos = expertUserFullInfoService.listByUserId(appointRule.getExpertIds()); | |||||
Map<Long, ExpertUserFullInfo> infoMap = CollUtils.listToMap(expertInfos, ExpertUserFullInfo::getUserId); | |||||
if (avoidRule == null) { | |||||
return infoMap; | |||||
} | |||||
Map<String, Integer> countMap = new HashMap<>(16); | |||||
infoMap.forEach((key, userFullInfo) -> { | |||||
if (CollectionUtils.isNotEmpty(avoidRule.getExpertIds())) { | |||||
boolean contains = avoidRule.getExpertIds().contains(key); | |||||
Assert.isTrue(!contains, "已回避的专家不可被指定邀请"); | |||||
} | |||||
if (CollectionUtils.isNotEmpty(avoidRule.getCompanyIds())) { | |||||
boolean contains = avoidRule.getCompanyIds().contains(userFullInfo.getCompany()); | |||||
Assert.isTrue(!contains, "回避单位的专家不可出现在指定邀请名单中"); | |||||
} | |||||
if (avoidRule.getAvoidMates()) { | |||||
Integer oldValue = countMap.put(userFullInfo.getCompany(), 1); | |||||
Assert.isNull(oldValue, "不可选择同单位的多个专家"); | |||||
} | |||||
}); | |||||
return infoMap; | |||||
} | |||||
/** | |||||
* 专家抽取(会议创建时抽取) | * 专家抽取(会议创建时抽取) | ||||
* | * | ||||
* @param randomRules 随机抽取规则 | * @param randomRules 随机抽取规则 | ||||
* @param appointRule 指定抽取规则 | |||||
* @param avoid 回避信息 | * @param avoid 回避信息 | ||||
* @author WendyYang | * @author WendyYang | ||||
**/ | **/ | ||||
public void expertInviteByMeetingCreate(Meeting meeting, | |||||
List<RandomInviteRuleDTO> randomRules, | |||||
AppointInviteRuleDTO appointRule, | |||||
AvoidInfoDTO avoid) { | |||||
Map<Long, ExpertUserFullInfo> appointUser = checkAppointExpertConflictWithAvoidRule(appointRule, avoid); | |||||
public void expertRandomInviteByMeetingCreate(Meeting meeting, | |||||
List<RandomInviteRuleDTO> randomRules, | |||||
AvoidInfoDTO avoid) { | |||||
List<MeetingExpert> expertInserts = new ArrayList<>(); | List<MeetingExpert> expertInserts = new ArrayList<>(); | ||||
boolean appointed = appointRule != null; | |||||
// 处理随机抽取规则 | // 处理随机抽取规则 | ||||
if (CollectionUtils.isNotEmpty(randomRules)) { | if (CollectionUtils.isNotEmpty(randomRules)) { | ||||
List<ExpertInviteRule> randoms = new ArrayList<>(); | List<ExpertInviteRule> randoms = new ArrayList<>(); | ||||
List<ExpertChooseDTO> expertsByRandom = new ArrayList<>(); | List<ExpertChooseDTO> expertsByRandom = new ArrayList<>(); | ||||
List<Long> tempExpertIdSelected = new ArrayList<>(); | |||||
if (appointed) { | |||||
tempExpertIdSelected.addAll(appointRule.getExpertIds()); | |||||
} | |||||
LocalDateTime startTime = meeting.getStartTime(), endTime = meeting.getEndTime(); | |||||
List<Long> choosedExpertIds = new ArrayList<>(); | |||||
LocalDateTime startTime = meeting.getStartTime(); | |||||
LocalDateTime endTime = meeting.getEndTime(); | |||||
randomRules.forEach(rule -> { | randomRules.forEach(rule -> { | ||||
ExpertChooseDTO tempExperts = expertInviteByRandomRule(avoid, rule, tempExpertIdSelected, startTime, endTime); | |||||
ExpertChooseDTO tempExperts = expertInviteByRandomRule(avoid, rule, choosedExpertIds, startTime, endTime); | |||||
expertsByRandom.add(tempExperts); | expertsByRandom.add(tempExperts); | ||||
tempExpertIdSelected.addAll(CollUtils.fieldList(tempExperts.getExperts(), ExpertUserFullInfo::getUserId)); | |||||
choosedExpertIds.addAll(CollUtils.fieldList(tempExperts.getExperts(), ExpertUserFullInfo::getUserId)); | |||||
randoms.add(getExpertInviteRule(rule, meeting.getId())); | randoms.add(getExpertInviteRule(rule, meeting.getId())); | ||||
}); | }); | ||||
inviteRuleService.saveBatch(randoms); | inviteRuleService.saveBatch(randoms); | ||||
@@ -654,18 +578,6 @@ public class ExpertInviteManage { | |||||
} | } | ||||
yxtCallOrSmsHelper.callByMeetingExperts(meeting, expertInserts); | yxtCallOrSmsHelper.callByMeetingExperts(meeting, expertInserts); | ||||
} | } | ||||
if (appointed) { | |||||
// 处理指定抽取规则 | |||||
ExpertInviteRule appoint = getExpertInviteRule(appointRule, meeting.getId()); | |||||
inviteRuleService.save(appoint); | |||||
Long ruleId = appoint.getId(); | |||||
appointRule.getExpertIds().forEach(w -> { | |||||
ExpertUserFullInfo info = appointUser.get(w); | |||||
MeetingExpert expert = ExpertInviteBuilder.getExpertByAppoint(meeting.getId(), info, ruleId); | |||||
expert.setStatus(ExpertAttendStatus.NOTICING.getCode()); | |||||
expertInserts.add(expert); | |||||
}); | |||||
} | |||||
meetingExpertService.saveBatch(expertInserts); | meetingExpertService.saveBatch(expertInserts); | ||||
} | } | ||||
@@ -2,6 +2,7 @@ package com.ningdatech.pmapi.meeting.manage; | |||||
import cn.hutool.core.bean.BeanUtil; | import cn.hutool.core.bean.BeanUtil; | ||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.util.ObjectUtil; | |||||
import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||
import cn.hutool.crypto.SecureUtil; | import cn.hutool.crypto.SecureUtil; | ||||
import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
@@ -16,17 +17,15 @@ import com.ningdatech.basic.util.CollUtils; | |||||
import com.ningdatech.basic.util.ValidUtil; | import com.ningdatech.basic.util.ValidUtil; | ||||
import com.ningdatech.cache.lock.DistributedLock; | import com.ningdatech.cache.lock.DistributedLock; | ||||
import com.ningdatech.file.service.FileService; | import com.ningdatech.file.service.FileService; | ||||
import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | ||||
import com.ningdatech.pmapi.expert.helper.PermissionCheckHelper; | import com.ningdatech.pmapi.expert.helper.PermissionCheckHelper; | ||||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | ||||
import com.ningdatech.pmapi.meeting.builder.ExpertInviteBuilder; | import com.ningdatech.pmapi.meeting.builder.ExpertInviteBuilder; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteAvoidRule; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.*; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.*; | import com.ningdatech.pmapi.meeting.entity.dto.*; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus.Manager; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus.Manager; | ||||
import com.ningdatech.pmapi.meeting.entity.req.*; | import com.ningdatech.pmapi.meeting.entity.req.*; | ||||
import com.ningdatech.pmapi.meeting.entity.vo.*; | import com.ningdatech.pmapi.meeting.entity.vo.*; | ||||
@@ -35,10 +34,7 @@ import com.ningdatech.pmapi.meeting.entity.vo.ExpertInviteDetailVO.RandomInviteL | |||||
import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | ||||
import com.ningdatech.pmapi.meeting.helper.MeetingManageHelper; | import com.ningdatech.pmapi.meeting.helper.MeetingManageHelper; | ||||
import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | ||||
import com.ningdatech.pmapi.meeting.service.IExpertInviteAvoidRuleService; | |||||
import com.ningdatech.pmapi.meeting.service.IExpertInviteRuleService; | |||||
import com.ningdatech.pmapi.meeting.service.IMeetingExpertService; | |||||
import com.ningdatech.pmapi.meeting.service.IMeetingService; | |||||
import com.ningdatech.pmapi.meeting.service.*; | |||||
import com.ningdatech.pmapi.meeting.task.ExpertInviteTask; | import com.ningdatech.pmapi.meeting.task.ExpertInviteTask; | ||||
import com.ningdatech.pmapi.meta.helper.DictionaryCache; | import com.ningdatech.pmapi.meta.helper.DictionaryCache; | ||||
import com.ningdatech.pmapi.meta.helper.TagCache; | import com.ningdatech.pmapi.meta.helper.TagCache; | ||||
@@ -46,7 +42,6 @@ import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; | |||||
import com.ningdatech.pmapi.user.service.IUserInfoService; | import com.ningdatech.pmapi.user.service.IUserInfoService; | ||||
import com.ningdatech.pmapi.user.util.LoginUserUtil; | import com.ningdatech.pmapi.user.util.LoginUserUtil; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||
@@ -54,6 +49,9 @@ import org.springframework.util.Assert; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.*; | import java.util.*; | ||||
import java.util.function.Function; | import java.util.function.Function; | ||||
import java.util.stream.Collectors; | |||||
import static com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper.getExpertInviteRule; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -67,6 +65,7 @@ import java.util.function.Function; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class MeetingManage { | public class MeetingManage { | ||||
private final RegionCacheHelper regionCacheHelper; | |||||
private final IMeetingService meetingService; | private final IMeetingService meetingService; | ||||
private final IExpertInviteAvoidRuleService inviteAvoidRuleService; | private final IExpertInviteAvoidRuleService inviteAvoidRuleService; | ||||
private final IExpertInviteRuleService inviteRuleService; | private final IExpertInviteRuleService inviteRuleService; | ||||
@@ -82,6 +81,8 @@ public class MeetingManage { | |||||
private final DistributedLock distributedLock; | private final DistributedLock distributedLock; | ||||
private final PermissionCheckHelper permissionCheckHelper; | private final PermissionCheckHelper permissionCheckHelper; | ||||
private final IUserInfoService userInfoService; | private final IUserInfoService userInfoService; | ||||
private final IMeetingInnerProjectService meetingInnerProjectService; | |||||
private final IMeetingOuterProjectService meetingOuterProjectService; | |||||
private final ExpertInviteHelper expertInviteHelper; | private final ExpertInviteHelper expertInviteHelper; | ||||
private static final String INVITED_RULE_CREATE = "INVITED_RULE_CREATE:"; | private static final String INVITED_RULE_CREATE = "INVITED_RULE_CREATE:"; | ||||
@@ -93,23 +94,45 @@ public class MeetingManage { | |||||
*/ | */ | ||||
public static final int RETRY_TIMES = 3; | public static final int RETRY_TIMES = 3; | ||||
public IdVo<Long> save(MeetingBasicDTO po) { | |||||
String md5ByParam = SecureUtil.md5(po.toString()); | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public IdVo<Long> meetingCreateAndInviteExpert(MeetingCreateReq req) { | |||||
MeetingBasicDTO meetingBasic = req.getMeetingBasicInfo(); | |||||
meetingManageHelper.checkReviewProject(meetingBasic); | |||||
String md5ByParam = SecureUtil.md5(meetingBasic.toString()); | |||||
String key = MEETING_CREATE_KEY + md5ByParam; | String key = MEETING_CREATE_KEY + md5ByParam; | ||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | if (!distributedLock.lock(key, RETRY_TIMES)) { | ||||
throw BizException.wrap("会议正在创建中"); | throw BizException.wrap("会议正在创建中"); | ||||
} | } | ||||
try { | try { | ||||
Meeting meeting = BeanUtil.copyProperties(po, Meeting.class); | |||||
// 保存会议基本信息 | |||||
Meeting meeting = BeanUtil.copyProperties(meetingBasic, Meeting.class); | |||||
meeting.setStatus(Manager.UNCOMPLETED.getCode()); | meeting.setStatus(Manager.UNCOMPLETED.getCode()); | ||||
UserInfoDetails userDetail = LoginUserUtil.loginUserDetail(); | UserInfoDetails userDetail = LoginUserUtil.loginUserDetail(); | ||||
// TODO | |||||
meeting.setHoldOrg(userDetail.getOrganizationName()); | meeting.setHoldOrg(userDetail.getOrganizationName()); | ||||
meeting.setHoldOrgCode(userDetail.getOrganizationCode()); | meeting.setHoldOrgCode(userDetail.getOrganizationCode()); | ||||
meeting.setRegionCode(userDetail.getRegionCode()); | |||||
meeting.setCreator(userDetail.getUsername()); | meeting.setCreator(userDetail.getUsername()); | ||||
meeting.setInvited(Boolean.FALSE); | |||||
meeting.setInviteStopped(true); | meeting.setInviteStopped(true); | ||||
meetingService.save(meeting); | meetingService.save(meeting); | ||||
if (meetingBasic.getIsInnerProject()) { | |||||
List<MeetingInnerProject> projects = meetingBasic.getProjectIdList().stream().map(w -> { | |||||
MeetingInnerProject project = new MeetingInnerProject(); | |||||
project.setMeetingId(meeting.getId()); | |||||
project.setProjectId(w); | |||||
return project; | |||||
}).collect(Collectors.toList()); | |||||
meetingInnerProjectService.saveBatch(projects); | |||||
} else { | |||||
List<MeetingOuterProject> projects = meetingBasic.getProjects().stream().map(w -> { | |||||
MeetingOuterProject project = BeanUtil.copyProperties(w, MeetingOuterProject.class); | |||||
project.setMeetingId(meeting.getId()); | |||||
return project; | |||||
}).collect(Collectors.toList()); | |||||
meetingOuterProjectService.saveBatch(projects); | |||||
} | |||||
// 抽取专家 | |||||
req.getExpertInviteRule().setMeetingId(meeting.getId()); | |||||
expertInviteByCreate(req.getExpertInviteRule()); | |||||
return IdVo.of(meeting.getId()); | return IdVo.of(meeting.getId()); | ||||
} finally { | } finally { | ||||
distributedLock.releaseLock(key); | distributedLock.releaseLock(key); | ||||
@@ -117,45 +140,61 @@ public class MeetingManage { | |||||
} | } | ||||
@Transactional(rollbackFor = Exception.class) | @Transactional(rollbackFor = Exception.class) | ||||
public void expertInviteByCreate(ExpertInviteCreateReq req) { | |||||
// 未传递指定邀请专家直接忽略 | |||||
if (req.getAppointRule() != null && CollectionUtils.isEmpty(req.getAppointRule().getExpertIds())) { | |||||
Assert.isTrue(CollectionUtils.isNotEmpty(req.getRandomRules()), "未指定抽取规则"); | |||||
req.setAppointRule(null); | |||||
} | |||||
public void expertInviteByCreate(ExpertInviteReq req) { | |||||
String key = INVITED_RULE_CREATE + req.getMeetingId(); | String key = INVITED_RULE_CREATE + req.getMeetingId(); | ||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | if (!distributedLock.lock(key, RETRY_TIMES)) { | ||||
throw BizException.wrap("不可重复进行专家抽取"); | throw BizException.wrap("不可重复进行专家抽取"); | ||||
} | } | ||||
try { | try { | ||||
Meeting meeting = meetingService.getById(req.getMeetingId()); | Meeting meeting = meetingService.getById(req.getMeetingId()); | ||||
Assert.isTrue(!meeting.getInvited(), "不可重复进行专家抽取"); | |||||
ExpertCountOnChangeVO countOnChange = expertCountOnChange(req); | |||||
for (int i = 0; i < req.getRandomRules().size(); i++) { | |||||
Integer checkCount = countOnChange.getCountList().get(i); | |||||
Integer inviteCount = req.getRandomRules().get(i).getCount(); | |||||
Assert.isTrue(checkCount >= inviteCount, "可供抽取的专家数量不足"); | |||||
} | |||||
AvoidInfoDTO avoidInfo = req.getAvoidInfo(); | |||||
expertInviteManage.expertInviteByMeetingCreate(meeting, req.getRandomRules(), req.getAppointRule(), avoidInfo); | |||||
LambdaUpdateWrapper<Meeting> updater = Wrappers.lambdaUpdate(Meeting.class) | |||||
.set(Meeting::getInvited, Boolean.TRUE) | |||||
.eq(Meeting::getId, req.getMeetingId()); | |||||
if (CollectionUtils.isNotEmpty(req.getRandomRules())) { | |||||
if (ExpertInviteTypeEnum.RANDOM.eq(req.getInviteType())) { | |||||
List<RandomInviteRuleDTO> randomRules = req.getRandomRules(); | |||||
Assert.notEmpty(randomRules, "随机抽取规则不能为空"); | |||||
AvoidInfoDTO avoidInfo = req.getAvoidRule(); | |||||
Assert.notNull(avoidInfo, "回避信息不能为空"); | |||||
// 随机抽取的话则需进行抽取数量校验 | |||||
ExpertCountOnChangeVO countOnChange = expertCountOnChange(req); | |||||
if (!countOnChange.getStatus()) { | |||||
throw BizException.wrap(countOnChange.getMessage()); | |||||
} | |||||
for (int i = 0; i < randomRules.size(); i++) { | |||||
Integer checkCount = countOnChange.getCountList().get(i); | |||||
Integer inviteCount = randomRules.get(i).getCount(); | |||||
Assert.isTrue(checkCount >= inviteCount, "可供抽取的专家数量不足"); | |||||
} | |||||
expertInviteManage.expertRandomInviteByMeetingCreate(meeting, randomRules, avoidInfo); | |||||
expertInviteTask.addInviteExpertTaskByMeetingCreate(meeting.getId(), 5); | expertInviteTask.addInviteExpertTaskByMeetingCreate(meeting.getId(), 5); | ||||
updater.set(Meeting::getInviteStopped, false); | |||||
} | |||||
meetingService.update(updater); | |||||
// 回避规则 | |||||
if (avoidInfo != null) { | |||||
ExpertInviteAvoidRule avoidRule = new ExpertInviteAvoidRule(); | |||||
avoidRule.setMeetingId(meeting.getId()); | |||||
avoidRule.setAvoidMates(avoidInfo.getAvoidMates()); | |||||
avoidRule.setCompanyIds(CollUtils.joinByComma(avoidInfo.getCompanyIds())); | |||||
if (CollectionUtils.isNotEmpty(avoidInfo.getExpertIds())) { | |||||
LambdaUpdateWrapper<Meeting> update = Wrappers.lambdaUpdate(Meeting.class); | |||||
update.set(Meeting::getInviteStopped, false); | |||||
update.eq(Meeting::getId, meeting.getId()); | |||||
meetingService.update(update); | |||||
// 回避规则 | |||||
if (avoidInfo != null) { | |||||
ExpertInviteAvoidRule avoidRule = new ExpertInviteAvoidRule(); | |||||
avoidRule.setMeetingId(meeting.getId()); | |||||
// 未传值时设置为0 表示不限制周参与次数 | |||||
avoidRule.setWeekInviteCount(ObjectUtil.defaultIfNull(avoidRule.getWeekInviteCount(), 0)); | |||||
avoidRule.setAvoidOrgIds(CollUtils.joinByComma(avoidInfo.getAvoidOrgIdList())); | |||||
avoidRule.setAvoidUnitIds(CollUtils.joinByComma(avoidInfo.getAvoidUnitIdList())); | |||||
avoidRule.setExpertIds(CollUtils.joinByComma(avoidInfo.getExpertIds())); | avoidRule.setExpertIds(CollUtils.joinByComma(avoidInfo.getExpertIds())); | ||||
inviteAvoidRuleService.save(avoidRule); | |||||
} | } | ||||
inviteAvoidRuleService.save(avoidRule); | |||||
} else { | |||||
// 指定邀请 | |||||
AppointInviteRuleDTO appointRule = req.getAppointRule(); | |||||
Assert.notNull(appointRule, "指定邀请规则不能为空"); | |||||
Map<Long, ExpertUserFullInfo> usersMap = expertInviteHelper.checkAppointExpert(appointRule); | |||||
// 处理指定抽取规则 | |||||
ExpertInviteRule appoint = getExpertInviteRule(appointRule, meeting.getId()); | |||||
inviteRuleService.save(appoint); | |||||
Long ruleId = appoint.getId(); | |||||
List<MeetingExpert> experts = appointRule.getExpertIds().stream().map(w -> { | |||||
ExpertUserFullInfo info = usersMap.get(w); | |||||
MeetingExpert expert = ExpertInviteBuilder.getExpertByAppoint(meeting.getId(), info, ruleId); | |||||
expert.setStatus(ExpertAttendStatus.NOTICING.getCode()); | |||||
return expert; | |||||
}).collect(Collectors.toList()); | |||||
meetingExpertService.saveBatch(experts); | |||||
} | } | ||||
} finally { | } finally { | ||||
distributedLock.releaseLock(key); | distributedLock.releaseLock(key); | ||||
@@ -165,35 +204,27 @@ public class MeetingManage { | |||||
/** | /** | ||||
* 抽取数量校验 | * 抽取数量校验 | ||||
* | * | ||||
* @param po 抽取参数 | |||||
* @param req 抽取参数 | |||||
* @return {@link ExpertCountOnChangeVO} | * @return {@link ExpertCountOnChangeVO} | ||||
* @author WendyYang | * @author WendyYang | ||||
**/ | **/ | ||||
public ExpertCountOnChangeVO expertCountOnChange(ExpertInviteCreateReq po) { | |||||
public ExpertCountOnChangeVO expertCountOnChange(ExpertInviteReq req) { | |||||
// 未传递指定邀请专家直接忽略 | // 未传递指定邀请专家直接忽略 | ||||
if (po.getAppointRule() != null && CollUtil.isEmpty(po.getAppointRule().getExpertIds())) { | |||||
Assert.isTrue(CollUtil.isNotEmpty(po.getRandomRules()), "未指定抽取规则"); | |||||
po.setAppointRule(null); | |||||
} | |||||
boolean appointed = po.getAppointRule() != null; | |||||
expertInviteManage.checkAppointExpertConflictWithAvoidRule(po.getAppointRule(), po.getAvoidInfo()); | |||||
Meeting meeting = meetingService.getById(po.getMeetingId()); | |||||
expertInviteHelper.checkAppointExpert(req.getAppointRule()); | |||||
Meeting meeting = meetingService.getById(req.getMeetingId()); | |||||
ExpertCountOnChangeVO resultCount = new ExpertCountOnChangeVO(); | ExpertCountOnChangeVO resultCount = new ExpertCountOnChangeVO(); | ||||
resultCount.setStatus(true); | resultCount.setStatus(true); | ||||
resultCount.setCountList(new ArrayList<>()); | resultCount.setCountList(new ArrayList<>()); | ||||
// 参数校验 | // 参数校验 | ||||
String errMsg = ValidUtil.validFast(po, AbstractInviteRule.CountCheck.class); | |||||
String errMsg = ValidUtil.validFast(req, AbstractInviteRule.CountCheck.class); | |||||
if (errMsg != null) { | if (errMsg != null) { | ||||
resultCount.setStatus(false); | resultCount.setStatus(false); | ||||
resultCount.setMessage(errMsg); | resultCount.setMessage(errMsg); | ||||
return resultCount; | return resultCount; | ||||
} | } | ||||
List<Long> expertIdsChoose = new ArrayList<>(); | List<Long> expertIdsChoose = new ArrayList<>(); | ||||
if (appointed) { | |||||
expertIdsChoose.addAll(po.getAppointRule().getExpertIds()); | |||||
} | |||||
for (RandomInviteRuleDTO randomRule : po.getRandomRules()) { | |||||
ExpertChooseDTO chooseExpert = expertInviteManage.expertInviteByRandomRule(po.getAvoidInfo(), | |||||
for (RandomInviteRuleDTO randomRule : req.getRandomRules()) { | |||||
ExpertChooseDTO chooseExpert = expertInviteManage.expertInviteByRandomRule(req.getAvoidRule(), | |||||
randomRule, expertIdsChoose, meeting.getStartTime(), meeting.getEndTime()); | randomRule, expertIdsChoose, meeting.getStartTime(), meeting.getEndTime()); | ||||
resultCount.addCountList(chooseExpert.getTotal()); | resultCount.addCountList(chooseExpert.getTotal()); | ||||
} | } | ||||
@@ -277,53 +308,26 @@ public class MeetingManage { | |||||
public MeetingDetailBasicVO getMeetingBasicInfo(Long meetingId) { | public MeetingDetailBasicVO getMeetingBasicInfo(Long meetingId) { | ||||
Meeting meeting = meetingService.getById(meetingId); | Meeting meeting = meetingService.getById(meetingId); | ||||
if (Objects.isNull(meeting)) { | |||||
throw new BizException("该会议信息不存在"); | |||||
} | |||||
Integer attendStatus = null; | |||||
if (LoginUserUtil.isExpert()) { | |||||
List<Long> meIds = Collections.singletonList(meetingId); | |||||
List<MeetingAndAttendStatusDTO> status = meetingExpertService.listByExpertIdAndStatus(LoginUserUtil.getUserId(), null, meIds); | |||||
if (status.isEmpty()) { | |||||
throw BizException.wrap("您未被邀请参加次会议"); | |||||
} | |||||
attendStatus = meetingManageHelper.getExpertAttendStatus(status.get(0)); | |||||
} | |||||
Assert.notNull(meeting, "会议不存在"); | |||||
return MeetingDetailBasicVO.builder() | return MeetingDetailBasicVO.builder() | ||||
.id(meeting.getId()) | |||||
.name(meeting.getName()) | |||||
.type(meeting.getType()) | |||||
.meetingId(meeting.getId()) | |||||
.meetingName(meeting.getName()) | |||||
.meetingType(meeting.getType()) | |||||
.meetingAddress(meeting.getMeetingAddress()) | |||||
.typeName(dictionaryCache.getByCode(meeting.getType()).getName()) | .typeName(dictionaryCache.getByCode(meeting.getType()).getName()) | ||||
.author(meeting.getCreator()) | |||||
.startTime(meeting.getStartTime()) | .startTime(meeting.getStartTime()) | ||||
.createOn(meeting.getCreateOn()) | |||||
.judgesAttendanceTime(meeting.getJudgesAttendanceTime()) | |||||
.meetingUsageTime(meeting.getMeetingUsageTime()) | |||||
.contact(meeting.getContact()) | .contact(meeting.getContact()) | ||||
.connecter(meeting.getConnecter()) | .connecter(meeting.getConnecter()) | ||||
.status(meeting.getStatus()) | .status(meeting.getStatus()) | ||||
.attendStatus(attendStatus) | |||||
.cancelRemark(meeting.getCancelRemark()) | |||||
.createBy(meeting.getCreator()) | |||||
.holdOrg(meeting.getHoldOrg()) | .holdOrg(meeting.getHoldOrg()) | ||||
.invited(meeting.getInvited()) | |||||
.createOn(meeting.getCreateOn()) | |||||
.creator(meeting.getCreator()) | |||||
.createBy(meeting.getCreator()) | |||||
.build(); | .build(); | ||||
} | } | ||||
public void uploadMeetingResult(MeetingResultReq po) { | |||||
LambdaUpdateWrapper<Meeting> updater = Wrappers.lambdaUpdate(Meeting.class) | |||||
.eq(Meeting::getId, po.getMeetingId()) | |||||
.set(Meeting::getStatus, Manager.COMPLETED.getCode()); | |||||
meetingService.update(updater); | |||||
} | |||||
public MeetingResultVO meetingResultDetail(Long meetingId) { | |||||
LambdaQueryWrapper<Meeting> query = Wrappers.lambdaQuery(Meeting.class) | |||||
.eq(Meeting::getId, meetingId); | |||||
MeetingResultVO result = new MeetingResultVO(); | |||||
result.setMeetingId(meetingId); | |||||
return result; | |||||
} | |||||
public ExpertInviteDetailVO inviteDetail(Long meetingId) { | public ExpertInviteDetailVO inviteDetail(Long meetingId) { | ||||
ExpertInviteDetailVO result = new ExpertInviteDetailVO(); | ExpertInviteDetailVO result = new ExpertInviteDetailVO(); | ||||
Meeting meeting = meetingService.getById(meetingId); | Meeting meeting = meetingService.getById(meetingId); | ||||
@@ -340,7 +344,7 @@ public class MeetingManage { | |||||
List<MeetingExpert> attendList = new ArrayList<>(); | List<MeetingExpert> attendList = new ArrayList<>(); | ||||
List<Long> expertIds = new ArrayList<>(); | List<Long> expertIds = new ArrayList<>(); | ||||
experts.forEach(w -> { | experts.forEach(w -> { | ||||
boolean randomInvite = w.getInviteType().equals(ExpertInviteType.RANDOM.getCode()); | |||||
boolean randomInvite = w.getInviteType().equals(ExpertInviteTypeEnum.RANDOM.getCode()); | |||||
if (randomInvite) { | if (randomInvite) { | ||||
randomList.add(w); | randomList.add(w); | ||||
} else { | } else { | ||||
@@ -382,7 +386,7 @@ public class MeetingManage { | |||||
attendList.forEach(w -> { | attendList.forEach(w -> { | ||||
ExpertBasicInfoVO expertBasicInfoVo = expertBasicInfoVoMap.get(w.getExpertId()); | ExpertBasicInfoVO expertBasicInfoVo = expertBasicInfoVoMap.get(w.getExpertId()); | ||||
ExpertAttendListItemVO item = BeanUtil.copyProperties(expertBasicInfoVo, ExpertAttendListItemVO.class); | ExpertAttendListItemVO item = BeanUtil.copyProperties(expertBasicInfoVo, ExpertAttendListItemVO.class); | ||||
item.setInviteType(ExpertInviteType.getByCode(w.getInviteType()).getName()); | |||||
item.setInviteType(ExpertInviteTypeEnum.getByCode(w.getInviteType()).getName()); | |||||
result.addAttendList(item); | result.addAttendList(item); | ||||
}); | }); | ||||
return result; | return result; | ||||
@@ -430,13 +434,10 @@ public class MeetingManage { | |||||
public InviteRuleDetailVO inviteRuleDetail(Long meetingId) { | public InviteRuleDetailVO inviteRuleDetail(Long meetingId) { | ||||
InviteRuleDetailVO result = new InviteRuleDetailVO(); | InviteRuleDetailVO result = new InviteRuleDetailVO(); | ||||
List<ExpertInviteRule> inviteRules = inviteRuleService.listByMeetingId(meetingId); | List<ExpertInviteRule> inviteRules = inviteRuleService.listByMeetingId(meetingId); | ||||
if (!result.setAndGetInvited(inviteRules.size() > 0)) { | |||||
return result; | |||||
} | |||||
result.setRandomRules(new ArrayList<>()); | result.setRandomRules(new ArrayList<>()); | ||||
Map<ExpertInviteType, List<ExpertInviteRule>> groupByType = CollUtils.group(inviteRules, w -> ExpertInviteType.getByCode(w.getInviteType())); | |||||
List<ExpertInviteRule> randoms = groupByType.get(ExpertInviteType.RANDOM); | |||||
if (CollectionUtils.isNotEmpty(randoms)) { | |||||
Map<ExpertInviteTypeEnum, List<ExpertInviteRule>> groupByType = CollUtils.group(inviteRules, w -> ExpertInviteTypeEnum.getByCode(w.getInviteType())); | |||||
List<ExpertInviteRule> randoms = groupByType.get(ExpertInviteTypeEnum.RANDOM); | |||||
if (CollUtil.isNotEmpty(randoms)) { | |||||
randoms.forEach(random -> { | randoms.forEach(random -> { | ||||
RandomInviteRuleVO randomRule = JSON.parseObject(random.getInviteRule(), RandomInviteRuleVO.class); | RandomInviteRuleVO randomRule = JSON.parseObject(random.getInviteRule(), RandomInviteRuleVO.class); | ||||
if (randomRule.getExpertTags() != null) { | if (randomRule.getExpertTags() != null) { | ||||
@@ -452,35 +453,34 @@ public class MeetingManage { | |||||
}); | }); | ||||
} | } | ||||
if (StrUtil.isNotEmpty(randomRule.getIntentionRegionCode())) { | if (StrUtil.isNotEmpty(randomRule.getIntentionRegionCode())) { | ||||
// TODO 履职意向地 | |||||
/*List<RegionDTO> intentionRegions = regionCache.listParents(randomRule.getIntentionRegionCode(), randomRule.getIntentionRegionLevel()); | /*List<RegionDTO> intentionRegions = regionCache.listParents(randomRule.getIntentionRegionCode(), randomRule.getIntentionRegionLevel()); | ||||
randomRule.setIntentionRegions(intentionRegions);*/ | randomRule.setIntentionRegions(intentionRegions);*/ | ||||
} | } | ||||
if (StrUtil.isNotEmpty(randomRule.getExpertRegionCode())) { | if (StrUtil.isNotEmpty(randomRule.getExpertRegionCode())) { | ||||
// TODO 专家层级 | |||||
/*List<RegionDTO> expertRegions = regionCache.listParents(randomRule.getExpertRegionCode(), randomRule.getExpertRegionLevel()); | /*List<RegionDTO> expertRegions = regionCache.listParents(randomRule.getExpertRegionCode(), randomRule.getExpertRegionLevel()); | ||||
randomRule.setExpertRegions(expertRegions);*/ | randomRule.setExpertRegions(expertRegions);*/ | ||||
} | } | ||||
result.getRandomRules().add(randomRule); | result.getRandomRules().add(randomRule); | ||||
}); | }); | ||||
} | |||||
List<ExpertInviteRule> appoints = groupByType.get(ExpertInviteType.APPOINT); | |||||
if (result.setAndGetHasAppointRule(CollUtil.isNotEmpty(appoints))) { | |||||
AvoidInfoDTO avoidInfo = inviteAvoidRuleService.getAvoidInfoDto(meetingId); | |||||
AvoidInfoVO vo = new AvoidInfoVO(); | |||||
vo.setAvoidOrgIds(avoidInfo.getAvoidOrgIdList()); | |||||
vo.setAvoidUnitIds(avoidInfo.getAvoidUnitIdList()); | |||||
if (CollUtil.isNotEmpty(avoidInfo.getExpertIds())) { | |||||
vo.setExperts(new ArrayList<>(meetingManageHelper.getExpertBasicInfo(avoidInfo.getExpertIds()).values())); | |||||
} | |||||
result.setAvoidInfo(vo); | |||||
} else { | |||||
List<ExpertInviteRule> appoints = groupByType.get(ExpertInviteTypeEnum.APPOINT); | |||||
ExpertInviteRule appoint = appoints.get(0); | ExpertInviteRule appoint = appoints.get(0); | ||||
AppointInviteRuleDTO appointRule = JSON.parseObject(appoint.getInviteRule(), AppointInviteRuleDTO.class); | AppointInviteRuleDTO appointRule = JSON.parseObject(appoint.getInviteRule(), AppointInviteRuleDTO.class); | ||||
InviteRuleDetailVO.AppointRuleVo vo = new InviteRuleDetailVO.AppointRuleVo(); | |||||
AppointRuleVO vo = new AppointRuleVO(); | |||||
vo.setInviteDesc(appointRule.getInviteDesc()); | vo.setInviteDesc(appointRule.getInviteDesc()); | ||||
vo.setExperts(new ArrayList<>(meetingManageHelper.getExpertBasicInfo(appointRule.getExpertIds()).values())); | vo.setExperts(new ArrayList<>(meetingManageHelper.getExpertBasicInfo(appointRule.getExpertIds()).values())); | ||||
result.setAppointRule(vo); | result.setAppointRule(vo); | ||||
} | } | ||||
AvoidInfoDTO avoidInfo = inviteAvoidRuleService.getAvoidInfoDto(meetingId); | |||||
if (result.setAndGetHasAvoidInfo(avoidInfo != null)) { | |||||
InviteRuleDetailVO.AvoidInfoVo vo = new InviteRuleDetailVO.AvoidInfoVo(); | |||||
vo.setAvoidMates(avoidInfo.getAvoidMates()); | |||||
vo.setCompanyIds(avoidInfo.getCompanyIds()); | |||||
if (CollectionUtils.isNotEmpty(avoidInfo.getExpertIds())) { | |||||
vo.setExperts(new ArrayList<>(meetingManageHelper.getExpertBasicInfo(avoidInfo.getExpertIds()).values())); | |||||
} | |||||
result.setAvoidInfo(vo); | |||||
} | |||||
return result; | return result; | ||||
} | } | ||||
@@ -506,7 +506,7 @@ public class MeetingManage { | |||||
// 邀请规则 | // 邀请规则 | ||||
RandomInviteRuleDTO randomInviteRuleDto = null; | RandomInviteRuleDTO randomInviteRuleDto = null; | ||||
for (ExpertInviteRule rule : inviteRules) { | for (ExpertInviteRule rule : inviteRules) { | ||||
if (rule.getInviteType().equals(ExpertInviteType.RANDOM.getCode()) && | |||||
if (rule.getInviteType().equals(ExpertInviteTypeEnum.RANDOM.getCode()) && | |||||
rule.getId().equals(meetingExpert.getRuleId())) { | rule.getId().equals(meetingExpert.getRuleId())) { | ||||
randomInviteRuleDto = JSON.parseObject(rule.getInviteRule(), RandomInviteRuleDTO.class); | randomInviteRuleDto = JSON.parseObject(rule.getInviteRule(), RandomInviteRuleDTO.class); | ||||
ruleId = rule.getId(); | ruleId = rule.getId(); | ||||
@@ -607,7 +607,6 @@ public class MeetingManage { | |||||
LambdaUpdateWrapper<Meeting> update = Wrappers.lambdaUpdate(Meeting.class) | LambdaUpdateWrapper<Meeting> update = Wrappers.lambdaUpdate(Meeting.class) | ||||
.set(Meeting::getStatus, Manager.CANCELED.getCode()) | .set(Meeting::getStatus, Manager.CANCELED.getCode()) | ||||
.set(Meeting::getUpdateBy, LoginUserUtil.getUserId()) | .set(Meeting::getUpdateBy, LoginUserUtil.getUserId()) | ||||
.set(Meeting::getCancelRemark, po.getCancelRemark()) | |||||
.set(Meeting::getUpdateOn, LocalDateTime.now()) | .set(Meeting::getUpdateOn, LocalDateTime.now()) | ||||
.eq(Meeting::getId, po.getMeetingId()); | .eq(Meeting::getId, po.getMeetingId()); | ||||
meetingService.update(update); | meetingService.update(update); | ||||
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.pmapi.meeting.mapper; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingInnerProject; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
/** | |||||
* <p> | |||||
* 会议评审内部项目表 Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-28 | |||||
*/ | |||||
public interface MeetingInnerProjectMapper extends BaseMapper<MeetingInnerProject> { | |||||
} |
@@ -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.meeting.mapper.MeetingInnerProjectMapper"> | |||||
</mapper> |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.pmapi.meeting.mapper; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingOuterProject; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
/** | |||||
* <p> | |||||
* 会议评审外部项目 Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-28 | |||||
*/ | |||||
public interface MeetingOuterProjectMapper extends BaseMapper<MeetingOuterProject> { | |||||
} |
@@ -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.meeting.mapper.MeetingOuterProjectMapper"> | |||||
</mapper> |