From 482f58537fa3f0cab93b88c6d0bcb803e0431cfc Mon Sep 17 00:00:00 2001
From: houruijun <411269194@kidgrow.com>
Date: Wed, 23 Sep 2020 15:51:08 +0800
Subject: [PATCH] 1.增加后台开通医院/科室的单次支付功能,并自动充入指定套餐 2.新增查询医院科室是否开通单次支付功能的接口 3.新增查询医院科室的支付单价 4.修改扣费业务4个接口,增加支持单次支付的判断与处理 5.增加接口,查看某个诊断的支付状态

---
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java |  570 ++++++++++++++++++++++++++++++++------------------------
 1 files changed, 328 insertions(+), 242 deletions(-)

diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java
index 1a3955b..454c824 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kidgrow.common.constant.ConsumptionConstant;
+import com.kidgrow.common.constant.PayConstants;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
@@ -9,9 +10,13 @@
 import com.kidgrow.common.utils.StringUtils;
 import com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper;
 import com.kidgrow.oprationcenter.model.ConsumptionRecord;
+import com.kidgrow.oprationcenter.model.PayManager;
 import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import com.kidgrow.oprationcenter.model.SaasClientPay;
 import com.kidgrow.oprationcenter.service.IConsumptionRecordService;
+import com.kidgrow.oprationcenter.service.IPayManagerService;
 import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
+import com.kidgrow.oprationcenter.service.ISaasClientPayService;
 import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
 import com.kidgrow.oprationcenter.vo.ConsumptionVo;
 import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
@@ -26,7 +31,6 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -48,13 +52,16 @@
     @Autowired
     private IProductOrderDetailService productOrderDetailService;
     @Autowired
-    private HttpServletRequest httpServletRequest;
+    private IPayManagerService payManagerService;
+    @Autowired
+    private ISaasClientPayService saasClientPayService;
     @Autowired
     private RabbitTemplate rabbitTemplate;
 
     private static final Logger logger = LoggerFactory.getLogger(ConsumptionRecordServiceImpl.class);
     @Value("${spring.profiles.active}")
     private String envName;
