Sfoglia il codice sorgente

feat: 根据经纬度获取设备信息
feat: 生产部设备出厂国家地区位置信息录入
feat: ip定位获取

Ritchie 1 anno fa
parent
commit
aa08a172eb

File diff suppressed because it is too large
+ 1 - 1
src/main/java/com/szwl/aspect/MyWebMvcConfigurer.java


+ 74 - 0
src/main/java/com/szwl/controller/IndexController.java

@@ -5,6 +5,9 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.model.bean.*;
 import com.szwl.model.bo.JsonUtils;
@@ -14,9 +17,11 @@ import com.szwl.model.entity.*;
 import com.szwl.model.utils.AdminUtils;
 import com.szwl.model.utils.HttpClientSslUtils;
 import com.szwl.model.utils.PushUtils;
+import com.szwl.model.utils.YunPianSms;
 import com.szwl.service.*;
 import com.szwl.service.es.EsTEquipmentService;
 import com.szwl.util.IDGenerator;
+import com.szwl.util.WhoIsUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.io.IOUtils;
@@ -27,6 +32,7 @@ import org.springframework.amqp.core.Queue;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
@@ -78,6 +84,11 @@ public class IndexController {
     @Autowired
     private AmqpAdmin amqpAdmin;
 
+    @Resource
+    TLocationCheckService locationCheckService;
+
+    private static final String appid = "07784f5fedb508046c841b391005b7de";
+
     @ApiOperation(value = "心跳")
     @RequestMapping(value = "/heart.htm", method = RequestMethod.POST, produces = "text/html;charset=utf-8")
     @ResponseBody
@@ -191,6 +202,69 @@ public class IndexController {
         }
         return "心跳失败";
     }
