围栏配置代码开发

This commit is contained in:
lizhenhua 2025-12-24 17:53:45 +08:00
parent e5347567d7
commit 113ef841e6
10 changed files with 964 additions and 0 deletions

View File

@ -0,0 +1,53 @@
package com.bonus.sgzb.base.controller;
import com.bonus.sgzb.base.service.ITerminalService;
import com.bonus.sgzb.common.core.web.controller.BaseController;
import com.bonus.sgzb.common.core.web.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* 行政区划Controller
*/
@RestController
@RequestMapping("/jtt808/area")
public class AreaController extends BaseController {
@Autowired
private ITerminalService areaService;
/**
* 获取省份列表
*/
@GetMapping("/provinces")
public AjaxResult listProvinces() {
List<Map<String, Object>> provinceList = areaService.selectProvinceList();
return AjaxResult.success(provinceList);
}
/**
* 根据省份编码获取城市列表
*/
@GetMapping("/cities/{provinceCode}")
public AjaxResult listCities(@PathVariable Long provinceCode) {
List<Map<String, Object>> cityList = areaService.selectCityListByProvince(provinceCode);
return AjaxResult.success(cityList);
}
/**
* 根据城市编码获取区县列表
*/
@GetMapping("/counties/{cityCode}")
public AjaxResult listCounties(@PathVariable Long cityCode) {
List<Map<String, Object>> countyList = areaService.selectCountyListByCity(cityCode);
return AjaxResult.success(countyList);
}
}

View File

@ -0,0 +1,38 @@
package com.bonus.sgzb.base.controller;
import com.bonus.sgzb.base.domain.GeofenceConfigDTO;
import com.bonus.sgzb.base.service.ITerminalService;
import com.bonus.sgzb.common.core.web.controller.BaseController;
import com.bonus.sgzb.common.core.web.domain.AjaxResult;
import com.bonus.sgzb.common.log.annotation.Log;
import com.bonus.sgzb.common.log.enums.BusinessType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 电子围栏终端配置 Controller极简版
*/
@RestController
@RequestMapping("/jtt808/geofence/config")
public class Jtt808GeofenceTerminalConfigController extends BaseController {
@Autowired
private ITerminalService configService;
// 保存配置前端提交时调用
@Log(title = "电子围栏终端配置", businessType = BusinessType.UPDATE)
@PostMapping
public AjaxResult saveConfig(@RequestBody GeofenceConfigDTO dto) {
configService.saveGeofencePhones(dto.getGeofenceId(), dto.getTerminalIds());
return AjaxResult.success();
}
// 回显已配置终端前端打开弹窗时调用
@GetMapping("/{geofenceId}")
public AjaxResult getConfig(@PathVariable Long geofenceId) {
return AjaxResult.success(configService.selectPhonesByGeofenceId(geofenceId));
}
}

View File