+
     /**
      * 列表
      *
@@ -102,54 +109,67 @@
         //默认的业务返回码
         int bcode = -1;
         //记录类型
-        int recordType=ConsumptionConstant.BEFORE_DEDUCTION;
+        int recordType = ConsumptionConstant.BEFORE_DEDUCTION;
         //业务执行结果
         boolean isSuccess = true;
         //业务执行结果信息
         String reMsg = "";
         if (VateParams(consumptionRequest)) {
-            //先获取这个业务关联的扣费记录
-            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
-            //1.先检查是否已经扣费
-            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
-                //2.没有扣费,检查是否已经预扣费
-                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
-                    //3.没有预扣,查询余额
-                    Map<String,Object> vateMap=VateUserNowProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
-                    if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
-                        //4.余额充足 获取要扣的套餐 写预扣费记录
-                        if (beforeConsumption(consumptionRequest)) {
-                            //预扣费成功
-                            reMsg = "预扣费成功!";
-                            bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
-                        } else {
-                            //预扣费执行失败
-                            isSuccess = false;
-                            reMsg = "预扣费执行失败!";
-                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
-                        }
-                    } else {
-                        //余额不足 或获取异常
-                        isSuccess = false;
-                        reMsg = vateMap.get("vateMsg").toString();
-                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
-                    }
-                } else {
-                    //已经预扣费
-                    reMsg = "该业务已经预扣费!";
+            //是否开通单次支付
+            if (departmentIsPay(consumptionRequest)) {
+                //是否支付成功
+                if (departmentPayStatus(consumptionRequest)) {
+                    //预扣费成功
+                    reMsg = "单次支付模拟预扣费成功!";
                     bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
+                } else {
+                    reMsg = "单次支付未成功,不允许预扣费!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                 }
             } else {
-                //已经扣费
-                reMsg = "该业务已经扣费!";
-                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                //先获取这个业务关联的扣费记录
+                List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+                //1.先检查是否已经扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                    //2.没有扣费,检查是否已经预扣费
+                    if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                        //3.没有预扣,查询余额
+                        Map<String, Object> vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
+                        if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
+                            //4.余额充足 获取要扣的套餐 写预扣费记录
+                            if (beforeConsumption(consumptionRequest)) {
+                                //预扣费成功
+                                reMsg = "预扣费成功!";
+                                bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
+                            } else {
+                                //预扣费执行失败
+                                isSuccess = false;
+                                reMsg = "预扣费执行失败!";
+                                bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                            }
+                        } else {
+                            //余额不足 或获取异常
+                            isSuccess = false;
+                            reMsg = vateMap.get("vateMsg").toString();
+                            bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                        }
+                    } else {
+                        //已经预扣费
+                        reMsg = "该业务已经预扣费!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
+                    }
+                } else {
+                    //已经扣费
+                    reMsg = "该业务已经扣费!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                }
             }
         } else {
             isSuccess = false;
             reMsg = "传入参数有误!";
             bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
         }
-        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+        return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
     }
 
     /**
@@ -164,61 +184,76 @@
         //默认的业务返回码
         int bcode = -1;
         //记录类型
-        int recordType=ConsumptionConstant.DEDUCTION;
+        int recordType = ConsumptionConstant.DEDUCTION;
         //业务执行结果
         boolean isSuccess = true;
         //业务执行结果信息
         String reMsg = "";
         if (VateParams(consumptionRequest)) {
-            //先获取这个业务关联的扣费记录
-            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
-            Long hospitalId = consumptionRequest.getHospitalId();
-
-            //1.先检查是否已经扣费
-            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
-                //2.没有扣费,检查是否已经预扣费
-                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
-                    //2.1.没有预扣,查询余额
-                    Map<String,Object> vateMap=VateUserNowProduct(consumptionRequest.getConsumptionCount(),hospitalId,consumptionRequest.getDepartmentId());
-                    if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
-                        //2.2.余额充足 获取要扣的套餐 写预扣费记录
-                        if (beforeConsumption(consumptionRequest)) {
-                            //预扣费成功
-                            logger.info("医院id:【{}】AI返回结果应该不走预扣,目前确已经预扣!", hospitalId);
-                        } else {
-                            //预扣费执行失败
-                            isSuccess = false;
-                            reMsg = "预扣费执行失败!";
-                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
-                            return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
-                        }
-                    } else {
-                        //余额不足
-                        isSuccess = false;
-                        reMsg = vateMap.get("vateMsg").toString();
-                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
-                        return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
-                    }
-                }
-                if (consumptionBusiess(consumptionRequest, consumptionRecordList)) {
-                    reMsg = "该业务扣费成功!";
+            //是否开通单次支付
+            if (departmentIsPay(consumptionRequest)) {
+                //是否支付成功
+                if (departmentPayStatus(consumptionRequest)) {
+                    //预扣费成功
+                    reMsg = "单次支付模拟扣费成功!";
                     bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                    //消息队列通知
+                    MessageToBI(consumptionRequest);
                 } else {
-                    isSuccess = false;
-                    reMsg = "该业务扣费失败!";
+                    reMsg = "单次支付未成功,不允许扣费!";
                     bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                 }
             } else {
-                //已经扣费
-                reMsg = "该业务已经扣费!";
-                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                //先获取这个业务关联的扣费记录
+                List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+                Long hospitalId = consumptionRequest.getHospitalId();
+
+                //1.先检查是否已经扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                    //2.没有扣费,检查是否已经预扣费
+                    if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                        //2.1.没有预扣,查询余额
+                        Map<String, Object> vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), hospitalId, consumptionRequest.getDepartmentId());
+                        if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
+                            //2.2.余额充足 获取要扣的套餐 写预扣费记录
+                            if (beforeConsumption(consumptionRequest)) {
+                                //预扣费成功
+                                logger.info("医院id:【{}】AI返回结果应该不走预扣,目前确已经预扣!", hospitalId);
+                            } else {
+                                //预扣费执行失败
+                                isSuccess = false;
+                                reMsg = "预扣费执行失败!";
+                                bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                                return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
+                            }
+                        } else {
+                            //余额不足
+                            isSuccess = false;
+                            reMsg = vateMap.get("vateMsg").toString();
+                            bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                            return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
+                        }
+                    }
+                    if (consumptionBusiess(consumptionRequest, consumptionRecordList)) {
+                        reMsg = "该业务扣费成功!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                    } else {
+                        isSuccess = false;
+                        reMsg = "该业务扣费失败!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                    }
+                } else {
+                    //已经扣费
+                    reMsg = "该业务已经扣费!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                }
             }
         } else {
             isSuccess = false;
             reMsg = "传入参数有误!";
             bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
         }
-        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+        return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
     }
 
     /**
@@ -239,126 +274,124 @@
         //业务执行结果信息
         String reMsg = "";
         if (VateParams(consumptionRequest)) {
-            //先获取这个业务关联的扣费记录
-            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
-            //1.先检查是否已经扣费
-            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
-                //2.没有扣费,检查是否已经预扣费
-                if (isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
-                    //2.1.有预扣费
-                    ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION&&f.getProOrderDetailId()>0).collect(Collectors.toList()).get(0);
-                    //把占用的套餐id还回去
-                    Long tempProOrderDetailId=consumptionRecord.getProOrderDetailId();
-                    consumptionRecord.setProOrderDetailId(0L);
-                    consumptionRecord.setUpdateTime(new Date());
-                    if (SaveConsumptionRecord(consumptionRecord))
-                    {
-                        //退预扣记录
-                        ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
-                        consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION);
-                        consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
-                        consumptionRecordNew.setConsumptionCount(0-consumptionRequest.getConsumptionCount());
-                        consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_BEFORE_DEDUCTION);
-                        consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId);
-                        consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
-                        if (SaveConsumptionRecord(consumptionRecordNew))
-                        {
-                            isSuccess=true;
-                            reMsg = "有预扣,写退还预扣成功!";
-                            bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION;
-                        }
-                        else
-                        {
-                            reMsg = "写退还预扣失败!";
-                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
-                        }
-                    }
-                    else{
-                        reMsg = "更新预扣费记录失败!";
-                        bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
-                    }
-                }
-                else
-                {
-                    reMsg = "没有相关预扣记录!";
-                    bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+            //是否开通单次支付
+            if (departmentIsPay(consumptionRequest)) {
+                //是否支付成功
+                if (departmentPayStatus(consumptionRequest)) {
+                    //预扣费成功
+                    reMsg = "单次支付模拟退还扣费成功!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION;
+                } else {
+                    reMsg = "单次支付未成功,不允许退扣费!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                 }
             } else {
-                recordType=ConsumptionConstant.RETURN_DEDUCTION;
-                //3.有扣费记录 这种情况的流程,实际业务中不会出现,但理论上应该这样处理
-                //3.1 退还账户
-                //获取预扣的时候占住的套餐id
-                ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.DEDUCTION).collect(Collectors.toList()).get(0);
-                if (consumptionRecord != null) {
-                    ProductOrderDetail productOrderDetail = productOrderDetailService.getById(consumptionRecord.getProOrderDetailId());
-                    if (productOrderDetail != null) {
-                        //退还金额 
-                        productOrderDetail.setAilightCount(productOrderDetail.getAilightCount()+consumptionRecord.getConsumptionCount());
-                        productOrderDetail.setUpdateTime(new Date());
-                        //退费
-                        boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail);
-                        if (consumptionRe) {
-                            //更新扣费记录  还回占用套餐
-                            consumptionRecord.setProOrderDetailId(0L);
-                            consumptionRecord.setUpdateTime(new Date());
-                            if (SaveConsumptionRecord(consumptionRecord))
-                            {
-                                //退费成功
-                                //3.2 写退费记录
-                                ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
-                                consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION);
-                                consumptionRecordNew.setBusinessId(consumptionRecord.getBusinessId());
-                                consumptionRecordNew.setConsumptionCount(0-consumptionRecord.getConsumptionCount());
-                                consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_DEDUCTION);
-                                consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
-                                consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
-                                if (SaveConsumptionRecord(consumptionRecordNew)) {
-                                    //写退费记录成功
-                                    isSuccess=true;
-                                    reMsg = "退还扣费成功!";
-                                    bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION;
-                                }
-                                else
-                                {
-                                    reMsg = "退还扣费失败!";
-                                    bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
-                                }
+                //先获取这个业务关联的扣费记录
+                List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+                //1.先检查是否已经扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                    //2.没有扣费,检查是否已经预扣费
+                    if (isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                        //2.1.有预扣费
+                        ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION && f.getProOrderDetailId() > 0).collect(Collectors.toList()).get(0);
+                        //把占用的套餐id还回去
+                        Long tempProOrderDetailId = consumptionRecord.getProOrderDetailId();
+                        consumptionRecord.setProOrderDetailId(0L);
+                        consumptionRecord.setUpdateTime(new Date());
+                        if (SaveConsumptionRecord(consumptionRecord)) {
+                            //退预扣记录
+                            ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
+                            consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION);
+                            consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
+                            consumptionRecordNew.setConsumptionCount(0 - consumptionRequest.getConsumptionCount());
+                            consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_BEFORE_DEDUCTION);
+                            consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId);
+                            consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
+                            consumptionRecordNew.setDiaId(consumptionRequest.getDiaId());
+                            if (SaveConsumptionRecord(consumptionRecordNew)) {
+                                isSuccess = true;
+                                reMsg = "有预扣,写退还预扣成功!";
+                                bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION;
+                            } else {
+                                reMsg = "写退还预扣失败!";
+                                bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
                             }
-                            else
-                            {
-                                //更新扣费失败
-                                reMsg = "更新扣费失败!";
-                                bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
-                            }
-                        }
-                        else
-                        {
-                            //退费失败
-                            reMsg = "退还扣费失败!";
+                        } else {
+                            reMsg = "更新预扣费记录失败!";
                             bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
                         }
+                    } else {
+                        reMsg = "没有相关预扣记录!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
                     }
-                    else
-                    {
-                        reMsg = "无相关套餐数据!";
+                } else {
+                    recordType = ConsumptionConstant.RETURN_DEDUCTION;
+                    //3.有扣费记录 这种情况的流程,实际业务中不会出现,但理论上应该这样处理
+                    //3.1 退还账户
+                    //获取预扣的时候占住的套餐id
+                    ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.DEDUCTION).collect(Collectors.toList()).get(0);
+                    if (consumptionRecord != null) {
+                        ProductOrderDetail productOrderDetail = productOrderDetailService.getById(consumptionRecord.getProOrderDetailId());
+                        if (productOrderDetail != null) {
+                            //退还金额
+                            productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() + consumptionRecord.getConsumptionCount());
+                            productOrderDetail.setUpdateTime(new Date());
+                            //退费
+                            boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail);
+                            if (consumptionRe) {
+                                //更新扣费记录  还回占用套餐
+                                consumptionRecord.setProOrderDetailId(0L);
+                                consumptionRecord.setUpdateTime(new Date());
+                                if (SaveConsumptionRecord(consumptionRecord)) {
+                                    //退费成功
+                                    //3.2 写退费记录
+                                    ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
+                                    consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION);
+                                    consumptionRecordNew.setBusinessId(consumptionRecord.getBusinessId());
+                                    consumptionRecordNew.setConsumptionCount(0 - consumptionRecord.getConsumptionCount());
+                                    consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_DEDUCTION);
+                                    consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
+                                    consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
+                                    consumptionRecordNew.setDiaId(consumptionRequest.getDiaId());
+                                    if (SaveConsumptionRecord(consumptionRecordNew)) {
+                                        //写退费记录成功
+                                        isSuccess = true;
+                                        reMsg = "退还扣费成功!";
+                                        bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION;
+                                    } else {
+                                        reMsg = "退还扣费失败!";
+                                        bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                                    }
+                                } else {
+                                    //更新扣费失败
+                                    reMsg = "更新扣费失败!";
+                                    bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                                }
+                            } else {
+                                //退费失败
+                                reMsg = "退还扣费失败!";
+                                bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                            }
+                        } else {
+                            reMsg = "无相关套餐数据!";
+                            bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                        }
+                    } else {
+                        reMsg = "无相关扣费数据!";
                         bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
                     }
-                }
-                else
-                {
-                    reMsg = "无相关扣费数据!";
-                    bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
                 }
             }
         } else {
             reMsg = "传入参数有误!";
             bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
         }
-        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+        return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
     }
 
     /**
      * 发起人工读片-调用
+     *
      * @param consumptionRequest 请求的数据实体
      * @return
      */
