From 411ebc9c06c2f987b4d8deb2a9a1496ab39b55ea Mon Sep 17 00:00:00 2001
From: huangh <hshgjzd5@163.com>
Date: Mon, 28 Oct 2024 16:34:39 +0800
Subject: [PATCH] Merge branch 'faeture/gzdyh_countRepeated_20241025' into gzdyh_test

---
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/service/AnalysisService.java          |   40 +----
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/controller/AnalysisWebController.java |  201 +++++++++++++++++++++++++++-
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/xml/AnalysisMapper.xml     |   77 +++++++++++
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/ai/controller/domain/vo/AiRequestVo.java       |    1 
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/dto/CountRepeateDto.java       |   15 ++
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/vo/CountRepeateVo.java         |   58 ++++++++
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/AnalysisMapper.java        |    7 
 7 files changed, 358 insertions(+), 41 deletions(-)

diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/ai/controller/domain/vo/AiRequestVo.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/ai/controller/domain/vo/AiRequestVo.java
index a7ba869..e3d3dde 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/ai/controller/domain/vo/AiRequestVo.java
+++ b/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;
+
 }
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/controller/AnalysisWebController.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/controller/AnalysisWebController.java
index 865f8f4..97af59e 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/controller/AnalysisWebController.java
+++ b/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());
+    }
 }
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/AnalysisMapper.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/AnalysisMapper.java
index a78f61d..a12cd5b 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/AnalysisMapper.java
+++ b/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);
 
 
 }
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/xml/AnalysisMapper.xml b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/xml/AnalysisMapper.xml
index af7666f..57d00e0 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/dao/mapper/xml/AnalysisMapper.xml
+++ b/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> 
\ No newline at end of file
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/dto/CountRepeateDto.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/dto/CountRepeateDto.java
new file mode 100644
index 0000000..ae123b8
--- /dev/null
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/dto/CountRepeateDto.java
@@ -0,0 +1,15 @@
+package cn.huge.module.analysis.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class CountRepeateDto {
+    /**
+     *聚合类型
+     */
+    private String groupByType;
+    /**
+     * 数量
+     */
+    private Integer repeatCount;
+}
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/vo/CountRepeateVo.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/vo/CountRepeateVo.java
new file mode 100644
index 0000000..28d6297
--- /dev/null
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/domain/vo/CountRepeateVo.java
@@ -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;
+}
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/service/AnalysisService.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/service/AnalysisService.java
index 0aaf9a6..4574636 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/analysis/service/AnalysisService.java
+++ b/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);
+    }
+
 
 
 

--
Gitblit v1.8.0