📄 mstorage.java
字号:
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID instance
* @return existing/new or null
*/
public static MStorage getCreate (Properties ctx, int M_Locator_ID,
int M_Product_ID, int M_AttributeSetInstance_ID, String trxName)
{
if (M_Locator_ID == 0)
throw new IllegalArgumentException("M_Locator_ID=0");
if (M_Product_ID == 0)
throw new IllegalArgumentException("M_Product_ID=0");
MStorage retValue = get(ctx, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, trxName);
if (retValue != null)
return retValue;
// Insert row based on locator
MLocator locator = new MLocator (ctx, M_Locator_ID, trxName);
if (locator.get_ID() != M_Locator_ID)
throw new IllegalArgumentException("Not found M_Locator_ID=" + M_Locator_ID);
//
retValue = new MStorage (locator, M_Product_ID, M_AttributeSetInstance_ID);
retValue.save(trxName);
s_log.fine("New " + retValue);
return retValue;
} // getCreate
/**
* Update Storage Info add.
* Called from MProjectIssue
* @param ctx context
* @param M_Locator_ID locator
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID AS Instance
* @param reservationAttributeSetInstance_ID reservation AS Instance
* @param diffQtyOnHand add on hand
* @param diffQtyReserved add reserved
* @param diffQtyOrdered add order
* @return true if updated
*/
public static boolean add (Properties ctx, int M_Warehouse_ID, int M_Locator_ID,
int M_Product_ID, int M_AttributeSetInstance_ID, int reservationAttributeSetInstance_ID,
BigDecimal diffQtyOnHand,
BigDecimal diffQtyReserved, BigDecimal diffQtyOrdered, String trxName)
{
MStorage storage = null;
StringBuffer diffText = new StringBuffer("(");
// Get Storage
if (storage == null)
storage = getCreate (ctx, M_Locator_ID,
M_Product_ID, M_AttributeSetInstance_ID, trxName);
// Verify
if (storage.getM_Locator_ID() != M_Locator_ID
&& storage.getM_Product_ID() != M_Product_ID
&& storage.getM_AttributeSetInstance_ID() != M_AttributeSetInstance_ID)
{
s_log.severe ("No Storage found - M_Locator_ID=" + M_Locator_ID
+ ",M_Product_ID=" + M_Product_ID + ",ASI=" + M_AttributeSetInstance_ID);
return false;
}
MStorage storage0 = null;
if (M_AttributeSetInstance_ID != reservationAttributeSetInstance_ID)
{
storage0 = get(ctx, M_Locator_ID,
M_Product_ID, reservationAttributeSetInstance_ID, trxName);
if (storage0 == null) // create if not existing - should not happen
{
MWarehouse wh = MWarehouse.get(ctx, M_Warehouse_ID);
int xM_Locator_ID = wh.getDefaultLocator().getM_Locator_ID();
storage0 = getCreate (ctx, xM_Locator_ID,
M_Product_ID, reservationAttributeSetInstance_ID, trxName);
}
}
boolean changed = false;
if (diffQtyOnHand != null && diffQtyOnHand.signum() != 0)
{
storage.setQtyOnHand (storage.getQtyOnHand().add (diffQtyOnHand));
diffText.append("OnHand=").append(diffQtyOnHand);
changed = true;
}
if (diffQtyReserved != null && diffQtyReserved.signum() != 0)
{
if (storage0 == null)
storage.setQtyReserved (storage.getQtyReserved().add (diffQtyReserved));
else
storage0.setQtyReserved (storage0.getQtyReserved().add (diffQtyReserved));
diffText.append(" Reserved=").append(diffQtyReserved);
changed = true;
}
if (diffQtyOrdered != null && diffQtyOrdered.signum() != 0)
{
if (storage0 == null)
storage.setQtyOrdered (storage.getQtyOrdered().add (diffQtyOrdered));
else
storage0.setQtyOrdered (storage0.getQtyOrdered().add (diffQtyOrdered));
diffText.append(" Ordered=").append(diffQtyOrdered);
changed = true;
}
if (changed)
{
diffText.append(") -> ").append(storage.toString());
s_log.fine(diffText.toString());
if (storage0 != null)
storage0.save(trxName); // No AttributeSetInstance (reserved/ordered)
return storage.save (trxName);
}
return true;
} // add
/**************************************************************************
* Get Location with highest Locator Priority and a sufficient OnHand Qty
* @param M_Warehouse_ID warehouse
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID asi
* @return id
*/
public static int getM_Locator_ID (int M_Warehouse_ID,
int M_Product_ID, int M_AttributeSetInstance_ID, BigDecimal Qty,
String trxName)
{
int M_Locator_ID = 0;
int firstM_Locator_ID = 0;
String sql = "SELECT s.M_Locator_ID, s.QtyOnHand "
+ "FROM M_Storage s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
+ " INNER JOIN M_Product p ON (s.M_Product_ID=p.M_Product_ID)"
+ " LEFT OUTER JOIN M_AttributeSet mas ON (p.M_AttributeSet_ID=mas.M_AttributeSet_ID) "
+ "WHERE l.M_Warehouse_ID=?"
+ " AND s.M_Product_ID=?"
+ " AND (mas.IsInstanceAttribute IS NULL OR mas.IsInstanceAttribute='N' OR s.M_AttributeSetInstance_ID=?)"
+ " AND l.IsActive='Y' "
+ "ORDER BY l.PriorityNo DESC, s.QtyOnHand DESC";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, trxName);
pstmt.setInt(1, M_Warehouse_ID);
pstmt.setInt(2, M_Product_ID);
pstmt.setInt(3, M_AttributeSetInstance_ID);
ResultSet rs = pstmt.executeQuery();
while (rs.next())
{
BigDecimal QtyOnHand = rs.getBigDecimal(2);
if (QtyOnHand != null && Qty.compareTo(QtyOnHand) <= 0)
{
M_Locator_ID = rs.getInt(1);
break;
}
if (firstM_Locator_ID == 0)
firstM_Locator_ID = rs.getInt(1);
}
rs.close();
pstmt.close();
pstmt = null;
}
catch (SQLException ex)
{
s_log.log(Level.SEVERE, sql, ex);
}
try
{
if (pstmt != null)
pstmt.close();
}
catch (SQLException ex1)
{
}
pstmt = null;
if (M_Locator_ID != 0)
return M_Locator_ID;
return firstM_Locator_ID;
} // getM_Locator_ID
/**
* Get Available Qty.
* The call is accurate only if there is a storage record
* and assumes that the product is stocked
* @param M_Warehouse_ID wh
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID masi
* @return qty available (QtyOnHand-QtyReserved) or null
*/
public static BigDecimal getQtyAvailable (int M_Warehouse_ID,
int M_Product_ID, int M_AttributeSetInstance_ID, String trxName)
{
BigDecimal retValue = null;
PreparedStatement pstmt = null;
String sql = "SELECT SUM(QtyOnHand-QtyReserved) "
+ "FROM M_Storage s"
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID) "
+ "WHERE s.M_Product_ID=?"
+ " AND l.M_Warehouse_ID=?";
if (M_AttributeSetInstance_ID != 0)
sql += " AND M_AttributeSetInstance_ID=?";
try
{
pstmt = DB.prepareStatement (sql, trxName);
pstmt.setInt (1, M_Product_ID);
pstmt.setInt (2, M_Warehouse_ID);
if (M_AttributeSetInstance_ID != 0)
pstmt.setInt(3, M_AttributeSetInstance_ID);
ResultSet rs = pstmt.executeQuery ();
if (rs.next ())
{
retValue = rs.getBigDecimal(1);
if (rs.wasNull())
retValue = null;
}
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
s_log.fine("M_Warehouse_ID=" + M_Warehouse_ID
+ ",M_Product_ID=" + M_Product_ID + " = " + retValue);
return retValue;
} // getQtyAvailable
/**************************************************************************
* Persistency Constructor
* @param ctx context
* @param ignored ignored
*/
public MStorage (Properties ctx, int ignored, String trxName)
{
super(ctx, 0, trxName);
if (ignored != 0)
throw new IllegalArgumentException("Multi-Key");
//
setQtyOnHand (Env.ZERO);
setQtyOrdered (Env.ZERO);
setQtyReserved (Env.ZERO);
} // MStorage
/**
* Load Constructor
* @param ctx context
* @param rs result set
*/
public MStorage (Properties ctx, ResultSet rs, String trxName)
{
super(ctx, rs, trxName);
} // MStorage
/**
* Full NEW Constructor
* @param locator (parent) locator
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID attribute
*/
private MStorage (MLocator locator, int M_Product_ID, int M_AttributeSetInstance_ID)
{
this (locator.getCtx(), 0, locator.get_TrxName());
setClientOrg(locator);
setM_Locator_ID (locator.getM_Locator_ID());
setM_Product_ID (M_Product_ID);
setM_AttributeSetInstance_ID (M_AttributeSetInstance_ID);
} // MStorage
/** Log */
private static CLogger s_log = CLogger.getCLogger (MStorage.class);
/** Warehouse */
private int m_M_Warehouse_ID = 0;
/**
* Change Qty OnHand
* @param qty quantity
* @param add add if true
*/
public void changeQtyOnHand (BigDecimal qty, boolean add)
{
if (qty == null || qty.signum() == 0)
return;
if (add)
setQtyOnHand(getQtyOnHand().add(qty));
else
setQtyOnHand(getQtyOnHand().subtract(qty));
} // changeQtyOnHand
/**
* Get M_Warehouse_ID of Locator
* @return warehouse
*/
public int getM_Warehouse_ID()
{
if (m_M_Warehouse_ID == 0)
{
MLocator loc = MLocator.get(getCtx(), getM_Locator_ID());
m_M_Warehouse_ID = loc.getM_Warehouse_ID();
}
return m_M_Warehouse_ID;
} // getM_Warehouse_ID
/**
* String Representation
* @return info
*/
public String toString()
{
StringBuffer sb = new StringBuffer("MStorage[")
.append("M_Locator_ID=").append(getM_Locator_ID())
.append(",M_Product_ID=").append(getM_Product_ID())
.append(",M_AttributeSetInstance_ID=").append(getM_AttributeSetInstance_ID())
.append(": OnHand=").append(getQtyOnHand())
.append(",Reserved=").append(getQtyReserved())
.append(",Ordered=").append(getQtyOrdered())
.append("]");
return sb.toString();
} // toString
} // MStorage
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -