package com.ruoyi.web.controller.api;
|
|
|
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.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.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.text.SimpleDateFormat;
|
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>
|
* 财务管理 前端控制器
|
* </p>
|
*
|
* @author xiaochen
|
* @since 2025-07-15
|
*/
|
@Api(tags = "财务数据汇总")
|
@RestController
|
@RequestMapping("/dataStatistics")
|
public class DataStatisticsController {
|
|
|
private final YcRevenueExpenditureTypeService ycRevenueExpenditureTypeService;
|
private final YcFinancialManagementService ycFinancialManagementService;
|
private final TokenService tokenService;
|
|
@Autowired
|
public DataStatisticsController(YcRevenueExpenditureTypeService ycRevenueExpenditureTypeService, YcFinancialManagementService ycFinancialManagementService, TokenService tokenService) {
|
this.ycRevenueExpenditureTypeService = ycRevenueExpenditureTypeService;
|
this.ycFinancialManagementService = ycFinancialManagementService;
|
this.tokenService = tokenService;
|
}
|
|
/**
|
* 顶部数据统计
|
*/
|
@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();
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
if (!StringUtils.hasLength(startTime) || !StringUtils.hasLength(endTime)) {
|
if(Objects.isNull(query.getType())){
|
return R.fail("请选择时间");
|
}
|
switch (query.getType()){
|
case 1:
|
Date startDate = DateUtils.getYearDate(new Date()).get("first");
|
Date endDate = DateUtils.getYearDate(new Date()).get("last");
|
startTime = format.format(startDate);
|
endTime = format.format(endDate);
|
break;
|
case 2:
|
Date startDate1 = DateUtils.getMonthDate(new Date()).get("first");
|
Date endDate1 = DateUtils.getMonthDate(new Date()).get("last");
|
startTime = format.format(startDate1);
|
endTime = format.format(endDate1);
|
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(Objects.nonNull(query.getType()) && query.getType() == 2){
|
// 获取上个月的数据
|
LocalDateTime localDateTime = DateUtils.dateToLocalDateTime(new Date()).minusMonths(1);
|
Date date = DateUtils.localDateTimeToDate(localDateTime);
|
|
Date monthStartDate1 = DateUtils.getMonthDate(date).get("first");
|
Date monthEndDate1 = DateUtils.getMonthDate(date).get("last");
|
|
startTime = format.format(monthStartDate1);
|
endTime = format.format(monthEndDate1);
|
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);
|
|
Date monthStartDate2 = DateUtils.getMonthDate(dateYear).get("first");
|
Date monthEndDate2 = DateUtils.getMonthDate(dateYear).get("last");
|
|
startTime = format.format(monthStartDate2);
|
endTime = format.format(monthEndDate2);
|
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);
|
if(lastMonthMoney.compareTo(BigDecimal.ZERO) == 0){
|
topDataStatisticsVO.setChain(subtract.multiply(new BigDecimal(100)));
|
}else {
|
topDataStatisticsVO.setChain(subtract.divide(lastMonthMoney, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)));
|
}
|
}
|
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);
|
if(lastYearMonthMoney.compareTo(BigDecimal.ZERO) == 0){
|
topDataStatisticsVO.setProportion(subtract.multiply(new BigDecimal(100)));
|
}else {
|
topDataStatisticsVO.setProportion(subtract.divide(lastYearMonthMoney, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)));
|
}
|
}
|
|
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);
|
if(lastMonthMoney.compareTo(BigDecimal.ZERO) == 0){
|
topDataStatisticsVO.setChain(subtract.multiply(new BigDecimal(100)));
|
}else {
|
topDataStatisticsVO.setChain(subtract.divide(lastMonthMoney, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)));
|
}
|
}
|
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);
|
if(lastYearMonthMoney.compareTo(BigDecimal.ZERO) == 0){
|
topDataStatisticsVO.setProportion(subtract.multiply(new BigDecimal(100)));
|
}else {
|
topDataStatisticsVO.setProportion(subtract.divide(lastYearMonthMoney, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)));
|
}
|
}
|
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;
|
if(monthProfitSum.compareTo(BigDecimal.ZERO) == 0){
|
chain = profitSum.subtract(monthProfitSum).multiply(new BigDecimal(100));
|
}else {
|
chain = profitSum.subtract(monthProfitSum).divide(monthProfitSum, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
|
}
|
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;
|
if(yearMonthProfitSum.compareTo(BigDecimal.ZERO) == 0){
|
proportion = profitSum.subtract(yearMonthProfitSum).multiply(new BigDecimal(100));
|
}else {
|
proportion = profitSum.subtract(yearMonthProfitSum).divide(yearMonthProfitSum, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
|
}
|
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();
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
if (!StringUtils.hasLength(startTime) || !StringUtils.hasLength(endTime)) {
|
if(Objects.isNull(query.getType())){
|
return R.fail("请选择时间");
|
}
|
switch (query.getType()){
|
case 1:
|
Date startDate = DateUtils.getYearDate(new Date()).get("first");
|
Date endDate = DateUtils.getYearDate(new Date()).get("last");
|
startTime = format.format(startDate);
|
endTime = format.format(endDate);
|
break;
|
case 2:
|
Date startDate1 = DateUtils.getMonthDate(new Date()).get("first");
|
Date endDate1 = DateUtils.getMonthDate(new Date()).get("last");
|
startTime = format.format(startDate1);
|
endTime = format.format(endDate1);
|
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);
|
}
|
|
}
|