Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java =================================================================== diff -u -r14357 -r14421 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 14357) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 14421) @@ -4,14 +4,15 @@ import java.util.Date; import javax.persistence.Entity; +import javax.persistence.Index; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang.StringUtils; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import org.hibernate.annotations.Index; import com.fasterxml.jackson.annotation.JsonFilter; import com.forgon.directory.model.BarcodeDevice; @@ -28,6 +29,7 @@ */ @Entity +@Table(indexes = {@Index(columnList = "status", name = "status_index"),@Index(columnList = "tousseName", name = "tousseName_index")}) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @JsonFilter("fieldFilter") public class TousseInstance extends BarcodeDevice implements Comparable{ @@ -52,7 +54,6 @@ public static final String STERILE_START_TIME_FMT = "yyyy-MM-dd HH:mm:ss"; - @Index(name="tousseName_index") private String tousseName; private String classifyBasketIds;//清洗篮筐ids(一个包分多个篮筐洗、多次清洗追溯清洗记录、清洗篮筐) Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r14412 -r14421 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 14412) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 14421) @@ -1199,7 +1199,7 @@ // 固定条码的消毒物品,在发货前获取所有的包实例。一次取出所有的包实例,对长沙中心医院可能会有问题,包实例太多,但是目前的设计只能这样处理。 // Collection tousseInstanceList = getDisinfectionTousseInstance( // filteredList, tousseInstance.getTousseDefinition(),amount); - List tousseInstanceList = getDisinfectionTousseInstance( + List tousseInstanceList = getDisinfectionTousseInstanceAndTousseDefinition( filteredList, tousseInstance.getTousseDefinition()); if(tousseInstanceList == null || tousseInstanceList.size() < amount){ @@ -1269,12 +1269,18 @@ Map barcodeTousseInstanceMap = submitInvoiceContext.getBarcodeToTousseInstanceMap(); Map idToTousseInstanceMap = submitInvoiceContext.getIdToTousseInstanceMap(); Set barcodesScanned = submitInvoiceContext.getScannedBarcodes(); + Set tousseDefinitionIdSet = submitInvoiceContext.getTousseDefinitionIdSet(); // String barcodes = SqlUtils // .joinToWhereInConditionForStringProperties(barcodesScanned); -// String tousseSql = String.format( -// " where po.id in(select t.tousseDefinition.id from %s t where %s)", TousseInstance.class.getSimpleName(),SqlUtils.getStringFieldInCollectionsPredicate("t.barcode", barcodesScanned)); -// List tousseDefinitionList = objectDao.findBySql(TousseDefinition.class.getSimpleName(), tousseSql); - + String tousseDefinitionSql = String.format( + " where %s ", SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", tousseDefinitionIdSet)); + List tousseDefinitionList = objectDao.findBySql(TousseDefinition.class.getSimpleName(), tousseDefinitionSql); + if(tousseDefinitionList != null){ + Map tousseDefinitionIdToTousseDefinitionMap = submitInvoiceContext.getTousseDefinitionIdToTousseDefinitionMap(); + for (TousseDefinition tousseDefinition : tousseDefinitionList) { + tousseDefinitionIdToTousseDefinitionMap.put(tousseDefinition.getId(), tousseDefinition); + } + } String tousseInstancesIdsSql = String.format( " where %s", SqlUtils.getStringFieldInCollectionsPredicate("po.barcode", barcodesScanned)); List tousseInstanceList = objectDao.getBySql_ForUpdate2(TousseInstance.class.getSimpleName(), tousseInstancesIdsSql); @@ -1571,7 +1577,19 @@ if(filteredList.size() == 0){ throw new RuntimeException("没有要发货的申请单!"); } - + // 获取所有的包定义id + Set tousseDefinitionIdSet = submitInvoiceContext.getTousseDefinitionIdSet(); + for (InvoicePlan invoicePlan : filteredList) { + List applicationItems = invoicePlan.getApplicationItems(); + if(applicationItems != null){ + for (TousseItem tousseItem : applicationItems) { + Long tousseDefinitionId = tousseItem.getTousseDefinitionId(); + if(DatabaseUtil.isPoIdValid(tousseDefinitionId)){ + tousseDefinitionIdSet.add(tousseDefinitionId); + } + } + } + } SupplyRoomConfig supplyRoomConfig = supplyRoomConfigManager.getSystemParamsObj(); submitInvoiceContext.setSupplyRoomConfig(supplyRoomConfig); submitInvoiceContext.setInvoiceMode(mode); @@ -1616,7 +1634,7 @@ List invoiceList = submitInvoiceContext.getInvoiceList(); Map> updateStockInfo = submitInvoiceContext.getUpdateStockInfo();// 用于更新库存的信息 // 更新器械包库存 - updateGoodsStock(updateStockInfo); +// updateGoodsStock(updateStockInfo); // 更新仓库的库存 updateTousseInstanceStockInwareHouse(updateStockInfo, sourceWarehouseId); @@ -3181,6 +3199,7 @@ List invoicePlans, TousseDefinition tousseDefinition) { String whereSql = getDisinfectionTousseInstanceSql(invoicePlans, tousseDefinition); String hql = String.format(" from %s po inner join fetch po.tousseDefinition %s",TousseInstance.class.getSimpleName(), whereSql); + hql += " order by po.validUntil asc "; List result = objectDao.findByHql(hql); return result; } @@ -4079,36 +4098,47 @@ } return null; } - private List getFixedDisinfectionTousseInstances(String tousseName,SubmitInvoiceContext submitInvoiceContext,int amount){ + private List getFixedDisinfectionTousseInstances(InvoicePlan invoicePlan,TousseItem applicationItem,SubmitInvoiceContext submitInvoiceContext,int amount){ + String tousseName = applicationItem.getTousseName(); List tousseInstances = new LinkedList(); TousseInstance fixedDisinfectionTousseInstance = getFixedDisinfectionTousseInstance(tousseName, submitInvoiceContext.getBarcodeToBarcodeDeviceMap()); List disinfectionTousseInstances = submitInvoiceContext.getFixedBarcodeTousseIdToAffiliatedTousseInstanceMap().get(fixedDisinfectionTousseInstance.getId()); - String rawTousseName = TousseDefinitionUtils.getTousseRawName(tousseName); int addedAmount = 0; - TousseDefinition td = tousseDefinitionManager.getTousseDefinitionByName(tousseName); + Map tousseDefinitionIdToTousseDefinitionMap = submitInvoiceContext.getTousseDefinitionIdToTousseDefinitionMap(); + Long tousseDefinitionId = applicationItem.getTousseDefinitionId(); + if(!DatabaseUtil.isPoIdValid(tousseDefinitionId)){ + throw new RuntimeException(String.format("申请单[%s]%s的包定义id为空", invoicePlan.getSerialNumber(),tousseName)); + } + TousseDefinition appTD = tousseDefinitionIdToTousseDefinitionMap.get(tousseDefinitionId); + if(appTD == null){ + throw new RuntimeException(String.format("%s的包定义已不存在!", tousseName)); + } for (TousseInstance tousseInstance : disinfectionTousseInstances) { if(addedAmount >= amount){ break; } + if(tousseInstance.getTousseFixedBarcode()){ + continue;// 跳过固定条码 + } if(!tousseInstance.canInvoice()){ continue; } String tousseInstanceName = tousseInstance.getTousseName(); - if(StringUtils.equals(tousseName, tousseInstanceName)){ - ++addedAmount; - tousseInstances.add(tousseInstance); - continue; - } - String rawTousseInstanceName = TousseDefinitionUtils.getTousseRawName(tousseInstanceName); +// if(StringUtils.equals(tousseName, tousseInstanceName)){ +// ++addedAmount; +// tousseInstances.add(tousseInstance); +// continue; +// } +// String rawTousseInstanceName = TousseDefinitionUtils.getTousseRawName(tousseInstanceName); TousseDefinition td2 = tousseInstance.getTousseDefinition(); - if(td == null || td2 == null){ + if(td2 == null){ continue; } - String materialsMD5 = td.getMaterialsMD5(); + String materialsMD5 = appTD.getMaterialsMD5(); if(StringUtils.isBlank(materialsMD5)){ continue; } - if(StringUtils.equals(rawTousseInstanceName, rawTousseName) && StringUtils.equals(materialsMD5, td2.getMaterialsMD5())){ + if(StringUtils.equals(tousseInstanceName, tousseName) && StringUtils.equals(materialsMD5, td2.getMaterialsMD5())){ tousseInstances.add(tousseInstance); ++addedAmount; } @@ -4320,8 +4350,8 @@ // 如果是消毒物品,要查询此物品能发货的数量。 if (applicationItem.isDisinfection() && isFixedDisinfection(applicationGoodsName, barcodeObjMap)) { - tousseInstancesToSend = getFixedDisinfectionTousseInstances( - applicationItem.getTousseName(), submitInvoiceContext, + tousseInstancesToSend = getFixedDisinfectionTousseInstances(invoicePlan, + applicationItem, submitInvoiceContext, canSendAmount); if (tousseInstancesToSend.isEmpty()) { Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java =================================================================== diff -u -r14224 -r14421 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 14224) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 14421) @@ -15,10 +15,8 @@ import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; -import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; -import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; -import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; @@ -40,6 +38,8 @@ private Set scannedBarcodes = new HashSet(); private Map> updateStockInfo = new HashMap>(); private List invoiceList = new LinkedList(); + private Set tousseDefinitionIdSet = new HashSet(); + private Map tousseDefinitionIdToTousseDefinitionMap = new HashMap(); private Set scannedTousseInstances = new HashSet(); private Set tousseInstancesToUpdate = new HashSet(); private Map sendOutGoodsNameToAmountMap = new HashMap(); @@ -152,6 +152,23 @@ this.invoiceList = invoiceList; } + public Set getTousseDefinitionIdSet() { + return tousseDefinitionIdSet; + } + + public Map getTousseDefinitionIdToTousseDefinitionMap() { + return tousseDefinitionIdToTousseDefinitionMap; + } + + public void setTousseDefinitionIdSet(Set tousseDefinitionIdSet) { + this.tousseDefinitionIdSet = tousseDefinitionIdSet; + } + + public void setTousseDefinitionIdToTousseDefinitionMap( + Map tousseDefinitionIdToTousseDefinitionMap) { + this.tousseDefinitionIdToTousseDefinitionMap = tousseDefinitionIdToTousseDefinitionMap; + } + public Set getScannedTousseInstances() { return scannedTousseInstances; }