金币系统后端
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.

547 lines
23 KiB

9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
9 months ago
10 months ago
9 months ago
10 months ago
9 months ago
10 months ago
9 months ago
10 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
  1. package com.example.demo.serviceImpl;
  2. import java.text.SimpleDateFormat;
  3. import java.util.*;
  4. import java.util.concurrent.TimeUnit;
  5. import com.example.demo.Util.CheckIfNullUtil;
  6. import com.example.demo.domain.vo.Meium;
  7. import com.example.demo.domain.vo.Statistics;
  8. import com.example.demo.domain.vo.Statisticss;
  9. import com.example.demo.domain.vo.SumCoin;
  10. import com.example.demo.mapper.StatisticsMapper;
  11. import com.example.demo.mapper.UserMapper;
  12. import com.example.demo.sevice.StatisticsService;
  13. import lombok.RequiredArgsConstructor;
  14. import org.apache.ibatis.annotations.Param;
  15. import org.springframework.cache.annotation.CacheConfig;
  16. import org.springframework.cache.annotation.Cacheable;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.transaction.annotation.Transactional;
  19. import org.springframework.web.bind.annotation.RequestBody;
  20. import java.math.BigDecimal;
  21. import java.time.LocalDate;
  22. import java.time.ZoneId;
  23. import java.time.temporal.ChronoUnit;
  24. import java.util.List;
  25. @RequiredArgsConstructor
  26. @Transactional
  27. @Service
  28. @CacheConfig(cacheNames = "statistics")
  29. public class StatisticsServiceImpl implements StatisticsService {
  30. private final StatisticsMapper statisticsMapper;
  31. private final UserMapper userMapper;
  32. @Cacheable(key = "#root.method.name")
  33. @Override
  34. public Statistics getStatistics() {
  35. Statistics statistics = new Statistics();
  36. // 全年累计数据
  37. Statistics yearStats = CheckIfNullUtil.defaultIfNull(statisticsMapper.getTotalYearCoin(), new Statistics());
  38. statistics.setRechargeSumCoin(yearStats.getRechargeSumCoin());
  39. statistics.setFreeSumCoin(yearStats.getFreeSumCoin());
  40. statistics.setTaskSumCoin(yearStats.getTaskSumCoin());
  41. statistics.setTotalSumCoin(yearStats.getTotalSumCoin());
  42. //免费金币6/12到期数量
  43. Statistics free =CheckIfNullUtil.defaultIfNull(statisticsMapper.getFreeCoinTotal(), new Statistics());
  44. statistics.setFree6SumCoin(free.getFree6SumCoin());
  45. statistics.setFree12SumCoin(free.getFree12SumCoin());
  46. // 昨日新增数据
  47. Statistics yesterdayStats = CheckIfNullUtil.defaultIfNull(statisticsMapper.getYesterdayNewCoin(), new Statistics());
  48. statistics.setRechargeYesterdaySumCoin(yesterdayStats.getRechargeYesterdaySumCoin());
  49. statistics.setFreeYesterdaySumCoin(yesterdayStats.getFreeYesterdaySumCoin());
  50. statistics.setTaskYesterdaySumCoin(yesterdayStats.getTaskYesterdaySumCoin());
  51. statistics.setTotalYesterdaySumCoin(yesterdayStats.getTotalYesterdaySumCoin());
  52. // 年累计充值人数
  53. statistics.setRechargeCount(statisticsMapper.getYearRechargeCount());
  54. // 本周和上周充值人数
  55. int thisWeekCount = statisticsMapper.getRechargeCountThisWeek();
  56. int lastWeekCount = statisticsMapper.getRechargeCountLastWeek();
  57. statistics.setRechargeCountThisWeek(thisWeekCount);
  58. statistics.setRechargeCountLastWeek(lastWeekCount);
  59. // 周同比计算
  60. BigDecimal weekOverWeekRate = BigDecimal.ZERO;//初始化为 0 表示如果没有足够的数据(如 lastWeekCount == 0),默认周同比增长率为 0。
  61. if (lastWeekCount > 0) {
  62. weekOverWeekRate = BigDecimal.valueOf((double) (thisWeekCount - lastWeekCount) / lastWeekCount * 100)//将计算结果转换为 BigDecimal 类型,保证高精度。
  63. .setScale(2, BigDecimal.ROUND_HALF_UP); // 保留两位小数
  64. }
  65. statistics.setWeekOverWeekRate(weekOverWeekRate);
  66. //今日和昨日充值人数
  67. int todayCount = statisticsMapper.getRechargeCountToday();
  68. int yesterdayCount = statisticsMapper.getRechargeCountYesterday();
  69. int firstYesterdayCount = statisticsMapper.getFirstRechargeCountYesterday();
  70. statistics.setRechargeCountToday(todayCount);
  71. statistics.setRechargeCountYesterday(yesterdayCount);
  72. statistics.setFirstRechargeCountYesterday(firstYesterdayCount);
  73. //日环比计算
  74. BigDecimal dayOverDayRate = BigDecimal.ZERO;
  75. if (yesterdayCount > 0) {
  76. dayOverDayRate = BigDecimal.valueOf((double) (todayCount - yesterdayCount) / yesterdayCount * 100).
  77. setScale(2, BigDecimal.ROUND_HALF_UP);
  78. }
  79. statistics.setDayOverDayRate(dayOverDayRate);
  80. return statistics;
  81. }
  82. @Cacheable(key = "#root.method.name")
  83. @Override
  84. public Statisticss stats() {
  85. Statisticss a = new Statisticss();
  86. a.setCoinSystemSum(statisticsMapper.getCoinSystemSum());
  87. a.setERPSum(statisticsMapper.getERPSum());
  88. a.setHomilyChartSum(statisticsMapper.getHomilyChartSum());
  89. a.setHomilyLinkSum(statisticsMapper.getHomilyLinkSum());
  90. return a;
  91. }
  92. //----------------------------------------------------------------------------------------------------//
  93. @Cacheable(key = "#root.method.name")
  94. public SumCoin getSumCoin() {
  95. return statisticsMapper.getSumCoin();
  96. }
  97. @Cacheable(key = "#root.method.name")
  98. @Override
  99. public SumCoin getYearConsumeCoin() {
  100. return statisticsMapper.getYearConsumeCoin();
  101. }
  102. @Cacheable(key = "#root.method.name")
  103. @Override
  104. public SumCoin getDayConsumeCoin() {
  105. return statisticsMapper.getDayConsumeCoin();
  106. }
  107. @Override
  108. public List<SumCoin> getMediuPayCoin() {
  109. return List.of();
  110. }
  111. @Override
  112. public List<SumCoin> getMediuConsumeCoin() {
  113. return List.of();
  114. }
  115. public SumCoin getMess(Integer jwcode) {
  116. return statisticsMapper.getMess(jwcode);
  117. }
  118. @Cacheable(key = "#root.method.name")
  119. @Override
  120. public List<SumCoin> getMediumAreaPay() {
  121. return statisticsMapper.getMediumAreaPay();
  122. }
  123. @Cacheable(key = "#root.method.name")
  124. @Override
  125. public List<SumCoin> getMediumAreaConsume() {
  126. return statisticsMapper.getMediumAreaConsume();
  127. }
  128. // @Override
  129. // public List<Meium> getMee(Meium meium) {
  130. //
  131. //
  132. // if (0 == (meium.getUpdateType())) {
  133. // if ("免费金币".equals(meium.getType())) {
  134. // return statisticsMapper.getBuyAndFree(meium.getSearchStartTime(), meium.getSearchEndTime());
  135. // } else if ("充值金币".equals(meium.getType())) {
  136. // return statisticsMapper.getBuyAndRecharge(meium.getSearchStartTime(), meium.getSearchEndTime());
  137. // } else if ("任务金币".equals(meium.getType())) {
  138. // return statisticsMapper.getBuyAndTask(meium.getSearchStartTime(), meium.getSearchEndTime());
  139. // } else {
  140. // return statisticsMapper.getBuy(meium.getSearchStartTime(), meium.getSearchEndTime());
  141. // }
  142. //
  143. // } else if (1 == (meium.getUpdateType())) {
  144. // if ("免费金币".equals(meium.getType())) {
  145. // return statisticsMapper.getPayAndFree(meium.getSearchStartTime(), meium.getSearchEndTime());
  146. // } else if ("充值金币".equals(meium.getType())) {
  147. // return statisticsMapper.getPayAndRecharge(meium.getSearchStartTime(), meium.getSearchEndTime());
  148. // } else if ("任务金币".equals(meium.getType())) {
  149. // return statisticsMapper.getPayAndTask(meium.getSearchStartTime(), meium.getSearchEndTime());
  150. // } else {
  151. // return statisticsMapper.getPay(meium.getSearchStartTime(), meium.getSearchEndTime());
  152. // }
  153. //
  154. // } else
  155. // return null;
  156. //
  157. //
  158. // }
  159. @Cacheable(key = "#root.method.name + T(java.util.Objects).hashCode(#meium)")
  160. @Override
  161. public List<Meium> getMee(Meium meium) {
  162. List<Meium> result = new ArrayList<>();
  163. List<String> regionsFromDb = userMapper.selectArea();
  164. // 创建一个动态列表
  165. List<String> allRegions = new ArrayList<>(regionsFromDb);
  166. Date searchStartTime = meium.getSearchStartTime();
  167. Date searchEndTime = meium.getSearchEndTime();
  168. Integer updateType = meium.getUpdateType();
  169. // 如果开始时间和结束时间都为空,则直接返回默认统计结果,即全查
  170. if (searchStartTime == null && searchEndTime == null) {
  171. if (0 == updateType) {
  172. return statisticsMapper.getBuy(searchStartTime, searchEndTime);
  173. } else if (1 == updateType) {
  174. return statisticsMapper.getPay(searchStartTime, searchEndTime);
  175. }
  176. }
  177. // 获取日期范围内的所有日期
  178. // 根据 updateType 和类型选择查询方法
  179. List<Meium> queryResult = null;
  180. if (0 == updateType) {
  181. if ("免费金币".equals(meium.getType())) {
  182. queryResult = statisticsMapper.getBuyAndFree(searchStartTime, searchEndTime);
  183. } else if ("充值金币".equals(meium.getType())) {
  184. queryResult = statisticsMapper.getBuyAndRecharge(searchStartTime, searchEndTime);
  185. } else if ("任务金币".equals(meium.getType())) {
  186. queryResult = statisticsMapper.getBuyAndTask(searchStartTime, searchEndTime);
  187. } else {
  188. queryResult = statisticsMapper.getBuy(searchStartTime, searchEndTime);
  189. }
  190. } else if (1 == updateType) {
  191. if ("免费金币".equals(meium.getType())) {
  192. queryResult = statisticsMapper.getPayAndFree(searchStartTime, searchEndTime);
  193. } else if ("充值金币".equals(meium.getType())) {
  194. queryResult = statisticsMapper.getPayAndRecharge(searchStartTime, searchEndTime);
  195. } else if ("任务金币".equals(meium.getType())) {
  196. queryResult = statisticsMapper.getPayAndTask(searchStartTime, searchEndTime);
  197. } else {
  198. queryResult = statisticsMapper.getPay(searchStartTime, searchEndTime);
  199. }
  200. }
  201. // 将查询结果按区域映射,方便查找
  202. Map<String, Meium> resultMap = new HashMap<>();
  203. if (queryResult != null) {
  204. for (Meium meiumData : queryResult) {
  205. resultMap.put(meiumData.getArea(), meiumData);
  206. }
  207. }
  208. // 遍历所有地区,如果没有数据,设置为默认值
  209. for (String region : allRegions) {
  210. Meium meiumData = resultMap.get(region);
  211. if (meiumData == null) {
  212. Meium defaultMeium = createDefaultMeium(region);
  213. result.add(defaultMeium); // 如果没有数据,创建默认值
  214. } else {
  215. result.add(meiumData); // 否则,加入已有的查询结果
  216. }
  217. }
  218. return result;
  219. }
  220. // 创建默认的 Meium 对象,并设置地区和金币数为0
  221. private Meium createDefaultMeium(String region) {
  222. Meium defaultMeium = new Meium();
  223. defaultMeium.setArea(region); // 设置区域
  224. defaultMeium.setRechargeSumCoin(BigDecimal.ZERO); // 设置充值金币为0
  225. defaultMeium.setFreeSumCoin(BigDecimal.ZERO); // 设置免费金币为0
  226. defaultMeium.setTaskSumCoin(BigDecimal.ZERO); // 设置任务金币为0
  227. defaultMeium.setTotalRechargeSum(BigDecimal.ZERO); // 设置总充值金币为0
  228. return defaultMeium;
  229. }
  230. @Override
  231. public List<SumCoin> getMediu() {
  232. return List.of();
  233. }
  234. // public List<SumCoin> getCoinTime( SumCoin sumcoin) {
  235. //
  236. // System.out.println(sumcoin+"-------sumcoin----");
  237. // Date searchStartTime=sumcoin.getSearchStartTime();
  238. // Date searchEndTime=sumcoin.getSearchEndTime();
  239. // String updateType=sumcoin.getUpdateType();
  240. //
  241. //// //提供开始时间与结束时间
  242. ////// if(searchStartTime!=null && searchEndTime!=null){
  243. //// //计算两个时间点之间的差值
  244. //// long daysBetween = ChronoUnit.DAYS.between(searchStartTime, searchEndTime);
  245. //
  246. //// 提供开始时间与结束时间
  247. //
  248. //
  249. // // 使用 Calendar 清除时间和时区的影响
  250. // Calendar startCal = Calendar.getInstance();
  251. // startCal.setTime(searchStartTime);
  252. // startCal.set(Calendar.HOUR_OF_DAY, 0);
  253. // startCal.set(Calendar.MINUTE, 0);
  254. // startCal.set(Calendar.SECOND, 0);
  255. // startCal.set(Calendar.MILLISECOND, 0);
  256. //
  257. // Calendar endCal = Calendar.getInstance();
  258. // endCal.setTime(searchEndTime);
  259. // endCal.set(Calendar.HOUR_OF_DAY, 0);
  260. // endCal.set(Calendar.MINUTE, 0);
  261. // endCal.set(Calendar.SECOND, 0);
  262. // endCal.set(Calendar.MILLISECOND, 0);
  263. //
  264. // // 计算两个时间点之间的天数差异
  265. // long diffInMillies = endCal.getTimeInMillis() - startCal.getTimeInMillis();
  266. // long daysBetween = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
  267. //
  268. //
  269. // //年
  270. // if(daysBetween>100 || searchStartTime==null & searchEndTime==null){
  271. // if("消费".equals(updateType)){
  272. // return statisticsMapper.getMediuConsumeCoin();
  273. // }else if("充值".equals(updateType)){
  274. // return statisticsMapper.getMediuPayCoin();
  275. // }
  276. //
  277. // }else {
  278. // if ("消费".equals(updateType)) {
  279. // return statisticsMapper.getMediuCounsumeCoinyue(searchStartTime,searchEndTime);
  280. // } else if ("充值".equals(updateType)) {
  281. // return statisticsMapper.getMediuPayCoinyue(searchStartTime,searchEndTime);
  282. // }
  283. // }
  284. // return null;
  285. //
  286. // }
  287. //
  288. // @Cacheable(key = "#root.method.name + #sumcoin.hashCode()")
  289. // public List<SumCoin> getCoinTime(SumCoin sumcoin) {
  290. // System.out.println(sumcoin + "-------sumcoin----");
  291. //
  292. // Date searchStartTime = sumcoin.getSearchStartTime();
  293. // Date searchEndTime = sumcoin.getSearchEndTime();
  294. // Integer updateType = sumcoin.getUpdateType();
  295. //
  296. // // 如果开始时间和结束时间都为空,则直接返回默认统计结果
  297. // if (searchStartTime == null && searchEndTime == null) {
  298. // if (1 == updateType) {
  299. // return statisticsMapper.getMediuConsumeCoin(null, null);
  300. // } else if (0 == updateType) {
  301. // return statisticsMapper.getMediuPayCoin(null, null);
  302. // }
  303. // return null; // 或者抛出异常,取决于业务需求
  304. // }
  305. //
  306. // // 如果只有其中一个时间为null,则可能需要处理或抛出异常,这里假设不允许这种情况
  307. // if (searchStartTime == null || searchEndTime == null) {
  308. // throw new IllegalArgumentException("开始时间和结束时间必须同时为空或不为空");
  309. // }
  310. //
  311. // // 使用 Calendar 清除时间和时区的影响
  312. // Calendar startCal = Calendar.getInstance();
  313. // startCal.setTime(searchStartTime);
  314. // startCal.set(Calendar.HOUR_OF_DAY, 0);
  315. // startCal.set(Calendar.MINUTE, 0);
  316. // startCal.set(Calendar.SECOND, 0);
  317. // startCal.set(Calendar.MILLISECOND, 0);
  318. //
  319. // Calendar endCal = Calendar.getInstance();
  320. // endCal.setTime(searchEndTime);
  321. // endCal.set(Calendar.HOUR_OF_DAY, 0);
  322. // endCal.set(Calendar.MINUTE, 0);
  323. // endCal.set(Calendar.SECOND, 0);
  324. // endCal.set(Calendar.MILLISECOND, 0);
  325. //
  326. // // 计算两个时间点之间的天数差异
  327. // long diffInMillies = endCal.getTimeInMillis() - startCal.getTimeInMillis();
  328. // long daysBetween = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
  329. //
  330. // // 根据条件选择查询方法
  331. // List<SumCoin> result = null;
  332. //
  333. // // 如果天数差大于100天
  334. // if (daysBetween > 100) {
  335. // if (1 == updateType) {
  336. // result = statisticsMapper.getMediuConsumeCoin(searchStartTime, searchEndTime);
  337. // } else if (0 == updateType) {
  338. // result = statisticsMapper.getMediuPayCoin(searchStartTime, searchEndTime);
  339. // }
  340. // }
  341. // // 如果天数差为0,即同一天
  342. // else if (daysBetween == 0) {
  343. // if (1 == updateType) {
  344. // result = statisticsMapper.getMediuConsumeCoinday(searchEndTime, updateType);
  345. // } else if (0 == updateType) {
  346. // result = statisticsMapper.getMediuPayCoinday(searchEndTime, updateType);
  347. // }
  348. // }
  349. // // 如果天数差小于100天,但不为0(即跨月或较短时间段)
  350. // else {
  351. // if (1 == updateType) {
  352. // result = statisticsMapper.getMediuCounsumeCoinyue(searchStartTime, searchEndTime);
  353. // } else if (0 == updateType) {
  354. // result = statisticsMapper.getMediuPayCoinyue(searchStartTime, searchEndTime);
  355. // }
  356. // }
  357. //
  358. // // 如果查询结果为空或没有数据,返回默认的SumCoin对象
  359. // if (result == null || result.isEmpty()) {
  360. // result = Collections.singletonList(createDefaultSumCoin());
  361. // }
  362. //
  363. // return result;
  364. // }
  365. //
  366. // // 创建默认的 SumCoin 对象
  367. // private SumCoin createDefaultSumCoin() {
  368. // SumCoin defaultSumCoin = new SumCoin();
  369. //
  370. // defaultSumCoin.setRechargeSumCoin(BigDecimal.ZERO);
  371. // defaultSumCoin.setFreeSumCoin(BigDecimal.ZERO);
  372. // defaultSumCoin.setTaskSumCoin(BigDecimal.ZERO);
  373. // // 获取当前日期并设置为字符串格式
  374. // Date currentDate = new Date();
  375. // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); // "yyyy-M-d" 格式
  376. // String formattedDate = sdf.format(currentDate); // 格式化日期为字符串
  377. //
  378. // // 设置当前日期
  379. // defaultSumCoin.setDay(formattedDate);
  380. // return defaultSumCoin;
  381. // }
  382. //}
  383. @Cacheable(key = "#root.method.name + #sumcoin.hashCode()")
  384. public List<SumCoin> getCoinTime(SumCoin sumcoin) {
  385. System.out.println(sumcoin + "-------sumcoin----");
  386. Date searchStartTime = sumcoin.getSearchStartTime();
  387. Date searchEndTime = sumcoin.getSearchEndTime();
  388. Integer updateType = sumcoin.getUpdateType();
  389. // 如果开始时间和结束时间都为空,则直接返回默认统计结果,即全查
  390. if (searchStartTime == null && searchEndTime == null) {
  391. if (1 == updateType) {
  392. return statisticsMapper.getMediuConsumeCoin(searchStartTime, searchEndTime);//前端没有选定时间,SQL会查询所有数据
  393. } else if (0 == updateType) {
  394. return statisticsMapper.getMediuPayCoin(null, null);
  395. }
  396. return null; // 或者抛出异常,取决于业务需求
  397. }
  398. // 如果只有其中一个时间为null,则可能需要处理或抛出异常,这里假设不允许这种情况
  399. if (searchStartTime == null || searchEndTime == null) {
  400. throw new IllegalArgumentException("开始时间和结束时间必须同时为空或不为空");
  401. }
  402. // 使用 Calendar 清除时间和时区的影响
  403. Calendar startCal = Calendar.getInstance();
  404. startCal.setTime(searchStartTime);
  405. startCal.set(Calendar.HOUR_OF_DAY, 0);
  406. startCal.set(Calendar.MINUTE, 0);
  407. startCal.set(Calendar.SECOND, 0);
  408. startCal.set(Calendar.MILLISECOND, 0);
  409. Calendar endCal = Calendar.getInstance();
  410. endCal.setTime(searchEndTime);
  411. endCal.set(Calendar.HOUR_OF_DAY, 0);
  412. endCal.set(Calendar.MINUTE, 0);
  413. endCal.set(Calendar.SECOND, 0);
  414. endCal.set(Calendar.MILLISECOND, 0);
  415. // 计算两个时间点之间的天数差异
  416. long diffInMillies = endCal.getTimeInMillis() - startCal.getTimeInMillis();
  417. long daysBetween = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
  418. System.out.println(daysBetween + "-------daysBetween----");
  419. // 根据条件选择查询方法
  420. List<SumCoin> result = new ArrayList<>();
  421. List<SumCoin> queryResult = null;
  422. // 如果天数差大于100天
  423. if (daysBetween > 100) {
  424. if (1 == updateType) {
  425. return statisticsMapper.getMediuConsumeCoin(searchStartTime, searchEndTime);
  426. } else if (0 == updateType) {
  427. return statisticsMapper.getMediuPayCoin(searchStartTime, searchEndTime);
  428. }
  429. }
  430. // 如果天数差为0,即同一天
  431. else if (daysBetween == 0) {
  432. if (1 == updateType) {
  433. queryResult = statisticsMapper.getMediuConsumeCoinday(searchEndTime, updateType);
  434. } else if (0 == updateType) {
  435. queryResult = statisticsMapper.getMediuPayCoinday(searchEndTime, updateType);
  436. }
  437. }
  438. // 如果天数差小于100天,但不为0(即跨月或较短时间段)
  439. else {
  440. if (1 == updateType) {
  441. queryResult = statisticsMapper.getMediuCounsumeCoinyue(searchStartTime, searchEndTime);
  442. } else if (0 == updateType) {
  443. queryResult = statisticsMapper.getMediuPayCoinyue(searchStartTime, searchEndTime);
  444. }
  445. }
  446. // 创建一个日期范围列表,返回给定时间范围内的所有日期
  447. List<Date> allDates = getDateRange(searchStartTime, searchEndTime);
  448. // 将查询结果按日期映射,方便查找
  449. Map<String, SumCoin> resultMap = new HashMap<>();
  450. if (queryResult != null) {
  451. for (SumCoin coin : queryResult) {
  452. resultMap.put(coin.getDay(), coin);
  453. }
  454. }
  455. // 填充没有数据的日期,生成完整的结果.对于每个日期,检查是否有查询结果。如果没有数据,调用 createDefaultSumCoin 方法创建一个默认的 SumCoin 对象,确保所有日期都有数据。
  456. for (Date date : allDates) {
  457. String dateString = new SimpleDateFormat("yyyy-MM-dd").format(date);
  458. if (!resultMap.containsKey(dateString)) {
  459. result.add(createDefaultSumCoin(dateString));
  460. } else {
  461. result.add(resultMap.get(dateString));
  462. }
  463. }
  464. return result;
  465. }
  466. // 获取日期范围的所有日期
  467. private List<Date> getDateRange(Date startDate, Date endDate) {
  468. List<Date> dates = new ArrayList<>();
  469. Calendar startCal = Calendar.getInstance();
  470. startCal.setTime(startDate);
  471. Calendar endCal = Calendar.getInstance();
  472. endCal.setTime(endDate);
  473. while (!startCal.after(endCal)) {
  474. dates.add(startCal.getTime());
  475. startCal.add(Calendar.DAY_OF_YEAR, 1);
  476. }
  477. return dates;
  478. }
  479. // 创建默认的 SumCoin 对象,并设置日期
  480. private SumCoin createDefaultSumCoin(String date) {
  481. SumCoin defaultSumCoin = new SumCoin();
  482. defaultSumCoin.setRechargeSumCoin(BigDecimal.ZERO);
  483. defaultSumCoin.setFreeSumCoin(BigDecimal.ZERO);
  484. defaultSumCoin.setTaskSumCoin(BigDecimal.ZERO);
  485. defaultSumCoin.setDay(date);
  486. return defaultSumCoin;
  487. }
  488. }