1、电子健康卡配置合并为xml,新增xml读取安全配置,和webservice配置调整为xml

2、HIS的SOAP抽离为对象管理调用,因住院结算医保调用环境为测试服务,增加维护难度,调整为用参数控制调用环境。
3、SOAP调用异常后读取流异常处理,优化读取数据操作。
4、请求HIS接口时,使用了雪花id作为请求id,可能会出现时钟回拨,导致导致调用异常,调整为uuid。
5、新增京颐支付相关接口。
6、住院结算医保支付接口新增,处理医保支付传递的公共参数进行合并。
7、新增处方开单字典查询接口
8、查询住院费用清单(住院中)接口返回的数量为小数导致数据解析失败的问题修复。
debug
王绍全 3 weeks ago
parent f7902f9581
commit e3165b196d
  1. 11
      src/main/java/com/ynxbd/common/TestA.java
  2. 46
      src/main/java/com/ynxbd/common/action/InHospAction.java
  3. 6
      src/main/java/com/ynxbd/common/action/RecipeAction.java
  4. 88
      src/main/java/com/ynxbd/common/action/pay/MedicalAction.java
  5. 3
      src/main/java/com/ynxbd/common/action/pay/PEnum.java
  6. 48
      src/main/java/com/ynxbd/common/action/pay/PayAction.java
  7. 7
      src/main/java/com/ynxbd/common/action/test/TestAction.java
  8. 33
      src/main/java/com/ynxbd/common/action/xk/XKAction.java
  9. 1
      src/main/java/com/ynxbd/common/bean/Dept.java
  10. 2
      src/main/java/com/ynxbd/common/bean/in_hosp/InHospFeeItem.java
  11. 1
      src/main/java/com/ynxbd/common/bean/in_hosp/InHospitalList.java
  12. 16
      src/main/java/com/ynxbd/common/bean/pay/Order.java
  13. 2
      src/main/java/com/ynxbd/common/bean/pay/Register.java
  14. 49
      src/main/java/com/ynxbd/common/config/HealthCardConfig.java
  15. 13
      src/main/java/com/ynxbd/common/dao/InHospPayDao.java
  16. 4
      src/main/java/com/ynxbd/common/dao/RecipeDao.java
  17. 12
      src/main/java/com/ynxbd/common/dao/his/HisAccountDao.java
  18. 13
      src/main/java/com/ynxbd/common/dao/his/HisAuthAgentDao.java
  19. 29
      src/main/java/com/ynxbd/common/dao/his/HisInHospDao.java
  20. 40
      src/main/java/com/ynxbd/common/dao/his/HisMedDao.java
  21. 12
      src/main/java/com/ynxbd/common/dao/his/HisMedTestDao.java
  22. 6
      src/main/java/com/ynxbd/common/dao/his/HisMedicalRecordDao.java
  23. 16
      src/main/java/com/ynxbd/common/dao/his/HisPatientDao.java
  24. 32
      src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java
  25. 102
      src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java
  26. 14
      src/main/java/com/ynxbd/common/dao/his/HisReportDao.java
  27. 12
      src/main/java/com/ynxbd/common/dao/his/HisSelfHelpDao.java
  28. 20
      src/main/java/com/ynxbd/common/dao/his/HisTreatDao.java
  29. 7
      src/main/java/com/ynxbd/common/dao/his/HisXKDao.java
  30. 10
      src/main/java/com/ynxbd/common/dao/his/dev/DevHisRecipeDao.java
  31. 16
      src/main/java/com/ynxbd/common/helper/HealthCardHelper.java
  32. 12
      src/main/java/com/ynxbd/common/helper/TestHelper.java
  33. 7
      src/main/java/com/ynxbd/common/helper/common/JsonHelper.java
  34. 4
      src/main/java/com/ynxbd/common/helper/common/QuickDrugDispenseHelper.java
  35. 4
      src/main/java/com/ynxbd/common/helper/common/SnowHelper.java
  36. 57
      src/main/java/com/ynxbd/common/helper/common/SoapHelper.java
  37. 15
      src/main/java/com/ynxbd/common/helper/common/XmlConfigHelper.java
  38. 50
      src/main/java/com/ynxbd/common/helper/his/HisDevHelper.java
  39. 414
      src/main/java/com/ynxbd/common/helper/his/HisHelper.java
  40. 84
      src/main/java/com/ynxbd/common/helper/his/HisMedHelper.java
  41. 3
      src/main/java/com/ynxbd/common/helper/lis/RMLisHelper.java
  42. 62
      src/main/java/com/ynxbd/common/his/AliOldHelper.java
  43. 252
      src/main/java/com/ynxbd/common/his/HisClient.java
  44. 74
      src/main/java/com/ynxbd/common/his/HisConfig.java
  45. 284
      src/main/java/com/ynxbd/common/his/HisEnum.java
  46. 92
      src/main/java/com/ynxbd/common/his/HisFactory.java
  47. 50
      src/main/java/com/ynxbd/common/his/old/HisDevHelper.java
  48. 341
      src/main/java/com/ynxbd/common/his/old/HisHelper.java
  49. 84
      src/main/java/com/ynxbd/common/his/old/HisMedHelper.java
  50. 918
      src/main/java/com/ynxbd/common/his/old/HisResult.java
  51. 22
      src/main/java/com/ynxbd/common/service/InHospService.java
  52. 319
      src/main/java/com/ynxbd/common/service/MedicalService.java
  53. 3
      src/main/java/com/ynxbd/common/service/MiddleOfficeService.java
  54. 11
      src/main/java/com/ynxbd/common/service/RecipeService.java
  55. 10
      src/main/java/com/ynxbd/common/service/RegService.java
  56. 4
      src/main/java/com/ynxbd/common/service/ThirdPartyPayService.java
  57. 2
      src/main/java/com/ynxbd/jy/helper/JYPayConfig.java
  58. 15
      src/main/java/com/ynxbd/jy/helper/JYPayHelper.java
  59. 2
      src/main/java/com/ynxbd/wx/wxfactory/base/auth/Client.java
  60. 22
      src/main/resources/hc-config.xml
  61. 1
      src/main/resources/hcode.properties
  62. 9
      src/main/resources/jy-config.xml
  63. 2
      src/main/resources/webservice.properties
  64. 1
      src/main/resources/webservice.xml

