spark的自留地(ofbiz/eclipse rcp/shark/opentaps)

  语源科技BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  54 Posts :: 0 Stories :: 112 Comments :: 0 Trackbacks

2009年1月7日 #

到阿里工作快一年了,这一年回顾来最主要的成果还是在这里成功了推行了自己的领域建模方法与对应的技术框架。总是想同更多的同学分享一下。

为了帮助更多人了解如何应用领域建模知识在实际项目中,我在InfoQ中发表了一篇题为“大型网站复杂业务持续重构之道——全程领域建模实践”的文章。为了增加趣味性,我用了个故事来展开内容,请大家不要对号入座(特别是老板们)。请有兴趣了解这一话题的同学可以阅读一下

原文在
http://www.infoq.com/cn/articles/sb-complex-business-continuity-refact
posted @ 2012-03-28 15:07 shanghai_spark 阅读(402) | 评论 (0)编辑 收藏

默认Opentaps是基于derby的安装,这个在实际生产环境是不太可能会使用的。往往我们会实际需要使用Oracle作为生产数据库。很多人问我怎么去修改Opentaps与Oracle的支持。修改方法如下:

1、编辑 framework/entity/config/entityengine.xml,修改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目录下

4、重新运行ant run-install生成数据库对象

5、现在Oracle数据库已经就绪OK啦


posted @ 2012-03-07 10:56 shanghai_spark 阅读(827) | 评论 (0)编辑 收藏

我一直期望可以提供一个高性能、高定制性的电子商务套件,它不应局限于传统的ERP应用或简单的线上商城应用。而是应将线上发生的产品展示、线上营销、在线客户服务与线下的仓储发货、经营分析、关键客户识别有机结合起来。

开始Opentaps开发已经两年多了,对它的理解也越来越深。做为一个完整的ERP套件来说我觉得它足够应付我们的日常业务:客户、订单、仓储、采购、财务等。并且它从应用层和开发层都已经提供了足够的支持与扩展空间。

我始终觉得Ofbiz提供的ecommerce模块过于简单,或者说它与我们国人想象中的电子商城有比较大的差距。如果我们在这之上来开发的话可以需要付出很多的effort才可能达到我们想要的效果。当然opentaps也提供了另一个选择gracious,但从个人角度来说我并不喜欢这个模块,它为用户提供的定制选项太少了,只能作为有经验的开发者定制自己应用的一个基础。

在为Opentaps开发Magento开发Integration Feature时,我接触到了Magento这个最广泛被使用的电子商务套件。不过当时只是浅尝即止并未做太多的功能研究,最近这些日子里我在不断深入了解了这个产品后越来越叹服其功能的强大。我想我想要的所有功能应该都被包括在这个产品已完成的feature中了。但同样我更期望是一个完整的线上线下相贯通的网络商城运营方案,离这样的要求Magento在财务结算、仓储管理、采购管理这些ERP功能方面又明显的偏弱。

我想Opentaps与Magento的整合可能不应仅限与原来所提供的产品、订单信息的贯通,或许我们应该尝试提供更密切的信息联系。至少第一步应该要把客户资料信息进行双向的同步,然后是库存信息。

考虑更远一点的话,在Magento或Opentaps中引入在线客服与呼叫中心的Feature也是一个非常让人振奋的事情。发展到这一步,我们就可以简单的集成这两个优秀开源产品来为我们的线上线下提供全方面的服务了。

在以后的文章里,我会继续在这个方面做更多的设计与实现工作。如果有童鞋对此话题感兴趣,可以把你的想法告诉我看是否可以一起来做点事。


BTW: 现在opentaps已完成的magento整合内容可以在这里找到 http://www.opentaps.org/docs/index.php/Opentaps_Magento_Integration
posted @ 2011-03-01 09:42 shanghai_spark 阅读(5897) | 评论 (5)编辑 收藏

现在google,yahoo这些免费的群组都在大陆不好用,打算自己装个群组系统给自己的team用。用万能的google出Simple Groupware,看了特性描述好象还不错。那就先装上它试试吧。

