licailing 4 лет назад
Родитель
Сommit
be52a8bfba

+ 7 - 0
src/main/java/com/izouma/nineth/dto/InvitePhoneDTO.java

@@ -7,12 +7,16 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.beans.BeanUtils;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
 public class InvitePhoneDTO {
+    @ExcelProperty("用户ID")
+    private Long id;
+
     @ExcelProperty(value = "昵称")
     private String nickname;
 
@@ -25,6 +29,9 @@ public class InvitePhoneDTO {
     @ExcelProperty("邀请人")
     private String invitorName;
 
+    @ExcelProperty("消费总额")
+    private BigDecimal total;
+
     public InvitePhoneDTO(User user) {
         BeanUtils.copyProperties(user, this);
     }

+ 4 - 0
src/main/java/com/izouma/nineth/repo/TokenHistoryRepo.java

@@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.util.Collection;
 import java.util.List;
 
 public interface TokenHistoryRepo extends JpaRepository<TokenHistory, Long>, JpaSpecificationExecutor<TokenHistory> {
@@ -26,6 +27,9 @@ public interface TokenHistoryRepo extends JpaRepository<TokenHistory, Long>, Jpa
     @Query("select t from TokenHistory t where t.toUserId = ?1 or t.fromUserId = ?1 order by t.createdAt desc")
     List<TokenHistory> userHistory(Long userId);
 
+    @Query("select t from TokenHistory t where t.toUserId in ?1")
+    List<TokenHistory> userBuy(Collection<Long> userId);
+
     @Transactional
     @Modifying
     int deleteByTokenId(String tokenId);

+ 28 - 0
src/main/java/com/izouma/nineth/service/UserService.java

@@ -4,6 +4,7 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.izouma.nineth.TokenHistory;
 import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.domain.Follow;
 import com.izouma.nineth.domain.IdentityAuth;
@@ -30,6 +31,7 @@ import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -43,6 +45,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import javax.persistence.criteria.Predicate;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.regex.Pattern;
@@ -70,6 +73,7 @@ public class UserService {
     private NFTService         nftService;
     private CacheService       cacheService;
     private ApplicationContext context;
+    private TokenHistoryRepo   tokenHistoryRepo;
 
     public User update(User user) {
         User orig = userRepo.findById(user.getId()).orElseThrow(new BusinessException("无记录"));
@@ -536,4 +540,28 @@ public class UserService {
         map.put("success", success);
         return map;
     }
+
+    public Map<String, Object> invite(PageQuery pageQuery) {
+        Page<User> all = this.all(pageQuery);
+
+        List<Long> userIds = all.map(User::getId).getContent();
+        List<TokenHistory> page = tokenHistoryRepo.userBuy(userIds);
+        Map<Long, BigDecimal> buy = page.stream()
+                .collect(Collectors.groupingBy(TokenHistory::getToUserId,
+                        Collectors.mapping(TokenHistory::getPrice,
+                                Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+
+        Page<InvitePhoneDTO> users = all.map(user -> {
+            InvitePhoneDTO dto = new InvitePhoneDTO(user);
+            dto.setTotal(buy.get(user.getId()) == null ? BigDecimal.ZERO : buy.get(user.getId()));
+            return dto;
+        });
+
+        BigDecimal total = buy.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("user", users);
+        map.put("total", total);
+        return map;
+    }
 }

+ 10 - 4
src/main/java/com/izouma/nineth/web/UserController.java

@@ -245,10 +245,16 @@ public class UserController extends BaseController {
     @PostMapping("/exportInvite")
     @ResponseBody
     public void exportInvite(HttpServletResponse response, @RequestBody PageQuery pageQuery) throws IOException {
-        List<InvitePhoneDTO> data = userService.all(pageQuery)
-                .map(InvitePhoneDTO::new)
-                .getContent();
-        ExcelUtils.export(response, data);
+//        List<InvitePhoneDTO> data = userService.all(pageQuery)
+//                .map(InvitePhoneDTO::new)
+//                .getContent();
+        Page<InvitePhoneDTO> user = (Page<InvitePhoneDTO>) this.invite(pageQuery).get("user");
+        ExcelUtils.export(response, user.getContent());
+    }
+
+    @PostMapping("/invite")
+    public Map<String, Object> invite(@RequestBody PageQuery pageQuery) {
+        return userService.invite(pageQuery);
     }
 }
 

+ 6 - 3
src/main/vue/src/views/InviteList.vue

@@ -99,12 +99,14 @@
                     @input="getInviteInfo"
                     size="mini"
                 ></created-at-picker>
+                <span style="margin-right: 24px; float: right">消费总额:{{ total }}</span>
             </div>
             <el-table :data="list" v-loading="dialogLoading" height="60vh">
                 <el-table-column prop="id" label="ID" width="80"></el-table-column>
                 <el-table-column prop="nickname" label="昵称"></el-table-column>
                 <el-table-column prop="phone" label="手机"></el-table-column>
                 <el-table-column prop="createdAt" label="注册时间"></el-table-column>
+                <el-table-column prop="total" label="消费总额" min-width="60"></el-table-column>
             </el-table>
         </el-dialog>
 
@@ -134,7 +136,8 @@ export default {
             showCodeDialog: false,
             codeValue: 'Hello, World!',
             inviteCode: '',
-            createdAt: ''
+            createdAt: '',
+            total: 0
         };
     },
     computed: {
@@ -227,12 +230,12 @@ export default {
             this.dialogLoading = true;
             this.$http
                 .post(
-                    '/user/all',
+                    '/user/invite',
                     { size: 10000, sort: 'id,desc', query: { inviteCode: this.inviteCode, createdAt: this.createdAt } },
                     { body: 'json' }
                 )
                 .then(res => {
-                    this.list = res.content;
+                    this.list = res['user'].content;
                     this.dialogLoading = false;
                 });
         },