diff --git a/health-watch/health-watch-api/src/main/java/com/renkang/watch/entity/WatchMonitorData.java b/health-watch/health-watch-api/src/main/java/com/renkang/watch/entity/WatchMonitorData.java index 8b98c54..b7d21b5 100644 --- a/health-watch/health-watch-api/src/main/java/com/renkang/watch/entity/WatchMonitorData.java +++ b/health-watch/health-watch-api/src/main/java/com/renkang/watch/entity/WatchMonitorData.java @@ -151,6 +151,20 @@ public class WatchMonitorData implements Serializable { @Excel(name = "部门编码", width = 15) @Schema(title = "部门编码") private java.lang.String orgCode; + /** + * 事件ID(用于告警事件与GPS位置更新关联的唯一标识) + */ + @Excel(name = "事件ID", width = 32) + @Schema(title = "事件ID") + private java.lang.String eventId; + /** + * 定位时间(手表上报的GPS定位时间,定时上报场景使用) + */ + @Excel(name = "定位时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(title = "定位时间") + private java.util.Date locateTime; @Schema(title = "员工编号") @TableField(exist = false) diff --git a/health-watch/health-watch-api/src/main/java/com/renkang/watch/vo/WatchNotifyVo.java b/health-watch/health-watch-api/src/main/java/com/renkang/watch/vo/WatchNotifyVo.java index af48e22..f441de1 100644 --- a/health-watch/health-watch-api/src/main/java/com/renkang/watch/vo/WatchNotifyVo.java +++ b/health-watch/health-watch-api/src/main/java/com/renkang/watch/vo/WatchNotifyVo.java @@ -45,4 +45,15 @@ public class WatchNotifyVo implements Serializable { private Date warnTime; private String gpsErrorMsg; + + /** + * 事件ID(用于告警事件与GPS位置更新关联的唯一标识) + */ + private String eventId; + + /** + * 定位时间(手表上报的GPS定位时间,定时上报场景使用) + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date locateTime; } diff --git a/health-watch/health-watch-biz/src/main/java/com/renkang/watch/controller/WatchApiController.java b/health-watch/health-watch-biz/src/main/java/com/renkang/watch/controller/WatchApiController.java index ab07ab2..53cd471 100644 --- a/health-watch/health-watch-biz/src/main/java/com/renkang/watch/controller/WatchApiController.java +++ b/health-watch/health-watch-biz/src/main/java/com/renkang/watch/controller/WatchApiController.java @@ -44,6 +44,21 @@ public class WatchApiController { return watchMonitorDataService.notice(json); } + /** + * 更新告警事件GPS位置信息接口 + * 根据 watchNo + eventId 联合定位已有告警数据; + * 仅更新GPS相关字段,不推送大屏与短信; + * 内部会调用高德接口进行GPS84→GCJ02坐标转换与地址反查。 + * + * @param json 入参(watchNo、eventId、lon、lat、address、locateTime、gpsErrorMsg) + * @return 处理结果 + */ + @PostMapping("/updateMonitorGps") + @Operation(summary = "更新告警事件GPS位置信息") + public AjaxJson updateMonitorGps(@RequestBody JSONObject json) { + return watchMonitorDataService.updateMonitorGps(json); + } + @GetMapping("/setData") public AjaxJson setData() { AjaxJson ajaxJson = new AjaxJson(); diff --git a/health-watch/health-watch-biz/src/main/java/com/renkang/watch/service/IWatchMonitorDataService.java b/health-watch/health-watch-biz/src/main/java/com/renkang/watch/service/IWatchMonitorDataService.java index 481af2e..044ff3d 100644 --- a/health-watch/health-watch-biz/src/main/java/com/renkang/watch/service/IWatchMonitorDataService.java +++ b/health-watch/health-watch-biz/src/main/java/com/renkang/watch/service/IWatchMonitorDataService.java @@ -38,6 +38,17 @@ public interface IWatchMonitorDataService extends IService { */ AjaxJson notice(JSONObject jsonObject); + /** + * 更新告警事件GPS位置信息 + * 根据 watchNo + eventId 联合定位已有告警数据; + * 缺失任一定位字段则忽略;已存在GPS信息则忽略; + * 仅更新数据,不推送大屏与短信。 + * + * @param jsonObject 入参(含 watchNo、eventId、lon、lat、address、locateTime、gpsErrorMsg 等) + * @return 处理结果 + */ + AjaxJson updateMonitorGps(JSONObject jsonObject); + /** * 处理历史数据 orgCode为空的问题 * @return diff --git a/health-watch/health-watch-biz/src/main/java/com/renkang/watch/service/impl/WatchMonitorDataServiceImpl.java b/health-watch/health-watch-biz/src/main/java/com/renkang/watch/service/impl/WatchMonitorDataServiceImpl.java index e21ec63..a11662c 100644 --- a/health-watch/health-watch-biz/src/main/java/com/renkang/watch/service/impl/WatchMonitorDataServiceImpl.java +++ b/health-watch/health-watch-biz/src/main/java/com/renkang/watch/service/impl/WatchMonitorDataServiceImpl.java @@ -265,6 +265,102 @@ public class WatchMonitorDataServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WatchMonitorData::getWatchNo, data.getWatchNo()) + .eq(WatchMonitorData::getEventId, data.getEventId()); + List existList = this.list(queryWrapper); + if (CollUtil.isEmpty(existList)) { + logger.warn("更新GPS信息失败,未匹配到告警记录 watchNo={}, eventId={}", data.getWatchNo(), data.getEventId()); + ajaxJson.setSuccess(true); + return ajaxJson; + } + + // 已存在GPS信息则忽略本次更新,避免覆盖已有有效坐标 + boolean hasGps = existList.stream().anyMatch(m -> m.getLon() != null && m.getLat() != null); + if (hasGps) { + logger.info("告警记录已有GPS信息,忽略本次更新 watchNo={}, eventId={}", data.getWatchNo(), data.getEventId()); + ajaxJson.setSuccess(true); + return ajaxJson; + } + + // 计算高德坐标与高德地址(参考 createMonitorData 逻辑) + WatchMonitorData updateEntity = new WatchMonitorData(); + updateEntity.setLon(data.getLon()); + updateEntity.setLat(data.getLat()); + updateEntity.setAddress(data.getAddress()); + updateEntity.setGpsErrorMsg(data.getGpsErrorMsg()); + updateEntity.setLocateTime(data.getLocateTime()); + + if (Stream.of(data.getLon(), data.getLat()).allMatch(value -> ObjUtil.isNotEmpty(value) && value != 0)) { + Gps gps = GPS84ToGCJ02(data.getLon(), data.getLat()); + if (null != gps) { + // 写入高德坐标 + updateEntity.setLonGd(BigDecimal.valueOf(gps.getLongitude())); + updateEntity.setLatGd(BigDecimal.valueOf(gps.getLatitude())); + // 调用高德接口获取地址信息 + AmapResultVo amapResultVo = amapService.getFormattedAddress(gps.getLongitude(), gps.getLatitude(), 5000); + if (amapResultVo.isSuccess()) { + updateEntity.setAddressGd(amapResultVo.getAddress()); + updateEntity.setAddress(amapResultVo.getAddress()); + } else { + String originError = StrUtil.isBlank(updateEntity.getGpsErrorMsg()) ? "" : updateEntity.getGpsErrorMsg() + ";"; + updateEntity.setGpsErrorMsg(originError + amapResultVo.getErrorMsg()); + } + } + } + + // 仅更新 GPS 相关字段,不推送大屏、不发短信 + boolean updated = this.lambdaUpdate() + .eq(WatchMonitorData::getWatchNo, data.getWatchNo()) + .eq(WatchMonitorData::getEventId, data.getEventId()) + .set(WatchMonitorData::getLon, updateEntity.getLon()) + .set(WatchMonitorData::getLat, updateEntity.getLat()) + .set(WatchMonitorData::getAddress, updateEntity.getAddress()) + .set(WatchMonitorData::getLonGd, updateEntity.getLonGd()) + .set(WatchMonitorData::getLatGd, updateEntity.getLatGd()) + .set(WatchMonitorData::getAddressGd, updateEntity.getAddressGd()) + .set(WatchMonitorData::getGpsErrorMsg, updateEntity.getGpsErrorMsg()) + .set(WatchMonitorData::getLocateTime, updateEntity.getLocateTime()) + .update(); + + if (!updated) { + logger.warn("更新GPS信息失败 watchNo={}, eventId={}", data.getWatchNo(), data.getEventId()); + } else { + logger.info("更新GPS信息成功 watchNo={}, eventId={}, 共更新{}条", data.getWatchNo(), data.getEventId(), existList.size()); + } + + ajaxJson.setSuccess(true); + return ajaxJson; + } + /** * 构建异常数据 * @@ -272,6 +368,7 @@ public class WatchMonitorDataServiceImpl extends ServiceImpl {}", JSONObject.toJSONString(data)); WatchMonitorData monitorDataEntity = new WatchMonitorData(); monitorDataEntity.setAddress(data.getAddress());