1、安装apache、mysql、php

yum install mysql mysql-devel mysql-server php php-cli httpd


2、安装php所需的支持的包

yum install php-zlib php-gd php-mysql php-mbstring


3、启动mysqld与httpd服务

4、创建/var/www/html/sgs目录,并在该目录下下载Simple Groupware installer文件后解压,这样在/var/www/html/sgs目录下存在sgs_installer.php文件

5、打开浏览器访问http://your_server/sgs/sgs_installer.php选择你要的版本上面的Install,然后按照屏幕提示作下去就好啦


posted @ 2011-02-17 22:43 shanghai_spark 阅读(2028) | 评论 (2)编辑 收藏

打算在自己申请的Free Amazon EC2上放个Magento,看了下Magento的帮助也整理内容如下:

1、安装apache、mysql、php

yum install mysql mysql-devel mysql-server php php-cli httpd

2、安装php所需的支持的包

yum install php-dom php-mcrypt php-gd

3、创建magento数据库

4、下载magento full release package并解压到/var/www/html下,并设置目录权限为777

5、通过浏览器访问安装magento http://localhost/magento
posted @ 2011-02-11 12:14 shanghai_spark 阅读(1955) | 评论 (0)编辑 收藏

现在在用一个20寸的厦新电视机在做我的显示器,它是宽屏的,最高可以支持1344x768的分辨率。可是装了Fedora 14以后,只能发现最高支持的分辨率是1024x768。字体看起来都是扁扁的,很不爽!

得想个法把这个分辨率调整过来:

1) 打开一个Terminal窗口,切换到root身份后运行

Xorg -configure :1

这个命令会在/root下生成一个叫xorg.conf.new的文件,我们运行以下命令把它移到/etc/X11下
mv /root/xorg.conf.new /etc/X11/xorg.conf

2) reboot系统

3)在终端中输入 gtf 1344 768 60 -x 命令, 这样就会在终端中显示一些内容. 类似下面的:
# 1344x768 @ 60.00 Hz (GTF) hsync: 47.70 kHz; pclk: 83.95 MHz
  Modeline 
"1344x768_60.00"  83.95  1344 1408 1552 1760  768 769 772 795  -HSync +Vsync

把它复制到 /etc/X11/xorg.conf中的[Moniter]段中,复制后的文件中[Moniter]段如下:
Section "Monitor"
        Identifier   
"Monitor0"
        VendorName   
"Monitor Vendor"
        ModelName    
"Monitor Model"
        # 1344x768 @ 
60.00 Hz (GTF) hsync: 47.70 kHz; pclk: 83.95 MHz
        Modeline 
"1344x768_60.00"  83.95  1344 1408 1552 1760  768 769 772 795  -HSync +Vsync
EndSection

4) reboot系统后就会在System->Preferences->Moniters中发现1344x768的选项啦!

5) 收工!

posted @ 2011-02-10 16:29 shanghai_spark 阅读(5173) | 评论 (4)编辑 收藏

在Opentaps 1.4版本我将AOP由原来的AspectJ替换为现在Aspectwerkz。结果我自己就首先在64bit的windows系统下遇到ant编译出错,现在把解决方法列在这里

将opentaps/opentaps-common/build-aspects.xml中的weave任务内容替换为以下内容(其实就是把原来的ant的替换jar内容任务分成两部来执行):

<!-- ================================================================== --> 
        
