广州市综治平台后端
zhouxiantao
5 days ago 140170b48b50c33dc68558dc7d97ccd65bffbc7d
fix:解纷态势和纠纷台账的调整
1 files added
6 files modified
781 ■■■■■ changed files
dyh-service/dyh-cust/src/main/java/cn/huge/module/ctuser/dto/CtUnitTreeDTO.java 1 ●●●● patch | view | raw | blame | history
dyh-service/dyh-cust/src/main/java/cn/huge/module/utils/TreeUtils.java 47 ●●●● patch | view | raw | blame | history
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/web/CaseInfoWebController.java 98 ●●●● patch | view | raw | blame | history
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml 38 ●●●●● patch | view | raw | blame | history
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsBaseDTO.java 17 ●●●● patch | view | raw | blame | history
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java 563 ●●●●● patch | view | raw | blame | history
sql/20250620.sql 17 ●●●●● patch | view | raw | blame | history
dyh-service/dyh-cust/src/main/java/cn/huge/module/ctuser/dto/CtUnitTreeDTO.java
@@ -14,5 +14,6 @@
    private String label;//对象名称
    private String parentId;//父类ID
    private Boolean checkable;
    private Double sort;//排序
    private List<CtUnitTreeDTO> children;//子类集合
}
dyh-service/dyh-cust/src/main/java/cn/huge/module/utils/TreeUtils.java
@@ -4,9 +4,7 @@
import cn.huge.module.ctuser.dto.CtUnitTreeDTO;
import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.*;
/**
 * @author zhouxiantao
@@ -60,20 +58,22 @@
        List<CtUnitTreeDTO> termsList = new ArrayList<>();
        if(ObjectUtils.isNotEmpty(termsSet)){
            for (CtUnitTreeDTO selectTermDTO : termsSet) {
                termsList.add(selectTermDTO);
            }
            termsList.sort((o1, o2)->{
                String s1 = o1.getValue().replaceAll("[^0-9]", "");
                String s1 = selectTermDTO.getValue().replaceAll("[^0-9]", "");
                if(ObjectUtils.isEmpty(s1)){
                    s1 = "0";
                }
                String s2 = o2.getValue().replaceAll("[^0-9]", "");
                if(ObjectUtils.isEmpty(s2)){
                    s2 = "0";
                }
                Double totalScore1 = Double.valueOf(s1);
                Double totalScore2 = Double.valueOf(s2);
                if(totalScore1 < totalScore2) {
                selectTermDTO.setSort(totalScore1);
                String area = getArea(selectTermDTO.getLabel());
                if(ObjectUtils.isNotEmpty(area)){
                    selectTermDTO.setSort(Double.valueOf(area));
                }
                termsList.add(selectTermDTO);
            }
            termsList.sort((o1, o2)->{
                Double totalScore1 = o1.getSort();
                Double totalScore2 = o2.getSort();
                if(totalScore1 > totalScore2) {
                    return 1;
                }else if (totalScore1.equals(totalScore2)) {
                    return 0;
@@ -85,4 +85,25 @@
        return termsList;
    }
    public static String getArea(String areaName) {
        Map<String, String> map = new HashMap<>();
        map.put("越秀区", "2");
        map.put("海珠区", "3");
        map.put("荔湾区", "4");
        map.put("天河区", "5");
        map.put("白云区", "6");
        map.put("黄埔区", "7");
        map.put("花都区", "8");
        map.put("番禺区", "9");
        map.put("南沙区", "10");
        map.put("从化区", "11");
        map.put("增城区", "12");
        for (String s : map.keySet()) {
            if(areaName.contains(s)){
                return map.get(s);
            }
        }
        return null;
    }
}
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/web/CaseInfoWebController.java
@@ -1307,83 +1307,41 @@
            // 查询类型 1-本系统,2-12345,3-人民调解,4-信访,5-劳动仲裁,6-非警务纠纷
            String ledgerType = request.getParameter("ledgerType");
            if("1".equals(ledgerType)){
                terms.put("canalList", Arrays.asList("22_00001-1","22_00001-2","22_00001-3"));
            }else if("2".equals(ledgerType)){
                terms.put("canal", "22_00001-4");
                terms.put("canalSecond", "22_00003-3");
                terms.put("canalSecondNot", "22_00003-2");
            }else if("6".equals(ledgerType)){
                terms.put("canal", "22_00001-4");
                terms.put("canalSecond", "22_00003-4");
                terms.put("canalSecondNot", "22_00003-2");
            }else if("4".equals(ledgerType)){
                terms.put("canal", "22_00001-4");
                terms.put("canalSecond", "22_00003-6");
                terms.put("canalSecondNot", "22_00003-2");
            }else if("5".equals(ledgerType)){
                terms.put("canal", "22_00001-4");
                terms.put("canalSecond", "22_00003-5");
                terms.put("canalSecondNot", "22_00003-2");
            }else if("3".equals(ledgerType)){
                terms.put("canal", "22_00001-4");
                terms.put("canalSecond", "22_00003-1");
                terms.put("canalSecondNot", "22_00003-2");
            }else{
                terms.put("canalSecondAll", "22_00003-2");
            //所有表里面的数据都是本系统,其他的后续会新建表存储
            if(ObjectUtils.isNotEmpty(ledgerType) && !"1".equals(ledgerType)){
                terms.put("canal", "-1");
            }
            return ReturnSucUtils.getRepInfo("处理成功", service.ledger(terms, userId));
            return ReturnSucUtils.getRepInfo("处理成功", service.ledger(terms, userId, ledgerType));
        } catch (Exception e) {
            log.error("Controller接口[CaseInfoWebController.ledger]请求异常:" + e, e);
            return ReturnFailUtils.getRepInfo();
        }
    }
    // /**
    //  * 解纷态势
    //  *
    //  * @return Object
    //  * @url {ctx}/api/web/caseInfo/ledger
    //  * @CurrentUser String userId
    //  */
    // @GetMapping("/ledger")
    // public Object ledger(@CurrentUser String userId) {
    //     try {
    //         Map<String, Object> terms = getParameterAll();
    //         // 查询类型 1-本系统,2-12345,3-人民调解,4-信访,5-劳动仲裁,6-非警务纠纷
    //         String ledgerType = request.getParameter("ledgerType");
    //
    //         if("1".equals(ledgerType)){
    //             terms.put("canalList", Arrays.asList("22_00001-1","22_00001-2","22_00001-3"));
    //         }else if("2".equals(ledgerType)){
    //             terms.put("canal", "22_00001-4");
    //             terms.put("canalSecond", "22_00003-3");
    //             terms.put("canalSecondNot", "22_00003-2");
    //         }else if("3".equals(ledgerType)){
    //             terms.put("canal", "22_00001-4");
    //             terms.put("canalSecond", "22_00003-4");
    //             terms.put("canalSecondNot", "22_00003-2");
    //         }else if("4".equals(ledgerType)){
    //             terms.put("canal", "22_00001-4");
    //             terms.put("canalSecond", "22_00003-6");
    //             terms.put("canalSecondNot", "22_00003-2");
    //         }else if("5".equals(ledgerType)){
    //             terms.put("canal", "22_00001-4");
    //             terms.put("canalSecond", "22_00003-5");
    //             terms.put("canalSecondNot", "22_00003-2");
    //         }else if("6".equals(ledgerType)){
    //             terms.put("canal", "22_00001-4");
    //             terms.put("canalSecond", "22_00003-1");
    //             terms.put("canalSecondNot", "22_00003-2");
    //         }else{
    //             terms.put("canalSecondAll", "22_00003-2");
    //         }
    //         return ReturnSucUtils.getRepInfo("处理成功", service.ledger(terms, userId));
    //     } catch (Exception e) {
    //         log.error("Controller接口[CaseInfoWebController.ledger]请求异常:" + e, e);
    //         return ReturnFailUtils.getRepInfo();
    //     }
    // }
    /**
     * 解纷态势
     *
     * @return Object
     * @url {ctx}/api/web/caseInfo/ledgerCount
     * @CurrentUser String userId
     */
    @GetMapping("/ledgerCount")
    public Object ledgerCount(@CurrentUser String userId) {
        try {
            Map<String, Object> terms = getParameterAll();
            // 查询类型 1-本系统,2-12345,3-人民调解,4-信访,5-劳动仲裁,6-非警务纠纷
            String ledgerType = request.getParameter("ledgerType");
            //所有表里面的数据都是本系统,其他的后续会新建表存储
            if(ObjectUtils.isNotEmpty(ledgerType) && !"1".equals(ledgerType)){
                terms.put("canal", "-1");
            }
            return ReturnSucUtils.getRepInfo("处理成功", service.ledgerCount(terms, userId));
        } catch (Exception e) {
            log.error("Controller接口[CaseInfoWebController.ledger]请求异常:" + e, e);
            return ReturnFailUtils.getRepInfo();
        }
    }
    /**
     * 查询重复事项
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml
@@ -411,22 +411,6 @@
                <if test="terms.mediatorId != null and terms.mediatorId !=''">
                    and b.mediator_id = #{terms.mediatorId}
                </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.queCity != null and terms.queCity !="" and terms.statistics != null and terms.areaType == "1"'>
                    and (b.belong_unit_id is not null and c.city = #{terms.queCity}
                    <if test="terms.unitGrades != null and terms.unitGrades.size > 0">
@@ -576,6 +560,22 @@
                </if>
                <if test="terms.systemSource != null and terms.systemSource !=''">
                    and b.sys_source = #{systemSource}
                </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 (a.create_time <![CDATA[ >= ]]> #{terms.createStart}
                    and a.create_time <![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>
@@ -1124,7 +1124,11 @@
                when a.info_process = 1 then 1   else 0 end) as processNum,
        sum(case when a.info_process = 3 and b.medi_result = '22_00025-1' then 1 else 0 end) as finishNum,
        sum(case when a.info_process = 4 then 1 else 0 end) as rejectNum,
        sum(case when a.info_process = 3 and b.medi_result = '22_00025-2' then 1 else 0 end) as failNum
        sum(case when a.info_process = 3 and b.medi_result = '22_00025-2' then 1 else 0 end) as failNum,
        sum(case when a.canal_second = '22_00003-8' then 1 else 0 end) as bmpcNum,
        sum(case when a.canal_second = '22_00003-2' then 1 else 0 end) as wgpcNum,
        sum(case when a.canal_second = '22_00003-1' then 1 else 0 end) as fjwjfNum,
        sum(case when a.canal_second = '22_00003-7' then 1 else 0 end) as zxjfNum
        FROM
        dyh_case_info a
        inner JOIN dyh_case_info_unfold b on a.id = b.id
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseStatisticsBaseDTO.java
@@ -1,6 +1,8 @@
package cn.huge.module.cases.domain.dto;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
@@ -28,6 +30,15 @@
    private Integer failNum=0;//化解不成功数量
    private String failRate;//化解不成功率
    private Integer bmpcNum;//部门排查
    private String bmpcCode="22_00003-8";//部门排查编码
    private Integer wgpcNum;//网格排查
    private String wgpcCode="22_00003-2";//网格排查编码
    private Integer fjwjfNum;//非警务纠纷
    private String fjwjfCode="22_00003-1";//非警务纠纷编码
    private Integer zxjfNum;//专项纠纷
    private String zxjfCode="22_00003-7";//专项纠纷编码
    private Integer oneLevelNum=0;//1级事件数量
    private Integer twoLevelNum=0;//2级事件数量
    private Integer threeLevelNum=0;//3级事件数量
@@ -43,7 +54,7 @@
    private CaseStatisticsSourceDTO oneSecondSource;//非警务纠纷
    private CaseStatisticsSourceDTO twoSecondSource;//12345
    private CaseStatisticsSourceDTO threeSecondSource;//网格上报
    private List<CaseStatisticsTypeDTO> typeList;//纠纷类型集合
    private List<CaseStatisticsTypeDTO> typeList = new ArrayList<>();//纠纷类型集合
    private List<CasePageDTO> caseList;//案件集合(实时动态)
@@ -61,8 +72,8 @@
    private String xfRate;//信访占比
    private Integer ldzcNum=0;//劳动仲裁数
    private String ldzcRate;//劳动仲裁占比
    private Integer fjwjfNum=0;//非警务纠纷数
    private String fjwjfRate;//非警务纠纷占比
    private Integer tzfjwjfNum=0;//非警务纠纷数
    private String tzfjwjfRate;//非警务纠纷占比
//    private Integer allNum=0;//全部数
//    private Integer sysNum=0;//本系统数
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java
@@ -1488,29 +1488,8 @@
            }
            areaTotal = areaTotal + caseStatisticsAreaDTO.getCaseNum();
            //本及:承办单位是本及和没有承办单位并且没有下级区域编码
//            if(ObjectUtils.isEmpty(caseStatisticsAreaDTO.getAreaCode()) || unitGrades.contains(caseStatisticsAreaDTO.getUnitGrade())){
//                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()));
//            }else{
//                areaList.add(caseStatisticsAreaDTO);
//                areaCodeList.add(caseStatisticsAreaDTO.getAreaCode());
//            }
        }
        areaList.add(allArea);
//        if ("1".equals(areaType)) {
//            Map<String, String> area = getArea();
//            for (String areaName : area.keySet()) {
//                if (!areaNames.contains(areaName)) {
//                    CaseStatisticsAreaDTO areaChild = new CaseStatisticsAreaDTO();
//                    areaChild.setAreaCode(area.get(areaName));
//                    areaChild.setAreaName(areaName);
//                    areaList.add(areaChild);
//                }
//            }
//        }
        List<QueAreaDTO> queArea = listAreaByType(areaCode);
        log.info("listAreaByType {}", JSON.toJSONString(queArea));
@@ -1549,12 +1528,6 @@
            } else {
                otherCaseNum = otherCaseNum + dellNull(caseStatisticsTypeDTO.getCaseNum());
            }
//            if (i > 5) {
//                otherCaseNum = otherCaseNum + dellNull(caseStatisticsTypeDTO.getCaseNum());
//            } else {
//                typeList.add(caseStatisticsTypeDTO);
//            }
        }
        for (CaseStatisticsTypeDTO caseStatisticsTypeDTO : typeList) {
            caseStatisticsTypeDTO.setCaseRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsTypeDTO.getCaseNum() * 100, typeTotalNum, 1));
@@ -2124,34 +2097,220 @@
        return caseOverviewDetailDTOs;
    }
    public CaseStatisticsBaseDTO ledger(Map<String, Object> terms, String userId) throws IOException {
        // 备份原始的类型筛选条件,用于后续恢复
        Map<String, Object> originalTypeTerms = new HashMap<>();
        if (terms.containsKey("canal")) {
            originalTypeTerms.put("canal", terms.get("canal"));
    public CaseStatisticsBaseDTO ledger(Map<String, Object> terms, String userId,String ledgerType) throws IOException {
        terms.put("statistics", "1");
        CtUnitDTO ctUnitDTO = null;
        if (ObjectUtils.isNotEmpty(userId)) {
            ctUnitDTO = custClient.getUnitByUserId(userId);
        }
        if (terms.containsKey("canalSecond")) {
            originalTypeTerms.put("canalSecond", terms.get("canalSecond"));
        String areaCode = null;
        //目前没有村居数据,所以单位等级是4的也归集到3里面
        if (ObjectUtils.isNotEmpty(ctUnitDTO)) {
            if (ctUnitDTO.getUnitGrade().equals(1)) {
                terms.put("queCity", ctUnitDTO.getCity());
            } else if (ctUnitDTO.getUnitGrade().equals(2)) {
                terms.put("queArea", ctUnitDTO.getArea());
            } else if (ctUnitDTO.getUnitGrade().equals(3)) {
                terms.put("queRoad", ctUnitDTO.getRoad());
            } else if (ctUnitDTO.getUnitGrade().equals(4)) {
                terms.put("queVillage", ctUnitDTO.getVillage());
        }
        if (terms.containsKey("canalList")) {
            originalTypeTerms.put("canalList", terms.get("canalList"));
        }
        if (terms.containsKey("canalSecondNot")) {
            originalTypeTerms.put("canalSecondNot", terms.get("canalSecondNot"));
        }
        if (terms.containsKey("canalSecondAll")) {
            originalTypeTerms.put("canalSecondAll", terms.get("canalSecondAll"));
        }
        // 临时移除类型筛选条件,以便 statistics 获取全量数据
        terms.remove("canal");
        terms.remove("canalSecond");
        terms.remove("canalList");
        terms.remove("canalSecondNot");
        terms.remove("canalSecondAll");
        //目前没有村居,所以区和街道进来都是按街道展示
        String areaType = null;
        String childAreaType = null;
        List<Integer> unitGrades = new ArrayList<>();
        List<Integer> childUnitGrades = new ArrayList<>();
        String childUnitGradeStr = null;
        String unitGradeStr = null;
        Boolean isLast = false;
        if (ObjectUtils.isNotEmpty(terms.get("queVillage"))) {
            terms.remove("queArea");
            terms.remove("queCity");
            terms.remove("queRoad");
            areaType = "4";
            childAreaType = "5";
            areaCode = terms.get("queVillage") + "";
            unitGrades.add(4);
            childUnitGrades.add(5);
            childUnitGradeStr = "5";
            unitGradeStr = "4";
            isLast = true;
        } else if (ObjectUtils.isNotEmpty(terms.get("queRoad"))) {
            terms.remove("queArea");
            terms.remove("queCity");
            areaType = "3";
            childAreaType = "4";
            areaCode = terms.get("queRoad") + "";
            unitGrades.add(3);
            childUnitGrades.add(4);
            childUnitGradeStr = "4";
            unitGradeStr = "3";
        } else if (ObjectUtils.isNotEmpty(terms.get("queArea"))) {
            terms.remove("queCity");
            areaType = "2";
            childAreaType = "3";
            areaCode = terms.get("queArea") + "";
            unitGrades.add(2);
            childUnitGrades.add(3);
            childUnitGrades.add(4);
            childUnitGradeStr = "3,4";
            unitGradeStr = "2";
        } else {
            areaType = "1";
            childAreaType = "2";
            unitGrades.add(1);
            childUnitGrades.add(2);
            childUnitGrades.add(3);
            childUnitGrades.add(4);
            if (ObjectUtils.isNotEmpty(ctUnitDTO)) {
                areaCode = ctUnitDTO.getCity();
            } else {
                areaCode = "440100";
            }
            childUnitGradeStr = "2,3,4";
            unitGradeStr = "1";
        }
        //基础数据统计
        terms.put("areaType", areaType);
        // 调用统计调解过程的方法
        CaseStatisticsBaseDTO caseStatisticsBaseDTO = new CaseStatisticsBaseDTO();
        List<String> areaCodeList = new ArrayList<>();
        List<CaseStatisticsAreaDTO> areaList = new ArrayList<>();
        //本系统或者全部的时候才去查询数据
        if(ObjectUtils.isEmpty(ledgerType) || "1".equals(ledgerType)){
            caseStatisticsBaseDTO = statisticsProcess(terms);
            //区域数据统计
            List<CaseStatisticsAreaDTO> caseStatisticsAreaDTOS = new ArrayList<>();
            if (!isLast) {
                terms.put("areaType", childAreaType);
                terms.put("unitGrades", childUnitGrades);
                caseStatisticsAreaDTOS = mapper.statisticsArea(terms);
                if (ObjectUtils.isEmpty(caseStatisticsAreaDTOS)) {
                    caseStatisticsAreaDTOS = new ArrayList<>();
                } else {
                    for (CaseStatisticsAreaDTO caseStatisticsAreaDTO : caseStatisticsAreaDTOS) {
                        caseStatisticsAreaDTO.setAreaType(childAreaType);
                        caseStatisticsAreaDTO.setUnitGrades(childUnitGradeStr);
                        if ("4".equals(childAreaType)) {
                            caseStatisticsAreaDTO.setQueVillage(caseStatisticsAreaDTO.getAreaCode());
                        } else if ("3".equals(childAreaType)) {
                            caseStatisticsAreaDTO.setQueRoad(caseStatisticsAreaDTO.getAreaCode());
                        } else if ("2".equals(childAreaType)) {
                            caseStatisticsAreaDTO.setQueArea(caseStatisticsAreaDTO.getAreaCode());
                        }
                    }
                }
            }
            //本级区数据
            terms.put("areaType", areaType);
            terms.put("unitGrades", unitGrades);
            List<CaseStatisticsAreaDTO> allAreas = mapper.statisticsArea(terms);
            CaseStatisticsAreaDTO allArea = new CaseStatisticsAreaDTO();
            if (ObjectUtils.isNotEmpty(allAreas)) {
                allArea = allAreas.get(0);
            }
            terms.remove("unitGrades");
            allArea.setAreaName("本级");
            allArea.setAreaCode("0");
            allArea.setAreaType(areaType);
            allArea.setUnitGrades(unitGradeStr);
            if (ObjectUtils.isNotEmpty(terms.get("queVillage"))) {
                allArea.setQueVillage(terms.get("queVillage") + "");
            }
            if (ObjectUtils.isNotEmpty(terms.get("queRoad"))) {
                allArea.setQueRoad(terms.get("queRoad") + "");
            }
            if (ObjectUtils.isNotEmpty(terms.get("queArea"))) {
                allArea.setQueArea(terms.get("queArea") + "");
            }
            if (ObjectUtils.isNotEmpty(terms.get("queCity"))) {
                allArea.setQueCity(terms.get("queCity") + "");
            }
            List<String> areaNames = new ArrayList<>();//为兼容白云区数据
            Integer areaTotal = allArea.getCaseNum();
            for (CaseStatisticsAreaDTO caseStatisticsAreaDTO : caseStatisticsAreaDTOS) {
                areaNames.add(caseStatisticsAreaDTO.getAreaName());
                if (ObjectUtils.isEmpty(caseStatisticsAreaDTO.getAreaCode())) {
                    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()));
                    allArea.setRejectNum(dellNull(caseStatisticsAreaDTO.getRejectNum()) + dellNull(allArea.getRejectNum()));
                } else {
                    areaList.add(caseStatisticsAreaDTO);
                    areaCodeList.add(caseStatisticsAreaDTO.getAreaCode());
                }
                areaTotal = areaTotal + caseStatisticsAreaDTO.getCaseNum();
            }
            areaList.add(allArea);
            //纠纷类型统计
            List<CaseStatisticsTypeDTO> caseStatisticsTypeDTOS = mapper.statisticsTypeFirst(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 < 6 && !"其他".equals(caseStatisticsTypeDTO.getCaseTypeName())) {
                    typeList.add(caseStatisticsTypeDTO);
                    i++;
                } else {
                    otherCaseNum = otherCaseNum + dellNull(caseStatisticsTypeDTO.getCaseNum());
                }
            }
            for (CaseStatisticsTypeDTO caseStatisticsTypeDTO : typeList) {
                caseStatisticsTypeDTO.setCaseRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsTypeDTO.getCaseNum() * 100, typeTotalNum, 1));
            }
            if (otherCaseNum > 0) {
                CaseStatisticsTypeDTO caseStatisticsTypeDTO = new CaseStatisticsTypeDTO();
                caseStatisticsTypeDTO.setCaseTypeName("其他");
                caseStatisticsTypeDTO.setCaseNum(otherCaseNum);
                caseStatisticsTypeDTO.setCaseRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsTypeDTO.getCaseNum() * 100, typeTotalNum, 1));
                typeList.add(caseStatisticsTypeDTO);
                caseStatisticsBaseDTO.setTypeList(typeList);
            }
        }
        List<QueAreaDTO> queArea = listAreaByType(areaCode);
        log.info("listAreaByType {}", JSON.toJSONString(queArea));
        for (QueAreaDTO caseAreaDTO : queArea) {
            if (!areaCodeList.contains(caseAreaDTO.getAreaCode())) {
                CaseStatisticsAreaDTO areaChild = new CaseStatisticsAreaDTO();
                areaChild.setAreaCode(caseAreaDTO.getAreaCode());
                areaChild.setAreaName(caseAreaDTO.getAreaName());
                areaChild.setCaseNum(0);
                areaChild.setResolveNum(0);
                areaChild.setUnResolveNum(0);
                areaChild.setResolveingNum(0);
                areaList.add(areaChild);
            }
        }
        if (ObjectUtils.isNotEmpty(areaList)) {
            sortArea(areaList);
        }
        caseStatisticsBaseDTO.setAreaList(areaList);
        return caseStatisticsBaseDTO;
    }
    public CaseStatisticsBaseDTO ledgerCount(Map<String, Object> terms, String userId) throws IOException {
        // 获取全量基础统计数据
        CaseStatisticsBaseDTO statistics = statistics(terms, userId);
        CaseStatisticsBaseDTO statistics = new CaseStatisticsBaseDTO();
        terms.put("statistics", "1");
        //根据用户筛选区域范围
@@ -2188,288 +2347,9 @@
        terms.remove("canalSecond");
        terms.remove("canal");
        terms.put("areaType", areaType);
        terms.put("canalList", Arrays.asList("22_00001-1", "22_00001-2", "22_00001-3"));
        CaseStatisticsBaseDTO caseStatisticsBaseDTO1 = mapper.statisticsBase(terms);
        statistics.setSysNum(caseStatisticsBaseDTO1.getTotalNum());
        terms.remove("canalList");
        terms.put("canal", "22_00001-4");
        terms.put("canalSecond", "22_00003-3");
        CaseStatisticsBaseDTO caseStatisticsBaseDTO2 = mapper.statisticsBase(terms);
        statistics.setOttffNum(caseStatisticsBaseDTO2.getTotalNum());
        terms.put("canalSecond", "22_00003-4");
        CaseStatisticsBaseDTO caseStatisticsBaseDTO3 = mapper.statisticsBase(terms);
        statistics.setRmtjNum(caseStatisticsBaseDTO3.getTotalNum());
        terms.put("canalSecond", "22_00003-6");
        CaseStatisticsBaseDTO caseStatisticsBaseDTO4 = mapper.statisticsBase(terms);
        statistics.setXfNum(caseStatisticsBaseDTO4.getTotalNum());
        terms.put("canalSecond", "22_00003-5");
        CaseStatisticsBaseDTO caseStatisticsBaseDTO5 = mapper.statisticsBase(terms);
        statistics.setLdzcNum(caseStatisticsBaseDTO5.getTotalNum());
        terms.put("canalSecond", "22_00003-1");
        CaseStatisticsBaseDTO caseStatisticsBaseDTO6 = mapper.statisticsBase(terms);
        statistics.setFjwjfNum(caseStatisticsBaseDTO6.getTotalNum());
        // 重新计算纠纷类型统计,基于用户选择的类型
        terms.remove("canalSecond");
        terms.remove("canal");
        terms.remove("canalList");
        terms.remove("canalSecondNot");
        terms.remove("canalSecondAll");
        // 恢复所有原始类型筛选条件进行纠纷类型统计
        for (String key : originalTypeTerms.keySet()) {
            terms.put(key, originalTypeTerms.get(key));
        }
        // 调用统计调解过程的方法
        CaseStatisticsBaseDTO processStats = statisticsProcess(terms);
        // 将调解过程统计数据合并到统计结果中
        statistics.setTotalNum(processStats.getTotalNum());
        statistics.setRejectNum(processStats.getRejectNum());
        statistics.setProcessNum(processStats.getProcessNum());
        statistics.setFinishNum(processStats.getFinishNum());
        statistics.setFailNum(processStats.getFailNum());
        statistics.setRejectRate(processStats.getRejectRate());
        statistics.setProcessRate(processStats.getProcessRate());
        statistics.setFinishRate(processStats.getFinishRate());
        statistics.setFailRate(processStats.getFailRate());
        // 重新获取纠纷类型统计(基于完整的选择类型条件)
        List<CaseStatisticsTypeDTO> caseStatisticsTypeDTOS = mapper.statisticsTypeFirst(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 < 6 && !"其他".equals(caseStatisticsTypeDTO.getCaseTypeName())) {
                typeList.add(caseStatisticsTypeDTO);
                i++;
            } else {
                otherCaseNum = otherCaseNum + dellNull(caseStatisticsTypeDTO.getCaseNum());
            }
        }
        for (CaseStatisticsTypeDTO caseStatisticsTypeDTO : typeList) {
            caseStatisticsTypeDTO.setCaseRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsTypeDTO.getCaseNum() * 100, typeTotalNum, 1));
        }
        if (otherCaseNum > 0) {
            CaseStatisticsTypeDTO caseStatisticsTypeDTO = new CaseStatisticsTypeDTO();
            caseStatisticsTypeDTO.setCaseTypeName("其他");
            caseStatisticsTypeDTO.setCaseNum(otherCaseNum);
            caseStatisticsTypeDTO.setCaseRate(BigDecimalUtil.integerDivideDelZero(caseStatisticsTypeDTO.getCaseNum() * 100, typeTotalNum, 1));
            typeList.add(caseStatisticsTypeDTO);
        }
        statistics.setTypeList(typeList);
        // 根据原始类型筛选条件计算总数和比率
        // 注意:比率计算应该始终基于所有类型的总数,而不是选择的特定类型数量
        Integer allNum = statistics.getSysNum() + statistics.getOttffNum() + statistics.getRmtjNum() + statistics.getXfNum() + statistics.getLdzcNum() + statistics.getFjwjfNum();
        statistics.setSysRate(BigDecimalUtil.integerDivideDelZero(statistics.getSysNum() * 100, allNum, 1));
        statistics.setOttffRate(BigDecimalUtil.integerDivideDelZero(statistics.getOttffNum() * 100, allNum, 1));
        statistics.setRmtjRate(BigDecimalUtil.integerDivideDelZero(statistics.getRmtjNum() * 100, allNum, 1));
        statistics.setXfRate(BigDecimalUtil.integerDivideDelZero(statistics.getXfNum() * 100, allNum, 1));
        statistics.setLdzcRate(BigDecimalUtil.integerDivideDelZero(statistics.getLdzcNum() * 100, allNum, 1));
        statistics.setFjwjfRate(BigDecimalUtil.integerDivideDelZero(statistics.getFjwjfNum() * 100, allNum, 1));
        statistics.setAllNum(allNum);
        // 重新计算地区统计(areaList),基于用户选择的类型
        // 清除之前的筛选条件
        terms.remove("canal");
        terms.remove("canalSecond");
        terms.remove("canalList");
        terms.remove("canalSecondNot");
        terms.remove("canalSecondAll");
        // 恢复所有原始类型筛选条件进行地区统计
        for (String key : originalTypeTerms.keySet()) {
            terms.put(key, originalTypeTerms.get(key));
        }
        // 从原有逻辑中获取区域相关变量
        String childAreaType = null;
        List<Integer> childUnitGrades = new ArrayList<>();
        String childUnitGradeStr = null;
        String unitGradeStr = null;
        Boolean isLast = false;
        List<Integer> unitGrades = new ArrayList<>();
        if (ObjectUtils.isNotEmpty(terms.get("queVillage"))) {
            childAreaType = "5";
            childUnitGrades.add(5);
            childUnitGradeStr = "5";
            unitGradeStr = "4";
            unitGrades.add(4);
            isLast = true;
        } else if (ObjectUtils.isNotEmpty(terms.get("queRoad"))) {
            childAreaType = "4";
            childUnitGrades.add(4);
            childUnitGradeStr = "4";
            unitGradeStr = "3";
            unitGrades.add(3);
        } else if (ObjectUtils.isNotEmpty(terms.get("queArea"))) {
            childAreaType = "3";
            childUnitGrades.add(3);
            childUnitGrades.add(4);
            childUnitGradeStr = "3,4";
            unitGradeStr = "2";
            unitGrades.add(2);
        } else {
            childAreaType = "2";
            childUnitGrades.add(2);
            childUnitGrades.add(3);
            childUnitGrades.add(4);
            childUnitGradeStr = "2,3,4";
            unitGradeStr = "1";
            unitGrades.add(1);
        }
        // 重新计算地区统计
        List<CaseStatisticsAreaDTO> areaStatistics = new ArrayList<>();
        if (!isLast) {
            terms.put("areaType", childAreaType);
            terms.put("unitGrades", childUnitGrades);
            areaStatistics = mapper.statisticsArea(terms);
            if (ObjectUtils.isEmpty(areaStatistics)) {
                areaStatistics = new ArrayList<>();
            } else {
                for (CaseStatisticsAreaDTO areaDTO : areaStatistics) {
                    areaDTO.setAreaType(childAreaType);
                    areaDTO.setUnitGrades(childUnitGradeStr);
                    if ("4".equals(childAreaType)) {
                        areaDTO.setQueVillage(areaDTO.getAreaCode());
                    } else if ("3".equals(childAreaType)) {
                        areaDTO.setQueRoad(areaDTO.getAreaCode());
                    } else if ("2".equals(childAreaType)) {
                        areaDTO.setQueArea(areaDTO.getAreaCode());
                    }
                }
            }
        }
        // 本级区数据
        terms.put("areaType", areaType);
        terms.put("unitGrades", unitGrades);
        List<CaseStatisticsAreaDTO> allAreas = mapper.statisticsArea(terms);
        CaseStatisticsAreaDTO allArea = new CaseStatisticsAreaDTO();
        if (ObjectUtils.isNotEmpty(allAreas)) {
            allArea = allAreas.get(0);
        }
        terms.remove("unitGrades");
        allArea.setAreaName("本级");
        allArea.setAreaCode("0");
        allArea.setAreaType(areaType);
        allArea.setUnitGrades(unitGradeStr);
        if (ObjectUtils.isNotEmpty(terms.get("queVillage"))) {
            allArea.setQueVillage(terms.get("queVillage") + "");
        }
        if (ObjectUtils.isNotEmpty(terms.get("queRoad"))) {
            allArea.setQueRoad(terms.get("queRoad") + "");
        }
        if (ObjectUtils.isNotEmpty(terms.get("queArea"))) {
            allArea.setQueArea(terms.get("queArea") + "");
        }
        if (ObjectUtils.isNotEmpty(terms.get("queCity"))) {
            allArea.setQueCity(terms.get("queCity") + "");
        }
        List<String> areaCodeList = new ArrayList<>();
        List<CaseStatisticsAreaDTO> areaList = new ArrayList<>();
        for (CaseStatisticsAreaDTO areaDTO : areaStatistics) {
            if (ObjectUtils.isEmpty(areaDTO.getAreaCode())) {
                allArea.setCaseNum(dellNull(areaDTO.getCaseNum()) + dellNull(allArea.getCaseNum()));
                allArea.setResolveNum(dellNull(areaDTO.getResolveNum()) + dellNull(allArea.getResolveNum()));
                allArea.setUnResolveNum(dellNull(areaDTO.getUnResolveNum()) + dellNull(allArea.getUnResolveNum()));
                allArea.setResolveingNum(dellNull(areaDTO.getResolveingNum()) + dellNull(allArea.getResolveingNum()));
                allArea.setRejectNum(dellNull(areaDTO.getRejectNum()) + dellNull(allArea.getRejectNum()));
            } else {
                areaList.add(areaDTO);
                areaCodeList.add(areaDTO.getAreaCode());
            }
        }
        areaList.add(allArea);
        // 添加没有数据的区域(数量为0)
        String areaCode = null;
        if (ObjectUtils.isNotEmpty(terms.get("queVillage"))) {
            areaCode = terms.get("queVillage") + "";
        } else if (ObjectUtils.isNotEmpty(terms.get("queRoad"))) {
            areaCode = terms.get("queRoad") + "";
        } else if (ObjectUtils.isNotEmpty(terms.get("queArea"))) {
            areaCode = terms.get("queArea") + "";
        } else {
            areaCode = terms.get("queCity") != null ? terms.get("queCity") + "" : "440100";
        }
        List<QueAreaDTO> queArea = listAreaByType(areaCode);
        for (QueAreaDTO caseAreaDTO : queArea) {
            if (!areaCodeList.contains(caseAreaDTO.getAreaCode())) {
                CaseStatisticsAreaDTO areaChild = new CaseStatisticsAreaDTO();
                areaChild.setAreaCode(caseAreaDTO.getAreaCode());
                areaChild.setAreaName(caseAreaDTO.getAreaName());
                areaChild.setCaseNum(0);
                areaChild.setResolveNum(0);
                areaChild.setUnResolveNum(0);
                areaChild.setResolveingNum(0);
                areaList.add(areaChild);
            }
        }
        if (ObjectUtils.isNotEmpty(areaList)) {
            sortArea(areaList);
        }
        // 更新statistics中的areaList
        statistics.setAreaList(areaList);
        return statistics;
    }
    // public CaseStatisticsBaseDTO ledger(Map<String, Object> terms, String userId) throws IOException {
    //     CaseStatisticsBaseDTO statistics = statistics(terms, userId);
    //
    //     terms.put("statistics", "1");
    //     //根据用户筛选区域范围
    //     CtUnitDTO ctUnitDTO = custClient.getUnitByUserId(userId);
    //     //目前没有村居数据,所以单位等级是4的也归集到3里面
    //     String areaType = null;
    //     terms.remove("unitGrade");
    //     terms.remove("canal");
    //     if (ctUnitDTO.getUnitGrade().equals(1)) {
    //         terms.put("queCity", ctUnitDTO.getCity());
    //     } else if (ctUnitDTO.getUnitGrade().equals(2)) {
    //         terms.put("queArea", ctUnitDTO.getArea());
    //     } else if (ctUnitDTO.getUnitGrade().equals(3)) {
    //         terms.put("queRoad", ctUnitDTO.getRoad());
    //     } else if (ctUnitDTO.getUnitGrade().equals(4)) {
    //         terms.put("queVillage", ctUnitDTO.getRoad());
    //     }
    //     if (ObjectUtils.isNotEmpty(terms.get("queVillage"))) {
    //         terms.remove("queArea");
    //         terms.remove("queCity");
    //         terms.remove("queRoad");
    //         areaType = "4";
    //     } else if (ObjectUtils.isNotEmpty(terms.get("queRoad"))) {
    //         terms.remove("queArea");
    //         terms.remove("queCity");
    //         areaType = "3";
    //     } else if (ObjectUtils.isNotEmpty(terms.get("queArea"))) {
    //         terms.remove("queCity");
    //         areaType = "2";
    //     } else {
    //         areaType = "1";
    //     }
    //     //基础数据统计
    //     terms.remove("canalSecond");
    //     terms.remove("canal");
    //     terms.put("areaType", areaType);
    //     terms.put("canalList", Arrays.asList("22_00001-1", "22_00001-2", "22_00001-3"));
    //     CaseStatisticsBaseDTO caseStatisticsBaseDTO1 = mapper.statisticsBase(terms);
    //     statistics.setSysNum(caseStatisticsBaseDTO1.getTotalNum());
    //     terms.remove("canalList");
    //     terms.put("canal", "22_00001-4");
    //     terms.put("canalSecond", "22_00003-3");
@@ -2486,18 +2366,21 @@
    //     statistics.setLdzcNum(caseStatisticsBaseDTO5.getTotalNum());
    //     terms.put("canalSecond", "22_00003-1");
    //     CaseStatisticsBaseDTO caseStatisticsBaseDTO6 = mapper.statisticsBase(terms);
    //     statistics.setFjwjfNum(caseStatisticsBaseDTO6.getTotalNum());
    //
    //     Integer allNum = statistics.getSysNum() + statistics.getOttffNum() + statistics.getRmtjNum() + statistics.getXfNum() + statistics.getLdzcNum() + statistics.getFjwjfNum();
    //     statistics.setSysRate(BigDecimalUtil.integerDivideDelZero(statistics.getSysNum() * 100, allNum, 1));
    //     statistics.setOttffRate(BigDecimalUtil.integerDivideDelZero(statistics.getOttffNum() * 100, allNum, 1));
    //     statistics.setRmtjRate(BigDecimalUtil.integerDivideDelZero(statistics.getRmtjNum() * 100, allNum, 1));
    //     statistics.setXfRate(BigDecimalUtil.integerDivideDelZero(statistics.getXfNum() * 100, allNum, 1));
    //     statistics.setLdzcRate(BigDecimalUtil.integerDivideDelZero(statistics.getLdzcNum() * 100, allNum, 1));
    //     statistics.setFjwjfRate(BigDecimalUtil.integerDivideDelZero(statistics.getFjwjfNum() * 100, allNum, 1));
    //     statistics.setAllNum(allNum);
    //     return statistics;
    // }
//        statistics.setTzfjwjfNum(caseStatisticsBaseDTO6.getTotalNum());
        // 根据原始类型筛选条件计算总数和比率
        // 注意:比率计算应该始终基于所有类型的总数,而不是选择的特定类型数量
        Integer allNum = statistics.getSysNum() + statistics.getOttffNum() + statistics.getRmtjNum() + statistics.getXfNum() + statistics.getLdzcNum() + statistics.getTzfjwjfNum();
        statistics.setSysRate(BigDecimalUtil.integerDivideDelZero(statistics.getSysNum() * 100, allNum, 1));
        statistics.setOttffRate(BigDecimalUtil.integerDivideDelZero(statistics.getOttffNum() * 100, allNum, 1));
        statistics.setRmtjRate(BigDecimalUtil.integerDivideDelZero(statistics.getRmtjNum() * 100, allNum, 1));
        statistics.setXfRate(BigDecimalUtil.integerDivideDelZero(statistics.getXfNum() * 100, allNum, 1));
        statistics.setLdzcRate(BigDecimalUtil.integerDivideDelZero(statistics.getLdzcNum() * 100, allNum, 1));
        statistics.setTzfjwjfRate(BigDecimalUtil.integerDivideDelZero(statistics.getTzfjwjfNum() * 100, allNum, 1));
        statistics.setAllNum(allNum);
        return statistics;
    }
    /**
     * 按系列案编号查询
sql/20250620.sql
New file
@@ -0,0 +1,17 @@
#添加索引
CREATE INDEX idx_canal ON "HUGETEST".dyh_case_info(canal);
CREATE INDEX idx_case_ref ON "HUGETEST".dyh_case_info(case_ref);
CREATE INDEX idx_case_type ON "HUGETEST".dyh_case_info(case_type);
CREATE INDEX idx_area_road_village ON "HUGETEST".dyh_case_info(que_area, que_road, que_village);
CREATE INDEX idx_source ON "HUGETEST".dyh_case_info(source);
CREATE INDEX idx_input_unit_id ON "HUGETEST".dyh_case_info(input_unit_id);
CREATE INDEX idx_status ON "HUGETEST".dyh_case_info(status);
CREATE INDEX idx_process ON "HUGETEST".dyh_case_info(process);
CREATE INDEX idx_belong_unit_id ON "HUGETEST".dyh_case_info_unfold(belong_unit_id);
CREATE INDEX idx_mediate_unit_id ON "HUGETEST".dyh_case_info_unfold(mediate_unit_id);
CREATE INDEX idx_medi_result ON "HUGETEST".dyh_case_info_unfold(medi_result);
CREATE INDEX idx_unit_grade ON "HUGETEST".dyh_ct_unit(unit_grade);
CREATE INDEX idx_unit_type ON "HUGETEST".dyh_ct_unit(unit_type);
CREATE INDEX idx_area_road_village ON "HUGETEST".dyh_ct_unit(area, road, village);