Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManagerImpl.java =================================================================== diff -u -r23825 -r23892 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManagerImpl.java (.../OperationReservationManagerImpl.java) (revision 23825) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManagerImpl.java (.../OperationReservationManagerImpl.java) (revision 23892) @@ -58,6 +58,7 @@ import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.json.JSONUtil; import com.forgon.tools.string.StringTools; import com.forgon.tools.util.ForgonDateUtils; @@ -117,18 +118,6 @@ this.supplyRoomConfigManager = supplyRoomConfigManager; } - private volatile static ScheduledExecutorService executorService; - private static ScheduledExecutorService getExecutorService() { - if (executorService == null) { - synchronized (RecyclingApplicationManagerImpl.class) { - if (executorService == null) { - executorService = Executors.newScheduledThreadPool(1); - } - } - } - return executorService; - } - @Override public void saveOrUpdate(String json) { if(StringUtils.isNotBlank(json)){ @@ -500,15 +489,16 @@ Collections.sort(list); return list; } -///////////////同步手术预约单/////////////// + +/*********************************************同步手术预约单****************************************/ /** * 根据手术开始和结束时间,获得未同步的手术预约申请单 */ @Override public List findSyncOperationReservationByTime(Date startDate, Date endDate) { List invoicePlanList = new ArrayList(); if(invoicePlanDao != null){ - invoicePlanList = invoicePlanDao.findHrpInvoicePlanByTimes(startDate,endDate); + invoicePlanList = invoicePlanDao.findSyncOperationReservationByTimes(startDate,endDate); } //过滤申请单 return filterSyncInvoicePlan(invoicePlanList,startDate,endDate); @@ -520,15 +510,15 @@ public List findSyncOperationReservationsItem(String serialNumber){ List serialNumberList = new ArrayList(); serialNumberList.add(serialNumber); - List invoicePlanList = new ArrayList(); + List syncInvoicePlanList = new ArrayList(); List OperationUseTousseItemList = new ArrayList(); //1.根据单号获得手术预约申请单VO if(invoicePlanDao != null){ - invoicePlanList = Arrays.asList(invoicePlanDao.findHrpInvoicePlanpListByAppliedSerialNumbers(serialNumberList)); + syncInvoicePlanList = invoicePlanDao.findSyncOperationReservationBySerialNumbers(serialNumberList); } //2.根据同步手术预约单VO的手术名称获得使用器械包明细集合 - if(CollectionUtils.isNotEmpty(invoicePlanList)){ - HrpInvoicePlan syncOperationReservation = invoicePlanList.get(0); + if(CollectionUtils.isNotEmpty(syncInvoicePlanList)){ + HrpInvoicePlan syncOperationReservation = syncInvoicePlanList.get(0); OperationUseTousseItemList = getOperationeTousseItemByoperationName(syncOperationReservation.getOperationName()); } return OperationUseTousseItemList; @@ -540,82 +530,73 @@ @Override public JSONObject syncOperationReservation(List serialNumberList) { JSONObject resultObject = new JSONObject(); - List invoicePlanList = new ArrayList(); + List syncInvoicePlanList = new ArrayList(); //1.根据单号集合获得手术预约申请单VO if(invoicePlanDao != null){ - invoicePlanList = Arrays.asList(invoicePlanDao.findHrpInvoicePlanpListByAppliedSerialNumbers(serialNumberList)); + syncInvoicePlanList = invoicePlanDao.findSyncOperationReservationBySerialNumbers(serialNumberList); } //2.同步手术预约单 - resultObject = syncAndSaveOperationReservation(invoicePlanList); + resultObject = syncAndSaveOperationReservation(syncInvoicePlanList); return resultObject; } - - /** - * 定时同步手术预约单 - * @param start timer.xml的Argument设置的过滤开始时间条件参数 - * @param end timer.xml的Argument设置的过滤结束条件参数 - */ + + /********************* 定时同步手术预约单****************************/ @Override public void timingSyncOperationReservation(String startArgument,String endArgument) { - getExecutorService().schedule(new Runnable() { - @Override - public void run() { - try { - Date date=new Date(); - SimpleDateFormat sdf=new SimpleDateFormat(DateTools.COMMON_DATE_HM); - String defatultTime=sdf.format(date); - Calendar startTime = Calendar.getInstance(); - Calendar endTime = Calendar.getInstance(); - logger.info("开始手术预约申请单定时同步 :定时器获得参数"+startArgument+"和"+endArgument); - //1 根据timer.xml的Argument参数调整查询的时间段 - if(StringUtils.isNotBlank(startArgument) && StringUtils.isNotBlank(endArgument)){ - String[] startArgumentArray = startArgument.split(":");//开始申请时间的过滤参数 - String[] endArgumentArray = endArgument.split(":");//结束申请时间的过滤参数 - if(startArgumentArray.length == 3 && endArgumentArray.length ==3){ - //1-1 检查设定过滤时间的参数形式是否按规则 - checkSyncTimeArgumentArray(startArgumentArray,startArgument); - checkSyncTimeArgumentArray(endArgumentArray,endArgument); - //按照参数设定过滤手术预约申请单的时间段 - startTime.setTime(ForgonDateUtils.safelyParseDate(defatultTime)); - endTime.setTime(ForgonDateUtils.safelyParseDate(defatultTime)); - //1-2 设定过滤手术预约申请单的:开始申请时间 - setTimeByArgumentArray(startTime,startArgumentArray,defatultTime); - //1-3 设定过滤手术预约申请单的:结束申请时间 - setTimeByArgumentArray(endTime,endArgumentArray,defatultTime); - }else{ - throw new RuntimeException("Time.xml定时参数不正确!:"+startArgument+"和"+endArgument); - } - }else{ - //默认设定查询的时间为昨天到今天 - startTime.setTime(ForgonDateUtils.safelyParseDate(defatultTime)); - startTime.set(Calendar.DATE,startTime.get(Calendar.DATE)-1); - startTime.set(Calendar.HOUR_OF_DAY, 0); - startTime.set(Calendar.MINUTE, 0); - - endTime.setTime(ForgonDateUtils.safelyParseDate(defatultTime)); - endTime.set(Calendar.HOUR_OF_DAY, 23); - endTime.set(Calendar.MINUTE, 59); - endTime.set(Calendar.SECOND, 59); - } - if(startTime.getTime().compareTo(endTime.getTime()) > 0 ){ - throw new RuntimeException("开始过滤时间不能大于结束时间! 同步的过滤时间段为: "+startTime.getTime()+"至"+endTime.getTime()); - } - logger.info("开始手术预约申请单定时同步 :同步的过滤时间段为: "+startTime.getTime()+"至"+endTime.getTime()); - //2 根据时间过滤获得:同步手术预约申请单VO的集合 - List syncOperationReservationList = new ArrayList(); - if(invoicePlanDao != null){ - List operationReservationList = invoicePlanDao.findHrpInvoicePlanByTimes(startTime.getTime(),endTime.getTime()); - //过滤已申请的申请单号 - syncOperationReservationList = filterSyncInvoicePlan(operationReservationList,startTime.getTime(),endTime.getTime()); - } - //3 开始同步 - syncAndSaveOperationReservation(syncOperationReservationList); - } catch (Exception e) { - logger.info("手术预约申请单定时同步失败"); - e.printStackTrace(); + try { + Date date=new Date(); + SimpleDateFormat sdf=new SimpleDateFormat(DateTools.COMMON_DATE_HM); + String defatultTime=sdf.format(date); + Calendar startTime = Calendar.getInstance(); + Calendar endTime = Calendar.getInstance(); + logger.info("开始手术预约申请单定时同步 :定时器获得参数"+startArgument+"和"+endArgument); + //1 根据timer.xml的Argument参数调整查询的时间段 + if(StringUtils.isNotBlank(startArgument) && StringUtils.isNotBlank(endArgument)){ + String[] startArgumentArray = startArgument.split(":");//开始申请时间的过滤参数 + String[] endArgumentArray = endArgument.split(":");//结束申请时间的过滤参数 + if(startArgumentArray.length == 3 && endArgumentArray.length ==3){ + //1-1 检查设定过滤时间的参数形式是否按规则 + checkSyncTimeArgumentArray(startArgumentArray,startArgument); + checkSyncTimeArgumentArray(endArgumentArray,endArgument); + //按照参数设定过滤手术预约申请单的时间段 + startTime.setTime(ForgonDateUtils.safelyParseDate(defatultTime)); + endTime.setTime(ForgonDateUtils.safelyParseDate(defatultTime)); + //1-2 设定过滤手术预约申请单的:开始手术时间 + setTimeByArgumentArray(startTime,startArgumentArray,defatultTime); + //1-3 设定过滤手术预约申请单的:结束手术时间 + setTimeByArgumentArray(endTime,endArgumentArray,defatultTime); + }else{ + throw new RuntimeException("Time.xml定时参数不正确!:"+startArgument+"和"+endArgument); } + }else{ + //默认设定查询的时间为昨天到今天 + startTime.setTime(ForgonDateUtils.safelyParseDate(defatultTime)); + startTime.set(Calendar.DATE,startTime.get(Calendar.DATE)-1); + startTime.set(Calendar.HOUR_OF_DAY, 0); + startTime.set(Calendar.MINUTE, 0); + + endTime.setTime(ForgonDateUtils.safelyParseDate(defatultTime)); + endTime.set(Calendar.HOUR_OF_DAY, 23); + endTime.set(Calendar.MINUTE, 59); + endTime.set(Calendar.SECOND, 59); } - }, 5, TimeUnit.SECONDS); + if(startTime.getTime().compareTo(endTime.getTime()) > 0 ){ + throw new RuntimeException("开始过滤时间不能大于结束时间! 同步的过滤时间段为: "+startTime.getTime()+"至"+endTime.getTime()); + } + logger.info("开始手术预约申请单定时同步 :同步的过滤时间段为: "+startTime.getTime()+"至"+endTime.getTime()); + List syncOperationReservationList = new ArrayList(); + if(CollectionUtils.isNotEmpty(syncOperationReservationList)){ + //2 根据手术时间过滤获得:同步手术预约申请单VO的集合 + List operationReservationList = invoicePlanDao.findSyncOperationReservationByTimes(startTime.getTime(),endTime.getTime()); + //过滤已申请的申请单号 + syncOperationReservationList = filterSyncInvoicePlan(operationReservationList,startTime.getTime(),endTime.getTime()); + //3 开始同步 + syncAndSaveOperationReservation(syncOperationReservationList); + } + } catch (Exception e) { + logger.info("手术预约申请单定时同步失败"); + e.printStackTrace(); + } } /** @@ -674,8 +655,8 @@ calendarTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArgumentArray[1]));//第二个参数为:时 calendarTime.set(Calendar.MINUTE, Integer.parseInt(timeArgumentArray[2]));//第三个参数为:分 } - - +/***********************************************/ + /** * 同步手术预约单 * @param invoicePlanList 同步申请单vo集合 @@ -745,7 +726,7 @@ resetOperationUseTousseItem(operationReservation); //4.保存手术预约单 objectDao.saveOrUpdate(operationReservation); - successDetail.add(operationName+"手术预约单同步成功"); + successDetail.add("申请单号为:"+serialNumber+"手术预约单同步成功"); } catch (Exception e) { logger.info("申请单号为:"+serialNumber+"手术预约申请单同步失败"); e.printStackTrace(); @@ -760,7 +741,7 @@ resultObject.put("successDetail", successDetail.toString()); resultObject.put("failureCount", failureDetail.size()); resultObject.put("failureDetail", failureDetail.toString()); - appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_SYNC, Log.TYPE_ADD, resultObject); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_SYNC, Log.TYPE_ADD, "手术预约申请单同步:"+resultObject); logger.debug("手术预约申请单同步:"+resultObject); } return resultObject; @@ -829,16 +810,17 @@ ListoperationNameList = new ArrayList(); String operationName = operation;//手术预约单手术名字 boolean isHaveSecondOperationName = false;//手术单手术名 是否由多个手术名合拼 +// boolean useSecondOperationName = false;//是否取第二手术名称 //手术名通过"+"分割 String[] operationArray = operationName.split("\\+"); - //1. 如果手术名称包含"+"时则有多个手术名称 + //1、 如果手术名称包含"+"时则有多个手术名称 if(operationArray.length > 0){ //2-1样式:手术1【+手术2】 if(operationArray.length == 2 && operationName.indexOf("【") != -1 && operationName.indexOf("】") != -1){ operationNameList.add(StringUtils.substringBefore(operationName, "【")); //第一手术名称 operationNameList.add(StringUtils.substring(operationName,operation.indexOf("+")+1,operation.indexOf("】"))); //第二手术名称 isHaveSecondOperationName = true; - }//2-2样式:手术1+手术2/手术1+手术2+手术3 + }//2-2样式:手术1+手术2+手术名3+。。。。 else if(operationArray.length >= 2){ for(int i = 0; i < operationArray.length; i++){ operationNameList.add(operationArray[i]); @@ -850,41 +832,54 @@ //1-1样式: 手术1【xxx】 if(operationName.indexOf("【") != -1 && operationName.indexOf("】") != -1){ String oName = StringUtils.substringBefore(operationName, "【");//手术名为【前 - operationNameObject = (OperationName)objectDao.getByProperty(OperationName.class.getSimpleName(), "operationName", oName); - if(operationNameObject == null){ - throw new RuntimeException("手术:"+operation+",获取不到手术名为:"+oName+"的手术名称对象定义!"); - } + operationNameObject = getOperationNameByName(operation,oName); operationUseTousseItemList = operationNameObject.getAllTousseItemsMergeByTousseDefinition(objectDao); }else{ //1-2样式:手术1 - operationNameObject = (OperationName)objectDao.getByProperty(OperationName.class.getSimpleName(), "operationName", operationName); - if(operationNameObject == null){ - throw new RuntimeException("获取不到手术名为:"+operation+"的手术名称对象定义!"); - } + operationNameObject = getOperationNameByName(operation,operationName); operationUseTousseItemList = operationNameObject.getAllTousseItemsMergeByTousseDefinition(objectDao); } } - //2. 有多个手术名称:则合拼多个手术名称下手术器械包明细下 相同的物品 + //2、 若有多个手术名称:则合拼多个手术名称下手术器械包明细下 相同的物品 if(isHaveSecondOperationName && operationNameList.size()>1){ List oNameObjectList = new ArrayList();//手术名称对象集合 - for (int i = 0; i < operationNameList.size(); i++) { - //通过手术名获得手术名称对象 - OperationName oNameObject = (OperationName)objectDao.getByProperty(OperationName.class.getSimpleName(), "operationName", operationNameList.get(i)); - if(oNameObject == null){ - throw new RuntimeException("手术:"+operation+",获取不到手术名为:"+operationNameList.get(i)+"的手术名称对象定义!"); + //获取第一个手术名称 + OperationName firstONameObject = getOperationNameByName(operation,operationNameList.get(0)); + //2-1、样式:手术1+手术2。若第一个手术名称的配置是要读取第二个手术名称的物品。则只获得第二手术使用器械包明细集合(常用物品与追加物品合并后的物品项) + if(firstONameObject != null && StringUtils.equals(Constants.STR_YES, firstONameObject.getUseSecondOperationItems())){ + OperationName secondONameObject = getOperationNameByName(operation,operationNameList.get(1)); + operationUseTousseItemList = secondONameObject.getAllTousseItemsMergeByTousseDefinition(objectDao); + }else{//2-2、 合拼多个手术名称下手术器械包明细下 相同的物品 + for (int i = 0; i < operationNameList.size(); i++) { + //通过手术名获得手术名称对象 + OperationName oNameObject = getOperationNameByName(operation,operationNameList.get(i)); + oNameObjectList.add(oNameObject); } - oNameObjectList.add(oNameObject); + //手术名称id集合 + ListoNameIdList = oNameObjectList.stream().map(OperationName::getId).collect(Collectors.toList()); + //合拼多个手术名称下手术器械包明细下 相同的物品 + operationUseTousseItemList = getAllTousseItemsMergeByoperationNameId(oNameIdList); } - //手术名称id集合 - ListoNameIdList = oNameObjectList.stream().map(OperationName::getId).collect(Collectors.toList()); - //合拼多个手术名称下手术器械包明细下 相同的物品 - operationUseTousseItemList = getAllTousseItemsMergeByoperationNameId(oNameIdList); } } return operationUseTousseItemList; } /** + * 根据手术名获取手术名对象 + * @param operation 同步单的手术名(可能有拼接) + * @param operationName 需要获取对象的手术名 + * @return + */ + private OperationName getOperationNameByName(String operation,String operationName){ + OperationName operationNameObject = (OperationName)objectDao.getByProperty(OperationName.class.getSimpleName(), "operationName",operationName ); + if(null == operationNameObject){ + throw new RuntimeException("手术:"+operation+",获取不到手术名为:'"+operationName+"'的手术名称对象!"); + } + return operationNameObject; + } + + /** * 合拼不同手术名称下手术器械包明细下 相同的物品的数量 * 1.合并“常用物品”和“追加物品”里面配置的相同的物品 * 2.多个手术名称下器械包明细有相同的物品, Index: ssts-web/src/main/resources/config/gzszyy/mybatis/SyncOperationReservation_Mapper.xml =================================================================== diff -u -r23096 -r23892 --- ssts-web/src/main/resources/config/gzszyy/mybatis/SyncOperationReservation_Mapper.xml (.../SyncOperationReservation_Mapper.xml) (revision 23096) +++ ssts-web/src/main/resources/config/gzszyy/mybatis/SyncOperationReservation_Mapper.xml (.../SyncOperationReservation_Mapper.xml) (revision 23892) @@ -20,7 +20,7 @@ - - - - - - groupByConsoleName( Collection operationReservations); -////同步手术预约单(暂时针对贵港市人民医院)//// +/*************************同步手术预约单************************************/ /** * 根据手术开始和结束时间,获得未同步的手术预约申请单 * @param startDate @@ -80,8 +80,8 @@ /** * 定时同步手术预约单 - * @param start timer.xml的Argument设置的过滤开始时间条件参数 - * @param end timer.xml的Argument设置的过滤结束时间条件参数 + * @param startArgument timer.xml的Argument设置的过滤手术开始时间条件参数 + * @param endArgument timer.xml的Argument设置的过滤手术结束时间条件参数 */ - public void timingSyncOperationReservation(String start,String end); + public void timingSyncOperationReservation(String startArgument,String endArgument); } Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/InvoicePlanDao.java =================================================================== diff -u -r22962 -r23892 --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/InvoicePlanDao.java (.../InvoicePlanDao.java) (revision 22962) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/InvoicePlanDao.java (.../InvoicePlanDao.java) (revision 23892) @@ -31,7 +31,7 @@ public static final String RECORD_STATE_ERROR = "error"; /** - * 按时间,分页,申请单单号,查找申请单 + * 按时间,分页,申请单单号,查找一次性物品申请单 * @param startDate * @param endDate * @param pagesize @@ -68,20 +68,20 @@ List serialNumbers ); /** - * 根据申请单号,获得申请单明细 + * 根据申请单号,获得一次性物品申请单明细 * @param serialNumber * @return */ HrpTousseItem[] findTousseItemBySerialNumber(String serialNumber); /** - * 根据申请单号,获得申请单 + * 根据申请单号,获得一次性物品申请单 * @param serialNumber * @return */ HrpInvoicePlan findHrpInvoicePlanBySerialNumber(String serialNumber); /** - * 按时间,申请单单号,查找申请单 + * 按时间,申请单单号,查找一次性物品申请单 * @param startDate * @param endDate * @param serialNumbers @@ -97,7 +97,7 @@ ); /** - * 按时间,查找申请单(可包含明细) + * 按时间,查找一次性物品申请单(可包含明细) * @param startDate * @param endDate * @return @@ -110,30 +110,55 @@ ); /** - * 按申请单号集合,查找申请单(可包含明细) + * 时间,申请科室编码,查找一次性物品申请单(可包含明细) + * @param startDate + * @param endDate + * @param departCoding + * @return + */ + List findHrpInvoicePlanByTimeAndDepartCoding( + @Param("startDate") + Date startDate, + @Param("endDate") + Date endDate, + @Param("departCoding") + String departCoding + ); + + /** + * 按申请单号集合,查找一次性物品申请单(可包含明细) * @param serialNumbers * @return */ HrpInvoicePlan[] findHrpInvoicePlanpListByAppliedSerialNumbers( @Param("serialNumbers") List serialNumbers ); - + + /**************手术预约申请单************************/ /** - * 时间,申请科室编码,查找申请单(可包含明细) + * 按申请单号集合,查找手术预约申请单(可包含明细) + * @param serialNumbers + * @return + */ + List findSyncOperationReservationBySerialNumbers( + @Param("serialNumbers") + List serialNumbers + ); + + /** + * 按时间,查找手术预约申请单(可包含明细) * @param startDate * @param endDate - * @param departCoding * @return */ - List findHrpInvoicePlanByTimeAndDepartCoding( + List findSyncOperationReservationByTimes( @Param("startDate") Date startDate, @Param("endDate") - Date endDate, - @Param("departCoding") - String departCoding + Date endDate ); + /*************************************************/ /** * 按时间,同步状态,查找申请单