微信后端代码
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.

274 lines
13 KiB

package com.ynxbd.common.service;
import com.ynxbd.common.bean.Patient;
import com.ynxbd.common.bean.User;
import com.ynxbd.common.bean.enums.CountyEnum;
import com.ynxbd.common.bean.enums.HCardTypeEnum;
import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.dao.his.HisPatientDao;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.ParamHelper;
import com.ynxbd.common.helper.common.SmsHelper;
import com.ynxbd.common.helper.common.ValidHelper;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.wx.wxfactory.ReqParamHelper;
import com.ynxbd.wx.wxfactory.WxCacheHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import java.util.List;
import java.util.UUID;
/**
* 患者业务层
*
* @Author wsq
* @Date 2021/3/2 15:36
* @Copyright @ 2020 云南新八达科技有限公司 All rights reserved.
*/
@Slf4j
public class PatientService {
public Patient getMyself(String openid) {
return new PatientDao().selectMyself(openid);
}
public Patient getCacheMyself(String openid) {
User user = WxCacheHelper.getCacheUser(openid);
if (user == null) {
return null;
}
List<Patient> patientList = user.getPatientList();
if (patientList == null || patientList.size() == 0) {
return null;
}
return patientList.stream().filter(Patient::getIsMyself).findFirst().orElse(null);
}
public List<Patient> getPatientList(String openid, String unionId, boolean isEnPid) {
List<Patient> patients = new PatientDao().selectListByToken(openid, unionId);
if (isEnPid) {
for (Patient item : patients) {
if (item.getPatientId() != null) {
item.setEnPatientId(ReqParamHelper.encode(item.getPatientId()));
}
if (!ObjectUtils.isEmpty(item.getIdCardNo())) {
// 加密数据
item.setEnCardNo(ReqParamHelper.encode(item.getIdCardNo()));
item.setEnTel(ReqParamHelper.encode(item.getTel()));
// 显示数据----------------------
item.setShowCardNo(ParamHelper.idCardNoFilter(item.getIdCardNo()));
item.setShowTel(ParamHelper.telFilter(item.getTel()));
} else {
// 无证绑定显示数据
item.setFatherIdCardNo(ParamHelper.idCardNoFilter(item.getFatherIdCardNo()));
item.setMotherIdCardNo(ParamHelper.idCardNoFilter(item.getMotherIdCardNo()));
// ------------
item.setFatherTel(ParamHelper.telFilter(item.getFatherTel()));
item.setMotherTel(ParamHelper.telFilter(item.getMotherTel()));
}
}
}
return patients;
}
/**
* [有证绑定]
*/
public Result bindCard(boolean isMyself, boolean isCounty, String healthCardId, String openid, String name, String sex, String idCardNo, HCardTypeEnum cardTypeEnum, String tel, String address, String birthday, String nation, String county, String uuid) {
return bind(isMyself, isCounty, healthCardId, openid, name, sex, idCardNo, cardTypeEnum, tel, address, birthday, nation, county, uuid, null, null, null, null, null, null);
}
/**
* [绑定]
*
* @param isMyself 是否为自己
* @param isCounty 是否传递行政区编码
* @param healthCardId 健康卡id
* @param openid openid
* @param name 姓名
* @param sex 性别
* @param idCardNo 证件号码
* @param tel 电话号码
* @param address 地址
* @param birthday 出生日期
* @param nation 名字
* @param county 行政区编码
* @param uuid uuid 随机编码
* @param fName 父姓名
* @param fTel 父电话
* @param fIDCardNo 父证件号码
* @param mName 母姓名
* @param mTel 母电话
* @param mIDCardNo 母身份证号码
*/
public Result bind(boolean isMyself, boolean isCounty, String healthCardId, String openid, String name, String sex, String idCardNo, HCardTypeEnum cardTypeEnum, String tel, String address, String birthday, String nation, String county, String uuid, String fName, String fTel, String fIDCardNo, String mName, String mTel, String mIDCardNo) {
log.info("[患者]身份绑定 name={}, county={}, address={}, nation={}, sex={}, birthday={}, tel={}", name, county, address, nation, sex, birthday, tel);
if (openid == null || sex == null || birthday == null || name == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
PatientDao patientDao = new PatientDao();
List<Patient> patients = patientDao.selectListByOpenid(openid);
if (patients.size() > 5) {
log.info("[患者]绑定患者数超过5人 openid={}", openid);
return Result.error(ResultEnum.PATIENT_BIND_EXCEEDS_5); // 绑定人数超过5人
}
county = CountyEnum.getNewCounty(county);
Patient hisPatient;
try {
hisPatient = new HisPatientDao().bind(isCounty, name, sex, idCardNo, cardTypeEnum, tel, address, birthday, nation, county, uuid, fName, fTel, fIDCardNo, mName, mTel, mIDCardNo);
} catch (ServiceException e) {
return Result.error(e);
}
if (hisPatient == null || hisPatient.getPatientId() == null) {
return Result.error(ResultEnum.INTERFACE_HIS_INVOKE_ERROR); // HIS接口调用失败
}
String patientId = hisPatient.getPatientId();
// 判断是否已有数据
Patient patient = patientDao.selectByIdCardNo(openid, idCardNo);
if (patient == null) { // 数据库没有-->添加
log.info("[患者]添加 name={}, county={}, healthCardId={}, address={}, nation={}, sex={}, birthday={}, tel={}", name, county, healthCardId, address, nation, sex, birthday, tel);
if (!patientDao.insert(isMyself, healthCardId, openid, patientId, hisPatient.getHisTransNo(), name, sex, idCardNo, cardTypeEnum, birthday, null, address, nation, tel, uuid, county, fName, fTel, fIDCardNo, mName, mTel, mIDCardNo)) {
log.info("[身份绑定]添加患者失败");
return Result.error(ResultEnum.PATIENT_ADD_ERROR);
}
} else {
if (healthCardId != null && HCodeService.bindCardRelation(patientId, healthCardId) == null) { // 绑定患者和院内关系
log.info("[电子健康卡]绑定患者和医院关系失败");
}
String hid = patient.getHealthCardId();
if (hid != null && !"".equals(hid)) {
healthCardId = hid;
}
log.info("[患者]更新 isMyself={}, patientId={}, name={}, healthCardId={}", isMyself, patient.getPatientId(), name, healthCardId);
if (isMyself) {
if (!patientDao.updateMyself(openid, idCardNo, patientId, name, address, county, nation, tel)) {
log.info("[患者]自身信息更新失败 patientId={}", patient.getPatientId());
return Result.error(ResultEnum.DATA_UPDATE_ERROR);
}
} else {
if (!patientDao.updateInfo(openid, idCardNo, patientId, healthCardId, name, nation, tel, address, uuid, county)) {
log.info("[患者]更新失败 patientId={}", patient.getPatientId());
return Result.error(ResultEnum.PATIENT_UPDATE_ERROR);
}
}
}
WxCacheHelper.removeUser(openid);
return Result.success();
}
/**
* [无证绑定]参数校验
*/
public Result noCardBind(String fTel, String fName, String fIDCardNo, String mTel, String mName, String mIDCardNo) {
log.info("[无证绑定]fTel={}, fName={}, fIDCardNo={}, mTel={}, mName={}, mIDCardNo={}", fTel, fName, fIDCardNo, mTel, mName, mIDCardNo);
if ((fName == null || fTel == null || fIDCardNo == null) && (mName == null || mTel == null || mIDCardNo == null)) {
log.info("[无证绑定]参数缺失");
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
if (fName != null) {
if (!ValidHelper.isValidTel(fTel)) {
log.info("[无证绑定]【父亲】电话号码长度错误 fName={}, fTel={}, fIDCardNo={}", fName, fTel, fIDCardNo);
return Result.error("【父亲】电话号码无效");
}
if (!ValidHelper.isValidIdCard(fIDCardNo)) {
log.info("[无证绑定]【父亲】身份证号码长度错误 fName={}, fTel={}, fIDCardNo={}", fName, fTel, fIDCardNo);
return Result.error("【父亲】身份证号码无效");
}
}
if (mName != null) {
if (!ValidHelper.isValidTel(mTel)) {
log.info("[无证绑定]【母亲】电话号码长度错误 mName={}, mTel={}, mIDCardNo={}", mName, mTel, mIDCardNo);
return Result.error("【母亲】电话号码无效");
}
if (!ValidHelper.isValidIdCard(mIDCardNo)) {
log.info("[无证绑定]【母亲】身份证号码长度错误 mName={}, mTel={}, mIDCardNo={}", mName, mTel, mIDCardNo);
return Result.error("【母亲】身份证号码无效");
}
}
return Result.success();
}
public Result removePatient(String openid, String patientId, String idCardNo) {
boolean isRemove = new PatientDao().removePatient(openid, patientId);
log.info("[患者解绑]{} patientId={}, idCardNo={}", (isRemove ? "成功" : "失败"), patientId, ParamHelper.idCardNoFilter(idCardNo));
if (!isRemove) {
return Result.error();
}
WxCacheHelper.removeUser(openid);
return Result.success();
}
/**
* [绑定本人]
*/
public Result bindMyself(String name, String idCardNo, HCardTypeEnum cardTypeEnum, String address, String county, String openid, String sex, String nation, String birthday, boolean isVerifyCode, String tel, String smsCode) {
log.info("[身份绑定] openid={}, name={}, county={}, address={}, nation={}, sex={}, birthday={}, cardType={}", openid, name, county, address, nation, sex, birthday, cardTypeEnum.ALI_CODE);
if (openid == null || sex == null || birthday == null || name == null || nation == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
if (isVerifyCode) {
if (ObjectUtils.isEmpty(smsCode) || smsCode.length() > 6 || smsCode.length() < 4) {
return Result.error(ResultEnum.SMS_CODE_ERROR);
}
if (ObjectUtils.isEmpty(tel) || tel.length() != 11) {
return Result.error(ResultEnum.SMS_TEL_ERROR);
}
if (!SmsHelper.codeVerify(tel, smsCode, false)) {
return Result.error(ResultEnum.SMS_CODE_VERIFY_ERROR); // 短信验证码失效或错误
}
}
if (address == null || county == null) {
log.info("[身份绑定]地址为空");
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
if (!ValidHelper.isValidNation(nation)) {
log.info("[身份绑定]民族异常 nation={}", nation);
return Result.error(ResultEnum.NATION_ERROR);
}
if (!DateHelper.isValidDate(birthday)) {
log.info("[身份绑定]生日异常 name={}, tel={}, birthday={}", name, tel, birthday);
return Result.error(ResultEnum.PARAM_DATE_ERROR);
}
if (!ValidHelper.isValidTel(tel)) {
log.info("[身份绑定]电话号码长度错误 name={}, tel={}", name, tel);
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);
}
String uuid = UUID.randomUUID().toString().replace("-", ""); // 儿童身份证代码
return bindCard(true, true, null, openid, name, sex, idCardNo, cardTypeEnum, tel, address, birthday, nation, county, uuid);
}
}