aix
2024-09-13 8018e564729067b0b61a5c992b5667dbcad39c70
Merge branch 'jtdev' of https://hbsl-code.gistack.cn/hbwri/manager into jtdev
30 files modified
2 files added
1484 ■■■■ changed files
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/entity/AlarmRuleDetail.java 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/DO/SgProgressReportDO.java 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/DO/SgProjectInfoDO.java 27 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/DO/SgReportUserDO.java 9 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/DTO/ProjectSearchDTO.java 64 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/VO/SgOperatingRateVO.java 34 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/VO/SgProgressReportVO.java 2 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/VO/SgProjectTreeVO.java 70 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/VO/SgStatisProVO.java 4 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-system-api/src/main/java/cn/gistack/system/entity/Dept.java 6 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-system-api/src/main/java/cn/gistack/system/vo/DeptVO.java 4 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/constant/ZtApiDataColumnConstant.java 73 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/AsyncNoticeHandle.java 104 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeHandle.java 415 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeStrategyImpl.java 22 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java 81 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/vo/SmsRequestTemplate.java 11 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/controller/SgProjectInfoController.java 18 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgGxMapper.java 2 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgGxMapper.xml 9 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProgressReportMapper.xml 3 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProjectInfoMapper.java 6 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProjectInfoMapper.xml 138 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/SgProjectInfoService.java 7 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/impl/SgGxServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/impl/SgProgressReportServiceImpl.java 98 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/impl/SgProjectInfoServiceImpl.java 207 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java 22 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java 2 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml 15 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java 2 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java 13 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/entity/AlarmRuleDetail.java
@@ -43,6 +43,11 @@
    private String templateId;
    /**
     * 模板表ID (合并内容发送模板)
     */
    private String mergeTemplateId;
    /**
     * 备注
     */
    private String alarmRemark;
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/DO/SgProgressReportDO.java
@@ -148,4 +148,9 @@
     */
    @TableField(exist = false)
    private String resubmitId;
    @TableField(exist = false)
    private List<String> userIDs;
}
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/DO/SgProjectInfoDO.java
@@ -181,7 +181,6 @@
    private Integer status;
    @TableField(exist = false)
    private String projectProgress;
    @TableField(exist = false)
@@ -202,4 +201,30 @@
     */
    private String lot;
    /**
     * 表面变形
     */
    private int surfaceNum;
    private String surfaceProgress;
    /**
     * 视频
     */
    private int videoNum;
    private String videoProgress;
    /**
     * 渗流压力
     */
    private int transNum;
    private String transProgress;
    /**
     * 渗流量
     */
    private int seepageNum;
    private String seepageProgress;
}
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/DO/SgReportUserDO.java
@@ -39,7 +39,14 @@
     */
    private Long userId;
    /**
    /**
     * 角色ID
     */
    private Long roleId;
    /**
     * 审批状态 0未审批 1通过,2驳回
     */
    private Integer approvalStatus;
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/DTO/ProjectSearchDTO.java
@@ -16,22 +16,73 @@
@NoArgsConstructor
@Builder
public class ProjectSearchDTO {
    /**
     * 项目名称
     */
    private String projectName;
    /**
     * 区域编码
     */
    private String adCode;
    /**
     * 设备名
     */
    private String deviceName;
    /**
     * 水库名
     */
    private String skName;
    /**
     * 工序类型
     */
    private String gxType;
    /**
     * 工序名
     */
    private String gxName;
    /**
     * 创建人
     */
    private String createUser;
    /**
     * 用户名
     */
    private Long userId;
    /**
     *
     */
    private String gxInfoId;
    /**
     *
     */
    private String gxStepNum;
    /**
     *
     */
    private String projectId;
    /**
     *
     */
    private Integer approvalStatus;
    /**
     *
     */
    private Integer status;
    /**
     *
     */
    private Long reportPerson;
    /**
     *
     */
    private List<Long> projectIds;
    /**
     *
     */
    private String startTime;
    /**
     *
     */
    private String endTime;
    /**
     * 工程规模
@@ -59,6 +110,11 @@
     */
    private String reportTime;
    /**
     * 标段
     */
    private String lot;
    /**
     * 项目排序 0状态 , 1进度 ,2注册码
@@ -68,6 +124,14 @@
    private Boolean isPage;
    private List<String> sgCodeS;
    /**
     * 建设期次
     */
    private String buildStage;
    /**
     * 子类型
     */
    private List<String> childTypeList;
}
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/VO/SgOperatingRateVO.java
New file
@@ -0,0 +1,34 @@
package cn.gistack.sm.sg.VO;
import lombok.Data;
/**
 * 设备类型开工率VO
 */
@Data
public class SgOperatingRateVO {
    /**
     * 表面变形
     */
    private int surfaceNum;
    private String surfaceProgress;
    /**
     * 视频
     */
    private int videoNum;
    private String videoProgress;
    /**
     * 渗流压力
     */
    private int transNum;
    private String transProgress;
    /**
     * 渗流量
     */
    private int seepageNum;
    private String seepageProgress;
    private String proIds;
}
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/VO/SgProgressReportVO.java
@@ -20,4 +20,6 @@
    private Integer approvalStatus;
    private String stepRemark;
}
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/VO/SgProjectTreeVO.java
New file
@@ -0,0 +1,70 @@
package cn.gistack.sm.sg.VO;
import lombok.Data;
import java.util.List;
/**
 * 项目树实体类
 */
@Data
public class SgProjectTreeVO {
    /**
     * id
     */
    private String id;
    /**
     * 层级
     */
    private Integer level;
    /**
     * 片区
     */
    private String lot;
    /**
     * 省
     */
    private String provinceNm;
    /**
     * 市
     */
    private String cityNm;
    /**
     * 县
     */
    private String countyNm;
    /**
     * 乡镇
     */
    private String townNm;
    /**
     * 水库名
     */
    private String resNm;
    /**
     * 子级水库数量
     */
    private Long childNum;
    /**
     * 项目ID集合
     */
    private List<String> projectIds;
    /**
     * 子列表
     */
    List<SgProjectTreeVO> childList;
    /**
     * 名称
     */
    private String regionName;
}
skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sg/VO/SgStatisProVO.java
@@ -45,6 +45,10 @@
    private String seepageProgress;
    private String proIds;
    /**
     * 建设期次
     */
    private String buildStage;
}
skjcmanager/skjcmanager-service-api/skjcmanager-system-api/src/main/java/cn/gistack/system/entity/Dept.java
@@ -116,6 +116,12 @@
    @ApiModelProperty(value = "工程区划")
    private String sgCode;
    /**
     * 片区 所属标段
     */
    @ApiModelProperty(value = "片区 所属标段")
    private String precinct;
    private String adGrad;
    private String resGuid;
skjcmanager/skjcmanager-service-api/skjcmanager-system-api/src/main/java/cn/gistack/system/vo/DeptVO.java
@@ -82,5 +82,9 @@
    private String deptCategoryName;
    private String sgCode;
    /**
     * 片区 所属标段
     */
    private String precinct;
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/constant/ZtApiDataColumnConstant.java
@@ -68,6 +68,14 @@
    }};
    /**
     * 6.1水位初次超汛限告警-合并水库
     */
    public static List<String>  waterFirstOverMergeWaterList = new ArrayList<String>()
    {{
        add("town_nm,res_nm,1");
    }};
    /**
     * 7.水位小幅超汛限告警
     */
    public static List<String>  waterSmallScaleOverList = new ArrayList<String>()
@@ -78,6 +86,14 @@
        add("over_1h");
        add("over_z");
        add("flse_lim_stag");
    }};
    /**
     * 7.1水位小幅超汛限告警-合并
     */
    public static List<String>  waterSmallScaleOverMergeList = new ArrayList<String>()
    {{
        add("town_nm,res_nm,1");
    }};
    /**
@@ -161,6 +177,14 @@
    }};
    /**
     * 10.1 水位超设计洪水位告警处理-合并
     */
    public static List<String>  waterMoreDesignMergeList = new ArrayList<String>()
    {{
        add("town_nm,res_nm,1");
    }};
    /**
     * 11 水位超校核洪水位告警
     */
    public static List<String>  waterMoreCheckList = new ArrayList<String>()
@@ -171,6 +195,14 @@
        add("over_chec_fl_stag");
        add("diff_dam");
        add("drp_24");
    }};
    /**
     * 11.1 水位超校核洪水位告警-合并
     */
    public static List<String>  waterMoreCheckMergeList = new ArrayList<String>()
    {{
        add("town_nm,res_nm,1");
    }};
    /**
@@ -186,6 +218,14 @@
    }};
    /**
     * 12.1 近1h水位陡升-合并
     */
    public static List<String>  waterComeOneHourUpMergeList = new ArrayList<String>()
    {{
        add("town_nm,res_nm,1");
    }};
    /**
     * 13 近1h水位陡降
     */
    public static List<String>  waterComeOneHourDownList = new ArrayList<String>()
@@ -195,6 +235,14 @@
        add("rz");
        add("over_1h");
        add("drp_24");
    }};
    /**
     * 13.1 近1h水位陡降-合并
     */
    public static List<String>  waterComeOneHourDownMergeList = new ArrayList<String>()
    {{
        add("town_nm,res_nm,1");
    }};
    /**
@@ -209,6 +257,14 @@
    }};
    /**
     * 15.1 已降大雨告警-合并
     */
    public static List<String>  alreadyHeavyRainMergeList = new ArrayList<String>()
    {{
        add("town_nm,res_nm,1");
    }};
    /**
     * 16 已降暴雨告警
     */
    public static List<String> alreadyRainstormList = new ArrayList<String>()
@@ -220,6 +276,14 @@
    }};
    /**
     * 16.1 已降暴雨告警合并
     */
    public static List<String> alreadyRainstormMergeList = new ArrayList<String>()
    {{
        add("town_nm,res_nm,1");
    }};
    /**
     * 18 6小时降雨告警
     */
    public static List<String> sixHourRainList = new ArrayList<String>()
