dyh-service/dyh-mediate/src/main/java/cn/huge/module/ai/controller/domain/vo/AiRequestVo.java
@@ -9,4 +9,5 @@ private String caseDes; private String caseClaim; private String caseId; } dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/controller/AnalysisWebController.java
@@ -1,21 +1,27 @@ package cn.huge.module.analysis.controller; import cn.huge.base.common.bo.ReturnBO; import cn.huge.base.common.utils.ReturnFailUtils; import cn.huge.base.common.utils.ReturnSucUtils; import cn.huge.base.config.CurrentUser; import cn.huge.module.analysis.domain.dto.CountRepeateDto; import cn.huge.module.analysis.domain.vo.CountRepeateVo; import cn.huge.module.analysis.service.AnalysisService; import cn.huge.module.cases.domain.po.CaseInfo; import cn.huge.module.cases.service.CaseInfoService; import com.google.common.collect.Maps; import cn.huge.module.client.api.impl.CustClientImpl; import cn.huge.module.cust.dto.CtUnitDTO; import cn.huge.module.cust.dto.CtUserDTO; import dm.jdbc.util.StringUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @title: 纠纷信息主表接口api-web端 @@ -35,8 +41,189 @@ @Autowired private AnalysisService service; @Autowired private CustClientImpl custClient; /** * 统计重复来访案件数量-根据案件类型分组 * @url {ctx}/api/web/analysis/countRepeatedCasesByCaseType * @param * @return Object */ @GetMapping("/countRepeatedCasesByCaseType") public ReturnBO countRepeatedCasesByCaseType(@RequestBody CountRepeateVo countRepeateVo) { try{ countRepeateVo.setGroupByCaseType("true"); List<CountRepeateDto> countRepeateDtoList = service.countRepeatedCases(countRepeateVo); return ReturnSucUtils.getRepInfo("请求成功",countRepeateDtoList); }catch (Exception e){ log.error("统计重复来访案件数量异常",e); return ReturnFailUtils.getRepInfo(e.getMessage()); } } /** * 统计重复来访案件数量-根据地区分组 * @url {ctx}/api/web/analysis/countRepeatedCasesByArea * @param * @return Object */ @GetMapping("/countRepeatedCasesByArea") public ReturnBO countRepeatedCasesByArea(@RequestBody CountRepeateVo countRepeateVo) { try{ // 判断 countRepeateVo 的 queRoad 是否为空 // 如果 queRoad 和 queArea 都为空且 queCity 不为空,则设置 groupByArea 为 true 根据 区 聚合 if (StringUtil.isEmpty(countRepeateVo.getQueRoad()) && StringUtil.isEmpty(countRepeateVo.getQueArea()) && ! StringUtil.isEmpty(countRepeateVo.getQueCity())) { countRepeateVo.setGroupByArea("true"); } // 如果 queRoad 为空且 queCity 和 queArea 不为空,则设置 groupByRoad 为 true 根据 街道 聚合 else if (StringUtil.isEmpty(countRepeateVo.getQueRoad()) && ! StringUtil.isEmpty(countRepeateVo.getQueArea()) && ! StringUtil.isEmpty(countRepeateVo.getQueCity())) { countRepeateVo.setGroupByRoad("true"); } List<CountRepeateDto> countRepeateDtoList = service.countRepeatedCases(countRepeateVo); if (countRepeateDtoList.size() == 1 && StringUtil.isEmpty(countRepeateDtoList.get(0).getGroupByType())) { countRepeateDtoList.get(0).setGroupByType("本级"); } return ReturnSucUtils.getRepInfo("请求成功",countRepeateDtoList); }catch (Exception e){ log.error("统计重复来访案件数量异常",e); return ReturnFailUtils.getRepInfo(e.getMessage()); } } /** * 统计重复来访案件数量-根据案件类型分组 * @url {ctx}/api/web/analysis/countRepeatedCasesByCaseType * @param * @return Object */ @GetMapping("/countRepeatedCasesByTime") public ReturnBO countRepeatedCasesByTime(@RequestBody CountRepeateVo countRepeateVo) { try{ DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String dayTypeStr = "day"; String monthTypeStr = "month"; String yearTypeStr = "year"; LocalDate start = LocalDate.parse(countRepeateVo.getCreateTimeStart(), DATE_TIME_FORMATTER); LocalDate end = LocalDate.parse(countRepeateVo.getCreateTimeEnd(), DATE_TIME_FORMATTER); long daysBetween = java.time.temporal.ChronoUnit.DAYS.between(start, end); if (daysBetween < 15) { countRepeateVo.setGroupByTime(dayTypeStr); } else if ((daysBetween >= 15) && (daysBetween < 365)) { countRepeateVo.setGroupByTime(monthTypeStr); } else { countRepeateVo.setGroupByTime(yearTypeStr); } List<CountRepeateDto> countRepeateDtoList = service.countRepeatedCases(countRepeateVo); if (!countRepeateDtoList.isEmpty()){ String timeFormatter = ""; if (dayTypeStr.equals(countRepeateVo.getGroupByTime())){ timeFormatter = "日"; } else if (monthTypeStr.equals(countRepeateVo.getGroupByTime())) { timeFormatter = "月"; } else if (yearTypeStr.equals(countRepeateVo.getGroupByTime())) { timeFormatter = "年"; } for (CountRepeateDto countRepeateDto : countRepeateDtoList) { // 按 “-”切割字符串,获取最后一个元素 String[] split = countRepeateDto.getGroupByType().split("-"); String lastElement = split[split.length - 1]; // 判断 lastElement 是否为小于 13 的数字,如果是,则将类型转换为int if (lastElement.matches("^\\d+$")) { lastElement = String.valueOf(Integer.parseInt(lastElement)); } countRepeateDto.setGroupByType(lastElement + timeFormatter); } } return ReturnSucUtils.getRepInfo("请求成功",countRepeateDtoList); }catch (Exception e){ log.error("统计重复来访案件数量异常",e); return ReturnFailUtils.getRepInfo(e.getMessage()); } } private List<String> getDaysList(LocalDate start, LocalDate end) { List<String> days = new ArrayList<>(); while (!start.isAfter(end)) { days.add(start.toString()); start = start.plusDays(1); } return days; } private List<String> getMonthsList(LocalDate start, LocalDate end) { List<String> months = new ArrayList<>(); while (!start.isAfter(end)) { String month = start.getMonth().name().substring(0, 3); // 例如 "JAN" // 获取中文月份 switch (month) { case "JAN": month = "一月"; break; case "FEB": month = "二月"; break; case "MAR": month = "三月"; break; case "APR": month = "四月"; break; case "MAY": month = "五月"; break; case "JUN": month = "六月"; break; case "JUL": month = "七月"; break; case "AUG": month = "八月"; break; case "SEP": month = "九月"; break; case "OCT": month = "十月"; break; case "NOV": month = "十一月"; break; case "DEC": month = "十二月"; break; } if (!months.contains(month)) { months.add(month); } start = start.plusMonths(1); } // return months.stream().map(m -> m + "月").collect(Collectors.toList()); return months; } private List<String> getYearsList(LocalDate start, LocalDate end) { List<String> years = new ArrayList<>(); while (!start.isAfter(end)) { String year = Integer.toString(start.getYear()); if (!years.contains(year)) { years.add(year); } start = start.plusYears(1); } return years.stream().map(y -> y + "年").collect(Collectors.toList()); } } dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/AnalysisMapper.java
@@ -1,14 +1,12 @@ package cn.huge.module.analysis.dao.mapper; import cn.huge.module.cases.domain.dto.*; import cn.huge.module.analysis.domain.dto.CountRepeateDto; import cn.huge.module.analysis.domain.vo.CountRepeateVo; import cn.huge.module.cases.domain.po.CaseInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Map; /** * @title: 纠纷信息主表持久层业务处理 @@ -21,6 +19,7 @@ @Repository public interface AnalysisMapper extends BaseMapper<CaseInfo>{ List<CountRepeateDto> countRepeatedCases(CountRepeateVo countRepeateVo); } dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/xml/AnalysisMapper.xml
@@ -199,4 +199,81 @@ <include refid="statisticsSuperviseAVG-wherePart"/> </select> <!-- 统计重复来访案件数量 --> <select id="countRepeatedCases" resultType="cn.huge.module.analysis.domain.dto.CountRepeateDto" parameterType="cn.huge.module.analysis.domain.vo.CountRepeateVo"> WITH RepeatedPersons AS ( SELECT true_name, mobile, certi_no FROM gzdyh_test.dyh_case_person WHERE per_type = '15_020008-1' AND per_class = '09_01001-1' AND certi_type = '09_00015-1' GROUP BY true_name, mobile, certi_no HAVING COUNT(*) > 1 ), MinCaseIds AS ( SELECT rp.true_name, rp.mobile, rp.certi_no, MIN(p.case_id) as min_case_id FROM RepeatedPersons rp JOIN gzdyh_test.dyh_case_person p ON rp.true_name = p.true_name AND rp.mobile = p.mobile AND rp.certi_no = p.certi_no GROUP BY rp.true_name, rp.mobile, rp.certi_no ), FilteredCases AS ( SELECT p.case_id FROM gzdyh_test.dyh_case_person p JOIN RepeatedPersons rp ON p.true_name = rp.true_name AND p.mobile = rp.mobile AND p.certi_no = rp.certi_no JOIN MinCaseIds mci ON rp.true_name = mci.true_name AND rp.mobile = mci.mobile AND rp.certi_no = mci.certi_no WHERE p.case_id != mci.min_case_id ) SELECT <if test="groupByCaseType != null and groupByCaseType != ''"> case_type_first_name as groupByType, </if> <if test="groupByArea != null and groupByArea != ''"> area_name as groupByType, </if> <if test="groupByRoad != null and groupByRoad != ''"> road_name as groupByType, </if> <if test="groupByTime != null and groupByTime != ''"> <if test="groupByTime == 'day'"> DATE_FORMAT(ci.create_time, '%Y-%m-%d') as groupByType, </if> <if test="groupByTime == 'month'"> DATE_FORMAT(ci.create_time, '%Y-%m') as groupByType, </if> <if test="groupByTime == 'year'"> DATE_FORMAT(ci.create_time, '%Y') as groupByType, </if> </if> COUNT(DISTINCT fc.case_id) as repeatCount FROM FilteredCases fc JOIN gzdyh_test.dyh_case_info ci ON fc.case_id = ci.id JOIN gzdyh_test.dyh_case_info_unfold cui ON ci.id = cui.id JOIN gzdyh_test.dyh_ct_unit unit ON cui.mediate_unit_id = unit.id WHERE 1=1 <if test="createTimeStart != null and createTimeStart != '' and createTimeEnd != null and createTimeEnd != ''"> AND ci.create_time BETWEEN #{createTimeStart} AND #{createTimeEnd} </if> <if test="queCity != null and queCity != ''"> AND unit.city = #{queCity} </if> <if test="queArea != null and queArea != ''"> AND unit.area = #{queArea} </if> <if test="queRoad != null and queRoad != ''"> AND unit.road = #{queRoad} </if> <if test="groupByCaseType != null and groupByCaseType != ''"> GROUP BY case_type_first_name </if> <if test="groupByArea != null and groupByArea != ''"> GROUP BY area_name </if> <if test="groupByRoad != null and groupByRoad != ''"> GROUP BY road_name </if> <if test="groupByTime != null and groupByTime != ''"> GROUP BY groupByType </if> </select> </mapper> dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/dto/CountRepeateDto.java
New file @@ -0,0 +1,15 @@ package cn.huge.module.analysis.domain.dto; import lombok.Data; @Data public class CountRepeateDto { /** *聚合类型 */ private String groupByType; /** * 数量 */ private Integer repeatCount; } dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/vo/CountRepeateVo.java
New file @@ -0,0 +1,58 @@ package cn.huge.module.analysis.domain.vo; import lombok.Data; import java.util.Date; @Data public class CountRepeateVo { /** * 事项进度,1:来访登记,2:事件流转,3:办理反馈,4:结案审核,5:当事人评价,6:结案归档,7:不予受理 */ private Integer processStatus; /** * 创建时间区间 */ private String createTimeStart; private String createTimeEnd; /** * 案件案由类型 */ private String caseType; /** * 归属地编码-市 */ private String queCity; /** * 归属地编码-区 */ private String queArea; /** * 归属地编码-街道 */ private String queRoad; /** * 查询时间聚合标记 */ private String groupByTime; /** * 查询案件类型聚合标记 */ private String groupByCaseType; /** * 查询归属地-区编码聚合标记 */ private String groupByArea; /** * 查询归属地-街道编码聚合标记 */ private String groupByRoad; } dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/service/AnalysisService.java
@@ -1,45 +1,18 @@ package cn.huge.module.analysis.service; import cn.huge.base.common.exception.ServiceException; import cn.huge.base.common.utils.*; import cn.huge.module.analysis.dao.mapper.AnalysisMapper; import cn.huge.module.analysis.domain.dto.CountRepeateDto; import cn.huge.module.analysis.domain.vo.CountRepeateVo; import cn.huge.module.cases.dao.mapper.CaseInfoMapper; import cn.huge.module.cases.domain.dto.*; import cn.huge.module.cases.domain.po.CaseAgent; import cn.huge.module.cases.domain.po.CaseInfo; import cn.huge.module.cases.domain.po.CaseInfoUnfold; import cn.huge.module.cases.domain.po.CasePerson; import cn.huge.module.cases.service.*; import cn.huge.module.client.api.impl.CustClientImpl; import cn.huge.module.client.api.impl.SysClientImpl; import cn.huge.module.client.api.impl.UtilsClientImpl; import cn.huge.module.constant.BaseConsts; import cn.huge.module.cust.dto.CtUserDTO; import cn.huge.module.cust.dto.PaUserDTO; import cn.huge.module.draft.service.CasedraftInfoService; import cn.huge.module.mediate.constant.*; import cn.huge.module.mediate.dto.WechatBindCaseDTO; import cn.huge.module.sys.dto.FileIdTypeInfoBaseDTO; import cn.huge.module.sys.dto.QueAddrBaseDTO; import cn.huge.module.sys.dto.QueAreaDTO; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; import java.util.List; /** * @author wangwh @@ -60,6 +33,13 @@ @Autowired private UtilsClientImpl utilsClient; @Autowired private AnalysisMapper analysisMapper; public List<CountRepeateDto> countRepeatedCases(CountRepeateVo countRepeateVo) { return analysisMapper.countRepeatedCases(countRepeateVo); }