package com.ruoyi.web.controller.api;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.TDept;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.AssetInventoryRecord;
import com.ruoyi.system.model.AssetMain;
import com.ruoyi.system.query.AssetInventoryListQuery;
import com.ruoyi.system.query.AssetStatisticsListDetailQuery;
import com.ruoyi.system.query.AssetStatisticsListQuery;
import com.ruoyi.system.service.AssetInventoryRecordService;
import com.ruoyi.system.service.AssetMainService;
import com.ruoyi.system.service.AssetTypeService;
import com.ruoyi.system.service.TDeptService;
import com.ruoyi.system.vo.AssetInventoryVO;
import com.ruoyi.system.vo.AssetStatisticsDetailVO;
import com.ruoyi.system.vo.AssetStatisticsVO;
import com.ruoyi.system.vo.asset.AssetTypeTreeVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 资产类型表 前端控制器
*
*
* @author WuGuanFengYue
* @since 2025-09-15
*/
@Api(tags = {"资产-资产汇总-资产出入库-闲置房产"})
@Validated
@RestController
@RequestMapping("/asset-statistics")
@RequiredArgsConstructor
public class AssetStatisticsController {
@Autowired
private AssetTypeService assetTypeService;
@Autowired
private AssetInventoryRecordService assetInventoryRecordService;
@Autowired
private AssetMainService assetMainService;
@Autowired
private TokenService tokenService;
@Autowired
private TDeptService deptService;
@ApiOperation("获取资产类型树形数据")
@GetMapping("/tree")
public R> getAssetTypeTree() {
List treeData = assetTypeService.getAssetTypeTree();
return R.ok(treeData);
}
public List getAllSubDeptIds(Integer parentId) {
List allSubIds = new ArrayList<>();
allSubIds.add(parentId);
getSubDeptIdsRecursive(parentId, allSubIds);
return allSubIds.stream().distinct().collect(Collectors.toList());
}
private void getSubDeptIdsRecursive(Integer parentId, List allSubIds) {
// 查询直接下级
List directSubIds = deptService.lambdaQuery().eq(TDept::getParentId, parentId).list()
.stream().map(TDept::getId).collect(Collectors.toList());
for (Integer subId : directSubIds) {
allSubIds.add(subId);
// 递归查询下级的下级
getSubDeptIdsRecursive(subId, allSubIds);
}
}
@ApiOperation("资产汇总分页列表")
@PostMapping("/pageList")
public R> pageList(@RequestBody AssetStatisticsListQuery query) {
String deptId = tokenService.getLoginUser().getDeptId();
TDept dept = deptService.getById(tokenService.getLoginUser().getDeptId());
List deptIds = deptService.getAllSubDeptIds(deptId);
if (dept.getDeptName().contains("资产管理")){
// 可以查询所有数据
query.setDeptIds(new ArrayList<>());
}else{
if (deptIds.isEmpty()){
return R.ok(new PageInfo<>());
}else{
query.setDeptIds(deptIds);
}
}
return R.ok(assetTypeService.pageList(query));
}
@ApiOperation("资产明细")
@PostMapping("/pageListDetail")
public R> pageListDetail(@RequestBody AssetStatisticsListDetailQuery query) {
String deptId = tokenService.getLoginUser().getDeptId();
TDept dept = deptService.getById(tokenService.getLoginUser().getDeptId());
List deptIds = deptService.getAllSubDeptIds(deptId);
if (dept.getDeptName().contains("资产管理")){
// 可以查询所有数据
query.setDeptIds(new ArrayList<>());
}else{
if (deptIds.isEmpty()){
return R.ok(new PageInfo<>());
}else{
query.setDeptIds(deptIds);
}
}
PageInfo res = assetTypeService.pageListDetail(query);
return R.ok(res);
}
@ApiOperation("资产出入库分页列表")
@PostMapping("/pageListInventory")
public R> pageListInventory(@RequestBody AssetInventoryListQuery query) {
String deptId = tokenService.getLoginUser().getDeptId();
TDept dept = deptService.getById(tokenService.getLoginUser().getDeptId());
List deptIds = deptService.getAllSubDeptIds(deptId);
if (dept.getDeptName().contains("资产管理")){
// 可以查询所有数据
query.setDeptIds(new ArrayList<>());
}else{
if (deptIds.isEmpty()){
return R.ok(new PageInfo<>());
}else{
query.setDeptIds(deptIds);
}
}
String[] dateList = query.getDate().split(",");
String month = dateList[1];
int monthValue = Integer.parseInt(month);
int year = LocalDateTime.now().getYear();
LocalDateTime firstDay = LocalDateTime.of(year, monthValue, 1, 0, 0, 0);
LocalDateTime lastDay = LocalDateTime.of(year, monthValue,
YearMonth.of(year, monthValue).lengthOfMonth(), 23, 59, 59);
query.setDateStart(firstDay);
query.setDateEnd(lastDay);
List assetMainIds = assetInventoryRecordService.lambdaQuery().between(AssetInventoryRecord::getCreateTime, query.getDateStart(), query.getDateEnd())
.list().stream().map(AssetInventoryRecord::getAssetMainId).collect(Collectors.toList());
if (assetMainIds.isEmpty()){
return R.ok(new PageInfo<>());
}
if (StringUtils.hasLength(query.getNameOrCode())){
// 查询出资产名称或者资产编号符合条件的code
List assetTypeIds = assetMainService.lambdaQuery()
.in(AssetMain::getOwnershipDeptId, deptIds)
.and(wrapper -> wrapper.like(AssetMain::getAssetName, query.getNameOrCode())
.or()
.like(AssetMain::getAssetCode, query.getNameOrCode()))
.list()
.stream()
.map(AssetMain::getAssetTypeId)
.collect(Collectors.toList());
query.setAssetMainIds(assetTypeIds);
if (assetTypeIds.isEmpty()){
return R.ok(new PageInfo<>());
}
// 和assetMainIds取交集
List res = assetMainIds.stream().filter(assetTypeIds::contains).collect(Collectors.toList());
if (res.isEmpty()){
return R.ok(new PageInfo<>());
}
query.setAssetMainIds(res);
}
return R.ok(assetTypeService.pageListInventory(query));
}
@ApiOperation("资产出入库明细分页列表")
@PostMapping("/pageListInventoryDetail")
public R> pageListInventoryDetail(@RequestBody AssetStatisticsListDetailQuery query) {
String deptId = tokenService.getLoginUser().getDeptId();
TDept dept = deptService.getById(tokenService.getLoginUser().getDeptId());
List deptIds = deptService.getAllSubDeptIds(deptId);
if (dept.getDeptName().contains("资产管理")){
// 可以查询所有数据
query.setDeptIds(new ArrayList<>());
}else{
if (deptIds.isEmpty()){
return R.ok(new PageInfo<>());
}else{
query.setDeptIds(deptIds);
}
}
String[] dateList = query.getDate().split(",");
String month = dateList[1];
int monthValue = Integer.parseInt(month);
int year = LocalDateTime.now().getYear();
LocalDateTime firstDay = LocalDateTime.of(year, monthValue, 1, 0, 0, 0);
LocalDateTime lastDay = LocalDateTime.of(year, monthValue,
YearMonth.of(year, monthValue).lengthOfMonth(), 23, 59, 59);
query.setDateStart(firstDay);
query.setDateEnd(lastDay);
List assetMainIds = assetInventoryRecordService.lambdaQuery().between(AssetInventoryRecord::getCreateTime, query.getDateStart(), query.getDateEnd())
.list().stream().map(AssetInventoryRecord::getAssetMainId).collect(Collectors.toList());
if (assetMainIds.isEmpty()){
return R.ok(new PageInfo<>());
}
if (StringUtils.hasLength(query.getNameOrCode())){
// 查询出资产名称或者资产编号符合条件的code
List assetTypeIds = assetMainService.lambdaQuery()
.in(AssetMain::getOwnershipDeptId, deptIds)
.and(wrapper -> wrapper.like(AssetMain::getAssetName, query.getNameOrCode())
.or()
.like(AssetMain::getAssetCode, query.getNameOrCode()))
.list()
.stream()
.map(AssetMain::getAssetTypeId)
.collect(Collectors.toList());
query.setAssetMainIds(assetTypeIds);
if (assetTypeIds.isEmpty()){
return R.ok(new PageInfo<>());
}
// 和assetMainIds取交集
List res = assetMainIds.stream().filter(assetTypeIds::contains).collect(Collectors.toList());
if (res.isEmpty()){
return R.ok(new PageInfo<>());
}
query.setAssetMainIds(res);
}
PageInfo res = assetTypeService.pageListInventoryDetail(query);
return R.ok(res);
}
}