浏览代码

feat:获取私募基金详情页-基金经理基本信息的实现

mozuwen 1 年之前
父节点
当前提交
62f00de657

+ 49 - 2
src/main/java/com/smppw/analysis/application/service/info/FundInfoService.java

@@ -46,8 +46,9 @@ public class FundInfoService {
     private final PerformanceFactory factory;
     private final BaseInfoService baseInfoService;
     private final BaseIndicatorServiceV2 baseIndicatorServiceV2;
-    private static final Map<String, String> ACCRUED_FREQUENCY = MapUtil.newHashMap();
-    private static final Map<String, String> ACCRUED_METHOD = MapUtil.newHashMap();
+    private static final Map<String, String> ACCRUED_FREQUENCY = MapUtil.newHashMap(5);
+    private static final Map<String, String> ACCRUED_METHOD = MapUtil.newHashMap(3);
+    private static final Map<Integer, String> EDUCATION_NAME_MAP = MapUtil.newHashMap(8);
 
     public FundInfoService(NavService navService, PerformanceFactory factory,
                            BaseInfoService baseInfoService, BaseIndicatorServiceV2 baseIndicatorServiceV2) {
@@ -66,6 +67,14 @@ public class FundInfoService {
         ACCRUED_METHOD.put("1", "高水位");
         ACCRUED_METHOD.put("2", "高水位+赎回时补充");
         ACCRUED_METHOD.put("3", "单客户高水位");
+        EDUCATION_NAME_MAP.put(1,"小学");
+        EDUCATION_NAME_MAP.put(2,"中学");
+        EDUCATION_NAME_MAP.put(3,"大专");
+        EDUCATION_NAME_MAP.put(4,"本科");
+        EDUCATION_NAME_MAP.put(5,"硕士");
+        EDUCATION_NAME_MAP.put(6,"博士");
+        EDUCATION_NAME_MAP.put(7,"博士后");
+        EDUCATION_NAME_MAP.put(-1,"其他");
     }
 
     public PrivatelyFundHeadInfoVO headInfo(HeadInfoReq params) {
@@ -372,4 +381,42 @@ public class FundInfoService {
         return this.handleFee(dataList, type, function).stream().findFirst().orElse(null);
     }
 
+    public List<FundManagerInfoVo> getHFManagerInfo(String refId) {
+        List<FundManagerInfoVo> resultList = ListUtil.list(true);
+        List<PersonnelInformationDo> managerInfoList = this.baseInfoService.getFundManagerInfo(refId);
+        if (CollUtil.isEmpty(managerInfoList)) {
+            return resultList;
+        }
+        List<String> managerIdList = managerInfoList.stream().map(PersonnelInformationDo::getPersonnelId).collect(Collectors.toList());
+        List<PersonnelWorkExperienceDo> workExperienceList = this.baseInfoService.listPersonnelWorkExperience(managerIdList);
+        //过滤掉任职开始日期和任职结束日期为空的数据
+        if (CollUtil.isNotEmpty(workExperienceList)) {
+            workExperienceList = workExperienceList.stream()
+                    .filter(e -> !(StrUtil.isEmpty(e.getStartDate()) && StrUtil.isEmpty(e.getEndDate()))).collect(Collectors.toList());
+        }
+        if (CollUtil.isNotEmpty(workExperienceList)) {
+            Map<String, List<PersonnelWorkExperienceDo>> personnelIdWorkExperienceMap = workExperienceList.stream()
+                    .collect(Collectors.groupingBy(PersonnelWorkExperienceDo::getPersonnelId));
+            for (PersonnelInformationDo fundManagerInfo : managerInfoList) {
+                FundManagerInfoVo result = new FundManagerInfoVo();
+                result.setManagerId(fundManagerInfo.getPersonnelId());
+                result.setManagerName(fundManagerInfo.getPersonnelName());
+                result.setAvatar(fundManagerInfo.getAvatar());
+                result.setAvatar2(fundManagerInfo.getAvatar2());
+                result.setEducation(EDUCATION_NAME_MAP.get(fundManagerInfo.getEducation()));
+                result.setProfile(fundManagerInfo.getProfile());
+                List<PersonnelWorkExperienceDo> workExperienceDoList = personnelIdWorkExperienceMap.get(fundManagerInfo.getPersonnelId());
+                if (CollUtil.isNotEmpty(workExperienceDoList)) {
+                    String latestPosition = workExperienceDoList.stream().filter(e -> e.getEndDate() == null)
+                            .sorted(Comparator.comparing(PersonnelWorkExperienceDo::getStartDate).reversed())
+                            .map(PersonnelWorkExperienceDo::getPosition).findFirst().orElse(null);
+                    result.setManagerWorkExperienceList(workExperienceDoList);
+                    result.setLatestPosition(latestPosition);
+                }
+                resultList.add(result);
+            }
+        }
+        return resultList;
+    }
+
 }

+ 12 - 0
src/main/java/com/smppw/analysis/client/FundApi.java

@@ -89,4 +89,16 @@ public class FundApi {
         return ResultVo.ok(this.service.getMfFundFee(refId));
     }
 
+
+    /**
+     * 私募基金详情页-基金经理
+     *
+     * @param refId 基金id
+     * @return 基金经理信息
+     */
+    @GetMapping("manager-info")
+    public ResultVo<List<FundManagerInfoVo>> managerInfo(@RequestParam("refId") String refId) {
+        return ResultVo.ok(this.service.getHFManagerInfo(refId));
+    }
+
 }

+ 42 - 0
src/main/java/com/smppw/analysis/domain/dataobject/PersonnelInformationDo.java

@@ -0,0 +1,42 @@
+package com.smppw.analysis.domain.dataobject;
+
+import lombok.Data;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 15:30
+ * @description 人员信息
+ */
+@Data
+public class PersonnelInformationDo {
+
+    /**
+     * 人员id
+     */
+    private String personnelId;
+
+    /**
+     * 人员名称
+     */
+    private String personnelName;
+
+    /**
+     * 人员头像1
+     */
+    private String avatar;
+
+    /**
+     * 人员头像2
+     */
+    private String avatar2;
+
+    /**
+     * 最高学历
+     */
+    private Integer education;
+
+    /**
+     * 简介
+     */
+    private String profile;
+}

+ 38 - 0
src/main/java/com/smppw/analysis/domain/dataobject/PersonnelWorkExperienceDo.java

@@ -0,0 +1,38 @@
+package com.smppw.analysis.domain.dataobject;
+
+import lombok.Data;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 16:00
+ * @description 人员任职经历
+ */
+@Data
+public class PersonnelWorkExperienceDo {
+
+    /**
+     * 人员id
+     */
+    private String personnelId;
+
+    /**
+     * 任职公司
+     */
+    private String companyName;
+
+    /**
+     * 任职开始时间
+     */
+    private String startDate;
+
+    /**
+     * 任职结束时间
+     */
+    private String endDate;
+
+    /**
+     * 任职期间职务
+     */
+    private String position;
+
+}

+ 57 - 0
src/main/java/com/smppw/analysis/domain/dto/info/FundManagerInfoVo.java

@@ -0,0 +1,57 @@
+package com.smppw.analysis.domain.dto.info;
+
+import com.smppw.analysis.domain.dataobject.PersonnelWorkExperienceDo;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 15:00
+ * @description 私募基金详情页-基金经理
+ */
+@Data
+public class FundManagerInfoVo {
+
+    /**
+     * 基金经理id
+     */
+    private String managerId;
+
+    /**
+     * 基金经理名字
+     */
+    private String managerName;
+
+    /**
+     * 任务头像1
+     */
+    private String avatar;
+
+    /**
+     * 人物头像2
+     */
+    private String avatar2;
+
+    /**
+     * 最新职务
+     */
+    private String latestPosition;
+
+    /**
+     * 学历
+     */
+    private String education;
+
+    /**
+     * 经理简历
+     */
+    private String profile;
+
+    /**
+     * 基金经理工作履历
+     */
+    List<PersonnelWorkExperienceDo> managerWorkExperienceList;
+
+}

+ 1 - 1
src/main/java/com/smppw/analysis/domain/mapper/MfChargeRateMapper.java

@@ -1,4 +1,4 @@
-package com.smppw.analysis.domain.mapper;
+package com.smppw.analysis.domain.mapper.core;
 
 import com.smppw.analysis.domain.dataobject.ManualFundFeeDo;
 import org.springframework.stereotype.Repository;

+ 35 - 0
src/main/java/com/smppw/analysis/domain/mapper/core/PersonnelInformationMapper.java

@@ -0,0 +1,35 @@
+package com.smppw.analysis.domain.mapper.core;
+
+import com.smppw.analysis.domain.dataobject.PersonnelInformationDo;
+
+import com.smppw.analysis.domain.dataobject.PersonnelWorkExperienceDo;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 15:30
+ * @description 人员信息Mapper
+ */
+@Repository
+public interface PersonnelInformationMapper {
+
+    /**
+     * 获取人员基本信息
+     *
+     * @param refId 基金id
+     * @return 人员基本信息
+     */
+    List<PersonnelInformationDo> getFundManagerInfo(String refId);
+
+    /**
+     * 获取人员任职经历
+     *
+     * @param personnelIdList 人员id列表
+     * @return 人员任职经历
+     */
+    List<PersonnelWorkExperienceDo> listPersonnelWorkExperience(@Param("personnelIdList") List<String> personnelIdList);
+
+}

+ 15 - 0
src/main/java/com/smppw/analysis/domain/service/BaseInfoService.java

@@ -131,4 +131,19 @@ public interface BaseInfoService {
      */
     List<ManualFundFeeDo> getManualFundFee(String fundId);
 
+    /**
+     * 获取人员基本信息
+     *
+     * @param refId 基金id
+     * @return 人员基本信息
+     */
+    List<PersonnelInformationDo> getFundManagerInfo(String refId);
+
+    /**
+     * 获取人员任职经历
+     *
+     * @param personnelIdList 人员id礼列表
+     * @return 人员任职经历
+     */
+    List<PersonnelWorkExperienceDo> listPersonnelWorkExperience(List<String> personnelIdList);
 }

+ 15 - 2
src/main/java/com/smppw/analysis/domain/service/impl/BaseInfoServiceImpl.java

@@ -17,7 +17,8 @@ import com.smppw.analysis.domain.dto.info.FundSimilarParams;
 import com.smppw.analysis.domain.event.SaveCacheEvent;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.domain.gateway.CacheGateway;
-import com.smppw.analysis.domain.mapper.MfChargeRateMapper;
+import com.smppw.analysis.domain.mapper.core.MfChargeRateMapper;
+import com.smppw.analysis.domain.mapper.core.PersonnelInformationMapper;
 import com.smppw.analysis.domain.service.BaseInfoService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.analysis.infrastructure.consts.RedisConst;
@@ -67,11 +68,12 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
     private final FundArchivesDao fundArchivesDao;
     private ApplicationContext applicationContext;
     private final MfChargeRateMapper mfChargeRateMapper;
+    private final PersonnelInformationMapper personnelInformationMapper;
 
     public BaseInfoServiceImpl(AnalysisProperty property, CacheFactory factory, RankFactory rankFactory,
                                IndexesProfileDao indexesProfileDao, RongzhiIndexNavDao rongzhiIndexNavDao,
                                FundInformationDao fundInformationDao, FundAnnounceDao fundAnnounceDao,
-                               FundArchivesDao fundArchivesDao, MfChargeRateMapper mfChargeRateMapper) {
+                               FundArchivesDao fundArchivesDao, MfChargeRateMapper mfChargeRateMapper, PersonnelInformationMapper personnelInformationMapper) {
         this.rankDao = rankFactory.getInstance(property.getDataSource());
         this.cacheGateway = factory.getCacheGateway(property.getCacheType());
         this.indexesProfileDao = indexesProfileDao;
@@ -80,6 +82,7 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
         this.fundAnnounceDao = fundAnnounceDao;
         this.fundArchivesDao = fundArchivesDao;
         this.mfChargeRateMapper = mfChargeRateMapper;
+        this.personnelInformationMapper = personnelInformationMapper;
     }
 
     @Override
@@ -289,6 +292,16 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
         return mfChargeRateMapper.getManualFundFee(fundId);
     }
 
