AmsAirdropProjectServiceImpl.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package com.ichaoj.ams.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollectionUtil;
  4. import cn.hutool.core.comparator.CompareUtil;
  5. import cn.hutool.core.math.MathUtil;
  6. import cn.hutool.core.util.StrUtil;
  7. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  8. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.ichaoj.ams.constant.AmsConstant;
  11. import com.ichaoj.ams.entity.AmsAirdropProject;
  12. import com.ichaoj.ams.entity.AmsAirdropTask;
  13. import com.ichaoj.ams.entity.AmsExecuteRecord;
  14. import com.ichaoj.ams.entity.AmsTradeRecord;
  15. import com.ichaoj.ams.mapper.AmsAirdropProjectMapper;
  16. import com.ichaoj.ams.request.airdrop.CreateAirdropProject;
  17. import com.ichaoj.ams.request.airdrop.PageProjectRequest;
  18. import com.ichaoj.ams.request.airdrop.UpdateAirdropProject;
  19. import com.ichaoj.ams.response.airdrop.AirdropProjectResponse;
  20. import com.ichaoj.ams.response.record.TradeRecordResponse;
  21. import com.ichaoj.ams.response.statistics.PredictCostResponse;
  22. import com.ichaoj.ams.service.IAmsAirdropProjectService;
  23. import com.ichaoj.ams.service.IAmsAirdropTaskService;
  24. import com.ichaoj.ams.service.IAmsExecuteRecordService;
  25. import com.ichaoj.ams.service.IAmsTradeRecordService;
  26. import com.ichaoj.common.model.PublicPage;
  27. import com.ichaoj.common.model.PublicUserInfo;
  28. import com.ichaoj.mybatis.service.SuperWhaleServiceImpl;
  29. import com.ichaoj.web.context.SuperWhaleContext;
  30. import org.springframework.context.annotation.Lazy;
  31. import org.springframework.stereotype.Service;
  32. import javax.annotation.Resource;
  33. import java.math.BigDecimal;
  34. import java.time.LocalDateTime;
  35. import java.util.List;
  36. import java.util.stream.Collectors;
  37. /**
  38. * <p>
  39. * 空投项目 服务实现类
  40. * </p>
  41. *
  42. * @author cjwen
  43. * @since 2023-05-10
  44. */
  45. @Service
  46. public class AmsAirdropProjectServiceImpl extends SuperWhaleServiceImpl<AmsAirdropProjectMapper, AmsAirdropProject> implements IAmsAirdropProjectService {
  47. @Resource
  48. private IAmsAirdropTaskService taskService;
  49. @Resource
  50. @Lazy
  51. private IAmsExecuteRecordService executeRecordService;
  52. @Resource
  53. @Lazy
  54. private IAmsTradeRecordService tradeRecordService;
  55. @Override
  56. public PublicPage<AirdropProjectResponse> pageAirdropProject(PageProjectRequest projectRequest) {
  57. LambdaQueryWrapper<AmsAirdropProject> wrapper = Wrappers.lambdaQuery();
  58. wrapper
  59. .eq(StrUtil.isNotBlank(projectRequest.getQueryValue()), AmsAirdropProject::getProjectUrl, projectRequest.getQueryValue())
  60. .or().like(StrUtil.isNotBlank(projectRequest.getQueryValue()), AmsAirdropProject::getProjectName, projectRequest.getQueryValue())
  61. .orderByDesc(AmsAirdropProject::getCreateTime);
  62. Page<AmsAirdropProject> result = this.page(this.buildPageObj(projectRequest), wrapper);
  63. return this.convertPublicPage(result, project -> {
  64. AirdropProjectResponse response = BeanUtil.copyProperties(project, AirdropProjectResponse.class);
  65. List<AmsExecuteRecord> list = executeRecordService.list(
  66. new LambdaQueryWrapper<AmsExecuteRecord>()
  67. .eq(AmsExecuteRecord::getExecuteStatus, 1)
  68. .eq(AmsExecuteRecord::getProjectId, project.getAmsProjectId())
  69. .eq(AmsExecuteRecord::getUserId, SuperWhaleContext.getContext(PublicUserInfo.class).getUserId())
  70. );
  71. if (CollectionUtil.isNotEmpty(list)) {
  72. List<AmsTradeRecord> records = tradeRecordService.listByIds(list.stream().map(AmsExecuteRecord::getExecuteId).collect(Collectors.toList()));
  73. double totalGas = records.stream().mapToDouble(t -> Double.parseDouble(t.getGas())).sum();
  74. response.setTotalGas(BigDecimal.valueOf(totalGas));
  75. } else {
  76. response.setTotalGas(BigDecimal.ZERO);
  77. }
  78. List<AmsAirdropTask> tasks = taskService.list(new LambdaQueryWrapper<AmsAirdropTask>()
  79. .eq(AmsAirdropTask::getAirdropProjectId, project.getAmsProjectId()));
  80. if (CollectionUtil.isNotEmpty(tasks)) {
  81. long sum = tasks.stream().mapToLong(AmsAirdropTask::getPlanTimes).sum();
  82. response.setTaskTotalCount(sum);
  83. long finishCount = executeRecordService.count(
  84. new LambdaQueryWrapper<AmsExecuteRecord>()
  85. .eq(AmsExecuteRecord::getExecuteStatus, 1)
  86. .in(AmsExecuteRecord::getTaskId, tasks.stream()
  87. .map(AmsAirdropTask::getAmsTaskId)
  88. .collect(Collectors.toList()))
  89. );
  90. response.setTaskFinishCount(finishCount);
  91. } else {
  92. response.setTaskTotalCount(0);
  93. response.setTaskFinishCount(0);
  94. }
  95. return response;
  96. });
  97. }
  98. @Override
  99. public void createAirdropProject(CreateAirdropProject createAirdropProject) {
  100. AmsAirdropProject project = BeanUtil.copyProperties(createAirdropProject, AmsAirdropProject.class);
  101. project.setCreateTime(LocalDateTime.now());
  102. project.setStatus(AmsConstant.AirdropStatus.NOT_STARTED);
  103. this.save(project);
  104. // List<String> taskIds = createAirdropProject.getTaskIds();
  105. // if (CollectionUtil.isNotEmpty(taskIds)) {
  106. // List<AmsAirdropTask> tasks = taskService.listByIds(taskIds)
  107. // .stream()
  108. // .peek(t -> t.setAirdropProjectId(project.getAmsProjectId()))
  109. // .collect(Collectors.toList());
  110. // taskService.updateBatchById(tasks);
  111. // }
  112. }
  113. @Override
  114. public void updateAirdropProject(UpdateAirdropProject updateAirdropProject) {
  115. AmsAirdropProject project = BeanUtil.copyProperties(updateAirdropProject, AmsAirdropProject.class);
  116. project.setUpdateTime(LocalDateTime.now());
  117. this.updateById(project);
  118. List<UpdateAirdropProject.Task> taskList = updateAirdropProject.getTasks();
  119. if (CollectionUtil.isEmpty(taskList)) {
  120. return;
  121. }
  122. List<AmsAirdropTask> tasks = taskService.listByIds(taskList.stream().map(UpdateAirdropProject.Task::getTaskId).collect(Collectors.toList()));
  123. if (CollectionUtil.isNotEmpty(tasks)) {
  124. for (AmsAirdropTask task : tasks) {
  125. for (UpdateAirdropProject.Task t : taskList) {
  126. if (task.getAmsTaskId().equals(t.getTaskId())) {
  127. task.setTaskName(t.getTaskName());
  128. taskService.updateById(task);
  129. }
  130. }
  131. }
  132. }
  133. }
  134. @Override
  135. public PredictCostResponse predictCostStatistics() {
  136. List<AmsAirdropProject> list = this.list();
  137. PredictCostResponse response = new PredictCostResponse();
  138. response.setTotalCount(list.size());
  139. response.setTotalCost(BigDecimal.valueOf(list.stream().mapToDouble(p -> Double.parseDouble(p.getEstimatedCost())).sum()));
  140. List<PredictCostResponse.Predict> predicts = BeanUtil.copyToList(list, PredictCostResponse.Predict.class);
  141. response.setPredicts(predicts.stream().sorted((p1, p2) -> CompareUtil.compare(p2.getEstimatedCost(), p1.getEstimatedCost())).collect(Collectors.toList()));
  142. List<TradeRecordResponse> tradeList = tradeRecordService.listByUserId(SuperWhaleContext.getContext(PublicUserInfo.class).getUserId());
  143. response.setActualCost(BigDecimal.valueOf(tradeList.stream().mapToDouble(t -> Double.sum(Double.parseDouble(t.getGas()), Double.parseDouble(t.getAmount()))).sum()));
  144. return response;
  145. }
  146. }