预约体检功能添加

debug
李进才 1 year ago
parent 506984fbce
commit fe10e472cf
  1. 2
      sql/version_update.sql
  2. 3
      src/main/java/com/ynxbd/common/action/RecipeAction.java
  3. 5
      src/main/java/com/ynxbd/common/action/pay/MedicalAction.java
  4. 9
      src/main/java/com/ynxbd/common/action/pay/PayAction.java
  5. 2
      src/main/java/com/ynxbd/common/bean/pay/Register.java
  6. 2
      src/main/java/com/ynxbd/common/dao/RegisterDao.java
  7. 9
      src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java
  8. 12
      src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java
  9. 9
      src/main/java/com/ynxbd/common/dao/peis/PeisDao.java
  10. 2
      src/main/java/com/ynxbd/common/helper/his/HisEnum.java
  11. 40
      src/main/java/com/ynxbd/common/service/PeisService.java
  12. 90
      src/main/java/com/ynxbd/common/service/RegService.java
  13. 17
      src/main/java/com/ynxbd/wx/servlet/test/RefundTest.java
  14. 2
      src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java
  15. 2
      src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java
  16. 2
      src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java
  17. 3
      src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java
  18. BIN
      src/main/resources/apiclient_cert.p12
  19. 2
      src/main/resources/medical.properties
  20. 27
      src/main/resources/wx.properties

@ -203,7 +203,7 @@ CREATE TABLE `peis_reserve` (
`PatientID` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `PatientID` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`OutTradeNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `OutTradeNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`BankTransNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `BankTransNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`TradeNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '', `TradeNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`RecipeID` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `RecipeID` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`TreatNum` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `TreatNum` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`TotalFee` decimal(10,3) DEFAULT NULL, `TotalFee` decimal(10,3) DEFAULT NULL,

@ -103,8 +103,7 @@ public class RecipeAction extends BaseAction {
if(treatNum==null||personID==null||recipes==null){ if(treatNum==null||personID==null||recipes==null){
return Result.error(ResultEnum.PARAM_IS_DEFECT); return Result.error(ResultEnum.PARAM_IS_DEFECT);
} }
List<medicalRecipe> medicalRecipe = new HisRecipeDao().uploadMedicalRecipe(treatNum,personID,recipes); return new HisRecipeDao().uploadMedicalRecipe(treatNum,personID,recipes);
return Result.success(medicalRecipe);
} }
// /** // /**

