| | |
| | | |
| | | 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.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 org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | @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; |
| | | |
| | | /** |
| | | * 列表 |
| | | * |
| | |
| | | //默认的业务返回码 |
| | | int bcode = -1; |
| | | //记录类型 |
| | | int recordType=ConsumptionConstant.BEFORE_DEDUCTION; |
| | | int recordType = ConsumptionConstant.BEFORE_DEDUCTION; |
| | | //业务执行结果 |
| | | boolean isSuccess = true; |
| | | //业务执行结果信息 |
| | | String reMsg = ""; |
| | | if (VateParams(consumptionRequest)) { |
| | | //先获取这个业务关联的扣费记录 |
| | | List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); |
| | | //1.先检查是否已经扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) { |
| | | //2.没有扣费,检查是否已经预扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) { |
| | | //3.没有预扣,查询余额 |
| | | if (VateUserNowProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId())) { |
| | | //4.余额充足 获取要扣的套餐 写预扣费记录 |
| | | if (beforeConsumption(consumptionRequest)) { |
| | | //预扣费成功 |
| | | reMsg = "预扣费成功!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION; |
| | | } else { |
| | | //预扣费执行失败 |
| | | isSuccess = false; |
| | | reMsg = "预扣费执行失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; |
| | | } |
| | | } else { |
| | | //余额不足 |
| | | isSuccess = false; |
| | | reMsg = "余额不足或获取失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_FAIL; |
| | | } |
| | | } else { |
| | | //已经预扣费 |
| | | reMsg = "该业务已经预扣费!"; |
| | | //是否开通单次支付 |
| | | 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,recordType, reMsg, isSuccess); |
| | | return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess); |
| | | } |
| | | |
| | | /** |
| | |
| | | //默认的业务返回码 |
| | | int bcode = -1; |
| | | //记录类型 |
| | | int recordType=ConsumptionConstant.DEDUCTION; |
| | | int recordType = ConsumptionConstant.DEDUCTION; |
| | | //业务执行结果 |
| | | boolean isSuccess = true; |
| | | //业务执行结果信息 |
| | | String reMsg = ""; |
| | | if (VateParams(consumptionRequest)) { |
| | | //先获取这个业务关联的扣费记录 |
| | | List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); |
| | | Long hospitalId = consumptionRequest.getHospitalId(); |
| | | |
| | | //1.先检查是否已经扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) { |
| | | //2.没有扣费,检查是否已经预扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) { |
| | | //2.1.没有预扣,查询余额 |
| | | if (VateUserNowProduct(consumptionRequest.getConsumptionCount(),hospitalId,consumptionRequest.getDepartmentId())) { |
| | | //2.2.余额充足 获取要扣的套餐 写预扣费记录 |
| | | if (beforeConsumption(consumptionRequest)) { |
| | | //预扣费成功 |
| | | logger.info("医院id:【{}】AI返回结果应该不走预扣,目前确已经预扣!", hospitalId); |
| | | } else { |
| | | //预扣费执行失败 |
| | | isSuccess = false; |
| | | reMsg = "预扣费执行失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; |
| | | return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess); |
| | | } |
| | | } else { |
| | | //余额不足 |
| | | isSuccess = false; |
| | | reMsg = "余额不足或获取失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_FAIL; |
| | | return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess); |
| | | } |
| | | } |
| | | if (consumptionBusiess(consumptionRequest, consumptionRecordList)) { |
| | | reMsg = "该业务扣费成功!"; |
| | | //是否开通单次支付 |
| | | if (departmentIsPay(consumptionRequest)) { |
| | | //是否支付成功 |
| | | if (departmentPayStatus(consumptionRequest)) { |
| | | //预扣费成功 |
| | | reMsg = "单次支付模拟扣费成功!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION; |
| | | //消息队列通知 |
| | | MessageToBI(consumptionRequest); |
| | | } else { |
| | | isSuccess = false; |
| | | reMsg = "该业务扣费失败!"; |
| | | reMsg = "单次支付未成功,不允许扣费!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_FAIL; |
| | | 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,recordType, reMsg, isSuccess); |
| | | return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess); |
| | | } |
| | | |
| | | /** |
| | |
| | | //业务执行结果信息 |
| | | String reMsg = ""; |
| | | if (VateParams(consumptionRequest)) { |
| | | //先获取这个业务关联的扣费记录 |
| | | List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); |
| | | //1.先检查是否已经扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) { |
| | | //2.没有扣费,检查是否已经预扣费 |
| | | if (isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) { |
| | | //2.1.有预扣费 |
| | | ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION&&f.getProOrderDetailId()>0).collect(Collectors.toList()).get(0); |
| | | //把占用的套餐id还回去 |
| | | Long tempProOrderDetailId=consumptionRecord.getProOrderDetailId(); |
| | | consumptionRecord.setProOrderDetailId(0L); |
| | | consumptionRecord.setUpdateTime(new Date()); |
| | | if (SaveConsumptionRecord(consumptionRecord)) |
| | | { |
| | | //退预扣记录 |
| | | ConsumptionRecord consumptionRecordNew = new ConsumptionRecord(); |
| | | consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION); |
| | | consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId()); |
| | | consumptionRecordNew.setConsumptionCount(0-consumptionRequest.getConsumptionCount()); |
| | | consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_BEFORE_DEDUCTION); |
| | | consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId); |
| | | consumptionRecordNew.setLastRecordId(consumptionRecord.getId()); |
| | | if (SaveConsumptionRecord(consumptionRecordNew)) |
| | | { |
| | | isSuccess=true; |
| | | reMsg = "有预扣,写退还预扣成功!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION; |
| | | } |
| | | else |
| | | { |
| | | reMsg = "写退还预扣失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; |
| | | } |
| | | } |
| | | else{ |
| | | reMsg = "更新预扣费记录失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | reMsg = "没有相关预扣记录!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; |
| | | //是否开通单次支付 |
| | | if (departmentIsPay(consumptionRequest)) { |
| | | //是否支付成功 |
| | | if (departmentPayStatus(consumptionRequest)) { |
| | | //预扣费成功 |
| | | reMsg = "单次支付模拟退还扣费成功!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION; |
| | | isSuccess=true; |
| | | } else { |
| | | reMsg = "单次支付未成功,不允许退扣费!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_FAIL; |
| | | } |
| | | } else { |
| | | recordType=ConsumptionConstant.RETURN_DEDUCTION; |
| | | //3.有扣费记录 这种情况的流程,实际业务中不会出现,但理论上应该这样处理 |
| | | //3.1 退还账户 |
| | | //获取预扣的时候占住的套餐id |
| | | ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.DEDUCTION).collect(Collectors.toList()).get(0); |
| | | if (consumptionRecord != null) { |
| | | ProductOrderDetail productOrderDetail = productOrderDetailService.getById(consumptionRecord.getProOrderDetailId()); |
| | | if (productOrderDetail != null) { |
| | | //退还金额 |
| | | productOrderDetail.setAilightCount(productOrderDetail.getAilightCount()+consumptionRecord.getConsumptionCount()); |
| | | productOrderDetail.setUpdateTime(new Date()); |
| | | //退费 |
| | | boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail); |
| | | if (consumptionRe) { |
| | | //更新扣费记录 还回占用套餐 |
| | | consumptionRecord.setProOrderDetailId(0L); |
| | | consumptionRecord.setUpdateTime(new Date()); |
| | | if (SaveConsumptionRecord(consumptionRecord)) |
| | | { |
| | | //退费成功 |
| | | //3.2 写退费记录 |
| | | ConsumptionRecord consumptionRecordNew = new ConsumptionRecord(); |
| | | consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION); |
| | | consumptionRecordNew.setBusinessId(consumptionRecord.getBusinessId()); |
| | | consumptionRecordNew.setConsumptionCount(0-consumptionRecord.getConsumptionCount()); |
| | | consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_DEDUCTION); |
| | | consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId()); |
| | | consumptionRecordNew.setLastRecordId(consumptionRecord.getId()); |
| | | if (SaveConsumptionRecord(consumptionRecordNew)) { |
| | | //写退费记录成功 |
| | | isSuccess=true; |
| | | reMsg = "退还扣费成功!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION; |
| | | } |
| | | else |
| | | { |
| | | reMsg = "退还扣费失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | //先获取这个业务关联的扣费记录 |
| | | List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); |
| | | //1.先检查是否已经扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) { |
| | | //2.没有扣费,检查是否已经预扣费 |
| | | if (isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) { |
| | | //2.1.有预扣费 |
| | | ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION && f.getProOrderDetailId() > 0).collect(Collectors.toList()).get(0); |
| | | //把占用的套餐id还回去 |
| | | Long tempProOrderDetailId = consumptionRecord.getProOrderDetailId(); |
| | | consumptionRecord.setProOrderDetailId(0L); |
| | | consumptionRecord.setUpdateTime(new Date()); |
| | | if (SaveConsumptionRecord(consumptionRecord)) { |
| | | //退预扣记录 |
| | | ConsumptionRecord consumptionRecordNew = new ConsumptionRecord(); |
| | | consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION); |
| | | consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId()); |
| | | consumptionRecordNew.setConsumptionCount(0 - consumptionRequest.getConsumptionCount()); |
| | | consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_BEFORE_DEDUCTION); |
| | | consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId); |
| | | consumptionRecordNew.setLastRecordId(consumptionRecord.getId()); |
| | | consumptionRecordNew.setDiaId(consumptionRequest.getDiaId()); |
| | | if (SaveConsumptionRecord(consumptionRecordNew)) { |
| | | isSuccess = true; |
| | | reMsg = "有预扣,写退还预扣成功!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION; |
| | | } else { |
| | | reMsg = "写退还预扣失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; |
| | | } |
| | | else |
| | | { |
| | | //更新扣费失败 |
| | | reMsg = "更新扣费失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //退费失败 |
| | | reMsg = "退还扣费失败!"; |
| | | } else { |
| | | reMsg = "更新预扣费记录失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } else { |
| | | reMsg = "没有相关预扣记录!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; |
| | | } |
| | | else |
| | | { |
| | | reMsg = "无相关套餐数据!"; |
| | | } else { |
| | | recordType = ConsumptionConstant.RETURN_DEDUCTION; |
| | | //3.有扣费记录 这种情况的流程,实际业务中不会出现,但理论上应该这样处理 |
| | | //3.1 退还账户 |
| | | //获取预扣的时候占住的套餐id |
| | | ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.DEDUCTION).collect(Collectors.toList()).get(0); |
| | | if (consumptionRecord != null) { |
| | | ProductOrderDetail productOrderDetail = productOrderDetailService.getById(consumptionRecord.getProOrderDetailId()); |
| | | if (productOrderDetail != null) { |
| | | //退还金额 |
| | | productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() + consumptionRecord.getConsumptionCount()); |
| | | productOrderDetail.setUpdateTime(new Date()); |
| | | //退费 |
| | | boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail); |
| | | if (consumptionRe) { |
| | | //更新扣费记录 还回占用套餐 |
| | | consumptionRecord.setProOrderDetailId(0L); |
| | | consumptionRecord.setUpdateTime(new Date()); |
| | | if (SaveConsumptionRecord(consumptionRecord)) { |
| | | //退费成功 |
| | | //3.2 写退费记录 |
| | | ConsumptionRecord consumptionRecordNew = new ConsumptionRecord(); |
| | | consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION); |
| | | consumptionRecordNew.setBusinessId(consumptionRecord.getBusinessId()); |
| | | consumptionRecordNew.setConsumptionCount(0 - consumptionRecord.getConsumptionCount()); |
| | | consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_DEDUCTION); |
| | | consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId()); |
| | | consumptionRecordNew.setLastRecordId(consumptionRecord.getId()); |
| | | consumptionRecordNew.setDiaId(consumptionRequest.getDiaId()); |
| | | if (SaveConsumptionRecord(consumptionRecordNew)) { |
| | | //写退费记录成功 |
| | | isSuccess = true; |
| | | reMsg = "退还扣费成功!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION; |
| | | } else { |
| | | reMsg = "退还扣费失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } else { |
| | | //更新扣费失败 |
| | | reMsg = "更新扣费失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } else { |
| | | //退费失败 |
| | | reMsg = "退还扣费失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } else { |
| | | reMsg = "无相关套餐数据!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } else { |
| | | reMsg = "无相关扣费数据!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | reMsg = "无相关扣费数据!"; |
| | | bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; |
| | | } |
| | | } |
| | | } else { |
| | | reMsg = "传入参数有误!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; |
| | | } |
| | | return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess); |
| | | return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess); |
| | | } |
| | | |
| | | /** |
| | | * 发起人工读片-调用 |
| | | * |
| | | * @param consumptionRequest 请求的数据实体 |
| | | * @return |
| | | */ |
| | |
| | | //业务执行结果信息 |
| | | String reMsg = ""; |
| | | if (VateParams(consumptionRequest)) { |
| | | //先获取这个业务关联的扣费记录 |
| | | List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); |
| | | //1.先检查是否已经扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) { |
| | | //2.没有扣费,检查是否已经预扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) { |
| | | //3.没有预扣,查询余额 |
| | | if (VateUserNowProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId())) { |
| | | //4.余额充足 获取要扣的套餐 写预扣费记录 |
| | | if (!beforeConsumption(consumptionRequest)) { |
| | | //预扣费执行失败 |
| | | reMsg = "预扣费执行失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; |
| | | return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess); |
| | | } |
| | | else |
| | | { |
| | | //发起了一个新的预扣,需要更新扣费业务数据列表 |
| | | consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); |
| | | } |
| | | } else { |
| | | //余额不足 |
| | | reMsg = "余额不足或获取失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_FAIL; |
| | | return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess); |
| | | } |
| | | //是否开通单次支付 |
| | | 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); |
| | | if (isSuccess) { |
| | | } |
| | | else { |
| | | //先获取这个业务关联的扣费记录 |
| | | List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); |
| | | //1.先检查是否已经扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) { |
| | | //2.没有扣费,检查是否已经预扣费 |
| | | if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) { |
| | | //3.没有预扣,查询余额 |
| | | Map<String, Object> vateMap = VateUserNowProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId()); |
| | | if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) { |
| | | //4.余额充足 获取要扣的套餐 写预扣费记录 |
| | | if (!beforeConsumption(consumptionRequest)) { |
| | | //预扣费执行失败 |
| | | reMsg = "预扣费执行失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; |
| | | return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess); |
| | | } else { |
| | | //发起了一个新的预扣,需要更新扣费业务数据列表 |
| | | consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); |
| | | } |
| | | } else { |
| | | //余额不足 |
| | | reMsg = vateMap.get("vateMsg").toString(); |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_FAIL; |
| | | return ResultReturn(consumptionRequest, bcode, ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess); |
| | | } |
| | | } |
| | | //扣费业务 |
| | | isSuccess = consumptionBusiess(consumptionRequest, consumptionRecordList); |
| | | if (isSuccess) { |
| | | reMsg = "该业务已经扣费!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION; |
| | | } else { |
| | | reMsg = "该业务扣费失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; |
| | | } |
| | | } else { |
| | | isSuccess = true; |
| | | //已经扣费 |
| | | reMsg = "该业务已经扣费!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION; |
| | | } |
| | | else |
| | | { |
| | | reMsg = "该业务扣费失败!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; |
| | | } |
| | | } else { |
| | | isSuccess = true; |
| | | //已经扣费 |
| | | reMsg = "该业务已经扣费!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION; |
| | | } |
| | | } else { |
| | | reMsg = "传入参数有误!"; |
| | | bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; |
| | | } |
| | | return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess); |
| | | return ResultReturn(consumptionRequest, bcode, recordType, reMsg, isSuccess); |
| | | } |
| | | |
| | | /** |
| | | * 扣费业务(扣费 更新预扣 写扣费记录) |
| | | * |
| | | * @param consumptionRequest 请求参数 |
| | | * @param consumptionRecordList 扣费业务数据 |
| | | * @return |
| | |
| | | productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount()); |
| | | } else { |
| | | //要是被别人已经用了,就要重新找套餐 |
| | | productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId()); |
| | | productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId()); |
| | | if (productOrderDetail == null) { |
| | | logger.info("业务编号:【{}】无可用套餐!", consumptionRequest.getBusinessId()); |
| | | return false; |
| | |
| | | consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION); |
| | | consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId()); |
| | | consumptionRecordNew.setLastRecordId(consumptionRecord.getId()); |
| | | consumptionRecordNew.setDiaId(consumptionRequest.getDiaId()); |
| | | consumptionRecordNew.setCreateTime(new Date()); |
| | | |
| | | if (SaveConsumptionRecord(consumptionRecordNew)) { |
| | |
| | | * @param isSuccess 业务执行是否成功 |
| | | * @return |
| | | */ |
| | | private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode,int recordType, String reMsg, boolean isSuccess) { |
| | | private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode, int recordType, String reMsg, boolean isSuccess) { |
| | | //返回的数据实体 |
| | | ConsumptionVo consumptionVo = new ConsumptionVo(); |
| | | consumptionVo.setConsumptionCount(consumptionRequest.getConsumptionCount()); |
| | | 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 { |
| | |
| | | |
| | | /** |
| | | * 预扣费业务 |
| | | * |
| | | * @param consumptionRequest 请求参数 |
| | | * @return |
| | | */ |
| | | private Boolean beforeConsumption(ConsumptionRequest consumptionRequest) { |
| | | ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId()); |
| | | ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(), consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId()); |
| | | if (productOrderDetail != null) { |
| | | ConsumptionRecord consumptionRecord = new ConsumptionRecord(); |
| | | consumptionRecord.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION); |
| | |
| | | consumptionRecord.setConsumptionCount(consumptionRequest.getConsumptionCount()); |
| | | consumptionRecord.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION); |
| | | consumptionRecord.setProOrderDetailId(productOrderDetail.getId()); |
| | | consumptionRecord.setDiaId(consumptionRequest.getDiaId()); |
| | | if (SaveConsumptionRecord(consumptionRecord)) { |
| | | return true; |
| | | } else { |
| | |
| | | * 参数验证 |
| | | */ |
| | | 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(doctorId) |
| | | && StringUtils.isNotBlank(diaId)) { |
| | | return true; |
| | | } else { |
| | | logger.info("扣费请求参数不完整!"); |
| | |
| | | |
| | | /** |
| | | * 检查余额够不够 |
| | | * |
| | | * @param consumptionCount 要扣的数量 |
| | | * @return |
| | | */ |
| | | private Boolean VateUserNowProduct(int consumptionCount,Long hospitalId,Long departmentId) { |
| | | 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 departmentId) { |
| | | private ProductOrderDetail deductionDepartmentProduct(int consumCount, Long hospitalId, Long departmentId) { |
| | | UserProductDetail userProductDetail = productOrderDetailService.getUserProductDetail(hospitalId, departmentId); |
| | | //合并集合 |
| | | userProductDetail.getProductOrderJoinDetailListShare().addAll(userProductDetail.getProductOrderJoinDetailsListDep()); |
| | |
| | | if (consumptionRecordList != null) { |
| | | if (consumptionRecordList.size() > 0) { |
| | | //过滤预扣费的记录 |
| | | return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType&&f.getProOrderDetailId()>0).collect(Collectors.toList()).size() == 1; |
| | | return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType && f.getProOrderDetailId() > 0).collect(Collectors.toList()).size() == 1; |
| | | } |
| | | } |
| | | return false; |
| | |
| | | |
| | | /** |
| | | * 获取一个业务关联的扣费记录 |
| | | * |
| | | * @param businessId 光片的名称/编号 |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 发消息到消息队列 |
| | | * |
| | | * @return |
| | | */ |
| | | //@RabbitListener(queues = "BoneAgeEvaluationData") |
| | | private void MessageToBI(ConsumptionRequest consumptionRequest) |
| | | { |
| | | private void MessageToBI(ConsumptionRequest consumptionRequest) { |
| | | //发消息到队列 |
| | | String context = "{\"hospitalId\":\"" + consumptionRequest.getHospitalId() + |
| | | "\",\"departmentId\":\"" + consumptionRequest.getDepartmentId() + |
| | | "\",\"doctorId\":\"" + consumptionRequest.getDoctorId() + |
| | | "\",\"date\":\"" + DateUtils.formatDate(new Date(),"yyyy-MM-dd")+"\"}"; |
| | | rabbitTemplate.convertAndSend(ConsumptionConstant.EXCHANGE_DATA, ConsumptionConstant.ROUTINGKEY_DATA+envName, context); |
| | | "\",\"date\":\"" + DateUtils.formatDate(new Date(), "yyyy-MM-dd") + "\"}"; |
| | | rabbitTemplate.convertAndSend(ConsumptionConstant.EXCHANGE_DATA, ConsumptionConstant.ROUTINGKEY_DATA + envName, context); |
| | | |
| | | log.error("骨龄评价扣费消息已发送:"+context); |
| | | log.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; |
| | | } |
| | | } |