Files
henan-backend/skins-service/game-mahjong-service/src/main/resources/mapper/mahjong/MahjongRoundMapper.xml
T
2026-09-22 15:39:53 +08:00

44 lines
2.2 KiB
XML

<?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.ruoyi.game.mahjong.mapper.MahjongRoundMapper">
<select id="pickByBucket" resultType="com.ruoyi.game.mahjong.domain.MahjongRound">
SELECT * FROM game_mahjong_round
WHERE box_id = #{boxId} AND bucket_id = #{bucketId}
<if test="needFreeSpins != null and needFreeSpins == true">AND free_spin_count &gt; 0</if>
<if test="needFreeSpins != null and needFreeSpins == false">AND free_spin_count = 0</if>
ORDER BY RAND() LIMIT 1
</select>
<select id="pickAnyByBox" resultType="com.ruoyi.game.mahjong.domain.MahjongRound">
SELECT * FROM game_mahjong_round
WHERE box_id = #{boxId}
<if test="needFreeSpins != null and needFreeSpins == true">AND free_spin_count &gt; 0</if>
<if test="needFreeSpins != null and needFreeSpins == false">AND free_spin_count = 0</if>
ORDER BY RAND() LIMIT 1
</select>
<!-- 收敛阶段:桶内取 actual_mul 最接近 desiredMul 的回合,优先 actual_mul ≤ capMul,从 top-10 随机取1 -->
<select id="pickClosestMul" resultType="com.ruoyi.game.mahjong.domain.MahjongRound">
SELECT * FROM (
SELECT * FROM game_mahjong_round
WHERE box_id = #{boxId} AND bucket_id = #{bucketId}
<if test="needFreeSpins != null and needFreeSpins == true">AND free_spin_count &gt; 0</if>
<if test="needFreeSpins != null and needFreeSpins == false">AND free_spin_count = 0</if>
ORDER BY (CASE WHEN actual_mul &lt;= #{capMul} THEN 0 ELSE 1 END),
ABS(actual_mul - #{desiredMul})
LIMIT 10
) AS closest_pool
ORDER BY RAND() LIMIT 1
</select>
<!-- 统计某个箱子池子里每个桶"实际赔出去多少"的均值:配比计算与后台「目标RTP」按它算 -->
<select id="avgMulByBucket" resultType="java.util.Map">
SELECT bucket_id AS bucketId, COUNT(*) AS sampleCount, AVG(actual_mul) AS avgMul
FROM game_mahjong_round
WHERE box_id = #{boxId}
GROUP BY bucket_id
</select>
</mapper>