AI智能导诊根据腾讯要求就行数据变动。

新增住院医保结算相关接口
debug
王绍全 2 weeks ago
parent e8b2da6890
commit e3522163c1
  1. 14
      src/main/java/com/ynxbd/common/action/InHospAction.java
  2. 2
      src/main/java/com/ynxbd/common/action/RegisterAction.java
  3. 17
      src/main/java/com/ynxbd/common/action/healthcard/AIGuidanceAction.java
  4. 25
      src/main/java/com/ynxbd/common/action/pay/MedicalAction.java
  5. 3
      src/main/java/com/ynxbd/common/action/test/TestAction.java
  6. 4
      src/main/java/com/ynxbd/common/bean/Dept.java
  7. 2
      src/main/java/com/ynxbd/common/bean/Doctor.java
  8. 2
      src/main/java/com/ynxbd/common/bean/ai/AIDoctorSchedule.java
  9. 7
      src/main/java/com/ynxbd/common/bean/in_hosp/InHospitalList.java
  10. 35
      src/main/java/com/ynxbd/common/bean/pay/MedInHosp.java
  11. 8
      src/main/java/com/ynxbd/common/config/healthcard/HCAIGuidanceConfig.java
  12. 58
      src/main/java/com/ynxbd/common/dao/InHospPayDao.java
  13. 6
      src/main/java/com/ynxbd/common/dao/his/HisInHospDao.java
  14. 40
      src/main/java/com/ynxbd/common/dao/his/HisMedDao.java
  15. 10
      src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java
  16. 7
      src/main/java/com/ynxbd/common/helper/common/XmlConfigHelper.java
  17. 5
      src/main/java/com/ynxbd/common/helper/his/HisEnum.java
  18. 2
      src/main/java/com/ynxbd/common/result/Result.java
  19. 143
      src/main/java/com/ynxbd/common/service/AIGuidanceService.java
  20. 38
      src/main/java/com/ynxbd/common/service/InHospService.java
  21. 153
      src/main/java/com/ynxbd/common/service/MedicalService.java
  22. 7
      src/main/java/com/ynxbd/common/service/RegService.java
  23. 18
      src/main/resources/hc-config.xml
  24. 2
      src/main/resources/webservice.properties

