Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java =================================================================== diff -u -r15096 -r15228 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 15096) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 15228) @@ -336,6 +336,8 @@ List status = new LinkedList(); status.add(TousseInstance.STATUS_DISINFECTED); status.add(TousseInstance.STATUS_STERILED); + status.add(TousseInstance.STATUS_SHIPPED); + status.add(TousseInstance.STATUS_SIGNED); return SqlUtils.getStringFieldInCollectionsPredicate("po.status", status); } /** Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r15095 -r15228 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 15095) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 15228) @@ -1280,8 +1280,10 @@ String sqlCondition = " where 1=1 "; //二级供应室 if(roomType == SupplyRoomConfig.SUPPLYROOM_TYPE_2){ - sqlCondition +=" and status ='" + TousseInstance.STATUS_SHIPPED+"'" + sqlCondition +=" and " + SqlBuilder.build_IN_Statement("status", SqlBuilder.IN, + TousseInstance.STATUS_SHIPPED, TousseInstance.STATUS_SIGNED) + " and location = '" + orgUnitCoding + "'"; + }else{//一级供应室 //locationfordisplay为空说明还未发货,还留在供应室 sqlCondition += " and orgUnitCoding ='"+orgUnitCoding+"'"; @@ -1303,24 +1305,13 @@ List waitWasteTousseInstanceList = (List)objectDao.findBySql(TousseInstance.class.getSimpleName(),sqlCondition); if(CollectionUtils.isNotEmpty(waitWasteTousseInstanceList)){ + //更新器械包库存 - List goodsStockList = new ArrayList(); - for(TousseInstance tousseInstance : waitWasteTousseInstanceList){ - GoodsStock goodsStock = new GoodsStock(); - goodsStock.setAmount(1); - goodsStock.setGoodsType(GoodsStock.TYPE_TOUSSE); - goodsStock.setName(tousseInstance.getTousseName()); - goodsStock.setTousseDefinitionId(tousseInstance.getTousseDefinition().getAncestorID()); - goodsStock.setWareHouseId(tousseInstance.getWareHouseId()); - - goodsStock.setWareHouseName(tousseInstance.getWareHouseName()); - goodsStockList.add(goodsStock); - } + List goodsStockList = TousseInstanceUtils.newGoodsStock(waitWasteTousseInstanceList); + //需要先更新包实例状态为废弃,再扣减库存.如果库存不够,这样校验机制才会是正确的 + objectDao.excuteSQL(wasteUpdateSql + sqlCondition); goodsStockManager.saveOrUpdateGoodsStock(goodsStockList, GoodsStockManager.MODE_OUTSTOCK); } - - //更新包实例状态为废弃 - objectDao.excuteSQL(wasteUpdateSql + sqlCondition); } catch (Exception e) { e.printStackTrace(); isCommandExecutedSuccessfully = false; Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/toussedefinition/service/TousseInstanceUtils.java =================================================================== diff -u -r14913 -r15228 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/toussedefinition/service/TousseInstanceUtils.java (.../TousseInstanceUtils.java) (revision 14913) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/toussedefinition/service/TousseInstanceUtils.java (.../TousseInstanceUtils.java) (revision 15228) @@ -13,6 +13,8 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; import org.apache.commons.lang.StringUtils; import com.forgon.Constants; @@ -25,6 +27,7 @@ import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.packing.PackingRecord; import com.forgon.systemsetting.model.HttpOption; +import com.forgon.tools.MathTools; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.util.ForgonDateUtils; @@ -255,8 +258,34 @@ return goodsStock; } /** + * 创建器械包的库存对象。库存的仓库属性取包实例的仓库属性。用于出库。创建的库存对象会根据包实例的祖先id和仓库id进行合并 + * @param tousseInstances 包实例集合 + * @return + */ + public static List newGoodsStock(Collection tousseInstances){ + List goodsStocks = new ArrayList(); + for(TousseInstance tousseInstance : tousseInstances){ + GoodsStock find = CollectionUtils.find(goodsStocks, new Predicate(){ + @Override + public boolean evaluate(GoodsStock object) { + if(MathTools.valueEquals(object.getTousseDefinitionId(), tousseInstance.getTousseDefinition().getAncestorID()) + && MathTools.valueEquals(object.getWareHouseId(), tousseInstance.getWareHouseId())){ + return true; + } + return false; + }}); + if(find == null){ + find = newGoodsStock(tousseInstance); + goodsStocks.add(find); + }else{ + find.setAmount(MathTools.add(find.getAmount(), 1).intValue()); + } + } + return goodsStocks; + } + /** * 创建器械包的库存 - * @param tousseInstance 器械包集合 + * @param tousseInstances 器械包集合 * @param wareHouse 仓库 * @return */ Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseInstanceTableManager.java =================================================================== diff -u -r15078 -r15228 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseInstanceTableManager.java (.../TousseInstanceTableManager.java) (revision 15078) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseInstanceTableManager.java (.../TousseInstanceTableManager.java) (revision 15228) @@ -549,7 +549,7 @@ + SqlBuilder.build_IN_Statement("po.status", SqlBuilder.IN, TousseInstance.STATUS_SHIPPED, TousseInstance.STATUS_SIGNED)); - sqlBuilder.append(" AND po.departmentStock_id is not null"); +// sqlBuilder.append(" AND po.departmentStock_id is not null"); } else { sqlBuilder.append(String.format(" AND po.orgUnitCoding = '%s'", departCodeOfCurrentUser)); @@ -566,7 +566,7 @@ + SqlBuilder.build_IN_Statement("po.status", SqlBuilder.IN, TousseInstance.STATUS_SHIPPED, TousseInstance.STATUS_SIGNED)); - sqlBuilder.append(" AND po.departmentStock_id is not null"); +// sqlBuilder.append(" AND po.departmentStock_id is not null"); } String type = sqlWhereParamMap.get("type"); Index: forgon-tools/src/main/java/com/forgon/tools/MathTools.java =================================================================== diff -u -r14604 -r15228 --- forgon-tools/src/main/java/com/forgon/tools/MathTools.java (.../MathTools.java) (revision 14604) +++ forgon-tools/src/main/java/com/forgon/tools/MathTools.java (.../MathTools.java) (revision 15228) @@ -104,6 +104,25 @@ return a == null?b==null:a.equals(b); } /** + * 判断两个数的值是否相等。复杂类型跟基础类型,用equal方法比较,会得到不相等(Long.valueOf(0).equals(0L)会返回false) + * 所有的数值比较都转换为double来比较,当两个数的差值小于1E-13时,则认为相等 + * @param a 可能为null + * @param b 可能为null + * @return valueEquals(Long.valueOf(0),0) -> true + * valueEquals(Long.valueOf(0),Integer.valueOf(0)) -> true + * valueEquals(Long.valueOf(0),1) -> false + * valueEquals(0.000000000000000034, 0.0000000000000002) -> true + */ + public static boolean valueEquals(Number a,Number b){ + if(a == null && b == null){ + return true; + }else if(a == null || b == null){ + return false; + }else{ + return Math.abs(a.doubleValue()-b.doubleValue()) < 0.0000000000001; + } + } + /** * 计算两个数的差 * @param a 被减数,可以为null,此时认为值为0.0 * @param b 减数,可以为null,此时认为值为0.0