forked from kidgrow-microservices-platform

dougang
2020-11-14 ef31d1678d820175f47c3645704ddecf171265ae
kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java
@@ -2,7 +2,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kidgrow.common.constant.ConsumptionConstant;
import com.kidgrow.common.constant.SecurityConstants;
import com.kidgrow.common.constant.PayConstants;
import com.kidgrow.common.model.PageResult;
import com.kidgrow.common.model.ResultBody;
import com.kidgrow.common.service.impl.SuperServiceImpl;
@@ -10,9 +10,13 @@
import com.kidgrow.common.utils.StringUtils;
import com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper;
import com.kidgrow.oprationcenter.model.ConsumptionRecord;
import com.kidgrow.oprationcenter.model.PayManager;
import com.kidgrow.oprationcenter.model.ProductOrderDetail;
import com.kidgrow.oprationcenter.model.SaasClientPay;
import com.kidgrow.oprationcenter.service.IConsumptionRecordService;
import com.kidgrow.oprationcenter.service.IPayManagerService;
import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
import com.kidgrow.oprationcenter.service.ISaasClientPayService;
import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
import com.kidgrow.oprationcenter.vo.ConsumptionVo;
import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
@@ -21,15 +25,17 @@
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.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
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>
@@ -46,12 +52,15 @@
    @Autowired
    private IProductOrderDetailService productOrderDetailService;
    @Autowired
    private HttpServletRequest httpServletRequest;
    private IPayManagerService payManagerService;
    @Autowired
    private ISaasClientPayService saasClientPayService;
    @Autowired
    private RabbitTemplate rabbitTemplate;
    private static final Logger logger = LoggerFactory.getLogger(ConsumptionRecordServiceImpl.class);
    @Value("${spring.profiles.active}")
    private String envName;
    /**
     * 列表
@@ -99,52 +108,69 @@
    public ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest) {
        //默认的业务返回码
        int bcode = -1;
        //记录类型
        int recordType = ConsumptionConstant.BEFORE_DEDUCTION;
        //业务执行结果
        boolean isSuccess = false;
        boolean isSuccess = true;
        //业务执行结果信息
        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 = "该业务已经预扣费!";
            //是否开通单次支付
            if (departmentIsPay(consumptionRequest)) {
                //是否支付成功
                if (departmentPayStatus(consumptionRequest)) {
                    //预扣费成功
                    reMsg = "单次支付模拟预扣费成功!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
                } else {
                    reMsg = "单次支付未成功,不允许预扣费!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                    isSuccess = false;
                }
            } else {
                //已经扣费
                reMsg = "该业务已经扣费!";
                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                //先获取这个业务关联的扣费记录
                List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
                //1.先检查是否已经扣费
                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
                    //2.没有扣费,检查是否已经预扣费
                    if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
                        //3.没有预扣,查询余额
                        Map<String, Object> vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
                        if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
                            //4.余额充足 获取要扣的套餐 写预扣费记录
                            if (beforeConsumption(consumptionRequest)) {
                                //预扣费成功
                                reMsg = "预扣费成功!";
                                bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
                            } else {
                                //预扣费执行失败
                                isSuccess = false;
                                reMsg = "预扣费执行失败!";
                                bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
                            }
                        } else {
                            //余额不足 或获取异常
                            isSuccess = false;
                            reMsg = vateMap.get("vateMsg").toString();
                            bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                        }
                    } else {
                        //已经预扣费
                        reMsg = "该业务已经预扣费!";
                        bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
                    }
                } else {
                    //已经扣费
                    reMsg = "该业务已经扣费!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                }
            }
        } else {
            isSuccess = false;
            reMsg = "传入参数有误!";
            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
        }
        return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess);
        return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
    }
    /**
@@ -158,54 +184,78 @@
    public ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest) {
        //默认的业务返回码
        int bcode = -1;
        //记录类型
        int recordType = ConsumptionConstant.DEDUCTION;
        //业务执行结果
        boolean isSuccess = false;
        boolean isSuccess = true;
        //业务执行结果信息
        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 = "该业务扣费成功!";
            //是否开通单次支付
            if (departmentIsPay(consumptionRequest)) {
                //是否支付成功
                if (departmentPayStatus(consumptionRequest)) {
                    //预扣费成功
                    reMsg = "单次支付模拟扣费成功!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                    //消息队列通知
                    MessageToBI(consumptionRequest);
                } else {
                    reMsg = "该业务扣费失败!";
                    reMsg = "单次支付未成功,不允许扣费!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                    isSuccess=false;
                }
            } else {
                //已经扣费
                reMsg = "该业务已经扣费!";
                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                //先获取这个业务关联的扣费记录
                List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
                Long hospitalId = consumptionRequest.getHospitalId();
                //1.先检查是否已经扣费
                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
                    //2.没有扣费,检查是否已经预扣费
                    if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
                        //2.1.没有预扣,查询余额
                        Map<String, Object> vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), hospitalId, consumptionRequest.getDepartmentId());
                        if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
                            //2.2.余额充足 获取要扣的套餐 写预扣费记录
                            if (beforeConsumption(consumptionRequest)) {
                                //预扣费成功
                                logger.info("医院id:【{}】AI返回结果应该不走预扣,目前确已经预扣!", hospitalId);
                            } else {
                                //预扣费执行失败
                                isSuccess = false;
                                reMsg = "预扣费执行失败!";
                                bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
                                return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
                            }
                        } else {
                            //余额不足
                            isSuccess = false;
                            reMsg = vateMap.get("vateMsg").toString();
                            bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                            return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
                        }
                    }
                    if (consumptionBusiess(consumptionRequest, consumptionRecordList)) {
                        reMsg = "该业务扣费成功!";
                        bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                    } else {
                        isSuccess = false;
                        reMsg = "该业务扣费失败!";
                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                    }
                } else {
                    //已经扣费
                    reMsg = "该业务已经扣费!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                }
            }
        } else {
            isSuccess = false;
            reMsg = "传入参数有误!";
            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
        }
        return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess);
        return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
    }
    /**
@@ -219,119 +269,132 @@
    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());
            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;
            //是否开通单次支付
            if (departmentIsPay(consumptionRequest)) {
                //是否支付成功
                if (departmentPayStatus(consumptionRequest)) {
                    //预扣费成功
                    reMsg = "单次支付模拟退还扣费成功!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION;
                    isSuccess=true;
                } else {
                    reMsg = "单次支付未成功,不允许退扣费!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                }
            } 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 写退费记录
                //先获取这个业务关联的扣费记录
                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_DEDUCTION);
                            consumptionRecordNew.setBusinessId(consumptionRecord.getBusinessId());
                            consumptionRecordNew.setConsumptionCount(consumptionRecord.getConsumptionCount());
                            consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_DEDUCTION);
                            consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
                            consumptionRecordNew.setLastRecordId(consumptionRecord.getLastRecordId());
                            consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION);
                            consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
                            consumptionRecordNew.setConsumptionCount(0 - consumptionRequest.getConsumptionCount());
                            consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_BEFORE_DEDUCTION);
                            consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId);
                            consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
                            consumptionRecordNew.setDiaId(consumptionRequest.getDiaId());
                            if (SaveConsumptionRecord(consumptionRecordNew)) {
                                //写退费记录成功
                                isSuccess=true;
                                reMsg = "退还扣费成功!";
                                bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION;
                                isSuccess = true;
                                reMsg = "有预扣,写退还预扣成功!";
                                bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION;
                            } else {
                                reMsg = "写退还预扣失败!";
                                bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
                            }
                            else
                            {
                        } 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());
                                    consumptionRecordNew.setDiaId(consumptionRequest.getDiaId());
                                    if (SaveConsumptionRecord(consumptionRecordNew)) {
                                        //写退费记录成功
                                        isSuccess = true;
                                        reMsg = "退还扣费成功!";
                                        bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION;
                                    } else {
                                        reMsg = "退还扣费失败!";
                                        bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
                                    }
                                } else {
                                    //更新扣费失败
                                    reMsg = "更新扣费失败!";
                                    bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
                                }
                            } else {
                                //退费失败
                                reMsg = "退还扣费失败!";
                                bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
                            }
                        }
                        else
                        {
                            //退费失败
                            reMsg = "退还扣费失败!";
                        } else {
                            reMsg = "无相关套餐数据!";
                            bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
                        }
                    }
                    else
                    {
                        reMsg = "无相关套餐数据!";
                    } 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);
        return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
    }
    /**
     * 发起人工读片-调用
     *
     * @param consumptionRequest 请求的数据实体
     * @return
     */