@ -93,6 +93,11 @@ public class MedicalAction extends BaseAction {
JSONObject respJson = WxMedicalHelper.getMdAuthUrl("wx-medical-refund.html", null); JSONObject respJson = WxMedicalHelper.getMdAuthUrl("wx-medical-refund.html", null);
return Result.success(respJson); return Result.success(respJson);
} }
@Action("getMedicalAuthUrl")
public Result getMedicalAuthUrl(String url) {
JSONObject respJson = WxMedicalHelper.getMdAuthUrl(url, null);
return Result.success(respJson);
}
/** /**
* 获取对账链接 * 获取对账链接

@ -1,6 +1,7 @@
package com.ynxbd.common.action.pay; package com.ynxbd.common.action.pay;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.bocom.api.response.foreignccy.QueryReservationRegistResponseV1;
import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.action.base.BaseAction;
import com.ynxbd.common.bean.ConfigSelfHelp; import com.ynxbd.common.bean.ConfigSelfHelp;
import com.ynxbd.common.bean.RecipeHelp; import com.ynxbd.common.bean.RecipeHelp;
@ -177,11 +178,12 @@ public class PayAction extends BaseAction {
*/ */
@Action("peisRefund") @Action("peisRefund")
public Result peisRefund(String recipeId, String payCode, String outTradeNo, String totalFee,String openid){ public Result peisRefund(String recipeId, String payCode, String outTradeNo, String totalFee,String openid){
log.info("[体检预约]取消预约退费,recipeId-{}.payCode-{},outTradeNo-{},totalFee-{},openid-{}",recipeId,payCode,outTradeNo,totalFee,openid);
PeisService peisService = new PeisService(); PeisService peisService = new PeisService();
MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByCode(payCode); MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByCode(payCode);
PeisDao peisDao = new PeisDao(); PeisDao peisDao = new PeisDao();
Recipe recipe = peisDao.selectByOutTradeNo(outTradeNo); Recipe recipe = peisDao.selectByOutTradeNo(outTradeNo);
if(!new BigDecimal(totalFee).equals(new BigDecimal(String.valueOf(recipe.getTotalFee())))){ if(new BigDecimal(totalFee).compareTo(recipe.getTotalFee())!=0){
return Result.error(ResultEnum.REFUND_MONEY_ERROR); return Result.error(ResultEnum.REFUND_MONEY_ERROR);
} }
String pushMessage = "已申请退款,原因:患者主动取消退费,订单号:" + outTradeNo +"orderNo:"+ recipeId; String pushMessage = "已申请退款,原因:患者主动取消退费,订单号:" + outTradeNo +"orderNo:"+ recipeId;
@ -501,6 +503,11 @@ public class PayAction extends BaseAction {
return new RegService().cancelRegReserve(patientId, tradeNo, hisTransNo); return new RegService().cancelRegReserve(patientId, tradeNo, hisTransNo);
} }
@Action("refundRegister")
public Result refundRegister(String hisTransNo){
return new RegService().refundRegister(hisTransNo);
}
/** /**
* 第三方手动退费 * 第三方手动退费

@ -38,6 +38,8 @@ public class Register extends Order {
private BigDecimal clinicFee; private BigDecimal clinicFee;
private String clinicCode; private String clinicCode;
private String clinicName; private String clinicName;
private String refundDate;
// 时段id // 时段id
private String tid; private String tid;
// 时段名 // 时段名

@ -167,7 +167,7 @@ public class RegisterDao {
if (isToday) { // 今日挂号 if (isToday) { // 今日挂号
hisRegs = hisRegisterDao.hasRegSite(patientId, regDate); hisRegs = hisRegisterDao.hasRegSite(patientId, regDate);
for (Register hisReg : hisRegs) { for (Register hisReg : hisRegs) {
if (deptCode.equals(hisReg.getDeptCode())) { if (deptCode.equals(hisReg.getDeptCode())&&(hisReg.getRefundDate()==null||"".equals(hisReg.getRefundDate()))) {
return true; return true;
} }
} }

@ -6,6 +6,7 @@ import com.ynxbd.common.bean.xk.medicalRecipe;
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 com.ynxbd.common.result.Result;
import com.ynxbd.wx.config.WeChatConfig; 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;
@ -95,10 +96,10 @@ public class HisRecipeDao {
return resultList; return resultList;
} }
public List<medicalRecipe> uploadMedicalRecipe(String treatNum, String personID, String recipes) { public Result uploadMedicalRecipe(String treatNum, String personID, String recipes) {
List<medicalRecipe> resultList = new ArrayList<>(); List<medicalRecipe> resultList = new ArrayList<>();
JsonResult jsonResult = HisHelper.getJsonResult(HisEnum.XK_MEDICAL_RECIPE, params -> { JsonResult jsonResult = HisHelper.getMdJsonResult(HisEnum.XK_MEDICAL_RECIPE, params -> {
params.put("PersonID",personID); params.put("PersonID",personID);
params.put("MZNum", treatNum); params.put("MZNum", treatNum);
params.put("CallNo",HisHelper.CALL_NO); params.put("CallNo",HisHelper.CALL_NO);
@ -106,14 +107,14 @@ public class HisRecipeDao {
}); });
if (!jsonResult.success()) { // 失败 if (!jsonResult.success()) { // 失败
return resultList; return Result.error(jsonResult.getMessage());
} }
List<medicalRecipe> medicalRecipe = jsonResult.getDataMapList(medicalRecipe.class, "CFNums","Item"); List<medicalRecipe> medicalRecipe = jsonResult.getDataMapList(medicalRecipe.class, "CFNums","Item");
if (medicalRecipe != null) { if (medicalRecipe != null) {
resultList = medicalRecipe; resultList = medicalRecipe;
} }
return resultList; return Result.success(resultList);
} }

@ -490,6 +490,7 @@ public class HisRegisterDao {
reg.setRegDate(node.getString("RegistDate")); reg.setRegDate(node.getString("RegistDate"));
reg.setBegTime(node.getString("BegTime")); reg.setBegTime(node.getString("BegTime"));
reg.setEndTime(node.getString("EndTime")); reg.setEndTime(node.getString("EndTime"));
reg.setRefundDate(node.getString("RefundDate"));
// 是否取号 // 是否取号
reg.setIsTake(node.getInteger("IsTake")); reg.setIsTake(node.getInteger("IsTake"));
// 是否就诊 // 是否就诊
@ -601,6 +602,17 @@ public class HisRegisterDao {
return HisHelper.getJsonResult(HisEnum.AP_Recall_Reservation, params, merchantEnum); return HisHelper.getJsonResult(HisEnum.AP_Recall_Reservation, params, merchantEnum);
} }
/**
* 今日挂号-取消挂号
* @return
*/
public JsonResult refundRegister(String tradeNo,MerchantEnum merchantEnum){
Map<String, Object> params = new HashMap<>();
params.put("TransNo",tradeNo);
params.put("DelTransNo","R" + tradeNo);
return HisHelper.getJsonResult(HisEnum.AP_Refund_Register,params,merchantEnum);
}
/** /**
* 查询患者是否挂过号 * 查询患者是否挂过号
* *

@ -61,6 +61,13 @@ public class PeisDao {
return null; return null;
} }
public boolean checkRefund(String outTradeNo){
String sql = "select * from peis_reserve where outTradeNo=? and refundResult = 'OK'";
return !DataBase.select(sql,Recipe.class,ps->{
ps.setString(1,outTradeNo);
}).isEmpty();
}
public Recipe selectByRecipeId(String recipeId) { public Recipe selectByRecipeId(String recipeId) {
String sql = "select * from peis_reserve where recipeId=? and peisStatus = 0 and payStatus=0 order by updateTime desc"; String sql = "select * from peis_reserve where recipeId=? and peisStatus = 0 and payStatus=0 order by updateTime desc";
List<Recipe> list = DataBase.select(sql, Recipe.class, ps -> { List<Recipe> list = DataBase.select(sql, Recipe.class, ps -> {
@ -99,7 +106,7 @@ public class PeisDao {
} }
public boolean updatePeisStateOk(String outTradeNo, String bankTransNo) { public boolean updatePeisStateOk(String outTradeNo, String bankTransNo) {
String sql = "update peis_reserve set peisStatus=0, bankTransNo=? where outTradeNo=? and bankTransNo is null"; String sql = "update peis_reserve set peisStatus=0, bankTransNo=? where outTradeNo=?";
return DataBase.update(sql, ps -> { return DataBase.update(sql, ps -> {
ps.setString(1, bankTransNo); ps.setString(1, bankTransNo);
ps.setString(2, outTradeNo); ps.setString(2, outTradeNo);

@ -46,6 +46,8 @@ public enum HisEnum {
AP_Reservation("[预约挂号]执行预约", "3003", "AP_Reservation", true), AP_Reservation("[预约挂号]执行预约", "3003", "AP_Reservation", true),
AP_Recall_Reservation("[预约挂号]取消预约", "3006", "AP_Recall_Reservation", true), AP_Recall_Reservation("[预约挂号]取消预约", "3006", "AP_Recall_Reservation", true),
AP_Refund_Register("[今日挂号]取消预约", "4007", "AP_Refund_Register", true),
// 支付[自定义]------------------ // 支付[自定义]------------------
Create_Self_Help("[处方]生成自助申请单", "10001", "UniversalInterface", true), Create_Self_Help("[处方]生成自助申请单", "10001", "UniversalInterface", true),
Query_Self_Help("[处方]查询自助申请单信息", "10002", "UniversalInterface", true), Query_Self_Help("[处方]查询自助申请单信息", "10002", "UniversalInterface", true),

@ -83,17 +83,23 @@ public class PeisService {
.add("outTradeNo",outTradeNo) .add("outTradeNo",outTradeNo)
.build(); .build();
String result = OkHttpHelper.post(XBDHelper.XBD_PEIS + "/wxUse/wxPay", formBody); String result = OkHttpHelper.post(XBDHelper.XBD_PEIS + "/wxUse/wxPay", formBody);
JSONObject jsonResult = JsonHelper.parseObject(result);
log.info("[体检预约]缴费成功回调体检系统计费 recipeId={}, bankTransNo-{}, 计费状态-{}, 计费信息-{}", recipeId, bankTransNo, jsonResult.get("code"), jsonResult.get("message"));
if(result==null){ if(result==null){
String pushMessage = "体检预约失败已申请退款,原因:体检系统计费失败,订单号:" + outTradeNo+"orderNo:"+ recipeId; log.info("[体检预约]体检服务无响应,开始退费");
String pushMessage = "体检预约失败已申请退款,原因:体检服务无响应,订单号:" + outTradeNo+"orderNo:"+ recipeId;
peisAutoRefund(recipeId,merchantEnum,outTradeNo,totalFee,pushMessage,tradeDate,openid); peisAutoRefund(recipeId,merchantEnum,outTradeNo,totalFee,pushMessage,tradeDate,openid);
} }
if("200".equals(jsonResult.get("code"))){ JSONObject jsonResult = JsonHelper.parseObject(result);
log.info("[体检预约]缴费成功回调体检系统计费 recipeId={}, bankTransNo-{}, 计费状态-{}, 计费信息-{}", recipeId, bankTransNo, jsonResult.get("code"), jsonResult.get("message"));
if("200".equals(jsonResult.get("code").toString())){
if(!peisDao.updatePeisStateOk(outTradeNo, bankTransNo)){ if(!peisDao.updatePeisStateOk(outTradeNo, bankTransNo)){
log.info("[体检预约]修改体检系统支付状态失败 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); log.info("[体检预约]修改体检系统支付状态失败 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo);
} }
} }
else {
log.info("[体检预约]回调体检系统计费状态码异常 recipeId={}, bankTransNo-{}, 计费状态-{}, 计费信息-{}", recipeId, bankTransNo, jsonResult.get("code"), jsonResult.get("message"));
String pushMessage = "体检预约失败已申请退款,原因:体检系统计费失败,订单号:" + outTradeNo+"orderNo:"+ recipeId;
peisAutoRefund(recipeId,merchantEnum,outTradeNo,totalFee,pushMessage,tradeDate,openid);
}
} }
} }
@ -110,37 +116,41 @@ public class PeisService {
*/ */
public Result peisAutoRefund(String recipeId, MerchantEnum merchantEnum, String outTradeNo, BigDecimal totalFee, String pushInfo, Date tradeDate, String openid){ public Result peisAutoRefund(String recipeId, MerchantEnum merchantEnum, String outTradeNo, BigDecimal totalFee, String pushInfo, Date tradeDate, String openid){
PeisDao peisDao = new PeisDao(); PeisDao peisDao = new PeisDao();
if(peisDao.checkRefund(outTradeNo)){
log.info("{} [体检预约][该订单已经退费,请不要重复退费] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee);
return Result.error("该订单已经退费,请不要重复退费");
}
String result = OkHttpHelper.get(XBDHelper.XBD_PEIS+"/wxUse/GetOrder",params -> { String result = OkHttpHelper.get(XBDHelper.XBD_PEIS+"/wxUse/GetOrder",params -> {
params.put("orderNo",recipeId); params.put("orderNo",recipeId);
}); });
JSONObject jsonResult = JsonHelper.parseObject(result);
if(result==null){ if(result==null){
log.info("{} [体检预约][退费错误,计费信息查询失败] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}",recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); log.info("{} [体检预约][退费错误,计费信息查询失败] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee);
return Result.error("退费错误,计费信息查询失败"); return Result.error("退费错误,计费信息查询失败");
} }
JSONObject jsonResult = JsonHelper.parseObject(result);
String fee = jsonResult.getJSONObject("data").get("fee").toString(); String fee = jsonResult.getJSONObject("data").get("fee").toString();
boolean isWxPay = Boolean.parseBoolean(jsonResult.getJSONObject("data").get("isWxPay").toString()); boolean isWxPay = Boolean.parseBoolean(jsonResult.getJSONObject("data").get("isWxPay").toString());
boolean isCost = Boolean.parseBoolean(jsonResult.getJSONObject("data").get("isCost").toString()); boolean isCost = Boolean.parseBoolean(jsonResult.getJSONObject("data").get("isCost").toString());
if(totalFee.compareTo(BigDecimal.ZERO)==0||"0".equals(fee)){ if(totalFee.compareTo(BigDecimal.ZERO)==0||"0".equals(fee)){
log.info("{} [体检预约][退费错误,退费金额为0] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}",recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); log.info("{} [体检预约][退费错误,退费金额为0] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee);
return Result.error("退费错误,退费金额为0"); return Result.error("退费错误,退费金额为0");
} }
if(totalFee.equals(new BigDecimal(String.valueOf(fee)))){ if(totalFee.compareTo(new BigDecimal(fee))!=0){
log.info("{} [体检预约][退费错误,退费金额跟订单金额不符] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}",recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); log.info("{} [体检预约][退费错误,退费金额跟订单金额不符] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee);
return Result.error("退费错误,退费金额跟订单金额不符"); return Result.error("退费错误,退费金额跟订单金额不符");
} }
if(isWxPay){ // if(isWxPay){
log.info("{} [体检预约][退费错误,体检显示已计费,不允许退费] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}", recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); // log.info("{} [体检预约][退费错误,体检显示已计费,不允许退费] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}", recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee);
return Result.error("退费错误,体检显示已计费,不允许退费"); // return Result.error("退费错误,体检显示已计费,不允许退费");
} // }
if(isCost){ if(isCost){
log.info("{} [体检预约][退费错误,his显示已计费,不允许退费] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}", recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); log.info("{} [体检预约][退费错误,his显示已计费,不允许退费] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee);
return Result.error("退费错误,his显示已计费,不允许退费"); return Result.error("退费错误,his显示已计费,不允许退费");
} }
String refundResult; String refundResult;
Order orderRefund = PayService.refund(merchantEnum, outTradeNo, recipeId, totalFee, totalFee, pushInfo, tradeDate, openid, null, pushInfo); Order orderRefund = PayService.refund(merchantEnum, outTradeNo, recipeId, totalFee, totalFee, pushInfo, tradeDate, openid, null, pushInfo);
if (!orderRefund.isSuccess()) { if (!orderRefund.isSuccess()) {
log.info("{} [体检预约][退费错误] outTradeNo={}, recipeId={}, totalFee={},recipeId-{}", merchantEnum.NAME, outTradeNo, recipeId, totalFee,recipeId); log.info("{} [体检预约][退费错误] outTradeNo={}, totalFee={},recipeId-{}", merchantEnum.NAME, outTradeNo, totalFee,recipeId);
refundResult = orderRefund.getRefundResult(); refundResult = orderRefund.getRefundResult();
} }
else { else {

@ -450,6 +450,83 @@ public class RegService {
return result; return result;
} }
public Result refundRegister(String hisTransNo) {
log.info("[今日挂号][取消预约]hisTransNo={}", hisTransNo);
if (hisTransNo == null) {
log.info("[今日挂号][取消预约]参数缺失 hisTransNo=null");
return Result.error(ResultEnum.PARAM_IS_DEFECT);
}
Register reg = new RegisterDao().selectRegByHisTransNo(hisTransNo);
if (reg == null) {
log.info("[今日挂号][取消预约]失败, 未查询到挂号支付信息");
return Result.error(ResultEnum.DATA_NOT_FOUND);
}
String tradeNo = reg.getTradeNo();
String outTradeNo = reg.getOutTradeNo();
MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByOutTradeNo(outTradeNo);
JsonResult JsonResult = new HisRegisterDao().refundRegister(tradeNo, merchantEnum);
if (!JsonResult.success()) {
String message = JsonResult.getMessage();
log.info("[今日挂号][取消预约]失败 HIS返回:{}", message);
return Result.error(message);
}
String dbTradeNo = reg.getTradeNo();
BigDecimal payMoney = reg.getPayMoney();
if (dbTradeNo == null || outTradeNo == null || payMoney == null) {
log.info("[今日挂号][取消预约]失败, 支付信息的参数为空, tradeNo={}, payMoney={}", tradeNo, payMoney);
return Result.error("今日挂号支付信息的参数为空");
}
if("OK".equals(reg.getRefundResult())){
return Result.error("已退费,请不要重复退费");
}
if (merchantEnum == null) {
return Result.error("支付方式未匹配 outTradeNo=" + outTradeNo);
}
log.info("{}[今日挂号][取消预约]开始退款:outTradeNo={}, dbTradeNo={}, payMoney={}", merchantEnum.NAME, outTradeNo, dbTradeNo, payMoney);
String pushInfo = "取消预约 科室:" + reg.getDeptName();
Result result = refundTodayRegister(merchantEnum, JsonResult, reg.getOpenid(), payMoney, outTradeNo, dbTradeNo, "取消预约", pushInfo, reg.getUpdateTime());
// 短信通知
if (HospEnum.isHosp(HospEnum.德宏州中医医院)) {
String tel = reg.getTel();
if (tel != null && tel.length() == 11) {
String template = "SMS_184121392";
SmsRegTem sms = new SmsRegTem();
sms.setTime(reg.getRegDate() + " " + reg.getBegTime() + "-" + reg.getEndTime());
sms.setDeptName(reg.getDeptName());
sms.setDoctorName(reg.getDoctName());
sms.setAddress(reg.getAddress());
sms.setSeq(reg.getQueueNum());
SmsHelper.send(template, tel, sms);
}
}
MessagePushConfig.regCancelPush(merchantEnum, reg);
if (result.isSuccess()) {
result.setMessage(merchantEnum.NAME + "取消成功,挂号费用将在24小时内退回!"); // 修改返回提示的信息
}
if (MerchantEnum.ALI.equals(merchantEnum)) {
String link = "pages/center/components/remordList/reserve";
String title = "预约挂号取消 " + reg.getDeptName();
AliMessageHelper.hospitalOrder(reg.getOpenid(), title, AliMsgEnum.MERCHANT_CLOSED, reg.getUpdateTime(), false, reg.getTotalFee(), outTradeNo, reg.getRegDate(), reg.getBegTime(), reg.getDeptCode(), reg.getDeptName(), reg.getDoctName(),
AliHelper.getLink(link, null));
}
return result;
}
/** /**
* 挂号手动退费 * 挂号手动退费
@ -579,6 +656,17 @@ public class RegService {
* @param hisResult 记录信息 * @param hisResult 记录信息
*/ */
public Result regAutoRefund(MerchantEnum merchantEnum, JsonResult JsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate) { public Result regAutoRefund(MerchantEnum merchantEnum, JsonResult JsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate) {
log.info("[预约挂号/挂号失败自动退费][开始退费]---merchantEnum-{},JsonResult-{},openid-{},totalFee-{},outTradeNo-{},tradeNo-{},hisResult-{},pushInfo-{},tradeDate-{}",merchantEnum,JsonResult,openid,totalFee,outTradeNo,tradeNo,hisResult,pushInfo,tradeDate);
return regRefund(merchantEnum,JsonResult,openid,totalFee,outTradeNo,tradeNo,hisResult,pushInfo,tradeDate,false);
}
public Result refundTodayRegister(MerchantEnum merchantEnum, JsonResult JsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate){
log.info("[今日挂号][开始退费]---merchantEnum-{},JsonResult-{},openid-{},totalFee-{},outTradeNo-{},tradeNo-{},hisResult-{},pushInfo-{},tradeDate-{}",merchantEnum,JsonResult,openid,totalFee,outTradeNo,tradeNo,hisResult,pushInfo,tradeDate);
return regRefund(merchantEnum,JsonResult,openid,totalFee,outTradeNo,tradeNo,hisResult,pushInfo,tradeDate,true);
}
public Result regRefund(MerchantEnum merchantEnum, JsonResult JsonResult, String openid, BigDecimal totalFee, String outTradeNo, String tradeNo, String hisResult, String pushInfo, Date tradeDate,boolean isToday){
RegisterDao regDao = new RegisterDao(); RegisterDao regDao = new RegisterDao();
String code = JsonResult.getCode(); String code = JsonResult.getCode();
@ -592,6 +680,7 @@ public class RegService {
return Result.error("[挂号不退费]HIS请求超时"); return Result.error("[挂号不退费]HIS请求超时");
} }
if(!isToday){
// 如果HIS交过费返回true-->就不向下执行(自动退款) // 如果HIS交过费返回true-->就不向下执行(自动退款)
String dateShort = DateGenerate.getStringDateShort(); String dateShort = DateGenerate.getStringDateShort();
String paidTip = new HisAccountDao().isPaid(DateGenerate.getNextDay(dateShort, "-7"), DateGenerate.getNextDay(dateShort, "7"), tradeNo); String paidTip = new HisAccountDao().isPaid(DateGenerate.getNextDay(dateShort, "-7"), DateGenerate.getNextDay(dateShort, "7"), tradeNo);
@ -599,6 +688,7 @@ public class RegService {
log.info("[挂号][退费错误] paidTip={}, outTradeNo={}, tradeNo={}", paidTip, outTradeNo, tradeNo); log.info("[挂号][退费错误] paidTip={}, outTradeNo={}, tradeNo={}", paidTip, outTradeNo, tradeNo);
return Result.error(paidTip); return Result.error(paidTip);
} }
}
String refundResult; String refundResult;
if (totalFee.compareTo(BigDecimal.ZERO) != 0) { // 金为0 if (totalFee.compareTo(BigDecimal.ZERO) != 0) { // 金为0

@ -0,0 +1,17 @@
package com.ynxbd.wx.servlet.test;
import com.ynxbd.wx.wxfactory.WxPayHelper;
import java.math.BigDecimal;
/**
* @author 李进才
* @ClassName RefundTest
* @Description TODO
* @date 2023/12/20 11:51:00
*/
public class RefundTest {
public static void main(String[] args) {
WxPayHelper.refund("WX34361d8ce54248773cf9acf4bdf8", "4200002138202312203358207528", new BigDecimal("0.800"), new BigDecimal("0.800"), "手动退费");
}
}

@ -25,7 +25,7 @@ public class RefundTestServlet extends BaseServlet {
if (i == 0) { if (i == 0) {
i++; i++;
// 1 // 1
WxPayHelper.refund("WXa2461a129809408f98855b233f78", "4200001568202210073105718801C001", new BigDecimal("0.24"), new BigDecimal("0.24"), "批次编号:20043945妇科材料库“一次性使用无菌阴道扩张器中号A型轴转式”的库存为2已不足执行2个过程失败!"); WxPayHelper.refund("WX66ac39360f1245abb138ef932e78", "4200002102202312207984632409", new BigDecimal("0.800"), new BigDecimal("0.800"), "手动退费");
// 2 // 2
} }

@ -20,7 +20,7 @@ public class DesEncryptHelper {
public static void main(String[] args) { public static void main(String[] args) {
String s = enCode("oeso-t62kkoRwLVVkSkwmmjPfUXk"); String s = enCode("oeso-t62kkoRwLVVkSkwmmjPfUXk");
String a= deCode("CF9810D012B475160230870349C6CE4D2AC51B0337640E0607DE6D536EBF9B7793FB12F6871356772FC721D2DE4BCF5E6B182EEFD24EC126D2BDA7639A3777A6E37D2699575F23F0645B81DE2224E1342F5C65AEFE133B3DED63CEF161F1772CEB46D1D447D194ACAF7103055F9C4F12FEFF8750524AC698E0E06CF7829216A59C43992E5BD876FC"); String a= deCode("63E55CC1CC18DA5DF786FA985D60BCF5E7CD1F925928AB92E75F00E16C14D180C3EEC068D96124953A20B27E5F673E9417F5E3B8B29B116B29B10E1B611BDCBC37D5916AA86830CCF1E9BEDBD4CB1642E174481814738DECC875FA26781DC6546AAA205CE74F3B6A284E738AC3D0D2B60DCB8B29E78277798B0639BE9CC546A9479819B0095698BB");
System.out.println(a); System.out.println(a);
} }

@ -21,7 +21,7 @@ public class ReqParamHelper {
} }
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(encode("30124039")); System.out.println(encode("11269420"));
System.out.println(decode("5AE40D74FFF8C3F14A0491F8824C61EE")); System.out.println(decode("5AE40D74FFF8C3F14A0491F8824C61EE"));
} }
} }

@ -2,6 +2,7 @@ package com.ynxbd.wx.wxfactory.utils;
import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.ErrorHelper;
import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.helper.common.JsonHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
@ -17,6 +18,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Slf4j
public class WxSignHelper { public class WxSignHelper {
// 签名类型 // 签名类型
final public static String SIGN_TYPE_MD5 = "MD5"; final public static String SIGN_TYPE_MD5 = "MD5";
@ -44,6 +46,7 @@ public class WxSignHelper {
if (signType == null) { if (signType == null) {
signType = SIGN_TYPE_MD5; signType = SIGN_TYPE_MD5;
} }
log.info("[医保]签名前参数:paramsStr-{}",paramsStr + "&key=" + key);
if (SIGN_TYPE_HMAC_SHA256.equalsIgnoreCase(signType)) { if (SIGN_TYPE_HMAC_SHA256.equalsIgnoreCase(signType)) {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");

@ -24,4 +24,4 @@ medical.partner_secret=f92df3128382757425ba4c5ca166688f
medical.channel=aaghgf2i4ddgrokh247fgo7n medical.channel=aaghgf2i4ddgrokh247fgo7n
# 医保支付签名key(3.公众号-->城市服务-->医保支付功能开通后-->邮件提供)---------------------------------------- # 医保支付签名key(3.公众号-->城市服务-->医保支付功能开通后-->邮件提供)----------------------------------------
medical.pay_key=8597ea3c46c4f57dbbd7db68860ac1eb medical.pay_key=9baafa056ad046ebf4fafc2b80c17df6

@ -7,14 +7,25 @@
#wx.baseURL=http://www.dljcxrmyy.com/wx/ #wx.baseURL=http://www.dljcxrmyy.com/wx/
#wx.webPath=/web #wx.webPath=/web
wx.appId=wx64cc4b42bbed4090 #wx.appId=wx64cc4b42bbed4090
wx.appSecret=7d5d713378e7885c5186c739ba1bcf0c #wx.appSecret=7d5d713378e7885c5186c739ba1bcf0c
#wx.token=ynxbd
#wx.aesKey=s3ib5r9aE7VtICXjrix0zi9cZ2bipshqh4gzXkjJoh0
#wx.mchId=1528789611
#wx.mchKey=mzsrmyyWxPay8989328291232KAG8392
#wx.baseURL=http://wx.mzsrmyy.net/wx/
#wx.webPath=/web
#wx.password=ynxbd@6910
## 开启处方预结算(第2开关)(注意该配置需联系HIS开发者确认支持才能开启,否则存在风险!)
#wx.is_recipe_prepay=true
# 芒市妇幼配置
wx.appId=wx7d33a52af019f134
wx.appSecret=56ac2bc26672f05f06d6c557d978c0b1
wx.token=ynxbd wx.token=ynxbd
wx.aesKey=s3ib5r9aE7VtICXjrix0zi9cZ2bipshqh4gzXkjJoh0 wx.aesKey=SvUOQUIaawWoB6ptViNqcYkrTs1bmq5cbhiBglhtkct
wx.mchId=1528789611 wx.mchId=1605084861
wx.mchKey=mzsrmyyWxPay8989328291232KAG8392 wx.mchKey=MsfyBJ8871934EKFJA03jdslkfajAaBC
wx.baseURL=http://wx.mzsrmyy.net/wx/ wx.baseURL=http://www.msfyy.com/wx/
wx.webPath=/web wx.webPath=/web
wx.password=ynxbd@6910 wx.password=ynxbd@6910
# 开启处方预结算(第2开关)(注意该配置需联系HIS开发者确认支持才能开启,否则存在风险!)
wx.is_recipe_prepay=true
Loading…
Cancel
Save