<entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/> <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel_olap.xml"/> <entity-resource type="group" reader-name="main" loader="main" location="entitydef/entitygroup_olap.xml"/> <entity-resource type="data" reader-name="seed" loader="main" location="data/CommonSecurityData.xml"/> <entity-resource type="data" reader-name="seed" loader="main" location="data/CommonSystemPropertyData.xml"/> <entity-resource type="data" reader-name="seed" loader="main" location="data/CommonTypeData.xml"/> <entity-resource type="data" reader-name="seed" loader="main" location="data/CountryCodeData.xml"/> <entity-resource type="data" reader-name="seed" loader="main" location="data/CurrencyData.xml"/>
服务参数
<attribute name="partyId" type="String" mode="IN" optional="true"/>
<attribute name="noteId" type="String" mode="OUT"/>
<attribute name="nodeId" type="String" mode="INOUT"/>
name
|
type
|
mode
|
optional
|
说明
|
responseMessage
|
String
|
OUT
|
true
|
返回信息(success/error/fail)
|
errorMessage
|
String
|
OUT
|
true
|
错误信息
|
errorMessageList
|
java.util.List
|
OUT
|
true
|
错误信息列表
|
successMessage
|
String
|
OUT
|
true
|
成功信息
|
successMessageList
|
java.util.List
|
OUT
|
true
|
成功信息列表
|
userLogin | org.ofbiz.entity.GenericValue | INOUT | true | 登陆用户对象,用于权限验证 |
locale | java.util.Locale | INOUT | true | 国际化本地对象 |
<attribute name="partyId" type="String" mode="IN" optional="true"/> <attribute name="partyId" type="String" mode="IN" optional="false"/>
<!-- mass order changes --> <service name="massOrderChangeInterface" engine="interface" location="" invoke=""> <description>Interface for Mass Order Change Services</description> <attribute name="orderIdList" type="List" mode="IN" optional="false"/> </service>
<service name="massPickOrders" engine="java" transaction-timeout="300" location="org.ofbiz.order.order.OrderServices" invoke="massPickOrders" auth="true"> <implements service="massOrderChangeInterface"/> </service> <service name="massChangeOrderApproved" engine="java" transaction-timeout="300" location="org.ofbiz.order.order.OrderServices" invoke="massChangeApproved" auth="true"> <implements service="massOrderChangeInterface"/> </service> <service name="massProcessOrders" engine="java" transaction-timeout="300" location="org.ofbiz.order.order.OrderServices" invoke="massProcessOrders" auth="true"> <implements service="massOrderChangeInterface"/> </service>
// make the list per facility List<String> orderIds = UtilGenerics.checkList(context.get("orderIdList"));
<service name="massPrintOrders" engine="java" transaction-timeout="300" location="org.ofbiz.order.order.OrderServices" invoke="massPrintOrders" auth="true"> <implements service="massOrderChangeInterface"/> <attribute name="screenLocation" type="String" mode="IN" optional="false"/> <attribute name="printerName" type="String" mode="IN" optional="true"/> </service>
String screenLocation = (String) context.get("screenLocation"); String printerName = (String) context.get("printerName"); // make the list per facility List<String> orderIds = UtilGenerics.checkList(context.get("orderIdList"));
<service name="getPerson" engine="java" location="org.ofbiz.party.party.PartyServices" invoke="getPerson"> <description>Gets a person entity from the cache/database</description> <attribute name="partyId" type="String" mode="IN"/> <attribute name="lookupPerson" type="org.ofbiz.entity.GenericValue" mode="OUT"/> </service>
public static Map<String, Object> findOrders(DispatchContext dctx, Map<String, ? extends Object> context) { Security security = dctx.getSecurity(); // check security flag for purchase orders boolean canViewPo = security.hasEntityPermission("ORDERMGR", "_PURCHASE_VIEW", userLogin); if (!canViewPo) { conditions.add(EntityCondition.makeCondition("orderTypeId", EntityOperator.NOT_EQUAL, "PURCHASE_ORDER")); } }
<!-- Party Relationship services --> <service name="createPartyRelationship" default-entity-name="PartyRelationship" engine="simple" location="component://party/script/org/ofbiz/party/party/PartyServices.xml" invoke="createPartyRelationship" auth="true"> <description> Create a Relationship between two Parties; if partyIdFrom is not specified the partyId of the current userLogin will be used; if roleTypeIds are not specified they will default to "_NA_". If a partyIdFrom is passed in, it will be used if the userLogin has PARTYMGR_REL_CREATE permission. </description> <permission-service service-name="partyRelationshipPermissionCheck" main-action="CREATE"/> <auto-attributes include="pk" mode="IN" optional="true"/> <auto-attributes include="nonpk" mode="IN" optional="true"/> <override name="partyIdTo" optional="false"/> </service>
<!-- PartyRelationship services --> <simple-method method-name="createPartyRelationship" short-description="createPartyRelationship"> <if-empty field="parameters.roleTypeIdFrom"><set field="parameters.roleTypeIdFrom" value="_NA_"/></if-empty> <if-empty field="parameters.roleTypeIdTo"><set field="parameters.roleTypeIdTo" value="_NA_"/></if-empty> <if-empty field="parameters.partyIdFrom"><set field="parameters.partyIdFrom" from-field="userLogin.partyId"/></if-empty> <if-empty field="parameters.fromDate"><now-timestamp field="parameters.fromDate"/></if-empty> <!-- check if not already exist --> <entity-and entity-name="PartyRelationship" list="partyRels" filter-by-date="true"> <field-map field-name="partyIdFrom" from-field="parameters.partyIdFrom"/> <field-map field-name="roleTypeIdFrom" from-field="parameters.roleTypeIdFrom"/> <field-map field-name="partyIdTo" from-field="parameters.partyIdTo"/> <field-map field-name="roleTypeIdTo" from-field="parameters.roleTypeIdTo"/> </entity-and> <if-empty field="partyRels"> <make-value value-field="newEntity" entity-name="PartyRelationship"/> <set-pk-fields map="parameters" value-field="newEntity"/> <set-nonpk-fields map="parameters" value-field="newEntity"/> <create-value value-field="newEntity"/> </if-empty> </simple-method>
<!-- Example & Related Services --> <service name="createExample" default-entity-name="Example" engine="entity-auto" invoke="create" auth="true"> <description>Create a Example</description> <permission-service service-name="exampleGenericPermission" main-action="CREATE"/> <auto-attributes include="pk" mode="OUT" optional="false"/> <auto-attributes include="nonpk" mode="IN" optional="true"/> <override name="exampleTypeId" optional="false"/> <override name="statusId" optional="false"/> <override name="exampleName" optional="false"/> </service>
<!-- RiTA (Remote) Implementations --> <service name="ritaCCAuthRemote" engine="rmi" location="rita-rmi" invoke="ritaCCAuth"> <description>RiTA Credit Card Pre-Authorization/Sale</description> <implements service="ccAuthInterface"/> </service>
<service-location name="rita-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
<!-- RiTA (Local) Implementations --> <service name="ritaCCAuth" engine="java" export="true" location="org.ofbiz.accounting.thirdparty.gosoftware.RitaServices" invoke="ccAuth"> <description>RiTA Credit Card Pre-Authorization/Sale</description> <implements service="ccAuthInterface"/> </service>
<service-group xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/service-group.xsd"> <group name="updateWorkEffortAndAssoc" send-mode="all" > <invoke name="updateWorkEffort" mode="sync"/> <invoke name="updateWorkEffortAssoc" mode="sync"/> </group> <group name="createWorkEffortRequestItemAndRequestItem" send-mode="all" > <invoke name="checkCustRequestItemExists" mode="sync" result-to-context="true"/> <invoke name="createWorkEffortRequestItem" mode="sync"/> </group> </service-group>
1 public static String indexTree(HttpServletRequest request, HttpServletResponse response) { 2 3 Map<String, Object> result; 4 Map<String, Object> serviceInMap = FastMap.newInstance(); 5 HttpSession session = request.getSession(); 6 GenericValue userLogin = (GenericValue)session.getAttribute("userLogin"); 7 serviceInMap.put("userLogin", userLogin); 8 LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); 9 Map<String, Object> paramMap = UtilHttp.getParameterMap(request); 10 String siteId = (String)paramMap.get("contentId"); 11 serviceInMap.put("contentId", siteId); 12 try { 13 result = dispatcher.runSync("indexTree", serviceInMap); 14 } catch (GenericServiceException e) { 15 String errorMsg = "Error calling the indexTree service." + e.toString(); 16 Debug.logError(e, errorMsg, module); 17 request.setAttribute("_ERROR_MESSAGE_", errorMsg + e.toString()); 18 return "error"; 19 } 20 String errMsg = ServiceUtil.getErrorMessage(result); 21 if (Debug.infoOn()) Debug.logInfo("errMsg:" + errMsg, module); 22 if (Debug.infoOn()) Debug.logInfo("result:" + result, module); 23 if (UtilValidate.isEmpty(errMsg)) { 24 List<String> badIndexList = UtilGenerics.checkList(result.get("badIndexList")); 25 if (Debug.infoOn()) Debug.logInfo("badIndexList:" + badIndexList, module); 26 String badIndexMsg = StringUtil.join(badIndexList, "\n") + badIndexList.size() + " entities not indexed"; 27 Integer goodIndexCount = (Integer)result.get("goodIndexCount"); 28 String goodIndexMsg = goodIndexCount + " entities indexed."; 29 if (Debug.infoOn()) Debug.logInfo("goodIndexCount:" + goodIndexCount, module); 30 ServiceUtil.setMessages(request, badIndexMsg, goodIndexMsg, null); 31 return "success"; 32 } else { 33 ServiceUtil.setMessages(request, errMsg, null, null); 34 return "error"; 35 } 36 }
调用服务
1 try { 2 result = dispatcher.runSync("indexTree", serviceInMap); 3 } catch (GenericServiceException e) { 4 String errorMsg = "Error calling the indexTree service." + e.toString(); 5 Debug.logError(e, errorMsg, module); 6 request.setAttribute("_ERROR_MESSAGE_", errorMsg + e.toString()); 7 return "error"; 8 }
<service name="indexTree" auth="true" engine="java" validate="true" transaction-timeout="7200" location="org.ofbiz.content.search.SearchServices" invoke="indexTree"> <description>Index content under publish point</description> <attribute mode="IN" name="contentId" optional="false" type="String"/> <attribute mode="OUT" name="badIndexList" optional="true" type="List"/> <attribute mode="OUT" name="goodIndexCount" optional="true" type="Integer"/> </service>
<simple-method method-name="createPaymentAndApplication" short-description="Create a payment and a payment application for the full amount"> <set-service-fields service-name="createPayment" map="parameters" to-map="createPaymentInMap"/> <call-service service-name="createPayment" in-map-name="createPaymentInMap"> <result-to-field field="paymentId" result-name="paymentId"/> </call-service> <check-errors/> <set-service-fields service-name="createPaymentApplication" map="parameters" to-map="createPaymentAppInMap"/> <set field="createPaymentAppInMap.paymentId" from-field="paymentId"/> <set field="createPaymentAppInMap.amountApplied" from-field="parameters.amount"/> <call-service service-name="createPaymentApplication" in-map-name="createPaymentAppInMap"> <result-to-field field="paymentApplicationId" result-name="paymentApplicationId"/> </call-service> <check-errors/> <field-to-result field="paymentId" result-name="paymentId"/> <field-to-result field="paymentApplicationId" result-name="paymentApplicationId"/> </simple-method>
<call-service service-name="createPayment" in-map-name="createPaymentInMap"> <result-to-field field="paymentId" result-name="paymentId"/> </call-service>
<simple-method method-name="createPayment" short-description="Create a Payment"> <if> <condition> <and> <not><if-has-permission permission="PAY_INFO" action="_CREATE"/></not> <not><if-compare-field field="userLogin.partyId" to-field="parameters.partyIdFrom" operator="equals"/></not> <not><if-compare-field field="userLogin.partyId" to-field="parameters.partyIdTo" operator="equals"/></not> </and> </condition> <then> <add-error> <fail-property resource="AccountingUiLabels" property="AccountingCreatePaymentPermissionError"/> </add-error> </then> </if> <check-errors/> <make-value entity-name="Payment" value-field="payment"/> <if-empty field="parameters.paymentId"> <sequenced-id sequence-name="Payment" field="payment.paymentId"/> <else> <set field="payment.paymentId" from-field="parameters.paymentId"/> </else> </if-empty> <field-to-result field="payment.paymentId" result-name="paymentId"/> <if-not-empty field="parameters.paymentMethodId"> <entity-one entity-name="PaymentMethod" value-field="paymentMethod"> <field-map field-name="paymentMethodId" from-field="parameters.paymentMethodId"/> </entity-one> <if-compare-field field="parameters.paymentMethodTypeId" operator="not-equals" to-field="paymentMethod.paymentMethodTypeId"> <log level="info" message="Replacing passed payment method type [${parameters.paymentMethodTypeId}] with payment method type [${paymentMethod.paymentMethodTypeId}] for payment method [${parameters.paymentMethodId}]"/> <set field="parameters.paymentMethodTypeId" from-field="paymentMethod.paymentMethodTypeId"/> </if-compare-field> </if-not-empty> <if-not-empty field="parameters.paymentPreferenceId"> <entity-one value-field="orderPaymentPreference" entity-name="OrderPaymentPreference"> <field-map field-name="orderPaymentPreferenceId" from-field="parameters.paymentPreferenceId"/> </entity-one> <if-empty field="parameters.paymentMethodId"> <set field="parameters.paymentMethodId" from-field="orderPaymentPreference.paymentMethodId"/> </if-empty> <if-empty field="parameters.paymentMethodTypeId"> <set field="parameters.paymentMethodTypeId" from-field="orderPaymentPreference.paymentMethodTypeId"/> </if-empty> </if-not-empty> <if-empty field="parameters.paymentMethodTypeId"> <add-error> <fail-property resource="AccountingUiLabels" property="AccountingPaymentMethodIdPaymentMethodTypeIdNullError"/> </add-error> </if-empty> <set-nonpk-fields map="parameters" value-field="payment"/> <if-empty field="payment.effectiveDate"> <now-timestamp field="payment.effectiveDate"/> </if-empty> <create-value value-field="payment"/> </simple-method>
异步方式调用
<simple-method method-name="sendInvoicePerEmail" short-description="Send an invoice per Email"> <set-service-fields service-name="sendMailFromScreen" map="parameters" to-map="emailParams"/> <set field="emailParams.xslfoAttachScreenLocation" value="component://accounting/widget/AccountingPrintScreens.xml#InvoicePDF"/> <set field="emailParams.bodyParameters.invoiceId" from-field="parameters.invoiceId"/> <set field="emailParams.bodyParameters.userLogin" from-field="parameters.userLogin"/> <set field="emailParams.bodyParameters.other" from-field="parameters.other"/><!-- to to print in 'other currency' --> <call-service-asynch service-name="sendMailFromScreen" in-map-name="emailParams"/> <property-to-field resource="AccountingUiLabels" property="AccountingEmailScheduledToSend" field="successMessage"/> </simple-method>
异步调用代码
<call-service-asynch service-name="sendMailFromScreen" in-map-name="emailParams"/>
<service name="sendOrderConfirmation" engine="java" require-new-transaction="true" max-retry="3" location="org.ofbiz.order.order.OrderServices" invoke="sendOrderConfirmNotification"> <description>Send a order confirmation</description> <implements service="orderNotificationInterface"/> </service>
dispatcher.runSync(servicename, context,transactionTimeOut,requireNewTransaction);
dispatcher.runAsync(servicename, context,requester,persist,transactionTimeOut,requireNewTransaction);