From ca41616d33308050c52612177e515115f543de1b Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期四, 17 七月 2025 17:25:30 +0800
Subject: [PATCH] 财务数据汇总

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java |  254 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 246 insertions(+), 8 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java
index 5599104..a99449f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java
@@ -1,20 +1,37 @@
 package com.ruoyi.web.controller.api;
 
 
-import com.ruoyi.common.basic.PageInfo;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.framework.web.service.TokenService;
-import com.ruoyi.system.query.YcFinancialManagementQuery;
+import com.ruoyi.system.model.YcFinancialManagement;
+import com.ruoyi.system.model.YcRevenueExpenditureType;
+import com.ruoyi.system.query.DataStatisticsQuery;
 import com.ruoyi.system.service.YcFinancialManagementService;
 import com.ruoyi.system.service.YcRevenueExpenditureTypeService;
-import com.ruoyi.system.vo.YcFinancialManagementVO;
+import com.ruoyi.system.vo.ExpensesIncomeStatisticsVO;
+import com.ruoyi.system.vo.TopDataStatisticsVO;
+import com.ruoyi.system.vo.YcRevenueExpenditureTypeStatisticsVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -42,12 +59,233 @@
     }
 
     /**
-     * 查询财务管理列表
+     * 顶部数据统计
      */
-    @ApiOperation( value = "查询财务管理分页列表")
-    @PostMapping(value = "/pageList")
-    public R<PageInfo<YcFinancialManagementVO>> pageList(@RequestBody YcFinancialManagementQuery query) {
-        return R.ok(ycFinancialManagementService.pageList(query));
+    @ApiOperation( value = "顶部数据统计")
+    @PostMapping(value = "/topDataStatistics")
+    public R<List<TopDataStatisticsVO>> topDataStatistics(@RequestBody DataStatisticsQuery query) {
+
+        List<TopDataStatisticsVO> topDataStatisticsVOList = new ArrayList<>();
+
+        String startTime = query.getStartTime();
+        String endTime = query.getEndTime();
+        if (startTime == null || endTime == null) {
+            if(Objects.isNull(query.getType())){
+                return R.fail("请选择时间");
+            }
+            switch (query.getType()){
+                case 1:
+                    startTime = DateUtils.getYearDate(new Date()).get("first").toString();
+                    endTime = DateUtils.getYearDate(new Date()).get("last").toString();
+                    break;
+                case 2:
+                    startTime = DateUtils.getMonthDate(new Date()).get("first").toString();
+                    endTime = DateUtils.getMonthDate(new Date()).get("last").toString();
+                    break;
+            }
+        }else {
+
+            LambdaQueryWrapper<YcFinancialManagement> wrapper = new LambdaQueryWrapper<>();
+            if(StringUtils.hasLength(query.getProvinceCode())){
+                wrapper.eq(YcFinancialManagement::getProvinceCode, query.getProvinceCode());
+            }
+
+            if(StringUtils.hasLength(query.getCityCode())){
+                wrapper.eq(YcFinancialManagement::getCityCode, query.getCityCode());
+            }
+
+            wrapper.between(YcFinancialManagement::getPayTime, startTime, endTime);
+
+            List<YcFinancialManagement> list = ycFinancialManagementService.list(wrapper);
+
+            // 收入合计
+            BigDecimal incomeSum = list.stream().filter(item -> item.getTypeId() == 1).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            TopDataStatisticsVO topDataStatisticsVO = new TopDataStatisticsVO();
+            topDataStatisticsVO.setType(1);
+            topDataStatisticsVO.setAmount(incomeSum);
+            topDataStatisticsVOList.add(topDataStatisticsVO);
+
+            // 支出合计
+            BigDecimal expensesSum = list.stream().filter(item -> item.getTypeId() == 2).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            topDataStatisticsVO = new TopDataStatisticsVO();
+            topDataStatisticsVO.setType(2);
+            topDataStatisticsVO.setAmount(expensesSum);
+            topDataStatisticsVOList.add(topDataStatisticsVO);
+
+            // 盈亏合计
+            BigDecimal profitSum = incomeSum.subtract(expensesSum);
+            topDataStatisticsVO = new TopDataStatisticsVO();
+            topDataStatisticsVO.setType(3);
+            topDataStatisticsVO.setAmount(profitSum);
+            topDataStatisticsVOList.add(topDataStatisticsVO);
+
+        }
+
+        LambdaQueryWrapper<YcFinancialManagement> wrapper = new LambdaQueryWrapper<>();
+        if(StringUtils.hasLength(query.getProvinceCode())){
+            wrapper.eq(YcFinancialManagement::getProvinceCode, query.getProvinceCode());
+        }
+
+        if(StringUtils.hasLength(query.getCityCode())){
+            wrapper.eq(YcFinancialManagement::getCityCode, query.getCityCode());
+        }
+
+        wrapper.between(YcFinancialManagement::getPayTime, startTime, endTime);
+
+        List<YcFinancialManagement> list = ycFinancialManagementService.list(wrapper);
+
+        List<YcFinancialManagement> lastMonth = new ArrayList<>();
+        List<YcFinancialManagement> lastYearMonth = new ArrayList<>();
+        // 如果选择的是本月
+        if(query.getType() == 2){
+            // 获取上个月的数据
+            LocalDateTime localDateTime = DateUtils.dateToLocalDateTime(new Date()).minusMonths(1);
+            Date date = DateUtils.localDateTimeToDate(localDateTime);
+            startTime = DateUtils.getMonthDate(date).get("first").toString();
+            endTime = DateUtils.getMonthDate(date).get("last").toString();
+            lastMonth = ycFinancialManagementService.list(Wrappers.lambdaQuery(YcFinancialManagement.class)
+                    .between(YcFinancialManagement::getPayTime, startTime, endTime));
+            // 获取去年本月的数据
+            LocalDateTime localDateTimeYear = DateUtils.dateToLocalDateTime(new Date()).minusYears(1);
+            Date dateYear = DateUtils.localDateTimeToDate(localDateTimeYear);
+            startTime = DateUtils.getMonthDate(dateYear).get("first").toString();
+            endTime = DateUtils.getMonthDate(dateYear).get("last").toString();
+            lastYearMonth = ycFinancialManagementService.list(Wrappers.lambdaQuery(YcFinancialManagement.class)
+                    .between(YcFinancialManagement::getPayTime, startTime, endTime));
+
+        }
+
+        // 收入合计
+        BigDecimal incomeSum = list.stream().filter(item -> item.getRevenueType() == 1).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+        TopDataStatisticsVO topDataStatisticsVO = new TopDataStatisticsVO();
+        topDataStatisticsVO.setType(1);
+        topDataStatisticsVO.setAmount(incomeSum);
+
+        if(!CollectionUtils.isEmpty(lastMonth)){
+            // 环比
+            BigDecimal lastMonthMoney = lastMonth.stream().filter(item -> item.getRevenueType() == 1).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal subtract = incomeSum.subtract(lastMonthMoney);
+            topDataStatisticsVO.setChain(subtract.divide(incomeSum, 2, RoundingMode.HALF_UP));
+        }
+        if(!CollectionUtils.isEmpty(lastYearMonth)){
+            // 同比
+            BigDecimal lastYearMonthMoney = lastYearMonth.stream().filter(item -> item.getRevenueType() == 1).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal subtract = incomeSum.subtract(lastYearMonthMoney);
+            topDataStatisticsVO.setProportion(subtract.divide(incomeSum, 2, RoundingMode.HALF_UP));
+        }
+
+        topDataStatisticsVOList.add(topDataStatisticsVO);
+
+        // 支出合计
+        BigDecimal expensesSum = list.stream().filter(item -> item.getRevenueType() == 2).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+        topDataStatisticsVO = new TopDataStatisticsVO();
+        topDataStatisticsVO.setType(2);
+        topDataStatisticsVO.setAmount(expensesSum);
+        if(!CollectionUtils.isEmpty(lastMonth)){
+            // 环比
+            BigDecimal lastMonthMoney = lastMonth.stream().filter(item -> item.getRevenueType() == 2).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal subtract = expensesSum.subtract(lastMonthMoney);
+            topDataStatisticsVO.setChain(subtract.divide(expensesSum, 2, RoundingMode.HALF_UP).negate());
+        }
+        if(!CollectionUtils.isEmpty(lastYearMonth)){
+            // 同比
+            BigDecimal lastYearMonthMoney = lastYearMonth.stream().filter(item -> item.getRevenueType() == 2).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal subtract = expensesSum.subtract(lastYearMonthMoney);
+            topDataStatisticsVO.setProportion(subtract.divide(expensesSum, 2, RoundingMode.HALF_UP).negate());
+        }
+        topDataStatisticsVOList.add(topDataStatisticsVO);
+
+        // 盈亏合计
+        BigDecimal profitSum = incomeSum.subtract(expensesSum);
+        topDataStatisticsVO = new TopDataStatisticsVO();
+        topDataStatisticsVO.setType(3);
+        topDataStatisticsVO.setAmount(profitSum);
+        if(!CollectionUtils.isEmpty(lastMonth) && !CollectionUtils.isEmpty(lastYearMonth)){
+            // 环比
+            BigDecimal lastMonthMoneyIncome = lastMonth.stream().filter(item -> item.getRevenueType() == 1).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal lastMonthMoneyExpenses = lastMonth.stream().filter(item -> item.getRevenueType() == 2).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal monthProfitSum = lastMonthMoneyIncome.subtract(lastMonthMoneyExpenses);
+            BigDecimal chain = profitSum.subtract(monthProfitSum).divide(profitSum, 2, RoundingMode.HALF_UP);
+            topDataStatisticsVO.setChain(chain);
+            // 同比
+            BigDecimal lastYearMonthMoneyIncome = lastYearMonth.stream().filter(item -> item.getRevenueType() == 1).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal lastYearMonthMoneyExpenses = lastYearMonth.stream().filter(item -> item.getRevenueType() == 2).map(YcFinancialManagement::getPayMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal yearMonthProfitSum = lastYearMonthMoneyIncome.subtract(lastYearMonthMoneyExpenses);
+            BigDecimal proportion = profitSum.subtract(yearMonthProfitSum).divide(profitSum, 2, RoundingMode.HALF_UP);
+            topDataStatisticsVO.setProportion(proportion);
+
+        }
+        topDataStatisticsVOList.add(topDataStatisticsVO);
+
+        return R.ok(topDataStatisticsVOList);
+    }
+
+    /**
+     * 支出类型/收入类型占比统计
+     */
+    @ApiOperation( value = "支出类型/收入类型占比统计")
+    @PostMapping(value = "/expensesIncomeStatistics")
+    public R<ExpensesIncomeStatisticsVO> expensesIncomeStatistics(@RequestBody DataStatisticsQuery query) {
+        String startTime = query.getStartTime();
+        String endTime = query.getEndTime();
+        if (startTime == null || endTime == null) {
+            if(Objects.isNull(query.getType())){
+                return R.fail("请选择时间");
+            }
+            switch (query.getType()){
+                case 1:
+                    startTime = DateUtils.getYearDate(new Date()).get("first").toString();
+                    endTime = DateUtils.getYearDate(new Date()).get("last").toString();
+                    break;
+                case 2:
+                    startTime = DateUtils.getMonthDate(new Date()).get("first").toString();
+                    endTime = DateUtils.getMonthDate(new Date()).get("last").toString();
+                    break;
+            }
+        }
+
+        LambdaQueryWrapper<YcFinancialManagement> wrapper = new LambdaQueryWrapper<>();
+        if(StringUtils.hasLength(query.getProvinceCode())){
+            wrapper.eq(YcFinancialManagement::getProvinceCode, query.getProvinceCode());
+        }
+
+        if(StringUtils.hasLength(query.getCityCode())){
+            wrapper.eq(YcFinancialManagement::getCityCode, query.getCityCode());
+        }
+
+        wrapper.between(YcFinancialManagement::getPayTime, startTime, endTime);
+
+        ExpensesIncomeStatisticsVO expensesIncomeStatisticsVO = new ExpensesIncomeStatisticsVO();
+
+        // 查询财务数据
+        List<YcFinancialManagement> list = ycFinancialManagementService.list(wrapper);
+
+        // 查询所有的类型
+        List<YcRevenueExpenditureType> typeList = ycRevenueExpenditureTypeService.list();
+
+        // 封装收入类型财务数据
+        List<YcRevenueExpenditureTypeStatisticsVO> incomeStatistics = new ArrayList<>();
+        List<YcRevenueExpenditureType> incomeTypes = typeList.stream().filter(type -> type.getRevenueType().equals(1)).collect(Collectors.toList());
+        for (YcRevenueExpenditureType incomeType : incomeTypes) {
+            YcRevenueExpenditureTypeStatisticsVO ycRevenueExpenditureTypeStatisticsVO = new YcRevenueExpenditureTypeStatisticsVO();
+            ycRevenueExpenditureTypeStatisticsVO.setTypeName(incomeType.getTypeName());
+            ycRevenueExpenditureTypeStatisticsVO.setCount(list.stream().filter(item -> item.getTypeId().equals(incomeType.getId())).count());
+            incomeStatistics.add(ycRevenueExpenditureTypeStatisticsVO);
+        }
+        expensesIncomeStatisticsVO.setIncomeStatistics(incomeStatistics);
+
+        // 封装支出类型财务数据
+        List<YcRevenueExpenditureTypeStatisticsVO> expensesStatistics = new ArrayList<>();
+        List<YcRevenueExpenditureType> expensesTypes = typeList.stream().filter(type -> type.getRevenueType().equals(2)).collect(Collectors.toList());
+        for (YcRevenueExpenditureType expensesType : expensesTypes) {
+            YcRevenueExpenditureTypeStatisticsVO ycRevenueExpenditureTypeStatisticsVO = new YcRevenueExpenditureTypeStatisticsVO();
+            ycRevenueExpenditureTypeStatisticsVO.setTypeName(expensesType.getTypeName());
+            ycRevenueExpenditureTypeStatisticsVO.setCount(list.stream().filter(item -> item.getTypeId().equals(expensesType.getId())).count());
+            expensesStatistics.add(ycRevenueExpenditureTypeStatisticsVO);
+        }
+        expensesIncomeStatisticsVO.setExpensesStatistics(expensesStatistics);
+
+        return R.ok(expensesIncomeStatisticsVO);
     }
 
 }

--
Gitblit v1.7.1