package com.panzhihua.sangeshenbian.service.impl; import com.panzhihua.common.exceptions.ServiceException; import com.panzhihua.common.model.vos.LoginUserInfoVO; import com.panzhihua.common.utlis.DateUtils; import com.panzhihua.sangeshenbian.dao.SystemUserMapper; import com.panzhihua.sangeshenbian.model.entity.ComAct; import com.panzhihua.sangeshenbian.model.entity.ComStreet; import com.panzhihua.sangeshenbian.model.entity.Complaint; import com.panzhihua.sangeshenbian.model.entity.SystemUserLevel; import com.panzhihua.sangeshenbian.model.query.AppStaticsQuery; import com.panzhihua.sangeshenbian.model.vo.AnalyticStatisticsFourVo; import com.panzhihua.sangeshenbian.model.vo.AnalyticStatisticsOneVo; import com.panzhihua.sangeshenbian.model.vo.AnalyticStatisticsThreeVo; import com.panzhihua.sangeshenbian.model.vo.AnalyticStatisticsTwoVo; import com.panzhihua.sangeshenbian.model.vo.RegionVO; import com.panzhihua.sangeshenbian.service.IBcRegionService; import com.panzhihua.sangeshenbian.service.IComActService; import com.panzhihua.sangeshenbian.service.IComStreetService; import com.panzhihua.sangeshenbian.service.IComplaintService; import com.panzhihua.sangeshenbian.service.IdentityInformationService; import com.panzhihua.sangeshenbian.warpper.IdentityInformation; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Objects; /** * @author mitao * @date 2025/5/9 */ @RequiredArgsConstructor(onConstructor_ = {@Lazy}) @Service public class StaticsService { private final IdentityInformationService identityInformationService; private final IComplaintService complaintService; private final IBcRegionService bcRegionService; private final IComStreetService comStreetService; private final IComActService comActService; private final SystemUserMapper systemUserMapper; private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public List queryRegionTree(LoginUserInfoVO loginUserInfo) { IdentityInformation currentIdentityInformation = identityInformationService.getCurrentIdentityInformation(loginUserInfo); if (!Integer.valueOf(2).equals(currentIdentityInformation.getIdentity())) { throw new ServiceException("当前账号无权限"); } SystemUserLevel userLevel = currentIdentityInformation.getSystemUserLevel(); Integer level = userLevel.getLevel(); switch (level) { case 1: return buildCityLevelTree("510400"); case 2: return buildDistrictLevelTree(userLevel.getDistrictsCode()); case 3: return buildStreetLevelTree(userLevel.getStreetId()); case 4: return buildCommunityLevelTree(userLevel.getCommunityId()); default: throw new ServiceException("不支持的用户等级"); } } /** * 构建市级区域树结构(市 -> 区/县 -> 街道 -> 社区) * @param cityCode 市级行政区划代码,例如 "510400" * @return 区域树列表,每个区包含下属街道和社区 */ private List buildCityLevelTree(String cityCode) { List districts = systemUserMapper.getRegion(cityCode); districts.forEach(district -> { district.setTier(2); List streets = systemUserMapper.getStreet(district.getId()); district.setChildren(streets); streets.forEach(street -> { street.setTier(3); List communities = systemUserMapper.getCommunity(street.getId()); communities.forEach(c -> c.setTier(4)); street.setChildren(communities); }); }); return districts; } /** * 构建区级区域树结构(区/县 -> 街道 -> 社区) * @param districtCode 区级行政区划代码 * @return 街道列表,每个街道包含其下属社区 */ private List buildDistrictLevelTree(String districtCode) { List streets = systemUserMapper.getStreet(districtCode); streets.forEach(street -> { street.setTier(3); List communities = systemUserMapper.getCommunity(street.getId()); communities.forEach(c -> c.setTier(4)); street.setChildren(communities); }); return streets; } /** * 构建街道级区域树结构(街道 -> 社区) * @param streetId 街道ID * @return 包含一个街道及其下属社区的列表 */ private List buildStreetLevelTree(String streetId) { ComStreet street = comStreetService.getById(streetId); RegionVO streetVO = new RegionVO(); streetVO.setId(String.valueOf(street.getStreetId())); streetVO.setName(street.getName()); streetVO.setTier(3); List communities = systemUserMapper.getCommunity(streetId); communities.forEach(c -> c.setTier(4)); streetVO.setChildren(communities); return Collections.singletonList(streetVO); } /** * 构建社区级区域(只返回当前社区信息) * @param communityId 社区ID * @return 仅包含一个社区节点的列表 */ private List buildCommunityLevelTree(Long communityId) { ComAct community = comActService.getById(communityId); RegionVO regionVO = new RegionVO(); regionVO.setId(String.valueOf(community.getCommunityId())); regionVO.setName(community.getName()); regionVO.setTier(4); return Collections.singletonList(regionVO); } /** * 统计分析-第一部分 * @param query * @param loginUserInfo * @return */ public AnalyticStatisticsOneVo queryStaticsPartOne(AppStaticsQuery query, LoginUserInfoVO loginUserInfo) { List complaints = complaintService.queryCompliantList(query,loginUserInfo); return complaintService.analyticStatisticsOne(null, complaints, simpleDateFormat); } /** *获取统计分析-第二部分(诉求单量统计柱状图) * @param query * @param loginUserInfo * @return */ public List queryStaticsPartTwo(AppStaticsQuery query, LoginUserInfoVO loginUserInfo) { List complaints = complaintService.queryCompliantList(query,loginUserInfo); //时间范围 String time = ""; if (Objects.nonNull(query.getTimeType())) { Date now = new Date(); Date start = null; switch (query.getTimeType()) { case 2: start = DateUtils.addDay(now, -15); break; case 3: start = DateUtils.addDay(now, -30); break; default: start = DateUtils.addDay(now, -7); break; } //格式化 String startStr = DateUtils.format(start, DateUtils.yyyyMMdd_format); String endStr = DateUtils.format(now, DateUtils.yyyyMMdd_format); time = startStr + " - " + endStr; } return complaintService.analyticStatisticsTwo(time, complaints, simpleDateFormat); } /** *获取统计分析-第三部分(问题类型排名) * @param query * @param loginUserInfo * @return */ public List queryStaticsPartThree(AppStaticsQuery query, LoginUserInfoVO loginUserInfo) { List complaints = complaintService.queryCompliantList(query,loginUserInfo); return complaintService.analyticStatisticsThree(query.getRank(), complaints); } /** * 获取统计分析-第四部分(评价占比) * @param query * @param loginUserInfo * @return */ public AnalyticStatisticsFourVo queryStaticsPartFour(AppStaticsQuery query, LoginUserInfoVO loginUserInfo) { List complaints = complaintService.queryCompliantList(query,loginUserInfo); return complaintService.analyticStatisticsFour(complaints); } }