From 9e0686fa9f6b66cb45114e62cfe8f3c75311886d Mon Sep 17 00:00:00 2001
From: zhaoxiaohao <913652501@qq.com>
Date: Wed, 24 Jun 2020 19:10:22 +0800
Subject: [PATCH] Merge branch 'dev' of http://192.168.2.240:7070/r/kidgrow-microservices-platform into dev

---
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java         |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java |    5 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java          |   30 +
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml                                                    |   22 +
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java |   56 ---
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java                                           |    4 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java         |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java                      |   29 +
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionVo.java                           |   48 +++
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java  |  588 ++++++++++++++++++++++++++++++++++--
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java                                         |   22 +
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java                    |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java  |   42 +
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java |   50 +++
 14 files changed, 782 insertions(+), 120 deletions(-)

diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java
index 93ee069..ca8e1db 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java
@@ -66,7 +66,7 @@
      * 400                 义务执行出错
      */
     @NotEmpty(message = "业务返回结果不能为空")
-    private String businessCode;
+    private Integer businessCode;
     /**
      * 扣费数量/金额
      */
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java
new file mode 100644
index 0000000..3e26271
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java
@@ -0,0 +1,29 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConsumptionRequest extends Model<ConsumptionRequest> {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 调用方业务编号,光片编号
+     */
+    private String businessId;
+    /**
+     * 实际变动数量
+     */
+    private int consumptionCount;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionVo.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionVo.java
new file mode 100644
index 0000000..d8c7a5b
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionVo.java
@@ -0,0 +1,48 @@
+package com.kidgrow.oprationcenter.vo;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/06/24 11:01 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConsumptionVo extends Model<ConsumptionVo> {
+    //实体序列化  必要
+    private static final long serialVersionUID = 1L;
+    /**
+     * 业务执行返回码
+     * 100                 余额充足
+     * 101                 余额不足
+     * 200                 已经预扣         (包括预扣费并写了记录,检查已经预扣费)
+     * 201                 已经扣费         (包括扣费并写了记录,检查已经扣费)
+     * 300                 退还预扣
+     * 301                 退还扣费
+     * 400                 业务执行出错
+     */
+    private int bcode;
+    /**
+     * 调用方业务编号,光片编号
+     */
+    private String businessId;
+    /**
+     * 实际变动数量
+     */
+    private int consumptionCount;
+    /**
+     * 记录类型
+     * 1:预扣费
+     * 2:退预扣费(需要关联预扣费编号)
+     * 3:退扣费(需要关联扣费编号)
+     * 4:扣费(需要关联预扣费编号)
+     */
+    private int recordType;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java
index b678356..ddc9003 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java
@@ -1,8 +1,10 @@
 package com.kidgrow.oprationcenter.service;
 
-import com.kidgrow.oprationcenter.model.ConsumptionRecord;
 import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.oprationcenter.model.ConsumptionRecord;
+import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
 
 import java.util.List;
 import java.util.Map;
@@ -37,5 +39,29 @@
     * @return ConsumptionRecord对象
     */
     ConsumptionRecord findByObject(ConsumptionRecord consumptionRecord);
-}
 
+    /**
+     * 要让AI读片-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest);
+    /**
+     * AI返回结果-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest);
+    /**
+     * AI拒读/失败通知-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest);
+    /**
+     * 发起人工读片-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest);
+}
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java
index 7fb3857..da6a375 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java
@@ -69,5 +69,7 @@
      * @return
      */
     UserProductDetail getUserProductDetail(Long hospitalId, Long departmentId);
+
+    ResultBody biUserNowProduct(Long hospitalId,Long departmentId);
 }
 
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java
index 4d94a57..d3a859d 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java
@@ -59,7 +59,5 @@
      * @return
      */
     PageResult<GroupProductDetail> groupList(Map<String, Object> params);
-
-    ResultBody biUserNowProduct(Long hospitalId,Long departmentId);
 }
 
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..338dcf0 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,596 @@
 package com.kidgrow.oprationcenter.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.constant.ConsumptionConstant;
+import com.kidgrow.common.constant.SecurityConstants;
 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;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © 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;
