package com.panzhihua.sangeshenbian.api;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.panzhihua.common.controller.BaseController;
import com.panzhihua.common.exceptions.ServiceException;
import com.panzhihua.common.model.vos.R;
import com.panzhihua.common.model.vos.sangeshenbian.SystemUserVo;
import com.panzhihua.sangeshenbian.model.entity.*;
import com.panzhihua.sangeshenbian.model.query.AnalyticStatisticsQuery;
import com.panzhihua.sangeshenbian.model.vo.*;
import com.panzhihua.sangeshenbian.service.*;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 分析统计 前端控制器
*
*
* @author
* @since 2025-04-28
*/
@RestController
@RequestMapping("/analytic-statistics")
@Validated
public class AnalyticStatisticsController extends BaseController {
@Autowired
private IComplaintService complaintService;
@Autowired
private ISystemUserLevelService systemUserLevelService;
@Resource
private IBcRegionService bcRegionService;
@Resource
private IComStreetService comStreetService;
@Resource
private IComActService comActService;
@PostMapping("/data")
@ApiOperation(value = "分析统计", tags = {"三个身边后台-分析统计"})
public R data(@Valid @RequestBody AnalyticStatisticsQuery query){
SystemUserVo loginUserInfoSanGeShenBian = getLoginUserInfoSanGeShenBian();
Integer id = loginUserInfoSanGeShenBian.getId();
List listBySystemUsers = systemUserLevelService.getListBySystemUserId(id);
if(listBySystemUsers.size()==0){
// 没有权限
return R.ok(new AnalyticStatisticsDataVo());
}
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
SystemUserLevel systemUserLevel = listBySystemUsers.stream().filter(e -> e.getLevel() == 1).findFirst().orElse(null);
if(query.getCityCode()!=null){
// 判断是否有市级权限
if(systemUserLevel==null){
throw new ServiceException("没有市级权限");
}
wrapper.eq(Complaint::getCityCode, query.getCityCode());
}
if(query.getDistrictCode()!=null){
// 判断是否有区县权限
List systemUserLevels2 = listBySystemUsers.stream().filter(e -> e.getLevel() == 2 && e.getDistrictsCode().equals(query.getDistrictCode().toString())).collect(Collectors.toList());
// 没有市权限 也没有该区权限
if(systemUserLevels2.size()==0 && systemUserLevel==null){
throw new ServiceException("没有该区县权限");
}
wrapper.eq(Complaint::getDistrictsCode, query.getDistrictCode());
}
if(query.getStreetId()!=null){
// 获取街道上一级查看是否有上级权限
ComStreet comStreet = comStreetService.getById(query.getStreetId());
if(comStreet==null){
throw new ServiceException("没有该街道权限");
}
List systemUserLevels2 = listBySystemUsers.stream().filter(e -> e.getLevel() == 2 && e.getDistrictsCode().equals(comStreet.getAreaCode().toString())).collect(Collectors.toList());
// 判断是否有街道权限
List systemUserLevels3 = listBySystemUsers.stream().filter(e -> e.getLevel() == 3 && e.getStreetId().equals(query.getStreetId().toString())).collect(Collectors.toList());
// 没有市级 上级区县 本级街道权限
if(systemUserLevels3.size()==0 && systemUserLevel==null && systemUserLevels2.size()==0){
throw new ServiceException("没有该街道权限");
}
wrapper.eq(Complaint::getStreetId, query.getStreetId());
}
if(query.getCommunityId()!=null){
ComAct comAct = comActService.getById(query.getCommunityId());
if (comAct == null) {
throw new ServiceException("没有该社区权限");
}
// 查看是否有上级街道权限
List systemUserLevels2 = listBySystemUsers.stream().filter(e -> e.getLevel() == 3 && e.getStreetId().equals(comAct.getStreetId().toString())).collect(Collectors.toList());
// 查看是否有上级区权限
List systemUserLevels3 = listBySystemUsers.stream().filter(e -> e.getLevel() == 2 && e.getDistrictsCode().equals(comAct.getAreaCode())).collect(Collectors.toList());
// 查看是否有本级权限
List systemUserLevels4 = listBySystemUsers.stream().filter(e -> e.getLevel() == 4 && e.getCommunityId().equals(query.getCommunityId())).collect(Collectors.toList());
// 判断是否有上面的4个权限
if(systemUserLevels4.size()==0 && systemUserLevels3.size()==0 && systemUserLevels2.size()==0 && systemUserLevel==null){
throw new ServiceException("没有该社区权限");
}
wrapper.eq(Complaint::getCommunityId, query.getCommunityId());
}
// 都为空 查他有的
if(query.getCityCode()==null && query.getDistrictCode()==null && query.getStreetId()==null && query.getCommunityId()==null){
// 看是否直接是市级账号
if(systemUserLevel==null){
List districtsCodes=new ArrayList<>();
List streetIds=new ArrayList<>();
List communityIds=new ArrayList<>();
// 不是市级 查看是否是区县账号
List systemUserLevels2 = listBySystemUsers.stream().filter(e -> e.getLevel() == 2).collect(Collectors.toList());
if(!systemUserLevels2.isEmpty()){
// 区县账号 找出code
districtsCodes = systemUserLevels2.stream().map(SystemUserLevel::getDistrictsCode).collect(Collectors.toList());
}else {
districtsCodes.add("0");
}
List systemUserLevels3 = listBySystemUsers.stream().filter(e -> e.getLevel() == 3).collect(Collectors.toList());
if(!systemUserLevels3.isEmpty()){
// 街道账号 找出id 且不在上面的区县下的街道
List finalDistrictsCodes1 = districtsCodes;
streetIds = systemUserLevels3.stream().filter(e -> !finalDistrictsCodes1.contains(e.getDistrictsCode())).map(SystemUserLevel::getStreetId).collect(Collectors.toList());
}else {
streetIds.add("0");
}
List systemUserLevels4 = listBySystemUsers.stream().filter(e -> e.getLevel() == 4).collect(Collectors.toList());
if(!systemUserLevels4.isEmpty()){
// community账号 找出id 且不在上面的街道下的社区
List finalStreetIds1 = streetIds;
List finalDistrictsCodes2 = districtsCodes;
communityIds = systemUserLevels4.stream().filter(e -> !finalStreetIds1.contains(e.getStreetId()) && !finalDistrictsCodes2.contains(e.getDistrictsCode())).map(SystemUserLevel::getCommunityId).collect(Collectors.toList());
}else {
communityIds.add(0L);
}
List finalDistrictsCodes = districtsCodes;
List finalStreetIds = streetIds;
List finalCommunityIds = communityIds;
wrapper.and(wrapper1 -> {
wrapper1.in(Complaint::getDistrictsCode, finalDistrictsCodes).or().in(Complaint::getStreetId, finalStreetIds).or().in(Complaint::getCommunityId, finalCommunityIds);
});
}
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List complaints =complaintService.list(wrapper);
// 第一部分数据
AnalyticStatisticsOneVo analyticStatisticsOneVo = complaintService.analyticStatisticsOne(query,complaints,simpleDateFormat);
// 第二部分数据
List analyticStatisticsTwoVos =complaintService.analyticStatisticsTwo(query.getTime(),complaints,simpleDateFormat);
// 第三部分数据
List analyticStatisticsThreeVos =complaintService.analyticStatisticsThree(query.getRank(), complaints);
// 第四部分数据
AnalyticStatisticsFourVo analyticStatisticsFourVos =complaintService.analyticStatisticsFour(complaints);
AnalyticStatisticsDataVo analyticStatisticsDataVo = new AnalyticStatisticsDataVo();
analyticStatisticsDataVo.setAnalyticStatisticsOneVo(analyticStatisticsOneVo);
analyticStatisticsDataVo.setAnalyticStatisticsTwoVos(analyticStatisticsTwoVos);
analyticStatisticsDataVo.setAnalyticStatisticsThreeVos(analyticStatisticsThreeVos);
analyticStatisticsDataVo.setAnalyticStatisticsFourVo(analyticStatisticsFourVos);
return R.ok(analyticStatisticsDataVo);
}
@GetMapping("/getRegion")
@ApiOperation(value = "分析统计--获取市-区县-街道-社区", tags = {"三个身边后台-分析统计--获取市-区县-街道-社区"})
public R getRegion(){
SystemUserVo loginUserInfoSanGeShenBian = getLoginUserInfoSanGeShenBian();
Integer id = loginUserInfoSanGeShenBian.getId();
List listBySystemUsers = systemUserLevelService.getListBySystemUserId(id);
// 如果有市级权限 展示所有
SystemUserLevel systemUserLevel = listBySystemUsers.stream().filter(e -> e.getLevel() == 1).findFirst().orElse(null);
AnalyticStatisticsRegionVo analyticStatisticsRegionVo = new AnalyticStatisticsRegionVo();
if(systemUserLevel!=null){
// 查询所有的县 街道 社区
List list = bcRegionService.list(new LambdaQueryWrapper().eq(BcRegion::getParentId, 510400));
List list1 = comStreetService.list(new LambdaQueryWrapper().eq(ComStreet::getCityCode, 510400));
List list2 = comActService.list(new LambdaQueryWrapper().eq(ComAct::getState,0).eq(ComAct::getCityCode, 510400));
analyticStatisticsRegionVo.setBcRegions(list);
analyticStatisticsRegionVo.setComStreets(list1);
analyticStatisticsRegionVo.setComActs(list2);
return R.ok(analyticStatisticsRegionVo);
}
// 有区县级权限
List systemUserLevels = listBySystemUsers.stream().filter(e -> e.getLevel() == 2).collect(Collectors.toList());
// 拥有的区县code
List collect = systemUserLevels.stream().map(SystemUserLevel::getDistrictsCode).collect(Collectors.toList());
if(collect.size()==0){
collect.add("0");
}
// 找出这个区县的
List list = bcRegionService.list(new LambdaQueryWrapper().eq(BcRegion::getParentId, 510400).in(BcRegion::getRegionCode, collect));
// 区县街道
List list1 = comStreetService.list(new LambdaQueryWrapper().in(ComStreet::getAreaCode, collect));
// 区县社区
List list2 = comActService.list(new LambdaQueryWrapper().in(ComAct::getAreaCode, collect).eq(ComAct::getState,0));
// 有街道权限 排除上个查询出来的
List systemUserLevels1 = listBySystemUsers.stream().filter(e -> e.getLevel() == 3 && !collect.contains(e.getDistrictsCode())).collect(Collectors.toList());
List collect1 = systemUserLevels1.stream().map(SystemUserLevel::getStreetId).collect(Collectors.toList());
if(collect1.size()==0){
collect1.add("0");
}
// 区县街道
List list3 = comStreetService.list(new LambdaQueryWrapper().in(ComStreet::getStreetId, collect1));
// 区县社区
List list4 = comActService.list(new LambdaQueryWrapper().in(ComAct::getStreetId, collect1).eq(ComAct::getState,0));
list1.addAll(list3);
list2.addAll(list4);
// 有社区权限 排除上个查询出来的
List systemUserLevels2 = listBySystemUsers.stream().filter(e -> e.getLevel() == 4 && !collect.contains(e.getDistrictsCode()) && !collect1.contains(e.getStreetId())).collect(Collectors.toList());
List collect2 = systemUserLevels2.stream().map(SystemUserLevel::getCommunityId).collect(Collectors.toList());
if(collect2.size()==0){
collect2.add(0l);
}
// 区县社区
List list6 = comActService.list(new LambdaQueryWrapper().in(ComAct::getCommunityId, collect2).eq(ComAct::getState,0));
list2.addAll(list6);
analyticStatisticsRegionVo.setBcRegions(list);
analyticStatisticsRegionVo.setComStreets(list1);
analyticStatisticsRegionVo.setComActs(list2);
return R.ok(analyticStatisticsRegionVo);
}
@GetMapping("/getNextRegion")
@ApiOperation(value = "分析统计--获取下一级树", tags = {"三个身边后台-分析统计--获取市-区县-街道-社区"})
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "区 传regionCode 街道streetId", required = true, dataType = "String"),
@ApiImplicitParam(name = "type", value = "1区 2街道", required = true, dataType = "Integer")
})
public R> getNextRegion(@RequestParam String id, @RequestParam Integer type){
if(type==1){
List list3 = comStreetService.list(new LambdaQueryWrapper().eq(ComStreet::getAreaCode, id));
return R.ok(list3);
}
if(type==2){
List list3 = comActService.list(new LambdaQueryWrapper().eq(ComAct::getStreetId, id).eq(ComAct::getState,0));
return R.ok(list3);
}
return R.ok();
}
@GetMapping("/getLastRegion")
@ApiOperation(value = "分析统计--获取上级回显", tags = {"三个身边后台-分析统计--获取市-区县-街道-社区"})
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "街道streetId 社区 communityId", required = true, dataType = "String"),
@ApiImplicitParam(name = "type", value = "2街道 3社区", required = true, dataType = "Integer")
})
public R getLastRegion(@RequestParam String id, @RequestParam Integer type){
AnalyticStatisticsRegionVo analyticStatisticsRegionVo = new AnalyticStatisticsRegionVo();
if(type==2){
ComStreet comStreet = comStreetService.getOne(new LambdaQueryWrapper().eq(ComStreet::getStreetId, id));
// 找出这个区县的
List list = bcRegionService.list(new LambdaQueryWrapper().eq(BcRegion::getParentId, 510400).eq(BcRegion::getRegionCode, comStreet.getAreaCode()));
analyticStatisticsRegionVo.setBcRegions(list);
return R.ok(analyticStatisticsRegionVo);
}
if(type==3){
ComAct comAct = comActService.getOne(new LambdaQueryWrapper().eq(ComAct::getCommunityId, id));
// 找出这个区县的
List list = bcRegionService.list(new LambdaQueryWrapper().eq(BcRegion::getParentId, 510400).eq(BcRegion::getRegionCode, comAct.getAreaCode()));
analyticStatisticsRegionVo.setBcRegions(list);
List list3 = comStreetService.list(new LambdaQueryWrapper().eq(ComStreet::getStreetId, comAct.getStreetId()));
analyticStatisticsRegionVo.setComStreets(list3);
return R.ok(analyticStatisticsRegionVo);
}
return R.ok();
}
}