📄 productdisplayworker.java
字号:
Collection orderRoles = delegator.findByAnd("OrderRole", UtilMisc.toMap("partyId", userLogin.get("partyId"), "roleTypeId", USER_ORDER_ROLE_TYPES[i]), null); 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 + -