安眼平台接口对接

This commit is contained in:
feng
2025-11-20 15:15:34 +08:00
parent ec67a5e064
commit e975d62c17
15 changed files with 482 additions and 11 deletions
@@ -1,9 +1,7 @@
package com.renkang.anyan.client;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.renkang.anyan.model.dto.HealthRoomDTO;
import com.renkang.anyan.model.dto.HealthSignListParam;
import com.renkang.anyan.model.dto.MedicalAbnormalDTO;
import com.renkang.anyan.model.dto.*;
import com.renkang.anyan.model.vo.*;
import java.util.Date;
@@ -135,4 +133,44 @@ public interface AnYanClient {
* @return
*/
AnYanUserInfoResult getAnYanUserInfo(String token);
/**
* 批量拉取安眼平台AED信息 , 用于定时任务更新本地数据的AED数据
*
* @return
*/
List<AnYanAedInfo> queryAnYanAedInfo();
/**
* 最新检查员工信息查询接口 (大屏首页重点关爱趋势预警滚动列表,固定查100前项)
*
* @return 最新的100条数据
*/
List<CarePersonList> homeCarePersonList();
/**
* 一人一案信息详情接口 (用大屏首页重点关爱趋势预警滚动列表点击数据详情)
*
* @param anYanUserId 安眼系统的用户ID (从上级列表接口获取) 与 idNo 参数二选一即可
* @param idNo 安眼系统的用户身份证号 (从上级列表接口获取) 与 anYanUserId 参数二选一即可
* @return
*/
CareUserListVo careUserDetails(String anYanUserId, String idNo);
/**
* 一人一案分页列表查询接口(用大屏首页重点关爱趋势预警弹窗列表)
*
* @param param 查询条件
* @return
*/
IPage<CareUserListVo> careUserDetailsPage(CareUserDetailsParam param);
/**
* 查询关爱联络员信息及急救人员查询接口
*
* @param param 查询条件
* @return
*/
IPage<EmergencyContactVO> queryEmergencyContact(EmergencyContactParam param);
}
@@ -12,10 +12,7 @@ import com.renkang.anyan.config.AnYanProperties;
import com.renkang.anyan.config.RestTemplateUtil;
import com.renkang.anyan.constants.AnYanConstants;
import com.renkang.anyan.enums.AnYanApiEnum;
import com.renkang.anyan.model.dto.AuthParam;
import com.renkang.anyan.model.dto.HealthRoomDTO;
import com.renkang.anyan.model.dto.HealthSignListParam;
import com.renkang.anyan.model.dto.MedicalAbnormalDTO;
import com.renkang.anyan.model.dto.*;
import com.renkang.anyan.model.vo.*;
import com.renkang.anyan.utils.PageResultToBeanUtil;
import com.renkang.anyan.utils.SM4Utils;
@@ -127,6 +124,7 @@ public class AnYanClientExecutor implements AnYanClient {
return null;
}
/*调用安眼提供的支持公网访问的获取token接口也能通过接口的鉴权, 并且部分接口还需要传入鉴权用户的身份证号, 所以业务接口直接使用公网环境的鉴权接口
@Override
public void refreshToken() {
AuthResult authResult = getAuthTokenExecutor();
@@ -140,6 +138,22 @@ public class AnYanClientExecutor implements AnYanClient {
HttpHeaders headers = new HttpHeaders();
headers.add(AnYanConstants.AUTHORIZATION, AnYanConstants.TOKEN_TYPE + getAuthToken());
return headers;
}*/
@Override
public void refreshToken() {
AuthResult authResult = publicNetworkTokenNoCache();
if (ObjectUtil.isNotEmpty(authResult) && StrUtil.isNotEmpty(authResult.getAccess_token())) {
int expireSeconds = ObjectUtil.isNotEmpty(authResult.getExpires_in()) ? authResult.getExpires_in() : 7200;
redisClientUtil.set(new RedisKeyPrefix(expireSeconds, AnYanConstants.AN_YAN_API_TOKEN_PREFIX), "publicToken", authResult.getAccess_token());
}
}
private HttpHeaders buildTokenHeader() {
HttpHeaders headers = new HttpHeaders();
headers.add(AnYanConstants.AUTHORIZATION, AnYanConstants.TOKEN_TYPE + publicNetworkToken());
headers.add(AnYanConstants.HEADER_PARAM_X_AUTH_ID, AnYanConstants.X_AUTH_ID_PREFIX + anYanProperties.getPublicUserCardNo());
return headers;
}
@Override
@@ -286,4 +300,44 @@ public class AnYanClientExecutor implements AnYanClient {
return BeanUtil.toBean(exchange.getBody(), AnYanUserInfoResult.class);
}
@Override
public List<AnYanAedInfo> queryAnYanAedInfo() {
//安眼接口本身支持分页查询 , 因此方法用于定时任务批量查询更新 , 这里一次性查询所有
AnYanResult<Object> result = RestTemplateUtil.postExchange(AnYanApiEnum.QUERY_AN_YAN_AED, buildTokenHeader(), new AnYanAedParam());
IPage<AnYanAedInfo> aedPage = new PageResultToBeanUtil<AnYanAedInfo>().transform(result, AnYanAedInfo.class);
return aedPage.getRecords();
}
@Override
public List<CarePersonList> homeCarePersonList(){
AnYanResult<Object> result = RestTemplateUtil.postExchange(AnYanApiEnum.CARE_PERSON_BY_TIME, buildTokenHeader(), null);
List<Object> listMaps = (List<Object>) result.getData();
return listMaps.stream().map(lMap -> BeanUtil.toBean(lMap, CarePersonList.class)).collect(Collectors.toList());
}
@Override
public CareUserListVo careUserDetails(String anYanUserId, String idNo){
JSONObject param = new JSONObject();
if(StrUtil.isNotEmpty(anYanUserId)){
param.put("id", anYanUserId);
}
if(StrUtil.isNotEmpty(idNo)){
param.put("idNo", idNo);
}
AnYanResult<Object> result = RestTemplateUtil.postExchange(AnYanApiEnum.CARE_PERSON_Details, buildTokenHeader(), param);
return BeanUtil.toBean(result.getData(), CareUserListVo.class);
}
@Override
public IPage<CareUserListVo> careUserDetailsPage(CareUserDetailsParam param){
AnYanResult<Object> result = RestTemplateUtil.postExchange(AnYanApiEnum.CARE_PERSON_PAGE_LIST, buildTokenHeader(), param);
return new PageResultToBeanUtil<CareUserListVo>().transform(result, CareUserListVo.class);
}
@Override
public IPage<EmergencyContactVO> queryEmergencyContact(EmergencyContactParam param){
AnYanResult<Object> result = RestTemplateUtil.postExchange(AnYanApiEnum.QUERY_EMPLOYEE_CARE_PERSON, buildTokenHeader(), param);
return new PageResultToBeanUtil<EmergencyContactVO>().transform(result, EmergencyContactVO.class);
}
}
@@ -42,6 +42,10 @@ public class AnYanProperties {
*公网环境的鉴权密码 (目前或者大屏调转的toekn使用)
*/
private String publicPassWrod = "";
/**
*鉴权用户的身份证号,部分接口的请求头参数中需要传入
*/
private String publicUserCardNo = "737720666075238400";
/**
*链接超时时间
*/
@@ -17,6 +17,14 @@ public interface AnYanConstants {
* token类型
*/
String TOKEN_TYPE = "bearer ";
/**
* 部分业务接口需要代入的请求头参数X-Auth-Id
*/
String HEADER_PARAM_X_AUTH_ID = "X-Auth-Id";
/**
* 请求头参数X-Auth-Id 固定前缀
*/
String X_AUTH_ID_PREFIX = "&id:";
/**
* 缓存调用安眼系统接口鉴权token缓存key
*/
@@ -75,7 +75,31 @@ public enum AnYanApiEnum {
* 13.获取员工信息及单位-V2
*/
USER_INFO_UNIT_V2("/iosp-iam/v2/users/self", "?containsUnit=true", HttpMethod.GET),
;
/**
* 14.查询AED信息
*/
QUERY_AN_YAN_AED("/aygc-znhpt-sys/0/api/aedEquipedInfo/findPage", "", HttpMethod.POST),
/**
* 15.一人一案最新检查员工列表查询接口 (大屏首页重点关爱趋势预警滚动列表,固定查100前项)
*/
CARE_PERSON_BY_TIME("/aygc-znhpt-sys/0/api/empPersonFile/listByCreateTime", "", HttpMethod.POST),
/**
* 16.一人一案信息详情接口 (用大屏首页重点关爱趋势预警滚动列表点击数据详情)
*/
CARE_PERSON_Details("/aygc-znhpt-sys/0/api/empPersonFile/fileDetails", "", HttpMethod.POST),
/**
* 17.一人一案分页列表接口 (用大屏首页重点关爱趋势二级弹窗列表)
*/
CARE_PERSON_PAGE_LIST("aygc-znhpt-sys/0/api/empPersonFile/findPage", "", HttpMethod.POST),
/**
* 18.查询关爱联络员信息及急救人员查询接口
*/
QUERY_EMPLOYEE_CARE_PERSON("aygc-znhpt-sys/0/api/empCareEmp/findPageByIdNo", "", HttpMethod.POST);
/**
* 接口路径
@@ -0,0 +1,34 @@
package com.renkang.anyan.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(title = "AED接口查询参数", description = "AED接口查询参数")
public class AnYanAedParam {
/**
* 二级单位名称
*/
@Schema(title = "二级单位名称")
private String secondOfficeName;
/**
* 三级单位名称
*/
@Schema(title = "三级单位名称")
private String thirdOfficeName;
/**
* 提供地点
*/
@Schema(title = "提供地点")
private String providePlace;
/**
* pageNo
*/
@Schema(title = "pageNo")
private Integer pageNo = 1;
/**
* pageSize
*/
@Schema(title = "pageSize")
private Integer pageSize = 9999;
}
@@ -0,0 +1,34 @@
package com.renkang.anyan.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(title = "AED接口查询参数", description = "AED接口查询参数")
public class CareUserDetailsParam {
/**
* 员工姓名
*/
@Schema(title = "员工姓名")
private String name;
/**
* 工作单位
*/
@Schema(title = "工作单位")
private String workUnit;
/**
* 数据级别
*/
@Schema(title = "数据级别")
private String dataLevel = "0";
/**
* pageNo
*/
@Schema(title = "pageNo")
private Integer pageNo = 1;
/**
* pageSize
*/
@Schema(title = "pageSize")
private Integer pageSize = 10;
}
@@ -0,0 +1,34 @@
package com.renkang.anyan.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(title = "应急联系人查询参数", description = "应急联系人查询参数")
public class EmergencyContactParam {
/**
* 员工ID
*/
@Schema(title = "员工ID")
private String emId;
/**
* 身份证号
*/
@Schema(title = "身份证号")
private String idNo;
/**
* 数据级别
*/
@Schema(title = "数据级别")
private String dataLevel = "0";
/**
* pageNo
*/
@Schema(title = "pageNo")
private Integer pageNo = 1;
/**
* pageSize
*/
@Schema(title = "pageSize")
private Integer pageSize = 10;
}
@@ -0,0 +1,82 @@
package com.renkang.anyan.model.vo;
import cn.hutool.core.util.StrUtil;
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.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
@Data
@Schema(title = "安眼系统AED数据详情", description = "安眼系统AED数据详情")
public class AnYanAedInfo {
/**
* id
*/
private String id;
/**
* 二级单位名称
*/
@Schema(title = "二级单位名称")
private String secondOfficeName;
/**
* 三级单位名称
*/
@Schema(title = "三级单位名称")
private String thirdOfficeName;
/**
* 提供地点
*/
@Schema(title = "提供地点")
private String providePlace;
/**
* 电话
*/
@Schema(title = "电话")
private String tel;
/**
* 经度
*/
@Schema(title = "经度")
private String lon;
/**
* 纬度
*/
@Schema(title = "纬度")
private String lat;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(title = "创建时间")
private Date createDate;
/**
* 更新时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(title = "更新时间")
private Date updateDate;
public String getLon() {
//安眼提供的经纬度过长, 在这里只保留6位小数
if(StrUtil.isNotEmpty(lon)){
BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble(lon)).setScale(6, RoundingMode.HALF_UP);
return bigDecimal.toString();
}
return lon;
}
public String getLat() {
//安眼提供的经纬度过长, 在这里只保留6位小数
if(StrUtil.isNotEmpty(lat)){
BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble(lat)).setScale(6, RoundingMode.HALF_UP);
return bigDecimal.toString();
}
return lat;
}
}
@@ -0,0 +1,48 @@
package com.renkang.anyan.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.jeecg.common.aspect.annotation.Dict;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class CarePersonList {
/**
* 姓名
*/
@Schema(title = "姓名")
private String name;
/**
* 员工ID
*/
@Schema(title = "员工ID")
private String empId;
/**
* 性别 (返回的是'男''女',汉字)
*/
@Schema(title = "性别")
private String sex;
/**
* 年龄
*/
@Schema(title = "年龄")
private Integer age;
/**
* 身份证号
*/
@Schema(title = "身份证号")
private String idNo;
/**
* 检查年份
*/
@Schema(title = "检查年份")
private String checkYear;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(title = "最新检查时间")
private Date createDate;
}
@@ -33,7 +33,7 @@ public class CareUserListVo {
@Schema(title = "修改时间")
private String updateDate;
@Schema(title = "关爱状态(0-已完成,1-未完成)")
@Schema(title = "数据级别")
private Integer dataLevel;
@Schema(title = "负面清单")
@@ -140,4 +140,17 @@ public class CareUserListVo {
@Schema(title = "关爱联络员姓名")
private String careLiaisonName;
@Schema(title = "治疗方案反馈")
private String treatPlanResponse;
@Schema(title = "饮食建议反馈")
private String dietSuggestionResponse;
@Schema(title = "运动指导反馈")
private String sportGuideResponse;
@Schema(title = "日常生活管理反馈")
private String lifeManageResponse;
}
@@ -0,0 +1,93 @@
package com.renkang.anyan.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(title="安眼员工关爱联络员信息及急救人员信息",description="安眼员工关爱联络员信息及急救人员信息")
public class EmergencyContactVO {
@Schema(title = "记录编号")
private String id;
@Schema(title = "关爱员工编号")
private String empId;
@Schema(title = "单位名称")
private String workUnit;
@Schema(title = "关爱身份证号")
private String idNo;
@Schema(title = "联系电话")
private String phone;
@Schema(title = "员工姓名")
private String name;
@Schema(title = "单位id")
private String workUnitId;
@Schema(title = "性别标识(1-男,2-女)")
private String sexCode;
@Schema(title = "性别翻译")
private String sexCodeText;
@Schema(title = "办公场所周边4分钟内是否配备AED(1是 2否)")
private Integer officeAedAvailable;
@Schema(title = "办公场所AED是否能有专人管理(1是 2否)")
private Integer officeAedManaged;
@Schema(title = "办公场所AED管理人员姓名")
private String officeAedManagerName;
@Schema(title = "办公场所AED管理人员电话")
private String officeAedManagerPhone;
@Schema(title = "当班班组是否配备取证急救人员(1是 2否)")
private Integer teamHasFirstaider;
@Schema(title = "急救人员姓名")
private String firstAiderName;
@Schema(title = "急救人员电话")
private String firstAiderPhone;
@Schema(title = "重点关爱人员是否倒班(1是 2否)")
private Integer keycareShiftWork;
@Schema(title = "夜晚是否在单位公寓住宿(1是 2否)")
private Integer keycareNightStay;
@Schema(title = "是否有陪同住宿人员(1是 2否)")
private Integer hasCompanion;
@Schema(title = "陪同住宿人员是否取得急救证(1是 2否)")
private Integer companionCertified;
@Schema(title = "宿舍是否安装一键报警(1是 2否)")
private Integer dormAlarmAvailable;
@Schema(title = "公寓周边4分钟内是否配备AED(1是 2否)")
private Integer dormAedAvailable;
@Schema(title = "公寓AED是否能有专人管理(1是 2否)")
private Integer dormAedManaged;
@Schema(title = "关爱联络员id")
private String relationEmpId;
@Schema(title = "关爱联络员名称")
private String relationEmpName;
@Schema(title = "关爱联络员职务编码")
private String relationEmpPosts;
@Schema(title = "关爱联络员职务翻译")
private String relationEmpPostsText;
@Schema(title = "关爱联络员手机号")
private String relationEmpPhone;
}
@@ -26,6 +26,11 @@ public class HospitalListVO {
*/
@Schema(title = "地点")
private String address;
/**
* 电话
*/
@Schema(title = "电话")
private String phone;
/**
* 经度
*/