@@ -230,6 +294,15 @@
        add("rz");
    }};
    /**
     * 18.1 6小时降雨告警-合并
     */
    public static List<String> sixHourRainMergeList = new ArrayList<String>()
    {{
        add("county_nm,town_nm,res_nm,1");
    }};
    /**
     * 19.坝安全监测告警-数据缺失
     */
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/AsyncNoticeHandle.java
@@ -203,22 +203,22 @@
        String uuid = alarmRuleDetail.getTemplateId() + UUID.randomUUID().toString();
        // 只发短信,将发短信信息组装好
        SmsRequestTemplate smsRequestTemplate
            = noticeHandle.getSendSmsTemplate(ztData, alarmRule, alarmRuleDetail, columnList, flag, adCode, uuid, isSendStation);
            = noticeHandle.getSendSmsTemplate(ztData, alarmRule, alarmRuleDetail, columnList, ZtApiDataColumnConstant.waterFirstOverMergeWaterList,flag, adCode, uuid, isSendStation);
        // 拼接后面内容
        if (smsRequestTemplate.getPersonVOList().size() > 0) {
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                // 依次拼接巡查责任人,技术责任人姓名
                noticeHandle.addPatrolTechnologyInfo(list, false);
//                noticeHandle.addPatrolTechnologyInfo(list, false);
                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = StringUtil.format("水位:{}\n汛限水位:{}米\n超汛限水位:{}米\n",
                    list.get(9), list.get(11), String.format("%.2f", Double.valueOf(list.get(9).replace("米", "")) - Double.valueOf(list.get(11)))
                );
                list.remove(11);
//                String remark = StringUtil.format("水位:{}\n汛限水位:{}米\n超汛限水位:{}米\n",
//                    list.get(9), list.get(11), String.format("%.2f", Double.valueOf(list.get(9).replace("米", "")) - Double.valueOf(list.get(11)))
//                );
//                list.remove(11);
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -265,17 +265,17 @@
        if (smsRequestTemplate.getPersonVOList().size() > 0) {
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                // 依次拼接巡查责任人,技术责任人姓名
                noticeHandle.addPatrolTechnologyInfo(list, false);
//                noticeHandle.addPatrolTechnologyInfo(list, false);
                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = StringUtil.format("水位:{}\n汛限水位:{}米\n超汛限水位:{}米\n",
                    list.get(9), list.get(12), String.format("%.2f", Double.valueOf(list.get(9).replace("米", "")) - Double.valueOf(list.get(12)))
                );
                list.remove(12);
//                String remark = StringUtil.format("水位:{}\n汛限水位:{}米\n超汛限水位:{}米\n",
//                    list.get(9), list.get(12), String.format("%.2f", Double.valueOf(list.get(9).replace("米", "")) - Double.valueOf(list.get(12)))
//                );
//                list.remove(12);
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -319,17 +319,17 @@
        if (smsRequestTemplate.getPersonVOList().size() > 0) {
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                // 依次拼接巡查责任人,技术责任人姓名联系电话
                noticeHandle.addPatrolTechnologyInfo(list, true);
//                noticeHandle.addPatrolTechnologyInfo(list, true);
                // 拼接市县水利部人员姓名及联系方式
//                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = StringUtil.format("水位:{}\n汛限水位:{}米\n超汛限水位:{}米\n",
                    list.get(9), list.get(12), String.format("%.2f", Double.valueOf(list.get(9).replace("米", "")) - Double.valueOf(list.get(12)))
                );
                list.remove(12);
//                String remark = StringUtil.format("水位:{}\n汛限水位:{}米\n超汛限水位:{}米\n",
//                    list.get(9), list.get(12), String.format("%.2f", Double.valueOf(list.get(9).replace("米", "")) - Double.valueOf(list.get(12)))
//                );
//                list.remove(12);
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -620,18 +620,18 @@
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                String remark = StringUtil.format("水位:{}\n设计洪水位:{}米\n超设计洪水位:{}米\n",
                    list.get(9), list.get(13), String.format("%.2f", Double.valueOf(list.get(9).replace("米", "")) - Double.valueOf(list.get(13)))
                );
                list.remove(13);
//                String remark = StringUtil.format("水位:{}\n设计洪水位:{}米\n超设计洪水位:{}米\n",
//                    list.get(9), list.get(13), String.format("%.2f", Double.valueOf(list.get(9).replace("米", "")) - Double.valueOf(list.get(13)))
//                );
//                list.remove(13);
//                System.out.println(remark);
                // 依次添加行政责任人,主管部门责任人,技术责任人,巡查责任人信息(姓名,联系电话)
                noticeHandle.addWaterMoreDesignPatrolTechnologyInfo(list, "1,2,4,5");
//                noticeHandle.addWaterMoreDesignPatrolTechnologyInfo(list, "1,2,4,5");
                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -720,16 +720,16 @@
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                // 依次添加行政责任人,主管部门责任人,技术责任人,巡查责任人信息(姓名,联系电话)
                noticeHandle.addWaterMoreDesignPatrolTechnologyInfo(list, "1,2,4,5");
//                noticeHandle.addWaterMoreDesignPatrolTechnologyInfo(list, "1,2,4,5");
                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = StringUtil.format("水位:{}\n校核洪水位:{}米\n{}米\n",
                    list.get(9), list.get(10), list.get(11)
                );
//                String remark = StringUtil.format("水位:{}\n校核洪水位:{}米\n{}米\n",
//                    list.get(9), list.get(10), list.get(11)
//                );
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -815,18 +815,18 @@
        if (smsRequestTemplate.getPersonVOList().size() > 0) {
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                // 依次添加行巡查责任人,技术责任人信息(姓名)
                noticeHandle.addPatrolTechnologyInfo(list, false);
//                noticeHandle.addPatrolTechnologyInfo(list, false);
//                // 依次添加行巡查责任人,技术责任人信息,主管部门责任人(姓名)
//                noticeHandle.addPatrolTechnologyInfoNew(list, false);
                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = StringUtil.format("近1h水位陡升:{}\n",
                    list.get(10)
                );
//                String remark = StringUtil.format("近1h水位陡升:{}\n",
//                    list.get(10)
//                );
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -869,16 +869,16 @@
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                // 依次添加行巡查责任人,技术责任人信息(姓名)
                noticeHandle.addPatrolTechnologyInfo(list, false);
//                noticeHandle.addPatrolTechnologyInfo(list, false);
//                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = StringUtil.format("近1h水位陡降:{}\n",
                    list.get(10)
                );
//                String remark = StringUtil.format("近1h水位陡降:{}\n",
//                    list.get(10)
//                );
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -921,13 +921,13 @@
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                // 依次添加巡查责任人技术责任人信息姓名
                noticeHandle.addPatrolTechnologyInfo(list, false);
//                noticeHandle.addPatrolTechnologyInfo(list, false);
                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = list.get(9);
//                String remark = list.get(9);
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -970,14 +970,14 @@
            for (List<String> list : smsRequestTemplate.getTemplateContent()) {
                // 依次添加巡查责任人技术责任人信息姓名
                noticeHandle.addPatrolTechnologyInfo(list, false);
//                noticeHandle.addPatrolTechnologyInfo(list, false);
                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = list.get(9);
//                String remark = list.get(9);
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -1021,16 +1021,16 @@
                // 依次添加行政责任人,主管部门责任人,技术责任人,巡查责任人信息(姓名,联系电话)
//                noticeHandle.addWaterMoreDesignPatrolTechnologyInfo(list, "1,2,4,5");
                // 主管部门责任人,技术责任人,巡查责任人信息 2024-05-29修改
                noticeHandle.addWaterMoreDesignPatrolTechnologyInfoNew(list, "2,4,5");
//                noticeHandle.addWaterMoreDesignPatrolTechnologyInfoNew(list, "2,4,5");
                // 拼接市县水利部人员姓名及联系方式
                noticeHandle.addCityCountyBusinessPersonInfo(list);
                String remark = StringUtil.format("降雨:{}\n",
                    list.get(6) + "毫米"
                );
//                String remark = StringUtil.format("降雨:{}\n",
//                    list.get(6) + "毫米"
//                );
                // 保存告警记录信息
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, remark);
                AlarmRecord alarmRecord = noticeHandle.saveAlarmRecord(list, alarmRule, uuid, null);
                if (null != alarmRecord) {
                    list.add(alarmRecord.getId().toString());
                }
@@ -2432,7 +2432,7 @@
     *
     * @param alarmRule       告警规则
     * @param alarmRuleDetail 告警规则详情
     * @param ztData            中台数据
     * @param data            中台数据
     * @param columnList      需要展示的数据字段
     * @param flag            是否显示日期
     * @param adCode          行政区划
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeHandle.java
@@ -38,6 +38,7 @@
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.jetbrains.annotations.NotNull;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
@@ -118,6 +119,12 @@
        if (null != smsTemplate) {
            // 创建消息发送对象
            SmsRequestTemplate smsRequestTemplate = new SmsRequestTemplate();
            // 通过模板id 查询模板相关信息(外呼对应的模板id则为场景id)
            SmsTemplate mergeSmsTemplate
                = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("id", alarmRuleDetail.getMergeTemplateId()).eq("is_deleted", 0));
            if (null!=mergeSmsTemplate){
                smsRequestTemplate.setSmsTemplateMerge(mergeSmsTemplate);
            }
            // 设置是否发送站内信
            smsRequestTemplate.setIsSendStation(isSendStation);
            // 设置告警信息
@@ -127,7 +134,52 @@
            // 解析模板并设置 title
            smsRequestTemplate.setTitle(FormatUtil.composeMessage(smsTemplate.getContent()));
            // 列名数据转换
            getColumnData(jsonArray, columnsList, smsRequestTemplate, alarmRuleDetail, flag, adCode, uuid);
            getColumnData(jsonArray, columnsList,null, smsRequestTemplate, alarmRuleDetail, flag, adCode, uuid);
            //返回
            return smsRequestTemplate;
        }
        return null;
    }
    /**
     * 短信发送数据组装(包含了合并水库名称)
     *
     * @param jsonArray       告警动态数据
     * @param alarmRule       告警规则信息
     * @param alarmRuleDetail 告警规则详情信息
     * @param columnsList     列名集合信息
     * @param mergeColumnsList     合并列名集合信息(合并水库名称)
     * @param flag            是否包含日期
     * @param adCode          行政区编号(是否过滤区县数据)
     * @param uuid            本次执行临时编号
     * @param isSendStation   是否发送站内信
     * @return
     */
    public SmsRequestTemplate getSendSmsTemplate(JSONArray jsonArray,
                                                 AlarmRule alarmRule,
                                                 AlarmRuleDetail alarmRuleDetail,
                                                 List<String> columnsList,
                                                 List<String> mergeColumnsList,
                                                 Boolean flag,
                                                 String adCode,
                                                 String uuid,
                                                 Boolean isSendStation) {
        // 通过模板id 查询模板相关信息(外呼对应的模板id则为场景id)
        SmsTemplate smsTemplate
            = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("id", alarmRuleDetail.getTemplateId()).eq("is_deleted", 0));
        if (null != smsTemplate) {
            // 创建消息发送对象
            SmsRequestTemplate smsRequestTemplate = new SmsRequestTemplate();
            // 设置是否发送站内信
            smsRequestTemplate.setIsSendStation(isSendStation);
            // 设置告警信息
            smsRequestTemplate.setAlarmRule(alarmRule);
            // 设置模板信息
            smsRequestTemplate.setSmsTemplate(smsTemplate);
            // 解析模板并设置 title
            smsRequestTemplate.setTitle(FormatUtil.composeMessage(smsTemplate.getContent()));
            // 列名数据转换
            getColumnData(jsonArray, columnsList, mergeColumnsList, smsRequestTemplate, alarmRuleDetail, flag, adCode, uuid);
            //返回
            return smsRequestTemplate;
        }
