|  | @ -1,55 +1,162 @@
 | 
	
		
			
				|  |  | package com.yihu.jw.processGuidance.service;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.alibaba.fastjson.JSONArray;
 | 
	
		
			
				|  |  | import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.base.patient.BasePatientDO;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.base.processGuidance.BasePatientProcessGuidanceDO;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.base.processGuidance.BaseProcessGuidanceDeptDO;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.base.processGuidance.*;
 | 
	
		
			
				|  |  | import com.yihu.jw.patient.dao.BasePatientDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.processGuidance.dao.BasePatientProcessGuidanceDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.processGuidance.dao.BasePatientProcessGuidanceLogDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.processGuidance.dao.BaseProcessGuidanceDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.processGuidance.dao.BaseProcessGuidanceDeptDao;
 | 
	
		
			
				|  |  | import com.yihu.jw.processGuidance.dao.*;
 | 
	
		
			
				|  |  | import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  | import org.slf4j.Logger;
 | 
	
		
			
				|  |  | import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | import org.springframework.scheduling.annotation.Async;
 | 
	
		
			
				|  |  | import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import java.util.Date;
 | 
	
		
			
				|  |  | import java.util.List;
 | 
	
		
			
				|  |  | import java.util.Map;
 | 
	
		
			
				|  |  | import java.util.stream.Collectors;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * Created by yeshijie on 2022/11/18.
 | 
	
		
			
				|  |  |  */
 | 
	
		
			
				|  |  | @Service
 | 
	
		
			
				|  |  | public class ProcessGuidanceService {
 | 
	
		
			
				|  |  |     private static final Logger logger = LoggerFactory.getLogger(ProcessGuidanceService.class);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BasePatientDao patientDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BasePatientProcessGuidanceDao patientProcessGuidanceDao;
 | 
	
		
			
				|  |  |     private BaseProcessGuidanceBookingDao processGuidanceBookingDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BasePatientProcessGuidanceLogDao patientProcessGuidanceLogDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BaseProcessGuidanceDao processGuidanceDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BaseProcessGuidancePresetDao presetDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BaseProcessGuidanceDeptDao deptDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BaseProcessGuidanceThirdPushLogDao thirdPushLogDao;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private BaseProcessGuidanceNodeAppDao nodeAppDao;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public JSONArray findProcessGuidanceList(String patient,Integer isApp){
 | 
	
		
			
				|  |  |         JSONArray jsonArray = new JSONArray();
 | 
	
		
			
				|  |  |         List<BasePatientProcessGuidanceLogDO> logDOList = patientProcessGuidanceLogDao.findByPatientAndTypeAndStatus(patient,1,1);
 | 
	
		
			
				|  |  |         for (BasePatientProcessGuidanceLogDO logDO:logDOList){
 | 
	
		
			
				|  |  |             JSONObject json = new JSONObject();
 | 
	
		
			
				|  |  |             json.put("patient",logDO.getPatient());
 | 
	
		
			
				|  |  |             json.put("nodeCode",logDO.getNodeCode());
 | 
	
		
			
				|  |  |             json.put("code",logDO.getCode());
 | 
	
		
			
				|  |  |             json.put("relationId",logDO.getRelationId());
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             JSONArray presetArray = new JSONArray();
 | 
	
		
			
				|  |  |             List<BaseProcessGuidancePresetDO> presetDOList = presetDao.findByProcessGuidanceId(logDO.getGuidanceId());
 | 
	
		
			
				|  |  |             List<BasePatientProcessGuidanceLogDO> logDOS = patientProcessGuidanceLogDao.findByPatientAndCodeAndType(patient,logDO.getCode(),2);
 | 
	
		
			
				|  |  |             Map<String,BasePatientProcessGuidanceLogDO> logDOMap = logDOS.stream().collect(Collectors.toMap
 | 
	
		
			
				|  |  |                     (BasePatientProcessGuidanceLogDO::getNodeCode,log->log,(oldLog,newLog)->oldLog));
 | 
	
		
			
				|  |  |             for (BaseProcessGuidancePresetDO presetDO:presetDOList){
 | 
	
		
			
				|  |  |                 JSONObject presetJson = new JSONObject();
 | 
	
		
			
				|  |  |                 String processCode = presetDO.getProcessCode();
 | 
	
		
			
				|  |  |                 presetJson.put("processCode", processCode);
 | 
	
		
			
				|  |  |                 presetJson.put("processName", presetDO.getProcessName());
 | 
	
		
			
				|  |  |                 presetJson.put("sortNo", presetDO.getSortNo());
 | 
	
		
			
				|  |  |                 presetJson.put("isOptional", presetDO.getIsOptional());
 | 
	
		
			
				|  |  |                 if(logDOMap.containsKey(processCode)){
 | 
	
		
			
				|  |  |                     presetJson.put("status",1);
 | 
	
		
			
				|  |  |                     BaseProcessGuidanceBookingDO bookingDO = processGuidanceBookingDao.findById(logDOMap.get(processCode).getRelationId()).orElse(null);
 | 
	
		
			
				|  |  |                     presetJson.put("obj", bookingDO);
 | 
	
		
			
				|  |  |                 }else {
 | 
	
		
			
				|  |  |                     presetJson.put("status",0);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |                 if(isApp==1){
 | 
	
		
			
				|  |  |                     List<BaseProcessGuidanceNodeAppDO> appDOS = nodeAppDao.findByNodeCode(processCode);
 | 
	
		
			
				|  |  |                     presetJson.put("appDOS", appDOS);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |                 presetArray.add(presetJson);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             json.put("presetDOList",presetArray);
 | 
	
		
			
				|  |  |             jsonArray.add(json);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return jsonArray;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 医院推送的全流程指引
 | 
	
		
			
				|  |  |      * type 全流程流程类型
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public void sendGuidanceInfo(String jsonData,String type){
 | 
	
		
			
				|  |  |         BasePatientProcessGuidanceDO patientProcessGuidanceDO = JSONObject.parseObject(jsonData, BasePatientProcessGuidanceDO.class);
 | 
	
		
			
				|  |  |         BasePatientDO patientDO = patientDao.findByIdcard(patientProcessGuidanceDO.getIdcard());
 | 
	
		
			
				|  |  |     @Async
 | 
	
		
			
				|  |  |     public void sendGuidanceInfo(String jsonData){
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         BaseProcessGuidanceThirdPushLogDO thirdPushLogDO = JSONObject.parseObject(jsonData, BaseProcessGuidanceThirdPushLogDO.class);
 | 
	
		
			
				|  |  |         String api = thirdPushLogDO.getApi();
 | 
	
		
			
				|  |  |         String param = thirdPushLogDO.getParam();
 | 
	
		
			
				|  |  |         String nodeCode = thirdPushLogDO.getNodeCode();
 | 
	
		
			
				|  |  |         if(StringUtils.isNotBlank(param)&¶m.length()>22000){
 | 
	
		
			
				|  |  |             thirdPushLogDO.setParam(param.substring(0,22000));
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             /**
 | 
	
		
			
				|  |  |              * 根据不同的api调用不同的方法
 | 
	
		
			
				|  |  |              */
 | 
	
		
			
				|  |  |             switch (api){
 | 
	
		
			
				|  |  |                 case "gotoOrg":
 | 
	
		
			
				|  |  |                     gotoOrg(thirdPushLogDO);
 | 
	
		
			
				|  |  |                     break;
 | 
	
		
			
				|  |  |                 default:
 | 
	
		
			
				|  |  |                     logger.info("未找到适配接口");
 | 
	
		
			
				|  |  |                     break;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }catch (Exception e){
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         thirdPushLogDO.setCreateTime(new Date());
 | 
	
		
			
				|  |  |         thirdPushLogDao.save(thirdPushLogDO);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |     public void gotoOrg(BaseProcessGuidanceThirdPushLogDO thirdPushLogDO){
 | 
	
		
			
				|  |  |         BaseProcessGuidanceBookingDO bookingDO = JSONObject.parseObject(thirdPushLogDO.getParam(), BaseProcessGuidanceBookingDO.class);
 | 
	
		
			
				|  |  |         BasePatientDO patientDO = patientDao.findByIdcard(bookingDO.getIdcard());
 | 
	
		
			
				|  |  |         if(patientDO==null){
 | 
	
		
			
				|  |  |             patientProcessGuidanceDO.setPatient(patientDO.getId());
 | 
	
		
			
				|  |  |             bookingDO.setPatient(patientDO.getId());
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         patientProcessGuidanceDO.setCreateTime(new Date());
 | 
	
		
			
				|  |  |         //查找科室对应的流程
 | 
	
		
			
				|  |  |         BaseProcessGuidanceDeptDO deptDO = deptDao.findByDeptCode(patientProcessGuidanceDO.getDeptCode());
 | 
	
		
			
				|  |  |         if(deptDO!=null){
 | 
	
		
			
				|  |  |             patientProcessGuidanceDO.setGuidanceId(deptDO.getProcessGuidanceId());
 | 
	
		
			
				|  |  |         bookingDO.setCreateTime(new Date());
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         List<BaseProcessGuidancePresetDO> presetDOList = presetDao.findByProcessCode(thirdPushLogDO.getNodeCode());
 | 
	
		
			
				|  |  |         if(presetDOList.size()>0){
 | 
	
		
			
				|  |  |             BaseProcessGuidancePresetDO presetDO = presetDOList.get(0);
 | 
	
		
			
				|  |  |             bookingDO.setGuidanceId(presetDO.getProcessGuidanceId());
 | 
	
		
			
				|  |  |             thirdPushLogDO.setGuidanceId(presetDO.getProcessGuidanceId());
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         processGuidanceBookingDao.save(bookingDO);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         patientProcessGuidanceDao.save(patientProcessGuidanceDO);
 | 
	
		
			
				|  |  |         //新增流程开始日志
 | 
	
		
			
				|  |  |         //判断是否唯一的流程标志 暂无
 | 
	
		
			
				|  |  | //            String code = UUID.randomUUID().toString().replace("-", "");
 | 
	
		
			
				|  |  |         String code = bookingDO.getAdmNo();
 | 
	
		
			
				|  |  |         addLog(bookingDO.getPatient(),code, bookingDO.getId(), 1,1,thirdPushLogDO.getNodeCode(),bookingDO.getGuidanceId());
 | 
	
		
			
				|  |  |         //新增流程过程日志
 | 
	
		
			
				|  |  |         addLog(bookingDO.getPatient(),code, bookingDO.getId(), 2,1,thirdPushLogDO.getNodeCode(),bookingDO.getGuidanceId());
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public void addLog(String patient,String code,String relationId,Integer type,Integer status,String nodeCode,String guidanceId){
 | 
	
		
			
				|  |  |         BasePatientProcessGuidanceLogDO logDO = new BasePatientProcessGuidanceLogDO();
 | 
	
		
			
				|  |  |         logDO.setCode(code);
 | 
	
		
			
				|  |  |         logDO.setPatient(patient);
 | 
	
		
			
				|  |  |         logDO.setRelationId(relationId);
 | 
	
		
			
				|  |  |         logDO.setType(type);
 | 
	
		
			
				|  |  |         logDO.setStatus(status);
 | 
	
		
			
				|  |  |         logDO.setGuidanceId(guidanceId);
 | 
	
		
			
				|  |  |         logDO.setNodeCode(nodeCode);
 | 
	
		
			
				|  |  |         logDO.setCreateTime(new Date());
 | 
	
		
			
				|  |  |         patientProcessGuidanceLogDao.save(logDO);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public void sendGuidance(String patient,String type,String orderId) {
 |