+
+    /**
+     * 设备初始化申请2
+     */
+    @ApiOperation(value = "设备初始化申请2")
+    @RequestMapping(value = "/initNew2.htm", method = RequestMethod.POST, produces = "text/html;charset=utf-8")
+    @ResponseBody
+    public String initNew2(String clientId, String managerId, String gtClientId, String equipmentType, String ip) throws IOException {
+        if(StringUtils.isEmpty(ip) || StringUtils.isEmpty(clientId)) {
+            return "ip、clientId不能为空";
+        }
+        // 根据ip校验位置信息
+        String s = WhoIsUtil.getLocByIp(ip);
+        ObjectMapper objectMapper = new ObjectMapper();
+        JsonNode jsonNode = objectMapper.readTree(s);
+        String pro = jsonNode.get("pro").asText();
+        String proCode = jsonNode.get("proCode").asText();
+        String city = jsonNode.get("city").asText();
+        String cityCode = jsonNode.get("cityCode").asText();
+        String region = jsonNode.get("region").asText();
+        String regionCode = jsonNode.get("regionCode").asText();
+        String regionNames = jsonNode.get("regionNames").asText();
+        String addr = jsonNode.get("addr").asText();
+        String err = jsonNode.get("err").asText();
+
+        // 根据 clientId 查设备的 location,country
+        LambdaQueryWrapper<TLocationCheck> lqw = Wrappers.lambdaQuery();
+        lqw.eq(TLocationCheck::getClientId, clientId);
+        TLocationCheck locationCheck = locationCheckService.getOne(lqw);
+        if (Objects.isNull(locationCheck)) {
+            return "生产部未录入改设备的位置信息";
+        }
+
+        locationCheck.setIp(ip);
+        locationCheck.setPro(pro);
+        locationCheck.setProCode(proCode);
+        locationCheck.setCity(city);
+        locationCheck.setCityCode(cityCode);
+        locationCheck.setRegion(region);
+        locationCheck.setRegionCode(regionCode);
+        locationCheck.setRegionNames(regionNames);
+        locationCheck.setAddr(addr);
+        locationCheck.setErr(err);
+
+        locationCheckService.saveOrUpdate(locationCheck);
+
+//        locationCheckService.locCheckMsg(locationCheck, clientId, ip, s);
+        String location = locationCheck.getLocation();
+        String country = locationCheck.getCountry();
+
+        // 如果 pro,city,addr 中都不包含 country 或者 location,就是异常,发短信通知
+        boolean contains = addr.contains(country) || addr.contains(location);
+        String phone = "18620242721";
+        String messages = "【申泽部门】设备编号:" + clientId + ",所在ip与设定位置不符,请及时查看。";
+        if (!contains) { // 不包含,发短信通知,并拒绝审核
+            YunPianSms.sendSms(appid, messages, phone);
+            return "位置不匹配,请联系售后或营销经理处理";
+        }
+
+        return this.initNew(clientId, managerId, gtClientId, equipmentType);
+    }
+
+
     /**
      * 设备申请
      *

+ 36 - 7
src/main/java/com/szwl/controller/ScheduledService.java

@@ -1,17 +1,26 @@
 package com.szwl.controller;
 
+import cn.hutool.http.HttpUtil;
+import com.szwl.mapper.TLocationCheckMapper;
+import com.szwl.model.entity.TLocationCheck;
 import com.szwl.service.TDepartmentService;
+import com.szwl.service.TLocationCheckService;
 import com.szwl.service.es.EsTCoinOrderService;
 import com.szwl.service.es.EsTOrderService;
+import com.szwl.util.WhoIsUtil;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
+import java.io.IOException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Calendar;
+import java.util.List;
 
 
 @Configuration //1.主要用于标记配置类,兼备Component的效果。
@@ -25,16 +34,36 @@ public class ScheduledService {
     @Autowired
     EsTOrderService esTOrderService;
 
+    @Resource
+    TLocationCheckMapper locationCheckMapper;
+    @Resource
+    TLocationCheckService locationCheckService;
+
+    // 每周二上午8点10分去校验设备位置
+    @Scheduled(cron = "0 10 8 ? * TUE")
+    public void equipmentLocCheck() throws IOException {
+        if (isDo()) {
+            List<TLocationCheck> locationChecks = locationCheckMapper.selectNotNullIp();
+            for (TLocationCheck locationChc : locationChecks) {
+                String clientId = locationChc.getClientId();
+                String ip = locationChc.getIp();
+                String s = WhoIsUtil.getLocByIp(ip);
+                // 这里不需要更新ip,只需要校验有ip的设备位置对不对
+                locationCheckService.locCheckMsg(locationChc, clientId, ip, s);
+            }
+        }
+    }
+
 
     // 值日通知1
     // 每天8:20执行一次
     @Scheduled(cron = "0 20 8 * * ?")
     public void scheduled() {
-        if(isDo()){
+        if (isDo()) {
             Calendar calendar = Calendar.getInstance();
             int number = calendar.get(Calendar.DAY_OF_WEEK);
             // 如果不是周日 1
-            if(number!=1){
+            if (number != 1) {
                 tDepartmentService.onTime();
             }
         }
@@ -44,9 +73,9 @@ public class ScheduledService {
         try {
             String hostAddress = InetAddress.getLocalHost().getHostAddress();
             // 弹性112.74.63.148服务器的私网ip
-            if(hostAddress.equals("10.0.0.153")){
+            if (hostAddress.equals("10.0.0.153")) {
                 return true;
-            }else {
+            } else {
                 return false;
             }
         } catch (UnknownHostException e) {
@@ -58,11 +87,11 @@ public class ScheduledService {
     // 值日通知2
     // 每天17:55执行一次
     @Scheduled(cron = "0 55 17 * * ?")
-    public void scheduled2(){
-        if(isDo()){
+    public void scheduled2() {
+        if (isDo()) {
             Calendar calendar = Calendar.getInstance();
             int number = calendar.get(Calendar.DAY_OF_WEEK);
-            if(number!=1){
+            if (number != 1) {
                 tDepartmentService.onTime2();
             }
         }

+ 29 - 0
src/main/java/com/szwl/controller/SyncOldAdminController.java

@@ -41,6 +41,35 @@ public class SyncOldAdminController {
     }
 
 
+    // TODO:
+    @ApiOperation(value = "根据旧系统的层级关系来关联上级客户")
+    @PostMapping("/relevanceSuperiorCustomer")
+    public ResponseModel<TAdmin> relevanceSuperiorCustomer(String startTime, String endTime) {
+
+        // 根据时间获取用户信息
+        List<TAdmin> oldAdminList = R.getDataIfSuccess(syncOldFeign.getAdminInTime(startTime, endTime));
+        for (TAdmin oldAdmin : oldAdminList) {
+            // 获取这些用户的 parent_id
+            Long oldAdminId = oldAdmin.getId();
+//            syncOldFeign.getParentIdByAdminId(oldAdminId);
+
+            // 关联到新系统的 admin 中
+            LambdaQueryWrapper<TAdmin> lqw = Wrappers.lambdaQuery();
+            lqw.eq(TAdmin::getId, oldAdminId);
+            TAdmin admin = adminService.getOne(lqw);
+//            admin.setRelationAdminId(parentId);
+            adminService.updateById(admin);
+        }
+
+
+        // 根据当前用户的 adminId 获取旧系统账户的上级 adminId,也就是parent_id
+//        syncOldFeign.getAdminById(adminId);
+
+
+        return R.ok();
+    }
+
+
     @ApiOperation(value = "给指定时间范围内的所有旧系统用户设置新系统权限")
     @PostMapping("/addAllRoleInTime")
     public ResponseModel<?> addAllRoleInTime(String startTime, String endTime) {

+ 14 - 0
src/main/java/com/szwl/controller/TEquipmentController.java

@@ -99,6 +99,20 @@ public class TEquipmentController {
     // 超时时间为30秒
     private static final int TIMEOUT = 30000;
 
+    @ApiOperation(value = "根据经纬度获取区域内设备信息")
+    @GetMapping("/getEquipmentByLatLon")
+    public ResponseModel<List<TEquipment>> getEquipmentByLatLon(String lat1, String lat2, String lon1, String lon2) {
+
+        LambdaQueryWrapper<TEquipment> lqw = Wrappers.lambdaQuery();
+        lqw.between(TEquipment::getLatitude, lat1, lat2)
+                .between(TEquipment::getLongitude, lon1, lon2)
+                .notLike(TEquipment::getClientId, "%xxx");
+        List<TEquipment> equipmentList = tEquipmentService.list(lqw);
+
+        return R.ok(equipmentList);
+    }
+
+
     @ApiOperation(value = "设备是否存在")
     @GetMapping("/getEquipmentBool")
     public ResponseModel<Boolean> getEquipmentBool(String clientId) {

+ 197 - 0
src/main/java/com/szwl/controller/TLocationCheckController.java

@@ -0,0 +1,197 @@
+package com.szwl.controller;
+
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.entity.TAdmin;
+import com.szwl.model.entity.TLocationCheck;
+import com.szwl.model.utils.YunPianSms;
+import com.szwl.service.TAdminService;
+import com.szwl.service.TLocationCheckService;
+import com.szwl.util.WhoIsUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-06
+ */
+@RestController
+@RequestMapping("/tLocationCheck")
+public class TLocationCheckController {
+
+    TLocationCheckService locationCheckService;
+    TAdminService adminService;
+
+    public TLocationCheckController(TLocationCheckService locationCheckService, TAdminService adminService) {
+        this.locationCheckService = locationCheckService;
+        this.adminService = adminService;
+    }
+
+
+    @ApiOperation(value = "根据ip校验clientId设备位置")
+    @PostMapping("/ipCheck")
+    public ResponseModel<?> ipCheck(@RequestParam String clientId, @RequestParam String ip) throws IOException {
+        if (StringUtils.isBlank(clientId) || StringUtils.isBlank(ip)) {
+            return R.fail("参数不能为空");
+        }
+        // 根据 clientId 查设备的 location,country
+        LambdaQueryWrapper<TLocationCheck> lqw = Wrappers.lambdaQuery();
+        lqw.eq(TLocationCheck::getClientId, clientId);
+        TLocationCheck locationCheck = locationCheckService.getOne(lqw);
+        if (Objects.isNull(locationCheck)) {
+            return R.fail("生产部未录入改设备的位置信息");
+        }
+
+        String s = WhoIsUtil.getLocByIp(ip);
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        JsonNode jsonNode = objectMapper.readTree(s);
+        String pro = jsonNode.get("pro").asText();
+        String proCode = jsonNode.get("proCode").asText();
+        String city = jsonNode.get("city").asText();
+        String cityCode = jsonNode.get("cityCode").asText();
+        String region = jsonNode.get("region").asText();
+        String regionCode = jsonNode.get("regionCode").asText();
+        String regionNames = jsonNode.get("regionNames").asText();
+        String addr = jsonNode.get("addr").asText();
+        String err = jsonNode.get("err").asText();
+
+        locationCheck.setIp(ip);
+        locationCheck.setPro(pro);
+        locationCheck.setProCode(proCode);
+        locationCheck.setCity(city);
+        locationCheck.setCityCode(cityCode);
+        locationCheck.setRegion(region);
+        locationCheck.setRegionCode(regionCode);
+        locationCheck.setRegionNames(regionNames);
+        locationCheck.setAddr(addr);
+        locationCheck.setErr(err);
+
+        locationCheckService.saveOrUpdate(locationCheck);
+
+        String result = locationCheckService.locCheckMsg(locationCheck, clientId, ip, s);
+
+        return R.ok(result);
+
+    }
+
+    @ApiOperation(value = "修改录入的位置信息")
+    @PostMapping("/updateLocInfo")
+    public ResponseModel<?> updateLocInfo(@RequestBody TLocationCheck locationCheck) {
+        if (Objects.isNull(locationCheck)) {
+            return R.fail("参数不能为空");
+        }
+//        String phone = locationCheck.getPhone();
+//        String username = locationCheck.getUsername();
+//        String clientId = locationCheck.getClientId();
+//        String name = locationCheck.getName();
+//        String location = locationCheck.getLocation();
+//        String country = locationCheck.getCountry();
+//
+//        if (Objects.isNull(clientId)) {
+//            return R.fail("设备唯一码不能为空");
+//        }
+//
+//        LambdaQueryWrapper<TAdmin> lqw = Wrappers.lambdaQuery();
+//        lqw.eq(TAdmin::getUsername, username);
+//        TAdmin admin = adminService.getOne(lqw);
+//        if (Objects.isNull(admin)) {
+//            return R.fail("adminId账号不存在");
+//        }
+//
+//        LambdaQueryWrapper<TLocationCheck> wrapper = Wrappers.lambdaQuery();
+//        wrapper.eq(TLocationCheck::getClientId,clientId);
+//        List<TLocationCheck> checks = locationCheckService.list(wrapper);
+//        TLocationCheck tLocationCheck = checks.get(0);
+//
+//
+//
+//        Long adminId = admin.getId();
+////        String phone1 = admin.getPhone();
+////        if (!Objects.equals(phone1, phone)) {
+////            return R.fail("手机号码有误");
+////        }
+//        String name1 = admin.getName();
+//        if (!Objects.equals(name1, name)) {
+//            return R.fail("姓名有误");
+//        }
+return R.ok();
+    }
+
+
+    @ApiOperation(value = "录入位置信息")
+    @PostMapping("/inputLocInfo")
+    public ResponseModel<?> inputLocInfo(@RequestBody TLocationCheck locationCheck) {
+        if (Objects.isNull(locationCheck)) {
+            return R.fail("参数不能为空");
+        }
+
+        String phone = locationCheck.getPhone();
+        String username = locationCheck.getUsername();
+        String clientId = locationCheck.getClientId();
+        String name = locationCheck.getName();
+        String location = locationCheck.getLocation();
+        String country = locationCheck.getCountry();
+
+        if (Objects.isNull(clientId)) {
+            return R.fail("设备唯一码不能为空");
+        }
+        LambdaQueryWrapper<TLocationCheck> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(TLocationCheck::getClientId,clientId);
+        List<TLocationCheck> checks = locationCheckService.list(wrapper);
+        if (checks.size() > 0) {
+            return R.fail("此设备信息已录入");
+        }
+        LambdaQueryWrapper<TAdmin> lqw = Wrappers.lambdaQuery();
+        lqw.eq(TAdmin::getUsername, username);
+        TAdmin admin = adminService.getOne(lqw);
+        if (Objects.isNull(admin)) {
+            return R.fail("adminId账号不存在");
+        }
+        Long adminId = admin.getId();
+//        String phone1 = admin.getPhone();
+//        if (!Objects.equals(phone1, phone)) {
+//            return R.fail("手机号码有误");
+//        }
+        String name1 = admin.getName();
+        if (!Objects.equals(name1, name)) {
+            return R.fail("姓名有误");
+        }
+
+        TLocationCheck tLocationCheck = new TLocationCheck();
+//        String uuid = IdUtil.randomUUID();
+        String uuid = IdUtil.simpleUUID();
+        tLocationCheck.setId(uuid);
+        tLocationCheck.setAdminId(adminId);
+        tLocationCheck.setPhone(phone);
+        tLocationCheck.setUsername(username);
+        tLocationCheck.setClientId(clientId);
+        tLocationCheck.setName(name);
+        tLocationCheck.setLocation(location);
+        tLocationCheck.setCountry(country);
+
+        locationCheckService.save(tLocationCheck);
+
+        return R.ok("设备出厂信息录入成功");
+    }
+
+}
+

+ 1 - 0
src/main/java/com/szwl/mapper/TEquipmentMapper.java

@@ -22,4 +22,5 @@ public interface TEquipmentMapper extends BaseMapper<TEquipment> {
 
     int insertBatchSomeColumn(List<TEquipment> entityList);
 
+    List<TEquipment> getEquipmentByLatLon(String lat1, String lat2, String lon1, String lon2);
 }

+ 19 - 0
src/main/java/com/szwl/mapper/TLocationCheckMapper.java

@@ -0,0 +1,19 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.TLocationCheck;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-06
+ */
+public interface TLocationCheckMapper extends BaseMapper<TLocationCheck> {
+
+    List<TLocationCheck> selectNotNullIp();
+}

File diff suppressed because it is too large
+ 7 - 0
src/main/java/com/szwl/mapper/xml/TEquipmentMapper.xml


+ 42 - 0
src/main/java/com/szwl/mapper/xml/TLocationCheckMapper.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.TLocationCheckMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.TLocationCheck">
+        <id column="id" property="id" />
+        <result column="create_time" property="createTime" />
+        <result column="modify_time" property="modifyTime" />
+        <result column="admin_id" property="adminId" />
+        <result column="phone" property="phone" />
+        <result column="client_id" property="clientId" />
+        <result column="location" property="location" />
+        <result column="longitude" property="longitude" />
+        <result column="latitude" property="latitude" />
+        <result column="country" property="country" />
+        <result column="country_code" property="countryCode" />
+        <result column="username" property="username" />
+        <result column="ip" property="ip" />
+        <result column="pro" property="pro" />
+        <result column="pro_code" property="proCode" />
+        <result column="city" property="city" />
+        <result column="city_code" property="cityCode" />
+        <result column="region" property="region" />
+        <result column="region_code" property="regionCode" />
+        <result column="addr" property="addr" />
+        <result column="region_names" property="regionNames" />
+        <result column="err" property="err" />
+        <result column="name" property="name" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_time, modify_time, admin_id, phone, client_id, location, longitude, latitude, country, country_code, username, ip, pro, pro_code, city, city_code, region, region_code, addr, region_names, err, name
+    </sql>
+
+    <select id="selectNotNullIp" resultMap="BaseResultMap">
+        select id, create_time, modify_time, admin_id, phone, client_id, location, longitude, latitude, country, country_code, username, ip, pro, pro_code, city, city_code, region, region_code, addr, region_names, err, name
+        from t_location_check
+        where ip is not null
+    </select>
+</mapper>

+ 95 - 0
src/main/java/com/szwl/model/entity/TLocationCheck.java

@@ -0,0 +1,95 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TLocationCheck对象", description="")
+public class TLocationCheck implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+
+    private Date createTime;
+
+    private Date modifyTime;
+
+    @ApiModelProperty(value = "生产部员工的adminId")
+    private Long adminId;
+
+    @ApiModelProperty(value = "生产部员工电话")
+    private String phone;
+
+    @ApiModelProperty(value = "设备唯一码")
+    private String clientId;
+
+    @ApiModelProperty(value = "位置信息")
+    private String location;
+
+    @ApiModelProperty(value = "经度")
+    private String longitude;
+
+    @ApiModelProperty(value = "纬度")
+    private String latitude;
+
+    @ApiModelProperty(value = "生产部员工录入的国家信息	")
+    private String country;
+
+    @ApiModelProperty(value = "国家编码")
+    private String countryCode;
+
+    @ApiModelProperty(value = "生产部员工的username")
+    private String username;
+
+    @ApiModelProperty(value = "ip地址")
+    private String ip;
+
+    @ApiModelProperty(value = "省级名称")
+    private String pro;
+
+    @ApiModelProperty(value = "省级编号")
+    private String proCode;
+
+    @ApiModelProperty(value = "城市名称")
+    private String city;
+
+    @ApiModelProperty(value = "城市编号")
+    private String cityCode;
+
+    @ApiModelProperty(value = "地区")
+    private String region;
+
+    @ApiModelProperty(value = "地区编号")
+    private String regionCode;
+
+    @ApiModelProperty(value = "地址")
+    private String addr;
+
+    @ApiModelProperty(value = "地区名称")
+    private String regionNames;
+
+    @ApiModelProperty(value = "其他信息")
+    private String err;
+
+    @ApiModelProperty(value = "生产部员工姓名")
+    private String name;
+
+
+}

