diff --git a/sql/version_update.sql b/sql/version_update.sql index 9a2ec51..874fb97 100644 --- a/sql/version_update.sql +++ b/sql/version_update.sql @@ -203,7 +203,7 @@ CREATE TABLE `peis_reserve` ( `PatientID` varchar(16) 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, - `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, `TreatNum` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `TotalFee` decimal(10,3) DEFAULT NULL, diff --git a/src/main/java/com/ynxbd/common/action/RecipeAction.java b/src/main/java/com/ynxbd/common/action/RecipeAction.java index dea307b..7453289 100644 --- a/src/main/java/com/ynxbd/common/action/RecipeAction.java +++ b/src/main/java/com/ynxbd/common/action/RecipeAction.java @@ -103,8 +103,7 @@ public class RecipeAction extends BaseAction { if(treatNum==null||personID==null||recipes==null){ return Result.error(ResultEnum.PARAM_IS_DEFECT); } - List medicalRecipe = new HisRecipeDao().uploadMedicalRecipe(treatNum,personID,recipes); - return Result.success(medicalRecipe); + return new HisRecipeDao().uploadMedicalRecipe(treatNum,personID,recipes); } // /** diff --git a/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java b/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java index 753ed74..ff0aa8d 100644 --- a/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/MedicalAction.java @@ -93,6 +93,11 @@ public class MedicalAction extends BaseAction { JSONObject respJson = WxMedicalHelper.getMdAuthUrl("wx-medical-refund.html", null); return Result.success(respJson); } + @Action("getMedicalAuthUrl") + public Result getMedicalAuthUrl(String url) { + JSONObject respJson = WxMedicalHelper.getMdAuthUrl(url, null); + return Result.success(respJson); + } /** * 获取对账链接 diff --git a/src/main/java/com/ynxbd/common/action/pay/PayAction.java b/src/main/java/com/ynxbd/common/action/pay/PayAction.java index 3297622..e54373d 100644 --- a/src/main/java/com/ynxbd/common/action/pay/PayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/PayAction.java @@ -1,6 +1,7 @@ package com.ynxbd.common.action.pay; import com.alibaba.fastjson.JSONObject; +import com.bocom.api.response.foreignccy.QueryReservationRegistResponseV1; import com.ynxbd.common.action.base.BaseAction; import com.ynxbd.common.bean.ConfigSelfHelp; import com.ynxbd.common.bean.RecipeHelp; @@ -177,11 +178,12 @@ public class PayAction extends BaseAction { */ @Action("peisRefund") 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(); MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByCode(payCode); PeisDao peisDao = new PeisDao(); 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); } String pushMessage = "已申请退款,原因:患者主动取消退费,订单号:" + outTradeNo +"orderNo:"+ recipeId; @@ -501,6 +503,11 @@ public class PayAction extends BaseAction { return new RegService().cancelRegReserve(patientId, tradeNo, hisTransNo); } + @Action("refundRegister") + public Result refundRegister(String hisTransNo){ + return new RegService().refundRegister(hisTransNo); + } + /** * 第三方手动退费 diff --git a/src/main/java/com/ynxbd/common/bean/pay/Register.java b/src/main/java/com/ynxbd/common/bean/pay/Register.java index 58aefc2..55a212e 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Register.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Register.java @@ -38,6 +38,8 @@ public class Register extends Order { private BigDecimal clinicFee; private String clinicCode; private String clinicName; + + private String refundDate; // 时段id private String tid; // 时段名 diff --git a/src/main/java/com/ynxbd/common/dao/RegisterDao.java b/src/main/java/com/ynxbd/common/dao/RegisterDao.java index 54d9700..2079990 100644 --- a/src/main/java/com/ynxbd/common/dao/RegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/RegisterDao.java @@ -167,7 +167,7 @@ public class RegisterDao { if (isToday) { // 今日挂号 hisRegs = hisRegisterDao.hasRegSite(patientId, regDate); for (Register hisReg : hisRegs) { - if (deptCode.equals(hisReg.getDeptCode())) { + if (deptCode.equals(hisReg.getDeptCode())&&(hisReg.getRefundDate()==null||"".equals(hisReg.getRefundDate()))) { return true; } } diff --git a/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java b/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java index 3fe46d8..34cce48 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRecipeDao.java @@ -6,6 +6,7 @@ import com.ynxbd.common.bean.xk.medicalRecipe; import com.ynxbd.common.helper.his.HisEnum; import com.ynxbd.common.helper.his.HisHelper; import com.ynxbd.common.result.JsonResult; +import com.ynxbd.common.result.Result; import com.ynxbd.wx.config.WeChatConfig; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -95,10 +96,10 @@ public class HisRecipeDao { return resultList; } - public List uploadMedicalRecipe(String treatNum, String personID, String recipes) { + public Result uploadMedicalRecipe(String treatNum, String personID, String recipes) { List 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("MZNum", treatNum); params.put("CallNo",HisHelper.CALL_NO); @@ -106,14 +107,14 @@ public class HisRecipeDao { }); if (!jsonResult.success()) { // 失败 - return resultList; + return Result.error(jsonResult.getMessage()); } List medicalRecipe = jsonResult.getDataMapList(medicalRecipe.class, "CFNums","Item"); if (medicalRecipe != null) { resultList = medicalRecipe; } - return resultList; + return Result.success(resultList); } diff --git a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java index 982a3c6..70c2280 100644 --- a/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java +++ b/src/main/java/com/ynxbd/common/dao/his/HisRegisterDao.java @@ -490,6 +490,7 @@ public class HisRegisterDao { reg.setRegDate(node.getString("RegistDate")); reg.setBegTime(node.getString("BegTime")); reg.setEndTime(node.getString("EndTime")); + reg.setRefundDate(node.getString("RefundDate")); // 是否取号 reg.setIsTake(node.getInteger("IsTake")); // 是否就诊 @@ -601,6 +602,17 @@ public class HisRegisterDao { return HisHelper.getJsonResult(HisEnum.AP_Recall_Reservation, params, merchantEnum); } + /** + * 今日挂号-取消挂号 + * @return + */ + public JsonResult refundRegister(String tradeNo,MerchantEnum merchantEnum){ + Map params = new HashMap<>(); + params.put("TransNo",tradeNo); + params.put("DelTransNo","R" + tradeNo); + return HisHelper.getJsonResult(HisEnum.AP_Refund_Register,params,merchantEnum); + } + /** * 查询患者是否挂过号 * diff --git a/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java b/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java index 065316c..5e2f16a 100644 --- a/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java +++ b/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java @@ -61,6 +61,13 @@ public class PeisDao { 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) { String sql = "select * from peis_reserve where recipeId=? and peisStatus = 0 and payStatus=0 order by updateTime desc"; List list = DataBase.select(sql, Recipe.class, ps -> { @@ -99,7 +106,7 @@ public class PeisDao { } 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 -> { ps.setString(1, bankTransNo); ps.setString(2, outTradeNo); diff --git a/src/main/java/com/ynxbd/common/helper/his/HisEnum.java b/src/main/java/com/ynxbd/common/helper/his/HisEnum.java index aaccb77..3e0f713 100644 --- a/src/main/java/com/ynxbd/common/helper/his/HisEnum.java +++ b/src/main/java/com/ynxbd/common/helper/his/HisEnum.java @@ -46,6 +46,8 @@ public enum HisEnum { AP_Reservation("[预约挂号]执行预约", "3003", "AP_Reservation", true), AP_Recall_Reservation("[预约挂号]取消预约", "3006", "AP_Recall_Reservation", true), + AP_Refund_Register("[今日挂号]取消预约", "4007", "AP_Refund_Register", true), + // 支付[自定义]------------------ Create_Self_Help("[处方]生成自助申请单", "10001", "UniversalInterface", true), Query_Self_Help("[处方]查询自助申请单信息", "10002", "UniversalInterface", true), diff --git a/src/main/java/com/ynxbd/common/service/PeisService.java b/src/main/java/com/ynxbd/common/service/PeisService.java index d990c92..bfc892a 100644 --- a/src/main/java/com/ynxbd/common/service/PeisService.java +++ b/src/main/java/com/ynxbd/common/service/PeisService.java @@ -83,17 +83,23 @@ public class PeisService { .add("outTradeNo",outTradeNo) .build(); 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){ - String pushMessage = "体检预约失败已申请退款,原因:体检系统计费失败,订单号:" + outTradeNo+"orderNo:"+ recipeId; + log.info("[体检预约]体检服务无响应,开始退费"); + String pushMessage = "体检预约失败已申请退款,原因:体检服务无响应,订单号:" + outTradeNo+"orderNo:"+ recipeId; 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)){ 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){ 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 -> { params.put("orderNo",recipeId); }); - JSONObject jsonResult = JsonHelper.parseObject(result); 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("退费错误,计费信息查询失败"); } + JSONObject jsonResult = JsonHelper.parseObject(result); String fee = jsonResult.getJSONObject("data").get("fee").toString(); boolean isWxPay = Boolean.parseBoolean(jsonResult.getJSONObject("data").get("isWxPay").toString()); boolean isCost = Boolean.parseBoolean(jsonResult.getJSONObject("data").get("isCost").toString()); 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"); } - if(totalFee.equals(new BigDecimal(String.valueOf(fee)))){ - log.info("{} [体检预约][退费错误,退费金额跟订单金额不符] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}",recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); + if(totalFee.compareTo(new BigDecimal(fee))!=0){ + log.info("{} [体检预约][退费错误,退费金额跟订单金额不符] outTradeNo={}, recipeId={}, totalFee={}", merchantEnum.NAME, outTradeNo, recipeId, totalFee); return Result.error("退费错误,退费金额跟订单金额不符"); } - if(isWxPay){ - log.info("{} [体检预约][退费错误,体检显示已计费,不允许退费] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}", recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); - return Result.error("退费错误,体检显示已计费,不允许退费"); - } +// if(isWxPay){ +// log.info("{} [体检预约][退费错误,体检显示已计费,不允许退费] recipeId-{}, outTradeNo={}, recipeId={}, totalFee={}", recipeId, merchantEnum.NAME, outTradeNo, recipeId, totalFee); +// return Result.error("退费错误,体检显示已计费,不允许退费"); +// } 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显示已计费,不允许退费"); } String refundResult; Order orderRefund = PayService.refund(merchantEnum, outTradeNo, recipeId, totalFee, totalFee, pushInfo, tradeDate, openid, null, pushInfo); 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(); } else { diff --git a/src/main/java/com/ynxbd/common/service/RegService.java b/src/main/java/com/ynxbd/common/service/RegService.java index 7684688..3c0f0fd 100644 --- a/src/main/java/com/ynxbd/common/service/RegService.java +++ b/src/main/java/com/ynxbd/common/service/RegService.java @@ -450,6 +450,83 @@ public class RegService { 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 记录信息 */ 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(); String code = JsonResult.getCode(); @@ -592,13 +680,15 @@ public class RegService { return Result.error("[挂号不退费]HIS请求超时"); } - // 如果HIS交过费返回true-->就不向下执行(自动退款) - String dateShort = DateGenerate.getStringDateShort(); - String paidTip = new HisAccountDao().isPaid(DateGenerate.getNextDay(dateShort, "-7"), DateGenerate.getNextDay(dateShort, "7"), tradeNo); - if (paidTip != null) { - log.info("[挂号][退费错误] paidTip={}, outTradeNo={}, tradeNo={}", paidTip, outTradeNo, tradeNo); - return Result.error(paidTip); - } + if(!isToday){ + // 如果HIS交过费返回true-->就不向下执行(自动退款) + String dateShort = DateGenerate.getStringDateShort(); + String paidTip = new HisAccountDao().isPaid(DateGenerate.getNextDay(dateShort, "-7"), DateGenerate.getNextDay(dateShort, "7"), tradeNo); + if (paidTip != null) { + log.info("[挂号][退费错误] paidTip={}, outTradeNo={}, tradeNo={}", paidTip, outTradeNo, tradeNo); + return Result.error(paidTip); + } + } String refundResult; if (totalFee.compareTo(BigDecimal.ZERO) != 0) { // 金为0 diff --git a/src/main/java/com/ynxbd/wx/servlet/test/RefundTest.java b/src/main/java/com/ynxbd/wx/servlet/test/RefundTest.java new file mode 100644 index 0000000..0a55e24 --- /dev/null +++ b/src/main/java/com/ynxbd/wx/servlet/test/RefundTest.java @@ -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"), "手动退费"); + } +} diff --git a/src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java b/src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java index aa474b7..72b4ac6 100644 --- a/src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java +++ b/src/main/java/com/ynxbd/wx/servlet/test/RefundTestServlet.java @@ -25,7 +25,7 @@ public class RefundTestServlet extends BaseServlet { if (i == 0) { i++; // 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 } diff --git a/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java b/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java index b936021..79602ae 100644 --- a/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java +++ b/src/main/java/com/ynxbd/wx/utils/DesEncryptHelper.java @@ -20,7 +20,7 @@ public class DesEncryptHelper { public static void main(String[] args) { String s = enCode("oeso-t62kkoRwLVVkSkwmmjPfUXk"); - String a= deCode("CF9810D012B475160230870349C6CE4D2AC51B0337640E0607DE6D536EBF9B7793FB12F6871356772FC721D2DE4BCF5E6B182EEFD24EC126D2BDA7639A3777A6E37D2699575F23F0645B81DE2224E1342F5C65AEFE133B3DED63CEF161F1772CEB46D1D447D194ACAF7103055F9C4F12FEFF8750524AC698E0E06CF7829216A59C43992E5BD876FC"); + String a= deCode("63E55CC1CC18DA5DF786FA985D60BCF5E7CD1F925928AB92E75F00E16C14D180C3EEC068D96124953A20B27E5F673E9417F5E3B8B29B116B29B10E1B611BDCBC37D5916AA86830CCF1E9BEDBD4CB1642E174481814738DECC875FA26781DC6546AAA205CE74F3B6A284E738AC3D0D2B60DCB8B29E78277798B0639BE9CC546A9479819B0095698BB"); System.out.println(a); } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java index 55ba92e..52b0192 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/ReqParamHelper.java @@ -21,7 +21,7 @@ public class ReqParamHelper { } public static void main(String[] args) { - System.out.println(encode("30124039")); + System.out.println(encode("11269420")); System.out.println(decode("5AE40D74FFF8C3F14A0491F8824C61EE")); } } diff --git a/src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java b/src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java index ea77a03..ac8db82 100644 --- a/src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java +++ b/src/main/java/com/ynxbd/wx/wxfactory/utils/WxSignHelper.java @@ -2,6 +2,7 @@ package com.ynxbd.wx.wxfactory.utils; import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.JsonHelper; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; @@ -17,6 +18,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; +@Slf4j public class WxSignHelper { // 签名类型 final public static String SIGN_TYPE_MD5 = "MD5"; @@ -44,6 +46,7 @@ public class WxSignHelper { if (signType == null) { signType = SIGN_TYPE_MD5; } + log.info("[医保]签名前参数:paramsStr-{}",paramsStr + "&key=" + key); if (SIGN_TYPE_HMAC_SHA256.equalsIgnoreCase(signType)) { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); diff --git a/src/main/resources/apiclient_cert.p12 b/src/main/resources/apiclient_cert.p12 new file mode 100644 index 0000000..c007e1d Binary files /dev/null and b/src/main/resources/apiclient_cert.p12 differ diff --git a/src/main/resources/medical.properties b/src/main/resources/medical.properties index 7f5ee2c..b398b55 100644 --- a/src/main/resources/medical.properties +++ b/src/main/resources/medical.properties @@ -24,4 +24,4 @@ medical.partner_secret=f92df3128382757425ba4c5ca166688f medical.channel=aaghgf2i4ddgrokh247fgo7n # 医保支付签名key(3.公众号-->城市服务-->医保支付功能开通后-->邮件提供)---------------------------------------- -medical.pay_key=8597ea3c46c4f57dbbd7db68860ac1eb \ No newline at end of file +medical.pay_key=9baafa056ad046ebf4fafc2b80c17df6 \ No newline at end of file diff --git a/src/main/resources/wx.properties b/src/main/resources/wx.properties index c5f2131..29083f5 100644 --- a/src/main/resources/wx.properties +++ b/src/main/resources/wx.properties @@ -7,14 +7,25 @@ #wx.baseURL=http://www.dljcxrmyy.com/wx/ #wx.webPath=/web -wx.appId=wx64cc4b42bbed4090 -wx.appSecret=7d5d713378e7885c5186c739ba1bcf0c +#wx.appId=wx64cc4b42bbed4090 +#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.aesKey=s3ib5r9aE7VtICXjrix0zi9cZ2bipshqh4gzXkjJoh0 -wx.mchId=1528789611 -wx.mchKey=mzsrmyyWxPay8989328291232KAG8392 -wx.baseURL=http://wx.mzsrmyy.net/wx/ +wx.aesKey=SvUOQUIaawWoB6ptViNqcYkrTs1bmq5cbhiBglhtkct +wx.mchId=1605084861 +wx.mchKey=MsfyBJ8871934EKFJA03jdslkfajAaBC +wx.baseURL=http://www.msfyy.com/wx/ wx.webPath=/web -wx.password=ynxbd@6910 -# 开启处方预结算(第2开关)(注意该配置需联系HIS开发者确认支持才能开启,否则存在风险!) -wx.is_recipe_prepay=true \ No newline at end of file +wx.password=ynxbd@6910 \ No newline at end of file