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<ScreenTopStaticsDataVO> getTopStaticsData() {
|
return R.ok(screenService.getTopStaticsData());
|
}
|
|
@GetMapping("/rent-rank")
|
@ApiOperation("区域租金排名")
|
public R<List<ScreenRentRankVO>> rentRank() {
|
return R.ok(screenService.streetRentRank());
|
}
|
|
@GetMapping("/rent-income-trend")
|
@ApiOperation("租金收入趋势")
|
public R<ScreenRentIncomeTrendVO> rentIncomeTrend() {
|
return R.ok(screenService.rentIncomeTrend());
|
}
|
|
|
@GetMapping("/getTenantCountTrend")
|
@ApiOperation(value = "租户数量趋势统计")
|
public R<List<TenantCountTrendVO>> getTenantCountTrend() {
|
return screenService.getTenantCountTrend();
|
}
|
|
|
/**
|
* 实时租赁数据
|
*/
|
@GetMapping("/getRealTimeRentData")
|
@ApiOperation("获取实时租赁数据")
|
public R<List<RealTimeRentDataVO>> getRealTimeRentData() {
|
// 随机获取十条房源
|
String businessDeptId = SecurityUtils.getBusinessDeptId();
|
List<THouse> houses = houseService.list(new LambdaQueryWrapper<THouse>()
|
.eq(!"0".equals(businessDeptId),THouse::getBusinessDeptId, businessDeptId)
|
.last("ORDER BY RAND() LIMIT 10"));
|
|
if (CollectionUtil.isEmpty(houses)){
|
return R.ok(new ArrayList<>());
|
}
|
|
// 提取streetIds
|
List<String> streetIds = houses.stream()
|
.map(THouse::getStreetId)
|
.collect(Collectors.toList());
|
|
// 获取街道信息
|
Map<String, String> streetMap = streetService.listByIds(streetIds).stream()
|
.collect(Collectors.toMap(TStreet::getId, TStreet::getStreetName));
|
|
// 转换为返回格式
|
List<RealTimeRentDataVO> 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<List<HouseMapDistributionVO>> getHouseMapDistribution() {
|
|
String businessDeptId = SecurityUtils.getBusinessDeptId();
|
|
List<TContract> tContracts = contractService.list(new LambdaQueryWrapper<TContract>()
|
.eq(!"0".equals(businessDeptId), TContract::getBusinessDeptId, businessDeptId)
|
.eq(TContract::getPayType, 2));
|
List<String> houseIds = tContracts.stream().map(TContract::getHouseId).collect(Collectors.toList());
|
|
|
// 获取所有房屋信息
|
List<THouse> houses = houseService.list(new LambdaQueryWrapper<THouse>()
|
.and(wrapper -> wrapper.in(!houseIds.isEmpty(),THouse::getId, houseIds)
|
.or(!houseIds.isEmpty())
|
.eq(THouse::getLeaseStatus, "1")
|
)
|
.eq(!"0".equals(businessDeptId),THouse::getBusinessDeptId, businessDeptId)
|
);
|
List<HouseMapDistributionVO> 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<TContract>()
|
.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<TBill> tBills = billService.list(new LambdaQueryWrapper<TBill>()
|
.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<TBill>()
|
// .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<TBill> ones = billService.list(new LambdaQueryWrapper<TBill>()
|
.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);
|
}
|
}
|