@@ -374,60 +407,74 @@
         //业务执行结果信息
         String reMsg = "";
         if (VateParams(consumptionRequest)) {
-            //先获取这个业务关联的扣费记录
-            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
-            //1.先检查是否已经扣费
-            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
-                //2.没有扣费,检查是否已经预扣费
-                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
-                    //3.没有预扣,查询余额
-                    Map<String,Object> vateMap=VateUserNowProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
-                    if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
-                        //4.余额充足 获取要扣的套餐 写预扣费记录
-                        if (!beforeConsumption(consumptionRequest)) {
-                            //预扣费执行失败
-                            reMsg = "预扣费执行失败!";
-                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
-                            return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
-                        }
-                        else
-                        {
-                            //发起了一个新的预扣,需要更新扣费业务数据列表
-                            consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
-                        }
-                    } else {
-                        //余额不足
-                        reMsg = vateMap.get("vateMsg").toString();
-                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
-                        return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
-                    }
+            //是否开通单次支付
+            if (departmentIsPay(consumptionRequest))
+            {
+                //是否支付成功
+                if (departmentPayStatus(consumptionRequest)) {
+                    //预扣费成功
+                    reMsg = "单次支付模拟已经扣费成功!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                    //消息队列通知
+                    MessageToBI(consumptionRequest);
+                } else {
+                    reMsg = "单次支付未成功,不允许业务进行!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                 }
-                //扣费业务
-                isSuccess= consumptionBusiess(consumptionRequest,consumptionRecordList);
-                if (isSuccess) {
+            }
+            else {
+                //先获取这个业务关联的扣费记录
+                List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+                //1.先检查是否已经扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                    //2.没有扣费,检查是否已经预扣费
+                    if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                        //3.没有预扣,查询余额
+                        Map<String, Object> vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
+                        if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
+                            //4.余额充足 获取要扣的套餐 写预扣费记录
+                            if (!beforeConsumption(consumptionRequest)) {
+                                //预扣费执行失败
+                                reMsg = "预扣费执行失败!";
+                                bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                                return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
+                            } else {
+                                //发起了一个新的预扣,需要更新扣费业务数据列表
+                                consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+                            }
+                        } else {
+                            //余额不足
+                            reMsg = vateMap.get("vateMsg").toString();
+                            bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                            return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
+                        }
+                    }
+                    //扣费业务
+                    isSuccess = consumptionBusiess(consumptionRequest, consumptionRecordList);
+                    if (isSuccess) {
+                        reMsg = "该业务已经扣费!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                    } else {
+                        reMsg = "该业务扣费失败!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+                    }
+                } else {
+                    isSuccess = true;
+                    //已经扣费
                     reMsg = "该业务已经扣费!";
                     bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                 }
-                else
-                {
-                    reMsg = "该业务扣费失败!";
-                    bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
-                }
-            } else {
-                isSuccess = true;
-                //已经扣费
-                reMsg = "该业务已经扣费!";
-                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
             }
         } else {
             reMsg = "传入参数有误!";
             bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
         }
