package com.mosty.yjzl.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mosty.base.model.BasePage;
import com.mosty.base.model.dto.qwzx.TbQwXfbbQueryByJlDto;
import com.mosty.base.model.dto.yjzl.TbZlxxInsertDto;
import com.mosty.base.model.dto.yjzl.TbZlxxZxrDtoInsertDto;
import com.mosty.base.model.dto.yszx.TbYsSxtDto;
import com.mosty.base.model.entity.lzother.TAlarmYjgj;
import com.mosty.base.model.entity.qwzx.TbQwXfbb;
import com.mosty.base.model.entity.yjzl.*;
import com.mosty.base.model.entity.yszx.TbYsDl;
import com.mosty.base.model.query.base.SysDeptQuery;
import com.mosty.base.model.query.yszx.TbYsSxtPageOneQuery;
import com.mosty.base.model.vo.base.DeptInfoVo;
import com.mosty.base.model.vo.yjzl.TbYjmxAllVo;
import com.mosty.base.model.vo.yjzl.TbYjmxCsbVo;
import com.mosty.base.model.vo.yszx.TbYsDlDto;
import com.mosty.base.utils.*;
import com.mosty.common.core.business.entity.SysDept;
import com.mosty.common.redis.service.RedisService;
import com.mosty.yjzl.mapper.*;
import com.mosty.yjzl.remote.TbBaseAdaptRemoteService;
import com.mosty.yjzl.remote.TbQwzxAdaptRemoteService;
import com.mosty.yjzl.remote.TbRwzxAdaptRemoteService;
import com.mosty.yjzl.remote.TbYszxAdaptRemoteService;
import com.mosty.yjzl.service.TbYjmxService;
import com.mosty.yjzl.service.TbYjxxLzService;
import com.mosty.yjzl.service.TbZlxxService;
import io.lettuce.core.GeoCoordinates;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.*;
import java.util.stream.Collectors;