@@ -340,49 +403,82 @@
    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());
            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;
                    }
            //是否开通单次支付
            if (departmentIsPay(consumptionRequest))
            {
                //是否支付成功
                if (departmentPayStatus(consumptionRequest)) {
                    //预扣费成功
                    reMsg = "单次支付模拟已经扣费成功!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                    isSuccess = true;
                    //消息队列通知
                    MessageToBI(consumptionRequest);
                } else {
                    reMsg = "单次支付未成功,不允许业务进行!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                }
                //扣费业务
                isSuccess= consumptionBusiess(consumptionRequest,consumptionRecordList);
            } else {
                //已经扣费
                reMsg = "该业务已经扣费!";
                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
            }
            else {
                //先获取这个业务关联的扣费记录
                List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
                //1.先检查是否已经扣费
                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
                    //2.没有扣费,检查是否已经预扣费
                    if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
                        //3.没有预扣,查询余额
                        Map<String, Object> vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
                        if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
                            //4.余额充足 获取要扣的套餐 写预扣费记录
                            if (!beforeConsumption(consumptionRequest)) {
                                //预扣费执行失败
                                reMsg = "预扣费执行失败!";
                                bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
                                return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
                            } else {
                                //发起了一个新的预扣,需要更新扣费业务数据列表
                                consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
                            }
                        } else {
                            //余额不足
                            reMsg = vateMap.get("vateMsg").toString();
                            bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
                            return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
                        }
                    }
                    //扣费业务
                    isSuccess = consumptionBusiess(consumptionRequest, consumptionRecordList);
                    if (isSuccess) {
                        reMsg = "该业务已经扣费!";
                        bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                    } else {
                        reMsg = "该业务扣费失败!";
                        bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
                    }
                } else {
                    isSuccess = true;
                    //已经扣费
                    reMsg = "该业务已经扣费!";
                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
                }
            }
        } else {
            reMsg = "传入参数有误!";
            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
        }
        return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess);
        return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
    }
    /**
     * 扣费业务(扣费 更新预扣 写扣费记录)
     *
     * @param consumptionRequest    请求参数
     * @param consumptionRecordList 扣费业务数据
     * @return
@@ -398,7 +494,7 @@
            productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount());
        } else {
            //要是被别人已经用了,就要重新找套餐
            productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount());
            productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
            if (productOrderDetail == null) {
                logger.info("业务编号:【{}】无可用套餐!", consumptionRequest.getBusinessId());
                return false;
@@ -418,7 +514,9 @@
            consumptionRecordNew.setConsumptionCount(consumptionRequest.getConsumptionCount());
            consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION);
            consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
            consumptionRecordNew.setLastRecordId(consumptionRecord.getLastRecordId());
            consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
            consumptionRecordNew.setDiaId(consumptionRequest.getDiaId());
            consumptionRecordNew.setCreateTime(new Date());
            if (SaveConsumptionRecord(consumptionRecordNew)) {
                //3.3 扣费成功 如果套餐id变化,则更新预扣费的套餐id
@@ -430,7 +528,7 @@
                    }
                }
                //消息队列通知
                MessageToBI();
                MessageToBI(consumptionRequest);
                //已经扣费
                logger.info("业务编号:【{}】该业务已经扣费!", consumptionRequest.getBusinessId());
                return true;
@@ -452,13 +550,15 @@
     * @param isSuccess          业务执行是否成功
     * @return
     */
    private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode, String reMsg, boolean isSuccess) {
    private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode, int recordType, String reMsg, boolean isSuccess) {
        //返回的数据实体
        ConsumptionVo consumptionVo = new ConsumptionVo();
        consumptionVo.setConsumptionCount(consumptionRequest.getConsumptionCount());
        consumptionVo.setBusinessId(consumptionRequest.getBusinessId());
        consumptionVo.setBcode(bcode);
        consumptionVo.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION);
        consumptionVo.setRecordType(recordType);
        logger.info("扣费业务返回参数实体:"+consumptionRequest.toString());
        logger.info("扣费业务返回其他参数:bcode:{},recordType:{},reMsg:{},isSuccess:{}",bcode,recordType,reMsg,isSuccess);
        if (isSuccess) {
            return ResultBody.ok().data(consumptionVo).msg(reMsg);
        } else {
@@ -468,13 +568,12 @@
    /**
     * 预扣费业务
     *
     * @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());
        ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
        if (productOrderDetail != null) {
            ConsumptionRecord consumptionRecord = new ConsumptionRecord();
            consumptionRecord.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION);
@@ -482,13 +581,14 @@
            consumptionRecord.setConsumptionCount(consumptionRequest.getConsumptionCount());
            consumptionRecord.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION);
            consumptionRecord.setProOrderDetailId(productOrderDetail.getId());
            consumptionRecord.setDiaId(consumptionRequest.getDiaId());
            if (SaveConsumptionRecord(consumptionRecord)) {
                return true;
            } else {
                logger.info("医院id:【{}】预扣费执行失败!", hospitalId);
                logger.info("医院id:【{}】预扣费执行失败!", consumptionRequest.getHospitalId());
            }
        } else {
            logger.info("医院id:【{}】套餐获取失败!", hospitalId);
            logger.info("医院id:【{}】套餐获取失败!", consumptionRequest.getHospitalId());
        }
        return false;
    }
@@ -497,14 +597,19 @@
     * 参数验证
     */
    private Boolean VateParams(ConsumptionRequest consumptionRequest) {
        logger.info("收到扣费请求的参数:"+consumptionRequest.toString());
        if (consumptionRequest != null) {
            //从请求头获取医院和科室id
            String hosId = httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER);
            String depId = httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER);
            String hosId = consumptionRequest.getHospitalId().toString();
            String depId = consumptionRequest.getDepartmentId().toString();
            String doctorId = consumptionRequest.getDoctorId().toString();
            String diaId = consumptionRequest.getDiaId();
            if (StringUtils.isNotBlank(consumptionRequest.getBusinessId())
                    && consumptionRequest.getConsumptionCount() > 0
                    && StringUtils.isNotBlank(hosId)
                    && StringUtils.isNotBlank(depId)) {
                    && StringUtils.isNotBlank(depId)
                    && StringUtils.isNotBlank(doctorId)
                    && StringUtils.isNotBlank(diaId)) {
                return true;
            } else {
                logger.info("扣费请求参数不完整!");
@@ -517,39 +622,45 @@
    /**
     * 检查余额够不够
     *
     * @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));
    private Map<String, Object> VateUserNowProduct(int consumptionCount, Long hospitalId, Long departmentId) {
        Map<String, Object> returnMap = new HashMap<>();
        ResultBody biUserPro = productOrderDetailService.biUserNowProduct(hospitalId, departmentId);
        if (biUserPro.getCode() == 0) {
            if (StringUtils.isNotBlank(biUserPro.getData().toString())) {
                //余额
                int userAICount = Integer.parseInt(biUserPro.getData().toString());
                if (userAICount >= consumptionCount) {
                    return true;
                    returnMap.put("vateRe", true);
                    returnMap.put("vateMsg", "余额足够!");
                } else {
                    returnMap.put("vateRe", false);
                    returnMap.put("vateMsg", "余额不足!");
                    logger.info("医院id:【{}】余额不足!", hospitalId);
                }
            } else {
                logger.error("医院id:【{}】余额获取异常!", hospitalId);
                returnMap.put("vateRe", false);
                returnMap.put("vateMsg", "余额获取异常,data为空!");
                logger.info("医院id:【{}】余额获取异常!", hospitalId);
            }
        } else {
            returnMap.put("vateRe", false);
            returnMap.put("vateMsg", "余额获取异常,Code非0!");
            logger.info("医院id:【{}】余额获取异常,返回非0!", hospitalId);
        }
        return false;
        return returnMap;
    }
    /**
     * 获取要使用的套餐实体
     * @param consumCount  要使用的数量
     *
     * @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));
    private ProductOrderDetail deductionDepartmentProduct(int consumCount, Long hospitalId, Long departmentId) {
        UserProductDetail userProductDetail = productOrderDetailService.getUserProductDetail(hospitalId, departmentId);
        //合并集合
        userProductDetail.getProductOrderJoinDetailListShare().addAll(userProductDetail.getProductOrderJoinDetailsListDep());
@@ -572,6 +683,9 @@
     */
    private Boolean SaveConsumptionRecord(ConsumptionRecord consumptionRecord) {
        if (consumptionRecord != null) {
            if (consumptionRecord.getCreateTime() == null) {
                consumptionRecord.setCreateTime(new Date());
            }
            return this.saveOrUpdate(consumptionRecord);
        } else {
            logger.info("扣费数据写入参数为空!");
@@ -590,7 +704,7 @@
        if (consumptionRecordList != null) {
            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;
@@ -598,7 +712,6 @@
    /**
     * 获取一个业务关联的扣费记录
     *
     * @param businessId 光片的名称/编号
     * @return
     */
@@ -627,19 +740,55 @@
    /**
     * 发消息到消息队列
     *
     * @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));
    //@RabbitListener(queues = "BoneAgeEvaluationData")
    private void MessageToBI(ConsumptionRequest consumptionRequest) {
        //发消息到队列
        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);
        String context = "{\"hospitalId\":\"" + consumptionRequest.getHospitalId() +
                "\",\"departmentId\":\"" + consumptionRequest.getDepartmentId() +
                "\",\"doctorId\":\"" + consumptionRequest.getDoctorId() +
                "\",\"date\":\"" + DateUtils.formatDate(new Date(), "yyyy-MM-dd") + "\"}";
        rabbitTemplate.convertAndSend(ConsumptionConstant.EXCHANGE_DATA, ConsumptionConstant.ROUTINGKEY_DATA + envName, context);
        log.info("骨龄评价扣费消息已发送:" + context);
    }
    /**
     * 查看当前科室是否开通了单次支付
     *
     * @param consumptionRequest
     * @return
     */
    private Boolean departmentIsPay(ConsumptionRequest consumptionRequest) {
        log.info("查看当前科室是否开通了单次支付请求参数:"+consumptionRequest.toString());
        PayManager payManager = payManagerService.findByObject(consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
        log.info("查看当前科室是否开通了单次支付请求查询后数据:"+payManager.toString());
        if (payManager == null) {
            return false;
        } else {
            return payManager.getId()!=null;
        }
    }
    /**
     * 查看当前科室当前诊断id的支付状态是否成功
     *
     * @param consumptionRequest
     * @return
     */
    private Boolean departmentPayStatus(ConsumptionRequest consumptionRequest) {
        log.info("查看当前科室当前诊断id的支付状态是否成功请求参数:"+consumptionRequest.toString());
        SaasClientPay saasClientPay = saasClientPayService.findModelByObject(consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId(), consumptionRequest.getDiaId());
        log.info("查看当前科室当前诊断id的支付状态是否成功查询后数据:"+saasClientPay.toString());
        if (saasClientPay == null) {
            return false;
        } else {
            if (saasClientPay.getPayStatus().equals(PayConstants.ORDER_PAY_SUCEESS)) {
                return true;
            }
        }
        return false;
    }
}