package com.ruoyi.web.controller.api; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.model.TBill; import com.ruoyi.system.model.TContract; import com.ruoyi.system.model.THouse; import com.ruoyi.system.model.TStreet; import com.ruoyi.system.service.ITStreetService; import com.ruoyi.system.service.TBillService; import com.ruoyi.system.service.TContractService; import com.ruoyi.system.service.THouseService; import com.ruoyi.system.service.impl.ScreenService; import com.ruoyi.system.vo.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; import static org.checkerframework.checker.units.qual.Prefix.one; /** * @author mitao * @date 2025/3/19 */ @Api(tags = {"大屏相关接口"}) @RestController @RequestMapping("/screen") @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class ScreenController { private final ScreenService screenService; private final TContractService contractService; private final THouseService houseService; private final ITStreetService streetService; private final TBillService billService; @GetMapping("/statics-data") @ApiOperation(value = "获取顶部统计数据") public R getTopStaticsData() { return R.ok(screenService.getTopStaticsData()); } @GetMapping("/rent-rank") @ApiOperation("区域租金排名") public R> rentRank() { return R.ok(screenService.streetRentRank()); } @GetMapping("/rent-income-trend") @ApiOperation("租金收入趋势") public R rentIncomeTrend() { return R.ok(screenService.rentIncomeTrend()); } @GetMapping("/getTenantCountTrend") @ApiOperation(value = "租户数量趋势统计") public R> getTenantCountTrend() { return screenService.getTenantCountTrend(); } /** * 实时租赁数据 */ @GetMapping("/getRealTimeRentData") @ApiOperation("获取实时租赁数据") public R> getRealTimeRentData() { // 随机获取十条房源 String businessDeptId = SecurityUtils.getBusinessDeptId(); List houses = houseService.list(new LambdaQueryWrapper() .eq(!"0".equals(businessDeptId),THouse::getBusinessDeptId, businessDeptId) .last("ORDER BY RAND() LIMIT 10")); if (CollectionUtil.isEmpty(houses)){ return R.ok(new ArrayList<>()); } // 提取streetIds List streetIds = houses.stream() .map(THouse::getStreetId) .collect(Collectors.toList()); // 获取街道信息 Map streetMap = streetService.listByIds(streetIds).stream() .collect(Collectors.toMap(TStreet::getId, TStreet::getStreetName)); // 转换为返回格式 List result = houses.stream().map(house -> { RealTimeRentDataVO vo = new RealTimeRentDataVO(); vo.setStreetName(streetMap.getOrDefault(house.getStreetId(), "未知")); vo.setRoomName(house.getHouseName()); vo.setLeaseStatus(house.getLeaseStatus()); return vo; }).collect(Collectors.toList()); return R.ok(result); } public static void main(String[] args) { // 获取当前季度的开始和结束时间 // 获取当前季度的开始和结束时间的实现示例: DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate now = LocalDate.now(); int month = now.getMonthValue(); int year = now.getYear(); // 计算季度起始月份(1,4,7,10) int quarterStartMonth = ((month - 1) / 3) * 3 + 1; int quarterEndMonth = quarterStartMonth + 2; // 构建季度起止日期 LocalDate quarterStart = YearMonth.of(year, quarterStartMonth).atDay(1); LocalDate quarterEnd = YearMonth.of(year, quarterEndMonth).atEndOfMonth(); System.out.println("季度开始:" + quarterStart.format(formatter)); System.out.println("季度结束:" + quarterEnd.format(formatter)); } /** * 获取房屋地图分布 */ @GetMapping("/getHouseMapDistribution") @ApiOperation("获取房屋地图分布") public R> getHouseMapDistribution() { String businessDeptId = SecurityUtils.getBusinessDeptId(); List tContracts = contractService.list(new LambdaQueryWrapper() .eq(!"0".equals(businessDeptId), TContract::getBusinessDeptId, businessDeptId) .eq(TContract::getPayType, 2)); List houseIds = tContracts.stream().map(TContract::getHouseId).collect(Collectors.toList()); if (houseIds.isEmpty()){ return R.ok(new ArrayList<>()); } // 获取所有房屋信息 List houses = houseService.list(new LambdaQueryWrapper() .and(wrapper -> wrapper.in(THouse::getId, houseIds) .or() .eq(THouse::getLeaseStatus, "1") ) .eq(!"0".equals(businessDeptId),THouse::getBusinessDeptId, businessDeptId) ); List result = new ArrayList<>(); for (THouse house : houses) { HouseMapDistributionVO houseMapDistributionVO = new HouseMapDistributionVO(); houseMapDistributionVO.setHouseName(house.getHouseName()); houseMapDistributionVO.setHouseAddress(house.getHouseAddress()); houseMapDistributionVO.setHouseStatus(house.getLeaseStatus()); houseMapDistributionVO.setLongitude(house.getLongitude()); houseMapDistributionVO.setLatitude(house.getLatitude()); TContract contract = contractService.getOne(new LambdaQueryWrapper() .eq(!"0".equals(businessDeptId),TContract::getBusinessDeptId, businessDeptId) .eq(TContract::getPayType, 2) .gt(TContract::getEndTime, LocalDate.now()) .eq(TContract::getHouseId, house.getId()) .eq(TContract::getStatus, 4) .last("limit 1")); if (contract != null){ List tBills = billService.list(new LambdaQueryWrapper() .eq(!"0".equals(businessDeptId),TBill::getBusinessDeptId, businessDeptId) .eq(TBill::getContractId, contract.getId()) .eq(TBill::getBillType, 1)); houseMapDistributionVO.setTenant(contract.getPartyTwoName()); BigDecimal payFeesMoney = tBills.stream() .map(TBill::getPayFeesMoney) .reduce(BigDecimal::add) .orElse(BigDecimal.ZERO); BigDecimal payableFeesMoney = tBills.stream() .map(TBill::getPayableFeesMoney) .reduce(BigDecimal::add) .orElse(BigDecimal.ZERO); String rentStatus = String.format("%.2f/%.2f", payFeesMoney, payableFeesMoney); houseMapDistributionVO.setRentStatus(rentStatus); // TBill one = billService.getOne(new LambdaQueryWrapper() // .le(TBill::getStartTime, LocalDate.now()) // .ge(TBill::getEndTime, LocalDate.now()) // .eq(TBill::getBillType, 1) // .eq(TBill::getContractId, contract.getId())); // 获取当前季度的开始和结束时间 // 获取当前季度的开始和结束时间的实现示例: DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate now = LocalDate.now(); int month = now.getMonthValue(); int year = now.getYear(); // 计算季度起始月份(1,4,7,10) int quarterStartMonth = ((month - 1) / 3) * 3 + 1; int quarterEndMonth = quarterStartMonth + 2; // 构建季度起止日期 LocalDate quarterStart = YearMonth.of(year, quarterStartMonth).atDay(1); LocalDate quarterEnd = YearMonth.of(year, quarterEndMonth).atEndOfMonth(); System.out.println("季度开始:" + quarterStart.format(formatter)); System.out.println("季度结束:" + quarterEnd.format(formatter)); List ones = billService.list(new LambdaQueryWrapper() .eq(!"0".equals(businessDeptId),TBill::getBusinessDeptId, businessDeptId) .between(TBill::getStartTime, quarterStart, quarterEnd) .eq(TBill::getBillType, 1) .eq(TBill::getContractId, contract.getId())); if (!ones.isEmpty()){ long count = ones.stream().filter(tBill -> "4".equals(tBill.getPayFeesStatus())).count(); if (count > 0){ houseMapDistributionVO.setHouseStatus("4"); } BigDecimal payFeesMoney1 = ones.stream() .map(TBill::getPayFeesMoney) .reduce(BigDecimal::add) .orElse(BigDecimal.ZERO); BigDecimal payableFeesMoney1 = ones.stream() .map(TBill::getPayableFeesMoney) .reduce(BigDecimal::add) .orElse(BigDecimal.ZERO); String rent = String.format("%.2f/%.2f", payFeesMoney1, payableFeesMoney1); houseMapDistributionVO.setRent(rent); }else { houseMapDistributionVO.setRent("欠费"); } }else { houseMapDistributionVO.setTenant("暂无"); houseMapDistributionVO.setRentStatus("待出租"); houseMapDistributionVO.setRent("暂无"); } result.add(houseMapDistributionVO); } return R.ok(result); } }