From d503c3d0f8be3670662f09b198faa000e14fed68 Mon Sep 17 00:00:00 2001
From: houruijun <411269194@kidgrow.com>
Date: Sat, 15 Aug 2020 12:27:25 +0800
Subject: [PATCH] 修改  获取h端用户列表 opration

---
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java |  626 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 585 insertions(+), 41 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 29d9ba4..d23d235 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
@@ -1,109 +1,637 @@
 package com.kidgrow.oprationcenter.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.constant.ConsumptionConstant;
 import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.DateUtils;
 import com.kidgrow.common.utils.StringUtils;
 import com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper;
 import com.kidgrow.oprationcenter.model.ConsumptionRecord;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
 import com.kidgrow.oprationcenter.service.IConsumptionRecordService;
 import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
+import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
+import com.kidgrow.oprationcenter.vo.ConsumptionVo;
 import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
 import com.kidgrow.oprationcenter.vo.UserProductDetail;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
 import java.util.stream.Collectors;
+
+//import org.springframework.amqp.rabbit.annotation.RabbitListener;
+//import org.springframework.amqp.rabbit.core.RabbitTemplate;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
  * @Description: <br>
  * @Project: 运营中心<br>
  * @CreateDate: Created in 2020-06-23 15:07:14 <br>
  * @Author: <a href="411269194@kidgrow.com">houruijun</a>
