You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
11 KiB

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.demo.mapper.coin.StatisticsMapper">
  4. <insert id="batchInsertPart1">
  5. INSERT INTO statistics (
  6. market, current_datetime,
  7. current_gold, daily_change,
  8. current_permanent, current_free_june,
  9. current_free_december, current_task
  10. ) VALUES
  11. <foreach collection="list" item="s" separator=";">
  12. (
  13. #{s.market}, #{s.currentDatetime},
  14. #{s.currentGold}, #{s.dailyChange},
  15. #{s.currentPermanent}, #{s.currentFreeJune},
  16. #{s.currentFreeDecember}, #{s.currentTask}
  17. )
  18. </foreach>
  19. ON DUPLICATE KEY UPDATE
  20. current_gold = VALUES(current_gold),
  21. daily_change = VALUES(daily_change),
  22. current_permanent = VALUES(current_permanent),
  23. current_free_june = VALUES(current_free_june),
  24. current_free_december = VALUES(current_free_december),
  25. current_task = VALUES(current_task)
  26. </insert>
  27. <insert id="batchInsertPart2">
  28. INSERT INTO statistics (
  29. market, current_datetime,
  30. recharge, money,
  31. consume_permanent, consume_free_june,
  32. consume_free_december, consume_task,
  33. refund_permanent, refund_free_june,
  34. refund_free_december, refund_task,
  35. recharge_num, first_recharge
  36. ) VALUES
  37. <foreach collection="list" item="s" separator=";">
  38. (
  39. #{s.market}, #{s.currentDatetime},
  40. #{s.recharge}, #{s.money},
  41. #{s.consumePermanent}, #{s.consumeFreeJune},
  42. #{s.consumeFreeDecember}, #{s.consumeTask},
  43. #{s.refundPermanent}, #{s.refundFreeJune},
  44. #{s.refundFreeDecember}, #{s.refundTask},
  45. #{s.rechargeNum}, #{s.firstRecharge}
  46. )
  47. </foreach>
  48. ON DUPLICATE KEY UPDATE
  49. recharge = VALUES(recharge),
  50. money = VALUES(money),
  51. consume_permanent = VALUES(consume_permanent),
  52. consume_free_june = VALUES(consume_free_june),
  53. consume_free_december = VALUES(consume_free_december),
  54. consume_task = VALUES(consume_task),
  55. refund_permanent = VALUES(refund_permanent),
  56. refund_free_june = VALUES(refund_free_june),
  57. refund_free_december = VALUES(refund_free_december),
  58. refund_task = VALUES(refund_task),
  59. recharge_num = VALUES(recharge_num),
  60. first_recharge = VALUES(first_recharge)
  61. </insert>
  62. <insert id="batchInsertYear">
  63. INSERT INTO statistics (
  64. market, current_datetime,
  65. yearly_recharge,
  66. yearly_money,
  67. yearly_consume,
  68. yearly_refund,
  69. yearly_recharge_num
  70. ) VALUES
  71. <foreach collection="list" item="s" separator=";">
  72. (
  73. #{s.market}, #{s.currentDatetime},
  74. #{s.yearlyRecharge},
  75. #{s.yearlyMoney},
  76. #{s.yearlyConsume},
  77. #{s.yearlyRefund},
  78. #{s.yearlyRechargeNum}
  79. )
  80. </foreach>
  81. ON DUPLICATE KEY UPDATE
  82. yearly_recharge = VALUES(yearly_recharge),
  83. yearly_money = VALUES(yearly_money),
  84. yearly_consume = VALUES(yearly_consume),
  85. yearly_refund = VALUES(yearly_refund),
  86. yearly_recharge_num = VALUES(yearly_recharge_num)
  87. </insert>
  88. <!-- 计算该天充值人数-->
  89. <select id="countRechargeNum" resultType="java.lang.Integer">
  90. SELECT COUNT(DISTINCT ugr.jwcode)
  91. FROM user_gold_record ugr
  92. INNER JOIN user u ON ugr.jwcode = u.jwcode
  93. WHERE u.market = #{market}
  94. AND ugr.type=0
  95. AND ugr.audit_status IN (1,3)
  96. AND ugr.audit_time BETWEEN #{startTime} AND #{endTime}
  97. </select>
  98. <!--获取某地区某时间所在日期的数据(仅一条)-->
  99. <select id="selectByMarketAndDate" resultType="com.example.demo.domain.entity.Statistics">
  100. SELECT *
  101. FROM statistics
  102. WHERE market = #{market}
  103. AND current_datetime BETWEEN #{startDate} AND #{endDate}
  104. </select>
  105. <select id="selectByMarketsAndDate" resultType="com.example.demo.domain.entity.Statistics">
  106. SELECT * FROM statistics
  107. WHERE market IN
  108. <foreach item="market" collection="markets" open="(" separator="," close=")">
  109. #{market}
  110. </foreach>
  111. AND current_datetime BETWEEN #{startDate} AND #{endDate}
  112. </select>
  113. <select id="listPart1All" resultType="com.example.demo.domain.entity.Statistics">
  114. SELECT
  115. m.name as market,
  116. #{today} AS current_datetime,
  117. COALESCE(SUM(current_permanent_gold),0) +
  118. COALESCE(SUM(current_free_june),0) +
  119. COALESCE(SUM(current_free_december),0) +
  120. COALESCE(SUM(current_task_gold),0) AS current_gold,
  121. COALESCE(SUM(current_permanent_gold),0) AS current_permanent,
  122. COALESCE(SUM(current_free_june),0) AS current_free_june,
  123. COALESCE(SUM(current_free_december),0) AS current_free_december,
  124. COALESCE(SUM(current_task_gold),0) AS current_task,
  125. -- 与昨天差值(从 statistics 表取)
  126. (
  127. COALESCE(SUM(u.current_permanent_gold),0) +
  128. COALESCE(SUM(u.current_free_june),0) +
  129. COALESCE(SUM(u.current_free_december),0) +
  130. COALESCE(SUM(u.current_task_gold),0)
  131. ) - COALESCE(
  132. (
  133. SELECT s.current_gold
  134. FROM statistics s
  135. WHERE s.market = m.name
  136. AND s.current_datetime = DATE_SUB(#{today}, INTERVAL 1 DAY)
  137. LIMIT 1
  138. ), 0
  139. ) AS daily_change
  140. FROM user u
  141. left join market m on u.market=m.id
  142. where m.name IS NOT NULL
  143. GROUP BY market
  144. </select>
  145. <select id="listPart2All" resultType="com.example.demo.domain.entity.Statistics">
  146. SELECT
  147. m.name as market,
  148. '2025-08-04' AS current_datetime,
  149. COALESCE(SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold+ugr.free_june+ugr.free_december+ugr.task_gold END),0) AS recharge,
  150. COALESCE(SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold END),0) AS money,
  151. COALESCE(SUM(CASE WHEN ugr.type=1 THEN -ugr.permanent_gold END),0) AS consume_permanent,
  152. COALESCE(SUM(CASE WHEN ugr.type=1 THEN -ugr.free_june END),0) AS consume_free_june,
  153. COALESCE(SUM(CASE WHEN ugr.type=1 THEN -ugr.free_december END),0) AS consume_free_december,
  154. COALESCE(SUM(CASE WHEN ugr.type=1 THEN -ugr.task_gold END),0) AS consume_task,
  155. COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.permanent_gold END),0) AS refund_permanent,
  156. COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.free_june END),0) AS refund_free_june,
  157. COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.free_december END),0) AS refund_free_december,
  158. COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.task_gold END),0) AS refund_task,
  159. COUNT(DISTINCT CASE WHEN ugr.type=0 THEN ugr.jwcode END) AS recharge_num,
  160. COUNT(DISTINCT CASE WHEN ugr.type=0
  161. AND u.first_recharge BETWEEN #{start} AND #{end} THEN ugr.jwcode END) AS first_recharge
  162. FROM user_gold_record ugr
  163. JOIN user u ON ugr.jwcode = u.jwcode
  164. left join market m on u.market=m.id
  165. WHERE ugr.audit_status IN (1,3)
  166. AND ugr.flag = 1
  167. AND ugr.create_time BETWEEN #{start} AND #{end}
  168. AND m.name IS NOT NULL
  169. GROUP BY u.market
  170. </select>
  171. <select id="listYearAll" resultType="com.example.demo.domain.entity.Statistics">
  172. SELECT m.name as market,
  173. COALESCE(SUM(s.recharge),0) AS yearly_recharge,
  174. #{today} AS current_datetime,
  175. COALESCE(SUM(s.money),0) AS yearly_money,
  176. COALESCE(SUM(s.consume_permanent+s.consume_free_june+s.consume_free_december+s.consume_task),0) AS yearly_consume,
  177. COALESCE(SUM(s.refund_permanent+s.refund_free_june+s.refund_free_december+s.refund_task),0) AS yearly_refund,
  178. COALESCE(SUM(s.recharge_num),0) AS yearly_recharge_num
  179. FROM statistics s
  180. left join market m on s.market=m.id
  181. WHERE current_datetime BETWEEN #{yearStart} AND #{end} AND m.name IS NOT NULL
  182. GROUP BY market
  183. </select>
  184. <select id="listPart2RangeAll" resultType="com.example.demo.domain.entity.Statistics">
  185. SELECT
  186. m.name as market,
  187. DATE(ugr.create_time) AS current_datetime, -- 只保留日期
  188. COALESCE(SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold+ugr.free_june+ugr.free_december+ugr.task_gold END),0) AS recharge,
  189. COALESCE(SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold END),0) AS money,
  190. COALESCE(SUM(CASE WHEN ugr.type=1 THEN -ugr.permanent_gold END),0) AS consume_permanent,
  191. COALESCE(SUM(CASE WHEN ugr.type=1 THEN -ugr.free_june END),0) AS consume_free_june,
  192. COALESCE(SUM(CASE WHEN ugr.type=1 THEN -ugr.free_december END),0) AS consume_free_december,
  193. COALESCE(SUM(CASE WHEN ugr.type=1 THEN -ugr.task_gold END),0) AS consume_task,
  194. COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.permanent_gold END),0) AS refund_permanent,
  195. COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.free_june END),0) AS refund_free_june,
  196. COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.free_december END),0) AS refund_free_december,
  197. COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.task_gold END),0) AS refund_task,
  198. COUNT(DISTINCT CASE WHEN ugr.type=0 THEN ugr.jwcode END) AS recharge_num,
  199. COUNT(DISTINCT CASE WHEN ugr.type=0
  200. AND u.first_recharge BETWEEN d.date_start AND d.date_end THEN ugr.jwcode END) AS first_recharge
  201. FROM
  202. -- 生成 7 天日期序列
  203. (
  204. SELECT DATE_SUB(CURDATE(), INTERVAL seq DAY) AS create_date,
  205. DATE_SUB(CURDATE(), INTERVAL seq DAY) AS date_start,
  206. TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL seq DAY), '23:59:59') AS date_end
  207. FROM (
  208. SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
  209. SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
  210. ) AS days
  211. ) d
  212. JOIN user_gold_record ugr
  213. ON ugr.create_time between d.date_start AND d.date_end
  214. JOIN user u ON ugr.jwcode = u.jwcode
  215. left join market m on u.market=m.id
  216. WHERE ugr.audit_status IN (1,3)
  217. AND ugr.flag = 1
  218. AND m.name IS NOT NULL
  219. GROUP BY m.name, d.create_date
  220. </select>
  221. </mapper>