📄 productdisplayworker.java
字号:
Iterator ordersIter = UtilMisc.toIterator(orderRoles);
while (ordersIter != null && ordersIter.hasNext()) {
GenericValue orderRole = (GenericValue) ordersIter.next();
// for each order role get all order items
Collection orderItems = orderRole.getRelated("OrderItem");
Iterator orderItemsIter = UtilMisc.toIterator(orderItems);
while (orderItemsIter != null && orderItemsIter.hasNext()) {
GenericValue orderItem = (GenericValue) orderItemsIter.next();
// for each order item get the associated product
GenericValue product = orderItem.getRelatedOneCache("Product");
products.put(product.get("productId"), product);
Integer curQuant = (Integer) productQuantities.get(product.get("productId"));
if (curQuant == null) curQuant = new Integer(0);
Double orderQuant = orderItem.getDouble("quantity");
if (orderQuant == null) orderQuant = new Double(0.0);
productQuantities.put(product.get("productId"), new Integer(curQuant.intValue() + orderQuant.intValue()));
Integer curOcc = (Integer) productOccurances.get(product.get("productId"));
if (curOcc == null) curOcc = new Integer(0);
productOccurances.put(product.get("productId"), new Integer(curOcc.intValue() + 1));
}
}
}
// go through each product quantity and divide it by the occurances to get the average
Iterator quantEntries = productQuantities.entrySet().iterator();
while (quantEntries.hasNext()) {
Map.Entry entry = (Map.Entry) quantEntries.next();
Object prodId = entry.getKey();
Integer quantity = (Integer) entry.getValue();
Integer occs = (Integer) productOccurances.get(prodId);
int nqint = quantity.intValue() / occs.intValue();
if (nqint < 1) nqint = 1;
productQuantities.put(prodId, new Integer(nqint));
}
httpRequest.getSession().setAttribute("_QUICK_REORDER_PRODUCTS_", new HashMap(products));
httpRequest.getSession().setAttribute("_QUICK_REORDER_PRODUCT_QUANTITIES_", new HashMap(productQuantities));
httpRequest.getSession().setAttribute("_QUICK_REORDER_PRODUCT_OCCURANCES_", new HashMap(productOccurances));
} else {
// make a copy since we are going to change them
products = new HashMap(products);
productQuantities = new HashMap(productQuantities);
productOccurances = new HashMap(productOccurances);
}
// remove all products that are already in the cart
ShoppingCart cart = (ShoppingCart) httpRequest.getSession().getAttribute("shoppingCart");
if (cart != null && cart.size() > 0) {
Iterator cartiter = cart.iterator();
while (cartiter.hasNext()) {
ShoppingCartItem item = (ShoppingCartItem) cartiter.next();
String productId = item.getProductId();
products.remove(productId);
productQuantities.remove(productId);
productOccurances.remove(productId);
}
}
// if desired check view allow category
//if (checkViewAllow) {
List prodKeyList = new ArrayList(products.keySet());
//Set prodKeySet = products.keySet();
String currentCatalogId = CatalogWorker.getCurrentCatalogId(request);
String viewProductCategoryId = CatalogWorker.getCatalogViewAllowCategoryId(delegator, currentCatalogId);
if (viewProductCategoryId != null) {
Iterator valIter = prodKeyList.iterator();
while (valIter.hasNext()) {
String productId = (String) valIter.next();
if (!CategoryWorker.isProductInCategory(delegator, productId, viewProductCategoryId)) {
products.remove(productId);
productQuantities.remove(productId);
productOccurances.remove(productId);
}
}
}
//}
List reorderProds = new ArrayList(products.values());
/*
//randomly remove products while there are more than 5
while (reorderProds.size() > 5) {
int toRemove = (int)(Math.random()*(double)(reorderProds.size()));
reorderProds.remove(toRemove);
}
*/
// sort descending by new metric...
double occurancesModifier = 1.0;
double quantityModifier = 1.0;
Map newMetric = new HashMap();
Iterator occurEntries = productOccurances.entrySet().iterator();
while (occurEntries.hasNext()) {
Map.Entry entry = (Map.Entry) occurEntries.next();
Object prodId = entry.getKey();
Integer quantity = (Integer) entry.getValue();
Integer occs = (Integer) productQuantities.get(prodId);
double nqdbl = quantity.doubleValue() * quantityModifier + occs.doubleValue() * occurancesModifier;
newMetric.put(prodId, new Double(nqdbl));
}
reorderProds = productOrderByMap(reorderProds, newMetric, true);
// remove extra products - only return 5
while (reorderProds.size() > 5) {
reorderProds.remove(reorderProds.size() - 1);
}
results.put("products", reorderProds);
results.put("quantities", productQuantities);
} catch (GenericEntityException e) {
Debug.logWarning(e, module);
}
return results;
}
public static List productOrderByMap(Collection values, Map orderByMap, boolean descending) {
if (values == null) return null;
if (values.size() == 0) return UtilMisc.toList(values);
List result = new ArrayList(values);
Collections.sort(result, new ProductByMapComparator(orderByMap, descending));
return result;
}
static class ProductByMapComparator implements Comparator {
private Map orderByMap;
private boolean descending;
ProductByMapComparator(Map orderByMap, boolean descending) {
this.orderByMap = orderByMap;
this.descending = descending;
}
public int compare(java.lang.Object prod1, java.lang.Object prod2) {
int result = compareAsc((GenericEntity) prod1, (GenericEntity) prod2);
if (descending) {
result = -result;
}
return result;
}
private int compareAsc(GenericEntity prod1, GenericEntity prod2) {
Object value = orderByMap.get(prod1.get("productId"));
Object value2 = orderByMap.get(prod2.get("productId"));
// null is defined as the smallest possible value
if (value == null) return value2 == null ? 0 : -1;
return ((Comparable) value).compareTo(value2);
}
public boolean equals(java.lang.Object obj) {
if ((obj != null) && (obj instanceof ProductByMapComparator)) {
ProductByMapComparator that = (ProductByMapComparator) obj;
return this.orderByMap.equals(that.orderByMap) && this.descending == that.descending;
} else {
return false;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -