| | |
| | | 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> |
| | |
| | | } |
| | | |
| | | /** |
| | | * 查询财务管理列表 |
| | | * 顶部数据统计 |
| | | */ |
| | | @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); |
| | | } |
| | | |
| | | } |