Moqui学习之代码分析mantle priceServices.xml
<?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 && vendorPartyId && 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 && vendorPartyId && 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 && productStoreId && 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 && 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 && 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 && vendorPartyId && 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 && vendorPartyId && 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 && productStoreId && 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 && 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 && 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 && vendorPartyId && 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 && vendorPartyId && 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的更多相关文章
- 20165224 陆艺杰 Exp4 恶意代码分析
Exp4 恶意代码分析 1实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. 计划任务每段 ...
- 20155207 《网络对抗》exp4 恶意代码分析 学习总结
20155207 <网络对抗> 恶意代码分析 学习总结 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件 ...
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- 开源项目kcws代码分析--基于深度学习的分词技术
http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...
- ISD9160学习笔记05_ISD9160语音识别代码分析
前言 语音识别是特别酷的功能,ISD9160的核心卖点就是这个语音识别,使用了Cybron VR 算法. 很好奇这颗10块钱以内的IC是如何实现人家百来块钱的方案.且听如下分析. 本文作者twowin ...
- 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
- Mybatis学习错误之:重复加载mapper.xml
学习mybatis的时候,突然遇到测试出错.测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正.错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现 ...
- ROS_Kinetic_29 kamtoa simulation学习与示例分析(一)
致谢源代码网址:https://github.com/Tutorgaming/kamtoa-simulation kamtoa simulation学习与示例分析(一) 源码学习与分析是学习ROS,包 ...
- 2018-2019-2 网络对抗技术 20165316 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165316 Exp4 恶意代码分析 一.原理与实践说明 1.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2 ...
随机推荐
- [转]Excel - How to lock cell without using macros if possible
本文转自:http://stackoverflow.com/questions/11953214/excel-how-to-lock-cell-without-using-macros-if-poss ...
- shell script 学习笔记-----if,for,while,case语句
1.if内的判断条件为逻辑运算: 2.if内的判断条件为目录是否存在,文件是否存在,下图先检验目录/home/monster是否存在,然后再检测/home/monster中的file.txt文件是否存 ...
- ajax请求json数据案例
今天有这样一个需求,点击六个大洲,出现对应的一些请求信息,展示在下面,请求请求过后,第二次点击就无需请求.如图所示:点击北美洲下面出现请求的一些数据 html代码结构: <div class=& ...
- 请叫我机智-巧用ios朗读kindle图书
想必大家都有想过kindle出中文的有声阅读刊物吧? 今天突发奇想想到一招能够让我们听自己拿kindle买的中文图书.当然这是有条件的. 前提是你得有一个ios设备,不管是iphone还是ipad,i ...
- python中thread模块中join函数
http://www.cnblogs.com/vingi/articles/2657790.html for i in range(10): t = ThreadTest(i) thread_arr. ...
- 2014 Super Training #1 B Fix 状压DP
原题: HDU 3362 http://acm.hdu.edu.cn/showproblem.php?pid=3362 开始准备贪心搞,结果发现太难了,一直都没做出来.后来才知道要用状压DP. 题意: ...
- Volley(三)—— ImageRequest & Request简介
Volley(三)—— ImageRequest & Request简介 上 篇文章我们讲 到了如何用volley进行简单的网络请求,我们可以很容易的接受到string.JsonObjec类型 ...
- 15Spring_AOP编程(AspectJ)_抛出通知
- 我们为什么要使用NodeJS
科普文一则,说说我对NodeJS(一种服务端JavaScript实现)的一些认识,以及我为什么会向后端工程师推荐NodeJS. "Node.js 是服务器端的 JavaScript 运行环境 ...
- Node.js之事件events
Events a.EventEmitter支持多个事件监听,最大为10,也可以自定义最大数 //添加监听var EventEmitter = require('events').EventEmitte ...