package com.ynxbd.common.action; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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.dao.PatientDao; import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.IDNumberHelper; import com.ynxbd.common.helper.common.ValidHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.service.HCodeService; import com.ynxbd.common.service.PatientService; 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; import java.util.List; import java.util.Timer; import java.util.TimerTask; /** * @Author wsq * @Date 2020/9/24 18:00 * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved. */ @Slf4j @Namespace("/healthCode") public class HealthCodeAction extends BaseAction { /** * 查询患者集合 */ @Action("getHealthCardList") public Result getHealthCardList(String openid) { log.info("[电子健康卡]获取用户数据 openid={}", openid); if (openid == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } List patients = new PatientDao().selectHealthCardListByOpenid(openid); return Result.success(patients); } /** * 根据身份证和openid取二维码 */ @Action("getPatientByIdCardNo") public Result getPatientByIdCardNo(String openid, String idCardNo) { log.info("[电子健康卡]根据身份证和openid取二维码 openid={}, idCardNo={}", openid, idCardNo); if (openid == null || idCardNo == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } Patient patient = new PatientDao().selectByIdCardNo(openid, idCardNo); return Result.success(patient); } /** * 获取token,用于绑卡 */ @Action("getAppToken") public Result getAppToken() { String appToken = HCodeService.getAppToken(); return appToken == null ? Result.error() : Result.success(); } /** * [电子健康卡]通过二维码获取健康卡数据 * * @param qrCode 二维码 */ @Action("getHealthCardByQrCode") public Result getHealthCardByQrCode(String qrCode) { log.info("[电子健康卡]通过二维码获取健康卡数据 qrCode={}", qrCode); if (qrCode == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 } Patient patient = HCodeService.getHealthCardByQrCode(qrCode); return patient == null ? Result.error() : Result.success(patient); } /** * 获取健康卡二维码 * * @param appToken appToken * * @param healthCardId 健康卡ID * * @param idCardNo 证件号码 * * @param codeType 传0或者1,0返回动态码,1返回静态码 */ @Action("getDynamicQRCode") public Result getDynamicQRCode(String idCardNo, String healthCardId) { log.info("[电子健康卡]获取二维码 healthCardId={}, idCardNo={}", healthCardId, idCardNo); if (healthCardId == null || idCardNo == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失 } JSONObject result = HCodeService.getDynamicQRCode(healthCardId, idCardNo, "0"); return result == null ? Result.error() : Result.success(result); } /** * 获取卡包订单ID */ @Action("getCardOrderId") public Result getCardOrderId(String idCardNo, String healthCardId) { log.info("[电子健康卡]获取卡包订单ID healthCardId={}, idCardNo={}", healthCardId, idCardNo); if (healthCardId == null || idCardNo == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失 } String qrCodeText = HCodeService.getQRCodeText(healthCardId, idCardNo); if (qrCodeText == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // qrCodeText参数缺失 } JSONObject result = HCodeService.getCardOrderId(qrCodeText); return result == null ? Result.error() : Result.success(result); } /** * 健康卡[上报数据] * * @param scene 上报类型编码 * @param openid openid -->1.前端可以利用openid来操作是否上报, 2.防止非法调用 * @param idCardNo 身份证 * @param healthCardId 健康卡id */ @Action("reportHISData") public Result reportHISData(String scene, String openid, String idCardNo, String healthCardId) { idCardNo = getDecodeString(idCardNo); if (scene == null || openid == null || healthCardId == null || idCardNo == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } String qrCodeText = HCodeService.getQRCodeText(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); if (jsonObject == null) { return Result.error(); } return Result.success(); } /** * [电子健康卡]患者绑定(成人) */ @Action("bind") public Result bind(boolean isCounty, String county, String address, String openid, String tel, String sex, String name, String nation, String birthday, String idCardNo, String cardType, Boolean isHealthCard, String healthCardId, String weChatCode) { log.info("[电子健康卡]身份绑定 name={}, address={}, nation={}, sex={}, birthday={}, tel={}, healthCardId={}, cardType={}", name, address, nation, sex, birthday, tel, healthCardId, cardType); if (isHealthCard == null || openid == null || tel == null || sex == null || birthday == null || name == 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); } if (!ValidHelper.isValidTel(tel)) { log.info("[电子健康卡]电话号码错误 name={}, tel={}, idCardNo={}", name, tel, idCardNo); return Result.error(ResultEnum.TEL_ERROR); } if (!ValidHelper.isValidIdCard(idCardNo)) { log.info("[电子健康卡]身份证错误 name={}, tel={}, idCardNo={}", name, tel, idCardNo); return Result.error(ResultEnum.PARAM_IS_INVALID); } if (!ValidHelper.isValidNation(nation)) { return Result.error(ResultEnum.NATION_ERROR); } if (!DateHelper.isValidDate(birthday)) { // 生日异常 return Result.error(ResultEnum.PARAM_DATE_ERROR); } if (address == null || county == null) { log.info("[电子健康卡]地址错误 county={}, address={}", county, address); return Result.error(ResultEnum.PARAM_ADDRESS_ERROR); } String uuid = null; if (HCodeService.isEnableHealthCard() && isHealthCard && healthCardId == null) { // 没有禁用电子健康卡 log.info("[电子健康卡]绑定 weChatCode={}", weChatCode); if (weChatCode == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } // 先注册,后修改-->先获取健康卡ID JSONObject respObj = HCodeService.registerHealthCard(null, weChatCode, birthday, cardTypeEnum, address, sex, nation, name, idCardNo, tel); if (respObj == null) { log.info("[电子健康卡]注册健康卡失败,响应内容为空"); } else { healthCardId = respObj.getString("healthCardId"); if (ObjectUtils.isEmpty(healthCardId)) { healthCardId = null; // 防止后续绑定院内关系失败 log.info("[电子健康卡]注册失败 healthCardId为空"); // 响应处理 String errMsg = respObj.getString("errMsg"); String resultCode = respObj.getString("resultCode"); HealthCardRespCodeEnum healthCardRespCodeEnum = HCodeService.resultCodeHandle(resultCode); log.info("[电子健康卡] 绑定失败原因 resultCode={}, errMsg={}, statusMsg={}", resultCode, errMsg, healthCardRespCodeEnum.MESSAGE); // if (!healthCardRespCodeEnum.IS_CONTINUE) { // 不继续执行 if (!healthCardRespCodeEnum.equals(HealthCardRespCodeEnum._10060)) { // 姓名和身份证不一致 return Result.error(healthCardRespCodeEnum.MESSAGE); } // 判断出生日期是否大于半年前-->婴儿 Boolean isOverDateByToday = DateHelper.isDateOverMoveDate(birthday, -180); if (isOverDateByToday == null || !isOverDateByToday) { return Result.error(healthCardRespCodeEnum.MESSAGE); } uuid = HCardTypeEnum.BABY.WX_CODE; } } } } return new PatientService().bindCard(false, isCounty, healthCardId, openid, name, sex, idCardNo, cardTypeEnum, tel, address, birthday, nation, county, uuid); } /** * [一键绑定]-->获取健康卡用户信息 * * @param openid openid * @param healthCode 健康卡授权码-->用来获取健康卡用户信息 */ @Action("getHealthCardInfo") public Result getHealthCardInfo(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.getInfoByHealthCode(healthCode); // 通过健康卡授权码获取健康卡的用户信息 if (patient == null) { log.info("[电子健康卡]一键绑定 获取用户信息失败"); return Result.error("[电子健康卡]一键绑定 获取用户信息失败"); } return Result.success(patient); } /** * [升级绑定]-->已在HIS绑定-->注册健康卡 * * @param weChatCode * @param idCardNo * @param cardType * @param openid * @param tel * @param name * @param nation * @param patientId * @param address * @return */ @Action("upBind") public Result upBind(String weChatCode, String idCardNo, String cardType, String openid, String tel, String name, String nation, String patientId, String address) { log.info("[电子健康卡]升级绑定 name={}, address={}, nation={}, patientId={}, tel={}, idType={}, weChatCode={}", 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); } if (!ValidHelper.isValidNation(nation)) { return Result.error(ResultEnum.NATION_ERROR); } 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); } // 先注册,后修改-->先获取健康卡ID JSONObject rspObj = HCodeService.registerHealthCard(patientId, weChatCode, birthday, cardTypeEnum, address, sex, nation, name, idCardNo, tel); if (rspObj == null) { log.info("[电子健康卡]升级绑定失败, 响应内容为空"); return Result.error("[电子健康卡]升级绑定失败, 响应内容为空"); } String healthCardId = rspObj.getString("healthCardId"); if (healthCardId == null) { // 响应处理 String errMsg = rspObj.getString("errMsg"); String resultCode = rspObj.getString("resultCode"); HealthCardRespCodeEnum healthCardRespCodeEnum = HCodeService.resultCodeHandle(resultCode); log.info("[电子健康卡]升级绑定失败原因 resultCode={}, errMsg={}, statusMsg={}", resultCode, errMsg, healthCardRespCodeEnum.MESSAGE); return Result.error(healthCardRespCodeEnum.MESSAGE); } boolean isUpdate = new PatientDao().updateInfo(openid, patientId, idCardNo, healthCardId, name, nation, tel, address, null, null); if (isUpdate) { Cache cache = WxCacheHelper.getUserCache(); cache.remove(openid); return Result.success(); } return Result.error(); } /** * 身份证识别 */ @Action("orcInfo") public Result orcInfo(String image) { log.info("身份证识别"); if (image == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } Patient patient = HCodeService.orcInfo(image); return Result.success(patient); } /** * 实人认证生成orderId * * @param qrCodeText 二维码编码 */ @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) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 } String orderId = HCodeService.registerUniformVerifyOrder(idCardNo, name, wechatCode); return ObjectUtils.isEmpty(orderId) ? Result.error() : Result.success(orderId); } /** * 实人认证结果查询接口 * * @param qrCodeText 二维码编码 */ @Action("checkUniformVerifyResult") public Result checkUniformVerifyResult(String orderId, String registerOrderId) { log.info("[电子健康卡]实人认证结果查询 orderId={}, registerOrderId={}", orderId, registerOrderId); if (orderId == null || registerOrderId == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数为空 } return Result.change(HCodeService.checkUniformVerifyResult(orderId, registerOrderId)); } @Action("batchUpdate") public void batchUpdate() { Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { log.info("开始执行批量领卡定时任务"); List lstPatient = new PatientDao().selectPatient4BatchUpdateHealthCard(); JSONArray jsonArray = null; try { jsonArray = HCodeService.batchUpdate(lstPatient); } catch (Exception e) { e.printStackTrace(); } if (jsonArray == null) return; for (int i = 0; i < jsonArray.size(); i++) { new PatientDao().updateCallFlag(jsonArray.getJSONObject(i).get("idNumber").toString()); if (!"".equals(jsonArray.getJSONObject(i).get("healthCardId").toString()) && !"".equals(jsonArray.getJSONObject(i).get("idNumber").toString())) new PatientDao().updateHealthCard(jsonArray.getJSONObject(i).get("healthCardId").toString(), jsonArray.getJSONObject(i).get("idNumber").toString()); } } }, 2 * 1000, 30 * 1000); } public static void main(String[] args) { String qrCodeText = HCodeService.getQRCodeText("650D5CC50B7FBAB399A42E9CFAB6C6426B047B0422F6EC1ED38415D9B34FD8E5", "412825198810214584"); HCodeService.reportHISData(qrCodeText, "口腔科", "0101011", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); HCodeService.reportHISData(qrCodeText, "口腔科", "0101012", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); HCodeService.reportHISData(qrCodeText, null, "0101013", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); HCodeService.reportHISData(qrCodeText, null, "0101014", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); // 门诊缴费 HCodeService.reportHISData(qrCodeText, "口腔科", "0101051", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, "0100"); // 门诊缴费记录 HCodeService.reportHISData(qrCodeText, null, "0101052", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); HCodeService.reportHISData(qrCodeText, null, "0101081", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); HCodeService.reportHISData(qrCodeText, null, "0101082", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); HCodeService.reportHISData(qrCodeText, null, "0101083", HealthCardEnum.CARD_TYPE_HEALTH_CARD.STATUS, null); } // // public static void main(String[] args){ // String resultCode = "-10044"; // HealthCardRespCodeEnum healthCardRespCodeEnum = HCodeService.resultCodeHandle(resultCode); // logger.info("resultCode=[" + resultCode + "],健康卡绑定失败原因,statusMsg=" + healthCardRespCodeEnum.getMessage() ); // System.out.println(healthCardRespCodeEnum); // if (!healthCardRespCodeEnum.isContinue()) { // 不继续执行 // System.out.println("停止"); // Integer age = IDNumberHelper.getAge("532331202010054010"); // if (age != null && age > 10) { // System.out.println(age); // } // }else{ // System.out.println("继续"); // } // } }