新增体检预约相关接口以及数据库sql设计

debug
李进才 2 years ago
parent f84526df5d
commit a628f0af79
  1. 78
      sql/version_update.sql
  2. 3
      src/main/java/com/ynxbd/common/action/pay/PEnum.java
  3. 38
      src/main/java/com/ynxbd/common/action/pay/PayAction.java
  4. 4
      src/main/java/com/ynxbd/common/action/pay/WxPayAction.java
  5. 10
      src/main/java/com/ynxbd/common/bean/pay/Order.java
  6. 1
      src/main/java/com/ynxbd/common/bean/pay/Recipe.java
  7. 6
      src/main/java/com/ynxbd/common/dao/RecipeDao.java
  8. 71
      src/main/java/com/ynxbd/common/dao/peis/PeisDao.java
  9. 50
      src/main/java/com/ynxbd/common/service/PeisService.java
  10. 3
      src/main/java/com/ynxbd/common/service/RecipeService.java

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

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

@ -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);
}
/**
* [住院]预交金创建订单
* *

@ -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("【微信】通知类型错误,结束请求");

@ -110,4 +110,14 @@ public class Order implements Serializable {
// 医保-用户ID
private String mdUserId;
// 缴费订单类型
private String orderType;
// PEIS通知状态
private Integer peisStatus;
// PEIS返回提示
private String peisResult;
}

@ -47,4 +47,5 @@ public class Recipe extends Order implements Serializable {
// 预结算信息
private String feeInfo;
}

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

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

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

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

Loading…
Cancel
Save