- * @version 1.0
  */
 @Slf4j
 @Service
 public class ConsumptionRecordServiceImpl extends SuperServiceImpl<ConsumptionRecordMapper, ConsumptionRecord> implements IConsumptionRecordService {
     @Autowired
     private IProductOrderDetailService productOrderDetailService;
+    @Autowired
+    private HttpServletRequest httpServletRequest;
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    private static final Logger logger = LoggerFactory.getLogger(ConsumptionRecordServiceImpl.class);
+
     /**
      * 列表
+     *
      * @param params
      * @return
      */
     @Override
-    public PageResult<ConsumptionRecord> findList(Map<String, Object> params){
+    public PageResult<ConsumptionRecord> findList(Map<String, Object> params) {
         Page<ConsumptionRecord> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
-        List<ConsumptionRecord> list  =  baseMapper.findList(page, params);
+        List<ConsumptionRecord> list = baseMapper.findList(page, params);
         return PageResult.<ConsumptionRecord>builder().data(list).code(0).count(page.getTotal()).build();
     }
+
     /**
      * 列表
+     *
      * @param params
      * @return
      */
     @Override
-    public List<ConsumptionRecord> findAllList(Map<String, Object> params){
+    public List<ConsumptionRecord> findAllList(Map<String, Object> params) {
         return baseMapper.findList(params);
     }
 
     /**
-   * 根据ConsumptionRecord对象当做查询条件进行查询
-   * @param consumptionRecord
-   * @return ConsumptionRecord
-   */
+     * 根据ConsumptionRecord对象当做查询条件进行查询
+     *
+     * @param consumptionRecord
+     * @return ConsumptionRecord
+     */
     @Override
-    public ConsumptionRecord findByObject(ConsumptionRecord consumptionRecord){
+    public ConsumptionRecord findByObject(ConsumptionRecord consumptionRecord) {
         return baseMapper.findByObject(consumptionRecord);
     }
 
     /**
+     * 要让AI读片-调用
      *
-     * @param hospitalId
-     * @param departmentId
+     * @param consumptionRequest 请求的数据实体
      * @return
      */
-    public boolean deductionDepartmentProduct(Long hospitalId,Long departmentId)
-    {
-        UserProductDetail userProductDetail=productOrderDetailService.getUserProductDetail(hospitalId,departmentId);
-        //合并集合
-        userProductDetail.getProductOrderJoinDetailListShare().addAll(userProductDetail.getProductOrderJoinDetailsListDep());
-        List<ProductOrderJoinDetail> productOrderJoinDetailList=userProductDetail.getProductOrderJoinDetailListShare();
-        //Collections.sort(productOrderJoinDetailList);
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //记录类型
+        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.没有预扣,查询余额
+                    if (VateUserNowProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId())) {
+                        //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 = "余额不足或获取失败!";
+                        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);
+    }
+
+    /**
+     * AI返回结果-调用
+     *
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //记录类型
+        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.没有预扣,查询余额
+                    if (VateUserNowProduct(consumptionRequest.getConsumptionCount(),hospitalId,consumptionRequest.getDepartmentId())) {
+                        //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 = "余额不足或获取失败!";
+                        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);
+    }
+
+    /**
+     * AI拒读/失败通知-调用
+     *
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //记录类型
+        int recordType = ConsumptionConstant.RETURN_BEFORE_DEDUCTION;
+        //业务执行结果
+        boolean isSuccess = false;
+        //业务执行结果信息
+        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;
+                }
+            } 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;
+                                }
+                            }
+                            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);
+    }
+
+    /**
+     * 发起人工读片-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //记录类型
+        int recordType = ConsumptionConstant.DEDUCTION;
+        //业务执行结果
+        boolean isSuccess = false;
+        //业务执行结果信息
+        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.没有预扣,查询余额
+                    if (VateUserNowProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId())) {
+                        //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 = "余额不足或获取失败!";
+                        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;
+        }
+        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+    }
+
+    /**
+     * 扣费业务(扣费 更新预扣 写扣费记录)
+     * @param consumptionRequest    请求参数
+     * @param consumptionRecordList 扣费业务数据
+     * @return
+     */
+    private boolean consumptionBusiess(ConsumptionRequest consumptionRequest, List<ConsumptionRecord> consumptionRecordList) {
+        //3.已经预扣费 则扣费 写扣费记录 更新预扣状态
+        ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION).collect(Collectors.toList()).get(0);
+        Long detailId = consumptionRecord.getProOrderDetailId();
+        //获取预扣的时候占住的套餐id
+        ProductOrderDetail productOrderDetail = productOrderDetailService.getById(detailId);
+        if (productOrderDetail.getAilightCount() >= consumptionRequest.getConsumptionCount()) {
+            //扣掉
+            productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount());
+        } else {
+            //要是被别人已经用了,就要重新找套餐
+            productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
+            if (productOrderDetail == null) {
+                logger.info("业务编号:【{}】无可用套餐!", consumptionRequest.getBusinessId());
+                return false;
+            } else {
+                //新套餐扣费
+                productOrderDetail = productOrderDetailService.getById(detailId);
+                productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount());
+            }
+        }
+        //3.1扣费!
+        boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail);
+        if (consumptionRe) {
+            //3.2扣费成功,写扣费记录
+            ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
+            consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION);
+            consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
+            consumptionRecordNew.setConsumptionCount(consumptionRequest.getConsumptionCount());
+            consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION);
+            consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
+            consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
+            consumptionRecordNew.setCreateTime(new Date());
+
+            if (SaveConsumptionRecord(consumptionRecordNew)) {
+                //3.3 扣费成功 如果套餐id变化,则更新预扣费的套餐id
+                if (consumptionRecordNew.getProOrderDetailId() != consumptionRecord.getProOrderDetailId()) {
+                    consumptionRecord.setProOrderDetailId(productOrderDetail.getId());
+                    consumptionRecord.setUpdateTime(new Date());
+                    if (!SaveConsumptionRecord(consumptionRecord)) {
+                        logger.info("业务编号:【{}】更新预扣费的套餐id!", consumptionRequest.getBusinessId());
+                    }
+                }
+                //消息队列通知
+                MessageToBI(consumptionRequest);
+                //已经扣费
+                logger.info("业务编号:【{}】该业务已经扣费!", consumptionRequest.getBusinessId());
+                return true;
+            } else {
+                logger.info("业务编号:【{}】预扣费执行失败!", consumptionRequest.getBusinessId());
+            }
+        } else {
+            logger.info("业务编号:【{}】扣除套餐失败!", consumptionRequest.getBusinessId());
+        }
         return false;
     }
+
     /**
-     * 写/更新记录数据
-     * @param consumptionRecord
+     * 返回结果包装
+     *
+     * @param consumptionRequest 请求参数
+     * @param bcode              返回码
+     * @param reMsg              返回信息
+     * @param isSuccess          业务执行是否成功
      * @return
      */
-    public ConsumptionRecord SaveConsumptionRecord(ConsumptionRecord consumptionRecord)
-    {
-        if (consumptionRecord != null) {
-            this.saveOrUpdate(consumptionRecord);
-            return consumptionRecord;
+    private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode,int recordType, String reMsg, boolean isSuccess) {
+        //返回的数据实体
+        ConsumptionVo consumptionVo = new ConsumptionVo();
+        consumptionVo.setConsumptionCount(consumptionRequest.getConsumptionCount());
+        consumptionVo.setBusinessId(consumptionRequest.getBusinessId());
+        consumptionVo.setBcode(bcode);
+        consumptionVo.setRecordType(recordType);
+        if (isSuccess) {
+            return ResultBody.ok().data(consumptionVo).msg(reMsg);
+        } else {
+            return ResultBody.failed(reMsg).data(consumptionVo);
+        }
+    }
+
+    /**
+     * 预扣费业务
+     * @param consumptionRequest 请求参数
+     * @return
+     */
+    private Boolean beforeConsumption(ConsumptionRequest consumptionRequest) {
+        ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
+        if (productOrderDetail != null) {
+            ConsumptionRecord consumptionRecord = new ConsumptionRecord();
+            consumptionRecord.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION);
+            consumptionRecord.setBusinessId(consumptionRequest.getBusinessId());
+            consumptionRecord.setConsumptionCount(consumptionRequest.getConsumptionCount());
+            consumptionRecord.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION);
+            consumptionRecord.setProOrderDetailId(productOrderDetail.getId());
+            if (SaveConsumptionRecord(consumptionRecord)) {
+                return true;
+            } else {
+                logger.info("医院id:【{}】预扣费执行失败!", consumptionRequest.getHospitalId());
+            }
+        } else {
+            logger.info("医院id:【{}】套餐获取失败!", consumptionRequest.getHospitalId());
+        }
+        return false;
+    }
+
+    /**
+     * 参数验证
+     */
+    private Boolean VateParams(ConsumptionRequest consumptionRequest) {
+        if (consumptionRequest != null) {
+            //从请求头获取医院和科室id
+            String hosId = consumptionRequest.getHospitalId().toString();
+            String depId = consumptionRequest.getDepartmentId().toString();
+            String doctorId = consumptionRequest.getDoctorId().toString();
+            if (StringUtils.isNotBlank(consumptionRequest.getBusinessId())
+                    && consumptionRequest.getConsumptionCount() > 0
+                    && StringUtils.isNotBlank(hosId)
+                    && StringUtils.isNotBlank(depId)
+                    && StringUtils.isNotBlank(doctorId)) {
+                return true;
+            } else {
+                logger.info("扣费请求参数不完整!");
+            }
+        } else {
+            logger.info("扣费请求参数为空!");
+        }
+        return false;
+    }
+
+    /**
+     * 检查余额够不够
+     * @param consumptionCount 要扣的数量
+     * @return
+     */
+    private Boolean VateUserNowProduct(int consumptionCount,Long hospitalId,Long departmentId) {
+        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) {
+                    return true;
+                } else {
+                    logger.info("医院id:【{}】余额不足!", hospitalId);
+                }
+            } else {
+                logger.error("医院id:【{}】余额获取异常!", hospitalId);
+            }
+        } else {
+            logger.info("医院id:【{}】余额获取异常,返回非0!", hospitalId);
+        }
+        return false;
+    }
+
+    /**
+     * 获取要使用的套餐实体
+     * @param consumCount  要使用的数量
+     * @return
+     */
+    private ProductOrderDetail deductionDepartmentProduct(int consumCount,Long hospitalId,Long departmentId) {
+        UserProductDetail userProductDetail = productOrderDetailService.getUserProductDetail(hospitalId, departmentId);
+        //合并集合
+        userProductDetail.getProductOrderJoinDetailListShare().addAll(userProductDetail.getProductOrderJoinDetailsListDep());
+        List<ProductOrderJoinDetail> productOrderJoinDetailList = userProductDetail.getProductOrderJoinDetailListShare();
+        if (productOrderJoinDetailList.size() > 0) {
+            //合并后按id排序并筛除已用完的套餐
+            List<ProductOrderJoinDetail> productOrderJoinDetailsNewList = productOrderJoinDetailList.stream().filter(f -> f.getAilightCount() >= consumCount).sorted(Comparator.comparing(ProductOrderJoinDetail::getId)).collect(Collectors.toList());
+            //要使用的套餐信息
+            ProductOrderDetail productOrderDetail = productOrderDetailService.getById(productOrderJoinDetailsNewList.get(0).getId());
+            return productOrderDetail;
         }
         return null;
     }
