平台数据上传,人脸识别等相关功能

debug
李进才 11 months ago
parent c73371f910
commit 09f29f299e
  1. 8
      src/main/java/com/ynxbd/common/action/HealthCodeAction.java
  2. 12
      src/main/java/com/ynxbd/common/action/RegisterAction.java
  3. 10
      src/main/java/com/ynxbd/common/dao/RegisterDao.java
  4. 6
      src/main/java/com/ynxbd/common/helper/his/HisHelper.java
  5. 16
      src/main/java/com/ynxbd/common/helper/lis/RMLisHelper.java
  6. 3
      src/main/java/com/ynxbd/common/result/JsonResultEnum.java
  7. 1
      src/main/java/com/ynxbd/common/result/ResultEnum.java
  8. 5
      src/main/java/com/ynxbd/common/service/RecipeService.java
  9. 23
      src/main/java/com/ynxbd/wx/config/MessagePushConfig.java
  10. 159
      src/main/java/com/ynxbd/wx/config/MiddleOfficeConfig.java
  11. 1
      src/main/java/com/ynxbd/wx/servlet/QServlet.java
  12. 2
      src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java
  13. 4
      src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java
  14. 5
      src/main/resources/medical.properties
  15. 6
      src/main/resources/middle-office.properties

@ -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) {

@ -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());
}
/**
* [科室]获取科室信息
*/

@ -24,6 +24,16 @@ import java.util.List;
public class RegisterDao {
/**
* 获取今日挂号的所有患者的openId用作到诊推送
* @return 所有openId
*/
public List<Register> 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);
}
/**
* 根据医生编码/医生名获取医生头像(医生编码优先级 > 医生姓名)
*

@ -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,"<Request>" + SoapHelper.requestParams("HIS", params) + "</Request>",HIS_SOAP_MD_URL,transactionCode,result);
}
} catch (DocumentException e) {
ErrorHelper.println(e);
}

@ -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);

@ -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;
// 响应编码节点名

@ -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, "日期错误"),

@ -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;
}

@ -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

@ -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);
}
}
}

@ -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"))) {

@ -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);
}

@ -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"));
}
}

@ -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
# 医院名称

@ -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
Loading…
Cancel
Save