You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
793 lines
31 KiB
793 lines
31 KiB
2 years ago
|
package com.ynxbd.common.service;
|
||
|
|
||
|
import com.alibaba.fastjson.JSONArray;
|
||
|
import com.alibaba.fastjson.JSONObject;
|
||
|
import com.tencent.healthcard.impl.HealthCardServerImpl;
|
||
|
import com.tencent.healthcard.model.CommonIn;
|
||
|
import com.tencent.healthcard.model.HealthCardInfo;
|
||
|
import com.tencent.healthcard.model.ReportHISData;
|
||
|
import com.ynxbd.common.bean.enums.HCardTypeEnum;
|
||
|
import com.ynxbd.common.bean.enums.HealthCardEnum;
|
||
|
import com.ynxbd.common.bean.Patient;
|
||
|
import com.ynxbd.common.bean.enums.HealthCardRespCodeEnum;
|
||
|
import com.ynxbd.common.helper.ProperHelper;
|
||
|
import com.ynxbd.wx.config.WeChatConfig;
|
||
|
import com.ynxbd.common.dao.PatientDao;
|
||
|
import com.ynxbd.common.config.EhCacheConfig;
|
||
|
import com.ynxbd.common.helper.common.ErrorHelper;
|
||
|
import lombok.extern.slf4j.Slf4j;
|
||
|
import org.apache.commons.lang3.ObjectUtils;
|
||
|
import org.apache.commons.lang3.StringUtils;
|
||
|
import org.ehcache.Cache;
|
||
|
|
||
|
import java.text.SimpleDateFormat;
|
||
|
import java.util.*;
|
||
|
|
||
|
@Slf4j
|
||
|
public class HCodeService {
|
||
|
|
||
|
final private static boolean IS_ENABLE; // 是否启用电子健康看(true:启用, false:禁用)
|
||
|
|
||
|
// 健康码
|
||
|
final private static String H_APP_ID;
|
||
|
final private static String H_APP_SECRET;
|
||
|
final private static String H_HOSPITAL_ID; // 医院ID(每家医院不一样)
|
||
|
// 万达
|
||
|
final private static String CARD_URL;
|
||
|
final private static String CARD_APP_ID;
|
||
|
final private static String CARD_PUBLIC_KEY;
|
||
|
final private static String CARD_PRIVATE_KEY;
|
||
|
|
||
|
// 缓存
|
||
|
private static Cache<String, String> CACHE;
|
||
|
|
||
|
// 离线WeChartCode 批量领取健康卡用
|
||
|
final private static String WE_CHART_CODE = "73EFA6796D3869FF82FAE7E81E9814B7";
|
||
|
|
||
|
static {
|
||
|
ProperHelper config = new ProperHelper().read("hcode.properties");
|
||
|
IS_ENABLE = config.getBoolean("is_enable", false);
|
||
|
config.setIsEnable(IS_ENABLE);
|
||
|
|
||
|
H_APP_ID = config.getString("h.app_id");
|
||
|
H_APP_SECRET = config.getString("h.app_secret");
|
||
|
CARD_APP_ID = config.getString("h.card_app_id");
|
||
|
CARD_PUBLIC_KEY = config.getString("h.card_public_key");
|
||
|
CARD_PRIVATE_KEY = config.getString("h.card_private_key");
|
||
|
CARD_URL = config.getString("h.card_url");
|
||
|
|
||
|
H_HOSPITAL_ID = config.getString("h.hospital_id");
|
||
|
if ("0".equals(H_HOSPITAL_ID)) {
|
||
|
log.info("[电子健康卡]医院id异常");
|
||
|
}
|
||
|
initCache();
|
||
|
}
|
||
|
|
||
|
public static synchronized void initCache() {
|
||
|
if (CACHE == null) {
|
||
|
// 创建一个缓存实例(7000s最大存活时间)
|
||
|
CACHE = EhCacheConfig.createCache(String.class, String.class, "health_card_cache", 1L, 3L, 10L, false, 7000L, null);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 判断是否使用电子健康卡
|
||
|
*
|
||
|
* @return 是否使用
|
||
|
*/
|
||
|
public static boolean isEnableHealthCard() {
|
||
|
if (!IS_ENABLE) {
|
||
|
log.info("hcode.properties中禁用电子健康卡isEnable={}", IS_ENABLE);
|
||
|
}
|
||
|
return IS_ENABLE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 获取token
|
||
|
*
|
||
|
* @return token
|
||
|
*/
|
||
|
public static String getAppToken() {
|
||
|
if (!isEnableHealthCard()) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
String appToken = null;
|
||
|
if (CACHE == null) {
|
||
|
initCache();
|
||
|
}
|
||
|
if (CACHE != null) {
|
||
|
appToken = CACHE.get("appToken");
|
||
|
if (appToken != null) {
|
||
|
return appToken;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET, 5, 10);
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
int channelNum = 0;
|
||
|
CommonIn commonIn = new CommonIn("", requestId, H_HOSPITAL_ID, channelNum);
|
||
|
//调用接口
|
||
|
JSONObject appTokenObj = healthCard.getAppToken(commonIn, H_APP_ID);
|
||
|
|
||
|
//调用接口
|
||
|
JSONObject resultObj = healthCard.getAppToken(commonIn, H_APP_ID);
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("[电子健康卡]获取appToken失败-" + resultObj);
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
JSONObject respJson = appTokenObj.getJSONObject("rsp");
|
||
|
appToken = respJson.getString("appToken");
|
||
|
|
||
|
if (CACHE != null && appToken != null && !"".equals(appToken)) {
|
||
|
CACHE.put("appToken", appToken);
|
||
|
}
|
||
|
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
|
||
|
if (StringUtils.isEmpty(appToken)) {
|
||
|
log.info("[电子健康卡]获取appToken为空");
|
||
|
}
|
||
|
return appToken;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 注册健康卡
|
||
|
*
|
||
|
* @param weChatCode 微信身份码
|
||
|
* @param birthday 出生年月日
|
||
|
* @param cardTypeEnum 证件类型(01-居民身份证,其他参考证件类型表)
|
||
|
* @param address 地址
|
||
|
* @param sex 性别
|
||
|
* @param nation 民族
|
||
|
* @param name 姓名
|
||
|
* @param idCardNo 证件号码
|
||
|
* @param phone1 联系方式1
|
||
|
*/
|
||
|
public static JSONObject registerHealthCard(String patientId, String weChatCode,
|
||
|
String birthday, HCardTypeEnum cardTypeEnum, String address,
|
||
|
String sex, String nation, String name, String idCardNo, String phone1) {
|
||
|
try {
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
if (cardTypeEnum == null) {
|
||
|
cardTypeEnum = HCardTypeEnum._01; // 居民身份证
|
||
|
}
|
||
|
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
|
||
|
// 构造公共输入参数commonIn
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
HealthCardInfo healthCardInfoReq = new HealthCardInfo();
|
||
|
healthCardInfoReq.setAddress(address);
|
||
|
healthCardInfoReq.setBirthday(birthday);
|
||
|
healthCardInfoReq.setGender(sex);
|
||
|
healthCardInfoReq.setIdNumber(idCardNo);
|
||
|
healthCardInfoReq.setIdType(cardTypeEnum.WX_CODE);
|
||
|
healthCardInfoReq.setNation(nation);
|
||
|
healthCardInfoReq.setName(name);
|
||
|
healthCardInfoReq.setPhone1(phone1);
|
||
|
healthCardInfoReq.setWechatCode(weChatCode);
|
||
|
healthCardInfoReq.setPatid(patientId);
|
||
|
//调用接口
|
||
|
JSONObject resultObj = healthCard.registerHealthCard(commonIn, healthCardInfoReq);
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("[电子健康卡]注册失败-" + resultObj);
|
||
|
return commonOut;
|
||
|
}
|
||
|
return resultObj.getJSONObject("rsp");
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 授权码获取健康卡
|
||
|
*
|
||
|
* @param healthCode 健康卡授权码
|
||
|
*/
|
||
|
public static Patient getInfoByHealthCode(String healthCode) {
|
||
|
try {
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
//调用接口
|
||
|
JSONObject resultObj = healthCard.getHealthCardByHealthCode(commonIn, healthCode);
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
JSONObject rspObj = resultObj.getJSONObject("rsp");
|
||
|
if (!"0".equals(commonOut.getString("resultCode")) || rspObj == null) {
|
||
|
log.info("[电子健康卡]授权码获取健康卡失败:" + resultObj);
|
||
|
return null;
|
||
|
}
|
||
|
JSONObject card = rspObj.getJSONObject("card");
|
||
|
if (card == null) {
|
||
|
log.info("[电子健康卡]一键绑定 解析json失败");
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
Patient patient = new Patient();
|
||
|
String phone1 = card.getString("phone1");
|
||
|
if (phone1 == null || "".equals(phone1)) {
|
||
|
patient.setTel(card.getString("phone2"));
|
||
|
} else {
|
||
|
patient.setTel(phone1);
|
||
|
}
|
||
|
|
||
|
patient.setName(card.getString("name"));
|
||
|
patient.setIdCardNo(card.getString("idNumber"));
|
||
|
patient.setSex(card.getString("gender"));
|
||
|
patient.setNation(card.getString("nation"));
|
||
|
patient.setAddress(card.getString("address"));
|
||
|
patient.setBirthday(card.getString("birthday"));
|
||
|
patient.setHealthCardId(card.getString("healthCardId"));
|
||
|
patient.setCardType(card.getString("idType"));
|
||
|
log.info("[一键绑定]获取用户信息 patient={}", patient);
|
||
|
return patient;
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* [电子健康卡]通过二维码获取健康卡数据
|
||
|
*
|
||
|
* @param qrCode 二维码
|
||
|
*/
|
||
|
public static Patient getHealthCardByQrCode(String qrCode) {
|
||
|
try {
|
||
|
log.info("[电子健康卡]查询健康卡信息 qrCode={}", qrCode);
|
||
|
if (ObjectUtils.isEmpty(qrCode)) {
|
||
|
return null;
|
||
|
}
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
//调用接口
|
||
|
JSONObject resultObj = healthCard.getHealthCardByQRCode(commonIn, qrCode);
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("[电子健康卡]二维码获取健康卡失败:" + resultObj);
|
||
|
return null;
|
||
|
}
|
||
|
JSONObject respJson = resultObj.getJSONObject("rsp");
|
||
|
if (respJson == null) {
|
||
|
return null;
|
||
|
}
|
||
|
JSONObject cardJson = respJson.getJSONObject("card");
|
||
|
if (cardJson == null) {
|
||
|
return null;
|
||
|
}
|
||
|
Patient patient = new Patient();
|
||
|
patient.setSex(cardJson.getString("gender")); // 性别
|
||
|
patient.setName(cardJson.getString("name"));
|
||
|
patient.setNation(cardJson.getString("nation"));
|
||
|
patient.setCardType(cardJson.getString("idType"));
|
||
|
patient.setIdCardNo(cardJson.getString("idNumber"));
|
||
|
patient.setBirthday(cardJson.getString("birthday"));
|
||
|
patient.setAddress(cardJson.getString("address"));
|
||
|
String phone1 = cardJson.getString("phone1");
|
||
|
String phone2 = cardJson.getString("phone2");
|
||
|
patient.setTel(ObjectUtils.isEmpty(phone1) ? phone2 : phone1);
|
||
|
return patient;
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 实人认证生成orderId接口
|
||
|
*/
|
||
|
public static String registerUniformVerifyOrder(String idCardNo, String name, String wechatCode) {
|
||
|
try {
|
||
|
log.info("[电子健康卡]实人认证生成orderId idCardNo={}, name={}", idCardNo, name);
|
||
|
if (ObjectUtils.isEmpty(idCardNo) || ObjectUtils.isEmpty(name)) {
|
||
|
return null;
|
||
|
}
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
//调用接口
|
||
|
JSONObject resultJson = healthCard.registerUniformVerifyOrder(commonIn, idCardNo, "01", name, wechatCode);
|
||
|
JSONObject commonOut = resultJson.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("[电子健康卡]实人认证生成orderId接口失败:" + resultJson);
|
||
|
return null;
|
||
|
}
|
||
|
JSONObject respJson = resultJson.getJSONObject("rsp");
|
||
|
if (respJson == null) {
|
||
|
return null;
|
||
|
}
|
||
|
return respJson.getString("verifyOrderId");
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 实人认证结果查询接口
|
||
|
*/
|
||
|
public static boolean checkUniformVerifyResult(String verifyOrderId, String registerOrderId) {
|
||
|
try {
|
||
|
log.info("[电子健康卡]实人认证结果查询 verifyOrderId={}, registerOrderId={}", verifyOrderId, registerOrderId);
|
||
|
if (ObjectUtils.isEmpty(verifyOrderId) || ObjectUtils.isEmpty(registerOrderId)) {
|
||
|
return false;
|
||
|
}
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return false;
|
||
|
}
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
//调用接口
|
||
|
JSONObject resultJson = healthCard.checkUniformVerifyResult(commonIn, verifyOrderId, registerOrderId);
|
||
|
JSONObject commonOut = resultJson.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("[电子健康卡]实人认证结果查询失败:" + resultJson);
|
||
|
return false;
|
||
|
}
|
||
|
JSONObject respJson = resultJson.getJSONObject("rsp");
|
||
|
if (respJson == null) {
|
||
|
return false;
|
||
|
}
|
||
|
return respJson.getBoolean("suc");
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 获取卡包订单ID
|
||
|
*
|
||
|
* @param qrCodeText 二维码编码
|
||
|
*/
|
||
|
public static JSONObject getCardOrderId(String qrCodeText) {
|
||
|
try {
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
log.info("获取卡包订单ID-appToken为空");
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
//调用接口
|
||
|
JSONObject resultObj = healthCard.getOrderIdByOutAppId(commonIn, WeChatConfig.APP_ID, qrCodeText);
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("[电子健康卡]获取卡包订单ID 失败:" + resultObj);
|
||
|
return null;
|
||
|
}
|
||
|
return resultObj.getJSONObject("rsp");
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 电子健康卡用卡数据监测接口
|
||
|
*
|
||
|
* @param qrCodeText 动态二维码
|
||
|
* @param deptName 科室名
|
||
|
* @param scene 上报类型 scene
|
||
|
* @param cardType 卡类型
|
||
|
* @return JSONObject
|
||
|
*/
|
||
|
public static JSONObject reportHISData(String qrCodeText, String deptName, String scene, String cardType, String cardCostType) {
|
||
|
if ("".equals(qrCodeText) || scene == null || cardType == null) {
|
||
|
log.info("[电子健康卡]用卡数据监测接口,参数为空");
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
//构造请求参数req
|
||
|
ReportHISData reportHISData = new ReportHISData();
|
||
|
reportHISData.setQrCodeText(qrCodeText);
|
||
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||
|
reportHISData.setTime(format.format(new Date()));
|
||
|
|
||
|
reportHISData.setHospitalCode(H_HOSPITAL_ID);
|
||
|
// 010101 挂号
|
||
|
reportHISData.setScene(scene);
|
||
|
reportHISData.setDepartment(deptName); // 科室代码
|
||
|
reportHISData.setCardChannel(HealthCardEnum.CARD_CHANNEL_WX_CHANNEL.STATUS); // 微信渠道
|
||
|
|
||
|
reportHISData.setCardType(cardType);
|
||
|
|
||
|
// 自费:0100,医保:0200,公费:0300,其他:0000
|
||
|
reportHISData.setCardCostTypes(cardCostType);
|
||
|
//调用接口
|
||
|
JSONObject resultObj = healthCard.reportHISData(commonIn, reportHISData);
|
||
|
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("用卡数据监测接口-" + resultObj);
|
||
|
return null;
|
||
|
}
|
||
|
return resultObj.getJSONObject("rsp");
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 获取健康卡二维码
|
||
|
*
|
||
|
* @param healthCardId 健康卡ID
|
||
|
* @param idCardNo 证件号码
|
||
|
* @param codeType 传0或者1,0返回动态码,1返回静态码
|
||
|
*/
|
||
|
public static JSONObject getDynamicQRCode(String healthCardId, String idCardNo, String codeType) {
|
||
|
if (healthCardId == null || idCardNo == null || codeType == null) {
|
||
|
log.info("[电子健康卡]获取健康卡二维码参数缺失 healthCardId={}, idCardNo={}, codeType={}", healthCardId, idCardNo, codeType);
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
//调用接口
|
||
|
JSONObject resultObj = healthCard.getDynamicQRCode(commonIn, healthCardId, "01", idCardNo, codeType);
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("获取健康卡二维码失败");
|
||
|
return null;
|
||
|
}
|
||
|
return resultObj.getJSONObject("rsp");
|
||
|
} catch (Exception e) {
|
||
|
ErrorHelper.println(e);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 一键绑定,绑定健康卡和医院关系
|
||
|
*
|
||
|
* @param patientId 患者ID
|
||
|
* @param qrCodeText 标识ID(healthCardId = qrCodeText)
|
||
|
*/
|
||
|
public static JSONObject bindCardRelation(String patientId, String qrCodeText) {
|
||
|
if (patientId == null || "".equals(qrCodeText)) {
|
||
|
log.info("[电子健康卡]一键绑定绑定健康卡和医院关系参数缺失 patientId={}, qrCodeText={}", patientId, qrCodeText);
|
||
|
return null;
|
||
|
}
|
||
|
try {
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
//构造公共输入参数commonIn
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, 0);
|
||
|
JSONObject resultObj = healthCard.bindCardRelation(commonIn, patientId, qrCodeText);
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("[电子健康卡]绑定健康卡和医院关系-" + resultObj);
|
||
|
return null;
|
||
|
}
|
||
|
return resultObj.getJSONObject("rsp");
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 根据健康卡ID获取动态二维码
|
||
|
*
|
||
|
* @param healthCardId 健康卡ID
|
||
|
* @param idCardNo 身份证号
|
||
|
* @return 动态二维码
|
||
|
*/
|
||
|
public static String getQRCodeText(String healthCardId, String idCardNo) {
|
||
|
JSONObject QRResult = getDynamicQRCode(healthCardId, idCardNo, "0");
|
||
|
if (QRResult == null) {
|
||
|
log.info("用卡数据监测接口,获取二维码失败");
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
String qrCodeText = QRResult.getString("qrCodeText");
|
||
|
if ("".equals(qrCodeText)) {
|
||
|
log.info("用卡数据监测接口,获取qrCodeText失败");
|
||
|
return null;
|
||
|
}
|
||
|
return qrCodeText;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 健康卡数据上报-->挂号支付
|
||
|
*
|
||
|
* @param openid openid
|
||
|
* @param patientId 患者ID
|
||
|
* @param deptName 科室名
|
||
|
* @param regDate 挂号日期
|
||
|
* @return 是否上报成功
|
||
|
*/
|
||
|
public static boolean regPayReportHISData(String openid, String patientId, String deptName, String regDate) {
|
||
|
try {
|
||
|
if (!HCodeService.isEnableHealthCard()) { // 判断是否禁用电子健康卡
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (deptName == null || openid == null || patientId == null || regDate == null) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
||
|
String today = format.format(new Date());
|
||
|
String scene = regDate.equals(today) ? HealthCardEnum.SCENE_REGISTER_SITE.STATUS : HealthCardEnum.SCENE_REGISTER_RESERVE.STATUS;
|
||
|
|
||
|
Patient patient = new PatientDao().selectByOpenidAndPatientId(openid, patientId);
|
||
|
if (patient == null) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
String healthCardId = patient.getHealthCardId();
|
||
|
String idCardNo = patient.getIdCardNo();
|
||
|
if (healthCardId == null || idCardNo == null) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
String qrCodeText = getQRCodeText(healthCardId, idCardNo);
|
||
|
if (qrCodeText == null) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// 挂号,自费
|
||
|
JSONObject jsonObject = reportHISData(qrCodeText, deptName, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, HealthCardEnum.CARD_COST_TYPE_OWN_EXPENSE.STATUS);
|
||
|
if (jsonObject == null) {
|
||
|
log.info("挂号数据上报失败");
|
||
|
return false;
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 健康卡数据上报-->挂号支付
|
||
|
*
|
||
|
* @param imageContent 身份证正面照片的base64编码数据,头部信息需要删除,如image/png;base64、image/jpeg/png;base64等,并且数据量建议压缩到百K级别上传。
|
||
|
* @return 身份证信息
|
||
|
*/
|
||
|
public static Patient orcInfo(String imageContent) {
|
||
|
if (imageContent == null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
int index = imageContent.indexOf(",");
|
||
|
if (index != -1) {
|
||
|
imageContent = imageContent.substring(index + 1);
|
||
|
}
|
||
|
|
||
|
Patient patient = new Patient();
|
||
|
try {
|
||
|
if (!HCodeService.isEnableHealthCard()) { // 判断是否禁用电子健康卡
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
String appToken = getAppToken();
|
||
|
if (appToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
//构造公共输入参数commonIn
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
int channelNum = 0;
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, channelNum);
|
||
|
//调用接口
|
||
|
JSONObject resultObj = healthCard.ocrInfo(commonIn, imageContent);
|
||
|
JSONObject commonOut = resultObj.getJSONObject("commonOut");
|
||
|
if (!"0".equals(commonOut.getString("resultCode"))) {
|
||
|
log.info("[电子健康卡]身份证识别失败-" + resultObj);
|
||
|
return null;
|
||
|
}
|
||
|
JSONObject rsp = resultObj.getJSONObject("rsp");
|
||
|
if (rsp == null) {
|
||
|
return null;
|
||
|
}
|
||
|
JSONObject cardInfo = rsp.getJSONObject("cardInfo");
|
||
|
if (cardInfo == null) {
|
||
|
return null;
|
||
|
}
|
||
|
// 读取信息
|
||
|
String idNumber = cardInfo.getString("id");
|
||
|
|
||
|
patient.setIdCardNo(idNumber);
|
||
|
patient.setName(cardInfo.getString("name"));
|
||
|
patient.setSex(cardInfo.getString("gender"));
|
||
|
patient.setAddress(cardInfo.getString("address"));
|
||
|
patient.setNation(cardInfo.getString("nation"));
|
||
|
patient.setBirthday(cardInfo.getString("birth"));
|
||
|
|
||
|
// if (!"".equals(idNumber)) {
|
||
|
// FileHelper.saveBase64Image("data:image/png;base64," + imageContent, "idCard", (idNumber + ".png"), true, false);
|
||
|
// }
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
return null;
|
||
|
}
|
||
|
return patient;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 健康卡数据上报-->处方缴费
|
||
|
*
|
||
|
* @param openid openid
|
||
|
* @param patientId patientId
|
||
|
* @return 是否成功
|
||
|
*/
|
||
|
public static boolean payNotifyReportHISData(String openid, String patientId) {
|
||
|
try {
|
||
|
if (!HCodeService.isEnableHealthCard()) { // 判断是否禁用电子健康卡
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (patientId == null || openid == null) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
Patient patient = new PatientDao().selectByOpenidAndPatientId(openid, patientId);
|
||
|
if (patient == null) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
String healthCardId = patient.getHealthCardId();
|
||
|
String idCardNo = patient.getIdCardNo();
|
||
|
if (healthCardId == null || idCardNo == null) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
String qrCodeText = getQRCodeText(healthCardId, idCardNo);
|
||
|
if (qrCodeText == null) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// 门诊缴费
|
||
|
JSONObject jsonObject = HCodeService.reportHISData(qrCodeText, null, HealthCardEnum.SCENE_TOLL_OUTPATIENT_PAYMENT.STATUS, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, HealthCardEnum.CARD_COST_TYPE_OWN_EXPENSE.STATUS);
|
||
|
if (jsonObject == null) {
|
||
|
log.info("挂号数据上报失败");
|
||
|
return false;
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 批量领卡
|
||
|
*
|
||
|
* @return json
|
||
|
*/
|
||
|
public static JSONArray batchUpdate(List<Patient> lstPatient) {
|
||
|
HealthCardServerImpl healthCard = new HealthCardServerImpl(H_APP_SECRET);
|
||
|
//构造公共输入参数commonIn
|
||
|
String appToken = getAppToken();
|
||
|
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
|
||
|
int channelNum = 0;
|
||
|
CommonIn commonIn = new CommonIn(appToken, requestId, H_HOSPITAL_ID, channelNum);
|
||
|
List<HealthCardInfo> lstHealthCard = new ArrayList<>();
|
||
|
for (Patient patient : lstPatient) {
|
||
|
HealthCardInfo healthCardInfo = new HealthCardInfo();
|
||
|
healthCardInfo.setAddress(patient.getAddress());
|
||
|
healthCardInfo.setBirthday(patient.getBirthday());
|
||
|
healthCardInfo.setGender(patient.getSex());
|
||
|
healthCardInfo.setIdNumber(patient.getIdCardNo());
|
||
|
healthCardInfo.setIdType("01");
|
||
|
healthCardInfo.setNation(patient.getNation());
|
||
|
healthCardInfo.setName(patient.getName());
|
||
|
healthCardInfo.setPhone1(patient.getTel());
|
||
|
healthCardInfo.setWechatCode(WE_CHART_CODE);
|
||
|
healthCardInfo.setPatid(patient.getPatientId());
|
||
|
healthCardInfo.setOpenId(patient.getOpenid());
|
||
|
healthCardInfo.setWechatUrl("http://www.ynxbdkj.cn");
|
||
|
lstHealthCard.add(healthCardInfo);
|
||
|
}
|
||
|
|
||
|
JSONObject healthCardInfosRsp = healthCard.registerBatchHealthCard(commonIn, lstHealthCard);
|
||
|
JSONObject commonOut = healthCardInfosRsp.getJSONObject("commonOut");
|
||
|
JSONObject rspObj = healthCardInfosRsp.getJSONObject("rsp");
|
||
|
if (!"0".equals(commonOut.getString("resultCode")) || rspObj == null) {
|
||
|
log.info("批量领取健康卡-" + healthCardInfosRsp);
|
||
|
return null;
|
||
|
}
|
||
|
JSONArray rspItems = rspObj.getJSONArray("rspItems");
|
||
|
if (rspItems == null) {
|
||
|
log.info("[批量领取健康卡]解析json失败");
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
return rspItems;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 响应码处理
|
||
|
*
|
||
|
* @param resultCode 响应码
|
||
|
* @return 返回响应码对应的消息
|
||
|
*/
|
||
|
public static HealthCardRespCodeEnum resultCodeHandle(String resultCode) {
|
||
|
HealthCardRespCodeEnum healthCardRespCodeEnum = HealthCardRespCodeEnum.CONTINUE;
|
||
|
|
||
|
for (HealthCardRespCodeEnum e : HealthCardRespCodeEnum.values()) {
|
||
|
if (e.STATUS.equals(resultCode)) {
|
||
|
if (e.IS_RESULT) { // 是否返回枚举中的信息
|
||
|
healthCardRespCodeEnum = e;
|
||
|
} else {
|
||
|
log.info("[电子健康卡]异常信息:{}", e.MESSAGE);
|
||
|
healthCardRespCodeEnum = e.IS_CONTINUE ? HealthCardRespCodeEnum.CONTINUE : e;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return healthCardRespCodeEnum;
|
||
|
}
|
||
|
|
||
|
}
|