电子健康卡,旧版和新版接口相同逻辑合并,升级绑定入参调整兼容医共体

debug
王绍全 2 weeks ago
parent f808cb2f81
commit a7ff76d890
  1. 152
      src/main/java/com/ynxbd/common/action/HealthCardAction.java
  2. 94
      src/main/java/com/ynxbd/common/action/HealthCodeAction.java
  3. 14
      src/main/java/com/ynxbd/common/bean/enums/HealthCardSceneEnum.java
  4. 1
      src/main/java/com/ynxbd/common/dao/PatientDao.java
  5. 277
      src/main/java/com/ynxbd/common/helper/HealthCardHelper.java
  6. 337
      src/main/java/com/ynxbd/common/service/HCodeService.java
  7. 9
      src/main/java/com/ynxbd/common/service/HealthUploadService.java

@ -5,7 +5,9 @@ import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.Patient;
import com.ynxbd.common.bean.User; import com.ynxbd.common.bean.User;
import com.ynxbd.common.bean.enums.HCardTypeEnum; import com.ynxbd.common.bean.enums.HCardTypeEnum;
import com.ynxbd.common.bean.enums.HealthCardEnum;
import com.ynxbd.common.bean.enums.HealthCardRespCodeEnum; import com.ynxbd.common.bean.enums.HealthCardRespCodeEnum;
import com.ynxbd.common.bean.enums.HealthCardSceneEnum;
import com.ynxbd.common.config.interceptor.AesDecode; import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.PatientDao; import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.helper.HealthCardHelper; import com.ynxbd.common.helper.HealthCardHelper;
@ -15,8 +17,10 @@ import com.ynxbd.common.helper.common.ValidHelper;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.service.PatientService; import com.ynxbd.common.service.PatientService;
import com.ynxbd.wx.wxfactory.AesWxHelper;
import com.ynxbd.wx.wxfactory.WxCacheHelper; import com.ynxbd.wx.wxfactory.WxCacheHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.Namespace;
import org.ehcache.Cache; import org.ehcache.Cache;
@ -29,13 +33,23 @@ public class HealthCardAction extends BaseAction {
* [电子健康卡]绑卡验证授权 * [电子健康卡]绑卡验证授权
*/ */
@Action("registerHealthCardPreAuth") @Action("registerHealthCardPreAuth")
public Result registerHealthCardPreAuth(Boolean isMiniApp, @AesDecode String openid, String wechatCode) { public Result registerHealthCardPreAuth(Boolean isMiniApp, Integer patientType, String wechatCode, String enHisPatientId) {
log.info("[电子健康卡]绑卡验证授权 isMiniApp={}, wechatCode={}, openid={}", isMiniApp, wechatCode, openid); try {
JSONObject result = new HealthCardHelper().registerHealthCardPreAuth(isMiniApp, false, wechatCode); log.info("[电子健康卡]绑卡验证授权 isMiniApp={}, patientType={}, wechatCode={}, enHisPatientId={}", isMiniApp, patientType, wechatCode, enHisPatientId);
if (result == null) { if (wechatCode == null) {
return Result.error(); return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
if (!ObjectUtils.isEmpty(enHisPatientId)) {
String hisPatientId = AesWxHelper.decode(enHisPatientId);
if (ObjectUtils.isEmpty(hisPatientId)) {
return Result.error(ResultEnum.PARAM_IS_INVALID);
}
}
JSONObject result = HealthCardHelper.registerHealthCardPreAuth(isMiniApp, false, patientType, wechatCode, enHisPatientId);
return Result.success(result);
} catch (Exception e) {
return Result.error(e);
} }
return Result.success(result);
} }
@ -45,7 +59,7 @@ public class HealthCardAction extends BaseAction {
@Action("registerHealthCardPreFill") @Action("registerHealthCardPreFill")
public Result registerHealthCardPreFill(Boolean isMiniApp, @AesDecode String openid, String authCode, String name, String gender, String nation, String birthday, String idNumber, String phone) { public Result registerHealthCardPreFill(Boolean isMiniApp, @AesDecode String openid, String authCode, String name, String gender, String nation, String birthday, String idNumber, String phone) {
log.info("[电子健康卡]验证注册/绑卡接口 isMiniApp={}, authCode={}, name={}, openid={}", isMiniApp, authCode, name, openid); log.info("[电子健康卡]验证注册/绑卡接口 isMiniApp={}, authCode={}, name={}, openid={}", isMiniApp, authCode, name, openid);
JSONObject result = new HealthCardHelper().registerHealthCardPreFill(isMiniApp, authCode, name, gender, nation, birthday, JSONObject result = HealthCardHelper.registerHealthCardPreFill(isMiniApp, authCode, name, gender, nation, birthday,
idNumber, HCardTypeEnum._01, phone); idNumber, HCardTypeEnum._01, phone);
if (result == null) { if (result == null) {
return Result.error(); return Result.error();
@ -181,101 +195,77 @@ public class HealthCardAction extends BaseAction {
} }
/**
* [升级绑定]-->已在HIS绑定-->注册健康卡
*
* @param wechatCode wechatCode
* @param id id
* @param idCardNo idCardNo
* @param cardType cardType
* @param openid openid
* @param tel tel
* @param name name
* @param nation nation
* @param patientId patientId
* @param address address
*/
@Action("upBindCard")
public Result upBindCard(String wechatCode, Integer id, @AesDecode String idCardNo, @AesDecode String patientId, String cardType, String openid, String tel, String name, String nation, String address) {
log.info("[电子健康卡]升级绑定 id={}, name={}, address={}, nation={}, patientId={}, tel={}, idType={}, wechatCode={}", id, name, address, nation, patientId, tel, cardType, wechatCode);
if (wechatCode == null || openid == null || patientId == null || name == null || idCardNo == null || tel == null || address == null || nation == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
if (cardType == null) cardType = HCardTypeEnum._01.WX_CODE; @Action("getCardOrderId")
HCardTypeEnum cardTypeEnum = HCardTypeEnum.toTypeByWxCode(cardType); public Result getCardOrderId(Boolean isMiniApp, @AesDecode String idCardNo, String healthCardId) {
if (cardTypeEnum == null) { log.info("[电子健康卡]获取卡包订单ID healthCardId={}, idCardNo={}", healthCardId, idCardNo);
return Result.error(ResultEnum.CARD_TYPE_NOT_FOUNT); if (healthCardId == null || idCardNo == null) {
} return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失
if (!ValidHelper.isValidNation(nation)) {
return Result.error(ResultEnum.NATION_ERROR);
} }
String sex = IDNumberHelper.getSex(idCardNo); String qrCodeText = HealthCardHelper.getQRCodeText(isMiniApp, healthCardId, idCardNo);
String birthday = IDNumberHelper.getBirthday(idCardNo); if (qrCodeText == null) {
if (sex == null || birthday == null) { // 身份证解析数据错误 return Result.error(ResultEnum.PARAM_IS_DEFECT); // qrCodeText参数缺失
log.info("[电子健康卡]升级绑失败,身份证解析数据错误 sex={} birthday={}", sex, birthday);
return Result.error(ResultEnum.PARAM_TYPE_ERROR);
} }
JSONObject result = HealthCardHelper.getOrderIdByOutAppId(isMiniApp, qrCodeText);
// 先注册,后修改-->先获取健康卡ID if (result == null) {
JSONObject rspObj = HealthCardHelper.registerHealthCard(false, patientId, wechatCode, birthday, cardTypeEnum, address, null, sex, nation, name, idCardNo, tel); return Result.error();
if (rspObj == null) {
log.info("[电子健康卡]升级绑定失败, 响应内容为空");
return Result.error("[电子健康卡]升级绑定失败, 响应内容为空");
} }
return Result.success(result);
}
String healthCardId = rspObj.getString("healthCardId");
if (healthCardId == null) {
// 响应处理
String errMsg = rspObj.getString("errMsg");
String resultCode = rspObj.getString("resultCode");
HealthCardRespCodeEnum healthCardRespCodeEnum = HealthCardRespCodeEnum.findEnumByResultCode(resultCode);
log.info("[电子健康卡]升级绑定失败原因 resultCode={}, errMsg={}, statusMsg={}", resultCode, errMsg, healthCardRespCodeEnum.MESSAGE); @Action("registerUniformVerifyOrder")
return Result.error(healthCardRespCodeEnum.MESSAGE); public Result registerUniformVerifyOrder(Boolean isMiniApp, String wechatCode, String sceneCode, String name, String idCardNo) {
log.info("[电子健康卡]实人认证生成orderId isMiniApp={}, wechatCode={}, sceneCode={}, name={}, idCardNo={}", isMiniApp, wechatCode, sceneCode, name, idCardNo);
if (idCardNo == null || name == null || wechatCode == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空
}
HealthCardSceneEnum sceneEnum = HealthCardSceneEnum.findEnum(sceneCode);
if (sceneEnum == null) {
return Result.error(ResultEnum.PARAM_IS_INVALID);
} }
Patient bindInfo = new Patient(); JSONObject dataJson = HealthCardHelper.registerUniformVerifyOrder(isMiniApp, wechatCode, sceneEnum, name, idCardNo);
bindInfo.setOpenid(openid); if (ObjectUtils.isEmpty(dataJson)) {
bindInfo.setPatientId(patientId); return Result.error();
bindInfo.setIdCardNo(idCardNo);
bindInfo.setHealthCardId(healthCardId);
bindInfo.setName(name);
bindInfo.setNation(nation);
bindInfo.setTel(tel);
bindInfo.setAddress(address);
boolean isUpdate = new PatientDao().updateInfo(bindInfo, id);
if (isUpdate) {
Cache<String, User> cache = WxCacheHelper.getUserCacheManager();
cache.remove(openid);
return Result.success();
} }
return Result.error(); return Result.success(dataJson);
} }
@Action("checkUniformVerifyResult")
public Result checkUniformVerifyResult(Boolean isMiniApp, String orderId, String registerOrderId) {
log.info("[电子健康卡]实人认证结果查询 isMiniApp={}, orderId={}, registerOrderId={}", isMiniApp, orderId, registerOrderId);
if (orderId == null || registerOrderId == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空
}
return Result.isOK(HealthCardHelper.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId));
}
/** /**
* [电子健康卡]获取卡包订单ID * 健康卡[上报数据]
*
* @param scene 上报类型编码
* @param openid openid
* @param idCardNo 身份证
* @param healthCardId 健康卡id
*/ */
@Action("getCardOrderId") @Action("reportHISData")
public Result getCardOrderId(Boolean isMiniApp, @AesDecode String idCardNo, String healthCardId) { public Result reportHISData(String scene, @AesDecode String openid, @AesDecode String idCardNo, String healthCardId) {
log.info("[电子健康卡]获取卡包订单ID healthCardId={}, idCardNo={}", healthCardId, idCardNo); if (scene == null || openid == null || healthCardId == null || idCardNo == null) {
if (healthCardId == null || idCardNo == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT);
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失
} }
String qrCodeText = HealthCardHelper.getQRCodeText(isMiniApp, healthCardId, idCardNo); String qrCodeText = HealthCardHelper.getQRCodeText(false, healthCardId, idCardNo);
if (qrCodeText == null) { if (qrCodeText == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // qrCodeText参数缺失 return Result.error(ResultEnum.INTERFACE_OUTER_INVOKE_ERROR);
} }
JSONObject result = HealthCardHelper.getOrderIdByOutAppId(isMiniApp, qrCodeText);
if (result == null) { JSONObject dataJson = HealthCardHelper.reportHISData(qrCodeText, null, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null);
if (dataJson == null) {
return Result.error(); return Result.error();
} }
return Result.success(result); return Result.success();
} }
} }

@ -12,6 +12,7 @@ import com.ynxbd.common.config.HealthCardConfig;
import com.ynxbd.common.config.interceptor.AesDecode; import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.PatientDao; import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.dao.his.HisPatientDao; import com.ynxbd.common.dao.his.HisPatientDao;
import com.ynxbd.common.helper.HealthCardHelper;
import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.IDNumberHelper; import com.ynxbd.common.helper.common.IDNumberHelper;
import com.ynxbd.common.helper.common.ValidHelper; import com.ynxbd.common.helper.common.ValidHelper;
@ -135,7 +136,7 @@ public class HealthCodeAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失 return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失
} }
JSONObject result = HCodeService.getDynamicQRCode(isMiniApp, healthCardId, idCardNo, "0"); JSONObject result = HealthCardHelper.getDynamicQRCode(isMiniApp, healthCardId, idCardNo, "0");
return result == null ? Result.error() : Result.success(result); return result == null ? Result.error() : Result.success(result);
} }
@ -149,11 +150,11 @@ public class HealthCodeAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失 return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失
} }
String qrCodeText = HCodeService.getQRCodeText(isMiniApp, healthCardId, idCardNo); String qrCodeText = HealthCardHelper.getQRCodeText(isMiniApp, healthCardId, idCardNo);
if (qrCodeText == null) { if (qrCodeText == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // qrCodeText参数缺失 return Result.error(ResultEnum.PARAM_IS_DEFECT); // qrCodeText参数缺失
} }
JSONObject result = HCodeService.getCardOrderId(isMiniApp, qrCodeText); JSONObject result = HealthCardHelper.getOrderIdByOutAppId(isMiniApp, qrCodeText);
return result == null ? Result.error() : Result.success(result); return result == null ? Result.error() : Result.success(result);
} }
@ -172,12 +173,12 @@ public class HealthCodeAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo); String qrCodeText = HealthCardHelper.getQRCodeText(false, healthCardId, idCardNo);
if (qrCodeText == null) { if (qrCodeText == null) {
return Result.error(ResultEnum.INTERFACE_OUTER_INVOKE_ERROR); return Result.error(ResultEnum.INTERFACE_OUTER_INVOKE_ERROR);
} }
JSONObject jsonObject = HCodeService.reportHISData(qrCodeText, null, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); JSONObject jsonObject = HealthCardHelper.reportHISData(qrCodeText, null, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null);
if (jsonObject == null) { if (jsonObject == null) {
return Result.error(); return Result.error();
} }
@ -201,7 +202,7 @@ public class HealthCodeAction extends BaseAction {
} }
if (isHealthCard && isFace) { // 实名认证 if (isHealthCard && isFace) { // 实名认证
if (!HCodeService.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId)) { if (!HealthCardHelper.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId)) {
return Result.error(ResultEnum.FACE_VERIFY_ERROR); return Result.error(ResultEnum.FACE_VERIFY_ERROR);
} }
} }
@ -299,44 +300,26 @@ public class HealthCodeAction extends BaseAction {
} }
/**
* 获取健康卡用户信息
*
* @param openid openid
* @param healthCode 健康卡授权码-->用来获取健康卡用户信息
*/
@Action("getHealthCardInfo") @Action("getHealthCardInfo")
public Result getHealthCardInfo(Boolean isMiniApp, String openid, String healthCode) { public Result getHealthCardInfo(Boolean isMiniApp, String openid, String healthCode) {
log.info("[电子健康卡]获取健康卡用户信息 healthCode={}, openid={}", healthCode, openid); try {
if (healthCode == null || openid == null) return Result.error(ResultEnum.PARAM_IS_DEFECT); log.info("[电子健康卡]健康卡授权码获取健康卡信息 isMiniApp={}, openid={}, 健康卡授权码={}", isMiniApp, openid, healthCode);
Patient patient = HealthCardHelper.getHealthCardByHealthCode(isMiniApp, healthCode);
Patient patient = HCodeService.getHealthCardByHealthCode(isMiniApp, healthCode); return Result.success(patient);
if (patient == null) { } catch (Exception e) {
log.info("[电子健康卡]获取健康卡用户信息-失败"); return Result.error(e);
return Result.error("[电子健康卡]获取健康卡用户信息-失败");
} }
return Result.success(patient);
} }
/** /**
* [升级绑定]-->已在HIS绑定-->注册健康卡 * [升级绑定]-->已在HIS绑定-->注册健康卡
* *
* @param wechatCode wechatCode
* @param id id
* @param idCardNo idCardNo
* @param cardType cardType
* @param openid openid
* @param tel tel
* @param name name
* @param nation nation
* @param patientId patientId
* @param address address
*/ */
@Action("upBind") @Action("upBind")
public Result upBind(String wechatCode, Integer id, @AesDecode String idCardNo, @AesDecode String patientId, String cardType, String openid, String tel, String name, String nation, String address) { public Result upBind(String wechatCode, Integer id, @AesDecode String openid, @AesDecode String idCardNo, @AesDecode String hisPatientId, @AesDecode String epId, String cardType, String tel, String name, String nation, String address) {
log.info("[电子健康卡]升级绑定 id={}, name={}, address={}, nation={}, patientId={}, tel={}, idType={}, wechatCode={}", id, name, address, nation, patientId, tel, cardType, wechatCode); log.info("[电子健康卡]升级绑定 id={}, name={}, address={}, nation={}, epId={}, hisPatientId={}, tel={}, idType={}, wechatCode={}", id, name, address, nation, epId, hisPatientId, tel, cardType, wechatCode);
if (wechatCode == null || openid == null || patientId == null || name == null || idCardNo == null || tel == null || address == null || nation == null) { if (wechatCode == null || openid == null || epId == null || hisPatientId == null || name == null || idCardNo == null || tel == null || address == null || nation == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
@ -358,7 +341,7 @@ public class HealthCodeAction extends BaseAction {
} }
// 先注册,后修改-->先获取健康卡ID // 先注册,后修改-->先获取健康卡ID
JSONObject rspObj = HCodeService.registerHealthCard(false, patientId, wechatCode, birthday, cardTypeEnum, address, null, sex, nation, name, idCardNo, tel); JSONObject rspObj = HCodeService.registerHealthCard(false, hisPatientId, wechatCode, birthday, cardTypeEnum, address, null, sex, nation, name, idCardNo, tel);
if (rspObj == null) { if (rspObj == null) {
log.info("[电子健康卡]升级绑定失败, 响应内容为空"); log.info("[电子健康卡]升级绑定失败, 响应内容为空");
return Result.error("[电子健康卡]升级绑定失败, 响应内容为空"); return Result.error("[电子健康卡]升级绑定失败, 响应内容为空");
@ -377,7 +360,8 @@ public class HealthCodeAction extends BaseAction {
Patient bindInfo = new Patient(); Patient bindInfo = new Patient();
bindInfo.setOpenid(openid); bindInfo.setOpenid(openid);
bindInfo.setPatientId(patientId); bindInfo.setPatientId(hisPatientId);
bindInfo.setEmpiId(epId);
bindInfo.setIdCardNo(idCardNo); bindInfo.setIdCardNo(idCardNo);
bindInfo.setHealthCardId(healthCardId); bindInfo.setHealthCardId(healthCardId);
bindInfo.setName(name); bindInfo.setName(name);
@ -399,46 +383,38 @@ public class HealthCodeAction extends BaseAction {
* 身份证识别 * 身份证识别
*/ */
@Action("orcInfo") @Action("orcInfo")
public Result orcInfo(Boolean isMiniApp, String image) { public Result orcInfo(String image) {
log.info("身份证识别"); try {
if (image == null) { log.info("身份证识别");
return Result.error(ResultEnum.PARAM_IS_DEFECT); if (image == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
Patient patient = HealthCardHelper.orcInfo(image);
return Result.success(patient);
} catch (Exception e) {
return Result.error(e);
} }
Patient patient = HCodeService.orcInfo(isMiniApp, image);
return Result.success(patient);
} }
/**
* 实人认证生成orderId
*
* @param idCardNo idCardNo
* @param name name
* @param wechatCode wechatCode
*/
@Action("registerUniformVerifyOrder") @Action("registerUniformVerifyOrder")
public Result registerUniformVerifyOrder(String idCardNo, String name, String wechatCode) { public Result registerUniformVerifyOrder(String wechatCode, String name, String idCardNo) {
log.info("[电子健康卡]实人认证生成orderId idCardNo={}, name={}", idCardNo, name); log.info("[电子健康卡]实人认证生成orderId wechatCode={}, name={}, idCardNo={}", wechatCode, name, idCardNo);
if (idCardNo == null || name == null || wechatCode == null) { if (wechatCode == null || name == null || idCardNo == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空
} }
String orderId = HCodeService.bindUniformVerifyOrder(idCardNo, name, wechatCode); String orderId = HCodeService.bindUniformVerifyOrder(wechatCode, name, idCardNo);
return ObjectUtils.isEmpty(orderId) ? Result.error() : Result.success(orderId); return ObjectUtils.isEmpty(orderId) ? Result.error() : Result.success(orderId);
} }
/**
* 实人认证结果查询接口
*
* @param orderId orderId
* @param registerOrderId registerOrderId
*/
@Action("checkUniformVerifyResult") @Action("checkUniformVerifyResult")
public Result checkUniformVerifyResult(Boolean isMiniApp, String orderId, String registerOrderId) { public Result checkUniformVerifyResult(Boolean isMiniApp, String orderId, String registerOrderId) {
log.info("[电子健康卡]实人认证结果查询 orderId={}, registerOrderId={}", orderId, registerOrderId); log.info("[电子健康卡]实人认证结果查询 orderId={}, registerOrderId={}", orderId, registerOrderId);
if (orderId == null || registerOrderId == null) { if (orderId == null || registerOrderId == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空
} }
return Result.isOK(HCodeService.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId)); return Result.isOK(HealthCardHelper.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId));
} }

@ -3,6 +3,7 @@ package com.ynxbd.common.bean.enums;
// 查报告等需要验证的场景 // 查报告等需要验证的场景
import lombok.ToString; import lombok.ToString;
import org.apache.commons.lang3.ObjectUtils;
@ToString @ToString
public enum HealthCardSceneEnum { public enum HealthCardSceneEnum {
@ -34,4 +35,17 @@ public enum HealthCardSceneEnum {
this.NAME = NAME; this.NAME = NAME;
} }
public static HealthCardSceneEnum findEnum(String code) {
if (ObjectUtils.isEmpty(code)) {
return null;
}
for (HealthCardSceneEnum item : values()) {
if (code.equals(item.CODE)) {
return item;
}
}
return null;
}
} }

@ -206,6 +206,7 @@ public class PatientDao {
if (id == null) { if (id == null) {
return false; return false;
} }
String sql = "update patientBase set deletedState=0, healthCardId=?, name=?, nation=?, tel=?, address=?, uuid=?, areaCode=?, areaAddress=?, patientId=?, empiId=?, gmcBindState=?, " + String sql = "update patientBase set deletedState=0, healthCardId=?, name=?, nation=?, tel=?, address=?, uuid=?, areaCode=?, areaAddress=?, patientId=?, empiId=?, gmcBindState=?, " +
" uniqueId=if(uniqueId is null or uniqueId = '', ?, uniqueId), " + " uniqueId=if(uniqueId is null or uniqueId = '', ?, uniqueId), " +
" gmcUniqueId=if(gmcUniqueId is null or gmcUniqueId = '', ?, gmcUniqueId) " + " gmcUniqueId=if(gmcUniqueId is null or gmcUniqueId = '', ?, gmcUniqueId) " +

@ -3,8 +3,11 @@ package com.ynxbd.common.helper;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.tencent.healthcard.model.CommonIn; import com.tencent.healthcard.model.CommonIn;
import com.tencent.healthcard.model.HealthCardInfo; import com.tencent.healthcard.model.HealthCardInfo;
import com.tencent.healthcard.model.ReportHISData;
import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.Patient;
import com.ynxbd.common.bean.enums.HCardTypeEnum; import com.ynxbd.common.bean.enums.HCardTypeEnum;
import com.ynxbd.common.bean.enums.HealthCardEnum;
import com.ynxbd.common.bean.enums.HealthCardSceneEnum;
import com.ynxbd.common.config.HealthCardConfig; import com.ynxbd.common.config.HealthCardConfig;
import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.JsonHelper;
@ -14,6 +17,8 @@ import com.ynxbd.wx.config.WeChatConfig;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID; import java.util.UUID;
@Slf4j @Slf4j
@ -24,73 +29,72 @@ public class HealthCardHelper {
* *
* @param wechatCode 微信身份码 * @param wechatCode 微信身份码
*/ */
public static JSONObject registerHealthCardPreAuth(Boolean isMiniApp, Boolean isHCBindUI, String wechatCode) { public static JSONObject registerHealthCardPreAuth(Boolean isMiniApp, Boolean isHCBindUI, Integer patientType, String wechatCode, String enHisPatientId) throws ServiceException {
try { if (isMiniApp == null) {
if (isMiniApp == null) { isMiniApp = false;
isMiniApp = false; }
} CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp); if (commonIn == null) {
if (commonIn == null) { throw new ServiceException("[电子健康卡]健康卡授权码获取健康卡信息-请求参数缺失");
return null; }
}
String domain = WeChatConfig.getDomain(false);
String webURL = WeChatConfig.getWebReqURL();
// 授权成功回调页
String successRedirectUrl = isMiniApp ? "mini:/path/to/isvpage?healthCode=${healthCode}" : (webURL + "health-card-form.html?healthCode=${healthCode}");
// 授权失败回调
String failRedirectUrl = isMiniApp ? "/path/to/isvpage?regInfoCode=${regInfoCode}" : (webURL + "health-card-form.html?regInfoCode=${regInfoCode}");
/*
* 用户手动填写信息建卡可选两种方式二选一
* 服务商自行提供建卡页可以是H5或小程序需增加authCode占位符示例如下
* H5: https://xxx.xxx.xx/path/to/isvpage?authCode=${authCode} |小程序: mini:/path/to/isvpage?authCode=${authCode}
* 使用开放平台的H5绑卡组件页需增加authCode占位符示例如下
* https://h5-health.tengmed.com/h5/tencent/open/card/regist?hospitalId=${hospitalId}&redirect_uri=${redirect_uri}&fail_redirect_uri=${fail_redirect_uri}&authCode=${authCode}小程序需修改该域名地址为已配置的业务域名
* ${hospitalId}必传为开放平台分配的医院ID(hospitalId)
* ${redirect_uri}必传为建卡成功后的回跳服务商页面必须要对该URL进行UrlEncode编码
* ${fail_redirect_uri}必传为建卡失败后的回跳服务商页面必须要对该URL进行UrlEncode编码
* 小程序内嵌仍以 mini 协议开头且需要UrlEncode编码
*/
String hcBindUIUrl = String.format("%s/h5/tencent/open/card/regist?hospitalId=%s&redirect_uri=%s&fail_redirect_uri=%s&authCode=%s",
(isMiniApp ? domain : "https://h5-health.tengmed.com"),
HealthCardConfig.H_HOSPITAL_ID,
URLHelper.encodeURL(successRedirectUrl),
URLHelper.encodeURL(failRedirectUrl),
wechatCode);
String userFormPageUrl = isHCBindUI
? hcBindUIUrl
: (webURL + "health-card-form.html?authCode=${authCode}");
// 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage
String faceUrl = isMiniApp ? "/path/to/facePage" : null;
// 放弃验证回调页
String verifyFailRedirectUrl = isMiniApp ? "mini:/path/to/isvpage" : (webURL + "health-card-fail.html?code=-1");
int patientType = 0; // 0-新患者 1-老患者(针对就诊卡升级健康卡);不传默认为0 String domain = WeChatConfig.getDomain(false);
String webURL = WeChatConfig.getWebReqURL();
// 授权成功回调页
String successRedirectUrl = isMiniApp ? "mini:/path/to/isvpage?healthCode=${healthCode}" : (webURL + "health-card-form.html?healthCode=${healthCode}");
// 授权失败回调
String failRedirectUrl = isMiniApp ? "/path/to/isvpage?regInfoCode=${regInfoCode}" : (webURL + "health-card-form.html?regInfoCode=${regInfoCode}");
/*
* 用户手动填写信息建卡可选两种方式二选一
* 服务商自行提供建卡页可以是H5或小程序需增加authCode占位符示例如下
* H5: https://xxx.xxx.xx/path/to/isvpage?authCode=${authCode} |小程序: mini:/path/to/isvpage?authCode=${authCode}
* 使用开放平台的H5绑卡组件页需增加authCode占位符示例如下
* https://h5-health.tengmed.com/h5/tencent/open/card/regist?hospitalId=${hospitalId}&redirect_uri=${redirect_uri}&fail_redirect_uri=${fail_redirect_uri}&authCode=${authCode}小程序需修改该域名地址为已配置的业务域名
* ${hospitalId}必传为开放平台分配的医院ID(hospitalId)
* ${redirect_uri}必传为建卡成功后的回跳服务商页面必须要对该URL进行UrlEncode编码
* ${fail_redirect_uri}必传为建卡失败后的回跳服务商页面必须要对该URL进行UrlEncode编码
* 小程序内嵌仍以 mini 协议开头且需要UrlEncode编码
*/
String hcBindUIUrl = String.format("%s/h5/tencent/open/card/regist?hospitalId=%s&redirect_uri=%s&fail_redirect_uri=%s&authCode=%s",
(isMiniApp ? domain : "https://h5-health.tengmed.com"),
HealthCardConfig.H_HOSPITAL_ID,
URLHelper.encodeURL(successRedirectUrl),
URLHelper.encodeURL(failRedirectUrl),
wechatCode);
enHisPatientId = ObjectUtils.isEmpty(enHisPatientId) ? "" : "&enHisPatientId=" + enHisPatientId;
String userFormPageUrl = isHCBindUI
? hcBindUIUrl
: (webURL + "health-card-form.html?authCode=${authCode}" + enHisPatientId);
// 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage
String faceUrl = isMiniApp ? "/path/to/facePage" : null;
// 放弃验证回调页
String verifyFailRedirectUrl = isMiniApp ? "mini:/path/to/isvpage" : (webURL + "health-card-fail.html?code=-1");
if (patientType == null || patientType != 1) {
patientType = 0;// 0-新患者 1-老患者(针对就诊卡升级健康卡);不传默认为0
}
JSONObject resultJson = HealthCardConfig.createHealthCardService().registerHealthCardPreAuth(commonIn, JSONObject resultJson = HealthCardConfig.createHealthCardService().registerHealthCardPreAuth(commonIn,
wechatCode, wechatCode,
patientType, patientType,
successRedirectUrl, successRedirectUrl,
failRedirectUrl, failRedirectUrl,
userFormPageUrl, userFormPageUrl,
faceUrl, faceUrl,
verifyFailRedirectUrl, verifyFailRedirectUrl,
HealthCardConfig.DOMAIN_CHANNEL); HealthCardConfig.DOMAIN_CHANNEL);
log.info("[电子健康卡]绑卡验证授权 resp={}", JsonHelper.toJsonString(resultJson)); log.info("[电子健康卡]绑卡验证授权 resp: {}", JsonHelper.toJsonString(resultJson));
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson); HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (!result.isOk) { if (!result.isOk) {
log.info("[电子健康卡]绑卡验证授权-失败: {}", result.getErrMsg()); throw new ServiceException("[电子健康卡]绑卡验证授权-失败:" + result.getJsonCommon());
return result.getCommonOut();
}
return result.getRsp();
} catch (Exception e) {
ErrorHelper.println(e);
} }
return null; return result.getRsp();
} }
@ -99,7 +103,7 @@ public class HealthCardHelper {
* *
*/ */
public static JSONObject registerHealthCardPreFill(Boolean isMiniApp, String authCode, String name, String gender, String nation, String birthday, public static JSONObject registerHealthCardPreFill(Boolean isMiniApp, String authCode, String name, String gender, String nation, String birthday,
String idNumber, HCardTypeEnum cardTypeEnum, String phone1) { String idNumber, HCardTypeEnum cardTypeEnum, String phone1) {
try { try {
if (isMiniApp == null) { if (isMiniApp == null) {
isMiniApp = false; isMiniApp = false;
@ -262,8 +266,8 @@ public class HealthCardHelper {
* @param phone1 联系方式1 * @param phone1 联系方式1
*/ */
public static JSONObject registerHealthCard(Boolean isMiniApp, String patientId, String wechatCode, public static JSONObject registerHealthCard(Boolean isMiniApp, String patientId, String wechatCode,
String birthday, HCardTypeEnum cardTypeEnum, String address, String areaAddress, String birthday, HCardTypeEnum cardTypeEnum, String address, String areaAddress,
String sex, String nation, String name, String idCardNo, String phone1) { String sex, String nation, String name, String idCardNo, String phone1) {
try { try {
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp); CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) { if (commonIn == null) {
@ -423,4 +427,143 @@ public class HealthCardHelper {
} }
return null; return null;
} }
/**
* 实人认证生成orderId
*/
public static JSONObject registerUniformVerifyOrder(Boolean isMiniApp, String wechatCode, HealthCardSceneEnum sceneEnum, String name, String idCardNo) {
try {
log.info("[电子健康卡]实人认证生成orderId idCardNo={}, name={}", idCardNo, name);
if (ObjectUtils.isEmpty(idCardNo) || ObjectUtils.isEmpty(name)) {
return null;
}
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) {
return null;
}
String webURL = WeChatConfig.getWebReqURL();
String verifySuccessRedirectUrl = webURL + "hc-ok.html?registerOrderId=${registerOrderId}";
String verifyFailRedirectUrl = webURL + "health-card-fail.html?code=-3";
JSONObject resultJson = HealthCardConfig.createHealthCardService().registerUniformVerifyOrder(commonIn,
idCardNo,
"01",
name,
wechatCode,
null,
(sceneEnum == null ? null : sceneEnum.CODE),
null,
HealthCardEnum.CARD_TYPE_ID_CARD.STATUS,
null,
verifySuccessRedirectUrl,
verifyFailRedirectUrl,
null,
0);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
// JSONObject resultJson = new HealthCardServerImpl(H_APP_SECRET).registerUniformVerifyOrder(commonIn, idCardNo, "01", name, wechatCode);
if (!result.isOk) {
log.info("[电子健康卡]实人认证生成orderId接口失败: {}", resultJson);
return null;
}
JSONObject respJson = result.getRsp();
if (respJson == null) {
return null;
}
return respJson;
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
/**
* [电子健康卡]实人认证结果查询
*/
public static boolean checkUniformVerifyResult(Boolean isMiniApp, String verifyOrderId, String registerOrderId) {
try {
log.info("[电子健康卡]实人认证结果查询 verifyOrderId={}, registerOrderId={}", verifyOrderId, registerOrderId);
if (ObjectUtils.isEmpty(verifyOrderId) || ObjectUtils.isEmpty(registerOrderId)) {
return false;
}
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) {
return false;
}
JSONObject resultJson = HealthCardConfig.createHealthCardService().checkUniformVerifyResult(commonIn, verifyOrderId, registerOrderId);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (!result.isOk) {
log.info("[电子健康卡]实人认证结果查询失败: {}", resultJson);
return false;
}
JSONObject respJson = result.getRsp();
if (respJson == null) {
return false;
}
return respJson.getBoolean("suc");
} catch (Exception e) {
ErrorHelper.println(e);
}
return false;
}
/**
* 电子健康卡用卡数据监测接口
*
* @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 (!HealthCardConfig.IS_UPLOAD_DATA) { // 禁止数据上传
return null;
}
if (ObjectUtils.isEmpty(qrCodeText) || scene == null || cardType == null) {
log.info("[电子健康卡]用卡数据监测接口,参数为空");
return null;
}
try {
CommonIn commonIn = HealthCardConfig.createCommonIn(false);
if (commonIn == null) {
return null;
}
ReportHISData req = new ReportHISData();
req.setQrCodeText(qrCodeText);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
req.setTime(format.format(new Date()));
req.setHospitalCode(HealthCardConfig.H_HOSPITAL_ID);
// 010101 挂号
req.setScene(scene);
req.setDepartment(deptName); // 科室代码
req.setCardChannel(HealthCardEnum.CARD_CHANNEL_WX_CHANNEL.STATUS); // 微信渠道
req.setCardType(cardType);
// 自费:0100,医保:0200,公费:0300,其他:0000
req.setCardCostTypes(cardCostType);
//调用接口
JSONObject resultJson = HealthCardConfig.createHealthCardService().reportHISData(commonIn, req);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (HealthCardConfig.IS_LOG_REPORT) {
log.info("[电子健康卡]用卡数据监测接口 req={}, resp={}", JsonHelper.toJsonString(req), JsonHelper.toJsonString(resultJson));
}
if (!result.isOk) {
log.info("[电子健康卡]用卡数据监测接口 {}", resultJson);
return null;
}
return result.getRsp();
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
} }

@ -4,23 +4,19 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.tencent.healthcard.model.CommonIn; import com.tencent.healthcard.model.CommonIn;
import com.tencent.healthcard.model.HealthCardInfo; import com.tencent.healthcard.model.HealthCardInfo;
import com.tencent.healthcard.model.ReportHISData;
import com.ynxbd.common.bean.Patient; import com.ynxbd.common.bean.Patient;
import com.ynxbd.common.bean.enums.HCardTypeEnum; import com.ynxbd.common.bean.enums.HCardTypeEnum;
import com.ynxbd.common.bean.enums.HealthCardEnum; import com.ynxbd.common.bean.enums.HealthCardEnum;
import com.ynxbd.common.bean.enums.HealthCardSceneEnum; import com.ynxbd.common.bean.enums.HealthCardSceneEnum;
import com.ynxbd.common.config.HealthCardConfig; import com.ynxbd.common.config.HealthCardConfig;
import com.ynxbd.common.helper.HealthCardHelper;
import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.config.WeChatConfig;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
@Slf4j @Slf4j
public class HCodeService { public class HCodeService {
@ -81,53 +77,6 @@ public class HCodeService {
return null; return null;
} }
/**
* 健康卡授权码获取健康卡信息
*
* @param healthCode 健康卡授权码
*/
public static Patient getHealthCardByHealthCode(Boolean isMiniApp, String healthCode) {
try {
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) {
return null;
}
JSONObject resultJson = HealthCardConfig.createHealthCardService().getHealthCardByHealthCode(commonIn, healthCode);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
JSONObject respJson = result.getRsp();
if (!result.isOk || respJson == null) {
log.info("[电子健康卡]健康卡授权码获取健康卡信息-失败: {}", resultJson);
return null;
}
JSONObject card = respJson.getJSONObject("card");
if (card == null) {
log.info("[电子健康卡]健康卡授权码获取健康卡信息-Json解析失败");
return null;
}
Patient patient = new Patient();
String phone1 = card.getString("phone1");
patient.setTel(ObjectUtils.isEmpty(phone1) ? card.getString("phone2") : phone1);
patient.setIsMyself(card.getBoolean("isSelf"));
patient.setName(card.getString("name"));
patient.setCardType(card.getString("idType"));
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"));
log.info("[电子健康卡]健康卡授权码获取健康卡信息: {}", JsonHelper.toJsonString(patient));
return patient;
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
/** /**
* [电子健康卡]通过二维码获取健康卡数据 * [电子健康卡]通过二维码获取健康卡数据
* *
@ -177,14 +126,14 @@ public class HCodeService {
} }
public static String bindUniformVerifyOrder(String idCardNo, String name, String wechatCode) { public static String bindUniformVerifyOrder(String wechatCode, String name, String idCardNo) {
return registerUniformVerifyOrder(false, idCardNo, name, wechatCode, null); // HealthCardSceneEnum._0201091 return registerUniformVerifyOrder(false, wechatCode, null, name, idCardNo); // HealthCardSceneEnum._0201091
} }
/** /**
* 实人认证生成orderId接口 * [旧版]实人认证生成orderId接口
*/ */
public static String registerUniformVerifyOrder(Boolean isMiniApp, String idCardNo, String name, String wechatCode, HealthCardSceneEnum sceneEnum) { public static String registerUniformVerifyOrder(Boolean isMiniApp, String wechatCode, HealthCardSceneEnum sceneEnum, String name, String idCardNo) {
try { try {
log.info("[电子健康卡]实人认证生成orderId idCardNo={}, name={}", idCardNo, name); log.info("[电子健康卡]实人认证生成orderId idCardNo={}, name={}", idCardNo, name);
if (ObjectUtils.isEmpty(idCardNo) || ObjectUtils.isEmpty(name)) { if (ObjectUtils.isEmpty(idCardNo) || ObjectUtils.isEmpty(name)) {
@ -195,8 +144,6 @@ public class HCodeService {
return null; return null;
} }
String okURL = WeChatConfig.getWebReqURL() + "/health-card-bind.html";
JSONObject resultJson = HealthCardConfig.createHealthCardService().registerUniformVerifyOrder(commonIn, JSONObject resultJson = HealthCardConfig.createHealthCardService().registerUniformVerifyOrder(commonIn,
idCardNo, idCardNo,
"01", "01",
@ -229,97 +176,6 @@ public class HCodeService {
} }
/**
* 实人认证结果查询
*/
public static boolean checkUniformVerifyResult(Boolean isMiniApp, String verifyOrderId, String registerOrderId) {
try {
log.info("[电子健康卡]实人认证结果查询 verifyOrderId={}, registerOrderId={}", verifyOrderId, registerOrderId);
if (ObjectUtils.isEmpty(verifyOrderId) || ObjectUtils.isEmpty(registerOrderId)) {
return false;
}
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) {
return false;
}
JSONObject resultJson = HealthCardConfig.createHealthCardService().checkUniformVerifyResult(commonIn, verifyOrderId, registerOrderId);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (!result.isOk) {
log.info("[电子健康卡]实人认证结果查询失败: {}", resultJson);
return false;
}
JSONObject respJson = result.getRsp();
if (respJson == null) {
return false;
}
return respJson.getBoolean("suc");
} catch (Exception e) {
ErrorHelper.println(e);
}
return false;
}
/**
* 获取卡包订单ID
*
* @param qrCodeText 二维码编码
*/
public static JSONObject getCardOrderId(Boolean isMiniApp, String qrCodeText) {
try {
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) {
return null;
}
//调用接口
JSONObject resultJson = HealthCardConfig.createHealthCardService().getOrderIdByOutAppId(commonIn, WeChatConfig.APP_ID, qrCodeText);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (!result.isOk) {
log.info("[电子健康卡]获取卡包订单ID 失败: {}", resultJson);
return null;
}
return result.getRsp();
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
/**
* 获取健康卡二维码
*
* @param healthCardId 健康卡ID
* @param idCardNo 证件号码
* @param codeType 传0或者10返回动态码1返回静态码
*/
public static JSONObject getDynamicQRCode(Boolean isMiniApp, String healthCardId, String idCardNo, String codeType) {
if (healthCardId == null || idCardNo == null || codeType == null) {
log.info("[电子健康卡]获取健康卡二维码-参数缺失 healthCardId={}, idCardNo={}, codeType={}", healthCardId, idCardNo, codeType);
return null;
}
try {
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) {
return null;
}
JSONObject resultJson = HealthCardConfig.createHealthCardService().getDynamicQRCode(commonIn, healthCardId, "01", idCardNo, codeType);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (!result.isOk) {
log.info("[电子健康卡]获取健康卡二维码失败: {}", resultJson);
return null;
}
return result.getRsp();
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
/** /**
* 绑定健康卡和医院关系 * 绑定健康卡和医院关系
* *
@ -350,85 +206,6 @@ public class HCodeService {
} }
/**
* 根据健康卡ID获取动态二维码
*
* @param healthCardId 健康卡ID
* @param idCardNo 身份证号
* @return 动态二维码
*/
public static String getQRCodeText(Boolean isMiniApp, String healthCardId, String idCardNo) {
JSONObject QRResult = getDynamicQRCode(isMiniApp, healthCardId, idCardNo, "0");
if (QRResult == null) {
log.info("[电子健康卡]用卡数据监测接口-获取二维码失败");
return null;
}
String qrCodeText = QRResult.getString("qrCodeText");
if (ObjectUtils.isEmpty(qrCodeText)) {
log.info("[电子健康卡]用卡数据监测接口-获取qrCodeText失败");
return null;
}
return qrCodeText;
}
/**
* 身份证识别
*
* @param imageContent 身份证正面照片的base64编码数据头部信息需要删除如image/png;base64image/jpeg/png;base64等并且数据量建议压缩到百K级别上传
* @return 身份证信息
*/
public static Patient orcInfo(Boolean isMiniApp, 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 (!HealthCardConfig.isEnable()) { // 判断是否禁用电子健康卡
return null;
}
CommonIn commonIn = new CommonIn(HealthCardConfig.getAppToken(false, false), UUID.randomUUID().toString().replaceAll("-", ""), HealthCardConfig.H_HOSPITAL_ID, 0, null, null);
JSONObject resultJson = HealthCardConfig.createHealthCardService().ocrInfo(commonIn, imageContent);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (!result.isOk) {
log.info("[电子健康卡]身份证识别失败: {}", resultJson);
return null;
}
JSONObject rsp = result.getRsp();
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) {
ErrorHelper.println(e);
return null;
}
return patient;
}
/** /**
* 批量领卡 * 批量领卡
*/ */
@ -471,108 +248,4 @@ public class HCodeService {
} }
return rspItems; return rspItems;
} }
/**
* 电子健康卡用卡数据监测接口
*
* @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 (!HealthCardConfig.IS_UPLOAD_DATA) { // 禁止数据上传
return null;
}
if (ObjectUtils.isEmpty(qrCodeText) || scene == null || cardType == null) {
log.info("[电子健康卡]用卡数据监测接口,参数为空");
return null;
}
try {
CommonIn commonIn = HealthCardConfig.createCommonIn(false);
if (commonIn == null) {
return null;
}
ReportHISData req = new ReportHISData();
req.setQrCodeText(qrCodeText);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
req.setTime(format.format(new Date()));
req.setHospitalCode(HealthCardConfig.H_HOSPITAL_ID);
// 010101 挂号
req.setScene(scene);
req.setDepartment(deptName); // 科室代码
req.setCardChannel(HealthCardEnum.CARD_CHANNEL_WX_CHANNEL.STATUS); // 微信渠道
req.setCardType(cardType);
// 自费:0100,医保:0200,公费:0300,其他:0000
req.setCardCostTypes(cardCostType);
//调用接口
JSONObject resultJson = HealthCardConfig.createHealthCardService().reportHISData(commonIn, req);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (HealthCardConfig.IS_LOG_REPORT) {
log.info("[电子健康卡]用卡数据监测接口 req={}, resp={}", JsonHelper.toJsonString(req), JsonHelper.toJsonString(resultJson));
}
if (!result.isOk) {
log.info("[电子健康卡]用卡数据监测接口 {}", resultJson);
return null;
}
return result.getRsp();
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
/**
* 获取建档信息
*
* @param code 建档授权码[获取信息失败时返回]-填写regInfoCode
*/
public Patient getRegInfoByCode(Boolean isMiniApp, String code) {
try {
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) {
return null;
}
JSONObject resultJson = HealthCardConfig.createHealthCardService().getRegInfoByCode(commonIn, code);
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
JSONObject respJsonObj = result.getRsp();
if (!result.isOk || respJsonObj == null) {
log.info("[电子健康卡]获取建档信息-失败: {}", resultJson);
return null;
}
JSONObject card = respJsonObj.getJSONObject("card");
if (card == null) {
log.info("[电子健康卡]获取建档信息-Json解析失败");
return null;
}
Patient patient = new Patient();
String phone1 = card.getString("phone1");
patient.setTel(ObjectUtils.isEmpty(phone1) ? card.getString("phone2") : phone1);
patient.setIsMyself(card.getBoolean("isSelf"));
patient.setCardType(card.getString("idType"));
patient.setIdCardNo(card.getString("idNumber"));
patient.setName(card.getString("name"));
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"));
log.info("[电子健康卡]获取建档信息: {}", JsonHelper.toJsonString(patient));
return patient;
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
} }

@ -5,6 +5,7 @@ import com.ynxbd.common.bean.Patient;
import com.ynxbd.common.bean.enums.HealthCardEnum; import com.ynxbd.common.bean.enums.HealthCardEnum;
import com.ynxbd.common.config.HealthCardConfig; import com.ynxbd.common.config.HealthCardConfig;
import com.ynxbd.common.dao.PatientDao; import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.helper.HealthCardHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -50,12 +51,12 @@ public class HealthUploadService {
return; return;
} }
String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo); String qrCodeText = HealthCardHelper.getQRCodeText(false, healthCardId, idCardNo);
if (qrCodeText == null) { if (qrCodeText == null) {
return; return;
} }
JSONObject jsonObject = HCodeService.reportHISData(qrCodeText, deptName, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, HealthCardEnum.CARD_COST_TYPE_OWN_EXPENSE.STATUS); JSONObject jsonObject = HealthCardHelper.reportHISData(qrCodeText, deptName, scene, HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, HealthCardEnum.CARD_COST_TYPE_OWN_EXPENSE.STATUS);
if (jsonObject == null) { if (jsonObject == null) {
log.info("[电子健康卡][挂号缴费]数据上报失败"); log.info("[电子健康卡][挂号缴费]数据上报失败");
} }
@ -95,12 +96,12 @@ public class HealthUploadService {
return; return;
} }
String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo); String qrCodeText = HealthCardHelper.getQRCodeText(false, healthCardId, idCardNo);
if (qrCodeText == null) { if (qrCodeText == null) {
return; return;
} }
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); JSONObject jsonObject = HealthCardHelper.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) { if (jsonObject == null) {
log.info("[电子健康卡][门诊缴费]数据上报失败"); log.info("[电子健康卡][门诊缴费]数据上报失败");
} }

Loading…
Cancel
Save