微信后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

282 lines
12 KiB

package com.ynxbd.common.action;
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.HealthCardRespCodeEnum;
import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.PatientDao;
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;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.service.PatientService;
import com.ynxbd.wx.wxfactory.WxCacheHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.ehcache.Cache;
@Slf4j
@Namespace("/health_card")
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();
}
return Result.success(result);
}
/**
* [电子健康卡]验证注册/绑卡接口
*/
@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,
idNumber, HCardTypeEnum._01, phone);
if (result == null) {
return Result.error();
}
return Result.success(result);
}
/**
* [电子健康卡]健康卡授权码获取健康卡信息
*/
@Action("getHealthCardByHealthCode")
public Result getHealthCardByHealthCode(Boolean isMiniApp, @AesDecode String openid, String healthCode) {
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);
}
}
/**
* [电子健康卡]获取建档信息接口[]
*/
@Action("getRegInfoByCode")
public Result getRegInfoByCode(Boolean isMiniApp, @AesDecode String openid, String regInfoCode) {
try {
log.info("[电子健康卡]获取建档信息接口 isMiniApp={}, openid={}, 建档授权码={}", isMiniApp, openid, regInfoCode);
Patient patient = HealthCardHelper.getRegInfoByCode(isMiniApp, regInfoCode);
return Result.success(patient);
} catch (Exception e) {
return Result.error(e);
}
}
/**
* [电子健康卡]身份证识别
*/
@Action("orcInfo")
public Result orcInfo(@AesDecode String openid, String image) {
try {
System.out.println("[电子健康卡]身份证识别...");
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);
}
}
/**
* 获取健康卡二维码
*
* @param isMiniApp isMiniApp
* @param idCardNo 证件号码
* @param healthCardId 健康卡ID
*/
@Action("getDynamicQRCode")
public Result getDynamicQRCode(Boolean isMiniApp, @AesDecode String idCardNo, String healthCardId) {
log.info("[电子健康卡]获取二维码 healthCardId={}", healthCardId);
if (healthCardId == null || idCardNo == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // 参数缺失
}
JSONObject result = HealthCardHelper.getDynamicQRCode(isMiniApp, healthCardId, idCardNo, "0");
return result == null ? Result.error() : Result.success(result);
}
/**
* [电子健康卡]身份绑定成人
*/
@Action("bindCard")
public Result bindCard(@AesDecode String openid, Boolean isEnableHC, String healthCardId, boolean isAreaCode, String address, String areaCode, String areaAddress, String tel, String sex, String name, String nation, String birthday, String idCardNo, String cardType, String enUnionId, String enGmcOpenId) {
log.info("[电子健康卡]身份绑定 openid={}, isEnableHC={} healthCardId={}, name={}, sex={}, nation={}, birthday={}, tel={}, address={}, areaCode={}, areaAddress={}, cardType={}, enUnionId={}, enGmcOpenId={}",
openid, isEnableHC, healthCardId, name, sex, nation, birthday, tel, address, areaCode, areaAddress, cardType, enUnionId, enGmcOpenId);
if (tel == null || sex == null || birthday == null || name == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
if (address == null || areaCode == null) {
log.info("[电子健康卡]地址参数缺失 areaCode={}, address={}", areaCode, address);
return Result.error(ResultEnum.PARAM_ADDRESS_ERROR);
}
if (openid == null) {
return Result.error(ResultEnum.PARAM_IS_INVALID);
}
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.ID_CARD_ERROR);
}
if (!ValidHelper.isValidNation(nation)) {
return Result.error(ResultEnum.NATION_ERROR);
}
if (!DateHelper.isValidDate(birthday)) { // 生日异常
return Result.error(ResultEnum.PARAM_DATE_ERROR);
}
Patient info = new Patient();
info.setOpenid(openid);
info.setHealthCardId(healthCardId);
info.setName(name);
info.setSex(sex);
info.setIdCardNo(idCardNo);
info.setCardTypeEnum(cardTypeEnum);
info.setTel(tel);
info.setBirthday(birthday);
info.setNation(nation);
info.setAddress(address);
info.setAreaCode(areaCode);
info.setAreaAddress(areaAddress);
//
info.setEnUnionId(enUnionId);
info.setEnGmcOpenId(enGmcOpenId);
return new PatientService().bindCard(request, false, isAreaCode, info);
}
/**
* [升级绑定]-->已在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);
}
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 = HealthCardHelper.registerHealthCard(false, patientId, wechatCode, birthday, cardTypeEnum, address, null, 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 = HealthCardRespCodeEnum.findEnumByResultCode(resultCode);
log.info("[电子健康卡]升级绑定失败原因 resultCode={}, errMsg={}, statusMsg={}", resultCode, errMsg, healthCardRespCodeEnum.MESSAGE);
return Result.error(healthCardRespCodeEnum.MESSAGE);
}
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();
}
return Result.error();
}
/**
* [电子健康卡]获取卡包订单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); // 参数缺失
}
String qrCodeText = HealthCardHelper.getQRCodeText(isMiniApp, healthCardId, idCardNo);
if (qrCodeText == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); // qrCodeText参数缺失
}
JSONObject result = HealthCardHelper.getOrderIdByOutAppId(isMiniApp, qrCodeText);
if (result == null) {
return Result.error();
}
return Result.success(result);
}
}