From c85f1ae54df8d59e21b1371b5f89679a8353f063 Mon Sep 17 00:00:00 2001 From: sjh Date: Mon, 25 Nov 2024 18:46:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=81=B5=E6=95=8F=E6=84=9F?= =?UTF-8?q?=E7=9F=A5=E6=A8=A1=E5=9E=8B=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + .../biutag/supervisiondata/config/db/Dm.java | 61 + .../mapper/dm/ModelClueDataDMMapper.java | 15 + .../mapper/dwd/ModelClueDataMapper.java | 19 + .../mapper/mine/ModelClueMapper.java | 25 + .../mapper/mine/ModelClueRecordMapper.java | 7 + .../mapper/mine/StatisticsDepartMapper.java | 7 + .../mapper/mine/SupExternalDepartMapper.java | 1 - .../pojo/entity/mine/ModelClue.java | 102 ++ .../pojo/entity/mine/ModelClue18.java | 15 + .../pojo/entity/mine/ModelClueModel.java | 46 + .../pojo/entity/mine/ModelClueRecord.java | 42 + .../pojo/entity/mine/StatisticsDepart.java | 44 + .../repository/ModelClueDataDMRepository.java | 21 + .../repository/ModelClueRecordRepository.java | 10 + .../repository/ModelClueRepository.java | 10 + .../repository/ModelRepository.java | 2 + .../StatisticsDepartRepository.java | 10 + .../service/ModelClueService.java | 4 + .../service/impl/ModelClueServiceImpl.java | 1431 +++++++++++++++++ src/main/resources/application.yml | 12 + .../resources/mapper/mine/ModelClueMapper.xml | 24 + 22 files changed, 1912 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/biutag/supervisiondata/config/db/Dm.java create mode 100644 src/main/java/com/biutag/supervisiondata/mapper/dm/ModelClueDataDMMapper.java create mode 100644 src/main/java/com/biutag/supervisiondata/mapper/dwd/ModelClueDataMapper.java create mode 100644 src/main/java/com/biutag/supervisiondata/mapper/mine/ModelClueMapper.java create mode 100644 src/main/java/com/biutag/supervisiondata/mapper/mine/ModelClueRecordMapper.java create mode 100644 src/main/java/com/biutag/supervisiondata/mapper/mine/StatisticsDepartMapper.java create mode 100644 src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClue.java create mode 100644 src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClue18.java create mode 100644 src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClueModel.java create mode 100644 src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClueRecord.java create mode 100644 src/main/java/com/biutag/supervisiondata/pojo/entity/mine/StatisticsDepart.java create mode 100644 src/main/java/com/biutag/supervisiondata/repository/ModelClueDataDMRepository.java create mode 100644 src/main/java/com/biutag/supervisiondata/repository/ModelClueRecordRepository.java create mode 100644 src/main/java/com/biutag/supervisiondata/repository/ModelClueRepository.java create mode 100644 src/main/java/com/biutag/supervisiondata/repository/StatisticsDepartRepository.java create mode 100644 src/main/java/com/biutag/supervisiondata/service/ModelClueService.java create mode 100644 src/main/java/com/biutag/supervisiondata/service/impl/ModelClueServiceImpl.java create mode 100644 src/main/resources/mapper/mine/ModelClueMapper.xml diff --git a/pom.xml b/pom.xml index 570fbbc..0b3568a 100644 --- a/pom.xml +++ b/pom.xml @@ -120,6 +120,11 @@ + + com.dameng + DmJdbcDriver18 + 8.1.3.140 + commons-io commons-io diff --git a/src/main/java/com/biutag/supervisiondata/config/db/Dm.java b/src/main/java/com/biutag/supervisiondata/config/db/Dm.java new file mode 100644 index 0000000..ccdb839 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/config/db/Dm.java @@ -0,0 +1,61 @@ +package com.biutag.supervisiondata.config.db; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import com.zaxxer.hikari.HikariDataSource; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.sql.DataSource; + +@Configuration +@MapperScan(basePackages = {"com.biutag.supervisiondata.mapper.dm"}, + sqlSessionFactoryRef = "dmSqlSessionFactory") +public class Dm { + + @Bean(name = "dmBean") + @ConfigurationProperties(prefix = "spring.datasource.dm") + public DataSource dmDataSource() { + return DataSourceBuilder.create().type(HikariDataSource.class).build(); + } + + @Bean(name = "dmTransactionManager") + public DataSourceTransactionManager dmTransactionManager() { + return new DataSourceTransactionManager(dmDataSource()); + } + + @Bean(name = "dmSqlSessionFactory") + public SqlSessionFactory dmSqlSessionFactory(@Qualifier("dmBean") DataSource mysqlDataSource, + @Qualifier("dmInterceptor") MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception { + final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); + sessionFactory.setPlugins(mybatisPlusInterceptor); + sessionFactory.setDataSource(mysqlDataSource); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + sessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/dm/*Mapper.xml")); + GlobalConfig globalConfig = GlobalConfigUtils.defaults(); + sessionFactory.setGlobalConfig(globalConfig); + return sessionFactory.getObject(); + } + + /** + * mp分页配置 + * @return MybatisPlusInterceptor + */ + @Bean(name = "dmInterceptor") + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.GBASE)); + return interceptor; + } +} diff --git a/src/main/java/com/biutag/supervisiondata/mapper/dm/ModelClueDataDMMapper.java b/src/main/java/com/biutag/supervisiondata/mapper/dm/ModelClueDataDMMapper.java new file mode 100644 index 0000000..c07c270 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/mapper/dm/ModelClueDataDMMapper.java @@ -0,0 +1,15 @@ +package com.biutag.supervisiondata.mapper.dm; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.biutag.supervisiondata.pojo.entity.mine.ModelClue; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +public interface ModelClueDataDMMapper extends BaseMapper { + + @Select("${newSql}") + List> selectByUniqueKeys(@org.apache.ibatis.annotations.Param("newSql") String newSql); + +} diff --git a/src/main/java/com/biutag/supervisiondata/mapper/dwd/ModelClueDataMapper.java b/src/main/java/com/biutag/supervisiondata/mapper/dwd/ModelClueDataMapper.java new file mode 100644 index 0000000..d96f069 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/mapper/dwd/ModelClueDataMapper.java @@ -0,0 +1,19 @@ +package com.biutag.supervisiondata.mapper.dwd; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.biutag.supervisiondata.pojo.entity.mine.ModelClue; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +public interface ModelClueDataMapper extends BaseMapper { + @Select("${sql}") + List selectDataByDynamicSql(@org.apache.ibatis.annotations.Param("sql") String sql); + + @Select("${newSql}") + List> selectByUniqueKeys(@org.apache.ibatis.annotations.Param("newSql") String newSql); + + @Select("SELECT XM, JH FROM dwd_ry_zfba_baryxx WHERE ZJ = #{barID}") + Map selectBAR(String barID); +} diff --git a/src/main/java/com/biutag/supervisiondata/mapper/mine/ModelClueMapper.java b/src/main/java/com/biutag/supervisiondata/mapper/mine/ModelClueMapper.java new file mode 100644 index 0000000..34212bc --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/mapper/mine/ModelClueMapper.java @@ -0,0 +1,25 @@ +package com.biutag.supervisiondata.mapper.mine; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.biutag.supervisiondata.pojo.entity.mine.ModelClue; +import com.biutag.supervisiondata.pojo.entity.mine.ModelClueModel; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +public interface ModelClueMapper extends BaseMapper { + + Page queryPage(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); + + @Select("${newSql}") + List> selectByUniqueKeys(@org.apache.ibatis.annotations.Param("newSql") String newSql); + + List selectByModelId(@Param("modelId") int modelId); + + int updateInvolveDepartId(@Param("id") int id, @Param("newDepartId") String newDepartId); +} diff --git a/src/main/java/com/biutag/supervisiondata/mapper/mine/ModelClueRecordMapper.java b/src/main/java/com/biutag/supervisiondata/mapper/mine/ModelClueRecordMapper.java new file mode 100644 index 0000000..4dc7d52 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/mapper/mine/ModelClueRecordMapper.java @@ -0,0 +1,7 @@ +package com.biutag.supervisiondata.mapper.mine; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.biutag.supervisiondata.pojo.entity.mine.ModelClueRecord; + +public interface ModelClueRecordMapper extends BaseMapper { +} diff --git a/src/main/java/com/biutag/supervisiondata/mapper/mine/StatisticsDepartMapper.java b/src/main/java/com/biutag/supervisiondata/mapper/mine/StatisticsDepartMapper.java new file mode 100644 index 0000000..a71e4ae --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/mapper/mine/StatisticsDepartMapper.java @@ -0,0 +1,7 @@ +package com.biutag.supervisiondata.mapper.mine; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.biutag.supervisiondata.pojo.entity.mine.StatisticsDepart; + +public interface StatisticsDepartMapper extends BaseMapper { +} diff --git a/src/main/java/com/biutag/supervisiondata/mapper/mine/SupExternalDepartMapper.java b/src/main/java/com/biutag/supervisiondata/mapper/mine/SupExternalDepartMapper.java index 4b206b5..5fce3a5 100644 --- a/src/main/java/com/biutag/supervisiondata/mapper/mine/SupExternalDepartMapper.java +++ b/src/main/java/com/biutag/supervisiondata/mapper/mine/SupExternalDepartMapper.java @@ -4,5 +4,4 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.biutag.supervisiondata.pojo.entity.mine.SupExternalDepart; public interface SupExternalDepartMapper extends BaseMapper { - } diff --git a/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClue.java b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClue.java new file mode 100644 index 0000000..e5e20a6 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClue.java @@ -0,0 +1,102 @@ +package com.biutag.supervisiondata.pojo.entity.mine; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Setter +@Getter +public class ModelClue { + + // + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + // + @TableField("model_id") + private Integer modelId; + + // 涉及单位 + @TableField("involve_depart_name") + private String involveDepartName; + + @TableField("involve_depart_id") + private String involveDepartId; + + // 涉及人员 + @TableField("involve_police_name") + private String involvePoliceName; + + // 涉及人员警号 + @TableField("involve_police_emp_no") + private String involvePoliceEmpNo; + + // 预警内容 + @TableField("thing_desc") + private String thingDesc; + + // 状态 默认 0-未分发 1-已分发 2-已处理 + @TableField("distribution_state") + private String distributionState; + + @TableField("create_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm") + private LocalDateTime createTime; + + @TableField("update_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm") + private LocalDateTime updateTime; + + // 数据详情 JSON + private String data; + + // 问题ID + @TableField("negative_id") + private String negativeId; + @TableField("notification_id") + private String notificationId; + + // 问题ID + @TableField("negative_id_ex") + private String negativeIdEx; + + // 外部主键 + @TableField("unique_key") + private String uniqueKey; + + // 任务ID + private Integer taskId; + + + // 总警情数 + @TableField(exist = false) + private Long zjjs; + + // 104号模型用 + @TableField(exist = false) + private Long allZjjs; + + // 执法场所登记数 + @TableField(exist = false) + private Long zfcsdjs; + + // 比例 + @TableField(exist = false) + private BigDecimal bl; + + @TableField(exist = false) + private String parentId; + + @TableField(exist = false) + private String thisId; + + @TableField(exist = false) + private Integer departLevel; + +} diff --git a/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClue18.java b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClue18.java new file mode 100644 index 0000000..6d40ad4 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClue18.java @@ -0,0 +1,15 @@ +package com.biutag.supervisiondata.pojo.entity.mine; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class ModelClue18 { + private String zhrq; + private String zhdd; + private String ajbh; + private String zhr; + private String badwIDdm; + private String badwIDmc; +} diff --git a/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClueModel.java b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClueModel.java new file mode 100644 index 0000000..6ebe0f9 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClueModel.java @@ -0,0 +1,46 @@ +package com.biutag.supervisiondata.pojo.entity.mine; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Setter +@Getter +public class ModelClueModel { + private Integer id; + + private Integer modelId; + + private String modelName; + + private String involveDepartId; + // 涉及单位 + private String involveDepartName; + + private String involveParentDepartName; + + // 涉及人员 + private String involvePoliceName; + + // 涉及人员警号 + private String involvePoliceEmpNo; + + // 预警内容 + private String thingDesc; + + // 分发状态 + private String distributionState; + + @JsonFormat(pattern = "YYYY-MM-dd HH:mm") + private LocalDateTime createTime; + + private String data; + + private String negativeId; + + private String notificationId; + + private String status; +} diff --git a/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClueRecord.java b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClueRecord.java new file mode 100644 index 0000000..240ab65 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/ModelClueRecord.java @@ -0,0 +1,42 @@ +package com.biutag.supervisiondata.pojo.entity.mine; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +@Accessors(chain = true) +@Setter +@Getter +public class ModelClueRecord { + + // + @TableId(type = IdType.AUTO) + private Integer id; + + // 模型ID + private Integer modelId; + + // 条数 + @TableField("size") + private Integer size; + + // 创建时间 + @TableField("create_time") + @JsonFormat(pattern = "YYYY-MM-dd HH:mm") + private LocalDateTime createTime; + + // 状态 success-成功 fail-失败 + @TableField("state") + private String state; + + // 异常详情 + @TableField("err_msg") + private String errMsg; + +} diff --git a/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/StatisticsDepart.java b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/StatisticsDepart.java new file mode 100644 index 0000000..4386214 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/StatisticsDepart.java @@ -0,0 +1,44 @@ +package com.biutag.supervisiondata.pojo.entity.mine; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class StatisticsDepart { + + // + @TableId(value = "departId") + private String departId; + + // + @TableField("name") + private String name; + + // + @TableField("level") + private Integer level; + + // + @TableField("groupId") + private Long groupId; + + // + @TableField("pid") + private String pid; + + // 总人数 + @TableField("total") + private Integer total; + + // 警察人数 + @TableField("policeNumber") + private Integer policeNumber; + + // 辅警人数 + @TableField("auxiliaryPoliceNumber") + private Integer auxiliaryPoliceNumber; + +} diff --git a/src/main/java/com/biutag/supervisiondata/repository/ModelClueDataDMRepository.java b/src/main/java/com/biutag/supervisiondata/repository/ModelClueDataDMRepository.java new file mode 100644 index 0000000..432463c --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/repository/ModelClueDataDMRepository.java @@ -0,0 +1,21 @@ +package com.biutag.supervisiondata.repository; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.biutag.supervisiondata.mapper.dm.ModelClueDataDMMapper; +import com.biutag.supervisiondata.pojo.entity.mine.ModelClue; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@RequiredArgsConstructor +@Service +public class ModelClueDataDMRepository extends ServiceImpl { + + private final ModelClueDataDMMapper modelClueDataDMMapper; + + public List> selectByUniqueKeys(String sql) { + return modelClueDataDMMapper.selectByUniqueKeys(sql); + } +} diff --git a/src/main/java/com/biutag/supervisiondata/repository/ModelClueRecordRepository.java b/src/main/java/com/biutag/supervisiondata/repository/ModelClueRecordRepository.java new file mode 100644 index 0000000..40ac38e --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/repository/ModelClueRecordRepository.java @@ -0,0 +1,10 @@ +package com.biutag.supervisiondata.repository; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.biutag.supervisiondata.mapper.mine.ModelClueRecordMapper; +import com.biutag.supervisiondata.pojo.entity.mine.ModelClueRecord; +import org.springframework.stereotype.Service; + +@Service +public class ModelClueRecordRepository extends ServiceImpl { +} diff --git a/src/main/java/com/biutag/supervisiondata/repository/ModelClueRepository.java b/src/main/java/com/biutag/supervisiondata/repository/ModelClueRepository.java new file mode 100644 index 0000000..24e5cce --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/repository/ModelClueRepository.java @@ -0,0 +1,10 @@ +package com.biutag.supervisiondata.repository; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.biutag.supervisiondata.mapper.mine.ModelClueMapper; +import com.biutag.supervisiondata.pojo.entity.mine.ModelClue; +import org.springframework.stereotype.Service; + +@Service +public class ModelClueRepository extends ServiceImpl { +} diff --git a/src/main/java/com/biutag/supervisiondata/repository/ModelRepository.java b/src/main/java/com/biutag/supervisiondata/repository/ModelRepository.java index b011a8b..438dd97 100644 --- a/src/main/java/com/biutag/supervisiondata/repository/ModelRepository.java +++ b/src/main/java/com/biutag/supervisiondata/repository/ModelRepository.java @@ -3,6 +3,7 @@ package com.biutag.supervisiondata.repository; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.biutag.supervisiondata.mapper.mine.ModelMapper; import com.biutag.supervisiondata.pojo.entity.mine.Model; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -10,6 +11,7 @@ import org.springframework.stereotype.Service; * @version 0.0.1 * @since 1.8 */ +@RequiredArgsConstructor @Service public class ModelRepository extends ServiceImpl { } diff --git a/src/main/java/com/biutag/supervisiondata/repository/StatisticsDepartRepository.java b/src/main/java/com/biutag/supervisiondata/repository/StatisticsDepartRepository.java new file mode 100644 index 0000000..7ad798d --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/repository/StatisticsDepartRepository.java @@ -0,0 +1,10 @@ +package com.biutag.supervisiondata.repository; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.biutag.supervisiondata.mapper.mine.StatisticsDepartMapper; +import com.biutag.supervisiondata.pojo.entity.mine.StatisticsDepart; +import org.springframework.stereotype.Service; + +@Service +public class StatisticsDepartRepository extends ServiceImpl { +} diff --git a/src/main/java/com/biutag/supervisiondata/service/ModelClueService.java b/src/main/java/com/biutag/supervisiondata/service/ModelClueService.java new file mode 100644 index 0000000..ba7fef4 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/service/ModelClueService.java @@ -0,0 +1,4 @@ +package com.biutag.supervisiondata.service; + +public interface ModelClueService { +} diff --git a/src/main/java/com/biutag/supervisiondata/service/impl/ModelClueServiceImpl.java b/src/main/java/com/biutag/supervisiondata/service/impl/ModelClueServiceImpl.java new file mode 100644 index 0000000..2b093fa --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/service/impl/ModelClueServiceImpl.java @@ -0,0 +1,1431 @@ +package com.biutag.supervisiondata.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.biutag.supervisiondata.mapper.dwd.ModelClueDataMapper; +import com.biutag.supervisiondata.mapper.mine.ModelClueMapper; +import com.biutag.supervisiondata.pojo.entity.mine.*; +import com.biutag.supervisiondata.repository.*; +import com.biutag.supervisiondata.service.ModelClueService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.Timestamp; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Slf4j +@RequiredArgsConstructor +@Service +public class ModelClueServiceImpl implements ModelClueService { + + private final ModelRepository modelRepository; + + private final ModelClueRepository modelClueRepository; + + public final ModelClueMapper modelClueMapper; + + public final ModelClueDataMapper modelClueDataMapper; + + public final ModelClueRecordRepository modelClueRecordRepository; + + public final SupExternalDepartRepository supExternalDepartRepository; + + private final StatisticsDepartRepository statisticsDepartRepository; + + private final RiskTestRepository riskTestRepository; + + private final ModelClueDataDMRepository modelClueDataDMRepository; + + public void generate(Integer modelId) { + if (modelId == 1300) { + updateDepart(); + return; + } + Model model = modelRepository.getById(modelId); + List modelClues = new ArrayList<>(); + if (!Objects.isNull(model) && model.getModelSql() != null) { + modelClues.addAll(getModelClueBySql(model.getModelSql(), modelId)); + } + System.out.println("模型结果1:" + JSON.toJSONString(modelClues)); + if (!modelClues.isEmpty()) { + List result = new ArrayList<>(); + for (ModelClue modelClue : modelClues) { + modelClue.setModelId(modelId); + modelClue.setCreateTime(LocalDateTime.now()); + if (modelClue.getInvolveDepartName() != null && !modelClue.getInvolveDepartName().isEmpty()) { + result.add(modelClue); + } + } + System.out.println("模型结果2:" + JSON.toJSONString(result)); + modelClueMapper.insert(result); + modelClueRecordRepository.getBaseMapper().insert(new ModelClueRecord().setModelId(modelId).setSize(result.size()).setCreateTime(LocalDateTime.now()).setState("success")); + } else { + modelClueRecordRepository.getBaseMapper().insert(new ModelClueRecord().setModelId(modelId).setSize(0).setCreateTime(LocalDateTime.now()).setState("fail").setErrMsg("数据为空")); + } + } + + private void updateDepart() { + List modelClues = modelClueMapper.selectByModelId(103); + if (modelClues != null && !modelClues.isEmpty()) { + for (ModelClue modelClue : modelClues) { + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, modelClue.getInvolveDepartId()).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + modelClueMapper.updateInvolveDepartId(modelClue.getId(), supExternalDepart.getInternalId()); + } + } + } + } else { + System.out.println("No records found for model_id 103."); + } + } + + public List getModelClueBySql(String sql, Integer modelId) { + List modelClues = new ArrayList<>(); + if (modelId == 2) { // 2号模型:行政、刑事案件受立案不及时问题监督模型 + return getModelCluesForModel2(sql, modelClues); + } else if (modelId == 4) { // 4号模型:疑似漏登执法办案场所问题监督模型 + return getModelCluesForModel4(sql, modelClues); + } else if (modelId == 5) { // 5号模型:重点人员重复报警监督模型 + getModelCluesForModel5(sql, modelClues); + return modelClues; + } else if (modelId == 16) { // 16号模型:多次取保的异常数据 + getModelCluesForModel16(sql, modelClues); + return modelClues; + } else if (modelId == 18) { // 18号模型:相同时间地点抓捕出现多条案件编号的异常数据 + getModelCluesForModel18(sql, modelClues); + return modelClues; + } else if (modelId == 20) { // 20号模型:连续7天上传散油购销记录小于10的异常数据 + getModelCluesForModel20(sql, modelClues); + return modelClues; + } else if (modelId == 22) { // 22号模型:执法记录仪使用不规范问题 + getModelCluesForModel22(sql, modelClues); + return modelClues; + } else if (modelId == 25) { // 25号模型:重点人员管控人数过多 + getModelCluesForModel25(sql, modelClues); + return modelClues; + } else if (modelId == 103) { // 103号模型:接处警不及时的异常数据 + getModelCluesForModel103(sql, modelClues); + return modelClues; + } else if (modelId == 104) { // 模型104:大量变更接警性质的预警模型 + getModelCluesForModel104(sql, modelClues); + return modelClues; + } else if (modelId == 105) { // 模型105:近一月同一人同一类型问题出现3次以上的异常数据 + getModelCluesForModel105(sql, modelClues); + return modelClues; + } else { + System.out.println("模型" + modelId + "开始查询数据库"); + modelClues = modelClueDataMapper.selectDataByDynamicSql(sql); + System.out.println("模型" + modelId + "查询数据库完毕,数量为:" + modelClues.size()); + } + List uniqueKeys = modelClues.stream().map(ModelClue::getUniqueKey).filter(k -> k != null && !k.isEmpty()).toList(); + List oldUniqueKeys = new ArrayList<>(); + // 无需更新状态的模型 + if (modelId != 19 && modelId != 26 && modelId != 27 && modelId != 28 && modelId != 30 && modelId != 100 ) { + oldUniqueKeys = modelClueRepository.listObjs(new LambdaQueryWrapper().select(ModelClue::getUniqueKey).ne(ModelClue::getDistributionState, "2").eq(ModelClue::getModelId, modelId), String::valueOf); + List changeStatusIds = oldUniqueKeys.stream().filter(item -> !uniqueKeys.contains(item)).toList(); + if (!changeStatusIds.isEmpty()) { + modelClueMapper.update(null, new LambdaUpdateWrapper().in(ModelClue::getUniqueKey, changeStatusIds).set(ModelClue::getDistributionState, "2")); + } + } + List needsInsertIds = new ArrayList<>(); + for (String uniqueKey : uniqueKeys) { + if (oldUniqueKeys.isEmpty()) { + needsInsertIds.addAll(uniqueKeys); + break; + } + if (!oldUniqueKeys.contains(uniqueKey)) { + needsInsertIds.add(uniqueKey); + } + } + if (needsInsertIds.isEmpty()) { + return new ArrayList<>(); + } + List needsInsertModelClues = modelClues.stream().filter(item -> needsInsertIds.contains(item.getUniqueKey())).toList(); + String newSql = generateNewSql(sql, needsInsertIds, modelId); + System.out.println("开始查询新sql" + newSql); + List> allData = modelClueDataMapper.selectByUniqueKeys(newSql); + if (modelId == 26) { + return filterDataForModel26(allData); + } + System.out.println("查询新sql完成,结果数量:" + allData.size()); + String originalFieldName = getKeyFieldName(sql); + for (ModelClue modelClue : needsInsertModelClues) { + for (Map data : allData) { + String keyColumn = (String) data.get(originalFieldName); + if (Objects.equals(keyColumn, modelClue.getUniqueKey())) { + modelClue.setData(JSONObject.toJSONString(data)); + modelClue.setDistributionState("0"); + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, modelClue.getInvolveDepartId()).last("LIMIT 1")); + if (supExternalDepart != null && supExternalDepart.getInternalShortName() != null && !supExternalDepart.getInternalShortName().isEmpty()) { + modelClue.setInvolveDepartName(supExternalDepart.getInternalShortName()); + modelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + setPerson(modelId, modelClue, data); + generateThingDesc(modelId, modelClue, data); + break; + } + } + } + return needsInsertModelClues; + } + + private void getModelCluesForModel5(String param, List modelClues) { + +// List jsonStrings = redisTemplate.opsForList().range("call:point", 0, -1); + List jsonStrings = riskTestRepository.list((Wrapper) null); + if (jsonStrings != null) { + System.out.println("获取到的数据条数:" + jsonStrings.size()); + try { + for (RiskTest json : jsonStrings) { + String jsonString = json.getName(); + JSONObject jsonObject = JSON.parseObject(jsonString); + String name = (String) jsonObject.get("name"); + String mobiles = (String) jsonObject.get("mobiles"); + String idCode = (String) jsonObject.get("idCode"); + String labels = (String) jsonObject.get("labels"); + Integer callCount = (Integer) jsonObject.get("callCount"); + Integer noUsefulCallCount = (Integer) jsonObject.get("noUsefulCallCount"); + String desc = (String) jsonObject.get("desc"); + String controlId = (String) jsonObject.get("controlId"); + String controlName = (String) jsonObject.get("controlName"); + ModelClue newModelClue = new ModelClue(); + LocalDate currentDate = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); + newModelClue.setUniqueKey(idCode + currentDate.format(formatter)); + newModelClue.setNegativeIdEx(idCode + currentDate.format(formatter)); + newModelClue.setInvolveDepartId(controlId); + newModelClue.setInvolveDepartName(controlName); + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, controlId).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + newModelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + if (supExternalDepart.getInternalShortName() != null) { + newModelClue.setInvolveDepartName(supExternalDepart.getInternalShortName()); + } + } + newModelClue.setData(JSONObject.toJSONString(jsonString)); + newModelClue.setDistributionState("0"); + String dateString = getDateString(currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + if (callCount >= 5 && noUsefulCallCount >= 100) { + newModelClue.setThingDesc( + "发现" + newModelClue.getInvolveDepartName() + "管理的重点人员" + name + + "(身份证号:" + idCode + ")于" + dateString + "产生了" + callCount + + "条有效报警," + noUsefulCallCount + "条无效报警,报警电话为“" + + mobiles + "”请予以重点关注。"); + } else if (callCount >= 5) { + newModelClue.setThingDesc( + "发现" + newModelClue.getInvolveDepartName() + "管理的重点人员" + name + + "(身份证号:" + idCode + ")于" + dateString + "产生了" + callCount + + "条有效报警,报警电话为“" + mobiles + "”请予以重点关注。"); + } else if (noUsefulCallCount >= 100) { + newModelClue.setThingDesc( + "发现" + newModelClue.getInvolveDepartName() + "管理的重点人员" + name + + "(身份证号:" + idCode + ")于" + dateString + "产生了" + + noUsefulCallCount + "条无效报警,报警电话为“" + mobiles + "”请予以重点关注。"); + } else { + System.out.println("数据有误,idCode:" + idCode + "callCount:" + callCount + "noUsefulCallCount:" + noUsefulCallCount); + break; + } + modelClues.add(newModelClue); + } + } catch (Exception e) { + log.error("模型5执行失败", e); + } + } else { + System.out.println("Redis未找到key'call:point'"); + } + } + + private List filterDataForModel26(List> allData) { + List> filteredData = allData.stream().filter(map -> map.get("ajbh") != null && map.get("zjhm") != null).toList(); + Map>>> groupedData = filteredData.stream() + .collect(Collectors.groupingBy( + map -> (String) map.get("ajbh"), + Collectors.groupingBy(map -> (String) map.get("zjhm")) + )); + allData.clear(); + for (Map.Entry>>> entry : groupedData.entrySet()) { + for (Map.Entry>> entry2 : entry.getValue().entrySet()) { + String ajbh = entry2.getKey(); + List> records = entry2.getValue(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + String earliestJRSJ = null; + LocalDateTime earliestDateTime = LocalDateTime.MIN; + for (Map record : records) { + String jrsj = (String) record.get("jrsj"); + LocalDateTime dateTime = LocalDateTime.parse(jrsj, formatter); + if (earliestJRSJ == null || !dateTime.isAfter(earliestDateTime)) { + earliestJRSJ = jrsj; + earliestDateTime = dateTime; + } + } + String latestLKSJ = null; + LocalDateTime latestDateTime = LocalDateTime.MIN; + for (Map record : records) { + String lksj = (String) record.get("lksj"); + LocalDateTime dateTime = LocalDateTime.parse(lksj, formatter); + if (latestLKSJ == null || dateTime.isAfter(latestDateTime)) { + latestLKSJ = lksj; + latestDateTime = dateTime; + } + } + if (earliestJRSJ != null && latestLKSJ != null) { + Duration duration = Duration.between(earliestDateTime, latestDateTime); + if (duration.toHours() >= 3) { + continue; + } + Map newRecord = new HashMap<>(); + newRecord.put("ajbh", ajbh); + newRecord.put("jrsj", earliestJRSJ); + newRecord.put("lksj", latestLKSJ); + for (String key : records.get(0).keySet()) { + if (!key.equals("jrsj") && !key.equals("lksj")) { + newRecord.put(key, records.get(0).get(key)); + } + } + allData.add(newRecord); + } + } + } + System.out.println("模型26筛选后的alldata数量:" + allData.size()); + System.out.println("查询新sql完成,结果数量:" + allData.size()); + List modelClues = new ArrayList<>(); + for (Map data : allData) { + ModelClue modelClue = new ModelClue(); + modelClue.setData(JSONObject.toJSONString(data)); + modelClue.setDistributionState("0"); + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, data.get("csid")).last("LIMIT 1")); + if (supExternalDepart != null && supExternalDepart.getInternalShortName() != null && !supExternalDepart.getInternalShortName().isEmpty()) { + modelClue.setInvolveDepartName(supExternalDepart.getInternalShortName()); + modelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + setPerson(26, modelClue, data); + generateThingDesc(26, modelClue, data); + modelClues.add(modelClue); + } + return modelClues; + } + + private void setPerson(Integer modelId, ModelClue modelClue, Map data) { + // 执法区域人员表 + if (modelId == 3 || modelId == 26) { + String bar1 = (String) data.get("bar1"); + String bar2 = (String) data.get("bar2"); + String involvePoliceName = (bar1 != null && !bar1.isEmpty() && bar2 != null && !bar2.isEmpty()) + ? bar1 + "," + bar2 + : (bar1 != null && !bar1.isEmpty()) ? bar1 + : (bar2 != null && !bar2.isEmpty()) ? bar2 : "无警号数据"; + modelClue.setInvolvePoliceName(involvePoliceName); + String bar1jh = (String) data.get("bar1jh"); + String bar2jh = (String) data.get("bar2jh"); + if (bar1jh != null && !bar1jh.isEmpty()) { + if (bar2jh != null && !bar2jh.isEmpty()) { + modelClue.setInvolvePoliceEmpNo(bar1jh + "," + bar2jh); + } else { + modelClue.setInvolvePoliceEmpNo(bar1jh); + } + } else if (bar2jh != null && !bar2jh.isEmpty()) { + modelClue.setInvolvePoliceEmpNo(bar2jh); + } else { + modelClue.setInvolvePoliceEmpNo("无警号数据"); + } + } + // 案件基本信息表 + if (modelId == 10 || modelId == 11 || modelId == 12 || modelId == 13 || modelId == 14 + || modelId == 15 || modelId == 19 || modelId == 31) { + String bar1Id = (String) data.get("BAR1ID"); + String bar2Id = (String) data.get("BAR2ID"); + Map bar1 = bar1Id != null && !bar1Id.isEmpty() ? modelClueDataMapper.selectBAR(bar1Id) : null; + Map bar2 = bar2Id != null && !bar2Id.isEmpty() ? modelClueDataMapper.selectBAR(bar2Id) : null; + if (bar1 != null && bar2 != null) { + modelClue.setInvolvePoliceEmpNo(bar1.get("JH") + "," + bar2.get("JH")); + modelClue.setInvolvePoliceName(bar1.get("XM") + "," + bar2.get("XM")); + } else if (bar1 != null) { + modelClue.setInvolvePoliceEmpNo((String) bar1.get("JH")); + modelClue.setInvolvePoliceName((String) bar1.get("XM")); + } else if (bar2 != null) { + modelClue.setInvolvePoliceEmpNo((String) bar2.get("JH")); + modelClue.setInvolvePoliceName((String) bar2.get("XM")); + } else { + modelClue.setInvolvePoliceEmpNo("无警号数据"); + modelClue.setInvolvePoliceName("无姓名数据"); + } + } + // 反馈单 + if (modelId == 24 || modelId == 27 || modelId == 28 || modelId == 29 || modelId == 30 || modelId == 103 ) { + String fkrbh = (String) data.get("fkrbh"); + String fkrxm = (String) data.get("fkrxm"); + if (fkrbh != null && !fkrbh.isEmpty()) { + modelClue.setInvolvePoliceEmpNo(fkrbh); + } else { + modelClue.setInvolvePoliceEmpNo("无警号数据"); + } + if (fkrxm != null && !fkrxm.isEmpty()) { + modelClue.setInvolvePoliceName(fkrxm); + } else { + modelClue.setInvolvePoliceName("无姓名数据"); + } + } + } + + private static void generateThingDesc(Integer modelId, ModelClue modelClue, Map data) { + if (modelId == 1) { // 1号模型:行政、刑事案件受理30天仍未立案问题监督模型 + String thingDesc = modelClue.getThingDesc(); + modelClue.setThingDesc("该" + data.get("AJBZmc") + + "案件编号为" + data.get("AJBH") + + ",报案日期为" + getDateMinuteString(data.get("BARQ")) + + ",受理日期为" + getDateMinuteString(data.get("SLRQ")) + + ",当前案件状态为“" + data.get("AJZTmc") + + "”,已经超过" + "30" + + "日仍未受理。" + thingDesc); + } else if (modelId == 3) { // 3号模型:执法办案场所登记时长超时问题监督模型 + if (data.get("lksj") != null && !data.get("lksj").equals("")) { + modelClue.setThingDesc("发现执法场所人员“" + data.get("xm") + + "”(身份证号" + data.get("zjhm") + + "),于" + getDateMinuteString(data.get("djsj")) + + "登记进入" + modelClue.getInvolveDepartName() + + "执法办案区,但直至" + getDateMinuteString(data.get("lksj")) + + "才登记离开,停留时长" + calculateMinutesBetween(data.get("djsj"), data.get("lksj")) + + ",用时超过了48小时以上,存在人员进入执法办案场所超时的问题。"); + } else { + modelClue.setThingDesc("发现执法场所人员“" + data.get("xm") + + "”(身份证号" + data.get("zjhm") + + "),于" + getDateMinuteString(data.get("djsj")) + + "登记进入" + modelClue.getInvolveDepartName() + + "执法办案区,但没有离开时间,用时超过了48小时以上,存在人员进入执法办案场所超时的问题。"); + } + } else if (modelId == 10) { // 10号模型:案件受理不及时的异常数据 + String calculateDays = calculateDaysBetween(data.get("BARQ"), data.get("SLRQ")); + String calculateMinutes = calculateMinutesBetween(data.get("BARQ"), data.get("SLRQ")); + String ajzt = (String) data.get("AJZTmc"); + if (ajzt != null && ajzt.equals("立案")) { + ajzt = "已立案"; + } + if (ajzt != null && ajzt.equals("同意受理")) { + ajzt = "已受理"; + } + if (calculateDays != null && !calculateMinutes.equals(" 无时间数据 ")) { + modelClue.setThingDesc( + "发现" + modelClue.getInvolveDepartName() + "受理的“" + data.get("AJMC") + + "”(【"+data.get("AJBZmc")+"】编号:" + getAjbh(data) + + "),报案日期为" + getDateMinuteString(data.get("BARQ")) + + ",但办案单位的受理日期为" + getDateMinuteString(data.get("SLRQ")) + + ",共用时" + calculateMinutes + + ",案件受理时间超过" + calculateDays + + "日以上,存在案件受理不及时的问题,目前案件状态为“" + ajzt + "”。"); + } else { + modelClue.setThingDesc( + "发现" + modelClue.getInvolveDepartName() + "受理的“" + data.get("AJMC") + + "”(【"+data.get("AJBZmc")+"】编号:" + getAjbh(data) + + "),报案日期为" + getDateMinuteString(data.get("BARQ")) + + ",但办案单位的受理日期" + getDateMinuteString(data.get("SLRQ")) + + ",存在案件受理不及时的问题,目前案件状态为“" + data.get("AJZTmc") + "”。"); + } + } else if (modelId == 11) { // 11号模型:立案不及时的异常数据(7天) + modelClue.setThingDesc("该" + data.get("AJBZmc") + + "案件编号为" + getAjbh(data) + + ",受理日期为" + getDateMinuteString(data.get("SLRQ")) + + ",立案日期为" + getDateMinuteString(data.get("LARQ")) + + ",当前案件状态为“" + data.get("AJZTmc") + + "”,超过" + "7" + + "日未受理。"); + } else if (modelId == 12) { // 12号模型:立案不及时的异常数据(30天) + modelClue.setThingDesc("该" + data.get("AJBZmc") + + "案件编号为" + getAjbh(data) + + ",受理日期为" + getDateMinuteString(data.get("SLRQ")) + + ",立案日期为" + getDateMinuteString(data.get("LARQ")) + + ",当前案件状态为“" + data.get("AJZTmc") + + "”,超过" + "30" + + "日未受理。"); + } else if (modelId == 13) { // 13号模型:立案不及时的异常数据(60天) + modelClue.setThingDesc("该" + data.get("AJBZmc") + + "案件编号为" + getAjbh(data) + + ",受理日期为" + getDateMinuteString(data.get("SLRQ")) + + ",立案日期为" + getDateMinuteString(data.get("LARQ")) + + ",当前案件状态为“" + data.get("AJZTmc") + + "”,超过" + "60" + + "日未受理。"); + } else if (modelId == 14) { // 14号模型:立案不及时的异常数据(无数据) + modelClue.setThingDesc("该" + data.get("AJBZmc") + + "案件编号为" + getAjbh(data) + + ",受理日期为" + getDateMinuteString(data.get("SLRQ")) + + ",立案日期 无数据" + + ",当前案件状态为“" + data.get("AJZTmc") + + "”,立案不及时。"); + } else if (modelId == 15) { // 15号模型:未录入受害人员的异常数据 + modelClue.setThingDesc( + "发现" + modelClue.getInvolveDepartName() + "受理的“" + data.get("AJMC") + + "”(【" + data.get("AJBZmc") + "】编号:" + getAjbh(data) + + "),其案件定性为“" + data.get("AJLBmc") + + "”,应至少有一名受害人,但办案单位没有录入,存在未录入受害人员的异常情况。"); + } else if (modelId == 17) { // 17号模型:刑事盗窃警情未录入执法办案系统的异常数据 + modelClue.setThingDesc( + "发现" + modelClue.getInvolveDepartName() + "受理的盗窃性质接警单" + modelClue.getUniqueKey() + + ",报警日期为" + getDateMinuteString(data.get("bjsj")) + + ",状态为已结案。目前但执法办案系统中未查询到数据,存在刑事盗窃警情未录入执法办案系统的异常情况。"); + } else if (modelId == 19) { // 19号模型:刑事案件立案当天破案的异常数据 + modelClue.setThingDesc( + "发现" + modelClue.getInvolveDepartName() + "受理的“" + data.get("AJMC") + + "”(【" + data.get("AJBZmc") + "】编号:" + getAjbh(data) + + "),立案日期为" + getDateMinuteString(data.get("LARQ")) + + ",破案日期为" + getDateMinuteString(data.get("PARQ")) + + ",立案日期与破案日期间隔不足1天,存在刑事案件立案当天破案的异常情况。"); + } else if (modelId == 23) { // 23号模型:保安员预警 + modelClue.setInvolvePoliceName((String) data.get("xm")); + modelClue.setThingDesc( + "发现隶属于" + modelClue.getInvolveDepartName() + "的" + data.get("zw") + + "(姓名:" + data.get("xm") + ",性别:" + data.get("xb") + + ",身份证号码:" + data.get("sfzhm") + ",联系电话:" + data.get("lxdh") + + "," + data.get("ryztmc") + "),预警内容为:" + data.get("result") + + ",请予以重点关注。"); + } else if (modelId == 24) { // 24号模型:警情未录入反馈人员信息 + modelClue.setThingDesc("发现" + modelClue.getInvolveDepartName() + "受理的接警单" + + modelClue.getUniqueKey() + ",报警日期为" + getDateMinuteString(data.get("bjsj")) + + ",未录入反馈人员身份证信息。"); + } else if (modelId == 26) { // 26号模型:执法办案场所进出时间过短 + if (data.get("lksj") != null && !data.get("lksj").equals("")) { + modelClue.setThingDesc("发现" + data.get("badwmc") + "办理的被处以刑事打处的嫌疑人员“" + + data.get("xm") + "”(身份证号:" + data.get("zjhm") + + "),其于" + getDateMinuteString(data.get("jrsj")) + + "登记进入" + modelClue.getInvolveDepartName() + + "执法办案区,但仅停留" + calculateMinutesBetween(data.get("jrsj"), data.get("lksj")) + + "后便予以离开,少于3小时,与正常开展流程办理刑事案件所需时长相违背,存在疑似不如实登记执法办案场所的异常问题。"); + } + } else if (modelId == 27) { // 27号模型:盗窃车内财物警情结警性质变动的异常数据 + modelClue.setThingDesc("发现" + modelClue.getInvolveDepartName() + "受理的接警单" + + modelClue.getUniqueKey() + ",报警日期为" + getDateMinuteString(data.get("bjsj")) + + ",接警性质为“" + data.get("ysjqxzmc") + "”,结警性质为“" + data.get("jqxzmc") + + "”,存在" + data.get("ysjqxzmc") + "警情结警性质变动的异常情况。"); + } else if (modelId == 28) { // 28号模型:盗窃车内财物超过2000元的数据 + modelClue.setThingDesc("发现" + modelClue.getInvolveDepartName() + "受理的接警单" + + modelClue.getUniqueKey() + ",报警日期为" + getDateMinuteString(data.get("bjsj")) + + ",接警性质为“" + data.get("ysjqxzmc") + "”,金额超过2000元。报警内容为:“" + data.get("bjnr") + + "”。"); + } else if (modelId == 29) { // 29号模型:案件降格处理的异常数据 + modelClue.setThingDesc("发现" + modelClue.getInvolveDepartName() + "受理的接警单" + + modelClue.getUniqueKey() + ",报警日期为" + getDateMinuteString(data.get("bjsj")) + + ",派警、结警均定性为“刑事案件”,但办案单位却受理为“行政案件”办理,存在疑似案件降格处理的问题。"); + } else if (modelId == 30) { // 30号模型:接警结警性质不一致的异常数据 + modelClue.setThingDesc("发现" + modelClue.getInvolveDepartName() + "受理的接警单" + + modelClue.getUniqueKey() + ",报警日期为" + getDateMinuteString(data.get("bjsj")) + + ",接警性质为“" + data.get("ysjqxzmc") + "”,结警性质为“" + data.get("jqxzmc") + + ",存在接警结警性质不一致的异常数据的异常情况。"); + } else if (modelId == 31) { // 31号模型:涉赌、涉黄案件未录入涉案财物 + modelClue.setThingDesc( + "发现" + modelClue.getInvolveDepartName() + "受理的“" + data.get("AJMC") + + "”(【" + data.get("AJBZmc") + "】编号:" + getAjbh(data) + + "),未扣押任何财物,存在疑似涉案财物未按要求录入的问题。"); + } else if (modelId == 100) { // 100号模型:散油实时预警 + modelClue.setInvolvePoliceName((String) data.get("gmrxm")); + modelClue.setThingDesc( + "发现" + data.get("gmrxm") + "(身份证号:" + data.get("zjhm") + ")于" + + getDateMinuteString(data.get("gmsj")) + "在" + + data.get("fjmc") + modelClue.getInvolveDepartName() + "管辖的" + data.get("dwmc") + + "购买了" + data.get("gmsl") + "升" + data.get("gmyt") + + ",产生了" + data.get("yjlx") + ",请予以重点关注。"); + } else if (modelId == 101) { // 101号模型:疑似刑讯逼供 + modelClue.setInvolvePoliceName((String) data.get("sender_man")); + modelClue.setThingDesc( + "发现" + data.get("name") + "(身份证号:" + data.get("ZHENGJIANHAOMA") + ")" + + "进入执法办案场所时的体检结果是" + data.get("LIKAIJIANCHAQINGKUANG") + + ",但被投送至看守所时的体检结果是" + data.get("body_tag") + + ",疑似刑讯逼供的问题,请予以重点关注。"); + } else if (modelId == 102) { // 102号模型:执法办案场所人身安全检查一字未录 + modelClue.setInvolvePoliceName((String) data.get("BANANREN1XM")); + modelClue.setThingDesc( + "发现" + data.get("XINGMING") + "(身份证号:" + data.get("ZHENGJIANHAOMA") + ")" + + "登记进入执法办案场所时没有填写入所检查情况和离所检查情况,存在入所离所人身安全检查一字未录的异常问题。"); + } + } + + private static String getAjbh(Map data) { + String ajbh = (String) data.get("AJBH"); + return ajbh == null || ajbh.isEmpty() ? "无案件编号数据" : ajbh; + } + + private List getModelCluesForModel4(String param, List modelClues) { + System.out.println("模型4开始查询数据库"); + List params = parseSqlForModel2(param); + String jjdSql = "SELECT gxdwdm AS involve_depart_id, gxdwmc AS involve_depart_name, COUNT(*) AS zjjs FROM dwd_asj_zhtx_jjd WHERE cjsj BETWEEN '" + params.get(0) + " 00:00:00' AND '" + params.get(1) + " 00:00:00' GROUP BY gxdwdm, gxdwmc;"; + String zfqySql = "SELECT csid AS involve_depart_id, COUNT(*) AS zfcsdjs FROM dwd_ry_zfba_zfqywfryb WHERE STR_TO_DATE( djsj, '%Y%m%d%H%i%s' ) BETWEEN '" + params.get(0) + " 00:00:00' AND '" + params.get(1) + " 00:00:00' GROUP BY csid;"; + List> jjdmaps = modelClueDataMapper.selectByUniqueKeys(jjdSql); + List> zfqymaps = modelClueDataMapper.selectByUniqueKeys(zfqySql); + System.out.println("模型4查询数据库完毕"); + if (jjdmaps.isEmpty()) { + return modelClues; + } + List jjdModelClues = new ArrayList<>(); + for (Map data : jjdmaps) { + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, data.get("involve_depart_id")).last("LIMIT 1")); + if (supExternalDepart != null && supExternalDepart.getExternalId() != null && supExternalDepart.getExternalName() != null && supExternalDepart.getInternalId() != null && supExternalDepart.getLevel() != null && supExternalDepart.getPid() != null) { + ModelClue modelClue = new ModelClue(); + modelClue.setData(JSONObject.toJSONString(data)); + modelClue.setInvolveDepartId(supExternalDepart.getExternalId()); + modelClue.setInvolveDepartName(supExternalDepart.getExternalName()); + modelClue.setZjjs((Long) data.get("zjjs")); + modelClue.setDepartLevel(supExternalDepart.getLevel()); + modelClue.setParentId(supExternalDepart.getPid()); + modelClue.setThisId(supExternalDepart.getInternalId()); + jjdModelClues.add(modelClue); + } + } + List jjdModelClues3 = new ArrayList<>(jjdModelClues.stream().filter(clue -> clue.getDepartLevel() == 3).toList()); + List jjdModelClues4 = new ArrayList<>(jjdModelClues.stream().filter(clue -> clue.getDepartLevel() == 4).toList()); + List jjdModelClues5 = new ArrayList<>(jjdModelClues.stream().filter(clue -> clue.getDepartLevel() == 5).toList()); + mergeModelClues(jjdModelClues5, jjdModelClues4, 1); + mergeModelClues(jjdModelClues4, jjdModelClues3, 1); + List zfqymModelClues = new ArrayList<>(); + for (Map data : zfqymaps) { + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, data.get("involve_depart_id")).last("LIMIT 1")); + if (supExternalDepart != null && supExternalDepart.getExternalId() != null && supExternalDepart.getExternalName() != null && supExternalDepart.getInternalId() != null && supExternalDepart.getLevel() != null && supExternalDepart.getPid() != null) { + ModelClue modelClue = new ModelClue(); + modelClue.setData(JSONObject.toJSONString(data)); + modelClue.setInvolveDepartId(supExternalDepart.getExternalId()); + modelClue.setZfcsdjs((Long) data.get("zfcsdjs")); + modelClue.setDepartLevel(supExternalDepart.getLevel()); + modelClue.setParentId(supExternalDepart.getPid()); + modelClue.setThisId(supExternalDepart.getInternalId()); + zfqymModelClues.add(modelClue); + } + } + List zfqymModelClues3 = new ArrayList<>(zfqymModelClues.stream().filter(clue -> clue.getDepartLevel() == 3).toList()); + List zfqymModelClues4 = new ArrayList<>(zfqymModelClues.stream().filter(clue -> clue.getDepartLevel() == 4).toList()); + List zfqymModelClues5 = new ArrayList<>(zfqymModelClues.stream().filter(clue -> clue.getDepartLevel() == 5).toList()); + mergeModelClues(zfqymModelClues5, zfqymModelClues4, 2); + mergeModelClues(zfqymModelClues4, zfqymModelClues3, 2); + BigDecimal avgPercentage; + if (!zfqymModelClues3.isEmpty()) { + BigDecimal zjjsTotal = BigDecimal.valueOf(jjdModelClues3.stream().mapToLong(ModelClue::getZjjs).sum()); + BigDecimal zfcsdjsTotal = BigDecimal.valueOf(zfqymModelClues3.stream().mapToLong(ModelClue::getZfcsdjs).sum()); + // 全市平均数 + avgPercentage = zfcsdjsTotal.divide(zjjsTotal, 2, RoundingMode.HALF_UP); + } else { + avgPercentage = BigDecimal.ZERO; + } + for (ModelClue jjdModelClue : jjdModelClues3) { + if (zfqymModelClues3.isEmpty()) { + jjdModelClue.setDistributionState("0"); + jjdModelClue.setThingDesc("在" + params.get(0) + "到" + params.get(1) + "之间," + jjdModelClue.getInvolveDepartName() + + "的总警情数为" + jjdModelClue.getZjjs() + + ",执法场所登记数为0" + + ",每100起警情执法场所登记比例为0" + + ",低于全市平均值(" + avgPercentage + + "%),疑似漏登执法办案场所。"); + } else { + Iterator iterator1 = zfqymModelClues3.iterator(); + boolean found = false; + while (iterator1.hasNext()) { + ModelClue zfqymModelClue = iterator1.next(); + if (jjdModelClue.getInvolveDepartId().equals(zfqymModelClue.getInvolveDepartId())) { + jjdModelClue.setZfcsdjs(zfqymModelClue.getZfcsdjs()); + BigDecimal zfcsdjs = BigDecimal.valueOf(jjdModelClue.getZfcsdjs()); + BigDecimal zjjs = BigDecimal.valueOf(jjdModelClue.getZjjs()); + BigDecimal bl = zfcsdjs.divide(zjjs, 2, RoundingMode.HALF_UP); + jjdModelClue.setBl(bl); + jjdModelClue.setDistributionState("0"); + jjdModelClue.setThingDesc("在" + params.get(0) + "到" + params.get(1) + "之间," + jjdModelClue.getInvolveDepartName() + + "的总警情数为" + jjdModelClue.getZjjs() + + ",执法场所登记数为" + jjdModelClue.getZfcsdjs() + + ",每100起警情执法场所登记比例为" + jjdModelClue.getBl() + + ",低于全市平均值(" + avgPercentage + + "%),疑似漏登执法办案场所。"); + iterator1.remove(); + found = true; + break; + } + } + if (!found) { + jjdModelClue.setDistributionState("0"); + jjdModelClue.setThingDesc("在" + params.get(0) + "到" + params.get(1) + "之间," + jjdModelClue.getInvolveDepartName() + + "的总警情数为" + jjdModelClue.getZjjs() + + ",执法场所登记数为0" + + ",每100起警情执法场所登记比例为0%" + + ",低于全市平均值(" + avgPercentage + + "%),疑似漏登执法办案场所。"); + } + } + } + modelClues.addAll(jjdModelClues3); + return modelClues; + } + + private void getModelCluesForModel16(String param, List modelClues) { + System.out.println("模型16开始查询数据库"); + List params = parseSqlForModel2(param); + String selectSfzh = "SELECT COUNT(DISTINCT ajbh) AS num, sfzh FROM dwd_wp_zfba_qbhsjds WHERE STR_TO_DATE(pzrq, '%Y%m%d%H%i%s') BETWEEN '" + params.get(0) + " 00:00:00' AND '" + params.get(1) + " 00:00:00' GROUP BY sfzh HAVING COUNT(DISTINCT ajbh) > 2;"; + List> sfzhList = modelClueDataMapper.selectByUniqueKeys(selectSfzh); + Map sfzhMap = sfzhList.stream().filter(map -> map.get("sfzh") != null).collect(Collectors.toMap( + map -> (String) map.get("sfzh"), + map -> (long)map.get("num")) + ); + System.out.println("模型16查询数据库完毕"); + if (sfzhMap.isEmpty()) { + return; + } + String selectSfzh2 = "SELECT a.zj AS uniqueKey, a.sfzh AS negative_id_ex, a.badwid AS involve_depart_id, a.badwmc AS involve_depart_name, a.bar1xm, a.bar2xm, a.bar1id, a.bar2id, a.sfzh, a.xm FROM dwd_wp_zfba_qbhsjds a INNER JOIN (SELECT sfzh, MAX(STR_TO_DATE(pzrq, '%Y%m%d%H%i%s')) AS max_create_time FROM dwd_wp_zfba_qbhsjds WHERE STR_TO_DATE(pzrq, '%Y%m%d%H%i%s') BETWEEN '" + params.get(0) + " 00:00:00' AND '" + params.get(1) + " 00:00:00' GROUP BY sfzh) b ON a.sfzh = b.sfzh AND STR_TO_DATE(a.pzrq, '%Y%m%d%H%i%s') = b.max_create_time;"; + List> newModelClues = modelClueDataMapper.selectByUniqueKeys(selectSfzh2); + for (Map modelClue : newModelClues) { + if (!sfzhMap.containsKey((String) modelClue.get("sfzh"))) { + continue; + } + Long count = modelClueRepository.getBaseMapper().selectCount(new LambdaQueryWrapper().eq(ModelClue::getNegativeIdEx, modelClue.get("sfzh"))); + if (count > 0) { + continue; + } + ModelClue newModelClue = new ModelClue(); + newModelClue.setUniqueKey((String) modelClue.get("uniqueKey")); + newModelClue.setNegativeIdEx((String) modelClue.get("negative_id_ex")); + if (modelClue.get("involve_depart_id") != null) { + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, modelClue.get("involve_depart_id")).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + newModelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + if (supExternalDepart.getInternalShortName() != null) { + newModelClue.setInvolveDepartName(supExternalDepart.getInternalShortName()); + } + } + } + if (modelClue.get("bar1xm") != null && modelClue.get("bar2xm") != null) { + newModelClue.setInvolvePoliceName(modelClue.get("bar1xm") + "、" + modelClue.get("bar2xm")); + } else if (modelClue.get("bar1xm") != null){ + newModelClue.setInvolvePoliceName((String) modelClue.get("bar1xm")); + } else if (modelClue.get("bar2xm") != null){ + newModelClue.setInvolvePoliceName((String) modelClue.get("bar2xm")); + } else { + newModelClue.setInvolvePoliceName("无姓名数据"); + } + Map bar1 = modelClueDataMapper.selectBAR((String) modelClue.get("bar1id")); + Map bar2 = modelClueDataMapper.selectBAR((String) modelClue.get("bar2id")); + String jh1 = bar1 == null ? null : (String) bar1.get("JH"); + String jh2 = bar2 == null ? null : (String) bar2.get("JH"); + if (jh1 != null && jh2 != null) { + newModelClue.setInvolvePoliceEmpNo(jh1 + "、" + jh2); + } else if (jh1 != null) { + newModelClue.setInvolvePoliceEmpNo(jh1); + } else if (jh2 != null) { + newModelClue.setInvolvePoliceEmpNo(jh2); + } else { + newModelClue.setInvolvePoliceEmpNo("无警号数据"); + } + newModelClue.setData(JSONObject.toJSONString(modelClue)); + newModelClue.setDistributionState("0"); + newModelClue.setThingDesc( + "发现违法犯罪嫌疑人员" + modelClue.get("xm") + "(身份证号:" + modelClue.get("sfzh") + + "),在" + getDateString(params.get(0)) + "到" + getDateString(params.get(1)) + "之间," + + "被取保次数为" + sfzhMap.get((String) modelClue.get("sfzh")) + + "次,属于多次取保异常情况,目前最新办案单位为" + newModelClue.getInvolveDepartName() + + ",请予以重点关注。"); + modelClues.add(newModelClue); + sfzhMap.remove((String) modelClue.get("sfzh")); + } + } + + private void getModelCluesForModel18(String sql, List modelClues) { + System.out.println("模型18开始查询数据库"); + List> sqlList = modelClueDataMapper.selectByUniqueKeys(sql); + System.out.println("模型18查询数据库完毕,结果数量:" + sqlList.size()); + if (sqlList.isEmpty()) { + return; + } + Map model18Map = new HashMap<>(); + for (Map map : sqlList) { + String zhrq = getDateMinuteString(map.get("zhrq")); + String zhdd = (String) map.get("zhdd"); + String ajbh = (String) map.get("ajbh"); + String zhr = map.get("zhr") == null ? "" : (String) map.get("zhr"); + String badwIDdm = map.get("BADWIDdm") == null ? "" : (String) map.get("BADWIDdm"); + String badwIDmc = map.get("BADWIDmc") == null ? "" : (String) map.get("BADWIDmc"); + ModelClue18 modelClue18 = new ModelClue18(); + modelClue18.setAjbh(ajbh); + modelClue18.setZhrq(zhrq); + modelClue18.setZhdd(zhdd); + modelClue18.setZhr(zhr); + modelClue18.setBadwIDdm(badwIDdm); + modelClue18.setBadwIDmc(badwIDmc); + if (model18Map.containsKey(zhdd + zhrq)) { + modelClue18.setAjbh(model18Map.get(zhdd + zhrq).getAjbh() +"、"+ ajbh); + } + model18Map.put(zhdd + zhrq, modelClue18); + } + for (ModelClue18 value : model18Map.values()) { + ModelClue newModelClue = new ModelClue(); + newModelClue.setUniqueKey(value.getAjbh()); + newModelClue.setNegativeIdEx(value.getAjbh()); + newModelClue.setInvolvePoliceName(value.getZhr()); + if (value.getBadwIDdm() != null) { + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, value.getBadwIDdm()).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + newModelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + if (supExternalDepart.getInternalShortName() != null) { + newModelClue.setInvolveDepartName(supExternalDepart.getInternalShortName()); + } + } + } + newModelClue.setData(JSONObject.toJSONString(value)); + newModelClue.setDistributionState("0"); + newModelClue.setThingDesc( + "发现" + newModelClue.getInvolveDepartName() + "在" + value.getZhrq() + + "于" + value.getZhdd() + "出警时产生了多条案件编号(" + value.getAjbh() + + "),存在相同时间地点抓捕出现多条案件编号的异常,请予以重点关注。"); + modelClues.add(newModelClue); + } + } + + private void getModelCluesForModel20(String param, List modelClues) { + System.out.println("模型20开始查询数据库"); + String sql = "select * from dwd_qb_nbgl_lxqtscsygxjl where STR_TO_DATE(tjrq, '%Y-%m-%d') = CURDATE() - INTERVAL " + param + " DAY;"; + List> sqlList = modelClueDataMapper.selectByUniqueKeys(sql); + System.out.println("模型20查询数据库完毕,结果数量:" + sqlList.size()); + if (sqlList.isEmpty()) { + return; + } + for (Map map : sqlList) { + ModelClue newModelClue = new ModelClue(); + newModelClue.setUniqueKey((String) map.get("tjrq") + map.get("dwmc")); + newModelClue.setNegativeIdEx((String) map.get("tjrq") + map.get("dwmc")); + newModelClue.setInvolveDepartName((String) map.get("pcsmc")); + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getInternalShortName, map.get("pcsmc")).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + newModelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + } + newModelClue.setData(JSONObject.toJSONString(map)); + newModelClue.setDistributionState("0"); + newModelClue.setThingDesc( + getDateString((String) map.get("tjrq")) + "灵敏感知系统发现" + newModelClue.getInvolveDepartName() + "合作的" + map.get("dwmc") + + "的上报数量为" + map.get("cnt") + "," + map.get("result") + + ",请予以重点关注。"); + modelClues.add(newModelClue); + } + } + + private void getModelCluesForModel22(String sql, List modelClues) { + System.out.println("模型22开始查询数据库"); + List> sqlList = modelClueDataDMRepository.selectByUniqueKeys(sql); + System.out.println("模型22查询数据库完毕,结果数量:" + sqlList.size()); + if (sqlList.isEmpty()) { + return; + } + List> jjdData = modelClueDataMapper.selectByUniqueKeys("SELECT DISTINCT jjdbh FROM dwd_asj_zhtx_jjd WHERE jqxzmc like '%举报%' AND (bjnr like '%嫖%' or bjnr like '%涉黄%'or bjnr like '%淫%'or bjnr like '%有偿%'or bjnr like '%陪侍%' or bjnr like '%私人影院%' or bjnr like '%脱衣舞%'or bjnr like '%打飞机%'or bjnr like '%全套%'or bjnr like '%半套%'or bjnr like '%卡片%'or bjnr like '%色情%'or bjnr like '%拉客%'or bjnr like '%站街%'or bjnr like '%裸嗨%'or bjnr like '%摸摸看%'or bjnr like '%摸摸唱%'or bjnr like '%黄色%'or bjnr like '%发卡%'or bjnr like '%赌%'or bjnr like '%三公%'or bjnr like '%斗牛%'or bjnr like '%德州%'or bjnr like '%扑克%'or bjnr like '%十三水%'or bjnr like '%麻将%'or bjnr like '%打牌%'or bjnr like '%打大牌%'or bjnr like '%牌九%'or bjnr like '%赌博机%'or bjnr like '%打鱼机%'or bjnr like '%老虎机%'or bjnr like '%苹果机%'or bjnr like '%六合彩%') AND bjsj>'2024-10-01 00:00:00';"); + System.out.println("模型22查询jjdData数据库完毕,结果数量:" + jjdData.size()); + List jjdbhList = new ArrayList<>(); + for (Map map : jjdData) { + String jjdbh = (String) map.get("jjdbh"); + if (jjdbh != null && !jjdbh.isEmpty()) { + jjdbhList.add(jjdbh); + } + } + for (Map map : sqlList) { + Pattern pattern = Pattern.compile("\\d+"); + Matcher matcher = pattern.matcher((String) map.get("DESCRIBEDETAILS")); + String jjdbh = ""; + while (matcher.find()) { + String group = matcher.group(); + if (group.length() == 25) { + jjdbh = group; + break; + } + } + if (!jjdbhList.contains(jjdbh)) { + continue; + } + ModelClue newModelClue = new ModelClue(); + newModelClue.setUniqueKey(""); + newModelClue.setNegativeIdEx(""); + newModelClue.setInvolvePoliceName((String) map.get("USERNAME")); + newModelClue.setInvolveDepartName((String) map.get("orgname")); + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getInternalName, map.get("orgname")).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + newModelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + } + newModelClue.setData(JSONObject.toJSONString(map)); + newModelClue.setDistributionState("0"); + String createTime = ""; + Object createTimeObj = map.get("CREATETIME"); + try { + if (createTimeObj instanceof Timestamp timestamp) { + Instant instant = timestamp.toInstant(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + createTime = "于" + formatter.format(localDateTime); + } else if (createTimeObj instanceof String createTimeStr) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS"); + Date parseDate = sdf.parse(createTimeStr); + Instant instant = parseDate.toInstant(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + createTime = "于" + formatter.format(localDateTime); + } else if (createTimeObj instanceof Date date) { + Instant instant = date.toInstant(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + createTime = "于" + formatter.format(localDateTime); + } + } catch (Exception ex) { + log.error("模型22日期解析失败: {}", ex.getMessage(), ex); + } + newModelClue.setThingDesc( + "灵敏感知系统" + createTime + "发现" + newModelClue.getInvolveDepartName() + "有" + + map.get("TYPENAME") + "的问题,问题详情:“" + + map.get("DESCRIBEDETAILS") + "”,请予以重点关注。"); + modelClues.add(newModelClue); + } + } + + private void getModelCluesForModel25(String sql, List modelClues) { + System.out.println("模型25开始查询数据库"); + List> sqlList = modelClueDataMapper.selectByUniqueKeys(sql); + System.out.println("模型25查询数据库完毕,结果数量:" + sqlList.size()); + if (sqlList.isEmpty()) { + return; + } + for (Map map : sqlList) { + Object countObj = map.get("num"); + if (countObj instanceof Integer) { + int count = (Integer) countObj; + if (count <= 200) { + continue; + } + } else if (countObj instanceof Long) { + long count = (Long) countObj; + if (count <= 200L) { + continue; + } + } + ModelClue newModelClue = new ModelClue(); + newModelClue.setInvolvePoliceName((String) map.get("xzdzrr")); + List> maps = modelClueDataMapper.selectByUniqueKeys("select * from dwd_ry_zddxgk_zdry where xzdzrr = '" + map.get("xzdzrr") + "';"); + String gxdwjgdm = ""; + String gxdw = ""; + String xzdzrr = ""; + for (Map stringObjectMap : maps) { + if (stringObjectMap.get("gxdwjgdm") != null && !stringObjectMap.get("gxdwjgdm").equals("")) { + gxdwjgdm = (String) stringObjectMap.get("gxdwjgdm"); + newModelClue.setInvolveDepartId(gxdwjgdm); + } + if (stringObjectMap.get("gxdw") != null && !stringObjectMap.get("gxdw").equals("")) { + gxdw = (String) stringObjectMap.get("gxdw"); + newModelClue.setInvolveDepartName(gxdw); + } + if (stringObjectMap.get("xzdzrr") != null && !stringObjectMap.get("xzdzrr").equals("")) { + xzdzrr = (String) stringObjectMap.get("xzdzrr"); + } + } + newModelClue.setUniqueKey(gxdwjgdm + xzdzrr); + newModelClue.setNegativeIdEx(gxdwjgdm + xzdzrr); + newModelClue.setInvolveDepartName(gxdw); + if (newModelClue.getInvolveDepartId() != null) { + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getInternalId, newModelClue.getInvolveDepartId()).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + newModelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + } + } + newModelClue.setData(JSONObject.toJSONString(map)); + newModelClue.setDistributionState("0"); + Long count = (Long) map.get("num"); + BigDecimal result = BigDecimal.valueOf(count).divide(BigDecimal.valueOf(250), 3, RoundingMode.HALF_UP); + newModelClue.setThingDesc( + "发现" + newModelClue.getInvolveDepartName() + "民警" + xzdzrr + + ",其在重点人员管控系统中的管控人数为" + count + + "人,即使每个重点人员只见一次,其工作日(采取每年250天)必须每日完成管控" + + result +"个。"); + modelClues.add(newModelClue); + } + } + + private void getModelCluesForModel103(String sql, List modelClues) { + System.out.println("模型103开始查询数据库"); + List> sqlList = modelClueDataMapper.selectByUniqueKeys(sql); + System.out.println("模型103查询数据库完毕,结果数量:" + sqlList.size()); + if (sqlList.isEmpty()) { + return; + } + for (Map map : sqlList) { + String newSql = "SELECT a.*, b.fkrbh, b.fkrxm FROM dwd_asj_zhtx_jjd a left join dwd_asj_zhtx_fkd b on a.jjdbh = b.jjdbh " + "WHERE a.jjdbh = '" + map.get("uniqueKey") + "';"; + System.out.println("模型103开始再次查询数据库"); + List> allData = modelClueDataMapper.selectByUniqueKeys(newSql); + System.out.println("模型103完成再次查询数据库,结果数量:" + allData.size()); + if (allData.isEmpty() || allData.get(0) == null || allData.get(0).get("jjdbh") == null) { + continue; + } + Map newMap = allData.get(0); + ModelClue newModelClue = new ModelClue(); + newModelClue.setUniqueKey((String) map.get("uniqueKey")); + newModelClue.setNegativeIdEx((String) map.get("negative_id_ex")); + newModelClue.setInvolveDepartName((String) map.get("involve_depart_name")); + newModelClue.setInvolveDepartId((String) map.get("involve_depart_id")); + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, newMap.get("gxdwdm")).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + StatisticsDepart statisticsDepart = statisticsDepartRepository.getOne(new QueryWrapper().eq("departId", supExternalDepart.getInternalId()).last("LIMIT 1")); + if (statisticsDepart != null && statisticsDepart.getGroupId() != null && statisticsDepart.getGroupId() == 11L) { + continue; + } + newModelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + } + } + newModelClue.setData(JSONObject.toJSONString(newMap)); + newModelClue.setDistributionState("0"); + setPerson(103, newModelClue, newMap); + newModelClue.setThingDesc( + "发现警情(接警单编号:" + map.get("uniqueKey") + + "),存在接处警不及时的问题。"); + modelClues.add(newModelClue); + } + } + + private void getModelCluesForModel104(String param, List modelClues) { + System.out.println("模型104开始查询数据库"); + List params = parseSqlForModel2(param); + String sql = "select a.gxdwdm, a.gxdwmc, a.num anum, b.num bnum from ((SELECT gxdwdm, gxdwmc, COUNT(*) AS num from dwd_asj_zhtx_jjd where bjsj BETWEEN '" + params.get(0) + " 00:00:00' AND '" + params.get(1) + " 00:00:00' AND (ysjqxzdm LIKE '01%' OR ysjqxzdm LIKE'02%' OR ysjqxzdm LIKE'06%') AND (bjxldm NOT LIKE '01%' AND bjxldm NOT LIKE '02%' AND bjxldm NOT LIKE '06%') and bjfsdm = '0101' GROUP BY gxdwdm, gxdwmc) a join (SELECT gxdwdm, gxdwmc, COUNT(*) num from dwd_asj_zhtx_jjd where bjsj BETWEEN '" + params.get(0) + " 00:00:00' AND '" + params.get(1) + " 00:00:00' AND (ysjqxzdm LIKE '01%' OR ysjqxzdm LIKE'02%' OR ysjqxzdm LIKE'06%') and bjfsdm = '0101' GROUP BY gxdwdm, gxdwmc) b on a.gxdwdm = b.gxdwdm);"; + List> jjdmaps = modelClueDataMapper.selectByUniqueKeys(sql); + System.out.println("模型104查询数据库完毕,结果数量:" + jjdmaps.size()); + if (jjdmaps.isEmpty()) { + return; + } + List jjdModelClues = new ArrayList<>(); + for (Map data : jjdmaps) { + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, data.get("gxdwdm")).last("LIMIT 1")); + if (supExternalDepart != null && supExternalDepart.getExternalId() != null && supExternalDepart.getExternalName() != null && supExternalDepart.getInternalId() != null && supExternalDepart.getLevel() != null && supExternalDepart.getPid() != null) { + ModelClue modelClue = new ModelClue(); + modelClue.setData(JSONObject.toJSONString(data)); + modelClue.setInvolveDepartId(supExternalDepart.getExternalId()); + modelClue.setInvolveDepartName(supExternalDepart.getExternalName()); + modelClue.setZjjs((Long) data.get("anum")); + modelClue.setAllZjjs((Long)data.get("bnum")); + modelClue.setDepartLevel(supExternalDepart.getLevel()); + modelClue.setParentId(supExternalDepart.getPid()); + modelClue.setThisId(supExternalDepart.getInternalId()); + jjdModelClues.add(modelClue); + } + } + List jjdModelClues3 = new ArrayList<>(jjdModelClues.stream().filter(clue -> clue.getDepartLevel() == 3).toList()); + List jjdModelClues4 = new ArrayList<>(jjdModelClues.stream().filter(clue -> clue.getDepartLevel() == 4).toList()); + List jjdModelClues5 = new ArrayList<>(jjdModelClues.stream().filter(clue -> clue.getDepartLevel() == 5).toList()); + mergeModelClues(jjdModelClues5, jjdModelClues4, 3); + mergeModelClues(jjdModelClues4, jjdModelClues3, 3); + Map departPercentageMap = new HashMap<>(); + Map departNumMap = new HashMap<>(); + Map departAllNumMap = new HashMap<>(); + for (ModelClue jjdModelClue : jjdModelClues3) { + BigDecimal percentage = BigDecimal.valueOf(jjdModelClue.getZjjs()).divide(BigDecimal.valueOf(jjdModelClue.getAllZjjs()), 3, RoundingMode.HALF_UP); + departPercentageMap.put(jjdModelClue.getInvolveDepartId(), percentage); + departNumMap.put(jjdModelClue.getInvolveDepartId(), jjdModelClue.getZjjs()); + departAllNumMap.put(jjdModelClue.getInvolveDepartId(), jjdModelClue.getAllZjjs()); + } + List highPercentageDepartments = departPercentageMap.entrySet().stream() + .filter(entry -> entry.getValue().compareTo(BigDecimal.valueOf(0.7)) > 0) + .map(Map.Entry::getKey) + .toList(); + for (String department : highPercentageDepartments) { + if (departNumMap.get(department) < 10L) { + continue; + } + ModelClue newModelClue = new ModelClue(); + newModelClue.setUniqueKey(department); + newModelClue.setNegativeIdEx(department); + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, department).last("LIMIT 1")); + if (supExternalDepart != null) { + if (supExternalDepart.getInternalId() != null) { + newModelClue.setInvolveDepartId(supExternalDepart.getInternalId()); + StatisticsDepart statisticsDepart = statisticsDepartRepository.getOne(new QueryWrapper().eq("departId", supExternalDepart.getInternalId()).last("LIMIT 1")); + if (statisticsDepart == null || statisticsDepart.getGroupId() == null || statisticsDepart.getGroupId() != 10L) { + continue; + } + } + if (supExternalDepart.getInternalShortName() != null) { + newModelClue.setInvolveDepartName(supExternalDepart.getInternalShortName()); + } + } + newModelClue.setDistributionState("0"); + newModelClue.setThingDesc("发现" + newModelClue.getInvolveDepartName() + + "在" + getDateString(params.get(0)) + "到" + getDateString(params.get(1)) + + "之间共有" + departAllNumMap.get(department) + "个警情,变更了" + departNumMap.get(department) + + "个警情的结警性质,超过了该单位总警情的70%,存在大量变更接警性质的异常情况。"); + newModelClue.setData(newModelClue.getThingDesc()); + modelClues.add(newModelClue); + } + } + + private void getModelCluesForModel105(String sql, List modelClues) { + System.out.println("模型105开始查询数据库"); + List> sqlList = modelClueMapper.selectByUniqueKeys(sql); + System.out.println("模型105查询数据库完毕,结果数量:" + sqlList.size()); + if (sqlList.isEmpty()) { + return; + } + for (Map map : sqlList) { + ModelClue newModelClue = new ModelClue(); + newModelClue.setUniqueKey((String) map.get("blameId")); + newModelClue.setNegativeIdEx((String) map.get("blameId")); + newModelClue.setInvolveDepartName(map.get("involveDepartName") == null ? "" : (String) map.get("involveDepartName")); + newModelClue.setInvolveDepartId(map.get("involveDepartId") == null ? "" : (String) map.get("involveDepartId")); + newModelClue.setInvolvePoliceEmpNo((String) map.get("emp_no")); + newModelClue.setInvolvePoliceName((String) map.get("blameName")); + newModelClue.setData(JSONObject.toJSONString(map)); + newModelClue.setDistributionState("0"); + newModelClue.setThingDesc( + "发现过去的一个月内,民警" + map.get("blameName") + "出现了" + map.get("co") + "次“" + + map.get("threeLevelContent") + "”的违规行为,请予以重点关注。"); + modelClues.add(newModelClue); + } + } + + private void mergeModelClues(List modelClues2, List modelClues1 , int no) { + for (ModelClue modelClue2 : modelClues2) { + Iterator iterator1 = modelClues1.iterator(); + boolean found = false; + while (iterator1.hasNext()) { + ModelClue modelClue1 = iterator1.next(); + if (modelClue2.getParentId().equals(modelClue1.getThisId())) { + if (no == 1) { + modelClue1.setZjjs(modelClue2.getZjjs() + modelClue1.getZjjs()); + } else if (no == 2) { + modelClue1.setZfcsdjs(modelClue2.getZfcsdjs() + modelClue1.getZfcsdjs()); + } else if (no == 3) { + modelClue1.setZjjs(modelClue2.getZjjs() + modelClue1.getZjjs()); + modelClue1.setAllZjjs(modelClue2.getAllZjjs() + modelClue1.getAllZjjs()); + } + modelClue1.setData(modelClue1.getData() + modelClue2.getData()); + found = true; + break; + } + } + if (!found) { + SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getInternalId, modelClue2.getParentId()).last("LIMIT 1")); + if (supExternalDepart != null) { + ModelClue newModelClue = new ModelClue(); + newModelClue.setData(modelClue2.getData()); + newModelClue.setInvolveDepartId(supExternalDepart.getExternalId()); + newModelClue.setInvolveDepartName(supExternalDepart.getExternalName()); + newModelClue.setParentId(supExternalDepart.getPid()); + newModelClue.setThisId(supExternalDepart.getInternalId()); + newModelClue.setDepartLevel(supExternalDepart.getLevel()); + if (no == 1) { + newModelClue.setZjjs(modelClue2.getZjjs()); + } else if (no == 2) { + newModelClue.setZfcsdjs(modelClue2.getZfcsdjs()); + } else if (no == 3) { + newModelClue.setZjjs(modelClue2.getZjjs()); + newModelClue.setAllZjjs(modelClue2.getAllZjjs()); + } + modelClues1.add(newModelClue); + } else { + System.out.println("父级部门" + modelClue2.getParentId() + "不存在"); + } + } + } + } + + private List getModelCluesForModel2(String param, List modelClues) { + List modelClues1 = new ArrayList<>(); + List params = parseSqlForModel2(param); + String preSql = "SELECT a.jjdbh AS uniqueKey, a.jjdbh AS negative_id_ex, a.gxdwmc AS involve_depart_name, a.gxdwdm AS involve_depart_id FROM dwd_asj_zhtx_jjd a WHERE (a.jqxzdm LIKE '01%' OR a.jqxzdm LIKE '02%') AND a.bjnr LIKE '%"; + String postSql = "%' AND NOT EXISTS (SELECT 1 FROM dwd_asj_sjjhygx_jjcjxxb b WHERE b.BARLXDH = a.bjdh) AND a.bjsj BETWEEN '" + params.get(0) + " 00:00:00' AND '" + params.get(1) + " 00:00:00';"; + genarateModelCluesForModel2(preSql, postSql, modelClues1); + List uniqueKeys = modelClues1.stream().map(ModelClue::getUniqueKey).filter(k -> k != null && !k.isEmpty()).toList(); + if (!uniqueKeys.isEmpty()) { + String newSql = "SELECT a.* FROM dwd_asj_zhtx_jjd a LEFT JOIN dwd_asj_sjjhygx_jjcjxxb b ON b.BARLXDH = a.bjdh WHERE a.jjdbh IN " + "(" + uniqueKeys.stream().map(k -> "'" + k + "'").collect(Collectors.joining(",")) + ");"; + List> allData = modelClueDataMapper.selectByUniqueKeys(newSql); + for (ModelClue modelClue : modelClues1) { + for (Map data : allData) { + String keyColumn = (String) data.get("jjdbh"); + if (Objects.equals(keyColumn, modelClue.getUniqueKey())) { + modelClue.setData(JSONObject.toJSONString(data)); + modelClue.setDistributionState("0"); + String jqxz = ""; + jqxz = summarizeAttribute(data, jqxz); + modelClue.setThingDesc("该" + jqxz + + "警情接警单编号为" + data.get("jjdbh") + + ",报案时间为" + getDateMinuteString(data.get("bjsj")) + + ",没有匹配到立案时间,受立案不及时。"); + break; + } + } + } + modelClues.addAll(modelClues1); + } + List modelClues2 = new ArrayList<>(); + String preSql2 = "SELECT a.jjdbh AS uniqueKey, a.jjdbh AS negative_id_ex, a.gxdwmc AS involve_depart_name, a.gxdwdm AS involve_depart_id FROM dwd_asj_zhtx_jjd a WHERE (a.jqxzdm LIKE '01%' OR a.jqxzdm LIKE '02%') AND a.bjnr LIKE '%"; + String postSql2 = "%' AND EXISTS (SELECT 1 FROM dwd_asj_sjjhygx_jjcjxxb b WHERE b.lasj IS NOT NULL AND b.basj < DATE_SUB(STR_TO_DATE(b.lasj, '%Y%m%d%H%i%s') , INTERVAL 7 DAY) AND b.BARLXDH = a.bjdh AND STR_TO_DATE(b.lasj, '%Y%m%d%H%i%s') > a.bjsj) AND a.bjsj BETWEEN '" + params.get(0) + " 00:00:00' AND '" + params.get(1) + " 00:00:00' ORDER BY a.bjsj desc LIMIT 1;"; + genarateModelCluesForModel2(preSql2, postSql2, modelClues2); + List uniqueKeys2 = modelClues2.stream().map(ModelClue::getUniqueKey).filter(k -> k != null && !k.isEmpty()).toList(); + if (!uniqueKeys2.isEmpty()) { + String newSql2 = "SELECT a.*, b.ajbh, b.lasj FROM dwd_asj_zhtx_jjd a LEFT JOIN dwd_asj_sjjhygx_jjcjxxb b ON b.BARLXDH = a.bjdh WHERE a.jjdbh IN " + "(" + uniqueKeys2.stream().map(k -> "'" + k + "'").collect(Collectors.joining(",")) + ");"; + List> allData2 = modelClueDataMapper.selectByUniqueKeys(newSql2); + for (ModelClue modelClue : modelClues2) { + for (Map data : allData2) { + String keyColumn = (String) data.get("jjdbh"); + if (Objects.equals(keyColumn, modelClue.getUniqueKey())) { + modelClue.setData(JSONObject.toJSONString(data)); + modelClue.setDistributionState("0"); + String jqxz = ""; + jqxz = summarizeAttribute(data, jqxz); + modelClue.setThingDesc("该" + jqxz + + "警情接警单编号为" + data.get("jjdbh") + + ",报案时间为" + getDateMinuteString(data.get("bjsj")) + + ",案件编号为" + data.get("ajbh") + + ",立案时间为" + formatStringDate((String) data.get("lasj")) + + ",报案时间与立案时间超过7天,受立案不及时。"); + break; + } + } + } + modelClues.addAll(modelClues2); + } + return modelClues; + } + + private void genarateModelCluesForModel2(String preSql, String postSql, List modelClues) { + System.out.println("模型2开始查询数据库 盗"); + List modelClues1 = modelClueDataMapper.selectDataByDynamicSql(preSql + "盗" + postSql); + System.out.println("模型2开始查询数据库 骗"); + List modelClues2 = modelClueDataMapper.selectDataByDynamicSql(preSql + "骗" + postSql); + List modelClues3 = modelClueDataMapper.selectDataByDynamicSql(preSql + "强奸" + postSql); + List modelClues4 = modelClueDataMapper.selectDataByDynamicSql(preSql + "抢" + postSql); + System.out.println("模型2开始查询数据库 10岁"); + List modelClues5 = modelClueDataMapper.selectDataByDynamicSql(preSql + "10岁" + postSql); + List modelClues6 = modelClueDataMapper.selectDataByDynamicSql(preSql + "11岁" + postSql); + List modelClues7 = modelClueDataMapper.selectDataByDynamicSql(preSql + "12岁" + postSql); + List modelClues8 = modelClueDataMapper.selectDataByDynamicSql(preSql + "13岁" + postSql); + List modelClues9 = modelClueDataMapper.selectDataByDynamicSql(preSql + "14岁" + postSql); + List modelClues10 = modelClueDataMapper.selectDataByDynamicSql(preSql + "15岁" + postSql); + List modelClues11 = modelClueDataMapper.selectDataByDynamicSql(preSql + "16岁" + postSql); + System.out.println("模型2开始查询数据库 未成年"); + List modelClues12 = modelClueDataMapper.selectDataByDynamicSql(preSql + "未成年" + postSql); + modelClues.addAll(Stream.of(modelClues1, modelClues2, modelClues3, modelClues4, modelClues5, modelClues6, modelClues7, modelClues8, modelClues9, modelClues10, modelClues11, modelClues12) + .flatMap(List::stream) + .collect(Collectors.toMap(ModelClue::getUniqueKey, data -> data, (existing, replacement) -> existing)) + .values()); + System.out.println("模型2查询数据库完毕,数量为:" + modelClues.size()); + } + + private static String getDateString(String dateString) { + try { + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate date = LocalDate.parse(dateString, inputFormatter); + DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + return date.format(outputFormatter); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static String getDateMinuteString(Object param) { + if (param != null) { + String time = null; + try { + time = String.valueOf(param); + LocalDateTime localDateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")); + return localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分")); + } catch (Exception e) { + try { + time = String.valueOf(param); + LocalDateTime localDateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S")); + return localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分")); + } catch (Exception ex) { + try { + time = String.valueOf(param); + LocalDateTime localDateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + return localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分")); + } catch (Exception exx) { + try { + time = String.valueOf(param); + LocalDateTime localDateTime = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + return localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分")); + } catch (Exception exxx) { + log.info("日期转换异常{}", time, ex); + } + } + } + } + } + return " 无时间数据 "; + } + + public static String calculateDaysBetween(Object param1, Object param2) { + if (param1 == null || param2 == null) { + return null; + } + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + Date date1 = sdf.parse(String.valueOf(param1)); + Date date2 = sdf.parse(String.valueOf(param2)); + LocalDateTime dateTime1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime dateTime2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime nextDay = dateTime1.plusDays(1); + long daysBetween = ChronoUnit.DAYS.between(nextDay, dateTime2); + return String.valueOf(daysBetween); + } catch (Exception e) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + Date date1 = sdf.parse(String.valueOf(param1)); + Date date2 = sdf.parse(String.valueOf(param2)); + LocalDateTime dateTime1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime dateTime2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime nextDay = dateTime1.plusDays(1); + long daysBetween = ChronoUnit.DAYS.between(nextDay, dateTime2); + return String.valueOf(daysBetween); + } catch (Exception ex) { + ex.printStackTrace(); + return null; + } + } + } + + public static String calculateMinutesBetween(Object param1, Object param2) { + if (param1 == null || param2 == null) { + return " 无时间数据 "; + } + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + Date date1 = sdf.parse(String.valueOf(param1)); + Date date2 = sdf.parse(String.valueOf(param2)); + LocalDateTime dateTime1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime dateTime2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + long totalMillis = ChronoUnit.MILLIS.between(dateTime1, dateTime2); + long days = totalMillis / (1000 * 60 * 60 * 24); + long hours = (totalMillis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); + long minutes = (totalMillis % (1000 * 60 * 60)) / (1000 * 60); + return days + "天" + hours + "时" + minutes + "分"; + } catch (Exception e) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + Date date1 = sdf.parse(String.valueOf(param1)); + Date date2 = sdf.parse(String.valueOf(param2)); + LocalDateTime dateTime1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime dateTime2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + long totalMillis = ChronoUnit.MILLIS.between(dateTime1, dateTime2); + long days = totalMillis / (1000 * 60 * 60 * 24); + long hours = (totalMillis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); + long minutes = (totalMillis % (1000 * 60 * 60)) / (1000 * 60); + return days + "天" + hours + "时" + minutes + "分"; + } catch (Exception ex) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + Date date1 = sdf.parse(String.valueOf(param1)); + Date date2 = sdf.parse(String.valueOf(param2)); + LocalDateTime dateTime1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime dateTime2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + long totalMillis = ChronoUnit.MILLIS.between(dateTime1, dateTime2); + long days = totalMillis / (1000 * 60 * 60 * 24); + long hours = (totalMillis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); + long minutes = (totalMillis % (1000 * 60 * 60)) / (1000 * 60); + return days + "天" + hours + "时" + minutes + "分"; + } catch (Exception exx) { + ex.printStackTrace(); + return " 无时间数据 "; + } + } + } + } + + public static String generateNewSql(String originalSql, List uniqueKeys, Integer modelId) { + Pattern tablePattern = Pattern.compile("FROM\\s+(\\w+)", Pattern.CASE_INSENSITIVE); + Matcher tableMatcher = tablePattern.matcher(originalSql); + String tableName = ""; + if (tableMatcher.find()) { + tableName = tableMatcher.group(1); + } + String originalFieldName = getKeyFieldName(originalSql); + // 接警单号关联反馈单警员 + if (modelId == 24 || modelId == 27 || modelId == 28 || modelId == 29 || modelId == 30) { + return "SELECT a.*, b.fkrbh, b.fkrxm FROM " + tableName + " a left join dwd_asj_zhtx_fkd b on a.jjdbh = b.jjdbh " + "WHERE a." + originalFieldName + " IN " + "(" + uniqueKeys.stream().map(k -> "'" + k + "'").collect(Collectors.joining(",")) + ");"; + } + if (modelId == 101) { + return "SELECT * FROM " + tableName + " a join dwd_ry_jgzhxt_zyryxx b on a.ZHENGJIANHAOMA = b.idcard_no " + "WHERE a." + originalFieldName + " IN " + "(" + uniqueKeys.stream().map(k -> "'" + k + "'").collect(Collectors.joining(",")) + ") AND b.come_date > '2024-10-01 00:00:00';"; + } + return "SELECT * FROM " + tableName + " " + "WHERE " + originalFieldName + " IN " + "(" + uniqueKeys.stream().map(k -> "'" + k + "'").collect(Collectors.joining(",")) + ");"; + } + + private static String getKeyFieldName(String originalSql) { + String patternString = "SELECT\\s+(\\w+)\\s+AS\\s+" + Pattern.quote("uniqueKey"); + Pattern uniqueKeyPattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE); + Matcher uniqueKeyMatcher = uniqueKeyPattern.matcher(originalSql); + String originalFieldName = ""; + if (uniqueKeyMatcher.find()) { + originalFieldName = uniqueKeyMatcher.group(1); + } + if (originalFieldName.isEmpty()) { + throw new RuntimeException("未找到唯一键字段名"); + } + return originalFieldName; + } + + public static String formatStringDate(String date) { + DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + try { + DateTimeFormatter inputFormatterWithSeconds = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + LocalDateTime dateTime = LocalDateTime.parse(date, inputFormatterWithSeconds); + return dateTime.format(outputFormatter); + } catch (Exception e) { + try { + DateTimeFormatter inputFormatterWithMinutes = DateTimeFormatter.ofPattern("yyyyMMddHHmm"); + LocalDateTime dateTime = LocalDateTime.parse(date, inputFormatterWithMinutes); + return dateTime.withSecond(0).format(outputFormatter); + } catch (Exception ex) { + log.info("日期转换异常", ex); + } + } + return " 无时间数据 "; + } + + public static List parseSqlForModel2(String param) { + List result = new ArrayList<>(); + String date1 = param.substring(0, 8); + String date2 = param.substring(8, 16); + String formattedDate1 = date1.substring(0, 4) + "-" + date1.substring(4, 6) + "-" + date1.substring(6, 8); + String formattedDate2 = date2.substring(0, 4) + "-" + date2.substring(4, 6) + "-" + date2.substring(6, 8); + result.add(formattedDate1); + result.add(formattedDate2); + return result; + } + + private static String summarizeAttribute(Map data, String jqxz) { + try { + String substring = String.valueOf(data.get("jqxzdm")).substring(0, 2); + if (substring.equals("01")) { + jqxz = "刑事"; + } else if (substring.equals("02")) { + jqxz = "行政"; + } + } catch (Exception e) { + System.out.println("警情性质转换失败" + e); + } + return jqxz; + } + + public static String convertToPercentString(BigDecimal value) { + DecimalFormat decimalFormat = new DecimalFormat("0.0"); + return decimalFormat.format(value.multiply(new BigDecimal("100"))) + "%"; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c22c243..cff040e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -54,6 +54,18 @@ spring: max-lifetime: 30000 connection-timeout: 30000 connection-test-query: SELECT 1 + dm: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: dm.jdbc.driver.DmDriver + jdbc-url: jdbc:dm://65.47.22.243:5236?SCHEMA=JSDZ_4GDB + username: DCZD + password: DCZD@2024 + hikari: + minimum-idle: 5 + idle-timeout: 30000 + max-lifetime: 30000 + connection-timeout: 30000 + connection-test-query: SELECT 1 data: redis: host: 65.47.6.109 diff --git a/src/main/resources/mapper/mine/ModelClueMapper.xml b/src/main/resources/mapper/mine/ModelClueMapper.xml new file mode 100644 index 0000000..cd6bc33 --- /dev/null +++ b/src/main/resources/mapper/mine/ModelClueMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + UPDATE model_clue SET involve_depart_id = #{newDepartId} WHERE id = #{id} + + + + \ No newline at end of file