??xml version="1.0" encoding="utf-8" standalone="yes"?>
1、编?framework/entity/config/entityengine.xmlQ修改default delegate?localoracle
<delegator name="default" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" distributed-cache-clear-enabled="false">
<group-map group-name="org.ofbiz" datasource-name="localoracle"/>
<group-map group-name="org.ofbiz.olap" datasource-name="localoracle"/>
<group-map group-name="org.ofbiz.tenant" datasource-name="localoracle"/>
<group-map group-name="org.opentaps.analytics" datasource-name="localoracle"/>
<group-map group-name="org.opentaps.testing" datasource-name="localoracle"/>
</delegator>
2、修改同个文件中的的localoracle 的datasource节点 <datasource name="localoracle"
helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
schema-name="OFBIZ"
field-type-name="oracle"
check-on-start="true"
add-missing-on-start="true"
alias-view-columns="false"
join-style="ansi">
<read-data reader-name="seed"/>
<read-data reader-name="seed-initial"/>
<read-data reader-name="demo"/>
<read-data reader-name="ext"/>
<inline-jdbc
jdbc-driver="oracle.jdbc.driver.OracleDriver"
jdbc-uri="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
jdbc-username="ofbiz"
jdbc-password="ofbiz"
pool-minsize="2"
pool-maxsize="250"
time-between-eviction-runs-millis="600000"/>
</datasource>
3、将{ORACLE_HOME}\product\10.2.0\db_1\jdbc\lib目录下的ojdbc14.jar拯到framework/entity/lib/jdbc目录?br />
4、重新运行ant run-install生成数据库对?br />
5、现在Oracle数据库已l就lOK?br />
开始Opentaps开发已l两q多了,对它的理解也来深。做Z个完整的ERP套g来说我觉得它_应付我们的日怸务:客户、订单、仓储、采购、胦务等。ƈ且它从应用层和开发层都已l提供了_的支持与扩展I间?br />
我始l觉得Ofbiz提供的ecommerce模块q于单,或者说它与我们国h惌中的电子商城有比较大的差距。如果我们在q之上来开发的话可以需要付出很多的effort才可能达到我们想要的效果。当然opentaps也提供了另一个选择graciousQ但从个度来说我q不喜欢q个模块Q它为用h供的定制选项太少了,只能作ؓ有经验的开发者定制自己应用的一个基?br />
在ؓOpentaps开发Magento开发Integration FeatureӞ我接触到了Magentoq个最q泛被用的电子商务套g。不q当时只是浅即止ƈ未做太多的功能研IӞ最q这些日子里我在不断深入了解了这个品后来叹服其功能的强大。我x惌的所有功能应该都被包括在q个产品已完成的feature中了。但同样我更期望是一个完整的U上U下相诏通的|络商城q营ҎQ离q样的要求Magento在胦务结、仓储管理、采购管理这些ERP功能斚w又明昄偏弱?br />
我想Opentaps与Magento的整合可能不应仅限与原来所提供的品、订单信息的贯通,或许我们应该试提供更密切的信息联系。至第一步应该要把客戯料信息进行双向的同步Q然后是库存信息?br />
考虑更远一点的话,在Magento或Opentaps中引入在U客服与呼叫中心的Feature也是一个非常让人振奋的事情。发展到q一步,我们可以简单的集成q两个优U开源品来为我们的U上U下提供全方面的服务了?br />
在以后的文章里,我会l箋在这个方面做更多的设计与实现工作。如果有童鞋Ҏ话题感兴,可以把你的想法告诉我看是否可以一h做点事?br />
BTW: 现在opentaps已完成的magento整合内容可以在这里找?http://www.opentaps.org/docs/index.php/Opentaps_Magento_Integration
opentaps/opentaps-common/build-aspects.xml中的weaved内容替换Z下内容(其实是把原来的ant的替换jar内容d分成两部来执行)Q?br />
<!-- Weave advice into target jars -->
<!-- ================================================================== -->
<target name="weave" depends="detect-dependencies" if="processRequired">
<echo message="[build] =========== Start Building Aspect (Weave) ============="/>
<java classname="org.codehaus.aspectwerkz.compiler.AspectWerkzC" fork="true">
<jvmarg value="-Daspectwerkz.definition.file=${aopConfig}"/>
<jvmarg value="-Daspectwerkz.transform.filter=no"/>
<!-- <jvmarg value="-Daspectwerkz.transform.verbose=true"/> -->
<!-- <jvmarg value="-Daspectwerkz.transform.details=true"/> -->
<arg value="-verify"/>
<classpath refid="local.class.path" />
<classpath>
<pathelement path="${build.dir}/classes/common"/>
</classpath>
<!-- below is the jars to post-process -->
<arg value="${ofbiz.dir}/framework/entity/build/lib/ofbiz-entity.jar"/>
</java>
<java classname="org.codehaus.aspectwerkz.compiler.AspectWerkzC" fork="true">
<jvmarg value="-Daspectwerkz.definition.file=${aopConfig}"/>
<jvmarg value="-Daspectwerkz.transform.filter=no"/>
<!-- <jvmarg value="-Daspectwerkz.transform.verbose=true"/> -->
<!-- <jvmarg value="-Daspectwerkz.transform.details=true"/> -->
<arg value="-verify"/>
<classpath refid="local.class.path" />
<classpath>
<pathelement path="${build.dir}/classes/common"/>
</classpath>
<!-- below is the jars to post-process, if these jar not effect each other you can put them in same pos, else please seperate them into another task -->
<arg value="${ofbiz.dir}/framework/common/build/lib/ofbiz-common.jar"/>
</java>
<java classname="org.codehaus.aspectwerkz.compiler.AspectWerkzC" fork="true">
<jvmarg value="-Daspectwerkz.definition.file=${aopConfig}"/>
<jvmarg value="-Daspectwerkz.transform.filter=no"/>
<!-- <jvmarg value="-Daspectwerkz.transform.verbose=true"/> -->
<!-- <jvmarg value="-Daspectwerkz.transform.details=true"/> -->
<arg value="-verify"/>
<classpath refid="local.class.path" />
<classpath>
<pathelement path="${build.dir}/classes/common"/>
</classpath>
<!-- below is the jars to post-process -->
<arg value="${ofbiz.dir}/applications/order/build/lib/ofbiz-order.jar"/>
</java>
<jar jarfile="${lib.dir}/${name}.jar" update="true" basedir="${build.dir}/classes/common" includes="org/opentaps/aspect/secas/**" />
<!-- put aop.xml into target jar META-INF dir -->
<mkdir dir="${build.dir}/classes/META-INF" />
<copy file="${aopConfig}" tofile="${build.dir}/classes/META-INF/aop.xml" overwrite="true"/>
<!-- create new jar with aop.xml, then copy it to orign location, using these for avoid unable rename error on windows 64bit system-->
<zip destfile="${lib.dir}/ofbiz-entity.jar">
<zipfileset src="${ofbiz.dir}/framework/entity/build/lib/ofbiz-entity.jar"/>
<fileset dir="${build.dir}/classes/">
<include name="META-INF/aop.xml"/>
</fileset>
</zip>
<delete file="${ofbiz.dir}/framework/entity/build/lib/ofbiz-entity.jar" failonerror="false"/>
<move file="${lib.dir}/ofbiz-entity.jar" tofile="${ofbiz.dir}/framework/entity/build/lib/ofbiz-entity.jar"/>
<zip destfile="${lib.dir}/ofbiz-common.jar">
<zipfileset src="${ofbiz.dir}/framework/common/build/lib/ofbiz-common.jar"/>
<fileset dir="${build.dir}/classes/">
<include name="META-INF/aop.xml"/>
</fileset>
</zip>
<delete file="${ofbiz.dir}/framework/common/build/lib/ofbiz-common.jar" failonerror="false"/>
<move file="${lib.dir}/ofbiz-common.jar" tofile="${ofbiz.dir}/framework/common/build/lib/ofbiz-common.jar"/>
<zip destfile="${lib.dir}/ofbiz-order.jar">
<zipfileset src="${ofbiz.dir}/applications/order/build/lib/ofbiz-order.jar"/>
<fileset dir="${build.dir}/classes/">
<include name="META-INF/aop.xml"/>
</fileset>
</zip>
<delete file="${ofbiz.dir}/applications/order/build/lib/ofbiz-order.jar" failonerror="false"/>
<move file="${lib.dir}/ofbiz-order.jar" tofile="${ofbiz.dir}/applications/order/build/lib/ofbiz-order.jar"/>
<echo message="[build] =========== Done Building Aspect (Weave) =============="/>
</target>
以上Ҏ已经在opentaps wiki Q?a >http://www.opentaps.org/docs/index.php/General_Installation_of_Opentaps#Build_Aspect_class_ErrorsQ?中加上过了?br />
首先研究一下POS模块的代码结构:
1、POS模块同其它模块的实现方式有所区别Q它用了XUL技术来定制展示的界面。所有屏q文件用XUL格式定义于screens目录之下
2、按钮事件与java代码映射关系Q记录在config\buttonevents.xml?br />
3、资源文件存攑֜XuiLabels_[locale].properties与config\PosUiLabels.xml?br />
了解l构后,加上库存查询功能很单了Q我是这样做的:
1、在screens/default/menu/mgrmain.xml中增加一个mgrInquiryInventory库存查询按钮Q它会出现在POS?#8220;l理”界面中的
2、在buttonevents.xml中加上以下行Q映事件代?br />
3、在ManagerEvents.java中加入inquiryInventoryҎ代码Q我是用了一个ShowInventory的XPage来展现当前选中的库存分布Q?br />
4、完工?br />
了,包括阅读代码和编写这些东东d也就׃七八个小时的effortQ不知道Z么ofbiz׃肯加上这个功能呢Q或者pos模块不再发展了?
1、实体之间的关系或是本n的描q都是有生命周期的,q一点从ER Diagram中随处可见的From Date 与Thru Date可以充分体现出来?br />
2、以W三方角度对业务建模而非“?#8221;方角度徏模,q个比较有趣Q通常来说我们会把销售订单与采购订单分成两个实体Q这是因为我们从使用者角度来看销售订单与采购订单是不同的业务cdQ而从W三方角度来着Q销售订单与采购订单都是当事Z间发生的采购/销售业务,兛_的业务内容与属性完全一_而这样徏模可以带来大量的业务逻辑q与可扩展性?br />
警告:你必M用type=""来{换你的结果类?否则的话,它将q回字符串类?
* 如何在minilang中调用JavaE序
你可以在minilang中插入一Dbeanshell代码,cM?applications/ecommerce/script/org/ofbiz/ecommerce/customer/CustomerEvents.xml的示?
在beanshell脚本中可以访问在minilang中所有的变量
* 清除 ?h的比?br />
<clear-field field-name="foo"/> 讄它ؓnull. q可以是一个类的属性或是集合中的一个?br />
<refresh-value value-name="foo"/> 从数据库中重新获得foo的? foo必须是一个GenericValue.
* 如何讄一个布?br />
我无法找CQ何例?但是我这样做是成功的:
我想minilang使用type=""中的cd与value中的值的做ؓ构造调?猜想在某天我看到q些代码时能证明我是对的...
本文档译自ofbiz 4.0 cookbooks,本h译,Ƣ迎转蝲,h明出?
SELECT SUM(COALESCE(OI.QUANTITY,'0') - COALESCE(0I.CANCEL_QUANTITY)) AS QUANTITY在结果集包含默认值是一个好的习?否则如果有一ؓnull,那么最l相减的l果׃为null?
操作W可以ؓM你当前用数据库所支持的SQL操作W?比如术q算W?, -, * ? 或者字W串q接W?||.
你可以增加function=""标签来完成在complex-alias-field中的min, max, sum, avg, count, count-distinct, upper 及lower集合q算. CZ, 以上的定义可以用另一U方法表CZؓ:
即ؓSELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0'))) AS QUANTITY查询l果?br />
* 我讨厌OFBiz的实体引?我要自己的JDBCq接!
好的,以下是你获得JDBCq接的方?
你可以查看framework/webtools/webapp/webtools/WEB-INF/actions/entity/EntitySQLProcessor.bsh了解它的使用
在以下网址你可以获得相关JavaDoc的内?
http://www.opentaps.org/javadocs/version-1.0/framework/api/org/ofbiz/entity/jdbc/SQLProcessor.html
http://www.opentaps.org/javadocs/version-1.0/framework/api/org/ofbiz/entity/jdbc/ConnectionFactory.html
*** 请先考虑以下内容: 你放弃数据库的无x意味着你在某些Ҏ无法与框架或其它程序集?你确定你要这么做?
获得更好的做?误?nbsp;http://www.opentaps.org/docs/index.php/Using_the_Query_Tool
* 关于旉比较Ҏ的一些警?/p>
在你?GREATER_THAN比较一?Timestampcd数据? 你有可能获得相同的时间数?
有可能包含fromDate=2007-12-31 23:59:59.998的数? (此种情况发生于PostgreSQL 8.1q且GenericDAO cȝ成的SQL代码?FROM_DATE > ' so 所以我也不明白发生q个问题的原?) 所以确保安全的Ҏ? 增加1U到需要比较的旉中然后?GREATER_THAN_EQUAL_TOҎ
* 警告: 在空集合中用EntityOperator.IN
请小心如果用EntityOperator.INd断一个非I集合在一个空集合中的包含?你有可能获得一个语法错? 在Derby或者其它一些不Zh知的数据库中可能会出?
所以徏议你能在使用EntityOperator.IN之间,通常执行UtilValidate.isNotEmptyҎ来判断一下结果集是否为空
* 警告: delegator.getNextSubSeqId 不能保唯一?/p>
很多实体有很多合成的主键.CZOrderItem's 主键是orderId + orderItemSeqId. InventoryItemDetail's 主键是inventoryItemId +inventoryItemSeqId. 通常, delegator.getNextSubSeqId 通常是获得一个序列?但是在多U程的访问下有可能无法确保生成的值的唯一? 此段内容?http://issues.apache.org/jira/browse/OFBIZ-1636 中有相关文档记录.
当前, 如果有可能多个线E尝试同时写入实体组合键?可以使用delegator.getNextSeqId来替代getNextSubSeqId. (此问题不会发生于OrderItem, 因ؓ它只使用单线E写? 但有可能发生?InventoryItemDetail, 它用多U程来创建库存记录项.)
* 如果为有效期间创建条?
我们提供了一l非常有用的ҎEntityUtil.getFilterByDateExpr ,它能q回一个EntityConditionListҎ有效期间来筛选一个结果集.
* 如何在大数据l果集下工作
如果你检Z个大的数据结果集,你应当用EntityListIterator通过q代方式d数据,而非List.
CZ,如果你?
你可能获得一?java.lang.OutOfMemoryError". q是׃你通过findAll, findByAnd, findByCondition{方法来获得一个大的内存数据结果集D内存溢出. 在这U情况下, 应该使用EntityListIteratorq代方式来读取你的数? q个CZ应改写成:
注意获得EntityListIterator的方法只用通过条g, 所以你需要将你的条g重写为EntityExpr (在此ơ情况下,productId是主键字D不可能为空? 所以将q回所有Proudct实例,)?EntityConditionList.
此方法参C包含出的字段(q里为productId)以及排序字段(q里不需?所以赋了null)
你可以传递一个null作ؓEntityCondition参数来获得所有结?然后q不一定在所有数据库下都能正常工? 在maxdb及其它不常用的数据库下时你要心使用q些高功能.
* 如何使用EntityListIterator
当我们通过EntityListIteratorq代讉K数据? 通常是这?
在EntityListIterator 中?nbsp;.hasNext()Ҏ是一U不l济的做?
在你完成你的操作?要记得关闭此q代
* 如何查询无重l果?/p>
当前只能通过list iteratorҎq指定EntityFindOptions参数,CZ如下:
在minilang, 它会更简?
* 如何q行一个大写不敏感的查询(即不分大写)
你需要查询条件表辑ּ两边均{为大?CZ:
(来源org.ofbiz.party.party.PartyServices)
* 如何EntityListIterator转换成List
使用EntityListIterator.getCompleteList() 及getPartialList Ҏ
* 如何自动获得下一个ID?/p>
在minilang 中?<sequence-id-to-env ...> 或在Java中通过delegator.getNextSeqId(...) 获得 . id序列存放于SequenceValueItem?
* 关于ID值的一些警?/p>
不要在种?演示数据中?0000做ؓ数据的ID,当系l尝试自动创建数据时,它们都将试10000,q将D一个键值冲H错?
* 如何从一个明l项中获得序列ID
有些实体,比如拥有itemSeqId 的InvoiceItem(发票明细? and OrderItem(订单明细?.此项通常在你处一ơؓitem生成GenericValue 时自动生成ID,之后向delegator要求生成目的seq Id:
20080630-openMDX2-Features.pdf
o 定义菜单
name属性用于标识菜单项?br />
title属性用于菜单显C名Uͼ也可是uiLabelMap
link指定菜单的跌{URI
o 使得指定的菜单高?br /> 在屏q组件的<screen>-<actions>D中加入
valuegؓ已定义过的要加亮的菜单项
o Ҏ条g选择是否昄菜单?/strong>
?lt;menu-item>节点中?<condition>?
o 使用CSS样式?/strong>
?lt;menu-item>节点中用以下属?br />
align-style="" 定义寚w方式
widget-style="" 定义菜单在未选中时的样式
selected-style="" 定义菜单在选中时的样式
o 叛_齐菜单项
使用align-style="col-right" 来启?"col-right" CSS样式
注意q个样式把W一个菜单项攑ֈ最双Q第二个攑֜W一个的左边Q依ơ类?br />
本文档译自ofbiz 4.0 cookbooks,本h译,Ƣ迎转蝲,h明出?
2. OFBiz日志文g
OFBiz创徏较多日志文gq将它们存储于logs/目录Q在opentaps-0.9或更早版本中Q或framework/logs/Q在opentaps-0.9之后版本Q,文g有:
- ofbiz.log.? - 记录所有OFBiz生成日志信息。此文g在满时自动循环创徏新文Ӟ即ofbiz.log是当前日志文Ӟofbiz.log.1是较早些旉的日志文Ӟofbiz.log.2是比ofbiz.log.1更早旉的日志文Ӟ以此cL?br />
- console.log - 记录所有OFBiz在控制台界面q行昄的内宏V也有可能无效?br />
- access_log.? - cM于Apache httpd日志格式记录所有服务请求。很漂亮但对调试没有什么用处?/p>
大多数据旉Q你可以通过ofbiz.log或console.log来查询调试信息。因为它们有很多内容Q所以你最好用一个可以翻与q行查找的编辑器来打开q些日志文g?/p>
3、查找日志信?br />
Java日志信息最Ҏ查找。它们的日志信息中通常有类名与行号生成Q?/p>
MinilangҎ日志中的cd均ؓLog.javaQ如Q?/p>
如果你在beanshell中直接用输出,你输出的内容显著的昄于日志文件中Q?/p>
如果你在beanshell中用调试方法,你将在日志中得到如下信息Q?/p>
你可以ؓ那些无法发现日志信息的minilang或beanshell代码中加入自q信息输出?/p>
所有freemarkerQscreen-widget或form widget输出的信息将直接昄在你的浏览器屏幕上。除非这些控件崩溃否则不会显CZQ何日志信息?/p>
4. 增加你自q日志信息
在Java中增加你自己的日志信息,请用OFBiz Debugc?org.ofbiz.base.util.Debug)中的调试ҎQ如logInfoQlogWarning, logError...
CZQ?nbsp; Debug.logInfo("Now processing invoice " + invoiceId, module);
在beanshell中增加日志信息,同样使用DebugҎQ但在内容中忽略?"q样内容?/p>
在freemarker中增加日志信息,只需要显CZ打算跟踪的变量,如:
在minilang中增加日志信息,使用<log >指oq输入你的|比如在freemarker中:
通常level节点属性用于设|日志别,如:"info", "warning", "error"Q对应于Debug中的同名Ҏ?/p>
5. 何时需要重启OFBiz
你在做如下更Ҏ需要重新启动OFBiz服务器:
- Java文gQ记得要重新~译Q?br />
- 配置/.properties文g
- entitymodel或entitygroup XML定义文g
- 服务或secas XML文g
- JPublish XML文g
你在q行以下修改时无需重新启动OFBiz服务器:
- freemarker FTL模版
- beanshell BSH模版
- Screens XML文g
- Forms XML文g
- 控制器XML文gQ注意:在opentaps-0.8和OFBiz 3.x及更早版本中Q你在更Ҏ制器旉要重启)
但有可能你需要在览器中清除~存?br />
6. 常见错误及其含义Q?br />
* 此服?(captureBillingAccountPayment) 在所?services.xml 定义中都找不?
Cannot find service location (org.ofbiz.order.order.OrderServices)
* 说明在services XML定义点上指向的资源不存在. 如果q是一个minilang或beanshell服务Q即服务引擎无法扑ֈ此文件。如果这是一个Java服务Q则说明在classpath中无法查扑ֈq个cR?/p>
* 含义是在某个services.xml指定的这个服务不存在对应的JavaҎ。通常发生于你在修改了Java文g后忘记再ơ编译它来新增的方法生效?/p>
* pȝ无法取得实体的下一个自动IDQ通常发生于数据库断开情况?/p>
* ?inventory_item"表的插入/修改操作时违?inv_item_facility"外键U束?/p>
* q是一个非o厌的错误信息。通常它意味着你访问的服务所触发的ECA链服务中有一个服务失败,于是D全部的操作失败。服务引擎无法ؓ你进一步跟t,所以你需要进入log文g中进一步查N误原因。访问你的logs/ofbiz.log 或logs/console.log文gM解触发错误的Ҏ原因?/p>
* q是在opentaps 0.8/0.9及OFBiz的pre-Geronimo版本在Linuxpȝ下可能会发生的一个问? 解决Ҏ可以在以下网址中找?
http://lists.ofbiz.org/pipermail/users/2004-June/004094.html
* q是一?XSL:FO 错误q意味着你在文本中了字W?&'Q比如说你在描述或地址中了这个字W?XSL:FO 使用xml属性格式,所以你需要确认你在文本字D后攄?xml?br />
本文档译自ofbiz 4.0 cookbooks,本h译,Ƣ迎转蝲,h明出?1?nbsp;安装JDK 1.5或以上版本,讄?/span>JAVA_HOME
2?nbsp;安装MySQL 5.0或以上版?/span>
3?nbsp;?/span>http://www.eclipse.org/downloads/下蝲最?/span>Eclipse版本Q我下的?/span>3.4.1版的Eclipse IDE for Java EE DevelopersQƈ解压臛_作目录(我解压至"C:\\"Q即工作目录?C:\\eclipse"Q?/span>
4?nbsp;启动EclipseQ通过点击Help菜单中的Software Updates...启动Software Updates向导界面Q新?/span>subclipseq程站点Q远E下载地址?/span>http://subclipse.tigris.org/update_1.0.xQ勾选下载安?/span>Subclipse Plugin后点?/span>Intasll按钮安装
Z码:
1?nbsp;在新?/span>…向导对话框中选择?/span>SVN中检出项?br />
2?nbsp;?/span>SVNZ|?/span>URL框中输入Q?/span>后点?/span>Next?br />
3?nbsp;选择文g?/span>"branches"release4.0后点?/span>Finish?br />
数据库配|?[可以参考我写的opentaps 1.0.2安装(mysql)一文]Q?/span>
1?nbsp;通过mysql命o行来创徏obfizq行所需数据库,Z方便识别Q我们这里就?/span>ofbiz来做数据库吧?/span>
mysql> create database ofbiz;
mysql> exit
2?nbsp;~辑ofbiz目录中的framework/entity/config/entityengine.xml文gQ其能正确q接C?/span>mysql数据库中Q注意其中的ofbiz-user?/span>ofbiz-passwordQ把它们Ҏ你实际的数据库连接用户名与密码)?/span>
其中的<delegator name="default"...> D中?/span>"datasource-name"从原来的"local" 改ؓ "localmysql"
~辑<datasource name="localmysql"...> D内容,修改"jdbc-uri"?/span>"jdbc:mysql://127.0.0.1/ofbiz?autoReconnect=true"Q修?/span>"jdbc-username"/ "jdbc-password"Z?/span>mysqlq接用户?/span>/密码Q修?/span>character-set="gbk"Q?/span>collate="gbk_bin",CZ如下:
3?nbsp;pȝ初始?/span>
在命令行H口下,q入ofbiz根目录后q行
ant run-install
pȝ开始安装,{大U?/span>15-30分钟后,pȝ提示安装完成?br />
启动ofbizQ?/strong>
有两U方式可以启?/span>ofbizQ?/span>
1?nbsp;双击根目录下?/span>startofbiz.bat启动
2?nbsp;?/span>eclipse中用鼠标右键点击build.xmlQ在右键菜单中选择Run As->Ant Build…在弹出的构徏对话框中targets选项卡中N?/span>run后点?/span>run
讉KofbizQ?/strong>
打开览器访问:https://localhost:8443/webtools/control/main点击屏幕x的Login链接后进行登录,d后就可以讉K你希望的功能Ҏ,pȝ默认帐号为admin/ofbizQ拥有所有权限?br />
本h原创文章Q欢q{载,转蝲h明出处!
opentaps现在在国内应用面不象sugarcrm/vtigercrmq些企业应用那样普遍Q我惛_大程度是׃JavaEE应用的逻辑l构严}与复杂度军_其不象PHP应用那样Ҏ拆分按需阅读切入。了解一个JavaEE的应用需要先了解其构造的框图、分层结构、每层实现的技术方式以及采用的技术。对于OFBizq样一个野心极大要囊括几乎所有企业应用层面的目Q想要掌握它更难上加难了,也许我们可以选择单开始,先从文档的中文化与由入繁的练习中开始了解这个庞大的开源项目?/p>
闲话说Q我们先从opentaps的安装开始,让我们能够在自己的机器上跑vopentaps开始,也许你一直在L的企业应用已l全部在此喽Q?/p>
准备工作Q?br />
1、安装JDK 1.5或以上版本,q在pȝ中设|好JAVA_HOME及相关PATH
2、安装MYSQL 5.0或以上版?br />
3、安装ANT1.7或以上版本,q在pȝ中设|好ANT_HOME及相关PATH
4、从以下地址下蝲opentaps 1.0.2二进制版?br />
http://nchc.dl.sourceforge.net/sourceforge/opentaps/opentaps-1.0.2-all-platforms.zip
开始安装:
1、通过mysql命o行来创徏opentaps所需数据库,Z方便识别Q我们这里就用opentaps来做数据库吧?br />
mysql> create database opentaps;
2、将下蝲的opentaps-1.0.2-all-platforms.zip解压至你的工作目录?/p>
3、编辑opentaps目录中的framework/entity/config/entityengine.xml文gQ其能正确q接C的mysql数据库中?br />
3.1 其中的<delegator name="default"...> D中?datasource-name"从原来的"local" 改ؓ "localmysql"
3.2 ~辑<datasource name="localmysql"...> D内容,修改"jdbc-uri"?jdbc:mysql://127.0.0.1/opentaps?autoReconnect=true"Q修?jdbc-username"/ "jdbc-password"Z的mysqlq接用户?密码Q修改character-
set="gbk"Qcollate="gbk_bin",CZ如下:
4、进行系l初始化
在命令行H口下,q入opentaps根目录后q行
ant run-install
pȝ开始安装,{大U?5-30分钟后,pȝ提示安装完成?/p>
启动opentaps
双击q行opentaps目录下的startofbiz.bat命o卛_Q请注意控制台输入默认输log下的ofbiz.log中,所以无法从控制C判断pȝ是否启动完成Q一般需{待两到五分钟。也可以输出改回至console?/p>
讉Kopentaps
打开览器访问:http://localhost:8080/
点击你希望访问的功能Ҏ,pȝ默认帐号?br />
admin/ofbizQ拥有所有权限?/p>
本h原创文章Q欢q{载,转蝲h明出处!
在CRM应用中有一个核心应用是线?潜在客户转化成客戗在opentaps中的CRM应用Q潜在客h在[U烦]中做为线索创建的。一个线索是一个公叔R的一个联lh且不能拥有更多的相关联络信息。在你进行线索筛选后Q例如进行了电话跟进Q你可以标记此线索有效。这Ӟ当线索变成客P你可以将U烦转换成客户客户和一个联lh。你也可以ؓq个客户客户建立更多的联pMh信息?/p>
注意如果你有关于同一家公司客L多个U烦Ӟpȝ允许你徏立它们ؓ不同的线索,而把它们转换成一个客户客戗线索{换屏q允怽选择一个已l存在的客户客户?/p>
q里没有关于什么样的线索可以{换成一个客户客L正式要求——你可以按照你自q应用需求来q行调整?/p>
技术性备注:做ؓ一个客戗线索或客户Q一个参与者必L?#8220;Account”, “Contact”,?“Prospect” 的PartyRoleq要与另一个参与者有一个PartyRelationship。因此,不满x要求的OFBiz参与者是不能做ؓ一个account, lead, 或contact的。同P一个客户客h一个OFBiz的PartyGroupQ线索和联系人是一个OFBiz Person?/p>
客户
?.9.1版本之前Q客h有者默认是可以理客户l,但不能ؓ此客户创建机会。因此,在你创徏一个客户后Q你除了无法创徏Z外可以做M事。创Z个客LQ且你在此组上有拥有完整的用P?写)使用权限Ӟ你可以创建机会?/p>
?.9.1版本之后Q客h有者可以ؓ其创建机会?/p>
每个客户可以拥有一个父U客P父客户可以在[创徏客户]或在修改时输入?/p>
客户列表Ҏ客户名称排序?/p>
联系?/strong>
在联pMh创徏后,联系人可以通过客户主页面上[新联pMh]菜单或是联系Z面上的[新客户]方式来加入到客户上?/p>
联系人列表根据联pMh的姓/名排序?/p>
U烦
U烦是一个原始状态的联系?客户信息。当一个线索进行{换后Q将后生成一个联pMh与客戗?/p>
U烦可以拥有父对象。此父对象应是一个已存在的客戗?/p>
U烦默认会被分配l线索创?/p>
当你q行一个线索识别后Q点击[U烦识别]来标识它已经通过“识别”?/p>
当你转换一个线索,你将被带C个屏qƈ被询问是做ؓ一个新建客戯是一个已存在的客L联系人。如果此U烦的公司已l被建立Q选择已存在的客户。否则,保持此字DؓI。线索中关于联络人的信息会被{换成一个联pMh。如果选择了一个已存在的客PU烦{换成它的联系人。如果未选择已存在的客户Q将会基于线索中的公怿息创Z个新的客PU烦信息成为此客户的一个联pMh?/p>
U烦在{换成联系?客户时必L有公司名U才会{换成功?/p>
注意Q如果你在{换线索时选择了一个已存在的客Pq时U烦中的所有公怿息将会丢失。这包括Q?#8220;公司名称”?#8220;q营业额”?#8220;行业”…
在拥有关联机会的U烦q行转换Ӟ兌Z同将会自动{换成目标客户、联pMh的机会信息?/p>
如果你根据线索生成了一个新的客PU烦中的联系信息Q地址、电话、电邮)自动转换成客户中的联pM息。如果你Z一个已存的客户q行转换U烦Q则U烦中的联系信息不会拯到客户中?/p>
U烦在未识别或{换前可以被删除(CZQ还处于“新徏”?#8220;被分?#8221;状态)。在0.9.1版本前,你不能删除Q何拥有关联活动(事g或Q务,如电子邮Ӟ的线索?/p>
U烦列表可以ҎU烦中的公司名称、姓、名的Q一Ҏ?/p>
合ƈU烦/联系?客户
?.9.1版本开始,你可以将重复的线?联系?客户q行合ƈ。用左边的快捷菜单中[合ƈ___]链接q输入从-和至- U烦/联系?客户的partyId。页面将会要求你q行认Q在你确认合q操作后Q?/p>
合ƈҎ中来源的线?联系?帐户信息可能不支持过多的数据?/p>
Z
当机会刚建立Ӟ阶段是用于表明机会成功的概率Q成功概率可以在以后q行修改Q但是当它更新到一个新的阶D,概率׃自动更新x阶段的概率。估计结束日期是用于提供Z未来预期情况?/p>
一个机会只能在来源于一个帐户但可以兌多个联系人?/p>
在编?更新ZӞ你必d于其所属帐LQ在帐户上创建机会时Q你一定有权限更新此帐戗更新机会要求你填写更改备注?/p>
在版?.9.1Q机会可以在U烦识别后创Z个机会。当U烦转换后,Z同时关联于帐户与联pMh?/p>
注意Z?#8220;预测关闭日期”实际上存储做Z个日?旉QJava中的TimestampcdQ,
Z阶段的概率存储于SalesOpportunityStage.defaultProbability字段
案例
案例必须创徏兌于至一个帐h联系人。一个案例可以有多个联系人或帐户关例Q虽然现在没有与之关联的接口?/p>
“我的案例”昄所有分配给你的帐户或联pMh相关的案例。它默认分配l用h限是Q如果你被分配一个帐P而它有关联的案例Q那q个案例属于你?/p>
更新案例Ӟ你需要拥有相关的帐户/联系人权限?/p>
案例关闭需要特别的权限?/p>
发送电子邮?/strong>
在帐P联系人或U烦的联pMh信息屏幕中,你可以点MQ何的电子邮gQ将弹出一个发送邮件的屏幕。你可以输入另一个电子邮件地址或查询机?案例。当你完成时Q你可以点击[发送]邮g或[保存以后发送]。[保存以后发送]把电子邮g保存为收件h的一个待办活动。在成功发送后Q电子邮件将保存为活动历史的一部分?/p>
如果电子邮g地址不是收g人参与者的电子邮g地址Q你获得一个错误?/p>
注意[文本]和[文本]按钮切换电子邮件MIME格式为文本与文本,但当前超文本~辑器还没有整合q来。因此,如果你打用超文本格式邮gӞ直接通过_脓或编写html格式内容。已计划提供一个整合浏览器的超文本~辑器?/p>
{选接收的电子邮g
在opentaps0.9.1QCRM/SFA应用可以{选你接收的电子邮Ӟ它们保存ؓpȝ的通讯zdQ且它们关联到你的用户、联pMh、帐hU烦上。配|此功能Q首先应按照“Configuration and Setup”q行邮g容器的配|。接着~辑此文?/p>
hot-deploy/crmsfa/servicedef/smcas.xml
把用于接攉件的L信息Ҏ后Q重启你的服务,pȝ开始览视你的主机ƈ且保存新的电子邮件。它根据邮件的来源电子邮g地址试匚w你的帐户/U烦/联系人,Ҏ接收?抄送电子邮件地址匚w你的CRM用户?/p>
在接收到一新的电子邮件时Q它在pȝ中记录ؓ一个通讯事gQCommunicationEventQ。如果来源电子邮件地址匚w了一个参与者电子邮件地址Q帐戗线索或联系人)Q它被记录为来源于参与者。如果接攉件地址匚w另一个参与者的电子邮g地址Q它被记录为发送给该参与者的电子邮g。(技术备注:CRM/SFA应用使用OFBiz storeIncomingEmail服务Q当使用WorkEffort调用和关联收件h做ؓWorkEffort的参与者)
新电子邮件做为关联于参与者(帐户、线索、联pMhQ和接收者(用户Q的一个待办活动创建。当你登录至CRM/SFA应用Ӟ你将可以?#8220;待办zd”列表中查看到你收到的邮g且在发g人(帐户/U烦/联系人)?#8220;待办zd”中查看到它。你可以点击q个zd查看电子邮gQ这把它标Cؓ开始,当你完成时将把它标记为结束(技术备注:CRM/SFA应用把电子邮g的通讯事gCommunicationEvent在你开始活动时标记为待?#8220;Pending”Q结束时标记为完?#8220;Complete”Q?/p>
未关联到M参与者的电子邮g保存在pȝ中。你可以使用参与者管理应用来q行手工{选。在[Party]>[Comm]查询cd?#8220;自动电子邮g”状态ؓ“未知参与?#8221;的通讯事g。然后编辑它们关联至pȝ用户Q标记它们ؓ“完成”?/p>
zd
q里有两U活动类型:d和事件。事件用于显C在日历中的会议。Q务是电话、电子邮件或不显C在日历中的普通Q务。在你初ơ登录时可以?#8220;我的起始?#8221;中显C待办活动列表,它们包括事g与Q务?/p>
事g可以通过日程Q点L间图标)或帐戗联pMh、线索、案例、机会屏q两U方式创建。Q务只能在后者或d列表中创建,因ؓ它们是不在日历中昄的?/p>
当你创徏一个活动时QQ务或事gQ,你可以输入计划的起始日期/旉和持l的期间。如果用户在此期间将会忙于处理此事,则点?#8220;?#8221;?#8220;d”。如果有另一个Q务或事g已经在用此时段q标Cؓ“?#8221;?#8220;d”Q将会生一个错误信息。如果你坚持要用此时估Q点?#8220;忽略日程冲突”。当你更C件时Q你一样需要设|?#8220;忽略日程冲突”如果它与已存在的事g旉冲突?/p>
记录一件已发生q的zd时。这些活动将会创建做为完成的Q用户也会要求输入实际的开始与l束旉?/p>
划某事创Z个新的活动,事g或Q务时Q用戯入计划开始时间和l束日期。原状态ؓ“计划”的事件可以ؓ“已确?#8221;。当认后,你可以在事g中加入参与者ƈ通过发送邮仉请他们。加入一个参与者自动确认他们。邀请他们发送发送电子邮件。输入的备注被包含在其中,而且q个电子邮g包含两个链接:接入与拒l?/p>
如果参与者已l在相同时段|?#8220;?#8221;于另一个事件或dQ他们是无法加入C件中。如果未讄状态,则此D|间被假设为可用?/p>
当你拥有自己的事件时Q你可以在发生期间内Q开始至l束旉Q内把它标记?#8220;已完?#8221;?/p>
q有一个Q务创Zؓ“已计?#8221;Ӟ当用户准备开始此zdQ更CQ务至“已开?#8221;且输入开始时间。如果未输入旉Q系l将记录当前旉做ؓ开始时间。类似地Q当用户准备标记它完成时Q?#8220;已完?#8221;Q,如果未输入时_pȝ记录当前时间做为完成时间?/p>
至于一电子邮Ӟ当你点击[发送电子邮件]pȝ记录它作ؓ开始时间。当你点击[发送]Q系l记录它作ؓl束旉。如果你保存以后发送,此活动将不会记录它ؓ完成直至你实际发送此邮g?/p>
当查看活动时Q你在上面查看到活动的详细内容Q在中间的关联的zd参与者(帐户/联系?U烦/l成员)、如果这是封电子邮gQ电子邮件在下方。注意OFBiz设计为允许每个work effort中允许多个通讯事gQ但我们在活动中只显C其中的一个。这个概늨微有点落后:在OFBizQ你创徏work effort作ؓ“目”q与很多电子邮gq进行关联。在q里Qwork effor用于分离?#8220;d”Q如发送一个电子邮件。你可以创徏work effort作ؓ目Q但它可以分L调用子Q务。它在Workeffor Manager中支持,但在CRM/SFA中没有这L用法?/p>
当你记录电话或电子邮件时Q?#8220;呼入/呼出”标志参与者是d方还是被动方?/p>
参与者列表显CZQ务或事g的参与者(帐户/联系?U烦Q,当前只有日程拥有者(如活动的创徏人)可以更新参与者可用状态及增加/删除他们。未来版本可能会改变q点限制?/p>
查询zd显C那些已完成的活动或d列表?/p>
当事件被取消Q它不再显CZ日历中?/p>
预测
销售预用机会概率和数据来计在未来旉D늚预期销售额。预来源于Z的计,每个销售员预测Z自己的客h会和U烦相关联的Z计算。与其相关的M客户和已认的线索可以用于计预。因此,所有销售员销售预合计将过整个公司的销售预,因ؓ很多销售员拥有相同的客PZ获得公司的预,每次只一个增加销售经理而且每个客户和线索只计算一ơ?/p>
所有销售员可以创徏自己的预和输入他的销售定额。只有销售经理可以创建组/销售区域的预测。当前每个销售员只能创徏自己的预?/p>
创徏你自q预测Q选择[创徏预测]q择相应的季度来创徏。只有未关闭的季度,卛_q未到结束日期的季度可用于创建预?/p>
你将会被要求输入此季度的按月销售定额。当你完成后Q点击[创徏]。你的销售定额将输入q系l且按月/季度的预将会被创徏军。每个月的销售预计基于:
1Q?nbsp;成交金额=此月状态ؓ“已关?#8221;Z金额累计
2Q?nbsp;最好金?预计在此月关闭的Z金额累计Q不当前的阶段
3Q?nbsp;预测金额=所有高于最低概率的Z金额*概率的篏计金额。最低门槛定义于crmsfa.properties配置文g?
季度预测是基于月度预的累计?/p>
查看M的预需要特别的权限。否则,你只能查看你自己的预?/p>
如果你拥有查看别人预的权限Q点击[查询预测]可以查询其它人的预测。你可以Ҏl成员或旉D|q行查询。查询的预测是按季度的?/p>
默认的,只有销售经理或理员可以修改已存在的预。修改一个预,点击预测的月份,输入修改后的定额Q填写更改备注,然后点击[修改]。此月和季度的预值将会被修改?/p>
每当预测被修改,旧的版本会被保存ؓ历史。当查看预测Ӟ你可以查看整个的预测修改历史Q包括旧版本的修Ҏ期与定额、最好预期和预期Q?/p>
当一个时间段正式关闭或已l束Q对应的预测不允许再修改?/p>
如果在一个时间段已创Z个预,当新的机会创建或已存在的Z更新Ӟ它将自动更新。与该机会相关的客户/U烦相关的预成员将会自动更新。如果机会预计关闭日期被U至一个新的时间段Q受影响的预将会更新。然而如果机会移动到一个未建预的旉ҎQ新的预将会自动徏立?/p>
报h
报h部分允许你ؓ自己的客h看和创徏报h。关键特性包括根据报价名U、类别、状态查询报P创徏报hQ根据报价创单。注意这些屏q同h“订单理”中的报h屏幕的一部分?br />
报h的重要功能包括:
• [查询报h] –查询报h信息
• [查看报h] – 查看报h的摘要信?br />
• [报h] – 理报h的表头信息,包括客户与仓?br />
• [报hl项] – 增加/删除报h和修改它们的h?br />
• [创徏订单] – Ҏ报h内容创徏订单
订单
订单部分允许你在CRM/SFA应用中查询订单或创徏新订单?/p>
0.9.x版本的订单页是基于OFBiz订单理导入的,可以?#8220;General Overview”中查看相应的详细文档?/p>
1.0.x及之后版本的订单重写支持订单的输入和查询。你可以在此中为客户创建和查询订单?/p>
“我的订单”는于显C当前登录用L订单?/p>
你可以客戯l信息屏q中的订单页中用快速创单,或直接用[创徏订单]链接来创Z个新的订单?/p>
如果你用快速创单,你必输入客戗订单名Uͼ和要求发货日期。你可以输入一个品idQ系l将会加入数量ؓ1.0此品进入你的订单?/p>
注意在订单管理中“要求发货日期”?#8220;发出日期”是相同的。它不是订单理中的“要求发货日期”。那个字D在现阶D不支持?/p>
当你输入所有的订单目后,点击[完成订单]。你查看到一个要求你为每个订单项选择发货目的C方式的屏q。在你确认后Q系l将自动创徏多组分离的目的地与发货方式的发货l?/p>
其它的订单项屏幕与订单管理中的相同?/p>
订单品仓库配|于config/crmsfa.properties文g中。当前CRM订单系l支持每个订单项只来源于一个品仓库。这ơ不支持产品目录?/p>
市场
市场准备用于不同的市场相关的功能。当前只有系l中的调查列表及允许你查看这些调查反馈的l果?/p>
服务调查
q里有一个独立的web应用用于发送客戯查、投。当前,q是一个非常简单的web应用可以用于昄调查Q收集反馈然后向客户{谢?/p>
你可以在内容理中创查,然后通过以下地址讉K它:
http://www.mysite.com/surveys/control?surveyId=${surveyId}
其中${surveyId}是你的调查在内容理中的ID
你可以通过crmsfa/webapp/surveys/子目录中的文件来定制它?/p>
OFBiz
你可以通过crmsfa.properties中的“crmsfa.tab.ofbiz.show”参数来启?用昄q回至OFBiz链接Q如果启用,你将在标{N中查看到OFBiz的链接?/p>
如果你打ؓ你的用户讄讉KOFBiz应用权限Q请查看Security Documentation了解更详l的内容?/p>
技术备注:同其它应用整?/p>
报hQ订单和市场实际上是重用订单管理与内容理Q调查)中的屏幕Q它们是q样做的Q?br />
1. 在CRM/SFA应用中创铈页?br />
2. 在web.xml中设|对应应用main-decorator-location 参数Q这栯些屏莫在CRM/SFA应用中调用时Q它们将使用CRM/SFA中的屏幕样式来替代原来的样式昄?br />
3. 从原来的controller.xml中复制相关的view- ?request-maps?CRM/SFA应用中的controller.xml
4. 在订单项中,原来订单理中客L链接是链接至Party Manger的,而在CRM/SFA中应参C改至客户面?br />
本文档译自opentaps v0.9 manual,本h译,Ƣ迎转蝲,h明出?
CRM/SFA设计用于销售代表、销售经理、客h务代码管理公怸销售和客户服务的应用,它的主要功能ҎQ?br />
• 跟踪销售情?br />
• 识别销售线索ƈ此转换成客?br />
• 跟踪客户联系
• 输入和跟t商机开始到l束的生命周?br />
• 理客户销售报?br />
• 创徏和查看客?联系人销售订?br />
• 生成销售预?br />
• 理客户案例?(客服h?
• 发送电子邮?br />
• 理zd和工作,包括会议、电话、电子邮?br />
• 跟踪市场zd如:客户调查
创徏新用?/p>
创徏新用户需要在Party Manager中操作,点击[Party] > [Create]创徏一个新的参与者。至ؓ其分配一个以下角Ԍ“Account manager”, “Account Rep”, “CSR”。注意每个用户可以拥有其它的角色?#8220;Employee”、但只有以上三个角色用于CRM/SFA应用Q下一步创Z个用L录ƈ且ؓ其分配安全组QSALES_MANAGER, SALES_REP, ?SALES_REP_LIMITED, ?CSR
注意Q在party manager中的角色与CRM/SFA中的角色是不同的Q在party managerQ角色仅定义Z些h或组面对另一些h或组时的w䆾。在CRM/SFA中,角色意味在客户销售关pM的分演的角色Q而且它也暗指着一l对应的权限?/p>
如果用户忘记自己密码Q可以通过“忘记密码”功能新密码邮至原来预设的个人邮件地址中?/p>
用户概况
在CRM/SFA应用界面中的剙[概况]链接位居用户名与[d]按钮之间。点L链接可访问用h况页面,你可以在此页面中修改用户名称Q修改密码,增加联系方式信息Q如Q电邮、邮政地址、电话等Q。注意你不可能在q里更改用户d信息Q这只能在Party Manager中操作)。此还可以查看用户q往的访问历双Ӏ?/p>
?我的团队
?.9.1版本开始,你可以在[我的帐号]的右边看到[我的团队帐户],如果你点L的帐P你的d被配置为只查看你的个h信息而非使用团队帐号。这个功能工作于U烦、联pMh、案例、机会?/p>
帐号l?/p>
CRM/SFA应用中的帐号l是通常用于工作于同一l角色和权限l合的团队, 一个组在它建立时可以被分配一个帐受接着Q帐L理员或帐号所有者可以重新分配组成员或他们的责QQ这样很大程度不同于“军事单位”l,通常那些l是一直拥有固定的领导、成员的?/p>
Z创徏一个组Q你需要用Party Manger。在[Party] > [Create] >> [Create New Party Group]q给你的l命名。然后在[Roles]处分配一个[Account Team]角色l它。然后在[Relationships]处加上你的组成员。以下信息项必段输入Q?br />
• lPartyId
• l成员角?(Account Manager, Account Rep, ?CSR), Z早先创徏的用h分配的角?
• “Is a” 字段必须讄?#8220;Assigned To”
• l角色应该设|ؓ “Account Team”
• 讄h日期
• Party Relationship Security 必须是你的组安全权限. ?Party Manager, 一长串安全l将会显C,选择一个与CRM/SFA 应用相关的安全组. (查看 “Security Documentation.”)
联系信息
pȝ允许你ؓ每个?l徏立多重的联络方式信息Q你的帐受线索、联pMh都可以根据你的需求输入Q意多的电话号码、地址、电子邮件地址。每个联l信息都需要标识出它的用途?/p>
当你使用[创徏联系人]、[创徏U烦]、[创徏帐号]Q系l将Z你的表单输入创徏以下联系信息Q?br />
• 地址信息被做ؓ“一般信函地址”?#8220;一般收货地址”
• 电话L做?#8220;ȝ话号?#8221;
• 电子邮g做?#8220;ȝ子邮件地址”
• |站地址做?#8220;ȝ站地址”
但你在创pM息时Q你应当创徏电子邮g作ؓȝ子邮件地址及地址做ؓ一般收货地址。主电子邮g地址用于发送自动通知邮g。一般收货地址用于订单发货?/p>
电话L和电子邮件在所列帐受线索、联pMh的主电子邮g和主电话L?/p>
你可以点MQ何的列在联络pȝ中的电子邮g地址来发送电子邮Ӟ查看下面?#8220;发送电子邮?#8221;
备注
在CRM/SFA应用中,很多东西可以创徏和保存备注。备注菜单通常在屏q的下方?br />
本文档译自opentaps v0.9 manual,本h译,Ƣ迎转蝲,h明出?
CRM/SFA应用很大E度不同于其它的OFBizBiz应用QOFBIZ应用设计Zl可以整合在一起适合各种商业zd的进E,CRM/SFA应用设计为支持角?zd的全部活动在CRM应用中,q样子,它将带来与其它应用的很多不同?/p>
1.CRM/SFA的商业逻辑_度于其它OFBizQ而且通常会调用很多其它应用中的action。如当创Z个帐hQCRM/SFA应用调用另一个OFBiz服务创徏Party、PartyGroup、PartyRole、PartyRelationship{等
2.在OFBiz其它应用中高度抽象的数据模型在这里表达成更传l直观的概念。示例,“Party”被表达成为account ,lead, contact, team, ?team member, 它们拥有不同的用L面和业务逻辑?/p>
3.OFBiz?#8220;WorkEffort”面向用户时表达ؓ“Activity”,而且只是事g和业务可作ؓ“Activity”,其它?“WorkEffort”例如刉品过E在CRM/SFA中不昄出来?/p>
4.它拥有PartyRelationship.securityGroupId定义多个参与者之间权限的不同的安全模型(CZQ组成员A是否有权讉KB帐户Q)它用了不同的安全方法(查看“Security Documentation”了解详细信息Q?/p>
用户界面原则
CRM/SFA应用有一个不同于其它OFBiz应用的界面原则。简单来_此原则就?建立一个容易让用户明白和用的界面Q好q让用户不停的思考如何用?/p>
CZQ?#8220;work effort”是一个OFBiz中的a task, a project, an event, 或a manufacturing production step,在OFBiz的WorkEffort应用中让用户自己创徏它时选择对应的实例选项Q而在q里QWorkEffort被分d不同的h机界面上昄各自的特性?/p>
大多C用者,不会?#8220;我打创Z个work effort在参与者X和Y之间”Q他们通常?#8220;我ؓ参与者X和Y在明天上午徏立一个约?#8221;。这样CRM/SFA应用提供创徏U会界面q加入参与者X和YQ在此界面启动约会及完成它?/p>
所以这意味着有些在OFBiz中允许的操作在CRM/SFA界面中不再被允许。示例,在OFBiz创徏一?#8220;EVENT”cd的work effor时可把它兌到货q或产品制作q程。这些信息在OFBiz的work effort中是可见字段Q尽work effort在event中ƈ无这些关联字Dc另一面,在CRM/SFA中界面看不到q些字段
q样的功能减带来的是操作的易于理解Q且也让一些日常的操作减少不必要的步骤?/p>
另一个UI原则是将很多分离的步骤合而ؓ一个操作步骤。最好的例子是当你创Z个联pMhӞ你可以在一个屏q内输入所有联pMh信息Q而系l会自动的根据信息创建参与者、联pM息及兌,很多分d不同OFBiz中的应用合而ؓ一?/p>
最后,我们打算避免用户点击回退、向前去查看信息Q所以太多数屏幕都把信息昄在同一个屏q里Q而不是提供很多的信息标签
~码U定
另外Q创建CRM/SFA应用Q我们还有一些与其它不同的编码约定:
1.强制要求视图与数据准备分离Q我们限制视囑ֱ如freemaker?XML只承担展现数据功能。这h味着在formlg中不会存?#8221;action”标签?/p>
2.在屏q组件定义中Q用beanshell脚本?lt;entity-one> XML操作更好?/p>
3.Minilang脚本在一个方法中不要过十行。用java来编写复杂的商业逻辑。不要在minilang中?lt;or>?lt;and>及计?/p>
4.保证代码块简捗一般的Q如果你的方法超q两百行Q徏议你考虑如何重构它?/p>
5.Z的代码加上注释。描qC~码的目的和l果Q而不仅是你做了什么。示例,如果你编写了如下代码
invoiceId=null;
不要注释写成Q?/讄InvoiceId为null
而应该写成://invoiceId应该为空Q否则服务不会创Z个新的发?/p>
6.使用较长的变?Ҏ名称Q如QcomputeForecastParentPeriodQ而不是一个很短无意义的名U?/p>
7.使用意指你所调用的实体对象的变量名,而不仅是一个羃略的变量名?CZQ如果你获得一个orderItems集合Q变量名不要仅叫?#8221;item”——可以叫它们”orderItems”?#8221;nextOrderItem”Q诸如此cR如果你获得一个OrderPaymentPreference实体Q不要命名ؓ“payments”Q因为Payment实体同你命名的这个对象不是同一个东ѝ?/p>
8.在FTL、表单组件、beanshell和Java服务中用java来帮助将复杂的逻辑q行分离?/p>
9.代码分d应用的不同目录中Q将表单、屏q组件XML文档攑֜widgets目录中,JAVA包放在src/目录下,FTL攑֜webapp/crmsfa/QBSH脚本攑֜webapp/crmsfa/WEB-INF/actions/?#8230;
10.在服务XML中加了相x释指出需注意的事Ҏ此服务可能发生的意外
本文档译自opentaps v0.9 manual,本h译,Ƣ迎转蝲,h明出?