-        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+        return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
     }
 
     /**
      * 扣费业务(扣费 更新预扣 写扣费记录)
+     *
      * @param consumptionRequest    请求参数
      * @param consumptionRecordList 扣费业务数据
      * @return
@@ -443,7 +490,7 @@
             productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount());
         } else {
             //要是被别人已经用了,就要重新找套餐
-            productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
+            productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
             if (productOrderDetail == null) {
                 logger.info("业务编号:【{}】无可用套餐!", consumptionRequest.getBusinessId());
                 return false;
@@ -464,6 +511,7 @@
             consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION);
             consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
             consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
+            consumptionRecordNew.setDiaId(consumptionRequest.getDiaId());
             consumptionRecordNew.setCreateTime(new Date());
 
             if (SaveConsumptionRecord(consumptionRecordNew)) {
@@ -498,7 +546,7 @@
      * @param isSuccess          业务执行是否成功
      * @return
      */
-    private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode,int recordType, String reMsg, boolean isSuccess) {
+    private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode, int recordType, String reMsg, boolean isSuccess) {
         //返回的数据实体
         ConsumptionVo consumptionVo = new ConsumptionVo();
         consumptionVo.setConsumptionCount(consumptionRequest.getConsumptionCount());
@@ -514,11 +562,12 @@
 
     /**
      * 预扣费业务
+     *
      * @param consumptionRequest 请求参数
      * @return
      */
     private Boolean beforeConsumption(ConsumptionRequest consumptionRequest) {
-        ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
+        ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
         if (productOrderDetail != null) {
             ConsumptionRecord consumptionRecord = new ConsumptionRecord();
             consumptionRecord.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION);
@@ -526,6 +575,7 @@
             consumptionRecord.setConsumptionCount(consumptionRequest.getConsumptionCount());
             consumptionRecord.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION);
             consumptionRecord.setProOrderDetailId(productOrderDetail.getId());
+            consumptionRecord.setDiaId(consumptionRequest.getDiaId());
             if (SaveConsumptionRecord(consumptionRecord)) {
                 return true;
             } else {
@@ -546,11 +596,13 @@
             String hosId = consumptionRequest.getHospitalId().toString();
             String depId = consumptionRequest.getDepartmentId().toString();
             String doctorId = consumptionRequest.getDoctorId().toString();
+            String diaId = consumptionRequest.getDiaId().toString();
             if (StringUtils.isNotBlank(consumptionRequest.getBusinessId())
                     && consumptionRequest.getConsumptionCount() > 0
                     && StringUtils.isNotBlank(hosId)
                     && StringUtils.isNotBlank(depId)
-                    && StringUtils.isNotBlank(doctorId)) {
+                    && StringUtils.isNotBlank(doctorId)
+                    && StringUtils.isNotBlank(diaId)) {
                 return true;
             } else {
                 logger.info("扣费请求参数不完整!");
@@ -563,32 +615,33 @@
 
     /**
      * 检查余额够不够
+     *
      * @param consumptionCount 要扣的数量
      * @return
      */
-    private Map<String,Object> VateUserNowProduct(int consumptionCount,Long hospitalId,Long departmentId) {
-        Map<String,Object> returnMap=new HashMap<>();
+    private Map<String, Object> VateUserNowProduct(int consumptionCount, Long hospitalId, Long departmentId) {
+        Map<String, Object> returnMap = new HashMap<>();
         ResultBody biUserPro = productOrderDetailService.biUserNowProduct(hospitalId, departmentId);
         if (biUserPro.getCode() == 0) {
             if (StringUtils.isNotBlank(biUserPro.getData().toString())) {
                 //余额
                 int userAICount = Integer.parseInt(biUserPro.getData().toString());
                 if (userAICount >= consumptionCount) {
-                    returnMap.put("vateRe",true);
-                    returnMap.put("vateMsg","余额足够!");
+                    returnMap.put("vateRe", true);
+                    returnMap.put("vateMsg", "余额足够!");
                 } else {
-                    returnMap.put("vateRe",false);
-                    returnMap.put("vateMsg","余额不足!");
+                    returnMap.put("vateRe", false);
+                    returnMap.put("vateMsg", "余额不足!");
                     logger.info("医院id:【{}】余额不足!", hospitalId);
                 }
             } else {
-                returnMap.put("vateRe",false);
-                returnMap.put("vateMsg","余额获取异常,data为空!");
+                returnMap.put("vateRe", false);
+                returnMap.put("vateMsg", "余额获取异常,data为空!");
                 logger.error("医院id:【{}】余额获取异常!", hospitalId);
             }
-         }else {
-            returnMap.put("vateRe",false);
-            returnMap.put("vateMsg","余额获取异常,Code非0!");
+        } else {
+            returnMap.put("vateRe", false);
+            returnMap.put("vateMsg", "余额获取异常,Code非0!");
             logger.info("医院id:【{}】余额获取异常,返回非0!", hospitalId);
         }
         return returnMap;
@@ -596,10 +649,11 @@
 
     /**
      * 获取要使用的套餐实体
-     * @param consumCount  要使用的数量
+     *
+     * @param consumCount 要使用的数量
      * @return
      */
-    private ProductOrderDetail deductionDepartmentProduct(int consumCount,Long hospitalId,Long departmentId) {
+    private ProductOrderDetail deductionDepartmentProduct(int consumCount, Long hospitalId, Long departmentId) {
         UserProductDetail userProductDetail = productOrderDetailService.getUserProductDetail(hospitalId, departmentId);
         //合并集合
         userProductDetail.getProductOrderJoinDetailListShare().addAll(userProductDetail.getProductOrderJoinDetailsListDep());
@@ -643,7 +697,7 @@
         if (consumptionRecordList != null) {
             if (consumptionRecordList.size() > 0) {
                 //过滤预扣费的记录
-                return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType&&f.getProOrderDetailId()>0).collect(Collectors.toList()).size() == 1;
+                return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType && f.getProOrderDetailId() > 0).collect(Collectors.toList()).size() == 1;
             }
         }
         return false;
@@ -651,7 +705,6 @@
 
     /**
      * 获取一个业务关联的扣费记录
-     *
      * @param businessId 光片的名称/编号
      * @return
      */
@@ -680,18 +733,51 @@
 
     /**
      * 发消息到消息队列
+     *
      * @return
      */
     //@RabbitListener(queues = "BoneAgeEvaluationData")
-    private void MessageToBI(ConsumptionRequest consumptionRequest)
-    {
+    private void MessageToBI(ConsumptionRequest consumptionRequest) {
         //发消息到队列
         String context = "{\"hospitalId\":\"" + consumptionRequest.getHospitalId() +
                 "\",\"departmentId\":\"" + consumptionRequest.getDepartmentId() +
                 "\",\"doctorId\":\"" + consumptionRequest.getDoctorId() +
-                "\",\"date\":\"" + DateUtils.formatDate(new Date(),"yyyy-MM-dd")+"\"}";
-        rabbitTemplate.convertAndSend(ConsumptionConstant.EXCHANGE_DATA, ConsumptionConstant.ROUTINGKEY_DATA+envName, context);
+                "\",\"date\":\"" + DateUtils.formatDate(new Date(), "yyyy-MM-dd") + "\"}";
+        rabbitTemplate.convertAndSend(ConsumptionConstant.EXCHANGE_DATA, ConsumptionConstant.ROUTINGKEY_DATA + envName, context);
 
-        log.error("骨龄评价扣费消息已发送:"+context);
+        log.error("骨龄评价扣费消息已发送:" + context);
+    }
+
+    /**
+     * 查看当前科室是否开通了单次支付
+     *
+     * @param consumptionRequest
+     * @return
+     */
+    private Boolean departmentIsPay(ConsumptionRequest consumptionRequest) {
+        PayManager payManager = payManagerService.findByObject(consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
+        if (payManager == null) {
+            return false;
+        } else {
+            return payManager.getId() > 0;
+        }
+    }
+
+    /**
+     * 查看当前科室当前诊断id的支付状态是否成功
+     *
+     * @param consumptionRequest
+     * @return
+     */
+    private Boolean departmentPayStatus(ConsumptionRequest consumptionRequest) {
+        SaasClientPay saasClientPay = saasClientPayService.findModelByObject(consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId(), consumptionRequest.getDiaId());
+        if (saasClientPay == null) {
+            return false;
+        } else {
+            if (saasClientPay.getPayStatus().equals(PayConstants.ORDER_PAY_SUCEESS)) {
+                return true;
+            }
+        }
+        return false;
     }
 }

--
Gitblit v1.8.0