+        //业务执行结果
+        boolean isSuccess = false;
+        //业务执行结果信息
+        String reMsg = "";
+        if (VateParams(consumptionRequest)) {
+            //先获取这个业务关联的扣费记录
+            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+            Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER));
+            Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER));
+            //1.先检查是否已经扣费
+            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                //2.没有扣费,检查是否已经预扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                    //3.没有预扣,查询余额
+                    if (VateUserNowProduct(consumptionRequest.getConsumptionCount())) {
+                        //4.余额充足 获取要扣的套餐 写预扣费记录
+                        if (beforeConsumption(consumptionRequest)) {
+                            //预扣费成功
+                            isSuccess = true;
+                            reMsg = "预扣费成功!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
+                        } else {
+                            //预扣费执行失败
+                            reMsg = "预扣费执行失败!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                        }
+                    } else {
+                        //余额不足
+                        reMsg = "余额不足或获取失败!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                    }
+                } else {
+                    //已经预扣费
+                    reMsg = "该业务已经预扣费!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
+                }
+            } else {
+                //已经扣费
+                reMsg = "该业务已经扣费!";
+                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+            }
+        } else {
+            reMsg = "传入参数有误!";
+            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+        }
+        return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess);
+    }
+
+    /**
+     * AI返回结果-调用
+     *
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //业务执行结果
+        boolean isSuccess = false;
+        //业务执行结果信息
+        String reMsg = "";
+        if (VateParams(consumptionRequest)) {
+            //先获取这个业务关联的扣费记录
+            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+            Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER));
+            Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER));
+            //1.先检查是否已经扣费
+            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                //2.没有扣费,检查是否已经预扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                    //2.1.没有预扣,查询余额
+                    if (VateUserNowProduct(consumptionRequest.getConsumptionCount())) {
+                        //2.2.余额充足 获取要扣的套餐 写预扣费记录
+                        if (beforeConsumption(consumptionRequest)) {
+                            //预扣费成功
+                            logger.info("医院id:【{}】AI返回结果应该不走预扣,目前确已经预扣!", hospitalId);
+                        } else {
+                            //预扣费执行失败
+                            reMsg = "预扣费执行失败!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                        }
+                    } else {
+                        //余额不足
+                        reMsg = "余额不足或获取失败!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                    }
+                }
+                if (consumptionBusiess(consumptionRequest, consumptionRecordList)) {
+                    isSuccess = true;
+                    reMsg = "该业务扣费成功!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                } else {
+                    reMsg = "该业务扣费失败!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                }
+            } else {
+                //已经扣费
+                reMsg = "该业务已经扣费!";
+                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+            }
+        } else {
+            reMsg = "传入参数有误!";
+            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+        }
+        return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess);
+    }
+
+    /**
+     * AI拒读/失败通知-调用
+     *
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //业务执行结果
+        boolean isSuccess = false;
+        //业务执行结果信息
+        String reMsg = "";
+        if (VateParams(consumptionRequest)) {
+            //先获取这个业务关联的扣费记录
+            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+            Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER));
+            Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER));
+            //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).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.RETURN_BEFORE_DEDUCTION);
+                        consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
+                        consumptionRecordNew.setConsumptionCount(consumptionRequest.getConsumptionCount());
+                        consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION);
+                        consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId);
+                        consumptionRecordNew.setLastRecordId(consumptionRecord.getLastRecordId());
+                        if (SaveConsumptionRecord(consumptionRecordNew))
+                        {
+                            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 {
+                //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) {
+                            //退费成功
+                            //3.2 写退费记录
+                            ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
+                            consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION);
+                            consumptionRecordNew.setBusinessId(consumptionRecord.getBusinessId());
+                            consumptionRecordNew.setConsumptionCount(consumptionRecord.getConsumptionCount());
+                            consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_DEDUCTION);
+                            consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
+                            consumptionRecordNew.setLastRecordId(consumptionRecord.getLastRecordId());
+                            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_CODE_PARAMS_ERROR;
+        }
+        return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess);
+    }
+
+    /**
+     * 发起人工读片-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //业务执行结果
+        boolean isSuccess = false;
+        //业务执行结果信息
+        String reMsg = "";
+        if (VateParams(consumptionRequest)) {
+            //先获取这个业务关联的扣费记录
+            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+            Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER));
+            Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER));
+            //1.先检查是否已经扣费
+            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                //2.没有扣费,检查是否已经预扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                    //3.没有预扣,查询余额
+                    if (VateUserNowProduct(consumptionRequest.getConsumptionCount())) {
+                        //4.余额充足 获取要扣的套餐 写预扣费记录
+                        if (!beforeConsumption(consumptionRequest)) {
+                            //预扣费执行失败
+                            reMsg = "预扣费执行失败!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                        }
+                    } else {
+                        //余额不足
+                        reMsg = "余额不足或获取失败!";
+                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                    }
+                }
+                //扣费业务
+                isSuccess= consumptionBusiess(consumptionRequest,consumptionRecordList);
+            } else {
+                //已经扣费
+                reMsg = "该业务已经扣费!";
+                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+            }
+        } else {
+            reMsg = "传入参数有误!";
+            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+        }
+        return ResultReturn(consumptionRequest, bcode, 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());
+            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.getLastRecordId());
+
+            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();
+                //已经扣费
+                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, String reMsg, boolean isSuccess) {
+        //返回的数据实体
+        ConsumptionVo consumptionVo = new ConsumptionVo();
+        consumptionVo.setConsumptionCount(consumptionRequest.getConsumptionCount());
+        consumptionVo.setBusinessId(consumptionRequest.getBusinessId());
+        consumptionVo.setBcode(bcode);
+        consumptionVo.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION);
+        if (isSuccess) {
+            return ResultBody.ok().data(consumptionVo).msg(reMsg);
+        } else {
+            return ResultBody.failed(reMsg).data(consumptionVo);
+        }
+    }
+
+    /**
+     * 预扣费业务
+     * @param consumptionRequest 请求参数
+     * @return
+     */
+    private Boolean beforeConsumption(ConsumptionRequest consumptionRequest) {
+        Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER));
+        Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER));
+        ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount());
+        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:【{}】预扣费执行失败!", hospitalId);
+            }
+        } else {
+            logger.info("医院id:【{}】套餐获取失败!", hospitalId);
+        }
+        return false;
+    }
+
+    /**
+     * 参数验证
+     */
+    private Boolean VateParams(ConsumptionRequest consumptionRequest) {
+        if (consumptionRequest != null) {
+            //从请求头获取医院和科室id
+            String hosId = httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER);
+            String depId = httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER);
+            if (StringUtils.isNotBlank(consumptionRequest.getBusinessId())
+                    && consumptionRequest.getConsumptionCount() > 0
+                    && StringUtils.isNotBlank(hosId)
+                    && StringUtils.isNotBlank(depId)) {
+                return true;
+            } else {
+                logger.info("扣费请求参数不完整!");
+            }
+        } else {
+            logger.info("扣费请求参数为空!");
+        }
+        return false;
+    }
+
+    /**
+     * 检查余额够不够
+     * @param consumptionCount 要扣的数量
+     * @return
+     */
+    private Boolean VateUserNowProduct(int consumptionCount) {
+        Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER));
+        Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER));
+        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.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER));
+        Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER));
+        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) {
+            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).collect(Collectors.toList()).size() == 1;
             }
         }
         return false;
