Browse Source

feat: 增加数据同步到core库

chenjianhua 6 tháng trước cách đây
mục cha
commit
4817d1326a

+ 2 - 1
service-base/src/main/java/com/simuwang/base/common/enums/TaskType.java

@@ -12,7 +12,8 @@ import lombok.Getter;
 public enum TaskType {
     EMAIL_PARSE(1, "邮件解析"),
     DELETION_COMPUTE(2, "缺失计算"),
-    DELETION_NOTIFICATIONS(3, "缺失明细通知");
+    DELETION_NOTIFICATIONS(3, "缺失明细通知"),
+    DATA_TRANSFER(4, "数据同步");
 
     private final int type;
     private final String info;

+ 13 - 10
service-base/src/main/java/com/simuwang/base/config/DataSourceConfiguration.java

@@ -14,8 +14,18 @@ public class DataSourceConfiguration {
     public static final String DATA_DAQ_PROPERTIES = "spring.datasource.data-daq";
     public static final String DS_DATA_DAQ = "spring.datasource.data-daq.hikari";
 
-    @Value("${simuwang.token-secret}")
-    private String key;
+    public static final String HFDB_CORE_PROPERTIES = "spring.datasource.hfdb-core";
+    public static final String DS_HFDB_CORE = "spring.datasource.hfdb-core.hikari";
+    @Bean(name = HFDB_CORE_PROPERTIES)
+    @ConfigurationProperties(prefix = HFDB_CORE_PROPERTIES)
+    public DataSourceProperties hfdbCoreDataSourceProperties() {
+        return new DataSourceProperties();
+    }
+    @Bean(name = DS_HFDB_CORE)
+    @ConfigurationProperties(prefix = DS_HFDB_CORE)
+    public HikariDataSource hfdbCoreTrustDataSource() {
+        return hfdbCoreDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
+    }
     @Primary
     @Bean(name = DATA_DAQ_PROPERTIES)
     @ConfigurationProperties(prefix = DATA_DAQ_PROPERTIES)
@@ -27,13 +37,6 @@ public class DataSourceConfiguration {
     @Bean(name = DS_DATA_DAQ)
     @ConfigurationProperties(prefix = DS_DATA_DAQ)
     public HikariDataSource dataTrustDataSource() {
-        //密码解密
-        DataSourceProperties dataSourceProperties = daqDataSourceProperties();
-        String password=dataSourceProperties.getPassword();
-        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
-        textEncryptor.setPassword(key); // 用您自己的密钥替换"yourSecretKey"
-        String decryptPassword = textEncryptor.decrypt(password);
-        dataSourceProperties.setPassword(decryptPassword);
-        return dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
+        return daqDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
     }
 }

+ 78 - 0
service-base/src/main/java/com/simuwang/base/config/HfdbCoreDataSourceAutoConfig.java

@@ -0,0 +1,78 @@
+package com.simuwang.base.config;
+
+import cn.hutool.core.collection.ListUtil;
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.core.config.GlobalConfig;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import com.simuwang.base.components.MyBatisPlusMetaObjectHandler;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.support.TransactionTemplate;
+
+import javax.sql.DataSource;
+import java.util.List;
+
+@MapperScan(basePackages = "com.simuwang.base.mapper.core", sqlSessionFactoryRef = "hfdbCoreSqlSessionFactory")
+@Configuration
+public class HfdbCoreDataSourceAutoConfig {
+    static final String[] HFDB_CORE_MAPPER_LOCATIONS = {"classpath*:mapper/core/**/*.xml"};
+
+    @Autowired
+    @Qualifier(DataSourceConfiguration.DS_HFDB_CORE)
+    private DataSource hfdbCoreDataSource;
+
+    @Bean(name = "hfdbCoreSqlSessionFactory")
+    public SqlSessionFactory sqlSessionFactory() throws Exception {
+        // sql session 配置
+        final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
+        sessionFactory.setDataSource(this.hfdbCoreDataSource);
+        // 扫描追加多个包下的资源文件
+        List<Resource> resources = ListUtil.list(false);
+        for (String mapperLocation : HFDB_CORE_MAPPER_LOCATIONS) {
+            PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
+            Resource[] resource = patternResolver.getResources(mapperLocation);
+            if (resource.length > 0) {
+                resources.addAll(ListUtil.toList(resource));
+            }
+        }
+        sessionFactory.setMapperLocations(resources.toArray(new Resource[]{}));
+
+        // 添加mybatis-plus配置
+        MybatisConfiguration configuration = new MybatisConfiguration();
+        // 添加分页插件
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+        configuration.addInterceptor(interceptor);
+        // 设置下划线转驼峰
+        configuration.setMapUnderscoreToCamelCase(true);
+        sessionFactory.setConfiguration(configuration);
+
+        // 全局配置
+        GlobalConfig globalConfig = new GlobalConfig();
+        globalConfig.setBanner(false);
+        globalConfig.setMetaObjectHandler(new MyBatisPlusMetaObjectHandler());
+        sessionFactory.setGlobalConfig(globalConfig);
+        return sessionFactory.getObject();
+    }
+
+    @Bean(name = "hfdbCoreTransactionManager")
+    public DataSourceTransactionManager hfdbCoreTransactionManager() {
+        return new DataSourceTransactionManager(this.hfdbCoreDataSource);
+    }
+
+
+    @Bean(name = "hfdbCoreTransactionTemplate")
+    public TransactionTemplate transactionTemplate() {
+        return new TransactionTemplate(this.hfdbCoreTransactionManager());
+    }
+}
+

+ 18 - 0
service-base/src/main/java/com/simuwang/base/mapper/core/CoreDistributionMapper.java

@@ -0,0 +1,18 @@
+package com.simuwang.base.mapper.core;
+
+import com.simuwang.base.pojo.dos.core.CoreDistributionDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * FileName: CoreDistributionMapper
+ * Author:   chenjianhua
+ * Date:     2024/10/25 17:18
+ * Description: ${DESCRIPTION}
+ */
+@Mapper
+public interface CoreDistributionMapper {
+    void saveCoreDistribution(@Param("list") List<CoreDistributionDO> coreDistributionDOList);
+}

+ 18 - 0
service-base/src/main/java/com/simuwang/base/mapper/core/SrcNavMapper.java

@@ -0,0 +1,18 @@
+package com.simuwang.base.mapper.core;
+
+import com.simuwang.base.pojo.dos.core.SrcNavDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * FileName: SrcNavMapper
+ * Author:   chenjianhua
+ * Date:     2024/10/25 11:20
+ * Description: ${DESCRIPTION}
+ */
+@Mapper
+public interface SrcNavMapper {
+    public void saveSrcNav(@Param("list") List<SrcNavDO> srcNavDOList);
+}

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/daq/DistributionMapper.java

@@ -39,4 +39,6 @@ public interface DistributionMapper {
     BigDecimal getSumDistributeByFundId(@Param("fundId")String fundId,@Param("distributeDate") String distributeDate);
 
     Long countDistributionTotal();
+
+    List<DistributionDO> selectDistributeListByTime(@Param("startDate") String startDate, @Param("endDate")String endDate);
 }

+ 10 - 0
service-base/src/main/java/com/simuwang/base/mapper/daq/NavMapper.java

@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 @Mapper
 public interface NavMapper {
@@ -32,4 +33,13 @@ public interface NavMapper {
     Long countNavTotal();
 
     NavDO queryNavByFundIdDate(@Param("fundId")String fundId, @Param("priceDate")String priceDate);
+
+    long countNavByTime(@Param("startDate")String startDate, @Param("endDate")String endDate);
+
+    List<NavDO> selectNavListByTime(@Param("startDate")String startDate, @Param("endDate")String endDate);
+
+    Map<String, Long> selectMaxMinId(@Param("startDate")String startDate, @Param("endDate")String endDate);
+
+    List<NavDO> selectNavListById(@Param("minId") Long minId,@Param("maxId") Long maxId, @Param("startDate")String startDate, @Param("endDate")String endDate);
+
 }

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/daq/system/SysConfigMapper.java

@@ -84,4 +84,6 @@ public interface SysConfigMapper {
     String selectConfigByKey(@Param("configKey") String configKey);
 
     long countConfigList(ConfigPageQuery query);
+
+    void updateConfigByKey(SysConfigDO sysConfigDO);
 }

+ 92 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/core/CoreDistributionDO.java

@@ -0,0 +1,92 @@
+package com.simuwang.base.pojo.dos.core;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * FileName: CoreDistributionDO
+ * Author:   chenjianhua
+ * Date:     2024/10/25 16:54
+ * Description: ${DESCRIPTION}
+ */
+@Data
+public class CoreDistributionDO {
+    /**
+     * ID
+     */
+    private Integer id;
+    /**
+     * 基金ID
+     */
+    private String fundId;
+    /**
+     * 分红日期
+     */
+    private Date distributeDate;
+    /**
+     * 基金分配类型标志:-1-其他,1-分红,2-拆分,3-业绩报酬,4-注资,5-撤资
+     */
+    private Integer distributeType;
+    /**
+     * 现金分红发放日
+     */
+    private Date executeDate;
+    /**
+     * 分红方式:1-现金分红 2-分红再投 3-同时支持(现金分红和分红再投)
+     */
+    private Integer distributeMethod;
+    /**
+     * 红利再投资日
+     */
+    private Date reinvestDate;
+    /**
+     * 除息日
+     */
+    private Date exDistributeDate;
+    /**
+     * 收益分配基准日
+     */
+    private Date profitDistributeDate;
+    /**
+     * 权益登记日
+     */
+    private Date registrationDate;
+    /**
+     * 分红/拆分比例
+     */
+    private BigDecimal distribution;
+    /**
+     * 数据来源:1-公告 2-计算
+     */
+    private BigDecimal sourceType;
+    /**
+     * 来源ID
+     */
+    private Integer sourceId;
+    /**
+     * 来源表名
+     */
+    private String sourceTable;
+    /**
+     * 有效标识
+     */
+    private Integer isvalid;
+    /**
+     * 创建者Id
+     */
+    private Integer creatorId;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改者Id
+     */
+    private Integer updaterId;
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+}

+ 92 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/core/SrcNavDO.java

@@ -0,0 +1,92 @@
+package com.simuwang.base.pojo.dos.core;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * FileName: SrcNavDO
+ * Author:   chenjianhua
+ * Date:     2024/10/25 11:27
+ * Description: ${DESCRIPTION}
+ */
+@Data
+@TableName("src_nav")
+public class SrcNavDO {
+    /**
+     * ID
+     */
+    @TableField(value = "id")
+    private Integer id;
+    /**
+     * 基金ID
+     */
+    @TableField(value = "fund_id")
+    private String fundId;
+    /**
+     * 基金净值日期
+     */
+    @TableField(value = "price_date")
+    private Date priceDate;
+    /**
+     * 单位净值
+     */
+    @TableField(value = "nav")
+    private BigDecimal nav;
+    /**
+     * 累计净值
+     */
+    @TableField(value = "cumulative_nav_crawl")
+    private BigDecimal cumulativeNavCrawl;
+    /**
+     * 备注
+     */
+    @TableField(value = "nav_mark")
+    private String navMark;
+    /**
+     * 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+     */
+    @TableField(value = "source_id")
+    private Integer sourceId;
+    /**
+     * 是否可见
+     */
+    @TableField(value = "isvisible")
+    private Integer isvisible;
+    /**
+     * 目标应用
+     */
+    @TableField(value = "app_type")
+    private Integer appType;
+    /**
+     * 净值来源:1-托管 2-私募报送 3-托管用印(私募转送)
+     */
+    @TableField(value = "nav_source")
+    private Integer navSource;
+
+    @TableField(value = "isvalid")
+    private Integer isvalid;
+    /**
+     * 创建者Id
+     */
+    @TableField(value = "creatorid")
+    private Integer creatorId;
+    /**
+     * 创建时间
+     */
+    @TableField(value = "createtime")
+    private Date createTime;
+    /**
+     * 修改者Id
+     */
+    @TableField(value = "updaterid")
+    private Integer updaterId;
+    /**
+     * 更新时间
+     */
+    @TableField(value = "updatetime")
+    private Date updateTime;
+}

+ 31 - 0
service-base/src/main/resources/mapper/core/CoreDistributionMapper.xml

@@ -0,0 +1,31 @@
+<?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.simuwang.base.mapper.core.CoreDistributionMapper">
+    <update id="saveCoreDistribution" parameterType="java.util.List">
+        MERGE INTO RZ_HFDB_CORE.distribution t2
+        USING(
+        <foreach collection="list" item="distribute" index="index" separator="union all">
+            SELECT
+            #{distribute.distributeDate} DISTRIBUTE_DATE,
+            #{distribute.distributeType} DISTRIBUTE_TYPE,
+            #{distribute.distribution} DISTRIBUTION,
+            #{distribute.fundId} FUND_ID,
+            #{distribute.isvalid} ISVALID,
+            #{distribute.creatorId} CREATORID,
+            #{distribute.createTime} CREATETIME,
+            #{distribute.updaterId} UPDATERID,
+            #{distribute.updateTime} UPDATETIME
+            from DUAL
+        </foreach>
+        )t1
+        ON (t2.fund_id=t1.fund_id)
+        WHEN MATCHED THEN
+        UPDATE SET
+        t2.DISTRIBUTE_TYPE=t1.DISTRIBUTE_TYPE,t2.DISTRIBUTION=t1.DISTRIBUTION,t2.isvalid=t1.isvalid,t2.creatorid=t1.creatorid,t2.createtime=t1.createtime,
+        t2.updaterid=t1.updaterid,t2.updatetime=t1.updatetime where t2.fund_id=t1.fund_id and t2.distribute_date=t1.distribute_date
+        WHEN NOT MATCHED THEN
+        INSERT (t2.DISTRIBUTION,t2.DISTRIBUTE_TYPE,t2.FUND_ID,t2.DISTRIBUTE_DATE,t2.isvalid,t2.creatorid,t2.createtime,t2.updaterid,t2.updatetime)
+        VALUES
+        (t1.DISTRIBUTION,t1.DISTRIBUTE_TYPE,t1.FUND_ID,t1.DISTRIBUTE_DATE,t1.isvalid,t1.creatorid,t1.createtime,t1.updaterid,t1.updatetime)
+    </update>
+</mapper>

+ 57 - 0
service-base/src/main/resources/mapper/core/SrcNavMapper.xml

@@ -0,0 +1,57 @@
+<?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.simuwang.base.mapper.core.SrcNavMapper">
+    <resultMap id="BaseResultMap" type="com.simuwang.base.pojo.dos.core.SrcNavDO">
+        <id column="id" property="id"/>
+        <result column="fund_id" property="fundId"/>
+        <result column="price_date" property="priceDate"/>
+        <result column="nav" property="nav"/>
+        <result column="cumulative_nav_crawl" property="cumulativeNavCrawl"/>
+        <result column="source_id" property="sourceId"/>
+        <result column="nav_source" property="navSource"/>
+        <result column="app_type" property="appType"/>
+        <result column="isvisible" property="isvisible"/>
+        <result column="nav_mark" property="navMark"/>
+        <result column="isvalid" property="isvalid"/>
+        <result column="creatorid" property="creatorId"/>
+        <result column="createtime" property="createTime"/>
+        <result column="updaterid" property="updaterId"/>
+        <result column="updatetime" property="updateTime"/>
+    </resultMap>
+    <update id="saveSrcNav" parameterType="java.util.List">
+        MERGE INTO RZ_HFDB_CORE.src_nav t2
+        USING(
+        <foreach collection="list" item="nav" index="index" separator="union all">
+            SELECT
+            #{nav.fundId} fund_id,
+            #{nav.priceDate} price_date,
+            #{nav.nav} nav,
+            #{nav.cumulativeNavCrawl} cumulative_nav_crawl,
+            #{nav.sourceId} source_id,
+            #{nav.navSource} nav_source,
+            #{nav.appType} app_type,
+            #{nav.isvisible} isvisible,
+            #{nav.navMark} nav_mark,
+            #{nav.isvalid} isvalid,
+            #{nav.creatorId} creatorid,
+            #{nav.createTime} createtime,
+            #{nav.updaterId} updaterid,
+            #{nav.updateTime} updatetime
+            from DUAL
+        </foreach>
+        )t1
+        ON (t2.fund_id=t1.fund_id)
+        WHEN MATCHED THEN
+        UPDATE SET
+        t2.nav=t1.nav,t2.cumulative_nav_crawl=t1.cumulative_nav_crawl,
+        t2.source_id=t1.source_id,t2.nav_source=t1.nav_source,t2.app_type=t1.app_type,t2.isvisible=t1.isvisible,
+        t2.nav_mark=t1.nav_mark,t2.isvalid=t1.isvalid,t2.creatorid=t1.creatorid,t2.createtime=t1.createtime,
+        t2.updaterid=t1.updaterid,t2.updatetime=t1.updatetime where t2.fund_id=t1.fund_id and t2.price_date=t1.price_date
+        WHEN NOT MATCHED THEN
+        INSERT (t2.fund_id,t2.price_date,t2.nav,t2.cumulative_nav_crawl,t2.source_id,t2.nav_source,t2.app_type,t2.isvisible,
+        t2.nav_mark,t2.isvalid,t2.creatorid,t2.createtime,t2.updaterid,t2.updatetime)
+        VALUES
+        (t1.fund_id,t1.price_date,t1.nav,t1.cumulative_nav_crawl,t1.source_id,t1.nav_source,t1.app_type,t1.isvisible,
+        t1.nav_mark,t1.isvalid,t1.creatorid,t1.createtime,t1.updaterid,t1.updatetime)
+    </update>
+</mapper>

+ 30 - 1
service-base/src/main/resources/mapper/daq/NavMapper.xml

@@ -113,5 +113,34 @@
         limit 1
     </select>
 
-
+    <select id="countNavByTime" resultType="java.lang.Long">
+        select count(1) from PPW_EMAIL.nav where updatetime <![CDATA[ <= ]]> #{endDate}
+        <if test="startDate != null and startDate !=''">
+            and updatetime >= #{startDate}
+        </if>
+    </select>
+    <select id="selectNavListByTime" resultMap="BaseResultMap">
+        select id,fund_id,price_date,nav,cumulative_nav,cumulative_nav_withdrawal,
+        isvalid, creatorid, createtime, updaterid, updatetime
+        from PPW_EMAIL.nav where updatetime <![CDATA[ <= ]]> #{endDate}
+        <if test="startDate != null and startDate !=''">
+            and updatetime >= #{startDate}
+        </if>
+        order by updatetime desc
+    </select>
+    <select id="selectMaxMinId" resultType="java.util.Map">
+        select max(id) as maxId,min(id) as minId from PPW_EMAIL.nav where updatetime <![CDATA[ <= ]]> #{endDate}
+        <if test="startDate != null and startDate !=''">
+            and updatetime >= #{startDate}
+        </if>
+    </select>
+    <select id="selectNavListById" resultType="com.simuwang.base.pojo.dos.NavDO">
+        select id,fund_id,price_date,nav,cumulative_nav,cumulative_nav_withdrawal,
+        isvalid, creatorid, createtime, updaterid, updatetime
+        from PPW_EMAIL.nav where updatetime <![CDATA[ <= ]]> #{endDate} and id >= #{minId} and id <![CDATA[ <= ]]> #{maxId}
+        <if test="startDate != null and startDate !=''">
+            and updatetime >= #{startDate}
+        </if>
+        order by updatetime desc
+    </select>
 </mapper>

+ 7 - 4
service-base/src/main/resources/mapper/daq/system/SysConfigMapper.xml

@@ -60,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where config_id = #{configId} and isvalid =1
     </select>
 	
-    <select id="checkConfigKeyUnique" parameterType="String" resultMap="SysConfigResult">
+    <select id="checkConfigKeyUnique" parameterType="java.lang.String" resultMap="SysConfigResult">
         <include refid="selectConfigDo"/>
         where config_key = #{configKey}  and isvalid =1 limit 1
     </select>
@@ -119,12 +119,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </set>
         where config_id = #{configId} and isvalid=1
     </update>
-	
-    <delete id="deleteConfigById" parameterType="Long">
+    <update id="updateConfigByKey" parameterType="com.simuwang.base.pojo.dos.SysConfigDO">
+        update sys_config set config_value = #{configValue},updatetime = sysdate() where config_key = #{configKey} and isvalid=1
+    </update>
+
+    <delete id="deleteConfigById" parameterType="java.lang.Long">
         UPDATE sys_config SET isvalid=0  where config_id = #{configId}
     </delete>
     
-    <delete id="deleteConfigByIds" parameterType="Long">
+    <delete id="deleteConfigByIds" parameterType="java.lang.Long">
         UPDATE sys_config SET isvalid=0,updaterid=#{userId} where config_id in
         <foreach item="configId" collection="configIds" open="(" separator="," close=")">
         	#{configId}

+ 20 - 1
service-deploy/src/main/resources/application.yml

@@ -35,7 +35,7 @@ spring:
       driver-class-name: dm.jdbc.driver.DmDriver
       url: jdbc:dm://192.168.1.39:5236/PPW_EMAIL
       username: PPW_EMAIL
-      password: nRkHI1oCRiAOckoaB/VryURnEo98Iy7k
+      password: Dmppw2024
       # hikari连接池配置 对应 HikariConfig 配置属性类
       hikari:
         pool-name: HikariCP-daq
@@ -49,6 +49,25 @@ spring:
         connection-timeout: 300000
         # keepalive time
         keepalive-time: 60000
+    hfdb-core:
+      type: com.zaxxer.hikari.HikariDataSource
+      driver-class-name: dm.jdbc.driver.DmDriver
+      url: jdbc:dm://192.168.1.39:5236/RZ_HFDB_CORE
+      username: RZ_DMPPWUSER_PRO
+      password: Sowh!_44821
+      # hikari连接池配置 对应 HikariConfig 配置属性类
+      hikari:
+        pool-name: HikariCP-core
+        # 连接池最大连接数,默认是10
+        maximum-pool-size: 10
+        # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
+        auto-commit: true
+        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
+        max-lifetime: 900000
+        # 数据库连接超时时间,设置为300秒超时
+        connection-timeout: 300000
+        # keepalive time
+        keepalive-time: 60000
   task:
     groupName: PPW_EMAIL
   jackson:

+ 239 - 0
service-manage/src/main/java/com/simuwang/manage/task/DataSynchronizationTask.java

@@ -0,0 +1,239 @@
+package com.simuwang.manage.task;
+
+import cn.hutool.core.date.DateUtil;
+import com.simuwang.base.common.enums.TaskType;
+import com.simuwang.base.common.util.DateUtils;
+import com.simuwang.base.common.util.StringUtil;
+import com.simuwang.base.mapper.core.CoreDistributionMapper;
+import com.simuwang.base.mapper.core.SrcNavMapper;
+import com.simuwang.base.mapper.daq.DistributionMapper;
+import com.simuwang.base.mapper.daq.EmailTaskInfoMapper;
+import com.simuwang.base.mapper.daq.NavMapper;
+import com.simuwang.base.mapper.daq.system.SysConfigMapper;
+import com.simuwang.base.pojo.dos.DistributionDO;
+import com.simuwang.base.pojo.dos.EmailTaskInfoDO;
+import com.simuwang.base.pojo.dos.NavDO;
+import com.simuwang.base.pojo.dos.SysConfigDO;
+import com.simuwang.base.pojo.dos.core.CoreDistributionDO;
+import com.simuwang.base.pojo.dos.core.SrcNavDO;
+import com.simuwang.shiro.utils.UserUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 数据同步
+ * Author:   chenjianhua
+ * Date:     2024/10/25 13:59
+ * Description: ${DESCRIPTION}
+ */
+@Component
+public class DataSynchronizationTask {
+
+    @Autowired
+    private NavMapper navMapper;
+
+    @Autowired
+    private SrcNavMapper srcNavMapper;
+
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+
+    @Autowired
+    private DistributionMapper distributionMapper;
+    @Autowired
+    private CoreDistributionMapper coreDistributionMapper;
+    @Autowired
+    private EmailTaskInfoMapper emailTaskInfoMapper;
+    private static final Logger log = LoggerFactory.getLogger(DataSynchronizationTask.class);
+    private static final Integer maxNum = 100000;
+
+    public void synchronization() {
+        EmailTaskInfoDO emailTaskInfoDO = startEmailTask(null, 1);
+        String startDate = sysConfigMapper.selectConfigByKey("last_data_synchronization_time");
+        if (StringUtil.isNull(startDate)) {
+            //沒有配置就新增一个
+            saveConfig();
+        }
+        String endDate = DateUtil.now();
+        long total = navMapper.countNavByTime(startDate, endDate);
+        if (total > maxNum) {
+            Map<String,Long> idMap = navMapper.selectMaxMinId(startDate, endDate);
+            Long minId = idMap.get("minId");
+            Long maxId = idMap.get("maxId");
+            long times = (maxId-minId)%maxNum==0?(maxId-minId)/maxNum:(maxId-minId)/maxNum+1;
+            long startIdx = minId;
+            List<String> fundPriceDateList = new ArrayList<>();
+            for(int idx=1;idx <= times;idx++){
+                long endIdx = startIdx+idx*maxNum;
+                if(endIdx >= maxId){
+                    endIdx = maxId;
+                }
+                List<NavDO> navDOList = navMapper.selectNavListById(minId,maxId,startDate, endDate);
+                List<NavDO> srcNavDOList = new ArrayList<>();
+                //确保每个基金的每个交易日只有一条数据
+                for(NavDO navDo : navDOList){
+                    String fundPriceDate = navDo.getFundId()+DateUtils.format(navDo.getPriceDate(),DateUtils.YYYY_MM_DD);
+                    if(fundPriceDateList.contains(fundPriceDate)){
+                        continue;
+                    }else{
+                        fundPriceDateList.add(fundPriceDate);
+                    }
+                    srcNavDOList.add(navDo);
+                }
+                saveSrcNavList(srcNavDOList);
+                startIdx = endIdx;
+            }
+            return;
+        }
+        List<NavDO> navDOList = navMapper.selectNavListByTime(startDate, endDate);
+        List<NavDO> srcNavDOList = new ArrayList<>();
+        //确保每个基金的每个交易日只有一条数据同步到下游
+        List<String> fundPriceDateList = new ArrayList<>();
+        for(NavDO navDo : navDOList){
+            String fundPriceDate = navDo.getFundId()+DateUtils.format(navDo.getPriceDate(),DateUtils.YYYY_MM_DD);
+            if(fundPriceDateList.contains(fundPriceDate)){
+                continue;
+            }else{
+                fundPriceDateList.add(fundPriceDate);
+            }
+            srcNavDOList.add(navDo);
+        }
+        saveSrcNavList(srcNavDOList);
+        //更新分红
+        List<DistributionDO> distributionDOList = distributionMapper.selectDistributeListByTime(startDate, endDate);
+        saveDistribute(distributionDOList);
+        //更新最后任务时间
+        updateConfig(endDate);
+        endEmailTask(emailTaskInfoDO.getId(),2);
+    }
+
+    private void saveDistribute(List<DistributionDO> distributionDOList) {
+        List<CoreDistributionDO> coreDistributionDOList = new ArrayList<>();
+        //确保每个基金的每个分红日只有一条数据同步到下游
+        List<String> fundDistributionDateList = new ArrayList<>();
+        for(DistributionDO distribution : distributionDOList){
+            String fundDistributionDate = distribution.getFundId()+DateUtils.format(distribution.getDistributeDate(),DateUtils.YYYY_MM_DD);
+            if(fundDistributionDate.contains(fundDistributionDate)){
+                continue;
+            }else{
+                fundDistributionDateList.add(fundDistributionDate);
+            }
+            CoreDistributionDO coreDistributionDO = new CoreDistributionDO();
+            coreDistributionDO.setDistribution(distribution.getDistribution());
+            coreDistributionDO.setDistributeDate(distribution.getDistributeDate());
+            coreDistributionDO.setDistributeType(distribution.getDistributeType());
+            coreDistributionDO.setFundId(distribution.getFundId());
+            coreDistributionDO.setCreateTime(distribution.getCreateTime());
+            coreDistributionDO.setUpdaterId(distribution.getUpdaterId());
+            coreDistributionDO.setCreatorId(distribution.getCreatorId());
+            coreDistributionDO.setUpdateTime(distribution.getUpdateTime());
+            coreDistributionDO.setIsvalid(distribution.getIsvalid());
+            coreDistributionDOList.add(coreDistributionDO);
+            if(coreDistributionDOList.size() >= 500){
+                coreDistributionMapper.saveCoreDistribution(coreDistributionDOList);
+                coreDistributionDOList.clear();
+            }
+        }
+        if(coreDistributionDOList.size() > 0){
+            coreDistributionMapper.saveCoreDistribution(coreDistributionDOList);
+            coreDistributionDOList.clear();
+        }
+    }
+
+    private void updateConfig(String endDate) {
+        SysConfigDO sysConfigDO = new SysConfigDO();
+        sysConfigDO.setConfigKey("last_data_synchronization_time");
+        sysConfigDO.setConfigName("数据同步最后时间");
+        sysConfigDO.setConfigValue(endDate);
+        sysConfigMapper.updateConfigByKey(sysConfigDO);
+    }
+
+    private void saveConfig() {
+        SysConfigDO sysConfigDO = new SysConfigDO();
+        sysConfigDO.setIsvalid(1);
+        sysConfigDO.setCreateTime(DateUtils.getNowDate());
+        sysConfigDO.setUpdateTime(DateUtils.getNowDate());
+        sysConfigDO.setConfigType("1");
+        sysConfigDO.setConfigKey("last_data_synchronization_time");
+        sysConfigDO.setConfigName("数据同步最后时间");
+        sysConfigDO.setConfigValue(DateUtil.now());
+        sysConfigDO.setRemark("数据同步最后时间");
+        sysConfigDO.setCreatorId(1);
+        sysConfigDO.setUpdaterId(1);
+        sysConfigMapper.insertConfig(sysConfigDO);
+    }
+
+    public void saveSrcNavList(List<NavDO> navDOList){
+        List<SrcNavDO> srcNavDOList = new ArrayList<>();
+        for (NavDO navDO : navDOList) {
+            SrcNavDO srcNavDO = new SrcNavDO();
+            srcNavDO.setPriceDate(navDO.getPriceDate());
+            srcNavDO.setFundId(navDO.getFundId());
+            srcNavDO.setNav(navDO.getNav());
+            srcNavDO.setCumulativeNavCrawl(navDO.getCumulativeNavWithdrawal());
+            srcNavDO.setAppType(1);
+            srcNavDO.setNavSource(1);
+            srcNavDO.setCreateTime(navDO.getCreateTime());
+            srcNavDO.setUpdateTime(navDO.getUpdateTime());
+            srcNavDO.setCreatorId(navDO.getCreatorId());
+            srcNavDO.setUpdaterId(navDO.getUpdaterId());
+            srcNavDO.setIsvisible(1);
+            srcNavDO.setSourceId(1);
+            srcNavDO.setIsvalid(navDO.getIsvalid());
+            srcNavDO.setNavMark(null);
+            srcNavDOList.add(srcNavDO);
+            if(srcNavDOList.size() >= 500){
+                srcNavMapper.saveSrcNav(srcNavDOList);
+                srcNavDOList.clear();
+            }
+        }
+        if(srcNavDOList.size() > 0){
+            srcNavMapper.saveSrcNav(srcNavDOList);
+            srcNavDOList.clear();
+        }
+    }
+
+    private EmailTaskInfoDO startEmailTask(String email, Integer taskStatus) {
+        EmailTaskInfoDO  emailTaskInfoDO = new EmailTaskInfoDO();
+        try{
+            emailTaskInfoDO.setTaskName(TaskType.DATA_TRANSFER.getInfo());
+            emailTaskInfoDO.setTaskType(TaskType.DATA_TRANSFER.getType());
+            emailTaskInfoDO.setTaskStatus(taskStatus);
+            emailTaskInfoDO.setStartTime(DateUtils.getNowDate());
+            emailTaskInfoDO.setIsvalid(1);
+            emailTaskInfoDO.setEmail(email);
+            emailTaskInfoDO.setCreateTime(DateUtils.getNowDate());
+            emailTaskInfoDO.setUpdateTime(DateUtils.getNowDate());
+            try{
+                emailTaskInfoDO.setCreatorId(UserUtils.getLoginUser().getUserId());
+                emailTaskInfoDO.setUpdaterId(UserUtils.getLoginUser().getUserId());
+            }catch (Exception e){
+                emailTaskInfoDO.setCreatorId(1);
+                emailTaskInfoDO.setUpdaterId(1);
+            }
+            emailTaskInfoMapper.insert(emailTaskInfoDO);
+        }catch (Exception e){
+            log.error(e.getMessage());
+        }
+        return emailTaskInfoDO;
+    }
+
+    private void endEmailTask(Integer id, Integer taskStatus) {
+        try{
+            EmailTaskInfoDO emailTaskInfoDO = new EmailTaskInfoDO();
+            emailTaskInfoDO.setId(id);
+            emailTaskInfoDO.setTaskStatus(taskStatus);
+            emailTaskInfoDO.setUpdateTime(DateUtils.getNowDate());
+            emailTaskInfoDO.setEndTime(DateUtils.getNowDate());
+            emailTaskInfoMapper.updateTaskStatusById(emailTaskInfoDO);
+        }catch (Exception e){
+            log.error(e.getMessage());
+        }
+    }
+}