Browse Source

fix: 缺失计算代码优化

chenjianhua 6 months ago
parent
commit
361ff2e3e4

+ 8 - 0
service-base/src/main/resources/mapper/DistributionMapper.xml

@@ -147,4 +147,12 @@
     <select id="countDistributionTotal" resultType="java.lang.Long">
         select count(1) from PPW_EMAIL.distribution where isvalid =1
     </select>
+    <select id="selectDistributeListByTime" resultMap="BaseMap">
+        select id,fund_id,distribute_date,distribute_type,distribution,isvalid,creatorid,createtime,updatetime,updaterid
+        from PPW_EMAIL.distribution where updatetime <![CDATA[ <= ]]> #{endDate}
+        <if test="startDate != null and startDate !=''">
+            and updatetime >= #{startDate}
+        </if>
+        order by updatetime desc
+    </select>
 </mapper>

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

@@ -101,6 +101,36 @@
     <select id="countNavTotal" resultType="java.lang.Long">
         select count(1) from PPW_EMAIL.nav where isvalid=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>

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

@@ -0,0 +1,160 @@
+package com.simuwang.manage.task;
+
+import cn.hutool.core.date.DateUtil;
+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.NavMapper;
+import com.simuwang.base.mapper.daq.system.SysConfigMapper;
+import com.simuwang.base.pojo.dos.DistributionDO;
+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 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;
+
+    private static final Integer maxNum = 100000;
+
+    public void synchronization() {
+        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;
+            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);
+                saveSrcNavList(navDOList);
+                startIdx = endIdx;
+            }
+            return;
+        }
+        List<NavDO> navDOList = navMapper.selectNavListByTime(startDate, endDate);
+        saveSrcNavList(navDOList);
+        //更新分红
+        List<DistributionDO> distributionDOList = distributionMapper.selectDistributeListByTime(startDate, endDate);
+        saveDistribute(distributionDOList);
+        //更新最后任务时间
+        updateConfig(endDate);
+    }
+
+    private void saveDistribute(List<DistributionDO> distributionDOList) {
+        List<CoreDistributionDO> coreDistributionDOList = new ArrayList<>();
+        for(DistributionDO distribution : distributionDOList){
+            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.setId(navDO.getId());
+            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();
+        }
+    }
+}