Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java =================================================================== diff -u -r38500 -r40675 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java (.../DiposableGoodsAction.java) (revision 38500) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java (.../DiposableGoodsAction.java) (revision 40675) @@ -3,7 +3,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Method; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -2083,4 +2082,18 @@ StrutsResponseUtils.output(result); } + /** + * 批次库存关联的批次定义不存在时,生成批次定义CSSZXYY-182 + */ + public void updateDisposableGoodsBatchStockBatchIsNull(){ + JSONObject result = JSONUtil.buildJsonObject(true, "修改成功"); + try { + diposableGoodsManager.updateDisposableGoodsBatchStockBatchIsNull(); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "修改失败:" + e.getMessage()); + } + StrutsResponseUtils.output(result); + } + } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java =================================================================== diff -u -r40612 -r40675 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java (.../DiposableGoodsManager.java) (revision 40612) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java (.../DiposableGoodsManager.java) (revision 40675) @@ -418,4 +418,9 @@ */ public void syncThirdPartyChargeRecordDisposableGoods(ThirdPartyChargeRecord thirdPartyChargeRecord); + /** + * 批次库存关联的批次定义不存在时,生成批次定义CSSZXYY-182 + */ + public void updateDisposableGoodsBatchStockBatchIsNull(); + } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java =================================================================== diff -u -r40612 -r40675 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 40612) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 40675) @@ -3768,4 +3768,139 @@ } } + @SuppressWarnings("unchecked") + @Override + public void updateDisposableGoodsBatchStockBatchIsNull() { + List disposableGoodsBatchStockList = objectDao.findByHql(String.format("select po from %s po where not exists (select id from %s where id = po.disposableGoodsBatchId)", DisposableGoodsBatchStock.class.getSimpleName(), DisposableGoodsBatch.class.getSimpleName())); + if(CollectionUtils.isEmpty(disposableGoodsBatchStockList)){ + return; + } + Set disposableGoodsIdList = new HashSet(); + Set batchNumberSet = new HashSet(); + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStockList) { + Long disposableGoodsId = disposableGoodsBatchStock.getDisposableGoodsId(); + String batchNumber = disposableGoodsBatchStock.getBatchNumber(); + if(!DatabaseUtil.isPoIdValid(disposableGoodsId)){ + logger.error(String.format("id=%s的批次库存(DisposableGoodsBatchStock)一次性物品定义ID无效(disposableGoodsId)", disposableGoodsBatchStock.getDisposableGoodsId())); + } + if(StringUtils.isBlank(batchNumber)){ + logger.error(String.format("id=%s的批次库存(DisposableGoodsBatchStock)批次号(batchNumber)", disposableGoodsBatchStock.getDisposableGoodsId())); + } + if(DatabaseUtil.isPoIdValid(disposableGoodsId) && StringUtils.isNotBlank(batchNumber)){ + disposableGoodsIdList.add(disposableGoodsId); + batchNumberSet.add(batchNumber); + } + } + if(CollectionUtils.isEmpty(disposableGoodsIdList) || CollectionUtils.isEmpty(batchNumberSet)){ + return; + } + + //一次性物品定义id-批次号-一次性物品批次定义map + Map> disposableGoodsIdBatchNumberDisposableGoodsBatchMap = getDisposableGoodsIdBatchNumberDisposableGoodsBatchMap(disposableGoodsIdList, batchNumberSet); + Map idDisposableGoodsMap = getIdsToDisposableGoodsMapByDisposableGoodsIds(disposableGoodsIdList); + + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStockList) { + Long disposableGoodsId = disposableGoodsBatchStock.getDisposableGoodsId(); + String batchNumber = disposableGoodsBatchStock.getBatchNumber(); + DisposableGoods disposableGoods = idDisposableGoodsMap.get(disposableGoodsId); + if(disposableGoods == null){ + logger.error(String.format("id=%s的一次性物品定义(DisposableGoods)", disposableGoodsBatchStock.getDisposableGoodsId())); + continue; + } + DisposableGoodsBatch disposableGoodsBatch = null; + Map batchNumberDisposableGoodsBatchMap = disposableGoodsIdBatchNumberDisposableGoodsBatchMap.get(disposableGoodsId); + if(batchNumberDisposableGoodsBatchMap != null){ + disposableGoodsBatch = batchNumberDisposableGoodsBatchMap.get(batchNumber); + }else{ + batchNumberDisposableGoodsBatchMap = new HashMap(); + } + if(disposableGoodsBatch == null){ + disposableGoodsBatch = new DisposableGoodsBatch(); + //disposableGoodsBatch.setBarcode(serialNumManager.getSerialNumberStr(type)); + //disposableGoodsBatch.setBatchIdFromHisSync(batchIdFromHisSync); + disposableGoodsBatch.setBatchNumber(batchNumber); + disposableGoodsBatch.setCost(disposableGoodsBatchStock.getCost()); + disposableGoodsBatch.setDiposableGoods(disposableGoods); + disposableGoodsBatch.setExpDate(disposableGoodsBatchStock.getExpDate()); + //disposableGoodsBatch.setHasPrinted(hasPrinted); + //disposableGoodsBatch.setIdentification(identification); + disposableGoodsBatch.setManufacturer(disposableGoodsBatchStock.getManufacturer()); + disposableGoodsBatch.setManufacturerId(disposableGoodsBatchStock.getManufacturerId()); + //disposableGoodsBatch.setPrintTime(printTime); + disposableGoodsBatch.setProduceDate(disposableGoodsBatchStock.getProduceDate()); + disposableGoodsBatch.setProducingArea(disposableGoodsBatchStock.getProducingArea()); + disposableGoodsBatch.setSterileBatchNumber(disposableGoodsBatchStock.getSterileBatchNumber()); + disposableGoodsBatch.setStorage(disposableGoodsBatchStock.getStorage()); + disposableGoodsBatch.setSupplierId(disposableGoodsBatchStock.getSupplierId()); + disposableGoodsBatch.setSupplierName(disposableGoodsBatchStock.getSupplierName()); + //disposableGoodsBatch.setType(type); + this.saveOrUpdate(disposableGoodsBatch); + batchNumberDisposableGoodsBatchMap.put(batchNumber, disposableGoodsBatch); + disposableGoodsIdBatchNumberDisposableGoodsBatchMap.put(disposableGoodsId, batchNumberDisposableGoodsBatchMap); + } + disposableGoodsBatchStock.setDisposableGoodsBatchId(disposableGoodsBatch.getId()); + List identifications = disposableGoodsBatchStock.getIdentifications(); + if(CollectionUtils.isNotEmpty(identifications)){ + for (DisposableGoodsIdentification identification : identifications) { + identification.setDisposableGoodsBatchID(disposableGoodsBatch.getId()); + objectDao.saveOrUpdate(identification); + } + } + objectDao.saveOrUpdate(disposableGoodsBatchStock); + //修改一次性物品批次库存关联的表 + updateDisposableGoodsBatchStockRelateTable(disposableGoodsBatchStock); + } + } + + /** + * 修改一次性物品批次库存关联的表 + * @param disposableGoodsBatchStock 一次性物品批次库存 + */ + private void updateDisposableGoodsBatchStockRelateTable(DisposableGoodsBatchStock disposableGoodsBatchStock) { + //InventoryItem + String inventoryItemSql = String.format("update InventoryItem set disposableGoodsBatchId = %s, batchId = %s where disposableGoodsBatchStockId = %s", disposableGoodsBatchStock.getDisposableGoodsBatchId(), disposableGoodsBatchStock.getDisposableGoodsBatchId(), disposableGoodsBatchStock.getDisposableGoodsBatchStockId()); + //GodownEntryItem + String godownEntryItemSql = String.format("update GodownEntryItem set disposableGoodsBatchId = %s where disposableGoodsBatchStockId = %s", disposableGoodsBatchStock.getDisposableGoodsBatchId(), disposableGoodsBatchStock.getDisposableGoodsBatchStockId()); + //DiposableGoodsItem + String diposableGoodsItemSql = String.format("update DiposableGoodsItem set disposableGoodsBatchId = %s where disposableGoodsBatchStockId = %s", disposableGoodsBatchStock.getDisposableGoodsBatchId(), disposableGoodsBatchStock.getDisposableGoodsBatchStockId()); + objectDao.excuteSQL(inventoryItemSql); + objectDao.excuteSQL(godownEntryItemSql); + objectDao.excuteSQL(diposableGoodsItemSql); + } + + /** + * 根据一次性物品定义id及批次号,查询一次性物品批次定义 + * @param disposableGoodsIdList 一次性物品定义id + * @param batchNumberSet 批次号 + * @return 一次性物品定义id-批次号-一次性物品批次定义map + */ + @SuppressWarnings("unchecked") + private Map> getDisposableGoodsIdBatchNumberDisposableGoodsBatchMap(Set disposableGoodsIdList, Set batchNumberSet) { + Map> disposableGoodsIdBatchNumberDisposableGoodsBatchMap = new HashMap>(); + StringBuffer sqlBuffer = new StringBuffer(); + + sqlBuffer.append("select po from DisposableGoodsBatch po where "); + sqlBuffer.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.diposableGoods.id", disposableGoodsIdList)); + sqlBuffer.append(" and "); + sqlBuffer.append(SqlUtils.getStringFieldInLargeCollectionsPredicate("po.batchNumber", batchNumberSet)); + + List disposableGoodsBatchList = objectDao.findByHql(sqlBuffer.toString()); + if(CollectionUtils.isEmpty(disposableGoodsBatchList)){ + return disposableGoodsIdBatchNumberDisposableGoodsBatchMap; + } + + for (DisposableGoodsBatch disposableGoodsBatch : disposableGoodsBatchList) { + Long disposableGoodsId = disposableGoodsBatch.getDiposableGoods().getId(); + String batchNUmber = disposableGoodsBatch.getBatchNumber(); + Map batchNumberDisposableGoodsBatchMap = disposableGoodsIdBatchNumberDisposableGoodsBatchMap.get(disposableGoodsId); + if(batchNumberDisposableGoodsBatchMap == null){ + batchNumberDisposableGoodsBatchMap = new HashMap(); + } + batchNumberDisposableGoodsBatchMap.put(batchNUmber, disposableGoodsBatch); + disposableGoodsIdBatchNumberDisposableGoodsBatchMap.put(disposableGoodsId, batchNumberDisposableGoodsBatchMap); + } + + return disposableGoodsIdBatchNumberDisposableGoodsBatchMap; + } + } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerTests.java =================================================================== diff -u -r26308 -r40675 --- ssts-web/src/test/java/test/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerTests.java (.../DiposableGoodsManagerTests.java) (revision 26308) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerTests.java (.../DiposableGoodsManagerTests.java) (revision 40675) @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.junit.Test; import org.springframework.transaction.annotation.Propagation; @@ -802,4 +803,85 @@ System.out.print("start thread2"); } + /** + * 批次库存关联的批次定义不存在时,生成批次定义 + */ + @Test + public void testUpdateDisposableGoodsBatchStockBatchIsNull() { + initCSSDData(); + WareHouse wareHouse1 = wareHouseManager.getDefaultWareHouseByUnitCode(Constants.ORG_UNIT_CODE_CSSD); + assertNotNull(wareHouse1); + Long warehouseID = wareHouse1.getId(); + String warehouseName = wareHouse1.getName(); + String batchNumber = "20150704"; + + DisposableGoods disposableGoods = diposableGoodsManager.get("注射器", "1ML"); + + if(disposableGoods == null){ + disposableGoods = new DisposableGoods(); + } + disposableGoods.setName("注射器"); + disposableGoods.setSpecification("1ML"); + disposableGoods.setType("注射器"); + diposableGoodsManager.save(disposableGoods); + assertNotNull(disposableGoods.getId()); + + // 第一次入库,新批次 + DisposableGoodsBatchStock disposableGoodsBatchStock = null; + Map result = new HashMap(); + GodownEntry entry1 = new GodownEntry(); + entry1.setWarehouseID(warehouseID); + entry1.setWarehouseName(warehouseName); + GodownEntryItem godownEntryItem1_1 = new GodownEntryItem(); + godownEntryItem1_1.setBatchNumber(batchNumber); + godownEntryItem1_1.setAmount(100L); + godownEntryItem1_1.setCost(1.6); + godownEntryItem1_1.setDisposableGoodsID(disposableGoods.getId()); + godownEntryItem1_1.setManufacturer("广州白云山制药厂"); + godownEntryItem1_1.setSupplierName("广州捷康医疗"); + godownEntryItem1_1.setGodownEntry(entry1); + godownEntryItem1_1.setExpDate(new Date()); + entry1.getItemsList().add(godownEntryItem1_1); + godownEntryManager.saveGodownEntry_TRANS_REQUIRED(entry1, result); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + //把一次性物品的某批次的库存关联的批次id清空 + DisposableGoodsStock disposableGoodsStock = diposableGoodsManager.getDisposableGoodsStockByName(wareHouse1.getId(),"注射器", "1ML"); + disposableGoodsBatchStock = diposableGoodBatchStockManager.getDiposableGoodBatchStock(disposableGoodsStock.getId().toString(), batchNumber); + DisposableGoodsBatch disposableGoodsBatch = diposableGoodsManager.getDisposableGoodsBatchById(disposableGoodsBatchStock.getDisposableGoodsBatchId()); + disposableGoodsBatchStock.setDisposableGoodsBatchId(null); + objectDao.saveOrUpdate(disposableGoodsBatchStock); + List identifications = diposableGoodBatchStockManager.getIdentificationsWithNoZeroStroge(disposableGoodsBatchStock.getId()); + if(CollectionUtils.isNotEmpty(identifications)){ + for (DisposableGoodsIdentification disposableGoodsIdentification : identifications) { + disposableGoodsIdentification.setDisposableGoodsBatchID(null); + objectDao.saveOrUpdate(disposableGoodsIdentification); + } + } + objectDao.delete(disposableGoodsBatch); + + //为批次为空的批次库存补充批次 + diposableGoodsManager.updateDisposableGoodsBatchStockBatchIsNull(); + + //批次补充后不会为空 + disposableGoodsBatch = diposableGoodsManager.getDisposableGoodsBatchByBatchNumber(disposableGoods.getId(), batchNumber); + assertNotNull(disposableGoodsBatch); + disposableGoodsBatchStock = diposableGoodBatchStockManager.getDiposableGoodBatchStock(disposableGoodsStock.getId().toString(), batchNumber); + //批次库存关联批次 + assertEquals(disposableGoodsBatchStock.getDisposableGoodsBatchId().longValue(), disposableGoodsBatch.getId().longValue()); + assertEquals(disposableGoodsBatchStock.getBatchNumber(), disposableGoodsBatch.getBatchNumber()); + identifications = diposableGoodBatchStockManager.getIdentificationsWithNoZeroStroge(disposableGoodsBatchStock.getId()); + if(CollectionUtils.isNotEmpty(identifications)){ + for (DisposableGoodsIdentification dentification : identifications) { + //一次性物品的标识号关联批次 + assertEquals(dentification.getDisposableGoodsBatchID().longValue(), disposableGoodsBatch.getId().longValue()); + } + } + } + }