@@ -111,29 +598,48 @@
 
     /**
      * 获取一个业务关联的扣费记录
+     *
      * @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()
+    {
+        Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER));
+        Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER));
+        Long doctorId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.DOCTOR_ID_HEADER));
+        //发消息到队列
+        String context = "{\"hospitalId\":\"" + hospitalId +
+                "\",\"departmentId\":\"" + departmentId +
+                "\",\"doctorId\":\"" + doctorId +
+                "\",\"date\":\"" + DateUtils.formatDate(new Date(),"yyyy-MM-dd")+"\"}";
+        rabbitTemplate.convertAndSend(ConsumptionConstant.EXCHANGE_DATA, ConsumptionConstant.ROUTINGKEY_DATA, context);
+    }
 }
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java
index 7a2efd8..b508878 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java
@@ -2,12 +2,15 @@
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.constant.ConsumptionConstant;
 import com.kidgrow.common.model.*;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
 import com.kidgrow.common.utils.DateUtils;
 import com.kidgrow.oprationcenter.feign.DiagnosticService;
 import com.kidgrow.oprationcenter.feign.RoleOrganizationService;
+import com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper;
 import com.kidgrow.oprationcenter.mapper.ProductOrderDetailMapper;
+import com.kidgrow.oprationcenter.model.ConsumptionRecord;
 import com.kidgrow.oprationcenter.model.ProductOrderDetail;
 import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
 import com.kidgrow.oprationcenter.vo.DiagnosisRecord;
@@ -47,6 +50,8 @@
     private SysDoctorService sysDoctorService;
     @Autowired
     private SysHospitalService sysHospitalService;
+    @Autowired
+    private ConsumptionRecordMapper consumptionRecordMapper;
     /**
      * 列表
      * @param params
@@ -188,4 +193,49 @@
         }
         return null;
     }
+    /**
+     * 统计用户所有套餐剩余  套餐剩余量=(有效期内的医院所有共享+科室私有的套餐的读片量)-预扣费的读片量
+     *
+     * @param hospitalId
+     * @param departmentId
+     * @return
+     */
+    @Override
+    public ResultBody biUserNowProduct(Long hospitalId, Long departmentId) {
+        if (hospitalId > 0 && departmentId > 0) {
+            UserProductDetail userProductDetail=getUserProductDetail(hospitalId,departmentId);
+            int userAICount = 0;
+            if (userProductDetail!=null) {
+                //包含共享的数据
+                List<ProductOrderJoinDetail> productOrderJoinDetailListShare = userProductDetail.getProductOrderJoinDetailListShare();
+                //科室私有的数据
+                List<ProductOrderJoinDetail> productOrderJoinDetailsListDep = userProductDetail.getProductOrderJoinDetailsListDep();
+                //本医院可共享的读片总量
+                int shareCount = productOrderJoinDetailListShare.stream().collect(Collectors.summingInt(ProductOrderJoinDetail::getAilightCount));
+                //本科室私有读片总量
+                int depCount = productOrderJoinDetailsListDep.stream().collect(Collectors.summingInt(ProductOrderJoinDetail::getAilightCount));
+                //可用的总量
+                userAICount = shareCount + depCount;
+                //计算预扣费的总量
+                Map<String, Object> selectMap = new HashMap<>();
+                selectMap.put("recordType", ConsumptionConstant.BEFORE_DEDUCTION);
+                List<ConsumptionRecord> consumptionRecordList = consumptionRecordMapper.findList(selectMap);;
+                if (consumptionRecordList.size() > 0) {
+                    //共享套餐里面的detailid
+                    List<Long> shareDetailId = productOrderJoinDetailListShare.stream().map(m -> m.getId()).collect(Collectors.toList());
+                    //私有套餐里面的detailid
+                    List<Long> depDetailId = productOrderJoinDetailsListDep.stream().map(m -> m.getId()).collect(Collectors.toList());
+                    //共享套餐里面预扣费总数
+                    int shareConCount = consumptionRecordList.stream().filter(f -> shareDetailId.contains(f.getProOrderDetailId())).collect(Collectors.summingInt(ConsumptionRecord::getConsumptionCount));
+                    //共享套餐里面预扣费总数
+                    int depConCount = consumptionRecordList.stream().filter(f -> depDetailId.contains(f.getProOrderDetailId())).collect(Collectors.summingInt(ConsumptionRecord::getConsumptionCount));
+                    userAICount -= (shareConCount + depConCount);
+                }
+            }
+
+            return ResultBody.ok().data(userAICount);
+        } else {
+            return ResultBody.failed("医院和科室数据有误!");
+        }
+    }
 }
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java
index 63c5f83..0a853f6 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java
@@ -2,22 +2,17 @@
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.kidgrow.common.constant.ConsumptionConstant;
 import com.kidgrow.common.model.*;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
 import com.kidgrow.common.utils.DateUtils;
 import com.kidgrow.oprationcenter.feign.DiagnosticService;
 import com.kidgrow.oprationcenter.feign.RoleOrganizationService;
 import com.kidgrow.oprationcenter.mapper.ProductOrderRecordMapper;
