diff --git a/src/main/java/org/springblade/modules/business/controller/ReportController.java b/src/main/java/org/springblade/modules/business/controller/ReportController.java index 2ca4af6..031f796 100644 --- a/src/main/java/org/springblade/modules/business/controller/ReportController.java +++ b/src/main/java/org/springblade/modules/business/controller/ReportController.java @@ -19,6 +19,7 @@ package org.springblade.modules.business.controller; import com.github.xiaoymin.knife4j.annotations.ApiSort; import io.swagger.annotations.Api; import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springblade.common.cache.DictBizCache; import org.springblade.common.constant.BusinessConstant; import org.springblade.common.constant.CommonConstant; @@ -27,17 +28,21 @@ import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tenant.annotation.TenantDS; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.modules.business.entity.Appeal; +import org.springblade.modules.business.entity.DataEntity; import org.springblade.modules.business.service.ILargeScreenService; +import org.springblade.modules.business.utils.LocalDateTimeUtils; import org.springblade.modules.system.entity.DictBiz; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.text.ParseException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; /** * 控制器 @@ -75,7 +80,24 @@ public class ReportController extends BladeController { */ @GetMapping("/getAppealList") public R getAppealList(Integer timeFrame, String startTime, String endTime) { - return R.data(largeScreenService.getAppealList()); + LocalDateTime start = null; + LocalDateTime end = null; + if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME); + start = LocalDateTime.parse(startTime, fmt); + end = LocalDateTime.parse(endTime, fmt); + } else if (timeFrame == 1) { + start = LocalDateTimeUtils.monthStartTime(); + end = LocalDateTimeUtils.monthEndTime(); + } else if (timeFrame == 2) { + start = LocalDateTimeUtils.quarterStartTime(); + end = LocalDateTimeUtils.quarterEndTime(); + } else { + start = LocalDateTimeUtils.yearStartTime(); + end = LocalDateTimeUtils.yearEndTime(); + } + + return R.data(largeScreenService.getAppealList(start, end)); } /** @@ -83,7 +105,23 @@ public class ReportController extends BladeController { */ @GetMapping("/getAppealByMon") public R getAppealByMon(Integer timeFrame, String startTime, String endTime) { - return R.data(largeScreenService.getAppealByMon()); + LocalDateTime start = null; + LocalDateTime end = null; + if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME); + start = LocalDateTime.parse(startTime, fmt); + end = LocalDateTime.parse(endTime, fmt); + } else if (timeFrame == 1) { + start = LocalDateTimeUtils.monthStartTime(); + end = LocalDateTimeUtils.monthEndTime(); + } else if (timeFrame == 2) { + start = LocalDateTimeUtils.quarterStartTime(); + end = LocalDateTimeUtils.quarterEndTime(); + } else { + start = LocalDateTimeUtils.yearStartTime(); + end = LocalDateTimeUtils.yearEndTime(); + } + return R.data(largeScreenService.getAppealByMon(start, end)); } /** @@ -91,7 +129,23 @@ public class ReportController extends BladeController { */ @GetMapping("/getAppealTypePercent") public R getAppealTypePercent(Integer timeFrame, String startTime, String endTime) { - return R.data(largeScreenService.getAppealTypePercent()); + LocalDateTime start = null; + LocalDateTime end = null; + if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME); + start = LocalDateTime.parse(startTime, fmt); + end = LocalDateTime.parse(endTime, fmt); + } else if (timeFrame == 1) { + start = LocalDateTimeUtils.monthStartTime(); + end = LocalDateTimeUtils.monthEndTime(); + } else if (timeFrame == 2) { + start = LocalDateTimeUtils.quarterStartTime(); + end = LocalDateTimeUtils.quarterEndTime(); + } else { + start = LocalDateTimeUtils.yearStartTime(); + end = LocalDateTimeUtils.yearEndTime(); + } + return R.data(largeScreenService.getAppealTypePercent(start, end)); } /** @@ -108,7 +162,7 @@ public class ReportController extends BladeController { */ @GetMapping("/getAppealFinishCountByLoc") public R getAppealFinishCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException { - Map dataList = largeScreenService.getAppealFinishCountByLoc(timeFrame, startTime, endTime); + List dataList = largeScreenService.getAppealFinishCountByLoc(timeFrame, startTime, endTime); return R.data(getSortAndData(dataList)); } @@ -126,7 +180,23 @@ public class ReportController extends BladeController { */ @GetMapping("/getImmediateList") public R getImmediateList(String streetId, Integer timeFrame, String startTime, String endTime, Query query) { - return R.data(largeScreenService.getImmediateList(streetId, Condition.getPage(query))); + LocalDateTime start = null; + LocalDateTime end = null; + if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME); + start = LocalDateTime.parse(startTime, fmt); + end = LocalDateTime.parse(endTime, fmt); + } else if (timeFrame == 1) { + start = LocalDateTimeUtils.monthStartTime(); + end = LocalDateTimeUtils.monthEndTime(); + } else if (timeFrame == 2) { + start = LocalDateTimeUtils.quarterStartTime(); + end = LocalDateTimeUtils.quarterEndTime(); + } else { + start = LocalDateTimeUtils.yearStartTime(); + end = LocalDateTimeUtils.yearEndTime(); + } + return R.data(largeScreenService.getImmediateList(streetId, start, end, Condition.getPage(query))); } /** @@ -134,7 +204,88 @@ public class ReportController extends BladeController { */ @GetMapping("/getAppealHot") public R getAppealHot(Integer timeFrame, String startTime, String endTime) { - return R.data(largeScreenService.getAppealHot()); + LocalDateTime start = null; + LocalDateTime end = null; + if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME); + start = LocalDateTime.parse(startTime, fmt); + end = LocalDateTime.parse(endTime, fmt); + } else if (timeFrame == 1) { + start = LocalDateTimeUtils.monthStartTime(); + end = LocalDateTimeUtils.monthEndTime(); + } else if (timeFrame == 2) { + start = LocalDateTimeUtils.quarterStartTime(); + end = LocalDateTimeUtils.quarterEndTime(); + } else { + start = LocalDateTimeUtils.yearStartTime(); + end = LocalDateTimeUtils.yearEndTime(); + } + return R.data(largeScreenService.getAppealHot(start, end)); + } + + @GetMapping("getReportSort") + public R getReportSort(Integer timeFrame, String startTime, String endTime) { + LocalDateTime start = null; + LocalDateTime end = null; + if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME); + start = LocalDateTime.parse(startTime, fmt); + end = LocalDateTime.parse(endTime, fmt); + } else if (timeFrame == 1) { + start = LocalDateTimeUtils.monthStartTime(); + end = LocalDateTimeUtils.monthEndTime(); + } else if (timeFrame == 2) { + start = LocalDateTimeUtils.quarterStartTime(); + end = LocalDateTimeUtils.quarterEndTime(); + } else { + start = LocalDateTimeUtils.yearStartTime(); + end = LocalDateTimeUtils.yearEndTime(); + } + + return R.data(largeScreenService.getReportSort(start, end)); + } + + private Map getSortAndData(List list) { + // 获取全部街道 + List streetDictList = DictBizCache.getList(BusinessConstant.DICT_KEY_STREET); + + // 先将数据根据value做个排名 + list.sort((o1, o2) -> o2.getValue() - o1.getValue()); + + // 构建返回数据 + Map levelMap = new HashMap<>(); + List dataList = new ArrayList<>(); + + for (int idx = 0; idx < list.size(); idx++) { + String streetName = list.get(idx).getName(); + Object streetValue = list.get(idx).getValue(); + if (idx < 4) { + levelMap.put(streetName, 3); + } else if (idx < 8) { + levelMap.put(streetName, 2); + } else { + levelMap.put(streetName, 1); + } + dataList.add(list.get(idx)); + } + + // 遍历全部街道列表, 将未添加的街道数据添加上 + streetDictList.forEach(street -> { + String streetName = street.getDictValue(); + if (!levelMap.containsKey(streetName)) { + levelMap.put(streetName, 1); + DataEntity entity = new DataEntity(); + entity.setName(streetName); + entity.setValue(0); + entity.setResolveRate("0"); + dataList.add(entity); + } + }); + + Map resultMap = new HashMap<>(); + resultMap.put("levelList", levelMap); + resultMap.put("dataList", dataList); + return resultMap; } private Map> getSortAndData(Map dataList) { diff --git a/src/main/java/org/springblade/modules/business/entity/DataEntity.java b/src/main/java/org/springblade/modules/business/entity/DataEntity.java index 8530196..4e2cc4e 100644 --- a/src/main/java/org/springblade/modules/business/entity/DataEntity.java +++ b/src/main/java/org/springblade/modules/business/entity/DataEntity.java @@ -5,7 +5,12 @@ import lombok.Data; @Data public class DataEntity { - private String name; + private String name; - private Integer value; + private Integer value; + + /** + * 化解率 + */ + private String resolveRate; } diff --git a/src/main/java/org/springblade/modules/business/service/ILargeScreenService.java b/src/main/java/org/springblade/modules/business/service/ILargeScreenService.java index 1de398b..0ea9faa 100644 --- a/src/main/java/org/springblade/modules/business/service/ILargeScreenService.java +++ b/src/main/java/org/springblade/modules/business/service/ILargeScreenService.java @@ -23,35 +23,38 @@ import org.springblade.modules.business.entity.DataEntity; import org.springblade.modules.business.excel.AppealExcel; import java.text.ParseException; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.Map; /** - * 服务类 + * 服务类 * * @author BladeX */ public interface ILargeScreenService { - Map getMediateFinish(); + Map getMediateFinish(); - Map getAppealSubmit(); + Map getAppealSubmit(); - List getAppealList(); + List getAppealList(LocalDateTime start, LocalDateTime end); - Map> getAppealByMon(); + Map> getAppealByMon(LocalDateTime start, LocalDateTime end); - List> getAppealTypePercent(); + List> getAppealTypePercent(LocalDateTime start, LocalDateTime end); - Map getAppealSubmitCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException; + Map getAppealSubmitCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException; - Map getAppealFinishCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException; + List getAppealFinishCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException; - Map getImmediateCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException; + Map getImmediateCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException; - Map> getAppealHot(); + Map> getAppealHot(LocalDateTime start, LocalDateTime end); - IPage getImmediateList(String streetId, IPage page); + Map> getReportSort(LocalDateTime start, LocalDateTime end); + + IPage getImmediateList(String streetId, LocalDateTime start, LocalDateTime end, IPage page); } diff --git a/src/main/java/org/springblade/modules/business/service/impl/LargeScreenServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/LargeScreenServiceImpl.java index 7de4d9c..27b8378 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/LargeScreenServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/LargeScreenServiceImpl.java @@ -129,7 +129,7 @@ public class LargeScreenServiceImpl implements ILargeScreenService { } @Override - public List getAppealList() { + public List getAppealList(LocalDateTime start, LocalDateTime end) { // 化解成功状态数组 List state = new ArrayList<>(); state.add(0); @@ -138,6 +138,7 @@ public class LargeScreenServiceImpl implements ILargeScreenService { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // 待处理、正在处理 wrapper.in(Appeal::getStatus, state); + wrapper.between(Appeal::getFirstRegTime, start, end); // 根据登记时间倒序 wrapper.orderByDesc(Appeal::getFirstRegTime); List appeals = appealService.list(wrapper); @@ -160,7 +161,7 @@ public class LargeScreenServiceImpl implements ILargeScreenService { } @Override - public Map> getAppealByMon() { + public Map> getAppealByMon(LocalDateTime start, LocalDateTime end) { Map> map = new HashMap<>(); List dateList = new ArrayList<>(); List handlerCountList = new ArrayList<>(); @@ -193,9 +194,11 @@ public class LargeScreenServiceImpl implements ILargeScreenService { } @Override - public List> getAppealTypePercent() { + public List> getAppealTypePercent(LocalDateTime start, LocalDateTime end) { // 先查所有 - List appeals = appealService.list(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.between(Appeal::getFirstRegTime, start, end); + List appeals = appealService.list(wrapper); appeals.forEach(appeal -> { String disputeName = Func.isEmpty(appeal.getDisputeName()) ? DictBizCache.getById(appeal.getDisputeId()).getDictValue() : appeal.getDisputeName(); appeal.setDisputeName(disputeName); @@ -294,7 +297,7 @@ public class LargeScreenServiceImpl implements ILargeScreenService { } @Override - public Map getAppealFinishCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException { + public List getAppealFinishCountByLoc(Integer timeFrame, String startTime, String endTime) throws ParseException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 化解成功状态数组 @@ -303,7 +306,6 @@ public class LargeScreenServiceImpl implements ILargeScreenService { state.add(3); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(Appeal::getStatus, state); if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { wrapper.between(Appeal::getFirstRegTime, dateFormat.parse(startTime), dateFormat.parse(endTime)); } else if (timeFrame == 1) { @@ -313,21 +315,35 @@ public class LargeScreenServiceImpl implements ILargeScreenService { } else if (timeFrame == 3) { wrapper.between(Appeal::getFirstRegTime, LocalDateTimeUtils.yearStartTime(), LocalDateTimeUtils.yearEndTime()); } - List appeals = appealService.list(wrapper); + List appealList = appealService.list(wrapper); // 过滤掉无街道的, 防止异常 - appeals = appeals.stream().filter(appeal -> Func.isNotEmpty(appeal.getStreetId())).collect(Collectors.toList()); - appeals.forEach(appeal -> appeal.setStreet(DictBizCache.getById(appeal.getStreetId()).getDictValue())); + appealList = appealList.stream().filter(appeal -> Func.isNotEmpty(appeal.getStreetId())).collect(Collectors.toList()); + appealList.forEach(appeal -> appeal.setStreet(DictBizCache.getById(appeal.getStreetId()).getDictValue())); + + List resolveList = appealList.stream().filter(appeal -> state.contains(appeal.getStatus())).collect(Collectors.toList()); // 根据街道分组 - Map> collect = appeals.stream().collect(Collectors.groupingBy(Appeal::getStreet)); + Map> reportList = appealList.stream().collect(Collectors.groupingBy(Appeal::getStreet)); + Map> collect = resolveList.stream().collect(Collectors.groupingBy(Appeal::getStreet)); Set names = collect.keySet(); // 街道对应的数量 - Map map = new HashMap<>(); + List result = new ArrayList<>(); + Map map; for (String name : names) { - map.put(name, collect.get(name).size()); + DataEntity entity = new DataEntity(); + entity.setName(name); + entity.setValue(collect.get(name).size()); + + String resolveRate = "0"; + if (entity.getValue() > 0) { + double rate = (entity.getValue() / reportList.get(name).size()) * 100; + resolveRate = calRate(rate); + } + entity.setResolveRate(resolveRate); + result.add(entity); } - return map; + return result; } @Override @@ -362,11 +378,12 @@ public class LargeScreenServiceImpl implements ILargeScreenService { } @Override - public IPage getImmediateList(String streetId, IPage page) { + public IPage getImmediateList(String streetId, LocalDateTime start, LocalDateTime end, IPage page) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.select(Appeal::getId, Appeal::getFirstRegTime, Appeal::getDisputeId, Appeal::getDisputeName); wrapper.eq(Appeal::getStreetId, streetId); wrapper.eq(Appeal::getSkipGrant, BusinessConstant.CODE_TRUE); + wrapper.between(Appeal::getFirstRegTime, start, end); wrapper.orderByDesc(Appeal::getCreateTime); IPage iPage = appealService.page(page, wrapper); @@ -388,25 +405,31 @@ public class LargeScreenServiceImpl implements ILargeScreenService { } @Override - public Map> getAppealHot() { + public Map> getAppealHot(LocalDateTime start, LocalDateTime end) { Map> map = new HashMap(); // 化解成功状态数组 List state = Arrays.asList(BusinessConstant.APPEAL_STATUS_AGREEMENT, BusinessConstant.APPEAL_STATUS_FINISH); // 获取所有化解成功的诉求记录 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(Appeal::getStatus, state); - List appeals = appealService.list(wrapper); + wrapper.between(Appeal::getFirstRegTime, start, end); + List appealList = appealService.list(wrapper); // 过滤掉无街道和处理部门的, 防止异常 - appeals = appeals.stream().filter( + appealList = appealList.stream().filter( appeal -> Func.isNotEmpty(appeal.getStreetId()) && Func.isNotEmpty(appeal.getHandleDept()) ).collect(Collectors.toList()); + // 获取所有化解成功的诉求记录 + List appealFinishList = appealList.stream().filter( + appeal -> state.contains(appeal.getStatus()) + ).collect(Collectors.toList()); + // 获取所有街道 List dataList = dictService.getList(BusinessConstant.DICT_KEY_STREET); // 根据街道分组 - Map> street = appeals.stream().collect(Collectors.groupingBy(Appeal::getStreetId)); + Map> reportStreetList = appealList.stream().collect(Collectors.groupingBy(Appeal::getStreetId)); + Map> street = appealFinishList.stream().collect(Collectors.groupingBy(Appeal::getStreetId)); // 封装到数据对象 List strees = new ArrayList<>(); @@ -415,6 +438,12 @@ public class LargeScreenServiceImpl implements ILargeScreenService { DataEntity entity = new DataEntity(); entity.setName(dictBiz.getDictValue()); entity.setValue(street.containsKey(dictBizId) ? street.get(dictBizId).size() : 0); + String resolveRate = "0"; + if (entity.getValue() > 0) { + double rate = (entity.getValue() / reportStreetList.get(dictBizId).size()) * 100; + resolveRate = calRate(rate); + } + entity.setResolveRate(resolveRate); strees.add(entity); }); @@ -425,7 +454,8 @@ public class LargeScreenServiceImpl implements ILargeScreenService { // 获取所有部门 List userList = UserCache.getServerWindowList(); // 根据部门分组 - Map> town = appeals.stream().collect(Collectors.groupingBy(Appeal::getHandleDept)); + Map> reportTownList = appealList.stream().collect(Collectors.groupingBy(Appeal::getHandleDept)); + Map> town = appealFinishList.stream().collect(Collectors.groupingBy(Appeal::getHandleDept)); // 封装到数据对象 List towns = new ArrayList<>(); @@ -434,6 +464,16 @@ public class LargeScreenServiceImpl implements ILargeScreenService { DataEntity entity = new DataEntity(); entity.setName(user.getName()); entity.setValue(town.containsKey(id) ? town.get(id).size() : 0); + String resolveRate = "0"; + if (entity.getValue() > 0) { + if (reportTownList.containsKey(id)) { + double rate = (entity.getValue() / reportTownList.get(id).size()) * 100; + resolveRate = calRate(rate); + } else { + resolveRate = "100%"; + } + } + entity.setResolveRate(resolveRate); towns.add(entity); }); @@ -444,6 +484,42 @@ public class LargeScreenServiceImpl implements ILargeScreenService { return map; } + @Override + public Map> getReportSort(LocalDateTime start, LocalDateTime end) { + Map> map = new HashMap(); + + // 获取所有上报的诉求记录 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.between(Appeal::getFirstRegTime, start, end); + List appeals = appealService.list(wrapper); + + // 过滤掉无街道的, 防止异常 + appeals = appeals.stream().filter( + appeal -> Func.isNotEmpty(appeal.getStreetId()) + ).collect(Collectors.toList()); + + // 获取所有街道 + List dataList = dictService.getList(BusinessConstant.DICT_KEY_STREET); + // 根据街道分组 + Map> street = appeals.stream().collect(Collectors.groupingBy(Appeal::getStreetId)); + + // 封装到数据对象 + List strees = new ArrayList<>(); + dataList.forEach(dictBiz -> { + Long dictBizId = dictBiz.getId(); + DataEntity entity = new DataEntity(); + entity.setName(dictBiz.getDictValue()); + entity.setValue(street.containsKey(dictBizId) ? street.get(dictBizId).size() : 0); + strees.add(entity); + }); + + // 倒序 + List streeList = strees.stream().sorted(Comparator.comparing(DataEntity::getValue).reversed()).collect(Collectors.toList()); + map.put("street", streeList); + + return map; + } + private Map> getStartAndEndTime(Map> map, List state, Integer month) { List dateList = map.get("dateList"); List handlerCountList = map.get("handlerCountList"); @@ -474,6 +550,18 @@ public class LargeScreenServiceImpl implements ILargeScreenService { map.put("handlerCountList", handlerCountList); map.put("finishContList", finishContList); return map; + } + + private String calRate(double rate) { + String resolveRate = String.format("%.2f", rate); + + if ("100.00".equalsIgnoreCase(resolveRate)) { + resolveRate = "100"; + } + if ("0.00".equalsIgnoreCase(resolveRate)) { + resolveRate = "0"; + } + return resolveRate + "%"; } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c04202d..130fb2d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -187,6 +187,7 @@ blade: skip-url: - /blade-test/** - /blade-business/report/** + - /blade-business/appealMediate/getLastMediation - /blade-system/dict/common/getStreetList #授权认证配置 auth: