From f7dd6c04223ea30a535e7f340d620435102aad8b Mon Sep 17 00:00:00 2001 From: zhouxiantao <1026371446@qq.com> Date: Thu, 19 Sep 2024 17:32:43 +0800 Subject: [PATCH] 纠纷态势分析 --- dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePageDTO.java | 4 dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsTypeDTO.java | 15 + dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java | 9 dyh-service/dyh-base/src/main/java/cn/huge/base/common/utils/BigDecimalUtil.java | 314 ++++++++++++++++++++++ dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsBaseDTO.java | 38 ++ dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsSourceDTO.java | 20 + dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/web/CaseInfoWebController.java | 77 +++-- dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml | 160 ++++++++--- dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsAreaDTO.java | 17 + dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java | 136 +++++++++ 10 files changed, 717 insertions(+), 73 deletions(-) diff --git a/dyh-service/dyh-base/src/main/java/cn/huge/base/common/utils/BigDecimalUtil.java b/dyh-service/dyh-base/src/main/java/cn/huge/base/common/utils/BigDecimalUtil.java new file mode 100644 index 0000000..71a38da --- /dev/null +++ b/dyh-service/dyh-base/src/main/java/cn/huge/base/common/utils/BigDecimalUtil.java @@ -0,0 +1,314 @@ +package cn.huge.base.common.utils; + +import org.springframework.util.ObjectUtils; + +import java.math.BigDecimal; + +/** + * @author zhouxiantao + * @date 2024/9/19 5:43 下午 + */ +public class BigDecimalUtil { + + //add,subtract,multiply,divide + + public static Double add(String first,String second){ + return toBigDecimal(first).add(toBigDecimal(second)).doubleValue(); + } + + public static Double add(Double first,Double second){ + return add(first.toString(),second.toString()); + } + + public static Double subtract(String first,String second){ + return toBigDecimal(first).subtract(toBigDecimal(second)).doubleValue(); + } + + public static Double subtract(Double first,Double second){ + return subtract(first.toString(),second.toString()); + } + + public static Double multiply(String first,String second){ + return toBigDecimal(first).multiply(toBigDecimal(second)).doubleValue(); + } + + public static Double multiply(Double first,Double second){ + return multiply(first.toString(),second.toString()); + } + + public static Double multiply(Integer first,Integer second){ + return multiply(first.toString(),second.toString()); + } + + /** + * @param first + * @param second + * @param scale 保留小数点位数 + * @param roundingMode 进位规则 + */ + public static Double divide(String first,String second, Integer scale, Integer roundingMode){ + if(null==second){ + return (double) 0; + } + if(0==Double.valueOf(second)){ + return (double) 0; + } + return toBigDecimal(first).divide(toBigDecimal(second), scale, roundingMode).doubleValue(); + } + + + public static String divideScale(String first, String second, Integer scale, Integer roundingMode){ + return toBigDecimal(first).divide(toBigDecimal(second), scale, roundingMode).toString(); + + } + + public static Double divideRoundHalf(Integer first, Integer second) { + if (null == second) { + return (double) 0; + } + if (0 == second.intValue()) { + return (double) 0; + } + return divide(first.toString(), second.toString(), 2, BigDecimal.ROUND_HALF_UP); + } + + public static Double divide(Double first,Double second, Integer scale, Integer roundingMode){ + return divide(first.toString(),second.toString(), scale, roundingMode); + } + + public static Double divide(Integer first,Integer second, Integer scale, Integer roundingMode){ + if(null==second){ + return (double) 0; + } + if(0==second.intValue()){ + return (double) 0; + } + return divide(first.toString(),second.toString(), scale, roundingMode); + } + + public static BigDecimal toBigDecimal(String number){ + return new BigDecimal(number); + } + + public static BigDecimal toBigDecimal(Double number){ + return toBigDecimal(number.toString()); + } + + public static Double getPercent(Double number){ + return number * 100; + } + + /** + * @param first + * @param second + * @param scale 保留小数点位数 + * 进阶规则:四舍五入 + * 去掉小数点后面多余的0 + * */ + public static Double divideDelZero(Double first,Double second, Integer scale) { + if(ObjectUtils.isEmpty(second) || ObjectUtils.isEmpty(first)){ + return (double) 0; + } + if(second == 0 || first == 0){ + return (double) 0; + } + Double number = divide(first, second, scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal numberD =new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP); + BigDecimal noZeros = numberD.stripTrailingZeros(); + return noZeros.doubleValue(); + } + + /** + * @param first + * @param second + * @param scale 保留小数点位数 + * 进阶规则:四舍五入 + * 去掉小数点后面多余的0 + * */ + public static String divideToString(Double first,Double second, Integer scale) { + if(ObjectUtils.isEmpty(second) || ObjectUtils.isEmpty(first)){ + return "0"; + } + if(second == 0 || first == 0){ + return "0"; + } + Double number = divide(first, second, scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal numberD =new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP); + BigDecimal noZeros = numberD.stripTrailingZeros(); + return noZeros.toPlainString(); + } + + /** + * @param first + * @param second + * @param scale 保留小数点位数 + * 进阶规则:四舍五入 + * 去掉小数点后面多余的0 + * */ + public static String integerDivideDelZero(Integer first,Integer second, Integer scale) { + if(ObjectUtils.isEmpty(second) || ObjectUtils.isEmpty(first)){ + return "0"; + } + if(second == 0 || first == 0){ + return "0"; + } + Double number = divide(first, second, scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal numberD =new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP); + BigDecimal noZeros = numberD.stripTrailingZeros(); + return noZeros.toPlainString(); + } + + /** + * 字符串数字保留一位小数点,并且去掉小数点后面多余的0 + * 进阶规则:四舍五入 + * */ + public static String strDelZero(String number) { + BigDecimal numberD =new BigDecimal(number).setScale(1, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal noZeros = numberD.stripTrailingZeros(); + String result = noZeros.toPlainString(); + return result; + } + + /** + * double保留对应的小数点,并且去掉小数点后面多余的0 + * 进阶规则:四舍五入 + * */ + public static Double doubleDelZero(Double number,Integer scale) { + BigDecimal numberD =new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal noZeros = numberD.stripTrailingZeros(); + return noZeros.doubleValue(); + } + + /** + * double保留对应的小数点,并且去掉小数点后面多余的0 + * 进阶规则:四舍五入 + * */ + public static String doubleToString(Double number,Integer scale) { + if(ObjectUtils.isEmpty(number)) { + return "0"; + } + BigDecimal numberD =new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal noZeros = numberD.stripTrailingZeros(); + String result = noZeros.toPlainString(); + return result; + } + + /** + * float保留对应的小数点,并且去掉小数点后面多余的0 + * 进阶规则:四舍五入 + * */ + public static String floatToString(Float number,Integer scale) { + if(ObjectUtils.isEmpty(number)) { + return "0"; + } + BigDecimal numberD =new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal noZeros = numberD.stripTrailingZeros(); + String result = noZeros.toPlainString(); + return result; + } + + /** + * 百分比x100 保留对应的小数点,并且去掉小数点后面多余的0 + * 进阶规则:四舍五入 + * */ + public static String percentDelZero(Double number,Integer scale) { + BigDecimal numberD =new BigDecimal(number*100).setScale(scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal noZeros = numberD.stripTrailingZeros(); + String result = noZeros.toPlainString(); + return result; + } + + /** + * 如果double为null返回0 + * */ + public static double stringToDouble(String number) { + if(ObjectUtils.isEmpty(number) || "null".equals(number)) { + return 0d; + } + return Double.valueOf(number); + } + + /** + * 如果Integer为null返回0 + * */ + public static Integer stringToInteger(String number) { + if(ObjectUtils.isEmpty(number)|| "null".equals(number)) { + return 0; + } + return Integer.valueOf(number); + } + + /** + * double保留对应的小数点,并且去掉小数点后面多余的0 + * 进阶规则:四舍五入 + * */ + public static String stringDelZero(String number,Integer scale) { + if(ObjectUtils.isEmpty(number)) { + return "0"; + } + BigDecimal numberD =new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal noZeros = numberD.stripTrailingZeros(); + String result = noZeros.toPlainString(); + return result; + } + + /** + * double转Integer + * 进阶规则:向上取整 + * */ + public static Integer doubleToIntegerUp(Double number) { + BigDecimal numberD =new BigDecimal(number).setScale(0, BigDecimal.ROUND_UP); + //去掉小数点后面的0 + return numberD.intValue(); + } + + /** + * double保留对应的小数点,并且去掉小数点后面多余的0 + * 进阶规则:四舍五入 + * */ + public static Double doubleUp(Double number,Integer scale) { + if(ObjectUtils.isEmpty(number)) { + return 0d; + } + BigDecimal numberD =new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP); + //去掉小数点后面的0 + BigDecimal noZeros = numberD.stripTrailingZeros(); + return noZeros.doubleValue(); + } + + public static Integer dellNull(Integer number){ + if(ObjectUtils.isEmpty(number)) { + return 0; + } + return number; + } + + public static Double dellNull(Double number){ + if(ObjectUtils.isEmpty(number)) { + return 0d; + } + return number; + } + + public static void main(String args[]) { + int a = 2*100; + int b = 37; + +// String calResult = divideScale("2", "519", 3, BigDecimal.ROUND_HALF_UP); +// +// System.out.println(integerDivideDelZero(1111, 100, 2)); + System.out.println(stringDelZero("202.23000000000002",2)); + + } + + +} diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/web/CaseInfoWebController.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/web/CaseInfoWebController.java index 84d5c44..d839f7d 100644 --- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/web/CaseInfoWebController.java +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/web/CaseInfoWebController.java @@ -55,6 +55,36 @@ @Autowired private CaseInfoService service; + private Map<String,Object> getParameterAll() { + Map<String, Object> terms = getParameter(); +// // 来访时间 + String visitTimeStart = request.getParameter("visitTimeStart"); + String visitTimeEnd = request.getParameter("visitTimeEnd"); + if(StringUtils.isNotBlank(visitTimeStart) && StringUtils.isNotBlank(visitTimeEnd)) { + terms.put("visitTimeStart", visitTimeStart + " 00:00:00"); + terms.put("visitTimeEnd", visitTimeEnd + " 23:59:59"); + } + String createStart = request.getParameter("createStart"); + String createEnd = request.getParameter("createEnd"); + if(StringUtils.isNotBlank(createStart) && StringUtils.isNotBlank(createEnd)) { + terms.put("createStart", createStart+ " 00:00:00"); + terms.put("createEnd", createEnd+ " 23:59:59"); + } + String closeStart = request.getParameter("closeStart"); + String closeEnd = request.getParameter("closeEnd"); + if(StringUtils.isNotBlank(closeStart) && StringUtils.isNotBlank(closeEnd)) { + terms.put("createStart", closeStart+ " 00:00:00"); + terms.put("createEnd", closeEnd+ " 23:59:59"); + } + String fileStart = request.getParameter("fileStart"); + String fileEnd = request.getParameter("fileEnd"); + if(StringUtils.isNotBlank(fileStart) && StringUtils.isNotBlank(fileEnd)) { + terms.put("createStart", fileStart+ " 00:00:00"); + terms.put("createEnd", fileEnd+ " 23:59:59"); + } + return terms; + } + /** * 获取请求URL参数 * @return Map<String, Object> @@ -551,33 +581,7 @@ @GetMapping("/pageQueryAll") public Object pageQueryAll(@RequestParam(value = "page") int page, @RequestParam(value = "size") int size) { try { - Map<String, Object> terms = getParameter(); -// // 来访时间 - String visitTimeStart = request.getParameter("visitTimeStart"); - String visitTimeEnd = request.getParameter("visitTimeEnd"); - if(StringUtils.isNotBlank(visitTimeStart) && StringUtils.isNotBlank(visitTimeEnd)) { - terms.put("visitTimeStart", visitTimeStart + " 00:00:00"); - terms.put("visitTimeEnd", visitTimeEnd + " 23:59:59"); - } - String createStart = request.getParameter("createStart"); - String createEnd = request.getParameter("createEnd"); - if(StringUtils.isNotBlank(createStart) && StringUtils.isNotBlank(createEnd)) { - terms.put("createStart", createStart+ " 00:00:00"); - terms.put("createEnd", createEnd+ " 23:59:59"); - } - String closeStart = request.getParameter("closeStart"); - String closeEnd = request.getParameter("closeEnd"); - if(StringUtils.isNotBlank(closeStart) && StringUtils.isNotBlank(closeEnd)) { - terms.put("createStart", closeStart+ " 00:00:00"); - terms.put("createEnd", closeEnd+ " 23:59:59"); - } - String fileStart = request.getParameter("fileStart"); - String fileEnd = request.getParameter("fileEnd"); - if(StringUtils.isNotBlank(fileStart) && StringUtils.isNotBlank(fileEnd)) { - terms.put("createStart", fileStart+ " 00:00:00"); - terms.put("createEnd", fileEnd+ " 23:59:59"); - } - + Map<String, Object> terms = getParameterAll(); Sort sort = Sort.by(Sort.Direction.DESC, "a.create_time"); PageRequest pageRequest = PageRequest.of(page-1, size, sort); Page<CasePageDTO> caseInfoPage = service.pageQueryAll(pageRequest, terms); @@ -597,7 +601,7 @@ @RequestMapping("/exportQueryAll") public void exportQueryAll(HttpServletResponse response) { try { - Map<String, Object> terms = getParameter(); + Map<String, Object> terms = getParameterAll(); Sort sort = Sort.by(Sort.Direction.DESC, "a.create_time"); PageRequest pageRequest = PageRequest.of(0, 1000000, sort); Page<CasePageDTO> caseInfoPage = service.pageQueryAll(pageRequest, terms); @@ -639,4 +643,21 @@ } } + + /** + * 综合查询 + * @url {ctx}/api/web/caseInfo/statistics + * @return Object + * @CurrentUser String userId + */ + @GetMapping("/statistics") + public Object statistics() { + try { + Map<String, Object> terms = getParameterAll(); + return ReturnSucUtils.getRepInfo( "处理成功", service.statistics(terms)); + } catch (Exception e) { + log.error("Controller接口[CaseInfoWebController.statistics]请求异常:"+e, e); + return ReturnFailUtils.getRepInfo(); + } + } } diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java index ed1d224..3c9ae2f 100644 --- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java @@ -1,6 +1,6 @@ package cn.huge.module.cases.dao.mapper; -import cn.huge.module.cases.domain.dto.CasePageDTO; +import cn.huge.module.cases.domain.dto.*; import cn.huge.module.cases.domain.po.CaseInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; @@ -84,4 +84,11 @@ */ List<CasePageDTO> pageTermsAll(@Param("page") PageRequest page, @Param("terms") Map<String, Object> terms); + List<CaseStatisticsAreaDTO> statisticsArea(@Param("terms") Map<String, Object> terms); + + CaseStatisticsBaseDTO statisticsBase(@Param("terms") Map<String, Object> terms); + + List<CaseStatisticsTypeDTO> statisticsType(@Param("terms") Map<String, Object> terms); + + CaseStatisticsSourceDTO statisticsSource(@Param("terms") Map<String, Object> terms); } diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml index 7d34a14..416174b 100644 --- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml @@ -102,6 +102,7 @@ <result property="agreeType" column="agree_type"/> <result property="agreeTypeName" column="agree_type_name"/> <result property="agreeContent" column="agree_content"/> + <result property="createTime" column="create_time"/> </resultMap> <!-- 表 --> <sql id='table-name'>dyh_case_info</sql> @@ -116,6 +117,7 @@ a.case_type_name, a.input_unit_id, a.input_unit_name, + a.create_time, b.medi_result, b.medi_result_name, b.mediate_unit_id, @@ -273,50 +275,66 @@ <!-- 条件 --> <sql id="where-part-all"> <if test="terms != null"> - <if test="terms.status != null and terms.status !=''"> - and a.status = #{terms.status} - </if> - <if test="terms.statusName != null and terms.statusName !=''"> - and a.status_name = #{terms.statusName} - </if> - <if test="terms.canal != null and terms.canal !=''"> - and a.canal = #{terms.canal} - </if> - <if test="terms.canalName != null and terms.canalName !=''"> - and a.canal_name = #{terms.canalName} - </if> - <if test="terms.caseLevel != null and terms.caseLevel !=''"> - and a.case_level = #{terms.caseLevel} - </if> - <if test="terms.caseType != null and terms.caseType !=''"> - and a.case_type = #{terms.caseType} - </if> - <if test="terms.caseTypeName != null and terms.caseTypeName !=''"> - and a.case_type_name = #{terms.caseTypeName} - </if> - <if test="terms.inputUnitId != null and terms.inputUnitId !=''"> - and a.input_unit_id = #{terms.inputUnitId} - </if> - <if test="terms.inputUnitName != null and terms.inputUnitName !=''"> - and a.input_unit_name = #{terms.inputUnitName} - </if> - <if test="terms.visitTimeStart != null and terms.visitTimeStart !='' and terms.visitTimeEnd != null and terms.visitTimeEnd !=''"> - and (DATE_FORMAT(a.visit_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{terms.visitTimeStart} - and DATE_FORMAT(a.visit_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{terms.visitTimeEnd}) - </if> - <if test="terms.createStart != null and terms.createStart !='' and terms.createEnd != null and terms.createEnd !=''"> - and (DATE_FORMAT(a.create_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{terms.createStart} - and DATE_FORMAT(a.create_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{terms.createEnd}) - </if> - <if test="terms.closeStart != null and terms.closeStart !='' and terms.closeEnd != null and terms.closeEnd !=''"> - and (DATE_FORMAT(b.close_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{terms.closeStart} - and DATE_FORMAT(b.close_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{terms.closeEnd}) - </if> - <if test="terms.fileStart != null and terms.fileStart !='' and terms.fileEnd != null and terms.fileEnd !=''"> - and (DATE_FORMAT(b.file_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{terms.fileStart} - and DATE_FORMAT(b.file_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{terms.fileEnd}) - </if> - + <where> + <if test="terms.status != null and terms.status !=''"> + and a.status = #{terms.status} + </if> + <if test="terms.statusName != null and terms.statusName !=''"> + and a.status_name = #{terms.statusName} + </if> + <if test="terms.canal != null and terms.canal !=''"> + and a.canal = #{terms.canal} + </if> + <if test="terms.canalName != null and terms.canalName !=''"> + and a.canal_name = #{terms.canalName} + </if> + <if test="terms.caseLevel != null and terms.caseLevel !=''"> + and a.case_level = #{terms.caseLevel} + </if> + <if test="terms.caseType != null and terms.caseType !=''"> + and a.case_type = #{terms.caseType} + </if> + <if test="terms.caseTypeName != null and terms.caseTypeName !=''"> + and a.case_type_name = #{terms.caseTypeName} + </if> + <if test="terms.inputUnitId != null and terms.inputUnitId !=''"> + and a.input_unit_id = #{terms.inputUnitId} + </if> + <if test="terms.inputUnitName != null and terms.inputUnitName !=''"> + and a.input_unit_name = #{terms.inputUnitName} + </if> + <if test="terms.visitTimeStart != null and terms.visitTimeStart !='' and terms.visitTimeEnd != null and terms.visitTimeEnd !=''"> + and (DATE_FORMAT(a.visit_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{terms.visitTimeStart} + and DATE_FORMAT(a.visit_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{terms.visitTimeEnd}) + </if> + <if test="terms.createStart != null and terms.createStart !='' and terms.createEnd != null and terms.createEnd !=''"> + and (DATE_FORMAT(a.create_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{terms.createStart} + and DATE_FORMAT(a.create_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{terms.createEnd}) + </if> + <if test="terms.closeStart != null and terms.closeStart !='' and terms.closeEnd != null and terms.closeEnd !=''"> + and (DATE_FORMAT(b.close_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{terms.closeStart} + and DATE_FORMAT(b.close_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{terms.closeEnd}) + </if> + <if test="terms.fileStart != null and terms.fileStart !='' and terms.fileEnd != null and terms.fileEnd !=''"> + and (DATE_FORMAT(b.file_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ >= ]]> #{terms.fileStart} + and DATE_FORMAT(b.file_time,'%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> #{terms.fileEnd}) + </if> + <if test="terms.queProv != null and terms.queProv !=''"> + and a.que_prov = #{terms.queProv} + </if> + <if test="terms.queCity != null and terms.queCity !=''"> + and a.que_city = #{terms.queCity} + </if> + <if test="terms.queArea != null and terms.queArea !=''"> + and a.que_area = #{terms.queArea} + </if> + <if test="terms.queRoad != null and terms.queRoad !=''"> + and a.que_road = #{terms.queRoad} + </if> + <if test="terms.isArea != null and terms.isArea !=''"> + and a.que_city is not null + </if> + </where> </if> </sql> <!-- 条件 --> @@ -659,4 +677,58 @@ limit #{page.offset}, #{page.size} </select> + <!-- 统计分析(区域) --> + <select id="statisticsArea" resultType="cn.huge.module.cases.domain.dto.CaseStatisticsAreaDTO"> + SELECT + a.que_area as areaCode,a.que_area_name as areaName,count(1) as caseNum, + sum(case when b.medi_result = '22_00025-1' then 1 else 0 end) as resolveNum, + sum(case when b.medi_result is null and a.info_process <![CDATA[ < ]]> 4 then 1 else 0 end) as resolveingNum, + sum(case when b.medi_result = '22_00025-2' then 1 else 0 end) as unResolveNum + FROM + dyh_case_info a LEFT JOIN dyh_case_info_unfold b on a.id = b.id + <include refid="where-part-all"/> + group by a.que_area + </select> + <!-- 统计分析(基础) --> + <select id="statisticsBase" resultType="cn.huge.module.cases.domain.dto.CaseStatisticsBaseDTO"> + SELECT + count(1) as totalNum, + sum(case when b.medi_result = '22_00025-1' then 1 else 0 end) as resolveNum, + sum(case when b.medi_result is null and a.info_process <![CDATA[ < ]]> 4 then 1 else 0 end) as resolveingNum, + sum(case when b.medi_result = '22_00025-2' then 1 else 0 end) as unResolveNum, + sum(case when a.case_level = 1 then 1 else 0 end) as oneLevelNum, + sum(case when a.case_level = 2 then 1 else 0 end) as twoLevelNum, + sum(case when a.case_level = 3 then 1 else 0 end) as threeLevelNum, + sum(case when a.info_process <![CDATA[ < ]]> 3 then 1 else 0 end) as processNum, + sum(case when a.info_process = 3 then 1 else 0 end) as finishNum, + sum(case when a.info_process = 4 then 1 else 0 end) as rejectNum + FROM + dyh_case_info a LEFT JOIN dyh_case_info_unfold b on a.id = b.id + <include refid="where-part-all"/> + </select> + <!-- 统计分析(类型) --> + <select id="statisticsType" resultType="cn.huge.module.cases.domain.dto.CaseStatisticsTypeDTO"> + SELECT + a.case_type as caseType,a.case_type_name as caseTypeName,count(1) as caseNum + FROM + dyh_case_info a LEFT JOIN dyh_case_info_unfold b on a.id = b.id + <include refid="where-part-all"/> + group by a.case_type + </select> + + <!-- 统计分析(来源) --> + <select id="statisticsSource" resultType="cn.huge.module.cases.domain.dto.CaseStatisticsSourceDTO"> + SELECT + a.canal,a.canal_name as canalName,count(1) as caseNum, + sum(case when b.medi_result = '22_00025-1' then 1 else 0 end) as resolveNum, + sum(case when b.medi_result is null and a.info_process <![CDATA[ < ]]> 4 then 1 else 0 end) as resolveingNum, + sum(case when b.medi_result = '22_00025-2' then 1 else 0 end) as unResolveNum, + sum(case when a.info_process = 4 then 1 else 0 end) as rejectNum + FROM + dyh_case_info a LEFT JOIN dyh_case_info_unfold b on a.id = b.id + <include refid="where-part-all"/> + group by a.canal + </select> + + </mapper> \ No newline at end of file diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePageDTO.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePageDTO.java index c29b15f..c0361a9 100644 --- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePageDTO.java +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePageDTO.java @@ -93,6 +93,10 @@ */ private Date closeTime; /** + * 登记时间 + */ + private Date createTime; + /** * 达成协议类型 */ private String agreeType; diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsAreaDTO.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsAreaDTO.java new file mode 100644 index 0000000..a4051f2 --- /dev/null +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsAreaDTO.java @@ -0,0 +1,17 @@ +package cn.huge.module.cases.domain.dto; + +import lombok.Data; + +/** + * @author zhouxiantao + * @create 2024-09-18 15:13 + */ +@Data +public class CaseStatisticsAreaDTO { + private String areaName;//区域名称 + private String areaCode;//区域编码 + private Integer caseNum=0;//案件总量 + private Integer resolveNum=0;//化解成功数量 + private Integer resolveingNum=0;//化解中数量 + private Integer unResolveNum=0;//化解不成功数量 +} diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsBaseDTO.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsBaseDTO.java new file mode 100644 index 0000000..5448d97 --- /dev/null +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsBaseDTO.java @@ -0,0 +1,38 @@ +package cn.huge.module.cases.domain.dto; + +import lombok.Data; +import java.util.List; + +/** + * @author zhouxiantao + * @create 2024-09-18 15:04 + */ +@Data +public class CaseStatisticsBaseDTO { + private Integer totalNum=0;//总记录数 + private Integer processNum=0;//办理中数量 + private Integer finishNum=0;//已结案数量 + private Integer rejectNum=0;//不予受理数量 + private Integer resolveNum=0;//化解成功数量 + private String resolveRate;//化解成功率 + private Integer unResolveNum=0;//化解不成功数量 + private String unResolveRate;//化解不成功率 + private Integer resolveingNum=0;//化解中数量 + private String resolveingRate;//化解中率 + + private Integer oneLevelNum=0;//1级事件数量 + private Integer twoLevelNum=0;//2级事件数量 + private Integer threeLevelNum=0;//3级事件数量 + private String oneLevelRate;//1级事件数量百分比 + private String twoLevelRate;//2级事件数量百分比 + private String threeLevelRate;//3级事件数量百分比 + + private List<CaseStatisticsAreaDTO> areaList;//区域集合 + private CaseStatisticsSourceDTO oneSource;//大厅来访 + private CaseStatisticsSourceDTO twoSource;//线上来访 + private CaseStatisticsSourceDTO threeSource;//自行排查 + private CaseStatisticsSourceDTO fourSource;//协同推送 + private List<CaseStatisticsTypeDTO> typeList;//纠纷类型集合 + + private List<CasePageDTO> caseList;//案件集合(实时动态) +} diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsSourceDTO.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsSourceDTO.java new file mode 100644 index 0000000..df982b5 --- /dev/null +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsSourceDTO.java @@ -0,0 +1,20 @@ +package cn.huge.module.cases.domain.dto; + +import lombok.Data; + +/** + * @author zhouxiantao + * @create 2024-09-18 15:23 + */ +@Data +public class CaseStatisticsSourceDTO { + private String canal;//事项来源 + private String canalName;//事项来源名称 + private Integer caseNum=0;//案件数量 + private String caseRate;//案件数量占比 + private Integer resolveNum=0;//化解成功数量 + private Integer resolveingNum=0;//化解中数量 + private Integer unResolveNum=0;//化解不成功数量 + private String resolveRate;//化解成功率 + private Integer rejectNum=0;//不予受理数量 +} diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsTypeDTO.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsTypeDTO.java new file mode 100644 index 0000000..3fa76f1 --- /dev/null +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsTypeDTO.java @@ -0,0 +1,15 @@ +package cn.huge.module.cases.domain.dto; + +import lombok.Data; + +/** + * @author zhouxiantao + * @create 2024-09-18 15:28 + */ +@Data +public class CaseStatisticsTypeDTO { + private String caseType;//纠纷类型 + private String caseTypeName;//纠纷类型名称 + private Integer caseNum=0;//案件数量 + private String caseRate;//百分比 +} diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java index 1feada6..e26abb9 100644 --- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java +++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java @@ -28,6 +28,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -891,4 +892,139 @@ } return new PageImpl<CasePageDTO>(content, page, total); } + + public CaseStatisticsBaseDTO statistics(Map<String, Object> terms){ + //基础数据统计 + CaseStatisticsBaseDTO caseStatisticsBaseDTO = mapper.statisticsBase(terms); + Integer baseTotalNum = dellNull(caseStatisticsBaseDTO.getResolveNum()) + dellNull(caseStatisticsBaseDTO.getUnResolveNum())+ dellNull(caseStatisticsBaseDTO.getResolveingNum()); + caseStatisticsBaseDTO.setResolveRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsBaseDTO.getResolveNum()*100, baseTotalNum,1)); + caseStatisticsBaseDTO.setUnResolveRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsBaseDTO.getUnResolveNum()*100, baseTotalNum,1)); + caseStatisticsBaseDTO.setResolveingRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsBaseDTO.getResolveingNum()*100, baseTotalNum,1)); + Integer levelTotalNum = caseStatisticsBaseDTO.getOneLevelNum() + caseStatisticsBaseDTO.getTwoLevelNum() + caseStatisticsBaseDTO.getThreeLevelNum(); + caseStatisticsBaseDTO.setOneLevelRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsBaseDTO.getOneLevelNum()*100, levelTotalNum,1)); + caseStatisticsBaseDTO.setTwoLevelRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsBaseDTO.getTwoLevelNum()*100, levelTotalNum,1)); + caseStatisticsBaseDTO.setThreeLevelRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsBaseDTO.getThreeLevelNum()*100, levelTotalNum,1)); + //区域数据统计 + terms.put("isArea","1"); + List<CaseStatisticsAreaDTO> caseStatisticsAreaDTOS = mapper.statisticsArea(terms); + if(ObjectUtils.isEmpty(caseStatisticsAreaDTOS)){ + caseStatisticsAreaDTOS = new ArrayList<>(); + } + CaseStatisticsAreaDTO allArea = new CaseStatisticsAreaDTO(); + allArea.setAreaName("本级"); + allArea.setAreaCode("1"); + for (CaseStatisticsAreaDTO caseStatisticsAreaDTO : caseStatisticsAreaDTOS) { + allArea.setCaseNum(dellNull(caseStatisticsAreaDTO.getCaseNum()) + dellNull(allArea.getCaseNum())); + allArea.setResolveNum(dellNull(caseStatisticsAreaDTO.getResolveNum()) + dellNull(allArea.getResolveNum())); + allArea.setUnResolveNum(dellNull(caseStatisticsAreaDTO.getUnResolveNum()) + dellNull(allArea.getUnResolveNum())); + allArea.setResolveingNum(dellNull(caseStatisticsAreaDTO.getResolveingNum()) + dellNull(allArea.getResolveingNum())); + } + caseStatisticsAreaDTOS.add(allArea); + if(ObjectUtils.isNotEmpty(caseStatisticsAreaDTOS)){ + sortArea(caseStatisticsAreaDTOS); + } + caseStatisticsBaseDTO.setAreaList(caseStatisticsAreaDTOS); + terms.remove("isArea"); + //纠纷类型统计 + List<CaseStatisticsTypeDTO> caseStatisticsTypeDTOS = mapper.statisticsType(terms); + if(ObjectUtils.isNotEmpty(caseStatisticsTypeDTOS)){ + sortType(caseStatisticsTypeDTOS); + } + Integer typeTotalNum = 0; + Integer otherCaseNum = 0; + int i = 1; + List<CaseStatisticsTypeDTO> typeList = new ArrayList<>(); + for (CaseStatisticsTypeDTO caseStatisticsTypeDTO : caseStatisticsTypeDTOS) { + typeTotalNum = typeTotalNum + dellNull(caseStatisticsTypeDTO.getCaseNum()); + if(i > 5){ + otherCaseNum = otherCaseNum + dellNull(caseStatisticsTypeDTO.getCaseNum()); + }else{ + typeList.add(caseStatisticsTypeDTO); + } + i++; + } + for (CaseStatisticsTypeDTO caseStatisticsTypeDTO : typeList) { + caseStatisticsTypeDTO.setCaseRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsTypeDTO.getCaseNum()*100, typeTotalNum,1)); + } + CaseStatisticsTypeDTO caseStatisticsTypeDTO = new CaseStatisticsTypeDTO(); + caseStatisticsTypeDTO.setCaseTypeName("其他"); + caseStatisticsTypeDTO.setCaseNum(otherCaseNum); + caseStatisticsTypeDTO.setCaseRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsTypeDTO.getCaseNum()*100, typeTotalNum,1)); + typeList.add(caseStatisticsTypeDTO); + caseStatisticsBaseDTO.setTypeList(typeList); + //事项来源 + terms.put("canal",CaseBaseConstsEnum.CASE_CANAL_1.getIndex()); + CaseStatisticsSourceDTO oneSource = mapper.statisticsSource(terms); + oneSource.setCanalName(CaseBaseConstsEnum.CASE_CANAL_1.getDes()); + terms.put("canal",CaseBaseConstsEnum.CASE_CANAL_2.getIndex()); + CaseStatisticsSourceDTO twoSource = mapper.statisticsSource(terms); + twoSource.setCanalName(CaseBaseConstsEnum.CASE_CANAL_2.getDes()); + + Integer sourceTotalNum = dellNull(oneSource.getCaseNum()) + dellNull(oneSource.getCaseNum()); + oneSource.setCaseRate(BigDecimalUtil.integerDivideDelZero(oneSource.getCaseNum()*100, sourceTotalNum,1)); + oneSource.setResolveRate(BigDecimalUtil.integerDivideDelZero(oneSource.getResolveNum()*100, oneSource.getCaseNum(),1)); + twoSource.setCaseRate(BigDecimalUtil.integerDivideDelZero(twoSource.getCaseNum()*100, sourceTotalNum,1)); + twoSource.setResolveRate(BigDecimalUtil.integerDivideDelZero(twoSource.getResolveNum()*100, twoSource.getCaseNum(),1)); + + CaseStatisticsSourceDTO threeSource = new CaseStatisticsSourceDTO(); + threeSource.setCanalName("自行排查"); + threeSource.setResolveRate("0"); + threeSource.setCaseRate("0"); + CaseStatisticsSourceDTO fourSource = new CaseStatisticsSourceDTO(); + fourSource.setCanalName("协同推送"); + fourSource.setResolveRate("0"); + fourSource.setCaseRate("0"); + caseStatisticsBaseDTO.setOneSource(oneSource); + caseStatisticsBaseDTO.setTwoSource(twoSource); + caseStatisticsBaseDTO.setThreeSource(threeSource); + caseStatisticsBaseDTO.setFourSource(fourSource); + + //案件集合 + Sort sort = Sort.by(Sort.Direction.DESC, "a.create_time"); + PageRequest pageRequest = PageRequest.of(0, 5, sort); + Page<CasePageDTO> casePageDTOS = pageQueryAll(pageRequest, terms); + if(ObjectUtils.isNotEmpty(casePageDTOS.getContent())){ + caseStatisticsBaseDTO.setCaseList(casePageDTOS.getContent()); + }else{ + caseStatisticsBaseDTO.setCaseList(new ArrayList<>()); + } + return caseStatisticsBaseDTO; + } + + public List<CaseStatisticsTypeDTO> sortType(List<CaseStatisticsTypeDTO> caseStatisticsTypeDTOS){ + caseStatisticsTypeDTOS.sort((o1, o2)->{ + Integer totalScore1 = o1.getCaseNum(); + Integer totalScore2 = o2.getCaseNum(); + if(totalScore1 < totalScore2) { + return 1; + }else if (totalScore1.equals(totalScore2)){ + return 0; + }else{ + return -1; + } + }); + return caseStatisticsTypeDTOS; + } + + public List<CaseStatisticsAreaDTO> sortArea(List<CaseStatisticsAreaDTO> caseStatisticsAreaDTOS){ + caseStatisticsAreaDTOS.sort((o1, o2)->{ + Integer totalScore1 = Integer.valueOf(o1.getAreaCode()); + Integer totalScore2 = Integer.valueOf(o2.getAreaCode()); + if(totalScore1 > totalScore2) { + return 1; + }else if (totalScore1.equals(totalScore2)){ + return 0; + }else{ + return -1; + } + }); + return caseStatisticsAreaDTOS; + } + + public Integer dellNull(Integer number){ + if(ObjectUtils.isEmpty(number)){ + return 0; + } + return number; + } } -- Gitblit v1.8.0