-import com.kidgrow.oprationcenter.model.ConsumptionRecord;
 import com.kidgrow.oprationcenter.model.ProductOrderRecord;
-import com.kidgrow.oprationcenter.service.IConsumptionRecordService;
-import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
 import com.kidgrow.oprationcenter.service.IProductOrderRecordService;
 import com.kidgrow.oprationcenter.vo.DiagnosisRecord;
 import com.kidgrow.oprationcenter.vo.GroupProductDetail;
 import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
-import com.kidgrow.oprationcenter.vo.UserProductDetail;
 import com.kidgrow.usercenter.feign.SysDoctorService;
 import com.kidgrow.usercenter.feign.SysHospitalService;
 import com.kidgrow.usercenter.model.SysHospital;
@@ -30,7 +25,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -52,10 +46,6 @@
     private SysDoctorService sysDoctorService;
     @Autowired
     private SysHospitalService sysHospitalService;
-    @Autowired
-    private IProductOrderDetailService productOrderDetailService;
-    @Autowired
-    private IConsumptionRecordService consumptionRecordService;
 
     /**
      * 列表
@@ -107,52 +97,6 @@
         Page<GroupProductDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
         List<GroupProductDetail> list = baseMapper.groupProductDetail(page, params);
         return PageResult.<GroupProductDetail>builder().data(list).code(0).count(page.getTotal()).build();
-    }
-
-    /**
-     * 统计用户所有套餐剩余  套餐剩余量=(有效期内的医院所有共享+科室私有的套餐的读片量)-预扣费的读片量
-     *
-     * @param hospitalId
-     * @param departmentId
-     * @return
-     */
-    @Override
-    public ResultBody biUserNowProduct(Long hospitalId, Long departmentId) {
-        if (hospitalId > 0 && departmentId > 0) {
-            UserProductDetail userProductDetail=productOrderDetailService.getUserProductDetail(hospitalId,departmentId);
-            int userAICount = 0;
-            if (userProductDetail!=null) {
-                //包含共享的数据
-                List<ProductOrderJoinDetail> productOrderJoinDetailListShare = userProductDetail.getProductOrderJoinDetailListShare();
-                //科室私有的数据
-                List<ProductOrderJoinDetail> productOrderJoinDetailsListDep = userProductDetail.getProductOrderJoinDetailsListDep();
-                //本医院可共享的读片总量
-                int shareCount = productOrderJoinDetailListShare.stream().collect(Collectors.summingInt(ProductOrderJoinDetail::getAilightCount));
-                //本科室私有读片总量
-                int depCount = productOrderJoinDetailsListDep.stream().collect(Collectors.summingInt(ProductOrderJoinDetail::getAilightCount));
-                //可用的总量
-                userAICount = shareCount + depCount;
-                //计算预扣费的总量
-                Map<String, Object> selectMap = new HashMap<>();
-                selectMap.put("recordType", ConsumptionConstant.BEFORE_DEDUCTION);
-                List<ConsumptionRecord> consumptionRecordList = consumptionRecordService.findAllList(selectMap);
-                if (consumptionRecordList.size() > 0) {
-                    //共享套餐里面的detailid
-                    List<Long> shareDetailId = productOrderJoinDetailListShare.stream().map(m -> m.getId()).collect(Collectors.toList());
-                    //私有套餐里面的detailid
-                    List<Long> depDetailId = productOrderJoinDetailsListDep.stream().map(m -> m.getId()).collect(Collectors.toList());
-                    //共享套餐里面预扣费总数
-                    int shareConCount = consumptionRecordList.stream().filter(f -> shareDetailId.contains(f.getProOrderDetailId())).collect(Collectors.summingInt(ConsumptionRecord::getConsumptionCount));
-                    //共享套餐里面预扣费总数
-                    int depConCount = consumptionRecordList.stream().filter(f -> depDetailId.contains(f.getProOrderDetailId())).collect(Collectors.summingInt(ConsumptionRecord::getConsumptionCount));
-                    userAICount -= (shareConCount + depConCount);
-                }
-            }
-
-            return ResultBody.ok().data(userAICount);
-        } else {
-            return ResultBody.failed("医院和科室数据有误!");
-        }
     }
     /**
      * 根据ProductOrderRecord对象当做查询条件进行查询
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java
index 08420e1..bcd34f3 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java
@@ -5,6 +5,7 @@
 import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.oprationcenter.model.ConsumptionRecord;
 import com.kidgrow.oprationcenter.service.IConsumptionRecordService;
+import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -96,19 +97,36 @@
             }
         }
     }
-
     /**
-     * 删除
+     * 要让AI读片-调用
      */