@Slf4j
@Service
@AllArgsConstructor
public class TbYjxxLzServiceImpl extends ServiceImpl<TbYjxxMapper, TbYjxx>
        implements TbYjxxLzService {

    private final TbBaseAdaptRemoteService tbBaseAdaptRemoteService;
    private final TbYszxAdaptRemoteService tbYszxAdaptRemoteService;
    private final TbQwzxAdaptRemoteService tbQwzxAdaptRemoteService;
    private final TbRwzxAdaptRemoteService tbRwzxAdaptRemoteService;
    private final TbYjxxRyMapper tbYjxxRyMapper;
    private final TbYjxxRyBqMapper tbYjxxRyBqMapper;
    private final TbYjxxMxyjMapper tbYjxxMxyjMapper;
    private final RedisService redisService;
    private final TbYjmxService tbYjmxService;
    private final TbYjmxMapper tbYjmxMapper;
    private final TbZlxxService tbZlxxService;
    private final TbZlxxMapper tbZlxxMapper;
    private final TbZlxxZxjlMapper tbZlxxZxjlMapper;
    private final TbZlxxZxrMapper tbZlxxZxrMapper;


    // 网吧
    private final String[] wbList = new String[]{"网吧上网人员", "本地网吧上网人员"};
    // 网吧
    private final String[] ldList = new String[]{"国内旅客"};
    // 感知源
    private final String[] gayyjlxList = new String[]{"依图人脸", "依图人像",
            "海康卡口", "以萨卡口", "交警卡口", "铁路进站卡口", "云城围栏", "先创超级围栏", "先创电子围栏", "电子围栏",
            "泸州先创电子围栏", "电围", "WIFI探针", "WIFI审计", "WIFI安全审计", "泸州云蝠WIFI", "先创IMEIIMSI",
            "中电IMSI", "电围"};
    // 客运
    private final String[] kyList = new String[]{"客运汽车订票", "新东盛泸州客运汽车检票",
            "新东盛泸州客运汽车订票", "本地客运汽车订票", "新东盛客运汽车检票", "新东盛客运汽车订票"};
    // 客运
    private final String[] mhList = new String[]{"民航进港", "民航机场安检1", "民航订票", "民航机场安检2"};
    // 火车
    private final String[] hcList = new String[]{"火车订票"};

    @Override
    public void addYjxx(TAlarmYjgj gl) {
        try {
            long time = new Date().getTime();
            TbYjxx item = this.baseMapper.selectById(gl.getId());
            if (item != null) return;
            item = this.baseMapper.selectOne(
                    new LambdaQueryWrapper<TbYjxx>()
                            .eq(TbYjxx::getXtSjzt, "1")
                            .eq(TbYjxx::getYjRysfzh, gl.getGlsfzh())
                            .eq(TbYjxx::getYjFssj, gl.getYjsj())
                            .last(" limit 1")
            );
            // 如果人员细类不存在，则添加新得人员细类
            if (item != null) {
                if (StringUtils.isNotBlank(item.getYjbqmc()) && item.getYjbqmc().equals(gl.getRyxl())) {
                    item.setYjbqmc(item.getYjbqmc() + "、" + gl.getRyxl());
                    this.baseMapper.updateEntity(item);
                }
                return;
            }
            // 需要添加感知源到要素中
            this.addGzyToYs(gl);
            item = new TbYjxx();
            item.setId(gl.getId());
            item.setYjLylx("01");
            item.setYjLx("1");
            item.setYjFsnf(Integer.valueOf(DateUtils.getQueryDateString(gl.getYjsj(), "13")));
            item.setYjFsyf(Integer.valueOf(DateUtils.getQueryDateString(gl.getYjsj(), "14")));
            item.setYjFsny(Integer.valueOf(DateUtils.getQueryDateString(gl.getYjsj(), "15")));
            Calendar ca = Calendar.getInstance();
            ca.setTime(gl.getYjsj());
            int yjfszs = ca.get(Calendar.WEEK_OF_YEAR);
            item.setYjFszs(yjfszs);
            item.setYjGzymc(gl.getHdfsdd());
            item.setYjFsxs(Integer.valueOf(DateUtils.getQueryDateString(gl.getYjsj(), "16")));
            item.setYjFsrq(gl.getYjsj());
            item.setYjFssj(gl.getYjsj());
            item.setYjSj(gl.getYjsj());
            item.setSfFszl("0");
            item.setBz(gl.getId());
            String yjdj;
            switch (gl.getYjlyjb()) {
                case "10":
                    yjdj = "10";
                    break;
                case "20":
                    yjdj = "30";
                    break;
                case "30":
                    yjdj = "40";
                    break;
                case "15":
                    yjdj = "20";
                    break;
                default:
                    yjdj = "40";
                    break;
            }
            item.setYjJb(yjdj);
            item.setYjBt((StringUtils.isNotBlank(gl.getRyxl()) ? gl.getRyxl() : "")
                    + ((StringUtils.isNotBlank(gl.getRyxl()) && gl.getRyxl().contains("人员")) ? "" : "人员") +
                    gl.getGlxm() + "（" + gl.getGlsfzh() + "）预警");
            item.setYjNr(gl.getHdxq());
            int yjcs = 0;
            yjcs = this.baseMapper.countBySfzhOrCph(gl.getGlsfzh(), null);
            int yjjrcs = 0;
            yjjrcs = this.baseMapper.countCurrentBySfzhOrCph(gl.getGlsfzh(), null);
            yjcs = yjcs + 1;
            yjjrcs = yjjrcs + 1;
            item.setYjCs(yjcs);
            item.setYjJrcs(yjjrcs);
            item.setJd(gl.getHdjd());
            item.setWd(gl.getHdwd());
            if (!Kit.checkJwd(item.getJd(), item.getWd())) return;
            item.setYjDzXzqh(StringUtils.isNotBlank(gl.getSqrdwdh()) ? gl.getSqrdwdh().substring(0, 6) : null);
            item.setYjDz(gl.getHdfsdd());
            item.setYjRyxm(gl.getGlxm());
            item.setYjRysfzh(gl.getGlsfzh());
            if (gl.getYjly() == 2) {
                item.setYjClcph(gl.getGlqthm());
            }
            this.saveYjbq(item, gl.getRyxl());
            String picUrls = gl.getPicurls();
            if (StringUtils.isNotBlank(picUrls)) {
                String[] urls = picUrls.split(",");
                item.setYjTp(urls[0]);
                if (urls.length == 2) {
                    item.setYjXtp(urls[1]);
                }
            }
            // 从预警内容中读取相似度
            this.setXsd(item);
            item.setYjlyid("01");
            item.setYjlyBqmc("拓尔思重点人员库");
            // 查询所属辖区信息
            String orgcode = this.getOrgcode(gl);
            if (StringUtils.isBlank(orgcode)) {
                orgcode = "510500000000";
            }
            if (StringUtils.isNotBlank(orgcode)) {
                DeptInfoVo dept = this.tbBaseAdaptRemoteService.getOrgByOrgcode(orgcode);
                if (dept != null) {
                    item.setSsbm(dept.getDeptname());
                    item.setSsbmid(dept.getDeptid());
                    item.setSsbmdm(dept.getDeptcode());
                    item.setSsxgajdm(dept.getFxjcode());
                    item.setSsxgajid(dept.getFxjid());
                    item.setSsxgaj(dept.getFxjname());
                    item.setSssgaj(dept.getDszname());
                    item.setSssgajdm(dept.getDszcode());
                    item.setSssgajid(dept.getDszid());
                }
            }
            item.setXtSjly("1");
            // 判断是否发送指令(所有感知源感知的在逃人员，发送给就近1公里的巡组（感知源所属分局）和感知源管辖分局巡警大队)
            this.sendZl(item);
            this.baseMapper.insertEntity(item);

            // 添加预警人员
            this.addYjxxRy(item);
            if (StringUtils.isNotBlank(item.getYjbqmc()) && item.getYjbqmc().contains("窃")) {
                // 计算扒窃人员模型预警，同一感知源设置时间段内出现多个扒窃人员
                this.checkMxyj(item);
                // 计算感知源设置距离范围内的扒窃人员预警次数超过多少次
                this.checkMxyj2(item);
            }
            if (StringUtils.isNotBlank(item.getYjbqmc()) && (item.getYjbqmc().contains("稳") || item.getYjbqmc().contains("访"))) {
                // 同一感知源设置时间内涩稳人员超过设置次数（至少为设置人次及以上）
                this.checkMxyj3(item);
            }
            // 旅店、网吧、依图人脸（人像）感知的前科，
            // 涉赌人员（人员细类代码为03,04,05开头的）
            // 放入redis中，方便巡组获取数据发送指令
            // 须经纬度合法
            // 预警地址为酒店、网吧、依图的
            String[] bq = new String[]{"国内旅客", "本地网吧上网人员", "依图人脸", "依图人像", "国内旅客"};
            if (item.getJd() != null && item.getWd() != null && item.getJd().doubleValue() != 0.0 && item.getWd().doubleValue() != 0.0
                    && StringUtils.isNotBlank(gl.getRyxlDm()) && ("03".equals(gl.getRyxlDm().substring(0, 2))
                    || "04".equals(gl.getRyxlDm().substring(0, 2)) || "05".equals(gl.getRyxlDm().substring(0, 2))) &&
                    StringUtils.isNotBlank(gl.getHdlybcn()) && Arrays.asList(bq).contains(gl.getHdlybcn())) {
                String key = Constant.LZYJ_DATA_QKSD;
                this.setYjxxToRedis(item, key);
            }
            long time1 = new Date().getTime();
//            System.out.println("计算模型时间结束---->" + (time1 - time));
        } catch (Exception e) {
            log.error("添加泸州拓尔思预警信息失败ServerImpl---> responseResult = {}", e.getMessage());
        }
    }

    @Override
    public IPage<TbYjxxMxyj> querYjmx(BasePage basePage, String ssbmdm) {
        IPage<TbYjxxMxyj> voIPage = new Page<>(basePage.getPageCurrent(), basePage.getPageSize());
        return this.tbYjxxMxyjMapper.selectPage(voIPage, new LambdaQueryWrapper<TbYjxxMxyj>()
                .likeRight(StringUtils.isNotBlank(ssbmdm), TbYjxxMxyj::getSsbmdm, ssbmdm)
                .orderByDesc(TbYjxxMxyj::getYjSj));
    }

    // 从预警内容中读取相似度
    private void setXsd(TbYjxx item) {
        if (StringUtils.isNotBlank(item.getYjNr()) && item.getYjNr().contains("相似度:")) {
            String xsd = item.getYjNr().substring(item.getYjNr().indexOf("相似度:") + 4, item.getYjNr().indexOf("相似度:") + 10);
            if (Kit.isNumber(xsd)) {
                item.setXsd(new BigDecimal(xsd));
            }
        }
    }

    // 发送模型预警指令
    private void sendMxZl(TbYjxxMxyj mxyj, TbYjxx mxYjxx, TbYjxx currentYj) {
        // 经纬度合法
        if (mxyj.getJd() != null && mxyj.getWd() != null && mxyj.getJd().doubleValue() != 0.0
                && mxyj.getWd().doubleValue() != 0.0 && !Kit.checkJwd(mxyj.getJd(), mxyj.getWd())) {
            // 查询是否有该预警已经生成的指令信息
            TbZlxx zlxx = this.checkMxyjZl(mxYjxx, currentYj);
            if (zlxx != null) return;
            // 查询周边最近巡组
            TbQwXfbbQueryByJlDto dto = new TbQwXfbbQueryByJlDto();
            dto.setJd(mxyj.getJd());
            dto.setWd(mxyj.getWd());
            dto.setRadius(new BigDecimal("500"));
            dto.setSsbmid(mxyj.getSsxgajid());
            TbQwXfbb bb = this.tbQwzxAdaptRemoteService.getBbxxByJi(dto);
            TbZlxxInsertDto zl = new TbZlxxInsertDto();
            zl.setId(UUIDGenerator.getUUID()).setYwId(mxyj.getId()).setZllx("02").setZlly("02").setZlzxlx("1")
                    .setZlbt("请核查" + mxyj.getYjBt()).setZlnr(mxyj.getYjNr() + "请核查！")
                    .setZldj(mxyj.getYjJb()).setJd(mxyj.getJd()).setWd(mxyj.getWd()).setZlfsddxzqh(mxyj.getYjDzXzqh())
                    .setZlfsdd(mxyj.getYjDz());
            if (bb != null) {
                mxyj.setSfFszl("1");
                mxYjxx.setSfFszl("1");
                zl.setZljsdx("03");
                zl.setSsbmid(bb.getSsbmid());
                List<TbZlxxZxrDtoInsertDto> zxrDtoList = new ArrayList<>();
                TbZlxxZxrDtoInsertDto zxr = new TbZlxxZxrDtoInsertDto();
                zxr.setZlId(zl.getId()).setZxrLx("03").setZxrXzid(bb.getId());
                zxrDtoList.add(zxr);
                mxyj.setBz("范围内500米查询到巡组《" + bb.getJzMc() + "》，已下发");
                zl.setZxrDtoList(zxrDtoList);
                this.tbZlxxService.addZl(zl);
                mxyj.setSfFszl("1");
            }
            // 下发所属县局巡警大队、特警支队
            if (StringUtils.isNotBlank(mxyj.getSsxgajdm())) {
                SysDeptQuery deptQuery = new SysDeptQuery();
                deptQuery.setOrgBizTypes("03");
                deptQuery.setOrgLevels("21,31");
                List<SysDept> xjdd = this.tbBaseAdaptRemoteService.getOrg(deptQuery);
                if (!CollectionUtils.isEmpty(xjdd)) {
                    zl.setZljsdx("02");
                    zl.setSsbmid(String.valueOf(xjdd.get(0).getId()));
                    List<TbZlxxZxrDtoInsertDto> zxrDtoList = new ArrayList<>();
                    xjdd.forEach(xj -> {
                        TbZlxxZxrDtoInsertDto zxr = new TbZlxxZxrDtoInsertDto();
                        zxr.setZlId(zl.getId()).setZxrLx("02").setSsbmid(String.valueOf(xj.getId()));
                        zxrDtoList.add(zxr);
                    });
                    zl.setZxrDtoList(zxrDtoList);
                    this.tbZlxxService.addZl(zl);
                    mxyj.setSfFszl("1");
                    mxYjxx.setSfFszl("1");
                }
            }
        }
    }

    // 查询该模型预警的指令信息
    private TbZlxx checkMxyjZl(TbYjxx yjxx, TbYjxx currentYj) {
        TbZlxx zlxx = this.tbZlxxMapper.selectOne(
                new LambdaQueryWrapper<TbZlxx>()
                        .eq(TbZlxx::getYwId, yjxx.getId())
                        .eq(TbZlxx::getXtSjzt, "1")
                        .last(" limit 1")
        );
        if (zlxx != null) {
            // 添加指令执行记录
            this.addZxjl(zlxx, currentYj);
            // 修改旧的执行人的任务内容
            this.tbRwzxAdaptRemoteService.changeTaskStateByZlid(zlxx);
            // 修改指令内容
            zlxx.setZlbt(yjxx.getYjBt() + " 请核查！");
            zlxx.setZlnr(yjxx.getYjNr() + " 请核查！");
            this.tbZlxxMapper.updateEntity(zlxx);
            // 修改指令接收人内容
            List<TbZlxxZxr> zxrList = this.tbZlxxZxrMapper.selectList(
                    new LambdaQueryWrapper<TbZlxxZxr>()
                            .eq(TbZlxxZxr::getZlId, zlxx.getId())
            );
            zxrList.forEach(item -> {
                item.setZlbt(yjxx.getYjBt() + " 请核查！");
                item.setZlnr(yjxx.getYjNr() + " 请核查！");
                this.tbZlxxZxrMapper.updateById(item);
            });
        }
        return zlxx;
    }

    // 给旧的指令信息推送新消息
    private void addZxjl(TbZlxx zl, TbYjxx currentYj) {
        TbZlxxZxjl zxjl = new TbZlxxZxjl();
        zxjl.setId(UUIDGenerator.getUUID());
        zxjl.setZlId(zl.getId());
        zxjl.setZlzxddXzqhdm(zl.getZlfsddxzqh());
        zxjl.setZlzxdd(zl.getZlfsdd());
        zxjl.setZxsj(new Date());
        zxjl.setZlzxzt("05");
        zxjl.setZxnr(String.format("%s,%s《%s》已到达《%s》，请知晓！！",
                DateUtils.getQueryDateString(currentYj.getYjSj(), "02"),
                currentYj.getYjbqmc(), currentYj.getYjRyxm(), currentYj.getYjDz()));
        if (currentYj.getJd() != null && currentYj.getWd() != null) {
            zxjl.setJd(currentYj.getJd());
            zxjl.setWd(currentYj.getWd());
            zxjl.setZb(JtsUtils.getPoint(currentYj.getJd(), currentYj.getWd()));
            zxjl.setZbhash(GeoHashKit.encode(currentYj.getJd(), currentYj.getWd()));
        }
        zxjl.setZlzxrId("-1");
        zxjl.setZlzxrSfz("000000");
        zxjl.setZlzxrXm("系统");
        zxjl.setZlzxdd(currentYj.getYjDz());
        zxjl.setXtSjly("1");
        zxjl.setId(UUIDGenerator.getUUID());
        this.tbZlxxZxjlMapper.insertEntity(zxjl);
    }

    // 所有感知源感知的在逃人员，发送给就近1公里的巡组（感知源所属分局）和感知源管辖分局巡警大队
    private void sendZl(TbYjxx yjxx) {
        // 在逃人员
        if (StringUtils.isNotBlank(yjxx.getYjbqmc()) && yjxx.getYjbqmc().contains("逃")) {
            // 经纬度合法
            if (yjxx.getJd() != null && yjxx.getWd() != null && yjxx.getJd().doubleValue() != 0.0
                    && yjxx.getWd().doubleValue() != 0.0 && !Kit.checkJwd(yjxx.getJd(), yjxx.getWd())) {
                // 下发巡组
                TbQwXfbbQueryByJlDto dto = new TbQwXfbbQueryByJlDto();
                dto.setJd(yjxx.getJd());
                dto.setWd(yjxx.getWd());
                dto.setRadius(new BigDecimal("500"));
                dto.setSsbmid(yjxx.getSsxgajid());
                TbQwXfbb bb = this.tbQwzxAdaptRemoteService.getBbxxByJi(dto);
                TbZlxxInsertDto zl = new TbZlxxInsertDto();
                zl.setId(UUIDGenerator.getUUID()).setYwId(yjxx.getId()).setZllx("02").setZlly("02").setZlzxlx("1")
                        .setZlbt("请核查" + yjxx.getYjBt()).setZlnr(yjxx.getYjNr() + "请核查！")
                        .setZldj(yjxx.getYjJb()).setJd(yjxx.getJd()).setWd(yjxx.getWd()).setZlfsddxzqh(yjxx.getYjDzXzqh())
                        .setZlfsdd(yjxx.getYjDz()).setZltp(yjxx.getYjTp());
                if (bb != null) {
                    yjxx.setSfFszl("1");
                    zl.setZljsdx("03");
                    zl.setSsbmid(bb.getSsbmid());
                    List<TbZlxxZxrDtoInsertDto> zxrDtoList = new ArrayList<>();
                    TbZlxxZxrDtoInsertDto zxr = new TbZlxxZxrDtoInsertDto();
                    zxr.setZlId(zl.getId()).setZxrLx("03").setZxrXzid(bb.getId());
                    zxrDtoList.add(zxr);
                    yjxx.setBz("范围内1000米查询到巡组《" + bb.getJzMc() + "》，已下发");
                    zl.setZxrDtoList(zxrDtoList);
                    this.tbZlxxService.addZl(zl);
                }
                // 下发所属县局巡警大队、特警支队
                if (StringUtils.isNotBlank(yjxx.getSsxgajdm())) {
                    SysDeptQuery deptQuery = new SysDeptQuery();
                    deptQuery.setOrgBizTypes("03");
                    deptQuery.setOrgLevels("21,31");
                    List<SysDept> xjdd = this.tbBaseAdaptRemoteService.getOrg(deptQuery);
                    if (!CollectionUtils.isEmpty(xjdd)) {
                        zl.setZljsdx("02");
                        zl.setSsbmid(String.valueOf(xjdd.get(0).getId()));
                        List<TbZlxxZxrDtoInsertDto> zxrDtoList = new ArrayList<>();
                        xjdd.forEach(xj -> {
                            TbZlxxZxrDtoInsertDto zxr = new TbZlxxZxrDtoInsertDto();
                            zxr.setZlId(zl.getId()).setZxrLx("02").setSsbmid(String.valueOf(xj.getId()));
                            zxrDtoList.add(zxr);
                        });
                        zl.setZxrDtoList(zxrDtoList);
                        this.tbZlxxService.addZl(zl);
                        yjxx.setSfFszl("1");
                    }
                }
            }
        }
    }

    // 查询预警所属辖区
    private String getOrgcode(TAlarmYjgj gl) {
        if (StringUtils.isNotBlank(gl.getLocalunitcode())) {
            return gl.getLocalunitcode();
        } else if (StringUtils.isEmpty(gl.getHdfsdd()) && Arrays.asList(this.gayyjlxList).contains(gl.getHdlybcn())) {
            TbYsSxtPageOneQuery dto = new TbYsSxtPageOneQuery();
            dto.setSbmc(gl.getHdfsdd());
            TbYsSxtDto sxt = this.tbYszxAdaptRemoteService.selectGzy(dto);
            if (sxt != null) return sxt.getSsbmdm();
            // 摄像头要素表
        } else if (Arrays.asList(this.wbList).contains(gl.getHdlybcn()) ||
                Arrays.asList(this.ldList).contains(gl.getHdlybcn()) ||
                Arrays.asList(this.kyList).contains(gl.getHdlybcn()) ||
                Arrays.asList(this.hcList).contains(gl.getHdlybcn()) ||
                Arrays.asList(this.mhList).contains(gl.getHdlybcn())
        ) {
            TbYsDl dl = this.tbYszxAdaptRemoteService.selectDlys(gl.getHdfsdd());
            if (dl != null) return dl.getSsbmdm();
        } else if (StringUtils.isNotBlank(gl.getSqrdwdh())) {
            return gl.getSqrdwdh();
        }
        return null;
    }

    // 需要添加感知源到要素中
    private void addGzyToYs(TAlarmYjgj gl) {
        String ysdl, yszl, ysxl;
        if (Arrays.asList(this.gayyjlxList).contains(gl.getHdlybcn())) {
//            this.addGzy(gl);
        } else if (Arrays.asList(this.wbList).contains(gl.getHdlybcn())) {
            ysdl = "002";
            yszl = "002001";
            ysxl = "002001001";
            this.addDlys(gl, ysdl, yszl, ysxl);
        } else if (Arrays.asList(this.ldList).contains(gl.getHdlybcn())) {
            ysdl = "002";
            yszl = "002001";
            ysxl = "002001003";
            if (gl.getHdlybcn().contains("洗") || gl.getHdlybcn().contains("浴") || gl.getHdlybcn().contains("足")) {
                ysxl = "002001002";
            }
            this.addDlys(gl, ysdl, yszl, ysxl);
        } else if (Arrays.asList(this.kyList).contains(gl.getHdlybcn())) {
            ysdl = "002";
            yszl = "002002";
            ysxl = "002002001";
            this.addDlys(gl, ysdl, yszl, ysxl);
        } else if (Arrays.asList(this.hcList).contains(gl.getHdlybcn())) {
            ysdl = "002";
            yszl = "002002";
            ysxl = "002002003";
            this.addDlys(gl, ysdl, yszl, ysxl);
        } else if (Arrays.asList(this.mhList).contains(gl.getHdlybcn())) {
            ysdl = "002";
            yszl = "002002";
            ysxl = "002002002";
            this.addDlys(gl, ysdl, yszl, ysxl);
        }
    }

    private void checkMxyj3(TbYjxx item) {
        if (item.getJd() != null && item.getWd() != null && StringUtils.isNotBlank(item.getYjbqmc()) &&
                (item.getYjbqmc().contains("稳") || item.getYjbqmc().contains("访"))
                && StringUtils.isNotBlank(item.getYjGzymc()) && !"不详".equals(item.getYjGzymc())
                && !"未知".equals(item.getYjGzymc())
                && item.getJd().doubleValue() != 0.0 && item.getWd().doubleValue() != 0.0) {
            // 查询预警模型
            TbYjmxAllVo mx = this.tbYjmxService.getMxCs("mx003");
            if (mx == null || "02".equals(mx.getMxzt())) return;
            TbYjmx mxItem = this.tbYjmxMapper.selectById(mx.getId());
            mxItem.setYxcs(mxItem.getYxcs() + 1);
            // TODO 详细判断一下预警辖区
            // if (mx.getSsbmdm().equals("")) return;
            // 查询同一感知源5分钟内的涉稳人员预警超过两个的
            // 时间范围
            List<TbYjmxCsbVo> csVo = mx.getCsList().stream().filter(cs -> "TIME".equals(cs.getCsdm())).collect(Collectors.toList());
            int M = 0;
            if (csVo.size() == 1) {
                M = Integer.parseInt(csVo.get(0).getCsz());
            }
            if (M == 0) return;
            // 次数
            csVo = mx.getCsList().stream().filter(cs -> "YJCS".equals(cs.getCsdm())).collect(Collectors.toList());
            int yjcs = 0;
            if (csVo.size() == 1) {
                yjcs = Integer.parseInt(csVo.get(0).getCsz());
            }
            if (yjcs == 0) return;
            // 人数
            csVo = mx.getCsList().stream().filter(cs -> "YJRS".equals(cs.getCsdm())).collect(Collectors.toList());
            int yjrs = 0;
            if (csVo.size() == 1) {
                yjrs = Integer.parseInt(csVo.get(0).getCsz());
            }
            if (yjrs == 0) return;
            // 同一感知源设置时间内涩稳人员超过设置次数（至少为设置人次及以上）
            String key = Constant.LZYJ_DATA_SWRY;
            List<TbYjxx> yjxxList = redisService.getCacheList(key);
            if (!CollectionUtils.isEmpty(yjxxList)) {
                // 查询同一感知源得预警信息
                yjxxList = yjxxList.stream().filter(it -> {
                    if (StringUtils.isNotBlank(item.getYjGzyid())) {
                        return item.getYjGzyid().equals(it.getYjGzyid());
                    } else if (StringUtils.isNotBlank(item.getYjGzymc())) {
                        return item.getYjGzymc().equals(it.getYjGzymc());
                    }
                    return false;
                }).collect(Collectors.toList());
                // 查询设定时间内的预警信息
                int finalM = M;
                yjxxList = yjxxList.stream().filter(yj ->
                        item.getYjSj().getTime() - yj.getYjSj().getTime() <= finalM * 60 * 1000)
                        .collect(Collectors.toList());
                // 次数大于5次
                if (yjxxList.size() >= yjcs) {
                    // 判断人次，至少有2人
                    Set<String> set = yjxxList.stream().map(TbYjxx::getYjRysfzh).collect(Collectors.toSet());
                    if (set.size() >= yjrs) {
                        // 查询现有模型预警信息
                        // 先查询是否有相同人员的模型预警（预警时间之内的）
                        TbYjxxMxyj mxyj = this.tbYjxxMxyjMapper.selectOne(
                                new LambdaQueryWrapper<TbYjxxMxyj>()
                                        .eq(StringUtils.isNotBlank(item.getYjGzyid()), TbYjxxMxyj::getYjGzyid, item.getYjGzyid())
                                        .eq(StringUtils.isNotBlank(item.getYjGzymc()), TbYjxxMxyj::getYjGzymc, item.getYjGzymc())
                                        .eq(TbYjxxMxyj::getMxid, mx.getId())
                                        .ge(TbYjxxMxyj::getYjSj, DateUtils.getQueryDateString(
                                                DateUtils.getNextDate(item.getYjSj(), "m", -M), "02"))
                                        .le(TbYjxxMxyj::getYjSj, DateUtils.getQueryDateString(item.getYjSj(), "02"))
                                        .last(" limit 1")
                        );
                        TbYjxx yj;
                        if (mxyj == null) {
                            mxyj = new TbYjxxMxyj();
                            mxyj.setMxid(mx.getId());
                            yj = new TbYjxx();
                        } else {
                            yj = this.baseMapper.selectById(mxyj.getYjid());
                            if (yj == null) {
                                yj = new TbYjxx();
                            }
                        }
                        String oldYjid = yj.getId();
                        String oldMxyjId = mxyj.getId();
                        List<String> usernames = yjxxList.stream().map(it -> it.getYjRyxm() + "(" + it.getYjRysfzh() + ")")
                                .collect(Collectors.toList());
                        usernames.add(item.getYjRyxm() + "(" + item.getYjRysfzh() + ")");
                        String username = String.join("、", new HashSet<>(usernames));
                        String yjnr = yjxxList.stream().map(it -> String.format("涉稳人员%s于%s在%s出现",
                                it.getYjRyxm() + "(" + it.getYjRysfzh() + ")",
                                DateUtils.getQueryDateString(it.getYjFssj(), "02"),
                                it.getYjDz())).collect(Collectors.joining("、"));
                        yjnr += "、" + String.format("涉稳人员%s于%s在%s出现", item.getYjRyxm() + "(" + item.getYjRysfzh() + ")",
                                DateUtils.getQueryDateString(item.getYjFssj(), "02"),
                                item.getYjDz());
                        String yjid = yjxxList.stream().map(TbYjxx::getId).collect(Collectors.joining(","));
                        yjid += "," + item.getId();
                        // 生成新的模型预警
                        BeanUtils.copyProperties(item, yj);
                        yj.setId(oldYjid);
                        yj.setYjLylx("03");
                        yj.setYjLx("7");
                        Date time = item.getYjSj();
                        yj.setYjSj(time);
                        yj.setYjFsnf(Integer.valueOf(DateUtils.getQueryDateString(time, "13")));
                        yj.setYjFsyf(Integer.valueOf(DateUtils.getQueryDateString(time, "14")));
                        yj.setYjFsny(Integer.valueOf(DateUtils.getQueryDateString(time, "15")));
                        Calendar ca = Calendar.getInstance();
                        ca.setTime(time);
                        int yjfszs = ca.get(Calendar.WEEK_OF_YEAR);
                        yj.setYjFszs(yjfszs);
                        yj.setYjFsxs(Integer.valueOf(DateUtils.getQueryDateString(time, "16")));
                        yj.setYjFsrq(time);
                        yj.setYjFssj(time);
                        yj.setYjJb("10");
                        yj.setYjBt(String.format("涉稳人员%s于%s分钟内在%s依次出现。", username, M, yj.getYjGzymc()));
                        yj.setYjNr(yjnr);
                        yj.setYjCs(1);
                        yj.setYjJrcs(1);
                        yj.setYjRysfzh(null);
                        yj.setYjRyxm(null);
                        yj.setYjClcph(null);
                        yj.setYjbq("8");
                        yj.setYjbqmc("涉稳人员");
                        yj.setYjlyid("06");
                        yj.setYjlyBqmc("综合模型预警");
                        // 计算多个坐标的中心点
                        GeoCoordinates geo = this.getZxd(yjxxList);
                        yj.setJd(new BigDecimal(String.valueOf(geo.getX())));
                        yj.setWd(new BigDecimal(String.valueOf(geo.getY())));

                        if (StringUtils.isBlank(yj.getId())) {
                            yj.setId(UUIDGenerator.getUUID());

                            this.baseMapper.insertEntity(yj);
                        } else {


                            this.baseMapper.updateEntity(yj);
                        }
                        BeanUtils.copyProperties(yj, mxyj);
                        mxyj.setYjid(yj.getId());
                        mxyj.setYjids(yjid);
                        mxyj.setYjsl(yjxxList.size() + 1);
                        mxyj.setId(oldMxyjId);
                        // 添加模型预警子表
                        if (StringUtils.isBlank(mxyj.getId())) {
                            mxyj.setId(UUIDGenerator.getUUID());
                            this.tbYjxxMxyjMapper.insertEntity(mxyj);
                        } else {
                            this.tbYjxxMxyjMapper.updateEntity(mxyj);
                        }
                        mxItem.setYjcs(mxItem.getYjcs() + 1);
                        this.tbYjmxMapper.updateById(mxItem);
                        // 暂时不发送指令
                    }
                }
            }
            // 将有坐标的数据丢入redis中，方便计算预警模型
            this.setYjxxToRedis(item, Constant.LZYJ_DATA_SWRY);
            // 存入redis中的时候，坐标置空了，重新赋值
//            if (item.getJd() != null && item.getWd() != null) {
//                item.setZb(JtsUtils.getPoint(item.getJd(), item.getWd()));
//                item.setZbhash(GeoHashKit.encode(item.getJd(), item.getWd()));
//            }
        }
    }

    // 将数据放入redis中
    private void setYjxxToRedis(TbYjxx item, String key) {
        List<TbYjxx> redisYjxxList = redisService.getCacheList(key);
        if (redisYjxxList == null) {
            redisYjxxList = new ArrayList<>();
        }
        List<TbYjxx> tempList = redisYjxxList.stream().filter(it -> item.getId().equals(it.getId())).collect(Collectors.toList());
        if (tempList.size() > 0) return;
//        item.setZb(null);
        if (redisYjxxList.size() == 0) {
            redisYjxxList.add(item);
            redisService.setCacheList(key, redisYjxxList);
        } else {
            redisService.setCacheList(key, new ArrayList<TbYjxx>() {{
                this.add(item);
            }});
        }
    }

    private void checkMxyj2(TbYjxx item) {
        if (item.getJd() != null && item.getWd() != null && StringUtils.isNotBlank(item.getYjbqmc()) &&
                item.getYjbqmc().contains("窃") && StringUtils.isNotBlank(item.getYjGzymc()) && !"不详".equals(item.getYjGzymc())
                && !"未知".equals(item.getYjGzymc())
                && item.getJd().doubleValue() != 0.0 && item.getWd().doubleValue() != 0.0) {
            // 查询预警模型
            TbYjmxAllVo mx = this.tbYjmxService.getMxCs("mx002");
            if (mx == null || "02".equals(mx.getMxzt())) return;
            TbYjmx mxItem = this.tbYjmxMapper.selectById(mx.getId());
            mxItem.setYxcs(mxItem.getYxcs() + 1);
            // TODO 详细判断一下预警辖区
            // if (mx.getSsbmdm().equals("")) return;
            // 查询同一感知源5分钟内的扒窃人员预警超过两个的
            // 时间范围
            List<TbYjmxCsbVo> csVo = mx.getCsList().stream().filter(cs -> "TIME".equals(cs.getCsdm())).collect(Collectors.toList());
            int M = 0;
            if (csVo.size() == 1) {
                M = Integer.parseInt(csVo.get(0).getCsz());
            }
            if (M == 0) return;
            // 距离
            csVo = mx.getCsList().stream().filter(cs -> "JL".equals(cs.getCsdm())).collect(Collectors.toList());
            int jlfw = 0;
            if (csVo.size() == 1) {
                jlfw = Integer.parseInt(csVo.get(0).getCsz());
            }
            if (jlfw == 0) return;
            // 次数
            csVo = mx.getCsList().stream().filter(cs -> "YJCS".equals(cs.getCsdm())).collect(Collectors.toList());
            int yjcs = 0;
            if (csVo.size() == 1) {
                yjcs = Integer.parseInt(csVo.get(0).getCsz());
            }
            if (yjcs == 0) return;
            // 人数
            csVo = mx.getCsList().stream().filter(cs -> "YJRS".equals(cs.getCsdm())).collect(Collectors.toList());
            int yjrs = 0;
            if (csVo.size() == 1) {
                yjrs = Integer.parseInt(csVo.get(0).getCsz());
            }
            if (yjrs == 0) return;
            // 查询范围500米内出现的扒窃人员的数量超过5个，至少2人及以上
            String key = Constant.LZYJ_DATA_PQRY;
            List<TbYjxx> yjxxList = redisService.getCacheList(key);
            if (!CollectionUtils.isEmpty(yjxxList)) {
                // 查询设定时间内的预警信息
                int finalM = M;
                yjxxList = yjxxList.stream().filter(yj ->
                        item.getYjSj().getTime() - yj.getYjSj().getTime() <= finalM * 60 * 1000)
                        .collect(Collectors.toList());
                // 计算范围
                int finalJlfw = jlfw;
                yjxxList = yjxxList.stream().filter(yj -> {
                    double jl = Kit.getDistance(yj.getJd().doubleValue(), yj.getWd().doubleValue(),
                            item.getJd().doubleValue(), item.getWd().doubleValue());
                    if (jl < finalJlfw) {
                        yj.setDistance(new BigDecimal(String.valueOf(jl)));
                        return true;
                    }
                    return false;
                }).collect(Collectors.toList());
                // 次数大于5次
                if (yjxxList.size() >= yjcs) {
                    // 判断人次，至少有2人
                    Set<String> set = yjxxList.stream().map(TbYjxx::getYjRysfzh).collect(Collectors.toSet());
                    if (set.size() >= yjrs) {
                        // 查询现有模型预警信息
                        TbYjxxMxyj mxyj = this.tbYjxxMxyjMapper.selectbyMxId(DateUtils.getQueryDateString(
                                DateUtils.getNextDate(item.getYjSj(), "m", -M), "02"),
                                DateUtils.getQueryDateString(item.getYjSj(), "02"), jlfw, item.getJd(),
                                item.getWd(), mx.getId());
                        TbYjxx yj;
                        if (mxyj == null) {
                            mxyj = new TbYjxxMxyj();
                            mxyj.setMxid(mx.getId());
                            yj = new TbYjxx();
                        } else {
                            yj = this.baseMapper.selectById(mxyj.getYjid());
                            if (yj == null) {
                                yj = new TbYjxx();
                            }
                        }
                        String oldYjid = yj.getId();
                        String oldMxyjId = mxyj.getId();
                        List<String> usernames = yjxxList.stream().map(it -> it.getYjRyxm() + "(" + it.getYjRysfzh() + ")")
                                .collect(Collectors.toList());
                        usernames.add(item.getYjRyxm() + "(" + item.getYjRysfzh() + ")");
                        String username = String.join("、", new HashSet<>(usernames));
                        String yjnr = yjxxList.stream().map(it -> String.format("扒窃人员%s于%s在%s出现",
                                it.getYjRyxm() + "(" + it.getYjRysfzh() + ")",
                                DateUtils.getQueryDateString(it.getYjFssj(), "02"),
                                it.getYjDz())).collect(Collectors.joining("、"));
                        yjnr += "、" + String.format("扒窃人员%s于%s在%s出现", item.getYjRyxm() + "(" + item.getYjRysfzh() + ")",
                                DateUtils.getQueryDateString(item.getYjFssj(), "02"),
                                item.getYjDz());
                        String yjid = yjxxList.stream().map(TbYjxx::getId).collect(Collectors.joining(","));
                        yjid += "," + item.getId();
                        // 生成新的模型预警
                        BeanUtils.copyProperties(item, yj);
                        yj.setId(oldYjid);
                        yj.setYjLylx("03");
                        yj.setYjLx("7");
                        Date time = item.getYjSj();
                        yj.setYjSj(time);
                        yj.setYjFsnf(Integer.valueOf(DateUtils.getQueryDateString(time, "13")));
                        yj.setYjFsyf(Integer.valueOf(DateUtils.getQueryDateString(time, "14")));
                        yj.setYjFsny(Integer.valueOf(DateUtils.getQueryDateString(time, "15")));
                        Calendar ca = Calendar.getInstance();
                        ca.setTime(time);
                        int yjfszs = ca.get(Calendar.WEEK_OF_YEAR);
                        yj.setYjFszs(yjfszs);
                        yj.setYjFsxs(Integer.valueOf(DateUtils.getQueryDateString(time, "16")));
                        yj.setYjFsrq(time);
                        yj.setYjFssj(time);
                        yj.setYjJb("10");
                        yj.setYjBt(String.format("扒窃人员%s于%s分钟内在范围%s米区域内依次出现。", username, M, jlfw));
                        yj.setYjNr(yjnr);
                        yj.setYjCs(1);
                        yj.setYjJrcs(1);
                        yj.setYjRysfzh(null);
                        yj.setYjRyxm(null);
                        yj.setYjClcph(null);
                        yj.setYjbq("4");
                        yj.setYjbqmc("扒窃人员");
                        yj.setYjlyid("06");
                        yj.setYjlyBqmc("综合模型预警");
                        // 计算多个坐标的中心点
                        GeoCoordinates geo = this.getZxd(yjxxList);
                        yj.setJd(new BigDecimal(String.valueOf(geo.getX())));
                        yj.setWd(new BigDecimal(String.valueOf(geo.getY())));

                        // 发送指令或修改指令信息
                        this.sendMxZl(mxyj, yj, item);
                        BeanUtils.copyProperties(yj, mxyj);
                        mxyj.setYjid(yj.getId());
                        mxyj.setYjids(yjid);
                        mxyj.setYjsl(yjxxList.size() + 1);
                        mxyj.setId(oldMxyjId);
                        mxyj.setJl(jlfw);
                        if (StringUtils.isBlank(yj.getId())) {
                            yj.setId(UUIDGenerator.getUUID());

                            this.baseMapper.insertEntity(yj);
                        } else {

                            this.baseMapper.updateEntity(yj);
                        }
                        // 添加模型预警子表
                        if (StringUtils.isBlank(mxyj.getId())) {
                            mxyj.setId(UUIDGenerator.getUUID());
                            this.tbYjxxMxyjMapper.insertEntity(mxyj);
                        } else {
                            this.tbYjxxMxyjMapper.updateEntity(mxyj);
                        }
                        mxItem.setYjcs(mxItem.getYjcs() + 1);
                        this.tbYjmxMapper.updateById(mxItem);
                    }
                }
            }
            // 将有坐标的数据丢入redis中，方便计算预警模型
            this.setYjxxToRedis(item, Constant.LZYJ_DATA_PQRY);
            // 存入redis中的时候，坐标置空了，重新赋值
//            if (item.getJd() != null && item.getWd() != null) {
//                item.setZb(JtsUtils.getPoint(item.getJd(), item.getWd()));
//                item.setZbhash(GeoHashKit.encode(item.getJd(), item.getWd()));
//            }
        }
    }

    private GeoCoordinates getZxd(List<TbYjxx> yjxxList) {
        int total = yjxxList.size();
        double X = 0, Y = 0, Z = 0;
        for (TbYjxx yjxx : yjxxList) {
            double jd, wd, x, y, z;
            jd = yjxx.getJd().doubleValue() * Math.PI / 180;
            wd = yjxx.getWd().doubleValue() * Math.PI / 180;
            x = Math.cos(wd) * Math.cos(jd);
            y = Math.cos(wd) * Math.sin(jd);
            z = Math.sin(wd);
            X += x;
            Y += y;
            Z += z;
        }
        X = X / total;
        Y = Y / total;
        Z = Z / total;
        double jd = Math.atan2(Y, X);
        double Hyp = Math.sqrt(X * X + Y * Y);
        double wd = Math.atan2(Z, Hyp);
        return GeoCoordinates.create(jd * 180 / Math.PI, wd * 180 / Math.PI);
    }

    // 计算模型预警
    private void checkMxyj(TbYjxx item) {
        if (StringUtils.isBlank(item.getYjGzymc()) || "不详".equals(item.getYjGzymc())
                || "未知".equals(item.getYjGzymc())) return;
        TbYjmxAllVo mx = this.tbYjmxService.getMxCs("mx001");
        if (mx == null || "02".equals(mx.getMxzt())) return;
        TbYjmx mxItem = this.tbYjmxMapper.selectById(mx.getId());
        mxItem.setYxcs(mx.getYxcs() + 1);
        // TODO 详细判断一下预警辖区
        // if (mx.getSsbmdm().equals("")) return;
        // 查询同一感知源5分钟内的扒窃人员预警超过两个的
        List<TbYjmxCsbVo> csVo = mx.getCsList().stream().filter(cs -> "TIME".equals(cs.getCsdm())).collect(Collectors.toList());
        int M = 0;
        if (csVo.size() == 1) {
            M = Integer.parseInt(csVo.get(0).getCsz());
        }
        if (M == 0) return;
        // 预警人次获取
        int num = 0;
        csVo = mx.getCsList().stream().filter(cs -> "PERSON".equals(cs.getCsdm())).collect(Collectors.toList());
        if (csVo.size() == 1) {
            num = Integer.parseInt(csVo.get(0).getCsz());
        }
        if (num == 0) return;
        List<TbYjxx> yjxxList = this.baseMapper.selectList(
                new LambdaQueryWrapper<TbYjxx>()
                        .eq(StringUtils.isNotBlank(item.getYjGzyid()), TbYjxx::getYjGzyid, item.getYjGzyid())
                        .eq(TbYjxx::getYjGzymc, item.getYjGzymc())
                        .like(TbYjxx::getYjbqmc, "窃")
                        .ne(TbYjxx::getYjRysfzh, item.getYjRysfzh())
                        .le(TbYjxx::getYjSj, DateUtils.getQueryDateString(item.getYjSj(), "02"))
                        .ge(TbYjxx::getYjSj, DateUtils.getQueryDateString(
                                DateUtils.getNextDate(item.getYjSj(), "m", -M), "02"))
        );
        if (yjxxList != null && yjxxList.size() > 0) {
            // 先查询是否有相同人员的模型预警（预警时间之内的）
            TbYjxxMxyj mxyj = this.tbYjxxMxyjMapper.selectOne(
                    new LambdaQueryWrapper<TbYjxxMxyj>()
                            .eq(StringUtils.isNotBlank(item.getYjGzyid()), TbYjxxMxyj::getYjGzyid, item.getYjGzyid())
                            .eq(StringUtils.isNotBlank(item.getYjGzymc()), TbYjxxMxyj::getYjGzymc, item.getYjGzymc())
                            .eq(TbYjxxMxyj::getMxid, mx.getId())
                            .ge(TbYjxxMxyj::getYjSj, DateUtils.getQueryDateString(
                                    DateUtils.getNextDate(item.getYjSj(), "m", -M), "02"))
                            .le(TbYjxxMxyj::getYjSj, DateUtils.getQueryDateString(item.getYjSj(), "02"))
                            .last(" limit 1")
            );
            TbYjxx yj;
            if (mxyj == null) {
                mxyj = new TbYjxxMxyj();
                mxyj.setMxid(mx.getId());
                yj = new TbYjxx();
            } else {
                yj = this.baseMapper.selectById(mxyj.getYjid());
                if (yj == null) {
                    yj = new TbYjxx();
                }
            }
            String oldYjid = yj.getId();
            String oldMxyjId = mxyj.getId();
            String username = yjxxList.stream().map(it -> it.getYjRyxm() + "(" + it.getYjRysfzh() + ")")
                    .collect(Collectors.joining("、"));
            username += "、" + (item.getYjRyxm() + "(" + item.getYjRysfzh() + ")");
            String yjnr = yjxxList.stream().map(it -> String.format("扒窃人员%s于%s在%s出现", it.getYjRyxm() + "(" + it.getYjRysfzh() + ")",
                    DateUtils.getQueryDateString(it.getYjFssj(), "02"),
                    it.getYjDz())).collect(Collectors.joining("、"));
            yjnr += "、" + String.format("扒窃人员%s于%s在%s出现", item.getYjRyxm() + "(" + item.getYjRysfzh() + ")",
                    DateUtils.getQueryDateString(item.getYjFssj(), "02"),
                    item.getYjDz());
            String yjid = yjxxList.stream().map(TbYjxx::getId).collect(Collectors.joining(","));
            yjid += "," + item.getId();
            // 生成新的模型预警
            BeanUtils.copyProperties(item, yj);
            yj.setId(oldYjid);
            yj.setYjLylx("03");
            yj.setYjLx("7");
            Date time = item.getYjSj();
            yj.setYjSj(time);
            yj.setYjFsnf(Integer.valueOf(DateUtils.getQueryDateString(time, "13")));
            yj.setYjFsyf(Integer.valueOf(DateUtils.getQueryDateString(time, "14")));
            yj.setYjFsny(Integer.valueOf(DateUtils.getQueryDateString(time, "15")));
            Calendar ca = Calendar.getInstance();
            ca.setTime(time);
            int yjfszs = ca.get(Calendar.WEEK_OF_YEAR);
            yj.setYjFszs(yjfszs);
            yj.setYjFsxs(Integer.valueOf(DateUtils.getQueryDateString(time, "16")));
            yj.setYjFsrq(time);
            yj.setYjFssj(time);
            yj.setYjJb("10");
            yj.setYjBt(String.format("扒窃人员%s于%s在%s分钟内同时出现。", username, yj.getYjDz(), M));
            yj.setYjNr(yjnr);
            yj.setYjCs(1);
            yj.setYjJrcs(1);
            yj.setYjRysfzh(null);
            yj.setYjRyxm(null);
            yj.setYjClcph(null);
            yj.setYjbq("4");
            yj.setYjbqmc("扒窃人员");
            yj.setYjlyid("06");
            yj.setYjlyBqmc("综合模型预警");
            BeanUtils.copyProperties(yj, mxyj);
            mxyj.setYjid(yj.getId());
            mxyj.setYjids(yjid);
            mxyj.setYjsl(yjxxList.size() + 1);
            mxyj.setId(oldMxyjId);
            // 发送指令或修改指令信息
            this.sendMxZl(mxyj, yj, item);

            if (StringUtils.isBlank(yj.getId())) {
                yj.setId(UUIDGenerator.getUUID());

                this.baseMapper.insertEntity(yj);
            } else {

                this.baseMapper.updateEntity(yj);
            }
            // 添加模型预警子表
            if (StringUtils.isBlank(mxyj.getId())) {
                mxyj.setId(UUIDGenerator.getUUID());
                this.tbYjxxMxyjMapper.insertEntity(mxyj);
            } else {
                this.tbYjxxMxyjMapper.updateEntity(mxyj);
            }
            mxItem.setYjcs(mxItem.getYjcs() + 1);
            this.tbYjmxMapper.updateById(mxItem);
        }
    }

    // 添加网吧
    private void addDlys(TAlarmYjgj gl, String ysdl, String yszl, String ysxl) {
        if (StringUtils.isEmpty(gl.getHdfsdd())) return;
        // 查询网吧是否存在
        TbYsDl dl = this.tbYszxAdaptRemoteService.selectDlys(gl.getHdfsdd());
        if (dl != null) return;
        // 不存在就新增
        TbYsDlDto dto = new TbYsDlDto();
        if (!Kit.checkJwd(gl.getHdjd(), gl.getHdwd())) {
            dto.setJd(null);
            dto.setWd(null);
        } else {
            dto.setJd(gl.getHdjd());
            dto.setWd(gl.getHdwd());
        }
        dto.setYsdl(ysdl);
        dto.setYszl(yszl);
        dto.setYsxl(ysxl);
        dto.setYsmc(gl.getHdfsdd());
        dto.setYsjc(gl.getHdfsdd());
        dto.setYswzXzqh(StringUtils.isNotBlank(gl.getHdfsdqh()) ? gl.getHdfsdqh() : (
                StringUtils.isNotBlank(gl.getSqrdwdh()) ? gl.getSqrdwdh().substring(0, 6) : ""
        ));
        dto.setYswzBc(StringUtils.isEmpty(gl.getHdfsdxz()) ? gl.getHdfsdd() : gl.getHdfsdxz());
        dto.setYswzXz(StringUtils.isEmpty(gl.getHdfsdxz()) ? gl.getHdfsdd() : gl.getHdfsdxz());

        this.tbYszxAdaptRemoteService.addDlYs(dto);
    }

    // 添加到感知源表中
    private void addGzy(TAlarmYjgj gl) {
        if (StringUtils.isEmpty(gl.getHdfsdxz()) || gl.getHdjd() == null || gl.getHdwd() == null) return;
        TbYsSxtPageOneQuery dto = new TbYsSxtPageOneQuery();
        dto.setSbmc(gl.getHdfsdxz());
        dto.setJd(gl.getHdjd());
        dto.setWd(gl.getHdwd());
        TbYsSxtDto sxt = this.tbYszxAdaptRemoteService.selectGzy(dto);
        if (sxt == null) {
            sxt = new TbYsSxtDto();
            sxt.setSbmc(gl.getHdfsdxz());
            sxt.setJd(gl.getHdjd());
            sxt.setWd(gl.getHdwd());
            sxt.setDzmc(gl.getHdfsdxz());
            sxt.setSblx(this.setSblx(gl.getHdlybcn()));
            sxt.setXzqhdm(gl.getHdfsdqh());
            sxt.setSbzt("1");
            int a = this.tbYszxAdaptRemoteService.addSxt(sxt);
            System.err.println(String.format("添加成功%s个摄像头", a));
        }
    }

    // 计算设备类型
    private String setSblx(String ly) {
        if ("依图人脸".equals(ly) || "依图人像".equals(ly)) {
            return "03";
        } else if ("海康卡口".equals(ly) || "以萨卡口".equals(ly) || "交警卡口".equals(ly) || "铁路进站卡口".equals(ly)) {
            return "02";
        } else if ("云城围栏".equals(ly) || "先创超级围栏".equals(ly) || "先创电子围栏".equals(ly) || "电子围栏".equals(ly) ||
                "泸州先创电子围栏".equals(ly) || "电围".equals(ly)) {
            return "05";
        } else if ("WIFI探针".equals(ly) || "WIFI审计".equals(ly) || "WIFI安全审计".equals(ly) || "泸州云蝠WIFI".equals(ly)) {
            return "06";
        } else if ("先创IMEIIMSI".equals(ly) || "中电IMSI".equals(ly)) {
            return "07";
        }
        return null;
    }

    // 添加预警信息人员
    private void addYjxxRy(TbYjxx yjxx) {
        TbYjxxRy ryxx = new TbYjxxRy();
        ryxx.setId(UUIDGenerator.getUUID());
        ryxx.setYjId(yjxx.getId());
        ryxx.setYjGzyid(yjxx.getYjGzyid());
        ryxx.setYjGzymc(yjxx.getYjGzymc());
        ryxx.setYjFssj(yjxx.getYjFssj());
        ryxx.setYjSj(yjxx.getYjSj());
        ryxx.setYjJb(yjxx.getYjJb());
        ryxx.setYjBt(yjxx.getYjBt());
        ryxx.setYjNr(yjxx.getYjNr());
        ryxx.setYjDzxzqh(yjxx.getYjDzXzqh());
        ryxx.setYjlyBqmc(yjxx.getYjlyBqmc());
        ryxx.setYjZjlx("1");
        ryxx.setYjZjhm(yjxx.getYjRysfzh());
        ryxx.setYjRyxm(yjxx.getYjRyxm());
        ryxx.setYjRyxb(IDCardUtil.getSex(yjxx.getYjRysfzh()));
        ryxx.setYjRynl(IDCardUtil.getAge(yjxx.getYjRysfzh()));
        ryxx.setYjRyjg(yjxx.getYjDzXzqh());
        ryxx.setYjRyhjdXzqh(yjxx.getYjDzXzqh());
        ryxx.setYjDz(yjxx.getYjDz());
        ryxx.setTpId(yjxx.getYjTp());
        ryxx.setJd(yjxx.getJd());
        ryxx.setWd(yjxx.getWd());
//        if (ryxx.getJd() != null && ryxx.getWd() != null) {
//            ryxx.setZb(yjxx.getZb());
//            ryxx.setZbhash(yjxx.getZbhash());
//        }
        ryxx.setYjRybq(yjxx.getYjbq());
        ryxx.setYjRybqmc(yjxx.getYjbqmc());
        ryxx.setSsbm(yjxx.getSsbm());
        ryxx.setSsbmid(yjxx.getSsbmid());
        ryxx.setSsxgajid(yjxx.getSsxgajid());
        ryxx.setSssgajid(yjxx.getSssgajid());
        ryxx.setSsbmdm(yjxx.getSsbmdm());
        ryxx.setSsxgaj(yjxx.getSsxgaj());
        ryxx.setSsxgajdm(yjxx.getSsxgajdm());
        ryxx.setSssgaj(yjxx.getSssgaj());
        ryxx.setSssgajdm(yjxx.getSssgajdm());
        ryxx.setXtSjly("1");
        this.tbYjxxRyMapper.insertEntity(ryxx);
        saveTbYjxxRyBq(ryxx);
    }

    // 添加人员信息标签
    private void saveTbYjxxRyBq(TbYjxxRy ryxx) {
        TbYjxxRyBq rybq = new TbYjxxRyBq();
        rybq.setId(UUIDGenerator.getUUID());
        rybq.setYjryId(ryxx.getId());
        rybq.setRybqdm(ryxx.getYjRybq());
        rybq.setRybqmc(ryxx.getYjRybqmc());
        rybq.setXtCjsj(new Timestamp(System.currentTimeMillis()));
        rybq.setXtZhgxsj(new Timestamp(System.currentTimeMillis()));
        rybq.setXtScbz("0");
        rybq.setXtSjzt("1");
        rybq.setXtSjly("1");
        this.tbYjxxRyBqMapper.insert(rybq);
    }

    private void saveYjbq(TbYjxx yjxx, String name) {
        yjxx.setYjbqmc(name);
        if (StringUtils.isEmpty(name)) return;
        if (name.contains("控")) {
            yjxx.setYjbq("1");
        } else if (name.contains("在逃")) {
            yjxx.setYjbq("2");
        } else if (name.contains("毒")) {
            yjxx.setYjbq("3");
        } else if (name.contains("前科") || name.contains("盗") || name.contains("抢")) {
            yjxx.setYjbq("4");
        } else if (name.contains("精神") || name.contains("肇事") || name.contains("肇祸")) {
            yjxx.setYjbq("5");
        } else if (name.contains("涉恐")) {
            yjxx.setYjbq("6");
        } else if (name.contains("信访") || name.contains("上访")) {
            yjxx.setYjbq("7");
        } else if (name.contains("稳")) {
            yjxx.setYjbq("8");
        } else {
            yjxx.setYjbq("9");
        }
    }

}
