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

406 lines
15 KiB

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;
// 是否强制打印HIS响应的xml
private static final Boolean IS_LOG_RESP;
// 是否传递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 devMIUrl = config.getString("his.dev_mi_url");
String prodMIUrl = config.getString("his.prod_mi_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_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_DEV_MI_URL = initSoapURL(devMIUrl);
HIS_PROD_MI_URL = initSoapURL(prodMIUrl == null ? mdUrl : prodMIUrl);
}
private static String initSoapURL(String ip) {
if (ObjectUtils.isEmpty(ip)) {
return null;
}
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.getOutTradeNo(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\"><Request>" + SoapHelper.requestParams("HIS", transactionCode, reqId, params) + "</Request></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);
}
}
}
new MiddleOfficeService().req_his_JH0104(soapUrl, HIS_PROD_MI_URL, params, transactionCode, 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);
}
// <TransactionCode>4004</TransactionCode>
// <CallNo>675448357</CallNo>
// <CallNo>843242395</CallNo>
/**
* 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;
// }
}