diff --git a/src/main/java/com/ynxbd/common/action/HealthCodeAction.java b/src/main/java/com/ynxbd/common/action/HealthCodeAction.java index f1150d7..882ee50 100644 --- a/src/main/java/com/ynxbd/common/action/HealthCodeAction.java +++ b/src/main/java/com/ynxbd/common/action/HealthCodeAction.java @@ -176,12 +176,18 @@ public class HealthCodeAction extends BaseAction { * [电子健康卡]患者绑定(成人) */ @Action("bind") - public Result bind(boolean isCounty, String county, String address, String openid, String tel, String sex, String name, String nation, String birthday, String idCardNo, String cardType, Boolean isHealthCard, String healthCardId, String weChatCode) { + public Result bind(boolean isCounty, boolean isFace, String orderId, String registerOrderId, String county, String address, String openid, String tel, String sex, String name, String nation, String birthday, String idCardNo, String cardType, Boolean isHealthCard, String healthCardId, String weChatCode) { log.info("[电子健康卡]身份绑定 name={}, address={}, nation={}, sex={}, birthday={}, tel={}, healthCardId={}, cardType={}", name, address, nation, sex, birthday, tel, healthCardId, cardType); if (isHealthCard == null || openid == null || tel == null || sex == null || birthday == null || name == null) { return Result.error(ResultEnum.PARAM_IS_DEFECT); } + if(isFace){ + if(!HCodeService.checkUniformVerifyResult(orderId, registerOrderId)){ + return Result.error(ResultEnum.FACE_VERIFY_ERROR); + } + } + if (cardType == null) cardType = HCardTypeEnum._01.WX_CODE; HCardTypeEnum cardTypeEnum = HCardTypeEnum.toTypeByWxCode(cardType); if (cardTypeEnum == null) { diff --git a/src/main/java/com/ynxbd/common/action/RegisterAction.java b/src/main/java/com/ynxbd/common/action/RegisterAction.java index 1c1afea..ea296e5 100644 --- a/src/main/java/com/ynxbd/common/action/RegisterAction.java +++ b/src/main/java/com/ynxbd/common/action/RegisterAction.java @@ -12,6 +12,7 @@ import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.service.DoctorService; +import com.ynxbd.wx.utils.DesEncryptHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.struts2.convention.annotation.Action; @@ -29,6 +30,17 @@ import java.util.stream.Collectors; @Slf4j public class RegisterAction extends BaseAction { + + /** + * [推送] 获取预约今日的所有患者openId + * @return openId列表 + */ + @Action("getTodayRegOpenId") + public Result getTodayRegOpenId() { + return Result.success(new RegisterDao().selectTodayRegisterOpenId()); + } + + /** * [科室]获取科室信息 */ diff --git a/src/main/java/com/ynxbd/common/dao/RegisterDao.java b/src/main/java/com/ynxbd/common/dao/RegisterDao.java index 2079990..d85f7c7 100644 --- a/src/main/java/com/ynxbd/common/dao/RegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/RegisterDao.java @@ -24,6 +24,16 @@ import java.util.List; public class RegisterDao { + /** + * 获取今日挂号的所有患者的openId用作到诊推送 + * @return 所有openId + */ + public List selectTodayRegisterOpenId() { + String sqlString = "select a.*,b.`Name` as patientName from register a left join patientbase b on a.OpenID = b.OpenID and a.PatientID = b.PatientID WHERE RegDate = CURDATE() and HisStatus = 0 and RefundResult is null and RefundTime is null and RegType = 3 "; + return DataBase.select(sqlString, Register.class); + } + + /** * 根据医生编码/医生名获取医生头像(医生编码优先级 > 医生姓名) * diff --git a/src/main/java/com/ynxbd/common/helper/his/HisHelper.java b/src/main/java/com/ynxbd/common/helper/his/HisHelper.java index ce87f5d..be99dea 100644 --- a/src/main/java/com/ynxbd/common/helper/his/HisHelper.java +++ b/src/main/java/com/ynxbd/common/helper/his/HisHelper.java @@ -9,6 +9,7 @@ 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 com.ynxbd.wx.config.MiddleOfficeConfig; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.dom4j.DocumentException; @@ -251,6 +252,11 @@ public class HisHelper { log.info("[强制打印]HIS请求成功[{}]-耗时:[{}]-返回xml={}", transactionCode, takeTime, result); } } + + if(MiddleOfficeConfig.MIDDLE_OFFICE_URL!=null){ //平台数据上传 + MiddleOfficeConfig.run(soapUrl,"" + SoapHelper.requestParams("HIS", params) + "",HIS_SOAP_MD_URL,transactionCode,result); + } + } catch (DocumentException e) { ErrorHelper.println(e); } diff --git a/src/main/java/com/ynxbd/common/helper/lis/RMLisHelper.java b/src/main/java/com/ynxbd/common/helper/lis/RMLisHelper.java index 4c577da..7397e61 100644 --- a/src/main/java/com/ynxbd/common/helper/lis/RMLisHelper.java +++ b/src/main/java/com/ynxbd/common/helper/lis/RMLisHelper.java @@ -96,14 +96,14 @@ public class RMLisHelper { result = unifiedEntranceResult.getText(); - if (result.length() > 500) { - if(IS_LOG_RESP){ - log.info("RMLis请求成功-耗时:[{}]-返回xml={}", takeTime,result); - } - log.info("RMLis请求成功-耗时:[{}]", takeTime); - } else { - log.info("RMLis请求成功-耗时:[{}]-返回xml={}", takeTime, result); - } +// if (result.length() > 500) { +// if(IS_LOG_RESP){ +// log.info("RMLis请求成功-耗时:[{}]-返回xml={}", takeTime,result); +// } +// log.info("RMLis请求成功-耗时:[{}]", takeTime); +// } else { +// log.info("RMLis请求成功-耗时:[{}]-返回xml={}", takeTime, result); +// } return result; } catch (DocumentException e) { ErrorHelper.println(e); diff --git a/src/main/java/com/ynxbd/common/result/JsonResultEnum.java b/src/main/java/com/ynxbd/common/result/JsonResultEnum.java index 8938a8a..d079da9 100644 --- a/src/main/java/com/ynxbd/common/result/JsonResultEnum.java +++ b/src/main/java/com/ynxbd/common/result/JsonResultEnum.java @@ -21,9 +21,12 @@ public enum JsonResultEnum { SYS_HIS("[HIS]", "ResponseCode", "ResponseMessage", "0", "-1", "500"), + SYS_RESERVE("[天助预约]","code","msg","0","-1",String.valueOf(HttpStatus.SC_REQUEST_TIMEOUT)), + SYS_RM_LIS("[瑞美LIS]", "ResultCode", "ResultMessage", "1", "0", String.valueOf(HttpStatus.SC_REQUEST_TIMEOUT)); + // 调用系统标识 public final String SYS; // 响应编码节点名 diff --git a/src/main/java/com/ynxbd/common/result/ResultEnum.java b/src/main/java/com/ynxbd/common/result/ResultEnum.java index 3314656..852f741 100644 --- a/src/main/java/com/ynxbd/common/result/ResultEnum.java +++ b/src/main/java/com/ynxbd/common/result/ResultEnum.java @@ -28,6 +28,7 @@ public enum ResultEnum { PARAM_ADDRESS_ERROR(10007, "地址缺失"), PARAM_LIST_SIZE_ZERO(10008, "参数集为空"), PARAM_VERIFY_ERROR(10009, "参数验证失败"), + FACE_VERIFY_ERROR(10010,"人脸识别未通过"), DATE_IS_TODAY(10100, "日期不能为今天"), DATE_IS_ERROR(10101, "日期错误"), diff --git a/src/main/java/com/ynxbd/common/service/RecipeService.java b/src/main/java/com/ynxbd/common/service/RecipeService.java index 22280df..3fcbfa8 100644 --- a/src/main/java/com/ynxbd/common/service/RecipeService.java +++ b/src/main/java/com/ynxbd/common/service/RecipeService.java @@ -346,10 +346,15 @@ public class RecipeService { } } } + + String tip = String.format("共计缴费处方单数:%s,失败数:%s,超时数:%s", recipeList.size(), (failedList.size() - outTimeList.size()), outTimeList.size()); log.info("{} [处方]{}", merchantEnum.NAME, tip); HCodeService.payNotifyReportHISData(openid, patientId); + + + return true; } diff --git a/src/main/java/com/ynxbd/wx/config/MessagePushConfig.java b/src/main/java/com/ynxbd/wx/config/MessagePushConfig.java index 02670b0..104ba38 100644 --- a/src/main/java/com/ynxbd/wx/config/MessagePushConfig.java +++ b/src/main/java/com/ynxbd/wx/config/MessagePushConfig.java @@ -216,6 +216,29 @@ public class MessagePushConfig { } + /** + * 通用推送消息接口 + * @param tip 所属部分 + * @param patientId 患者id + * @param content 推送内容 + * @param url 链接地址 + */ + public static void businessPush(String tip, String patientId, String content,String url){ + if(patientId==null) { + log.info("[{}]通用推送错误,patientId为空",tip); + return; + } + log.info("[{}]通用推送开始,patientId-{},content-{},url-{}",tip,patientId,content,url); + RequestBody requestBody = new FormBody.Builder() + .add("patientId",patientId) + .add("content",content) + .add("url", url) + .add("organizeName",ORGANIZENAME) + .build(); + OkHttpHelper.post(REG_AI_URL, requestBody); + } + + /** * AI诊疗推送 * @param patientId diff --git a/src/main/java/com/ynxbd/wx/config/MiddleOfficeConfig.java b/src/main/java/com/ynxbd/wx/config/MiddleOfficeConfig.java new file mode 100644 index 0000000..7a8893c --- /dev/null +++ b/src/main/java/com/ynxbd/wx/config/MiddleOfficeConfig.java @@ -0,0 +1,159 @@ +package com.ynxbd.wx.config; + +import com.alibaba.fastjson.JSONObject; +import com.ynxbd.common.helper.ProperHelper; +import com.ynxbd.common.helper.http.OkHttpHelper; +import com.ynxbd.common.result.JsonResult; +import com.ynxbd.common.result.JsonResultEnum; +import com.ynxbd.wx.utils.XMLUtil; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; + +import java.io.IOException; + +/** + * @author 李进才 + * @ClassName MiddleOfficeConfig + * @Description TODO + * @date 2024/05/16 10:46:00 + */ +@Slf4j +public class MiddleOfficeConfig { + + private MiddleOfficeConfig() { + } + // 佳禾美康数据上传链接 + public static final String MIDDLE_OFFICE_URL; + public static final String MIDDLE_OFFICE_HOSPITAL; + public static final String MIDDLE_OFFICE_ITEM_NAME; + + public static final String RESERVE_CLOUD_URL; + public static final String RESERVE_CLOUD_TERMINAL_NO; + + + static{ + ProperHelper config = new ProperHelper().read("middle-office.properties"); + MIDDLE_OFFICE_URL = config.getString("middle_office_url"); + MIDDLE_OFFICE_HOSPITAL = config.getString("middle_office_hospital"); + MIDDLE_OFFICE_ITEM_NAME = config.getString("middle_office_item_name"); + RESERVE_CLOUD_URL = config.getString("reserve_cloud_url"); + RESERVE_CLOUD_TERMINAL_NO = config.getString("reserve_cloud_terminal_no"); + } + + public static void run(String soapUrl, String requestData, String mdUrl,String transactionCode,String responseResult){ + String interfaceName = ""; + boolean isMD = soapUrl.equals(mdUrl); + switch (transactionCode) { + case "1002": + interfaceName = "JH1401R"; + break; + case "1003": + interfaceName = "JH1402R"; + break; + case "4005": + interfaceName=isMD?"JH1421R":"JH1403R"; + break; + case "4003": + interfaceName = "JH1404R"; + break; + case "7001": + interfaceName = "JH1405R"; + break; + case "7002": + interfaceName = "JH1406R"; + break; + case "7003": + interfaceName = "JH1407R"; + break; + case "7005": + interfaceName = "JH1408R"; + break; + case "7004": + interfaceName=isMD?"JH1420R":"JH1409R"; + break; + case "3006": + case "4007": + interfaceName = "JH1410R"; + break; + case "10": + interfaceName = "JH1420R"; + break; + case "11": + interfaceName = "JH1421R"; + break; + + } + if(interfaceName.length()<5){ + return; + } + upload(interfaceName.substring(0,interfaceName.length()-1),requestData); + upload(interfaceName,responseResult); + } + + public static void upload(String interfaceName,String jsonData){ + try { + log.info("[平台数据上传]开始,interfaceName:{},jsonData:{}",interfaceName,jsonData); + if("".equals(interfaceName)||"".equals(jsonData)||interfaceName==null||jsonData==null){ + return; + } + + + JSONObject json = new JSONObject(); + JSONObject head = new JSONObject(); + JSONObject body = new JSONObject(); + + head.put("hospital",MIDDLE_OFFICE_HOSPITAL); + head.put("itemName",MIDDLE_OFFICE_ITEM_NAME); + head.put("interface",interfaceName); + body.put("data",jsonData); + json.put("head",head); + json.put("body",body); + + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), String.valueOf(json)); + + Headers headers = new Headers.Builder() + .add("Content-Type", "application/json") + .build(); + + Request request = new Request.Builder() + .url(MIDDLE_OFFICE_URL) + .post(requestBody) + .headers(headers) + .build(); + + OkHttpClient okHttpClient = new OkHttpClient(); + Call call = okHttpClient.newCall(request); + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + log.error("[平台数据上传]上传失败,interfaceName:{},jsonData:{},error:{}",interfaceName,jsonData,e.toString()); + } + + @Override + public void onResponse(Call call, Response response) { //不在ui线程 + log.info("[平台数据上传]成功 状态码:{},interfaceName:{},jsonData:{}",response.code(),interfaceName,jsonData); + } + }); + } + catch (Exception e){ + log.error("[平台数据上传]执行失败,interfaceName:{},jsonData:{},error:{}",interfaceName,jsonData,e.toString()); + } + } + + public static void reserveRun(String patientId){ + if(RESERVE_CLOUD_URL==null){ + return; + } + String result = OkHttpHelper.get(RESERVE_CLOUD_URL,params->{ + params.put("patientID",patientId); + params.put("terminalNo",RESERVE_CLOUD_TERMINAL_NO); + }); + JsonResult jsonResult = JsonResult.xmlToBean(result, JsonResultEnum.SYS_RESERVE); + if(jsonResult==null){ + return; + } + if(jsonResult.success()){ + MessagePushConfig.businessPush("天助预约平台",patientId,jsonResult.getMessage(),null); + } + } +} diff --git a/src/main/java/com/ynxbd/wx/servlet/QServlet.java b/src/main/java/com/ynxbd/wx/servlet/QServlet.java index 2f40db6..2a6f28a 100644 --- a/src/main/java/com/ynxbd/wx/servlet/QServlet.java +++ b/src/main/java/com/ynxbd/wx/servlet/QServlet.java @@ -51,6 +51,7 @@ public class QServlet extends HttpServlet { } + String patientId = request.getParameter("p"); log.info("{} [patientId={}]多张处方扫码请求,开始解析...", merchantEnum.NAME, patientId); if (StringUtils.isEmpty(patientId)&&StringUtils.isEmpty(request.getParameter("t"))) { diff --git a/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java b/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java index f09af65..9237064 100644 --- a/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java +++ b/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java @@ -20,7 +20,7 @@ public class DesEncryptHelper { public static void main(String[] args) { String s = enCode("oeso-t62kkoRwLVVkSkwmmjPfUXk"); - String a= deCode("6A5F4D90B08AB69D76F965A215291AE702580102285E2794B179D9EBB0158FE407013F53E8B604E3DF8D47514CA9F0CA8085EDFDC3866014497AB6D0A8EE0B6C0BC104B63A47019C276711A08CD9599C566CEA56DCBA9C354F91153DC87EA039065FBF59FD5AB9BD438BA9CBF6BBD985AB4D6CB588CC4E421327D82D4AECA922A7D3424C389862EF"); + String a= deCode("0F458085FBA567B4D3DD765FBE368DF9C2CD2F13C9166A2584728882EE9C8121DC394566C048C31C08411BEBFF000B4D58BCCD6B36FB6089ED5313608851AF7CD0D296DD7C67F6517668E1E6217B5F26DD44D9B0A548C6160D457F507F7443C15C33D6AA8241FEE9B32C081570BFB6DE1B94F00DA5DDB0B3BB9F1BB619CB1952180BA3FAA56BE470"); System.out.println(a); } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java index db85a77..b01a066 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java @@ -21,7 +21,7 @@ public class ReqParamHelper { } public static void main(String[] args) { - System.out.println(encode("498732")); - System.out.println(decode("082227421D7D4FDA6F73999AC7D4BF69")); + System.out.println(encode("844504")); + System.out.println(decode("0F458085FBA567B4D3DD765FBE368DF9C2CD2F13C9166A2584728882EE9C8121DC394566C048C31C08411BEBFF000B4D58BCCD6B36FB6089ED5313608851AF7CD0D296DD7C67F6517668E1E6217B5F26DD44D9B0A548C6160D457F507F7443C15C33D6AA8241FEE9B32C081570BFB6DE1B94F00DA5DDB0B3BB9F1BB619CB1952180BA3FAA56BE470")); } } diff --git a/src/main/resources/medical.properties b/src/main/resources/medical.properties index b398b55..29c9713 100644 --- a/src/main/resources/medical.properties +++ b/src/main/resources/medical.properties @@ -1,6 +1,11 @@ # 医保配置 medical.is_dev=true medical.is_enable=true + +# 只有订阅号的医院或只想用订阅号的医院 申请一个空服务号 空服务号配置微信公众号(服务号)appId +medical.md_app_id=wx73fc2dbf84a43dce +medical.md_app_secret=06ba8338f3db206d0be3019ff29ed431 + # 城市编码(腾讯提供) medical.city_code=530700 # 医院名称 diff --git a/src/main/resources/middle-office.properties b/src/main/resources/middle-office.properties new file mode 100644 index 0000000..5f0445c --- /dev/null +++ b/src/main/resources/middle-office.properties @@ -0,0 +1,6 @@ +middle_office_url= http://10.255.248.20:9095/proxy/ +middle_office_hospital = 红河州第一人民医院 +middle_office_item_name = 嘉和美康 + +reserve_cloud_url = http://10.255.248.155:8003/WebService1.asmx/SlipPrint +reserve_cloud_terminal_no = SelfMa \ No newline at end of file