-    @ApiOperation(value = "删除")
-    @DeleteMapping("/{id}")
-    public ResultBody delete(@PathVariable Long recordId) {
-        boolean v= consumptionRecordService.removeById(recordId);
-        if(v) {
-            return ResultBody.ok().msg("删除成功");
-        }
-        else {
-            return ResultBody.failed().msg("删除失败");
-        }
+    @ApiOperation(value = "要让AI读片-调用")
+    @PostMapping("/AIStart")
+    public ResultBody consumptionAIStart(@RequestBody ConsumptionRequest consumptionRequest) {
+        return consumptionRecordService.consumptionAIStart(consumptionRequest);
+    }
+    /**
+     * AI返回结果-调用
+     */
+    @ApiOperation(value = "AI返回结果-调用")
+    @PostMapping("/AIReturn")
+    public ResultBody consumptionAIReturn(@RequestBody ConsumptionRequest consumptionRequest) {
+        return consumptionRecordService.consumptionAIReturn(consumptionRequest);
+    }
+    /**
+     * AI拒读/失败通知-调用
+     */
+    @ApiOperation(value = "AI拒读/失败通知-调用")
+    @PostMapping("/AIFail")
+    public ResultBody consumptionAIFail(@RequestBody ConsumptionRequest consumptionRequest) {
+        return consumptionRecordService.consumptionAIFail(consumptionRequest);
+    }
+    /**
+     * 发起人工读片-调用
+     */
+    @ApiOperation(value = "发起人工读片-调用")
+    @PostMapping("/Artificial")
+    public ResultBody consumptionArtificial(@RequestBody ConsumptionRequest consumptionRequest) {
+        return consumptionRecordService.consumptionArtificial(consumptionRequest);
     }
 }
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java
index e235466..dea646c 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java
@@ -9,6 +9,7 @@
 import com.kidgrow.common.utils.StringUtils;
 import com.kidgrow.oprationcenter.model.ProductOrderRecord;
 import com.kidgrow.oprationcenter.service.IBusinessRecordsService;
