0919新需求开发

This commit is contained in:
wanghao
2025-09-25 13:58:00 +08:00
parent 273d1377b9
commit ff6e83f1c8
22 changed files with 714 additions and 35 deletions
@@ -0,0 +1,20 @@
package com.renkang.anyan.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class CareUserVO {
private String userId;
@Schema(title = "关爱联络员姓名")
private String careLiaisonName;
@Schema(title = "关爱联络员电话")
private String careLiaisonPhone;
@Schema(title = "关爱联络员职务")
private String careLiaisonJob;
@Schema(title = "急救人员姓名")
private String lifeguardName;
@Schema(title = "急救人员电话")
private String lifeguardPhone;
}
@@ -28,7 +28,7 @@ public class EmergencySocket {
private List<TblBaseHospitalVo> hospitalList;
private String type;
private String centerId;
@Schema(title = "1:紧急求助 2:云坐席 3:终端报警")
@Schema(title = "0:120 1:紧急求助 2:云坐席 3:终端报警")
private Integer popType;
private String queue;
private String noticeId;
@@ -32,6 +32,10 @@
<groupId>com.renkang</groupId>
<artifactId>xj-anyan-api</artifactId>
</dependency>
<dependency>
<groupId>com.renkang</groupId>
<artifactId>health-watch-api</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
@@ -688,14 +688,17 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
order.setSalvageUserIdCard(loginUser.getIdCard());
order.setSalvageUserDepart(loginUser.getOrgCode());
order.setSalvageUserAvatar(loginUser.getAvatar());
// 大屏推送及发送短信
EmergencySocket socket = new EmergencySocket();
// 如果是120 插入应急中心
if (StrUtil.isBlank(emergencyCall.getCenterId()) && EmergencyConstants.CALL_TYPE_0.equals(emergencyCall.getCallType())) {
Call call = officerOnDuty();
order.setCenterId(call.getCenterId());
socket.setPopType(0);
}else {
socket.setPopType(1);
}
orderMapper.insert(order);
// 大屏推送及发送短信
EmergencySocket socket = new EmergencySocket();
socket.setType(emergencyCall.getCallType());
socket.setCenterId(emergencyCall.getCenterId());
socket.setOrgCode(loginUser.getOrgCode());
@@ -1,21 +1,20 @@
package com.renkang.emergency.api.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.renkang.emergency.api.service.EmergencyResourceApiService;
import com.renkang.emergency.bean.common.ResourceExt;
import com.renkang.emergency.bean.response.ResourceHome;
import com.renkang.emergency.constant.EmergencyConstants;
import com.renkang.emergency.entity.EmergencyHealthRoom;
import com.renkang.emergency.entity.EmergencyResourceDO;
import com.renkang.emergency.entity.Order;
import com.renkang.emergency.entity.Resource;
import com.renkang.emergency.entity.*;
import com.renkang.emergency.manager.EmergencyCloudManager;
import com.renkang.emergency.manager.ResourceManager;
import com.renkang.emergency.mapper.OrderMapper;
import com.renkang.emergency.mapper.ResourceMapper;
import com.renkang.emergency.service.IEmergencyHealthRoomService;
import com.renkang.emergency.service.IXjAedService;
import com.renkang.emergency.util.ResourceUtils;;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
@@ -50,6 +49,8 @@ public class EmergencyResourceApiServiceImpl implements EmergencyResourceApiServ
private ResourceMapper resourceMapper;
@Autowired
private IEmergencyHealthRoomService roomService;
@Autowired
private IXjAedService xjAedService;
@Autowired
private ISysBaseAPI sysBaseAPI;
@@ -71,7 +72,23 @@ public class EmergencyResourceApiServiceImpl implements EmergencyResourceApiServ
// 字典数据
List<DictModel> dictItems = emergencyCloudManager.getDictItems(EmergencyConstants.EMERGENCY_RESOURCE_TYPE_DICT);
// home.setDicts(dictItems);
// if ("4".equals(type)) {
// List<XjAed> list = xjAedService.list();
// List<ResourceExt> extList = new ArrayList<>();
// for (XjAed xjAed : list) {
// ResourceExt ext = new ResourceExt();
// BeanUtil.copyProperties(xjAed, ext);
// ext.setName(xjAed.getName());
// ext.setAddress(xjAed.getAddress());
// ext.setLatitude(xjAed.getLatitude());
// ext.setLongitude(xjAed.getLongitude());
// extList.add(ext);
// }
// home.setResources(extList);
// } else {
//
// }
if (ObjectUtils.isEmpty(longitude) || ObjectUtils.isEmpty(latitude)) {
if (!"3".equals(type)) {
home.setDicts(dictItems);
@@ -230,7 +230,6 @@ public class LargeScreenImpl {
ListUser listUser = new ListUser();
listUser.setUserIds(Collections.singletonList(sysUser.getId()));
List<HealthUserEmployeeEx> exList = sysBaseAPI.listEmployeeUserByIds(listUser);
socket.setPopType(1);
socket.setUserId(sysUser.getId());
socket.setRealName(sysUser.getRealname());
socket.setAge(sysUser.getAge());
@@ -1,6 +1,7 @@
package com.renkang.emergency.largeScreen.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.renkang.anyan.model.dto.HealthRoomDTO;
import com.renkang.anyan.model.dto.HealthSignListParam;
import com.renkang.anyan.model.dto.MedicalAbnormalDTO;
@@ -9,14 +10,8 @@ import com.renkang.emergency.entity.TblBaseHospitalVo;
import com.renkang.emergency.entity.dto.*;
import com.renkang.emergency.entity.vo.DataDetailVO;
import com.renkang.emergency.entity.vo.MedicalDataVO;
import com.renkang.emergency.largeScreen.entity.dto.HealthRoomBaseDTO;
import com.renkang.emergency.largeScreen.entity.dto.HealthSignDTO;
import com.renkang.emergency.largeScreen.entity.dto.MedicalAbnormalStatisticsDTO;
import com.renkang.emergency.largeScreen.entity.dto.MedicalPeopleNumStatisticsDTO;
import com.renkang.emergency.largeScreen.entity.vo.HealthRoomVO;
import com.renkang.emergency.largeScreen.entity.vo.HealthSignVO;
import com.renkang.emergency.largeScreen.entity.vo.HospitalVO;
import com.renkang.emergency.largeScreen.entity.vo.LargeScreenMap;
import com.renkang.emergency.largeScreen.entity.dto.*;
import com.renkang.emergency.largeScreen.entity.vo.*;
import com.renkang.emergency.largeScreen.service.ILargeScreenDataService;
import com.renkang.emergency.largeScreen.service.ILargeScreenService;
import com.renkang.emergency.service.ITbUserHelpMacService;
@@ -253,4 +248,33 @@ public class LargeScreenNewController {
return Result.ok(largeScreenDataService.nearResources(longitude,latitude));
}
/**
* 今日应急
* @param dto 参数
* @return vo
*/
@PostMapping("todayEmergencyList")
public Result<IPage<TodayEmergencyVO>> todayEmergencyList(@RequestBody TodayEmergencyDTO dto){
return Result.ok(largeScreenDataService.todayEmergencyList(dto));
}
/**
* 健康档案
* @param userId 用户id
* @return vo
*/
@GetMapping("healthArchives")
public Result<HealthArchivesVO> healthArchives(@RequestParam(name = "userId") String userId){
return Result.ok(largeScreenDataService.healthArchives(userId));
}
/**
* 获取应急及关爱人员
* @param userId
* @return
*/
@GetMapping("careUser")
public Result<CareUserVO> careUser(@RequestParam(name = "userId") String userId){
return Result.ok(largeScreenDataService.careUser(userId));
}
}
@@ -0,0 +1,36 @@
package com.renkang.emergency.largeScreen.entity.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class TodayEmergencyDTO {
/**
* 开始时间
*/
@Schema(title = "开始时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date startDate;
/**
*结束时间
*/
@Schema(title = "结束时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endDate;
/**
* pageNo
*/
@Schema(title = "pageNo")
private Integer pageNo = 1;
/**
* pageSize
*/
@Schema(title = "pageSize")
private Integer pageSize = 10;
}
@@ -0,0 +1,32 @@
package com.renkang.emergency.largeScreen.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class HealthArchivesVO {
@Schema(title = "BMI")
private String bmi;
@Schema(title = "尿酸")
private String ua;
@Schema(title = "血同型半胱氨酸")
private String hcy;
@Schema(title = "空腹葡萄糖")
private String glu;
@Schema(title = "目测收缩压监测值")
private String sbp;
@Schema(title = "目测舒张压监测值")
private String dbp;
@Schema(title = "总胆固醇")
private String tc;
@Schema(title = "甘油三酯")
private String tg;
@Schema(title = "低密度脂蛋白")
private String ldl;
@Schema(title = "既往史")
private String pastHistory;
@Schema(title = "手术史")
private String surgicalHistory;
@Schema(title = "用药史")
private String medicationHistory;
}
@@ -0,0 +1,52 @@
package com.renkang.emergency.largeScreen.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.renkang.emergency.entity.TblQimoNotice;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class TodayEmergencyVO {
@Schema(title = "userId")
private String userId;
@Schema(title = "姓名")
private String realName;
@Schema(title = "0:120 1:紧急求助 2:云坐席 3:终端报警")
private String emergencyType;
@Schema(title = "事件类型(emergencyType=3 才有值)")
@Dict(dicCode = "watch_event_type")
private String eventType;
@Schema(title = "性别")
@Dict(dicCode = "sex2")
private Integer sex;
@Schema(title = "年龄")
private Integer age;
@Schema(title = "手机号码")
private String phone;
@Schema(title = "二级单位code")
private String departCode;
@Schema(title = "二级单位名称")
private String departName;
@Schema(title = "三级部门code")
private String orgCode;
@Schema(title = "三级部门名称")
private String orgName;
@Schema(title = "位置")
private String address;
@Schema(title = "经度")
private BigDecimal longitude;
@Schema(title = "纬度")
private BigDecimal latitude;
@Schema(title = "描述")
private String memo;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(title = "时间")
private Date time;
}
@@ -3,11 +3,15 @@ package com.renkang.emergency.largeScreen.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.renkang.anyan.model.vo.CareUserListVo;
import com.renkang.anyan.model.vo.CareUserVO;
import com.renkang.emergency.entity.LargeScreenData;
import com.renkang.emergency.entity.TblBaseHospitalVo;
import com.renkang.emergency.entity.dto.LargeScreenDataValueDTO;
import com.renkang.emergency.entity.vo.DataDetailVO;
import com.renkang.emergency.entity.vo.MedicalDataVO;
import com.renkang.emergency.largeScreen.entity.dto.TodayEmergencyDTO;
import com.renkang.emergency.largeScreen.entity.vo.HealthArchivesVO;
import com.renkang.emergency.largeScreen.entity.vo.TodayEmergencyVO;
import java.util.List;
@@ -34,4 +38,10 @@ public interface ILargeScreenDataService extends IService<LargeScreenData> {
IPage<CareUserListVo> loveTrend(String centerId, String name, String orgName, Integer pageNo, Integer pageSize);
List<TblBaseHospitalVo> nearResources(String longitude, String latitude);
IPage<TodayEmergencyVO> todayEmergencyList(TodayEmergencyDTO dto);
HealthArchivesVO healthArchives(String userId);
CareUserVO careUser(String userId);
}
@@ -1,7 +1,11 @@
package com.renkang.emergency.largeScreen.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.PageUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
@@ -11,18 +15,33 @@ 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.renkang.anyan.model.vo.CareUserListVo;
import com.renkang.emergency.entity.LargeScreenData;
import com.renkang.emergency.entity.Resource;
import com.renkang.emergency.entity.TblBaseHospitalVo;
import com.renkang.emergency.entity.XjAed;
import com.renkang.anyan.model.vo.CareUserVO;
import com.renkang.emergency.entity.*;
import com.renkang.emergency.entity.dto.LargeScreenDataValueDTO;
import com.renkang.emergency.entity.vo.DataDetailVO;
import com.renkang.emergency.entity.vo.MedicalDataVO;
import com.renkang.emergency.largeScreen.entity.dto.TodayEmergencyDTO;
import com.renkang.emergency.largeScreen.entity.vo.HealthArchivesVO;
import com.renkang.emergency.largeScreen.entity.vo.TodayEmergencyVO;
import com.renkang.emergency.largeScreen.mapper.LargeScreenDataMapper;
import com.renkang.emergency.largeScreen.service.ILargeScreenDataService;
import com.renkang.emergency.mapper.TblUserHelpMapper;
import com.renkang.emergency.service.IResourceService;
import com.renkang.emergency.service.ITbQimoNoticeService;
import com.renkang.emergency.service.ITbUserHelpMacService;
import com.renkang.emergency.service.IXjAedService;
import com.renkang.emergency.util.HealthArchivesGenerator;
import com.renkang.watch.api.WatchApi;
import com.renkang.watch.vo.WatchMonitorDataVo;
import lombok.RequiredArgsConstructor;
import org.jeecg.bean.request.ListUser;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.global.GlobalUtils;
import org.jeecg.modules.manager.ISysCache;
import org.jeecg.modules.system.entity.HealthUserEmployeeEx;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.util.TypeConversionUtil;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
@@ -45,6 +64,11 @@ public class LargeScreenDataServiceImpl extends ServiceImpl<LargeScreenDataMappe
private final IResourceService resourceService;
private final IXjAedService xjAedService;
private final ITbQimoNoticeService noticeService;
private final TblUserHelpMapper userHelpMapper;
private final WatchApi watchApi;
private final ISysBaseAPI sysBaseAPI;
private final ISysCache sysCache;
public Boolean editValue(LargeScreenDataValueDTO dto) {
if (StrUtil.isEmpty(dto.getCenterId())) {
@@ -597,4 +621,230 @@ public class LargeScreenDataServiceImpl extends ServiceImpl<LargeScreenDataMappe
return degree * Math.PI / 180.0;
}
@Override
public IPage<TodayEmergencyVO> todayEmergencyList(TodayEmergencyDTO dto) {
List<TodayEmergencyVO> list = new ArrayList<>();
Date date = new Date();
Date startDate = ObjUtil.isNotEmpty(dto.getStartDate()) ?
DateUtil.beginOfDay(dto.getStartDate()) : DateUtil.beginOfDay(date);
Date endDate = ObjUtil.isNotEmpty(dto.getEndDate()) ?
DateUtil.endOfDay(dto.getEndDate()).offset(DateField.MILLISECOND, -999) :
DateUtil.endOfDay(date).offset(DateField.MILLISECOND, -999);
// 获取数据
emergencyData(startDate, endDate, list);
noticeData(startDate, endDate, list);
watchData(startDate, endDate, list);
if (CollUtil.isEmpty(list)) {
return new Page<>();
}
// 使用HuTool工具类排序和分页
return processWithHuTool(list, dto);
}
/**
* 使用HuTool工具类处理排序和分页
*/
private IPage<TodayEmergencyVO> processWithHuTool(List<TodayEmergencyVO> list, TodayEmergencyDTO dto) {
// 按时间字段倒序排序
ListUtil.sort(list, (o1, o2) -> {
Date time1 = o1.getTime();
Date time2 = o2.getTime();
if (time1 == null && time2 == null) return 0;
if (time1 == null) return 1;
if (time2 == null) return -1;
return time2.compareTo(time1);
});
// 分页参数处理
int pageNo = ObjectUtil.defaultIfNull(dto.getPageNo(), 1);
int pageSize = ObjectUtil.defaultIfNull(dto.getPageSize(), 10);
int total = list.size();
// 计算分页范围
int startIndex = (pageNo - 1) * pageSize;
if (startIndex > total) {
startIndex = total;
}
int endIndex = Math.min(startIndex + pageSize, total);
List<TodayEmergencyVO> pageList = ListUtil.sub(list, startIndex, endIndex);
// 创建分页结果
IPage<TodayEmergencyVO> page = new Page<>(pageNo, pageSize, total);
page.setRecords(pageList);
return page;
}
/**
* 获取云坐席数据
*
* @param startDate 开始时间
* @param endDate 结束时间
* @param list 列表
*/
private void noticeData(Date startDate, Date endDate, List<TodayEmergencyVO> list) {
List<TblQimoNotice> noticeList = noticeService.list(
new LambdaQueryWrapper<TblQimoNotice>().between(TblQimoNotice::getCreateDate, startDate, endDate));
if (noticeList != null && !noticeList.isEmpty()) {
List<String> phoneList = noticeList.stream().map(TblQimoNotice::getCallNo).distinct().collect(Collectors.toList());
List<SysUser> userList = sysBaseAPI.getUserByPhoneList(phoneList).getResult();
// 根据手机号分组
Map<String, List<SysUser>> userMap = userList.stream().collect(Collectors.groupingBy(SysUser::getPhone));
for (TblQimoNotice notice : noticeList) {
TodayEmergencyVO vo = new TodayEmergencyVO();
vo.setEmergencyType("2");
vo.setPhone(notice.getCallNo());
List<SysUser> users = userMap.get(notice.getCallNo());
if (users != null) {
SysUser sysUser = users.get(0);
vo.setUserId(sysUser.getId());
vo.setRealName(sysUser.getRealname());
vo.setSex(sysUser.getSex());
vo.setAge(sysUser.getAge());
if (ObjUtil.isNotEmpty(sysUser.getOrgCode())) {
SysDepart secondDepart = sysCache.getDepartByOrgCode(GlobalUtils.getSecondDepartOrgCode(sysUser.getOrgCode()));
if (secondDepart != null) {
vo.setDepartCode(secondDepart.getOrgCode());
vo.setDepartName(secondDepart.getDepartName());
}
SysDepart thirdDepart = sysCache.getDepartByOrgCode(GlobalUtils.getThirdDepartOrgCode(sysUser.getOrgCode()));
if (thirdDepart != null) {
vo.setOrgCode(thirdDepart.getOrgCode());
vo.setOrgName(thirdDepart.getDepartName());
}
}
} else {
vo.setRealName("未知");
vo.setDepartName("未知");
vo.setOrgName("未知");
}
vo.setTime(notice.getCreateDate());
list.add(vo);
}
}
}
/**
* 获取应急数据
* @param startDate 开始时间
* @param endDate 结束时间
* @param list 列表
*/
private void emergencyData(Date startDate, Date endDate, List<TodayEmergencyVO> list){
List<TblUserHelp> userHelpList = userHelpMapper.selectList(
new LambdaQueryWrapper<TblUserHelp>().between(TblUserHelp::getHelpTime, startDate, endDate).in(TblUserHelp::getType,Arrays.asList("0","1")));
if (userHelpList != null && !userHelpList.isEmpty()) {
List<String> userIdList = userHelpList.stream().map(TblUserHelp::getUserId).distinct().collect(Collectors.toList());
List<LoginUser> userList = sysBaseAPI.listUserByIdsNew(userIdList);
// 根据用户id分组
Map<String, LoginUser> userMap = userList.stream()
.collect(Collectors.toMap(LoginUser::getId, a -> a, (k1, k2) -> k1));
for (TblUserHelp tblUserHelp : userHelpList) {
TodayEmergencyVO vo = new TodayEmergencyVO();
vo.setUserId(tblUserHelp.getUserId());
if (tblUserHelp.getType().equals("0")){
vo.setEmergencyType("0");
}
if (tblUserHelp.getType().equals("1")){
vo.setEmergencyType("1");
}
vo.setPhone(tblUserHelp.getOutMobile());
LoginUser user = userMap.get(tblUserHelp.getUserId());
if (user != null) {
vo.setRealName(user.getRealname());
vo.setSex(user.getSex());
vo.setAge(user.getAge());
if (ObjUtil.isNotEmpty(user.getOrgCode())) {
SysDepart secondDepart = sysCache.getDepartByOrgCode(GlobalUtils.getSecondDepartOrgCode(user.getOrgCode()));
if (secondDepart != null) {
vo.setDepartCode(secondDepart.getOrgCode());
vo.setDepartName(secondDepart.getDepartName());
}
SysDepart thirdDepart = sysCache.getDepartByOrgCode(GlobalUtils.getThirdDepartOrgCode(user.getOrgCode()));
if (thirdDepart != null) {
vo.setOrgCode(thirdDepart.getOrgCode());
vo.setOrgName(thirdDepart.getDepartName());
}
}
vo.setLongitude(tblUserHelp.getLon());
vo.setLatitude(tblUserHelp.getLat());
} else {
vo.setRealName("未知");
vo.setDepartName("未知");
vo.setOrgName("未知");
}
vo.setTime(tblUserHelp.getHelpTime());
list.add(vo);
}
}
}
/**
* 获取预警数据
* @param startDate 开始时间
* @param endDate 结束时间
* @param list 列表
*/
private void watchData(Date startDate, Date endDate, List<TodayEmergencyVO> list){
IPage<WatchMonitorDataVo> watchListResult = GlobalUtils.getCloudResultData(
watchApi.getMonitorList(null, null, DateUtil.formatDate(startDate), DateUtil.formatDate(endDate),
1, -1));
if (watchListResult != null) {
List<WatchMonitorDataVo> watchList = watchListResult.getRecords();
if (watchList != null && !watchList.isEmpty()) {
for (WatchMonitorDataVo watch : watchList) {
TodayEmergencyVO vo = new TodayEmergencyVO();
vo.setUserId(watch.getUserId());
vo.setRealName(watch.getRealName());
vo.setEmergencyType("3");
vo.setSex(watch.getSex());
vo.setAge(watch.getAge());
vo.setPhone(watch.getPhone());
vo.setDepartName(watch.getOrgName1());
vo.setOrgName(watch.getOrgName2());
vo.setAddress(watch.getAddress());
vo.setLongitude(watch.getLon());
vo.setLatitude(watch.getLat());
vo.setEventType(watch.getEventType());
vo.setTime(watch.getWarnTime());
list.add(vo);
}
}
}
}
@Override
public HealthArchivesVO healthArchives(String userId) {
return HealthArchivesGenerator.generateRandomHealthArchives();
}
@Override
public CareUserVO careUser(String userId) {
ListUser user = new ListUser();
user.setUserIds(Collections.singletonList(userId));
List<HealthUserEmployeeEx> healthUserEmployeeExes = sysBaseAPI.listEmployeeUserByIds(user);
CareUserVO careUserVO = new CareUserVO();
careUserVO.setUserId(userId);
if (healthUserEmployeeExes != null && !healthUserEmployeeExes.isEmpty()) {
careUserVO.setCareLiaisonName(healthUserEmployeeExes.get(0).getCareLiaisonName());
careUserVO.setCareLiaisonPhone(healthUserEmployeeExes.get(0).getCareLiaisonPhone());
careUserVO.setCareLiaisonJob(healthUserEmployeeExes.get(0).getCareLiaisonJob());
careUserVO.setLifeguardName(healthUserEmployeeExes.get(0).getLifeguardName());
careUserVO.setLifeguardPhone(healthUserEmployeeExes.get(0).getLifeguardPhone());
}
return careUserVO;
}
}
@@ -137,7 +137,7 @@ public class XjAedServiceImpl extends ServiceImpl<XjAedMapper, XjAed> implements
@Override
public void aedDataUtil() {
StringBuilder sb = new StringBuilder();
String[] split = converter.run("东经E85°0251" + "-" + "北纬N45°3734").split("-");
String[] split = converter.run("东经E85°058" + "-" + "北纬N45°3250").split("-");
CoordinateConverter.Gps gps = CoordinateConverter.GPS84ToGCJ02(
TypeConversionUtil.toDoubleOfNull(split[0]), TypeConversionUtil.toDoubleOfNull(split[1]));
if (gps != null) {
@@ -0,0 +1,206 @@
package com.renkang.emergency.util;
import com.renkang.emergency.largeScreen.entity.vo.HealthArchivesVO;
import java.util.Random;
public class HealthArchivesGenerator {
private static final Random random = new Random();
// 常见疾病列表
private static final String[] COMMON_DISEASES = {
"高血压", "糖尿病", "冠心病", "高血脂", "哮喘", "慢性支气管炎",
"胃炎", "胃溃疡", "关节炎", "骨质疏松", "甲状腺功能异常"
};
// 常见手术列表
private static final String[] COMMON_SURGERIES = {
"阑尾切除术", "胆囊切除术", "甲状腺切除术", "疝气修补术", "骨折内固定术",
"白内障手术", "冠状动脉搭桥术", "子宫肌瘤切除术", "前列腺切除术"
};
// 常见药物列表
private static final String[] COMMON_MEDICATIONS = {
"阿司匹林", "二甲双胍", "硝苯地平", "阿托伐他汀", "美托洛尔",
"氯沙坦", "胰岛素", "布洛芬", "奥美拉唑", "氨氯地平"
};
// 药物剂量单位
private static final String[] DOSAGE_UNITS = {"mg", "g", "ml", "", ""};
public static HealthArchivesVO generateRandomHealthArchives() {
HealthArchivesVO vo = new HealthArchivesVO();
// 生成BMI (正常范围18.5-24,可适当超出)
vo.setBmi(generateBMI());
// 生成尿酸 (正常范围150-420μmol/L)
vo.setUa(generateUA());
// 生成血同型半胱氨酸 (正常范围5-15μmol/L)
vo.setHcy(generateHCY());
// 生成空腹葡萄糖 (正常范围3.9-6.1mmol/L)
vo.setGlu(generateGLU());
// 生成收缩压 (正常范围90-140mmHg)
vo.setSbp(generateSBP());
// 生成舒张压 (正常范围60-90mmHg)
vo.setDbp(generateDBP());
// 生成总胆固醇 (正常范围2.8-5.7mmol/L)
vo.setTc(generateTC());
// 生成甘油三酯 (正常范围0.45-1.7mmol/L)
vo.setTg(generateTG());
// 生成低密度脂蛋白 (正常范围1.5-3.1mmol/L)
vo.setLdl(generateLDL());
// 生成既往史
vo.setPastHistory(generatePastHistory());
// 生成手术史
vo.setSurgicalHistory(generateSurgicalHistory());
// 生成用药史
vo.setMedicationHistory(generateMedicationHistory());
return vo;
}
private static String generateBMI() {
// BMI正常范围18.5-24,生成范围15-35
double bmi = 15 + random.nextDouble() * 20;
return String.format("%.1f", bmi);
}
private static String generateUA() {
// 尿酸正常150-420,生成范围100-600
int ua = 100 + random.nextInt(500);
return String.valueOf(ua);
}
private static String generateHCY() {
// 血同型半胱氨酸正常5-15,生成范围3-25
double hcy = 3 + random.nextDouble() * 22;
return String.format("%.1f", hcy);
}
private static String generateGLU() {
// 空腹葡萄糖正常3.9-6.1,生成范围2.5-12
double glu = 2.5 + random.nextDouble() * 9.5;
return String.format("%.1f", glu);
}
private static String generateSBP() {
// 收缩压正常90-140,生成范围70-180
int sbp = 70 + random.nextInt(110);
return String.valueOf(sbp);
}
private static String generateDBP() {
// 舒张压正常60-90,生成范围50-110
int dbp = 50 + random.nextInt(60);
return String.valueOf(dbp);
}
private static String generateTC() {
// 总胆固醇正常2.8-5.7,生成范围2.0-8.0
double tc = 2.0 + random.nextDouble() * 6.0;
return String.format("%.1f", tc);
}
private static String generateTG() {
// 甘油三酯正常0.45-1.7,生成范围0.3-5.0
double tg = 0.3 + random.nextDouble() * 4.7;
return String.format("%.1f", tg);
}
private static String generateLDL() {
// 低密度脂蛋白正常1.5-3.1,生成范围1.0-5.0
double ldl = 1.0 + random.nextDouble() * 4.0;
return String.format("%.1f", ldl);
}
private static String generatePastHistory() {
int diseaseCount = random.nextInt(3); // 0-2种疾病
if (diseaseCount == 0) {
return "无重大既往病史";
}
StringBuilder history = new StringBuilder();
for (int i = 0; i < diseaseCount; i++) {
String disease = COMMON_DISEASES[random.nextInt(COMMON_DISEASES.length)];
int years = 1 + random.nextInt(20); // 患病年限1-20年
history.append(String.format("%d年前诊断患有%s", years, disease));
}
return history.toString();
}
private static String generateSurgicalHistory() {
boolean hasSurgery = random.nextDouble() < 0.3; // 30%概率有手术史
if (!hasSurgery) {
return "无手术史";
}
String surgery = COMMON_SURGERIES[random.nextInt(COMMON_SURGERIES.length)];
int yearsAgo = 2 + random.nextInt(30); // 2-30年前的手术
String hospital = getRandomHospital();
return String.format("%d年在%s医院接受%s,术后恢复良好。", yearsAgo, hospital, surgery);
}
private static String generateMedicationHistory() {
boolean hasMedication = random.nextDouble() < 0.5; // 50%概率有用药史
if (!hasMedication) {
return "无长期用药史";
}
int medCount = 1 + random.nextInt(2); // 1-2种药物
StringBuilder medication = new StringBuilder();
for (int i = 0; i < medCount; i++) {
String drug = COMMON_MEDICATIONS[random.nextInt(COMMON_MEDICATIONS.length)];
int dosage = 5 + random.nextInt(45); // 剂量5-50
String unit = DOSAGE_UNITS[random.nextInt(DOSAGE_UNITS.length)];
int timesPerDay = 1 + random.nextInt(3); // 每日1-3次
boolean stillTaking = random.nextBoolean();
medication.append(String.format("%s %d%s/次,每日%d次,%s",
drug, dosage, unit, timesPerDay, stillTaking ? "目前仍在服用" : "已停药"));
}
return medication.toString();
}
private static String getRandomHospital() {
String[] hospitals = {"市人民医院", "省立医院", "协和医院", "华西医院", "中山医院", "瑞金医院"};
return hospitals[random.nextInt(hospitals.length)];
}
// 重载方法,支持传入现有的VO对象进行赋值
public static void populateRandomData(HealthArchivesVO vo) {
if (vo == null) {
return;
}
HealthArchivesVO randomData = generateRandomHealthArchives();
// 使用反射或者直接setter赋值,这里使用直接赋值
vo.setBmi(randomData.getBmi());
vo.setUa(randomData.getUa());
vo.setHcy(randomData.getHcy());
vo.setGlu(randomData.getGlu());
vo.setSbp(randomData.getSbp());
vo.setDbp(randomData.getDbp());
vo.setTc(randomData.getTc());
vo.setTg(randomData.getTg());
vo.setLdl(randomData.getLdl());
vo.setPastHistory(randomData.getPastHistory());
vo.setSurgicalHistory(randomData.getSurgicalHistory());
vo.setMedicationHistory(randomData.getMedicationHistory());
}
}
@@ -1,5 +1,6 @@
package com.renkang.watch.api;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.renkang.watch.api.fallback.WatchApiFallBack;
@@ -228,7 +229,7 @@ public interface WatchApi {
@Operation(summary = "查询自记动数据", description = "查询自记动数据")
@GetMapping(value = "/sports/record/today")
Result<List<UserRecordSportsVO>> queryUserTodaySportsList(@RequestParam(name = "dateStr",required = false) @Parameter(description = "日期(yyyy-MM-dd不传默认查当天)") String dateStr);
Result<List<UserRecordSportsVO>> queryUserTodaySportsList(@RequestParam(name = "dateStr", required = false) @Parameter(description = "日期(yyyy-MM-dd不传默认查当天)") String dateStr);
@PostMapping("/sports/record/playSign")
@Operation(summary = "查询用户当日运动打卡数据(目前供干预中体重管理功能使用)", description = "查询用户当日运动打卡数据(目前供干预中体重管理功能使用)")
@@ -238,8 +239,9 @@ public interface WatchApi {
@GetMapping(value = "/sports/record/playData")
Result<List<PlayDataDayStatisticVO>> playDataDayStatistic(@RequestParam(name = "startDate") @Parameter(description = "起始日期(yyyy-mm-dd)") String startDate,
@RequestParam(name = "endDate") @Parameter(description = "起始日期(yyyy-mm-dd)") String endDate,
@RequestParam(name = "userId",required = false) @Parameter(description = "默认从token中获取") String userId,
@RequestParam(name = "cardNo",required = false) @Parameter(description = "默认从token中获取") String cardNo);
@RequestParam(name = "userId", required = false) @Parameter(description = "默认从token中获取") String userId,
@RequestParam(name = "cardNo", required = false) @Parameter(description = "默认从token中获取") String cardNo);
/**
* 该接口目前只有干预体重管理数据归档的定时任务中使用
*/
@@ -249,7 +251,7 @@ public interface WatchApi {
@PostMapping("/sports/weChat/upload")
@Operation(summary = "同步微信步数", description = "同步微信步数")
Result<?> uploadUserWeChatStep(@RequestBody List<WeChatStepVO> dataList );
Result<?> uploadUserWeChatStep(@RequestBody List<WeChatStepVO> dataList);
@PostMapping("/sports/weChat/findByScope")
@Operation(summary = "查询用户微信运动步数", description = "查询用户微信运动步数")
@@ -260,6 +262,14 @@ public interface WatchApi {
Result<List<PlayDataDetailVO>> playDataDayDetailByUserId(@RequestParam(name = "date") @Parameter(description = "日期(yyyy-mm-dd)") String date,
@RequestParam(name = "userId") @Parameter(description = "用户id") String userId,
@RequestParam(name = "idCard") @Parameter(description = "身份证号") String idCard);
@GetMapping("/watch/watchMonitorData/getMonitorList")
Result<Page<WatchMonitorDataVo>> getMonitorList(@RequestParam(name = "orgCode", required = false) String orgCode,
@RequestParam(name = "orgCodeList", required = false) String orgCodeList,
@RequestParam(name = "startDate", required = false) String startDate,
@RequestParam(name = "endDate", required = false) String endDate,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize);
}
@@ -65,6 +65,9 @@ public class WatchMonitorDataVo {
@Schema(title = "纬度")
private BigDecimal lat;
@Schema(title = "userId")
private String userId;
/**
* 用户真实姓名
*/
@@ -75,14 +75,14 @@ public class WatchMonitorDataController extends JeecgController<WatchMonitorData
*/
@Operation(summary = "应急大屏-健康终端报警列表", description = "应急大屏-健康终端报警列表")
@GetMapping(value = "/getMonitorList")
public Result<IPage<WatchMonitorDataVo>> getMonitorList(@RequestParam(name = "orgCode",required = false) String orgCode,
public Result<Page<WatchMonitorDataVo>> getMonitorList(@RequestParam(name = "orgCode",required = false) String orgCode,
@RequestParam(name = "orgCodeList", required = false) String orgCodeList,
@RequestParam(name = "startDate", required = false) String startDate,
@RequestParam(name = "endDate", required = false) String endDate,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<WatchMonitorData> page = new Page<WatchMonitorData>(pageNo, pageSize);
IPage<WatchMonitorDataVo> pageList = watchMonitorDataService.getMonitorList(page,orgCode,orgCodeList,startDate,endDate);
Page<WatchMonitorDataVo> pageList = watchMonitorDataService.getMonitorList(page,orgCode,orgCodeList,startDate,endDate);
return Result.OK(pageList);
}
@@ -30,7 +30,7 @@ public interface IWatchMonitorDataService extends IService<WatchMonitorData> {
* @return
* @param page
*/
IPage<WatchMonitorDataVo> getMonitorList(Page<WatchMonitorData> page, String orgCode, String orgCodeList,String startDate,String endDate);
Page<WatchMonitorDataVo> getMonitorList(Page<WatchMonitorData> page, String orgCode, String orgCodeList,String startDate,String endDate);
/**
* 手表报警
@@ -625,7 +625,7 @@ public class WatchMonitorDataServiceImpl extends ServiceImpl<WatchMonitorDataMap
* @return
*/
@Override
public IPage<WatchMonitorDataVo> getMonitorList(Page<WatchMonitorData> page, String orgCode, String orgCodes, String startDate, String endDate) {
public Page<WatchMonitorDataVo> getMonitorList(Page<WatchMonitorData> page, String orgCode, String orgCodes, String startDate, String endDate) {
LambdaQueryWrapper<WatchMonitorData> queryWrapper = new LambdaQueryWrapper<>();
List<String> orgCodeList = new ArrayList<>();
@@ -701,6 +701,7 @@ public class WatchMonitorDataServiceImpl extends ServiceImpl<WatchMonitorDataMap
}
LoginUserNew userNew = userMap.get(watchMonitorData.getBindUserId());
if (ObjectUtil.isNotNull(userNew)) {
vo.setUserId(userNew.getId());
vo.setRealName(userNew.getRealname());
vo.setOrgCode(userNew.getOrgCode());
vo.setOrgName(userNew.getDepart() != null ? userNew.getDepart().getDepartName() : "");
@@ -726,7 +727,7 @@ public class WatchMonitorDataServiceImpl extends ServiceImpl<WatchMonitorDataMap
voList.add(vo);
});
}
IPage<WatchMonitorDataVo> pageVo = new Page<>();
Page<WatchMonitorDataVo> pageVo = new Page<>();
GlobalUtils.copyPageDataToTarget(pageList, pageVo);
pageVo.setRecords(voList);
return pageVo;
@@ -34,6 +34,11 @@ public class SysUserEmergencyContactApiController {
return sysUserEmergencyContactService.selectEmergencyContactList();
}
@Operation(summary = "查询紧急联系人列表", description = "查询紧急联系人列表")
@GetMapping("/contactList")
public Result<List<SysUserEmergencyContactDO>> contactList(@RequestParam(name = "userId") String userId) {
return sysUserEmergencyContactService.contactList(userId);
}
/**
* 添加或者修改紧急联系人
*
@@ -9,6 +9,8 @@ public interface SysUserEmergencyContactService {
Result<List<SysUserEmergencyContactDO>> selectEmergencyContactList();
Result<List<SysUserEmergencyContactDO>> contactList(String userId);
Result<String> updateAndInsertEmergencyContact(SysUserEmergencyContactDO sysUserEmergencyContactDO);
@@ -30,6 +30,11 @@ public class SysUserEmergencyContactServiceImpl implements SysUserEmergencyConta
return Result.ok(list);
}
@Override
public Result<List<SysUserEmergencyContactDO>> contactList(String userId) {
return Result.ok(sysUserEmergencyContactMapper.selectEmergencyContactListByUserId(userId));
}
@Override
public Result<String> updateAndInsertEmergencyContact(SysUserEmergencyContactDO sysUserEmergencyContactDO) {
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();