Author: jacopoc
Date: Sun Jan 20 08:31:05 2008 New Revision: 613599 URL: http://svn.apache.org/viewvc?rev=613599&view=rev Log: Misc fixes for the MRP algorithm (including two reported by Daniel Riquelme in the dev list). Modified: ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml Modified: ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml?rev=613599&r1=613598&r2=613599&view=diff ============================================================================== --- ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml (original) +++ ofbiz/trunk/applications/manufacturing/servicedef/services_mrp.xml Sun Jan 20 08:31:05 2008 @@ -27,7 +27,7 @@ <!-- MRP services --> <service name="executeMrp" engine="java" location="org.ofbiz.manufacturing.mrp.MrpServices" invoke="executeMrp" auth="true" - transaction-timeout="7200" max-retry="0" use-transaction="false"> + transaction-timeout="7200" max-retry="0"> <description>Performs a run of Mrp</description> <attribute name="facilityGroupId" type="String" mode="IN" optional="true"/> <attribute name="facilityId" type="String" mode="IN" optional="true"/> @@ -36,9 +36,11 @@ <attribute name="msgResult" type="List" mode="OUT" optional="false"/> </service> <service name="initMrpEvents" engine="java" - location="org.ofbiz.manufacturing.mrp.MrpServices" invoke="initMrpEvents" auth="true" use-transaction="false"> + location="org.ofbiz.manufacturing.mrp.MrpServices" invoke="initMrpEvents" auth="true"> <description>Initialize data for the MRP</description> <attribute name="mrpId" type="String" mode="IN" optional="false"/> + <attribute name="facilityId" type="String" mode="IN" optional="false"/> + <attribute name="manufacturingFacilityId" type="String" mode="IN" optional="false"/> <attribute name="reInitialize" type="Boolean" mode="IN" optional="false"/> <attribute name="defaultYearsOffset" type="Integer" mode="IN" optional="true"/> </service> Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java?rev=613599&r1=613598&r2=613599&view=diff ============================================================================== --- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java (original) +++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/mrp/MrpServices.java Sun Jan 20 08:31:05 2008 @@ -19,6 +19,7 @@ package org.ofbiz.manufacturing.mrp; +import java.math.BigDecimal; import java.sql.Timestamp; import java.util.Calendar; import java.util.HashMap; @@ -37,10 +38,12 @@ import org.ofbiz.entity.GenericEntityException; import org.ofbiz.entity.GenericValue; import org.ofbiz.entity.condition.EntityCondition; +import org.ofbiz.entity.condition.EntityConditionList; import org.ofbiz.entity.condition.EntityExpr; import org.ofbiz.entity.condition.EntityOperator; import org.ofbiz.entity.util.EntityUtil; import org.ofbiz.manufacturing.bom.BOMNode; +import org.ofbiz.order.order.OrderReadHelper; import org.ofbiz.service.DispatchContext; import org.ofbiz.service.GenericServiceException; import org.ofbiz.service.LocalDispatcher; @@ -56,26 +59,12 @@ public static final String module = MrpServices.class.getName(); public static final String resource = "ManufacturingUiLabels"; - - - /** - * Initialize the MrpEvent table. - * <li>INPUT : Parameter to get from the context :</li><ul> - * <li>Boolean reInitialize<br/> - * if true : we must reinitialize the table, else we synchronize the table (not for the moment)</li></ul> - * - * <li>OUTPUT : Result to put in the map :</li><ul> - * <li>none</li></ul> - * - * @param ctx The DispatchContext that this service is operating in. - * @param context Map containing the input parameters. - * @return Map with the result of the service, the output parameters. - */ - public static Map initMrpEvents(DispatchContext ctx, Map context) { GenericDelegator delegator = ctx.getDelegator(); Timestamp now = UtilDateTime.nowTimestamp(); + String facilityId = (String)context.get("facilityId"); + String manufacturingFacilityId = (String)context.get("manufacturingFacilityId"); Integer defaultYearsOffset = (Integer)context.get("defaultYearsOffset"); String mrpId = (String)context.get("mrpId"); @@ -155,6 +144,7 @@ resultList = null; iteratorResult = null; parameters = UtilMisc.toMap("orderTypeId", "SALES_ORDER", "oiStatusId", "ITEM_APPROVED"); + parameters.put("facilityId", facilityId); try { resultList = delegator.findByAnd("OrderHeaderItemAndShipGroup", parameters, UtilMisc.toList("orderId")); } catch(GenericEntityException e) { @@ -166,12 +156,20 @@ while (iteratorResult.hasNext()) { genericResult = (GenericValue) iteratorResult.next(); String productId = genericResult.getString("productId"); + Double reservedQuantity = genericResult.getDouble("reservedQuantity"); Double shipGroupQuantity = genericResult.getDouble("quantity"); Double cancelledQuantity = genericResult.getDouble("cancelQuantity"); - if (UtilValidate.isNotEmpty(cancelledQuantity)) { - shipGroupQuantity = new Double(shipGroupQuantity.doubleValue() - cancelledQuantity.doubleValue()); + Double eventQuantityTmp = new Double(0.0); + + if (UtilValidate.isNotEmpty(reservedQuantity)) { + eventQuantityTmp = new Double(-1.0 * reservedQuantity.doubleValue()); + } else { + if (UtilValidate.isNotEmpty(cancelledQuantity)) { + shipGroupQuantity = new Double(shipGroupQuantity.doubleValue() - cancelledQuantity.doubleValue()); + } + eventQuantityTmp = new Double(-1.0 * shipGroupQuantity.doubleValue()); } - Double eventQuantityTmp = new Double(-1.0 * shipGroupQuantity.doubleValue()); + if (eventQuantityTmp.doubleValue() == 0) { continue; } @@ -209,7 +207,7 @@ // ---------------------------------------- resultList = null; iteratorResult = null; - parameters = UtilMisc.toMap("requirementTypeId", "PRODUCT_REQUIREMENT", "statusId", "REQ_APPROVED"); + parameters = UtilMisc.toMap("requirementTypeId", "PRODUCT_REQUIREMENT", "statusId", "REQ_APPROVED", "facilityId", facilityId); try{ resultList = delegator.findByAnd("Requirement", parameters); } catch(GenericEntityException e) { @@ -243,16 +241,20 @@ iteratorResult = null; String orderId = null; GenericValue orderDeliverySchedule = null; - parameters = UtilMisc.toMap("orderTypeId", "PURCHASE_ORDER", "itemStatusId", "ITEM_APPROVED"); try { - resultList = delegator.findByAnd("OrderHeaderAndItems", parameters, UtilMisc.toList("orderId")); + List facilityContactMechs = EntityUtil.filterByDate(delegator.findByAnd("FacilityContactMech", UtilMisc.toMap("facilityId", facilityId))); + List facilityContactMechIds = EntityUtil.getFieldListFromEntityList(facilityContactMechs, "contactMechId", true); + List searchConditions = UtilMisc.toList(new EntityExpr("orderTypeId", EntityOperator.EQUALS, "PURCHASE_ORDER"), + new EntityExpr("oiStatusId", EntityOperator.EQUALS, "ITEM_APPROVED"), + new EntityExpr("contactMechId", EntityOperator.IN, facilityContactMechIds)); + List fieldsToSelect = UtilMisc.toList("orderId", "orderItemSeqId", "productId", "quantity", "cancelQuantity", "oiEstimatedDeliveryDate"); + resultList = delegator.findByCondition("OrderHeaderItemAndShipGroup", new EntityConditionList(searchConditions, EntityOperator.AND), fieldsToSelect, UtilMisc.toList("orderDate")); + } catch(GenericEntityException e) { - Debug.logError(e, "Error : delegator.findByAnd(\"OrderItem\", parameters\")", module); - Debug.logError(e, "Error : parameters = "+parameters,module); return ServiceUtil.returnError("Problem, we can not find the order items, for more detail look at the log"); } iteratorResult = resultList.iterator(); - while(iteratorResult.hasNext()){ + while (iteratorResult.hasNext()) { genericResult = (GenericValue) iteratorResult.next(); String newOrderId = genericResult.getString("orderId"); if (!newOrderId.equals(orderId)) { @@ -264,7 +266,26 @@ } } String productId = genericResult.getString("productId"); - Double eventQuantityTmp = new Double(genericResult.getDouble("quantity").doubleValue()); + + Double shipGroupQuantity = genericResult.getDouble("quantity"); + Double cancelledQuantity = genericResult.getDouble("cancelQuantity"); + if (UtilValidate.isEmpty(shipGroupQuantity)) { + shipGroupQuantity = new Double(0); + } + if (UtilValidate.isNotEmpty(cancelledQuantity)) { + shipGroupQuantity = new Double(shipGroupQuantity.doubleValue() - cancelledQuantity.doubleValue()); + } + + OrderReadHelper orh = new OrderReadHelper(delegator, orderId); + BigDecimal shippedQuantity = null; + try { + shippedQuantity = orh.getItemShippedQuantity(genericResult.getRelatedOne("OrderItem")); + } catch (GenericEntityException e) { + } + if (UtilValidate.isNotEmpty(shippedQuantity)) { + shipGroupQuantity = new Double(shipGroupQuantity.doubleValue() - shippedQuantity.doubleValue()); + } + GenericValue orderItemDeliverySchedule = null; try { orderItemDeliverySchedule = delegator.findByPrimaryKey("OrderDeliverySchedule", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", genericResult.getString("orderItemSeqId"))); @@ -284,7 +305,7 @@ parameters = UtilMisc.toMap("mrpId", mrpId, "productId", productId, "eventDate", estimatedShipDate, "mrpEventTypeId", "PUR_ORDER_RECP"); try { - InventoryEventPlannedServices.createOrUpdateMrpEvent(parameters, eventQuantityTmp, null, genericResult.getString("orderId") + "-" + genericResult.getString("orderItemSeqId"), false, delegator); + InventoryEventPlannedServices.createOrUpdateMrpEvent(parameters, shipGroupQuantity, null, genericResult.getString("orderId") + "-" + genericResult.getString("orderItemSeqId"), false, delegator); } catch (GenericEntityException e) { return ServiceUtil.returnError("Problem initializing the MrpEvent entity (PUR_ORDER_RECP)"); } @@ -295,7 +316,7 @@ // ---------------------------------------- resultList = null; iteratorResult = null; - parameters = UtilMisc.toMap("workEffortGoodStdTypeId", "PRUNT_PROD_NEEDED", "statusId", "WEGS_CREATED"); + parameters = UtilMisc.toMap("workEffortGoodStdTypeId", "PRUNT_PROD_NEEDED", "statusId", "WEGS_CREATED", "facilityId", facilityId); try { resultList = delegator.findByAnd("WorkEffortAndGoods", parameters); } catch(GenericEntityException e) { @@ -327,7 +348,7 @@ // ---------------------------------------- resultList = null; iteratorResult = null; - parameters = UtilMisc.toMap("workEffortGoodStdTypeId", "PRUN_PROD_DELIV", "statusId", "WEGS_CREATED", "workEffortTypeId", "PROD_ORDER_HEADER"); + parameters = UtilMisc.toMap("workEffortGoodStdTypeId", "PRUN_PROD_DELIV", "statusId", "WEGS_CREATED", "workEffortTypeId", "PROD_ORDER_HEADER", "facilityId", facilityId); try { resultList = delegator.findByAnd("WorkEffortAndGoods", parameters); } catch(GenericEntityException e) { @@ -368,7 +389,6 @@ } } - Map result = new HashMap(); result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS); Debug.logInfo("return from initMrpEvent", module); @@ -538,7 +558,7 @@ boolean isBuilt = false; GenericValue routing = null; - String mrpId = delegator.getNextSeqId("Mrp"); + String mrpId = delegator.getNextSeqId("MrpEvent"); Map result = null; Map parameters = null; @@ -548,6 +568,8 @@ // Initialisation of the MrpEvent table, This table will contain the products we want to buy or build. parameters = UtilMisc.toMap("mrpId", mrpId, "reInitialize", Boolean.TRUE, "defaultYearsOffset", defaultYearsOffset, "userLogin", userLogin); + parameters.put("facilityId", facilityId); + parameters.put("manufacturingFacilityId", manufacturingFacilityId); try { result = dispatcher.runSync("initMrpEvents", parameters); } catch (GenericServiceException e) { Modified: ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml?rev=613599&r1=613598&r2=613599&view=diff ============================================================================== --- ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml (original) +++ ofbiz/trunk/applications/order/entitydef/entitymodel_view.xml Sun Jan 20 08:31:05 2008 @@ -606,6 +606,8 @@ <member-entity entity-alias="OI" entity-name="OrderItem"/> <member-entity entity-alias="OISGA" entity-name="OrderItemShipGroupAssoc"/> <member-entity entity-alias="OISG" entity-name="OrderItemShipGroup"/> + <member-entity entity-alias="OISGIR" entity-name="OrderItemShipGrpInvRes"/> + <member-entity entity-alias="II" entity-name="InventoryItem"/> <alias-all entity-alias="OH"/> <alias-all entity-alias="OISGA"/> <alias-all entity-alias="OISG"/> @@ -629,6 +631,8 @@ <alias entity-alias="OI" name="oiStatusId" field="statusId"/> <alias entity-alias="OI" name="oiExternalId" field="externalId"/> <alias entity-alias="OI" name="oiSyncStatusId" field="syncStatusId"/> + <alias entity-alias="OISGIR" name="reservedQuantity" field="quantity"/> + <alias entity-alias="II" name="facilityId"/> <view-link entity-alias="OH" rel-entity-alias="OI"> <key-map field-name="orderId"/> </view-link> @@ -640,6 +644,18 @@ <key-map field-name="orderId"/> <key-map field-name="shipGroupSeqId"/> </view-link> + <view-link entity-alias="OISGA" rel-entity-alias="OISGIR" rel-optional="true"> + <key-map field-name="orderId"/> + <key-map field-name="orderItemSeqId"/> + <key-map field-name="shipGroupSeqId"/> + </view-link> + <view-link entity-alias="OISGIR" rel-entity-alias="II" rel-optional="true"> + <key-map field-name="inventoryItemId"/> + </view-link> + <relation type="one-nofk" rel-entity-name="OrderItem"> + <key-map field-name="orderId"/> + <key-map field-name="orderItemSeqId"/> + </relation> </view-entity> <view-entity entity-name="OrderItemAndShipGroupAssoc" package-name="org.ofbiz.order.order" |
Free forum by Nabble | Edit this page |