📄 inventoryservices.java
字号:
/*
* $Id: InventoryServices.java,v 1.4 2004/02/23 15:36:15 jonesde Exp $
*
* Copyright (c) 2001, 2002 The Open For Business Project - www.ofbiz.org
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package org.ofbiz.product.inventory;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilDateTime;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.condition.EntityExpr;
import org.ofbiz.entity.condition.EntityOperator;
import org.ofbiz.service.DispatchContext;
import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ServiceUtil;
/**
* Inventory Services
*
* @author <a href="mailto:jaz@ofbiz.org">Andy Zeneski</a>
* @author <a href="mailto:jonesde@ofbiz.org">David E. Jones</a>
* @author <a href="mailto:tiz@sastau.it">Jacopo Cappellato</a>
* @version $Revision: 1.4 $
* @since 2.0
*/
public class InventoryServices {
public final static String module = InventoryServices.class.getName();
public static Map prepareInventoryTransfer(DispatchContext dctx, Map context) {
GenericDelegator delegator = dctx.getDelegator();
String inventoryItemId = (String) context.get("inventoryItemId");
Double xferQty = (Double) context.get("xferQty");
GenericValue inventoryItem = null;
GenericValue newItem = null;
try {
inventoryItem = delegator.findByPrimaryKey("InventoryItem", UtilMisc.toMap("inventoryItemId", inventoryItemId));
} catch (GenericEntityException e) {
return ServiceUtil.returnError("Inventory item lookup problem [" + e.getMessage() + "]");
}
if (inventoryItem == null) {
return ServiceUtil.returnError("Cannot locate inventory item.");
}
String inventoryType = inventoryItem.getString("inventoryItemTypeId");
if (inventoryType.equals("NON_SERIAL_INV_ITEM")) {
Double atp = inventoryItem.getDouble("availableToPromise");
Double qoh = inventoryItem.getDouble("quantityOnHand");
if (atp == null) {
return ServiceUtil.returnError("The request transfer amount is not available, there is no available to promise on the Inventory Item with ID " + inventoryItem.getString("inventoryItemId"));
}
if (qoh == null) {
qoh = atp;
}
// first make sure we have enough to cover the request transfer amount
if (xferQty.doubleValue() > atp.doubleValue()) {
return ServiceUtil.returnError("The request transfer amount is not available, the available to promise [" + atp + "] is not sufficient for the desired transfer quantity [" + xferQty + "] on the Inventory Item with ID " + inventoryItem.getString("inventoryItemId"));
}
/*
* atp < qoh - split and save the qoh - atp
* xferQty < atp - split and save atp - xferQty
* atp < qoh && xferQty < atp - split and save qoh - atp + atp - xferQty
*/
// at this point we have already made sure that the xferQty is less than or equals to the atp, so if less that just create a new inventory record for the quantity to be moved
// NOTE: atp should always be <= qoh, so if xfer < atp, then xfer < qoh, so no need to check/handle that
// however, if atp < qoh && atp == xferQty, then we still need to split; oh, but no need to check atp == xferQty in the second part because if it isn't greater and isn't less, then it is equal
if (xferQty.doubleValue() < atp.doubleValue() || atp.doubleValue() < qoh.doubleValue()) {
newItem = new GenericValue(inventoryItem);
newItem.set("availableToPromise", xferQty);
newItem.set("quantityOnHand", xferQty);
inventoryItem.set("availableToPromise", new Double(atp.doubleValue() - xferQty.doubleValue()));
inventoryItem.set("quantityOnHand", new Double(qoh.doubleValue() - xferQty.doubleValue()));
}
} else if (inventoryType.equals("SERIALIZED_INV_ITEM")) {
if (!inventoryItem.getString("statusId").equals("INV_AVAILABLE")) {
return ServiceUtil.returnError("Serialized inventory is not available for transfer.");
}
}
// setup values so that no one will grab the inventory during the move
// if newItem is not null, it is the item to be moved, otherwise the original inventoryItem is the one to be moved
if (inventoryType.equals("NON_SERIAL_INV_ITEM")) {
// set the transfered inventory item's atp to 0 and the qoh to the xferQty; at this point atp and qoh will always be the same, so we can safely zero the atp for now
if (newItem != null) {
newItem.set("availableToPromise", new Double(0.0));
} else {
inventoryItem.set("availableToPromise", new Double(0.0));
}
} else if (inventoryType.equals("SERIALIZED_INV_ITEM")) {
// set the status to avoid re-moving or something
if (newItem != null) {
newItem.set("statusId", "INV_BEING_TRANSFERED");
} else {
inventoryItem.set("statusId", "INV_BEING_TRANSFERED");
}
}
try {
Map results = ServiceUtil.returnSuccess();
inventoryItem.store();
if (newItem != null) {
Long newSeqId = delegator.getNextSeqId("InventoryItem");
if (newSeqId == null) {
return ServiceUtil.returnError("ERROR: Could not get next sequence id for InventoryItem, cannot create item.");
}
newItem.set("inventoryItemId", newSeqId.toString());
newItem.create();
results.put("inventoryItemId", newItem.get("inventoryItemId"));
} else {
results.put("inventoryItemId", inventoryItem.get("inventoryItemId"));
}
return results;
} catch (GenericEntityException e) {
return ServiceUtil.returnError("Inventory store/create problem [" + e.getMessage() + "]");
}
}
public static Map completeInventoryTransfer(DispatchContext dctx, Map context) {
GenericDelegator delegator = dctx.getDelegator();
String inventoryTransferId = (String) context.get("inventoryTransferId");
GenericValue inventoryTransfer = null;
GenericValue inventoryItem = null;
try {
inventoryTransfer = delegator.findByPrimaryKey("InventoryTransfer",
UtilMisc.toMap("inventoryTransferId", inventoryTransferId));
inventoryItem = inventoryTransfer.getRelatedOne("InventoryItem");
} catch (GenericEntityException e) {
return ServiceUtil.returnError("Inventory Item/Transfer lookup problem [" + e.getMessage() + "]");
}
if (inventoryTransfer == null || inventoryItem == null)
return ServiceUtil.returnError("ERROR: Lookup of InventoryTransfer and/or InventoryItem failed!");
String inventoryType = inventoryItem.getString("inventoryItemTypeId");
// set the fields on the transfer record
if (inventoryTransfer.get("receiveDate") == null)
inventoryTransfer.set("receiveDate", UtilDateTime.nowTimestamp());
// set the fields on the item
inventoryItem.set("facilityId", inventoryTransfer.get("facilityIdTo"));
inventoryItem.set("containerId", inventoryTransfer.get("containerIdTo"));
inventoryItem.set("locationSeqId", inventoryTransfer.get("locationSeqIdTo"));
if (inventoryType.equals("NON_SERIAL_INV_ITEM"))
inventoryItem.set("availableToPromise", inventoryItem.get("quantityOnHand"));
else if (inventoryType.equals("SERIALIZED_INV_ITEM"))
inventoryItem.set("statusId", "INV_AVAILABLE");
// store the entities
try {
inventoryTransfer.store();
inventoryItem.store();
} catch (GenericEntityException e) {
return ServiceUtil.returnError("Inventory store problem [" + e.getMessage() + "]");
}
return ServiceUtil.returnSuccess();
}
public static Map cancelInventoryTransfer(DispatchContext dctx, Map context) {
GenericDelegator delegator = dctx.getDelegator();
String inventoryTransferId = (String) context.get("inventoryTransferId");
GenericValue inventoryTransfer = null;
GenericValue inventoryItem = null;
try {
inventoryTransfer = delegator.findByPrimaryKey("InventoryTransfer",
UtilMisc.toMap("inventoryTransferId", inventoryTransferId));
inventoryItem = inventoryTransfer.getRelatedOne("InventoryItem");
} catch (GenericEntityException e) {
return ServiceUtil.returnError("Inventory Item/Transfer lookup problem [" + e.getMessage() + "]");
}
if (inventoryTransfer == null || inventoryItem == null)
return ServiceUtil.returnError("ERROR: Lookup of InventoryTransfer and/or InventoryItem failed!");
String inventoryType = inventoryItem.getString("inventoryItemTypeId");
// re-set the fields on the item
if (inventoryType.equals("NON_SERIAL_INV_ITEM"))
inventoryItem.set("availableToPromise", inventoryItem.get("quantityOnHand"));
else if (inventoryType.equals("SERIALIZED_INV_ITEM"))
inventoryItem.set("statusId", "INV_AVAILABLE");
// store the entity
try {
inventoryItem.store();
} catch (GenericEntityException e) {
return ServiceUtil.returnError("Inventory item store problem [" + e.getMessage() + "]");
}
return ServiceUtil.returnSuccess();
}
public static Map checkInventoryAvailability(DispatchContext dctx, Map context) {
GenericDelegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
GenericValue userLogin = (GenericValue) context.get("userLogin");
Map ordersToUpdate = new HashMap();
Map ordersToCancel = new HashMap();
// find all inventory items w/ a negative ATP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -