<?xml version="1.0" encoding="UTF-8"?>
<!--
This software is in the public domain under CC0 1.0 Universal plus a
Grant of Patent License. To the extent possible under law, the author(s) have dedicated all
copyright and related and neighboring rights to this software to the
public domain worldwide. This software is distributed without any
warranty. You should have received a copy of the CC0 Public Domain Dedication
along with this software (see the LICENSE.md file). If not, see
<http://creativecommons.org/publicdomain/zero/1.0/>.
-->
<services xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://moqui.org/xsd/service-definition-1.6.xsd">
<!--从这里可以得知该方法名称为getProductPrice-->
<service verb="get" noun="ProductPrice" authenticate="anonymous-view">
<description>Use the ProductPrice entity to determine the price to charge or pay for a Product.</description>
<in-parameters>
<!--这是一些输入参数所对应的 required若为true则表示为必须的参数 type表示输入的字段的数据类型 default为默认值-->
<parameter name="productId" required="true"/>
<parameter name="quantity" type="BigDecimal" default="1"/> <parameter name="priceUomId" default-value="USD"/>
<parameter name="pricePurposeEnumId" default-value="PppPurchase"/> <parameter name="productStoreId"/>
<parameter name="vendorPartyId"/>
<parameter name="customerPartyId"/> <!-- TODO: to support look for records with this first and then with null: <parameter name="agreementId"/> -->
<!-- TODO: to support look for records with this first and then with null: <parameter name="agreementItemSeqId"/> -->
</in-parameters>
<out-parameters>
<!--这是输出参数 type表示输出参数的数据类型 -->
<parameter name="price" type="BigDecimal"/>
<parameter name="listPrice" type="BigDecimal"/>
<parameter name="priceUomId"/>
</out-parameters>
<actions>
<!-- get PptCurrent price -->
<!-- try most constrained, back off from there -->
<!--根据条件进行查询 其中service-call标签表示的是要调用的方法 in-map表示传入的参数 -->
<if condition="productStoreId &amp;&amp; vendorPartyId &amp;&amp; customerPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptCurrent', productStoreId:productStoreId, vendorPartyId:vendorPartyId, customerPartyId:customerPartyId]"/>
</if>
<!-- try just vendor and customer -->
<if condition="!productPrice &amp;&amp; vendorPartyId &amp;&amp; customerPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptCurrent', vendorPartyId:vendorPartyId, customerPartyId:customerPartyId]"/>
</if>
<!-- try just customer and store -->
<if condition="!productPrice &amp;&amp; productStoreId &amp;&amp; customerPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptCurrent', productStoreId:productStoreId, customerPartyId:customerPartyId]"/>
</if>
<!-- try just store -->
<if condition="!productPrice &amp;&amp; productStoreId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptCurrent', productStoreId:productStoreId]"/>
</if>
<!-- try just vendor -->
<if condition="!productPrice &amp;&amp; vendorPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptCurrent', vendorPartyId:vendorPartyId]"/>
</if>
<set field="price" from="productPrice?.price"/>
<!-- get PptList price -->
<set field="productPrice" from="null"/>
<!-- try most constrained, back off from there -->
<if condition="productStoreId &amp;&amp; vendorPartyId &amp;&amp; customerPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptList', productStoreId:productStoreId, vendorPartyId:vendorPartyId, customerPartyId:customerPartyId]"/>
</if>
<!-- try just vendor and customer -->
<if condition="!productPrice &amp;&amp; vendorPartyId &amp;&amp; customerPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptList', vendorPartyId:vendorPartyId, customerPartyId:customerPartyId]"/>
</if>
<!-- try just customer and store -->
<if condition="!productPrice &amp;&amp; productStoreId &amp;&amp; customerPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptList', productStoreId:productStoreId, customerPartyId:customerPartyId]"/>
</if>
<!-- try just store -->
<if condition="!productPrice &amp;&amp; productStoreId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptList', productStoreId:productStoreId]"/>
</if>
<!-- try just vendor -->
<if condition="!productPrice &amp;&amp; vendorPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptList', vendorPartyId:vendorPartyId]"/>
</if>
<!--设置输出参数的显示-->
<set field="listPrice" from="productPrice?.price"/>
<set field="price" from="price ?: listPrice ?: 0"/>
<!-- <log level="warn" message="========== BEFORE rules productId=${productId}, price=${price}, listPrice=${listPrice}"/> -->
<!-- run the ProductPriceKS knowledge session rules -->
<script>ec.getStatelessKieSession("ProductPriceKS").execute([])</script>
<!-- <log level="warn" message="========== AFTER rules productId=${productId}, price=${price}, listPrice=${listPrice}"/> -->
</actions>
</service>
<service verb="find" noun="ProductPriceRecord">
<description>This is an internal service called by get#ProductPrice.</description>
<in-parameters>
<parameter name="productId" required="true"/>
<parameter name="priceUomId" required="true"/>
<parameter name="pricePurposeEnumId" required="true"/>
<parameter name="priceTypeEnumId" required="true"/>
<parameter name="quantity" type="BigDecimal" required="true"/>
<parameter name="productStoreId"/>
<parameter name="vendorPartyId"/>
<parameter name="customerPartyId"/>
</in-parameters>
<out-parameters><parameter name="productPrice" type="EntityValue"/>
</out-parameters>
<actions>
<!-- <log level="warn" message="finding price record with context: ${context}"/> -->
<entity-find entity-name="mantle.product.ProductPrice" list="productPriceList" cache="true">
<econdition-object field="[productId:productId, priceUomId:priceUomId,
pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId]"/>
<econdition field-name="minQuantity" operator="less-equals" from="quantity"/>
<econdition field-name="productStoreId" ignore-if-empty="true"/>
<econdition field-name="vendorPartyId" ignore-if-empty="true"/>
<econdition field-name="customerPartyId" ignore-if-empty="true"/>
<order-by field-name="-fromDate"/>
<!-- get most recent price records first -->
<order-by field-name="-minQuantity"/>
<!-- get highest qualifying (<=quantity) minQuantity records first -->
</entity-find>
<!-- <log level="warn" message="CALC productPriceList: ${productPriceList}"/> -->
<filter-map-list list="productPriceList"><date-filter/></filter-map-list>
<set field="productPrice" from="productPriceList?.first"/>
</actions>
</service>
</services>

这是刚开始时进入的界面,从这里可以看出他所需要的输入参数和输出参数:

 <in-parameters>
<parameter name="productId" required="true"/>
<parameter name="quantity" type="BigDecimal" default="1"/> <parameter name="priceUomId" default-value="USD"/>
<parameter name="pricePurposeEnumId" default-value="PppPurchase"/> <parameter name="productStoreId"/>
<parameter name="vendorPartyId"/>
<parameter name="customerPartyId"/> <!-- TODO: to support look for records with this first and then with null: <parameter name="agreementId"/> -->
<!-- TODO: to support look for records with this first and then with null: <parameter name="agreementItemSeqId"/> -->
</in-parameters>

这是定义输入参数的代码,与页面对应。

 <out-parameters>
<parameter name="price" type="BigDecimal"/>
<parameter name="listPrice" type="BigDecimal"/>
<parameter name="priceUomId"/>
</out-parameters>

这是定义输出参数的代码,与页面对应。

从actions中的代码可以看出他是调用的另一个service的方法:即mantle.product.PriceServices,find#ProductPriceRecord方法。

 <!-- get PptCurrent price -->
<!-- try most constrained, back off from there -->
<if condition="productStoreId &amp;&amp; vendorPartyId &amp;&amp; customerPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptCurrent', productStoreId:productStoreId, vendorPartyId:vendorPartyId, customerPartyId:customerPartyId]"/>
</if>

下面就来看这个service方法的定义:

 <service verb="find" noun="ProductPriceRecord">
<description>This is an internal service called by get#ProductPrice.</description>
<in-parameters>
<parameter name="productId" required="true"/>
<parameter name="priceUomId" required="true"/>
<parameter name="pricePurposeEnumId" required="true"/>
<parameter name="priceTypeEnumId" required="true"/>
<parameter name="quantity" type="BigDecimal" required="true"/>
<parameter name="productStoreId"/>
<parameter name="vendorPartyId"/>
<parameter name="customerPartyId"/>
</in-parameters>
<out-parameters><parameter name="productPrice" type="EntityValue"/></out-parameters>
</service>

从这里可以看出该方法的输入参数和输出参数,它执行时所需要的参数是通过上一个方法传入的,具体是:

 <if condition="productStoreId &amp;&amp; vendorPartyId &amp;&amp; customerPartyId">
<service-call name="mantle.product.PriceServices.find#ProductPriceRecord" out-map="context"
in-map="[productId:productId, priceUomId:priceUomId, pricePurposeEnumId:pricePurposeEnumId, priceTypeEnumId:priceTypeEnumId, quantity:quantity,
priceTypeEnumId:'PptCurrent', productStoreId:productStoreId, vendorPartyId:vendorPartyId, customerPartyId:customerPartyId]"/>
</if>

通过service-call标签中的in-map元素来实现的。

Moqui学习之代码分析mantle priceServices.xml的更多相关文章

  1. 20165224 陆艺杰 Exp4 恶意代码分析

    Exp4 恶意代码分析 1实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. 计划任务每段 ...

  2. 20155207 《网络对抗》exp4 恶意代码分析 学习总结

    20155207 <网络对抗> 恶意代码分析 学习总结 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件 ...

  3. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  4. 开源项目kcws代码分析--基于深度学习的分词技术

    http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...

  5. ISD9160学习笔记05_ISD9160语音识别代码分析

    前言 语音识别是特别酷的功能,ISD9160的核心卖点就是这个语音识别,使用了Cybron VR 算法. 很好奇这颗10块钱以内的IC是如何实现人家百来块钱的方案.且听如下分析. 本文作者twowin ...

  6. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  7. Mybatis学习错误之:重复加载mapper.xml

    学习mybatis的时候,突然遇到测试出错.测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正.错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现 ...

  8. ROS_Kinetic_29 kamtoa simulation学习与示例分析(一)

    致谢源代码网址:https://github.com/Tutorgaming/kamtoa-simulation kamtoa simulation学习与示例分析(一) 源码学习与分析是学习ROS,包 ...

  9. 2018-2019-2 网络对抗技术 20165316 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165316 Exp4 恶意代码分析 一.原理与实践说明 1.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2 ...

随机推荐

  1. A daemon process class in python

    In everbright task schedule project, we need some daemon process to do certain work, here is a examp ...

  2. Learning c section 1

    #include<stdio.h> void main() { puts("hello world"); int x=4; //the %p format will p ...

  3. Oracle 性能维护一点

    大数据量表的维护原则 1.如果此表经常CRUD,最好的办法是定期收集统计信息传递给oracle优化器,提高性能.例如dbms_stats.gather_table_stats命令. 可以做在ETL中, ...

  4. BI Project Managerment

    Design doc is the meta data of the code. The project management plan is crucial to your project sinc ...

  5. openstack排错

    一.排错方法: 1.查看日志路径为/var/log,具体哪个组件出了问题进入其目录查看. 2.debug root@sc-ctrl01:~# keystone --debug user-list ro ...

  6. 如何在ZBrush中添加毛发

    ZBrush不仅能雕刻出完美的头发造型,还能够应用真实的头发和毛发.在制作毛发之前只需要简单定义遮罩区域,包括长短.疏密.当然,最重要的是,你可以使用Polypaint生成各种有色纤维,这将非常方便. ...

  7. [ZZ]最小化不可重现的bug

    http://testerhome.com/topics/577 原文请见 Minimizing Unreproducible Bugs 不能重现的 bug 是我的灾难.我常常找到一个bug 后来又听 ...

  8. 怎么通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端?

    今天在论坛上看到这样一个问题,有必要编辑搜集下. 问题描述:怎么通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端 题主用jquery接收 <input name= ...

  9. find命令错误提示路径必须在表达式之前

    在某些版本的linux下,通过find查找当前目录下所有后缀名jpg的文件,命令为find ./ -iname *.jpg 会出现“find: 路径必须在表达式之前”的错误提示.解决的方法有两种 a. ...

  10. JavaEE

    1.  为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担. 为了程 ...