فهرست منبع

feat(recommend): 数仓同步写库 Mapper(规则/POP 批插+删,历史 UPSERT,指针 UPDATE)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jintao.geng 1 ماه پیش
والد
کامیت
15df9a559b

+ 5 - 0
mango-infrastructure/src/main/java/com/mangoo/rating/recommend/mapper/ActiveBatchMapper.java

@@ -15,4 +15,9 @@ public interface ActiveBatchMapper {
      * 读取当前生效批次号(无则返回 null)
      */
     String selectActiveBatchNo();
+
+    /**
+     * 数仓同步:更新生效批次指针(单行指针表,DDL 已初始化一行,直接全表 UPDATE)
+     */
+    int updateActiveBatchNo(@org.apache.ibatis.annotations.Param("batchNo") String batchNo);
 }

+ 10 - 0
mango-infrastructure/src/main/java/com/mangoo/rating/recommend/mapper/CardPopMapper.java

@@ -19,4 +19,14 @@ public interface CardPopMapper {
      * 按卡片ID + 批次查 POP 明细(三机构多行)
      */
     List<CardPopPO> selectByCardId(@Param("cardId") String cardId, @Param("batchNo") String batchNo);
+
+    /**
+     * 数仓同步:批量插入 POP 明细(物理全量替换)
+     */
+    int batchInsert(@Param("list") java.util.List<com.mangoo.rating.recommend.po.CardPopPO> list);
+
+    /**
+     * 数仓同步:按批次号物理删除 POP 明细(配合全量替换)
+     */
+    int deleteByBatchNo(@Param("batchNo") String batchNo);
 }

+ 5 - 0
mango-infrastructure/src/main/java/com/mangoo/rating/recommend/mapper/CardValueHistoryMapper.java

@@ -20,4 +20,9 @@ public interface CardValueHistoryMapper {
      * 查某卡价格历史;startDate 为 null 时查全部,否则查 record_date >= startDate。按日期升序。
      */
     List<CardValueHistoryPO> selectTrend(@Param("cardId") String cardId, @Param("startDate") LocalDate startDate);
+
+    /**
+     * 数仓同步:批量 UPSERT 价格历史(依赖唯一索引 uk_rcvh_card_date,冲突则更新价格)
+     */
+    int batchUpsert(@Param("list") java.util.List<com.mangoo.rating.recommend.po.CardValueHistoryPO> list);
 }

+ 15 - 0
mango-infrastructure/src/main/java/com/mangoo/rating/recommend/mapper/RatingRecommendRuleMapper.java

@@ -36,4 +36,19 @@ public interface RatingRecommendRuleMapper {
     RatingRecommendRulePO selectBySeriesSet(@Param("series") String series,
                                             @Param("cardSet") String cardSet,
                                             @Param("batchNo") String batchNo);
+
+    /**
+     * 数仓同步:批量插入规则(物理全量替换,del_flag 恒为 0)
+     */
+    int batchInsert(@Param("list") java.util.List<com.mangoo.rating.recommend.po.RatingRecommendRulePO> list);
+
+    /**
+     * 数仓同步:按批次号物理删除规则(配合全量替换)
+     */
+    int deleteByBatchNo(@Param("batchNo") String batchNo);
+
+    /**
+     * 数仓同步:查询所有去重批次号(用于清理过期批次)
+     */
+    java.util.List<String> selectDistinctBatchNos();
 }

+ 6 - 0
mango-infrastructure/src/main/resources/mapper/ActiveBatchMapper.xml

@@ -7,4 +7,10 @@
         ORDER BY id DESC
         LIMIT 1
     </select>
+
+    <!-- 数仓同步:更新生效批次指针(单行指针表,直接全表 UPDATE) -->
+    <update id="updateActiveBatchNo">
+        UPDATE t_rating_recommend_active_batch
+        SET active_batch_no = #{batchNo}, update_time = now()
+    </update>
 </mapper>

+ 15 - 0
mango-infrastructure/src/main/resources/mapper/CardPopMapper.xml

@@ -19,4 +19,19 @@
         WHERE card_id = #{cardId} AND batch_no = #{batchNo}
         ORDER BY agency ASC
     </select>
+
+    <!-- 数仓同步:批量插入 POP 明细(物理全量替换) -->
+    <insert id="batchInsert">
+        INSERT INTO t_rating_card_pop
+        (card_id, agency, grade_all, grade_10, grade_9, grade_8, grade_7, batch_no, create_time)
+        VALUES
+        <foreach collection="list" item="it" separator=",">
+            (#{it.cardId}, #{it.agency}, #{it.gradeAll}, #{it.grade10}, #{it.grade9}, #{it.grade8}, #{it.grade7}, #{it.batchNo}, now())
+        </foreach>
+    </insert>
+
+    <!-- 数仓同步:按批次号物理删除 POP 明细(配合全量替换) -->
+    <delete id="deleteByBatchNo">
+        DELETE FROM t_rating_card_pop WHERE batch_no = #{batchNo}
+    </delete>
 </mapper>

+ 10 - 0
mango-infrastructure/src/main/resources/mapper/CardValueHistoryMapper.xml

@@ -17,4 +17,14 @@
         </if>
         ORDER BY record_date ASC
     </select>
+
+    <!-- 数仓同步:批量 UPSERT 价格历史(依赖唯一索引 uk_rcvh_card_date) -->
+    <insert id="batchUpsert">
+        INSERT INTO t_rating_card_value_history (card_id, price, record_date, create_time)
+        VALUES
+        <foreach collection="list" item="it" separator=",">
+            (#{it.cardId}, #{it.price}, #{it.recordDate}, now())
+        </foreach>
+        ON CONFLICT (card_id, record_date) DO UPDATE SET price = EXCLUDED.price
+    </insert>
 </mapper>

+ 24 - 0
mango-infrastructure/src/main/resources/mapper/RatingRecommendRuleMapper.xml

@@ -72,4 +72,28 @@
         LIMIT 1
     </select>
 
+    <!-- 数仓同步:批量插入规则(物理全量替换,del_flag 恒为 0) -->
+    <insert id="batchInsert">
+        INSERT INTO t_rating_recommend_rule
+        (player, year, series, card_set, recommend_efficiency, effective_time,
+         card_id, card_no, current_value, value_change_pct, value_min, value_max, batch_no,
+         create_time, update_time, del_flag)
+        VALUES
+        <foreach collection="list" item="it" separator=",">
+            (#{it.player}, #{it.year}, #{it.series}, #{it.cardSet}, #{it.recommendEfficiency}, #{it.effectiveTime},
+             #{it.cardId}, #{it.cardNo}, #{it.currentValue}, #{it.valueChangePct}, #{it.valueMin}, #{it.valueMax}, #{it.batchNo},
+             now(), now(), 0)
+        </foreach>
+    </insert>
+
+    <!-- 数仓同步:按批次号物理删除规则(配合全量替换) -->
+    <delete id="deleteByBatchNo">
+        DELETE FROM t_rating_recommend_rule WHERE batch_no = #{batchNo}
+    </delete>
+
+    <!-- 数仓同步:查询所有去重批次号 -->
+    <select id="selectDistinctBatchNos" resultType="java.lang.String">
+        SELECT DISTINCT batch_no FROM t_rating_recommend_rule WHERE batch_no IS NOT NULL
+    </select>
+
 </mapper>