kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ConsumptionService.java
New file @@ -0,0 +1,43 @@ package com.kidgrow.oprationcenter.feign; import com.kidgrow.common.constant.ServiceNameConstants; import com.kidgrow.common.model.ResultBody; import com.kidgrow.oprationcenter.feign.fallback.ConsumptionServiceFallbackFactory; import com.kidgrow.oprationcenter.vo.ConsumptionRequest; import com.kidgrow.ribbon.config.FeignHttpInterceptorConfig; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> * @Description: 扣费业务相关内部调用 * @Project: 运营中心 * @CreateDate: Created in 2020-06-27 15:26:33 <br> * @Author: <a href="411269194@kidgrow.com">houruijun</a> * @version: 1.0 */ @FeignClient(value = ServiceNameConstants.OPRATION_SERVER,configuration= FeignHttpInterceptorConfig.class, fallbackFactory = ConsumptionServiceFallbackFactory.class, decode404 = true) public interface ConsumptionService { /** * 要让AI读片-调用 */ @PostMapping(value = "consumption/AIStart") ResultBody consumptionAIStart (@RequestBody ConsumptionRequest consumptionRequest); /** * AI返回结果-调用 */ @PostMapping(value = "consumption/AIReturn") ResultBody consumptionAIReturn (@RequestBody ConsumptionRequest consumptionRequest); /** * AI拒读/失败通知-调用 */ @PostMapping(value = "consumption/AIFail") ResultBody consumptionAIFail (@RequestBody ConsumptionRequest consumptionRequest); /** * 发起人工读片-调用 */ @PostMapping(value = "consumption/Artificial") ResultBody consumptionArtificial (@RequestBody ConsumptionRequest consumptionRequest); } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ConsumptionServiceFallbackFactory.java
New file @@ -0,0 +1,33 @@ package com.kidgrow.oprationcenter.feign.fallback; import com.kidgrow.common.model.ResultBody; import com.kidgrow.oprationcenter.feign.ConsumptionService; import com.kidgrow.oprationcenter.vo.ConsumptionRequest; import feign.hystrix.FallbackFactory; public class ConsumptionServiceFallbackFactory implements FallbackFactory<ConsumptionService> { @Override public ConsumptionService create(Throwable throwable) { return new ConsumptionService() { @Override public ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest) { return ResultBody.failed().msg("consumptionAIStart的FeignClient调用参数传递测试失败"); } @Override public ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest) { return ResultBody.failed().msg("consumptionAIReturn的FeignClient调用参数传递测试失败"); } @Override public ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest) { return ResultBody.failed().msg("consumptionAIFail的FeignClient调用参数传递测试失败"); } @Override public ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest) { return ResultBody.failed().msg("consumptionArtificial的FeignClient调用参数传递测试失败"); } }; } } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java
@@ -1,9 +1,11 @@ package com.kidgrow.oprationcenter.model; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.kidgrow.common.model.SuperModel; import com.kidgrow.common.model.BaseModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,6 +13,7 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Date; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> @@ -26,9 +29,14 @@ @NoArgsConstructor @AllArgsConstructor @TableName("consumption_record") public class ConsumptionRecord extends SuperModel { public class ConsumptionRecord extends BaseModel { private static final long serialVersionUID = 1L; /** * 上次消费记录id(用于退费,扣费) */ @TableId @JsonSerialize(using = ToStringSerializer.class) private Long id; /** * 上次消费记录id(用于退费,扣费) */ @@ -64,6 +72,8 @@ * 300 退还预扣 * 301 退还扣费 * 400 义务执行出错 * 401 参数为空异常 * 402 业务失败 */ @NotEmpty(message = "业务返回结果不能为空") private Integer businessCode; @@ -72,4 +82,15 @@ */ @NotNull(message = "扣费数量/金额不能为空") private Integer consumptionCount; /** * 创建时间 */ @NotNull(message = "创建时间不能为空") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 更新时间 */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; } kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java
@@ -52,7 +52,6 @@ private static final Logger logger = LoggerFactory.getLogger(ConsumptionRecordServiceImpl.class); /** * 列表 * @@ -99,6 +98,8 @@ public ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest) { //默认的业务返回码 int bcode = -1; //记录类型 int recordType=ConsumptionConstant.BEFORE_DEDUCTION; //业务执行结果 boolean isSuccess = false; //业务执行结果信息 @@ -144,7 +145,7 @@ reMsg = "传入参数有误!"; bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; } return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess); return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess); } /** @@ -158,6 +159,8 @@ public ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest) { //默认的业务返回码 int bcode = -1; //记录类型 int recordType=ConsumptionConstant.DEDUCTION; //业务执行结果 boolean isSuccess = false; //业务执行结果信息 @@ -181,11 +184,13 @@ //预扣费执行失败 reMsg = "预扣费执行失败!"; bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess); } } else { //余额不足 reMsg = "余额不足或获取失败!"; bcode = ConsumptionConstant.BUSINESS_CODE_FAIL; return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess); } } if (consumptionBusiess(consumptionRequest, consumptionRecordList)) { @@ -205,7 +210,7 @@ reMsg = "传入参数有误!"; bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; } return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess); return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess); } /** @@ -219,6 +224,8 @@ public ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest) { //默认的业务返回码 int bcode = -1; //记录类型 int recordType = ConsumptionConstant.RETURN_BEFORE_DEDUCTION; //业务执行结果 boolean isSuccess = false; //业务执行结果信息 @@ -226,14 +233,12 @@ if (VateParams(consumptionRequest)) { //先获取这个业务关联的扣费记录 List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER)); Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER)); //1.先检查是否已经扣费 if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) { //2.没有扣费,检查是否已经预扣费 if (isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) { //2.1.有预扣费 ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION).collect(Collectors.toList()).get(0); 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); @@ -242,12 +247,12 @@ { //退预扣记录 ConsumptionRecord consumptionRecordNew = new ConsumptionRecord(); consumptionRecordNew.setBusinessCode(ConsumptionConstant.RETURN_BEFORE_DEDUCTION); consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION); consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId()); consumptionRecordNew.setConsumptionCount(consumptionRequest.getConsumptionCount()); consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION); consumptionRecordNew.setConsumptionCount(0-consumptionRequest.getConsumptionCount()); consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_BEFORE_DEDUCTION); consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId); consumptionRecordNew.setLastRecordId(consumptionRecord.getLastRecordId()); consumptionRecordNew.setLastRecordId(consumptionRecord.getId()); if (SaveConsumptionRecord(consumptionRecordNew)) { reMsg = "有预扣,写退还预扣成功!"; @@ -270,7 +275,8 @@ bcode = ConsumptionConstant.BUSINESS_CODE_ERROR; } } else { //3.有扣费记录 recordType=ConsumptionConstant.RETURN_DEDUCTION; //3.有扣费记录 这种情况的流程,实际业务中不会出现,但理论上应该这样处理 //3.1 退还账户 //获取预扣的时候占住的套餐id ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.DEDUCTION).collect(Collectors.toList()).get(0); @@ -283,24 +289,36 @@ //退费 boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail); if (consumptionRe) { //退费成功 //3.2 写退费记录 ConsumptionRecord consumptionRecordNew = new ConsumptionRecord(); consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION); consumptionRecordNew.setBusinessId(consumptionRecord.getBusinessId()); consumptionRecordNew.setConsumptionCount(consumptionRecord.getConsumptionCount()); consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_DEDUCTION); consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId()); consumptionRecordNew.setLastRecordId(consumptionRecord.getLastRecordId()); if (SaveConsumptionRecord(consumptionRecordNew)) { //写退费记录成功 isSuccess=true; reMsg = "退还扣费成功!"; bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION; //更新扣费记录 还回占用套餐 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; } } else { reMsg = "退还扣费失败!"; //更新扣费失败 reMsg = "更新扣费失败!"; bcode = ConsumptionConstant.BUSINESS_RUN_FAIL; } } @@ -327,7 +345,7 @@ reMsg = "传入参数有误!"; bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; } return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess); return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess); } /** @@ -340,6 +358,8 @@ public ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest) { //默认的业务返回码 int bcode = -1; //记录类型 int recordType = ConsumptionConstant.DEDUCTION; //业务执行结果 boolean isSuccess = false; //业务执行结果信息 @@ -347,8 +367,6 @@ if (VateParams(consumptionRequest)) { //先获取这个业务关联的扣费记录 List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId()); Long hospitalId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER)); Long departmentId = Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER)); //1.先检查是否已经扣费 if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) { //2.没有扣费,检查是否已经预扣费 @@ -360,15 +378,31 @@ //预扣费执行失败 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); } } //扣费业务 isSuccess= consumptionBusiess(consumptionRequest,consumptionRecordList); if (isSuccess) { reMsg = "该业务已经扣费!"; bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION; } else { reMsg = "该业务扣费失败!"; bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; } } else { //已经扣费 reMsg = "该业务已经扣费!"; @@ -378,7 +412,7 @@ reMsg = "传入参数有误!"; bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR; } return ResultReturn(consumptionRequest, bcode, reMsg, isSuccess); return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess); } /** @@ -418,7 +452,8 @@ consumptionRecordNew.setConsumptionCount(consumptionRequest.getConsumptionCount()); consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION); consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId()); consumptionRecordNew.setLastRecordId(consumptionRecord.getLastRecordId()); consumptionRecordNew.setLastRecordId(consumptionRecord.getId()); consumptionRecordNew.setCreateTime(new Date()); if (SaveConsumptionRecord(consumptionRecordNew)) { //3.3 扣费成功 如果套餐id变化,则更新预扣费的套餐id @@ -452,13 +487,13 @@ * @param isSuccess 业务执行是否成功 * @return */ private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode, String reMsg, boolean isSuccess) { private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode,int recordType, String reMsg, boolean isSuccess) { //返回的数据实体 ConsumptionVo consumptionVo = new ConsumptionVo(); consumptionVo.setConsumptionCount(consumptionRequest.getConsumptionCount()); consumptionVo.setBusinessId(consumptionRequest.getBusinessId()); consumptionVo.setBcode(bcode); consumptionVo.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION); consumptionVo.setRecordType(recordType); if (isSuccess) { return ResultBody.ok().data(consumptionVo).msg(reMsg); } else { @@ -572,6 +607,9 @@ */ private Boolean SaveConsumptionRecord(ConsumptionRecord consumptionRecord) { if (consumptionRecord != null) { if (consumptionRecord.getCreateTime() == null) { consumptionRecord.setCreateTime(new Date()); } return this.saveOrUpdate(consumptionRecord); } else { logger.info("扣费数据写入参数为空!"); @@ -590,7 +628,7 @@ if (consumptionRecordList != null) { if (consumptionRecordList.size() > 0) { //过滤预扣费的记录 return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType).collect(Collectors.toList()).size() == 1; return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType&&f.getProOrderDetailId()>0).collect(Collectors.toList()).size() == 1; } } return false; kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ConsumptionRecordMapper.xml
@@ -12,8 +12,8 @@ <where> <!--查询条件自行添加--> 1=1 <if test="p.recordId != null and p.recordId !=''"> and record_id = #{p.recordId} <if test="p.id != null and p.id !=''"> and id = #{p.id} </if> <if test="p.lastRecordId != null and p.lastRecordId !=''"> and last_record_id = #{p.lastRecordId} @@ -48,7 +48,7 @@ <include refid="Column_List"/> from consumption_record <include refid="where"/> order by record_id desc order by id desc limit 1 </select> @@ -58,6 +58,6 @@ <include refid="Column_List"/> from consumption_record <include refid="where"/> order by record_id desc order by id desc </select> </mapper> kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
@@ -83,6 +83,9 @@ - sys_feedback - doctor_templete - consumption_record - product_order - product_order_detail - product_order_record ignoreSqls: - com.kidgrow.usercenter.mapper.SysRoleMapper.findAll kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ServiceNameConstants.java
@@ -14,6 +14,10 @@ */ String USER_SERVICE = "usercenter-server"; /** * 运营中心服务 */ String OPRATION_SERVER="oprationcenter-server"; /** * 搜索中心服务 */ String SEARCH_SERVICE = "searchcenter-server"; kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/UserInfoHeaderFilter.java
@@ -29,7 +29,6 @@ import java.util.Map; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.FORM_BODY_WRAPPER_FILTER_ORDER; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> @@ -82,11 +81,18 @@ List<SysDoctor> sysDoctors = JSON.parseArray(JSON.toJSONString(listByMap.getData()), SysDoctor.class); String str=""; Long hospital=-1L; Long doctorId=-1L; Long departmentId=-1L; String departmentName=""; if(sysDoctors!=null&&sysDoctors.size()>0){ str= sysDoctors.get(0).getDoctorName(); hospital=sysDoctors.get(0).getHospitalId(); doctorId=sysDoctors.get(0).getId(); departmentId=sysDoctors.get(0).getDepartmentId(); departmentName=sysDoctors.get(0).getDepartmentName(); } ctx.addZuulRequestHeader(SecurityConstants.USER_ID_HEADER, String.valueOf(user.getId())); ctx.addZuulRequestHeader(SecurityConstants.DOCTOR_ID_HEADER, String.valueOf(doctorId)); ctx.addZuulRequestHeader(SecurityConstants.USER_HEADER, user.getUsername()); ctx.addZuulRequestHeader(SecurityConstants.USER_REAL_NAME,URLEncoder.encode(str,"UTF-8"));//待完善 @@ -98,8 +104,8 @@ if (organizations != null&&organizations.size()>0) { ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_ID_HEADER,String.valueOf(organizations.get(0).getId())); ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_NAME_HEADER, URLEncoder.encode(organizations.get(0).getOrgName(),"UTF-8")); ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_ID_HEADER,String.valueOf(organizations.get(organizations.size()-1).getId())); ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_NAME_HEADER,URLEncoder.encode(organizations.get(organizations.size()-1).getOrgName(),"UTF-8")); ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_ID_HEADER,String.valueOf(departmentId)); ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_NAME_HEADER,(departmentName.equals("")?URLEncoder.encode(organizations.get(organizations.size()-1).getOrgName(),"UTF-8"):departmentName)); ctx.addZuulRequestHeader(SecurityConstants.USER_ORGS_HEADER,JSON.toJSONString(organizations)); } //将角色放到header kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recharge.html
@@ -387,6 +387,9 @@ if (listData != null) { if (data.field != null) { layer.confirm("确定要将待充值列表中的" + listData.length + "个产品充值给当前医院吗?", { btn: ["确定", "返回"] }, function () { data.field.contractBeginTime=data.field.contractBeginTime+" 00:00:00"; data.field.contractEndTime=data.field.contractEndTime+" 23:59:59"; data.field.contractTime=data.field.contractTime+" 00:00:00"; admin.req('api-opration/contract', JSON.stringify(data.field), function (data) { layer.closeAll('loading'); if (data.code === 0) { @@ -402,8 +405,8 @@ isShare: item.isShare, ailightCount: item.ailightCount, recordCount: item.recordCount, proBegintime: new Date(item.beginTime + ' 00:00:00'), proEndtime: new Date(item.endTime + ' 23:59:59') proBegintime: item.beginTime + ' 00:00:00', proEndtime: item.endTime + ' 23:59:59' }; listDetailData.push(detailData); })