@ -0,0 +1,129 @@
package com.bonus.sgzb.base.controller;
import com.bonus.sgzb.base.domain.Terminal;
import com.bonus.sgzb.base.service.ITerminalService;
import com.bonus.sgzb.common.core.utils.StringUtils;
import com.bonus.sgzb.common.core.utils.poi.ExcelUtil;
import com.bonus.sgzb.common.core.web.controller.BaseController;
import com.bonus.sgzb.common.core.web.domain.AjaxResult;
import com.bonus.sgzb.common.core.web.page.TableDataInfo;
import com.bonus.sgzb.common.log.annotation.Log;
import com.bonus.sgzb.common.log.enums.BusinessType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import static com.bonus.sgzb.common.security.utils.SecurityUtils.getUsername;
/**
* 终端设备Controller完整版
*/
@RestController
@RequestMapping("/jtt808/terminal")
public class TerminalController extends BaseController {
@Autowired
private ITerminalService terminalService;
/**
* 查询终端设备列表
*/
@GetMapping("/list")
public TableDataInfo list(Terminal terminal) {
startPage();
List<Terminal> list = terminalService.selectTerminalList(terminal);
return getDataTable(list);
}
/**
* 导出终端设备列表
*/
@Log(title = "终端设备", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, Terminal terminal) {
List<Terminal> list = terminalService.selectTerminalList(terminal);
ExcelUtil<Terminal> util = new ExcelUtil<>(Terminal.class);
util.exportExcel(response, list, "终端设备数据");
}
/**
* 获取终端设备详细信息
*/
@GetMapping(value = "/getinfo/{terminalId}")
public AjaxResult getInfo(@PathVariable("terminalId") Long terminalId) {
return AjaxResult.success(terminalService.selectTerminalById(terminalId));
}
/**
* 新增终端设备
*/
@Log(title = "终端设备", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody Terminal terminal) {
// 校验手机号唯一性
if (!terminalService.checkPhoneNumberUnique(terminal).equals("0")) {
return AjaxResult.error("新增终端设备'" + terminal.getPhoneNumber() + "'失败,手机号已存在");
}
// 校验IMEI唯一性
if (StringUtils.isNotEmpty(terminal.getImei()) && !terminalService.checkImeiUnique(terminal).equals("0")) {
return AjaxResult.error("新增终端设备'" + terminal.getPhoneNumber() + "'失败IMEI号已存在");
}
terminal.setCreateBy(getUsername());
return toAjax(terminalService.insertTerminal(terminal));
}
/**
* 修改终端设备
*/
@Log(title = "终端设备", businessType = BusinessType.UPDATE)
@PostMapping("/updateinfo")
public AjaxResult edit(@Validated @RequestBody Terminal terminal) {
// 校验手机号唯一性
if (!terminalService.checkPhoneNumberUnique(terminal).equals("0")) {
return AjaxResult.error("修改终端设备'" + terminal.getPhoneNumber() + "'失败,手机号已存在");
}
// 校验IMEI唯一性
if (StringUtils.isNotEmpty(terminal.getImei()) && !terminalService.checkImeiUnique(terminal).equals("0")) {
return AjaxResult.error("修改终端设备'" + terminal.getPhoneNumber() + "'失败IMEI号已存在");
}
terminal.setUpdateBy(getUsername());
return toAjax(terminalService.updateTerminal(terminal));
}
/**
* 删除终端设备
*/
@Log(title = "终端设备", businessType = BusinessType.DELETE)
@DeleteMapping("/{terminalIds}")
public AjaxResult remove(@PathVariable Long[] terminalIds) {
return toAjax(terminalService.deleteTerminalByIds(terminalIds));
}
/**
* 获取终端统计信息
*/
@GetMapping("/statistics")
public AjaxResult getStatistics() {
return AjaxResult.success(terminalService.getTerminalStatistics());
}
/**
* 更新在线状态供JTT808协议处理调用
*/
@PostMapping("/updateOnlineStatus")
public AjaxResult updateOnlineStatus(@RequestParam Long terminalId,
@RequestParam Integer onlineStatus,
@RequestParam(required = false) String clientIp) {
return toAjax(terminalService.updateOnlineStatus(terminalId, onlineStatus, clientIp));
}
/**
* 更新心跳时间供JTT808协议处理调用
*/
@PostMapping("/updateHeartbeatTime")
public AjaxResult updateHeartbeatTime(@RequestParam Long terminalId) {
return toAjax(terminalService.updateHeartbeatTime(terminalId));
}
}

View File

@ -0,0 +1,12 @@
package com.bonus.sgzb.base.domain;
import lombok.Data;
import java.util.List;
@Data
public class GeofenceConfigDTO {
private Long geofenceId;
private List<String> terminalIds;
private List<String> phoneNumbers;
}

View File

@ -0,0 +1,14 @@
package com.bonus.sgzb.base.domain;
import lombok.Data;
@Data
public class Jtt808GeofenceTerminalConfig {
private static final long serialVersionUID = 1L;
private Long id;
private Long geofenceId;
private String phoneNumber;
private String terminalId;
}

View File

@ -0,0 +1,97 @@
package com.bonus.sgzb.base.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class Terminal {
private static final long serialVersionUID = 1L;
/** 终端ID */
private Long terminalId;
/** 终端手机号(BCD编码) */
private String phoneNumber;
/** 设备IMEI号(15位唯一标识) */
private String imei;
/** 省域ID */
private String provinceId;
/** 市县域ID */
private String cityId;
/** 制造商ID */
private String manufacturerId;
/** 终端型号 */
private String terminalModel;
/** 终端设备ID */
private String terminalDeviceId;
/** 车牌颜色(0-其他,1-蓝色,2-黄色,3-黑色,4-白色,9-新能源) */
private Integer plateColor;
/** 车牌号 */
private String plateNumber;
/** 鉴权码 */
private String authCode;
/** 开始注册时间(查询条件) */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date beginRegisterTime;
/** 结束注册时间(查询条件) */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endRegisterTime;
/** 注册时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date registerTime;
/** 最后鉴权时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastAuthTime;
/** 在线状态(0-离线,1-在线) */
private Integer onlineStatus;
/** 最后心跳时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastHeartbeatTime;
/** 客户端IP地址 */
private String clientIp;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/** 省名称(非数据库字段) */
private String provinceName;
/** 市名称(非数据库字段) */
private String cityName;
/** 车牌颜色名称(非数据库字段) */
private String plateColorName;
/** 请求参数 */
private String params;
private String createBy;
private String updateBy;
}

View File

@ -0,0 +1,90 @@
package com.bonus.sgzb.base.mapper;
import com.bonus.sgzb.base.domain.Jtt808GeofenceTerminalConfig;
import com.bonus.sgzb.base.domain.Terminal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@Mapper
public interface TerminalMapper {
/**
* 查询终端设备
*/
Terminal selectTerminalById(Long terminalId);
/**
* 查询终端设备列表
*/
List<Terminal> selectTerminalList(Terminal terminal);
/**
* 新增终端设备
*/
int insertTerminal(Terminal terminal);
/**
* 修改终端设备
*/
int updateTerminal(Terminal terminal);
/**
* 删除终端设备
*/
int deleteTerminalById(Long terminalId);
/**
* 批量删除终端设备
*/
int deleteTerminalByIds(Long[] terminalIds);
/**
* 根据手机号查询终端
*/
Terminal selectTerminalByPhoneNumber(String phoneNumber);
/**
* 根据IMEI查询终端
*/
Terminal selectTerminalByImei(String imei);
/**
* 获取终端统计信息
*/
Map<String, Object> getTerminalStatistics();
/**
* 更新在线状态
*/
int updateOnlineStatus(@Param("terminalId") Long terminalId,
@Param("onlineStatus") Integer onlineStatus,
@Param("clientIp") String clientIp);
/**
* 更新心跳时间
*/
int updateHeartbeatTime(@Param("terminalId") Long terminalId);
/**
* 查询省份列表
*/
List<Map<String, Object>> selectProvinceList();
/**
* 根据省份编码查询城市列表
*/
List<Map<String, Object>> selectCityListByProvince(@Param("provinceCode") Long provinceCode);
/**
* 根据城市编码查询区县列表
*/
List<Map<String, Object>> selectCountyListByCity(@Param("cityCode") Long cityCode);
List<Jtt808GeofenceTerminalConfig> selectByGeofenceId(Long geofenceId);
int deleteByGeofenceId(Long geofenceId);
int batchInsert(List<Jtt808GeofenceTerminalConfig> list);
}

View File

@ -0,0 +1,94 @@
package com.bonus.sgzb.base.service;
import com.bonus.sgzb.base.domain.Terminal;
import java.util.List;
import java.util.Map;
public interface ITerminalService {
/**
* 查询终端设备
*/
Terminal selectTerminalById(Long terminalId);
/**
* 查询终端设备列表
*/
List<Terminal> selectTerminalList(Terminal terminal);
/**
* 新增终端设备
*/
int insertTerminal(Terminal terminal);
/**
* 修改终端设备
*/
int updateTerminal(Terminal terminal);
/**
* 批量删除终端设备
*/
int deleteTerminalByIds(Long[] terminalIds);
/**
* 删除终端设备信息
*/
int deleteTerminalById(Long terminalId);
/**
* 校验手机号是否唯一
*/
String checkPhoneNumberUnique(Terminal terminal);
/**
* 校验IMEI是否唯一
*/
String checkImeiUnique(Terminal terminal);
/**
* 获取终端统计信息
*/
Map<String, Object> getTerminalStatistics();
/**
* 更新在线状态
*/
int updateOnlineStatus(Long terminalId, Integer onlineStatus, String clientIp);
/**
* 更新心跳时间
*/
int updateHeartbeatTime(Long terminalId);
/**
* 根据手机号查询终端
*/
Terminal selectTerminalByPhoneNumber(String phoneNumber);
/**
* 查询省份列表
*/
List<Map<String, Object>> selectProvinceList();
/**
* 根据省份编码查询城市列表
*/
List<Map<String, Object>> selectCityListByProvince(Long provinceCode);
/**
* 根据城市编码查询区县列表
*/
List<Map<String, Object>> selectCountyListByCity(Long cityCode);
/**
* 保存围栏绑定的终端手机号先删后插
*/
int saveGeofencePhones(Long geofenceId, List<String> terminalIds);
/**
* 查询围栏已绑定的终端手机号用于回显
*/
List<String> selectPhonesByGeofenceId(Long geofenceId);
}

View File

@ -0,0 +1,195 @@
package com.bonus.sgzb.base.service.impl;
import com.bonus.sgzb.base.domain.Jtt808GeofenceTerminalConfig;
import com.bonus.sgzb.base.domain.Terminal;
import com.bonus.sgzb.base.mapper.TerminalMapper;
import com.bonus.sgzb.base.service.ITerminalService;
import com.bonus.sgzb.common.core.utils.DateUtils;
import com.bonus.sgzb.common.core.utils.StringUtils;
import com.bonus.sgzb.common.security.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 终端设备Service业务层处理
*/
@Service
public class TerminalServiceImpl implements ITerminalService {
@Autowired
private TerminalMapper terminalMapper;
/**
* 查询终端设备
*/
@Override
public Terminal selectTerminalById(Long terminalId) {
return terminalMapper.selectTerminalById(terminalId);
}
/**
* 查询终端设备列表
*/
@Override
public List<Terminal> selectTerminalList(Terminal terminal) {
return terminalMapper.selectTerminalList(terminal);
}
/**
* 新增终端设备
*/
@Override
public int insertTerminal(Terminal terminal) {
terminal.setCreateTime(DateUtils.getNowDate());
terminal.setUpdateTime(DateUtils.getNowDate());
if (terminal.getRegisterTime() == null) {
terminal.setRegisterTime(DateUtils.getNowDate());
}
// 生成默认鉴权码
if (StringUtils.isEmpty(terminal.getAuthCode())) {
terminal.setAuthCode(generateAuthCode());
}
return terminalMapper.insertTerminal(terminal);
}
/**
* 修改终端设备
*/
@Override
public int updateTerminal(Terminal terminal) {
terminal.setUpdateTime(DateUtils.getNowDate());
return terminalMapper.updateTerminal(terminal);
}
/**
* 批量删除终端设备
*/
@Override
@Transactional
public int deleteTerminalByIds(Long[] terminalIds) {
return terminalMapper.deleteTerminalByIds(terminalIds);
}
/**
* 删除终端设备信息
*/
@Override
public int deleteTerminalById(Long terminalId) {
return terminalMapper.deleteTerminalById(terminalId);
}
/**
* 校验手机号是否唯一
*/
@Override
public String checkPhoneNumberUnique(Terminal terminal) {
Long terminalId = StringUtils.isNull(terminal.getTerminalId()) ? -1L : terminal.getTerminalId();
Terminal info = terminalMapper.selectTerminalByPhoneNumber(terminal.getPhoneNumber());
if (StringUtils.isNotNull(info) && info.getTerminalId().longValue() != terminalId.longValue()) {
return "1";
}
return "0";
}
/**
* 校验IMEI是否唯一
*/
@Override
public String checkImeiUnique(Terminal terminal) {
Long terminalId = StringUtils.isNull(terminal.getTerminalId()) ? -1L : terminal.getTerminalId();
Terminal info = terminalMapper.selectTerminalByImei(terminal.getImei());
if (StringUtils.isNotNull(info) && info.getTerminalId().longValue() != terminalId.longValue()) {
return "1";
}
return "0";
}
/**
* 获取终端统计信息
*/
@Override
public Map<String, Object> getTerminalStatistics() {
return terminalMapper.getTerminalStatistics();
}
/**
* 更新在线状态
*/
@Override
public int updateOnlineStatus(Long terminalId, Integer onlineStatus, String clientIp) {
return terminalMapper.updateOnlineStatus(terminalId, onlineStatus, clientIp);
}
/**
* 更新心跳时间
*/
@Override
public int updateHeartbeatTime(Long terminalId) {
return terminalMapper.updateHeartbeatTime(terminalId);
}
/**
* 根据手机号查询终端
*/
@Override
public Terminal selectTerminalByPhoneNumber(String phoneNumber) {
return terminalMapper.selectTerminalByPhoneNumber(phoneNumber);
}
/**
* 生成鉴权码
*/
private String generateAuthCode() {
return String.valueOf((int)((Math.random() * 9 + 1) * 100000));
}
@Override
public List<Map<String, Object>> selectProvinceList() {
return terminalMapper.selectProvinceList();
}
@Override
public List<Map<String, Object>> selectCityListByProvince(Long provinceCode) {
return terminalMapper.selectCityListByProvince(provinceCode);
}
@Override
public List<Map<String, Object>> selectCountyListByCity(Long cityCode) {
return terminalMapper.selectCountyListByCity(cityCode);
}
@Override
public int saveGeofencePhones(Long geofenceId, List<String> terminalIds) {
// 先删旧的
terminalMapper.deleteByGeofenceId(geofenceId);
if (terminalIds == null || terminalIds.isEmpty()) {
return 0;
}
String username = SecurityUtils.getUsername();
List<Jtt808GeofenceTerminalConfig> list = new ArrayList<>();
for (String phone : terminalIds) {
Jtt808GeofenceTerminalConfig cfg = new Jtt808GeofenceTerminalConfig();
cfg.setGeofenceId(geofenceId);
cfg.setTerminalId( phone);
list.add(cfg);
}
return terminalMapper.batchInsert(list);
}
@Override
public List<String> selectPhonesByGeofenceId(Long geofenceId) {
List<Jtt808GeofenceTerminalConfig> list = terminalMapper.selectByGeofenceId(geofenceId);
List<String> phones = new ArrayList<>();
for (Jtt808GeofenceTerminalConfig c : list) {
phones.add(c.getTerminalId());
}
return phones;
}
}

View File

@ -0,0 +1,242 @@
<?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.bonus.sgzb.base.mapper.TerminalMapper">
<resultMap type="com.bonus.sgzb.base.domain.Terminal" id="TerminalResult">
<id property="terminalId" column="terminal_id"/>
<result property="phoneNumber" column="phone_number"/>
<result property="imei" column="imei"/>
<result property="provinceId" column="province_id"/>
<result property="cityId" column="city_id"/>
<result property="manufacturerId" column="manufacturer_id"/>
<result property="terminalModel" column="terminal_model"/>
<result property="terminalDeviceId" column="terminal_device_id"/>
<result property="plateColor" column="plate_color"/>
<result property="plateNumber" column="plate_number"/>
<result property="authCode" column="auth_code"/>
<result property="registerTime" column="register_time"/>
<result property="lastAuthTime" column="last_auth_time"/>
<result property="onlineStatus" column="online_status"/>
<result property="lastHeartbeatTime" column="last_heartbeat_time"/>
<result property="clientIp" column="client_ip"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="provinceName" column="province_name"/>
<result property="cityName" column="city_name"/>
</resultMap>
<sql id="selectTerminalVo">
select t.*,
p.name as province_name,
c.name as city_name
from jtt808_terminal t
left join sys_cnarea p on t.province_id = p.area_code and p.level = 1
left join sys_cnarea c on t.city_id = c.area_code and c.level = 2
</sql>
<select id="selectTerminalById" parameterType="Long" resultMap="TerminalResult">
<include refid="selectTerminalVo"/>
where t.terminal_id = #{terminalId}
</select>
<select id="selectTerminalList" parameterType="com.bonus.sgzb.base.domain.Terminal" resultMap="TerminalResult">
<include refid="selectTerminalVo"/>
<where>
<if test="phoneNumber != null and phoneNumber != ''">
AND t.phone_number like concat('%', #{phoneNumber}, '%')
</if>
<if test="imei != null and imei != ''">
AND t.imei like concat('%', #{imei}, '%')
</if>
<if test="plateNumber != null and plateNumber != ''">
AND t.plate_number like concat('%', #{plateNumber}, '%')
</if>
<if test="terminalModel != null and terminalModel != ''">
AND t.terminal_model like concat('%', #{terminalModel}, '%')
</if>
<if test="manufacturerId != null and manufacturerId != ''">
AND t.manufacturer_id like concat('%', #{manufacturerId}, '%')
</if>
<if test="onlineStatus != null">
AND t.online_status = #{onlineStatus}
</if>
<if test="provinceId != null">
AND t.province_id = #{provinceId}
</if>
<if test="cityId != null">
AND t.city_id = #{cityId}
</if>
<if test="beginRegisterTime != null and beginRegisterTime != ''">
AND t.register_time &gt;= #{beginRegisterTime}
</if>
<if test="endRegisterTime != null and endRegisterTime != ''">
AND t.register_time &lt;= #{endRegisterTime}
</if>
</where>
order by t.update_time desc
</select>
<insert id="insertTerminal" parameterType="com.bonus.sgzb.base.domain.Terminal" useGeneratedKeys="true" keyProperty="terminalId">
insert into jtt808_terminal
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="phoneNumber != null and phoneNumber != ''">phone_number,</if>
<if test="imei != null and imei != ''">imei,</if>
<if test="provinceId != null">province_id,</if>
<if test="cityId != null">city_id,</if>
<if test="manufacturerId != null and manufacturerId != ''">manufacturer_id,</if>
<if test="terminalModel != null and terminalModel != ''">terminal_model,</if>
<if test="terminalDeviceId != null and terminalDeviceId != ''">terminal_device_id,</if>
<if test="plateColor != null">plate_color,</if>
<if test="plateNumber != null and plateNumber != ''">plate_number,</if>
<if test="authCode != null and authCode != ''">auth_code,</if>
<if test="registerTime != null">register_time,</if>
<if test="lastAuthTime != null">last_auth_time,</if>
<if test="onlineStatus != null">online_status,</if>
<if test="lastHeartbeatTime != null">last_heartbeat_time,</if>
<if test="clientIp != null and clientIp != ''">client_ip,</if>
create_time,
update_time
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="phoneNumber != null and phoneNumber != ''">#{phoneNumber},</if>
<if test="imei != null and imei != ''">#{imei},</if>
<if test="provinceId != null">#{provinceId},</if>
<if test="cityId != null">#{cityId},</if>
<if test="manufacturerId != null and manufacturerId != ''">#{manufacturerId},</if>
<if test="terminalModel != null and terminalModel != ''">#{terminalModel},</if>
<if test="terminalDeviceId != null and terminalDeviceId != ''">#{terminalDeviceId},</if>
<if test="plateColor != null">#{plateColor},</if>
<if test="plateNumber != null and plateNumber != ''">#{plateNumber},</if>
<if test="authCode != null and authCode != ''">#{authCode},</if>
<if test="registerTime != null">#{registerTime},</if>
<if test="lastAuthTime != null">#{lastAuthTime},</if>
<if test="onlineStatus != null">#{onlineStatus},</if>
<if test="lastHeartbeatTime != null">#{lastHeartbeatTime},</if>
<if test="clientIp != null and clientIp != ''">#{clientIp},</if>
sysdate(),
sysdate()
</trim>
</insert>
<update id="updateTerminal" parameterType="com.bonus.sgzb.base.domain.Terminal">
update jtt808_terminal
<set>
<if test="phoneNumber != null and phoneNumber != ''">phone_number = #{phoneNumber},</if>
<if test="imei != null and imei != ''">imei = #{imei},</if>
<if test="provinceId != null">province_id = #{provinceId},</if>
<if test="cityId != null">city_id = #{cityId},</if>
<if test="manufacturerId != null and manufacturerId != ''">manufacturer_id = #{manufacturerId},</if>
<if test="terminalModel != null and terminalModel != ''">terminal_model = #{terminalModel},</if>
<if test="terminalDeviceId != null and terminalDeviceId != ''">terminal_device_id = #{terminalDeviceId},</if>
<if test="plateColor != null">plate_color = #{plateColor},</if>
<if test="plateNumber != null and plateNumber != ''">plate_number = #{plateNumber},</if>
<if test="authCode != null and authCode != ''">auth_code = #{authCode},</if>
<if test="registerTime != null">register_time = #{registerTime},</if>
<if test="lastAuthTime != null">last_auth_time = #{lastAuthTime},</if>
<if test="onlineStatus != null">online_status = #{onlineStatus},</if>
<if test="lastHeartbeatTime != null">last_heartbeat_time = #{lastHeartbeatTime},</if>
<if test="clientIp != null and clientIp != ''">client_ip = #{clientIp},</if>
update_time = sysdate()
</set>
where terminal_id = #{terminalId}
</update>
<delete id="deleteTerminalById" parameterType="Long">
delete from jtt808_terminal where terminal_id = #{terminalId}
</delete>
<delete id="deleteTerminalByIds" parameterType="Long">
delete from jtt808_terminal where terminal_id in
<foreach item="terminalId" collection="array" open="(" separator="," close=")">
#{terminalId}
</foreach>
</delete>
<select id="selectTerminalByPhoneNumber" parameterType="String" resultMap="TerminalResult">
<include refid="selectTerminalVo"/>
where t.phone_number = #{phoneNumber}
</select>
<select id="selectTerminalByImei" parameterType="String" resultMap="TerminalResult">
<include refid="selectTerminalVo"/>
where t.imei = #{imei}
</select>
<select id="getTerminalStatistics" resultType="java.util.HashMap">
select
count(*) as total,
sum(case when online_status = 1 then 1 else 0 end) as onlineCount,
sum(case when online_status = 0 then 1 else 0 end) as offlineCount
from jtt808_terminal
</select>
<update id="updateOnlineStatus">
update jtt808_terminal
set online_status = #{onlineStatus},
client_ip = #{clientIp},
update_time = sysdate()
where terminal_id = #{terminalId}
</update>
<update id="updateHeartbeatTime">
update jtt808_terminal
set last_heartbeat_time = sysdate(),
online_status = 1,
update_time = sysdate()
where terminal_id = #{terminalId}
</update>
<!-- 查询省份列表 -->
<select id="selectProvinceList" resultType="java.util.HashMap">
select area_code, name
from sys_cnarea
where level = 1 and parent_code = 0
order by area_code
</select>
<!-- 根据省份编码查询城市列表 -->
<select id="selectCityListByProvince" parameterType="Long" resultType="java.util.HashMap">
select area_code, name
from sys_cnarea
where level = 2 and parent_code = #{provinceCode}
order by area_code
</select>
<!-- 根据城市编码查询区县列表 -->
<select id="selectCountyListByCity" parameterType="Long" resultType="java.util.HashMap">
select area_code, name
from sys_cnarea
where level = 2 and parent_code = #{cityCode}
order by area_code
</select>
<resultMap id="rateBaseResultMap" type="com.bonus.sgzb.base.domain.Jtt808GeofenceTerminalConfig">
<id property="id" column="id"/>
<result property="geofenceId" column="geofence_id"/>
<result property="phoneNumber" column="phone_number"/>
</resultMap>
<select id="selectByGeofenceId" resultMap="rateBaseResultMap">
select * from jtt808_geofence_terminal_config
where geofence_id = #{geofenceId}
</select>
<delete id="deleteByGeofenceId">
delete from jtt808_geofence_terminal_config
where geofence_id = #{geofenceId}
</delete>
<insert id="batchInsert">
insert into jtt808_geofence_terminal_config
(geofence_id, terminal_id)
values
<foreach collection="list" item="item" separator=",">
(#{item.geofenceId}, #{item.terminalId})
</foreach>
</insert>
</mapper>