@ -2,6 +2,12 @@ package com.ynxbd.common;
import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm;
import cn.hutool.crypto.asymmetric.RSA;
import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.wx.wxfactory.AesWxHelper;
import java.math.BigDecimal;
public class TestA {
private static final String PUB_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5klqI5STWTcbfjR093j+hvCEjNlZMQscIJg8jxZGqKW84AdFmSqPWEPu9ilqP+QUASiVSZ1QevGr2DWODFZ8Zw35aDA2bqCEprUx81gDdVPO7H7Bij+r8zAg8fT2c0Bi5rFq0xWMEQiTI+CyWwc5prOpquJU/P5yauEAdkRzlDwIDAQAB";
@ -14,6 +20,11 @@ public class TestA {
// "你的私钥base64",
// "你的公钥base64");
// System.out.println(AesWxHelper.encode("192970"));
String totalFee = "0.01";
String cents = new BigDecimal(totalFee).movePointRight(2).toString();
System.out.println(cents);
}
//

@ -1,6 +1,9 @@
package com.ynxbd.common.action;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.action.pay.PEnum;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.in_hosp.*;
import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.his.HisInHospDao;
@ -9,6 +12,7 @@ import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.service.InHospService;
import com.ynxbd.common.service.PayService;
import com.ynxbd.wx.wxfactory.AesWxHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
@ -185,7 +189,7 @@ public class InHospAction extends BaseAction {
*/
@Action("getOutHospRecords")
public Result getOutHospRecords(@AesDecode String patientId, String begDate, String endDate) {
try{
try {
log.info("[住院]通过患者ID查询住院记录(出院后) patientId={}, begDate={}, endDate={}", patientId, begDate, endDate);
if (patientId == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
@ -212,8 +216,17 @@ public class InHospAction extends BaseAction {
}
records = records.stream().sorted(Comparator.comparing(InHospitalList::getInHospitalDate, Comparator.reverseOrder())).collect(Collectors.toList());
for (InHospitalList item : records) {
String treatNum = item.getZyNum();
if (ObjectUtils.isEmpty(treatNum)) {
continue;
}
item.setTreatNum(treatNum);
item.setEnTreatNum(AesWxHelper.encode(treatNum));
}
return Result.success(records);
}catch (Exception e){
} catch (Exception e) {
return Result.error(e);
}
@ -237,16 +250,16 @@ public class InHospAction extends BaseAction {
return Result.error(resp.getMessage());
}
InHospFee inHospFee = new InHospFee();
List<InHospFeeItem> items = resp.getDataMapList(InHospFeeItem.class, "Item");
items.forEach(item -> {
BigDecimal price = item.getPrice();
Integer count = item.getCount();
Double count = item.getCount();
if (price != null && count != null) {
item.setMoney(price.multiply(new BigDecimal(count)));
}
});
InHospFee inHospFee = new InHospFee();
inHospFee.setItems(items);
inHospFee.setPatientName(resp.getDataMapString("PatientName"));
inHospFee.setAdmissionDate(resp.getDataMapString("AdmissionDate"));
@ -278,4 +291,29 @@ public class InHospAction extends BaseAction {
List<InHospAllFee> dataList = resp.getDataMapList(InHospAllFee.class, "Items", "Item");
return Result.success(dataList);
}
/**
* [住院结算]
*
* @param treatNum 住院号
* @return 费用明细
*/
@Action("outHospPay")
public Result outHospPay(String payCode, @AesDecode String treatNum) {
log.info("[住院结算]treatNum={}", treatNum);
if (treatNum == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常
return Result.error(ResultEnum.PAY_TYPE_ERROR);
}
JSONObject respMedJson = PayService.getMedAuthUrl(merchantEnum, PEnum.OUT_HOSP, isHttpsWithProxy());
if (respMedJson != null) {
return Result.success(respMedJson);
}
return Result.error();
}
}

@ -12,8 +12,8 @@ import com.ynxbd.common.dao.PatientDao;
import com.ynxbd.common.dao.his.HisRecipeDao;
import com.ynxbd.common.dao.peis.PEISDao;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
@ -224,7 +224,7 @@ public class RecipeAction extends BaseAction {
params.put("BankTransNo", bankTransNo); // 商户订单号
params.put("OpenId", peisReserve.getOpenid());
params.put("Token", WeChatConfig.TOKEN);
JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Pay_Invoice, params);
JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Pay_Invoice, params);
return result.success() ? Result.success(result) : Result.error(result.getMessage());
}

@ -1,29 +1,28 @@
package com.ynxbd.common.action.pay;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.ali.helper.AliMedHelper;
import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.bean.pay.PayInHosp;
import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.config.interceptor.AesDecode;
import com.ynxbd.common.dao.RecipeDao;
import com.ynxbd.common.dao.his.HisMedDao;
import com.ynxbd.common.helper.common.AesMicroHelper;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.HttpHelper;
import com.ynxbd.common.helper.common.ParamHelper;
import com.ynxbd.common.helper.common.*;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.common.service.MedicalService;
import com.ynxbd.common.service.PayService;
import com.ynxbd.common.service.params.RequestParams;
import com.ynxbd.wx.wxfactory.*;
import com.ynxbd.wx.wxfactory.medical.WxMedConfig;
import com.ynxbd.wx.wxfactory.medical.models.*;
import com.ynxbd.wx.wxfactory.medical.models.MedRespHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.struts2.convention.annotation.Action;
@ -88,12 +87,12 @@ public class MedicalAction extends BaseAction {
medicalInfo = new MedicalService().hisRxUploadDetails(merchantEnum, qrCode, openid, treatNum, patientId, hisPatientId, cardNo, realName, totalFee, ybAttrib, ybBZCode, ybBZName, recipeJson);
break;
case IN_HOSP:
case OUT_HOSP:
log.info("[医保-住院结算]上传明细下单 treatNum={}", treatNum);
if (treatNum == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
medicalInfo = new MedicalService().hisInHospUploadDetails(merchantEnum, qrCode, openid, treatNum, patientId, hisPatientId, cardNo, realName);
medicalInfo = new MedicalService().hisOutHospUploadDetails(merchantEnum, qrCode, openid, treatNum, patientId, hisPatientId, cardNo, realName);
break;
default:
@ -192,19 +191,61 @@ public class MedicalAction extends BaseAction {
public Result order(String callNo, String payCode, String payOpenId, @AesDecode String openid, @AesDecode String patientId, @AesDecode String cardNo, @AesDecode String hisPatientId, String realName, String treatNum, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId,
BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) {
try {
log.info("[医保]下单入参 callNo={}, payCode={}, openid={}, patientId={}, totalFee={}, hisPatientId={}, cardNo={}", callNo, payCode, openid, patientId, totalFee, hisPatientId, ParamHelper.hideIdCardNo(cardNo));
if (callNo == null || payCode == null || openid == null || patientId == null || cardNo == null || totalFee == null) {
log.info("[医保]下单入参 callNo={}, payCode={}, openid={}, patientId={}, totalFee={}, hisPatientId={}, cardNo={}, treatNum={}, payOrdId={}",
callNo, payCode, openid, patientId, totalFee, hisPatientId, ParamHelper.hideIdCardNo(cardNo), treatNum, payOrdId);
if (StrUtil.hasBlank(callNo, payCode, openid, patientId, cardNo) || totalFee == null) {
System.out.println("[医保]下单参数缺失");
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
String ip = HttpHelper.getIpAddress(request);
switch (PEnum.toEnum(callNo)) {
case REG:
Register reg = new Register().getRegParams(new RequestParams(request), true);
return new MedicalService().createRegOrder(payCode, payOpenId, openid, patientId, cardNo, realName, hisPatientId, ip,
payOrdId, payAuthNo, mdTrtId, chrgBchno, mdUserId,
totalFee, acctFee, hifpFee, insuranceFee, cashFee, callNo, reg,
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
Result result = PayService.isPaymentPermittedByTime();
if (result != null) {
System.out.println("[医保]凌晨禁止支付");
return result;
}
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常
log.error("[医保]支付方式异常 payCode={}", payCode);
return Result.error(ResultEnum.PAY_TYPE_ERROR);
}
Order order = new Order();
order.setOutTradeNo(merchantEnum.createOutTradeNo());
order.setIp(HttpHelper.getIpAddress(request));
order.setTradeNo(payOrdId);
order.setPayOrdId(payOrdId);
order.setPayAuthNo(payAuthNo);
order.setPayMoney(cashFee);
order.setAcctFee(acctFee);
order.setHifpFee(hifpFee);
order.setTotalFee(totalFee);
order.setInsuranceFee(insuranceFee);
order.setChrgBchno(chrgBchno);
order.setMdTrtId(mdTrtId);
order.setMdUserId(mdUserId);
order.setPayDeviceId("mobile");
order.setPayMchCode(merchantEnum.CODE);
order.setTreatNum(treatNum);
order.setOpenid(openid);
order.setPayOpenId(payOpenId);
order.setPatientId(patientId);
order.setHisPatientId(hisPatientId);
order.setIdCardNo(cardNo);
order.setPatientName(realName);
order.setFamilyType(familyType);
order.setFamilyName(familyName);
order.setFamilyCardNo(familyCardNo);
order.setMedicalCardInstId(medicalCardInstId);
order.setMedicalCardId(medicalCardId);
PEnum serverEnum = PEnum.toEnum(callNo);
switch (serverEnum) {
case REG:
Register regOrder = JsonHelper.copy(order, Register.class);
regOrder = regOrder.getRegParams(new RequestParams(request), true);
return new MedicalService().createRegOrder(merchantEnum, regOrder, serverEnum);
case RECIPE:
String recipeJson = getReqParamByKey("recipeJson");
@ -212,15 +253,18 @@ public class MedicalAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_BLANK);
}
String payWay = getReqParamByKey("payWay");
return new MedicalService().createRxOrder(payCode, payOpenId, openid, patientId, cardNo, realName, ip,
payOrdId, payAuthNo, mdTrtId, chrgBchno, mdUserId,
totalFee, acctFee, hifpFee, insuranceFee, cashFee,
callNo, recipeJson, treatNum, payWay, familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
Recipe rxOrder = JsonHelper.copy(order, Recipe.class);
return new MedicalService().createRxOrder(merchantEnum, rxOrder, serverEnum, recipeJson, payWay);
case OUT_HOSP:
PayInHosp outHospOrder = JsonHelper.copy(order, PayInHosp.class);
return new MedicalService().createOutHospOrder(merchantEnum, outHospOrder, serverEnum);
default:
return Result.error("调用方式不存在");
}
} catch (ServiceException e) {
} catch (Exception e) {
return Result.error(e);
}
}

@ -12,7 +12,8 @@ public enum PEnum {
// ------------------------------------
REG("挂号", "register", "G"),
RECIPE("处方", "recipe", "C"),
IN_HOSP("住院缴费", "in_hosp", "Z"),
IN_HOSP("住院预交金", "in_hosp", "Z"),
OUT_HOSP("住院结算", "out_hosp", "Z"),
OL_REG("问诊挂号", "ol_register", "OG"),

@ -12,15 +12,20 @@ import com.ynxbd.common.dao.SelfHelpDao;
import com.ynxbd.common.dao.his.HisRecipeDao;
import com.ynxbd.common.dao.sys.SysUserDao;
import com.ynxbd.common.helper.common.*;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.helper.rsa.RSAHelper;
import com.ynxbd.common.helper.xbd.XbdConfigHelper;
import com.ynxbd.common.his.HisConfig;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.common.service.*;
import com.ynxbd.common.service.params.RequestParams;
import com.ynxbd.jy.bean.JYOrder;
import com.ynxbd.jy.bean.enums.JYBusinessTypeEnum;
import com.ynxbd.jy.bean.enums.JYOrderTypeEnum;
import com.ynxbd.jy.helper.JYPayHelper;
import com.ynxbd.wx.config.WeChatConfig;
import com.ynxbd.wx.wxfactory.AesWxHelper;
import com.ynxbd.wx.wxfactory.WxPayHelper;
@ -112,7 +117,7 @@ public class PayAction extends BaseAction {
}
if (isPrepay) { // 目前仅蒙自和红河州医院使用(开通需联系HIS开发者,否则会产生风险)
if (!HisHelper.IS_RECIPE_PREPAY || !WeChatConfig.IS_RECIPE_PREPAY) { // 配置(两个开关)
if (!HisConfig.IS_RX_PREPAY || !WeChatConfig.IS_RECIPE_PREPAY) { // 配置(两个开关)
return Result.error(ResultEnum.PAY_RECIPE_PREPAY_IS_NOT);
}
@ -819,7 +824,7 @@ public class PayAction extends BaseAction {
}
BigDecimal totalFeeDecimal = new BigDecimal(totalFee);
String outRefundNo = HisHelper.getHisTradeNo(bankTransNo, PEnum.OL_REG);
String outRefundNo = HisFactory.getHisTradeNo(bankTransNo, PEnum.OL_REG);
Order orderRefund = PayService.refund(merchantEnum, outTradeNo, outRefundNo, totalFeeDecimal, totalFeeDecimal, refundDesc, new Date(), openid, patientId, null);
if (orderRefund.isSuccess()) {
return Result.success(AesMicroHelper.encode(outRefundNo));
@ -1030,4 +1035,41 @@ public class PayAction extends BaseAction {
// }
// return isResult ? Result.success() : Result.error();
// }
/**
* [京颐支付]测试
*/
@Action("jyPay")
public Result jyPay(String payOpenId, String openid, String patientId, BigDecimal totalFee) {
String outTradeNo = MerchantEnum.JY.createOutTradeNo();
log.info("[京颐支付]测试 outTradeNo={}, totalFee={}", outTradeNo, totalFee);
if (totalFee == null || ObjectUtils.isEmpty(openid) || ObjectUtils.isEmpty(patientId)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
String ip = HttpHelper.getIpAddress(request);
String title = "支付测试";
ReqOrder req = new ReqOrder();
req.setPatientName("小王");
req.setPatientGender("男");
req.setPatientAge("18");
req.setPatientTel("15559603353");
req.setTreatNum("T001");
req.setPatientIdCardNo("532331199910053810");
req.setPatientId("1000001");
JYOrder jyOrder = new JYOrder();
jyOrder.orderTypeEnum = JYOrderTypeEnum._001; // 挂号费
jyOrder.businessTypeEnum = JYBusinessTypeEnum.B102;
req.setJyOrder(jyOrder);
JSONObject order = JYPayHelper.createOrder(MerchantEnum.JY, title, outTradeNo, totalFee.toString(), PEnum.REG.CODE, ip, payOpenId, openid, req);
// if (respJson == null) {
// return Result.error(ResultEnum.PAY_ERROR); // 支付异常
// }
// respJson.put("outTradeNo", outTradeNo);
return Result.success(order);
}
}

@ -1,12 +1,11 @@
package com.ynxbd.common.action.test;
import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.form.FormBlob;
import com.ynxbd.common.bean.form.FormData;
import com.ynxbd.common.bean.sms.SmsTempEnum;
import com.ynxbd.common.helper.common.Base64Helper;
import com.ynxbd.common.config.HealthCardConfig;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.SmsHelper;
import com.ynxbd.common.his.HisConfig;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
@ -20,7 +19,6 @@ import org.apache.struts2.convention.annotation.Namespace;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
/**
* @Author wsq
@ -125,6 +123,7 @@ public class TestAction extends BaseAction {
@Action("r_test")
public Result r_test() throws ServiceException {
System.out.println(HealthCardConfig.isEnable());
return Result.success();
}

@ -0,0 +1,33 @@
package com.ynxbd.common.action.xk;
import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.dao.his.HisXKDao;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import java.util.List;
@Slf4j
@Namespace("/xk")
public class XKAction extends BaseAction {
@Action("queryDict")
public Result queryDict(String callNo, String type) {
if (!"xbd2026".equals(callNo)) {
return Result.error(ResultEnum.PARAM_IS_INVALID);
}
log.info("[开方]字典查询 type={}", type);
if (type == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
List<?> dataList = new HisXKDao().queryHisRxDict(type);
return Result.success(dataList);
}
}

@ -69,6 +69,7 @@ public class Dept implements Serializable {
private String hospitalAreaName;
// 亚专科列表
private String code_yzkStr;
//
private String note;
// 亚专科
private List<Dept> children;

@ -27,7 +27,7 @@ public class InHospFeeItem {
private String itemType;
private String unit;
// 数量
private Integer count;
private Double count;
// 单价
private BigDecimal price;
// 计算结果

@ -18,6 +18,7 @@ import lombok.ToString;
@NoArgsConstructor
public class InHospitalList {
private String zyNum;
private String treatNum;
private String enTreatNum;
private String patientName;

@ -6,6 +6,7 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import java.io.Serializable;
@ -19,6 +20,8 @@ import java.util.Date;
* @Date 2020/11/12 10:24
* @Copyright @ 2020 云南新八达科技有限公司 All rights reserved.
*/
@Slf4j
@Setter
@Getter
@ToString
@ -129,8 +132,12 @@ public class Order implements Serializable {
// 医保----------------------------------
// 医保订单号
private String payOrdId;
// 医保授权码
private String payAuthNo;
// 医保-个人账户支付金额
private BigDecimal acctFee;
// 医保-医保金额【个账+统筹】
private BigDecimal insuranceFee;
// 医保-统筹支付金额
private BigDecimal hifpFee;
// 医保-收费单据号(去掉M作为退费的单号)
@ -144,9 +151,16 @@ public class Order implements Serializable {
// 查询报告的日期范围
private String queryBegDate;
private String queryEndDate;
// 亲情医保===================
private String familyType;
private String familyName;
private String familyCardNo;
private String medicalCardInstId;
private String medicalCardId;
// 缴费订单类型
private String orderType;
private String payDeviceId;
// 第三方回调状态(-1:未调用,0:调用成功,500:调用超时,其他:调用失败)
private Integer noticeStatus;
@ -157,6 +171,8 @@ public class Order implements Serializable {
// 第三方交易流水号
private String noticeTransNo;
private String ip;
// 订单额外信息
private Object orderObj;

@ -266,4 +266,6 @@ public class Register extends Order {
}
}

@ -3,10 +3,10 @@ package com.ynxbd.common.config;
import com.alibaba.fastjson.JSONObject;
import com.tencent.healthcard.impl.HealthCardServerImpl;
import com.tencent.healthcard.model.CommonIn;
import com.ynxbd.common.helper.ProperHelper;
import com.ynxbd.common.helper.common.CodeHelper;
import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.common.XmlConfigHelper;
import com.ynxbd.wx.config.WeChatConfig;
import lombok.Getter;
import lombok.NoArgsConstructor;
@ -31,15 +31,16 @@ public class HealthCardConfig {
}
}
private static final boolean IS_ENABLE; // 是否启用电子健康卡(true:启用, false:禁用)
public static final boolean IS_ENABLE; // 是否启用电子健康卡(true:启用, false:禁用)
public static final boolean IS_UPLOAD_DATA; // 是否允许上传数据(true:启用, false:禁用)
public static final boolean IS_LOG_REPORT; // 是否打印上报日志(true:启用, false:禁用)
public static final boolean IS_FACE_URL; // 是否传递人脸识别链接(true:传递, false:不传递)
// 健康码
public static final String H_APP_ID;
public static final String H_APP_SECRET;
public static final String H_HOSPITAL_ID; // 医院ID(每家医院不一样)
public static final String H_MINI_HOSPITAL_ID; // 小程序-医院ID(每家医院不一样)
public static final String H_HOSP_ID; // 医院ID(每家医院不一样)
public static final String H_MINI_HOSP_ID; // 小程序-医院ID(每家医院不一样)
public static final String H_MINI_APP_ID; // 小程序-appid
public static final String H_AUTH_APP_ID; // 仅用于授权的公众号appid(医共体为主体公众号的appid)
// 万达
@ -58,25 +59,29 @@ public class HealthCardConfig {
public static final int DOMAIN_CHANNEL = 0;
static {
ProperHelper config = new ProperHelper().read("hcode.properties");
XmlConfigHelper config = new XmlConfigHelper().read("hc-config.xml", "health_card");
IS_ENABLE = config.getBoolean("is_enable", false);
IS_UPLOAD_DATA = config.getBoolean("h.is_upload_data", true);
IS_LOG_REPORT = config.getBoolean("h.is_log_report", false);
config.setIsEnable(IS_ENABLE);
IS_UPLOAD_DATA = config.getBoolean("is_upload_data", true);
IS_LOG_REPORT = config.getBoolean("is_log_report", false);
IS_FACE_URL = config.getBoolean("is_face_url", true);
// 不用对config设置开关,不开启时也需要用到参数
H_APP_ID = config.getString("h.app_id");
H_APP_SECRET = config.getString("h.app_secret");
CARD_APP_ID = config.getString("h.card_app_id");
CARD_PUBLIC_KEY = config.getString("h.card_public_key");
CARD_PRIVATE_KEY = config.getString("h.card_private_key");
CARD_URL = config.getString("h.card_url");
H_HOSPITAL_ID = config.getString("h.hospital_id");
if (ObjectUtils.isEmpty(H_HOSPITAL_ID)) {
H_APP_ID = config.getString("h_app_id");
H_APP_SECRET = config.getString("h_app_secret");
// 万达卡管平台调用参数
CARD_APP_ID = config.getString("card_app_id");
CARD_PUBLIC_KEY = config.getString("card_public_key");
CARD_PRIVATE_KEY = config.getString("card_private_key");
CARD_URL = config.getString("card_url");
H_HOSP_ID = config.getString("h_hosp_id");
if (ObjectUtils.isEmpty(H_HOSP_ID)) {
log.info("[电子健康卡]医院id缺失");
}
H_MINI_APP_ID = config.getString("h.mini_app_id");
H_AUTH_APP_ID = config.getString("h.auth_app_id");
H_MINI_HOSPITAL_ID = config.getString("h.mini_hospital_id");
H_MINI_HOSP_ID = config.getString("h_mini_hosp_id");
H_MINI_APP_ID = config.getString("h_mini_app_id");
H_AUTH_APP_ID = config.getString("h_auth_app_id");
initCache();
}
@ -85,7 +90,7 @@ public class HealthCardConfig {
// 判断是否开启电子健康卡
public static boolean isEnable() {
if (!IS_ENABLE) {
log.info("[配置][hcode.properties]未开启电子健康卡IS_ENABLE");
log.info("[配置][hc-config.xml]未开启电子健康卡IS_ENABLE");
}
return IS_ENABLE;
}
@ -109,14 +114,14 @@ public class HealthCardConfig {
public static CommonIn createCommonIn(Boolean isMiniApp, String appToken, String openid) {
if (appToken == null) { // 此处不判断空字符串
log.info("[电子健康卡]appToken为空");
log.error("[电子健康卡]appToken为空");
return null;
}
if (isMiniApp == null) {
isMiniApp = false;
}
int channelNum = (isMiniApp ? 1 : 0); // 填入代码,0为微信服务号渠道,1为微信小程序渠道,3为刷脸终端,4为扫码终端
String hospId = (isMiniApp ? H_MINI_HOSPITAL_ID : H_HOSPITAL_ID);
String hospId = (isMiniApp ? H_MINI_HOSP_ID : H_HOSP_ID);
String requestId = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
String appId;
if (isMiniApp) {

@ -1,5 +1,6 @@
package com.ynxbd.common.dao;
import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.bean.pay.PayInHosp;
import com.ynxbd.common.config.db.DataBase;
import lombok.extern.slf4j.Slf4j;
@ -240,4 +241,16 @@ public class InHospPayDao {
ps.setString(2, outTradeNo);
}) > 0;
}
// 查询30天是否有发起过医保支付的订单
public Order selectMIOrderByPayOrdId(String payOrdId) {
String sql = "select * from pay_in_hosp where updateTime >= DATE_SUB(CurDate(), INTERVAL 30 DAY) and tradeNo= ?";
List<Order> dataList = DataBase.select(sql, Order.class, ps -> {
ps.setString(1, payOrdId);
});
if (dataList.isEmpty()) {
return null;
}
return dataList.get(0);
}
}

@ -5,7 +5,7 @@ import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.bean.pay.PayResult;
import com.ynxbd.common.bean.pay.Recipe;
import com.ynxbd.common.config.db.DataBase;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
@ -263,7 +263,7 @@ public class RecipeDao {
* @param bankTransNo bankTransNo
*/
public boolean updateNotifyPaid(String outTradeNo, String bankTransNo, String bankMerchantNo, List<Recipe> recipeList) {
List<Order> hisTradeNoList = HisHelper.getHisTradeNo(bankTransNo,
List<Order> hisTradeNoList = HisFactory.getHisTradeNo(bankTransNo,
recipeList.stream().map(Order::getId).collect(Collectors.toList()),
PEnum.RECIPE);

@ -1,7 +1,7 @@
package com.ynxbd.common.dao.his;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import java.util.HashMap;
@ -22,14 +22,14 @@ public class HisAccountDao {
*/
public JsonResult getStatement(String begTime, String endTime) {
if (begTime == null || endTime == null) {
return HisHelper.createErrorResult("时间范围为空");
return HisFactory.His().createErrorResult("时间范围为空");
}
Map<String, Object> params = new HashMap<>();
params.put("StartTime", begTime);
params.put("EndTime", endTime);
return HisHelper.getJsonResult(HisEnum.AP_Query_Statement, params);
return HisFactory.His().getJsonResult(HisEnum.AP_Query_Statement, params);
}
@ -43,7 +43,7 @@ public class HisAccountDao {
* @param isContainsRefund 是否包含负交易{0:不包含负交易当使用此参数时负交易对应的正交易也将不会出现; 1包含负交易 }
*/
public JsonResult getTransaction(String begDate, String endDate, String tradeNo, Integer dateType, Integer isContainsRefund) {
return HisHelper.getJsonResult(HisEnum.AP_Query_Transaction, params -> {
return HisFactory.His().getJsonResult(HisEnum.AP_Query_Transaction, params -> {
params.put("StartDate", begDate);
params.put("EndDate", endDate);
params.put("TransNo", tradeNo);
@ -59,7 +59,7 @@ public class HisAccountDao {
* @param fpNum 发票号
*/
public JsonResult getTransactionByFPNum(String fpNum, String begDate, String endDate, Integer dateType, Integer isContainsRefund) {
return HisHelper.getJsonResult(HisEnum.AP_Query_StatementByFPNum, params -> {
return HisFactory.His().getJsonResult(HisEnum.AP_Query_StatementByFPNum, params -> {
params.put("FPNum", fpNum);
// 以下为未使用参数
params.put("StartDate", begDate);

@ -4,10 +4,9 @@ import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.PhoneUtil;
import com.ynxbd.common.bean.enums.HisAuthAgentRelationEnum;
import com.ynxbd.common.bean.his.HisAuthAgent;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
import org.apache.commons.lang3.ObjectUtils;
@ -41,7 +40,7 @@ public class HisAuthAgentDao {
} else {
throw new ServiceException("就诊类型异常");
}
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.QUERY_AUTH_AGENT, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.QUERY_AUTH_AGENT, params);
if (!jsonResult.success()) {
throw new ServiceException(jsonResult.getMessage());
}
@ -95,7 +94,7 @@ public class HisAuthAgentDao {
params.put("PersonAddress", personAddress);
params.put("Relationship", relationEnum.NAME);
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.ADD_AUTH_AGENT, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.ADD_AUTH_AGENT, params);
if (!jsonResult.success()) {
throw new ServiceException(jsonResult.getMessage());
}
@ -137,7 +136,7 @@ public class HisAuthAgentDao {
params.put("PersonAddress", personAddress);
params.put("Relationship", relationEnum.NAME);
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.UPDATE_AUTH_AGENT, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.UPDATE_AUTH_AGENT, params);
if (!jsonResult.success()) {
throw new ServiceException(jsonResult.getMessage());
}
@ -156,7 +155,7 @@ public class HisAuthAgentDao {
Map<String, Object> params = new HashMap<>();
params.put("ItemNo", itemNo);
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.DELETE_AUTH_AGENT, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.DELETE_AUTH_AGENT, params);
if (!jsonResult.success()) {
throw new ServiceException(jsonResult.getMessage());
}

@ -2,8 +2,9 @@ package com.ynxbd.common.dao.his;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisConfig;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import org.apache.commons.lang3.ObjectUtils;
@ -26,7 +27,7 @@ public class HisInHospDao {
*/
public JsonResult getHosList() {
Map<String, Object> params = new HashMap<>();
return HisHelper.getJsonResult(HisEnum.AP_Query_Hospital, params);
return HisFactory.His().getJsonResult(HisEnum.AP_Query_Hospital, params);
}
/**
@ -36,7 +37,7 @@ public class HisInHospDao {
* @return 预交金缴费记录
*/
public JsonResult getPreMoneyList(String patientId) {
return HisHelper.getJsonResult(HisEnum.AP_Query_Prepay, params -> {
return HisFactory.His().getJsonResult(HisEnum.AP_Query_Prepay, params -> {
params.put("PatientID", patientId);
});
}
@ -59,7 +60,7 @@ public class HisInHospDao {
* @return 住院日费用汇总
*/
public JsonResult getInHospSumFee(String patientId, String date) {
return HisHelper.getJsonResult(HisEnum.AP_Query_InpatientSummaryFee, params -> {
return HisFactory.His().getJsonResult(HisEnum.AP_Query_InpatientSummaryFee, params -> {
params.put("PatientID", patientId);
params.put("FeeDate", date == null ? "" : date);
});
@ -72,7 +73,7 @@ public class HisInHospDao {
* @return 住院费用清单
*/
public JsonResult queryInPatientFee(String patientId, String date) {
return HisHelper.getJsonResult(HisEnum.AP_Query_InpatientFee, params -> {
return HisFactory.His().getJsonResult(HisEnum.AP_Query_InpatientFee, params -> {
params.put("PatientID", patientId);
params.put("FeeDate", date == null ? "" : date);
});
@ -84,10 +85,10 @@ public class HisInHospDao {
* @param patientId 患者id
* @return 住院记录
*/
public JsonResult queryOutPatientRecords(String patientId, String hisYBZF) {
return HisHelper.getJsonResult(HisEnum.Query_OutPatientRecords, params -> {
public JsonResult queryOutPatientRecords(String patientId, String hisYBZF, boolean isDev) {
return HisFactory.His(isDev).getJsonResult(HisEnum.Query_OutPatientRecords, params -> {
params.put("PatientID", patientId);
params.put("CallNo", HisHelper.WECHAT_CALL_NO);
params.put("CallNo", HisConfig.WECHAT_CALL_NO);
params.put("YDZF", ObjectUtils.isEmpty(hisYBZF) ? "" : hisYBZF); // [住院]医保
});
}
@ -99,9 +100,9 @@ public class HisInHospDao {
* @return 费用
*/
public JsonResult queryOutHospTreatFee(String treatNum) {
return HisHelper.getJsonResult(HisEnum.Query_OutHospTreatFee, params -> {
return HisFactory.His().getJsonResult(HisEnum.Query_OutHospTreatFee, params -> {
params.put("ZYNum", treatNum);
params.put("CallNo", HisHelper.WECHAT_CALL_NO);
params.put("CallNo", HisConfig.WECHAT_CALL_NO);
});
}
@ -113,7 +114,7 @@ public class HisInHospDao {
* @return 预交金缴费记录
*/
public JsonResult inHospPrepay(MerchantEnum merchantEnum, String patientId, String patientName, BigDecimal payMoney, String payDate, String payTime, String backTransNo, String tradeNo, String treatNum) {
return HisHelper.getJsonResultByMer(HisEnum.Query_InHospPrepay, merchantEnum, params -> {
return HisFactory.His().getJsonResultByMer(HisEnum.Query_InHospPrepay, merchantEnum, params -> {
params.put("PatientId", patientId);
params.put("PatientName", patientName);
params.put("ZYNum", treatNum);
@ -135,7 +136,7 @@ public class HisInHospDao {
* @return 住院费用清单
*/
public JsonResult getInHospByTreatNum(String treatNum) {
return HisHelper.getJsonResult(HisEnum.Query_InHospByTreatNum, params -> {
return HisFactory.His().getJsonResult(HisEnum.Query_InHospByTreatNum, params -> {
params.put("InpatientNum", treatNum);
});
}
@ -147,7 +148,7 @@ public class HisInHospDao {
* @return 住院费用清单
*/
public JsonResult getInHospByPatientId(String patientId) {
return HisHelper.getJsonResult(HisEnum.Query_InHospByPatientId, params -> {
return HisFactory.His().getJsonResult(HisEnum.Query_InHospByPatientId, params -> {
params.put("PatientId", patientId);
});
}

@ -7,9 +7,9 @@ import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.helper.common.CodeHelper;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.helper.his.HisMedHelper;
import com.ynxbd.common.his.HisConfig;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
@ -39,7 +39,7 @@ public class HisMedDao {
public static JsonResult rxMedUploadDetails(MerchantEnum merchantEnum, String payAuthNo, String cardNo, String openid, String patientId, String treatNum, String recipeJson, BigDecimal totalFee, String ybAttrib, String ybBZCode, String ybBZName) {
List<Recipe> recipeList = JsonHelper.parseArray(recipeJson, Recipe.class);
if (recipeList == null || recipeList.isEmpty()) {
return HisHelper.createErrorResult("处方数量为 0 或 数据转换失败");
return HisFactory.His().createErrorResult("处方数量为 0 或 数据转换失败");
}
StringBuilder recipeIdsXml = new StringBuilder();
@ -69,7 +69,7 @@ public class HisMedDao {
if (ObjectUtils.isNotEmpty(ybBZName)) {
params.put("YBBZName", ybBZName);
}
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.AP_Pay_Invoice, params);
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.AP_Pay_Invoice, params);
}
@ -78,7 +78,7 @@ public class HisMedDao {
*/
public static JsonResult regMedUploadDetails(MerchantEnum merchantEnum, Register reg, String payAuthNo, String cardNo, Boolean isSplitTime) {
if (isSplitTime) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.AP_Regist_New, params -> {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.AP_Regist_New, params -> {
params.put("PatientID", reg.getPatientId());
params.put("PayMoney", reg.getPayMoney());
@ -107,7 +107,7 @@ public class HisMedDao {
});
}
// 非分时段挂号 医保支付
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.AP_Regist, params -> {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.AP_Regist, params -> {
params.put("PatientID", reg.getPatientId());
params.put("PayMoney", reg.getPayMoney());
params.put("DeptCode", reg.getDeptCode());
@ -134,10 +134,12 @@ public class HisMedDao {
/**
* 住院结算
*
* [测试需调整]
* 6201 上传费用明细(住院) + 6202 支付下单
*/
public static JsonResult inHospMedUploadDetails(MerchantEnum merchantEnum, String payAuthNo, String cardNo, String treatNum) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.YDZF_UploadFeesInfo_ZY, params -> {
public static JsonResult outHospMedUploadDetails(MerchantEnum merchantEnum, String payAuthNo, String cardNo, String treatNum) {
return HisFactory.His(true).getJsonResult(HisEnum.YDZF_UploadFeesInfo_ZY, params -> {
params.put("ZYNum", treatNum);
params.put("PayAuthNo", payAuthNo);
});
@ -154,7 +156,7 @@ public class HisMedDao {
* @param bankTransNo HIS流水号
*/
public static JsonResult inHospMedPay(MerchantEnum merchantEnum, String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee, String openId) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.YDZF_SaveToHIS_ZY, params -> {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.YDZF_SaveToHIS_ZY, params -> {
params.put("PayDeviceID", "mobile");
params.put("UserID_YBZF", mdUserId);
params.put("PayMoney", cashFee);
@ -182,7 +184,7 @@ public class HisMedDao {
* @param bankTransNo HIS流水号
*/
public static JsonResult regMedPay(MerchantEnum merchantEnum, String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.Medical_PAY, params -> {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.Medical_PAY, params -> {
params.put("UserID_YBZF", mdUserId);
params.put("PayMoney", cashFee);
params.put("PayDate", payDate);
@ -201,7 +203,7 @@ public class HisMedDao {
* @param mdInfo 医保下单对象
*/
public static JsonResult placeMedOrder(MerchantEnum merchantEnum, MedicalInfo mdInfo) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.Medical_PayOrders, params -> {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.Medical_PayOrders, params -> {
// 授权码
params.put("PayAuthNo", mdInfo.getPayAuthNo());
// 授权token
@ -225,7 +227,7 @@ public class HisMedDao {
* @param bankTransNo HIS流水号
*/
public static JsonResult rxMedPay(MerchantEnum merchantEnum, String mdUserId, String payDate, String payTime, String transNo, String bankTransNo, BigDecimal cashFee) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.Medical_PAY, params -> {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.Medical_PAY, params -> {
params.put("UserID_YBZF", mdUserId);
params.put("PayMoney", cashFee);
params.put("PayDate", payDate);
@ -246,7 +248,7 @@ public class HisMedDao {
*/
// * @param refundType 退款类型(ALL:全部,CASH:只退现金 HI:只退医保)
public static JsonResult medRefund(MerchantEnum merchantEnum, String payAuthNo, String fpNum, String bankTransNo, String refundTradeNo, BigDecimal cashFee) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.Medical_Refund, params -> {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.Medical_Refund, params -> {
params.put("PayAuthNo", payAuthNo); // AUTH530100202206291132200000008
params.put("FPNum", fpNum);
params.put("PayWay", "4");
@ -283,7 +285,7 @@ public class HisMedDao {
* -1 : 状态未知
*/
public static JsonResult getMedAccounts(MerchantEnum merchantEnum, String mdUserId) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.Medical_QueryOrderStatus, params -> {
return HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.Medical_QueryOrderStatus, params -> {
params.put("UserID_YBZF", mdUserId);
});
}
@ -303,7 +305,7 @@ public class HisMedDao {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
JsonResult result = HisMedHelper.getJsonResult(MerchantEnum.WX_MEDICAL, HisEnum.Medical_Insurance_Bill, params -> {
JsonResult result = HisFactory.HisMed(MerchantEnum.WX_MEDICAL).getJsonResult(HisEnum.Medical_Insurance_Bill, params -> {
params.put("QueryNumType", queryNumType);
params.put("QueryNumber", queryNumber);
params.put("BegDate", begDate);
@ -322,8 +324,8 @@ public class HisMedDao {
* @param idCardNo 身份证号
*/
public static JsonResult getChronicList(String idCardNo) {
return HisMedHelper.getJsonResult(MerchantEnum.WX_MEDICAL, HisEnum.YDZF_QueryDiseaseInfo, params -> {
params.put("CallNo", HisHelper.WECHAT_CALL_NO);
return HisFactory.HisMed(MerchantEnum.WX_MEDICAL).getJsonResult(HisEnum.YDZF_QueryDiseaseInfo, params -> {
params.put("CallNo", HisConfig.WECHAT_CALL_NO);
params.put("IDCardNo", idCardNo);
});
}

@ -2,9 +2,9 @@ package com.ynxbd.common.dao.his;
import com.ynxbd.common.bean.HisRecipe;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.helper.his.HisMedHelper;
import com.ynxbd.common.his.HisConfig;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import java.util.ArrayList;
@ -23,10 +23,10 @@ public class HisMedTestDao {
public static List<HisRecipe> devUnPayList(MerchantEnum merchantEnum, String patientId, int days) {
List<HisRecipe> resultList = new ArrayList<>();
JsonResult jsonResult = HisMedHelper.getJsonResult(merchantEnum, HisEnum.AP_Query_UnPay_Invoice, params -> {
JsonResult jsonResult = HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.AP_Query_UnPay_Invoice, params -> {
params.put("PatientID", patientId);
params.put("IsLastWeekFlag", days <= 7 ? "1" : "");
params.put("CallNo", HisHelper.WECHAT_CALL_NO);
params.put("CallNo", HisConfig.WECHAT_CALL_NO);
});
if (!jsonResult.success()) { // 失败
@ -57,7 +57,7 @@ public class HisMedTestDao {
params.put("RecipeID", "");
params.put("StartTime", begDate);
params.put("EndTime", endDate);
JsonResult jsonResult = HisMedHelper.getJsonResult(merchantEnum, HisEnum.AP_Query_OutpatientFee, params);
JsonResult jsonResult = HisFactory.HisMed(merchantEnum).getJsonResult(HisEnum.AP_Query_OutpatientFee, params);
if (!jsonResult.success()) { // 请求失败
return resultList;

@ -1,8 +1,8 @@
package com.ynxbd.common.dao.his;
import com.ynxbd.common.bean.HisMedicalRecord;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
@ -28,7 +28,7 @@ public class HisMedicalRecordDao {
Map<String, Object> params = new HashMap<>();
params.put("MZNum", treatNum);
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.Query_TreatMedicalRecord, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.Query_TreatMedicalRecord, params);
if (!jsonResult.success()) {
throw new ServiceException(jsonResult.getMessage());
}

@ -3,8 +3,8 @@ package com.ynxbd.common.dao.his;
import com.alibaba.fastjson.JSONArray;
import com.ynxbd.common.bean.Patient;
import com.ynxbd.common.bean.enums.HCardTypeEnum;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
@ -78,7 +78,7 @@ public class HisPatientDao {
params.put("GuardianMotherTel", motherTel);
params.put("GuardianMotherIdCard", motherIdCardNo);
}
JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Binding_Card, params);
JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Binding_Card, params);
Patient patient = result.dataMapToBean(Patient.class);
if (patient == null) {
throw new ServiceException(result.getMessage());
@ -114,7 +114,7 @@ public class HisPatientDao {
params.put("CardNo", idCardNo);
params.put("CardType", cardType);
params.put("TransNo", UUID.randomUUID().toString().replace("-", ""));
return HisHelper.getJsonResult(HisEnum.AP_UnBinding_Card, params);
return HisFactory.His().getJsonResult(HisEnum.AP_UnBinding_Card, params);
}
/**
@ -159,7 +159,7 @@ public class HisPatientDao {
Map<String, Object> params = new HashMap<>();
params.put("CardNo", cardNo);
params.put("CardType", cardType);
return HisHelper.getJsonResult(HisEnum.AP_Query_Patient, params);
return HisFactory.His().getJsonResult(HisEnum.AP_Query_Patient, params);
}
@ -175,7 +175,7 @@ public class HisPatientDao {
Map<String, Object> params = new HashMap<>();
params.put("PatientID", patientId);
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_GMC_Patient, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_GMC_Patient, params);
if (!jsonResult.success()) {
return null;
}
@ -215,7 +215,7 @@ public class HisPatientDao {
params.put("Tel", tel);
params.put("Nation", nation);
return HisHelper.getJsonResult(HisEnum.AP_Query_Patient, params);
return HisFactory.His().getJsonResult(HisEnum.AP_Query_Patient, params);
}
private String substringAreaCode(String areaCode, Integer length) {
@ -270,7 +270,7 @@ public class HisPatientDao {
Map<String, Object> params = new HashMap<>();
params.put("Level", level);
params.put("AreaCode", areaCode);
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.Query_Area, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.Query_Area, params);
if (!jsonResult.success()) {
throw new ServiceException(jsonResult.getMessage());
}

@ -3,9 +3,9 @@ package com.ynxbd.common.dao.his;
import com.ynxbd.common.bean.HisRecipe;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.xk.medicalRecipe;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.helper.his.HisMedHelper;
import com.ynxbd.common.his.HisConfig;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.wx.config.WeChatConfig;
@ -36,7 +36,7 @@ public class HisRecipeDao {
params.put("HISTransNo", invoiceTransNo);
params.put("WindowNo", windowNo);
params.put("GroupNo", groupNo);
return HisHelper.getResponseXml(HisEnum.QuickDrugDispense, params);
return HisFactory.His().call(HisEnum.QuickDrugDispense, params);
}
@ -57,7 +57,7 @@ public class HisRecipeDao {
params.put("StartTime", begDate);
params.put("EndTime", endDate);
params.put("PersonNo", personNo);
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_OutpatientFee, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_OutpatientFee, params);
if (!jsonResult.success()) { // 请求失败
return resultList;
@ -79,11 +79,11 @@ public class HisRecipeDao {
public List<HisRecipe> getRxUnPay(String patientId, String personNo, int days) {
List<HisRecipe> resultList = new ArrayList<>();
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_UnPay_Invoice, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_UnPay_Invoice, params -> {
params.put("PatientID", patientId);
params.put("PersonNo", personNo);
params.put("IsLastWeekFlag", days <= 7 ? "1" : "");
params.put("CallNo", HisHelper.WECHAT_CALL_NO);
params.put("CallNo", HisConfig.WECHAT_CALL_NO);
});
if (!jsonResult.success()) { // 失败
@ -100,10 +100,10 @@ public class HisRecipeDao {
public Result uploadRxMI(String treatNum, String personID, String recipes) {
List<medicalRecipe> resultList = new ArrayList<>();
JsonResult jsonResult = HisMedHelper.getJsonResult(MerchantEnum.WX_MEDICAL, HisEnum.XK_MEDICAL_RECIPE, params -> {
JsonResult jsonResult = HisFactory.HisMed(MerchantEnum.WX_MEDICAL).getJsonResult(HisEnum.XK_MEDICAL_RECIPE, params -> {
params.put("PersonID", personID);
params.put("MZNum", treatNum);
params.put("CallNo", HisHelper.WECHAT_CALL_NO);
params.put("CallNo", HisConfig.WECHAT_CALL_NO);
params.put("CFNums", recipes);
});
@ -138,7 +138,7 @@ public class HisRecipeDao {
recipeIdsXml.append("<Id>").append(id).append("</Id>");
}
return HisHelper.getJsonResultByMer(HisEnum.AP_PrePay_Invoice_New, merchantEnum, params -> {
return HisFactory.His().getJsonResultByMer(HisEnum.AP_PrePay_Invoice_New, merchantEnum, params -> {
params.put("Recipe", recipeIdsXml.toString());
params.put("PatientID", patientId);
params.put("MZNum", treatNum);
@ -178,7 +178,7 @@ public class HisRecipeDao {
if (ObjectUtils.isNotEmpty(feeId)
&& ObjectUtils.isNotEmpty(feeInfo)) { // 新版本预缴费
log.info("[HIS预结算]回调 feeId={}", feeId);
return HisHelper.getJsonResultByMer(HisEnum.AP_Pay_Invoice_New, merchantEnum, params -> {
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Pay_Invoice_New, merchantEnum, params -> {
params.put("PatientID", patientId);
params.put("PayDate", payDate);
params.put("PayTime", payTime);
@ -221,7 +221,7 @@ public class HisRecipeDao {
params.remove("Recipe");
params.put("PayMoney", totalFee); //如果是体检支付就传入总金额
}
return HisHelper.getJsonResultByMer(HisEnum.AP_Pay_Invoice, merchantEnum, params);
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Pay_Invoice, merchantEnum, params);
}
@ -241,7 +241,7 @@ public class HisRecipeDao {
if (!"0".equals(seq)) {
params.put("DoubleCollectFlag", seq); // 1
}
return HisHelper.getJsonResult(HisEnum.Create_Self_Help, params);
return HisFactory.His().getJsonResult(HisEnum.Create_Self_Help, params);
}
@ -259,7 +259,7 @@ public class HisRecipeDao {
if (!"0".equals(seq)) {
params.put("DoubleCollectFlag", seq);
}
return HisHelper.getJsonResult(HisEnum.Query_Self_Help, params);
return HisFactory.His().getJsonResult(HisEnum.Query_Self_Help, params);
}
@ -273,7 +273,7 @@ public class HisRecipeDao {
* @param groupFlag 检查治疗是否包含组套项目 [0:1:不传时默认值]
*/
public static JsonResult getStandardPrice(Integer pageNum, Integer pageSize, String pyCode, String type, String groupFlag) {
return HisHelper.getJsonResult(HisEnum.Recipe_Query_StandardPrice, params -> {
return HisFactory.His().getJsonResult(HisEnum.Recipe_Query_StandardPrice, params -> {
params.put("PageNo", pageNum);
params.put("RowsCount", pageSize);
params.put("PinyinCode", pyCode);
@ -289,7 +289,7 @@ public class HisRecipeDao {
* @param invoiceNo 发票号
*/
public Result queryElectronInvoice(String invoiceNo) {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.QUERY_ELECTRON_INVOICE, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.QUERY_ELECTRON_INVOICE, params -> {
params.put("FPNum", invoiceNo);
});
if (!jsonResult.success()) {

@ -9,8 +9,8 @@ import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.dao.RegisterDao;
import com.ynxbd.common.helper.common.*;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.wx.config.WeChatConfig;
import com.ynxbd.wx.wxfactory.AesWxHelper;
@ -46,7 +46,7 @@ public class HisRegisterDao {
params.put("ReservationDate", ObjectUtils.isEmpty(regDate) ? "" : regDate); // 空为近7天
params.put("AllowResevationFlag", "1"); // [0:默认值可不传——所有;1:只返回有剩余号源的医师]
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Reservation_Doct, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Reservation_Doct, params);
if (!jsonResult.success()) {
return new ArrayList<>();
}
@ -227,7 +227,7 @@ public class HisRegisterDao {
params.put("DoctCode", "");
params.put("AllowRegistFlag", "1"); // 只返回有号源的医生
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Doct, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Doct, params);
if (!jsonResult.success()) {
return new ArrayList<>();
}
@ -413,7 +413,7 @@ public class HisRegisterDao {
Map<String, Object> params = new HashMap<>();
params.put("DeptCode", ""); // 空为所有
params.put("ReservationDate", ""); // 空为近7天
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Reservation_Dept, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Reservation_Dept, params);
if (!jsonResult.success()) {
return resultList;
@ -425,15 +425,12 @@ public class HisRegisterDao {
RegisterDao registerDao = new RegisterDao();
List<Dept> wxDeptList = registerDao.selectDeptList();
String subDeptJson;
List<Dept> subDeptList;
String subDeptName, subDeptCode;
JSONObject subDeptItem;
Dept subDept;
Dept dept;
JSONObject nodeItem;
String subDeptJson, subDeptName, subDeptCode, subDeptNote;
String address, deptCode, deptName, hospitalAreaName;
JSONObject subDeptData;
Dept dept, subDept;
JSONObject nodeItem, subDeptItem, subDeptItemData;
JSONArray dataItems;
for (int i = 0; i < jsonArray.size(); i++) {
nodeItem = jsonArray.getJSONObject(i);
@ -447,17 +444,22 @@ public class HisRegisterDao {
subDeptJson = nodeItem.getString("Code_YZKStr");
if (!ObjectUtils.isEmpty(subDeptJson)) {
subDeptData = JsonHelper.parseObject(subDeptJson);
dataItems = subDeptData.getJSONArray("Data");
subDeptItemData = JsonHelper.parseObject(subDeptJson);
dataItems = subDeptItemData.getJSONArray("Data");
subDeptList = new ArrayList<>();
for (int j = 0; j < dataItems.size(); j++) {
subDeptItem = dataItems.getJSONObject(j);
subDeptName = subDeptItem.getString("Name");
subDeptCode = subDeptItem.getString("Code");
subDeptNote = subDeptItem.getString("Note");
subDept = new Dept();
subDept.setDeptName(subDeptName);
subDept.setDeptCode(subDeptCode);
if (!ObjectUtils.isEmpty(subDeptNote)) {
subDept.setNote(subDeptNote);
}
// 预约挂号
subDeptList.add(subDept);
}
dept.setChildren(subDeptList);
@ -490,7 +492,7 @@ public class HisRegisterDao {
params.put("HasSourcesFlag", hasSourcesFlag); // 1:仅返回有号源科室; 0:有无号源科室都返回
List<Dept> deptList = new ArrayList<>();
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Dept, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Dept, params);
if (!jsonResult.success()) {
return deptList;
}
@ -499,15 +501,13 @@ public class HisRegisterDao {
RegisterDao registerDao = new RegisterDao();
List<Dept> wxDeptList = registerDao.selectDeptList();
String subDeptJson;
List<Dept> subDeptList;
String subDeptName, subDeptCode;
JSONObject subDeptItem;
Dept subDept;
Dept dept;
JSONObject nodeItem;
String subDeptJson, subDeptName, subDeptCode, subDeptNote;
String address, deptCode, deptName, hospitalAreaName;
Dept dept, subDept;
JSONObject nodeItem, subDeptItem, subDeptItemData;
JSONArray dataItems;
for (int i = 0; i < jsonArray.size(); i++) {
nodeItem = jsonArray.getJSONObject(i);
deptCode = nodeItem.getString("Code");
@ -520,17 +520,23 @@ public class HisRegisterDao {
subDeptJson = nodeItem.getString("Code_YZKStr");
if (!ObjectUtils.isEmpty(subDeptJson)) {
JSONObject subDeptData = JsonHelper.parseObject(subDeptJson);
JSONArray dataItems = subDeptData.getJSONArray("Data");
subDeptItemData = JsonHelper.parseObject(subDeptJson);
dataItems = subDeptItemData.getJSONArray("Data");
subDeptList = new ArrayList<>();
for (int j = 0; j < dataItems.size(); j++) {
subDeptItem = dataItems.getJSONObject(j);
subDeptName = subDeptItem.getString("Name");
subDeptCode = subDeptItem.getString("Code");
subDeptNote = subDeptItem.getString("Note");
subDept = new Dept();
subDept.setDeptName(subDeptName);
subDept.setDeptCode(subDeptCode);
if (!ObjectUtils.isEmpty(subDeptNote)) {
subDept.setNote(subDeptNote);
}
// 今日挂号
subDeptList.add(subDept);
}
dept.setChildren(subDeptList);
@ -556,7 +562,7 @@ public class HisRegisterDao {
params.put("MZNum", null);
params.put("RegistDate", regDate);
JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Query_Regist, params);
JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Query_Regist, params);
if (!result.success()) {
return resultList;
}
@ -613,7 +619,7 @@ public class HisRegisterDao {
params.put("ReservationTransNo", "");
params.put("AfterTodayFlag", "0");
JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Query_Reservation, params);
JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Query_Reservation, params);
if (!result.success()) {
return resultList;
}
@ -691,7 +697,7 @@ public class HisRegisterDao {
params.put("ReservationTransNo", tradeNo);
params.put("RecallTransNo", "R" + tradeNo);
return HisHelper.getJsonResultByMer(HisEnum.AP_Recall_Reservation, merchantEnum, params);
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Recall_Reservation, merchantEnum, params);
}
/**
@ -704,7 +710,7 @@ public class HisRegisterDao {
params.put("TransNo", tradeNo);
params.put("DelTransNo", "R" + tradeNo);
return HisHelper.getJsonResultByMer(HisEnum.AP_Refund_Register, merchantEnum, params);
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Refund_Register, merchantEnum, params);
}
/**
@ -735,9 +741,9 @@ public class HisRegisterDao {
/**
* [分时段挂号]查询科室
*
* @param begDate 开始时间
* @param endDate 结束时间
* @param deptCode 科室编码-空为所有
* @param begDate 开始时间
* @param endDate 结束时间
* @param deptCode 科室编码-空为所有
*/
public List<Dept> getTimeDeptList(String begDate, String endDate, String deptCode) {
List<Dept> deptList = new ArrayList<>();
@ -748,7 +754,7 @@ public class HisRegisterDao {
params.put("RegistEndDate", endDate);
params.put("CanRegistFlag", "1"); // [空或0为所有科室; 1:返回有号源的科室]
JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Query_Dept_New, params);
JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Query_Dept_New, params);
if (!result.success()) {
log.info("[分时段挂号]查询科室列表 {}", result.getMessage());
return deptList;
@ -794,7 +800,9 @@ public class HisRegisterDao {
subDept = new Dept();
subDept.setDeptName(subDeptName);
subDept.setDeptCode(subDeptCode);
subDept.setNote(subDeptNote);
if (!ObjectUtils.isEmpty(subDeptNote)) {
subDept.setNote(subDeptNote);
}
subDept.setSourceInfo(subDeptSourceInfo);
subDeptList.add(subDept);
}
@ -826,7 +834,7 @@ public class HisRegisterDao {
params.put("DeptCode_YZKCode", subDeptCode); // 亚专科code
}
JsonResult result = HisHelper.getJsonResult(HisEnum.AP_Query_Doct_New, params);
JsonResult result = HisFactory.His().getJsonResult(HisEnum.AP_Query_Doct_New, params);
List<Doctor> resultList = new ArrayList<>();
if (!result.success()) {
@ -895,7 +903,7 @@ public class HisRegisterDao {
params.put("DeptCode_YZKCode", subDeptCode); // 亚专科code
}
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Register_Source_New, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Register_Source_New, params);
List<Map<Object, Object>> dataList = new ArrayList<>();
if (!jsonResult.success()) {
log.info("[号源-分时段查询]{}", jsonResult.getMessage());
@ -987,7 +995,7 @@ public class HisRegisterDao {
params.put("DeptCode_YZKCode", subDeptCode); // 亚专科code
}
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Register_Source_New, params);
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Register_Source_New, params);
List<Register> dataList = new ArrayList<>();
if (!jsonResult.success()) {
log.info("[分时段挂号-号源查询]{}", jsonResult.getMessage());
@ -1121,7 +1129,7 @@ public class HisRegisterDao {
params.put("OpenId", reg.getOpenid());
params.put("Token", WeChatConfig.TOKEN);
return HisHelper.getJsonResultByMer(HisEnum.AP_Regist_New, merchantEnum, params);
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Regist_New, merchantEnum, params);
}
/**
@ -1152,12 +1160,12 @@ public class HisRegisterDao {
params.put("DeptCode_YZKCode", reg.getSubDeptCode()); // 亚专科code
}
if (DateHelper.isToday(regDate)) { // 今日挂号
return HisHelper.getJsonResultByMer(HisEnum.AP_Regist, merchantEnum, params);
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Regist, merchantEnum, params);
}
// 预约挂号
params.put("ReservationDate", regDate);
return HisHelper.getJsonResultByMer(HisEnum.AP_Reservation, merchantEnum, params);
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Reservation, merchantEnum, params);
}
/**
@ -1172,7 +1180,7 @@ public class HisRegisterDao {
params.put("PatientID", patientId);
params.put("SourceId", sourceId);
params.put("TransNo", CodeHelper.get32UUID());
return HisHelper.getJsonResultByMer(HisEnum.AP_Occupy_Source_New, merchantEnum, params);
return HisFactory.His().getJsonResultByMer(HisEnum.AP_Occupy_Source_New, merchantEnum, params);
}
/**
@ -1185,7 +1193,7 @@ public class HisRegisterDao {
*/
public JSONArray getDoctorSchedule(String begDate, String endDate, String doctCode) {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Doctor_Schedule, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Doctor_Schedule, params -> {
params.put("BegDate", begDate);
params.put("EndDate", endDate);
params.put("DoctCode", doctCode);
@ -1205,7 +1213,7 @@ public class HisRegisterDao {
* @return 待签到记录
*/
public JSONArray getReSignInRecord(String begDate, String endDate) {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_SignIn, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_SignIn, params -> {
params.put("BegDate", begDate);
params.put("EndDate", endDate);
});
@ -1224,7 +1232,7 @@ public class HisRegisterDao {
public JsonResult handleSignIn(String transNo) {
Map<String, Object> params = new HashMap<>();
params.put("TransNo", transNo);
return HisHelper.getJsonResult(HisEnum.AP_SignIN, params);
return HisFactory.His().getJsonResult(HisEnum.AP_SignIN, params);
}
/**
@ -1235,7 +1243,7 @@ public class HisRegisterDao {
* @return 待签到记录
*/
public JSONArray getRegLineSignInRecordsOld(String begDate, String endDate, String patientId) {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Line_SignIn, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Line_SignIn, params -> {
params.put("BegDate", begDate);
params.put("EndDate", endDate);
params.put("PatientID", patientId);
@ -1254,7 +1262,7 @@ public class HisRegisterDao {
* @return list
*/
public List<RegSign> getRegLineSignInRecords(String begDate, String endDate) {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Line_SignIn, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_Line_SignIn, params -> {
params.put("BegDate", begDate);
params.put("EndDate", endDate);
});
@ -1297,7 +1305,7 @@ public class HisRegisterDao {
public JsonResult handleLineSignIn(String treatNum) {
Map<String, Object> params = new HashMap<>();
params.put("MZNum", treatNum);
return HisHelper.getJsonResult(HisEnum.AP_Line_SignIN, params);
return HisFactory.His().getJsonResult(HisEnum.AP_Line_SignIN, params);
}
/**
@ -1315,7 +1323,7 @@ public class HisRegisterDao {
params.put("OpenId", openId);
params.put("TransNo", tradeNo);
params.put("BankTransNo", bankTransNo);
return HisHelper.getJsonResult(HisEnum.TPP_QR_Reg, params);
return HisFactory.His().getJsonResult(HisEnum.TPP_QR_Reg, params);
}
}

@ -6,8 +6,8 @@ import com.ynxbd.common.bean.TreatRecord;
import com.ynxbd.common.bean.report.CheckReport;
import com.ynxbd.common.bean.report.InspectionReport;
import com.ynxbd.common.bean.report.PEIS;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.ServiceException;
import lombok.extern.slf4j.Slf4j;
@ -61,7 +61,7 @@ public class HisReportDao {
* @param endDate 结束时间
*/
public List<CheckReport> getCheckByPatient(String patientId, String bedDate, String endDate) throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_CheckApplication, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_CheckApplication, params -> {
params.put("PatientID", patientId);
});
@ -84,7 +84,7 @@ public class HisReportDao {
* @return list
*/
public List<PEIS> getPEISReportByPatient(String name, String idCardNo, String bedDate, String endDate) throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_PEISReport, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_PEISReport, params -> {
params.put("Name", name);
params.put("IdCardNo", idCardNo);
});
@ -102,7 +102,7 @@ public class HisReportDao {
* @return 报告集合
*/
public List<InspectionReport> getInspectByPatient(String patientId) throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_InspectionApplication, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_InspectionApplication, params -> {
params.put("PatientID", patientId);
});
@ -120,7 +120,7 @@ public class HisReportDao {
* @return 报告集合
*/
public List<InspectionReport> getInspectByTreatNum(String patientId, String zyNum, String mzNum) throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_InspectionApplication, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.AP_Query_InspectionApplication, params -> {
params.put("PatientID", patientId);
params.put("ZYNum", zyNum == null ? "" : zyNum);
params.put("MZNum", mzNum == null ? "" : mzNum);
@ -138,7 +138,7 @@ public class HisReportDao {
* @return 就诊记录
*/
public List<TreatRecord> getReportTreatRecords(String patientId, String begDate, String endDate, String treatType, String reportType, String deptCode) throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.Query_TreatRecords, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.Query_TreatRecords, params -> {
params.put("PatientId", patientId);
params.put("BegDate", begDate);
params.put("EndDate", endDate);

@ -4,11 +4,9 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.bean.his.HisSelfHelpInfo;
import com.ynxbd.common.bean.his.HisSelfHelpItem;
import com.ynxbd.common.bean.in_hosp.InHosp;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
import lombok.extern.slf4j.Slf4j;
@ -23,7 +21,7 @@ public class HisSelfHelpDao {
public List<HisSelfHelpInfo> getHisSelfHelpList() throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.SH_SELF_HELP_QUERY, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.SH_SELF_HELP_QUERY, params -> {
});
if (!jsonResult.success()) {
@ -68,9 +66,9 @@ public class HisSelfHelpDao {
throw new ServiceException("传递的申请单为空,禁止开单");
}
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.SH_SELF_HELP_CREATE, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.SH_SELF_HELP_CREATE, params -> {
params.put("PatientId", patientId);
params.put("ApplicationInfos", HisHelper.strListToXml("ItemNo", items));
params.put("ApplicationInfos", HisFactory.strListToXml("ItemNo", items));
});
if (!jsonResult.success()) {

@ -2,18 +2,16 @@ package com.ynxbd.common.dao.his;
import com.ynxbd.common.bean.his.HisReRegister;
import com.ynxbd.common.bean.his.HisTreat;
import com.ynxbd.common.bean.report.CheckReport;
import com.ynxbd.common.bean.xk.InquiryFee;
import com.ynxbd.common.helper.common.Base64Helper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.ServiceException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class HisTreatDao {
@ -25,7 +23,7 @@ public class HisTreatDao {
public List<HisTreat> getTreatList(String patientId, String deptCode) {
List<HisTreat> dataList = new ArrayList<>();
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.XK_GET_TREAT_LIST, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.XK_GET_TREAT_LIST, params -> {
params.put("PatientID", patientId);
params.put("DeptCode", deptCode);
});
@ -43,7 +41,7 @@ public class HisTreatDao {
* @param treatNum 门诊号
*/
public HisTreat createTreat(String treatNum, String deptCode, String doctCode, String registCode, String regFee, String clinicFee, String transNo, String payMoney, String payDate, String payTime, String payWay, String payDeviceID, String bankTransNo, String openId) throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.XK_CREATE_TREAT, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.XK_CREATE_TREAT, params -> {
params.put("MZNum", treatNum);
params.put("DeptCode", deptCode);
params.put("DoctCode", doctCode);
@ -73,7 +71,7 @@ public class HisTreatDao {
* @param inquiryCode 收费项目代码
*/
public List<InquiryFee> getInquiryFee(String inquiryCode) throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.XK_INQUIRY_FEE, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.XK_INQUIRY_FEE, params -> {
params.put("Code", inquiryCode);
});
@ -89,7 +87,7 @@ public class HisTreatDao {
* @param clinicCode 号别
*/
public List<HisReRegister> getReRegister(String clinicCode) throws ServiceException {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.XK_QUERY_RE_REGISTER, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.XK_QUERY_RE_REGISTER, params -> {
params.put("ClinicCode", clinicCode);
});
@ -103,7 +101,7 @@ public class HisTreatDao {
public List<HisTreat> getInfoByTreatNum(String treatNum) throws ServiceException {
List<HisTreat> dataList = new ArrayList<>();
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.XK_QUERY_TREAT, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.XK_QUERY_TREAT, params -> {
params.put("MZNum", treatNum);
});
@ -115,7 +113,7 @@ public class HisTreatDao {
public String getDoctCaSign(String doctCode) throws ServiceException {
String data = null;
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.XK_DOC_CA, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.XK_DOC_CA, params -> {
params.put("DoctCode", doctCode);
});
@ -158,7 +156,7 @@ public class HisTreatDao {
* @return 是否成功
*/
public JsonResult createInquiry(String patientId, String patientName, String payMoney, String payDate, String payTime, String transNo, String payDeviceId, String bankTransNo, String deptCode, String doctCode, String feeCode, String payWay, String ID, String begTime, String endTime, String IDCardNo, String remark, String doctTitleCode, String hospitalArea, String treatNum, String firstTreatNum, String openId) {
return HisHelper.getJsonResult(HisEnum.XK_CREATE_INQUIRY, params -> {
return HisFactory.His().getJsonResult(HisEnum.XK_CREATE_INQUIRY, params -> {
params.put("PatientId", patientId);
params.put("PatientName", patientName);
params.put("PayMoney", payMoney);

@ -4,10 +4,9 @@ import com.ynxbd.common.bean.xk.HisRxAdmRoute;
import com.ynxbd.common.bean.xk.HisRxDrug;
import com.ynxbd.common.bean.xk.HisRxPharmDict;
import com.ynxbd.common.bean.xk.HisRxUseCount;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.ServiceException;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
@ -17,7 +16,7 @@ import java.util.List;
public class HisXKDao {
public List<?> queryHisRxDict(String type) {
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.HIS_XK_RX_DICT, params -> {
JsonResult jsonResult = HisFactory.His().getJsonResult(HisEnum.HIS_XK_RX_DICT, params -> {
params.put("Flag", type); // 1:用药频次字典; 2:给要途径字典; 3:药房字典; 4:药品
});
if ("1".equals(type)) { // 用药频次字典

@ -1,9 +1,9 @@
package com.ynxbd.common.dao.his.dev;
import com.ynxbd.common.bean.HisRecipe;
import com.ynxbd.common.helper.his.HisDevHelper;
import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisConfig;
import com.ynxbd.common.his.HisEnum;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import java.util.ArrayList;
@ -19,10 +19,10 @@ public class DevHisRecipeDao {
public List<HisRecipe> getDevUnPayRecipe(String patientId, int days) {
List<HisRecipe> resultList = new ArrayList<>();
JsonResult jsonResult = HisDevHelper.getDevJsonResult(HisEnum.AP_Query_UnPay_Invoice, params -> {
JsonResult jsonResult = HisFactory.His(true).getJsonResult(HisEnum.AP_Query_UnPay_Invoice, params -> {
params.put("PatientID", patientId);
params.put("IsLastWeekFlag", days <= 7 ? "1" : "");
params.put("CallNo",HisHelper.WECHAT_CALL_NO);
params.put("CallNo", HisConfig.WECHAT_CALL_NO);
});
if (!jsonResult.success()) { // 失败

@ -25,6 +25,8 @@ import java.util.Date;
@Slf4j
public class HealthCardHelper {
private static final String FACE_URL = "h-face-verify.html";
/**
* [电子健康卡]绑卡验证授权
*/
@ -60,7 +62,7 @@ public class HealthCardHelper {
if (isHCBindUI) { // 服务商页面
userFormPageUrl = String.format("%s/h5/tencent/open/card/regist?hospitalId=%s&redirect_uri=%s&fail_redirect_uri=%s&authCode=%s",
(isMiniApp ? ("mini:" + domain) : "https://h5-health.tengmed.com"),
HealthCardConfig.H_HOSPITAL_ID,
HealthCardConfig.H_HOSP_ID,
URLHelper.encodeURL(successRedirectUrl),
URLHelper.encodeURL(failRedirectUrl),
wechatCode);
@ -71,7 +73,7 @@ public class HealthCardHelper {
}
// 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage
String faceUrl = isMiniApp ? "/path/to/facePage" : (webURL + "h-face-verify.html");
String faceUrl = isMiniApp ? "/path/to/facePage" :(HealthCardConfig.IS_FACE_URL ? (webURL + FACE_URL) : null);
// 放弃验证回调页
String verifyFailRedirectUrl = isMiniApp ? "mini:/path/to/isvpage" : (webURL + "health-card-fail.html?code=-1");
@ -119,7 +121,7 @@ public class HealthCardHelper {
String failRedirectUrl = isMiniApp ? "/path/to/isvpage??regInfoCode=${regInfoCode}" : (webURL + "health-card-form.html?regInfoCode=${regInfoCode}");
// 小程序内嵌必传(固定为小程序路径,不需要加“mini:”前缀)示例: /path/to/facePage
String faceUrl = isMiniApp ? "/path/to/facePage" : (webURL + "h-face-verify.html");
String faceUrl = isMiniApp ? "/path/to/facePage" : (HealthCardConfig.IS_FACE_URL ? (webURL + FACE_URL) : null);
// 放弃验证回调页
String verifyFailRedirectUrl = isMiniApp ? "mini:/path/to/isvpage" : (webURL + "health-card-fail.html?code=-2");
@ -447,7 +449,7 @@ public class HealthCardHelper {
String webURL = WeChatConfig.reqProtocolToWebURL(isHttps);
String verifySuccessRedirectUrl = webURL + redirectPage + "?registerOrderId=${registerOrderId}" + redirectHash;
String verifyFailRedirectUrl = webURL + "health-card-fail.html?code=-3";
String faceUrl = isMiniApp ? "/path/to/facePage" : (webURL + "h-face-verify.html");
String faceUrl = isMiniApp ? "/path/to/facePage" : (HealthCardConfig.IS_FACE_URL ? (webURL + FACE_URL) : null);
JSONObject resultJson = HealthCardConfig.createHealthCardService().registerUniformVerifyOrder(commonIn,
idCardNo,
@ -587,13 +589,13 @@ public class HealthCardHelper {
*/
public static JSONObject reportHISData(String openid, String healthCardId, String idCardNo, String scene, String deptName, HealthCardEnum cardCostType) {
try {
log.info("[电子健康卡]用卡数据监测接口 scene={}", scene);
if (!HealthCardConfig.IS_UPLOAD_DATA) { // 禁止数据上传
return null;
}
log.info("[电子健康卡]用卡数据监测接口-[scene:{}]", scene);
if (ObjectUtils.isEmpty(openid) || ObjectUtils.isEmpty(healthCardId) || ObjectUtils.isEmpty(idCardNo) || ObjectUtils.isEmpty(scene)) {
log.error("[电子健康卡]用卡数据监测,参数为空");
log.warn("[电子健康卡]用卡数据监测,参数为空");
return null;
}
@ -617,7 +619,7 @@ public class HealthCardHelper {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
req.setTime(format.format(new Date()));
req.setHospitalCode(HealthCardConfig.H_HOSPITAL_ID);
req.setHospitalCode(HealthCardConfig.H_HOSP_ID);
// 010101 挂号
req.setScene(scene);
req.setDepartment(ObjectUtils.isEmpty(deptName) ? null : deptName); // 科室代码

@ -3,11 +3,17 @@ package com.ynxbd.common.helper;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.ynxbd.common.bean.in_hosp.InHospFeeItem;
import com.ynxbd.common.helper.common.JwtHelper;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.JsonResultEnum;
import com.ynxbd.common.result.Result;
import com.ynxbd.wx.utils.DesEncryptHelper;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
@Slf4j
public class TestHelper {
@ -50,9 +56,9 @@ public class TestHelper {
// }
public static void main(String[] args) {
String token = "99CB4E005E234DDA73B67CB9F369425933951D90DA1778B1DDA55F3E0E6E24DCD40BBA9E60FDBB1D607848053494BFBCF9E39900626C6B3208CA72FF386E13401F65C2F874614CA7C085D6DC51C258F4800EA613E482FB3F87006ABD62C2730FFC16B1AE0E44762D76775510A3EEB8785B871B9759F1A7D22E860BE284C18F095F5F6D38C31D9965B4C0434D3BBBBE39";
String deToken = DesEncryptHelper.deCode(token);
System.out.println(deToken);
// String token = "99CB4E005E234DDA73B67CB9F369425933951D90DA1778B1DDA55F3E0E6E24DCD40BBA9E60FDBB1D607848053494BFBCF9E39900626C6B3208CA72FF386E13401F65C2F874614CA7C085D6DC51C258F4800EA613E482FB3F87006ABD62C2730FFC16B1AE0E44762D76775510A3EEB8785B871B9759F1A7D22E860BE284C18F095F5F6D38C31D9965B4C0434D3BBBBE39";
// String deToken = DesEncryptHelper.deCode(token);
// System.out.println(deToken);
}
/**

@ -19,6 +19,12 @@ import java.util.List;
@Slf4j
public class JsonHelper {
public static <T> T copy(Object obj, Class<T> clazz) {
String dataJson = JSON.toJSONString(obj);
return JSON.parseObject(dataJson, clazz);
}
public static String toJsonString(Object data) {
return JSON.toJSONString(data);
}
@ -60,6 +66,7 @@ public class JsonHelper {
return parseArray(json, clazz);
}
/**
* fastJson反序列化Bean
*

@ -1,11 +1,9 @@
package com.ynxbd.common.helper.common;
import com.ynxbd.wx.config.WeChatConfig;
import com.ynxbd.common.dao.his.HisRecipeDao;
import com.ynxbd.wx.config.WeChatConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**

@ -2,12 +2,16 @@ package com.ynxbd.common.helper.common;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.UUID;
/**
* @author wsq
* @description 雪花算法
* @date 2019/8/14 下午8:22
*/
@Slf4j
public class SnowHelper {
private SnowHelper() {
}

@ -5,10 +5,7 @@ import org.apache.commons.lang3.ObjectUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
@ -105,7 +102,7 @@ public class SoapHelper {
connection.setRequestMethod(httpType);
// 3.2设置数据格式:content-msgInterface
connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
if (soapAction != null && !"".equals(soapAction)) {
if (!ObjectUtils.isEmpty(soapAction)) {
connection.setRequestProperty("SOAPAction", soapAction);
}
// 3.3设置输入输出,因为默认新创建的connection没有读写权限,
@ -120,33 +117,49 @@ public class SoapHelper {
// 第五步:接收服务端响应
int responseCode = connection.getResponseCode();
InputStream inputStream;
// 重点:非200要读取错误流 getErrorStream()
if (HttpURLConnection.HTTP_OK == responseCode) {
inputStream = connection.getInputStream();
} else {
inputStream = connection.getErrorStream();
}
StringBuilder sb = new StringBuilder();
String temp;
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
while ((temp = reader.readLine()) != null) {
sb.append(temp);
StringBuilder sb = new StringBuilder(1024 * 4);
if (inputStream != null) {
char[] buf = new char[1024];
int len;
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
while ((len = reader.read(buf)) != -1) {
sb.append(buf, 0, len);
}
}
if (responseCode == 200) { // 请求成功
if (HttpURLConnection.HTTP_OK == responseCode) {
respData = sb.toString();
} else {
log.error("{} 请求失败{}", projectName, sb);
log.error("{} 请求失败[code:{}][soapUrl:{}]-resp:{}", projectName, responseCode, soapUrl, sb);
}
} catch (IOException e) {
log.error("{} 请求异常: {}", projectName, e.getMessage());
ErrorHelper.println(e);
log.error("{} 请求异常:", projectName, e);
} finally {
try {
if (out != null) out.close();
if (reader != null) reader.close();
if (connection != null) connection.disconnect();
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
log.error("soap关闭输出流异常", e);
}
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
log.error("soap关闭读取流异常", e);
}
if (connection != null) {
connection.disconnect();
}
}
return respData;

@ -24,6 +24,11 @@ public class XmlConfigHelper {
public XmlConfigHelper read(String filePath, String rootName) {
try (InputStream is = XmlConfigHelper.class.getClassLoader().getResourceAsStream(filePath)) { // 从classpath读取resources文件
SAXReader reader = new SAXReader();
//关闭外部实体 XXE防护
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Document document = reader.read(is);
Element rootElement = document.getRootElement();
if (rootName == null) {
@ -59,10 +64,14 @@ public class XmlConfigHelper {
*/
public XmlConfigHelper getConfigNode(String nodeName) {
try {
if (root == null) {
return null;
}
XmlConfigHelper config = new XmlConfigHelper();
config.root = root.element(nodeName);
return config;
} catch (Exception e) {
log.error("", e);
return null;
}
}
@ -82,7 +91,7 @@ public class XmlConfigHelper {
String val = root.elementTextTrim(rootNode);
return ObjectUtils.isEmpty(val) ? defaultVal : Boolean.parseBoolean(val);
} catch (Exception e) {
e.printStackTrace();
log.error("", e);
return defaultVal;
}
}
@ -117,7 +126,7 @@ public class XmlConfigHelper {
String val = root.elementTextTrim(rootNode);
return ObjectUtils.isEmpty(val) ? defaultVal : val;
} catch (Exception e) {
e.printStackTrace();
log.error("", e);
return null;
}
}
@ -134,7 +143,7 @@ public class XmlConfigHelper {
String val = getString(rootNode, null);
return ObjectUtils.isEmpty(val) ? null : Integer.parseInt(val.trim());
} catch (Exception e) {
e.printStackTrace();
log.error("", e);
return null;
}
}

@ -1,50 +0,0 @@
package com.ynxbd.common.helper.his;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.JsonResultEnum;
import java.util.HashMap;
import java.util.Map;
public class HisDevHelper {
// 测试环境---------------------------------------------------------------------------
/**
* 测试环境
*
* @param hisEnum 枚举
* @param params 发送的参数
* @return 响应的xml数据
*/
public static String getDevResponseXml(HisEnum hisEnum, Map<String, Object> params) {
return HisHelper.getResponseXml(hisEnum, HisHelper.HIS_SOAP_DEV_URL, params);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult getDevJsonResult(HisEnum hisEnum, Map<String, Object> params) {
JsonResult result = JsonResult.xmlToBean(getDevResponseXml(hisEnum, params), JsonResultEnum.SYS_HIS);
if (result == null) { // 如果返回为空可能为超时
return HisHelper.createTimeoutResult();
}
return result;
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult getDevJsonResult(HisEnum hisEnum, JsonResult.MapParams params) {
Map<String, Object> requestParams = new HashMap<>();
if (params != null) {
params.setParams(requestParams);
}
return getDevJsonResult(hisEnum, requestParams);
}
}

@ -1,414 +0,0 @@
package com.ynxbd.common.helper.his;
import com.ynxbd.common.action.pay.PEnum;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.helper.ProperHelper;
import com.ynxbd.common.helper.common.CodeHelper;
import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.SnowHelper;
import com.ynxbd.common.helper.common.SoapHelper;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.JsonResultEnum;
import com.ynxbd.common.service.MiddleOfficeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class HisHelper {
public static final String SOAP_ENV = "<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" ";
// 微信
public static final String WECHAT_CALL_NO = "843242395";
// 支付宝
public static final String ALI_CALL_NO = "675448357";
// private static final String NS = "http://tempuri.org/";
// private static String HIS_WSD_URL;
// webService请求地址
protected static final String HIS_SOAP_URL;
protected static final String HIS_SOAP_DEV_URL;
// HIS医保环境
// protected static final String HIS_DEV_MI_URL;
// protected static final String HIS_PROD_MI_URL;
protected static final String HIS_WX_MED_URL;
protected static final String HIS_ALI_MED_URL;
// 是否强制打印HIS响应的xml
private static final Boolean IS_LOG_RESP;
// 是否使用"<![CDATA[]]>"阻止解析
private static final Boolean IS_REQ_CDATA;
// 是否传递openid给HIS推送消息
public static final Boolean IS_PUSH_MSG;
// 是否开启支付宝蓝旗调用call_no
public static final Boolean IS_ALI_MER;
// 开启预结算(第1开关)(如果HIS未限制-则存在直接入库风险!!!!!!!!!!!!!!!!!!)
public static final boolean IS_RECIPE_PREPAY;
static {
ProperHelper config = new ProperHelper().read("webservice.properties");
String url = config.getString("his.url");
String devUrl = config.getString("his.dev_url");
// 医保---------------------------------------------------------
String mdUrl = config.getString("his.md_url"); // 微信医保旧版地址
String wxMedUrl = config.getString("his.wx_med_url");
String aliMedUrl = config.getString("his.ali_med_url");
IS_LOG_RESP = config.getBoolean("his.is_log_resp", false);
IS_PUSH_MSG = config.getBoolean("his.is_push_msg", false);
IS_ALI_MER = config.getBoolean("his.is_ali_mer", false);
IS_REQ_CDATA = config.getBoolean("his.is_req_cdata", false);
IS_RECIPE_PREPAY = config.getBoolean("his.is_recipe_prepay", false);
if (url == null) {
log.error("WebService配置文件读取失败");
}
HIS_SOAP_URL = initSoapURL(url);
HIS_SOAP_DEV_URL = initSoapURL(devUrl);
// 医保---------------------------------
HIS_WX_MED_URL = initSoapURL(wxMedUrl == null ? mdUrl : wxMedUrl);
HIS_ALI_MED_URL = initSoapURL(aliMedUrl);
}
private static String initSoapURL(String ip) {
if (ObjectUtils.isEmpty(ip)) {
return null;
}
if (ip.contains("http")) {
return ip;
}
return "http://" + ip + "/WebService_AB.dll/soap/IInterface_AB";
}
/**
* 生成HIS订单号
*/
public static List<Order> getHisTradeNo(String prefix, List<Long> ids, PEnum pEnum) {
if (pEnum == null) {
return null;
}
return CodeHelper.createTradeNo(prefix, pEnum.ORDER_CODE.toUpperCase(), ids);
}
/**
* 生成HIS订单号
*/
public static String getHisTradeNo(String prefix, PEnum pEnum) {
if (pEnum == null) {
return null;
}
return prefix + pEnum.ORDER_CODE.toUpperCase() + "001";
}
// // 修改callNo为阿里code
// public static void putCallNoByMer(MerchantEnum merchantEnum, Map<String, Object> params) {
// if (merchantEnum == null) return;
//
// if (merchantEnum.equals(MerchantEnum.ALI) || merchantEnum.equals(MerchantEnum.ALI_MEDICAL)) {
// params.put("CallNo", ALI_CALL_NO);
// }
// }
/**
* webService请求工具类枚举版
*
* @param hisEnum 枚举
* @param params 发送的参数
* @return 响应的xml数据
*/
public static String getResponseXml(HisEnum hisEnum, Map<String, Object> params) {
return getResponseXml(hisEnum, HIS_SOAP_URL, params);
}
/**
* webService请求工具类枚举版
*
* @param hisEnum 枚举
* @param params 发送的参数
* @return 响应的xml数据
*/
public static String getResponseXml(HisEnum hisEnum, String soapUrl, Map<String, Object> params) {
return getResponseXmlForCallNo(hisEnum, soapUrl, params);
}
/**
* webService请求工具类枚举版
*
* @param hisEnum 枚举
* @param soapUrl 路径
* @param params 参数
* @return 响应xml
*/
public static String getResponseXmlForCallNo(HisEnum hisEnum, String soapUrl, Map<String, Object> params) {
String method = hisEnum.METHOD;
String transactionCode = hisEnum.CODE;
if (params == null || transactionCode == null || method == null) {
log.info("[WebService]-{ map | transactionCode | method 为空 }");
return null;
}
Object callNo = params.get("CallNo");
if (ObjectUtils.isEmpty(callNo)) {
params.put("CallNo", WECHAT_CALL_NO);
}
params.put("TransactionCode", transactionCode);
String result = null;
try {
String reqId = SnowHelper.nextStrId();
long begTime = System.currentTimeMillis(); // 开始时间
String hisResponse = SoapHelper.post("HIS", soapUrl, null, SOAP_ENV +
"xmlns:urn=\"urn:Interface_ABIntf-IInterface_AB\">" +
"<soapenv:Header/><soapenv:Body>" +
"<urn:" + method + " soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
"<InputStr xsi:type=\"xsd:string\">" +
(IS_REQ_CDATA ? "<![CDATA[" : "") +
"<Request>" + SoapHelper.requestParams("HIS", transactionCode, reqId, params) + "</Request>" +
(IS_REQ_CDATA ? "]]>" : "") +
"</InputStr></urn:" + method + "></soapenv:Body></soapenv:Envelope>"
);
long endTime = System.currentTimeMillis(); // 结束时间
String takeTime = (endTime - begTime) + "ms"; // 耗时
if (hisResponse == null) {
log.info("[{}]HIS请求无响应[rid:{}]-耗时:[{}]", transactionCode, reqId, takeTime);
return null;
}
//解析响应消息,使用SAXReader对象
org.dom4j.Document document = DocumentHelper.parseText(hisResponse);
if (document == null) {
log.info("[{}]HIS响应内容解析失败[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, hisResponse);
return null;
}
List<Node> nodes = document.selectNodes("//return");
if (nodes.isEmpty()) {
log.info("[{}]HIS请求失败[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, hisResponse);
return null;
}
Element element = (Element) nodes.get(0);
result = element.getText();
if (hisEnum.IS_LOG_RESP) { // 是否打印返回的xml
log.info("[{}]HIS请求成功[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, result);
} else {
if (IS_LOG_RESP) { // 配置文件强制要求打印xml
if (!HisEnum.AP_Query_Statement.equals(hisEnum) && !HisEnum.Query_Area.equals(hisEnum)) {
log.info("[强制打印][{}]HIS请求成功[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, result);
}
}
}
} catch (DocumentException e) {
ErrorHelper.println(e);
}
return result;
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult getJsonResult(HisEnum hisEnum, Map<String, Object> params) {
JsonResult result = JsonResult.xmlToBean(getResponseXml(hisEnum, params), JsonResultEnum.SYS_HIS);
if (result == null) { // 如果返回为空可能为超时
return createTimeoutResult();
}
return result;
}
public static void putAliCallNo(MerchantEnum merchantEnum, Map<String, Object> params) {
if (IS_ALI_MER && params != null && merchantEnum != null) {
if (merchantEnum.equals(MerchantEnum.ALI) || merchantEnum.equals(MerchantEnum.ALI_MEDICAL)) {
params.put("CallNo", ALI_CALL_NO);
}
}
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult getJsonResultByMer(HisEnum hisEnum, MerchantEnum merchantEnum, Map<String, Object> params) {
putAliCallNo(merchantEnum, params);
return getJsonResult(hisEnum, params);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult getJsonResult(HisEnum hisEnum, JsonResult.MapParams params) {
Map<String, Object> requestParams = new HashMap<>();
if (params != null) {
params.setParams(requestParams);
}
return getJsonResult(hisEnum, requestParams);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult getJsonResultByMer(HisEnum hisEnum, MerchantEnum merchantEnum, JsonResult.MapParams params) {
Map<String, Object> requestParams = new HashMap<>();
if (params != null) {
params.setParams(requestParams);
}
return getJsonResultByMer(hisEnum, merchantEnum, requestParams);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult createErrorResult(String message) {
if (ObjectUtils.isEmpty(message)) {
message = "【HIS】请求参数缺失";
}
return JsonResult.createErrorResult(message, JsonResultEnum.SYS_HIS);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
protected static JsonResult createTimeoutResult() {
return JsonResult.createTimeoutResult("【HIS】请求超时", JsonResultEnum.SYS_HIS);
}
/**
* 字符串集转xml
*
* @param xmlTag xml标签
* @param strList 字符串集
* @return xml
*/
public static String strListToXml(String xmlTag, List<String> strList) {
StringBuilder sb = new StringBuilder();
for (String val : strList) {
sb.append("<").append(xmlTag).append(">").append(val).append("</").append(xmlTag).append(">");
}
return sb.toString();
}
// /**
// * [支付宝] xml响应数据组装成为JSON数据
// *
// * @param hisEnum 接口枚举
// * @param params 参数
// * @param merchantEnum 支付类型
// * @return JsonResult
// */
// public static JsonResult getJsonResult(HisEnum hisEnum, Map<String, Object> params, MerchantEnum merchantEnum) {
// JsonResult result = JsonResult.xmlToBean(getResponseXml(hisEnum, params, merchantEnum), JsonResultEnum.SYS_HIS);
// if (result == null) { // 如果返回为空可能为超时
// return createTimeoutResult();
// }
// return result;
// }
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResult(HisEnum hisEnum, JsonResult.MapParams params, MerchantEnum merchantEnum) {
// Map<String, Object> requestParams = new HashMap<>();
// if (params != null) {
// params.setParams(requestParams);
// }
// return getJsonResult(hisEnum, requestParams, merchantEnum);
// }
// /**
// * 根据订单号获取类型
// *
// * @param bankTransNo 交易流水号
// * @param tradeNo HIS订单号
// * @return 类型
// */
// public static String getTypeByPEnum(String bankTransNo, String tradeNo) throws ServiceException {
// if (!PayService.isNewOrder(bankTransNo, tradeNo)) {
// throw new ServiceException(ResultEnum.REFUND_IS_OLD_ORDER_NUM);
// }
// int len = tradeNo.length();
// String middleCode1 = tradeNo.substring(len - 4, len - 3);
// String middleCode2 = tradeNo.substring(len - 4, len - 2);
// for (PEnum item : PEnum.values()) {
// if (item.ORDER_CODE.equals(middleCode1) || item.ORDER_CODE.equals(middleCode2)) {
// return item.CODE;
// }
// }
// return null;
// }
// /**
// * xml响应数据组装成为JSON数据
// *
// * @param xml xml
// * @return 封装好的对象
// */
// public static HisResult xmlToBean(String xml) {
// if (xml == null || "".equals(xml)) {
// log.info("HIS response xml is null");
// return HisResult.createErrorHisResult("[HIS]获取xml数据失败");
// }
//
// JSONObject respObj;
// try {
// Document document = DocumentHelper.parseText(xml);
// Element root = document.getRootElement(); // 获取根节点元素对象
// respObj = HisResult.nodeToJsonObject(root);
// Map<String, Object> map = new HashMap<>();
// Set<String> keys = respObj.keySet();
// for (String key : keys) {
// if (!key.equals("TransactionCode") && !key.equals("ResponseCode") && !key.equals("ResponseMessage") && !key.equals("PatientName")) {
// map.put(key, respObj.getString(key));
// }
// }
// respObj.put("DataMap", map);
// } catch (DocumentException e) {
// ErrorHelper.println(e);
// return HisResult.createErrorHisResult(e.getMessage());
// }
// HisResult hisResult = JSON.toJavaObject(respObj, HisResult.class);
// if (hisResult.getResponseCode() != 0) {
// log.info("HIS Error Message:[{}]", hisResult.getResponseMessage());
// }
// return hisResult;
// }
}

@ -1,84 +0,0 @@
package com.ynxbd.common.helper.his;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.JsonResultEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class HisMedHelper {
/**
* 医保环境
*
* @param hisEnum 枚举
* @param params 发送的参数
* @return 响应的xml数据
*/
private static String getResponseXml(MerchantEnum merchantEnum, HisEnum hisEnum, Map<String, Object> params) {
if (merchantEnum == null) {
log.error("[HIS医保接口]merchantEnum is null");
return null;
}
String soapUrl = merchantEnum.isWx() ? HisHelper.HIS_WX_MED_URL : HisHelper.HIS_ALI_MED_URL;
if (ObjectUtils.isEmpty(soapUrl)) {
log.error("[HIS医保接口]soapUrl is null");
return null;
}
return HisHelper.getResponseXml(hisEnum, merchantEnum.isWx() ? HisHelper.HIS_WX_MED_URL : HisHelper.HIS_ALI_MED_URL, params);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult getJsonResult(MerchantEnum merchantEnum, HisEnum hisEnum, Map<String, Object> params) {
HisHelper.putAliCallNo(merchantEnum, params);
JsonResult result = JsonResult.xmlToBean(getResponseXml(merchantEnum, hisEnum, params), JsonResultEnum.SYS_HIS);
if (result == null) { // 如果返回为空可能为超时
return HisHelper.createTimeoutResult();
}
return result;
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public static JsonResult getJsonResult(MerchantEnum merchantEnum, HisEnum hisEnum, JsonResult.MapParams params) {
Map<String, Object> requestParams = new HashMap<>();
if (params != null) {
params.setParams(requestParams);
}
return getJsonResult(merchantEnum, hisEnum, requestParams);
}
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResult(boolean isDev, HisEnum hisEnum, Map<String, Object> params) {
// return getJsonResultByMer(isDev, hisEnum, null, params);
// }
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResult(boolean isDev, HisEnum hisEnum, JsonResult.MapParams params) {
// return getJsonResultByMer(isDev, hisEnum, null, params);
// }
}

@ -15,6 +15,7 @@ import org.dom4j.Node;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
// 瑞美LIS
@ -62,7 +63,7 @@ public class RMLisHelper {
String result;
try {
String reqId = SnowHelper.nextStrId();
String reqId = UUID.randomUUID().toString();
long begTime = System.currentTimeMillis(); // 开始时间
String responseXml = SoapHelper.post("RMLis", LIS_SOAP_URL, null,
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ruim=\"http://www.ruimei.com.cn\">" +

@ -1,31 +1,31 @@
package com.ynxbd.common.helper.his;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayDataBillAccountlogQueryRequest;
import com.alipay.api.response.AlipayDataBillAccountlogQueryResponse;
import com.ynxbd.ali.config.AliConfig;
import com.ynxbd.common.helper.common.JsonHelper;
public class AliOldHelper {
public static void test(String begDate, String endDate, String outTradeNo) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", AliConfig.APP_ID, AliConfig.APP_PRIVATE_KEY, "json", "GBK", AliConfig.ALI_PUBLIC_KEY, "RSA2");
AlipayDataBillAccountlogQueryRequest request = new AlipayDataBillAccountlogQueryRequest();
request.setBizContent("{" +
" \"start_time\":\"" + begDate + " 00:00:00\"," +
" \"end_time\":\"" + endDate + " 00:00:00\"," +
" \"merchant_order_no\":\"" + outTradeNo + "\"," +
"}");
AlipayDataBillAccountlogQueryResponse response = alipayClient.execute(request);
System.out.println(JsonHelper.toJsonString(response));
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
}
}
package com.ynxbd.common.his;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayDataBillAccountlogQueryRequest;
import com.alipay.api.response.AlipayDataBillAccountlogQueryResponse;
import com.ynxbd.ali.config.AliConfig;
import com.ynxbd.common.helper.common.JsonHelper;
public class AliOldHelper {
public static void test(String begDate, String endDate, String outTradeNo) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", AliConfig.APP_ID, AliConfig.APP_PRIVATE_KEY, "json", "GBK", AliConfig.ALI_PUBLIC_KEY, "RSA2");
AlipayDataBillAccountlogQueryRequest request = new AlipayDataBillAccountlogQueryRequest();
request.setBizContent("{" +
" \"start_time\":\"" + begDate + " 00:00:00\"," +
" \"end_time\":\"" + endDate + " 00:00:00\"," +
" \"merchant_order_no\":\"" + outTradeNo + "\"," +
"}");
AlipayDataBillAccountlogQueryResponse response = alipayClient.execute(request);
System.out.println(JsonHelper.toJsonString(response));
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
}
}

@ -0,0 +1,252 @@
package com.ynxbd.common.his;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.SoapHelper;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.JsonResultEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Slf4j
public class HisClient {
private final String soapUrl;
private HisClient() {
this.soapUrl = null;
}
public HisClient(String soapUrl) {
this.soapUrl = soapUrl;
}
/**
* webService请求工具类枚举版
*
* @param hisEnum 枚举
* @param params 参数
* @return 响应xml
*/
public String call(HisEnum hisEnum, Map<String, Object> params) {
String reqSoapUrl = this.soapUrl;
if (ObjectUtils.isEmpty(reqSoapUrl)) {
log.error("[WebService]-soapUrl为空");
return null;
}
String method = hisEnum.METHOD;
String transactionCode = hisEnum.CODE;
if (params == null || transactionCode == null || method == null) {
log.error("[WebService]-{ map | transactionCode | method 为空 }");
return null;
}
Object callNo = params.get("CallNo");
if (ObjectUtils.isEmpty(callNo)) {
params.put("CallNo", HisConfig.WECHAT_CALL_NO);
}
params.put("TransactionCode", transactionCode);
String result = null;
try {
String reqId = UUID.randomUUID().toString();
long begTime = System.currentTimeMillis(); // 开始时间
String hisResponse = SoapHelper.post("HIS", reqSoapUrl, null, HisConfig.SOAP_ENV +
"xmlns:urn=\"urn:Interface_ABIntf-IInterface_AB\">" +
"<soapenv:Header/><soapenv:Body>" +
"<urn:" + method + " soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
"<InputStr xsi:type=\"xsd:string\">" +
(HisConfig.IS_REQ_CDATA ? "<![CDATA[" : "") +
"<Request>" + SoapHelper.requestParams("HIS", transactionCode, reqId, params) + "</Request>" +
(HisConfig.IS_REQ_CDATA ? "]]>" : "") +
"</InputStr></urn:" + method + "></soapenv:Body></soapenv:Envelope>"
);
long endTime = System.currentTimeMillis(); // 结束时间
String takeTime = (endTime - begTime) + "ms"; // 耗时
if (hisResponse == null) {
log.info("[{}]HIS请求无响应[rid:{}]-耗时:[{}]", transactionCode, reqId, takeTime);
return null;
}
//解析响应消息,使用SAXReader对象
org.dom4j.Document document = DocumentHelper.parseText(hisResponse);
if (document == null) {
log.info("[{}]HIS响应内容解析失败[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, hisResponse);
return null;
}
List<Node> nodes = document.selectNodes("//return");
if (nodes.isEmpty()) {
log.info("[{}]HIS请求失败[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, hisResponse);
return null;
}
Element element = (Element) nodes.get(0);
result = element.getText();
if (hisEnum.IS_LOG_RESP) { // 是否打印返回的xml
log.info("[{}]HIS请求成功[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, result);
} else {
if (HisConfig.IS_LOG_RESP) { // 配置文件强制要求打印xml
if (!HisEnum.AP_Query_Statement.equals(hisEnum) && !HisEnum.Query_Area.equals(hisEnum)) {
log.info("[强制打印][{}]HIS请求成功[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, result);
}
}
}
} catch (DocumentException e) {
ErrorHelper.println(e);
}
return result;
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public JsonResult getJsonResult(HisEnum hisEnum, Map<String, Object> params) {
JsonResult result = JsonResult.xmlToBean(call(hisEnum, params), JsonResultEnum.SYS_HIS);
if (result == null) { // 如果返回为空可能为超时
return createTimeoutResult();
}
return result;
}
public void putAliCallNo(MerchantEnum merchantEnum, Map<String, Object> params) {
if (HisConfig.IS_ALI_MER && params != null && merchantEnum != null) {
if (merchantEnum.equals(MerchantEnum.ALI) || merchantEnum.equals(MerchantEnum.ALI_MEDICAL)) {
params.put("CallNo", HisConfig.ALI_CALL_NO);
}
}
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public JsonResult getJsonResultByMer(HisEnum hisEnum, MerchantEnum merchantEnum, Map<String, Object> params) {
putAliCallNo(merchantEnum, params);
return getJsonResult(hisEnum, params);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public JsonResult getJsonResult(HisEnum hisEnum, JsonResult.MapParams params) {
Map<String, Object> requestParams = new HashMap<>();
if (params != null) {
params.setParams(requestParams);
}
return getJsonResult(hisEnum, requestParams);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public JsonResult getJsonResultByMer(HisEnum hisEnum, MerchantEnum merchantEnum, JsonResult.MapParams params) {
Map<String, Object> requestParams = new HashMap<>();
if (params != null) {
params.setParams(requestParams);
}
return getJsonResultByMer(hisEnum, merchantEnum, requestParams);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public JsonResult createErrorResult(String message) {
if (ObjectUtils.isEmpty(message)) {
message = "【HIS】请求参数缺失";
}
return JsonResult.createErrorResult(message, JsonResultEnum.SYS_HIS);
}
/**
* xml响应数据组装成为JSON数据
*
* @return 封装好的对象
*/
public JsonResult createTimeoutResult() {
return JsonResult.createTimeoutResult("【HIS】请求超时", JsonResultEnum.SYS_HIS);
}
// /**
// * 根据订单号获取类型
// *
// * @param bankTransNo 交易流水号
// * @param tradeNo HIS订单号
// * @return 类型
// */
// public static String getTypeByPEnum(String bankTransNo, String tradeNo) throws ServiceException {
// if (!PayService.isNewOrder(bankTransNo, tradeNo)) {
// throw new ServiceException(ResultEnum.REFUND_IS_OLD_ORDER_NUM);
// }
// int len = tradeNo.length();
// String middleCode1 = tradeNo.substring(len - 4, len - 3);
// String middleCode2 = tradeNo.substring(len - 4, len - 2);
// for (PEnum item : PEnum.values()) {
// if (item.ORDER_CODE.equals(middleCode1) || item.ORDER_CODE.equals(middleCode2)) {
// return item.CODE;
// }
// }
// return null;
// }
// /**
// * xml响应数据组装成为JSON数据
// *
// * @param xml xml
// * @return 封装好的对象
// */
// public static HisResult xmlToBean(String xml) {
// if (xml == null || "".equals(xml)) {
// log.info("HIS response xml is null");
// return HisResult.createErrorHisResult("[HIS]获取xml数据失败");
// }
//
// JSONObject respObj;
// try {
// Document document = DocumentHelper.parseText(xml);
// Element root = document.getRootElement(); // 获取根节点元素对象
// respObj = HisResult.nodeToJsonObject(root);
// Map<String, Object> map = new HashMap<>();
// Set<String> keys = respObj.keySet();
// for (String key : keys) {
// if (!key.equals("TransactionCode") && !key.equals("ResponseCode") && !key.equals("ResponseMessage") && !key.equals("PatientName")) {
// map.put(key, respObj.getString(key));
// }
// }
// respObj.put("DataMap", map);
// } catch (DocumentException e) {
// ErrorHelper.println(e);
// return HisResult.createErrorHisResult(e.getMessage());
// }
// HisResult hisResult = JSON.toJavaObject(respObj, HisResult.class);
// if (hisResult.getResponseCode() != 0) {
// log.info("HIS Error Message:[{}]", hisResult.getResponseMessage());
// }
// return hisResult;
// }
}

@ -0,0 +1,74 @@
package com.ynxbd.common.his;
import com.ynxbd.common.helper.common.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
@Slf4j
public class HisConfig {
public static final String SOAP_ENV = "<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" ";
// 微信
public static final String WECHAT_CALL_NO = "843242395";
// 支付宝
public static final String ALI_CALL_NO = "675448357";
// private static final String NS = "http://tempuri.org/";
// private static String HIS_WSD_URL;
// webService请求地址
public static final String HIS_SOAP_URL;
public static final String HIS_SOAP_DEV_URL;
// HIS医保环境
// protected static final String HIS_DEV_MI_URL;
// protected static final String HIS_PROD_MI_URL;
protected static final String HIS_WX_MED_URL;
protected static final String HIS_ALI_MED_URL;
// 是否强制打印HIS响应的xml
public static final Boolean IS_LOG_RESP;
// 是否使用"<![CDATA[]]>"阻止解析
public static final Boolean IS_REQ_CDATA;
// 是否传递openid给HIS推送消息
public static final Boolean IS_PUSH_MSG;
// 是否开启支付宝蓝旗调用call_no
public static final Boolean IS_ALI_MER;
// 开启预结算(第1开关)(如果HIS未限制-则存在直接入库风险!!!!!!!!!!!!!!!!!!)
public static final boolean IS_RX_PREPAY;
static {
XmlConfigHelper config = new XmlConfigHelper().read("webservice.xml", "his");
IS_LOG_RESP = config.getBoolean("is_log_resp", false);
IS_PUSH_MSG = config.getBoolean("is_push_msg", false);
IS_ALI_MER = config.getBoolean("is_ali_mer", false);
IS_REQ_CDATA = config.getBoolean("is_req_cdata", false);
IS_RX_PREPAY = config.getBoolean("is_rx_prepay", false);
String url = config.getString("url");
if (url == null) {
log.error("WebService配置文件读取失败");
}
HIS_SOAP_URL = initSoapURL(url);
HIS_SOAP_DEV_URL = initSoapURL(config.getString("dev_url"));
// 医保---------------------------------
HIS_WX_MED_URL = initSoapURL(config.getString("wx_med_url"));
HIS_ALI_MED_URL = initSoapURL(config.getString("ali_med_url"));
}
private static String initSoapURL(String ip) {
if (ObjectUtils.isEmpty(ip)) {
return null;
}
if (ip.contains("http")) {
return ip;
}
return "http://" + ip + "/WebService_AB.dll/soap/IInterface_AB";
}
}

@ -1,142 +1,142 @@
package com.ynxbd.common.helper.his;
public enum HisEnum {
AP_Query_Hospital("查询医院列表", "1", "AP_Query_Hospital", true),
AP_Query_Patient("[患者]获取用户绑定信息", "1001", "AP_Query_Patient", true),
AP_Binding_Card("[患者]身份证绑定", "1002", "AP_Binding_Card", true),
AP_UnBinding_Card("[患者]身份证解绑", "1003", "AP_UnBinding_Card", true),
AP_Query_GMC_Patient("[患者]医共体ID查询", "1015", "UniversalInterface", true),
Medical_Insurance_Bill("[医保]查询患者医保结算清单", "1008", "UniversalInterface", true),
// 快速发药[自定义]
QuickDrugDispense("[处方]快速发药", "11001", "UniversalInterface", true),
TPP_QR_Reg("[第三方]扫码挂号", "11002", "UniversalInterface", true),
// 标准物价查询[自定义]
Recipe_Query_StandardPrice("[价格]标准物价查询", "8002", "UniversalInterface", false),
// 就诊记录[自定义]
Query_TreatRecords("查询就诊记录", "1004", "UniversalInterface", true),
// 报告------------------
AP_Query_PEISReport("[报告]体检报告", "9001", "AP_Query_PEISReport", true),
AP_Query_CheckApplication("[报告]检查申请单", "5001", "AP_Query_CheckApplication", false),
AP_Query_InspectionApplication("[报告]检验(化验)申请单", "5002", "AP_Query_InspectionApplication", false),
// 挂号记录---------------
AP_Query_Regist("[挂号记录]查询历史挂号记录", "2004", "AP_Query_Regist", true),
AP_Query_Reservation("[预约挂号]查询预约记录", "3004", "AP_Query_Reservation", true),
// 分时段挂号---------
AP_Query_Dept_New("[分时段挂号]查询科室列表", "7001", "AP_Query_Dept_New", false),
AP_Query_Doct_New("[分时段挂号]根据科室查询医生列表", "7002", "AP_Query_Doct_New", true),
AP_Query_Register_Source_New("[分时段挂号]根据医生查询号源 ", "7003", "AP_Query_Register_Source_New", false),
AP_Regist_New("[分时段挂号]执行挂号", "7004", "AP_Regist_New", true),
AP_Occupy_Source_New("[分时段挂号]占号", "7005", "AP_Occupy_Source_New", true),
// 普通挂号---------------
AP_Regist("[今日挂号]执行挂号", "2003", "AP_Regist", true),
AP_Query_Dept("[今日挂号]查询科室列表", "2001", "AP_Query_Dept", true),
AP_Query_Doct("[今日挂号]根据科室查询医生列表", "2002", "AP_Query_Doct", true),
// ----------------------
AP_Query_Reservation_Dept("[预约挂号]查询科室列表", "3001", "AP_Query_Reservation_Dept", true),
AP_Query_Reservation_Doct("[预约挂号]根据科室查询医生列表", "3002", "AP_Query_Reservation_Doct", true),
AP_Reservation("[预约挂号]执行预约", "3003", "AP_Reservation", true),
AP_Recall_Reservation("[预约挂号]取消预约", "3006", "AP_Recall_Reservation", true),
AP_Refund_Register("[今日挂号]取消预约", "4007", "AP_Refund_Register", true),
//排班记录
AP_Doctor_Schedule("[排班]医生排班表","8003","UniversalInterface",true),
Query_Area("[地区]查询行政区划","8005","UniversalInterface",false),
// 支付[自定义]------------------
Create_Self_Help("[处方]生成自助申请单", "10001", "UniversalInterface", true),
Query_Self_Help("[处方]查询自助申请单信息", "10002", "UniversalInterface", true),
AP_Query_UnPay_Invoice("[处方]查询待缴费项目", "4001", "AP_Query_UnPay_Invoice", true),
AP_Query_OutpatientFee("[处方]查询已缴费项目", "5005", "AP_Query_OutpatientFee", true),
AP_Pay_Invoice("[处方]更新recipeId参数为List,支持多个处方单同时缴费", "4002", "AP_Pay_Invoice", true),
AP_PrePay_Invoice_New("[处方]预结算", "4004", "AP_PrePay_Invoice_New", true),
AP_Pay_Invoice_New("[处方]预结算缴费", "4005", "AP_Pay_Invoice_New", true),
YDZF_QueryDiseaseInfo("[医保]获取慢性病列表","4006","YDZF_QueryDiseaseInfo",true),
AP_Query_Statement("查询对账报表", "5007", "AP_Query_Statement", false),
AP_Query_Transaction("查询交易流水", "5008", "AP_Query_Transaction", true),
AP_Query_StatementByFPNum("根据发票号查询交易流水", "5011", "AP_Query_StatementByFPNum", true),
//
Medical_PayOrders("[医保]处方下单接口", "40022", "YDZF_PayOrders", true),
Medical_Refund("[医保]退费", "40024", "YDZF_RefundOrder", true),
Medical_PAY("[医保]HIS医保结算", "40023", "YDZF_SaveToHIS", true),
Medical_QueryOrderStatus("[医保]查询医保结算信息", "40025", "YDZF_QueryOrderStatus", true),
// 住院-------------------------
YDZF_UploadFeesInfo_ZY("[住院][医保]6201上传费用明细 + 6202 支付下单", "4009", "YDZF_UploadFeesInfo_ZY", true),
YDZF_SaveToHIS_ZY("[住院][医保]HIS结算(住院) 6301", "4010", "YDZF_SaveToHIS_ZY", true),
AP_Query_Prepay("[住院]查询预交金缴费记录(出院后)", "5003", "AP_Query_Prepay", true),
AP_Query_InpatientFee("[住院]查询住院费用清单(住院中)", "5004", "AP_Query_InpatientFee", true),
AP_Query_InpatientSummaryFee("[住院]查询住院日费用汇总(住院中)", "5006", "AP_Query_InpatientSummaryFee", true),
Query_OutPatientRecords("[住院]通过患者ID查询住院记录(出院后)", "1011", "UniversalInterface", true),
Query_OutHospTreatFee("[住院]通过住院号查询费用明细(出院后)", "1012", "UniversalInterface", true),
Query_InHospPrepay("[住院]预交金缴费", "4003", "UniversalInterface", true),
Query_InHospByTreatNum("[住院]通过住院号查询患者信息(含预交金)", "1005", "UniversalInterface", true),
Query_InHospByPatientId("[住院]通过患者ID查询在院患者信息(目前只能查询住院中)", "1006", "UniversalInterface", true),
XK_GET_TREAT_LIST("[互联网医院]查询就诊记录列表", "13001", "UniversalInterface", true),
XK_CREATE_TREAT("[互联网医院]创建就诊记录", "13002", "UniversalInterface", true),
XK_QUERY_TREAT("[互联网医院]查询就诊记录诊断信息", "13003", "UniversalInterface", true),
XK_DOC_CA("[互联网医院]查询医生电子签名", "13004", "UniversalInterface", true),
XK_INQUIRY_FEE("[互联网医院]查询问诊费用信息","13005","UniversalInterface", true),
XK_CREATE_INQUIRY("[互联网医院]创建问诊记录","13006","UniversalInterface",true),
XK_MEDICAL_RECIPE("[互联网医院]处方医保双通道流转","13007","UniversalInterface",true),
XK_QUERY_RE_REGISTER("[互联网医院]查询复诊挂号费","13008","UniversalInterface",true),
Query_TreatMedicalRecord("[病历]查询门诊病历", "1014", "UniversalInterface", false),
// 在线签到
AP_Query_SignIn("[在线签到]查询预约待签到记录","7007","AP_Query_SignIn",true),
AP_SignIN("[在线签到]执行预约签到","7008","AP_SignIn",true),
AP_Query_Line_SignIn("[在线签到]查询已挂号未签到记录","7009","AP_Query_LineSignIn",false),
AP_Line_SignIN("[在线签到]执行挂号患者签到","7010","AP_LineSignIn",true),
// 自助开单
SH_SELF_HELP_QUERY("[查询自助开单信息]","10003","UniversalInterface",true),
SH_SELF_HELP_CREATE("[创建自助开单申请单]","10004","UniversalInterface",true),
QUERY_ELECTRON_INVOICE("[查询电子发票信息]","8004","UniversalInterface",false),
QUERY_AUTH_AGENT("委托人信息[查询]","11003","UniversalInterface", true),
ADD_AUTH_AGENT("委托人信息[新增]","11004","UniversalInterface",true),
UPDATE_AUTH_AGENT("委托人信息[修改]","11005","UniversalInterface",true),
DELETE_AUTH_AGENT("委托人信息[删除]","11006","UniversalInterface",true),
HIS_XK_RX_DICT("开方字典查询","13010","UniversalInterface",false),
HIS_XK_RX_CREATE("线上开方","13011","UniversalInterface",true),
;
public final String NAME;
public final String CODE;
public final String METHOD;
public final boolean IS_LOG_RESP; // 是否打印xml
HisEnum(String NAME, String CODE, String METHOD, boolean IS_LOG_RESP) {
this.NAME = NAME;
this.CODE = CODE;
this.METHOD = METHOD;
this.IS_LOG_RESP = IS_LOG_RESP;
}
}
package com.ynxbd.common.his;
public enum HisEnum {
AP_Query_Hospital("查询医院列表", "1", "AP_Query_Hospital", true),
AP_Query_Patient("[患者]获取用户绑定信息", "1001", "AP_Query_Patient", true),
AP_Binding_Card("[患者]身份证绑定", "1002", "AP_Binding_Card", true),
AP_UnBinding_Card("[患者]身份证解绑", "1003", "AP_UnBinding_Card", true),
AP_Query_GMC_Patient("[患者]医共体ID查询", "1015", "UniversalInterface", true),
Medical_Insurance_Bill("[医保]查询患者医保结算清单", "1008", "UniversalInterface", true),
// 快速发药[自定义]
QuickDrugDispense("[处方]快速发药", "11001", "UniversalInterface", true),
TPP_QR_Reg("[第三方]扫码挂号", "11002", "UniversalInterface", true),
// 标准物价查询[自定义]
Recipe_Query_StandardPrice("[价格]标准物价查询", "8002", "UniversalInterface", false),
// 就诊记录[自定义]
Query_TreatRecords("查询就诊记录", "1004", "UniversalInterface", true),
// 报告------------------
AP_Query_PEISReport("[报告]体检报告", "9001", "AP_Query_PEISReport", true),
AP_Query_CheckApplication("[报告]检查申请单", "5001", "AP_Query_CheckApplication", false),
AP_Query_InspectionApplication("[报告]检验(化验)申请单", "5002", "AP_Query_InspectionApplication", false),
// 挂号记录---------------
AP_Query_Regist("[挂号记录]查询历史挂号记录", "2004", "AP_Query_Regist", true),
AP_Query_Reservation("[预约挂号]查询预约记录", "3004", "AP_Query_Reservation", true),
// 分时段挂号---------
AP_Query_Dept_New("[分时段挂号]查询科室列表", "7001", "AP_Query_Dept_New", false),
AP_Query_Doct_New("[分时段挂号]根据科室查询医生列表", "7002", "AP_Query_Doct_New", true),
AP_Query_Register_Source_New("[分时段挂号]根据医生查询号源 ", "7003", "AP_Query_Register_Source_New", false),
AP_Regist_New("[分时段挂号]执行挂号", "7004", "AP_Regist_New", true),
AP_Occupy_Source_New("[分时段挂号]占号", "7005", "AP_Occupy_Source_New", true),
// 普通挂号---------------
AP_Regist("[今日挂号]执行挂号", "2003", "AP_Regist", true),
AP_Query_Dept("[今日挂号]查询科室列表", "2001", "AP_Query_Dept", true),
AP_Query_Doct("[今日挂号]根据科室查询医生列表", "2002", "AP_Query_Doct", true),
// ----------------------
AP_Query_Reservation_Dept("[预约挂号]查询科室列表", "3001", "AP_Query_Reservation_Dept", true),
AP_Query_Reservation_Doct("[预约挂号]根据科室查询医生列表", "3002", "AP_Query_Reservation_Doct", true),
AP_Reservation("[预约挂号]执行预约", "3003", "AP_Reservation", true),
AP_Recall_Reservation("[预约挂号]取消预约", "3006", "AP_Recall_Reservation", true),
AP_Refund_Register("[今日挂号]取消预约", "4007", "AP_Refund_Register", true),
//排班记录
AP_Doctor_Schedule("[排班]医生排班表","8003","UniversalInterface",true),
Query_Area("[地区]查询行政区划","8005","UniversalInterface",false),
// 支付[自定义]------------------
Create_Self_Help("[处方]生成自助申请单", "10001", "UniversalInterface", true),
Query_Self_Help("[处方]查询自助申请单信息", "10002", "UniversalInterface", true),
AP_Query_UnPay_Invoice("[处方]查询待缴费项目", "4001", "AP_Query_UnPay_Invoice", true),
AP_Query_OutpatientFee("[处方]查询已缴费项目", "5005", "AP_Query_OutpatientFee", true),
AP_Pay_Invoice("[处方]更新recipeId参数为List,支持多个处方单同时缴费", "4002", "AP_Pay_Invoice", true),
AP_PrePay_Invoice_New("[处方]预结算", "4004", "AP_PrePay_Invoice_New", true),
AP_Pay_Invoice_New("[处方]预结算缴费", "4005", "AP_Pay_Invoice_New", true),
YDZF_QueryDiseaseInfo("[医保]获取慢性病列表","4006","YDZF_QueryDiseaseInfo",true),
AP_Query_Statement("查询对账报表", "5007", "AP_Query_Statement", false),
AP_Query_Transaction("查询交易流水", "5008", "AP_Query_Transaction", true),
AP_Query_StatementByFPNum("根据发票号查询交易流水", "5011", "AP_Query_StatementByFPNum", true),
//
Medical_PayOrders("[医保]处方下单接口", "40022", "YDZF_PayOrders", true),
Medical_Refund("[医保]退费", "40024", "YDZF_RefundOrder", true),
Medical_PAY("[医保]HIS医保结算", "40023", "YDZF_SaveToHIS", true),
Medical_QueryOrderStatus("[医保]查询医保结算信息", "40025", "YDZF_QueryOrderStatus", true),
// 住院-------------------------
YDZF_UploadFeesInfo_ZY("[住院][医保]6201上传费用明细 + 6202 支付下单", "4009", "YDZF_UploadFeesInfo_ZY", true),
YDZF_SaveToHIS_ZY("[住院][医保]HIS结算(住院) 6301", "4010", "YDZF_SaveToHIS_ZY", true),
AP_Query_Prepay("[住院]查询预交金缴费记录(出院后)", "5003", "AP_Query_Prepay", true),
AP_Query_InpatientFee("[住院]查询住院费用清单(住院中)", "5004", "AP_Query_InpatientFee", true),
AP_Query_InpatientSummaryFee("[住院]查询住院日费用汇总(住院中)", "5006", "AP_Query_InpatientSummaryFee", true),
Query_OutPatientRecords("[住院]通过患者ID查询住院记录(出院后)", "1011", "UniversalInterface", true),
Query_OutHospTreatFee("[住院]通过住院号查询费用明细(出院后)", "1012", "UniversalInterface", true),
Query_InHospPrepay("[住院]预交金缴费", "4003", "UniversalInterface", true),
Query_InHospByTreatNum("[住院]通过住院号查询患者信息(含预交金)", "1005", "UniversalInterface", true),
Query_InHospByPatientId("[住院]通过患者ID查询在院患者信息(目前只能查询住院中)", "1006", "UniversalInterface", true),
XK_GET_TREAT_LIST("[互联网医院]查询就诊记录列表", "13001", "UniversalInterface", true),
XK_CREATE_TREAT("[互联网医院]创建就诊记录", "13002", "UniversalInterface", true),
XK_QUERY_TREAT("[互联网医院]查询就诊记录诊断信息", "13003", "UniversalInterface", true),
XK_DOC_CA("[互联网医院]查询医生电子签名", "13004", "UniversalInterface", true),
XK_INQUIRY_FEE("[互联网医院]查询问诊费用信息","13005","UniversalInterface", true),
XK_CREATE_INQUIRY("[互联网医院]创建问诊记录","13006","UniversalInterface",true),
XK_MEDICAL_RECIPE("[互联网医院]处方医保双通道流转","13007","UniversalInterface",true),
XK_QUERY_RE_REGISTER("[互联网医院]查询复诊挂号费","13008","UniversalInterface",true),
Query_TreatMedicalRecord("[病历]查询门诊病历", "1014", "UniversalInterface", false),
// 在线签到
AP_Query_SignIn("[在线签到]查询预约待签到记录","7007","AP_Query_SignIn",true),
AP_SignIN("[在线签到]执行预约签到","7008","AP_SignIn",true),
AP_Query_Line_SignIn("[在线签到]查询已挂号未签到记录","7009","AP_Query_LineSignIn",false),
AP_Line_SignIN("[在线签到]执行挂号患者签到","7010","AP_LineSignIn",true),
// 自助开单
SH_SELF_HELP_QUERY("[查询自助开单信息]","10003","UniversalInterface",true),
SH_SELF_HELP_CREATE("[创建自助开单申请单]","10004","UniversalInterface",true),
QUERY_ELECTRON_INVOICE("[查询电子发票信息]","8004","UniversalInterface",false),
QUERY_AUTH_AGENT("委托人信息[查询]","11003","UniversalInterface", true),
ADD_AUTH_AGENT("委托人信息[新增]","11004","UniversalInterface",true),
UPDATE_AUTH_AGENT("委托人信息[修改]","11005","UniversalInterface",true),
DELETE_AUTH_AGENT("委托人信息[删除]","11006","UniversalInterface",true),
HIS_XK_RX_DICT("开方字典查询","13010","UniversalInterface",false),
HIS_XK_RX_CREATE("线上开方","13011","UniversalInterface",true),
;
public final String NAME;
public final String CODE;
public final String METHOD;
public final boolean IS_LOG_RESP; // 是否打印xml
HisEnum(String NAME, String CODE, String METHOD, boolean IS_LOG_RESP) {
this.NAME = NAME;
this.CODE = CODE;
this.METHOD = METHOD;
this.IS_LOG_RESP = IS_LOG_RESP;
}
}

@ -0,0 +1,92 @@
package com.ynxbd.common.his;
import com.ynxbd.common.action.pay.PEnum;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.helper.common.CodeHelper;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Slf4j
public class HisFactory {
private static class NULL_CLIENT {
private static final HisClient INSTANCE = new HisClient(null);
}
private static class PROD_CLIENT {
private static final HisClient INSTANCE = new HisClient(HisConfig.HIS_SOAP_URL);
}
private static class DEV_CLIENT {
private static final HisClient INSTANCE = new HisClient(HisConfig.HIS_SOAP_DEV_URL);
}
private static class WX_MED_CLIENT {
private static final HisClient INSTANCE = new HisClient(HisConfig.HIS_WX_MED_URL);
}
private static class ALI_MED_CLIENT {
private static final HisClient INSTANCE = new HisClient(HisConfig.HIS_ALI_MED_URL);
}
public static HisClient His() {
return PROD_CLIENT.INSTANCE;
}
// HIS环境切换
public static HisClient His(boolean isDev) {
return isDev ? DEV_CLIENT.INSTANCE : PROD_CLIENT.INSTANCE;
}
// HIS医保
public static HisClient HisMed(MerchantEnum merchantEnum) {
return HisMed(merchantEnum, false);
}
public static HisClient HisMed(MerchantEnum merchantEnum, boolean isDev) {
if (merchantEnum == null) {
return NULL_CLIENT.INSTANCE;
}
if (isDev) {
return DEV_CLIENT.INSTANCE;
}
return merchantEnum.isWx() ? WX_MED_CLIENT.INSTANCE : ALI_MED_CLIENT.INSTANCE;
}
/**
* 生成HIS订单号
*/
public static List<Order> getHisTradeNo(String prefix, List<Long> ids, PEnum pEnum) {
if (pEnum == null) {
return null;
}
return CodeHelper.createTradeNo(prefix, pEnum.ORDER_CODE.toUpperCase(), ids);
}
/**
* 生成HIS订单号
*/
public static String getHisTradeNo(String prefix, PEnum pEnum) {
if (pEnum == null) {
return null;
}
return prefix + pEnum.ORDER_CODE.toUpperCase() + "001";
}
/**
* 字符串集转xml
*
* @param xmlTag xml标签
* @param strList 字符串集
* @return xml
*/
public static String strListToXml(String xmlTag, List<String> strList) {
StringBuilder sb = new StringBuilder();
for (String val : strList) {
sb.append("<").append(xmlTag).append(">").append(val).append("</").append(xmlTag).append(">");
}
return sb.toString();
}
}

@ -0,0 +1,50 @@
//package com.ynxbd.common.his;
//
//import com.ynxbd.common.result.JsonResult;
//import com.ynxbd.common.result.JsonResultEnum;
//
//import java.util.HashMap;
//import java.util.Map;
//
//public class HisDevHelper {
//
// // 测试环境---------------------------------------------------------------------------
// /**
// * 测试环境
// *
// * @param hisEnum 枚举
// * @param params 发送的参数
// * @return 响应的xml数据
// */
// public static String getDevResponseXml(HisEnum hisEnum, Map<String, Object> params) {
// return HisHelper.getResponseXml(hisEnum, HisHelper.HIS_SOAP_DEV_URL, params);
// }
//
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getDevJsonResult(HisEnum hisEnum, Map<String, Object> params) {
// JsonResult result = JsonResult.xmlToBean(getDevResponseXml(hisEnum, params), JsonResultEnum.SYS_HIS);
// if (result == null) { // 如果返回为空可能为超时
// return HisHelper.createTimeoutResult();
// }
// return result;
// }
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getDevJsonResult(HisEnum hisEnum, JsonResult.MapParams params) {
// Map<String, Object> requestParams = new HashMap<>();
// if (params != null) {
// params.setParams(requestParams);
// }
// return getDevJsonResult(hisEnum, requestParams);
// }
//
//}

@ -0,0 +1,341 @@
//package com.ynxbd.common.his;
//
//import com.ynxbd.common.action.pay.PEnum;
//import com.ynxbd.common.bean.enums.MerchantEnum;
//import com.ynxbd.common.bean.pay.Order;
//import com.ynxbd.common.helper.ProperHelper;
//import com.ynxbd.common.helper.common.CodeHelper;
//import com.ynxbd.common.helper.common.ErrorHelper;
//import com.ynxbd.common.helper.common.SnowHelper;
//import com.ynxbd.common.helper.common.SoapHelper;
//import com.ynxbd.common.result.JsonResult;
//import com.ynxbd.common.result.JsonResultEnum;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.ObjectUtils;
//import org.dom4j.DocumentException;
//import org.dom4j.DocumentHelper;
//import org.dom4j.Element;
//import org.dom4j.Node;
//
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.UUID;
//
//@Slf4j
//public class HisHelper {
// /**
// * 生成HIS订单号
// */
// public static List<Order> getHisTradeNo(String prefix, List<Long> ids, PEnum pEnum) {
// if (pEnum == null) {
// return null;
// }
// return CodeHelper.createTradeNo(prefix, pEnum.ORDER_CODE.toUpperCase(), ids);
// }
//
// /**
// * 生成HIS订单号
// */
// public static String getHisTradeNo(String prefix, PEnum pEnum) {
// if (pEnum == null) {
// return null;
// }
// return prefix + pEnum.ORDER_CODE.toUpperCase() + "001";
// }
//
//
//// // 修改callNo为阿里code
//// public static void putCallNoByMer(MerchantEnum merchantEnum, Map<String, Object> params) {
//// if (merchantEnum == null) return;
////
//// if (merchantEnum.equals(MerchantEnum.ALI) || merchantEnum.equals(MerchantEnum.ALI_MEDICAL)) {
//// params.put("CallNo", ALI_CALL_NO);
//// }
//// }
//
//
// /**
// * webService请求工具类(枚举版)
// *
// * @param hisEnum 枚举
// * @param params 发送的参数
// * @return 响应的xml数据
// */
// public static String getResponseXml(HisEnum hisEnum, Map<String, Object> params) {
// return getResponseXml(hisEnum, HisConfig.HIS_SOAP_URL, params);
// }
//
// /**
// * webService请求工具类(枚举版)
// *
// * @param hisEnum 枚举
// * @param params 发送的参数
// * @return 响应的xml数据
// */
// public static String getResponseXml(HisEnum hisEnum, String soapUrl, Map<String, Object> params) {
// return getResponseXmlForCallNo(hisEnum, soapUrl, params);
// }
//
//
// /**
// * webService请求工具类(枚举版)
// *
// * @param hisEnum 枚举
// * @param soapUrl 路径
// * @param params 参数
// * @return 响应xml
// */
// public static String getResponseXmlForCallNo(HisEnum hisEnum, String soapUrl, Map<String, Object> params) {
// String method = hisEnum.METHOD;
// String transactionCode = hisEnum.CODE;
//
// if (params == null || transactionCode == null || method == null) {
// log.info("[WebService]-{ map | transactionCode | method 为空 }");
// return null;
// }
// Object callNo = params.get("CallNo");
// if (ObjectUtils.isEmpty(callNo)) {
// params.put("CallNo", HisConfig.WECHAT_CALL_NO);
// }
// params.put("TransactionCode", transactionCode);
//
// String result = null;
// try {
// String reqId = UUID.randomUUID().toString();
// long begTime = System.currentTimeMillis(); // 开始时间
// String hisResponse = SoapHelper.post("HIS", soapUrl, null, HisConfig.SOAP_ENV +
// "xmlns:urn=\"urn:Interface_ABIntf-IInterface_AB\">" +
// "<soapenv:Header/><soapenv:Body>" +
// "<urn:" + method + " soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
// "<InputStr xsi:type=\"xsd:string\">" +
// (HisConfig.IS_REQ_CDATA ? "<![CDATA[" : "") +
// "<Request>" + SoapHelper.requestParams("HIS", transactionCode, reqId, params) + "</Request>" +
// (HisConfig.IS_REQ_CDATA ? "]]>" : "") +
// "</InputStr></urn:" + method + "></soapenv:Body></soapenv:Envelope>"
// );
// long endTime = System.currentTimeMillis(); // 结束时间
// String takeTime = (endTime - begTime) + "ms"; // 耗时
// if (hisResponse == null) {
// log.info("[{}]HIS请求无响应[rid:{}]-耗时:[{}]", transactionCode, reqId, takeTime);
// return null;
// }
//
// //解析响应消息,使用SAXReader对象
// org.dom4j.Document document = DocumentHelper.parseText(hisResponse);
// if (document == null) {
// log.info("[{}]HIS响应内容解析失败[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, hisResponse);
// return null;
// }
//
// List<Node> nodes = document.selectNodes("//return");
// if (nodes.isEmpty()) {
// log.info("[{}]HIS请求失败[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, hisResponse);
// return null;
// }
//
// Element element = (Element) nodes.get(0);
// result = element.getText();
// if (hisEnum.IS_LOG_RESP) { // 是否打印返回的xml
// log.info("[{}]HIS请求成功[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, result);
//
// } else {
// if (HisConfig.IS_LOG_RESP) { // 配置文件强制要求打印xml
// if (!HisEnum.AP_Query_Statement.equals(hisEnum) && !HisEnum.Query_Area.equals(hisEnum)) {
// log.info("[强制打印][{}]HIS请求成功[rid:{}]-耗时:[{}]-返回xml={}", transactionCode, reqId, takeTime, result);
// }
// }
// }
// } catch (DocumentException e) {
// ErrorHelper.println(e);
// }
// return result;
// }
//
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResult(HisEnum hisEnum, Map<String, Object> params) {
// JsonResult result = JsonResult.xmlToBean(getResponseXml(hisEnum, params), JsonResultEnum.SYS_HIS);
// if (result == null) { // 如果返回为空可能为超时
// return createTimeoutResult();
// }
// return result;
// }
//
// public static void putAliCallNo(MerchantEnum merchantEnum, Map<String, Object> params) {
// if (HisConfig.IS_ALI_MER && params != null && merchantEnum != null) {
// if (merchantEnum.equals(MerchantEnum.ALI) || merchantEnum.equals(MerchantEnum.ALI_MEDICAL)) {
// params.put("CallNo", HisConfig.ALI_CALL_NO);
// }
// }
// }
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResultByMer(HisEnum hisEnum, MerchantEnum merchantEnum, Map<String, Object> params) {
// putAliCallNo(merchantEnum, params);
// return getJsonResult(hisEnum, params);
// }
//
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResult(HisEnum hisEnum, JsonResult.MapParams params) {
// Map<String, Object> requestParams = new HashMap<>();
// if (params != null) {
// params.setParams(requestParams);
// }
// return getJsonResult(hisEnum, requestParams);
// }
//
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResultByMer(HisEnum hisEnum, MerchantEnum merchantEnum, JsonResult.MapParams params) {
// Map<String, Object> requestParams = new HashMap<>();
// if (params != null) {
// params.setParams(requestParams);
// }
// return getJsonResultByMer(hisEnum, merchantEnum, requestParams);
// }
//
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult createErrorResult(String message) {
// if (ObjectUtils.isEmpty(message)) {
// message = "【HIS】请求参数缺失";
// }
// return JsonResult.createErrorResult(message, JsonResultEnum.SYS_HIS);
// }
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// protected static JsonResult createTimeoutResult() {
// return JsonResult.createTimeoutResult("【HIS】请求超时", JsonResultEnum.SYS_HIS);
// }
//
// /**
// * 字符串集转xml
// *
// * @param xmlTag xml标签
// * @param strList 字符串集
// * @return xml
// */
// public static String strListToXml(String xmlTag, List<String> strList) {
// StringBuilder sb = new StringBuilder();
// for (String val : strList) {
// sb.append("<").append(xmlTag).append(">").append(val).append("</").append(xmlTag).append(">");
// }
// return sb.toString();
// }
//
//
// // /**
//// * [支付宝] xml响应数据组装成为JSON数据
//// *
//// * @param hisEnum 接口枚举
//// * @param params 参数
//// * @param merchantEnum 支付类型
//// * @return JsonResult
//// */
//// public static JsonResult getJsonResult(HisEnum hisEnum, Map<String, Object> params, MerchantEnum merchantEnum) {
//// JsonResult result = JsonResult.xmlToBean(getResponseXml(hisEnum, params, merchantEnum), JsonResultEnum.SYS_HIS);
//// if (result == null) { // 如果返回为空可能为超时
//// return createTimeoutResult();
//// }
//// return result;
//// }
//
//// /**
//// * xml响应数据组装成为JSON数据
//// *
//// * @return 封装好的对象
//// */
//// public static JsonResult getJsonResult(HisEnum hisEnum, JsonResult.MapParams params, MerchantEnum merchantEnum) {
//// Map<String, Object> requestParams = new HashMap<>();
//// if (params != null) {
//// params.setParams(requestParams);
//// }
//// return getJsonResult(hisEnum, requestParams, merchantEnum);
//// }
//
//
// // /**
//// * 根据订单号获取类型
//// *
//// * @param bankTransNo 交易流水号
//// * @param tradeNo HIS订单号
//// * @return 类型
//// */
//// public static String getTypeByPEnum(String bankTransNo, String tradeNo) throws ServiceException {
//// if (!PayService.isNewOrder(bankTransNo, tradeNo)) {
//// throw new ServiceException(ResultEnum.REFUND_IS_OLD_ORDER_NUM);
//// }
//// int len = tradeNo.length();
//// String middleCode1 = tradeNo.substring(len - 4, len - 3);
//// String middleCode2 = tradeNo.substring(len - 4, len - 2);
//// for (PEnum item : PEnum.values()) {
//// if (item.ORDER_CODE.equals(middleCode1) || item.ORDER_CODE.equals(middleCode2)) {
//// return item.CODE;
//// }
//// }
//// return null;
//// }
//
//
//// /**
//// * xml响应数据组装成为JSON数据
//// *
//// * @param xml xml
//// * @return 封装好的对象
//// */
//// public static HisResult xmlToBean(String xml) {
//// if (xml == null || "".equals(xml)) {
//// log.info("HIS response xml is null");
//// return HisResult.createErrorHisResult("[HIS]获取xml数据失败");
//// }
////
//// JSONObject respObj;
//// try {
//// Document document = DocumentHelper.parseText(xml);
//// Element root = document.getRootElement(); // 获取根节点元素对象
//// respObj = HisResult.nodeToJsonObject(root);
//// Map<String, Object> map = new HashMap<>();
//// Set<String> keys = respObj.keySet();
//// for (String key : keys) {
//// if (!key.equals("TransactionCode") && !key.equals("ResponseCode") && !key.equals("ResponseMessage") && !key.equals("PatientName")) {
//// map.put(key, respObj.getString(key));
//// }
//// }
//// respObj.put("DataMap", map);
//// } catch (DocumentException e) {
//// ErrorHelper.println(e);
//// return HisResult.createErrorHisResult(e.getMessage());
//// }
//// HisResult hisResult = JSON.toJavaObject(respObj, HisResult.class);
//// if (hisResult.getResponseCode() != 0) {
//// log.info("HIS Error Message:[{}]", hisResult.getResponseMessage());
//// }
//// return hisResult;
//// }
//}

@ -0,0 +1,84 @@
//package com.ynxbd.common.his;
//
//import com.ynxbd.common.bean.enums.MerchantEnum;
//import com.ynxbd.common.result.JsonResult;
//import com.ynxbd.common.result.JsonResultEnum;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.ObjectUtils;
//
//import java.util.HashMap;
//import java.util.Map;
//
//@Slf4j
//public class HisMedHelper {
//
// /**
// * 医保环境
// *
// * @param hisEnum 枚举
// * @param params 发送的参数
// * @return 响应的xml数据
// */
// private static String getResponseXml(MerchantEnum merchantEnum, HisEnum hisEnum, Map<String, Object> params) {
// if (merchantEnum == null) {
// log.error("[HIS医保接口]merchantEnum is null");
// return null;
// }
// String soapUrl = merchantEnum.isWx() ? HisConfig.HIS_WX_MED_URL : HisConfig.HIS_ALI_MED_URL;
// if (ObjectUtils.isEmpty(soapUrl)) {
// log.error("[HIS医保接口]soapUrl is null");
// return null;
// }
// return HisHelper.getResponseXml(hisEnum, merchantEnum.isWx() ? HisConfig.HIS_WX_MED_URL : HisConfig.HIS_ALI_MED_URL, params);
// }
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResult(MerchantEnum merchantEnum, HisEnum hisEnum, Map<String, Object> params) {
// HisHelper.putAliCallNo(merchantEnum, params);
//
// JsonResult result = JsonResult.xmlToBean(getResponseXml(merchantEnum, hisEnum, params), JsonResultEnum.SYS_HIS);
// if (result == null) { // 如果返回为空可能为超时
// return HisHelper.createTimeoutResult();
// }
// return result;
// }
//
//
// /**
// * xml响应数据组装成为JSON数据
// *
// * @return 封装好的对象
// */
// public static JsonResult getJsonResult(MerchantEnum merchantEnum, HisEnum hisEnum, JsonResult.MapParams params) {
// Map<String, Object> requestParams = new HashMap<>();
// if (params != null) {
// params.setParams(requestParams);
// }
// return getJsonResult(merchantEnum, hisEnum, requestParams);
// }
//
//
// // /**
//// * xml响应数据组装成为JSON数据
//// *
//// * @return 封装好的对象
//// */
//// public static JsonResult getJsonResult(boolean isDev, HisEnum hisEnum, Map<String, Object> params) {
//// return getJsonResultByMer(isDev, hisEnum, null, params);
//// }
//
//// /**
//// * xml响应数据组装成为JSON数据
//// *
//// * @return 封装好的对象
//// */
//// public static JsonResult getJsonResult(boolean isDev, HisEnum hisEnum, JsonResult.MapParams params) {
//// return getJsonResultByMer(isDev, hisEnum, null, params);
//// }
//
//
//}

@ -1,459 +1,459 @@
//package com.ynxbd.common.helper.his;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.fastjson.TypeReference;
//import com.ynxbd.common.helper.common.ErrorHelper;
//import org.dom4j.Attribute;
//import org.dom4j.Element;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.math.BigDecimal;
//import java.util.List;
//import java.util.Map;
//
///**
// * HIS响应数据
// *
// * @Author wsq
// * @Date 2020/7/29 13:26
// * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved.
// */
//
//public class HisResult {
// private final static Logger log = LoggerFactory.getLogger(HisResult.class);
//
// // 响应状态码
// private Integer responseCode;
// // 响应信息
// private String responseMessage;
// // HIS响应码
// private String transactionCode;
// // 数据
// private Map<String, Object> dataMap;
//
//
// /**
// * 创建一个异常信息
// *
// * @param message 异常信息
// * @return 模拟his异常信息
// */
// public static HisResult createErrorHisResult(String message) {
// HisResult hisResult = new HisResult();
// hisResult.setResponseCode(500); //
// hisResult.setResponseMessage(message);
// return hisResult;
// }
//
//
// /**
// * 获取DataMap的值 String
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public String getDataMapString(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// if (val == null) {
// return null;
// }
// String v = val.toString().trim();
// return "".equals(v) ? null : v;
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
// /**
// * 获取DataMap的值 BigDecimal
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public BigDecimal getDataMapBigDecimal(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : new BigDecimal(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
// /**
// * 获取DataMap的值 Integer
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public Integer getDataMapInteger(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : Integer.parseInt(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
// /**
// * 获取DataMap的值 Boolean
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public Boolean getDataMapBoolean(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : Boolean.parseBoolean(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
//
// /**
// * 获取DataMap的值 Long
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public Long getDataMapLong(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : Long.parseLong(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
//
// /**
// * 获取DataMap的值 Double
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public Double getDataMapDouble(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : Double.parseDouble(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
//
// /**
// * 获取根节点包含相同节点数据
// * 如:
// * <roots>
// * # <root>1</root>
// * # <root>2</root>
// * </roots>
// *
// * @param clazz 类型
// * @param rootNode 根节点名
// * @param nodes 子节点名,可变长参数
// * @return 集合
// */
// public <T> List<T> getDataMapList(Class<T> clazz, String rootNode, String... nodes) {
// JSONArray jsonArray = getJsonArray(rootNode, nodes);
// return decodeList(jsonArray.toString(), clazz);
// }
//
//
// /**
// * 获取嵌套多层的JSONArray
// *
// * @param rooNode 根节点
// * @param nodes 子节点,可变长参数
// * @return json数组
// */
// public JSONArray getJsonArray(String rooNode, String... nodes) {
// Object rootObj = this.dataMap.get(rooNode);
// String result = rootObj == null ? JSON.toJSONString(new JSONArray()) : rootObj.toString();
// try {
// JSONArray jsonArray;
// JSONObject jsonObject;
// for (String node : nodes) {
// jsonArray = JSONArray.parseArray(result);
// if (jsonArray == null || jsonArray.size() == 0) {
// return new JSONArray();
// }
// if (jsonArray.size() == 1) { // 如果只有一个值继续处理
// jsonObject = jsonArray.getJSONObject(0);
// result = JSON.toJSONString(jsonObject.getJSONArray(node));
// } else { // 如果有多个值返回当前数组
// result = JSON.toJSONString(jsonArray);
// }
// }
// } catch (Exception e) {
// log.error("JSON数据转换失败");
// ErrorHelper.println(e);
// }
// return JSONArray.parseArray(result);
// }
//
//
// /**
// * JSON树形结构数据向下JSONArray中传递
// *
// * @param jsonArray 根节点
// * @param properties 节点属性,可变长参数
// * @return JSONArray
// */
// public <T> List<T> jsonParentToChild(Class<T> clazz, JSONArray jsonArray, String rootNode, String... properties) {
// JSONArray result = new JSONArray();
// JSONObject jsonObject, childNode;
// JSONArray nodeJsonArr;
// for (int i = 0; i < jsonArray.size(); i++) {
// jsonObject = jsonArray.getJSONObject(i);
// nodeJsonArr = jsonObject.getJSONArray(rootNode);
// for (int j = 0; j < nodeJsonArr.size(); j++) {
// childNode = nodeJsonArr.getJSONObject(j);
// for (String property : properties) {
// for (String key : jsonObject.keySet()) { // 忽略大小写
// if (key.toLowerCase().equals(property.toLowerCase())) {
// property = key;
// break;
// }
// }
// String propertyVal = jsonObject.getString(property);
// childNode.put(property, propertyVal);
// }
// result.add(childNode);
// }
// }
// return decodeList(JSON.toJSONString(result), clazz);
// }
//
//
// /**
// * 获取DataMap为bean
// *
// * @param clazz 类型
// * @return bean
// */
// public <T> T getDataMapBean(Class<T> clazz) {
// return decodeBean(JSONObject.toJSONString(this.dataMap), clazz);
// }
//
// /**
// * 获取DataMap为bean
// *
// * @param clazz 类型
// * @return bean
// */
// public <T> T getDataMapBean(Class<T> clazz, String rooNode, String... nodes) {
// JSONObject jsonObject = getJsonObject(rooNode, nodes);
// if (jsonObject == null) {
// jsonObject = new JSONObject();
// }
// return decodeBean(jsonObject.toJSONString(), clazz);
// }
//
//// /**
//// * 获取DataMap为bean
//// *
//// * @param rooNode 根节点
//// * @param nodes 子节点
//// * @return bean
//// */
//// public JSONObject getDataMapObject(String rooNode, String... nodes) {
//// JSONObject jsonObject = getJsonObject(rooNode, nodes);
//// if (jsonObject == null) {
//// jsonObject = new JSONObject();
//// }
//// return decodeBean(jsonObject.toJSONString());
//// }
//
//
// /**
// * 获取嵌套多层的JSONArray
// *
// * @param rooNode 根节点
// * @param nodes 子节点,可变长参数
// * @return json对象
// */
// public JSONObject getJsonObject(String rooNode, String... nodes) {
// Object rootObj = this.dataMap.get(rooNode);
// String result = rootObj == null ? new JSONObject().toJSONString() : rootObj.toString();
// try {
// JSONArray jsonArray = JSONArray.parseArray(result);
// if (jsonArray == null || jsonArray.size() == 0) {
// return new JSONObject();
// }
//
// JSONObject jsonObject = jsonArray.getJSONObject(0);
// if (jsonObject == null) {
// return new JSONObject();
// }
//
// if (nodes.length == 0) {
// result = jsonObject.toJSONString();
// }
//
// for (String node : nodes) {
// result = jsonObject.getJSONObject(node).toJSONString();
// }
// } catch (Exception e) {
// log.error("JSON数据转换失败");
// ErrorHelper.println(e);
// }
// return JSONObject.parseObject(result);
// }
//
//
// // ---------------------------------------------------------------
//
// /**
// * fastJson反序列化Bean
// *
// * @param json json
// * @param clazz 类型
// * @return bean
// */
// public static <T> T decodeBean(String json, Class<T> clazz) {
// return JSON.parseObject(json, clazz);
// }
//
// /**
// * fastJson反序列化List
// *
// * @param json json
// * @param clazz 类型
// * @return List<T>
// */
// public static <T> List<T> decodeList(String json, Class<T> clazz) {
// return decode(json, new TypeReference<List<T>>(clazz) {
// });
// }
//
//
// /**
// * fastJson反序列化
// *
// * @param json json
// * @param typeReference 类型
// * @return 反序列化后的值
// */
// public static <T> T decode(String json, TypeReference<T> typeReference) {
// try {
// return JSON.parseObject(json, typeReference);
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
// }
//
//
// /**
// * 递归-Element转JSONObject
// *
// * @param rootNode 根节点
// * @return JSONObject
// */
// public static JSONObject nodeToJsonObject(Element rootNode) {
// JSONObject result = new JSONObject();
// // 当前节点的名称、文本内容和属性
// for (Attribute attr : rootNode.attributes()) {// 遍历当前节点的所有属性
// result.put(attr.getName(), attr.getValue());
// }
//
// // 递归遍历当前节点所有的子节点
// List<Element> listElement = rootNode.elements();// 所有一级子节点的list
// if (!listElement.isEmpty()) {
// String name, val;
//
// for (Element e : listElement) {// 遍历所有一级子节点
// name = e.getName();
// val = e.getTextTrim();
// if (e.attributes().isEmpty() && e.elements().isEmpty()) // 判断一级节点是否有属性和子节点
// result.put(name, val.equals("") ? null : val); // 沒有则将当前节点作为上级节点的属性对待
// else {
// if (!result.containsKey(e.getName())) { // 判断父节点是否存在该一级节点名称的属性
// result.put(name, new JSONArray());// 没有则创建
// }
// JSONArray jsonArray = (JSONArray) result.get(name);
// jsonArray.add(nodeToJsonObject(e)); // 将该一级节点放入该节点名称的属性对应的值中
// }
// }
// }
// return result;
// }
//
//
//// public static void main(String[] args) {
//// String testXml = "<?xml version=\"1.0\" encoding=\"GB2312\"?><Response><TransactionCode>2001</TransactionCode><ResponseCode>0</ResponseCode><ResponseMessage>成功</ResponseMessage><Dept><Code>0201</Code><Name>急诊科</Name><Intro>全科医疗</Intro><Address>门诊楼</Address></Dept><Dept><Code>0202</Code><Name>院办</Name><Intro>全科医疗</Intro><Address></Address></Dept><Dept><Code>0203</Code><Name>重症医学科</Name><Intro>全科医疗</Intro><Address></Address></Dept><Dept><Code>0205</Code><Name>急诊科(二楼)</Name><Intro>全科医疗</Intro><Address>门诊二楼</Address></Dept><Dept><Code>0206</Code><Name>血液透析室</Name><Intro>全科医疗</Intro><Address>住院部一楼</Address></Dept><Dept><Code>0207</Code><Name>120急救中心</Name><Intro>全科医疗</Intro><Address></Address></Dept><Dept><Code>0301</Code><Name>内二科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(五</Address></Dept><Dept><Code>0304</Code><Name>门诊部(二楼)</Name><Intro>内科</Intro><Address>门诊二楼</Address></Dept><Dept><Code>0305</Code><Name>门诊部(三楼)</Name><Intro>内科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>0306</Code><Name>消化内科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(六</Address></Dept><Dept><Code>0307</Code><Name>心内科</Name><Intro>内科</Intro><Address>住院部五楼医生办公室</Address></Dept><Dept><Code>0308</Code><Name>呼吸科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(六</Address></Dept><Dept><Code>0309</Code><Name>精神心理科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(七</Address></Dept><Dept><Code>0310</Code><Name>内分泌科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(七</Address></Dept><Dept><Code>0311</Code><Name>内一科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(一</Address></Dept><Dept><Code>0312</Code><Name>肾内科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(六</Address></Dept><Dept><Code>0313</Code><Name>神经内科</Name><Intro>内科</Intro><Address>住院部四楼医生办公室</Address></Dept><Dept><Code>0401</Code><Name>外科</Name><Intro>外科</Intro><Address></Address></Dept><Dept><Code>0402</Code><Name>外一科</Name><Intro>外科</Intro><Address>住院部二楼</Address></Dept><Dept><Code>0403</Code><Name>外二科</Name><Intro>外科</Intro><Address>医技综合楼七楼</Address></Dept><Dept><Code>0404</Code><Name>外三科</Name><Intro>外科</Intro><Address>住院部三楼</Address></Dept><Dept><Code>0406</Code><Name>外(皮肤)科门诊</Name><Intro>外科</Intro><Address>门诊二楼</Address></Dept><Dept><Code>0501</Code><Name>妇产科</Name><Intro>妇产科</Intro><Address>门诊二楼</Address></Dept><Dept><Code>0712</Code><Name>儿科</Name><Intro>儿科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>1100</Code><Name>耳鼻咽喉科</Name><Intro>耳鼻咽喉科</Intro><Address>医技综合楼五楼</Address></Dept><Dept><Code>1101</Code><Name>五官科</Name><Intro>耳鼻咽喉科</Intro><Address>医技综合楼五楼</Address></Dept><Dept><Code>1201</Code><Name>口腔科</Name><Intro>口腔科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>1300</Code><Name>皮肤科</Name><Intro>皮肤科</Intro><Address>外科专家诊室</Address></Dept><Dept><Code>1601</Code><Name>抗病毒治疗室</Name><Intro>传染科</Intro><Address></Address></Dept><Dept><Code>1607</Code><Name>感染性疾病科</Name><Intro>传染科</Intro><Address></Address></Dept><Dept><Code>2100</Code><Name>中医康复科</Name><Intro>康复医学科</Intro><Address></Address></Dept><Dept><Code>2101</Code><Name>疼痛科门诊</Name><Intro>康复医学科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>3205</Code><Name>功能科</Name><Intro>医学影象科</Intro><Address></Address></Dept><Dept><Code>5001</Code><Name>中医科</Name><Intro>中医科</Intro><Address></Address></Dept><Dept><Code>5002</Code><Name>中医肛肠科门诊</Name><Intro>中医科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>5201</Code><Name>针灸科</Name><Intro>中西医结合</Intro><Address></Address></Dept></Response>";
//// // 对象封装
//// WsResult wsResult = WsResult.xmlToBean(testXml);
//// System.out.println(wsResult);
//// List<DeptBean> dept = wsResult.getDataMapList("Dept", DeptBean.class);
////
//// for (DeptBean d : dept) {
//// System.out.println(d);
//// }
//// }
//
// public HisResult() {
// }
//
// public HisResult(Integer responseCode, String responseMessage, String transactionCode, Map<String, Object> dataMap) {
// this.responseCode = responseCode;
// this.responseMessage = responseMessage;
// this.transactionCode = transactionCode;
// this.dataMap = dataMap;
// }
//
// public Integer getResponseCode() {
// return responseCode;
// }
//
// public void setResponseCode(Integer responseCode) {
// this.responseCode = responseCode;
// }
//
// public String getResponseMessage() {
// return responseMessage;
// }
//
// public void setResponseMessage(String responseMessage) {
// this.responseMessage = responseMessage;
// }
//
// public String getTransactionCode() {
// return transactionCode;
// }
//
// public void setTransactionCode(String transactionCode) {
// this.transactionCode = transactionCode;
// }
//
// public Map<String, Object> getDataMap() {
// return dataMap;
// }
//
// public void setDataMap(Map<String, Object> dataMap) {
// this.dataMap = dataMap;
// }
//
// @Override
// public String toString() {
// return "WsResult{" +
// "responseCode=" + responseCode +
// ", responseMessage='" + responseMessage + '\'' +
// ", transactionCode='" + transactionCode + '\'' +
// ", dataMap=" + dataMap +
// '}';
// }
//}
//
//package com.ynxbd.common.his;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.fastjson.TypeReference;
//import com.ynxbd.common.helper.common.ErrorHelper;
//import org.dom4j.Attribute;
//import org.dom4j.Element;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.math.BigDecimal;
//import java.util.List;
//import java.util.Map;
//
///**
// * HIS响应数据
// *
// * @Author wsq
// * @Date 2020/7/29 13:26
// * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved.
// */
//
//public class HisResult {
// private final static Logger log = LoggerFactory.getLogger(HisResult.class);
//
// // 响应状态码
// private Integer responseCode;
// // 响应信息
// private String responseMessage;
// // HIS响应码
// private String transactionCode;
// // 数据
// private Map<String, Object> dataMap;
//
//
// /**
// * 创建一个异常信息
// *
// * @param message 异常信息
// * @return 模拟his异常信息
// */
// public static HisResult createErrorHisResult(String message) {
// HisResult hisResult = new HisResult();
// hisResult.setResponseCode(500); //
// hisResult.setResponseMessage(message);
// return hisResult;
// }
//
//
// /**
// * 获取DataMap的值 String
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public String getDataMapString(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// if (val == null) {
// return null;
// }
// String v = val.toString().trim();
// return "".equals(v) ? null : v;
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
// /**
// * 获取DataMap的值 BigDecimal
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public BigDecimal getDataMapBigDecimal(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : new BigDecimal(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
// /**
// * 获取DataMap的值 Integer
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public Integer getDataMapInteger(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : Integer.parseInt(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
// /**
// * 获取DataMap的值 Boolean
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public Boolean getDataMapBoolean(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : Boolean.parseBoolean(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
//
// /**
// * 获取DataMap的值 Long
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public Long getDataMapLong(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : Long.parseLong(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
//
// /**
// * 获取DataMap的值 Double
// *
// * @param nodeName 节点名称
// * @return nodeVal 节点值
// */
// public Double getDataMapDouble(String nodeName) {
// try {
// Object val = this.dataMap.get(nodeName);
// return val == null ? null : Double.parseDouble(val.toString());
// } catch (Exception e) {
// ErrorHelper.println(e);
// return null;
// }
// }
//
//
// /**
// * 获取根节点包含相同节点数据
// * 如:
// * <roots>
// * # <root>1</root>
// * # <root>2</root>
// * </roots>
// *
// * @param clazz 类型
// * @param rootNode 根节点名
// * @param nodes 子节点名,可变长参数
// * @return 集合
// */
// public <T> List<T> getDataMapList(Class<T> clazz, String rootNode, String... nodes) {
// JSONArray jsonArray = getJsonArray(rootNode, nodes);
// return decodeList(jsonArray.toString(), clazz);
// }
//
//
// /**
// * 获取嵌套多层的JSONArray
// *
// * @param rooNode 根节点
// * @param nodes 子节点,可变长参数
// * @return json数组
// */
// public JSONArray getJsonArray(String rooNode, String... nodes) {
// Object rootObj = this.dataMap.get(rooNode);
// String result = rootObj == null ? JSON.toJSONString(new JSONArray()) : rootObj.toString();
// try {
// JSONArray jsonArray;
// JSONObject jsonObject;
// for (String node : nodes) {
// jsonArray = JSONArray.parseArray(result);
// if (jsonArray == null || jsonArray.size() == 0) {
// return new JSONArray();
// }
// if (jsonArray.size() == 1) { // 如果只有一个值继续处理
// jsonObject = jsonArray.getJSONObject(0);
// result = JSON.toJSONString(jsonObject.getJSONArray(node));
// } else { // 如果有多个值返回当前数组
// result = JSON.toJSONString(jsonArray);
// }
// }
// } catch (Exception e) {
// log.error("JSON数据转换失败");
// ErrorHelper.println(e);
// }
// return JSONArray.parseArray(result);
// }
//
//
// /**
// * JSON树形结构数据向下JSONArray中传递
// *
// * @param jsonArray 根节点
// * @param properties 节点属性,可变长参数
// * @return JSONArray
// */
// public <T> List<T> jsonParentToChild(Class<T> clazz, JSONArray jsonArray, String rootNode, String... properties) {
// JSONArray result = new JSONArray();
// JSONObject jsonObject, childNode;
// JSONArray nodeJsonArr;
// for (int i = 0; i < jsonArray.size(); i++) {
// jsonObject = jsonArray.getJSONObject(i);
// nodeJsonArr = jsonObject.getJSONArray(rootNode);
// for (int j = 0; j < nodeJsonArr.size(); j++) {
// childNode = nodeJsonArr.getJSONObject(j);
// for (String property : properties) {
// for (String key : jsonObject.keySet()) { // 忽略大小写
// if (key.toLowerCase().equals(property.toLowerCase())) {
// property = key;
// break;
// }
// }
// String propertyVal = jsonObject.getString(property);
// childNode.put(property, propertyVal);
// }
// result.add(childNode);
// }
// }
// return decodeList(JSON.toJSONString(result), clazz);
// }
//
//
// /**
// * 获取DataMap为bean
// *
// * @param clazz 类型
// * @return bean
// */
// public <T> T getDataMapBean(Class<T> clazz) {
// return decodeBean(JSONObject.toJSONString(this.dataMap), clazz);
// }
//
// /**
// * 获取DataMap为bean
// *
// * @param clazz 类型
// * @return bean
// */
// public <T> T getDataMapBean(Class<T> clazz, String rooNode, String... nodes) {
// JSONObject jsonObject = getJsonObject(rooNode, nodes);
// if (jsonObject == null) {
// jsonObject = new JSONObject();
// }
// return decodeBean(jsonObject.toJSONString(), clazz);
// }
//
//// /**
//// * 获取DataMap为bean
//// *
//// * @param rooNode 根节点
//// * @param nodes 子节点
//// * @return bean
//// */
//// public JSONObject getDataMapObject(String rooNode, String... nodes) {
//// JSONObject jsonObject = getJsonObject(rooNode, nodes);
//// if (jsonObject == null) {
//// jsonObject = new JSONObject();
//// }
//// return decodeBean(jsonObject.toJSONString());
//// }
//
//
// /**
// * 获取嵌套多层的JSONArray
// *
// * @param rooNode 根节点
// * @param nodes 子节点,可变长参数
// * @return json对象
// */
// public JSONObject getJsonObject(String rooNode, String... nodes) {
// Object rootObj = this.dataMap.get(rooNode);
// String result = rootObj == null ? new JSONObject().toJSONString() : rootObj.toString();
// try {
// JSONArray jsonArray = JSONArray.parseArray(result);
// if (jsonArray == null || jsonArray.size() == 0) {
// return new JSONObject();
// }
//
// JSONObject jsonObject = jsonArray.getJSONObject(0);
// if (jsonObject == null) {
// return new JSONObject();
// }
//
// if (nodes.length == 0) {
// result = jsonObject.toJSONString();
// }
//
// for (String node : nodes) {
// result = jsonObject.getJSONObject(node).toJSONString();
// }
// } catch (Exception e) {
// log.error("JSON数据转换失败");
// ErrorHelper.println(e);
// }
// return JSONObject.parseObject(result);
// }
//
//
// // ---------------------------------------------------------------
//
// /**
// * fastJson反序列化Bean
// *
// * @param json json
// * @param clazz 类型
// * @return bean
// */
// public static <T> T decodeBean(String json, Class<T> clazz) {
// return JSON.parseObject(json, clazz);
// }
//
// /**
// * fastJson反序列化List
// *
// * @param json json
// * @param clazz 类型
// * @return List<T>
// */
// public static <T> List<T> decodeList(String json, Class<T> clazz) {
// return decode(json, new TypeReference<List<T>>(clazz) {
// });
// }
//
//
// /**
// * fastJson反序列化
// *
// * @param json json
// * @param typeReference 类型
// * @return 反序列化后的值
// */
// public static <T> T decode(String json, TypeReference<T> typeReference) {
// try {
// return JSON.parseObject(json, typeReference);
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
// }
//
//
// /**
// * 递归-Element转JSONObject
// *
// * @param rootNode 根节点
// * @return JSONObject
// */
// public static JSONObject nodeToJsonObject(Element rootNode) {
// JSONObject result = new JSONObject();
// // 当前节点的名称、文本内容和属性
// for (Attribute attr : rootNode.attributes()) {// 遍历当前节点的所有属性
// result.put(attr.getName(), attr.getValue());
// }
//
// // 递归遍历当前节点所有的子节点
// List<Element> listElement = rootNode.elements();// 所有一级子节点的list
// if (!listElement.isEmpty()) {
// String name, val;
//
// for (Element e : listElement) {// 遍历所有一级子节点
// name = e.getName();
// val = e.getTextTrim();
// if (e.attributes().isEmpty() && e.elements().isEmpty()) // 判断一级节点是否有属性和子节点
// result.put(name, val.equals("") ? null : val); // 沒有则将当前节点作为上级节点的属性对待
// else {
// if (!result.containsKey(e.getName())) { // 判断父节点是否存在该一级节点名称的属性
// result.put(name, new JSONArray());// 没有则创建
// }
// JSONArray jsonArray = (JSONArray) result.get(name);
// jsonArray.add(nodeToJsonObject(e)); // 将该一级节点放入该节点名称的属性对应的值中
// }
// }
// }
// return result;
// }
//
//
//// public static void main(String[] args) {
//// String testXml = "<?xml version=\"1.0\" encoding=\"GB2312\"?><Response><TransactionCode>2001</TransactionCode><ResponseCode>0</ResponseCode><ResponseMessage>成功</ResponseMessage><Dept><Code>0201</Code><Name>急诊科</Name><Intro>全科医疗</Intro><Address>门诊楼</Address></Dept><Dept><Code>0202</Code><Name>院办</Name><Intro>全科医疗</Intro><Address></Address></Dept><Dept><Code>0203</Code><Name>重症医学科</Name><Intro>全科医疗</Intro><Address></Address></Dept><Dept><Code>0205</Code><Name>急诊科(二楼)</Name><Intro>全科医疗</Intro><Address>门诊二楼</Address></Dept><Dept><Code>0206</Code><Name>血液透析室</Name><Intro>全科医疗</Intro><Address>住院部一楼</Address></Dept><Dept><Code>0207</Code><Name>120急救中心</Name><Intro>全科医疗</Intro><Address></Address></Dept><Dept><Code>0301</Code><Name>内二科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(五</Address></Dept><Dept><Code>0304</Code><Name>门诊部(二楼)</Name><Intro>内科</Intro><Address>门诊二楼</Address></Dept><Dept><Code>0305</Code><Name>门诊部(三楼)</Name><Intro>内科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>0306</Code><Name>消化内科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(六</Address></Dept><Dept><Code>0307</Code><Name>心内科</Name><Intro>内科</Intro><Address>住院部五楼医生办公室</Address></Dept><Dept><Code>0308</Code><Name>呼吸科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(六</Address></Dept><Dept><Code>0309</Code><Name>精神心理科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(七</Address></Dept><Dept><Code>0310</Code><Name>内分泌科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(七</Address></Dept><Dept><Code>0311</Code><Name>内一科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(一</Address></Dept><Dept><Code>0312</Code><Name>肾内科</Name><Intro>内科</Intro><Address>门诊三楼内科专家(六</Address></Dept><Dept><Code>0313</Code><Name>神经内科</Name><Intro>内科</Intro><Address>住院部四楼医生办公室</Address></Dept><Dept><Code>0401</Code><Name>外科</Name><Intro>外科</Intro><Address></Address></Dept><Dept><Code>0402</Code><Name>外一科</Name><Intro>外科</Intro><Address>住院部二楼</Address></Dept><Dept><Code>0403</Code><Name>外二科</Name><Intro>外科</Intro><Address>医技综合楼七楼</Address></Dept><Dept><Code>0404</Code><Name>外三科</Name><Intro>外科</Intro><Address>住院部三楼</Address></Dept><Dept><Code>0406</Code><Name>外(皮肤)科门诊</Name><Intro>外科</Intro><Address>门诊二楼</Address></Dept><Dept><Code>0501</Code><Name>妇产科</Name><Intro>妇产科</Intro><Address>门诊二楼</Address></Dept><Dept><Code>0712</Code><Name>儿科</Name><Intro>儿科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>1100</Code><Name>耳鼻咽喉科</Name><Intro>耳鼻咽喉科</Intro><Address>医技综合楼五楼</Address></Dept><Dept><Code>1101</Code><Name>五官科</Name><Intro>耳鼻咽喉科</Intro><Address>医技综合楼五楼</Address></Dept><Dept><Code>1201</Code><Name>口腔科</Name><Intro>口腔科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>1300</Code><Name>皮肤科</Name><Intro>皮肤科</Intro><Address>外科专家诊室</Address></Dept><Dept><Code>1601</Code><Name>抗病毒治疗室</Name><Intro>传染科</Intro><Address></Address></Dept><Dept><Code>1607</Code><Name>感染性疾病科</Name><Intro>传染科</Intro><Address></Address></Dept><Dept><Code>2100</Code><Name>中医康复科</Name><Intro>康复医学科</Intro><Address></Address></Dept><Dept><Code>2101</Code><Name>疼痛科门诊</Name><Intro>康复医学科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>3205</Code><Name>功能科</Name><Intro>医学影象科</Intro><Address></Address></Dept><Dept><Code>5001</Code><Name>中医科</Name><Intro>中医科</Intro><Address></Address></Dept><Dept><Code>5002</Code><Name>中医肛肠科门诊</Name><Intro>中医科</Intro><Address>门诊三楼</Address></Dept><Dept><Code>5201</Code><Name>针灸科</Name><Intro>中西医结合</Intro><Address></Address></Dept></Response>";
//// // 对象封装
//// WsResult wsResult = WsResult.xmlToBean(testXml);
//// System.out.println(wsResult);
//// List<DeptBean> dept = wsResult.getDataMapList("Dept", DeptBean.class);
////
//// for (DeptBean d : dept) {
//// System.out.println(d);
//// }
//// }
//
// public HisResult() {
// }
//
// public HisResult(Integer responseCode, String responseMessage, String transactionCode, Map<String, Object> dataMap) {
// this.responseCode = responseCode;
// this.responseMessage = responseMessage;
// this.transactionCode = transactionCode;
// this.dataMap = dataMap;
// }
//
// public Integer getResponseCode() {
// return responseCode;
// }
//
// public void setResponseCode(Integer responseCode) {
// this.responseCode = responseCode;
// }
//
// public String getResponseMessage() {
// return responseMessage;
// }
//
// public void setResponseMessage(String responseMessage) {
// this.responseMessage = responseMessage;
// }
//
// public String getTransactionCode() {
// return transactionCode;
// }
//
// public void setTransactionCode(String transactionCode) {
// this.transactionCode = transactionCode;
// }
//
// public Map<String, Object> getDataMap() {
// return dataMap;
// }
//
// public void setDataMap(Map<String, Object> dataMap) {
// this.dataMap = dataMap;
// }
//
// @Override
// public String toString() {
// return "WsResult{" +
// "responseCode=" + responseCode +
// ", responseMessage='" + responseMessage + '\'' +
// ", transactionCode='" + transactionCode + '\'' +
// ", dataMap=" + dataMap +
// '}';
// }
//}
//

@ -8,7 +8,7 @@ import com.ynxbd.common.bean.pay.PayInHosp;
import com.ynxbd.common.dao.InHospPayDao;
import com.ynxbd.common.dao.RefundDao;
import com.ynxbd.common.dao.his.HisInHospDao;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
@ -58,7 +58,7 @@ public class InHospService {
PayService.saveOrderNo(PEnum.IN_HOSP, outTradeNo, openid, payInfo, null);
String tradeNo = HisHelper.getHisTradeNo(bankTransNo, PEnum.IN_HOSP);
String tradeNo = HisFactory.getHisTradeNo(bankTransNo, PEnum.IN_HOSP);
log.info("{} [住院预交金]收到微信通知,支付成功:outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo);
if (!inHospPayDao.updateWxPaid(outTradeNo, bankTransNo, tradeNo)) {
log.error("{} [住院预交金]更改订单状态失败 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo);
@ -133,7 +133,7 @@ public class InHospService {
throw new ServiceException(ResultEnum.REFUND_MONEY_ERROR);
}
String outRefundNo = HisHelper.getHisTradeNo(bankTransNo, pEnum);
String outRefundNo = HisFactory.getHisTradeNo(bankTransNo, pEnum);
Order orderRefund = PayService.refund(merchantEnum, outTradeNo, outRefundNo, refundMoney, payInHosp.getTotalFee(), refundDesc, payInHosp.getUpdateTime(), payInHosp.getOpenid(), payInHosp.getPatientId(), null);
boolean isResult = orderRefund.isSuccess();
@ -168,22 +168,26 @@ public class InHospService {
/**
* [住院记录]通过患者ID查询出院后
* [住院]通过患者ID查询住院记录出院后
*
* @param patientId 患者id
*/
public List<InHospitalList> queryHisOutPatientRecords(String patientId) throws ServiceException {
JsonResult resp = new HisInHospDao().queryOutPatientRecords(patientId, null); // 非医保
JsonResult resp = new HisInHospDao().queryOutPatientRecords(patientId, null, false); // 非医保
if (!resp.success()) {
throw new ServiceException(resp.getMessage());
}
List<InHospitalList> inHospList = resp.getDataMapList(InHospitalList.class, "Items", "Item");
JsonResult medResp = new HisInHospDao().queryOutPatientRecords(patientId, "1"); // 医保
if (!medResp.success()) {
throw new ServiceException(medResp.getMessage());
List<InHospitalList> medInHospList = new ArrayList<>();
if ("192970".equals(patientId)) {
JsonResult medResp = new HisInHospDao().queryOutPatientRecords(patientId, "1", true); // 医保
if (!medResp.success()) {
throw new ServiceException(medResp.getMessage());
}
medInHospList = medResp.getDataMapList(InHospitalList.class, "Items", "Item");
}
List<InHospitalList> medInHospList = medResp.getDataMapList(InHospitalList.class, "Items", "Item");
List<InHospitalList> dataList = new ArrayList<>();
for (InHospitalList item : medInHospList) {

@ -52,8 +52,8 @@ public class MedicalService {
regPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
break;
case IN_HOSP:
inHospPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
case OUT_HOSP: // 住院结算
outHospPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
break;
default:
@ -101,11 +101,10 @@ public class MedicalService {
String payAuthNo = getPayAuthNo(merchantEnum, openid, qrCode, cardNo, realName);
log.info("{}[HIS医保上传明细][挂号]patientId={}, cardNo={}, realName={}, reg={}", merchantEnum.NAME, patientId, ParamHelper.hideIdCardNo(cardNo), realName, reg);
JsonResult result = HisMedDao.regMedUploadDetails(merchantEnum, reg, payAuthNo, cardNo, isSplitTime);
return hisMedPlaceOrder(merchantEnum, payAuthNo, result);
return noticeHiCreateMedOrder(merchantEnum, payAuthNo, result);
}
/**
* [HIS医保上传明细]处方上报
*
@ -135,11 +134,11 @@ public class MedicalService {
// [验收]测试报告内容[2]
log.info("{}[HIS医保上传明细][处方] req={patientId:\"{}\", treatNum:\"{}\", totalFee:\"{}\", cardNo:\"{}\", recipeJson:\"{}\"}", merchantEnum.NAME, patientId, treatNum, totalFee, cardNo, recipeJson);
JsonResult result = HisMedDao.rxMedUploadDetails(merchantEnum, payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName);
return hisMedPlaceOrder(merchantEnum, payAuthNo, result);
return noticeHiCreateMedOrder(merchantEnum, payAuthNo, result);
}
public MedicalInfo hisInHospUploadDetails(MerchantEnum merchantEnum, String qrCode, String openid, String treatNum, String patientId, String hisPatientId, String cardNo, String realName) throws ServiceException {
public MedicalInfo hisOutHospUploadDetails(MerchantEnum merchantEnum, String qrCode, String openid, String treatNum, String patientId, String hisPatientId, String cardNo, String realName) throws ServiceException {
String payAuthNo;
if (merchantEnum == MerchantEnum.ALI_MEDICAL) { // 支付宝
payAuthNo = qrCode;
@ -149,8 +148,66 @@ public class MedicalService {
}
log.info("{}[HIS医保上传明细][住院结算] treatNum={}, patientId={}, cardNo={}, realName={}", merchantEnum.NAME, treatNum, patientId, ParamHelper.hideIdCardNo(cardNo), realName);
JsonResult result = HisMedDao.inHospMedUploadDetails(merchantEnum, payAuthNo, cardNo, treatNum);
return hisMedPlaceOrder(merchantEnum, payAuthNo, result);
JsonResult result = HisMedDao.outHospMedUploadDetails(merchantEnum, payAuthNo, cardNo, treatNum);
if (result == null) {
throw new ServiceException("[医保]返回数据为空");
}
if (!result.success()) {
log.info("[医保-住院结算]费用明细上传失败 message={}", result.getMessage());
throw new ServiceException(result.getMessage());
}
String payOrdId = result.getDataMapString("PayOrdId");
String payToken = result.getDataMapString("PayToken");
String mdTrtId = result.getDataMapString("MdtrtId"); // 医保就诊ID
String chrgBchno = result.getDataMapString("ChrgBchno"); // 医疗机构订单号、收费批次号
String mdUserId = result.getDataMapString("UserID_YBZF"); // 医保用户ID
// 住院=========
String payOrRefundMoney = result.getDataMapString("PayOrRefundMoney"); // 缴退金额[大于0时需要微信收取费用,小于0时需要微信退费]
String prePayOrderId = result.getDataMapString("PrePayOrderId"); // 预交金缴费单号[需要退费时,his返回预交金时候的单号给微信退费。可能存在退多比微信预交金费用,字段具体内容后续协商后敲定]
String ordStas = result.getDataMapString("OrdStas"); //
BigDecimal deposit = result.getDataMapBigDecimal("Deposit"); // 住院押金(医保6202返回)
log.info("[医保-住院结算]HIS费用上传明细接口返回 payAuthNo={}, payOrdId={}, payToken={}, mdtrtId={}, chrgBchno={}, userIdYBZF={}", payAuthNo, payOrdId, payToken, mdTrtId, chrgBchno, mdUserId);
if (payOrdId == null || payToken == null || mdTrtId == null || chrgBchno == null) {
throw new ServiceException("[医保]费用明细上传参数缺失");
}
MedicalInfo medicalInfo = new MedicalInfo();
medicalInfo.setPayAuthNo(payAuthNo);
medicalInfo.setPayToken(payToken);
medicalInfo.setPayOrdId(payOrdId);
medicalInfo.setMdTrtId(mdTrtId);
medicalInfo.setChrgBchno(chrgBchno);
medicalInfo.setMdUserId(mdUserId);
BigDecimal totalFee = result.getDataMapBigDecimal("FeeSumamt"); // 订单总金额医保返回
BigDecimal hifpFee = result.getDataMapBigDecimal("FundPay"); // 统筹金额[基金金额]
BigDecimal hisOwnPayAmt = result.getDataMapBigDecimal("OwnPayAmt"); // 现金支付(医保6202返回)
BigDecimal hisPsnAcctPay = result.getDataMapBigDecimal("PsnAcctPay"); // 个人账户支出(医保6202返回)
log.info("[医保-住院结算]HIS费用上传明细接口返回2 payOrdId={}, hifpFee={}, hisOwnPayAmt={}, hisPsnAcctPay={}",
payOrdId, hifpFee, hisOwnPayAmt, hisPsnAcctPay);
String extData = result.getDataMapString("ExtData");
log.info("[医保-住院结算]扩展数据 extData={}", extData);
if (extData == null || totalFee == null) {
throw new ServiceException("[上传明细失败]响应参数缺失 extData is null");
}
JSONObject extDataJson = JsonHelper.parseObject(extData);
JSONObject preSetl = extDataJson.getJSONObject("preSetl");
medicalInfo.setMedFeeSumAmt(new BigDecimal(preSetl.getString("medfee_sumamt"))); // 医保金额
medicalInfo.setCashFee(new BigDecimal(preSetl.getString("psn_cash_pay"))); // 现金支付
BigDecimal acctPay = new BigDecimal(preSetl.getString("acct_pay")); // 个人账户支付
// BigDecimal hifpPay = new BigDecimal(preSetl.getString("hifp_pay"));
medicalInfo.setAcctFee(acctPay); // 个人账户支付
medicalInfo.setHifpFee(hifpFee); // 统筹支付金额
medicalInfo.setTotalFee(totalFee); // 医保订单总金额
medicalInfo.setInsuranceFee(acctPay.add(hifpFee)); // (个账 + 统筹)
log.info("[医保-住院结算]结算完成返回数据 medicalFee={}", medicalInfo);
return medicalInfo;
}
@ -159,7 +216,7 @@ public class MedicalService {
*
* @param payAuthNo 授权码
*/
private MedicalInfo hisMedPlaceOrder(MerchantEnum merchantEnum, String payAuthNo, JsonResult result) throws ServiceException {
private MedicalInfo noticeHiCreateMedOrder(MerchantEnum merchantEnum, String payAuthNo, JsonResult result) throws ServiceException {
if (result == null) {
throw new ServiceException("[医保]返回数据为空");
}
@ -194,7 +251,7 @@ public class MedicalService {
BigDecimal totalFee = resp.getDataMapBigDecimal("FeeSumamt"); // 订单总金额医保返回
String extData = resp.getDataMapString("ExtData");
log.info("extData={}", extData);
log.info("[医保]扩展数据 extData={}", extData);
if (extData == null || totalFee == null) {
throw new ServiceException("[上传明细失败]响应参数缺失 extData is null");
}
@ -218,11 +275,32 @@ public class MedicalService {
}
// 创建医保订单
private MedCreateOrder createMIOrder(MerchantEnum merchantEnum, OrderMIEnum orderMIEnum, boolean hasDBOrder, String orderTitle, String payOpenId, String msgOpenId, String outTradeNo, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String chrgBchno,
BigDecimal totalFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType,
String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) throws ServiceException {
private MedCreateOrder createMedOrder(MerchantEnum merchantEnum, OrderMIEnum orderMIEnum, boolean hasDBOrder, String orderTitle, Order order, PEnum serverEnum) throws ServiceException {
String notifyType = serverEnum.CODE;
MedCreateOrder medCreateOrder = new MedCreateOrder();
String ip = order.getIp();
String payOpenId = order.getPayOpenId();
String msgOpenId = order.getOpenid();
String outTradeNo = order.getOutTradeNo();
String chrgBchno = order.getChrgBchno();
String cardNo = order.getIdCardNo();
String realName = order.getPatientName();
String payOrdId = order.getPayOrdId();
String payAuthNo = order.getPayAuthNo();
BigDecimal totalFee = order.getTotalFee();
BigDecimal insuranceFee = order.getInsuranceFee();
BigDecimal cashFee = order.getPayMoney();
String familyType = order.getFamilyType();
String familyName = order.getFamilyName();
String familyCardNo = order.getFamilyCardNo();
String medicalCardInstId = order.getMedicalCardInstId();
String medicalCardId = order.getMedicalCardId();
log.info("[医保][{}]下单 hasDBOrder={}, payOpenId={}, msgOpenId={}, patientId={}, treatNum={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, hifpFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}",
serverEnum.NAME, hasDBOrder, payOpenId, msgOpenId, order.getPatientId(), order.getTreatNum(), outTradeNo, payOrdId, payAuthNo, totalFee, order.getAcctFee(), order.getHifpFee(), order.getPayMoney(), ParamHelper.hideIdCardNo(order.getIdCardNo()), order.getPatientName(), familyType, familyName, medicalCardId,medicalCardInstId);
if (ObjectUtils.isEmpty(payOpenId)) {
payOpenId = msgOpenId;
}
@ -254,7 +332,7 @@ public class MedicalService {
throw new ServiceException("【支付宝】医保授权码medicalCardId为空");
}
Order order = hasDBOrder ? AliMedHelper.queryTrade(outTradeNo, null) : new Order();
order = hasDBOrder ? AliMedHelper.queryTrade(outTradeNo, null) : new Order();
String notifyUrl = WeChatConfig.getHttpsBaseURL() + merchantEnum.getNotifyUrl(outTradeNo, notifyType);
Map<String, Object> map = AliMedHelper.createOrder(orderMIEnum,
msgOpenId,
@ -284,21 +362,19 @@ public class MedicalService {
/**
* [医保]处方下单
*/
public Result createRxOrder(String payCode, String payOpenId, String openid, String patientId, String cardNo, String realName, String ip, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId, BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType,
String recipeJson, String treatNum, String payWay, String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) {
Result result = PayService.isPaymentPermittedByTime();
if (result != null) {
return result;
}
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常
return Result.error(ResultEnum.PAY_TYPE_ERROR);
public Result createRxOrder(MerchantEnum merchantEnum, Recipe order, PEnum serverEnum, String recipeJson, String payWay) {
String treatNum = order.getTreatNum();
String payOrdId = order.getPayOrdId();
String outTradeNo = order.getOutTradeNo();
if (ObjectUtils.isEmpty(outTradeNo) || ObjectUtils.isEmpty(payOrdId) || ObjectUtils.isEmpty(treatNum)) {
log.info("[医保][处方]参数缺失 outTradeNo={}, payOrdId={}, treatNum={}", outTradeNo, payOrdId, treatNum);
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
// 0:公众号内支付,1:扫码支付
payWay = payWay == null ? "0" : payWay;
String outTradeNo = merchantEnum.createOutTradeNo();
Recipe rxInfo = new RecipeService().recipeJsonToInfo(treatNum, recipeJson);
log.info("[医保][处方]JSON解析 RxInfo={}", rxInfo);
if (rxInfo == null) {
@ -320,62 +396,42 @@ public class MedicalService {
}
hasDBOrder = true;
outTradeNo = findOrder.getOutTradeNo();
order.setOutTradeNo(outTradeNo);
}
}
log.info("[医保][处方]下单 hasDBOrder={}, openid={}, patientId={}, treatNum={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, hifpFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}", hasDBOrder, openid, patientId, treatNum, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, hifpFee, cashFee, cardNo, realName, familyType, familyName, medicalCardId, medicalCardInstId);
String orderTitle = "门诊号:" + treatNum;
MedCreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.DIAG_PAY, hasDBOrder, orderTitle, payOpenId, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno,
totalFee, insuranceFee, cashFee, notifyType,
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
MedCreateOrder medOrder = createMedOrder(merchantEnum, OrderMIEnum.DIAG_PAY, hasDBOrder, orderTitle, order, serverEnum);
if (!miOrder.hasMapData()) {
if (!medOrder.hasMapData()) {
return Result.error(ResultEnum.PAY_ERROR_ORDER);
}
String bankTransNo = miOrder.mapGetBankTansNo();
Recipe addRecipe = new Recipe();
addRecipe.setOutTradeNo(outTradeNo);
addRecipe.setTradeNo(payOrdId);
addRecipe.setPayOrdId(payOrdId);
String bankTransNo = medOrder.mapGetBankTansNo();
order.setBankTransNo(bankTransNo);
order.setPayWay(payWay);
// -------------------------------------------
addRecipe.setChrgBchno(chrgBchno);
addRecipe.setMdUserId(mdUserId);
addRecipe.setMdTrtId(mdTrtId);
addRecipe.setRecipeJson(recipeJsonStr);
addRecipe.setDeptCode(rxInfo.getDeptCode());
addRecipe.setDeptName(rxInfo.getDeptName());
addRecipe.setReqDeptCode(rxInfo.getReqDeptCode());
addRecipe.setReqDeptName(rxInfo.getReqDeptName());
order.setRecipeJson(recipeJsonStr);
order.setDeptCode(rxInfo.getDeptCode());
order.setDeptName(rxInfo.getDeptName());
order.setReqDeptCode(rxInfo.getReqDeptCode());
order.setReqDeptName(rxInfo.getReqDeptName());
//
addRecipe.setPayMoney(cashFee); // 现金
addRecipe.setAcctFee(acctFee);
addRecipe.setHifpFee(hifpFee);
addRecipe.setTotalFee(totalFee);
//
addRecipe.setPayWay(payWay);
addRecipe.setOpenid(openid);
addRecipe.setPatientId(patientId);
addRecipe.setTreatNum(treatNum);
addRecipe.setBankTransNo(bankTransNo);
addRecipe.setPayStatus(-1);
addRecipe.setHisStatus(-1);
addRecipe.setPayMchCode(merchantEnum.CODE);
addRecipe.setPayOpenId(payOpenId);
Map<String, Object> map = miOrder.getMap();
if (miOrder.hasCreateMerOrder()) { // 订单已发起支付
order.setPayStatus(-1);
order.setHisStatus(-1);
Map<String, Object> map = medOrder.getMap();
if (medOrder.hasCreateMerOrder()) { // 订单已发起支付
log.info("[医保][处方]订单已发起支付 hasDBOrder={}, outTradeNo={}, payOrdId={}", hasDBOrder, outTradeNo, payOrdId);
return Result.error(ResultEnum.PAY_REPEAT);
} else {
if (hasDBOrder) {
log.info("[医保][处方]已有订单 hasDBOrder={}, outTradeNo={}, rxInfo={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(addRecipe));
log.info("[医保][处方]已有订单 hasDBOrder={}, outTradeNo={}, order={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(order));
return Result.success(map);
}
}
if (!recipeDao.insertMedical(addRecipe)) {
if (!recipeDao.insertMedical(order)) {
return Result.error(ResultEnum.DATA_INSERT_ERROR);
}
return Result.success(map);
@ -389,28 +445,17 @@ public class MedicalService {
/**
* [医保]挂号下单
*/
public Result createRegOrder(String payCode, String payOpenId, String openid, String patientId, String cardNo, String realName, String hisPatientId, String ip, String payOrdId, String payAuthNo, String mdTrtId, String chrgBchno, String mdUserId, BigDecimal totalFee, BigDecimal acctFee, BigDecimal hifpFee, BigDecimal insuranceFee, BigDecimal cashFee, String notifyType, Register reg,
String familyType, String familyName, String familyCardNo, String medicalCardInstId, String medicalCardId) {
reg.setOpenid(openid);
reg.setPatientId(patientId);
reg.setHisPatientId(hisPatientId);
reg.setIdCardNo(cardNo);
Result result = PayService.isPaymentPermittedByTime();
if (result != null) {
return result;
public Result createRegOrder(MerchantEnum merchantEnum, Register order, PEnum serverEnum) {
String payOrdId = order.getPayOrdId();
String outTradeNo = order.getOutTradeNo();
if (ObjectUtils.isEmpty(outTradeNo) || ObjectUtils.isEmpty(payOrdId)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(payCode);
if (merchantEnum == null) { // 支付方式异常
return Result.error(ResultEnum.PAY_TYPE_ERROR);
}
String outTradeNo = merchantEnum.createOutTradeNo();
try {
boolean hasDBOrder = false;
RegisterDao regDao = new RegisterDao();
if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付取消支付可重新支付
if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付宝取消支付可重新支付
Order findOrder = regDao.selectMIOrderByPayOrdId(payOrdId);
if (findOrder != null) {
if (findOrder.hasPayStatusPaid()) {
@ -418,51 +463,99 @@ public class MedicalService {
}
hasDBOrder = true;
outTradeNo = findOrder.getOutTradeNo();
order.setOutTradeNo(outTradeNo);
}
}
String treatNum = reg.getTreatNum();
log.info("[医保][挂号]下单 hasDBOrder={}, openid={}, patientId={}, treatNum={}, outTradeNo={}, payOrdId={}, payAuthNo={}, totalFee={}, acctFee={}, hifpFee={}, cashFee={}, idCardNo={}, realName={}, familyType={}, familyName={}, medicalCardId={}, medicalCardInstId={}", hasDBOrder, openid, patientId, treatNum, outTradeNo, payOrdId, payAuthNo, totalFee, acctFee, hifpFee, cashFee, cardNo, realName, familyType, familyName, medicalCardId, medicalCardInstId);
String orderTitle = "挂号";
MedCreateOrder miOrder = createMIOrder(merchantEnum, OrderMIEnum.REG_PAY, hasDBOrder, orderTitle, payOpenId, openid, outTradeNo, cardNo, realName, ip, payOrdId, payAuthNo, chrgBchno,
totalFee, insuranceFee, cashFee, notifyType,
familyType, familyName, familyCardNo, medicalCardInstId, medicalCardId);
MedCreateOrder medOrder = createMedOrder(merchantEnum, OrderMIEnum.REG_PAY, hasDBOrder, orderTitle, order, serverEnum);
if (!miOrder.hasMapData()) {
if (!medOrder.hasMapData()) {
return Result.error(ResultEnum.PAY_ERROR_ORDER);
}
String bankTransNo = miOrder.mapGetBankTansNo();
reg.setOutTradeNo(outTradeNo);
reg.setTradeNo(payOrdId);
reg.setPayOrdId(payOrdId);
reg.setPayMoney(cashFee);
reg.setAcctFee(acctFee);
reg.setHifpFee(hifpFee);
reg.setChrgBchno(chrgBchno);
reg.setMdTrtId(mdTrtId);
reg.setMdUserId(mdUserId);
reg.setPayDeviceId("mobile");
reg.setPayStatus(-1);
reg.setHisStatus(-1);
reg.setBankTransNo(bankTransNo);
reg.setPayWay(merchantEnum.PAY_WAY_IN);
reg.setPayMchCode(merchantEnum.CODE);
reg.setPayOpenId(payOpenId);
Map<String, Object> map = miOrder.getMap();
if (miOrder.hasCreateMerOrder()) { // 订单已发起支付
String bankTransNo = medOrder.mapGetBankTansNo();
order.setBankTransNo(bankTransNo);
order.setPayWay(merchantEnum.PAY_WAY_IN);
order.setPayStatus(-1);
order.setHisStatus(-1);
Map<String, Object> map = medOrder.getMap();
if (medOrder.hasCreateMerOrder()) { // 订单已发起支付
log.info("[医保][挂号]订单已发起支付 hasDBOrder={}, outTradeNo={}, payOrdId={}", hasDBOrder, outTradeNo, payOrdId);
return Result.error(ResultEnum.PAY_REPEAT);
} else {
if (hasDBOrder) {
log.info("[医保][挂号]已有订单 hasDBOrder={}, outTradeNo={}, rxInfo={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(reg));
log.info("[医保][挂号]已有订单 hasDBOrder={}, outTradeNo={}, order={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(order));
return Result.success(map);
}
}
if (!regDao.insertMedical(reg)) {
if (!regDao.insertMedical(order)) {
return Result.error(ResultEnum.DATA_INSERT_ERROR);
}
return Result.success(map);
} catch (ServiceException e) {
log.error(e.getMessage());
return Result.error(e);
}
}
/**
* [医保]住院结算下单
*/
public Result createOutHospOrder(MerchantEnum merchantEnum, PayInHosp order, PEnum serverEnum) {
String treatNum = order.getTreatNum();
String payOrdId = order.getPayOrdId();
String outTradeNo = order.getOutTradeNo();
if (ObjectUtils.isEmpty(outTradeNo) || ObjectUtils.isEmpty(payOrdId) || ObjectUtils.isEmpty(treatNum)) {
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
try {
boolean hasDBOrder = false;
InHospPayDao inHospPayDao = new InHospPayDao();
if (MerchantEnum.ALI_MEDICAL.equals(merchantEnum)) { // 支付宝取消支付可重新支付
Order findOrder = inHospPayDao.selectMIOrderByPayOrdId(payOrdId);
if (findOrder != null) {
if (findOrder.hasPayStatusPaid()) {
return Result.error(ResultEnum.PAY_REPEAT);
}
hasDBOrder = true;
outTradeNo = findOrder.getOutTradeNo();
order.setOutTradeNo(outTradeNo);
}
}
String orderTitle = "住院号:" + treatNum;
MedCreateOrder medOrder = createMedOrder(merchantEnum, OrderMIEnum.REG_PAY, hasDBOrder, orderTitle, order, serverEnum);
if (!medOrder.hasMapData()) {
return Result.error(ResultEnum.PAY_ERROR_ORDER);
}
String bankTransNo = medOrder.mapGetBankTansNo();
order.setBankTransNo(bankTransNo);
order.setPayWay(merchantEnum.PAY_WAY_IN);
order.setPayStatus(-1);
order.setHisStatus(-1);
Map<String, Object> map = medOrder.getMap();
if (medOrder.hasCreateMerOrder()) { // 订单已发起支付
log.info("[医保][住院结算]订单已发起支付 hasDBOrder={}, outTradeNo={}, payOrdId={}", hasDBOrder, outTradeNo, payOrdId);
return Result.error(ResultEnum.PAY_REPEAT);
} else {
if (hasDBOrder) {
log.info("[医保][住院结算]已有订单 hasDBOrder={}, outTradeNo={}, order={}", hasDBOrder, outTradeNo, JsonHelper.toJsonString(order));
return Result.success(map);
}
}
if (!inHospPayDao.insert(order)) {
return Result.error(ResultEnum.DATA_INSERT_ERROR);
}
return Result.success(map);
@ -586,7 +679,7 @@ public class MedicalService {
* @param openid openid
* @param payInfo 支付信息
*/
public boolean inHospPaidNotify(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
public boolean outHospPaidNotify(MerchantEnum merchantEnum, String outTradeNo, String bankTransNo, String payDate, String payTime, String openid, String payInfo) {
if (outTradeNo == null || bankTransNo == null || payDate == null || payTime == null) {
log.info("[医保][住院结算]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, payDate={}, payTime={}", outTradeNo, bankTransNo, payDate, payTime);
return false;
@ -649,10 +742,10 @@ public class MedicalService {
return false;
}
if (!WxMedConfig.IS_AUTO_REFUND) {
log.info("[医保][住院结算]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
return false;
}
// if (!WxMedConfig.IS_AUTO_REFUND) {
// log.info("[医保][住院结算]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
// return false;
// }
return false;
}

@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
@Slf4j
public class MiddleOfficeService {
@ -19,7 +20,7 @@ public class MiddleOfficeService {
try {
if (HospEnum.红河州人民医院.isHosp()) {
if (MiddleOfficeConfig.URL != null) { //平台数据上传
String reqId = SnowHelper.nextStrId();
String reqId = UUID.randomUUID().toString();
MiddleOfficeConfig.run(soapUrl, "<Request>" + SoapHelper.requestParams("HIS", null, reqId, params) + "</Request>", hisMedSoapMdUrl, transactionCode, result);
if ("7004".equals(transactionCode) && JsonResult.xmlToBean(result, JsonResultEnum.SYS_HIS) != null) {
MiddleOfficeConfig.uploadTreatNum("JH0104", Objects.requireNonNull(JsonResult.xmlToBean(result, JsonResultEnum.SYS_HIS)).getDataMapString("MZNum"));

@ -2,9 +2,9 @@ package com.ynxbd.common.service;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.action.pay.PEnum;
import com.ynxbd.common.bean.ConfigSelfHelp;
import com.ynxbd.common.bean.HisRecipe;
import com.ynxbd.common.bean.SelfHelpCount;
import com.ynxbd.common.bean.ConfigSelfHelp;
import com.ynxbd.common.bean.StandardPrice;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Order;
@ -14,8 +14,11 @@ import com.ynxbd.common.dao.RefundDao;
import com.ynxbd.common.dao.SelfHelpDao;
import com.ynxbd.common.dao.his.HisAccountDao;
import com.ynxbd.common.dao.his.HisRecipeDao;
import com.ynxbd.common.helper.common.*;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.common.QuickDrugDispenseHelper;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
@ -612,7 +615,7 @@ public class RecipeService {
throw new ServiceException(ResultEnum.REFUND_MONEY_ERROR);
}
String outRefundNo = HisHelper.getHisTradeNo(bankTransNo, pEnum);
String outRefundNo = HisFactory.getHisTradeNo(bankTransNo, pEnum);
Order orderRefund = PayService.refund(merchantEnum, outTradeNo, outRefundNo, refundMoney, recipe.getTotalFee(), refundDesc, recipe.getUpdateTime(), recipe.getOpenid(), recipe.getPatientId(), null);
boolean isResult = orderRefund.isSuccess();

@ -16,7 +16,7 @@ import com.ynxbd.common.dao.RegisterDao;
import com.ynxbd.common.dao.his.HisAccountDao;
import com.ynxbd.common.dao.his.HisRegisterDao;
import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum;
@ -112,7 +112,7 @@ public class RegService {
Register reg;
String regType, patientId;
String tradeNo = HisHelper.getHisTradeNo(bankTransNo, PEnum.REG);
String tradeNo = HisFactory.getHisTradeNo(bankTransNo, PEnum.REG);
try {
reg = queryRegByOrderNo(outTradeNo, null);
if (reg == null) {
@ -149,7 +149,7 @@ public class RegService {
ResultEnum resultEnum = e.getResultEnum();
String message = resultEnum == null ? "系统繁忙" : resultEnum.message;
String pushMessage = "挂号失败已申请退款,原因:" + message + ",订单号:" + outTradeNo; // 推送消息
regAutoRefund(merchantEnum, HisHelper.createErrorResult(message), openid, totalFee, outTradeNo, tradeNo, message, pushMessage, tradeDate);
regAutoRefund(merchantEnum, HisFactory.His().createErrorResult(message), openid, totalFee, outTradeNo, tradeNo, message, pushMessage, tradeDate);
throw new ServiceException(message);
}
@ -194,7 +194,7 @@ public class RegService {
} else { // 不执行挂号-->退费
String message = "挂号类型异常:{" + regType + "}";
log.info("{} [挂号] patientId={}, message={}", merchantEnum.NAME, patientId, message);
jsonResult = HisHelper.createErrorResult(message);
jsonResult = HisFactory.His().createErrorResult(message);
}
@ -553,7 +553,7 @@ public class RegService {
throw new ServiceException(ResultEnum.REFUND_MONEY_ERROR);
}
String outRefundNo = HisHelper.getHisTradeNo(reg.getBankTransNo(), pEnum);
String outRefundNo = HisFactory.getHisTradeNo(reg.getBankTransNo(), pEnum);
Order refundInfo = PayService.refund(merchantEnum, outTradeNo, outRefundNo, refundMoney, dbPayMoney, refundDesc, reg.getUpdateTime(), reg.getOpenid(), reg.getPatientId(), null);
boolean isResult = refundInfo.isSuccess();
log.info("{} [HIS挂号退费] 申请{} outTradeNo={}, outRefundNo={}, invoiceTransNo={},refundMoney={}, payMoney={}", merchantEnum.NAME,

@ -5,7 +5,7 @@ import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.Register;
import com.ynxbd.common.dao.RegisterDao;
import com.ynxbd.common.dao.his.HisRegisterDao;
import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.his.HisFactory;
import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException;
@ -35,7 +35,7 @@ public class ThirdPartyPayService {
Register reg;
String regType, patientId;
String tradeNo = HisHelper.getHisTradeNo(bankTransNo, PEnum.TPP_QR_REG);
String tradeNo = HisFactory.getHisTradeNo(bankTransNo, PEnum.TPP_QR_REG);
try {
reg = registerDao.selectByOutTradeNo(outTradeNo);
if (reg == null) {

@ -21,7 +21,7 @@ public class JYPayConfig {
public final static String PRIVATE_KEY;
static {
XmlConfigHelper config = new XmlConfigHelper().read("xbd-config.xml", "pay");
XmlConfigHelper config = new XmlConfigHelper().read("jy-config.xml", "pay");
URL = config.getString("url");
APPLICATION_ID = config.getString("application_id");

@ -3,10 +3,9 @@ package com.ynxbd.jy.helper;
import com.alibaba.fastjson.JSONObject;
import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.ReqOrder;
import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.rsa.RSAHelper;
import com.ynxbd.common.helper.http.OkHttpHelper;
import com.ynxbd.common.helper.rsa.RSAHelper;
import com.ynxbd.jy.bean.JYOrder;
import com.ynxbd.wx.config.WeChatConfig;
import lombok.extern.slf4j.Slf4j;
@ -38,7 +37,7 @@ public class JYPayHelper {
* @param msgOpenId 用于推送的openId
* @return 成功返回 json, 否则返回null
*/
public static JSONObject createOrder(MerchantEnum merchantEnum, String title, String totalFee, String outTradeNo, String notifyType, String ip, String payOpenId, String msgOpenId, ReqOrder reqOrder) {
public static JSONObject createOrder(MerchantEnum merchantEnum, String title, String outTradeNo, String totalFee, String notifyType, String ip, String payOpenId, String msgOpenId, ReqOrder reqOrder) {
try {
if (ObjectUtils.isEmpty(payOpenId) || ObjectUtils.isEmpty(outTradeNo)
|| merchantEnum == null || totalFee == null || notifyType == null) {
@ -50,13 +49,14 @@ public class JYPayHelper {
try {
cents = new BigDecimal(totalFee).movePointRight(2).toString(); // 金额转换=>单位分
} catch (Exception e) {
ErrorHelper.println(e);
log.info("【京硕】下单金额转换异常");
log.info("【京硕】下单金额转换异常:", e);
return null;
}
log.info("【京硕】下单 {},{},{},{},{}", title, outTradeNo, totalFee, ip, merchantEnum.NOTIFY_URL);
log.info("hospitalId={}, applicationId={}, merchantI={}", JYPayConfig.HOSP_ID, JYPayConfig.APPLICATION_ID, JYPayConfig.MERCHANT_ID);
JYOrder jyOrder = reqOrder.jyOrder;
Map<String, String> req = new HashMap<>();
@ -78,7 +78,7 @@ public class JYPayHelper {
req.put("patientName", reqOrder.getPatientName()); // 微信医保支付必传。其余支付方式若该接口若不传,需要调用2.1.6接口再次更新
req.put("patientGender", reqOrder.getPatientGender()); // 患者性别。综合支付对应用权限控制是否必传 1男 2女 9其他 最大不超过4位 该接口若不传,需要调用2.1.6接口再次更新
req.put("patientAge", reqOrder.getPatientAge()); // 患者年龄。综合支付对应用权限控制是否必传 该接口若不传,需要调用2.1.6接口再次更新
req.put("patientIdNo", reqOrder.getPatientTel()); // 微信医保支付必传。其余支付方式若该接口若不传,需要调用2.1.6接口再次更新
req.put("patientIdNo", reqOrder.getPatientIdCardNo()); // 微信医保支付必传。其余支付方式若该接口若不传,需要调用2.1.6接口再次更新
req.put("patientPhoneNumber", reqOrder.getPatientTel()); // 综合支付对应用权限控制是否必传 最大不超过16位 该接口若不传,需要调用2.1.6接口再次更新
req.put("patientId", reqOrder.getPatientId()); // 患者ID:综合支付对应用权限控制是否必传 最大不超过32位 该接口若不传,需要调用2.1.6接口再次更新
req.put("patientCardNo", reqOrder.getPatientId()); // 患者卡号:综合支付对应用权限控制是否必传 最大不超过32位该接口若不传,需要调用2.1.6接口再次更新
@ -113,7 +113,8 @@ public class JYPayHelper {
}
req.put("signValue", signValue); // 数字签名:由接入方生成的签名,支付平台根据该字段对入参进行验签;签名生成规则参考4加签验签规则
JSONObject resp = OkHttpHelper.postJson(JYPayConfig.URL + "/qy_iips_pay/paycore/prePayOrder", params -> {
log.info("req={}", JSONObject.toJSONString(req));
JSONObject resp = OkHttpHelper.postForm(JYPayConfig.URL + "/qy_iips_pay/paycore/prePayOrder", params -> {
params.putAll(req);
}, headers -> {
headers.add("content-type", "application/x-www-form-urlencoded");

@ -5,11 +5,9 @@ import com.ynxbd.common.helper.common.Base64Helper;
import com.ynxbd.common.helper.common.CodeHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.http.OkHttpHelper;
import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ServiceException;
import com.ynxbd.wx.wxfactory.WxCacheHelper;
import com.ynxbd.wx.wxfactory.base.auth.models.*;
import com.ynxbd.wx.wxfactory.payment.WXPayUtility;
import com.ynxbd.wx.wxfactory.utils.EmojiHelper;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@ -1,5 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<config>
<!-- 属性名重复时,只读取第一次出现的值 -->
<health_card name="电子健康卡">
<is_enable name="是否启用-[def:false]">true</is_enable>
<is_upload_data name="是否上传数据-[医院等级不够配置:false][def:true]">true</is_upload_data>
<is_log_report name="是否打印上报数据日志-[def:false]">false</is_log_report>
<is_face_url name="是否传递人脸识别链接-[def:true]">false</is_face_url>
<!-- 微信开放平台调用参数 -->
<h_hosp_id name="医院ID-[医院等级未到达时配置:32064]">31922</h_hosp_id>
<h_app_id>e4a05c13301f2f6a8b07b3de872dfe2d</h_app_id>
<h_app_secret>e5322dfd9bfab939851319812c30f9f1</h_app_secret>
<!-- 万达卡管平台调用参数 -->
<card_app_id>5a4a6eacbe1040d8a91c76608aefb943</card_app_id>
<card_public_key>mfkwewyhkozizj0caqyikozizj0daqcdqgaepc6p0omuruc5lq7cwdu18ca4cgmqbtjpwdyrglo4wbal9/m3dv4oywez7fbgtnkkgj/kfojvze6sc/dka+ddca==</card_public_key>
<card_private_key>4e181412b5874b22ba113ea3a907e244</card_private_key>
<card_url>http://220.164.109.105:19211/internet</card_url>
<!-- mini-app -->
<h_mini_hosp_id name="医共体小程序医院ID"></h_mini_hosp_id>
<h_mini_app_id name="医共体小程序appID"></h_mini_app_id>
<!-- 用于授权的公众号app_id[不是本院 & 医院等级不够 & 新版电子健康卡 & 医共体]-[优先级大于wx配置文件中的appId] -->
<h_auth_app_id></h_auth_app_id>
</health_card>
<report name="报告解读">
<hosp_id name="医院ID">31737</hosp_id>

@ -4,6 +4,7 @@ is_enable=true
h.is_upload_data=false
# \u662F\u5426\u6253\u5370\u4E0A\u62A5\u6570\u636E\u65E5\u5FD7
h.is_log_report=false
#\u5FAE\u4FE1\u5F00\u653E\u5E73\u53F0\u8C03\u7528\u53C2\u6570
h.app_id=e4a05c13301f2f6a8b07b3de872dfe2d
h.app_secret=e5322dfd9bfab939851319812c30f9f1

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<config>
<pay name="支付配置">
<url>http://127.0.0.1</url>
<application_id name="应用编号">1</application_id>
<merchant_id name="应用商户编号">1</merchant_id>
<pay name="[京颐]支付配置">
<url>http://192.168.1.26:8083</url>
<application_id name="应用编号">30007</application_id>
<merchant_id name="应用商户编号">20007</merchant_id>
<hosp_id name="医院ID">6910003</hosp_id>
<public_key>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD1eiOktZm8bUwjHA2bFlrULg9v/VAmBfUWb8/1+xyZH5eSa7itvAG2Kdzv7L59nRIspXyO6ZW+gGmofnX8CqI5ofLrpissgoqZadNfz5v/k2Q78YTBM8BEMwkrPwOsbFX62poPSKr4kZRHgMADJkgS6AhsaDNBLdH6uRE8R0H6lQIDAQAB</public_key>
<private_key>MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAPV6I6S1mbxtTCMcDZsWWtQuD2/9UCYF9RZvz/X7HJkfl5JruK28AbYp3O/svn2dEiylfI7plb6Aaah+dfwKojmh8uumKyyCiplp01/Pm/+TZDvxhMEzwEQzCSs/A6xsVframg9IqviRlEeAwAMmSBLoCGxoM0Et0fq5ETxHQfqVAgMBAAECgYAf8F9Y2+P/1zyzyL+gcR0qRD/v80aNW/MSk0O8noqPBcRD4c4qlK6oU/QSJ3x1fY1Sz8lQEuZP3gdhS+rv+zY2BjbfSq4HcZexmbBmh0NQ4Swd7i0hfkSM+koHZjVoPY/FJ/TW/Ks3iV+kpAZuVLCh60B66H8y9K5xu331nLxeYQJBAPzFeQPVJThxIBbk5g8/fYD/gbglEGqdurTJlo9tmCuqzty19fApBE+41ir9Sl2vguDnY1d9Zbuf1AlS21jsVx0CQQD4nNC1FyDKK6GxQvOm6Do+b663ft0WK7dum0c4pM57VPTRqxag4p6lYCu5KYmVvUL20KGE5LVZ9LaOIMIurD/ZAkEA4z4My1tFuPZKqQpjoXWsuNn7nrcDiTX/8iQBDTSzxx4qFtYnIh9d1uYO9Fr+DjeJa/PZpYAAg6rujutEcy8WKQJARir0WPgjIAx6gW5VGHmY3sBkvpOG0Ngb2JLo4hrZ0ENlKbwxEc2EW0aucH9BvsqBGOo/fCOU78O6tpiWVdf12QJAP8ENPIBQCLwHq0U5bzV+X94BmuOfTAqwvy/r6XQcOct0k/M/Lln0FUcPwAb6rl/1R55Xj1/DxI2UbTc4KNNpng==</private_key>
</pay>

@ -1 +1 @@
# \u5F00\u542F\u5904\u65B9\u9884\u7ED3\u7B97\uFF08\u7B2C2\u5F00\u5173\uFF09\uFF08\u6CE8\u610F\u8BE5\u914D\u7F6E\u9700\u8054\u7CFBhis\u5F00\u53D1\u8005\u786E\u8BA4\u652F\u6301\u624D\u80FD\u5F00\u542F\uFF0C\u5426\u5219\u5B58\u5728\u98CE\u9669\uFF01\uFF09 his.is_recipe_prepay=false # \u672C\u5730 #his.url=127.0.0.1:8888 # HIS\u662F\u5426\u5F00\u542F\u652F\u4ED8\u5B9D\u5206\u5F00\u5BF9\u8D26 his.is_ali_mer=false # \u662F\u5426\u5F3A\u5236\u6253\u5370webservice\u7684xml\u8FD4\u56DE\u6570\u636E his.is_log_resp=true # \u5DDE\u50A3\u533B\u4F7F\u7528 his.is_req_cdata=false # \u662F\u5426\u4F20\u9012openid\u7ED9his\u63A8\u9001\u6D88\u606F his.is_push_msg=false #------------------------------- # \u6D4B\u8BD5\u73AF\u5883 his.dev_url=200.200.200.60:7777 # \u533B\u4FDD=========================== # \u65E7\u914D\u7F6E his.md_url=127.0.0.1:7777 # \u5FAE\u4FE1\u533B\u4FDD his.wx_med_url=10.20.10.7:7885 # \u652F\u4ED8\u5B9D\u533B\u4FDD his.ali_med_url=10.20.10.7:7885 # \u6D4B\u8BD5============================================================ # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u77F3\u6797\u53BF\u533B\u9662 #his.url=200.200.200.105:8888 # \u5FB7\u5B8F\u4E2D\u533B his.url=200.200.200.60:7777 # \u7EA2\u6CB3\u5DDE\u533B\u9662 #his.url=10.20.10.6:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # \u5B81\u8497\u5987\u5E7C #his.url=172.19.3.15:8888 # \u5B81\u8497\u53BF\u533B\u9662 #his.url=192.168.10.8:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.39:8888 #\u666F\u6D2A\u4E2D\u50A3\u533B #his.url=192.168.197.217:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u7EA2\u6CB3 #his.url=10.20.10.6:8888 # \u7EA2\u6CB3\u533B\u4FDD #his.url=10.20.10.6:8888 #his.url=192.168.12.10:8888 #his.md_url=192.168.1.128:7885 #his.dev_url=10.20.10.6:9988 # \u6C38\u80DC #his.url=200.200.200.20:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u534E\u576A #his.url=192.168.1.115:8888 # \u8499\u81EA\u4E2D\u533B #his.url=192.168.0.228:8888 # \u7389\u9F99 #his.url=192.168.0.17:8888 # #his.url=172.16.10.15:8888 # \u7984\u529D\u949F\u7231 #his.url=200.200.200.5:8888 # \u8499\u81EA\u5E02\u4EBA\u6C11\u533B\u9662 #his.url=200.200.200.174:8080 # \u5143\u8C0B #his.url=200.200.200.29:8888 # \u5143\u8C0B\u533B\u4FDD #his.dev_url=200.200.200.36:9999 # \u8292\u5E02 #his.url=192.168.100.8:8888 # \u7EA2\u6CB3\u5987\u5E7C\u4FDD\u5065\u9662 #his.url=192.168.1.204:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # #his.url=10.10.11.23:8888 # \u77F3\u6797 #his.url=192.168.10.10:8888 # \u5BCC\u6C11 #his.url=200.200.201.27:8888 # \u897F\u53CC\u7248\u7EB3 #his.url=10.10.11.23:8888 #wx.password=ynxbd@6910
his.is_recipe_prepay=false # \u672C\u5730 #his.url=127.0.0.1:8888 # HIS\u662F\u5426\u5F00\u542F\u652F\u4ED8\u5B9D\u5206\u5F00\u5BF9\u8D26 his.is_ali_mer=false # \u662F\u5426\u5F3A\u5236\u6253\u5370webservice\u7684xml\u8FD4\u56DE\u6570\u636E his.is_log_resp=true # \u5DDE\u50A3\u533B\u4F7F\u7528 his.is_req_cdata=false # \u662F\u5426\u4F20\u9012openid\u7ED9his\u63A8\u9001\u6D88\u606F his.is_push_msg=false #------------------------------- # \u6D4B\u8BD5\u73AF\u5883 his.dev_url=200.200.200.60:7777 # \u533B\u4FDD=========================== # \u65E7\u914D\u7F6E his.md_url=127.0.0.1:7777 # \u5FAE\u4FE1\u533B\u4FDD his.wx_med_url=10.20.10.7:7885 # \u652F\u4ED8\u5B9D\u533B\u4FDD his.ali_med_url=10.20.10.7:7885 # \u6D4B\u8BD5============================================================ # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u77F3\u6797\u53BF\u533B\u9662 #his.url=200.200.200.105:8888 # \u5FB7\u5B8F\u4E2D\u533B his.url=200.200.200.60:7777 # \u7EA2\u6CB3\u5DDE\u533B\u9662 #his.url=10.20.10.6:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # \u5B81\u8497\u5987\u5E7C #his.url=172.19.3.15:8888 # \u5B81\u8497\u53BF\u533B\u9662 #his.url=192.168.10.8:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.39:8888 #\u666F\u6D2A\u4E2D\u50A3\u533B #his.url=192.168.197.217:8888 # \u516C\u53F8\u6D4B\u8BD5 #his.url=192.168.12.10:8888 # \u7EA2\u6CB3 #his.url=10.20.10.6:8888 # \u7EA2\u6CB3\u533B\u4FDD #his.url=10.20.10.6:8888 #his.url=192.168.12.10:8888 #his.md_url=192.168.1.128:7885 #his.dev_url=10.20.10.6:9988 # \u6C38\u80DC #his.url=200.200.200.20:8888 # \u5FB7\u5B8F\u4E2D\u533B #his.url=200.200.200.60:8888 # \u534E\u576A #his.url=192.168.1.115:8888 # \u8499\u81EA\u4E2D\u533B #his.url=192.168.0.228:8888 # \u7389\u9F99 #his.url=192.168.0.17:8888 # #his.url=172.16.10.15:8888 # \u7984\u529D\u949F\u7231 #his.url=200.200.200.5:8888 # \u8499\u81EA\u5E02\u4EBA\u6C11\u533B\u9662 #his.url=200.200.200.174:8080 # \u5143\u8C0B #his.url=200.200.200.29:8888 # \u5143\u8C0B\u533B\u4FDD #his.dev_url=200.200.200.36:9999 # \u8292\u5E02 #his.url=192.168.100.8:8888 # \u7EA2\u6CB3\u5987\u5E7C\u4FDD\u5065\u9662 #his.url=192.168.1.204:8888 # \u8292\u5E02\u5987\u5E7C #his.url=192.168.11.7:8888 # #his.url=10.10.11.23:8888 # \u77F3\u6797 #his.url=192.168.10.10:8888 # \u5BCC\u6C11 #his.url=200.200.201.27:8888 # \u897F\u53CC\u7248\u7EB3 #his.url=10.10.11.23:8888 #wx.password=ynxbd@6910

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?> <config> <his> <is_req_cdata name="州傣医使用-[def:false]">false</is_req_cdata> <!-- 处方预结算(第2开关)(注意该配置需联系his开发者确认支持才能开启,否则存在风险!) --> <is_rx_prepay name="处方预结算[风险][def:false]">false</is_rx_prepay> <!-- 开关配置 --> <is_ali_mer name="HIS是否开启支付宝分开对账-[def:false]">false</is_ali_mer> <is_log_resp name="是否强制打印响应xml数据-[def:false]">false</is_log_resp> <is_push_msg name="是否传递openid给His推送消息-[def:false]">false</is_push_msg> <!-- 医保 --> <wx_med_url name="[微信医保]">127.0.0.1:8888</wx_med_url> <ali_med_url name="[支付宝医保]">127.0.0.1:8888</ali_med_url> <!-- HIS --> <dev_url name="[测试环境]">200.200.200.60:7777</dev_url> <!-- <url name="[正式环境]">200.200.200.60:7777</url>--> <url name="德宏中医">200.200.200.60:7777</url> </his> </config>
Loading…
Cancel
Save