+
     /**
-     * 检查该业务是否存在该业务类型
-     * @param consumptionRecordList 该业务下的扣费列表
-     * @param recordType 记录类型编码 参考ConsumptionConstant里面
+     * 写/更新记录数据
+     *
+     * @param consumptionRecord
      * @return
      */
-    public boolean isBeforeDeduction(List<ConsumptionRecord> consumptionRecordList,int recordType)
-    {
+    private Boolean SaveConsumptionRecord(ConsumptionRecord consumptionRecord) {
+        if (consumptionRecord != null) {
+            if (consumptionRecord.getCreateTime() == null) {
+                consumptionRecord.setCreateTime(new Date());
+            }
+            return this.saveOrUpdate(consumptionRecord);
+        } else {
+            logger.info("扣费数据写入参数为空!");
+        }
+        return false;
+    }
+
+    /**
+     * 检查该业务是否存在该业务类型
+     *
+     * @param consumptionRecordList 该业务下的扣费列表
+     * @param recordType            记录类型编码 参考ConsumptionConstant里面
+     * @return
+     */
+    private boolean isBeforeDeduction(List<ConsumptionRecord> consumptionRecordList, int recordType) {
         if (consumptionRecordList != null) {
-            if (consumptionRecordList.size()>0) {
+            if (consumptionRecordList.size() > 0) {
                 //过滤预扣费的记录
-                return consumptionRecordList.stream().filter(f->f.getRecordType()==recordType).collect(Collectors.toList()).size()==1;
+                return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType&&f.getProOrderDetailId()>0).collect(Collectors.toList()).size() == 1;
             }
         }
         return false;
@@ -111,29 +639,45 @@
 
     /**
      * 获取一个业务关联的扣费记录
+     *
      * @param businessId 光片的名称/编号
      * @return
      */
-    public List<ConsumptionRecord> GetBusinessConsumptionList(String businessId)
-    {
+    private List<ConsumptionRecord> GetBusinessConsumptionList(String businessId) {
         if (StringUtils.isNotBlank(businessId)) {
             Map<String, Object> params = new HashMap<>();
             params.put("businessId", businessId);
-            List<ConsumptionRecord> consumptionRecordList=this.findAllList(params);
+            List<ConsumptionRecord> consumptionRecordList = this.findAllList(params);
             return consumptionRecordList;
         }
         return null;
     }
+
     /**
      * 获取一个扣费记录
+     *
      * @param recordId 扣费记录id
      * @return
      */
-    public ConsumptionRecord GetBusinessConsumptionList(Long recordId)
-    {
-        if (recordId>0) {
+    private ConsumptionRecord GetBusinessConsumptionList(Long recordId) {
+        if (recordId > 0) {
             return baseMapper.selectById(recordId);
         }
         return null;
     }
+
+    /**
+     * 发消息到消息队列
+     * @return
+     */
+    @RabbitListener(queues = "BoneAgeEvaluationData")
+    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, context);
+    }
 }

--
Gitblit v1.8.0