📄 productservices.java
字号:
/*
* $Id: ProductServices.java,v 1.7 2004/02/26 09:10:50 jonesde Exp $
*
* Copyright (c) 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.product;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Locale;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.OrderedMap;
import org.ofbiz.base.util.OrderedSet;
import org.ofbiz.base.util.UtilDateTime;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.product.catalog.CatalogWorker;
import org.ofbiz.product.category.CategoryWorker;
import org.ofbiz.service.DispatchContext;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ModelService;
import org.ofbiz.service.ServiceUtil;
/**
* Product Services
*
* @author <a href="mailto:jaz@ofbiz.org">Andy Zeneski</a>
* @author <a href="mailto:jonesde@ofbiz.org">David E. Jones</a>
* @version $Revision: 1.7 $
* @since 2.0
*/
public class ProductServices {
public static final String module = ProductServices.class.getName();
public static final String resource = "ProductUiLabels";
/**
* Creates a Collection of product entities which are variant products from the specified product ID.
*/
public static Map prodFindAllVariants(DispatchContext dctx, Map context) {
// * String productId -- Parent (virtual) product ID
context.put("type", "PRODUCT_VARIANT");
return prodFindAssociatedByType(dctx, context);
}
/**
* Finds a specific product or products which contain the selected features.
*/
public static Map prodFindSelectedVariant(DispatchContext dctx, Map context) {
// * String productId -- Parent (virtual) product ID
// * Map selectedFeatures -- Selected features
GenericDelegator delegator = dctx.getDelegator();
String productId = (String) context.get("productId");
Map selectedFeatures = (Map) context.get("selectedFeatures");
return ServiceUtil.returnError("This service has not yet been implemented.");
}
/**
* Finds product variants based on a product ID and a distinct feature.
*/
public static Map prodFindDistinctVariants(DispatchContext dctx, Map context) {
// * String productId -- Parent (virtual) product ID
// * String feature -- Distinct feature name
GenericDelegator delegator = dctx.getDelegator();
String productId = (String) context.get("productId");
String feature = (String) context.get("feature");
return ServiceUtil.returnError("This service has not yet been implemented.");
}
/**
* Finds a Set of feature types in sequence.
*/
public static Map prodFindFeatureTypes(DispatchContext dctx, Map context) {
// * String productId -- Product ID to look up feature types
GenericDelegator delegator = dctx.getDelegator();
String productId = (String) context.get("productId");
Locale locale = (Locale) context.get("locale");
String errMsg=null;
Set featureSet = new OrderedSet();
try {
Map fields = UtilMisc.toMap("productId", productId, "productFeatureApplTypeId", "SELECTABLE_FEATURE");
List order = UtilMisc.toList("sequenceNum", "productFeatureTypeId");
List features = delegator.findByAndCache("ProductFeatureAndAppl", fields, order);
Iterator i = features.iterator();
while (i.hasNext()) {
featureSet.add(((GenericValue) i.next()).getString("productFeatureTypeId"));
}
//if (Debug.infoOn()) Debug.logInfo("" + featureSet, module);
} catch (GenericEntityException e) {
Map messageMap = UtilMisc.toMap("errProductFeatures", e.toString());
errMsg = UtilProperties.getMessage(resource,"productservices.problem_reading_product_features_errors", messageMap, locale);
Debug.logError(e, errMsg, module);
return ServiceUtil.returnError(errMsg);
}
if (featureSet.size() == 0) {
errMsg = UtilProperties.getMessage(resource,"productservices.problem_reading_product_features", locale);
// ToDo DO 2004-02-23 Where should the errMsg go?
Debug.logWarning(errMsg, module);
//return ServiceUtil.returnError(errMsg);
}
Map result = ServiceUtil.returnSuccess();
result.put("featureSet", featureSet);
return result;
}
/**
* Builds a variant feature tree.
*/
public static Map prodMakeFeatureTree(DispatchContext dctx, Map context) {
// * String productId -- Parent (virtual) product ID
// * List featureOrder -- Order of features
// * String productStoreId -- Product Store ID for Inventory
String productStoreId = (String) context.get("productStoreId");
Locale locale = (Locale) context.get("locale");
String errMsg=null;
GenericDelegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
Map result = new HashMap();
List featureOrder = new LinkedList((Collection) context.get("featureOrder"));
if (featureOrder == null || featureOrder.size() == 0) {
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, "Empty list of features passed");
return result;
}
Collection variants = (Collection) prodFindAllVariants(dctx, context).get("assocProducts");
if (variants == null || variants.size() == 0) {
errMsg = UtilProperties.getMessage(resource,"productservices.empty_list_of_products_returned", locale);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, errMsg);
return result;
}
List items = new ArrayList();
Iterator i = variants.iterator();
while (i.hasNext()) {
String productIdTo = (String) ((GenericValue) i.next()).get("productIdTo");
// first check to see if intro and discontinue dates are within range
GenericValue productTo = null;
try {
productTo = delegator.findByPrimaryKeyCache("Product", UtilMisc.toMap("productId", productIdTo));
} catch (GenericEntityException e) {
Debug.logError(e, module);
Map messageMap = UtilMisc.toMap("productIdTo", productIdTo);
messageMap.put("errMessage", e.toString());
errMsg = UtilProperties.getMessage(resource,"productservices.error_finding_associated_variant_with_ID_error", messageMap, locale);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, errMsg);
return result;
}
if (productTo == null) {
Debug.logWarning("Could not find associated variant with ID " + productIdTo + ", not showing in list", module);
continue;
}
java.sql.Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
// check to see if introductionDate hasn't passed yet
if (productTo.get("introductionDate") != null && nowTimestamp.before(productTo.getTimestamp("introductionDate"))) {
if (Debug.verboseOn()) {
String excMsg = "Tried to view the Product " + productTo.getString("productName") +
" (productId: " + productTo.getString("productId") + ") as a variant. This product has not yet been made available for sale, so not adding for view.";
Debug.logVerbose(excMsg, module);
}
continue;
}
// check to see if salesDiscontinuationDate has passed
if (productTo.get("salesDiscontinuationDate") != null && nowTimestamp.after(productTo.getTimestamp("salesDiscontinuationDate"))) {
if (Debug.verboseOn()) {
String excMsg = "Tried to view the Product " + productTo.getString("productName") +
" (productId: " + productTo.getString("productId") + ") as a variant. This product is no longer available for sale, so not adding for view.";
Debug.logVerbose(excMsg, module);
}
continue;
}
// next check inventory for each item: if inventory is not required or is available
if (!org.ofbiz.product.store.ProductStoreWorker.isStoreInventoryRequired(productStoreId, productIdTo, delegator) ||
org.ofbiz.product.store.ProductStoreWorker.isStoreInventoryAvailable(productStoreId, productIdTo, 1.0, delegator, dispatcher)) {
items.add(productIdTo);
}
}
String productId = (String) context.get("productId");
// Make the selectable feature list
List selectableFeatures = null;
try {
Map fields = UtilMisc.toMap("productId", productId, "productFeatureApplTypeId", "SELECTABLE_FEATURE");
List sort = UtilMisc.toList("sequenceNum");
selectableFeatures = delegator.findByAndCache("ProductFeatureAndAppl", fields, sort);
selectableFeatures = EntityUtil.filterByDate(selectableFeatures, true);
} catch (GenericEntityException e) {
Debug.logError(e, module);
errMsg = UtilProperties.getMessage(resource,"productservices.empty_list_of_selectable_features_found", locale);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, errMsg);
return result;
}
Map features = new HashMap();
Iterator sFIt = selectableFeatures.iterator();
while (sFIt.hasNext()) {
GenericValue v = (GenericValue) sFIt.next();
String featureType = v.getString("productFeatureTypeId");
String feature = v.getString("description");
if (!features.containsKey(featureType)) {
List featureList = new LinkedList();
featureList.add(feature);
features.put(featureType, featureList);
} else {
List featureList = (LinkedList) features.get(featureType);
featureList.add(feature);
features.put(featureType, featureList);
}
}
Map tree = null;
try {
tree = makeGroup(delegator, features, items, featureOrder, 0);
} catch (Exception e) {
Debug.logError(e, module);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, e.getMessage());
return result;
}
if (tree == null || tree.size() == 0) {
errMsg = UtilProperties.getMessage(resource,"productservices.feature_grouping_came_back_empty", locale);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, errMsg);
} else {
result.put("variantTree", tree);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS);
}
Map sample = null;
try {
sample = makeVariantSample(dctx.getDelegator(), features, items, (String) featureOrder.get(0));
} catch (Exception e) {
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, e.getMessage());
return result;
}
if (sample == null || sample.size() == 0) {
errMsg = UtilProperties.getMessage(resource,"productservices.feature_sample_came_back_empty", locale);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, errMsg);
} else {
result.put("variantSample", sample);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS);
}
return result;
}
/**
* Gets the product features of a product.
*/
public static Map prodGetFeatures(DispatchContext dctx, Map context) {
// * String productId -- Product ID to fond
// * String type -- Type of feature (STANDARD_FEATURE, SELECTABLE_FEATURE)
// * String distinct -- Distinct feature (SIZE, COLOR)
GenericDelegator delegator = dctx.getDelegator();
Map result = new HashMap();
String productId = (String) context.get("productId");
String distinct = (String) context.get("distinct");
String type = (String) context.get("type");
Locale locale = (Locale) context.get("locale");
String errMsg=null;
Collection features = null;
try {
Map fields = UtilMisc.toMap("productId", productId);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -