diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/AreaController.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/AreaController.java new file mode 100644 index 0000000..36a87c3 --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/AreaController.java @@ -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> provinceList = areaService.selectProvinceList(); + return AjaxResult.success(provinceList); + } + + /** + * 根据省份编码获取城市列表 + */ + @GetMapping("/cities/{provinceCode}") + public AjaxResult listCities(@PathVariable Long provinceCode) { + List> cityList = areaService.selectCityListByProvince(provinceCode); + return AjaxResult.success(cityList); + } + + /** + * 根据城市编码获取区县列表 + */ + @GetMapping("/counties/{cityCode}") + public AjaxResult listCounties(@PathVariable Long cityCode) { + List> countyList = areaService.selectCountyListByCity(cityCode); + return AjaxResult.success(countyList); + } +} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/Jtt808GeofenceTerminalConfigController.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/Jtt808GeofenceTerminalConfigController.java new file mode 100644 index 0000000..c481dd6 --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/Jtt808GeofenceTerminalConfigController.java @@ -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)); + } +} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/TerminalController.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/TerminalController.java new file mode 100644 index 0000000..2ce9e9a --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/controller/TerminalController.java @@ -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 list = terminalService.selectTerminalList(terminal); + return getDataTable(list); + } + + /** + * 导出终端设备列表 + */ + @Log(title = "终端设备", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, Terminal terminal) { + List list = terminalService.selectTerminalList(terminal); + ExcelUtil 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)); + } +} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/GeofenceConfigDTO.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/GeofenceConfigDTO.java new file mode 100644 index 0000000..22d00f8 --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/GeofenceConfigDTO.java @@ -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 terminalIds; + private List phoneNumbers; +} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/Jtt808GeofenceTerminalConfig.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/Jtt808GeofenceTerminalConfig.java new file mode 100644 index 0000000..a5595aa --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/Jtt808GeofenceTerminalConfig.java @@ -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; +} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/Terminal.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/Terminal.java new file mode 100644 index 0000000..7f7ff55 --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/domain/Terminal.java @@ -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; + + +} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/mapper/TerminalMapper.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/mapper/TerminalMapper.java new file mode 100644 index 0000000..1fb87b6 --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/mapper/TerminalMapper.java @@ -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 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 getTerminalStatistics(); + + /** + * 更新在线状态 + */ + int updateOnlineStatus(@Param("terminalId") Long terminalId, + @Param("onlineStatus") Integer onlineStatus, + @Param("clientIp") String clientIp); + + /** + * 更新心跳时间 + */ + int updateHeartbeatTime(@Param("terminalId") Long terminalId); + + /** + * 查询省份列表 + */ + List> selectProvinceList(); + + /** + * 根据省份编码查询城市列表 + */ + List> selectCityListByProvince(@Param("provinceCode") Long provinceCode); + + /** + * 根据城市编码查询区县列表 + */ + List> selectCountyListByCity(@Param("cityCode") Long cityCode); + + List selectByGeofenceId(Long geofenceId); + int deleteByGeofenceId(Long geofenceId); + int batchInsert(List list); + +} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/service/ITerminalService.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/service/ITerminalService.java new file mode 100644 index 0000000..52fdc16 --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/service/ITerminalService.java @@ -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 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 getTerminalStatistics(); + + /** + * 更新在线状态 + */ + int updateOnlineStatus(Long terminalId, Integer onlineStatus, String clientIp); + + /** + * 更新心跳时间 + */ + int updateHeartbeatTime(Long terminalId); + + /** + * 根据手机号查询终端 + */ + Terminal selectTerminalByPhoneNumber(String phoneNumber); + + /** + * 查询省份列表 + */ + List> selectProvinceList(); + + /** + * 根据省份编码查询城市列表 + */ + List> selectCityListByProvince(Long provinceCode); + + /** + * 根据城市编码查询区县列表 + */ + List> selectCountyListByCity(Long cityCode); + + /** + * 保存围栏绑定的终端手机号(先删后插) + */ + int saveGeofencePhones(Long geofenceId, List terminalIds); + + /** + * 查询围栏已绑定的终端手机号,用于回显 + */ + List selectPhonesByGeofenceId(Long geofenceId); +} diff --git a/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/service/impl/TerminalServiceImpl.java b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/service/impl/TerminalServiceImpl.java new file mode 100644 index 0000000..7b2df2c --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/java/com/bonus/sgzb/base/service/impl/TerminalServiceImpl.java @@ -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 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 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> selectProvinceList() { + return terminalMapper.selectProvinceList(); + } + + @Override + public List> selectCityListByProvince(Long provinceCode) { + return terminalMapper.selectCityListByProvince(provinceCode); + } + + @Override + public List> selectCountyListByCity(Long cityCode) { + return terminalMapper.selectCountyListByCity(cityCode); + } + + @Override + public int saveGeofencePhones(Long geofenceId, List terminalIds) { + // 先删旧的 + terminalMapper.deleteByGeofenceId(geofenceId); + + if (terminalIds == null || terminalIds.isEmpty()) { + return 0; + } + + String username = SecurityUtils.getUsername(); + List 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 selectPhonesByGeofenceId(Long geofenceId) { + List list = terminalMapper.selectByGeofenceId(geofenceId); + List phones = new ArrayList<>(); + for (Jtt808GeofenceTerminalConfig c : list) { + phones.add(c.getTerminalId()); + } + return phones; + } +} diff --git a/sgzb-modules/sgzb-material/src/main/resources/mapper/base/TerminalMapper.xml b/sgzb-modules/sgzb-material/src/main/resources/mapper/base/TerminalMapper.xml new file mode 100644 index 0000000..f2da8ec --- /dev/null +++ b/sgzb-modules/sgzb-material/src/main/resources/mapper/base/TerminalMapper.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + insert into jtt808_terminal + + phone_number, + imei, + province_id, + city_id, + manufacturer_id, + terminal_model, + terminal_device_id, + plate_color, + plate_number, + auth_code, + register_time, + last_auth_time, + online_status, + last_heartbeat_time, + client_ip, + create_time, + update_time + + + #{phoneNumber}, + #{imei}, + #{provinceId}, + #{cityId}, + #{manufacturerId}, + #{terminalModel}, + #{terminalDeviceId}, + #{plateColor}, + #{plateNumber}, + #{authCode}, + #{registerTime}, + #{lastAuthTime}, + #{onlineStatus}, + #{lastHeartbeatTime}, + #{clientIp}, + sysdate(), + sysdate() + + + + + update jtt808_terminal + + phone_number = #{phoneNumber}, + imei = #{imei}, + province_id = #{provinceId}, + city_id = #{cityId}, + manufacturer_id = #{manufacturerId}, + terminal_model = #{terminalModel}, + terminal_device_id = #{terminalDeviceId}, + plate_color = #{plateColor}, + plate_number = #{plateNumber}, + auth_code = #{authCode}, + register_time = #{registerTime}, + last_auth_time = #{lastAuthTime}, + online_status = #{onlineStatus}, + last_heartbeat_time = #{lastHeartbeatTime}, + client_ip = #{clientIp}, + update_time = sysdate() + + where terminal_id = #{terminalId} + + + + delete from jtt808_terminal where terminal_id = #{terminalId} + + + + delete from jtt808_terminal where terminal_id in + + #{terminalId} + + + + + + + + + + + update jtt808_terminal + set online_status = #{onlineStatus}, + client_ip = #{clientIp}, + update_time = sysdate() + where terminal_id = #{terminalId} + + + + update jtt808_terminal + set last_heartbeat_time = sysdate(), + online_status = 1, + update_time = sysdate() + where terminal_id = #{terminalId} + + + + + + + + + + + + + + + + + + + + + + delete from jtt808_geofence_terminal_config + where geofence_id = #{geofenceId} + + + + insert into jtt808_geofence_terminal_config + (geofence_id, terminal_id) + values + + (#{item.geofenceId}, #{item.terminalId}) + + + + +