diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClient.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClient.java index 7b6d327..b3eb134 100644 --- a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClient.java +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClient.java @@ -104,4 +104,10 @@ public interface AnYanClient { * @return */ IPage medicalAbnormalList(MedicalAbnormalDTO param); + + /** + * 公网环境获取服务访问token (目前仅用于访问安眼大屏) + * @return + */ + String publicNetworkToken() throws Exception; } diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClientExecutor.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClientExecutor.java index 568e756..8b27aae 100644 --- a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClientExecutor.java +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/client/AnYanClientExecutor.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.renkang.anyan.config.AnYanProperties; @@ -16,10 +17,10 @@ import com.renkang.anyan.model.dto.HealthSignListParam; import com.renkang.anyan.model.dto.MedicalAbnormalDTO; import com.renkang.anyan.model.vo.*; import com.renkang.anyan.utils.PageResultToBeanUtil; +import com.renkang.anyan.utils.SM4Utils; +import com.renkang.anyan.utils.StringUtils; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; -import org.jeecg.common.api.vo.Result; import org.jeecg.common.exception.ExceptionAssertsUtil; import org.jeecg.util.RedisClientUtil; import org.jeecg.util.RedisKeyPrefix; @@ -28,10 +29,12 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.retry.annotation.EnableRetry; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -44,13 +47,15 @@ import java.util.stream.Collectors; @EnableRetry @RequiredArgsConstructor public class AnYanClientExecutor implements AnYanClient { + //安眼获取token访问公钥 + private String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJL0JkqsUoK6kt3JyogsgqNp9VDGDp+t3ZAGMbVoMPdHNT2nfiIVh9ZMNHF7g2XiAa8O8AQWyh2PjMR0NiUSVQMCAwEAAQ=="; private final RedisClientUtil redisClientUtil; private final AnYanProperties anYanProperties; @Override public String getAuthToken() { String token = redisClientUtil.get(new RedisKeyPrefix(AnYanConstants.AN_YAN_API_TOKEN_PREFIX) ,"token",String.class); - if(StringUtils.isEmpty(token)){ + if(StrUtil.isEmpty(token)){ AuthResult authResult = getAuthTokenExecutor(); if(ObjectUtil.isNotEmpty(authResult) && StrUtil.isNotEmpty(authResult.getAccess_token())){ token = authResult.getAccess_token(); @@ -92,75 +97,119 @@ public class AnYanClientExecutor implements AnYanClient { } @Override + @Retryable(maxAttempts = 2) public List examinationStatistics(Integer medicalYear) { if(null == medicalYear){ medicalYear = DateUtil.year(new Date()); } JSONObject param = new JSONObject(); param.put("medicalYear",String.valueOf(medicalYear)); - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.HEALTH_EXAMINATION_STATISTICS, buildTokenHeader(), param); - List listMaps = (List) result.getResult(); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.HEALTH_EXAMINATION_STATISTICS, buildTokenHeader(), param); + List listMaps = (List) result.getData(); return listMaps.stream().map(lMap -> BeanUtil.toBean(lMap, MedicalPeopleNumStatisticsVO.class)).collect(Collectors.toList()); } @Override + @Retryable(maxAttempts = 2) public HealthSignStatVO healthCheckStatistics(Date beginDate, Date endDate) { JSONObject param = new JSONObject(); param.put("inputDateBegin",ObjectUtil.isEmpty(beginDate)? DateUtil.today() : DateUtil.formatDate(beginDate)); param.put("inputDateEnd",ObjectUtil.isEmpty(endDate)? DateUtil.today() : DateUtil.formatDate(endDate)); - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.HEALTH_CHECK_STATISTICS, buildTokenHeader(), param); - return BeanUtil.toBean(result.getResult(),HealthSignStatVO.class); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.HEALTH_CHECK_STATISTICS, buildTokenHeader(), param); + return BeanUtil.toBean(result.getData(),HealthSignStatVO.class); } @Override + @Retryable(maxAttempts = 2) public IPage bloodPressureList(HealthSignListParam healthSignListParam) { - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.BLOOD_PRESSURE_LIST, buildTokenHeader(), healthSignListParam); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.BLOOD_PRESSURE_LIST, buildTokenHeader(), healthSignListParam); return new PageResultToBeanUtil().transform(result,BloodPressureList.class); } @Override + @Retryable(maxAttempts = 2) public IPage weightPressureList(HealthSignListParam healthSignListParam) { - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.WEIGHT_PRESSURE_LIST, buildTokenHeader(), healthSignListParam); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.WEIGHT_PRESSURE_LIST, buildTokenHeader(), healthSignListParam); return new PageResultToBeanUtil().transform(result,WeightPressureList.class); } @Override + @Retryable(maxAttempts = 2) public IPage bloodSugarClockSList(HealthSignListParam healthSignListParam) { - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.BLOOD_SUGAR_CLOCKS_LIST, buildTokenHeader(), healthSignListParam); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.BLOOD_SUGAR_CLOCKS_LIST, buildTokenHeader(), healthSignListParam); return new PageResultToBeanUtil().transform(result,BloodSugarClockSList.class); } @Override + @Retryable(maxAttempts = 2) public List hospitalList() { - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.HOSPITAL_LIST, buildTokenHeader(), null); - List listMaps = (List) result.getResult(); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.HOSPITAL_LIST, buildTokenHeader(), null); + List listMaps = (List) result.getData(); return listMaps.stream().map(lMap -> BeanUtil.toBean(lMap, HospitalListVO.class)).collect(Collectors.toList()); } @Override + @Retryable(maxAttempts = 2) public List healthPlaceHomList() { - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.HEALTH_PLACE_ROOM_LIST, buildTokenHeader(),null); - List listMaps = (List) result.getResult(); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.HEALTH_PLACE_ROOM_LIST, buildTokenHeader(),null); + List listMaps = (List) result.getData(); return listMaps.stream().map(lMap -> BeanUtil.toBean(lMap, HealthRoomBaseVO.class)).collect(Collectors.toList()); } @Override + @Retryable(maxAttempts = 2) public IPage healthPlaceHomDetailList(HealthRoomDTO healthRoomDTO) { - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.HEALTH_PLACE_ROOM_INFO_LIST, buildTokenHeader(), healthRoomDTO); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.HEALTH_PLACE_ROOM_INFO_LIST, buildTokenHeader(), healthRoomDTO); return new PageResultToBeanUtil().transform(result,HealthPlaceHomDetailsVO.class); } @Override + @Retryable(maxAttempts = 2) public MedicalAbnormalStatisticsVO medicalAbnormalStatistics(Integer medicalYear) { if(null == medicalYear){ medicalYear = DateUtil.year(new Date()); } JSONObject param = new JSONObject(); param.put("medicalYear",medicalYear); - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.MEDICAL_ABNORMAL_STATISTICS, buildTokenHeader(), param); - return BeanUtil.toBean(result.getResult(),MedicalAbnormalStatisticsVO.class); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.MEDICAL_ABNORMAL_STATISTICS, buildTokenHeader(), param); + return BeanUtil.toBean(result.getData(),MedicalAbnormalStatisticsVO.class); } @Override + @Retryable(maxAttempts = 2) public IPage medicalAbnormalList(MedicalAbnormalDTO param) { - Result result = RestTemplateUtil.postExchange(AnYanApiEnum.MEDICAL_ABNORMAL_LIST, buildTokenHeader(), param); + AnYanResult result = RestTemplateUtil.postExchange(AnYanApiEnum.MEDICAL_ABNORMAL_LIST, buildTokenHeader(), param); return new PageResultToBeanUtil().transform(result,MedicalAbnormalVO.class); } + @Override + public String publicNetworkToken() throws Exception { + String token = redisClientUtil.get(new RedisKeyPrefix(AnYanConstants.AN_YAN_API_TOKEN_PREFIX) ,"publicToken",String.class); + if(StrUtil.isEmpty(token)){ + JSONObject param = new JSONObject(); + String password = anYanProperties.getPublicPassWrod(); + String userName = anYanProperties.getPublicUserNmae(); + String sm4Password = SM4Utils.encryptSM4(password); + String encryptPassword = StringUtils.encryptByPublicKey(publicKey, password); + param.put("password",encryptPassword); + param.put("selfPassword",sm4Password); + param.put("loginName",userName); + param.put("timeStamp", UUID.randomUUID().toString()); + ResponseEntity responseEntity = RestTemplateUtil.postExchangeForGetToken(AnYanApiEnum.PUBLIC_NETWORK_AUTH_TOKEN, param,AnYanResult.class); + //安眼提供的接口包过深 ,先从AnYanResult对象中取出加密的密文,后在解密密文拿出 AuthResult对象 , 再从AuthResult对象中拿出 access_token + try { + AnYanResult anYanResult = responseEntity.getBody(); + if(ObjectUtil.isNotEmpty(anYanResult) && ObjectUtil.isNotEmpty(anYanResult.getData())){ + String decryptAuthResult = SM4Utils.decryptSM4((String) anYanResult.getData()); + AuthResult authResult = JSON.parseObject(decryptAuthResult).toJavaObject(AuthResult.class); + if(null != authResult && null != authResult.getAccess_token()){ + token = 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", token); + } + } + } catch (Exception e) { + e.printStackTrace(); + ExceptionAssertsUtil.fail("获取安眼系统token失败"); + } + } + return token; + } + } diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/config/AnYanProperties.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/config/AnYanProperties.java index 1cb8396..b6e8353 100644 --- a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/config/AnYanProperties.java +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/config/AnYanProperties.java @@ -30,6 +30,18 @@ public class AnYanProperties { *clientSecret */ private String clientSecret = ""; + /** + *公网可访问的接口地址 (目前或者大屏调转的toekn使用) + */ + private String publicHost = ""; + /** + * 公网环境的鉴权账号 (目前或者大屏调转的toekn使用) + */ + private String publicUserNmae = ""; + /** + *公网环境的鉴权密码 (目前或者大屏调转的toekn使用) + */ + private String publicPassWrod = ""; /** *链接超时时间 */ diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/config/RestTemplateUtil.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/config/RestTemplateUtil.java index e3eaf19..6d098d8 100644 --- a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/config/RestTemplateUtil.java +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/config/RestTemplateUtil.java @@ -1,9 +1,9 @@ package com.renkang.anyan.config; import com.renkang.anyan.enums.AnYanApiEnum; +import com.renkang.anyan.model.vo.AnYanResult; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; -import org.jeecg.common.api.vo.Result; import org.jeecg.common.util.SpringContextUtils; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -39,7 +39,7 @@ public class RestTemplateUtil { } /** - * 通用调用方法 + * 请求接口访问 token * @param api 接口 * @param requestBody 参数 * @return ResponseEntity @@ -50,6 +50,18 @@ public class RestTemplateUtil { return getRestTemplate().exchange(url, api.getHttpMethod(), requestEntity, responseType); } + /** + * 公网请求接口访问 token + * @param api 接口 + * @param requestBody 参数 + * @return ResponseEntity + */ + public static ResponseEntity postExchangeForGetToken(AnYanApiEnum api,Object requestBody,Class responseType) { + String url = getProperties().getPublicHost() + api.getMethodPath() + api.getMethodParam(); + HttpEntity requestEntity = new HttpEntity<>(requestBody); + return getRestTemplate().exchange(url, api.getHttpMethod(), requestEntity, responseType); + } + /** * 通用调用方法 * @param api 请求接口 @@ -57,10 +69,10 @@ public class RestTemplateUtil { * @param requestBody body参数 * @return Result对象 */ - public static Result postExchange(AnYanApiEnum api, HttpHeaders headers,Object requestBody) { + public static AnYanResult postExchange(AnYanApiEnum api, HttpHeaders headers, Object requestBody) { String url = getProperties().getHost() + api.getMethodPath() +api.getMethodParam(); HttpEntity requestEntity = new HttpEntity<>(requestBody,headers); - return responseHandler(getRestTemplate().exchange(url, api.getHttpMethod(), requestEntity, Result.class)); + return responseHandler(getRestTemplate().exchange(url, api.getHttpMethod(), requestEntity, AnYanResult.class)); } /** @@ -68,11 +80,11 @@ public class RestTemplateUtil { * @param entity * @return */ - private static > Result responseHandler(ResponseEntity entity) { + private static > AnYanResult responseHandler(ResponseEntity entity) { if(HttpStatus.OK.equals(entity.getStatusCode()) && ObjectUtils.isNotEmpty(entity.getBody())){ return entity.getBody(); }else{ - return Result.error("天眼系统API调用失败"); + return AnYanResult.error("天眼系统API调用失败"); } } diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/enums/AnYanApiEnum.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/enums/AnYanApiEnum.java index 00c881a..123fb13 100644 --- a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/enums/AnYanApiEnum.java +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/enums/AnYanApiEnum.java @@ -63,7 +63,12 @@ public enum AnYanApiEnum { /** *11.健康小屋详细数据查询 */ - HEALTH_PLACE_ROOM_INFO_LIST("/aygc-znhpt-sys/0/aystatistics/initEmpHealthRoomCheckinInfoPages","", HttpMethod.POST); + HEALTH_PLACE_ROOM_INFO_LIST("/aygc-znhpt-sys/0/aystatistics/initEmpHealthRoomCheckinInfoPages","", HttpMethod.POST), + + /** + * 12.从外网地址获取安眼token接口 + */ + PUBLIC_NETWORK_AUTH_TOKEN("/aygc-service-sys/0/api/xj/outside/getToken","", HttpMethod.POST); /** * 接口路径 diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/model/vo/AnYanResult.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/model/vo/AnYanResult.java new file mode 100644 index 0000000..4fa58e2 --- /dev/null +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/model/vo/AnYanResult.java @@ -0,0 +1,170 @@ +package com.renkang.anyan.model.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.jeecg.common.constant.CommonConstant; + +import java.io.Serializable; + +@Data +@Schema(title = "安眼系统接口返回对象", description = "安眼系统接口返回对象") +public class AnYanResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 成功标志 + */ + @Schema(title = "成功标志") + private boolean success = true; + + /** + * 返回处理消息 + */ + @Schema(title = "返回处理消息") + private String message = ""; + + /** + * 返回代码 + */ + @Schema(title = "返回代码") + private Integer code = 0; + + /** + * 返回数据对象 data + */ + @Schema(title = "返回数据对象") + private T data; + + /** + * 时间戳 + */ + @Schema(title = "时间戳") + private long timestamp = System.currentTimeMillis(); + @JsonIgnore + private String onlTable; + + public AnYanResult() { + } + + /** + * 兼容VUE3版token失效不跳转登录页面 + * + * @param code + * @param message + */ + public AnYanResult(Integer code, String message) { + this.code = code; + this.message = message; + } + + public static AnYanResult ok() { + AnYanResult r = new AnYanResult(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + return r; + } + + public static AnYanResult ok(String msg) { + AnYanResult r = new AnYanResult(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + //Result OK(String msg)方法会造成兼容性问题 issues/I4IP3D + r.setData((T) msg); + r.setMessage(msg); + return r; + } + + public static AnYanResult ok(T data) { + AnYanResult r = new AnYanResult(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setData(data); + return r; + } + + public static AnYanResult OK() { + AnYanResult r = new AnYanResult(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + return r; + } + + /** + * 此方法是为了兼容升级所创建 + * + * @param msg + * @param + * @return + */ + public static AnYanResult OK(String msg) { + AnYanResult r = new AnYanResult(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setMessage(msg); + //Result OK(String msg)方法会造成兼容性问题 issues/I4IP3D + r.setData((T) msg); + return r; + } + + public static AnYanResult OK(T data) { + AnYanResult r = new AnYanResult(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setData(data); + return r; + } + + public static AnYanResult OK(String msg, T data) { + AnYanResult r = new AnYanResult(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setMessage(msg); + r.setData(data); + return r; + } + + public static AnYanResult error(String msg, T data) { + AnYanResult r = new AnYanResult(); + r.setSuccess(false); + r.setCode(CommonConstant.SC_INTERNAL_SERVER_ERROR_500); + r.setMessage(msg); + r.setData(data); + return r; + } + + public static AnYanResult error(String msg) { + return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg); + } + + public static AnYanResult error(int code, String msg) { + AnYanResult r = new AnYanResult(); + r.setCode(code); + r.setMessage(msg); + r.setSuccess(false); + return r; + } + + /** + * 无权限访问返回结果 + */ + public static AnYanResult noauth(String msg) { + return error(CommonConstant.SC_JEECG_NO_AUTHZ, msg); + } + + public AnYanResult success(String message) { + this.message = message; + this.code = CommonConstant.SC_OK_200; + this.success = true; + return this; + } + + public AnYanResult error500(String message) { + this.message = message; + this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500; + this.success = false; + return this; + } + +} diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/PageResultToBeanUtil.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/PageResultToBeanUtil.java index 3b9899f..6195934 100644 --- a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/PageResultToBeanUtil.java +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/PageResultToBeanUtil.java @@ -3,7 +3,7 @@ package com.renkang.anyan.utils; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.jeecg.common.api.vo.Result; +import com.renkang.anyan.model.vo.AnYanResult; import java.util.stream.Collectors; @@ -13,8 +13,8 @@ import java.util.stream.Collectors; */ public class PageResultToBeanUtil { - public IPage transform(Result result,Class tClass) { - IPage page = BeanUtil.toBean(result.getResult(), Page.class); + public IPage transform(AnYanResult result, Class tClass) { + IPage page = BeanUtil.toBean(result.getData(), Page.class); IPage iPage = new Page<>(); BeanUtil.copyProperties(page,iPage,"records"); if(page.getTotal() > 0){ diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/SM4Utils.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/SM4Utils.java new file mode 100644 index 0000000..7fe133e --- /dev/null +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/SM4Utils.java @@ -0,0 +1,47 @@ +package com.renkang.anyan.utils; + +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.SM4; + +/** + * XJ安眼平台提供的数据加密工具类 仅用于安眼系统外部登录接口的对接 + */ +public class SM4Utils { + + private static final String privateKey = "5tgb6yhn7ujm8ik,"; +// private static final String privateKey = "123456789qwertyu"; + + private static final String iv = "5tgb6yhn7ujm8ik,"; + // private static final String iv = "abcdefghi1234567"; + private static SM4 sm4 = null; + + private static SM4 getInstance() { + if (sm4 == null) { + sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, privateKey.getBytes(), iv.getBytes()); + } + return sm4; + } + + /** + * @description 加密 + * @author xj + * @time 2023/8/17 + */ + public static String encryptSM4(String needEncryptText) { + return getInstance().encryptBase64(needEncryptText); + } + + + /** + * @description 解密 + * @author xj + * @time 2023/8/17 + */ + public static String decryptSM4(String encryptText) { + if (encryptText == null || encryptText.isEmpty()) return ""; + return getInstance().decryptStr(encryptText); + } + + +} diff --git a/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/StringUtils.java b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/StringUtils.java new file mode 100644 index 0000000..db90bea --- /dev/null +++ b/functional-modules/xj-anyan-api/src/main/java/com/renkang/anyan/utils/StringUtils.java @@ -0,0 +1,115 @@ +package com.renkang.anyan.utils; + +import cn.hutool.core.util.StrUtil; + +import javax.crypto.Cipher; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; + +/** + * 安眼平台提供的数据加密工具类 仅用于安眼系统外部登录接口的对接 + */ +public class StringUtils { + + /** + * 公钥加密方法 + * + * @param publicKeyText 公钥 + * @param text 将要加密的信息 + * @return Base64编码的字符串 + * @throws Exception + */ + + public static String encryptByPublicKey(String publicKeyText, String text) throws Exception { + // 返回按照 X.509 标准进行编码的密钥的字节 + // x509EncodedKeySpec2 是一种规范、规格 + X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(org.apache.commons.codec.binary.Base64.decodeBase64(publicKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + // 让密钥工厂按照指定的 规范 生成公钥 + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2); + Cipher cipher = Cipher.getInstance("RSA"); + // 对加密初始化,使用加密模式,公钥加密 + // Cipher.ENCRYPT_MODE 可以用 1 代替 + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + + byte[] result = cipher.doFinal(text.getBytes()); + // 返回 Base64编码的字符串 + return org.apache.commons.codec.binary.Base64.encodeBase64String(result); + } + + + public static String base64Encode(String input) { + return Base64.getEncoder().encodeToString(input.getBytes()); + } + + public static String base64Decode(String encodedInput) { + byte[] decodedBytes = Base64.getDecoder().decode(encodedInput); + return new String(decodedBytes); + } + + public static String preprocessJsonString(String jsonStr) { + String a = StrUtil.removeAll(jsonStr, ' ', '\t', '\r', '\n'); + String[] searchList = {"\":\"", "\",\"", "{\"", "\"}", "\":"}; + String[] replacementList = {"$is$", "$center$", "$left$", "$right$", "$start$"}; + String b = org.apache.commons.lang3.StringUtils.replaceEach(a, searchList, replacementList); + String c = b.replace("\"", "\\\""); + return org.apache.commons.lang3.StringUtils.replaceEach(c, replacementList, searchList); + } + + + /** + * 提取文件名中的扩展名 + * + * @param fileName 文件名 + * @param needDot 需要点 + * @return 文件扩展名,如果文件名中没有扩展名则返回 null + */ + public static String getFileExtension(String fileName, boolean needDot) { + // 检查文件名是否为 null 或空字符串 + if (fileName == null || fileName.isEmpty()) { + return null; + } + + // 找到最后一个点的位置 + int lastDotIndex = fileName.lastIndexOf('.'); + + // 如果找不到点,或者点在字符串的第一个位置,返回 null + if (lastDotIndex == -1 || lastDotIndex == 0) { + return null; + } + + return fileName.substring(needDot ? lastDotIndex : (lastDotIndex + 1)); + } + + /** + * 获取路径的最后一个元素(文件名或目录名) + * + * @param pathOrUrl 文件路径或 URL + * @return 路径的最后一个元素 + */ + public static String baseName(String pathOrUrl) { + if (pathOrUrl == null || pathOrUrl.isEmpty()) { + return ""; + } + + try { + // 尝试将字符串解析为 URI + URI uri = new URI(pathOrUrl); + // 获取 URI 的路径部分 + String path = uri.getPath(); + // 使用 Path 类获取路径的最后一个元素 + Path filePath = Paths.get(path); + return filePath.getFileName().toString(); + } catch (URISyntaxException e) { + // 如果解析 URI 失败,则直接将字符串作为路径处理 + Path filePath = Paths.get(pathOrUrl); + return filePath.getFileName().toString(); + } + } +} diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/controller/LargeScreenNewController.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/controller/LargeScreenNewController.java index 9fbf898..6d8f6bd 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/controller/LargeScreenNewController.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/controller/LargeScreenNewController.java @@ -277,4 +277,13 @@ public class LargeScreenNewController { public Result careUser(@RequestParam(name = "userId") String userId){ return Result.ok(largeScreenDataService.careUser(userId)); } + + /** + * 或者安眼平台访问token + * @return + */ + @GetMapping("queryAnYanToken") + public Result queryAnYanToken() throws Exception { + return Result.ok(largeScreenService.queryAnYanToken()); + } } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/service/ILargeScreenService.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/service/ILargeScreenService.java index 6d2d012..ec4571d 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/service/ILargeScreenService.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/service/ILargeScreenService.java @@ -54,4 +54,6 @@ public interface ILargeScreenService extends IService { * 同步安眼系统中的油田医院数据和监控小屋数据定时任务 */ void syncAnYanHospital(); + + String queryAnYanToken() throws Exception; } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/service/impl/LargeScreenServiceImpl.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/service/impl/LargeScreenServiceImpl.java index 14a2fed..c72e976 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/service/impl/LargeScreenServiceImpl.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/largeScreen/service/impl/LargeScreenServiceImpl.java @@ -533,4 +533,9 @@ public class LargeScreenServiceImpl extends ServiceImpl