ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -999,4 +999,11 @@ }); return AjaxResult.success("同步任务已启动,请稍后查看结果"); } @PostMapping("/dealSubtaskDeadline") public AjaxResult dealSubtaskDeadline(@RequestParam("orgid") String orgid, @RequestParam("day") Integer day) { // 立即返回,后台异步执行 ryTask.dealSubtaskDeadline(orgid, day); return AjaxResult.success("【dealSubtaskDeadline】同步任务已启动,天数为" + day + "天,请稍后查看结果"); } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -2,6 +2,7 @@ import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUserDept; @@ -218,18 +219,18 @@ ajax.put("user", user); ajax.put("roles", roles); ajax.put("permissions", permissions); List<SysUserDept> sysUserDeptKSs = null; List<SysUserDept> sysUserDeptBQs = null; List<SysDept> sysDeptKSs = null; List<SysDept> sysDeptBQs = null; SysUserDept sysUserDept = new SysUserDept(); sysUserDept.setUserId(user.getUserId()); sysUserDept.setDeptType("1"); sysUserDept.setOrgid(user.getOrgid()); sysUserDept.setCampusid(user.getCampusid()); sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); ajax.put("belongDepts", sysUserDeptKSs); sysDeptKSs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept); ajax.put("belongDepts", sysDeptKSs); sysUserDept.setDeptType("2"); sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept); ajax.put("belongWards", sysUserDeptBQs); sysDeptBQs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept); ajax.put("belongWards", sysDeptBQs); return ajax; } ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -1771,48 +1771,65 @@ * 处理超时随访任务 * @return */ public void dealSubtaskDeadline(Integer deadlineDay){ public void dealSubtaskDeadline(String orgid, Integer deadlineDay){ //获取任务信息 ServiceTask st = new ServiceTask(); st.setDelFlag("0"); st.setLongTask(1); st.setNexttaskflag("1"); st.setOrgid(orgid); List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st); for (ServiceTask serviceTask : serviceTasks) { deadlineDay = -deadlineDay; Date deadline = DateUtils.addDays(new Date(), deadlineDay); //通过任务ID拿到患者信息,并且随访时间得是今天之前的 ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity(); serviceSubtaskVO.setOrgid(orgid); serviceSubtaskVO.setSendstate(7L); //只扫描首次随访的 serviceSubtaskVO.setVisitCount(1); serviceSubtaskVO.setTaskid(serviceTask.getTaskid()); serviceSubtaskVO.setEndOutHospTime(deadline); List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); log.info("【dealSubtaskDeadline】获取到{}个超时任务, taskid={}", serviceSubtaskList.size(), serviceTask.getTaskid()); for (ServiceSubtask serviceSubtask : serviceSubtaskList) { PatMedInhosp patMedInhospVo = new PatMedInhosp(); patMedInhospVo.setOrgid(serviceSubtask.getOrgid()); patMedInhospVo.setInhospid(serviceSubtask.getInhospid()); List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhospVo); PatMedInhosp patMedInhosp = new PatMedInhosp(); if (!patMedInhospList.isEmpty()) { patMedInhosp = patMedInhospList.get(0); }else { continue; } if(ObjectUtils.isEmpty(serviceTask.getNexttaskid())){ continue; } ServiceTask nextServiceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceTask.getNexttaskid()); PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid()); String config = configService.selectConfigByKey("visit.early.day"); Integer type = 1; Date deadline = DateUtils.addDays(new Date(), deadlineDay); //通过任务ID拿到患者信息,并且随访时间得是今天之前的 ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity(); serviceSubtaskVO.setSendstate(7L); serviceSubtaskVO.setVisitCount(1); serviceSubtaskVO.setEndOutHospTime(deadline); List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); log.info("【dealSubtaskDeadline】获取到{}个超时任务", serviceSubtaskList.size()); for (ServiceSubtask serviceSubtask : serviceSubtaskList) { PatMedInhosp patMedInhosp = new PatMedInhosp(); patMedInhosp.setInhospid(serviceSubtask.getInhospid()); List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhosp); if (patMedInhospList.size() > 0) { serviceSubtask.setIsVisitAgain(2); serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ";患者再入院了" : "患者再入院了"); serviceSubtask.setSendstate(4L); serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); //return "无需再次随访,患者再入院了"; }else { continue; } //新增再次随访任务 ServiceSubtask serviceSubtaskAgain = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtask.class); serviceSubtaskAgain.setId(null); serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue()); serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1); serviceSubtaskAgain.setSendstate(2L); serviceSubtaskAgain.setCreateTime(new Date()); serviceSubtaskAgain.setUpdateTime(new Date()); serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType()); serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode()); serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName()); int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain); if (i == 1) { //再次随访任务创建成功后,原任务改为失败状态 serviceSubtask.setIsVisitAgain(2); serviceSubtask.setSendstate(5L); serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); //新增再次随访任务 ServiceSubtask serviceSubtaskAgain = iPatMedInhospService.boxedServiceSubtask(nextServiceTask, patMedInhosp, patArchive, config, type); serviceSubtaskAgain.setId(null); serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue()); serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1); serviceSubtaskAgain.setSendstate(2L); serviceSubtaskAgain.setCreateTime(new Date()); serviceSubtaskAgain.setUpdateTime(new Date()); serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType()); serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode()); serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName()); int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain); if (i == 1) { //再次随访任务创建成功后,原任务改为失败状态 serviceSubtask.setSendstate(5L); serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); } } } } ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -291,7 +291,7 @@ and d.del_flag = 0 and ud.del_flag = 0 <if test="orgid != null">and d.orgid = #{orgid} and ud.orgid = #{orgid}</if> <if test="campusid != null">and d.campusid = #{campusid} and ud.campusid = #{campusid}</if> <if test="campusid != null">and d.campusid = #{campusid}</if> <if test="userId != null">and ud.user_id = #{userId}</if> <if test="deptType != null and deptType != ''">and d.dept_type = #{deptType}</if> </select> smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java
@@ -799,4 +799,10 @@ // @Excel(name = " 发送状态 1 被领取(在任务中是新建,在服务中是被领取) 2 待发送 3 已发送 4 不执行 5 发送失败 6 已完成\") ") @ApiModelProperty(value = "页面展示状态 :1:待随访(1 被领取、2 待发送、3 已发送、5 发送失败、7、超时);2:已完成( 6 已完成)、3:无需随访(4 不执行)") private Long sendstateView; @ApiModelProperty(value = "手术记录id 对应pat_med_operation_item.id") private Long operationItemId; @ApiModelProperty(value = "手术记录id集合") private List<Long> operationItemIds; } smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
@@ -77,6 +77,14 @@ public int deleteHardPatMedOperationItemByOpId(String opid); /** * 删除患者检查检验记录子 * * @param opid 患者检查检验记录子主键 * @return 结果 */ public int deleteSoftPatMedOperationItemByOpId(String opid); /** * 查询患者检查检验记录子列表 * * @param patMedOperationItem 患者检查检验记录子 smartor/src/main/java/com/smartor/service/IServiceExternalService.java
@@ -119,6 +119,12 @@ public Boolean addOperationInfo(@RequestBody Map dataMap); /** * 撤销手术信息 */ public Boolean cancelOperationInfo(@RequestBody Map dataMap); /** * 新增医疗组医生 */ public Boolean addMedicalTeam(Map dataMap); smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -300,7 +300,7 @@ } catch (Exception e) { log.error("人员入院科室处理出异常了:{}", e.getMessage()); patMedInhosp1.setInDeptcheckFlag("2"); patMedInhosp1.setLongTaskReason("人员入院科室处理出异常了:" + e.getMessage()); patMedInhosp1.setLongTaskReason("人员入院科室处理出异常了"); patMedInhospMapper.updatePatMedInhosp(patMedInhosp1); } } @@ -865,7 +865,7 @@ if (CollectionUtils.isEmpty(serviceTasks)) { log.info("该手术对应手术等级的长期任务不存在,任务ID为:{}", taskid); patMedOperationItem.setOpercheckFlag("2"); patMedOperationItem.setLongTaskReason(longTaskReason + " & 该手术对应手术等级的长期任务不存在,任务ID为:" + taskid); patMedOperationItem.setLongTaskReason(" & 该手术对应手术等级的长期任务不存在,任务ID为:" + taskid +";"); patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem); return; } else { @@ -971,7 +971,7 @@ PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem(); patMedOperationItem2.setId(patMedOperationItem.getId()); patMedOperationItem2.setOpercheckFlag("2"); patMedOperationItem2.setRemark("生成子任务失败 4"); patMedOperationItem2.setLongTaskReason("生成子任务失败 4;"); patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2); } } catch (Exception e) { @@ -981,7 +981,7 @@ PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem(); patMedOperationItem2.setId(patMedOperationItem.getId()); patMedOperationItem2.setOpercheckFlag("2"); patMedOperationItem2.setRemark("生成子任务报错回滚 4"); patMedOperationItem2.setLongTaskReason("生成子任务报错回滚 4;"); patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2); e.printStackTrace(); } @@ -1188,7 +1188,7 @@ newDate = addDays(patMedInhosp1.getEndtime(), serviceTask.getSendDay().intValue()); } else { patMedOperationItem.setOpercheckFlag("2"); patMedOperationItem.setRemark(patMedOperationItem.getRemark() + "& 该患者手术出院时间为空,手术详情ID为:" + patMedOperationItem.getId()); patMedOperationItem.setLongTaskReason("该患者手术出院时间为空,手术详情ID为:" + patMedOperationItem.getId() + ";"); patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem); // patMedInhosp1.setDeptcheckFlag("2"); // patMedInhosp1.setRemark(patMedInhosp1.getRemark() + "& 该患者手术出院时间为空,出院记录ID为:" + patMedInhosp1.getInhospid()); @@ -1324,7 +1324,7 @@ if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) { PatMedOperationItem patMedOperationItem = patMedOperationItemMapper.selectPatMedOperationItemById(opItem.getId()); patMedOperationItem.setOpercheckFlag("2"); patMedOperationItem.setLongTaskReason(patMedOperationItem.getLongTaskReason() + "所患的手术未配置长期任务;"); patMedOperationItem.setLongTaskReason("所患的手术未配置长期任务;"); patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem); } else { for (ServiceTaskoper serviceTaskoper : serviceTaskopers) { smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -816,10 +816,16 @@ patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC()); } patMedInhosp1.setInhospstate("1"); String orgid = ObjectUtils.isNotEmpty(BingRenXX) && ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null; if(StringUtils.isNotEmpty(orgid) && orgid.equals("47246103233112211A1001")){ //缙云二院 住院记录不更新状态 }else { patMedInhosp1.setInhospstate("1"); } if (CollectionUtils.isNotEmpty(patMedInhospList)) { patMedInhosp1.setUpdateTime(new Date()); patMedInhosp1.setOrgid(ObjectUtils.isNotEmpty(BingRenXX) && ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null); patMedInhosp1.setOrgid(orgid); if (CollectionUtils.isNotEmpty(noLongTask) && noLongTask.contains(patMedInhosp1.getOrgid())) { //不需要长期任务随访 patMedInhosp1.setFuflag("0"); @@ -832,7 +838,7 @@ patMedInhosp1.setHospitalcode(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null); patMedInhosp1.setLeavehospitaldistrictname(ObjectUtils.isNotEmpty(BingRenXX.get("DangQianBQMC")) ? BingRenXX.get("DangQianBQMC").toString() : null); patMedInhosp1.setLeavehospitaldistrictcode(ObjectUtils.isNotEmpty(BingRenXX.get("DangQianBQID")) ? BingRenXX.get("DangQianBQID").toString() : null); patMedInhosp1.setOrgid(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null); patMedInhosp1.setOrgid(orgid); //丽水无院区,默认值是 1 patMedInhosp1.setCampusid("1"); patMedInhosp1.setPatno(ObjectUtils.isNotEmpty(BingRenXX.get("BingRenID")) ? BingRenXX.get("BingRenID").toString() : null); @@ -1514,6 +1520,81 @@ return true; } @Override public Boolean cancelOperationInfo(Map dataMap) { log.info("ServiceExternalServiceImpl---cancelOperationInfo的撤销的值为:{}", dataMap); Map yeWuXX = (Map) dataMap.get("YeWuXX"); Map<String, Object> BingRenXX = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("BingRenXX") : null; ExternalInHospPatientInfo externalInHospPatientInfo = BeanUtil.mapToBean(BingRenXX, ExternalInHospPatientInfo.class, true); PatArchive patArchive = addPatArchive(externalInHospPatientInfo, null, null); //手术撤销 Map<String, Object> sscx = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("ShouShuCX") : null; ExternalOperationInfo externalOperationInfo = null; if (ObjectUtils.isNotEmpty(sscx)) externalOperationInfo = BeanUtil.mapToBean(sscx, ExternalOperationInfo.class, true); PatMedOperation patMedOperation = new PatMedOperation(); patMedOperation.setPatid(patArchive.getId()); patMedOperation.setOrgid(patArchive.getOrgid()); patMedOperation.setOpreqcode(externalOperationInfo.getShenQingDID()); //查询一下,该患者是否已经有这些数据 List<PatMedOperation> patMedOperations = patMedOperationMapper.selectPatMedOperationList(patMedOperation); if (CollectionUtils.isNotEmpty(patMedOperations)) { for(PatMedOperation operation : patMedOperations){ Long id = operation.getId(); //如果手术撤销,直接删除该条手术信息 if (ObjectUtils.isNotEmpty(sscx)) { operation.setId(id); operation.setCheckFlag("1"); operation.setDelFlag("1"); //同时去查询,是否在subtask中生成任务,如果生成出得立马删除 // 手术随访 PatMedOperationItem pmoi = new PatMedOperationItem(); //获取需要出院手术随访,未处理的数据 pmoi.setOpid(operation.getId().toString()); List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemList(pmoi); List<Long> operationItemIds = patMedOperationItems.stream() .map(PatMedOperationItem::getId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); //不需要服务了,需要通过patid和sendstate=1,2,3,5,7去查询一下,service_subtask里是否有正在执行的任务, //有的话,立即停了 List<Long> sendstates = Arrays.asList(1L, 2L, 3L, 5L, 7L); List<ServiceSubtask> serviceSubtaskList = new ArrayList<>(); ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity(); serviceSubtaskVO.setOrgid(patArchive.getOrgid()); serviceSubtaskVO.setPatid(patArchive.getId()); serviceSubtaskVO.setSendstates(sendstates); serviceSubtaskVO.setOperationItemIds(operationItemIds); serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO); //去redis中,查询是否有subid,有的话移除cache-exist if (CollectionUtils.isNotEmpty(serviceSubtaskList)) { for (ServiceSubtask serviceSubtask : serviceSubtaskList) { log.info("需要移除的subId为:{}", serviceSubtask.getId().toString()); serviceSubtask.setSendstate(4L); serviceSubtask.setRemark("手术撤销"); serviceSubtaskMapper.updateServiceSubtask(serviceSubtask); redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString()); redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString()); } } operation.setUpdateTime(new Date()); patMedOperationMapper.updatePatMedOperation(operation); patMedOperationItemMapper.deleteSoftPatMedOperationItemByOpId(operation.getOpid()); } } } return true; } //新增患者基本信息 private PatArchive addPatArchive(ExternalInHospPatientInfo externalInHospPatientInfo, ExternalInHospPatientAddrInfo externalInHospPatientAddrInfo, ExternalInHospPatientLiaisonInfo externalInHospPatientLiaisonInfo) { Date parse = null; @@ -2007,6 +2088,7 @@ return true; case "SM_SQ_CheXiao": log.info("手术撤销入参类型为:{}", type); cancelOperationInfo(dataMap); return true; case "TJ_YW_BaoGaoXX": log.info("体检报告入参类型为:{}", type); smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml
@@ -246,6 +246,7 @@ AND a.del_flag = 0 AND b.del_flag = 0 AND a.idcardno IS NOT NULL <if test="inhospid != null">and b.inhospid = #{inhospid}</if> <if test="startOutHospTime != null ">and date_format(b.endtime,'%y%m%d') >= date_format(#{startOutHospTime},'%y%m%d') </if> smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
@@ -444,6 +444,14 @@ where opid = #{opid} </delete> <update id="deleteSoftPatMedOperationItemByOpId" parameterType="String"> update pat_med_operation_item <trim prefix="SET" suffixOverrides=","> del_flag =1 </trim> where opid = #{opid} </update> <select id="selectOperationItemList" parameterType="com.smartor.domain.PatMedOperationItem" resultMap="PatMedOperationItemResult"> select pmoi.id, pmoi.operationid, pmoi.opid, pmoi.opcode, pmoi.opdesc, pmoi.main_flag, pmoi.incitypecode, @@ -457,7 +465,7 @@ from pat_med_operation pmo join pat_med_operation_item pmoi on pmoi.opid = pmo.opid left join pat_med_inhosp pmi join pat_med_inhosp pmi on pmo.serialnum = pmi.serialnum where pmo.del_flag = '0' smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -358,6 +358,12 @@ #{itemTaskId} </foreach> </if> <if test="operationItemIds != null and operationItemIds.size() > 0"> AND operation_item_id IN <foreach collection="operationItemIds" item="operationItemIdItem" open="(" separator="," close=")"> #{operationItemIdItem} </foreach> </if> <if test="templateid != null and templateid != ''">and templateid = #{templateid}</if> <if test="templatename != null and templatename != ''">and templatename like concat('%', #{templatename}, '%') @@ -483,6 +489,7 @@ <if test="libtemplatename != null ">and libtemplatename = #{libtemplatename}</if> <if test="openid != null ">and openid = #{openid}</if> <if test="sendstate != null ">and sendstate = #{sendstate}</if> <if test="operationItemId != null ">and operation_item_id = #{operationItemId}</if> <if test="drname != null and drname != ''">and drname like concat('%', #{drname}, '%')</if> <if test="taskName != null and taskName != ''">and task_name like concat('%', #{taskName}, '%')</if> <if test="drcode != null and drcode != ''">and (drcode = #{drcode}</if>