@ -8,6 +8,7 @@ import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.service.InHospService;
import com.ynxbd.wx.wxfactory.AesWxHelper; import com.ynxbd.wx.wxfactory.AesWxHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
@ -184,18 +185,13 @@ public class InHospAction extends BaseAction {
*/ */
@Action("getOutHospRecords") @Action("getOutHospRecords")
public Result getOutHospRecords(@AesDecode String patientId, String begDate, String endDate) { public Result getOutHospRecords(@AesDecode String patientId, String begDate, String endDate) {
try{
log.info("[住院]通过患者ID查询住院记录(出院后) patientId={}, begDate={}, endDate={}", patientId, begDate, endDate); log.info("[住院]通过患者ID查询住院记录(出院后) patientId={}, begDate={}, endDate={}", patientId, begDate, endDate);
if (patientId == null) { if (patientId == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
JsonResult resp = new HisInHospDao().getAllHospList(patientId); List<InHospitalList> dataList = new InHospService().queryHisOutPatientRecords(patientId);
if (!resp.success()) {
return Result.error(resp.getMessage());
}
List<InHospitalList> dataList = resp.getDataMapList(InHospitalList.class, "Items", "Item");
boolean hasDateRange = (!ObjectUtils.isEmpty(begDate) && !ObjectUtils.isEmpty(endDate)); boolean hasDateRange = (!ObjectUtils.isEmpty(begDate) && !ObjectUtils.isEmpty(endDate));
List<InHospitalList> records = new ArrayList<>(); List<InHospitalList> records = new ArrayList<>();
@ -217,6 +213,10 @@ public class InHospAction extends BaseAction {
records = records.stream().sorted(Comparator.comparing(InHospitalList::getInHospitalDate, Comparator.reverseOrder())).collect(Collectors.toList()); records = records.stream().sorted(Comparator.comparing(InHospitalList::getInHospitalDate, Comparator.reverseOrder())).collect(Collectors.toList());
return Result.success(records); return Result.success(records);
}catch (Exception e){
return Result.error(e);
}
} }
/** /**

@ -90,7 +90,7 @@ public class RegisterAction extends BaseAction {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
List<Dept> deptList = new HisRegisterDao().getTimeDeptList(begDate, endDate, deptCode); List<Dept> deptList = new HisRegisterDao().getTimeDeptList(begDate, endDate, deptCode, "1");
MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(merCode); MerchantEnum merchantEnum = MerchantEnum.findEnumByCode(merCode);
if (MerchantEnum.ALI.equals(merchantEnum)) { if (MerchantEnum.ALI.equals(merchantEnum)) {

@ -52,9 +52,11 @@ public class AIGuidanceAction extends BaseAction {
@Action("getHospDetail") @Action("getHospDetail")
public Result getHospDetail(String hosId) { public Result getHospDetail(String hosId) {
JSONObject body = getBody(); JSONObject body = getBody();
if (body != null) {
if (ObjectUtils.isEmpty(hosId)) { if (ObjectUtils.isEmpty(hosId)) {
hosId = body.getString("hosId"); hosId = body.getString("hosId");
} }
}
if (!HCAIGuidanceConfig.IS_DEBUG && !HCAIGuidanceConfig.isVerifySign(request)) { if (!HCAIGuidanceConfig.IS_DEBUG && !HCAIGuidanceConfig.isVerifySign(request)) {
return Result.error(ResultEnum.SIGN_ERROR); // 签名异常 return Result.error(ResultEnum.SIGN_ERROR); // 签名异常
} }
@ -67,12 +69,14 @@ public class AIGuidanceAction extends BaseAction {
@Action("getDeptList") @Action("getDeptList")
public Result getDeptList(String hosId, String branchId) { public Result getDeptList(String hosId, String branchId) {
JSONObject body = getBody(); JSONObject body = getBody();
if (body != null) {
if (ObjectUtils.isEmpty(hosId)) { if (ObjectUtils.isEmpty(hosId)) {
hosId = body.getString("hosId"); hosId = body.getString("hosId");
} }
if (ObjectUtils.isEmpty(branchId)) { if (ObjectUtils.isEmpty(branchId)) {
branchId = body.getString("branchId"); branchId = body.getString("branchId");
} }
}
if (!HCAIGuidanceConfig.IS_DEBUG && !HCAIGuidanceConfig.isVerifySign(request)) { if (!HCAIGuidanceConfig.IS_DEBUG && !HCAIGuidanceConfig.isVerifySign(request)) {
return Result.error(ResultEnum.SIGN_ERROR); // 签名异常 return Result.error(ResultEnum.SIGN_ERROR); // 签名异常
} }
@ -85,6 +89,7 @@ public class AIGuidanceAction extends BaseAction {
@Action("getDoctorList") @Action("getDoctorList")
public Result getDoctorList(String hosId, String branchId, String deptId) { public Result getDoctorList(String hosId, String branchId, String deptId) {
JSONObject body = getBody(); JSONObject body = getBody();
if (body != null) {
if (ObjectUtils.isEmpty(hosId)) { if (ObjectUtils.isEmpty(hosId)) {
hosId = body.getString("hosId"); hosId = body.getString("hosId");
} }
@ -94,6 +99,8 @@ public class AIGuidanceAction extends BaseAction {
if (ObjectUtils.isEmpty(deptId)) { if (ObjectUtils.isEmpty(deptId)) {
deptId = body.getString("deptId"); deptId = body.getString("deptId");
} }
}
if (!HCAIGuidanceConfig.IS_DEBUG && !HCAIGuidanceConfig.isVerifySign(request)) { if (!HCAIGuidanceConfig.IS_DEBUG && !HCAIGuidanceConfig.isVerifySign(request)) {
return Result.error(ResultEnum.SIGN_ERROR); // 签名异常 return Result.error(ResultEnum.SIGN_ERROR); // 签名异常
} }
@ -105,21 +112,23 @@ public class AIGuidanceAction extends BaseAction {
* 4.1.5 查询就诊人列表必选 * 4.1.5 查询就诊人列表必选
*/ */
@Action("getPatientCardList") @Action("getPatientCardList")
public Result getPatientCardList(String hosId, String branchId, String deptId) { public Result getPatientCardList(String hosId, String branchId, String patientId) {
JSONObject body = getBody(); JSONObject body = getBody();
if (body != null) {
if (ObjectUtils.isEmpty(hosId)) { if (ObjectUtils.isEmpty(hosId)) {
hosId = body.getString("hosId"); hosId = body.getString("hosId");
} }
if (ObjectUtils.isEmpty(branchId)) { if (ObjectUtils.isEmpty(branchId)) {
branchId = body.getString("branchId"); branchId = body.getString("branchId");
} }
if (ObjectUtils.isEmpty(deptId)) { if (ObjectUtils.isEmpty(patientId)) {
deptId = body.getString("deptId"); patientId = body.getString("patientId");
}
} }
if (!HCAIGuidanceConfig.IS_DEBUG && !HCAIGuidanceConfig.isVerifySign(request)) { if (!HCAIGuidanceConfig.IS_DEBUG && !HCAIGuidanceConfig.isVerifySign(request)) {
return Result.error(ResultEnum.SIGN_ERROR); // 签名异常 return Result.error(ResultEnum.SIGN_ERROR); // 签名异常
} }
return new AIGuidanceService().getPatientCardList(hosId, branchId, deptId); return new AIGuidanceService().getPatientCardList(hosId, branchId, patientId);
} }

@ -47,9 +47,10 @@ public class MedicalAction extends BaseAction {
* 用户信息获取 | 医保上传 | 医保支付下单 * 用户信息获取 | 医保上传 | 医保支付下单
*/ */
@Action("getFeeDetails") @Action("getFeeDetails")
public Result getFeeDetails(String callNo, String payCode, String qrCode, @AesDecode String openid, @AesDecode String patientId, @AesDecode String cardNo, @AesDecode String hisPatientId, String realName, BigDecimal totalFee, Boolean isSplitTime, String ybAttrib, String ybBZCode, String ybBZName) { public Result getFeeDetails(String callNo, String payCode, String qrCode, @AesDecode String openid, @AesDecode String patientId, @AesDecode String hisPatientId, @AesDecode String cardNo, String realName, String treatNum, BigDecimal totalFee) {
try { try {
log.info("[医保]上传明细下单 callNo={}, payCode={}, openid={}, qrCode={}, patientId={}, cardNo={}, realName={}, hisPatientId={}, totalFee={}, ybAttrib={}, ybBZCode={}, ybBZName={}", callNo, payCode, openid, qrCode, patientId, ParamHelper.hideIdCardNo(cardNo), realName, hisPatientId, totalFee, ybAttrib, ybBZCode, ybBZName); log.info("[医保]上传明细下单 callNo={}, payCode={}, openid={}, qrCode={}, treatNum={}, patientId={}, hisPatientId={}, cardNo={}, realName={}, totalFee={}",
callNo, payCode, openid, qrCode, treatNum, patientId, hisPatientId, ParamHelper.hideIdCardNo(cardNo), realName, totalFee);
if (callNo == null || payCode == null || openid == null || qrCode == null || patientId == null || cardNo == null || totalFee == null) { if (callNo == null || payCode == null || openid == null || qrCode == null || patientId == null || cardNo == null || totalFee == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
@ -62,6 +63,8 @@ public class MedicalAction extends BaseAction {
MedicalInfo medicalInfo; MedicalInfo medicalInfo;
switch (PEnum.toEnum(callNo)) { switch (PEnum.toEnum(callNo)) {
case REG: case REG:
Boolean isSplitTime = getBoolean("isSplitTime");
Register reg = new Register().getRegParams(new RequestParams(request), true); Register reg = new Register().getRegParams(new RequestParams(request), true);
if ("*".equals(reg.getRegCode())) { if ("*".equals(reg.getRegCode())) {
return Result.error("任意医师的号源不能进行医保支付"); return Result.error("任意医师的号源不能进行医保支付");
@ -70,17 +73,27 @@ public class MedicalAction extends BaseAction {
if (!DateHelper.isToday(reg.getRegDate())) { if (!DateHelper.isToday(reg.getRegDate())) {
return Result.error("医保支付仅支持今日挂号"); return Result.error("医保支付仅支持今日挂号");
} }
medicalInfo = new MedicalService().hisRegMedUploadDetails(merchantEnum, qrCode, openid, patientId, cardNo, realName, hisPatientId, reg, isSplitTime); medicalInfo = new MedicalService().hisRegMedUploadDetails(merchantEnum, qrCode, openid, treatNum, patientId, hisPatientId, cardNo, realName, reg, isSplitTime);
break; break;
case RECIPE: case RECIPE:
String treatNum = getString("treatNum"); String ybAttrib = getString("ybAttrib");
String ybBZCode = getString("ybBZCode");
String ybBZName = getString("ybBZName");
String recipeJson = getString("recipeJson"); // 处方JSON集 [{ recipeId: item.id, recipeFee: item.amount }] String recipeJson = getString("recipeJson"); // 处方JSON集 [{ recipeId: item.id, recipeFee: item.amount }]
log.info("[医保-处方]上传明细下单 treatNum={}, recipeJson={}", treatNum, recipeJson); log.info("[医保-处方]上传明细下单 treatNum={}, ybAttrib={}, ybBZCode={}, ybBZName={}, recipeJson={}", treatNum, ybAttrib, ybBZCode, ybBZName, recipeJson);
if (treatNum == null || recipeJson == null) { if (treatNum == null || recipeJson == null) {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
medicalInfo = new MedicalService().hisRxUploadDetails(merchantEnum, qrCode, openid, patientId, cardNo, realName, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName); medicalInfo = new MedicalService().hisRxUploadDetails(merchantEnum, qrCode, openid, treatNum, patientId, hisPatientId, cardNo, realName, totalFee, ybAttrib, ybBZCode, ybBZName, recipeJson);
break;
case IN_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);
break; break;
default: default:

@ -8,6 +8,7 @@ import com.ynxbd.common.helper.common.SmsHelper;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ResultEnum;
import com.ynxbd.common.result.ServiceException; import com.ynxbd.common.result.ServiceException;
import com.ynxbd.wx.config.TZReserveConfig;
import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.config.WeChatConfig;
import com.ynxbd.wx.wxfactory.WxMedHelper; import com.ynxbd.wx.wxfactory.WxMedHelper;
import com.ynxbd.wx.wxfactory.WxPayHelper; import com.ynxbd.wx.wxfactory.WxPayHelper;
@ -54,8 +55,6 @@ public class TestAction extends BaseAction {
} }
// @Action("a") // @Action("a")
// public String a() { // public String a() {
// String sql = "select * from a limit 0, 100"; // String sql = "select * from a limit 0, 100";

@ -73,6 +73,10 @@ public class Dept implements Serializable {
// 亚专科 // 亚专科
private List<Dept> children; private List<Dept> children;
// 有号源
public boolean hasSource() {
return sourceInfo != null && !sourceInfo.contains("无号");
}
} }

@ -21,6 +21,8 @@ public class Doctor implements Serializable {
private Long id; private Long id;
// 科室代码 // 科室代码
private String deptCode; private String deptCode;
// 亚专科
private String subDeptCode;
// 科室名称 // 科室名称
private String deptName; private String deptName;
// 医师代码 // 医师代码

@ -27,6 +27,8 @@ public class AIDoctorSchedule {
// 医生科室id,不允许为空 // 医生科室id,不允许为空
private String departmentId; private String departmentId;
// 亚专科
private String subDeptCode;
// 科室名,不允许为空 // 科室名,不允许为空
private String deptName; private String deptName;

@ -32,4 +32,11 @@ public class InHospitalList {
private String inHospitalDate; private String inHospitalDate;
private String outHospitalDate; private String outHospitalDate;
private String hospitalDays; private String hospitalDays;
// 医保=============================
private String perPay; // 预交金合计
private String sumFee; // 住院总费用
// 为1允许医保支付
private Integer ybFlag;
} }

@ -0,0 +1,35 @@
package com.ynxbd.common.bean.pay;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
@NoArgsConstructor
public class MedInHosp {
private String userIDYBZF;
// 注意:大于0时需要微信收取费用,小于0时需要微信退费
private String payOrRefundMoney;
// 预交金缴费单号
private String prePayOrderId;
// PayOrdId
private String payOrdId;
// ordStas(医保6202返回)
private String ordStas;
// 费用总额(医保6202返回)
private String feeSumamt;
// 现金支付(医保6202返回)
private String ownPayAmt;
// 个人账户支出(医保6202返回)
private String psnAcctPay;
// 保基金支付(医保6202返回)
private String fundPay;
// 住院押金(医保6202返回)
private String deposit;
// 医保扩展数据(医保6202返回)
private String extData;
}

@ -43,6 +43,8 @@ public class HCAIGuidanceConfig {
public final static String HOSP_TEL; public final static String HOSP_TEL;
public final static String BRANCH_ID;
static { static {
XmlConfigHelper config = new XmlConfigHelper().read("hc-config.xml", "ai_guidance"); XmlConfigHelper config = new XmlConfigHelper().read("hc-config.xml", "ai_guidance");
IS_ENABLE = config.getBoolean("is_enable", false); IS_ENABLE = config.getBoolean("is_enable", false);
@ -53,8 +55,10 @@ public class HCAIGuidanceConfig {
IS_SPLIT_TIME_REG = config.getBoolean("is_split_time_reg", true); IS_SPLIT_TIME_REG = config.getBoolean("is_split_time_reg", true);
PARTNER_SECRET = config.getString(IS_DEV ? "dev_partner_secret" : "partner_secret"); PARTNER_SECRET = config.getString(IS_DEV ? "dev_partner_secret" : "partner_secret");
PARTNER_ID = config.getString("partner_id"); PARTNER_ID = config.getString("partner_id");
BRANCH_ID = config.getString("branch_id");
HOSP_ID = config.getString("hosp_id"); HOSP_ID = config.getString("hosp_id");
HOSP_NAME = config.getString("hosp_name"); HOSP_NAME = config.getString("hosp_name");
HOSP_ADDRESS = config.getString("hosp_address", ""); HOSP_ADDRESS = config.getString("hosp_address", "");
@ -63,7 +67,7 @@ public class HCAIGuidanceConfig {
HOSP_TEL = config.getString("hosp_tel", ""); HOSP_TEL = config.getString("hosp_tel", "");
if (PARTNER_ID == null) { if (PARTNER_ID == null) {
log.error("[智能导诊]读取配置文件失败|功能未开启"); log.error("[智能导诊]读取配置文件失败 | 功能未开启");
} }
} }

@ -121,9 +121,9 @@ public class InHospPayDao {
*/ */
public boolean hasPayed(String outTradeNo) { public boolean hasPayed(String outTradeNo) {
String sql = "select * from pay_in_hosp where hisStatus= 0 and outTradeNo= ?"; String sql = "select * from pay_in_hosp where hisStatus= 0 and outTradeNo= ?";
return DataBase.select(sql, PayInHosp.class, ps -> { return !DataBase.select(sql, PayInHosp.class, ps -> {
ps.setString(1, outTradeNo); ps.setString(1, outTradeNo);
}).size() > 0; }).isEmpty();
} }
/** /**
@ -132,7 +132,7 @@ public class InHospPayDao {
* @param outTradeNo 订单号 * @param outTradeNo 订单号
* @return 是否已经发起支付 * @return 是否已经发起支付
*/ */
public PayInHosp selectByTradeNo(String outTradeNo) { public PayInHosp selectByOutTradeNo(String outTradeNo) {
String sql = "select * from pay_in_hosp where hisStatus= -1 and outTradeNo= ?"; String sql = "select * from pay_in_hosp where hisStatus= -1 and outTradeNo= ?";
List<PayInHosp> list = DataBase.select(sql, PayInHosp.class, ps -> { List<PayInHosp> list = DataBase.select(sql, PayInHosp.class, ps -> {
ps.setString(1, outTradeNo); ps.setString(1, outTradeNo);
@ -188,4 +188,56 @@ public class InHospPayDao {
ps.setString(3, outTradeNo); ps.setString(3, outTradeNo);
}) > 0; }) > 0;
} }
/**
* 更新挂号支付信息
*
* @param outTradeNo 订单号
* @param payDate 支付日期
* @param payTime 支付时间
* @param bankTransNo 交易流水号
* @return 信息
*/
public boolean updateMerPaidByOutTradeNo(String outTradeNo, String payDate, String payTime, String bankTransNo) {
String sql = "update pay_in_hosp set payStatus=?, payDate=?, payTime=? where outTradeNo=? and bankTransNo = ?";
return DataBase.update(sql, ps -> {
ps.setInt(1, 0);
ps.setString(2, payDate);
ps.setString(3, payTime);
ps.setString(4, outTradeNo);
ps.setString(5, bankTransNo);
}) > 0;
}
/**
* [住院结算失败]更新HIS返回的错误信息
*
* @param outTradeNo 订单号
* @param hisStatus HIS调用失败code
* @param hisResult HIS失败原因
* @return 是否记录成功
*/
public boolean updateHisPaidFailByOutTradeNo(String outTradeNo, String hisStatus, String hisResult) {
String sql = "update pay_in_hosp set hisStatus=?, hisResult=? where outTradeNo=?";
return DataBase.update(sql, ps -> {
ps.setString(1, hisStatus);
ps.setString(2, hisResult);
ps.setString(3, outTradeNo);
}) > 0;
}
/**
* [住院结算成功] 更新信息
*
* @param outTradeNo 订单号
* @return 是否成功
*/
public boolean updateHisPaidByOutTradeNo(String outTradeNo, String invoiceTransNo) {
String sql = "update pay_in_hosp set payStatus=0, hisStatus=0, invoiceTransNo=? where outTradeNo=? and hisStatus= -1";
return DataBase.update(sql, ps -> {
ps.setString(1, invoiceTransNo);
ps.setString(2, outTradeNo);
}) > 0;
}
} }

@ -5,6 +5,7 @@ import com.ynxbd.common.helper.common.DateHelper;
import com.ynxbd.common.helper.his.HisEnum; import com.ynxbd.common.helper.his.HisEnum;
import com.ynxbd.common.helper.his.HisHelper; import com.ynxbd.common.helper.his.HisHelper;
import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResult;
import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
@ -83,10 +84,11 @@ public class HisInHospDao {
* @param patientId 患者id * @param patientId 患者id
* @return 住院记录 * @return 住院记录
*/ */
public JsonResult getAllHospList(String patientId) { public JsonResult queryOutPatientRecords(String patientId, String hisYBZF) {
return HisHelper.getJsonResult(HisEnum.Query_InHospRecords, params -> { return HisHelper.getJsonResult(HisEnum.Query_OutPatientRecords, params -> {
params.put("PatientID", patientId); params.put("PatientID", patientId);
params.put("CallNo", HisHelper.WECHAT_CALL_NO); params.put("CallNo", HisHelper.WECHAT_CALL_NO);
params.put("YDZF", ObjectUtils.isEmpty(hisYBZF) ? "" : hisYBZF); // 1查询医保
}); });
} }

@ -134,7 +134,45 @@ public class HisMedDao {
/** /**
* HIS医保结算 * 住院结算
*/
public static JsonResult inHospMedUploadDetails(MerchantEnum merchantEnum, String payAuthNo, String cardNo, String treatNum) {
return HisMedHelper.getJsonResult(merchantEnum, HisEnum.YDZF_UploadFeesInfo_ZY, params -> {
params.put("ZYNum", treatNum);
params.put("PayAuthNo", payAuthNo);
});
}
/**
* [住院]HIS医保结算
*
* @param mdUserId 医保用户ID
* @param cashFee 现金
* @param payDate 支付日期
* @param payTime 支付实际
* @param transNo HIS交易流水号
* @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 -> {
params.put("PayDeviceID", "mobile");
params.put("UserID_YBZF", mdUserId);
params.put("PayMoney", cashFee);
params.put("PayDate", payDate);
params.put("PayTime", payTime);
params.put("TransNo", transNo);
params.put("BankTransNo", bankTransNo);
params.put("PayWay", "4");
params.put("Token", "");
params.put("OpenId", openId);
});
}
/**
* [挂号]HIS医保结算
* *
* @param mdUserId 医保用户ID * @param mdUserId 医保用户ID
* @param cashFee 现金 * @param cashFee 现金

@ -737,20 +737,21 @@ public class HisRegisterDao {
* *
* @param begDate 开始时间 * @param begDate 开始时间
* @param endDate 结束时间 * @param endDate 结束时间
* @return 科室列表 * @param deptCode 科室编码-空为所有
* @param canRegFlag [空或0为所有科室; 1:返回有号源的科室]
*/ */
public List<Dept> getTimeDeptList(String begDate, String endDate, String deptCode) { public List<Dept> getTimeDeptList(String begDate, String endDate, String deptCode, String canRegFlag) {
List<Dept> deptList = new ArrayList<>(); List<Dept> deptList = new ArrayList<>();
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
params.put("DeptCode", deptCode);// 空为所有 params.put("DeptCode", deptCode);// 空为所有
params.put("RegistBegDate", begDate); params.put("RegistBegDate", begDate);
params.put("RegistEndDate", endDate); params.put("RegistEndDate", endDate);
params.put("CanRegistFlag", "1"); // 1:返回有号源的科室 params.put("CanRegistFlag", canRegFlag); // [空或0为所有科室; 1:返回有号源的科室]
JsonResult JsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Dept_New, params); JsonResult JsonResult = HisHelper.getJsonResult(HisEnum.AP_Query_Dept_New, params);
if (!JsonResult.success()) { if (!JsonResult.success()) {
log.info("[科室-分时段]{}", JsonResult.getMessage()); log.info("[分时段挂号]查询科室列表 {}", JsonResult.getMessage());
return deptList; return deptList;
} }
@ -850,6 +851,7 @@ public class HisRegisterDao {
doctorJson = doctorJsonList.getJSONObject(k); doctorJson = doctorJsonList.getJSONObject(k);
doctorItem = new Doctor(); doctorItem = new Doctor();
doctorItem.setDeptCode(deptCode); doctorItem.setDeptCode(deptCode);
doctorItem.setSubDeptCode(subDeptCode);
doctorItem.setDeptName(deptName); doctorItem.setDeptName(deptName);
doctorItem.setDoctCode(ParamHelper.spaceFormat(doctorJson.getString("DoctCode"))); doctorItem.setDoctCode(ParamHelper.spaceFormat(doctorJson.getString("DoctCode")));
doctorItem.setDoctName(ParamHelper.spaceFormat(doctorJson.getString("DoctName"))); doctorItem.setDoctName(ParamHelper.spaceFormat(doctorJson.getString("DoctName")));

@ -1,6 +1,7 @@
package com.ynxbd.common.helper.common; package com.ynxbd.common.helper.common;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.dom4j.Document; import org.dom4j.Document;
import org.dom4j.Element; import org.dom4j.Element;
import org.dom4j.io.SAXReader; import org.dom4j.io.SAXReader;
@ -62,7 +63,7 @@ public class XmlConfigHelper {
} }
String val = root.elementTextTrim(rootNode); String val = root.elementTextTrim(rootNode);
return val == null ? defaultVal : Boolean.parseBoolean(val); return ObjectUtils.isEmpty(val) ? defaultVal : Boolean.parseBoolean(val);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return defaultVal; return defaultVal;
@ -97,7 +98,7 @@ public class XmlConfigHelper {
} }
String val = root.elementTextTrim(rootNode); String val = root.elementTextTrim(rootNode);
return val == null ? defaultVal : val; return ObjectUtils.isEmpty(val) ? defaultVal : val;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
@ -114,7 +115,7 @@ public class XmlConfigHelper {
public Integer getInteger(String rootNode) { public Integer getInteger(String rootNode) {
try { try {
String val = getString(rootNode, null); String val = getString(rootNode, null);
return val == null ? null : Integer.parseInt(val.trim()); return ObjectUtils.isEmpty(val)? null : Integer.parseInt(val.trim());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;

@ -77,11 +77,14 @@ public enum HisEnum {
Medical_QueryOrderStatus("[医保]查询医保结算信息", "40025", "YDZF_QueryOrderStatus", 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_Prepay("[住院]查询预交金缴费记录(出院后)", "5003", "AP_Query_Prepay", true),
AP_Query_InpatientFee("[住院]查询住院费用清单(住院中)", "5004", "AP_Query_InpatientFee", true), AP_Query_InpatientFee("[住院]查询住院费用清单(住院中)", "5004", "AP_Query_InpatientFee", true),
AP_Query_InpatientSummaryFee("[住院]查询住院日费用汇总(住院中)", "5006", "AP_Query_InpatientSummaryFee", true), AP_Query_InpatientSummaryFee("[住院]查询住院日费用汇总(住院中)", "5006", "AP_Query_InpatientSummaryFee", true),
Query_InHospRecords("[住院]通过患者ID查询住院记录(出院后)", "1011", "UniversalInterface", true), Query_OutPatientRecords("[住院]通过患者ID查询住院记录(出院后)", "1011", "UniversalInterface", true),
Query_OutHospTreatFee("[住院]通过住院号查询费用明细(出院后)", "1012", "UniversalInterface", true), Query_OutHospTreatFee("[住院]通过住院号查询费用明细(出院后)", "1012", "UniversalInterface", true),

@ -171,6 +171,8 @@ public class Result extends BaseResult {
if (serviceException.getResultEnum() != null) { if (serviceException.getResultEnum() != null) {
status = serviceException.getResultEnum().status; status = serviceException.getResultEnum().status;
} }
} else {
log.error("[异常]", e);
} }
return new Result(status, message); return new Result(status, message);
} }

@ -19,14 +19,13 @@ import com.ynxbd.wx.config.WeChatConfig;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j @Slf4j
public class AIGuidanceService { public class AIGuidanceService {
private final String DEFAULT_IMAGE_PATH = "/wx/web/images/doctor/doctor_header_round.svg";
/** /**
* 查询医院详细信息 * 查询医院详细信息
* *
@ -45,7 +44,7 @@ public class AIGuidanceService {
} }
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("hosId", HCAIGuidanceConfig.HOSP_ID); map.put("hosId", HCAIGuidanceConfig.HOSP_ID);
map.put("branchId", ""); // 如果有分院,则填写分院Id, 主院的分院Id为hosId本身 map.put("branchId", HCAIGuidanceConfig.BRANCH_ID); // 如果有分院,则填写分院Id, 主院的分院Id为hosId本身
map.put("hosName", HCAIGuidanceConfig.HOSP_NAME); // 如果是分院,则填写分院名称,否则填写主院名称 map.put("hosName", HCAIGuidanceConfig.HOSP_NAME); // 如果是分院,则填写分院名称,否则填写主院名称
map.put("hosIntro", HCAIGuidanceConfig.HOSP_INTRO); map.put("hosIntro", HCAIGuidanceConfig.HOSP_INTRO);
map.put("hosLevel", HCAIGuidanceConfig.HOSP_LEVEL); map.put("hosLevel", HCAIGuidanceConfig.HOSP_LEVEL);
@ -86,7 +85,7 @@ public class AIGuidanceService {
List<Dept> deptList; List<Dept> deptList;
if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段 if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段
String curDate = DateHelper.getCurDate(); String curDate = DateHelper.getCurDate();
deptList = new HisRegisterDao().getTimeDeptList(curDate, DateHelper.getMoveDate(curDate, 7), ""); deptList = new HisRegisterDao().getTimeDeptList(curDate, DateHelper.getMoveDate(curDate, 7), "", "0");
} else { } else {
deptList = new RegService().queryHisRegDeptList(); deptList = new RegService().queryHisRegDeptList();
} }
@ -100,10 +99,10 @@ public class AIGuidanceService {
if (addItem == null) { if (addItem == null) {
continue; continue;
} }
dataList.add(addItem);
children = dept.getChildren(); children = dept.getChildren();
if (children != null && !children.isEmpty()) { boolean hasChildren = children != null && !children.isEmpty();
if (hasChildren) {
for (Dept childDept : children) { for (Dept childDept : children) {
childDept.setSubDeptCode(childDept.getDeptCode()); childDept.setSubDeptCode(childDept.getDeptCode());
childDept.setDeptCode(dept.getDeptCode()); childDept.setDeptCode(dept.getDeptCode());
@ -113,6 +112,8 @@ public class AIGuidanceService {
} }
dataList.add(addItem); dataList.add(addItem);
} }
} else {
dataList.add(addItem);
} }
} }
return Result.success(ResultEnum.AI_SUCCESS, dataList); return Result.success(ResultEnum.AI_SUCCESS, dataList);
@ -128,10 +129,10 @@ public class AIGuidanceService {
if (!ObjectUtils.isEmpty(dept.getDeptAlias())) { if (!ObjectUtils.isEmpty(dept.getDeptAlias())) {
deptName = dept.getDeptAlias(); deptName = dept.getDeptAlias();
} }
item.setDeptId(dept.getDeptCode()); item.setDeptId(dept.getDeptCode() + (isSubDept ? ("_" + dept.getSubDeptCode()) : ""));
item.setDeptName(deptName); item.setDeptName(deptName);
item.setDeptIntro(dept.getDescription() == null ? "" : dept.getDescription()); // 科室简介 item.setDeptIntro(dept.getDescription() == null ? "暂无内容" : dept.getDescription()); // 科室简介
item.setDeptAddr(dept.getAddress() == null ? "" : dept.getAddress()); // 科室地址 item.setDeptAddr(dept.getAddress() == null ? "暂无内容" : dept.getAddress()); // 科室地址
item.setLevel(2); item.setLevel(2);
item.setParentDeptId(isSubDept ? dept.getDeptCode() : ""); item.setParentDeptId(isSubDept ? dept.getDeptCode() : "");
item.setFeatureFlag(0); // 是否特色科室 item.setFeatureFlag(0); // 是否特色科室
@ -168,6 +169,15 @@ public class AIGuidanceService {
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
String subDeptCode = null;
if (deptId.contains("_")) {
String[] deptInfo = deptId.split("_");
if (deptInfo.length == 2) {
deptId = deptInfo[0];
subDeptCode = deptInfo[1];
}
}
if (!HCAIGuidanceConfig.HOSP_ID.equals(hosId)) { // 医院id校验 if (!HCAIGuidanceConfig.HOSP_ID.equals(hosId)) { // 医院id校验
log.warn("[智能导诊]医生列表查询-hosId不匹配"); log.warn("[智能导诊]医生列表查询-hosId不匹配");
return Result.success(ResultEnum.AI_SUCCESS, new ArrayList<>()); return Result.success(ResultEnum.AI_SUCCESS, new ArrayList<>());
@ -178,10 +188,10 @@ public class AIGuidanceService {
List<Doctor> doctorList; List<Doctor> doctorList;
if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段 if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段
String curDate = DateHelper.getCurDate(); String curDate = DateHelper.getCurDate();
doctorList = hisRegisterDao.queryHisTimeRegDoctorList(deptId, branchId, curDate, DateHelper.getMoveDate(curDate, 7)); doctorList = hisRegisterDao.queryHisTimeRegDoctorList(deptId, subDeptCode, curDate, DateHelper.getMoveDate(curDate, 7));
} else { } else {
// 注意:需先查询今日挂号 // 注意:需先查询今日挂号
doctorList = hisRegisterDao.queryHisRegTodayDoctorList(deptId, null); // 今日挂号 doctorList = hisRegisterDao.queryHisRegTodayDoctorList(deptId, subDeptCode); // 今日挂号
List<Doctor> resDoctorList = hisRegisterDao.queryHisResRegDoctorList(deptId, null); // 预约挂号 List<Doctor> resDoctorList = hisRegisterDao.queryHisResRegDoctorList(deptId, null); // 预约挂号
for (Doctor doctor : resDoctorList) { for (Doctor doctor : resDoctorList) {
Doctor findItem = doctorList.stream().filter(o -> o.getDoctCode().equals(doctor.getDoctCode())).findFirst().orElse(null); Doctor findItem = doctorList.stream().filter(o -> o.getDoctCode().equals(doctor.getDoctCode())).findFirst().orElse(null);
@ -241,6 +251,11 @@ public class AIGuidanceService {
item.setDoctorImage(domain + headImg); // 头像 item.setDoctorImage(domain + headImg); // 头像
} }
} }
if (ObjectUtils.isEmpty(doctor.getHeadImg())) {
item.setDoctorImage(domain + DEFAULT_IMAGE_PATH);
}
item.setExtraData("{}"); // 额外信息 item.setExtraData("{}"); // 额外信息
item.setIsHTML(true); item.setIsHTML(true);
item.setDoctorMiniWxUrl(""); item.setDoctorMiniWxUrl("");
@ -255,18 +270,18 @@ public class AIGuidanceService {
try { try {
//reg-doct-source?date=2026-03-02&deptCode=0501&doctCode=1477&subDeptCode=0001&deptName=%25E5%25A6%2587%25E7%25A7%2591-%25E5%25A6%2587%25E7%25A7%2591%25E6%2599%25AE%25E9%2580%259A%25E9%2597%25A8%25E8%25AF%258A&doctName=%25E6%2598%258E%25E6%25BB%25A1%25E6%25B1%259F&hospitalArea= //reg-doct-source?date=2026-03-02&deptCode=0501&doctCode=1477&subDeptCode=0001&deptName=%25E5%25A6%2587%25E7%25A7%2591-%25E5%25A6%2587%25E7%25A7%2591%25E6%2599%25AE%25E9%2580%259A%25E9%2597%25A8%25E8%25AF%258A&doctName=%25E6%2598%258E%25E6%25BB%25A1%25E6%25B1%259F&hospitalArea=
Map<String, Object> map = new HashMap<>(); Map<String, Object> urlMap = new HashMap<>();
map.put("date", DateHelper.getCurDate()); urlMap.put("date", DateHelper.getCurDate());
map.put("deptCode", deptCode); urlMap.put("deptCode", deptCode);
map.put("deptName", URLHelper.encodeURL(deptName)); urlMap.put("deptName", URLHelper.encodeURL(deptName));
map.put("doctName", URLHelper.encodeURL(doctor.getDoctName())); urlMap.put("doctName", URLHelper.encodeURL(doctor.getDoctName()));
map.put("doctCode", doctor.getDoctCode()); urlMap.put("doctCode", doctor.getDoctCode());
map.put("subDeptCode", ""); urlMap.put("subDeptCode", "");
map.put("hospitalArea", ""); urlMap.put("hospitalArea", "");
if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) { if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) {
item.setDoctorUrl(webReqURL + "reg-reserve.html#/reg-doct-source" + URLHelper.mapParamsToUrl(map, true)); item.setDoctorUrl(webReqURL + "reg-reserve.html#/reg-doct-source" + URLHelper.mapParamsToUrl(urlMap, true));
} else { } else {
item.setDoctorUrl(webReqURL + "reg-reserve.html#/reg-doctor" + URLHelper.mapParamsToUrl(map, true)); item.setDoctorUrl(webReqURL + "reg-reserve.html#/reg-doctor" + URLHelper.mapParamsToUrl(urlMap, true));
} }
} catch (Exception e) { } catch (Exception e) {
log.error("[智能导诊]医生链接异常:{}", e.getMessage()); log.error("[智能导诊]医生链接异常:{}", e.getMessage());
@ -283,7 +298,7 @@ public class AIGuidanceService {
* @param patientId 患者id * @param patientId 患者id
* @return map * @return map
*/ */
public Result getPatientCardList(String patientId, String hosId, String branchId) { public Result getPatientCardList(String hosId, String branchId, String patientId) {
List<AIPatient> cardList = new ArrayList<>(); List<AIPatient> cardList = new ArrayList<>();
Map<String, Object> resp = new HashMap<>(); Map<String, Object> resp = new HashMap<>();
resp.put("hospitalId", HCAIGuidanceConfig.HOSP_ID); resp.put("hospitalId", HCAIGuidanceConfig.HOSP_ID);
@ -313,6 +328,12 @@ public class AIGuidanceService {
item.setGender("女".equals(patient.getSex()) ? "女" : "男"); // 防空->默认男 item.setGender("女".equals(patient.getSex()) ? "女" : "男"); // 防空->默认男
item.setEcardNo(patientId); item.setEcardNo(patientId);
item.setBirthday(birthday); item.setBirthday(birthday);
Date date = DateHelper.strToDate(patient.getBindDate(), DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss);
String bindTime = DateHelper.dateToStr(date, DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss);
item.setLastBindTime(bindTime == null ? DateHelper.getCurDateTime() : bindTime);
item.setRelation(ObjectUtils.isEmpty(patient.getIdCardNo()) ? "2" : "6"); // 2子女; 6其他
cardList.add(item); cardList.add(item);
resp.put("cardList", cardList); resp.put("cardList", cardList);
@ -325,6 +346,7 @@ public class AIGuidanceService {
*/ */
public Result getDoctorSchedule(String hosId, String branchId, String doctorsJson) { public Result getDoctorSchedule(String hosId, String branchId, String doctorsJson) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("status", "OK");
if (!HCAIGuidanceConfig.HOSP_ID.equals(hosId)) { // 医院id校验 if (!HCAIGuidanceConfig.HOSP_ID.equals(hosId)) { // 医院id校验
log.warn("[智能导诊]获取医生号源排班信息-hosId不匹配"); log.warn("[智能导诊]获取医生号源排班信息-hosId不匹配");
return Result.success(ResultEnum.AI_SUCCESS, map); return Result.success(ResultEnum.AI_SUCCESS, map);
@ -337,13 +359,29 @@ public class AIGuidanceService {
} }
List<AIDoctorSchedule> deptList = new ArrayList<>(); List<AIDoctorSchedule> deptList = new ArrayList<>();
for (AIDoctorSchedule item : doctorScheduleList) { for (AIDoctorSchedule item : doctorScheduleList) {
String docId = item.getDocId(); String docId = item.getDocId();
String departmentId = item.getDepartmentId(); String departmentId = item.getDepartmentId();
AIDoctorSchedule findDept = deptList.stream().filter(o -> o.getDepartmentId().equals(departmentId)).findFirst().orElse(null); String subDeptCode = null;
if (departmentId.contains("_")) {
String[] deptInfo = departmentId.split("_");
if (deptInfo.length == 2) {
departmentId = deptInfo[0];
subDeptCode = deptInfo[1];
}
}
String finalDepartmentId = departmentId;
AIDoctorSchedule findDept = deptList.stream().filter(o -> o.getDepartmentId().equals(finalDepartmentId)).findFirst().orElse(null);
if ("0".equals(docId)) {
docId = "*"; // 任意医生
}
if (findDept == null) { if (findDept == null) {
AIDoctorSchedule dept = new AIDoctorSchedule(); AIDoctorSchedule dept = new AIDoctorSchedule();
dept.setDepartmentId(departmentId); dept.setDepartmentId(departmentId);
dept.setSubDeptCode(subDeptCode);
Map<String, String> doctorIds = new HashMap<>(); Map<String, String> doctorIds = new HashMap<>();
doctorIds.put(docId, docId); doctorIds.put(docId, docId);
dept.setDoctorIds(doctorIds); dept.setDoctorIds(doctorIds);
@ -365,6 +403,7 @@ public class AIGuidanceService {
HisRegisterDao hisRegisterDao = new HisRegisterDao(); HisRegisterDao hisRegisterDao = new HisRegisterDao();
for (AIDoctorSchedule deptItem : deptList) { for (AIDoctorSchedule deptItem : deptList) {
String departmentId = deptItem.getDepartmentId(); String departmentId = deptItem.getDepartmentId();
String subDeptCode = deptItem.getSubDeptCode();
if (ObjectUtils.isEmpty(departmentId)) { if (ObjectUtils.isEmpty(departmentId)) {
continue; continue;
} }
@ -373,10 +412,9 @@ public class AIGuidanceService {
continue; continue;
} }
if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段 if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) { // 分时段
String curDate = DateHelper.getCurDate(); String curDate = DateHelper.getCurDate();
hisDoctorList = hisRegisterDao.queryHisTimeRegDoctorList(departmentId, branchId, curDate, DateHelper.getMoveDate(curDate, 7)); hisDoctorList = hisRegisterDao.queryHisTimeRegDoctorList(departmentId, subDeptCode, curDate, DateHelper.getMoveDate(curDate, 7));
} else { } else {
hisDoctorList = hisRegisterDao.queryHisRegTodayDoctorList(departmentId, null); hisDoctorList = hisRegisterDao.queryHisRegTodayDoctorList(departmentId, null);
List<Doctor> resDoctorList = hisRegisterDao.queryHisResRegDoctorList(departmentId, null); List<Doctor> resDoctorList = hisRegisterDao.queryHisResRegDoctorList(departmentId, null);
@ -391,7 +429,7 @@ public class AIGuidanceService {
for (Map.Entry<String, String> item : doctorIds.entrySet()) { for (Map.Entry<String, String> item : doctorIds.entrySet()) {
String docId = item.getKey(); String docId = item.getKey();
Doctor findRegDoctorItem = regDoctorList.stream().filter(o -> o.getDoctCode().equals(docId)).findFirst().orElse(null); Doctor findRegDoctorItem = regDoctorList.stream().filter(o -> o.getDoctCode().equals(docId)).findFirst().orElse(null);
if (findRegDoctorItem != null) { if (findRegDoctorItem != null) { // 已存在
continue; continue;
} }
Doctor findHisDoctorItem = hisDoctorList.stream().filter(o -> o.getDoctCode().equals(docId)).findFirst().orElse(null); Doctor findHisDoctorItem = hisDoctorList.stream().filter(o -> o.getDoctCode().equals(docId)).findFirst().orElse(null);
@ -410,6 +448,7 @@ public class AIGuidanceService {
AIDoctorSchedule item; AIDoctorSchedule item;
String headImg; String headImg;
for (Doctor doctor : regDoctorList) { for (Doctor doctor : regDoctorList) {
String subDeptCode = doctor.getSubDeptCode();
String deptCode = doctor.getDeptCode(); String deptCode = doctor.getDeptCode();
String deptName = doctor.getDeptName(); String deptName = doctor.getDeptName();
String doctCode = doctor.getDoctCode(); String doctCode = doctor.getDoctCode();
@ -419,7 +458,7 @@ public class AIGuidanceService {
item.setHosId(HCAIGuidanceConfig.HOSP_ID); item.setHosId(HCAIGuidanceConfig.HOSP_ID);
item.setBranchId(branchId); item.setBranchId(branchId);
// //
item.setDocId(doctCode); item.setDocId("*".equals(doctCode) ? "0" : doctCode);
item.setName(doctName); item.setName(doctName);
item.setDepartmentId(deptCode); item.setDepartmentId(deptCode);
item.setDeptName(deptName); item.setDeptName(deptName);
@ -433,24 +472,30 @@ public class AIGuidanceService {
} }
} }
if (ObjectUtils.isEmpty(doctor.getHeadImg())) {
item.setIconURL(domain + DEFAULT_IMAGE_PATH);
}
map.put("date", curDate); Map<String, Object> urlMap = new HashMap<>();
map.put("deptCode", deptCode); urlMap.put("date", curDate);
map.put("deptName", URLHelper.encodeURL(deptName)); urlMap.put("deptCode", deptCode);
map.put("doctName", URLHelper.encodeURL(doctName)); urlMap.put("deptName", URLHelper.encodeURL(deptName));
map.put("doctCode", doctCode); urlMap.put("doctName", URLHelper.encodeURL(doctName));
map.put("subDeptCode", ""); urlMap.put("doctCode", doctCode);
map.put("hospitalArea", ""); urlMap.put("subDeptCode", ObjectUtils.isEmpty(subDeptCode) ? "" : subDeptCode);
urlMap.put("hospitalArea", "");
if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) { if (HCAIGuidanceConfig.IS_SPLIT_TIME_REG) {
item.setUrl(webReqURL + "reg-reserve.html#/reg-doct-source" + URLHelper.mapParamsToUrl(map, true)); item.setUrl(webReqURL + "reg-reserve.html#/reg-doct-source" + URLHelper.mapParamsToUrl(urlMap, true));
} else { } else {
item.setUrl(webReqURL + "reg-reserve.html#/reg-doctor" + URLHelper.mapParamsToUrl(map, true)); item.setUrl(webReqURL + "reg-reserve.html#/reg-doctor" + URLHelper.mapParamsToUrl(urlMap, true));
} }
item.setSchedule(queryDoctorSchedule(deptCode, null, doctCode)); item.setSchedule(queryDoctorSchedule(deptCode, null, doctCode));
doctors.add(item); doctors.add(item);
} }
return Result.success(ResultEnum.AI_SUCCESS, doctors);
map.put("doctors", doctors);
return Result.respJson(map);
} }
public List<AISchedule> queryDoctorSchedule(String deptCode, String subDeptCode, String doctCode) { public List<AISchedule> queryDoctorSchedule(String deptCode, String subDeptCode, String doctCode) {
@ -465,9 +510,11 @@ public class AIGuidanceService {
AISchedule addItem = new AISchedule(); AISchedule addItem = new AISchedule();
addItem.setDate(regDate); addItem.setDate(regDate);
addItem.setAvailable(1); addItem.setAvailable(1);
addItem.setTotal(1);
addItem.setType("普通"); addItem.setType("普通");
schedules.add(addItem); schedules.add(addItem);
} else { } else {
findItem.setTotal(findItem.getAvailable() + 1);
findItem.setAvailable(findItem.getAvailable() + 1); findItem.setAvailable(findItem.getAvailable() + 1);
} }
} }
@ -484,39 +531,47 @@ public class AIGuidanceService {
List<HCHospitalHome> dataList = new ArrayList<>(); List<HCHospitalHome> dataList = new ArrayList<>();
String webReqURL = WeChatConfig.getWebReqURL(true); String webReqURL = WeChatConfig.getWebReqURL(true);
dataList.add(new HCHospitalHome(){{ dataList.add(new HCHospitalHome() {{
setScene("门诊"); setScene("门诊");
setServiceName("预约挂号"); setServiceName("预约挂号");
setH5Url(webReqURL + "reg-reserve.html"); setH5Url(webReqURL + "reg-reserve.html");
setRemark("线上挂号,线下就诊"); setRemark("线上挂号,线下就诊");
setWxAppId(""); setWxAppId("");
setWxAppPath("");
setWxAppOriginalId("");
}}); }});
dataList.add(new HCHospitalHome(){{ dataList.add(new HCHospitalHome() {{
setScene("通用"); setScene("通用");
setServiceName("微官网"); setServiceName("微官网");
setH5Url(webReqURL + "app.html"); setH5Url(webReqURL + "app.html");
setRemark("医院官网,功能分类展示"); setRemark("医院官网,功能分类展示");
setWxAppId(""); setWxAppId("");
setWxAppPath("");
setWxAppOriginalId("");
}}); }});
dataList.add(new HCHospitalHome(){{ dataList.add(new HCHospitalHome() {{
setScene("门诊"); setScene("门诊");
setServiceName("诊间支付"); setServiceName("诊间支付");
setH5Url(webReqURL + "pay-info.html"); setH5Url(webReqURL + "pay-info.html");
setRemark("处方和申请单线上缴费"); setRemark("处方和申请单线上缴费");
setWxAppId(""); setWxAppId("");
setWxAppPath("");
setWxAppOriginalId("");
}}); }});
dataList.add(new HCHospitalHome(){{ dataList.add(new HCHospitalHome() {{
setScene("报告"); setScene("报告");
setServiceName("报告查询"); setServiceName("报告查询");
setH5Url(webReqURL + "all-result.html"); setH5Url(webReqURL + "all-result.html");
setRemark("检验、检查报告查询"); setRemark("检验、检查报告查询");
setWxAppId(""); setWxAppId("");
setWxAppPath("");
setWxAppOriginalId("");
}}); }});
map.put("dataList", dataList); map.put("dataList", dataList);
return Result.success(map); return Result.success(ResultEnum.AI_SUCCESS, map);
} }
} }

@ -2,6 +2,7 @@ package com.ynxbd.common.service;
import com.ynxbd.common.action.pay.PEnum; import com.ynxbd.common.action.pay.PEnum;
import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.in_hosp.InHospitalList;
import com.ynxbd.common.bean.pay.Order; import com.ynxbd.common.bean.pay.Order;
import com.ynxbd.common.bean.pay.PayInHosp; import com.ynxbd.common.bean.pay.PayInHosp;
import com.ynxbd.common.dao.InHospPayDao; import com.ynxbd.common.dao.InHospPayDao;
@ -15,6 +16,8 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/** /**
* 住院 * 住院
@ -61,7 +64,7 @@ public class InHospService {
log.error("{} [住院预交金]更改订单状态失败 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); log.error("{} [住院预交金]更改订单状态失败 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo);
} }
PayInHosp inHosp = inHospPayDao.selectByTradeNo(outTradeNo); PayInHosp inHosp = inHospPayDao.selectByOutTradeNo(outTradeNo);
if (inHosp == null) { if (inHosp == null) {
log.info("{} [住院]没有查询到订单:outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); log.info("{} [住院]没有查询到订单:outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo);
return false; return false;
@ -162,4 +165,37 @@ public class InHospService {
public boolean updateMicroOrderState(String outTradeNo, String bankTransNo, String openid) { public boolean updateMicroOrderState(String outTradeNo, String bankTransNo, String openid) {
return new InHospPayDao().updateMicroOrderState(outTradeNo, bankTransNo, openid); return new InHospPayDao().updateMicroOrderState(outTradeNo, bankTransNo, openid);
} }
// 查询HIS出院记录
public List<InHospitalList> queryHisOutPatientRecords(String patientId) throws ServiceException {
JsonResult resp = new HisInHospDao().queryOutPatientRecords(patientId, null); // 非医保
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 = medResp.getDataMapList(InHospitalList.class, "Items", "Item");
List<InHospitalList> dataList = new ArrayList<>();
for (InHospitalList item : medInHospList) {
item.setYbFlag(1);
dataList.add(item);
}
for (InHospitalList item : inHospList) {
InHospitalList findItem = dataList.stream().filter(o -> o.getZyNum().equals(item.getZyNum())).findFirst().orElse(null);
if (findItem == null) {
dataList.add(item);
}
}
return dataList;
}
public PayInHosp queryByOutTradeNo(String outTradeNo) {
return new InHospPayDao().selectByOutTradeNo(outTradeNo);
}
} }

@ -7,10 +7,12 @@ import com.ynxbd.ali.helper.AliMedHelper;
import com.ynxbd.common.action.pay.PEnum; import com.ynxbd.common.action.pay.PEnum;
import com.ynxbd.common.bean.enums.MerchantEnum; import com.ynxbd.common.bean.enums.MerchantEnum;
import com.ynxbd.common.bean.pay.*; import com.ynxbd.common.bean.pay.*;
import com.ynxbd.common.dao.InHospPayDao;
import com.ynxbd.common.dao.RecipeDao; import com.ynxbd.common.dao.RecipeDao;
import com.ynxbd.common.dao.RegisterDao; import com.ynxbd.common.dao.RegisterDao;
import com.ynxbd.common.dao.his.HisMedDao; import com.ynxbd.common.dao.his.HisMedDao;
import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.helper.common.ParamHelper;
import com.ynxbd.common.result.JsonResult; import com.ynxbd.common.result.JsonResult;
import com.ynxbd.common.result.Result; import com.ynxbd.common.result.Result;
import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ResultEnum;
@ -51,6 +53,7 @@ public class MedicalService {
break; break;
case IN_HOSP: case IN_HOSP:
inHospPaidNotify(merchantEnum, outTradeNo, bankTransNo, payDate, payTime, openid, payInfo);
break; break;
default: default:
@ -74,18 +77,21 @@ public class MedicalService {
return payAuthNo; return payAuthNo;
} }
/** /**
* [医保]挂号上报 * [HIS医保上传明细]挂号上报
* *
* @param merchantEnum 支付类型
* @param qrCode 授权码 * @param qrCode 授权码
* @param openid openid * @param openid openid
* @param patientId 患者id * @param treatNum 门诊号
* @param cardNo 卡号 * @param patientId 患者id | 医共体id
* @param hisPatientId HIS患者id
* @param cardNo 证件号
* @param realName 真实姓名 * @param realName 真实姓名
* @param reg 挂号信息 * @param reg 挂号信息
* @param isSplitTime 是否为分时段
*/ */
public MedicalInfo hisRegMedUploadDetails(MerchantEnum merchantEnum, String qrCode, String openid, String patientId, String cardNo, String realName, String hisPatientId, Register reg, Boolean isSplitTime) throws ServiceException { public MedicalInfo hisRegMedUploadDetails(MerchantEnum merchantEnum, String qrCode, String openid, String treatNum, String patientId, String hisPatientId, String cardNo, String realName, Register reg, Boolean isSplitTime) throws ServiceException {
// 以传递的数据为主 // 以传递的数据为主
reg.setOpenid(openid); reg.setOpenid(openid);
reg.setPatientId(patientId); reg.setPatientId(patientId);
@ -93,24 +99,31 @@ public class MedicalService {
reg.setIdCardNo(cardNo); reg.setIdCardNo(cardNo);
String payAuthNo = getPayAuthNo(merchantEnum, openid, qrCode, cardNo, realName); String payAuthNo = getPayAuthNo(merchantEnum, openid, qrCode, cardNo, realName);
log.info("[医保]上传明细:patientId={}, cardNo={}, realName={}, reg={}", patientId, cardNo, realName, reg); log.info("{}[HIS医保上传明细][挂号]patientId={}, cardNo={}, realName={}, reg={}", merchantEnum.NAME, patientId, ParamHelper.hideIdCardNo(cardNo), realName, reg);
JsonResult result = HisMedDao.regMedUploadDetails(merchantEnum, reg, payAuthNo, cardNo, isSplitTime); JsonResult result = HisMedDao.regMedUploadDetails(merchantEnum, reg, payAuthNo, cardNo, isSplitTime);
return hisMedPlaceOrder(merchantEnum, payAuthNo, result); return hisMedPlaceOrder(merchantEnum, payAuthNo, result);
} }
/** /**
* [医保]处方上报 * [HIS医保上传明细]处方上报
* *
* @param merchantEnum 支付类型
* @param qrCode 授权码 * @param qrCode 授权码
* @param openid openid * @param openid openid
* @param patientId 患者id
* @param cardNo 卡号
* @param realName 真实姓名
* @param treatNum 门诊号 * @param treatNum 门诊号
* @param recipeJson 处方json * @param patientId 患者id | 医共体id
* @param hisPatientId HIS患者id
* @param cardNo 证件号
* @param realName 真实姓名
* @param totalFee 订单金额 * @param totalFee 订单金额
* @param ybAttrib 医保类型
* @param ybBZCode 病种编码
* @param ybBZName 病种名称
* @param recipeJson 处方json
*/ */
public MedicalInfo hisRxUploadDetails(MerchantEnum merchantEnum, String qrCode, String openid, String patientId, String cardNo, String realName, String treatNum, String recipeJson, BigDecimal totalFee, String ybAttrib, String ybBZCode, String ybBZName) throws ServiceException { public MedicalInfo hisRxUploadDetails(MerchantEnum merchantEnum, String qrCode, String openid, String treatNum, String patientId, String hisPatientId, String cardNo, String realName, BigDecimal totalFee, String ybAttrib, String ybBZCode, String ybBZName, String recipeJson) throws ServiceException {
String payAuthNo; String payAuthNo;
if (merchantEnum == MerchantEnum.ALI_MEDICAL) { // 支付宝 if (merchantEnum == MerchantEnum.ALI_MEDICAL) { // 支付宝
payAuthNo = qrCode; payAuthNo = qrCode;
@ -120,12 +133,27 @@ public class MedicalService {
} }
// [验收]测试报告内容[2] // [验收]测试报告内容[2]
log.info("{}[HIS医保上传明细] req={patientId:\"{}\", treatNum:\"{}\", totalFee:\"{}\", cardNo:\"{}\", recipeJson:\"{}\"}", merchantEnum.NAME, patientId, treatNum, totalFee, cardNo, recipeJson); 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); JsonResult result = HisMedDao.rxMedUploadDetails(merchantEnum, payAuthNo, cardNo, openid, patientId, treatNum, recipeJson, totalFee, ybAttrib, ybBZCode, ybBZName);
return hisMedPlaceOrder(merchantEnum, payAuthNo, result); return hisMedPlaceOrder(merchantEnum, payAuthNo, result);
} }
public MedicalInfo hisInHospUploadDetails(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;
} else {
MedicalUserInfo userInfo = WxMedHelper.getUserInfo(openid, qrCode, cardNo, realName);
payAuthNo = userInfo.getPayAuthNo();
}
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);
}
/** /**
* [医保]his下单 * [医保]his下单
* *
@ -467,9 +495,7 @@ public class MedicalService {
log.info("{} [挂号]数据库中未找到订单 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); log.info("{} [挂号]数据库中未找到订单 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo);
return true; return true;
} }
Integer hisStatus = reg.getHisStatus(); if (reg.hasPayStatusPaid() || reg.hasNoticeStatusPaid()) { // 订单已支付 || HIS已收到通知
Integer payStatus = reg.getPayStatus();
if (payStatus == null || hisStatus == null || payStatus == 0 || hisStatus == 0) { // 状态不明确
log.info("{}[医保][挂号]订单已支付 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo); log.info("{}[医保][挂号]订单已支付 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo);
return true; return true;
} }
@ -543,7 +569,98 @@ public class MedicalService {
log.info("[医保][挂号]HIS结算成功 outTradeNo={}, bankTransNo={}, invoiceTransNo={}", outTradeNo, bankTransNo, invoiceTransNo); log.info("[医保][挂号]HIS结算成功 outTradeNo={}, bankTransNo={}, invoiceTransNo={}", outTradeNo, bankTransNo, invoiceTransNo);
// 成功处理 // 成功处理
if (!regDao.updateHisPaidByOutTradeNo(outTradeNo, invoiceTransNo)) { if (!regDao.updateHisPaidByOutTradeNo(outTradeNo, invoiceTransNo)) {
log.error("[医保][挂号]修改成功数据失败"); log.error("[医保][挂号]HIS结算成功-DB修改数据库状态失败");
}
return true;
}
/**
* [医保]住院结算回调通知
*
* @param merchantEnum 类型
* @param outTradeNo 订单号
* @param bankTransNo 交易流水医保
* @param payDate 支付日期
* @param payTime 支付时间
* @param openid openid
* @param payInfo 支付信息
*/
public boolean inHospPaidNotify(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;
}
PayInHosp order = new InHospService().queryByOutTradeNo(outTradeNo);
if (order == null) {
log.info("{} [医保][住院结算]数据库中未找到订单 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo);
return true;
}
if (order.hasPayStatusPaid() || order.hasNoticeStatusPaid()) { // 订单已支付 || HIS已收到通知
log.info("{}[医保][住院结算]订单已支付 outTradeNo={}, bankTransNo={}", merchantEnum.NAME, outTradeNo, bankTransNo);
return true;
}
InHospPayDao inHospPayDao = new InHospPayDao();
if (!new InHospPayDao().updateMerPaidByOutTradeNo(outTradeNo, payDate, payTime, bankTransNo)) {
log.info("[医保][住院结算]修改订单支付状态 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo);
return false;
}
// order.setPayDate(payDate);
// order.setPayTime(payTime);
order.setBankTransNo(bankTransNo);
String mdUserId = order.getMdUserId();
String tradeNo = order.getTradeNo(); // 医保订单号
String chrgBchno = order.getChrgBchno();
BigDecimal cashFee = order.getPayMoney(); // 现金
BigDecimal acctFee = order.getAcctFee(); // 个账
if (mdUserId == null || tradeNo == null || chrgBchno == null || cashFee == null || acctFee == null) {
log.info("[医保][住院结算]HIS结算参数缺失 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}, chrgBchno={}", outTradeNo, bankTransNo, tradeNo, mdUserId, chrgBchno);
return false;
}
//
JsonResult jsonResult = HisMedDao.inHospMedPay(merchantEnum, mdUserId, payDate, payTime, tradeNo, bankTransNo, cashFee, openid);
if (!jsonResult.success()) {
String respCode = jsonResult.getCode();
String respMessage = jsonResult.getMessage();
log.info("[医保][住院结算]HIS结算失败 outTradeNo={}, bankTransNo={}, respCode={}, respMessage={}", outTradeNo, bankTransNo, respCode, respMessage);
if (!inHospPayDao.updateHisPaidFailByOutTradeNo(outTradeNo, respCode, respMessage)) {
log.info("[医保][住院结算]更新HIS缴费失败信息异常 outTradeNo={}, code={}, message={}", outTradeNo, respCode, respMessage);
}
if (jsonResult.isTimeout()) { // 调用超时-不退费
log.info("[医保][住院结算]HIS结算调用超时 outTradeNo={}, bankTransNo={}, tradeNo={}, mdUserId={}", outTradeNo, bankTransNo, tradeNo, mdUserId);
return false;
}
if (respMessage == null || !respMessage.contains("(医保结算部分已回退)")) {
log.info("[医保][住院结算]HIS医保部分未退费成功,禁止现金部分退费 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
return false;
}
if (cashFee.compareTo(BigDecimal.ZERO) == 0) { // 现金部分为0
// log.info("[医保][住院结算]现金为0不执行退费-修改退费状态 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
// if (!inHospPayDao.updateRefundByTradeNo(tradeNo, "OK")) {
// log.info("[医保][住院结算] 修改数据库退费状态失败 tradeNo={}", tradeNo);
// }
return false;
}
if (!WxMedConfig.IS_AUTO_REFUND) {
log.info("[医保][住院结算]现金自动退费功能未开启 outTradeNo={}, bankTransNo={}, tradeNo={}", outTradeNo, bankTransNo, tradeNo);
return false;
}
return false;
}
String invoiceTransNo = jsonResult.getDataMapString("InvoiceTransNo");
log.info("[医保][住院结算]HIS结算成功 outTradeNo={}, bankTransNo={}, invoiceTransNo={}", outTradeNo, bankTransNo, invoiceTransNo);
if (!inHospPayDao.updateHisPaidByOutTradeNo(outTradeNo, invoiceTransNo)) {
log.error("[医保][住院结算]HIS结算成功-DB修改数据库状态失败");
} }
return true; return true;
} }
@ -832,4 +949,6 @@ public class MedicalService {
public MedicalInfo test() throws ServiceException { public MedicalInfo test() throws ServiceException {
throw new ServiceException("[医保授权]失败:" + "测试", false); throw new ServiceException("[医保授权]失败:" + "测试", false);
} }
} }

@ -441,11 +441,16 @@ public class RegService {
return result; return result;
} }
/**
* 今日挂号[取消预约]
*
* @param hisTransNo HIS流水号
*/
public Result refundRegister(String hisTransNo) { public Result refundRegister(String hisTransNo) {
log.info("[今日挂号][取消预约]hisTransNo={}", hisTransNo); log.info("[今日挂号][取消预约]hisTransNo={}", hisTransNo);
if (hisTransNo == null) { if (hisTransNo == null) {
log.info("[今日挂号][取消预约]参数缺失 hisTransNo=null"); log.info("[今日挂号][取消预约]hisTransNo为空");
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }

@ -20,18 +20,20 @@
<is_split_time_reg>true</is_split_time_reg> <is_split_time_reg>true</is_split_time_reg>
<!-- AI版:电子健康卡AppId(管理>开发商接入) | 旧版:合作方ID(腾讯提供)--> <!-- AI版:电子健康卡AppId(管理>开发商接入) | 旧版:合作方ID(腾讯提供)-->
<partner_id>e4a05c13301f2f6a8b07b3de872dfe2d</partner_id> <partner_id>34edf7cd14e646ae9c1bbca791b7b685</partner_id>
<!-- AI版:电子健康卡AppSecret(管理>开发商接入) | 旧版:Token(腾讯提供)--> <!-- AI版:电子健康卡AppSecret(管理>开发商接入) | 旧版:Token(腾讯提供)-->
<partner_secret >e5322dfd9bfab939851319812c30f9f1</partner_secret> <partner_secret >b26188e6142d43b88f01453853d52a0a</partner_secret>
<!-- --> <!-- -->
<dev_partner_secret>e5322dfd9bfab939851319812c30f9f1</dev_partner_secret> <dev_partner_secret>b26188e6142d43b88f01453853d52a0a</dev_partner_secret>
<hosp_id name="医院ID">800002580</hosp_id> <branch_id>800002723</branch_id>
<hosp_id name="医院ID">31737</hosp_id>
<hosp_name name="医院名称">红河州第一人民医院</hosp_name> <hosp_name name="医院名称">红河州第一人民医院</hosp_name>
<hosp_intro name="医院介绍"></hosp_intro> <hosp_intro name="医院介绍">云南省滇南中心医院(红河州第一人民医院)由创建于1950年的红河州第一人民医院和始建于1911年的原红河州第四人民医院于2019年整合而成,是一所集医疗、教学、科研、预防、保健、急救、培训、健康教育为一体的三级甲等综合医院。</hosp_intro>
<hosp_level name="医院等级"></hosp_level> <hosp_level name="医院等级">三级甲等</hosp_level>
<hosp_address name="医院地址"></hosp_address> <hosp_address name="医院地址">云南省红河州个旧市大屯街道锡缘路1号</hosp_address>
<hosp_tel name="联系方式"></hosp_tel> <hosp_tel name="联系方式">0873-3720200</hosp_tel>
</ai_guidance> </ai_guidance>
<pew name="预问诊"> <pew name="预问诊">

@ -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=false # \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.105:8888 # \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:9999 # \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 # \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.105:8888 # \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:9999 # \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
Loading…
Cancel
Save