Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r20253 -r20282 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 20253) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 20282) @@ -82,6 +82,7 @@ import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.invoicemanager.TimeQuantum; import com.forgon.disinfectsystem.entity.operationreservation.OperationReservation; +import com.forgon.disinfectsystem.entity.packing.PackingTask; import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; import com.forgon.disinfectsystem.entity.printinvoiceconfig.PrintInvoiceConfig; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; @@ -1339,12 +1340,9 @@ Map barcodeObjMap = submitInvoiceContext.getBarcodeToBarcodeDeviceMap(); DisposableGoodsServiceContext disposableGoodsServiceContext = submitInvoiceContext.getDisposableGoodsServiceContext(); Map barcodeToExpensiveDisposablegoodsMap = disposableGoodsServiceContext.getBarcodeToExpensiveDisposablegoodsMap(); - Map barcodeDiposableGoodBatchStockMap = disposableGoodsServiceContext.getBarcodeToDisposableGoodsBatchStockMap(); Map barcodeDiposableGoodBatchMap = disposableGoodsServiceContext.getBarcodeToDisposableGoodsBatchMap(); - Map idToDisposableGoodsMap = disposableGoodsServiceContext.getIdToDisposableGoodsMap(); Map barcodeTousseInstanceMap = submitInvoiceContext.getBarcodeToTousseInstanceMap(); Map idToTousseInstanceMap = submitInvoiceContext.getIdToTousseInstanceMap(); - String mode = submitInvoiceContext.getInvoiceMode(); Map> fixedBarcodeTousseIdToAffiliatedTousseInstanceMap = submitInvoiceContext.getFixedBarcodeTousseIdToAffiliatedTousseInstanceMap(); Map> ancestorIdToAffiliatedTousseInstanceMap = submitInvoiceContext.getAncestorIdToAffiliatedTousseInstanceMap(); Map fixedBarcodeTousseIdToTousseInstanceMap = submitInvoiceContext.getFixedBarcodeTousseIdToTousseInstanceMap(); @@ -1613,8 +1611,8 @@ } /** - * 获取发货的目标仓库 - * @param submitInvoiceContext + * 获取发货的目标仓库. + * @param submitInvoiceContext 发货的上下文 */ private void loadTargetWareHouse( SubmitInvoiceContext submitInvoiceContext){ @@ -1638,8 +1636,8 @@ submitInvoiceContext.getTargetWareHouseMap().putAll(targetWareHouseMap); } /** - * 锁定器械包的库存,包括源仓库和目标仓库的库存 - * @param submitInvoiceContext + * 锁定器械包的库存,包括源仓库和目标仓库的库存. + * @param submitInvoiceContext 发货的上下文 */ private void lockGoodsStocks( SubmitInvoiceContext submitInvoiceContext){ @@ -2272,7 +2270,7 @@ submitInvoiceContext.setSendOnlyUrgentGoods(false); //一次性物品库存变动记录(一次性物品标识表及高值耗材库存变动记录) List disposableGoodsStorageAdjustVoTotalList = new ArrayList(); - Invoice invoice = invoice( null, submitInvoiceContext , disposableGoodsStorageAdjustVoTotalList); + Invoice invoice = invoice(null, submitInvoiceContext, disposableGoodsStorageAdjustVoTotalList); List invoiceList = submitInvoiceContext.getInvoiceList(); Map> updateStockInfo = submitInvoiceContext.getUpdateStockInfo();// 用于更新库存的信息 // 更新仓库的库存 @@ -2355,7 +2353,6 @@ } @Override public SubmitInvoiceContext submitInvoice(JSONObject params) { - String invoiceType = JSONUtil.optString(params, "invoiceType", Invoice.TYPE_APPLICATION); switch (invoiceType) { case Invoice.TYPE_OPERATION_RESERVATION: @@ -2408,7 +2405,7 @@ if(isSendOutCompletely(submitInvoiceContext)){ break; } - Invoice invoice = invoice( invoicePlan, submitInvoiceContext , disposableGoodsStorageAdjustVoList); + Invoice invoice = invoice(invoicePlan, submitInvoiceContext, disposableGoodsStorageAdjustVoList); if(invoice != null){ writeBackInvoiceList.add(invoice); } @@ -2425,7 +2422,7 @@ break; } - Invoice invoice = invoice( invoicePlan, submitInvoiceContext , disposableGoodsStorageAdjustVoList); + Invoice invoice = invoice(invoicePlan, submitInvoiceContext, disposableGoodsStorageAdjustVoList); if(invoice != null){ writeBackInvoiceList.add(invoice); } @@ -2456,11 +2453,121 @@ checkIfForeignTousseAppInvoiceComplete(submitInvoiceContext); writebackForZSLY(invoiceList); + if (CssdUtils.getSystemSetConfigByNameBool("enableTousseVoluntarilyUrgent", false)) { + recalculateUrgentTousse(submitInvoiceContext); + } // throw new RuntimeException("发货速度测试!"); return submitInvoiceContext; } + + /** + * 重新计算加急的器械包. + * @param submitInvoiceContext 发货的上下文 + */ + private void recalculateUrgentTousse(SubmitInvoiceContext submitInvoiceContext) { + Map tousseDefinitionIdToTousseDefinitionMap = submitInvoiceContext.getTousseDefinitionIdToTousseDefinitionMap(); + String orgUnitCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); + String tousseDefinitionIdsSql = SqlUtils.getNonStringFieldInCollectionsPredicate("po.tousseDefinition.id", tousseDefinitionIdToTousseDefinitionMap.keySet()); + + String hql = String.format("select po.tousseDefinition.id,1,case when po.isUrgentTousse='%s' then 1 else 0 end " + + "from TousseInstance po where %s and po.tousseFixedBarcode<>1 and po.status<>'%s' " + + "and (po.location is null or po.location='%s') and po.orgUnitCoding='%s' ", + Constants.STR_YES, tousseDefinitionIdsSql, TousseInstance.STATUS_DISCARD, orgUnitCode, orgUnitCode); + + String hql2 = String.format("select po.tousseDefinition.id," + + "case when po.unPackAmount is not null then po.unPackAmount else 0 end," + + "case when po.urgentAmount is not null then po.urgentAmount else 0 end " + + "from PackingTask po where %s and po.orgUnitCoding='%s' ", tousseDefinitionIdsSql, orgUnitCode); + + List list = objectDao.findByHql(hql); + list.addAll(objectDao.findByHql(hql2)); + + //供应室的库存数量 + Map tousseDefinitionIdToAmount = new HashMap(); + //已经加急的数量 + Map tousseDefinitionIdToUrgentAmount = new HashMap(); + for (Object object : list) { + Object[] arr = (Object[]) object; + Long tousseDefinitionId = (Long) arr[0]; + Integer amount = (Integer) arr[1]; + Integer urgentAmount = (Integer) arr[2]; + + //合计处于供应室的库存 + amount = tousseDefinitionIdToAmount.get(tousseDefinitionId) != null ? (tousseDefinitionIdToAmount.get(tousseDefinitionId) + amount) : amount; + tousseDefinitionIdToAmount.put(tousseDefinitionId, amount); + + //合计已经加急的器械包 + urgentAmount = tousseDefinitionIdToUrgentAmount.get(tousseDefinitionId) != null ? (tousseDefinitionIdToUrgentAmount.get(tousseDefinitionId) + urgentAmount) : urgentAmount; + tousseDefinitionIdToUrgentAmount.put(tousseDefinitionId, urgentAmount); + } + + for (Iterator iterator = tousseDefinitionIdToAmount.keySet().iterator(); iterator.hasNext();) { + Long key = iterator.next(); + TousseDefinition tousseDefinition = tousseDefinitionIdToTousseDefinitionMap.get(key); + + if (tousseDefinition != null && tousseDefinition.getUrgentWarningValue() != null && tousseDefinition.getUrgentWarningValue() > 0) { + Integer amount = tousseDefinitionIdToAmount.get(key); + Integer urgentAmount = amount - tousseDefinition.getUrgentWarningValue(); + if (urgentAmount > 0) { + Integer deviation = tousseDefinitionIdToUrgentAmount.get(key) - urgentAmount; + if (deviation > 0) { + updateUrgentTousse(key, deviation); + } + } + } + } + } /** + * 把之前自动加急的器械包还原成非紧急状态. + * @param tousseDefinitionId 器械包id + * @param deviation 还原的个数 + */ + private void updateUrgentTousse(Long tousseDefinitionId, Integer deviation) { + if (deviation != null && deviation > 0) { + String orgUnitCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); + String whereHql = String.format("where po.tousseDefinition.id=%s and po.orgUnitCoding='%s' and po.urgentAmount>0 order by po.id desc", + tousseDefinitionId, orgUnitCode); + + List packingTasks = objectDao.findBySql(PackingTask.class.getSimpleName(), whereHql); + + boolean flag = false; + Integer newUrgentAmount = 0; + for (PackingTask packingTask : packingTasks) { + Integer urgentAmount = packingTask.getUrgentAmount(); + if (urgentAmount >= deviation) { + newUrgentAmount = urgentAmount - deviation; + flag = true; + } else { + newUrgentAmount = 0; + deviation -= urgentAmount; + } + packingTask.setUrgentAmount(newUrgentAmount); + objectDao.saveOrUpdate(packingTask); + if (flag) {break;} + } + + + if (!flag) { + whereHql = String.format("where po.tousseDefinition.id=%s and po.isUrgentTousse='%s' and po.tousseFixedBarcode<>1 and po.status<>'%s' " + + "and (po.location is null or po.location='%s') and po.orgUnitCoding='%s' order by po.id desc ", + tousseDefinitionId, Constants.STR_YES, TousseInstance.STATUS_DISCARD, orgUnitCode, orgUnitCode); + + List tousseInstances = objectDao.findBySql(TousseInstance.class.getSimpleName(), whereHql); + + for (TousseInstance tousseInstance : tousseInstances) { + tousseInstance.setIsUrgentTousse(Constants.STR_NO); + objectDao.saveOrUpdate(tousseInstance); + deviation -= 1; + if (deviation <= 0) { + break; + } + } + } + } + } + + /** * 获取此次发货所有申请单集合(并且加锁). * @param params 前台传过来的参数 * @param submitInvoiceContext 发货的上下文