+    @Override
+    public List<PersonnelInformationDo> getFundManagerInfo(String fundId) {
+        return personnelInformationMapper.getFundManagerInfo(fundId);
+    }
+
+    @Override
+    public List<PersonnelWorkExperienceDo> listPersonnelWorkExperience(List<String> personnelIdList) {
+        return personnelInformationMapper.listPersonnelWorkExperience(personnelIdList);
+    }
+
     /**
      * 把指定类型的标的的名称映射查询出来
      *

+ 1 - 1
src/main/resources/mapping/MfChargeRetMapper.xml

@@ -1,6 +1,6 @@
 <?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.smppw.analysis.domain.mapper.MfChargeRateMapper">
+<mapper namespace="com.smppw.analysis.domain.mapper.core.MfChargeRateMapper">
 
     <select id="getManualFundFee" resultType="com.smppw.analysis.domain.dataobject.ManualFundFeeDo">
         select fund_id          as fundId,

+ 46 - 0
src/main/resources/mapping/core/PersonnelInformationMapper.xml

@@ -0,0 +1,46 @@
+<?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.smppw.analysis.domain.mapper.core.PersonnelInformationMapper">
+
+
+    <select id="getFundManagerInfo" resultType="com.smppw.analysis.domain.dataobject.PersonnelInformationDo">
+        select t1.personnel_id   as personnelId,
+               t1.personnel_name as personnelName,
+               t1.avatar         as avatar,
+               t1.avatar2        as avatar2,
+               t1.education      as education,
+               t1.profile        as profile
+        from rz_hfdb_core.personnel_information t1
+                 inner join rz_hfdb_core.fund_manager_mapping t2
+                            on t1.personnel_id = t2.fund_manager_id and t2.isvalid = 1
+        where t2.fund_id = #{refId}
+          and t1.isvalid = 1
+    </select>
+
+    <select id="listPersonnelWorkExperience"
+            resultType="com.smppw.analysis.domain.dataobject.PersonnelWorkExperienceDo">
+        SELECT t1.personnel_id as personnelId,
+               t5.company_name as companyName,
+               t1.start_date   as startDate,
+               t1.end_date     as endDate,
+               GROUP_CONCAT(DISTINCT t4.position_name ORDER BY t1.start_date) AS position
+        FROM rz_hfdb_core.personnel_company_mapping t1
+            JOIN rz_hfdb_core.personnel_company_position_mapping t2
+        ON t2.personnel_id = t1.personnel_id AND t2.company_id = t1.company_id
+            AND t2.isvalid = 1
+            JOIN rz_hfdb_core.personnel_company_position_id_mapping t3
+            ON t3.rec_id = t2.id AND t3.isvalid = 1
+            JOIN rz_hfdb_core.d_position t4
+            ON t4.id = t3.position_id AND t4.isvalid = 1
+            JOIN rz_hfdb_core.company_information t5
+            on t1.company_id =t5.company_id and t5.isvalid =1
+        WHERE t1.isvalid = 1
+          AND t1.personnel_id in
+            <foreach collection="personnelIdList" item="personnelId" index="index" open="(" separator="," close=")">
+                #{personnelId}
+            </foreach>
+        GROUP BY t1.personnel_id, t1.company_id, t1.start_date, t1.end_date
+        ORDER BY t1.start_date DESC, t1.company_id DESC
+    </select>
+
+</mapper>