<!-- 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 [http://www.opentaps.org/docs/index.php/General_Installation_of_Opentaps#Build_Aspect_class_Errors] 中加上过了。
posted @ 2011-02-09 22:18 shanghai_spark 阅读(1694) | 评论 (0)编辑 收藏

OFBIZ为我们提供了POS模块,它已经可以满足我们日常收银的大部分要求了。但是美中不足的是它没有提供库存查询功能。我也没看出来OFBIZ有近期实现此功能的计划,所以打算自己做一个。

首先研究一下POS模块的代码结构:

1、POS模块同其它模块的实现方式有所区别,它用了XUL技术来定制展示的界面。所有屏幕文件使用XUL格式定义于screens目录之下

2、按钮事件与java代码映射关系,记录在config\buttonevents.xml下

3、资源文件存放在XuiLabels_[locale].properties与config\PosUiLabels.xml中

了解结构后,加上库存查询功能就很简单了,我是这样做的:

1、在screens/default/menu/mgrmain.xml中增加一个mgrInquiryInventory库存查询按钮,它会出现在POS的“经理”界面中的

2、在buttonevents.xml中加上以下行,映射事件代码
<event button-name="mgrInquiryInventory" class-name="org.ofbiz.pos.event.ManagerEvents" method-name="inquiryInventory" disable-lock="false"/>


3、在ManagerEvents.java中加入inquiryInventory方法代码(我是使用了一个ShowInventory的XPage来展现当前选中项的库存分布)

4、完工。

算了算,包括阅读代码和编写这些东东总共也就花了七八个小时的effort,不知道为什么ofbiz就不肯加上这个功能呢?或者pos模块不再发展了?





posted @ 2011-02-08 11:29 shanghai_spark 阅读(2338) | 评论 (4)编辑 收藏

原来opentaps中的entity model文件中大量使用了floating-point来定义数值内容,现在我们要使用fixed-point来替换它们,以保证它的java type使用BigDecimal而不是Double.

这样就有了这次的替换任务,把所有model文件中的floating-point替换成为fixed-point。

方法对我来说有三:
1, 在eclipse或其它ide中查找出所有的包括floating-point文件来手工修改
2, 在UltraEdit或其它文本编程器中进行批量文件内容替换
3, 尝试一下linux的下的sed命令?

评估一下,3肯定是一个最有效率的选择。那么说干就干,let's go!

命令如下:

sed -"s/floating-point/fixed-point/g" `find . -name "*.xml"|xargs grep floating-point -rl`

一句话就搞掂了,真棒!
posted @ 2010-08-14 17:16 shanghai_spark 阅读(1501) | 评论 (0)编辑 收藏

莫名其妙,日志中老是有无法连接oracle的异常
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection

先用oracle用户登录到服务器上
sqlplus /nolog

conn 
/ as sysdba

运行了一些sql,一切正常呀,奇怪!

仔细想想,可能是lsnrctl的问题,打开listener.ora在下面插入以下内容:
    (SID_DESC=
     (GLOBAL_DBNAME 
= ORCL)
     (ORACLE_HOME 
= /oracle/10g)
     (SID_NAME 
= ORCL)
    )
完成后的listener.ora如下
SID_LIST_LISTENER =
  (SID_LIST 
=
    (SID_DESC 
=
      (SID_NAME 
= PLSExtProc)
      (ORACLE_HOME 
= /oracle/10g)
      (PROGRAM 
= extproc)
    )
    (SID_DESC
=
     (GLOBAL_DBNAME 
= ORCL)
     (ORACLE_HOME 
= /oracle/10g)
     (SID_NAME 
= ORCL)
    )
  )

LISTENER 
=
  (DESCRIPTION_LIST 
=
    (DESCRIPTION 
=
      (ADDRESS 
= (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS 
= (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
    )
  )

保存后,重启lsnrctl服务后就可以正常联接了。


posted @ 2010-08-12 17:39 shanghai_spark 阅读(513) | 评论 (0)编辑 收藏

因为/ 下的磁盘空间快用完了,所以将mysql的data目录迁移到/mnt/mysql下,先修改/etc/my.conf:
[mysqld]
datadir
=/mnt/mysql/data
socket
=/mnt/mysql/mysql.sock

然后重启mysql, service mysqld restart
但始终提示启动失败,查看日志/var/log/mysqld.log,发现实际mysql已经启动。

编辑/usr/lib/mysql/mysql_config将
socket='/var/lib/mysql/mysql.sock'
修改为
socket
='/mnt/mysql/mysql.sock'

问题消除。

但使用mysql本机访问时总是提示无法通过/var/lib/mysql/mysql.sock连接数据库,噢,原来是忘记在/etc/my.cnf中加入client配置了,
增加:
[client]
socket
=/mnt/mysql/mysql.sock

后故障消除。怕自己以后迁移数据库忘记了,还是写篇blog记下为妙。
posted @ 2009-09-05 11:36 shanghai_spark 阅读(686) | 评论 (0)编辑 收藏

好象有日子没更新过blog了,写篇来证明博主的存在吧。

好多哥们建了网站,都不知道如何吸引别人的眼球。其实我觉得的,要么功能,要么内容。可是个人办的网站,就是二十四小时挂在网上不停的拷贝粘贴又能做得了多少内容? 懒人自有懒办法,写个程序去抓去?


嗯,想到就得动手,不然过阵就忘记了,当然喽,还是谋定而后动,打算怎么整呢?先选择好技术:

1、谁去抓?好象好多人都推荐使用nutch或是herixtrix,不过我觉得象一般的小网站玩玩,就不必这么费事了,就用HTMLParser吧,抓取与解析一体化解决吧。

2、谁来格式化数据?同上了,俺用正则习惯了,正好node + regex 够你用了。

3、如何存储抓来的数据? 我是用惯JavaEE了,那就 ibatis + mysql 吧,hiberate 就不必了,虽然我没打算做个多高负载的应用,但hibernate怎么也感觉不是很合适吧? (喜欢hiberate别拍砖,我不喜欢口水战,各人有自喜好,而且hibernate我也很喜欢)

4、如何把你抓来的数据表现出来呢? 这个就得看你自己的需要喽,CMS 还是 B2B电子商务程序? 还是一个 CRM或ERP程序(如果这样的话,倒不妨试试opentaps?)

5、性能是不是问题? 如果你打算做个专业的搜索引擎或是阿里巴巴之类的电子商务引擎,除去硬件的考虑、数据库的优化,也许你要更多地考虑cache的管理,还有可能考虑文件索引(如用lunece)

6、差点忘记了,谁来调度这些爬虫及程序之间的任务执行顺序呢? 试试Quartz?!

又犯困了,先写这吧,正好有个朋友要我帮忙指导做个类似玩意儿,下次再记录吧。

posted @ 2009-08-04 21:33 shanghai_spark 阅读(1499) | 评论 (5)编辑 收藏

所有 HTTP 状态代码及其定义。
代码  指示  
2xx  成功  
200  正常;请求已完成。  
201  正常;紧接 POST 命令。  
202  正常;已接受用于处理,但处理尚未完成。  
203  正常;部分信息 — 返回的信息只是一部分。  
204  正常;无响应 — 已接收请求,但不存在要回送的信息。  
3xx  重定向  
301  已移动 — 请求的数据具有新的位置且更改是永久的。  
302  已找到 — 请求的数据临时具有不同 URI。  
303  请参阅其它 — 可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。  
304  未修改 — 未按预期修改文档。  
305  使用代理 — 必须通过位置字段中提供的代理来访问请求的资源。  
306  未使用 — 不再使用;保留此代码以便将来使用。  
4xx  客户机中出现的错误  
400  错误请求 — 请求中有语法问题,或不能满足请求。  
401  未授权 — 未授权客户机访问数据。  
402  需要付款 — 表示计费系统已有效。  
403  禁止 — 即使有授权也不需要访问。  
404  找不到 — 服务器找不到给定的资源;文档不存在。  
407  代理认证请求 — 客户机首先必须使用代理认证自身。  
415  介质类型不受支持 — 服务器拒绝服务请求,因为不支持请求实体的格式。  
5xx  服务器中出现的错误  
500  内部错误 — 因为意外情况,服务器不能完成请求。  
501  未执行 — 服务器不支持请求的工具。  
502  错误网关 — 服务器接收到来自上游服务器的无效响应。  
503  无法获得服务 — 由于临时过载或维护,服务器无法处理请求。
-----------------------------------------------------------------------------------------------------------------------
HTTP 400 - 请求无效 
HTTP 401.1 - 未授权:登录失败 
HTTP 401.2 - 未授权:服务器配置问题导致登录失败 
HTTP 401.3 - ACL 禁止访问资源 
HTTP 401.4 - 未授权:授权被筛选器拒绝 
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败  
HTTP 403 - 禁止访问 
HTTP 403 - 对 Internet 服务管理器 (HTML) 的访问仅限于 Localhost 
HTTP 403.1 禁止访问:禁止可执行访问 
HTTP 403.2 - 禁止访问:禁止读访问 
HTTP 403.3 - 禁止访问:禁止写访问 
HTTP 403.4 - 禁止访问:要求 SSL 
HTTP 403.5 - 禁止访问:要求 SSL 128 
HTTP 403.6 - 禁止访问:IP 地址被拒绝 
HTTP 403.7 - 禁止访问:要求客户证书 
HTTP 403.8 - 禁止访问:禁止站点访问 
HTTP 403.9 - 禁止访问:连接的用户过多 
HTTP 403.10 - 禁止访问:配置无效 
HTTP 403.11 - 禁止访问:密码更改 
HTTP 403.12 - 禁止访问:映射器拒绝访问 
HTTP 403.13 - 禁止访问:客户证书已被吊销 
HTTP 403.15 - 禁止访问:客户访问许可过多 
HTTP 403.16 - 禁止访问:客户证书不可信或者无效 
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效 
HTTP 404.1 - 无法找到 Web 站点 
HTTP 404 - 无法找到文件 
HTTP 405 - 资源被禁止 
HTTP 406 - 无法接受 
HTTP 407 - 要求代理身份验证 
HTTP 410 - 永远不可用 
HTTP 412 - 先决条件失败 
HTTP 414 - 请求 - URI 太长 
HTTP 500 - 内部服务器错误 
HTTP 500.100 - 内部服务器错误 - ASP 错误 
HTTP 500-11 服务器关闭 
HTTP 500-12 应用程序重新启动 
HTTP 500-13 - 服务器太忙 
HTTP 500-14 - 应用程序无效 
HTTP 500-15 - 不允许请求 global.asa 
Error 501 - 未实现 
HTTP 502 - 网关错误 
posted @ 2009-02-05 22:40 shanghai_spark 阅读(598) | 评论 (0)编辑 收藏

为了进一步了解ofbiz/opentaps的ER模型,硬着头皮看了《The Data Model Resource Book》差不多两周。虽然还是有些地方有点吃不准,总体来说还是收益良多。我尝试将它的思想与我以往用过或是我了解的对业务建模的ER模型进行对比,可以在以后的开发中汲取经验:

1、实体之间的关系或是本身的描述都是有生命周期的,这一点从ER Diagram中随处可见的From Date 与Thru Date可以充分体现出来。

2、以第三方角度对业务建模而非“我”方角度建模,这个比较有趣,通常来说我们会把销售订单与采购订单分成两个实体,这是因为我们从使用者角度来看销售订单与采购订单是不同的业务类型,而从第三方角度来着,销售订单与采购订单都是当事人之间发生的采购/销售业务,关心的业务内容与属性完全一致,而这样建模可以带来大量的业务逻辑共用与可扩展性。

3、抽象层次较高的业务实体,通过属性内容进一步细化业务对象。

这是我感觉比较重点的几个点,先记下!
posted @ 2009-01-14 10:57 shanghai_spark 阅读(2095) | 评论 (1)编辑 收藏

看opentaps关于库存管理的文档时,总是被Serialized Inventory Item与Non Serialized Inventory Item弄得一头雾水.

看了一下<<The Data Model Resource Book>>的这段话才弄明白:
The INVENTORY ITEM may be either a SERIALIZED INVENTORY ITEM,which means each item's serial num(ber) is tracked, or a NON-SERIALIZED
INVENTORY ITEM, which means a group of items is tracked together and the quantity on hand for these is maintained by their location.

即产品是按个体单独跟踪,还是按相同群体特征进行数据和存放地点跟踪管理.

记下来,不要下次再忘记了!
posted @ 2009-01-07 16:42 shanghai_spark 阅读(635) | 评论 (1)编辑 收藏