From a628f0af798bec84c5b6e9645fdcb893da66cdfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=BF=9B=E6=89=8D?= Date: Fri, 17 Nov 2023 10:03:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BD=93=E6=A3=80=E9=A2=84?= =?UTF-8?q?=E7=BA=A6=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93sql=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/version_update.sql | 78 +++++++++++++++++++ .../com/ynxbd/common/action/pay/PEnum.java | 3 + .../ynxbd/common/action/pay/PayAction.java | 38 +++++++++ .../ynxbd/common/action/pay/WxPayAction.java | 4 + .../java/com/ynxbd/common/bean/pay/Order.java | 10 +++ .../com/ynxbd/common/bean/pay/Recipe.java | 1 + .../java/com/ynxbd/common/dao/RecipeDao.java | 6 +- .../com/ynxbd/common/dao/peis/PeisDao.java | 71 +++++++++++++++++ .../com/ynxbd/common/service/PeisService.java | 50 ++++++++++++ .../ynxbd/common/service/RecipeService.java | 3 + 10 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/ynxbd/common/dao/peis/PeisDao.java create mode 100644 src/main/java/com/ynxbd/common/service/PeisService.java diff --git a/sql/version_update.sql b/sql/version_update.sql index 9968efa..7089f86 100644 --- a/sql/version_update.sql +++ b/sql/version_update.sql @@ -158,6 +158,8 @@ SET FOREIGN_KEY_CHECKS = 1; + + -- ---------------------------- -- 增加报表统计 -- ---------------------------- @@ -181,3 +183,79 @@ CREATE TABLE `report` ( SET FOREIGN_KEY_CHECKS = 1; + +--- 处方表新增处方类型 +ALTER TABLE pay ADD COLUMN OrderType VARCHAR(30),ALGORITHM=INPLACE, LOCK=NONE; + + + + +--- 新增 体检预约缴费记录表 + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for pay_casebook +-- ---------------------------- +DROP TABLE IF EXISTS `peis_reserve`; +CREATE TABLE `peis_reserve` ( + `ID` int NOT NULL AUTO_INCREMENT, + `UpdateTime` datetime NOT NULL, + `OpenID` varchar(32) 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, + `BankTransNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `TradeNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '', + `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, + `PayWay` int DEFAULT '0', + `PayMoney` decimal(10,3) DEFAULT NULL, + `PayStatus` int DEFAULT NULL, + `PeisStatus` int DEFAULT NULL, + `PeisResult` varchar(1024) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `PeisTransNo` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `InvoiceTransNo` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `RefundResult` varchar(1024) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `OperateUser` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `AuthCode` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `RecipeJson` varchar(600) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `Remark` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `Fee` varchar(600) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `DeptCode` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `DeptName` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `ReqDeptCode` varchar(16) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `ReqDeptName` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `HospitalArea` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `PayOrdId` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '医保订单号', + `AcctFee` decimal(10,3) DEFAULT NULL COMMENT '医保个账金额', + `HifpFee` decimal(10,3) DEFAULT NULL COMMENT '医保统筹金额', + `ChrgBchno` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '顶', + `MdTrtId` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '医保就诊ID', + `MdUserId` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '医保用户ID', + `FeeId` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `FeeInfo` varchar(1024) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `RefundTime` datetime DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE, + UNIQUE KEY `ID` (`ID`) USING BTREE, + UNIQUE KEY `TradeNo` (`TradeNo`) USING BTREE, + UNIQUE KEY `AuthCode` (`AuthCode`) USING BTREE, + KEY `UpdateTime` (`UpdateTime`) USING BTREE, + KEY `OpenID` (`OpenID`) USING BTREE, + KEY `PatientID` (`PatientID`) USING BTREE, + KEY `OutTradeNo` (`OutTradeNo`) USING BTREE, + KEY `BankTransNo` (`BankTransNo`) USING BTREE, + KEY `RecipeID` (`RecipeID`) USING BTREE, + KEY `TreatNum` (`TreatNum`) USING BTREE, + KEY `TotalFee` (`TotalFee`) USING BTREE, + KEY `PayWay` (`PayWay`) USING BTREE, + KEY `PayStatus` (`PayStatus`) USING BTREE, + KEY `PeisStatus` (`PeisStatus`) USING BTREE, + KEY `InvoiceTransNo` (`InvoiceTransNo`) USING BTREE, + KEY `MdUserId` (`MdUserId`) USING BTREE, + KEY `PayMoney` (`PayMoney`) USING BTREE, + KEY `RefundTime` (`RefundTime`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = COMPACT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/src/main/java/com/ynxbd/common/action/pay/PEnum.java b/src/main/java/com/ynxbd/common/action/pay/PEnum.java index b56fad1..ce03d45 100644 --- a/src/main/java/com/ynxbd/common/action/pay/PEnum.java +++ b/src/main/java/com/ynxbd/common/action/pay/PEnum.java @@ -13,6 +13,9 @@ public enum PEnum { // ------------------------------------ REG("挂号", "register", "G"), RECIPE("处方", "recipe", "C"), + + PEIS_RESERVE("体检预约","PEIS_reserve", "T"), + IN_HOSP("住院", "in_hosp", "Z"), CASEBOOK("病历", "casebook", "CB"), 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 8c12949..ad76828 100644 --- a/src/main/java/com/ynxbd/common/action/pay/PayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/PayAction.java @@ -128,6 +128,44 @@ public class PayAction extends BaseAction { } + /** + * @param openid openid + * @param patientId 患者id + * @param treatNum 体检号 + * @param totalFee 总金额 + * @param recipeId 处方号 + * @param payCode 支付方式 + */ + @Action("PeisPay") + public Result PeisPay(String openid, String patientId, String treatNum, String totalFee, String recipeId,String payCode){ + if(openid==null||patientId==null||treatNum==null||totalFee==null||recipeId==null){ + return Result.error(ResultEnum.PARAM_IS_DEFECT); + } + if(new BigDecimal(totalFee).compareTo(BigDecimal.ZERO)==0){ + return Result.error(ResultEnum.PAY_MONEY_IS_ZERO); + } + MerchantEnum merchantEnum = MerchantEnum.getMerchantEnumByCode(payCode); + if (merchantEnum == null) { // 支付方式异常 + return Result.error(ResultEnum.PAY_TYPE_ERROR); + } + String outTradeNo = CodeHelper.getOutTradeNo(merchantEnum); + PeisService peisService = new PeisService(); + if(!peisService.Reserve(openid,patientId,treatNum,outTradeNo,totalFee,recipeId)){ + log.info("{} [体检预约]体检预约信息保存失败 patientId={},recipeId-{}", merchantEnum.NAME, patientId,recipeId); + return Result.error(ResultEnum.SPECIFIED_QUESTIONED_USER_NOT_EXIST); + } + + String ip = request.getRemoteAddr(); + String body = "体检预约 患者:" + patientId + "\n体检号:" + treatNum + "\n订单号:" + recipeId; + JSONObject respJson = PayService.createOrder(merchantEnum, openid, patientId, totalFee, outTradeNo, PEnum.PEIS_RESERVE.CODE, ip, body); + // 支付异常 + if (respJson == null) { + return Result.error(ResultEnum.PAY_ERROR); + } + return Result.success(respJson); + } + + /** * [住院]预交金创建订单 * * diff --git a/src/main/java/com/ynxbd/common/action/pay/WxPayAction.java b/src/main/java/com/ynxbd/common/action/pay/WxPayAction.java index e9b3e45..c4d50fd 100644 --- a/src/main/java/com/ynxbd/common/action/pay/WxPayAction.java +++ b/src/main/java/com/ynxbd/common/action/pay/WxPayAction.java @@ -71,6 +71,10 @@ public class WxPayAction extends BaseAction { case OL_REG: new MicroService().InternetHospNotice(outTradeNo, bankTransNo, openid, totalFee, payDate, payTime); break; + case PEIS_RESERVE: + new PeisService().payNotify(outTradeNo,bankTransNo); + break; + default: log.info("【微信】通知类型错误,结束请求"); diff --git a/src/main/java/com/ynxbd/common/bean/pay/Order.java b/src/main/java/com/ynxbd/common/bean/pay/Order.java index e400acc..ba3cc94 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Order.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Order.java @@ -110,4 +110,14 @@ public class Order implements Serializable { // 医保-用户ID private String mdUserId; + // 缴费订单类型 + private String orderType; + + // PEIS通知状态 + private Integer peisStatus; + + + // PEIS返回提示 + private String peisResult; + } diff --git a/src/main/java/com/ynxbd/common/bean/pay/Recipe.java b/src/main/java/com/ynxbd/common/bean/pay/Recipe.java index 9bf987e..26be9cd 100644 --- a/src/main/java/com/ynxbd/common/bean/pay/Recipe.java +++ b/src/main/java/com/ynxbd/common/bean/pay/Recipe.java @@ -47,4 +47,5 @@ public class Recipe extends Order implements Serializable { // 预结算信息 private String feeInfo; + } diff --git a/src/main/java/com/ynxbd/common/dao/RecipeDao.java b/src/main/java/com/ynxbd/common/dao/RecipeDao.java index cb0e586..0911832 100644 --- a/src/main/java/com/ynxbd/common/dao/RecipeDao.java +++ b/src/main/java/com/ynxbd/common/dao/RecipeDao.java @@ -71,7 +71,7 @@ public class RecipeDao { * @return 是否存储成功 */ public boolean insert(Recipe recipe) { - String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, feeId, feeInfo) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?)"; + String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, feeId, feeInfo, orderType) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?)"; return DataBase.insert(sql, ps -> { ps.setInt(1, recipe.getHisStatus()); ps.setInt(2, recipe.getPayStatus()); @@ -98,6 +98,7 @@ public class RecipeDao { ps.setString(21, recipe.getHospitalArea()); ps.setString(22, recipe.getFeeId()); ps.setString(23, recipe.getFeeInfo()); + ps.setString(24, recipe.getOrderType()); }) > 0; } @@ -154,7 +155,7 @@ public class RecipeDao { * @return 是否存储成功 */ public int insertBatch(List recipeList) { - String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, feeId, feeInfo) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?)"; + String sql = "insert into pay(updateTime, hisStatus, payStatus, openId, patientId, payWay, payMoney, totalFee, outTradeNo, bankTransNo, tradeNo, recipeId, treatNum, authCode, invoiceTransNo, hisTransNo, operateUser, deptCode, deptName, reqDeptCode, reqDeptName, hospitalArea, feeId, feeInfo, orderType) values (now(),?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?, ?,?,?,?)"; return DataBase.insertBatch(sql, ps -> { for (Recipe recipe : recipeList) { ps.setInt(1, recipe.getHisStatus()); @@ -182,6 +183,7 @@ public class RecipeDao { ps.setString(21, recipe.getHospitalArea()); ps.setString(22, recipe.getFeeId()); ps.setString(23, recipe.getFeeInfo()); + ps.setString(24,recipe.getOrderType()); ps.addBatch(); } }); diff --git a/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java b/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java new file mode 100644 index 0000000..83166a7 --- /dev/null +++ b/src/main/java/com/ynxbd/common/dao/peis/PeisDao.java @@ -0,0 +1,71 @@ +package com.ynxbd.common.dao.peis; + +import com.ynxbd.common.bean.pay.PayCasebook; +import com.ynxbd.common.bean.pay.Recipe; +import com.ynxbd.common.bean.record.Record; +import com.ynxbd.common.config.db.DataBase; + +import java.util.List; + + +/** + * @author 李进才 + * @ClassName PeisDao + * @Description TODO + * @date 2023/11/16 15:43:00 + */ +public class PeisDao { + /** + * 处方支付,数据预存(单个) + * + * @param recipe 支付信息 + * @return 是否存储成功 + */ + public boolean insert(Recipe recipe) { + String sql = "insert into peis_reserve(updateTime, peisStatus, payStatus, openId, patientId, payMoney, totalFee, outTradeNo, recipeId, treatNum) values (now(),?,?,?,?,?,?,?,?,?)"; + return DataBase.insert(sql, ps -> { + ps.setInt(1, recipe.getPeisStatus()); + ps.setInt(2, recipe.getPayStatus()); + ps.setString(3, recipe.getOpenid()); + ps.setString(4, recipe.getPatientId()); + ps.setBigDecimal(5, recipe.getTotalFee()); + ps.setBigDecimal(6,recipe.getPayMoney()); + // + ps.setString(7, recipe.getOutTradeNo()); + ps.setString(8, recipe.getRecipeId()); + ps.setString(9, recipe.getTreatNum()); + + }) > 0; + } + + /** + * 判断该处方是否重复计费 + * @param recipeId 处方号 + * @return + */ + public boolean isRepeat(String recipeId){ + String sql = "select * from peis_reserve where recipeId = ? and peisStatus = 0"; + return !DataBase.select(sql,Recipe.class,ps->{ + ps.setString(1,recipeId); + }).isEmpty(); + } + + public Recipe selectByOutTradeNo(String outTradeNo) { + String sql = "select * from peis_reserve where outTradeNo=? order by updateTime desc"; + List list = DataBase.select(sql, Recipe.class, ps -> { + ps.setString(1, outTradeNo); + }); + if (list.size() > 0) { + return list.get(0); + } + return null; + } + + public boolean updatePayStateOk(String outTradeNo, String bankTransNo) { + String sql = "update peis_reserve set payStatus=0, bankTransNo=? where outTradeNo=? and bankTransNo is null"; + return DataBase.update(sql, ps -> { + ps.setString(1, bankTransNo); + ps.setString(2, outTradeNo); + }) > 0; + } +} diff --git a/src/main/java/com/ynxbd/common/service/PeisService.java b/src/main/java/com/ynxbd/common/service/PeisService.java new file mode 100644 index 0000000..9057dbf --- /dev/null +++ b/src/main/java/com/ynxbd/common/service/PeisService.java @@ -0,0 +1,50 @@ +package com.ynxbd.common.service; + +import com.ynxbd.common.bean.pay.Recipe; +import com.ynxbd.common.dao.peis.PeisDao; +import com.ynxbd.common.result.Result; +import lombok.extern.slf4j.Slf4j; + +import java.math.BigDecimal; + +/** + * @author 李进才 + * @ClassName PeisService + * @Description TODO + * @date 2023/11/16 15:53:00 + */ + +@Slf4j +public class PeisService { + + public Boolean Reserve(String openid, String patientId, String treatNum, String outTradeNo, String totalFee,String recipeId){ + Recipe recipe = new Recipe(); + recipe.setOpenid(openid); + recipe.setPatientId(patientId); + recipe.setTreatNum(treatNum); + recipe.setOutTradeNo(outTradeNo); + recipe.setRecipeId(recipeId); + recipe.setTotalFee(new BigDecimal(totalFee)); + recipe.setPayMoney(new BigDecimal(totalFee)); + recipe.setPeisStatus(-1); + recipe.setPayStatus(-1); + if(new PeisDao().isRepeat(recipe.getRecipeId())){ + log.info("[体检预约]该处方号已经缴费,recipeId-{}",recipe.getRecipeId()); + return false; + } + return new PeisDao().insert(recipe); + } + public void payNotify(String outTradeNo, String bankTransNo){ + PeisDao peisDao = new PeisDao(); + Recipe recipe = peisDao.selectByOutTradeNo(outTradeNo); + String recipeId = recipe.getRecipeId(); + Integer payStates = recipe.getPayStatus(); + if (payStates == 0) { + log.error("[体检预约]订单已支付 outTradeNo={}, bankTransNo={}, recipeId={}", outTradeNo, bankTransNo, recipeId); + return; + } + if (!peisDao.updatePayStateOk(outTradeNo, bankTransNo)) { + log.info("[体检预约]修改支付状态失败 outTradeNo={}, bankTransNo={}", outTradeNo, bankTransNo); + } + } +} diff --git a/src/main/java/com/ynxbd/common/service/RecipeService.java b/src/main/java/com/ynxbd/common/service/RecipeService.java index 3b44b0e..22280df 100644 --- a/src/main/java/com/ynxbd/common/service/RecipeService.java +++ b/src/main/java/com/ynxbd/common/service/RecipeService.java @@ -243,6 +243,9 @@ public class RecipeService { recipe.setPayMoney(recipe.getRecipeFee()); recipe.setHisStatus(-1); recipe.setPayStatus(-1); + if(treatNum.contains("P-")){ + recipe.setOrderType("PEIS"); + } } boolean isResult;