Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/service/SignRecordManagerImpl.java =================================================================== diff -u -r37139 -r37149 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/service/SignRecordManagerImpl.java (.../SignRecordManagerImpl.java) (revision 37139) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/service/SignRecordManagerImpl.java (.../SignRecordManagerImpl.java) (revision 37149) @@ -15,6 +15,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; @@ -24,6 +25,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.map.HashedMap; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -207,14 +209,14 @@ @Override public SignRecord save(JSONArray invoiceIds,JSONArray barcodeAndAmountJSONArray,String signUserCode,String signUserName, String departCoding){ + if(StringUtils.isBlank(departCoding)){ + departCoding = AcegiHelper.getCurrentOrgUnitCode(); + } //下面这个变量是为了确定修改方法定义后的代码编辑不报错而设置,正式修改此业务方法时此变量已不变使用,改用方法的第一个参数barcodeAndAmountJSONArray - List tousseInstanceBarcodes = null; + List tousseInstanceBarcodes = getTousseInstanceBarcodes(departCoding, invoiceIds, barcodeAndAmountJSONArray); if(CollectionUtils.isEmpty(tousseInstanceBarcodes)){ throw new SystemException("器械包不能为空"); } - if(StringUtils.isBlank(departCoding)){ - departCoding = AcegiHelper.getCurrentOrgUnitCode(); - } SignRecord sr = new SignRecord(); if(StringUtils.isNotBlank(signUserCode)){ @@ -240,7 +242,178 @@ save(sr); return sr; } + /** + * 如果条码包含固定条码,则根据固定条码和发货单ID查询器械包实例唯一条码 + * @param departCoding 签收科室编码 + * @param invoiceIds 发货单ID:没传参时,直接返回barcodeAndAmountJSONArray中的条码 + * @param barcodeAndAmountJSONArray 条码和签收数量 + * @return + */ + @SuppressWarnings("unchecked") + private List getTousseInstanceBarcodes(String departCoding, JSONArray invoiceIds, JSONArray barcodeAndAmountJSONArray) { + List tousseInstanceBarcodes = new ArrayList(); + if(barcodeAndAmountJSONArray == null || barcodeAndAmountJSONArray.size() == 0){ + return tousseInstanceBarcodes; + } + Map barcodeAndAmountMap = new HashedMap(); + for(int i=0;i keySet = json.keySet(); + for (String barcode : keySet) { + Integer amount = json.optInt(barcode); + if(amount != null && amount.intValue() > 0){ + barcodeAndAmountMap.put(barcode, amount); + } + } + } + if(MapUtils.isEmpty(barcodeAndAmountMap)){ + return tousseInstanceBarcodes; + } + if(invoiceIds == null || invoiceIds.size() == 0){ + tousseInstanceBarcodes.addAll(barcodeAndAmountMap.keySet()); + return tousseInstanceBarcodes; + } + + //把条码中的固定条码,根据发货单转换为唯一条码签收 + tousseInstanceBarcodes = convertFixedBarcodeToUniqueTousseInstanceBarcodeByInvoiceId(departCoding, barcodeAndAmountMap, invoiceIds); + + return tousseInstanceBarcodes; + } + + /** + * 根据发货单ID和固定条码关联的唯一条码查询待签收的器械包条码 + * @param barcodeAndAmountMap + * @param invoiceIds + * @return + */ + private List convertFixedBarcodeToUniqueTousseInstanceBarcodeByInvoiceId(String departCoding, Map barcodeAndAmountMap, JSONArray invoiceIds) { + List tousseInstanceBarcodes = new ArrayList(); + if(MapUtils.isEmpty(barcodeAndAmountMap) + || invoiceIds == null || invoiceIds.size() == 0){ + return tousseInstanceBarcodes; + } + List barcodes = new ArrayList(); + barcodes.addAll(barcodeAndAmountMap.keySet()); + Collection tis = tousseInstanceManager.getCollectionForUpdate("barcode", barcodes); + if(CollectionUtils.isEmpty(tis)){ + return tousseInstanceBarcodes; + } + Set fixedBarcodeSet = new HashSet(); + Set ancestorIdSet = new HashSet(); + Map ancestorIdAmountMap = new HashedMap(); + for (TousseInstance ti : tis) { + if(ti.fixedBarcode()){ + fixedBarcodeSet.add(ti.getBarcode()); + ancestorIdSet.add(ti.getTousseDefinitionAncestorID()); + ancestorIdAmountMap.put(ti.getTousseDefinitionAncestorID(), barcodeAndAmountMap.get(ti.getBarcode())); + }else{ + tousseInstanceBarcodes.add(ti.getBarcode()); + } + } + + if(CollectionUtils.isEmpty(ancestorIdSet)){ + return tousseInstanceBarcodes; + } + + Map> ancestorTousseInstanceBarcodeMap = getWaiteSignTousseInstanceBarcodeOfFixBarcode(departCoding, invoiceIds, ancestorIdSet, ancestorIdAmountMap); + + if(MapUtils.isEmpty(ancestorTousseInstanceBarcodeMap)){ + return tousseInstanceBarcodes; + } + for (Entry> barcodeEntry : ancestorTousseInstanceBarcodeMap.entrySet()) { + Long tdAncestor = barcodeEntry.getKey(); + List waiteSignBarcodeList = barcodeEntry.getValue(); + Integer signAmount = ancestorIdAmountMap.get(tdAncestor); + if(signAmount == null || signAmount.intValue() <=0 || CollectionUtils.isEmpty(waiteSignBarcodeList)){ + continue; + } + if(signAmount.intValue() >= waiteSignBarcodeList.size()){ + tousseInstanceBarcodes.addAll(waiteSignBarcodeList); + }else{ + tousseInstanceBarcodes.addAll(waiteSignBarcodeList.subList(0, signAmount)); + } + } + + return tousseInstanceBarcodes; + } + + /** + * 查询发货单及固定条码关联的待签收器械包实例条码 + * @param invoiceIds + * @param ancestorIdSet + * @return + */ + private Map> getWaiteSignTousseInstanceBarcodeOfFixBarcode(String departCoding, JSONArray invoiceIds, Set ancestorIdSet, Map ancestorIdAmountMap) { + Map> ancestorTousseInstanceBarcodeMap = new HashedMap>(); + if(CollectionUtils.isEmpty(invoiceIds) + || CollectionUtils.isEmpty(ancestorIdSet) + || MapUtils.isEmpty(ancestorIdAmountMap) + || StringUtils.isBlank(departCoding)){ + return ancestorTousseInstanceBarcodeMap; + } + + List invoiceIdList = new ArrayList(); + for(int i=0;i tousseInstanceBarcodeList = ancestorTousseInstanceBarcodeMap.get(tdAncestor); + if(tousseInstanceBarcodeList == null){ + tousseInstanceBarcodeList = new ArrayList(); + } + tousseInstanceBarcodeList.add(barcode); + ancestorTousseInstanceBarcodeMap.put(tdAncestor, tousseInstanceBarcodeList); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return ancestorTousseInstanceBarcodeMap; + } + + /** + * 根据发货单ID和祖先包定义id查询待签收的器械包实例 + * @param invoiceIds + * @param ancestorIdSet + * @return + */ + private String buildWaiteSignTousseInstanceSql(String departCoding, Collection invoiceIds, Collection ancestorIdSet){ + String tousseSql = String.format("select tdAncestor.id tdAncestor, b.barcode " + + "from %s ti " + + "join %s b on ti.id=b.id " + + "join %s td on ti.tousseDefinition_id=td.id " + + "join %s tdAncestor on td.ancestorID=tdAncestor.id ," + + "%s i where ((ti.invoice2_id is not null and i.id = ti.invoice2_id) or (ti.invoice2_id is null and i.id = ti.invoice_id)) " + + "and %s " + + "and %s " + + "and i.departCoding = '%s'", + TousseInstance.class.getSimpleName(), + BarcodeDevice.class.getSimpleName(), + TousseDefinition.class.getSimpleName(), + TousseDefinition.class.getSimpleName(), + Invoice.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("i.id",invoiceIds), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tdAncestor.id", ancestorIdSet), + departCoding); + return tousseSql; + } + + /** * 生成签收记录 */ @Override