+ 20 - 0
src/main/java/com/szwl/service/TLocationCheckService.java

@@ -0,0 +1,20 @@
+package com.szwl.service;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.szwl.model.entity.TLocationCheck;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.io.IOException;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-06
+ */
+public interface TLocationCheckService extends IService<TLocationCheck> {
+
+    String locCheckMsg(TLocationCheck locationCheck,String clientId, String ip, String s) throws IOException;
+}

+ 57 - 0
src/main/java/com/szwl/service/impl/TLocationCheckServiceImpl.java

@@ -0,0 +1,57 @@
+package com.szwl.service.impl;
+
+import cn.hutool.http.HttpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.szwl.model.bo.R;
+import com.szwl.model.entity.TLocationCheck;
+import com.szwl.mapper.TLocationCheckMapper;
+import com.szwl.model.utils.YunPianSms;
+import com.szwl.service.TLocationCheckService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-06
+ */
+@Service
+public class TLocationCheckServiceImpl extends ServiceImpl<TLocationCheckMapper, TLocationCheck> implements TLocationCheckService {
+
+
+    private static final String appid = "07784f5fedb508046c841b391005b7de";
+
+    @Override
+    public String locCheckMsg(TLocationCheck locationCheck,String clientId, String ip, String s) throws IOException {
+
+        String location = locationCheck.getLocation();
+        String country = locationCheck.getCountry();
+        ObjectMapper objectMapper = new ObjectMapper();
+        JsonNode jsonNode = objectMapper.readTree(s);
+        String addr = jsonNode.get("addr").asText();
+
+
+        // 如果 pro,city,addr 中都不包含 country 或者 location,就是异常,发短信通知
+        boolean contains = addr.contains(country) || addr.contains(location);
+        String phone = "18620242721";
+        String messages = "【申泽部门】设备编号:" + clientId + ",所在ip与设定位置不符,请及时查看。";
+        String result = null;
+        if (!contains) { // 不包含,发短信通知
+            result = YunPianSms.sendSms(appid, messages, phone);
+        }
+        return result;
+    }
+
+
+}

+ 13 - 0
src/main/java/com/szwl/util/WhoIsUtil.java

@@ -0,0 +1,13 @@
+package com.szwl.util;
+
+import cn.hutool.http.HttpUtil;
+
+public class WhoIsUtil {
+
+    public static String getLocByIp(String ip) {
+        // 根据 ip 获取位置
+        String reqUrl = "http://whois.pconline.com.cn/ipJson.jsp?json=true&ip=" + ip;
+//        HttpRequest.get(reqUrl)
+        return HttpUtil.get(reqUrl);
+    }
+}

+ 1 - 1
src/test/java/com/szwl/AutoGeneratorTests.java

@@ -47,7 +47,7 @@ class AutoGeneratorTests {
 		strategyConfig
 //				.setCapitalMode(true)//设置全局大写命名
 				.setInclude(new String[]{
-						""
+						"t_location_check"
 				})//只会生成该表
 				.setEntityLombokModel(true)//实体类生成之后自动添加lombok注解
 				.setNaming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略