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