Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java =================================================================== diff -u -r34348 -r34357 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 34348) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 34357) @@ -34,7 +34,6 @@ import org.apache.commons.collections4.functors.NotNullPredicate; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.log4j.Logger; @@ -45,6 +44,7 @@ import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; +import com.forgon.directory.model.CssdHandleTousses; import com.forgon.directory.model.OrgUnit; import com.forgon.directory.service.OrgUnitManager; import com.forgon.directory.vo.LoginUserData; @@ -96,6 +96,8 @@ import com.forgon.disinfectsystem.entity.urgent.UrgentLevel; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import com.forgon.disinfectsystem.goodFilterConfig.service.GoodFilterConfigManager; import com.forgon.disinfectsystem.goodsBindingConfig.entity.GoodsBindingConfig; import com.forgon.disinfectsystem.idpredicate.IDOperators; import com.forgon.disinfectsystem.packing.service.PackingManager; @@ -113,6 +115,7 @@ import com.forgon.disinfectsystem.recyclingapplication.vo.TousseItemVoForApplicationGoodsVo; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.GoodsBindingConfigManager; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionHelper; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.tousseitem.service.TousseItemManager; @@ -125,6 +128,7 @@ import com.forgon.exception.SystemException; import com.forgon.exception.UnreachableException; import com.forgon.log.enums.ApplicationLogStatusEnum; +import com.forgon.security.model.User; import com.forgon.strategyMode.DateStrategyContext; import com.forgon.systemsetting.model.HttpOption; import com.forgon.systemsetting.service.HttpOptionManager; @@ -202,6 +206,12 @@ private ProjectManager projectManager; private BarcodeManager barcodeManager; + + private GoodFilterConfigManager goodFilterConfigManagerImpl; + + public void setGoodFilterConfigManagerImpl(GoodFilterConfigManager goodFilterConfigManagerImpl) { + this.goodFilterConfigManagerImpl = goodFilterConfigManagerImpl; + } public void setBarcodeManager(BarcodeManager barcodeManager) { this.barcodeManager = barcodeManager; @@ -3186,8 +3196,9 @@ if(StringUtils.isNotBlank(barcode)){ BarcodeDevice barcodeDevice = barcodeManager.getBarcodeByBarcode(barcode); + String errorBarcodeMessage = "该条码非指定类型条码,请重新扫码"; if(barcodeDevice == null){ - throw new SystemException("请扫描手术间条码、科室条码、标识牌条码"); + throw new SystemException(errorBarcodeMessage); } if(barcodeDevice != null){ @@ -3212,8 +3223,14 @@ if(IDCardDefinition != null){ sql += " and po.id in (select invoicePlan.id from TousseItem where ancestorID =" + IDCardDefinition.getTousseDefinitionID() + ") "; } + }else if(barcodeDevice instanceof TousseInstance){ + //包实例条码 + TousseInstance tousseInstance = (TousseInstance) barcodeDevice; + if(DatabaseUtil.isPoIdValid(tousseInstance.getInvoicePlanID())){ + sql += " and po.id = " + tousseInstance.getInvoicePlanID(); + } }else{ - throw new SystemException("请扫描手术间条码、科室条码、标识牌条码"); + throw new SystemException(errorBarcodeMessage); } } } @@ -3267,14 +3284,203 @@ return tousseItemList; } + @SuppressWarnings("unchecked") @Override public JSONObject getUserOrTousseDefinitionJsonByInvoicePlanAndBarcode( Long invoicePlanId, String barcode) { - // TODO Auto-generated method stub + if(StringUtils.isNotBlank(barcode)){ + BarcodeDevice barcodeDevice = barcodeManager.getBarcodeByBarcode(barcode); + + if(barcodeDevice == null){ + throw new SystemException("条码不存在!"); + } + + if(barcodeDevice instanceof User){ + User user = (User) barcodeDevice; + JSONObject result = JSONUtil.buildJsonObject(true); + result.put("type", "用户"); + JSONObject userJson = new JSONObject(); + userJson.put("fullName", user.getFullName()); + result.put("data", userJson); + return result; + }else { + String errorBarcodeMessage = "找不到对应的器械包,请确认条码类型是否为器械包条码"; + if(!DatabaseUtil.isPoIdValid(invoicePlanId)){ + throw new SystemException("申请单ID不能为空!"); + } + InvoicePlan invoicePlan = (InvoicePlan) objectDao.getById(InvoicePlan.class.getSimpleName(), invoicePlanId); + if(invoicePlan == null){ + throw new SystemException("申请单不能存在!"); + } + + if(invoicePlan.isForeignTousseAppliaction()){ + throw new SystemException("外来器械回收单不能添加器械包!"); + } + + if(invoicePlan.isCustomerTousseApplication()){ + throw new SystemException("自定义器械包申请单不能添加器械包!"); + } + + if(StringUtils.equals(invoicePlan.getType(), InvoicePlan.TYPE_QUALITY_MONITOR_RECYCLE_APPLICATION)){ + throw new SystemException("质量监测回收申请单不允许添加新的物品,只能回收申请单中的物品!"); + } + + if(StringUtils.equals(invoicePlan.getType(), InvoicePlan.TYPE_APPLYING_FOR_RETURN_FORM)){ + throw new SystemException("申请还物单不允许添加新的物品,只能回收申请单中的物品!"); + } + + if(!(invoicePlan.recyclingStatusAwaitRecycle() + || invoicePlan.recyclingSTatusPartRecycle() + || StringUtils.equals(invoicePlan.getRecyclingStatus(), InvoicePlan.RECYCLINGSTATUS_AWAITRECEIVE) + || StringUtils.equals(invoicePlan.getRecyclingStatus(), InvoicePlan.RECYCLINGSTATUS_PARTAWAITRECEIVE) + || invoicePlan.recyclingstatusTallied()) + || invoicePlan.getIncludeRecyclingItems() == 0){ + throw new SystemException("当前申请单不需要回收!"); + } + + + boolean restrictAddOtherGoodsToApplicationFromUseRecord = + ConfigUtils.getSystemSetConfigByNameBool("restrictAddOtherGoodsToApplicationFromUseRecord", false); + if(restrictAddOtherGoodsToApplicationFromUseRecord){ + if(invoicePlan instanceof RecyclingApplication){ + RecyclingApplication recyclingApplication = (RecyclingApplication) invoicePlan; + if(recyclingApplication.getUseRecord() != null){ + throw new SystemException("使用记录转换的申请单不能添加器械包!"); + } + } + } + + TousseDefinition tousseDefinition = null; + if(barcodeDevice instanceof IDCardInstance){ + //标识牌条码 + IDCardInstance IDCardInstance = (IDCardInstance) barcodeDevice; + IDCardDefinition IDCardDefinition = IDCardInstance.getIDCardDefinition(objectDao); + if(IDCardDefinition != null){ + Long tousseDefinitonId = IDCardDefinition.getTousseDefinitionID(); + tousseDefinition = tousseDefinitionManager.get(tousseDefinitonId); + } + }else if(barcodeDevice instanceof TousseInstance){ + //包实例条码/固定条码 + TousseInstance tousseInstance = (TousseInstance) barcodeDevice; + tousseDefinition = tousseInstance.getTousseDefinition(); + }else{ + throw new SystemException(errorBarcodeMessage); + } + + if(tousseDefinition == null){ + throw new SystemException(errorBarcodeMessage); + } + + if(invoicePlan.isTousseAppliaction() + || invoicePlan.isDisinfectGoodsAppliaction() + || invoicePlan.isCommboAppliaction()){ + + Long tousseDefinitonId = tousseDefinition.getAncestorID(); + + //根据申请单类型确定器械包类型 + TousseDefinitionHelper tousseDefinitionHelper = TousseDefinitionHelper.getInstance(); + tousseDefinitionHelper.setTousseDefinitionManager(tousseDefinitionManager); + String tousseType = tousseDefinitionHelper.setGoodTypeByFormType(invoicePlan.getType()); + Set predicates = tousseDefinitionHelper.getPredicates(tousseType); + + //开启器械包黑白名单过滤 + String appIsUseBwList = CssdUtils.getSystemSetConfigByName("appIsUseBwList"); + if (StringUtils.isNotBlank(appIsUseBwList) && "true".equals(appIsUseBwList)){ + List whiteList = goodFilterConfigManagerImpl.findFilterGoodByType(ListType.WHITE, invoicePlan.getDepartCoding()); + List blackList = goodFilterConfigManagerImpl.findFilterGoodByType(ListType.BLACK, invoicePlan.getDepartCoding()); + if(CollectionUtils.isNotEmpty(whiteList)){ + if (CollectionUtils.isNotEmpty(blackList)) { + //如果黑白名单不为空,则用白名单减去黑名单 + whiteList = (List) CollectionUtils.subtract(whiteList, blackList); + } + if (whiteList.size() == 0) { + if(blackList.contains(tousseDefinitonId)){ + throw new SystemException("【" + tousseDefinition.getName() + "】不能被添加!"); + } + } + if(!whiteList.contains(tousseDefinitonId)){ + throw new SystemException("【" + tousseDefinition.getName() + "】不能被添加!"); + } + } + //如果只有黑名单,则用黑名单过滤 + if (CollectionUtils.isEmpty(whiteList) && CollectionUtils.isNotEmpty(blackList)) { + if(blackList.contains(tousseDefinitonId)){ + throw new SystemException("【" + tousseDefinition.getName() + "】不能被添加!"); + } + } + } + + String sql = " po.id = " + tousseDefinitonId; + //判断是否查询需要回收的器械包 + boolean showNonRecyclableTousseInRecycle = CssdUtils.getSystemSetConfigByNameBool("showNonRecyclableTousseInRecycle", false); + if (!showNonRecyclableTousseInRecycle){ + sql += " and po.isRecycling = '"+TousseDefinition.STR_YES+"' "; + } + + sql += " and po.forDisplay = 1 ";//自己生成的包定义不显示 + //供应室处理器械包关联配置 + sql += " and po.ancestorID in (select tousseDefinitionId from " + CssdHandleTousses.class.getSimpleName() + + " where orgUnitCode='"+ invoicePlan.getHandleDepartCoding() +"')"; + sql += " and po.isDisable != '" + TousseDefinition.STR_YES + "' "; + + //判断当前科室是否是供应室 不过滤供应室 + boolean isFirstOrSecondSupplyRoomOrgUnit = supplyRoomConfigManager.isFirstOrSecondSupplyRoomOrgUnit(invoicePlan.getHandleDepartCoding()); + if(!isFirstOrSecondSupplyRoomOrgUnit){//只查询归属本科室的包 + sql = String.format(" %s and ((po.id in (select distinct tousseDefinitionId from TousseDefinitionBelongDepart where orgUnitCoding='%s'))" + + " or " + + "(po.id not in (select distinct tousseDefinitionId from TousseDefinitionBelongDepart)))", sql, invoicePlan.getDepartCoding()); + } + + if(!predicates.isEmpty()){ + for (String predicate : predicates) { + sql += " and " + predicate; + } + }else{ + // 排除外部代理灭菌和外来器械拆分小包 + sql += (" and po.tousseType != '" + + TousseDefinition.PACKAGE_TYPE_SPLIT + + "' and po.tousseType != '" + + TousseDefinition.PACKAGE_TYPE_FOREIGNPROXY + "'"); + sql += (" and po.tousseType != '" + + TousseDefinition.PACKAGE_TYPE_CUSTOM + "'"); + sql += (" and po.tousseType != '" + + TousseDefinition.PACKAGE_TYPE_FOREIGN + "'"); + } + List tousseDefinitionList = tousseDefinitionManager.getByHql(sql); + if(CollectionUtils.isEmpty(tousseDefinitionList)){ + throw new SystemException("【" + tousseDefinition.getName() + "】不能被添加!"); + } + tousseDefinition = tousseDefinitionList.get(0); + }else{ + throw new SystemException("【" + invoicePlan.getType() + "】不允许添加新的物品,只能回收申请单中的物品!"); + } + return buildTousseDefinitionJson(tousseDefinition); + } + + } return null; } /** + * {success:true,type:"器械包",data:{tousseName:"器械包名称",defineId:"包定义id",type:"器械包" + * ,applyEntireTousse:"是否整包申请",materialInstancesJsonArray:"材料清单json"} + * @param tousseDefinition + * @return + */ + private JSONObject buildTousseDefinitionJson(TousseDefinition tousseDefinition) { + JSONObject result = JSONUtil.buildJsonObject(true); + result.put("type", BarcodeDevice.BARCODE_TYPE_PACKAGE); + JSONObject data = new JSONObject(); + data.put("tousseName", tousseDefinition.getName()); + data.put("defineId", tousseDefinition.getId()); + data.put("type", tousseDefinition.getTousseType()); + data.put("applyEntireTousse", tousseDefinition.getIsApplyEntireTousse()); + data.put("materialInstancesJsonArray", tousseDefinition.getMaterialInstancesJsonArray()); + result.put("data", data); + return result; + } + + /** * 按照器械包种类排序编号排序(当一个器械包同时属于多个种类时,排序号取所属种类中的最小序号排列) * @param tousseItemList * @return @@ -3310,13 +3516,16 @@ List tiList = tousseItemIDMap.get(ancestorID); if(tiList != null){ sortTousseItems.addAll(tiList); + tousseItemList.removeAll(tiList); } } } catch (Exception e) { e.printStackTrace(); } finally { DatabaseUtil.closeResultSetAndStatement(rs); } + sortTousseItems.addAll(tousseItemList); + return sortTousseItems; }