kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java
@@ -53,6 +53,10 @@ */ private String businessId; /** * 调用方诊断id */ private String diaId; /** * 记录类型 * 1:预扣费 * 2:退预扣费(需要关联预扣费编号) kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/PayManager.java
New file @@ -0,0 +1,77 @@ package com.kidgrow.oprationcenter.model; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.kidgrow.common.model.SuperModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> * * @version 1.0 * @Description: <br> * @Project: 运营中心<br> * @CreateDate: Created in 2020-09-21 14:16:18 <br> * @Author: <a href="411269194@kidgrow.com">houruijun</a> */ @Data @EqualsAndHashCode(callSuper = false) @NoArgsConstructor @AllArgsConstructor @TableName("pay_manager") public class PayManager extends SuperModel { private static final long serialVersionUID = 1L; /** * 医院标识id */ @NotNull(message = "医院标识id不能为空") @JsonSerialize(using = ToStringSerializer.class) private Long hospitalId; /** * 医院名称 */ @NotEmpty(message = "医院名称不能为空") private String hospitalName; /** * 科室ID */ @NotNull(message = "科室ID不能为空") @JsonSerialize(using = ToStringSerializer.class) private Long departmentId; /** * 科室名称 */ @NotEmpty(message = "科室名称不能为空") private String departmentName; /** * 单次支付金额 (单位为分) */ @NotNull(message = "单次支付金额不能为空") private Integer payPrice; /** * 支付给喜高的费用 (单位为分) */ @NotNull(message = "单次支付金额不能为空") private Integer payKidgrow; /** * 支付给客户的费用(单位为分) */ @NotNull(message = "单次支付金额不能为空") private Integer payCustom; /** * 是否删除,1删除,0未删除 */ private Boolean isDel; /** * 状态,1启用,0停用 */ private Boolean enabled; } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java
@@ -1,6 +1,8 @@ package com.kidgrow.oprationcenter.vo; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -22,14 +24,17 @@ /** * 医院ID */ @JsonSerialize(using = ToStringSerializer.class) private Long hospitalId; /** * 科室ID */ @JsonSerialize(using = ToStringSerializer.class) private Long departmentId; /** * 医生ID */ @JsonSerialize(using = ToStringSerializer.class) private Long doctorId; /** * 调用方业务编号,光片编号 @@ -39,4 +44,8 @@ * 实际变动数量 */ private int consumptionCount; /** * 诊断id */ private String diaId; } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/PayManagerMapper.java
New file @@ -0,0 +1,34 @@ package com.kidgrow.oprationcenter.mapper; import com.kidgrow.oprationcenter.model.PayManager; import com.kidgrow.db.mapper.SuperMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> * @Description: <br> * @Project: 运营中心<br> * @CreateDate: Created in 2020-09-21 14:16:18 <br> * @Author: <a href="411269194@kidgrow.com">houruijun</a> * @version 1.0 */ public interface PayManagerMapper extends SuperMapper<PayManager> { /** * 分页查询列表 * @param page * @param params * @return */ List<PayManager> findList(Page<PayManager> page, @Param("p") Map<String, Object> params); /** * 根据PayManager对象当做查询条件进行查询 * @param * @return PayManager对象 */ PayManager findByObject(@Param("p") PayManager payManager); } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IPayManagerService.java
New file @@ -0,0 +1,45 @@ package com.kidgrow.oprationcenter.service; import com.kidgrow.common.model.PageResult; import com.kidgrow.common.model.SysUser; import com.kidgrow.common.service.ISuperService; import com.kidgrow.oprationcenter.model.PayManager; import com.kidgrow.oprationcenter.model.ProductOrderDetail; import java.util.Map; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> * @Description: <br> * @Project: 运营中心<br> * @CreateDate: Created in 2020-09-21 14:16:18 <br> * @Author: <a href="411269194@kidgrow.com">houruijun</a> * @version 1.0 */ public interface IPayManagerService extends ISuperService<PayManager> { /** * 列表 * @param params * @return */ PageResult<PayManager> findList(Map<String, Object> params); /** * 根据PayManager对象当做查询条件进行查询 * @param payManager * @return PayManager对象 */ PayManager findByObject(PayManager payManager); /** * 根据PayManager对象当做查询条件进行查询 * @param hospitalId * @param departmentId * @return PayManager对象 */ PayManager findByObject(Long hospitalId,Long departmentId); ProductOrderDetail getProductDetail(Long hospitalId, Long departmentId); Boolean saveproductOrder(PayManager payManager, SysUser sysUser); } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISaasClientPayService.java
@@ -33,6 +33,7 @@ * @return SaasClientPay对象 */ SaasClientPay findByObject(SaasClientPay saasClientPay); SaasClientPay findModelByObject(Long hospitalId,Long departmentId,String diaId); /** * 批量结算 * @param list kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java
@@ -2,6 +2,7 @@ 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; @@ -9,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; @@ -26,7 +31,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; @@ -48,13 +52,16 @@ @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; /** * 列表 * @@ -102,54 +109,67 @@ //默认的业务返回码 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.没有预扣,查询余额 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 = "该业务已经预扣费!"; //是否开通单次支付 if (departmentIsPay(consumptionRequest)) { //是否支付成功 if (departmentPayStatus(consumptionRequest)) { //预扣费成功 reMsg = "单次支付模拟预扣费成功!"; bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION; } else { reMsg = "单次支付未成功,不允许预扣费!"; bcode = ConsumptionConstant.BUSINESS_CODE_FAIL; } } 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); } /** @@ -164,61 +184,76 @@ //默认的业务返回码 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.没有预扣,查询余额 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 = "该业务扣费成功!"; //是否开通单次支付 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; } } 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); } /** @@ -239,126 +274,124 @@ //业务执行结果信息 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; } 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 */ @@ -374,60 +407,74 @@ //业务执行结果信息 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.没有预扣,查询余额 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); } //是否开通单次支付 if (departmentIsPay(consumptionRequest)) { //是否支付成功 if (departmentPayStatus(consumptionRequest)) { //预扣费成功 reMsg = "单次支付模拟已经扣费成功!"; bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION; //消息队列通知 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 @@ -443,7 +490,7 @@ 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; @@ -464,6 +511,7 @@ consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION); consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId()); consumptionRecordNew.setLastRecordId(consumptionRecord.getId()); consumptionRecordNew.setDiaId(consumptionRequest.getDiaId()); consumptionRecordNew.setCreateTime(new Date()); if (SaveConsumptionRecord(consumptionRecordNew)) { @@ -498,7 +546,7 @@ * @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()); @@ -514,11 +562,12 @@ /** * 预扣费业务 * * @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); @@ -526,6 +575,7 @@ consumptionRecord.setConsumptionCount(consumptionRequest.getConsumptionCount()); consumptionRecord.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION); consumptionRecord.setProOrderDetailId(productOrderDetail.getId()); consumptionRecord.setDiaId(consumptionRequest.getDiaId()); if (SaveConsumptionRecord(consumptionRecord)) { return true; } else { @@ -546,11 +596,13 @@ String hosId = consumptionRequest.getHospitalId().toString(); String depId = consumptionRequest.getDepartmentId().toString(); String doctorId = consumptionRequest.getDoctorId().toString(); String diaId = consumptionRequest.getDiaId().toString(); 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("扣费请求参数不完整!"); @@ -563,32 +615,33 @@ /** * 检查余额够不够 * * @param consumptionCount 要扣的数量 * @return */ private Map<String,Object> VateUserNowProduct(int consumptionCount,Long hospitalId,Long departmentId) { Map<String,Object> returnMap=new HashMap<>(); 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) { returnMap.put("vateRe",true); returnMap.put("vateMsg","余额足够!"); returnMap.put("vateRe", true); returnMap.put("vateMsg", "余额足够!"); } else { returnMap.put("vateRe",false); returnMap.put("vateMsg","余额不足!"); returnMap.put("vateRe", false); returnMap.put("vateMsg", "余额不足!"); logger.info("医院id:【{}】余额不足!", hospitalId); } } else { returnMap.put("vateRe",false); returnMap.put("vateMsg","余额获取异常,data为空!"); returnMap.put("vateRe", false); returnMap.put("vateMsg", "余额获取异常,data为空!"); logger.error("医院id:【{}】余额获取异常!", hospitalId); } }else { returnMap.put("vateRe",false); returnMap.put("vateMsg","余额获取异常,Code非0!"); } else { returnMap.put("vateRe", false); returnMap.put("vateMsg", "余额获取异常,Code非0!"); logger.info("医院id:【{}】余额获取异常,返回非0!", hospitalId); } return returnMap; @@ -596,10 +649,11 @@ /** * 获取要使用的套餐实体 * @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()); @@ -643,7 +697,7 @@ 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; @@ -651,7 +705,6 @@ /** * 获取一个业务关联的扣费记录 * * @param businessId 光片的名称/编号 * @return */ @@ -680,18 +733,51 @@ /** * 发消息到消息队列 * * @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.error("骨龄评价扣费消息已发送:" + context); } /** * 查看当前科室是否开通了单次支付 * * @param consumptionRequest * @return */ private Boolean departmentIsPay(ConsumptionRequest consumptionRequest) { PayManager payManager = payManagerService.findByObject(consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId()); if (payManager == null) { return false; } else { return payManager.getId() > 0; } } /** * 查看当前科室当前诊断id的支付状态是否成功 * * @param consumptionRequest * @return */ private Boolean departmentPayStatus(ConsumptionRequest consumptionRequest) { SaasClientPay saasClientPay = saasClientPayService.findModelByObject(consumptionRequest.getHospitalId(), consumptionRequest.getDepartmentId(), consumptionRequest.getDiaId()); if (saasClientPay == null) { return false; } else { if (saasClientPay.getPayStatus().equals(PayConstants.ORDER_PAY_SUCEESS)) { return true; } } return false; } } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/PayManagerServiceImpl.java
New file @@ -0,0 +1,128 @@ package com.kidgrow.oprationcenter.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.kidgrow.common.constant.CommonConstant; import com.kidgrow.common.model.PageResult; import com.kidgrow.common.model.SysUser; import com.kidgrow.common.service.impl.SuperServiceImpl; import com.kidgrow.oprationcenter.mapper.PayManagerMapper; import com.kidgrow.oprationcenter.model.PayManager; import com.kidgrow.oprationcenter.model.ProductOrder; import com.kidgrow.oprationcenter.model.ProductOrderDetail; import com.kidgrow.oprationcenter.service.IPayManagerService; import com.kidgrow.oprationcenter.service.IProductOrderDetailService; import com.kidgrow.oprationcenter.service.IProductOrderService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> * @Description: <br> * @Project: 运营中心<br> * @CreateDate: Created in 2020-09-21 14:16:18 <br> * @Author: <a href="411269194@kidgrow.com">houruijun</a> * @version 1.0 */ @Slf4j @Service public class PayManagerServiceImpl extends SuperServiceImpl<PayManagerMapper, PayManager> implements IPayManagerService { @Autowired private IProductOrderService productOrderService; @Autowired private IProductOrderDetailService productOrderDetailService; /** * 列表 * @param params * @return */ @Override public PageResult<PayManager> findList(Map<String, Object> params){ Page<PayManager> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit")); List<PayManager> list = baseMapper.findList(page, params); return PageResult.<PayManager>builder().data(list).code(0).count(page.getTotal()).build(); } /** * 根据PayManager对象当做查询条件进行查询 * @param payManager * @return PayManager */ @Override public PayManager findByObject(PayManager payManager){ return baseMapper.findByObject(payManager); } /** * 查看科室的单次支付功能 如果返回空 则视为未开通 * @param hospitalId * @param departmentId * @return PayManager */ @Override public PayManager findByObject(Long hospitalId,Long departmentId){ PayManager payManager = new PayManager(); ProductOrderDetail productOrderDetail= getProductDetail(hospitalId,departmentId); if (productOrderDetail != null) { payManager.setDepartmentId(departmentId); payManager.setHospitalId(hospitalId); payManager.setIsDel(false); payManager.setEnabled(true); PayManager payManagerModel = baseMapper.findByObject(payManager); return payManagerModel; } else { return payManager; } } /** * 获取科室下的一个业务的套餐数据 * @param hospitalId * @param departmentId * @return */ @Override public ProductOrderDetail getProductDetail(Long hospitalId, Long departmentId) { ProductOrder productOrder=new ProductOrder(); productOrder.setHospitalId(hospitalId); productOrder.setDepartmentId(departmentId); productOrder.setEnabled(true); productOrder.setIsDel(false); ProductOrder productOrderModel=productOrderService.findByObject(productOrder); if (productOrderModel != null) { ProductOrderDetail productOrderDetail =new ProductOrderDetail(); productOrderDetail.setProId(CommonConstant.PAY_USER_PRODUCT_ID); productOrderDetail.setOrderId(productOrderModel.getId()); productOrderDetail.setEnabled(true); productOrderDetail.setIsDel(false); ProductOrderDetail modelDetail=productOrderDetailService.findByObject(productOrderDetail); return modelDetail; } return null; } /** * 保存单次支付功能数据 * @param payManager * @param sysUser * @return */ @Override public Boolean saveproductOrder(PayManager payManager, SysUser sysUser) { Map<String, Object> params = new HashMap<>(); params.put("hospitalId", payManager.getHospitalId()); params.put("departmentId", payManager.getDepartmentId()); params.put("hospitalName", payManager.getHospitalName()); params.put("departmentName", payManager.getDepartmentName()); params.put("proId", CommonConstant.PAY_USER_PRODUCT_ID); boolean isResult = productOrderService.saveProductDetail(params, sysUser); return isResult; } } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderServiceImpl.java
@@ -107,7 +107,7 @@ public boolean saveProductDetail(Map<String,Object> params,SysUser sysUser) { //指定套餐数据 SysProduct sysProduct=sysProductService.getById(CommonConstant.REG_USER_PRODUCT_ID); SysProduct sysProduct=sysProductService.getById(Long.valueOf(params.get("proId").toString())); if (sysProduct != null) { //订单合同数据 ProductOrder productOrder=new ProductOrder(); kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SaasClientPayServiceImpl.java
@@ -98,6 +98,22 @@ return baseMapper.findByObject(saasClientPay); } /** * 查看一个科室的某个诊断的支付状态 * @param hospitalId * @param departmentId * @param diaId * @return */ @Override public SaasClientPay findModelByObject(Long hospitalId,Long departmentId,String diaId) { SaasClientPay saasClientPay = new SaasClientPay(); saasClientPay.setCreateHospitalDepartid(departmentId.toString()); saasClientPay.setCreateHospitalId(hospitalId); saasClientPay.setDiaId(diaId); return baseMapper.findByObject(saasClientPay); } @Override public void updateTypeList(List<String> list) { for (String s : list) { kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/PayManagerMapper.xml
New file @@ -0,0 +1,82 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!----> <mapper namespace="com.kidgrow.oprationcenter.mapper.PayManagerMapper"> <!--定义查询列--> <sql id="Column_List"> * </sql> <!--sql查询片段--> <sql id="where"> <where> <!--查询条件自行添加--> is_del=0 <if test="p.id != null and p.id !=''"> and id = #{p.id} </if> <if test="p.hospitalId != null and p.hospitalId !=''"> and hospital_id = #{p.hospitalId} </if> <if test="p.hospitalName != null and p.hospitalName !=''"> and hospital_name = #{p.hospitalName} </if> <if test="p.departmentId != null and p.departmentId !=''"> and department_id = #{p.departmentId} </if> <if test="p.departmentName != null and p.departmentName !=''"> and department_name = #{p.departmentName} </if> <if test="p.payPrice != null and p.payPrice !=''"> and pay_price = #{p.payPrice} </if> <if test="p.payKidgrow != null and p.payKidgrow !=''"> and pay_kidgrow = #{p.payKidgrow} </if> <if test="p.payCustom != null and p.payCustom !=''"> and pay_custom = #{p.payCustom} </if> <if test="p.isDel != null and p.isDel !=''"> and is_del = #{p.isDel} </if> <if test="p.enabled != null and p.enabled !=''"> and enabled = #{p.enabled} </if> <if test="p.updateTime != null and p.updateTime !=''"> and update_time = #{p.updateTime} </if> <if test="p.createUserId != null and p.createUserId !=''"> and create_user_id = #{p.createUserId} </if> <if test="p.createUserName != null and p.createUserName !=''"> and create_user_name = #{p.createUserName} </if> <if test="p.updateUserId != null and p.updateUserId !=''"> and update_user_id = #{p.updateUserId} </if> <if test="p.updateUserName != null and p.updateUserName !=''"> and update_user_name = #{p.updateUserName} </if> <if test="p.createTime != null and p.createTime !=''"> and create_time = #{p.createTime} </if> </where> </sql> <!--定义根据-PayManager当作查询条件返回对象--> <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.PayManager"> select <include refid="Column_List"/> from pay_manager <include refid="where"/> order by id desc limit 1 </select> <!--定义根据-PayManager当作查询条件返回对象集合--> <select id="findList" resultType="com.kidgrow.oprationcenter.model.PayManager"> select <include refid="Column_List"/> from pay_manager <include refid="where"/> order by id desc </select> </mapper> kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/PayManagerController.java
New file @@ -0,0 +1,167 @@ package com.kidgrow.oprationcenter.controller; import com.kidgrow.common.annotation.LoginUser; import com.kidgrow.common.controller.BaseController; import com.kidgrow.common.model.PageResult; import com.kidgrow.common.model.ResultBody; import com.kidgrow.common.model.SysUser; import com.kidgrow.oprationcenter.model.PayManager; import com.kidgrow.oprationcenter.model.ProductOrderDetail; import com.kidgrow.oprationcenter.service.IPayManagerService; import com.kidgrow.oprationcenter.service.IProductOrderDetailService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> * * @Description: * @Project: 运营中心 * @CreateDate: Created in 2020-09-21 14:16:18 <br> * @Author: <a href="411269194@kidgrow.com">houruijun</a> * @version: 1.0 */ @Slf4j @RestController @RequestMapping("/paymanager") @Api(tags = "") public class PayManagerController extends BaseController { @Autowired private IPayManagerService payManagerService; @Autowired private IProductOrderDetailService productOrderDetailService; /** * 列表 */ @ApiOperation(value = "查询列表") @ApiImplicitParams({ @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"), @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer") }) @GetMapping public ResultBody<PageResult> list(@RequestParam Map<String, Object> params) { if (params.size() == 0) { params.put("page", 1); params.put("limit", 10); } return ResultBody.ok().data(payManagerService.findList(params)); } /** * 查询 */ @ApiOperation(value = "查询") @GetMapping("/{id}") public ResultBody findById(@PathVariable Long id) { PayManager model = payManagerService.getById(id); return ResultBody.ok().data(model).msg("查询成功"); } /** * 查询 */ @ApiOperation(value = "查询一个科室的单次支付金额") @GetMapping("/getDepartmentPay") public ResultBody getDepartmentPay(@RequestParam Long hospitalId, @RequestParam Long departmentId) { PayManager payManager = new PayManager(); payManager.setDepartmentId(departmentId); payManager.setHospitalId(hospitalId); payManager.setIsDel(false); payManager.setEnabled(true); PayManager model = payManagerService.findByObject(payManager); if (model != null) { return ResultBody.ok().data(model.getPayPrice()).msg("已开通"); } return ResultBody.failed().msg("未开通支付功能"); } /** * 根据PayManager当做查询条件进行查询 */ @ApiOperation(value = "根据PayManager当做查询条件进行查询") @PostMapping("/query") public ResultBody findByObject(@RequestBody PayManager payManager) { PayManager model = payManagerService.findByObject(payManager); return ResultBody.ok().data(model).msg("查询成功"); } /** * 查询一个科室是否有支付功能 */ @ApiOperation(value = "查询一个科室是否有支付功能") @GetMapping("/departmentIsPay") public ResultBody departmentIsPay(@RequestParam Long hospitalId, @RequestParam Long departmentId) { PayManager payManager=payManagerService.findByObject(hospitalId,departmentId); if (payManager.getId() == null) { return ResultBody.ok().data(false).msg("未开通单次支付功能"); } else { return ResultBody.ok().data(true).msg("已开通单次支付功能"); } } /** * 新增or更新 */ @ApiOperation(value = "保存") @PostMapping @Transactional(rollbackFor = {Exception.class}) public ResultBody save(@Valid @RequestBody PayManager payManager, BindingResult bindingResult, @LoginUser SysUser sysUser) { List<String> errMsg = new ArrayList<>(); if (bindingResult.hasErrors()) { for (ObjectError error : bindingResult.getAllErrors()) { errMsg.add(error.getDefaultMessage()); } return ResultBody.failed().msg(errMsg.toString()); } else { if (payManager.getId()!=null) { //修改支付功能 ProductOrderDetail modelDetail=payManagerService.getProductDetail(payManager.getHospitalId(),payManager.getDepartmentId()); if(!payManager.getEnabled()&&modelDetail!=null) { //支付禁用 禁用套餐 modelDetail.setEnabled(false); modelDetail.setIsDel(true); if(!productOrderDetailService.saveOrUpdate(modelDetail)) { return ResultBody.failed().msg("套餐修改失败!支付开通修改失败!"); } } else if(modelDetail==null) { Boolean isResult=payManagerService.saveproductOrder(payManager,sysUser); if (!isResult) { return ResultBody.failed().msg("套餐充入失败,支付开通失败!"); } } } else { Boolean isResult=payManagerService.saveproductOrder(payManager,sysUser); if (!isResult) { return ResultBody.failed().msg("套餐充入失败!支付开通失败!"); } } boolean v = payManagerService.saveOrUpdate(payManager); if (v) { return ResultBody.ok().data(payManager).msg("保存成功"); } else { return ResultBody.failed().msg("保存失败"); } } } } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderController.java
@@ -1,6 +1,7 @@ package com.kidgrow.oprationcenter.controller; import com.kidgrow.common.annotation.LoginUser; import com.kidgrow.common.constant.CommonConstant; import com.kidgrow.common.controller.BaseController; import com.kidgrow.common.model.PageResult; import com.kidgrow.common.model.ResultBody; @@ -125,6 +126,7 @@ StringUtils.isNotBlank(params.get("departmentId").toString())&& StringUtils.isNotBlank(params.get("hospitalName").toString())&& StringUtils.isNotBlank(params.get("departmentName").toString())) { params.put("proId", CommonConstant.REG_USER_PRODUCT_ID); boolean isResult= productOrderService.saveProductDetail(params,sysUser); if (isResult) { return ResultBody.ok().data(isResult).msg("试用套餐充值成功"); kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SaasClientPayController.java
@@ -1,5 +1,6 @@ package com.kidgrow.oprationcenter.controller; import com.kidgrow.common.constant.PayConstants; import com.kidgrow.common.controller.BaseController; import com.kidgrow.common.model.PageResult; import com.kidgrow.common.model.ResultBody; @@ -117,7 +118,18 @@ } } } /** * 查询 支付状态是否为成功 */ @ApiOperation(value = "查询一个诊断的支付状态") @GetMapping("/getDepartmentPay") public ResultBody getDepartmentPayState(@RequestParam Long hospitalId, @RequestParam Long departmentId, @RequestParam String diaId) { SaasClientPay model = saasClientPayService.findModelByObject(hospitalId,departmentId,diaId); if (model != null) { return ResultBody.ok().data(model.getPayStatus().equals(PayConstants.ORDER_PAY_SUCEESS)).msg("查询成功"); } return ResultBody.failed().data(false).msg("没有相关数据"); } /** * 删除 */ kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
@@ -91,6 +91,7 @@ - product_order_detail - product_order_record - saas_client_pay - pay_manager ignoreSqls: - com.kidgrow.usercenter.mapper.SysRoleMapper.findAll - com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper.findDetailList kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserMapper.xml
@@ -90,6 +90,7 @@ LEFT JOIN sys_role ROLE ON RU.role_id = ROLE.id WHERE USERS.is_del = 0 and USERS.enabled = 1 <if test="type == 0"> AND ROLE.`code` IN ( 'salemanager', kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/CommonConstant.java
@@ -283,13 +283,17 @@ */ public static final Long REG_USER_PRODUCT_ID=1000000000000000001L; /** * 单次支付用户固定使用的套餐id */ public static final Long PAY_USER_PRODUCT_ID=1000000000000000000L; /** * 自主注册的用户合同时长 天 */ public static final Integer REG_USER_CONTRACT_DAY=15; /** * 自主注册的用户合同名 */ public static final String REG_USER_CONTRACT_NAME="注册用户免费合同"; public static final String REG_USER_CONTRACT_NAME="自动创建合同"; /** * 自主注册的创建人id */ kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/PayConstants.java
New file @@ -0,0 +1,21 @@ package com.kidgrow.common.constant; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> * * @Description: 支付相关<br> * @Project: <br> * @CreateDate: Created in 2020/06/23 16:24 <br> * @Author: <a href="4345453@kidgrow.com">houruijun</a> **/ public interface PayConstants { //支付状态 //0订单创建 int CREATE_ORDER=0; //1订单提交到网关 int SUBMIT_ORDER=1; //2订单支付成功 int ORDER_PAY_SUCEESS=2; //-1订单支付失败 int ORDER_PAY_FAIL=-1; } kidgrow-web/kidgrow-web-manager/src/main/resources/static/login.html
@@ -127,9 +127,6 @@ $('.login-captcha').click(function () { this.src = this.src + '?t=' + (new Date).getTime(); }); }); </script> </body> kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital.html
@@ -21,24 +21,16 @@ <option value="1">-是-</option> <option value="0">-否-</option> </select>   <!-- <select id="isanswer" placeholder="选择医答状态" lay-filter="isanswer"> <option value="">-是否医答-</option> <select id="isanswer" placeholder="支付功能" lay-filter="ispay"> <option value="">-支付功能-</option> <option value="1">-是-</option> <option value="0">-否-</option> </select>   <select id="hospitalstate" placeholder="选择医院状态" lay-filter="hospitalstate"> <option value="">-医院状态-</option> <option value="0">试用</option> <option value="1">正式</option> </select> -->   <input id="hosName" class="layui-input search-input" type="text" placeholder="按医院名" />  <input id="hosName" class="layui-input search-input" type="text" placeholder="按医院名" /> <button id="hospita-btn-search" class="layui-btn icon-btn"><i class="layui-icon permissions" permissions="hospital-get"></i>搜索</button>  <button id="hospital-btn-add" class="layui-btn icon-btn"><i class="layui-icon permissions" permissions="hospital-save"></i>添加医院/科室</button> permissions="hospital-save"></i>添加医院/科室</button> </div> <!-- 数据表格 --> @@ -50,8 +42,9 @@ <script type="text/html" id="businessRecords-table-bar"> <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="productdetail-List">套餐</a> <a class="layui-btn layui-btn-xs permissions" permissions="product-rechage" lay-event="pay">充值</a> <a class="layui-btn layui-btn-xs layui-btn-normal" permissions="product-pay" lay-event="userpay">支付</a> <a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="hospital-save" lay-event="edit">修改</a> <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="hospital-del" lay-event="del">删除科室</a> <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="hospital-del" lay-event="del">删除</a> </script> <!-- 表格状态列 --> <script type="text/html" id="hospital-tpl-state"> @@ -161,7 +154,7 @@ }, { field: 'hospitalId', width: 225, width: 240, align: 'center', toolbar: '#businessRecords-table-bar', title: '操作', @@ -218,6 +211,19 @@ { productdetailShow(obj); } else if (layEvent === "userpay") { //充值 admin.putTempData("t_hospital", data); admin.popupCenter({ title: '单次支付功能', path: 'pages/opration/hospital_pay.html', area: '500px', offset: '50px', finish: function () { $('#hospita-btn-search').click(); } }); } }); // 搜索按钮点击事件 $('#hospita-btn-search').click(function () { kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital_pay.html
New file @@ -0,0 +1,130 @@ <form id="pay-form" lay-filter="pay-form" class="layui-form model-form" method="POST"> <div class="layui-form-item"> <label class="layui-form-label" style="width: 150px;">医院</label> <div class="layui-input-block"> <input name="hospitalName" type="text" class="layui-input" style="width: 200px;"disabled="disabled"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width: 150px;">科室</label> <div class="layui-input-block"> <input name="departmentName" type="text" class="layui-input" style="width: 200px;" disabled="disabled"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width: 150px;">功能状态</label> <div class="layui-input-block"> <input type="checkbox" checked="checked" name="enabled" lay-skin="switch" lay-filter="payenabled" lay-text="启用|停用" /> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width: 150px;">单次支付金额(元)</label> <div class="layui-input-block"> <input name="payPrice" type="text" class="layui-input" maxlength="8" lay-verify="required|number" required autocomplete="off" style="width: 200px;" /> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width: 150px;">客户所得(元)</label> <div class="layui-input-block"> <input name="payCustom" type="text" autocomplete="off" class="layui-input" maxlength="8" lay-verify="required|number" required style="width: 200px;" /> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width: 150px;">喜高所得(元)</label> <div class="layui-input-block"> <input name="payKidgrow" type="text" autocomplete="off" class="layui-input" maxlength="8" lay-verify="required|number" required style="width: 200px;" /> </div> </div> <div class="layui-form-item"> <label class="layui-form-label"></label> <div class="layui-input-block"> 喜高所得=单次支付金额-客户所得 </div> </div> <div class="layui-form-item model-form-footer"> <button class="layui-btn layui-btn-primary" ew-event="closeDialog" type="button">取消</button> <button class="layui-btn permissions" permissions="productpay-edit" lay-filter="pay-form-submit" lay-submit>保存</button> </div> <input type="hidden" value="" id="id" name="id" /> <input type="hidden" value="" id="departmentId" name="departmentId" /> <input type="hidden" value="" id="hospitalId" name="hospitalId" /> <input type="hidden" value="" id="departmentName" name="departmentName" /> <input type="hidden" value="" id="hospitalName" name="hospitalName" /> </form> <script> layui.use(['form', 'table', 'util', 'config', 'admin', 'formSelects'], function () { var form = layui.form; var table = layui.table; var config = layui.config; var layer = layui.layer; var util = layui.util; var admin = layui.admin; var formSelects = layui.formSelects; //回显医院基本数据 let hospitalData = admin.getTempData('t_hospital'); form.val('pay-form', hospitalData); layer.load(2); var queryModel = { hospitalId: hospitalData.hospitalId, hospitalName: '', departmentName: '', payPrice: '', payKidgrow: '', payCustom: '', departmentId: hospitalData.departmentId }; admin.req('api-opration/paymanager/query', JSON.stringify(queryModel), function (data) { layer.closeAll('loading'); if (0 === data.code) { queryData = data.data; if (queryData != null) { form.val('pay-form', queryData); } } }, 'POST'); form.render(); // 表单提交事件 form.on('submit(pay-form-submit)', function (data) { layer.load(2); if (data.field.enabled === 'on') { data.field.enabled = true; } else { data.field.enabled = false; } if (parseInt(data.field.payPrice) - parseInt(data.field.payCustom) == parseInt(data.field .payKidgrow)) { admin.req('api-opration/paymanager', JSON.stringify(data.field), function (data) { if (data.code === 0) { layer.closeAll('loading'); layer.msg(data.msg, { icon: 1, time: 2000 }); admin.finishPopupCenter(); } else { layer.closeAll('loading'); layer.msg(data.msg, { icon: 2, time: 2000 }); } }, $('#pay-form').attr('method')); } else { layer.closeAll('loading'); layer.msg("金额分配额有误!(喜高所得=单次支付金额-客户所得)", { icon: 2, time: 5000 }); } return false; }); }) </script>