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

300 lines
12 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. package com.example.demo.serviceImpl;
  2. import java.util.Calendar;
  3. import java.util.Date;
  4. import java.util.List;
  5. import java.util.concurrent.TimeUnit;
  6. import com.example.demo.Util.CheckIfNullUtil;
  7. import com.example.demo.domain.vo.Meium;
  8. import com.example.demo.domain.vo.Statistics;
  9. import com.example.demo.domain.vo.Statisticss;
  10. import com.example.demo.domain.vo.SumCoin;
  11. import com.example.demo.mapper.StatisticsMapper;
  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. @Cacheable(key="#root.method.name")
  32. @Override
  33. public Statistics getStatistics() {
  34. Statistics statistics = new Statistics();
  35. // 全年累计数据
  36. Statistics yearStats = CheckIfNullUtil.defaultIfNull( statisticsMapper.getTotalYearCoin(), new Statistics());
  37. statistics.setRechargeSumCoin(yearStats.getRechargeSumCoin());
  38. statistics.setFreeSumCoin(yearStats.getFreeSumCoin());
  39. statistics.setTaskSumCoin(yearStats.getTaskSumCoin());
  40. statistics.setTotalSumCoin(yearStats.getTotalSumCoin());
  41. // 昨日新增数据
  42. Statistics yesterdayStats = CheckIfNullUtil.defaultIfNull( statisticsMapper.getYesterdayNewCoin(), new Statistics());
  43. statistics.setRechargeYesterdaySumCoin(yesterdayStats.getRechargeYesterdaySumCoin());
  44. statistics.setFreeYesterdaySumCoin(yesterdayStats.getFreeYesterdaySumCoin());
  45. statistics.setTaskYesterdaySumCoin(yesterdayStats.getTaskYesterdaySumCoin());
  46. statistics.setTotalYesterdaySumCoin(yesterdayStats.getTotalYesterdaySumCoin());
  47. // 年累计充值人数
  48. statistics.setRechargeCount(statisticsMapper.getYearRechargeCount());
  49. // 本周和上周充值人数
  50. int thisWeekCount = statisticsMapper.getRechargeCountThisWeek();
  51. int lastWeekCount = statisticsMapper.getRechargeCountLastWeek();
  52. statistics.setRechargeCountThisWeek(thisWeekCount);
  53. statistics.setRechargeCountLastWeek(lastWeekCount);
  54. // 周同比计算
  55. BigDecimal weekOverWeekRate = BigDecimal.ZERO;//初始化为 0 表示如果没有足够的数据(如 lastWeekCount == 0),默认周同比增长率为 0。
  56. if (lastWeekCount > 0) {
  57. weekOverWeekRate = BigDecimal.valueOf((double) (thisWeekCount - lastWeekCount) / lastWeekCount * 100)//将计算结果转换为 BigDecimal 类型,保证高精度。
  58. .setScale(2, BigDecimal.ROUND_HALF_UP); // 保留两位小数
  59. }
  60. statistics.setWeekOverWeekRate(weekOverWeekRate);
  61. //今日和昨日充值人数
  62. int todayCount = statisticsMapper.getRechargeCountToday();
  63. int yesterdayCount = statisticsMapper.getRechargeCountYesterday();
  64. int firstYesterdayCount =statisticsMapper.getFirstRechargeCountYesterday();
  65. statistics.setRechargeCountToday(todayCount);
  66. statistics.setRechargeCountYesterday(yesterdayCount);
  67. statistics.setFirstRechargeCountYesterday(firstYesterdayCount);
  68. //日环比计算
  69. BigDecimal dayOverDayRate = BigDecimal.ZERO;
  70. if (yesterdayCount > 0) {
  71. dayOverDayRate = BigDecimal.valueOf((double) (todayCount - yesterdayCount) / yesterdayCount * 100).
  72. setScale(2, BigDecimal.ROUND_HALF_UP);
  73. }
  74. statistics.setDayOverDayRate(dayOverDayRate);
  75. return statistics;
  76. }
  77. @Cacheable(key="#root.method.name")
  78. @Override
  79. public Statisticss stats() {
  80. Statisticss a = new Statisticss();
  81. a.setCoinSystemSum(statisticsMapper.getCoinSystemSum());
  82. a.setERPSum(statisticsMapper.getERPSum());
  83. a.setHomilyChartSum(statisticsMapper.getHomilyChartSum());
  84. a.setHomilyLinkSum(statisticsMapper.getHomilyLinkSum());
  85. return a;
  86. }
  87. //----------------------------------------------------------------------------------------------------//
  88. @Cacheable(key="#root.method.name")
  89. public SumCoin getSumCoin(){
  90. return statisticsMapper.getSumCoin();
  91. }
  92. @Cacheable(key="#root.method.name")
  93. @Override
  94. public SumCoin getYearConsumeCoin() {
  95. return statisticsMapper.getYearConsumeCoin();
  96. }
  97. @Cacheable(key="#root.method.name")
  98. @Override
  99. public SumCoin getDayConsumeCoin() {
  100. return statisticsMapper.getDayConsumeCoin();
  101. }
  102. @Override
  103. public List<SumCoin> getMediuPayCoin() {
  104. return List.of();
  105. }
  106. @Override
  107. public List<SumCoin> getMediuConsumeCoin() {
  108. return List.of();
  109. }
  110. public SumCoin getMess(Integer jwcode){
  111. return statisticsMapper.getMess(jwcode);
  112. }
  113. @Cacheable(key="#root.method.name")
  114. @Override
  115. public List<SumCoin> getMediumAreaPay() {
  116. return statisticsMapper.getMediumAreaPay();
  117. }
  118. @Cacheable(key="#root.method.name")
  119. @Override
  120. public List<SumCoin> getMediumAreaConsume() {
  121. return statisticsMapper.getMediumAreaConsume();
  122. }
  123. @Override
  124. public List<Meium> getMee( Meium meium) {
  125. if(0 == (meium.getUpdateType())){
  126. if("免费金币".equals(meium.getType())){
  127. return statisticsMapper.getBuyAndFree(meium.getSearchStartTime(),meium.getSearchEndTime());
  128. }else if("充值金币".equals(meium.getType())){
  129. return statisticsMapper.getBuyAndRecharge(meium.getSearchStartTime(),meium.getSearchEndTime());
  130. }else if("任务金币".equals(meium.getType())){
  131. return statisticsMapper.getBuyAndTask(meium.getSearchStartTime(),meium.getSearchEndTime());
  132. }else{
  133. return statisticsMapper.getBuy(meium.getSearchStartTime(),meium.getSearchEndTime());
  134. }
  135. }else if(1 == (meium.getUpdateType())){
  136. if("免费金币".equals(meium.getType())){
  137. return statisticsMapper.getPayAndFree(meium.getSearchStartTime(),meium.getSearchEndTime());
  138. }else if("充值金币".equals(meium.getType())){
  139. return statisticsMapper.getPayAndRecharge(meium.getSearchStartTime(),meium.getSearchEndTime());
  140. }else if("任务金币".equals(meium.getType())){
  141. return statisticsMapper.getPayAndTask(meium.getSearchStartTime(),meium.getSearchEndTime());
  142. }else{
  143. return statisticsMapper.getPay(meium.getSearchStartTime(),meium.getSearchEndTime());
  144. }
  145. } else
  146. return null;
  147. }
  148. @Override
  149. public List<SumCoin> getMediu() {
  150. return List.of();
  151. }
  152. // public List<SumCoin> getCoinTime( SumCoin sumcoin) {
  153. //
  154. // System.out.println(sumcoin+"-------sumcoin----");
  155. // Date searchStartTime=sumcoin.getSearchStartTime();
  156. // Date searchEndTime=sumcoin.getSearchEndTime();
  157. // String updateType=sumcoin.getUpdateType();
  158. //
  159. //// //提供开始时间与结束时间
  160. ////// if(searchStartTime!=null && searchEndTime!=null){
  161. //// //计算两个时间点之间的差值
  162. //// long daysBetween = ChronoUnit.DAYS.between(searchStartTime, searchEndTime);
  163. //
  164. //// 提供开始时间与结束时间
  165. //
  166. //
  167. // // 使用 Calendar 清除时间和时区的影响
  168. // Calendar startCal = Calendar.getInstance();
  169. // startCal.setTime(searchStartTime);
  170. // startCal.set(Calendar.HOUR_OF_DAY, 0);
  171. // startCal.set(Calendar.MINUTE, 0);
  172. // startCal.set(Calendar.SECOND, 0);
  173. // startCal.set(Calendar.MILLISECOND, 0);
  174. //
  175. // Calendar endCal = Calendar.getInstance();
  176. // endCal.setTime(searchEndTime);
  177. // endCal.set(Calendar.HOUR_OF_DAY, 0);
  178. // endCal.set(Calendar.MINUTE, 0);
  179. // endCal.set(Calendar.SECOND, 0);
  180. // endCal.set(Calendar.MILLISECOND, 0);
  181. //
  182. // // 计算两个时间点之间的天数差异
  183. // long diffInMillies = endCal.getTimeInMillis() - startCal.getTimeInMillis();
  184. // long daysBetween = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
  185. //
  186. //
  187. // //年
  188. // if(daysBetween>100 || searchStartTime==null & searchEndTime==null){
  189. // if("消费".equals(updateType)){
  190. // return statisticsMapper.getMediuConsumeCoin();
  191. // }else if("充值".equals(updateType)){
  192. // return statisticsMapper.getMediuPayCoin();
  193. // }
  194. //
  195. // }else {
  196. // if ("消费".equals(updateType)) {
  197. // return statisticsMapper.getMediuCounsumeCoinyue(searchStartTime,searchEndTime);
  198. // } else if ("充值".equals(updateType)) {
  199. // return statisticsMapper.getMediuPayCoinyue(searchStartTime,searchEndTime);
  200. // }
  201. // }
  202. //
  203. //
  204. //
  205. //
  206. //
  207. //
  208. // return null;
  209. //
  210. // }
  211. public List<SumCoin> getCoinTime(SumCoin sumcoin) {
  212. System.out.println(sumcoin + "-------sumcoin----");
  213. Date searchStartTime = sumcoin.getSearchStartTime();
  214. Date searchEndTime = sumcoin.getSearchEndTime();
  215. Integer updateType = sumcoin.getUpdateType();
  216. // 如果开始时间和结束时间都为空,则直接返回默认统计结果
  217. if (searchStartTime == null && searchEndTime == null) {
  218. if (1 == updateType) {
  219. return statisticsMapper.getMediuConsumeCoin(searchStartTime,searchEndTime);
  220. } else if (0 == updateType) {
  221. return statisticsMapper.getMediuPayCoin(searchStartTime,searchEndTime);
  222. }
  223. return null; // 或者抛出异常,取决于业务需求
  224. }
  225. // 如果只有其中一个时间为null,则可能需要处理或抛出异常,这里假设不允许这种情况
  226. if (searchStartTime == null || searchEndTime == null) {
  227. throw new IllegalArgumentException("开始时间和结束时间必须同时为空或不为空");
  228. }
  229. // 使用 Calendar 清除时间和时区的影响
  230. Calendar startCal = Calendar.getInstance();
  231. startCal.setTime(searchStartTime);
  232. startCal.set(Calendar.HOUR_OF_DAY, 0);
  233. startCal.set(Calendar.MINUTE, 0);
  234. startCal.set(Calendar.SECOND, 0);
  235. startCal.set(Calendar.MILLISECOND, 0);
  236. Calendar endCal = Calendar.getInstance();
  237. endCal.setTime(searchEndTime);
  238. endCal.set(Calendar.HOUR_OF_DAY, 0);
  239. endCal.set(Calendar.MINUTE, 0);
  240. endCal.set(Calendar.SECOND, 0);
  241. endCal.set(Calendar.MILLISECOND, 0);
  242. // 计算两个时间点之间的天数差异
  243. long diffInMillies = endCal.getTimeInMillis() - startCal.getTimeInMillis();
  244. long daysBetween = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
  245. // 根据条件选择查询方法
  246. if (daysBetween > 100) {
  247. if (1 == updateType) {
  248. return statisticsMapper.getMediuConsumeCoin(searchStartTime,searchEndTime);
  249. } else if (0 == updateType) {
  250. return statisticsMapper.getMediuPayCoin(searchStartTime,searchEndTime);
  251. }
  252. } else {
  253. if (1 == updateType) {
  254. return statisticsMapper.getMediuCounsumeCoinyue(searchStartTime, searchEndTime);
  255. } else if (0 == updateType) {
  256. return statisticsMapper.getMediuPayCoinyue(searchStartTime, searchEndTime);
  257. }
  258. }
  259. // 如果没有匹配的updateType,返回null或抛出异常,取决于业务需求
  260. return null;
  261. }
  262. }