Index: ssts-web/src/main/java/com/forgon/disinfectsystem/stocktakemanager/service/StockTakeInfoManagerImpl.java =================================================================== diff -u -r12724 -r12726 --- ssts-web/src/main/java/com/forgon/disinfectsystem/stocktakemanager/service/StockTakeInfoManagerImpl.java (.../StockTakeInfoManagerImpl.java) (revision 12724) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/stocktakemanager/service/StockTakeInfoManagerImpl.java (.../StockTakeInfoManagerImpl.java) (revision 12726) @@ -18,13 +18,17 @@ import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; +import com.forgon.disinfectsystem.diposablegoods.service.GodownEntryManager; import com.forgon.disinfectsystem.diposablegoods.util.DiposableGoodsUtils; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; import com.forgon.disinfectsystem.entity.assestmanagement.IdentificationOfDiposableGoods; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry; +import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntryItem; import com.forgon.disinfectsystem.entity.stocktakemanager.StockTakeInfo; import com.forgon.disinfectsystem.entity.stocktakemanager.StockTakeItem; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; @@ -49,6 +53,8 @@ private MaterialEntryManager materialEntryManager; + private GodownEntryManager godownEntryManager; + private SerialNumManager serialNumManager; private GoodsStockManager goodsStockManager; @@ -80,6 +86,10 @@ this.diposableGoodsManager = diposableGoodsManager; } + public void setGodownEntryManager(GodownEntryManager godownEntryManager) { + this.godownEntryManager = godownEntryManager; + } + @Override public void delete(StockTakeInfo stockTakdeInfo) { objectDao.delete(stockTakdeInfo); @@ -214,23 +224,21 @@ private void saveDiposableGoodsStockTakeInfo_internal( StockTakeInfo stockTakeInfo, boolean isUpdateStock, Map result) { - Set materialDefinitionIDsSet = new HashSet();// 材料定义id集合 Set diposableGoodsIDsSet = new HashSet();// 一次性物品id集合 - Set batchIdsSet = new HashSet();// 批次id集合 - Set identificationIdsSet = new HashSet();// 标识号id集合 - Map idToMaterialDefinitionMap = new HashMap(); - Map idToDiposableGoodsMap = new HashMap(); + Set diposableGoodsBatchIdsSet = new HashSet();// 一次性物品批次id集合(即DisposableGoodsBatchStock的id集合) + Set identificationIdsSet = new HashSet();// 标识号id集合(实际上并未使用,可忽略与之相关的变量包括后面的idToIdentificationMap) + Map idToDiposableGoodsStockMap = new HashMap(); Map idToBatchStockMap = new HashMap(); Map idToIdentificationMap = new HashMap(); - // 汇总信息 - summaryDiposableGoodsInfo(stockTakeInfo, diposableGoodsIDsSet, batchIdsSet,identificationIdsSet); + // 汇总信息(根据盘点明细获取一次性物品id、一次性物品id、一次性物品标识id(标识id可能未获取)) + summaryDiposableGoodsInfo(stockTakeInfo, diposableGoodsIDsSet, diposableGoodsBatchIdsSet,identificationIdsSet); // 锁定并获取一次性物品 if(diposableGoodsIDsSet.size() == 0){ throw new RuntimeException("物品已被删除!"); } - lockAndGetDiposableGoodsResources(diposableGoodsIDsSet, batchIdsSet, identificationIdsSet, idToDiposableGoodsMap, idToBatchStockMap, idToIdentificationMap); + lockAndGetDiposableGoodsStockResources(diposableGoodsIDsSet, diposableGoodsBatchIdsSet, identificationIdsSet, idToDiposableGoodsStockMap, idToBatchStockMap, idToIdentificationMap); - saveDiposableGoodsStockTakeInfo(stockTakeInfo, isUpdateStock, idToDiposableGoodsMap, + saveDiposableGoodsStockTakeInfo(stockTakeInfo, isUpdateStock, idToDiposableGoodsStockMap, idToBatchStockMap); } @@ -242,39 +250,39 @@ */ private void saveDiposableGoodsStockTakeInfo(StockTakeInfo stockTakeInfo, boolean isUpdateStock, - Map idToDiposableGoodsMap, + Map idToDiposableGoodsStockMap, Map idToBatchStockMap) { if(stockTakeInfo.getId() == null){ objectDao.save(stockTakeInfo); } List items = stockTakeInfo.getStockTakeItems(); for (StockTakeItem stockTakeItem : items) { Long diposableGoodsID = stockTakeItem.getDiposableGoodsID(); - DisposableGoodsStock diposableGoods = idToDiposableGoodsMap.get(diposableGoodsID); - if(diposableGoods == null){ + DisposableGoodsStock diposableGoodsStock = idToDiposableGoodsStockMap.get(diposableGoodsID); + if(diposableGoodsStock == null){ throw new RuntimeException("物品已被删除!"); } - DisposableGoodsBatchStock batchStock = null; + DisposableGoodsBatchStock disposableGoodsBatchStock = null; Long batchID = stockTakeItem.getBatchID(); if(batchID == null){ throw new RuntimeException("批次ID为空!"); } - batchStock = idToBatchStockMap.get(batchID); - if(batchStock == null){ + disposableGoodsBatchStock = idToBatchStockMap.get(batchID); + if(disposableGoodsBatchStock == null){ throw new RuntimeException("批次已被删除!"); } long actualCountedQuantity = stockTakeItem.getActualCountedQuantity(); if (isUpdateStock) {// 是否要更新库存 - diposableGoods.recalculateAmount();// 重新计算数量,避免旧数据出现批次和总库存不一致 + diposableGoodsStock.recalculateAmount();// 重新计算数量,避免旧数据出现批次和总库存不一致 // 差值 = 实际盘点的数量 - 库存的数量(按批次) long storageDifference = actualCountedQuantity - - batchStock.getStorage(); + - disposableGoodsBatchStock.getStorage(); stockTakeItem.setStorageDifference(storageDifference);// 差值 stockTakeInfo.setStatus(StockTakeInfo.STATUS_HAS_BEEN_UPDATED);// 设置为已更新 List identifications = new LinkedList(); - identifications.addAll(batchStock.getIdentifications()); + identifications.addAll(disposableGoodsBatchStock.getIdentifications()); // 按照日期降序,日期新的在前 Collections.sort(identifications); Collections.reverse(identifications); @@ -286,8 +294,8 @@ IdentificationOfDiposableGoods identification = identifications.get(0); identification.adjustAmount(storageDifference);// 调整库存 objectDao.update(identification);// 更新库存 - objectDao.update(batchStock); - objectDao.update(diposableGoods); + objectDao.update(disposableGoodsBatchStock); + objectDao.update(diposableGoodsStock); }else if(storageDifference < 0){ // 退库不需要更新批次相关信息 long outAmount = -storageDifference; @@ -305,8 +313,8 @@ // 库存调整 identification.adjustAmount(-curOutAmount); objectDao.update(identification); - objectDao.update(batchStock); - objectDao.update(diposableGoods); + objectDao.update(disposableGoodsBatchStock); + objectDao.update(diposableGoodsStock); outAmount -= curOutAmount; if(outAmount == 0){ @@ -319,15 +327,94 @@ } }else{ long storageDifference = actualCountedQuantity - - batchStock.getStorage(); + - disposableGoodsBatchStock.getStorage(); stockTakeItem.setStorageDifference(storageDifference);// 差值 } - stockTakeItem.setDiposableGoodBatchStock(batchStock);// 关联批次 + stockTakeItem.setDiposableGoodBatchStock(disposableGoodsBatchStock);// 关联批次 if(stockTakeItem.getStockTakeInfoID() == null){// 关联stockTakeInfoID stockTakeItem.setStockTakeInfoID(stockTakeInfo.getId()); objectDao.saveOrUpdate(stockTakeItem); } } + + JSONArray in_array = new JSONArray(); + JSONArray out_array = new JSONArray(); + for (StockTakeItem si : items){ + JSONObject obj = new JSONObject(); + obj.put("diposableGoodsID", si.getDiposableGoodsID()); + obj.put("batchID", si.getBatchID()); + obj.put("batchNumber", si.getBatchNumber()); + if(si.getStorageDifference() > 0){ + obj.put("amount", si.getStorageDifference()); + in_array.add(obj); + }else if(si.getStorageDifference() < 0){ + obj.put("amount", -(si.getStorageDifference())); + out_array.add(obj); + } + } + + Map returnMsg = new HashMap(); + //盘盈入库单 + if(in_array.size() > 0){ + GodownEntry entry = new GodownEntry(); + entry.setType(MaterialEntry.TYPE_IN); + entry.setSubType(MaterialEntry.SUBTYPE_STOCKTAKE_IN);//盘盈入库 + entry.setOperator(stockTakeInfo.getStockTakePerson()); + entry.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_INSERT_GODOWN)); + entry.setTime(stockTakeInfo.getStockTakeDate()); + entry.setWareHouseId(stockTakeInfo.getWareHouseId()); + entry.setWareHouseName(stockTakeInfo.getWareHouseName()); + entry.setSourceId(stockTakeInfo.getId());//记录盘点记录的ID + + GodownEntryItem entryItem = null; + for(int i = 0;i < in_array.size();i++){ + JSONObject jsonObject = in_array.getJSONObject(i); + entryItem = new GodownEntryItem(); + entryItem.setAmount(jsonObject.optLong("amount")); + entryItem.setDiposableGoodsID(jsonObject.optLong("batchID")); + entryItem.setBatchID(jsonObject.optLong("batchNumber")); + entryItem.setBatchNumber(jsonObject.optString("batchNumber")); + entry.getItemsList().add(entryItem); + } + try { + //生成盘盈入库 + godownEntryManager.saveGodownEntry_TRANS_REQUIRED(entry, returnMsg); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } + + //盘亏出库单 + if(out_array.size() > 0){ + GodownEntry entry = new GodownEntry(); + entry.setType(MaterialEntry.TYPE_OUT); + entry.setSubType(MaterialEntry.SUBTYPE_STOCKTAKE_OUT);//盘亏出库 + entry.setOperator(stockTakeInfo.getStockTakePerson()); + entry.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_INSERT_GODOWN)); + entry.setTime(stockTakeInfo.getStockTakeDate()); + entry.setWareHouseId(stockTakeInfo.getWareHouseId()); + entry.setWareHouseName(stockTakeInfo.getWareHouseName()); + entry.setSourceId(stockTakeInfo.getId());//记录盘点记录的ID + + GodownEntryItem entryItem = null; + for(int i = 0;i < in_array.size();i++){ + JSONObject jsonObject = in_array.getJSONObject(i); + entryItem = new GodownEntryItem(); + entryItem.setAmount(jsonObject.optLong("amount")); + entryItem.setDiposableGoodsID(jsonObject.optLong("batchID")); + entryItem.setBatchID(jsonObject.optLong("batchNumber")); + entryItem.setBatchNumber(jsonObject.optString("batchNumber")); + entry.getItemsList().add(entryItem); + } + try { + //生成盘亏出库单 + godownEntryManager.saveGodownEntry_TRANS_REQUIRED(entry, returnMsg); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } } // 汇总材料信息 @@ -350,28 +437,40 @@ } } - // 汇总一次性物品信息 + // 汇总一次性物品库存信息 private void summaryDiposableGoodsInfo(StockTakeInfo stockTakeInfo, - Set diposableGoodsIDsSet, Set batchIDsSet, + Set diposableGoodsIDsSet, Set diposableGoodsBatchIDsSet, Set identificationIdsSet) { if (stockTakeInfo == null) { throw new RuntimeException("记录为空!"); } + + if (stockTakeInfo.getWareHouseId() == null || stockTakeInfo.getWareHouseId() == 0) { + throw new RuntimeException("仓库不能为空!"); + } // if (!StringUtils.equals(stockTakeInfo.getType(), TODO // StockTakeInfo.TYPE_DISPOSABLEGOOD)) { // throw new RuntimeException("类型不是一次性物品!"); // } List items = stockTakeInfo.getStockTakeItems(); - for (StockTakeItem receiveRecordItem : items) { - Long batchID = receiveRecordItem.getBatchID(); + for (StockTakeItem stockTakeItem : items) { + Long batchID = stockTakeItem.getBatchID(); if (batchID == null) { throw new RuntimeException("批次ID为空!"); } - batchIDsSet.add(batchID);// 批次ID + //查询仓库的一次性物品批次数据,如果该一次性物品批次在对应仓库不存在的话则抛出异常 + DisposableGoodsBatchStock disposableGoodsBatchStock = + (DisposableGoodsBatchStock)objectDao.getBySql(DisposableGoodsBatchStock.class.getSimpleName(), + " where wareHouseID = " + stockTakeInfo.getWareHouseId() + " and id=" + batchID); + if(disposableGoodsBatchStock == null){ + throw new RuntimeException("该仓库无该批次"); + } + diposableGoodsBatchIDsSet.add(batchID);// 批次ID } - // 根据批次ID,获取一次性物品ID。 + // 根据批次库存ID,获取一次性物品库存ID。 List diposableGoodsIDs = DiposableGoodsUtils - .getDiposableGoodsIDsByBatchIDs(objectDao, batchIDsSet); + .getDiposableGoodsIdsFromGoodsBatchByBatchIDs(objectDao, diposableGoodsBatchIDsSet); + //如果该一次性物品在对应仓库不存在的话则抛出异常(暂时不进行判断,一般来说一次性物品批次在对应仓库存在那么该一次性物品在对仓库的库存数据也会存在) diposableGoodsIDsSet.addAll(diposableGoodsIDs); } @@ -409,10 +508,10 @@ } // 获取并锁定一次性物品相关资源 - private void lockAndGetDiposableGoodsResources( + private void lockAndGetDiposableGoodsStockResources( Set diposableGoodsIDsSet, Set batchIdsSet, Set identificationIdsSet, - Map idToDiposableGoodsMap, + Map idToDiposableGoodsStockMap, Map idToBatchStockMap, Map idToIdentificationMap) { // 锁定一次性物品 @@ -421,35 +520,35 @@ if (StringUtils.isBlank(diposableGoodsIDsStr)) { return; } - String diposableGoodsIDsSql = String.format(" where po.id in (%s) ", + String diposableGoodsIDsSql = String.format(" where po.disposableGoodsID in (%s) ", diposableGoodsIDsStr); - List allDiposableGoods = diposableGoodsManager + List allDiposableGoodsStock = diposableGoodsManager .getDiposableGoodsBySql_ForUpdate(diposableGoodsIDsSql); - if (allDiposableGoods == null - || allDiposableGoods.size() != diposableGoodsIDsSet.size()) { + if (allDiposableGoodsStock == null + || allDiposableGoodsStock.size() != diposableGoodsIDsSet.size()) { throw new RuntimeException("某些物品已被删除!"); } - for (DisposableGoodsStock diposableGoods : allDiposableGoods) { - idToDiposableGoodsMap.put(diposableGoods.getId(), diposableGoods); + for (DisposableGoodsStock diposableGoodsStock : allDiposableGoodsStock) { + idToDiposableGoodsStockMap.put(diposableGoodsStock.getDisposableGoodsID(), diposableGoodsStock); } // 获取批次 List batchStocks = null; - String batchStockIDsStr = SqlUtils + String batchIDsStr = SqlUtils .joinToWhereInConditionForNonStringProperties(batchIdsSet); - if (StringUtils.isNotBlank(batchStockIDsStr)) { - String batchStockSql = String.format(" where po.id in (%s) ", - batchStockIDsStr); + if (StringUtils.isNotBlank(batchIDsStr)) { + String batchSql = String.format(" where po.disposableGoodsBatchID in (%s) ", + batchIDsStr); batchStocks = (List) objectDao.findBySql( DisposableGoodsBatchStock.class.getSimpleName(), - batchStockSql); + batchSql); } if (batchStocks == null || batchStocks.size() != batchIdsSet.size()) { throw new RuntimeException("某些批次已被删除!"); } if (batchStocks != null) { for (DisposableGoodsBatchStock disposableGoodsBatchStock : batchStocks) { - idToBatchStockMap.put(disposableGoodsBatchStock.getId(), + idToBatchStockMap.put(disposableGoodsBatchStock.getDisposableGoodsBatchID(), disposableGoodsBatchStock); } } @@ -486,7 +585,7 @@ Set diposableGoodsIDsSet = new HashSet();// 一次性物品id集合 Set batchIdsSet = new HashSet();// 批次id集合 Set identificationIdsSet = new HashSet();// 标识号id集合 - Map idToDiposableGoodsMap = new HashMap(); + Map idToDiposableGoodsStockMap = new HashMap(); Map idToBatchStockMap = new HashMap(); Map idToIdentificationMap = new HashMap(); @@ -518,13 +617,13 @@ if (diposableGoodsIDsSet.size() == 0) { throw new RuntimeException("物品已被删除!"); } - lockAndGetDiposableGoodsResources(diposableGoodsIDsSet, batchIdsSet, - identificationIdsSet, idToDiposableGoodsMap, idToBatchStockMap, + lockAndGetDiposableGoodsStockResources(diposableGoodsIDsSet, batchIdsSet, + identificationIdsSet, idToDiposableGoodsStockMap, idToBatchStockMap, idToIdentificationMap); curStockTakeInfo.setStockTakeItems(stockTakeInfo.getStockTakeItems()); saveDiposableGoodsStockTakeInfo(curStockTakeInfo, isUpdateStock, - idToDiposableGoodsMap, idToBatchStockMap); + idToDiposableGoodsStockMap, idToBatchStockMap); } @@ -653,12 +752,14 @@ if(in_array.size() > 0){ MaterialEntry entry = new MaterialEntry(); entry.setType(MaterialEntry.TYPE_IN); + entry.setSubType(MaterialEntry.SUBTYPE_STOCKTAKE_IN);//盘盈入库 entry.setOperator(stockTakeInfo.getStockTakePerson()); entry.setSerialNumber(serialNumManager .getSerialNumberStr(SerialNum.TYPE_INSERT_GODOWN)); entry.setTime(stockTakeInfo.getStockTakeDate()); entry.setWareHouseId(stockTakeInfo.getWareHouseId()); entry.setWareHouseName(stockTakeInfo.getWareHouseName()); + entry.setSourceId(stockTakeInfo.getId());//记录盘点记录的ID try { materialEntryManager.saveMaterialEntry(entry, in_array.toString()); } catch (Exception e) { @@ -669,12 +770,14 @@ if(out_array.size() > 0){ MaterialEntry entry = new MaterialEntry(); entry.setType(MaterialEntry.TYPE_OUT); + entry.setSubType(MaterialEntry.SUBTYPE_STOCKTAKE_OUT);//盘亏出库 entry.setOperator(stockTakeInfo.getStockTakePerson()); entry.setSerialNumber(serialNumManager .getSerialNumberStr(SerialNum.TYPE_INSERT_GODOWN)); entry.setTime(stockTakeInfo.getStockTakeDate()); entry.setWareHouseId(stockTakeInfo.getWareHouseId()); entry.setWareHouseName(stockTakeInfo.getWareHouseName()); + entry.setSourceId(stockTakeInfo.getId());//记录盘点记录的ID try { materialEntryManager.saveMaterialEntry(entry, out_array.toString()); } catch (Exception e) {