wangqifan пре 3 година
родитељ
комит
af1f91e999

+ 10 - 0
src/main/java/com/izouma/nineth/repo/BalanceRecordRepo.java

@@ -6,7 +6,9 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
 
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.List;
 import java.util.Optional;
 import java.util.Optional;
@@ -21,4 +23,12 @@ public interface BalanceRecordRepo extends JpaRepository<BalanceRecord, Long>, J
     BalanceRecord findByOrderIdAndType(Long orderId, BalanceType type);
     BalanceRecord findByOrderIdAndType(Long orderId, BalanceType type);
 
 
     List<BalanceRecord> findByType(BalanceType type);
     List<BalanceRecord> findByType(BalanceType type);
+
+    List<BalanceRecord> findByTypeAndCreatedAtBetween(BalanceType type, LocalDateTime start, LocalDateTime end);
+
+    @Query("select sum(b.amount) from BalanceRecord b where b.type = 'RECHARGE' and b.del = false ")
+    BigDecimal sumRechargeAll();
+
+    @Query("select sum(b.amount) from BalanceRecord b where b.type = 'RECHARGE' and b.del = false and b.time <?2 and b.time >?1")
+    BigDecimal sumRechargeToday(LocalDateTime start, LocalDateTime end);
 }
 }

+ 25 - 8
src/main/java/com/izouma/nineth/service/StatisticService.java

@@ -2,17 +2,19 @@ package com.izouma.nineth.service;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.izouma.nineth.domain.BalanceRecord;
 import com.izouma.nineth.domain.Order;
 import com.izouma.nineth.domain.Order;
+import com.izouma.nineth.domain.RechargeOrder;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.domain.User;
+import com.izouma.nineth.enums.BalanceType;
 import com.izouma.nineth.enums.CollectionSource;
 import com.izouma.nineth.enums.CollectionSource;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
-import com.izouma.nineth.repo.OrderRepo;
-import com.izouma.nineth.repo.TokenHistoryRepo;
-import com.izouma.nineth.repo.UserRepo;
+import com.izouma.nineth.repo.*;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.xml.stream.events.EndDocument;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
@@ -26,9 +28,10 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 @AllArgsConstructor
 public class StatisticService {
 public class StatisticService {
 
 
-    private UserRepo         userRepo;
-    private OrderRepo        orderRepo;
-    private TokenHistoryRepo tokenHistoryRepo;
+    private UserRepo          userRepo;
+    private OrderRepo         orderRepo;
+    private TokenHistoryRepo  tokenHistoryRepo;
+    private BalanceRecordRepo balanceRecordRepo;
 
 
     public Map<String, Object> total(Long userId, Long companyId) {
     public Map<String, Object> total(Long userId, Long companyId) {
         User user1 = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("无用户"));
         User user1 = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("无用户"));
@@ -39,6 +42,8 @@ public class StatisticService {
             long user = userRepo.countAllByDelFalse();
             long user = userRepo.countAllByDelFalse();
             total.put("userNum", user);
             total.put("userNum", user);
             orders = orderRepo.findAllByStatusAndCompanyId(OrderStatus.FINISH, companyId);
             orders = orderRepo.findAllByStatusAndCompanyId(OrderStatus.FINISH, companyId);
+            BigDecimal allRecharged = balanceRecordRepo.sumRechargeAll();
+            total.put("rechargePrice", allRecharged);
         } else {
         } else {
             orders = orderRepo.findAllByStatusAndMinterId(OrderStatus.FINISH, userId);
             orders = orderRepo.findAllByStatusAndMinterId(OrderStatus.FINISH, userId);
         }
         }
@@ -132,9 +137,20 @@ public class StatisticService {
 
 
         User user = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("无用户"));
         User user = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("无用户"));
         List<Order> orders;
         List<Order> orders;
+        Map<String, Map<String, BigDecimal>> trend = new HashMap<>();
         if (user.isAdmin()) {
         if (user.isAdmin()) {
             orders = orderRepo.findAllByCreatedAtIsAfterAndStatusInAndCompanyId(start,
             orders = orderRepo.findAllByCreatedAtIsAfterAndStatusInAndCompanyId(start,
                     Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH), companyId);
                     Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH), companyId);
+            List<BalanceRecord> balanceRecords = balanceRecordRepo
+                    .findByTypeAndCreatedAtBetween(BalanceType.RECHARGE, start, LocalDateTime.now());
+            Map<String, BigDecimal> recharged = null;
+            if (balanceRecords.size() > 0) {
+                recharged = balanceRecords.stream()
+                        .collect(Collectors.groupingBy(item -> DateTimeFormatter.ofPattern("yyyy-MM-dd")
+                                .format(item.getCreatedAt()), Collectors.mapping(BalanceRecord::getAmount,
+                                Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+            }
+            trend.put("recharged", recharged);
         } else {
         } else {
             orders = orderRepo.findAllByCreatedAtIsAfterAndMinterIdAndStatusIn(start, userId,
             orders = orderRepo.findAllByCreatedAtIsAfterAndMinterIdAndStatusIn(start, userId,
                     Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH));
                     Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH));
@@ -161,7 +177,6 @@ public class StatisticService {
                                     Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
                                     Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
         }
         }
 
 
-        Map<String, Map<String, BigDecimal>> trend = new HashMap<>();
         trend.put("official", official);
         trend.put("official", official);
         trend.put("transfer", transfer);
         trend.put("transfer", transfer);
         return trend;
         return trend;
@@ -179,14 +194,16 @@ public class StatisticService {
 
 
         User user = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("无用户"));
         User user = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("无用户"));
         List<Order> orders;
         List<Order> orders;
+        Map<String, BigDecimal> map = new HashMap<>();
         if (user.isAdmin()) {
         if (user.isAdmin()) {
             orders = orderRepo.findAllByCreatedAtBetweenAndStatusInAndCompanyId(start, end,
             orders = orderRepo.findAllByCreatedAtBetweenAndStatusInAndCompanyId(start, end,
                     Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH), companyId);
                     Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH), companyId);
+            BigDecimal allRecharged = balanceRecordRepo.sumRechargeToday(start, end);
+            map.put("recharged", allRecharged);
         } else {
         } else {
             orders = orderRepo.findAllByCreatedAtBetweenAndMinterIdAndStatusIn(start, end, userId,
             orders = orderRepo.findAllByCreatedAtBetweenAndMinterIdAndStatusIn(start, end, userId,
                     Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH));
                     Arrays.asList(OrderStatus.PROCESSING, OrderStatus.FINISH));
         }
         }
-        Map<String, BigDecimal> map = new HashMap<>();
         map.put("official", orders.stream().filter(order -> order.getSource().equals(CollectionSource.OFFICIAL))
         map.put("official", orders.stream().filter(order -> order.getSource().equals(CollectionSource.OFFICIAL))
                 .map(Order::getPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
                 .map(Order::getPrice).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
         map.put("transfer", orders.stream().filter(order -> order.getSource().equals(CollectionSource.TRANSFER))
         map.put("transfer", orders.stream().filter(order -> order.getSource().equals(CollectionSource.TRANSFER))

+ 5 - 3
src/main/vue/src/widgets/MonthWidget.vue

@@ -17,10 +17,11 @@
         </template>
         </template>
         <div class="box-content">
         <div class="box-content">
             <div class="box">
             <div class="box">
-                <div class="text1">官方销售额/二手市场</div>
+                <div class="text1">官方销售额/二手市场/充值金额</div>
                 <div class="text2">
                 <div class="text2">
                     <span v-html="getNum(order.official, true)"></span>/
                     <span v-html="getNum(order.official, true)"></span>/
-                    <span v-html="getNum(order.transfer, true)"></span>
+                    <span v-html="getNum(order.transfer, true)"></span>/
+                    <span v-html="getNum(order.recharged, true)"></span>
                 </div>
                 </div>
             </div>
             </div>
             <div class="box">
             <div class="box">
@@ -46,7 +47,8 @@ export default {
             user: 0,
             user: 0,
             order: {
             order: {
                 official: 0,
                 official: 0,
-                transfer: 0
+                transfer: 0,
+                recharged: 0
             }
             }
         };
         };
     },
     },

+ 14 - 6
src/main/vue/src/widgets/PieChartWidget.vue

@@ -17,9 +17,10 @@
         </template>
         </template>
         <div class="box-content" ref="box">
         <div class="box-content" ref="box">
             <div class="box">
             <div class="box">
-                <div class="text1">官方销售额/二手市场</div>
+                <div class="text1">官方销售额/二手市场/充值金额</div>
                 <div class="text2">
                 <div class="text2">
                     <span v-html="getNum(official, true)"></span>/ <span v-html="getNum(transfer, true)"></span>
                     <span v-html="getNum(official, true)"></span>/ <span v-html="getNum(transfer, true)"></span>
+                    / <span v-html="getNum(recharged, true)"></span>
                 </div>
                 </div>
             </div>
             </div>
             <div class="box">
             <div class="box">
@@ -35,7 +36,7 @@
 <script>
 <script>
 import WidgetCard from './WidgetCard';
 import WidgetCard from './WidgetCard';
 import VueCharts from 'vue-chartjs';
 import VueCharts from 'vue-chartjs';
-import { format } from 'date-fns';
+import {format} from 'date-fns';
 import acc from '../mixins/acc';
 import acc from '../mixins/acc';
 import addDays from 'date-fns/esm/addDays';
 import addDays from 'date-fns/esm/addDays';
 
 
@@ -50,6 +51,7 @@ export default {
             },
             },
             official: 0,
             official: 0,
             transfer: 0,
             transfer: 0,
+            recharged: 0,
             officialNum: 0,
             officialNum: 0,
             transferNum: 0,
             transferNum: 0,
             value: '',
             value: '',
@@ -97,7 +99,7 @@ export default {
                             this.config = {
                             this.config = {
                                 type: 'doughnut',
                                 type: 'doughnut',
                                 data: {
                                 data: {
-                                    labels: ['官方销售额', '二手市场销售额'],
+                                    labels: ['官方销售额', '二手市场销售额', '充值金额'],
                                     datasets: []
                                     datasets: []
                                 },
                                 },
                                 options: {
                                 options: {
@@ -116,11 +118,12 @@ export default {
             this.transferNum = this.numInfo.transfer ? this.numInfo.transfer[value] || 0 : 0;
             this.transferNum = this.numInfo.transfer ? this.numInfo.transfer[value] || 0 : 0;
             this.official = this.priceInfo.official ? this.priceInfo.official[value] || 0 : 0;
             this.official = this.priceInfo.official ? this.priceInfo.official[value] || 0 : 0;
             this.transfer = this.priceInfo.transfer ? this.priceInfo.transfer[value] || 0 : 0;
             this.transfer = this.priceInfo.transfer ? this.priceInfo.transfer[value] || 0 : 0;
+            this.recharged = this.priceInfo.recharged ? this.priceInfo.recharged[value] || 0 : 0;
             this.config.data.datasets = [
             this.config.data.datasets = [
                 {
                 {
                     title: '销售额',
                     title: '销售额',
-                    backgroundColor: ['#FEB30E', '#FF7970'],
-                    data: [this.official, this.transfer]
+                    backgroundColor: ['#FEB30E', '#FF7970', '#0000FF'],
+                    data: [this.official, this.transfer, this.recharged]
                 }
                 }
             ];
             ];
             this.myChart.update();
             this.myChart.update();
@@ -145,6 +148,7 @@ export default {
     align-self: stretch;
     align-self: stretch;
     padding: 30px;
     padding: 30px;
 }
 }
+
 .box {
 .box {
     padding: 0 20px;
     padding: 0 20px;
     height: 125px;
     height: 125px;
@@ -156,6 +160,7 @@ export default {
     justify-content: center;
     justify-content: center;
     min-width: 153px;
     min-width: 153px;
     box-sizing: border-box;
     box-sizing: border-box;
+
     .text1 {
     .text1 {
         font-size: 14px;
         font-size: 14px;
         font-weight: bold;
         font-weight: bold;
@@ -163,6 +168,7 @@ export default {
         line-height: 20px;
         line-height: 20px;
         white-space: nowrap;
         white-space: nowrap;
     }
     }
+
     .text2 {
     .text2 {
         color: #feb30e;
         color: #feb30e;
         font-size: 22px;
         font-size: 22px;
@@ -170,7 +176,8 @@ export default {
         line-height: 29px;
         line-height: 29px;
         margin-top: 2px;
         margin-top: 2px;
         white-space: nowrap;
         white-space: nowrap;
-        /deep/small {
+
+        /deep/ small {
             font-size: 12px;
             font-size: 12px;
         }
         }
     }
     }
@@ -181,6 +188,7 @@ export default {
         }
         }
     }
     }
 }
 }
+
 .header {
 .header {
     display: flex;
     display: flex;
     justify-content: space-between;
     justify-content: space-between;

+ 9 - 3
src/main/vue/src/widgets/PriceWidget.vue

@@ -2,14 +2,18 @@
     <widget-card :bodyStyle="bodyStyle">
     <widget-card :bodyStyle="bodyStyle">
         <i class="fa-fw fas fa-shopping-basket fa-3x" style="color: #40c9c6;"></i>
         <i class="fa-fw fas fa-shopping-basket fa-3x" style="color: #40c9c6;"></i>
         <div class="info">
         <div class="info">
-            <div class="text">官方交易额/二手市场(万元)</div>
-            <div class="num">{{ getNum(info.officialPrice || 0) }}/{{ getNum(info.transferPrice || 0) }}</div>
+            <div class="text">官方交易额/二手市场/充值金额(万元)</div>
+            <div class="num">{{ getNum(info.officialPrice || 0) }}/
+                {{ getNum(info.transferPrice || 0) }}/
+                {{ getNum(info.rechargePrice || 0) }}
+            </div>
         </div>
         </div>
     </widget-card>
     </widget-card>
 </template>
 </template>
 <script>
 <script>
 import WidgetCard from './WidgetCard';
 import WidgetCard from './WidgetCard';
 import acc from '../mixins/acc';
 import acc from '../mixins/acc';
+
 export default {
 export default {
     props: {
     props: {
         info: {
         info: {
@@ -21,7 +25,7 @@ export default {
     },
     },
     computed: {
     computed: {
         total() {
         total() {
-            return this.accAdd(this.info.officialPrice || 0, this.info.transferPrice || 0);
+            return this.accAdd(this.info.officialPrice || 0, this.info.transferPrice || 0, this.info.rechargePrice || 0);
         }
         }
     },
     },
     mixins: [acc],
     mixins: [acc],
@@ -42,11 +46,13 @@ export default {
 .info {
 .info {
     flex-grow: 1;
     flex-grow: 1;
     text-align: right;
     text-align: right;
+
     .text {
     .text {
         color: #999;
         color: #999;
         font-size: 16px;
         font-size: 16px;
         margin-bottom: 12px;
         margin-bottom: 12px;
     }
     }
+
     .num {
     .num {
         font-size: 20px;
         font-size: 20px;
         color: #333;
         color: #333;