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

debug
王绍全 2 weeks ago
parent f808cb2f81
commit a7ff76d890
  1. 148
      src/main/java/com/ynxbd/common/action/HealthCardAction.java
  2. 86
      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. 167
      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.User;
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.HealthCardSceneEnum;
import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.PatientDao;
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.ResultEnum;
import com.ynxbd.common.service.PatientService;
import com.ynxbd.wx.wxfactory.AesWxHelper;
import com.ynxbd.wx.wxfactory.WxCacheHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.ehcache.Cache;
@ -29,13 +33,23 @@ public class HealthCardAction extends BaseAction {
* [电子健康卡]绑卡验证授权
*/
@Action("registerHealthCardPreAuth")
public Result registerHealthCardPreAuth(Boolean isMiniApp, @AesDecode String openid, String wechatCode) {
log.info("[电子健康卡]绑卡验证授权 isMiniApp={}, wechatCode={}, openid={}", isMiniApp, wechatCode, openid);
JSONObject result = new HealthCardHelper().registerHealthCardPreAuth(isMiniApp, false, wechatCode);
if (result == null) {
return Result.error();
public Result registerHealthCardPreAuth(Boolean isMiniApp, Integer patientType, String wechatCode, String enHisPatientId) {
try {
log.info("[电子健康卡]绑卡验证授权 isMiniApp={}, patientType={}, wechatCode={}, enHisPatientId={}", isMiniApp, patientType, wechatCode, enHisPatientId);
if (wechatCode == null) {
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);
}
}
@ -45,7 +59,7 @@ public class HealthCardAction extends BaseAction {
@Action("registerHealthCardPreFill")
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);
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);
if (result == null) {
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;
HCardTypeEnum cardTypeEnum = HCardTypeEnum.toTypeByWxCode(cardType);
if (cardTypeEnum == null) {
return Result.error(ResultEnum.CARD_TYPE_NOT_FOUNT);
@Action("getCardOrderId")
public Result getCardOrderId(Boolean isMiniApp, @AesDecode String idCardNo, String healthCardId) {
log.info("[电子健康卡]获取卡包订单ID healthCardId={}, idCardNo={}", healthCardId, idCardNo);
if (healthCardId == null || idCardNo == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失
}
if (!ValidHelper.isValidNation(nation)) {
return Result.error(ResultEnum.NATION_ERROR);
String qrCodeText = HealthCardHelper.getQRCodeText(isMiniApp, healthCardId, idCardNo);
if (qrCodeText == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // qrCodeText参数缺失
}
String sex = IDNumberHelper.getSex(idCardNo);
String birthday = IDNumberHelper.getBirthday(idCardNo);
if (sex == null || birthday == null) { // 身份证解析数据错误
log.info("[电子健康卡]升级绑失败,身份证解析数据错误 sex={} birthday={}", sex, birthday);
return Result.error(ResultEnum.PARAM_TYPE_ERROR);
JSONObject result = HealthCardHelper.getOrderIdByOutAppId(isMiniApp, qrCodeText);
if (result == null) {
return Result.error();
}
// 先注册,后修改-->先获取健康卡ID
JSONObject rspObj = HealthCardHelper.registerHealthCard(false, patientId, wechatCode, birthday, cardTypeEnum, address, null, sex, nation, name, idCardNo, tel);
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);
return Result.error(healthCardRespCodeEnum.MESSAGE);
@Action("registerUniformVerifyOrder")
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); // 参数为空
}
Patient bindInfo = new Patient();
bindInfo.setOpenid(openid);
bindInfo.setPatientId(patientId);
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();
HealthCardSceneEnum sceneEnum = HealthCardSceneEnum.findEnum(sceneCode);
if (sceneEnum == null) {
return Result.error(ResultEnum.PARAM_IS_INVALID);
}
JSONObject dataJson = HealthCardHelper.registerUniformVerifyOrder(isMiniApp, wechatCode, sceneEnum, name, idCardNo);
if (ObjectUtils.isEmpty(dataJson)) {
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")
public Result getCardOrderId(Boolean isMiniApp, @AesDecode String idCardNo, String healthCardId) {
log.info("[电子健康卡]获取卡包订单ID healthCardId={}, idCardNo={}", healthCardId, idCardNo);
if (healthCardId == null || idCardNo == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失
@Action("reportHISData")
public Result reportHISData(String scene, @AesDecode String openid, @AesDecode String idCardNo, String healthCardId) {
if (scene == null || openid == null || healthCardId == null || idCardNo == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
String qrCodeText = HealthCardHelper.getQRCodeText(isMiniApp, healthCardId, idCardNo);
String qrCodeText = HealthCardHelper.getQRCodeText(false, healthCardId, idCardNo);
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.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.dao.PatientDao;
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.IDNumberHelper;
import com.ynxbd.common.helper.common.ValidHelper;
@ -135,7 +136,7 @@ public class HealthCodeAction extends BaseAction {
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);
}
@ -149,11 +150,11 @@ public class HealthCodeAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失
}
String qrCodeText = HCodeService.getQRCodeText(isMiniApp, healthCardId, idCardNo);
String qrCodeText = HealthCardHelper.getQRCodeText(isMiniApp, healthCardId, idCardNo);
if (qrCodeText == null) {
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);
}
@ -172,12 +173,12 @@ public class HealthCodeAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo);
String qrCodeText = HealthCardHelper.getQRCodeText(false, healthCardId, idCardNo);
if (qrCodeText == null) {
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) {
return Result.error();
}
@ -201,7 +202,7 @@ public class HealthCodeAction extends BaseAction {
}
if (isHealthCard && isFace) { // 实名认证
if (!HCodeService.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId)) {
if (!HealthCardHelper.checkUniformVerifyResult(isMiniApp, orderId, registerOrderId)) {
return Result.error(ResultEnum.FACE_VERIFY_ERROR);
}
}
@ -299,44 +300,26 @@ public class HealthCodeAction extends BaseAction {
}
/**
* 获取健康卡用户信息
*
* @param openid openid
* @param healthCode 健康卡授权码-->用来获取健康卡用户信息
*/
@Action("getHealthCardInfo")
public Result getHealthCardInfo(Boolean isMiniApp, String openid, String healthCode) {
log.info("[电子健康卡]获取健康卡用户信息 healthCode={}, openid={}", healthCode, openid);
if (healthCode == null || openid == null) return Result.error(ResultEnum.PARAM_IS_DEFECT);
Patient patient = HCodeService.getHealthCardByHealthCode(isMiniApp, healthCode);
if (patient == null) {
log.info("[电子健康卡]获取健康卡用户信息-失败");
return Result.error("[电子健康卡]获取健康卡用户信息-失败");
}
try {
log.info("[电子健康卡]健康卡授权码获取健康卡信息 isMiniApp={}, openid={}, 健康卡授权码={}", isMiniApp, openid, healthCode);
Patient patient = HealthCardHelper.getHealthCardByHealthCode(isMiniApp, healthCode);
return Result.success(patient);
} catch (Exception e) {
return Result.error(e);
}
}
/**
* [升级绑定]-->已在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")
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) {
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) {
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={}, epId={}, hisPatientId={}, tel={}, idType={}, wechatCode={}", id, name, address, nation, epId, hisPatientId, tel, cardType, wechatCode);
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);
}
@ -358,7 +341,7 @@ public class HealthCodeAction extends BaseAction {
}
// 先注册,后修改-->先获取健康卡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) {
log.info("[电子健康卡]升级绑定失败, 响应内容为空");
return Result.error("[电子健康卡]升级绑定失败, 响应内容为空");
@ -377,7 +360,8 @@ public class HealthCodeAction extends BaseAction {
Patient bindInfo = new Patient();
bindInfo.setOpenid(openid);
bindInfo.setPatientId(patientId);
bindInfo.setPatientId(hisPatientId);
bindInfo.setEmpiId(epId);
bindInfo.setIdCardNo(idCardNo);
bindInfo.setHealthCardId(healthCardId);
bindInfo.setName(name);
@ -399,46 +383,38 @@ public class HealthCodeAction extends BaseAction {
* 身份证识别
*/
@Action("orcInfo")
public Result orcInfo(Boolean isMiniApp, String image) {
public Result orcInfo(String image) {
try {
log.info("身份证识别");
if (image == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
Patient patient = HCodeService.orcInfo(isMiniApp, image);
Patient patient = HealthCardHelper.orcInfo(image);
return Result.success(patient);
} catch (Exception e) {
return Result.error(e);
}
}
/**
* 实人认证生成orderId
*
* @param idCardNo idCardNo
* @param name name
* @param wechatCode wechatCode
*/
@Action("registerUniformVerifyOrder")
public Result registerUniformVerifyOrder(String idCardNo, String name, String wechatCode) {
log.info("[电子健康卡]实人认证生成orderId idCardNo={}, name={}", idCardNo, name);
if (idCardNo == null || name == null || wechatCode == null) {
public Result registerUniformVerifyOrder(String wechatCode, String name, String idCardNo) {
log.info("[电子健康卡]实人认证生成orderId wechatCode={}, name={}, idCardNo={}", wechatCode, name, idCardNo);
if (wechatCode == null || name == null || idCardNo == null) {
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);
}
/**
* 实人认证结果查询接口
*
* @param orderId orderId
* @param registerOrderId registerOrderId
*/
@Action("checkUniformVerifyResult")
public Result checkUniformVerifyResult(Boolean isMiniApp, String orderId, String registerOrderId) {
log.info("[电子健康卡]实人认证结果查询 orderId={}, registerOrderId={}", orderId, registerOrderId);
if (orderId == null || registerOrderId == null) {
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 org.apache.commons.lang3.ObjectUtils;
@ToString
public enum HealthCardSceneEnum {
@ -34,4 +35,17 @@ public enum HealthCardSceneEnum {
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) {
return false;
}
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), " +
" gmcUniqueId=if(gmcUniqueId is null or gmcUniqueId = '', ?, gmcUniqueId) " +

@ -3,8 +3,11 @@ package com.ynxbd.common.helper;
import com.alibaba.fastjson.JSONObject;
import com.tencent.healthcard.model.CommonIn;
import com.tencent.healthcard.model.HealthCardInfo;
import com.tencent.healthcard.model.ReportHISData;
import com.ynxbd.common.bean.Patient;
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.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper;
@ -14,6 +17,8 @@ import com.ynxbd.wx.config.WeChatConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Slf4j
@ -24,14 +29,13 @@ public class HealthCardHelper {
*
* @param wechatCode 微信身份码
*/
public static JSONObject registerHealthCardPreAuth(Boolean isMiniApp, Boolean isHCBindUI, String wechatCode) {
try {
public static JSONObject registerHealthCardPreAuth(Boolean isMiniApp, Boolean isHCBindUI, Integer patientType, String wechatCode, String enHisPatientId) throws ServiceException {
if (isMiniApp == null) {
isMiniApp = false;
}
CommonIn commonIn = HealthCardConfig.createCommonIn(isMiniApp);
if (commonIn == null) {
return null;
throw new ServiceException("[电子健康卡]健康卡授权码获取健康卡信息-请求参数缺失");
}
String domain = WeChatConfig.getDomain(false);
@ -60,16 +64,21 @@ public class HealthCardHelper {
URLHelper.encodeURL(failRedirectUrl),
wechatCode);
enHisPatientId = ObjectUtils.isEmpty(enHisPatientId) ? "" : "&enHisPatientId=" + enHisPatientId;
String userFormPageUrl = isHCBindUI
? hcBindUIUrl
: (webURL + "health-card-form.html?authCode=${authCode}");
: (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");
int patientType = 0; // 0-新患者 1-老患者(针对就诊卡升级健康卡);不传默认为0
if (patientType == null || patientType != 1) {
patientType = 0;// 0-新患者 1-老患者(针对就诊卡升级健康卡);不传默认为0
}
JSONObject resultJson = HealthCardConfig.createHealthCardService().registerHealthCardPreAuth(commonIn,
wechatCode,
@ -80,17 +89,12 @@ public class HealthCardHelper {
faceUrl,
verifyFailRedirectUrl,
HealthCardConfig.DOMAIN_CHANNEL);
log.info("[电子健康卡]绑卡验证授权 resp={}", JsonHelper.toJsonString(resultJson));
log.info("[电子健康卡]绑卡验证授权 resp: {}", JsonHelper.toJsonString(resultJson));
HealthCardConfig.HCardResult result = new HealthCardConfig.HCardResult(resultJson);
if (!result.isOk) {
log.info("[电子健康卡]绑卡验证授权-失败: {}", result.getErrMsg());
return result.getCommonOut();
throw new ServiceException("[电子健康卡]绑卡验证授权-失败:" + result.getJsonCommon());
}
return result.getRsp();
} catch (Exception e) {
ErrorHelper.println(e);
}
return null;
}
@ -423,4 +427,143 @@ public class HealthCardHelper {
}
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.tencent.healthcard.model.CommonIn;
import com.tencent.healthcard.model.HealthCardInfo;
import com.tencent.healthcard.model.ReportHISData;
import com.ynxbd.common.bean.Patient;
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.helper.HealthCardHelper;
import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.wx.config.WeChatConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@Slf4j
public class HCodeService {
@ -81,53 +77,6 @@ public class HCodeService {
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) {
return registerUniformVerifyOrder(false, idCardNo, name, wechatCode, null); // HealthCardSceneEnum._0201091
public static String bindUniformVerifyOrder(String wechatCode, String name, String idCardNo) {
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 {
log.info("[电子健康卡]实人认证生成orderId idCardNo={}, name={}", idCardNo, name);
if (ObjectUtils.isEmpty(idCardNo) || ObjectUtils.isEmpty(name)) {
@ -195,8 +144,6 @@ public class HCodeService {
return null;
}
String okURL = WeChatConfig.getWebReqURL() + "/health-card-bind.html";
JSONObject resultJson = HealthCardConfig.createHealthCardService().registerUniformVerifyOrder(commonIn,
idCardNo,
"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;
}
/**
* 电子健康卡用卡数据监测接口
*
* @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.config.HealthCardConfig;
import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.helper.HealthCardHelper;
import lombok.extern.slf4j.Slf4j;
import java.text.SimpleDateFormat;
@ -50,12 +51,12 @@ public class HealthUploadService {
return;
}
String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo);
String qrCodeText = HealthCardHelper.getQRCodeText(false, healthCardId, idCardNo);
if (qrCodeText == null) {
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) {
log.info("[电子健康卡][挂号缴费]数据上报失败");
}
@ -95,12 +96,12 @@ public class HealthUploadService {
return;
}
String qrCodeText = HCodeService.getQRCodeText(false, healthCardId, idCardNo);
String qrCodeText = HealthCardHelper.getQRCodeText(false, healthCardId, idCardNo);
if (qrCodeText == null) {
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) {
log.info("[电子健康卡][门诊缴费]数据上报失败");
}

Loading…
Cancel
Save