@@ -148,6 +200,7 @@
     */
    private void getColumnData(JSONArray jsonArray,
                               List<String> columnsList,
                               List<String> mergeColumnsList,
                               SmsRequestTemplate smsRequestTemplate,
                               AlarmRuleDetail alarmRuleDetail,
                               Boolean flag,
@@ -157,147 +210,305 @@
        List<PersonVO> personLists = new ArrayList<>();
        // 告警内容
        List<List<String>> lists = new ArrayList<>();
        // 合并告警内容集合
        List<List<String>> moreLists = new ArrayList<>();
        // 创建set对象用于去重处理
        Set<String> set = new HashSet<>();
        // 查询对应的角色信息
        List<String> roles = sysClient.getRoleNames(alarmRuleDetail.getAlarmPerson()).getData();
        // 遍历处理数据
        for (int i = 0; i < jsonArray.size(); i++) {
            if (null != adCode) {
                // city_cd,county_cd 过滤数据
                String county_cd = jsonArray.getJSONObject(i).getString("county_cd");
                if (null != county_cd && county_cd.equals(adCode)) {
//                    jointData(jsonArray, columnsList, alarmRuleDetail, flag, personLists, lists, i,uuid,set);
                    jointDataV2(jsonArray, columnsList, alarmRuleDetail, roles, flag, personLists, lists, i, uuid, set);
                    jointDataV2(jsonArray, columnsList,mergeColumnsList, alarmRuleDetail, roles, flag, personLists, lists,moreLists, i, uuid, set);
                }
            } else {
//                jointData(jsonArray, columnsList, alarmRuleDetail, flag, personLists, lists, i,uuid,set);
                jointDataV2(jsonArray, columnsList, alarmRuleDetail, roles, flag, personLists, lists, i, uuid, set);
                jointDataV2(jsonArray, columnsList,mergeColumnsList, alarmRuleDetail, roles, flag, personLists, lists,moreLists, i, uuid, set);
            }
        }
        // 设置信息
        smsRequestTemplate.setPersonVOList(personLists);
        smsRequestTemplate.setTemplateContent(lists);
        smsRequestTemplate.setTemplateMergeContent(moreLists);
    }
    private void jointDataV2(JSONArray jsonArray, List<String> columnsList, AlarmRuleDetail alarmRuleDetail, List<String> roles, Boolean flag, List<PersonVO> personLists, List<List<String>> lists, int i, String uuid, Set<String> set) {
    /**
     * 设置合并数据
     * @param jsonArray          告警动态数据
     * @param columnsList        告警动态内容 key
     * @param alarmRuleDetail    告警人员角色ids
     * @param flag               告警内容是否日期
     * @param personLists        人员集合
     * @param lists              告警内容集合
     * @param i                  遍历集合的索引
     * @param uuid                 uuid
     * @param set                 用于去重
     */
    private void jointDataV2(JSONArray jsonArray,
                             List<String> columnsList,
                             List<String> mergeColumnsList,
                             AlarmRuleDetail alarmRuleDetail,
                             List<String> roles,
                             Boolean flag,
                             List<PersonVO> personLists,
                             List<List<String>> lists,
                             List<List<String>> moreLists,
                             int i,
                             String uuid,
                             Set<String> set) {
        // 根据水库编号,所在区域查询需要发送的人员手机号及设置
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        String res_cd = jsonObject.getString("res_cd");
        String res_nm = jsonObject.getString("res_nm");
        String town_nm = jsonObject.getString("town_nm");
        String county_nm = jsonObject.getString("county_nm");
        String city_nm = jsonObject.getString("city_nm");
        log.info("当前为第{}个水库,行政区划:{}-{}-{},水库编码:{},水库名称:{}", i + 1, city_nm, county_nm, town_nm, res_cd, res_nm);
        // 取出测站编码
//        String stcd = jsonArray.getJSONObject(i).getString("stcd");
//        if (StringUtil.isBlank(stcd)) {
//            stcd = jsonArray.getJSONObject(i).getString("cd");
//        }
//        //如果stcd是空的就设置为-1
//        if (StringUtil.isBlank(stcd)){
//            stcd = "-1";
//        }
        log.info("当前为第{}个水库,行政区划:{}-{}-{},水库编码:{},水库名称:{}", i + 1,
            jsonObject.getString("city_nm"), jsonObject.getString("county_nm"), jsonObject.getString("town_nm"), res_cd, jsonObject.getString("res_nm"));
        // 设置临时字符串,用于去重判断
        String tempStr = uuid + res_cd;
        // 去重水库操作,如果有重复的水库则不操作
        if (!set.contains(tempStr)) {
            set.add(tempStr);
            String stcd = jsonArray.getJSONObject(i).getString("stcd");
            if (StringUtil.isBlank(stcd)) {
                stcd = jsonArray.getJSONObject(i).getString("rain_stcd");
            }
            if (StringUtil.isBlank(stcd)) {
                stcd = jsonArray.getJSONObject(i).getString("cd");
            }
            //如果stcd是空的就设置为-1
            if (StringUtil.isBlank(stcd)){
                stcd = "-1";
            }
            // 判断时间是否存在
            String tm = jsonArray.getJSONObject(i).getString("tm");
            String day = "";
            String hour = "";
            String minute = "";
            if (null != tm && !tm.equals("") && flag) {
                //如果显示日期,并且中台的日期不为空,则使用中台的日期
                flag = true;
                // 加入天,时,分
                day = tm.substring(8, 10);
                hour = tm.substring(11, 13);
                minute = tm.substring(14, 16);
            } else if (flag) {
                //如果显示日期,但是中台没传日期,就使用当前时间
                Date now = DateUtil.now();
                String formatTm = DateUtil.format(now, DateUtil.PATTERN_DATETIME);
                // 加入天,时,分
                day = formatTm.substring(8, 10);
                hour = formatTm.substring(11, 13);
                minute = formatTm.substring(14, 16);
            } else {
                flag = false;
            }
            // 获取告警人员信息
//            getAlarmPersonList(jsonArray, columnsList, alarmRuleDetail,flag, personLists, lists, i, res_cd, day, hour, minute, stcd);
            JSONObject jsonData = jsonArray.getJSONObject(i);
            //这里把jsonObject传过去
            getAlarmPersonListV2(jsonArray, columnsList, alarmRuleDetail, roles, flag, personLists, lists, i, res_cd, day, hour, minute, stcd,jsonData);
        }
    }
    private void getAlarmPersonListV2(JSONArray jsonArray, List<String> columnsList, AlarmRuleDetail alarmRuleDetail, List<String> roles, Boolean flag, List<PersonVO> personLists, List<List<String>> lists, int i, String res_cd, String day, String hour, String minute, String stcd,JSONObject jsonData) {
        // 查询告警人员信息
//        List<PersonVO> personVOList = getPersonListByResGuid(res_cd, alarmRuleDetail.getAlarmPerson());
        List<PersonVO> personVOList = getPersonListByResGuidV2(res_cd, roles);
        if (personVOList.size() > 0) {
            List<PersonVO> personVOList = getPersonListByResGuidV2(res_cd, roles);
            // 按发送人员手机号进行告警内容数据拼接
            for (PersonVO personVO : personVOList) {
                // 处理重复发送手机号,跳出本次循环,直接进行下一次循环
                if (!isAdd(lists, res_cd, personVO)){
                    break;
                }
                // 开始拼接内容
                List<String> list = new ArrayList<>();
                list.add(stcd);
                // 测站编号处理
                stcdHandle(jsonArray, i, list);
                // 加入水库编号、手机号
                list.add(res_cd);
                list.add(personVO.getPhone());
                //拿测点值
                String val = "";
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                val = jsonObject.getString("monitorData");
                list.add(val);
                if (flag) {
                    // 如果是电话告警,需要把日期拼到一起
                    if (alarmRuleDetail.getAlarmMode().equals("电话")) {
                        String tem = day + "日" + hour + "时" + minute + "分";
                        list.add(tem);
                    } else {
                        list.add(day);
                        list.add(hour);
                        list.add(minute);
                    }
                list.add(Strings.isBlank(jsonObject.getString("monitorData"))?"":jsonObject.getString("monitorData"));
                //日期处理
                flag = timeHandle(jsonArray, alarmRuleDetail, flag, i, list);
                // 合并水库名称
                boolean isMerge = Strings.isBlank(alarmRuleDetail.getMergeTemplateId())?
                    mergeResName(jsonArray, columnsList,lists, i, personVO,list.size()):
                    mergeResName(jsonArray,list, mergeColumnsList,lists,moreLists, i, personVO,list.size());
                if (isMerge){
                    break;
                }
                // 最后动态将变量将值放入集合中
                for (String column : columnsList) {
                    String[] split = column.split(",");
                    String format = "";
                    format = addAlarmContent(jsonArray,i,split,format);
                    // 加入集合
                    list.add(format);
                }
                // 加入告警内容集合
                lists.add(list);
            }
            personLists.addAll(personVOList);
        }
    }
    /**
     * 日期处理
     * @param jsonArray
     * @param alarmRuleDetail
     * @param flag
     * @param i
     * @param list
     * @return
     */
    @NotNull
    private Boolean timeHandle(JSONArray jsonArray, AlarmRuleDetail alarmRuleDetail, Boolean flag, int i, List<String> list) {
        // 判断时间是否存在
        String tm = jsonArray.getJSONObject(i).getString("tm");
        String day = "";
        String hour = "";
        String minute = "";
        if (!Strings.isBlank(tm) && flag) {
            //如果显示日期,并且中台的日期不为空,则使用中台的日期
            flag = true;
            // 加入天,时,分
            day = tm.substring(8, 10);
            hour = tm.substring(11, 13);
            minute = tm.substring(14, 16);
        } else if (flag) {
            //如果显示日期,但是中台没传日期,就使用当前时间
            Date now = DateUtil.now();
            String formatTm = DateUtil.format(now, DateUtil.PATTERN_DATETIME);
            // 加入天,时,分
            day = formatTm.substring(8, 10);
            hour = formatTm.substring(11, 13);
            minute = formatTm.substring(14, 16);
        } else {
            flag = false;
        }
        if (flag) {
            // 如果是电话告警,需要把日期拼到一起
            if (alarmRuleDetail.getAlarmMode().equals("电话")) {
                String tem = day + "日" + hour + "时" + minute + "分";
                list.add(tem);
            } else {
                list.add(day);
                list.add(hour);
                list.add(minute);
            }
        }
        return flag;
    }
    /**
     * 测站编号处理
     * @param jsonArray
     * @param i
     * @param list
     */
    private void stcdHandle(JSONArray jsonArray, int i, List<String> list) {
        String stcd = jsonArray.getJSONObject(i).getString("stcd");
        if (StringUtil.isBlank(stcd)) {
            stcd = jsonArray.getJSONObject(i).getString("rain_stcd");
        }
        if (StringUtil.isBlank(stcd)) {
            stcd = jsonArray.getJSONObject(i).getString("cd");
        }
        //如果stcd是空的就设置为-1
        if (StringUtil.isBlank(stcd)){
            stcd = "-1";
        }
        list.add(stcd);
    }
    /**
     * 如果存在一个人对应水库有重复的则不新增
     * @param lists
     * @param res_cd
     * @param personVO
     * @return
     */
    private boolean isAdd(List<List<String>> lists, String res_cd, PersonVO personVO) {
        boolean isAdd = true;
        for (List<String> listStr : lists) {
            // 如果水库编号和手机号都一致,则不新增
            if (listStr.contains(res_cd) && listStr.contains(personVO.getPhone())) {
                isAdd = false;
                break;
            }
        }
        return isAdd;
    }
    /**
     * 合并水库名称内容
     * @param jsonArray 告警数据
     * @param columnsList 告警列
     * @param lists 告警内容
     * @param i 集合索引
     * @param personVO 人员信息
     * @param index 索引
     * @return
     */
    private boolean mergeResName(JSONArray jsonArray,
                                 List<String> columnsList,
                                 List<List<String>> lists,
                                 int i,
                                 PersonVO personVO,
                                 int index) {
        boolean isMerge = false;
        for (List<String> listStr : lists) {
            // 如果告警人员已经存在,则需要按规则判断是否合并水库名称,将当前人员告警内容中的水库名称合并
            if (listStr.contains(personVO.getPhone())) {
                isMerge = true;
                // 判断合并的水库名称是否超过3个,超过3个则不在合并,直接舍弃
                String resNames = listStr.get(index);
                int length = resNames.split("、").length;
                if (length>2){
                    break;
                }
                // 变量将值放入集合中
                for (String column : columnsList) {
                    String[] split = column.split(",");
                    String format = "";
                    // 内容处理
                    format = addAlarmContent(jsonArray, i, split, format);
//                    format = addAlarmContentV2(jsonData,split,format);
                    // 加入集合
                    list.add(format);
                }
                //处理重复发送手机号
                boolean isAdd = true;
                for (List<String> listStr : lists) {
                    if (listStr.contains(res_cd) && listStr.contains(personVO.getPhone())) {
                        isAdd = false;
                        break;
                    String lastString = split[split.length-1];
                    if (lastString.equals("1")) {
                        // 需要合并数据,目前只会合并乡镇水库名称,其他情况不处理
                        for (String s : split) {
                            // 乡镇水库拼接
                            format = format + jsonArray.getJSONObject(i).getString(s);
                        }
                        format = format.replaceAll("null","");
                        // 合并水库名称信息,2個以上拼接等
                        if (length==2){
                            listStr.set(index,listStr.get(index) + "、" + format + "等");
                        }else {
                            listStr.set(index, listStr.get(index) + "、" + format);
                        }
                    }
                }
                if (isAdd)
                    lists.add(list);
                break;
            }
        }
        personLists.addAll(personVOList);
        return isMerge;
    }
    /**
     * 合并水库名称内容--暂不启用
     * @param jsonArray 告警数据
     * @param list 当前告警内容
     * @param columnsList 告警列(合并)
     * @param lists 告警内容
     * @param moreLists 合并告警内容
     * @param i 集合索引
     * @param personVO 人员信息
     * @param index 索引
     * @return
     */
    private boolean mergeResName(JSONArray jsonArray,
                                 List<String> list,
                                 List<String> columnsList,
                                 List<List<String>> lists,
                                 List<List<String>> moreLists,
                                 int i,
                                 PersonVO personVO,
                                 int index) {
        boolean isMerge = false;
        for (List<String> listStr : lists) {
            // 如果告警人员已经存在,则需要按规则判断是否合并水库名称,将当前人员告警内容中的水库名称合并
            if (listStr.contains(personVO.getPhone())) {
                isMerge = true;
                // 判断合并的水库名称是否超过3个,超过3个则不在合并,直接舍弃
                String resNames = listStr.get(index);
                int length = resNames.split("、").length;
                if (length>2){
                    break;
                }
                // 变量将值放入集合中
                for (String column : columnsList) {
                    String[] split = column.split(",");
                    String format = "";
                    String lastString = split[split.length-1];
                    if (lastString.equals("1")) {
                        // 需要合并数据,目前只会合并乡镇水库名称,其他情况不处理
                        for (String s : split) {
                            // 乡镇水库拼接
                            format = format + jsonArray.getJSONObject(i).getString(s);
                        }
                        format = format.replaceAll("null","");
                        // 合并水库名称信息,2個以上拼接等
                        if (length==2){
                            list.add(listStr.get(index) + "、" + format + "等");
                        }else {
                            list.add(listStr.get(index) + "、" + format);
                        }
                    }
                }
                // 加入合并的集合
                moreLists.add(list);
                break;
            }
        }
        return isMerge;
    }
    private List<PersonVO> getPersonListByResGuidV2(String res_cd, List<String> roles) {
@@ -451,6 +662,7 @@
     * @return
     */
    private String addAlarmContent(JSONArray jsonArray, int i, String[] split, String format) {
        // 无需合并数据
        for (String s : split) {
            // 超汛限水位
            if (s.equals("over_z")) {
@@ -510,12 +722,11 @@
            } else {
                format = format + jsonArray.getJSONObject(i).getString(s);
            }
            format = format.replaceAll("null","");
        }
        // 返回
        return format;
    }
    /**
     * 告警内容拼接处理
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeStrategyImpl.java
@@ -218,7 +218,7 @@
                // 遍历
                for (AlarmRuleDetail alarmRuleDetail : alarmRuleDetailList) {
                    if (alarmRuleDetail.getAlarmMode().equals("短信")) {
                        asyncNoticeHandle.waterFirstOverHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterFirstOverList, true, adCode, false);
                        asyncNoticeHandle.waterFirstOverHandle(alarmRule, alarmRuleDetail, ztData,ZtApiDataColumnConstant.waterFirstOverMergeWaterList, true, adCode, false);
                    }
                }
            }
@@ -250,10 +250,10 @@
            if (alarmRuleDetailList.size() > 0) {
                // 遍历
                if (alarmRuleDetailList.get(0).getAlarmMode().equals("短信")) {
                    asyncNoticeHandle.waterSmallScaleOverHandle1(alarmRule, alarmRuleDetailList.get(0), ztData, ZtApiDataColumnConstant.waterSmallScaleOverList, true, adCode, false, uuid);
                    asyncNoticeHandle.waterSmallScaleOverHandle1(alarmRule, alarmRuleDetailList.get(0), ztData, ZtApiDataColumnConstant.waterSmallScaleOverMergeList, true, adCode, false, uuid);
                }
                if (alarmRuleDetailList.get(1).getAlarmMode().equals("短信")) {
                    asyncNoticeHandle.waterSmallScaleOverHandle2(alarmRule, alarmRuleDetailList.get(1), ztData, ZtApiDataColumnConstant.waterSmallScaleOverList, true, adCode, false, uuid);
                    asyncNoticeHandle.waterSmallScaleOverHandle2(alarmRule, alarmRuleDetailList.get(1), ztData, ZtApiDataColumnConstant.waterSmallScaleOverMergeList, true, adCode, false, uuid);
                }
            }
        }
@@ -391,7 +391,7 @@
                // 遍历
                for (AlarmRuleDetail alarmRuleDetail : alarmRuleDetailList) {
                    if (alarmRuleDetail.getAlarmMode().equals("短信")) {
                        asyncNoticeHandle.waterMoreDesignHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterMoreDesignList, true, adCode, false, uuid);
                        asyncNoticeHandle.waterMoreDesignHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterMoreDesignMergeList, true, adCode, false, uuid);
                    }
//                    if (alarmRuleDetail.getAlarmMode().equals("电话") && isTimeSend()) {
//                        asyncNoticeHandle.outCallHandleCall(alarmRule, alarmRuleDetail, ztData,ZtApiDataColumnConstant.waterMoreDesignList,true, adCode, false,uuid);
@@ -425,7 +425,7 @@
                // 遍历
                for (AlarmRuleDetail alarmRuleDetail : alarmRuleDetailList) {
                    if (alarmRuleDetail.getAlarmMode().equals("短信")) {
                        asyncNoticeHandle.waterMoreCheckHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterMoreCheckList, true, adCode, false, uuid);
                        asyncNoticeHandle.waterMoreCheckHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterMoreCheckMergeList, true, adCode, false, uuid);
                    }
//                    if (alarmRuleDetail.getAlarmMode().equals("电话") && isTimeSend()) {
//                        asyncNoticeHandle.outCallHandleCall(alarmRule, alarmRuleDetail, ztData,ZtApiDataColumnConstant.waterMoreCheckList,true, adCode, false,uuid);
@@ -459,7 +459,7 @@
                // 遍历
                for (AlarmRuleDetail alarmRuleDetail : alarmRuleDetailList) {
                    if (alarmRuleDetail.getAlarmMode().equals("短信")) {
                        asyncNoticeHandle.waterComeOneHourUpHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterComeOneHourUpList, true, adCode, false, uuid);
                        asyncNoticeHandle.waterComeOneHourUpHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterComeOneHourUpMergeList, true, adCode, false, uuid);
                    }
                }
            }
@@ -490,7 +490,7 @@
                // 遍历
                for (AlarmRuleDetail alarmRuleDetail : alarmRuleDetailList) {
                    if (alarmRuleDetail.getAlarmMode().equals("短信")) {
                        asyncNoticeHandle.waterComeOneHourDownHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterComeOneHourDownList, true, adCode, false, uuid);
                        asyncNoticeHandle.waterComeOneHourDownHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.waterComeOneHourDownMergeList, true, adCode, false, uuid);
                    }
                }
            }
@@ -533,7 +533,7 @@
                // 遍历
                for (AlarmRuleDetail alarmRuleDetail : alarmRuleDetailList) {
                    if (alarmRuleDetail.getAlarmMode().equals("短信")) {
                        asyncNoticeHandle.alreadyHeavyRainHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.alreadyHeavyRainList, false, adCode, false);
                        asyncNoticeHandle.alreadyHeavyRainHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.alreadyHeavyRainMergeList, false, adCode, false);
                    }
                }
            }
@@ -564,7 +564,7 @@
                // 遍历
                for (AlarmRuleDetail alarmRuleDetail : alarmRuleDetailList) {
                    if (alarmRuleDetail.getAlarmMode().equals("短信")) {
                        asyncNoticeHandle.alreadyRainstormHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.alreadyRainstormList, false, adCode, false);
                        asyncNoticeHandle.alreadyRainstormHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.alreadyRainstormMergeList, false, adCode, false);
                    }
                }
            }
@@ -608,7 +608,7 @@
                // 遍历
                for (AlarmRuleDetail alarmRuleDetail : alarmRuleDetailList) {
                    if (alarmRuleDetail.getAlarmMode().equals("短信")) {
                        asyncNoticeHandle.sixHourRainHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.sixHourRainList, false, adCode, false, uuid);
                        asyncNoticeHandle.sixHourRainHandle(alarmRule, alarmRuleDetail, ztData, ZtApiDataColumnConstant.sixHourRainMergeList, false, adCode, false, uuid);
                    }
//                    if (alarmRuleDetail.getAlarmMode().equals("电话") && isTimeSend()) {
//                        asyncNoticeHandle.outCallHandleCall(alarmRule, alarmRuleDetail, ztData,ZtApiDataColumnConstant.sixHourRainList,true, adCode, false,uuid);
@@ -1652,7 +1652,7 @@
            //左右岸方向
            Double dnVal = jsonObject.getDouble("dn_val");
            //垂直
            Double duValue = jsonObject.getDouble("垂直位移");
            Double duValue = jsonObject.getDouble("du_value");
            String direction = "";
            String val = "";
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java
@@ -204,39 +204,72 @@
    @Override
    public Map<String, Object> sendSignMsg(SmsRequestTemplate smsRequestTemplate) {
        // 取出数据
        SMSSendRequest request = new SMSSendRequest();
        SmsTemplate smsTemplate = smsRequestTemplate.getSmsTemplate();
        request.setTemplateId(smsTemplate.getTemplateId());
        // 合并
        SmsTemplate smsTemplateMerge = smsRequestTemplate.getSmsTemplateMerge();
        // 告警内容
        List<List<String>> templateContent = smsRequestTemplate.getTemplateContent();
        // 合并水库告警内容
        List<List<String>> templateTemplateMergeContent = smsRequestTemplate.getTemplateMergeContent();
        // 获取告警规则
        AlarmRule alarmRule = smsRequestTemplate.getAlarmRule();
        // 是否同时发送站内信
        Boolean isSendStation = false;
        if (null!=smsRequestTemplate.getIsSendStation()){
            isSendStation = smsRequestTemplate.getIsSendStation();
        }
        // 判断 templateContent 个数,个数超过1000 需要分段发送短信
        List<List<List<String>>> lists = Lists.partition(templateContent, 1000);
        int number = 0;
        for (List<List<String>> list : lists) {
            // 临时保存告警记录用
            List<List<String>> templateList = getAlarmList(list);
            // 批量发送短信
            Map<String, Object> map = batchSendAlertsSms(smsRequestTemplate.getSmsTemplate(), list);
            int count = Integer.parseInt(map.get("errCount").toString());
            ComResult<DynSMSSendDataResult> resultComResult =(ComResult<DynSMSSendDataResult>) map.get("resultComResult");
            // 保存短信结果记录
            SmsResult smsResult = saveSendResult(alarmRule.getId(),resultComResult.getCode().toString(),resultComResult.getMsg(),request, list.size() - count);
            // 保存详情记录(短信详情,告警详情)
            List<SmsRecord> smsRecordList = saveAlertsAndSmsDetail(smsResult,resultComResult,smsRequestTemplate.getSmsTemplate(),
                templateList,request,smsRequestTemplate.getAlarmRule(),isSendStation);
            // number 累加
            number += smsRecordList.size();
        }
        // 设置返回数据
        Map<String, Object> params = new HashMap<>(1);
        params.put("sendNumber",number);
        Map<String, Object> map = new HashMap<>(2);
        // 发送消息处理
        Map<String, Object> params = sendSmsReturnStringObjectMap(smsTemplate, templateContent, alarmRule, isSendStation);
        // 发送合并水库消息处理
        Map<String, Object> mergeParams = sendSmsReturnStringObjectMap(smsTemplateMerge, templateTemplateMergeContent, alarmRule, isSendStation);
        // 合并返回数据
        map.put("oneMap",params);
        map.put("moreMap",mergeParams);
        // 返回
        return params;
        return map;
    }
    /**
     * 发送消息处理
     * @param smsTemplate
     * @param templateContent
     * @param alarmRule
     * @param isSendStation
     * @return
     */
    @NotNull
    private Map<String, Object> sendSmsReturnStringObjectMap(SmsTemplate smsTemplate,
                                                             List<List<String>> templateContent,
                                                             AlarmRule alarmRule,
                                                             Boolean isSendStation) {
        if (null!=smsTemplate) {
            // 取出数据
            SMSSendRequest request = new SMSSendRequest();
            request.setTemplateId(smsTemplate.getTemplateId());
            // 判断 templateContent 个数,个数超过1000 需要分段发送短信
            List<List<List<String>>> lists = Lists.partition(templateContent, 1000);
            int number = 0;
            for (List<List<String>> list : lists) {
                // 临时保存告警记录用
                List<List<String>> templateList = getAlarmList(list);
                // 批量发送短信
                Map<String, Object> map = batchSendAlertsSms(smsTemplate, list);
                int count = Integer.parseInt(map.get("errCount").toString());
                ComResult<DynSMSSendDataResult> resultComResult = (ComResult<DynSMSSendDataResult>) map.get("resultComResult");
                // 保存短信结果记录
                SmsResult smsResult = saveSendResult(alarmRule.getId(), resultComResult.getCode().toString(), resultComResult.getMsg(), request, list.size() - count);
                // 保存详情记录(短信详情,告警详情)
                List<SmsRecord> smsRecordList = saveAlertsAndSmsDetail(smsResult, resultComResult, smsTemplate,
                    templateList, request, alarmRule, isSendStation);
                // number 累加
                number += smsRecordList.size();
            }
            // 设置返回数据
            Map<String, Object> params = new HashMap<>(1);
            params.put("sendNumber", number);
        }
        return null;
    }
    /**
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/vo/SmsRequestTemplate.java
@@ -52,6 +52,12 @@
     */
    private List<List<String>> templateContent;
    /**
     * 合并内容(短信内容)--临时
     */
    private List<List<String>> templateMergeContent;
    /**
     * 类型 1:遍历发送  2:批量发送(一次发多个)
     */
@@ -63,6 +69,11 @@
    private SmsTemplate smsTemplate;
    /**
     * 短信模板对象信息(合并的模板)
     */
    private SmsTemplate smsTemplateMerge;
    /**
     * 是否发送站内信
     */
    private Boolean isSendStation;
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/controller/SgProjectInfoController.java
@@ -2,10 +2,7 @@
import cn.gistack.sm.sg.DO.SgProjectInfoDO;
import cn.gistack.sm.sg.DTO.ProjectSearchDTO;
import cn.gistack.sm.sg.VO.SgProjectInfoVO;
import cn.gistack.sm.sg.VO.SgStatisProVO;
import cn.gistack.sm.sg.VO.SgStatistccVO;
import cn.gistack.sm.sg.VO.SgStatisticsVO;
import cn.gistack.sm.sg.VO.*;
import cn.gistack.sm.sg.excel.ProjectExcel;
import cn.gistack.sm.sg.excel.ProjectImport;
import cn.gistack.sm.sg.service.SgProjectInfoService;
@@ -139,15 +136,24 @@
    @PostMapping("add")
    public R add(@RequestBody SgProjectInfoDO sgProjectInfoDO) {
        sgProjectInfoService.save(sgProjectInfoDO);
        return R.success("新增成功");
        return R.data(sgProjectInfoDO);
    }
    /**
     * 新增项目
     * 修改项目
     */
    @PostMapping("update")
    public R update(@RequestBody SgProjectInfoDO sgProjectInfoDO) {
        sgProjectInfoService.updateById(sgProjectInfoDO);
        return R.success("修改成功");
    }
    /**
     * 项目树
     */
    @GetMapping("project_tree")
    public R projectTree(ProjectSearchDTO dto) {
    List<SgProjectTreeVO> tree = sgProjectInfoService.projectTree(dto);
        return R.data(tree);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgGxMapper.java
@@ -28,4 +28,6 @@
    SgGxDO selectByGxType(@Param("gxType") String gxType);
    SgGxVO getById(@Param("id") Long id);
    List<String> childType(@Param("gxType") String gxType);
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgGxMapper.xml
@@ -10,6 +10,12 @@
        <if test="dto.gxName != null and dto.gxName != ''">
            and gx.gx_name LIKE CONCAT('%', #{dto.gxName}, '%')
        </if>
        <if test="dto.childTypeList>0 and dto.childTypeList != null">
            and gx.gx_type in
            <foreach collection="dto.childTypeList" open="(" close=")" separator="," item="id">
                #{id}
            </foreach>
        </if>
    </select>
    <select id="queryStepByIds" resultType="cn.gistack.sm.sg.DO.SgGxStepDO">
        select * from YWXT.SG_GX_STEP step where 1=1
@@ -26,4 +32,7 @@
    <select id="getById" resultType="cn.gistack.sm.sg.VO.SgGxVO">
        select * from  YWXT.SG_GX  where id = #{id}
    </select>
    <select id="childType" resultType="java.lang.String">
        select id from "YWXT"."BLADE_DICT_BIZ" where parent_id = (select id from "YWXT"."BLADE_DICT_BIZ" where dict_key = #{gxType});
    </select>
</mapper>
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProgressReportMapper.xml
@@ -31,6 +31,7 @@
        <if test="dto.endTime != null and dto.endTime !='' ">
            and report.report_time &lt;= #{dto.endTime}
        </if>
        order by report_time desc
    </select>
    <select id="queryPageListAll" resultType="cn.gistack.sm.sg.VO.SgProgressReportVO">
@@ -59,6 +60,7 @@
        <if test="dto.endTime != null and dto.endTime != ''">
            and report.create_time &lt;= #{dto.endTime}
        </if>
        order by report.report_time desc
    </select>
    <select id="queryById" resultType="cn.gistack.sm.sg.VO.SgProgressReportVO">
@@ -113,6 +115,7 @@
        <if test="dto.endTime != null and dto.endTime !='' ">
            and report.report_time &lt;= #{dto.endTime}
        </if>
        order by report.report_time desc
        <!--<choose >
            <when test="dto.approvalStatus != null and dto.approvalStatus == 0">
                and report.audit_person = #{dto.userId} and (report."STATUS" = 0 or report."STATUS" = 1)
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProjectInfoMapper.java
@@ -55,6 +55,10 @@
    List<SgAllDeptOrUser> queryUser();
    List<SgProjectTreeVO> projectTree(@Param("dto") ProjectSearchDTO dto);
    //List<String> getProjectIds(String code,@Param("grad") String grad );
    List<String> getUserS(String controlUnit);
    //List<String> getProjectIds(String code,@Param("grad") String grad );
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProjectInfoMapper.xml
@@ -21,6 +21,9 @@
        <if test="dto.skName != null and dto.skName != ''">
            and info.sk_name like concat(concat('%',#{dto.skName}),'%')
        </if>
        <if test="dto.lot != null and dto.lot != ''">
            and info.lot = #{dto.lot}
        </if>
        <if test="dto.resCd != null and dto.resCd != '' ">
            and info.sk_id like CONCAT(CONCAT('%', #{dto.resCd}), '%')
        </if>
@@ -35,6 +38,9 @@
        </if>
        <if test="dto.isBegin != null and dto.isBegin == 2">
            and info.status = 0
        </if>
        <if test="dto.buildStage != null and dto.buildStage != ''">
            and info.build_stage = #{dto.buildStage}
        </if>
        <if test="dto.projectIds != null and dto.projectIds.size > 0">
            and info.id in
@@ -60,14 +66,27 @@
                #{id}
            </foreach>)
        </if>
        <if test="dto.projectSort == null or dto.projectSort ==0">
            ORDER BY info.status desc ,info.project_progress desc
       <if test="dto.projectSort == null">
            ORDER BY info.status desc ,info.project_progress desc NULLS LAST
        </if>
        <if test="dto.projectSort ==1">
            ORDER BY info.project_progress desc
        <!--
       <if test="dto.projectSort ==1">
           ORDER BY info.project_progress desc NULLS LAST
       </if>
       <if test="dto.projectSort != null and dto.projectSort ==2">
           ORDER BY info.sk_id asc
       </if>-->
        <if test="dto.projectSort != null and dto.projectSort ==3">
            ORDER BY info.surface_progress desc NULLS LAST
        </if>
        <if test="dto.projectSort != null and dto.projectSort ==2">
            ORDER BY info.sk_id asc
        <if test="dto.projectSort != null and dto.projectSort ==4">
            ORDER BY info.video_progress desc NULLS LAST
        </if>
        <if test="dto.projectSort != null and dto.projectSort ==5">
            ORDER BY info.trans_progress desc NULLS LAST
        </if>
        <if test="dto.projectSort != null and dto.projectSort ==6">
            ORDER BY info.seepage_progress desc NULLS LAST
        </if>
    </select>
@@ -131,6 +150,12 @@
                #{id}
            </foreach>
        </if>
        <if test="dto.lot != null and dto.lot != ''">
            and pro.lot like CONCAT(CONCAT('%',#{dto.lot}),'%')
        </if>
        <if test="dto.buildStage != null and dto.buildStage != ''">
            and pro.build_stage like CONCAT(CONCAT('%',#{dto.buildStage}),'%')
        </if>
       ORDER BY pro.status desc ,pro.project_progress desc
    </select>
@@ -149,6 +174,13 @@
     <if test="dto.projectName != null and dto.projectName != ''">
         and pro.project_name like CONCAT(CONCAT('%',#{dto.projectName}),'%')
     </if>
     <if test="dto.lot != null and dto.lot != ''">
         and pro.lot like CONCAT(CONCAT('%',#{dto.lot}),'%')
     </if>
     <if test="dto.buildStage != null and dto.buildStage != ''">
         and pro.build_stage like CONCAT(CONCAT('%',#{dto.buildStage}),'%')
     </if>
        ORDER BY pro.project_progress desc NULLS LAST
    </select>
    <select id="getSgstatiss" resultType="cn.gistack.sm.sg.VO.SgStatisticsVO">
        SELECT
@@ -182,7 +214,8 @@
    a."ad_name" NAME,
    SUM( CASE WHEN b.STATUS IN ( 1, 2 ) THEN 1 ELSE 0 END ) AS commenceNum,
    count( b.STATUS ) projectSum,
    LISTAGG(b.id, ',') as proIds
    LISTAGG(b.id, ',') as proIds,
    b.build_stage
FROM
    (
    SELECT
@@ -190,7 +223,8 @@
        att."guid" AS cityCode,
        ad."ad_code" AS provinceCode,
        info.STATUS,
        info.id
        info.id,
        info.build_stage
    FROM
        YWXT.SG_PROJECT_INFO info
        LEFT JOIN SJZT_DW."dim_res_info_a" dria ON dria."res_cd" = info.sk_id
@@ -206,7 +240,8 @@
    a."p_ad_code" = #{code}
GROUP BY
    a."ad_code",
    a."ad_name"
    a."ad_name",
    b.build_stage
    </select>
    <select id="getsgStatisticsZero" resultType="cn.gistack.sm.sg.VO.SgStatisProVO">
@@ -214,7 +249,8 @@
    dria."city_cd" code, dria."city_nm" name ,
    sum( CASE WHEN info.STATUS IN ( 1, 2 ) THEN 1 ELSE 0 END ) AS commenceNum,
    count( info.STATUS ) projectSum,
    LISTAGG(info.id, ',') as proIds
    LISTAGG(info.id, ',') as proIds,
    info.build_stage as buildStage
    FROM
    YWXT.SG_PROJECT_INFO info
    LEFT JOIN SJZT_DW."dim_res_info_a" dria ON dria."res_cd" = info.sk_id
@@ -223,7 +259,7 @@
    <if test="code != null and code != ''">
        AND   info.lot =#{code}
    </if>
    Group By dria."city_cd",dria."city_nm"
    Group By dria."city_cd",dria."city_nm",info.build_stage
    HAVING
    dria."city_cd" IS NOT NULL AND
    dria."city_nm" IS NOT NULL
@@ -237,14 +273,15 @@
    info.lot as name,
    sum( CASE WHEN info.STATUS IN ( 1, 2 ) THEN 1 ELSE 0 END ) AS commenceNum,
    count( info.STATUS ) AS projectSum,
    LISTAGG(info.id, ',') as proIds
    LISTAGG(info.id, ',') as proIds,
    info.build_stage
FROM
    YWXT.SG_PROJECT_INFO info
    LEFT JOIN SJZT_DW."dim_res_info_a" dria ON dria."res_cd" = info.sk_id
WHERE
    1 = 1
GROUP BY
     info.lot
     info.lot,info.build_stage
 <!--    dria."bas_guid", dria."bas_name" -->
    HAVING
 <!--   dria."bas_guid" IS NOT NULL AND
@@ -300,19 +337,23 @@
        select DISTINCT  "bas_guid"  from SJZT_DW."dim_res_info_a" where "bas_name" = #{code}
    </select>
    <select id="progressList1" resultType="cn.gistack.sm.sg.VO.SgProjectInfoVO">
        select pro.id,
        select DISTINCT pro.id,
        pro.project_name,
        pro.lon_lat,
        pro.status
        pro.status,
        pro.project_progress
        from
        (SELECT
        pro.id,
        pro.project_name,
        pro.lon_lat,
        pro.status,
        pro.lot,
        pro.build_stage,
        dria."county_cd" AS countyCode,
        att."guid" AS cityCode,
        ad."ad_code" AS provinceCode
        ad."ad_code" AS provinceCode,
        pro.project_progress
        FROM
        ywxt.sg_project_info pro
        LEFT JOIN SJZT_DW."dim_res_info_a" dria ON dria."res_cd" = pro.sk_id
@@ -330,6 +371,13 @@
        <if test="dto.projectName != null and dto.projectName != ''">
            and pro.project_name like CONCAT(CONCAT('%',#{dto.projectName}),'%')
        </if>
        <if test="dto.lot != null and dto.lot != ''">
            and pro.lot like CONCAT(CONCAT('%',#{dto.lot}),'%')
        </if>
        <if test="dto.buildStage != null and dto.buildStage != ''">
            and pro.build_stage like CONCAT(CONCAT('%',#{dto.buildStage}),'%')
        </if>
        order by pro.project_progress desc NULLS LAST
    </select>
    <select id="queryStepByProject1" resultType="cn.gistack.sm.sg.VO.SgProjectInfoVO">
    select
@@ -371,7 +419,9 @@
        dria."county_cd" AS countyCode,
        att."guid" AS cityCode,
        ad."ad_code" AS provinceCode,
        pro.project_progress
        pro.project_progress,
        pro.lot,
        pro.build_stage
        FROM
        ywxt.sg_project_info pro
        LEFT JOIN ywxt.sg_device d ON pro.id = d.program_id
@@ -404,6 +454,12 @@
            <foreach collection="dto.projectIds" item="id" separator="," open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="dto.lot != null and dto.lot != ''">
            and pro.lot like CONCAT(CONCAT('%',#{dto.lot}),'%')
        </if>
        <if test="dto.buildStage != null and dto.buildStage != ''">
            and pro.build_stage like CONCAT(CONCAT('%',#{dto.buildStage}),'%')
        </if>
        ORDER BY pro.projectStatus desc ,pro.project_progress desc
    </select>
@@ -439,4 +495,52 @@
    <select id="queryUser" resultType="cn.gistack.sm.sg.VO.SgAllDeptOrUser">
        select id,real_name as name from "YWXT"."BLADE_USER";
    </select>
    <select id="projectTree" resultType="cn.gistack.sm.sg.VO.SgProjectTreeVO">
        SELECT
<!--         TOP 200 -->
        info.id,
        info.lot,
        dria."province_nm",
        dria."city_nm",
        dria."county_nm",
        dria."town_nm",
        dria."res_nm"
        FROM
        YWXT.SG_PROJECT_INFO info
                LEFT JOIN SJZT_DW."dim_res_info_a" dria ON dria."res_cd" = info.sk_id
        WHERE
            1 =1
        <if test="dto.buildStage != null and dto.buildStage != ''">
            and info.build_stage = #{dto.buildStage}
        </if>
        <if test="dto.sgCodeS != null and dto.sgCodeS.size > 0">
            and (dria."province_cd" in
            <foreach collection="dto.sgCodeS" item="id" separator="," open="(" close=")">
                #{id}
            </foreach>
            or dria."city_cd" in
            <foreach collection="dto.sgCodeS" item="id" separator="," open="(" close=")">
                #{id}
            </foreach>
            or dria."county_cd" in
            <foreach collection="dto.sgCodeS" item="id" separator="," open="(" close=")">
                #{id}
            </foreach>
            or dria."town_cd" in
            <foreach collection="dto.sgCodeS" item="id" separator="," open="(" close=")">
                #{id}
            </foreach>)
        </if>
    </select>
    <select id="getUserS" resultType="java.lang.String">
        SELECT
            user_id
        FROM
            "YWXT"."BLADE_USER_DEPT"
        WHERE
            dept_id = #{controlUnit}
    </select>
</mapper>
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/SgProjectInfoService.java
@@ -2,10 +2,7 @@
import cn.gistack.sm.sg.DO.SgProjectInfoDO;
import cn.gistack.sm.sg.DTO.ProjectSearchDTO;
import cn.gistack.sm.sg.VO.SgProjectInfoVO;
import cn.gistack.sm.sg.VO.SgStatisProVO;
import cn.gistack.sm.sg.VO.SgStatistccVO;
import cn.gistack.sm.sg.VO.SgStatisticsVO;
import cn.gistack.sm.sg.VO.*;
import cn.gistack.sm.sg.excel.ProjectExcel;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -42,4 +39,6 @@
    List<SgStatisProVO> getsgStatisticsList(String code);
    List<SgStatistccVO> getsgStatisticscc(String code);
    List<SgProjectTreeVO> projectTree(ProjectSearchDTO dto);
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/impl/SgGxServiceImpl.java
@@ -12,6 +12,7 @@
import cn.gistack.sm.sg.service.SgGxStepService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springblade.core.log.exception.ServiceException;
@@ -46,7 +47,12 @@
    private SgProgressReportMapper sgProgressReportMapper;
    @Override
    public IPage<SgGxVO> queryPageList(IPage<SgGxVO> page, ProjectSearchDTO searchDTO) {
        if (StringUtils.isNotBlank(searchDTO.getGxType())){
            List<String> childType = sgGxMapper.childType(searchDTO.getGxType());
            searchDTO.setChildTypeList(childType);
        }
        List<SgGxVO> list = sgGxMapper.queryPageList(page,searchDTO);
        if (CollectionUtils.isNotEmpty(list)){
            List<Long> ids = list.stream().map(SgGxDO::getId).collect(Collectors.toList());
            List<Long> userIds = list.stream().map(SgGxDO::getCreateUser).collect(Collectors.toList());
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/impl/SgProgressReportServiceImpl.java
@@ -3,10 +3,7 @@
import cn.gistack.sm.sg.DO.*;
import cn.gistack.sm.sg.DTO.ApprovalDTO;
import cn.gistack.sm.sg.DTO.ProjectSearchDTO;
import cn.gistack.sm.sg.VO.SgProgressReportVO;
import cn.gistack.sm.sg.VO.SgProjectInfoVO;
import cn.gistack.sm.sg.VO.SgReportVO;
import cn.gistack.sm.sg.VO.SgStepReportVO;
import cn.gistack.sm.sg.VO.*;
import cn.gistack.sm.sg.mapper.*;
import cn.gistack.sm.sg.service.SgProgressReportService;
import cn.gistack.sm.sg.service.SgProjectInfoService;
@@ -66,15 +63,37 @@
    @Autowired
    private SgProjectInfoServiceImpl sgProjectInfoService;
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    @Override
    public IPage<SgProgressReportVO> queryPageList(IPage<SgProgressReportVO> page, ProjectSearchDTO searchDTO) {
        List<SgProgressReportVO> list = sgProgressReportMapper.queryPageList(page,searchDTO);
        if(list != null){
            list.forEach(s ->{
                Long proframId = s.getProframId();
                SgProjectInfoDO sgProjectInfoDO = sgProjectInfoMapper.selectById(proframId);
                String controlUnit = sgProjectInfoDO.getControlUnit();
                List<String> users=sgProjectInfoMapper.getUserS(controlUnit);
                s.setUserIDs(users);
            });
        }
        return page.setRecords(list);
    }
    @Override
    public IPage<SgProgressReportVO> queryPageListAll(IPage<SgProgressReportVO> page, ProjectSearchDTO searchDTO) {
        List<SgProgressReportVO> list = sgProgressReportMapper.queryPageListAll(page,searchDTO);
        if(list != null){
            list.forEach(s ->{
                Long proframId = s.getProframId();
                SgProjectInfoDO sgProjectInfoDO = sgProjectInfoMapper.selectById(proframId);
                String controlUnit = sgProjectInfoDO.getControlUnit();
                List<String> users=sgProjectInfoMapper.getUserS(controlUnit);
                s.setUserIDs(users);
            });
        }
        return page.setRecords(list);
    }
    @Override
@@ -186,22 +205,23 @@
        if (CollectionUtils.isEmpty(roIds)){
            throw new ServiceException("请完成工序角色配置!");
        }
        List<SgProjectPersonConfigDO> personConfigDOS = new LambdaQueryChainWrapper<>(sgProjectPersonConfigMapper).eq(SgProjectPersonConfigDO::getProgramId,sgProgressReportDO.getProframId()).in(SgProjectPersonConfigDO::getRoldId, roIds).list();
        if (CollectionUtils.isEmpty(personConfigDOS)){
            throw new ServiceException("请完成项目审批人员配置!");
        }
        Map<Long, Long> userMap = personConfigDOS.stream().collect(Collectors.toMap(SgProjectPersonConfigDO::getRoldId, SgProjectPersonConfigDO::getUserId));
        sgReportUserMapper.insert(SgReportUserDO.builder().reportId(sgProgressReportDO.getId()).userId(sgProgressReportDO.getReportUser()).approvalContent("提交审批").approvalStatus(0).approvalOrder(0).approvalTime(now).build());
//        List<SgProjectPersonConfigDO> personConfigDOS = new LambdaQueryChainWrapper<>(sgProjectPersonConfigMapper).eq(SgProjectPersonConfigDO::getProgramId,sgProgressReportDO.getProframId()).in(SgProjectPersonConfigDO::getRoldId, roIds).list();
//        if (CollectionUtils.isEmpty(personConfigDOS)){
//            throw new ServiceException("请完成项目审批人员配置!");
//        }
        //Map<Long, Long> userMap = personConfigDOS.stream().collect(Collectors.toMap(SgProjectPersonConfigDO::getRoldId, SgProjectPersonConfigDO::getUserId));
        //新增审批记录
        sgReportUserMapper.insert(SgReportUserDO.builder().reportId(sgProgressReportDO.getId()).userId(sgProgressReportDO.getReportUser()).approvalContent("提交审批").roleId(Long.parseLong(AuthUtil.getUser().getRoleId())).approvalStatus(0).approvalOrder(0).approvalTime(now).build());
        for (SgGxConfigDO sgGxConfigDO : sgGxConfigDOS) {
            sgGxConfigDO.setUser(userMap.get(Long.parseLong(sgGxConfigDO.getRoleId())));
            sgReportUserMapper.insert(SgReportUserDO.builder().reportId(sgProgressReportDO.getId()).userId(sgGxConfigDO.getUser()).approvalStatus(0).approvalOrder(sgGxConfigDO.getSgOrder()).build());
            //sgGxConfigDO.setUser(userMap.get(Long.parseLong(sgGxConfigDO.getRoleId())));
            sgReportUserMapper.insert(SgReportUserDO.builder().reportId(sgProgressReportDO.getId()).roleId(Long.parseLong(sgGxConfigDO.getRoleId())).approvalStatus(0).approvalOrder(sgGxConfigDO.getSgOrder()).build());
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            if (sgGxConfigDO.getSgOrder() == 1) {
                sgProgressReportDO.setAuditPerson(String.valueOf(sgGxConfigDO.getUser()));
                sgProgressReportDO.setAuditPerson(String.valueOf(sgGxConfigDO.getRoleId()));
                sgProgressReportMapper.updateById(sgProgressReportDO);
            }
        }
@@ -258,15 +278,29 @@
        Integer isReject = approvalDTO.getIsReject();
        Long userId = approvalDTO.getUserId();
        Long id = approvalDTO.getId();
        String roleId = AuthUtil.getUser().getRoleId();
        QueryWrapper<SgProgressReportDO> wrappers = new QueryWrapper<>();
        wrappers.eq("id", id);
        SgProgressReportDO sgProgressReportDOS1 = sgProgressReportMapper.selectOne(wrappers);
        //判断当前用户的角色是不是   工序配置的审核的角色
        List<SgGxConfigDO> sgGxConfigDOS = new LambdaQueryChainWrapper<>(sgGxConfigMapper)
            .eq(SgGxConfigDO::getGxDeviceType, sgProgressReportDOS1.getDeviceType()).eq(SgGxConfigDO::getGxStepId, sgProgressReportDOS1.getGxStepId()).orderByAsc(SgGxConfigDO::getSgOrder).list();
        List<String> roIds = sgGxConfigDOS.stream().map(SgGxConfigDO::getRoleId).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(roIds)){
            throw new ServiceException("请完成工序角色配置!");
        }
        SgProgressReportDO sgProgressReportDO = sgProgressReportMapper.selectById(id);
        List<SgReportUserDO> sgReportUserDOS = new LambdaQueryChainWrapper<>(sgReportUserMapper).eq(SgReportUserDO::getReportId, id).ne(SgReportUserDO::getApprovalOrder,0).eq(SgReportUserDO::getIsHis,0)
            .orderByAsc(SgReportUserDO::getApprovalOrder).list();
        //审批者
        SgReportUserDO sgReportUserDO = new SgReportUserDO();
        if (isReject==1 && sgProgressReportDO.getStatus().equals(2)){
        if (isReject==1){
            sgReportUserDO = sgReportUserDOS.get(0);
        }else {
            sgReportUserDO = sgReportUserDOS.stream().filter(s -> s.getUserId().equals(Long.parseLong(sgProgressReportDO.getAuditPerson()))).findFirst().get();
            sgReportUserDO = sgReportUserDOS.stream().filter(s -> s.getRoleId().equals(Long.parseLong(sgProgressReportDO.getAuditPerson()))).findFirst().get();
        }
        Date date = new Date();
        LambdaUpdateChainWrapper<SgProgressReportDO> updateChainWrapper = new LambdaUpdateChainWrapper<>(sgProgressReportMapper).eq(SgProgressReportDO::getId, id);
@@ -274,12 +308,12 @@
            .eq(SgReportUserDO::getId, sgReportUserDO.getId()).set(SgReportUserDO::getApprovalContent,approvalDTO.getApprovalContent()).set(SgReportUserDO::getApprovalTime,date);
        if (approvalDTO.getStatus()==1){
            Integer approvalOrder = sgReportUserDO.getApprovalOrder();
            userUpdate.set(SgReportUserDO::getApprovalStatus,1).update();
            userUpdate.set(SgReportUserDO::getApprovalStatus,1).set(SgReportUserDO::getUserId,userId).update();
        Optional<SgReportUserDO> next = sgReportUserDOS.stream().filter(s -> s.getApprovalOrder() == approvalOrder + 1).findFirst();
        //如果存在下一个审批人,则继续审批
        if (next.isPresent()){
            SgReportUserDO nextUser = next.get();
            updateChainWrapper.set(SgProgressReportDO::getStatus,1).set(SgProgressReportDO::getAuditPerson,nextUser.getUserId()).update();
            updateChainWrapper.set(SgProgressReportDO::getStatus,1).set(SgProgressReportDO::getAuditPerson,nextUser.getRoleId()).update();
        }else {
            updateChainWrapper.set(SgProgressReportDO::getStatus,2).set(SgProgressReportDO::getAuditPerson,null).update();
            Long proframId = sgProgressReportMapper.selectById(approvalDTO.getId()).getProframId();
@@ -291,21 +325,16 @@
                }
            });
            cachedThreadPool.execute(new Runnable(){
                @Override
                public  void  run(){
                    Long proframId = sgProgressReportMapper.selectById(approvalDTO.getId()).getProframId();
                    setProgramProgress(proframId);
                }
            });
            Long projectID = sgProgressReportMapper.selectById(approvalDTO.getId()).getProframId();
            setProgramProgress(projectID);
        }
        }else {
            updateChainWrapper.set(SgProgressReportDO::getStatus,3);
            updateChainWrapper.set(SgProgressReportDO::getResubmit,0);
            userUpdate.set(SgReportUserDO::getApprovalStatus,2);
            /*if (isReject==1){
            if (isReject==1){
                userUpdate.set(SgReportUserDO::getUserId,userId);
            }*/
            }
            userUpdate.update();
            /*for (SgReportUserDO reportUserDO : sgReportUserDOS) {
                if (reportUserDO.getApprovalOrder()<=sgReportUserDO.getApprovalOrder()&&reportUserDO.getApprovalOrder()!=0){
@@ -343,12 +372,14 @@
     * @param proframId
     */
    public void setProgramProgress(Long proframId) {
        SgProjectInfoVO sgProjectInfoVO = sgProjectInfoMapper.selectVOById(proframId);
        List<SgProjectInfoDO> progress = sgProjectInfoService.getProjectProgress(Collections.singletonList(sgProjectInfoVO));
        ProjectSearchDTO searchDTO = new ProjectSearchDTO();
        searchDTO.setProjectId(String.valueOf(proframId));
        List<SgProjectInfoVO> list = sgProjectInfoMapper.queryStepByProject(searchDTO);
        List<SgProjectInfoDO> progress = sgProjectInfoService.getProjectProgress(list);
        String projectProgress = progress.get(0).getProjectProgress();
        if (StringUtils.isNotBlank(projectProgress)){
            String s = projectProgress.substring(0, projectProgress.length() - 1);
            new LambdaUpdateChainWrapper<>(sgProjectInfoMapper).set(SgProjectInfoDO::getProjectProgress,s).update() ;
            new LambdaUpdateChainWrapper<>(sgProjectInfoMapper).set(SgProjectInfoDO::getProjectProgress,s).eq(SgProjectInfoDO::getId,proframId).update() ;
        }
    }
    private  void setReportUser(Date date, SgReportUserDO reportUserDO) {
@@ -401,7 +432,14 @@
                        sgProjectInfoMapper.updateById(project);
                    }
                }
                Map<String, SgOperatingRateVO> deviceTypes = sgProjectInfoService.getDeviceTypes(Arrays.asList(projectId.toString()));
                SgOperatingRateVO vo = deviceTypes.get(projectId.toString());
                if (Objects.nonNull(vo)){
                    project.setSurfaceProgress(vo.getSurfaceProgress());
                    project.setVideoProgress(vo.getVideoProgress());
                    project.setTransProgress(vo.getTransProgress());
                    project.setSeepageProgress(vo.getSeepageProgress());
                }
            }
        }
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/impl/SgProjectInfoServiceImpl.java
@@ -61,6 +61,7 @@
                Map<Long, String> progressMap = projectProgress.stream().filter(s->s.getProjectProgress()!=null).collect(Collectors.toMap(SgProjectInfoDO::getId, SgProjectInfoDO::getProjectProgress));
                sgProjectInfoDOS.forEach(s->{
                    s.setProjectProgress(progressMap.get(s.getId()));
                    setPercentage(s);
                });
            }
            return page.setRecords(sgProjectInfoDOS);
@@ -75,6 +76,7 @@
                Map<Long, String> progressMap = projectProgress.stream().filter(s->s.getProjectProgress()!=null).collect(Collectors.toMap(SgProjectInfoDO::getId, SgProjectInfoDO::getProjectProgress));
                sgProjectInfoDOS.forEach(s->{
                    s.setProjectProgress(progressMap.get(s.getId()));
                    setPercentage(s);
                });
            }
            sgProjectInfoDOS.forEach(s->{
@@ -111,6 +113,17 @@
            return sgProjectInfoDOS;
        }
    }
    /**
     * 设置百分号
     * @param s
     */
    private void setPercentage(SgProjectInfoDO s) {
        s.setSurfaceProgress(s.getSurfaceProgress()==null?null:s.getSurfaceProgress()+"%");
        s.setVideoProgress(s.getVideoProgress()==null?null:s.getVideoProgress()+"%");
        s.setTransProgress(s.getTransProgress()==null?null:s.getTransProgress()+"%");
        s.setSeepageProgress(s.getSeepageProgress()==null?null:s.getSeepageProgress()+"%");
    }
    /**
@@ -289,26 +302,31 @@
    @Override
    public IPage<SgProjectInfoVO> progressPage(IPage<SgProjectInfoVO> page, ProjectSearchDTO searchDTO) {
        List<SgProjectInfoVO> list = new ArrayList<>();
            if(!searchDTO.getAdCode().isEmpty()){
            if(StringUtils.isNotBlank(searchDTO.getAdCode())){
                list =    sgProjectInfoMapper.progressList1(page, searchDTO);
            }else {
                list = sgProjectInfoMapper.progressList(page, searchDTO);
            }
        List<Long> ids = list.stream().map(SgProjectInfoVO::getId).collect(Collectors.toList());
        searchDTO.setProjectIds(ids);
        List<SgProjectInfoDO> projectProgress = new ArrayList<>();
        if(!searchDTO.getAdCode().isEmpty()){
            projectProgress = getProjectProgress(sgProjectInfoMapper.queryStepByProject1(searchDTO));
        }else {
            projectProgress = getProjectProgress(sgProjectInfoMapper.queryStepByProject(searchDTO));
        }
//        List<Long> ids = list.stream().map(SgProjectInfoVO::getId).collect(Collectors.toList());
//        searchDTO.setProjectIds(ids);
//        List<SgProjectInfoDO> projectProgress = new ArrayList<>();
//        if(StringUtils.isNotBlank(searchDTO.getAdCode())){
//            projectProgress = getProjectProgress(sgProjectInfoMapper.queryStepByProject1(searchDTO));
//        }else {
//            projectProgress = getProjectProgress(sgProjectInfoMapper.queryStepByProject(searchDTO));
//        }
        if (CollectionUtils.isNotEmpty(projectProgress)){
        Map<Long, String> progressMap = projectProgress.stream().filter(s->s!=null && s.getProjectProgress() !=null).collect(Collectors.toMap(SgProjectInfoDO::getId, SgProjectInfoDO::getProjectProgress));
//        if (CollectionUtils.isNotEmpty(projectProgress)){
        //Map<Long, String> progressMap = projectProgress.stream().filter(s->s!=null && s.getProjectProgress() !=null).collect(Collectors.toMap(SgProjectInfoDO::getId, SgProjectInfoDO::getProjectProgress));
        list.forEach(s->{
            s.setProjectProgress(progressMap.get(s.getId()));
        });}
            if (StringUtils.isNotBlank(s.getProjectProgress())){
                s.setProjectProgress(s.getProjectProgress()+"%");
            }else {
                s.setProjectProgress("0%");
            }
        });
//        }
        return page.setRecords(list);
    }
@@ -348,21 +366,44 @@
        //片区
        if (ywxtAdDetail == null) {
            sgStatisProVOS = sgProjectInfoMapper.getsgStatisticsZero(code);
            getDeviceTypes(sgStatisProVOS);
            setDeviceTypes(sgStatisProVOS);
//            String getname = sgProjectInfoMapper.getname(code);
            String getname = code;
            updateProjectProgress(sgStatisProVOS, code, getname, "2");
        } else if (ywxtAdDetail.getAdGrad().equals("1")) {//默认
            sgStatisProVOS = sgProjectInfoMapper.getsgStatisticsOne(code);
            sgStatisProVOS = getSgStatisProVOS(sgStatisProVOS);
            getDeviceTypes(sgStatisProVOS);
            setDeviceTypes(sgStatisProVOS);
            updateProjectProgress(sgStatisProVOS, ywxtAdDetail.getPAdCode(), ywxtAdDetail.getPAdName(), "0");
        } else {//区县
            sgStatisProVOS = sgProjectInfoMapper.getsgStatisticsList(code);
            getDeviceTypes(sgStatisProVOS);
            setDeviceTypes(sgStatisProVOS);
            updateProjectProgress(sgStatisProVOS, ywxtAdDetail.getAdCode(), ywxtAdDetail.getAdName(), "3");
        }
        return sgStatisProVOS;
    }
    /**
     * 统计施工进度
     * @param sgStatisProVOS
     */
    private void setDeviceTypes(List<SgStatisProVO> sgStatisProVOS) {
        if (CollectionUtils.isNotEmpty(sgStatisProVOS)){
            Map<String, SgOperatingRateVO> deviceTypes = getDeviceTypes(sgStatisProVOS.stream().map(SgStatisProVO::getProIds).collect(Collectors.toList()));
            for (SgStatisProVO vo : sgStatisProVOS) {
                SgOperatingRateVO sVo = deviceTypes.get(vo.getProIds());
                if (Objects.nonNull(sVo)){
                    vo.setSurfaceNum(sVo.getSurfaceNum());
                    vo.setSurfaceProgress(sVo.getSurfaceProgress()==null?null:sVo.getSurfaceProgress()+"%");
                    vo.setVideoNum(sVo.getVideoNum());
                    vo.setVideoProgress(sVo.getVideoProgress()==null?null:sVo.getVideoProgress()+"%");
                    vo.setTransNum(sVo.getTransNum());
                    vo.setTransProgress(sVo.getTransProgress()==null?null:sVo.getTransProgress()+"%");
                    vo.setSeepageNum(sVo.getSeepageNum());
                    vo.setSeepageProgress(sVo.getSeepageProgress()==null?null:sVo.getSeepageProgress()+"%");
                }
            }
        }
    }
    /**
@@ -394,12 +435,12 @@
    /**
     * 统计设备类型开工率
     * @param sgStatisProVOS
     */
    private void getDeviceTypes(List<SgStatisProVO> sgStatisProVOS) {
        if (CollectionUtils.isNotEmpty(sgStatisProVOS)){
            for (SgStatisProVO vo : sgStatisProVOS) {
                String proIds = vo.getProIds();
    public Map<String,SgOperatingRateVO> getDeviceTypes(List<String> projectIds) {
        Map<String,SgOperatingRateVO> result = new HashMap<>();
        if (CollectionUtils.isNotEmpty(projectIds)){
            for (String proIds : projectIds) {
                SgOperatingRateVO sgOperatingRateVO = new SgOperatingRateVO();
                if (StringUtils.isNotBlank(proIds)){
                List<SgStatisDeviceVO> deviceVOS =    sgProjectInfoMapper.getDeviceTypes("("+proIds+")");
                if(CollectionUtils.isNotEmpty(deviceVOS)){
@@ -409,12 +450,12 @@
                    if (Objects.nonNull(sg108)){
                        Integer deviceCount = sg108.getDeviceCount();
                        Integer deviceStart = sg108.getDeviceStart();
                        vo.setSurfaceNum(deviceCount);
                        sgOperatingRateVO.setSurfaceNum(deviceCount);
                        if (deviceCount != 0){
                            BigDecimal divide = BigDecimal.valueOf(deviceStart).divide(BigDecimal.valueOf(deviceCount), 2, BigDecimal.ROUND_UP);
                            vo.setSeepageProgress(getBigDecimalPercent(divide));
                            sgOperatingRateVO.setSeepageProgress(getBigDecimalPercent(divide));
                        }else {
                            vo.setSeepageProgress("0%");
                            sgOperatingRateVO.setSeepageProgress("0");
                        }
                    }
                    //视频
@@ -422,12 +463,12 @@
                    if (Objects.nonNull(sg104)){
                        Integer deviceCount = sg104.getDeviceCount();
                        Integer deviceStart = sg104.getDeviceStart();
                        vo.setVideoNum(deviceCount);
                        sgOperatingRateVO.setVideoNum(deviceCount);
                        if (deviceCount != 0){
                            BigDecimal divide = BigDecimal.valueOf(deviceStart).divide(BigDecimal.valueOf(deviceCount), 2, BigDecimal.ROUND_UP);
                            vo.setVideoProgress(getBigDecimalPercent(divide));
                            sgOperatingRateVO.setVideoProgress(getBigDecimalPercent(divide));
                        }else {
                            vo.setVideoProgress("0%");
                            sgOperatingRateVO.setVideoProgress("0");
                        }
                    }
                    //渗压
@@ -435,12 +476,12 @@
                    if (Objects.nonNull(sg101)){
                        Integer deviceCount = sg101.getDeviceCount();
                        Integer deviceStart = sg101.getDeviceStart();
                        vo.setTransNum(deviceCount);
                        sgOperatingRateVO.setTransNum(deviceCount);
                        if (deviceCount != 0){
                            BigDecimal divide = BigDecimal.valueOf(deviceStart).divide(BigDecimal.valueOf(deviceCount), 2, BigDecimal.ROUND_UP);
                            vo.setTransProgress(getBigDecimalPercent(divide));
                            sgOperatingRateVO.setTransProgress(getBigDecimalPercent(divide));
                        }else {
                            vo.setTransProgress("0%");
                            sgOperatingRateVO.setTransProgress("0");
                        }
                    }
                    //渗流
@@ -448,18 +489,20 @@
                    if (Objects.nonNull(sg102)){
                        Integer deviceCount = sg102.getDeviceCount();
                        Integer deviceStart = sg102.getDeviceStart();
                        vo.setSeepageNum(deviceCount);
                        sgOperatingRateVO.setSeepageNum(deviceCount);
                        if (deviceCount != 0){
                            BigDecimal divide = BigDecimal.valueOf(deviceStart).divide(BigDecimal.valueOf(deviceCount), 2, BigDecimal.ROUND_UP);
                            vo.setSeepageProgress(getBigDecimalPercent(divide));
                            sgOperatingRateVO.setSeepageProgress(getBigDecimalPercent(divide));
                        }else {
                            vo.setSeepageProgress("0%");
                            sgOperatingRateVO.setSeepageProgress("0");
                        }
                    }
                    }
                    result.put(proIds,sgOperatingRateVO);
                }
            }
        }
        return result;
    }
    private void updateProjectProgress(List<SgStatisProVO> sgStatisProVOS, String pcode, String pname, String adGrad) {
@@ -552,7 +595,7 @@
        BigDecimal percentage = bigDecimal.multiply(new BigDecimal("100"));
        // 如果不需要保留小数位,可以设置一个scale为0
        BigDecimal percentageRounded = percentage.setScale(0, RoundingMode.HALF_UP);
        return percentageRounded+"%";
        return percentageRounded.toString();
    }
    @Override
@@ -560,7 +603,7 @@
        Map<String, Object> map  = new HashMap<>();
        List<SgProjectInfoVO> progressList = progressList(searchDTO);
        BigDecimal reduce = progressList.stream().filter(s->s.getProjectProgressNum()!=null).map(SgProjectInfoDO::getProjectProgressNum).reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal divide = reduce.divide(BigDecimal.valueOf(progressList.size()), 2, RoundingMode.HALF_UP);
        BigDecimal divide = reduce.divide(BigDecimal.valueOf(progressList.size()==0?1:progressList.size()), 2, RoundingMode.HALF_UP);
        List<SgProjectInfoDO> pending = progressList.stream().filter(s -> s.getStatus() == 0).collect(Collectors.toList());
        List<SgProjectInfoDO> progress = progressList.stream().filter(s -> s.getStatus() == 1).collect(Collectors.toList());
        List<SgProjectInfoDO> over = progressList.stream().filter(s -> s.getStatus() == 2).collect(Collectors.toList());
@@ -611,4 +654,98 @@
    }
    @Override
    public List<SgProjectTreeVO> projectTree(ProjectSearchDTO dto) {
        List<String> sgCodeS = getSgCodeByUser();
        dto.setSgCodeS(sgCodeS);
        List<SgProjectTreeVO> list =     sgProjectInfoMapper.projectTree(dto);
        if (CollectionUtils.isNotEmpty(list)){
            list.forEach(x->{
                if (StringUtils.isBlank(x.getCountyNm())){
                    x.setCountyNm(x.getCityNm());
                }
                if (StringUtils.isBlank(x.getTownNm())){
                    x.setTownNm(x.getCountyNm());
                }
            });
            // 按省、片区、市、县、乡镇分组
            Map<String, Map<String, Map<String, Map<String, Map<String, List<SgProjectTreeVO>>>>>> groupedProjects = list.stream()
                .collect(
                    Collectors.groupingBy(SgProjectTreeVO::getProvinceNm,
                        Collectors.groupingBy(SgProjectTreeVO::getLot,
                            Collectors.groupingBy(SgProjectTreeVO::getCityNm,
                                Collectors.groupingBy(SgProjectTreeVO::getCountyNm,
                                    Collectors.groupingBy(SgProjectTreeVO::getTownNm
                                    ))))));
                List<SgProjectTreeVO> tree = new ArrayList<>();
                for (Map.Entry<String, Map<String, Map<String, Map<String, Map<String, List<SgProjectTreeVO>>>>>> provinceEntry : groupedProjects.entrySet()) {
                    SgProjectTreeVO provinceNode = new SgProjectTreeVO();
                    provinceNode.setProvinceNm(provinceEntry.getKey());
                    provinceNode.setRegionName(provinceEntry.getKey());
                    provinceNode.setId(UUID.randomUUID().toString().replace("-",""));
                    provinceNode.setLevel(1);
                    List<SgProjectTreeVO> provinceChildren = new ArrayList<>();
                    for (Map.Entry<String, Map<String, Map<String, Map<String, List<SgProjectTreeVO>>>>> lotEntry : provinceEntry.getValue().entrySet()) {
                        SgProjectTreeVO lotNode = new SgProjectTreeVO();
                        List<String> lotIds = new ArrayList<>();
                        lotNode.setLot(lotEntry.getKey());
                        lotNode.setRegionName(lotEntry.getKey());
                        lotNode.setId(UUID.randomUUID().toString().replace("-",""));
                        lotNode.setLevel(2);
                        List<SgProjectTreeVO> lotChildren = new ArrayList<>();
                        for (Map.Entry<String, Map<String, Map<String, List<SgProjectTreeVO>>>> cityEntry : lotEntry.getValue().entrySet()) {
                            SgProjectTreeVO cityNode = new SgProjectTreeVO();
                            List<String> cityIds = new ArrayList<>();
                            cityNode.setCityNm(cityEntry.getKey());
                            cityNode.setRegionName(cityEntry.getKey());
                            cityNode.setId(UUID.randomUUID().toString().replace("-",""));
                            cityNode.setLevel(3);
                            List<SgProjectTreeVO> cityChildren = new ArrayList<>();
                            for (Map.Entry<String, Map<String, List<SgProjectTreeVO>>> countyEntry : cityEntry.getValue().entrySet()) {
                                SgProjectTreeVO countyNode = new SgProjectTreeVO();
                                List<String> countyIds = new ArrayList<>();
                                countyNode.setCountyNm(countyEntry.getKey());
                                countyNode.setRegionName(countyEntry.getKey());
                                countyNode.setId(UUID.randomUUID().toString().replace("-",""));
                                countyNode.setLevel(4);
                                List<SgProjectTreeVO> countyChildren = new ArrayList<>();
                                for (Map.Entry<String, List<SgProjectTreeVO>> townEntry : countyEntry.getValue().entrySet()) {
                                    SgProjectTreeVO townNode = new SgProjectTreeVO();
                                    townNode.setTownNm(townEntry.getKey());
                                    townNode.setRegionName(townEntry.getKey());
                                    townNode.setChildList(townEntry.getValue());
                                    townNode.setChildNum((long) townEntry.getValue().size());
                                    townNode.setId(UUID.randomUUID().toString().replace("-",""));
                                    townNode.setLevel(5);
                                    townNode.setProjectIds(townEntry.getValue().stream().map(SgProjectTreeVO::getId).collect(Collectors.toList()));
                                    countyIds.addAll(townNode.getProjectIds());
                                    countyChildren.add(townNode);
                                }
                                countyNode.setChildNum(countyChildren.stream().mapToLong(SgProjectTreeVO::getChildNum).sum());
                                countyNode.setChildList(countyChildren);
                                countyNode.setProjectIds(countyIds);
                                cityIds.addAll(countyIds);
                                cityChildren.add(countyNode);
                            }
                            cityNode.setChildNum(cityChildren.stream().mapToLong(SgProjectTreeVO::getChildNum).sum());
                            cityNode.setChildList(cityChildren);
                            cityNode.setProjectIds(cityIds);
                            lotIds.addAll(cityIds);
                            lotChildren.add(cityNode);
                        }
                        lotNode.setChildNum(lotChildren.stream().mapToLong(SgProjectTreeVO::getChildNum).sum());
                        lotNode.setChildList(lotChildren);
                        lotNode.setProjectIds(lotIds);
                        provinceChildren.add(lotNode);
                    }
                    provinceNode.setChildNum(provinceChildren.stream().mapToLong(SgProjectTreeVO::getChildNum).sum());
                    provinceNode.setChildList(provinceChildren);
                    tree.add(provinceNode);
                }
                return tree;
        }
        return new ArrayList<>();
    }
}
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java
@@ -48,6 +48,8 @@
import springfox.documentation.annotations.ApiIgnore;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -204,5 +206,23 @@
        return R.data(number);
    }
    @GetMapping("/getDwByParentId")
    @ApiOperationSupport(order = 10)
    @ApiOperation(value = "获取单位树形结构", notes = "获取单位树形结构")
    public R<Map<String,List<DeptVO>>> getDwByParentId(String precinct) {
        Map<String,List<DeptVO>> map=new HashMap<>();
        if(precinct==null||precinct.equals("")){
            map.put("one",new ArrayList<>());
            map.put("two",new ArrayList<>());
            map.put("three",new ArrayList<>());
        }else {
            List<DeptVO> tree1 = deptService.treeByParentIdNew("1821370772215062530", precinct);
            List<DeptVO> tree2 = deptService.treeByParentIdNew("1821370871330660353", precinct);
            List<DeptVO> tree3 = deptService.treeByParentIdNew("1806175841028685826", precinct);
            map.put("one", tree1);
            map.put("two", tree2);
            map.put("three", tree3);
        }
        return R.data(map);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java
@@ -96,4 +96,6 @@
    Map<String, DeptUserTreeNode> getUserMap(@Param("treeNode") DeptUserTreeNode treeNode);
    String getResDept(@Param("deptIds") String deptIds);
    List<DeptVO> treeByParentIdNew(@Param("parentIds") List<String> parentIds,@Param("precinct")String precinct);
}
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml
@@ -91,7 +91,22 @@
        </if>
        ORDER BY sort
    </select>
    <select id="treeByParentIdNew" resultMap="treeNodeResultMap">
        select id, parent_id, dept_name as title, id as "value", id as "key" from blade_dept where is_deleted = 0 and precinct=#{precinct}
        <if test="parentIds!=null and parentIds!=''">
            and
            <foreach item="id" collection="parentIds" open="(" separator="or" close=")">
                id = #{id} or parent_id = #{id} or parent_id in (
                select b.id from blade_dept b where b.is_deleted = 0 and b.PARENT_ID = #{id}
                )
            </foreach>
        </if>
        ORDER BY sort
    </select>
    <select id="lazyTree" resultMap="treeNodeResultMap" >
        SELECT
            dept.id,
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java
@@ -136,4 +136,6 @@
     * @return
     */
    String getResDept(String deptIds);
    List<DeptVO> treeByParentIdNew(String number,String precinct);
}
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java
@@ -248,4 +248,17 @@
    public String getResDept(String deptIds) {
        return baseMapper.getResDept(deptIds);
    }
    @Override
    public List<DeptVO> treeByParentIdNew(String parentId,String precinct) {
//        if (AuthUtil.isAdministrator() || AuthUtil.isAdmin()) {
//            return ForestNodeMerger.merge(baseMapper.tree(StringPool.EMPTY));
//        }
        String [] parentIds = parentId.split(",");
        List<String> parentIdList = new ArrayList<>();
        for (String str:parentIds) {
            parentIdList.add(str);
        }
        return ForestNodeMerger.merge(baseMapper.treeByParentIdNew(parentIdList,precinct));
    }
}