+import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
 import com.kidgrow.oprationcenter.service.IProductOrderRecordService;
 import com.kidgrow.oprationcenter.service.IProductOrderService;
 import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
@@ -47,6 +48,8 @@
 public class ProductOrderRecordController extends BaseController {
     @Autowired
     private IProductOrderRecordService productOrderRecordService;
+    @Autowired
+    private IProductOrderDetailService productOrderDetailService;
     @Autowired
     private IBusinessRecordsService businessRecordsService;
     @Autowired
@@ -132,7 +135,7 @@
     @ApiOperation(value = "查询")
     @GetMapping("/biUserNowProduct")
     public ResultBody biUserNowProduct(@RequestParam long hospitalId, Long departmentId) {
-        return productOrderRecordService.biUserNowProduct(hospitalId,departmentId);
+        return productOrderDetailService.biUserNowProduct(hospitalId,departmentId);
     }
     /**
      * 查询
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
index a437e46..b009505 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
@@ -17,7 +17,27 @@
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       aop-patterns: com.kidgrow.oprationcenter.controller.*,com.kidgrow.oprationcenter.mapper.*
-
+  # rabbitMQ
+  rabbitmq:
+    host: 182.92.99.224
+    port: 5672
+    username: liuke
+    password: kidgrow2020
+    #交换机名称
+    exchangeName: BoneAgeEvaluation
+    #队列名称
+    queueName: test_queue #AdvancedEvaluation # AIEvaluation #,AdvancedEvaluationResult
+    #routingKeyName
+    routingKeyName: Kidgrow2020
+    virtual-host: kidgrow
+    #开启重试机制
+    listener:
+      simple:
+        #采用手动应答
+        acknowledge-mode: manual
+        retry:
+          enabled: true
+          max-attempts: 5
 eureka:
   instance:
     ###注册中心ip地址
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java
index 41d3cc4..7f4c6fb 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java
@@ -25,11 +25,11 @@
     /**
      * 扣费业务标识
      */
-    int DEDUCTION = 3;
+    int DEDUCTION = 4;
     /**
      * 退扣费业务标识
      */
-    int RETURN_DEDUCTION = 4;
+    int RETURN_DEDUCTION = 3;
 
 //    业务返回结果
 //    bcode                 含义
@@ -40,7 +40,9 @@
 //201                 已经扣费
 //300                 退还预扣
 //301                 退还扣费
-//400                 义务执行出错
+//400                 业务执行出错
+//401                 参数为空异常
+//402                 业务失败
     /**
      * 余额充足
      */
@@ -62,11 +64,23 @@
      */
     int BUSINESS_CODE_RETURN_BEFORE_DEDUCTION = 300;
     /**
-     * 退还预扣
+     * 退还扣
      */
     int BUSINESS_CODE_RETURN_DEDUCTION = 301;
     /**
      * 业务出错
      */
     int BUSINESS_CODE_ERROR = 400;
+    /**
+     * 参数为空异常
+     */
+    int BUSINESS_CODE_PARAMS_ERROR = 401;
+    /**
+     * 业务失败
+     */
+    int BUSINESS_RUN_FAIL = 402;
+
+    //MQ相关
+    String EXCHANGE_DATA="BICenter";
+    String ROUTINGKEY_DATA="Kidgrow2033";
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java
index d6b5362..a19375d 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java
@@ -18,6 +18,10 @@
      * 用户信息头
      */
     String USER_HEADER = "x-user-header";
+    /**
+     * 医生id
+     */
+    String DOCTOR_ID_HEADER = "x-doctor-id-header";
 
     /**
      * 用户id信息头

--
Gitblit v1.8.0