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.PayConstants;
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.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;
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.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 java.util.*;
import java.util.stream.Collectors;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
/**
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
*
* @version 1.0
* @Description:
* @Project: 运营中心
* @CreateDate: Created in 2020-06-23 15:07:14
* @Author: houruijun
*/
@Slf4j
@Service
public class ConsumptionRecordServiceImpl extends SuperServiceImpl implements IConsumptionRecordService {
@Autowired
private IProductOrderDetailService productOrderDetailService;
@Autowired
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;
/**
* 列表
*
* @param params
* @return
*/
@Override
public PageResult findList(Map params) {
Page page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
List list = baseMapper.findList(page, params);
return PageResult.builder().data(list).code(0).count(page.getTotal()).build();
}
/**
* 列表
*
* @param params
* @return
*/
@Override
public List findAllList(Map params) {
return baseMapper.findList(params);
}
/**
* 根据ConsumptionRecord对象当做查询条件进行查询
*
* @param consumptionRecord
* @return ConsumptionRecord
*/
@Override
public ConsumptionRecord findByObject(ConsumptionRecord consumptionRecord) {
return baseMapper.findByObject(consumptionRecord);
}
/**
* 要让AI读片-调用
*
* @param consumptionRequest 请求的数据实体
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest) {
//默认的业务返回码
int bcode = -1;
//记录类型
int recordType = ConsumptionConstant.BEFORE_DEDUCTION;
//业务执行结果
boolean isSuccess = true;
//业务执行结果信息
String reMsg = "";
if (VateParams(consumptionRequest)) {
//是否开通单次支付
if (departmentIsPay(consumptionRequest)) {
//是否支付成功
if (departmentPayStatus(consumptionRequest)) {
//预扣费成功
reMsg = "单次支付模拟预扣费成功!";
bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
} else {
reMsg = "单次支付未成功,不允许预扣费!";
bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
isSuccess = false;
}
} else {
//先获取这个业务关联的扣费记录
List consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
//1.先检查是否已经扣费
if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
//2.没有扣费,检查是否已经预扣费
if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
//3.没有预扣,查询余额
Map vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
//4.余额充足 获取要扣的套餐 写预扣费记录
if (beforeConsumption(consumptionRequest)) {
//预扣费成功
reMsg = "预扣费成功!";
bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
} else {
//预扣费执行失败
isSuccess = false;
reMsg = "预扣费执行失败!";
bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
}
} else {
//余额不足 或获取异常
isSuccess = false;
reMsg = vateMap.get("vateMsg").toString();
bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
}
} else {
//已经预扣费
reMsg = "该业务已经预扣费!";
bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
}
} else {
//已经扣费
reMsg = "该业务已经扣费!";
bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
}
}
} else {
isSuccess = false;
reMsg = "传入参数有误!";
bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
}
return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
}
/**
* AI返回结果-调用
*
* @param consumptionRequest 请求的数据实体
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest) {
//默认的业务返回码
int bcode = -1;
//记录类型
int recordType = ConsumptionConstant.DEDUCTION;
//业务执行结果
boolean isSuccess = true;
//业务执行结果信息
String reMsg = "";
if (VateParams(consumptionRequest)) {
//是否开通单次支付
if (departmentIsPay(consumptionRequest)) {
//是否支付成功
if (departmentPayStatus(consumptionRequest)) {
//预扣费成功
reMsg = "单次支付模拟扣费成功!";
bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
//消息队列通知
MessageToBI(consumptionRequest);
} else {
reMsg = "单次支付未成功,不允许扣费!";
bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
isSuccess=false;
}
} else {
//先获取这个业务关联的扣费记录
List consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
Long hospitalId = consumptionRequest.getHospitalId();
//1.先检查是否已经扣费
if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
//2.没有扣费,检查是否已经预扣费
if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
//2.1.没有预扣,查询余额
Map vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), hospitalId, consumptionRequest.getDepartmentId());
if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
//2.2.余额充足 获取要扣的套餐 写预扣费记录
if (beforeConsumption(consumptionRequest)) {
//预扣费成功
logger.info("医院id:【{}】AI返回结果应该不走预扣,目前确已经预扣!", hospitalId);
} else {
//预扣费执行失败
isSuccess = false;
reMsg = "预扣费执行失败!";
bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
}
} else {
//余额不足
isSuccess = false;
reMsg = vateMap.get("vateMsg").toString();
bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
}
}
if (consumptionBusiess(consumptionRequest, consumptionRecordList)) {
reMsg = "该业务扣费成功!";
bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
} else {
isSuccess = false;
reMsg = "该业务扣费失败!";
bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
}
} else {
//已经扣费
reMsg = "该业务已经扣费!";
bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
}
}
} else {
isSuccess = false;
reMsg = "传入参数有误!";
bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
}
return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
}
/**
* AI拒读/失败通知-调用
*
* @param consumptionRequest 请求的数据实体
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest) {
//默认的业务返回码
int bcode = -1;
//记录类型
int recordType = ConsumptionConstant.RETURN_BEFORE_DEDUCTION;
//业务执行结果
boolean isSuccess = false;
//业务执行结果信息
String reMsg = "";
if (VateParams(consumptionRequest)) {
//是否开通单次支付
if (departmentIsPay(consumptionRequest)) {
//是否支付成功
if (departmentPayStatus(consumptionRequest)) {
//预扣费成功
reMsg = "单次支付模拟退还扣费成功!";
bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION;
isSuccess=true;
} else {
reMsg = "单次支付未成功,不允许退扣费!";
bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
}
} else {
//先获取这个业务关联的扣费记录
List consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
//1.先检查是否已经扣费
if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
//2.没有扣费,检查是否已经预扣费
if (isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
//2.1.有预扣费
ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION && f.getProOrderDetailId() > 0).collect(Collectors.toList()).get(0);
//把占用的套餐id还回去
Long tempProOrderDetailId = consumptionRecord.getProOrderDetailId();
consumptionRecord.setProOrderDetailId(0L);
consumptionRecord.setUpdateTime(new Date());
if (SaveConsumptionRecord(consumptionRecord)) {
//退预扣记录
ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION);
consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
consumptionRecordNew.setConsumptionCount(0 - consumptionRequest.getConsumptionCount());
consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_BEFORE_DEDUCTION);
consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId);
consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
consumptionRecordNew.setDiaId(consumptionRequest.getDiaId());
if (SaveConsumptionRecord(consumptionRecordNew)) {
isSuccess = true;
reMsg = "有预扣,写退还预扣成功!";
bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION;
} else {
reMsg = "写退还预扣失败!";
bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
}
} else {
reMsg = "更新预扣费记录失败!";
bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
}
} else {
reMsg = "没有相关预扣记录!";
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 = "无相关套餐数据!";
bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
}
} else {
reMsg = "无相关扣费数据!";
bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
}
}
}
} else {
reMsg = "传入参数有误!";
bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
}
return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess);
}
/**
* 发起人工读片-调用
*
* @param consumptionRequest 请求的数据实体
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest) {
//默认的业务返回码
int bcode = -1;
//记录类型
int recordType = ConsumptionConstant.DEDUCTION;
//业务执行结果
boolean isSuccess = false;
//业务执行结果信息
String reMsg = "";
if (VateParams(consumptionRequest)) {
//是否开通单次支付
if (departmentIsPay(consumptionRequest))
{
//是否支付成功
if (departmentPayStatus(consumptionRequest)) {
//预扣费成功
reMsg = "单次支付模拟已经扣费成功!";
bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
isSuccess = true;
//消息队列通知
MessageToBI(consumptionRequest);
} else {
reMsg = "单次支付未成功,不允许业务进行!";
bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
}
}
else {
//先获取这个业务关联的扣费记录
List consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
//1.先检查是否已经扣费
if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
//2.没有扣费,检查是否已经预扣费
if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
//3.没有预扣,查询余额
Map 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, recordType, reMsg, isSuccess);
}
/**
* 扣费业务(扣费 更新预扣 写扣费记录)
*
* @param consumptionRequest 请求参数
* @param consumptionRecordList 扣费业务数据
* @return
*/
private boolean consumptionBusiess(ConsumptionRequest consumptionRequest, List consumptionRecordList) {
//3.已经预扣费 则扣费 写扣费记录 更新预扣状态
ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION).collect(Collectors.toList()).get(0);
Long detailId = consumptionRecord.getProOrderDetailId();
//获取预扣的时候占住的套餐id
ProductOrderDetail productOrderDetail = productOrderDetailService.getById(detailId);
if (productOrderDetail.getAilightCount() >= consumptionRequest.getConsumptionCount()) {
//扣掉
productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount());
} else {
//要是被别人已经用了,就要重新找套餐
productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
if (productOrderDetail == null) {
logger.info("业务编号:【{}】无可用套餐!", consumptionRequest.getBusinessId());
return false;
} else {
//新套餐扣费
productOrderDetail = productOrderDetailService.getById(detailId);
productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount());
}
}
//3.1扣费!
boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail);
if (consumptionRe) {
//3.2扣费成功,写扣费记录
ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION);
consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
consumptionRecordNew.setConsumptionCount(consumptionRequest.getConsumptionCount());
consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION);
consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
consumptionRecordNew.setDiaId(consumptionRequest.getDiaId());
consumptionRecordNew.setCreateTime(new Date());
if (SaveConsumptionRecord(consumptionRecordNew)) {
//3.3 扣费成功 同时更新预扣记录数据的套餐id和数据更新时间
consumptionRecord.setProOrderDetailId(productOrderDetail.getId());
consumptionRecord.setUpdateTime(new Date());
if (SaveConsumptionRecord(consumptionRecord)) {
//消息队列通知
MessageToBI(consumptionRequest);
//已经扣费
logger.info("业务编号:【{}】该业务已经扣费!", consumptionRequest.getBusinessId());
return true;
}
else
{
logger.info("业务编号:【{}】更新预扣费数据失败!", consumptionRequest.getBusinessId());
}
} else {
logger.info("业务编号:【{}】预扣费执行失败!", consumptionRequest.getBusinessId());
}
} else {
logger.info("业务编号:【{}】扣除套餐失败!", consumptionRequest.getBusinessId());
}
return false;
}
/**
* 返回结果包装
*
* @param consumptionRequest 请求参数
* @param bcode 返回码
* @param reMsg 返回信息
* @param isSuccess 业务执行是否成功
* @return
*/
private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode, int recordType, String reMsg, boolean isSuccess) {
//返回的数据实体
ConsumptionVo consumptionVo = new ConsumptionVo();
consumptionVo.setConsumptionCount(consumptionRequest.getConsumptionCount());
consumptionVo.setBusinessId(consumptionRequest.getBusinessId());
consumptionVo.setBcode(bcode);
consumptionVo.setRecordType(recordType);
logger.info("扣费业务返回参数实体:"+consumptionRequest.toString());
logger.info("扣费业务返回其他参数:bcode:{},recordType:{},reMsg:{},isSuccess:{}",bcode,recordType,reMsg,isSuccess);
if (isSuccess) {
return ResultBody.ok().data(consumptionVo).msg(reMsg);
} else {
return ResultBody.failed(reMsg).data(consumptionVo);
}
}
/**
* 预扣费业务
*
* @param consumptionRequest 请求参数
* @return
*/
private Boolean beforeConsumption(ConsumptionRequest consumptionRequest) {
ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId());
if (productOrderDetail != null) {
ConsumptionRecord consumptionRecord = new ConsumptionRecord();
consumptionRecord.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION);
consumptionRecord.setBusinessId(consumptionRequest.getBusinessId());
consumptionRecord.setConsumptionCount(consumptionRequest.getConsumptionCount());
consumptionRecord.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION);
consumptionRecord.setProOrderDetailId(productOrderDetail.getId());
consumptionRecord.setDiaId(consumptionRequest.getDiaId());
if (SaveConsumptionRecord(consumptionRecord)) {
return true;
} else {
logger.info("医院id:【{}】预扣费执行失败!", consumptionRequest.getHospitalId());
}
} else {
logger.info("医院id:【{}】套餐获取失败!", consumptionRequest.getHospitalId());
}
return false;
}
/**
* 参数验证
*/
private Boolean VateParams(ConsumptionRequest consumptionRequest) {
logger.info("收到扣费请求的参数:"+consumptionRequest.toString());
if (consumptionRequest != null) {
//从请求头获取医院和科室id
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(doctorId)
&& StringUtils.isNotBlank(diaId)) {
return true;
} else {
logger.info("扣费请求参数不完整!");
}
} else {
logger.info("扣费请求参数为空!");
}
return false;
}
/**
* 检查余额够不够
*
* @param consumptionCount 要扣的数量
* @return
*/
private Map VateUserNowProduct(int consumptionCount, Long hospitalId, Long departmentId) {
Map returnMap = new HashMap<>();
ResultBody biUserPro = productOrderDetailService.biUserNowProduct(hospitalId, departmentId);
if (biUserPro.getCode() == 0) {
if (StringUtils.isNotBlank(biUserPro.getData().toString())) {
//余额
int userAICount = Integer.parseInt(biUserPro.getData().toString());
if (userAICount >= consumptionCount) {
returnMap.put("vateRe", true);
returnMap.put("vateMsg", "余额足够!");
} else {
returnMap.put("vateRe", false);
returnMap.put("vateMsg", "余额不足!");
logger.info("医院id:【{}】余额不足!", hospitalId);
}
} else {
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 returnMap;
}
/**
* 获取要使用的套餐实体
*
* @param consumCount 要使用的数量
* @return
*/
private ProductOrderDetail deductionDepartmentProduct(int consumCount, Long hospitalId, Long departmentId) {
UserProductDetail userProductDetail = productOrderDetailService.getUserProductDetail(hospitalId, departmentId);
//合并集合
userProductDetail.getProductOrderJoinDetailListShare()
.addAll(userProductDetail.getProductOrderJoinDetailsListDep());
List productOrderJoinDetailList = userProductDetail.getProductOrderJoinDetailListShare();
if (productOrderJoinDetailList.size() > 0) {
//合并后按id排序并筛除已用完的套餐
List productOrderJoinDetailsNewList = productOrderJoinDetailList
.stream().filter(f -> f.getAilightCount() >= consumCount).collect(Collectors.toList());
//要使用的套餐信息
Long firstId=productOrderJoinDetailsNewList.get(0).getId();
logger.info("扣费要使用的套餐ID是id:【{}】", firstId);
ProductOrderDetail productOrderDetail = productOrderDetailService.getById(firstId);
return productOrderDetail;
}
return null;
}
/**
* 写/更新记录数据
*
* @param consumptionRecord
* @return
*/
private Boolean SaveConsumptionRecord(ConsumptionRecord consumptionRecord) {
if (consumptionRecord != null) {
if (consumptionRecord.getCreateTime() == null) {
consumptionRecord.setCreateTime(new Date());
}
return this.saveOrUpdate(consumptionRecord);
} else {
logger.info("扣费数据写入参数为空!");
}
return false;
}
/**
* 检查该业务是否存在该业务类型
*
* @param consumptionRecordList 该业务下的扣费列表
* @param recordType 记录类型编码 参考ConsumptionConstant里面
* @return
*/
private boolean isBeforeDeduction(List consumptionRecordList, int recordType) {
if (consumptionRecordList != null) {
if (consumptionRecordList.size() > 0) {
//过滤预扣费的记录
return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType && f.getProOrderDetailId() > 0).collect(Collectors.toList()).size() == 1;
}
}
return false;
}
/**
* 获取一个业务关联的扣费记录
* @param businessId 光片的名称/编号
* @return
*/
private List GetBusinessConsumptionList(String businessId) {
if (StringUtils.isNotBlank(businessId)) {
Map params = new HashMap<>();
params.put("businessId", businessId);
List consumptionRecordList = this.findAllList(params);
return consumptionRecordList;
}
return null;
}
/**
* 获取一个扣费记录
*
* @param recordId 扣费记录id
* @return
*/
private ConsumptionRecord GetBusinessConsumptionList(Long recordId) {
if (recordId > 0) {
return baseMapper.selectById(recordId);
}
return null;
}
/**
* 发消息到消息队列
*
* @return
*/
//@RabbitListener(queues = "BoneAgeEvaluationData")
private void MessageToBI(ConsumptionRequest consumptionRequest) {
//发消息到队列
String context = "{\"hospitalId\":\"" + consumptionRequest.getHospitalId() +
"\",\"departmentId\":\"" + consumptionRequest.getDepartmentId() +
"\",\"doctorId\":\"" + consumptionRequest.getDoctorId() +
"\",\"date\":\"" + DateUtils.formatDate(new Date(), "yyyy-MM-dd") + "\"}";
rabbitTemplate.convertAndSend(ConsumptionConstant.EXCHANGE_DATA, ConsumptionConstant.ROUTINGKEY_DATA + 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;
}
}