Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r20290 -r20300 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 20290) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 20300) @@ -2454,19 +2454,19 @@ writebackForZSLY(invoiceList); if (CssdUtils.getSystemSetConfigByNameBool("enableTousseVoluntarilyUrgent", false)) { - recalculateUrgentTousse(submitInvoiceContext); + recalculateUrgentTousse(AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(), submitInvoiceContext); } // throw new RuntimeException("发货速度测试!"); return submitInvoiceContext; } /** * 重新计算加急的器械包. + * @param orgUnitCode 处理供应室编码 * @param submitInvoiceContext 发货的上下文 */ - private void recalculateUrgentTousse(SubmitInvoiceContext submitInvoiceContext) { + private void recalculateUrgentTousse(String orgUnitCode, 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 " @@ -2502,13 +2502,13 @@ } for (Iterator iterator = tousseDefinitionIdToAmount.keySet().iterator(); iterator.hasNext();) { - Long key = iterator.next(); - TousseDefinition tousseDefinition = tousseDefinitionIdToTousseDefinitionMap.get(key); + Long tousseDefinitionId = iterator.next(); + TousseDefinition tousseDefinition = tousseDefinitionIdToTousseDefinitionMap.get(tousseDefinitionId); if (tousseDefinition != null && tousseDefinition.getUrgentWarningValue() != null && tousseDefinition.getUrgentWarningValue() > 0) { - Integer amount = tousseDefinitionIdToAmount.get(key); //库存数量 - Integer urgentAmount = amount - tousseDefinition.getUrgentWarningValue(); //应该的加急数量(待会再改一次) - Integer actualUrgentAmount = tousseDefinitionIdToUrgentAmount.get(key); //时间加急数量 + Integer amount = tousseDefinitionIdToAmount.get(tousseDefinitionId); //库存数量 + Integer urgentAmount = amount - tousseDefinition.getUrgentWarningValue(); //应该的加急数量 + Integer actualUrgentAmount = tousseDefinitionIdToUrgentAmount.get(tousseDefinitionId); //实际加急数量 Integer deviation = 0; //误差 if (urgentAmount > 0) { @@ -2517,29 +2517,32 @@ deviation = actualUrgentAmount; } if (deviation > 0) { - updateUrgentTousse(key, deviation); + updateUrgentTousse(orgUnitCode, tousseDefinitionId, deviation); } } } } /** - * 把之前自动加急的器械包还原成非紧急状态(优先从装配任务开始找加急的器械包,再去找器械包实例). + * 把之前加急的器械包还原成非紧急状态(优先从装配任务开始找加急的器械包,再去找器械包实例). + * @param orgUnitCode 处理供应室编码 * @param tousseDefinitionId 器械包id * @param deviation 还原的个数 */ - private void updateUrgentTousse(Long tousseDefinitionId, Integer deviation) { + private void updateUrgentTousse(String orgUnitCode, Long tousseDefinitionId, Integer deviation) { if (deviation != null && deviation > 0) { - String orgUnitCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); + //1、联动修改申请项的加急数量 + updateUrgentAmountOfTousseItem(orgUnitCode, tousseDefinitionId, deviation); + + //2、优先从装配任务开始找加急的器械包 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(); + Integer newUrgentAmount = 0; if (urgentAmount >= deviation) { newUrgentAmount = urgentAmount - deviation; flag = true; @@ -2552,7 +2555,7 @@ if (flag) {break;} } - + //3、再去找器械包实例 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 ", @@ -2573,6 +2576,36 @@ } /** + * 联动修改申请项的加急数量. + * @param orgUnitCode 处理供应室编码 + * @param tousseDefinitionId 器械包id + * @param deviation 还原的个数 + */ + private void updateUrgentAmountOfTousseItem(String orgUnitCode, Long tousseDefinitionId, Integer deviation) { + if (deviation != null && deviation > 0) { + String whereHql = String.format("where po.tousseDefinitionId=%s and po.invoicePlan.handleDepartCoding='%s' and po.urgentAmount>0 order by po.id desc", + tousseDefinitionId, orgUnitCode); + List tousseItems = objectDao.findBySql(TousseItem.class.getSimpleName(), whereHql); + + boolean flag = false; + for (TousseItem tousseItem : tousseItems) { + Integer urgentAmount = tousseItem.getUrgentAmount(); + Integer newUrgentAmount = 0; + if (urgentAmount >= deviation) { + newUrgentAmount = urgentAmount - deviation; + flag = true; + } else { + newUrgentAmount = 0; + deviation -= urgentAmount; + } + tousseItem.setUrgentAmount(newUrgentAmount); + objectDao.saveOrUpdate(tousseItem); + if (flag) {break;} + } + } + } + + /** * 获取此次发货所有申请单集合(并且加锁). * @param params 前台传过来的参数 * @param submitInvoiceContext 发货的上下文