Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java =================================================================== diff -u -r41005 -r41030 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 41005) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 41030) @@ -28,6 +28,7 @@ import org.apache.commons.collections.MapUtils; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.jdbc.core.BatchPreparedStatementSetter; @@ -473,13 +474,17 @@ //校验扫描及发货提交的包实例条码是否符合是否追溯与固定与唯一条码规则(大原则:追溯->唯一条码、不追溯->固定条码规则) validateTousseInstanceIsTraceableFixedBarcodeForInvoice(tousseInstance); TousseDefinition td = tousseInstance.getTousseDefinition(); + //首先校验包实例的所属仓库id与该发货的供应室的源仓库id是否一致(正常情只要是追溯的包实例都需要校验) + if(td.traceable() && !ObjectUtils.equals(sourceWarehouseId, tousseInstance.getWareHouseId())){ + throw new SystemException(String.format("条码为%s的%s的所属仓库与发货的来源仓库不一致", tousseInstance.getBarcode(), tousseInstance.getTousseName())); + } //代理灭菌单id Long proxyDisinfectionId = tousseInstance.getProxyDisinfection_id(); //对应的申请单id(对于外来器械申请单、自定义器械申请单、外部代理灭菌单) Long invoicePlanIdOfTi = tousseInstance.getInvoiceTargetInovicePlanId(); - //1.是否为代理灭菌的包且用于一次发货 + //1.是否为代理灭菌的包 if(DatabaseUtil.isPoIdValid(proxyDisinfectionId)){ - //如果invoice_id字段不为空,则表示已经发过货,本次用于第二次发货(按) + //(1).一次发货时,如果invoice_id字段为空,则表示未发过货 if(!DatabaseUtil.isPoIdValid(tousseInstance.getInvoice_id())){ //否则如果invoice_id字段为空,则表示还未发过货,只能发至对应的代理灭菌单 List tousseInstanceList = @@ -492,6 +497,8 @@ //如果是代理灭菌的包为第一次发货,则不再往下走,continue return; } + //(2).二次发货时,即如果invoice_id字段不为空,则表示已经发过货,待完善 + } if (td.isForeignTousse()){ Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r40865 -r41030 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 40865) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 41030) @@ -8160,6 +8160,7 @@ /** * 将包实例集合转换为json数组。需要过滤掉代理灭菌单及限制发货科室后不满足发货条件的包实例 + * (从方法名上看这是一个构造数据结果的方法,竟然都有这么多过滤的业务逻辑,真是刷新了我的认知,但从保稳的角度,还是不能轻易去掉) * @param tousseInstances * @param departCodeOfInvoicePlan * @return @@ -8171,10 +8172,11 @@ return datasJSONArray; } String groupBy = InvoiceUtils.getInvoiceGroupByConfig(); - //过滤掉代理灭菌单及限制发货科室后不满足发货条件的包实例及聚合包子包实例后得到最后需要返回的包实例 + //过滤掉代理灭菌单及限制发货科室后不满足发货条件的包实例及聚合包子包实例后得到最后需要返回的包实例(代理灭菌的一次发货可以是这样过滤,而二次发货就不能再这样过滤了) List tiList = tousseInstances.stream().filter(tousseInstance -> { Long pdid = tousseInstance.getProxyDisinfection_id(); - if (pdid != null) { + //如果包实例未发过货且为代理灭菌的包实例,则需要判断对应的代理灭菌单是否已发货或已终止 + if (!DatabaseUtil.isPoIdValid(tousseInstance.getInvoice_id()) && pdid != null) { ProxyDisinfection pd = (ProxyDisinfection) objectDao .getByProperty(ProxyDisinfection.class.getSimpleName(), "id", pdid); @@ -8891,7 +8893,7 @@ if(Container.CONTAINER_PURPOSE_DISINFECTION.equals(((Container) barcodeDevice).getPurpose())){ // 容器(整筐发货),针对灭菌篮筐(单个)的处理 Map multiResult = loadSterilizeBasketInsideTousseInstance( - barcode, departCodeOfInvoicePlan,invoiceType); + barcode, sourceWarehouseId, departCodeOfInvoicePlan,invoiceType); boolean success = (Boolean) multiResult.get("success"); if (!success) { String errorMsg = (String) multiResult.get("error"); @@ -9255,7 +9257,7 @@ filterTousseInstanceByInvoiceType(invoiceType, tousseInstanceList); if(CollectionUtils.isNotEmpty(tousseInstanceList)){ //只保留状态为已灭菌及已消毒的包实例、并按所属仓库 - tousseInstanceList = filterTousseInstanceListOfSetCode(tousseInstanceList, params.get("extraParam").getAsJsonObject().get("sourceWarehouseId").getAsLong()); + tousseInstanceList = filterTousseInstanceListOfSetCode(tousseInstanceList, sourceWarehouseId); if(CollectionUtils.isNotEmpty(tousseInstanceList)){ //判断可追溯的复用性物品发货时优先发回原申请单模式(DGSETYY-80) Map invoiceParamsMap = new HashMap(); @@ -10591,12 +10593,13 @@ /** * 根据篮筐条码及部门编码查询器械包实例 * @param barcode 灭菌篮筐条码 - * @param departCodeOfInvoicePlan + * @param departCodeOfInvoicePlan 要发的申请科室编码 + * @param sourceWarehouseId 发货的源仓库id * @param invoiceType 发货类型,如果为自定义发货,则限制只查器械包、敷料包等类型的物品 * @return */ private Map loadSterilizeBasketInsideTousseInstance( - String barcode, final String departCodeOfInvoicePlan , String invoiceType) { + String barcode, Long sourceWarehouseId, final String departCodeOfInvoicePlan , String invoiceType) { Map multiResult = new HashMap(); if (StringUtils.isBlank(barcode)) { multiResult.put("success", false); @@ -10697,10 +10700,11 @@ }*/ Collection resultList = new ArrayList(); - //现修改为只过滤出状态正常的器械包实例 + //现修改为只过滤出状态正常且包实例的来源仓库与本次发货的供应室的源仓库id的器械包实例 for(TousseInstance tousseInstance : list){ - if(TousseInstance.STATUS_STERILED.equals(tousseInstance.getStatus()) - || TousseInstance.STATUS_DISINFECTED.equals(tousseInstance.getStatus())){ + if(ObjectUtils.equals(sourceWarehouseId, tousseInstance.getWareHouseId()) + && (TousseInstance.STATUS_STERILED.equals(tousseInstance.getStatus()) + || TousseInstance.STATUS_DISINFECTED.equals(tousseInstance.getStatus()))){ resultList.add(tousseInstance); } } @@ -10795,8 +10799,8 @@ } } }; - - list = CollectionUtils.select(list, p3); + //下面根据包类型为外部代理灭菌类型的判断业务代码删掉了(FSEYEQ-33 since 2025-09-25) + //list = CollectionUtils.select(list, p3); } // 到达此处代表同组器械包都可发货