前面讲到我在做2BizBox ERP开发的时候,遇到导入数据的需求,然后我用JXL对Excel进行了一些操作。
但我们不能让用户输入“1,2”这种坐标吧,如客户编号坐标;用户肯定喜欢用Excel的坐标,A1,B1等来表示。来个图看看:
所以就要求程序把A1,B1等转换成JXL认识的坐标。
第一步:校验数据,看是否符合Excel坐标表示法,我用的是正则
第二步:把字母转化成数字
代码供参考
publicstaticint[] splitExcelCell(String coordinate) {
coordinate = coordinate.trim().toUpperCase();
int[] colAndRow =newint[2];
if (coordinate.matches("[A-Z]{1,2}[0-9]+")) {
StringBuffer tmpS = new StringBuffer();
for (int i = 0; i < coordinate.length(); i++) {
char c =coordinate.charAt(i);
if (c >= 48 && c <= 57) {
colAndRow[0] = Integer.parseInt(coordinate.substring(i));
break;
}
tmpS.append(c);
}
colAndRow[1] = splitExcelCol(tmpS.toString());
}
return colAndRow;
}
publicstaticint splitExcelCol(String coordinate) {
coordinate = coordinate.trim().toUpperCase();
int colNumber = 0;
if (coordinate.matches("[A-Z]{1,2}")) {
if (coordinate.length() == 1) {
int k = coordinate.charAt(0) - 64;
colNumber = k;
}
elseif (coordinate.length() == 2) {
int i = coordinate.charAt(0) - 64;
int j = coordinate.charAt(1) - 64;
colNumber = i * 26 + j;
}
}
return colNumber;
}
当然程序也要做一些判断,如果用户输入有误的话,报一些错误提示。
posted @
2012-06-19 09:54 zhangchuanzheng 阅读(198) |
评论 (0) |
编辑 收藏
大家知道TWaver Java总的TList继承自Swing的JList,所以我们可以很容易控制其选择,例如单选、多选等。但是本文介绍如何控制按指定数量进行选择。
人生就是一个不停选择的过程。所以,我们必须要谨慎的控制好你的选择,无论是TList的SelectionModel,还是人生之路。
在实际项目中,我们经常需要对list进行不能超过限定数量的多重选择控制。本文用到的技巧可能是本站最简单的一次了:利用DataBox的SelectionModel,当选择总数超过限定,就将最早的选择删除。
其中max我们可以指定。乳沟max=1则变成了单选。
通过这个思路,本文写了一个很简单的例子:通过控制多选数量,制作一个简单的点菜选择。相信你的系统中也经常会有类似的场景:通过list让用户选择指定数量的数据。
posted @
2012-05-29 17:14 zhangchuanzheng 阅读(165) |
评论 (0) |
编辑 收藏
Java很早就推出了Java Web Start(简称JWS)技术。这一技术的初衷很好:希望将桌面程序和Web页面之间搭起一个无缝的桥梁。虽然Applet技术已经存在了十多年,但是它日趋老迈衰落,所以JWS也就应运而生了。
但是JWS并未顺利实现它的初衷。从Java的几次大改版都可以看到,JWS的bug多多,漏洞频频,Sun和Oracle不得不频繁的进行打补丁 修复。可以看看Java 5和6每次大小版本升级变化中,有多少是和Java Web Start有关的。难怪很多人都这样感叹:“哥再也不用Java Web Start部署应用了!”其实也未必,随着Java的不断完善,我们只要了解更多的技巧,就可以有效的消除一些JWS潜在的问题,并顺利的应用在企业应用 中。
以2BizBox ERP项目为例,本文介绍如何在企业应用中利用动态生成JNLP文件的技术来实现应用的快速部署。
大家知道,2BizBox ERP作为一个免费的高质量ERP软件,有成千上万的用户。就我们开发团队负责维护的服务器,就有近千台。每台服务器都是一家企业,每家企业又有几十上百 的客户端。如果采用下载客户端安装程序进行安装的方式来维护诸多的客户端,无疑是巨大的工作量,用户和我们开发团队都不会轻松方便。为了解决这一问题,采 用JWS无疑是必然的选择。
为了让客户端自动启动下载和安装程序,我们在企业的2BizBox ERP服务器上部署以下JNLP文件内容:
上面的JNLP文件定义了2BizBox ERP客户端启动所需要的jar包以及下载位置、jre版本等。
在实际应用中,效果良好。但是由于JNLP和JWS本身的bug,在某些情况下,后台jar程序更新升级后,用户侧启动jnlp并不能获得更新,需 要强行清空JWS缓存才行,这肯定不是一般用户懂得的。还有一种情况,就是由于ERP本身的jar包发生了变化(例如发生了增减),此时相当于jnlp文 件的内容发生了变化。这时候,要求用户一侧机器必须意识到jnlp的变化并先将jnlp进行更新。在很多java版本中(例如jre6的早期版本——例如 jre6 update20之前),由于潜在的一些bug等原因,都不能顺利的进行更新,导致程序启动失败。
如何解决这一情况呢?采用动态jnlp是一个有效的方法。
动态jnlp的思路是:在服务器的后端,通过jsp或servlet来动态的生成一个jnlp文件,而不是放置一个静态的固定不变的jnlp文件。这样,jnlp文件内容就可以通过后台应用的逻辑进行动态生成创建:需要什么jar包、需要什么jre版本等等。
以jsp为例。在这个jsp中,首先要注意的几个技术点是:要设置本页面不要被浏览器缓存,放置jnlp内容变化无法及时被更新;其次要设置 mime类型让浏览器认为它是一个jnlp文件,以便下载执行而不是直接在浏览器中显示出来。通过设置response即可达到这些目的:
其中,禁止浏览器和webstart缓存jnlp内容,通过设置:response.setHeader(“Pragma”, “no-cache”);和response.setHeader(“Expires”, “0″);
设置文件类型,并给定一个动态的文件名。这个通过这个进行:response.setHeader(“Content-Disposition”, “filename=\”bb.jnlp\”;”);response.setContentType(“application/x-java-jnlp-file”);
一个需要注意的问题是,在动态生成jnlp文件时,要注意jnlp文件中的href标签不要进行设置。为什么呢?看一下jnlp的格式文档是这样说的:
http://lopica.sourceforge.net/ref.html#jnlp
The jnlp file's one and only root.
Attributes
spec=version , optional
Specifies what versions of the jnlp spec a jnlp file works with. The default value is 1.0+. Thus, you can typically leave it out.
version=version , optional
Specifies the version of the application as well as the version of the jnlp file itself.
codebase=url , optional
Specifies the codebase for the application. Codebase is also used as base URL for all relative URLs in href attributes.
href=url , optional
Contains the location of the jnlp file as a URL. If you leave out the href attribute, Web Start will disable the update check on your JNLP file, and Web Start will not treat each new JNLP file as an application update - only updated jar files will. Leaving out href usually makes only sense if your jnlp file is created dynamically (that is, throug a cgi-script, for example) and if your jnlp file's arguments or properties change from request to request (user to user).
Note, that Java Web Start needs href to list your app in the Web Start Application Manager.
可见在动态生成jnlp时候就不要设置href了,这样就可以保证每次浏览器会重新下载jnlp文件内容,否则可能会被缓存,无法及时更新程序。
另外一个技巧是:jnlp文件中的jar包,可以进行动态检查文件jar包并动态生成。这样,如果以后程序的jar文件有增减,就不必修改jnlp文件了。方法也很简单:检查当前web在服务器的绝对路径,并list所有的jar文件,然后在jnlp生成时候输出即可:
然后在jar的部分这样列出:
最后,如果需要在jnlp中指定当前服务器的ip地址或主机地址,也可以通过动态生成。例如jnlp文件中的codebase,就是如此。另 外,2BizBox ERP还需要在主函数中给出当前服务器的ip地址。而对于上千家的2BizBox服务器,每个jnlp要手工维护ip地址,是不可想象的。这里通过动态生 成,就永远的解决了这个问题:
然后在jnlp中:
这样,通过jsp动态生成jnlp的方案就完成了。它在2BizBox ERP中应用良好,方便的让上千家2BizBox ERP的云主机用户快速得到程序更新,而简化了程序的维护方式。
posted @
2012-05-23 10:31 zhangchuanzheng 阅读(390) |
评论 (2) |
编辑 收藏
又免费,又免费,ERP免费,现在进销存也免费了...2BizBox-A2正式发布
转个贴给大家看看哈
用户们盼望已久的2BizBox-A2正式发布了。
总有人抱怨2BizBox ERP还是太复杂难用。现在好了,A2提供了一个简化版的2BizBox,它类似一个“进销存”版本的2BizBox。
A2对2BizBox ERP的模块进行了精心的简化和优化,业务只涵盖了采购、销售、库存和财务,而去掉了工单和生产环节,是一个典型的“进销存+财务”的业务系统。
A2特别 适合没有生产、或不想实施生产业务的企业。
A2可以平滑升级到2BizBox ERP。
主要特点• 2BizBox ERP精简版:包括进销存+财务,去掉了工单和生产环节
• 简单易用,业务精简,适合不含生产业务的中小企业,或暂不对生产进行管理的企业
• 可平滑无缝升级到2BizBox ERP
• 界面风格和2BizBox ERP完全保持一致
主要功能• 基础数据模块、采购、销售、库存、财务
• 实现一体化进销存+财务业务
• 简化ERP流程,可直实现无订单直接收发料
附件:
2bizbox-109.png [ 28.66 KiB | 被浏览 8 次 ]
附件:
2bizbox-117.png [ 139.31 KiB | 被浏览 8 次 ]
下载地址:http://www.2bizbox.cn/product/download
posted @
2012-04-28 18:25 zhangchuanzheng 阅读(358) |
评论 (0) |
编辑 收藏
转发一下,确实很强大啊...
关键是还免费...
posted @
2012-04-28 18:15 zhangchuanzheng 阅读(455) |
评论 (0) |
编辑 收藏
作为供应商,可能会在一个月内接到同一客户的多次采购请求,会建立多个销售单。但对每个销售单每次都开相应金额发票又略显繁琐。在2BizBox里,您可针对此种情况,做批量应收账款建立。
在财务模块->应收账款->按发货单项添加应收账款,选择要建立应收账款的客户,同时选择币种,点击确定,出现如下图1:
附件:
batch AR.png [ 87.72 KiB | 被浏览 11 次 ] 勾选希望应收账款合并建立到一起的发货单,点击确定后,出现合并到一起的应收账款页面,如下图2:
附件:
posted @
2011-10-25 09:33 zhangchuanzheng 阅读(227) |
评论 (0) |
编辑 收藏
posted @
2011-10-24 09:53 zhangchuanzheng 阅读(1469) |
评论 (2) |
编辑 收藏
2BizBox API v3.3.1已经提供发布。此次发布的主要更新内容涵盖:
与2BizBox ERP v3.3.1同步更新;改进了api内部缓存机制,降低类依赖,有效控制了包大小;增加了集成式App开发运行环境2bizbox_gui.jar包;修复了当修改后台服务器端口后无法连接的问题;简单说,新的api,您可以:
1、开发各种与2BizBox ERP v3.3.1进行集成的应用;
2、开发各种App应用程序与插件。
欢迎大家下载:http://www.2bizbox.cn/wiki/index.php/2BizBox_API%E4%B8%8B%E8%BD%BD
posted @
2011-10-13 10:01 zhangchuanzheng 阅读(303) |
评论 (0) |
编辑 收藏
posted @
2011-08-09 13:53 zhangchuanzheng 阅读(183) |
评论 (0) |
编辑 收藏
posted @
2011-08-08 10:31 zhangchuanzheng 阅读(186) |
评论 (0) |
编辑 收藏
posted @
2011-07-15 11:31 zhangchuanzheng 阅读(113) |
评论 (0) |
编辑 收藏
时间:2011年8月22-24日
地址:中国上海新国际博览中心(上海浦东新区龙阳路2345号)
2011年8月22~24日,2BizBox将参加第三届中国(上海)国际石油化工技术装备展览会。其由中国石油和石油化工设备工业协会、中国国际贸易促进委员会化工行业分会及北京振威展览有限公司主办。cippe是国际石油石化行业例会,是中国大陆第22个获得国际展览联盟UFI认证的高品质展会,每年春季在北京、秋季在上海举办,已成为全球最大石油展。
2BizBox 位于W1展馆W 1608展位,欢迎2BizBox的广大用户及关注与支持2BizBox的各位同仁莅临参观指导。
2BizBox是一款世界顶级免费ERP软件,致力于为全球中小企业与制造企业提供高质量的免费ERP软件。届时,我们将展出2BizBox最新功能演示及典型案例分析,与大家共同分享。
更多展会详细信息请访问:http://www.cippe.com.cn/
posted @
2011-07-11 11:41 zhangchuanzheng 阅读(103) |
评论 (0) |
编辑 收藏
posted @
2011-07-11 11:34 zhangchuanzheng 阅读(109) |
评论 (0) |
编辑 收藏
介绍
2BizBox推出“合作伙伴联盟”计划,诚邀各界优秀公司和个人加盟,共同为2BizBox用户提供丰富、专业、高质量的软件增值服务。
研究显示,全球需要企业信息化服务的中小企业市场有300~500亿美元,且在持续增长中。中国作为中小企业数量庞大的制造业大国,这一情况尤为突 出。大多数中小企业尚未建立有效的信息化管理手段。这些中小企业的普遍特征是:资金薄弱、管理不完善、信息化基础较差。随着市场竞争的日益激烈,中小企业 也纷纷开始信息化建设,但很多尝试并实施信息化的企业无法得到高质量的服务,导致信息化效果不佳。
2BizBox作为免费ERP的急先锋,在倡导软件即服务的理念下,推出短短数月以来,已经获得整个ERP行业的关注。目前软件下载量已累计超过 50万次,论坛日访问量超过1万PV,活跃用户超过1000。很多企业正在积极研究、评估和学习2BizBox软件,并即将进入实施阶段。大量的 2BizBox用户产生了庞大的服务需求市场,用户期望获得更加丰富、本地化的2BizBox软件服务。
为此,2BizBox筹建2BizBox“合作伙伴联盟”,希冀共同为2BizBox用户提供丰富、高质量的软件增值服务。我们在全国范围内,诚邀 企业与有识之士加盟2BizBox“合作伙伴联盟”,2BizBox欢迎您加入合作伙伴联盟,共享品牌、共享产品、共享市场、共享信息。
无论您是任何行业的公司、企业或个人,只要您符合以下任意一项,您就可以成为我们的合作伙伴:
有意向全力合作共同发展; 有自主研发的软件产品; 有信息化建设所需的硬件产品及服务; 有为企业提供软件实施以及后续服务的能力; 合作伙伴授权项目:
2BizBox软件授权实施服务; 2BizBox软件授权本地客户售后保障; 2BizBox软件系统集成授权; 2BizBox软件二次开发与定制; 合作伙伴分销项目:
2BizBox软件企业信息化硬件代购; 2BizBox软件操作培训课程; 2BizBox软件网管培训课程; 2BizBox软件API开发培训课程; 2BizBox软件SaaS在线租赁; 优势
获得官方服务授权许可; 共享《合作伙伴联盟》各种资源; 获得官方网站目录展示等市场推广; 获得2BizBox直接技术支持; 完善的联盟体制,避免恶意竞争; 共享品牌、共享产品、共享市场、共享信息; 《合作伙伴联盟》由四个会员级别:
战略合作伙伴 金牌合作伙伴 银牌合作伙伴 铜牌合作伙伴 备注:
1. 合作伙伴需填写《合作伙伴联盟申请表》,由2BizBox团队进行评估批准。
2. 合作伙伴需具备一定的专业知识,并通过培训取得相应的认证资质。
3. 合作伙伴目录及实施案例将在2BizBox官方网站适时更新。
4. 合作伙伴可在授权期间和地域内开展指定的服务项目。
5. 双方需签署《合作伙伴联盟协议》,严重违反协议者,将终止合作伙伴资质,并追究其相应责任。
联系方式:
联系人:李经理
咨询专线:021-6439 8788(转)809
咨询热线:15900424005
传真:021-6439 5374
咨询邮箱:slong.li@servasoftware.com
详细内容请点击
官方网站:
www.2bizbox.cn
posted @
2011-06-16 10:18 zhangchuanzheng 阅读(186) |
评论 (0) |
编辑 收藏
热烈祝贺2BizBox第二届免费公开课成功举办。感谢那些远道而来的朋友,那些来自河北石家庄、山东、深圳、南京、杭州及上海的朋友,感谢大家的关注和支持。
posted @
2011-05-27 18:35 zhangchuanzheng 阅读(196) |
评论 (1) |
编辑 收藏
2BizBox v3.2.0 beta版发布后,中国财务的功能就完全展现在大家的面前了。中国财务无论是在业务上还是在使用上和外国财务还是有着天壤之别的。在此,2BizBox团队向各位介绍一下有关进销存在使用中国财务上需要注意的事项。
一.设置本年利润科目
当您在初始化财务配置选择中国后,系统将会自动增加“本年利润”的初始设置。如要使用结转损益,必须设置“本年利润”科目。
附件:
1.PNG [ 214.1 KiB | 被浏览 27 次 ]
首先,您需要返回“设置会计科目”界面,添加“本年利润”会计科目,“本年利润”的会计科目必须是“QN”类型,因此我们得先添加一个“QN”类型的会计科目->“本年利润”。
附件:
2.png [ 211.03 KiB | 被浏览 27 次 ]
然后,再返回“设置财务参数”界面,将设置好的“本年利润”科目与“本年利润”参数关联即可。
附件:
3.PNG [ 217.34 KiB | 被浏览 27 次 ]
二.设置自动审批人
1.为什么要设置自动审批人
自动审批人是通过“系统凭证类型”去添加的,首先先要去创建一个“凭证审批人”,因为创建“系统凭证类型”时需要“凭证审批人”这个字段数据,所谓要审批必须要有人去做,说的就是这个意思,所以必须为这个岗位配置一个人员才行。
2.如何设置自动审批人
第一步 创建凭证审批人。
1.进入创建凭证审批人入口。
附件:
4.PNG [ 104.55 KiB | 被浏览 27 次 ]
2.选择一个员工号,将其添加为凭证审批人。
附件:
5.png [ 10.48 KiB | 被浏览 27 次 ]
3.对其设置审批额度,用来定义审批金额的标准。
附件:
6.PNG [ 12.75 KiB | 被浏览 27 次 ]
第二步 创建凭证字。
创建一个凭证字,因为创建自动审批人是需要凭证字这个字段,凭证字是为了方便凭证分类查找检核。一般来说,凭证字分为4种。第1种,“收款凭证”,凭证字就是“收”。用于收取现金、银行存款时做。第2种,“付款凭证”,凭证字就是“付”。用于支付现金、银行存款时做以下是添加凭证字的入口。第3种,“转帐凭证”,凭证字就是“转”。用于不动现金或银行存款时做。
1.进入添加凭证字的入口。
附件:
7.PNG [ 134.64 KiB | 被浏览 27 次 ]
2.进入凭证字列表后,点击右上方的“添加”。
附件:
8.PNG [ 13.34 KiB | 被浏览 27 次 ]
3.凭证字和名称是必填项,同时可设置会计科目。
附件:
9.PNG [ 14.02 KiB | 被浏览 27 次 ]
第三步 创建自动审批人。
为什么中国财务会需要自动审批人这一设置呢,原因是中国本土财务业务里,经常要批量做账,所以如果一一去审批则会降低工作效率,有很多单据的审批程度相同,就可以把它们集结在一起,一次性将其审批完毕。
1.创建完凭证字后,接下来就是创建自动审批人了,以下是添加自动审批人入口。
附件:
10.PNG [ 130.16 KiB | 被浏览 27 次 ]
2.在系统凭证类型列表的右上方点击“添加”。
附件:
11.PNG [ 14.62 KiB | 被浏览 27 次 ]
3.“系统凭证类型”选择“应付账款的系统凭证”,之前创建的凭证字和审批人也可以在这里被选取。“应付账款的系统凭证”包括“应付账款”和“应付抵账单”。
附件:
12.PNG [ 13.97 KiB | 被浏览 27 次 ]
第四步 设置自动凭证审核:
最后,在财务配置里,要将“自动凭证审核”勾选上,这样就可以通过收料单和发料单直接创建账款了。
附件:
13.PNG [ 48.03 KiB | 被浏览 27 次 ]
提醒:销售流程
上面的步骤是采购流程创建账款的注意事项,销售流程创建账款的注意事项和采购流程差不多,不过有几点差异。
首先,凭证字是“收款凭证”。
附件:
14.PNG [ 14.01 KiB | 被浏览 27 次 ]
其次,“系统凭证类型”要选择“应收账款的系统凭证。”这样一来,销售流程的自动审批人也就添加完毕了。“应收账款的系统凭证”包括“应收账款”和“应收抵账单”。
附件:
15.PNG [ 14.28 KiB | 被浏览 27 次 ]
最需要大家注意的是,被添加为审批人的那个用户,不能审批自己创建的单据。
当设置成中国财务后,大家如果没有做以上设置的话,那么在采购单或销售单流程里最后创建账款时会被系统提醒“自动审批人不能为空”。
附件:
16.PNG [ 52.67 KiB | 被浏览 27 次 ]
另外,大家要注意一下摘要的问题,如在下图中创建账款界面中输入摘要的话,系统创建凭证时会取此界面的摘要,如果不输入,则取之前在创建“凭证字”时输入的摘要。
附件:
17.PNG [ 41.08 KiB | 被浏览 27 次 ]
以上是关于中国财务“自动审批人”的一些设置说明,希望对大家有所帮助。
posted @
2011-05-25 10:52 zhangchuanzheng 阅读(1107) |
评论 (1) |
编辑 收藏
有外币业务的企业知道,财务上除了在做收付款时需要进行调汇以外,还需要周期性的对系统中的外币账户进行汇率调整,将差异计入汇兑损益。那么,当我们进行月度调汇(或季度、年度,根据自身企业不同而定)时,如何决定哪些会计科目参与外币调汇呢?答案就在会计科目本身上面。
选中一个科目,进入编辑状态。可以看见“核算外币”和“期末调汇”两个选项。“核算外币”科目是说该科目是否是一个外汇科目。而“期末调汇”是说,如果是核算外币科目,那么该科目是否参与期末调汇。
附件:
2bizbox_coa_currency.png [ 38.71 KiB | 被浏览 158 次 ]
posted @
2011-05-20 14:18 zhangchuanzheng 阅读(193) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2011-02-15 12:16 zhangchuanzheng|
编辑 收藏
上一锤提到了刚发布的免费ERP系统(www.2bizbox.com)后,大家反响很热烈,短短3天就被下载了2万多次,服务器一度宕机,呵呵。大家讨论也比较热烈,纷纷提出不少问题和技术探讨,感觉非常有意义。这次和大家分享一下关于这个免费ERP的架构设计。之前先回答一下大家比较关心的一些问题:
- 网站只提供了windows的exe安装版,大家询问是否有适合linux跑的版本:这个可以有,不过还需要一点时间来发布,几周后就会有下载,请大家耐心等待并及时关注。目前,官网上已经提供了exe和zip,不过都是针对windows平台的。
- 下载后一些朋友无法解压和运行,尤其使用迅雷等工具的朋友。这个原因还不知道,可能和多线程下载以及网络有关,可以在下一次,或尽量不使用工具下载。由于服务器在国外,下载速度肯定不会特别好。不过一些热心网友已经提供了国内的下载链接,官网较慢的可以试试这里:E备是链接地址,输入验证码即可下载。我家2M带宽,用chrome 自带的下载工具下载,大约用了8分钟完成下载。另外还有JavaSwingChina、天极网下载、华军软件园、绿色软件联盟、旋风下载、中关村在线、豆豆软件站、。。。似乎一夜之间遍地都是了,呵呵
- 还有朋友关心公司是国内的还是国外的:公司是美国的,不过我们上海这个小团队负责一部分开发工作。在国内也有不少客户,例如中石油、襄钻股份、江汉三机、四机赛瓦等,我们负责本地客户服务。
- 有朋友询问是否开源:目前是软件完全免费,源代码开放的事情还没有消息。不过个人判断完全有开源的可能性,呵呵,这要看美国人是怎么想的了。
- 很多朋友关心团队协调,高手低手如何共同工作,一个人搭框架,另外人不满意怎么办等等。我想这个并不是一个软件团队的特有问题。要说是问题的话,是咱们中国人特有的一种毛病还差不多。“不服气”从来是咱们的特点,问题不是高手太少,而是“大明白”、“专家”、“牛人”太多了。我曾经去一个制造厂做实施,接我们的司机谈起公司的管理来,那真是口若悬河、吐沫横飞、头头是道,上至老总下至看大门的,都被分析的“体无完肤”,好像马上换他去当老总一切问题立马解决似地。所以我认为这根本就不是一个问题。想想“奥迪R8”和“宝马7”这样的工业精品都有一个总设计师,你是在问,BMW的一个刚进去工作的学生如果认为宝马7系的总设计师设计有问题该怎么办?
还是来说说架构。先看这个图就都明白了。
提到架构,我们用到的第三方的框架不是很多,总的原则就是尽量简单、稳固。这样,就会高效、好维护。这远比一些乌七八糟的所谓新思想新技术更加重要,毕竟我们的软件要维护几十年的(实际上已经从DOS到现在开发了20年了)。后台主要是JBoss和Hibernate,其他大部分部分都是自己封装。前台则基于Swing以及自己封装的各种组件。中间通讯也没有采用第三方的框架,而是自己封装,主要采用HTTP协议,对交换的VO(包括VO集合)对象(如参数、返回值、Exception等)进行标准的Java二进制序列化、zip压缩、传输。调用的方法通过一个统一的invoke进行传递,被调用的模块、方法名、参数等,都被封装在一个POJO中传给后台。后台Façade层解压后,根据具体模块,通过反射的方法,调用Local的各个模块EJB,执行具体函数。每个函数先在Biz业务层进行业务逻辑分解处理,例如,如果要添加一个零件,要分解很多具体动作,先检查零件号是否重复,再检查零件号是否格式合法,数据是否完备,创建零件库存初始信息、创建物料添加日志、通知相关人员…等等。分解后,形成具体的DAO操作,然后交给DAO进行调用相应的底层API完成。无数的DAO对各个业务数据进行各种数据级别的操作封装(增删改查等),然后通过Hibernate层进入数据库。
有朋友喜欢用Eclipse RCP来作为前台框架。坦白说,我个人对SWT一向不喜欢,也不看好,因为他本质上和AWT的路线没什么不同,只是后台老板从SUN换成了IBM。当初以“好看+效率高”的旗号,SWT曾经风靡一时,人人趋之若鹜。不过本质上说,SWT这种技术是打着“好看/速度快”幌子分裂JAVA的政治游戏,我们程序员应当看清楚。当然不是说SWT技术不好不能做企业应用,实际上我认识的一些朋友已经用SWT搭建了好大好大的应用。不过SWT毕竟不是JAVA的官方技术。如果相信JAVA的未来的话,我觉着应当相信SWING才是正道。SWING有不足,但是它会不停的发展。另外,千万别总拿“丑”和“慢”来攻击Swing,说到底还是看你会不会用,吐口水实在无意+无聊。说道RCP框架,我倒更喜欢NetBeans。不过国内大家还是把Netbeans当做IDE来用,实际上这个RCP平台相当不简单,质量很高而且国外应用很多,已经非常成熟,有空可以多看看Netbeans的Platform频道(不是IDE哦)。
HttpInvoker没有用过,不知是不是和Spring绑的比较死,看上去和我们的通讯方式完全类似。其实java序列化再传输就是几行代码的事情,如果不用Spring等框架,完全没必要用第三方的,自己封装一下就好了。看看这个代码就知道了:
1 /** *//**
2 * Here should be the unique access of FacadeWrapper.invoke!
3 */
4 public static Object invokeImpl(ServerAction action) throws ServerActionException {
5 action = new ServerAction(action.getModuleName(), action.getMethod(), escapedStringParamsConvertor(action.getParams()), paramsTypeConvertor(action.getParamTypes()));
6 action.setOrderBy(getOrderBy());
7
8 try {
9 Object result = FacadeWrapper.getInstance().invoke(action);
10 //unzip, if need.
11 if (result instanceof ZippedByteArray) {
12 ZippedByteArray zippedData = (ZippedByteArray) result;
13 if (zippedData.getByteArray() != null) {
14 try {
15 result = BB2Util.unzipObject(zippedData.getByteArray());
16 } catch (Exception ex) {
17 throw new ServerActionException(ex);
18 }
19 }
20 }
21
22 return result;
23 } catch (Exception ex) {
24 ExceptionWorker worker = new ExceptionWorker(ex);
25 //
26 throw new ServerActionException(ex, anotherServer);
27 }
28 }
Hessian基于WS还可以支持不同的客户端,也很不错。不过我们这种需求不大,没有使用WS以及其他客户端技术的需求,也没有采用。还是觉着简单的东西自己封装更加的灵活和容易控制。我们的思路是尽量少的引进第三方的框架。过多的异构框架导致的稳定性和灵活性的代价也是很大的。
其他一些类似MQ之类的异步框架就更比较谨慎使用。前后台调用需要实时性,肯定是同步调用为主。异步的情况不多,即使有,在基于HTTP的结构下(例如只开放80端口)也比较难实现。我们采用了JBOSS的JMS机制,实现一些后台主动发送业务消息、上传图纸等功能。当然如果后台禁止了相应端口,客户端就自动放弃JMS连接,工作在纯“主动模式”下,相当于一个“浏览器”。
对于非桌面客户端,例如手机、数据采集器、PDA等,我们在后台的Façade层上面再包装一个又一个简单的“协议适配”就行了,也就是把Java的对象简单的封装到XML或HTML,负责与这类终端通讯。这样,身后的安全啊、日志啊、业务啊等就完全复用,开发速度是很快的。对于大多手机,使用XHTML进行浏览即可;对于iPhone等则开发native的终端,对于PDA和数据采集器,由于有条形码、收料发料、盘点等复杂应用,所以用本地的环境进行创建GUI(一般都是Windows CE,可用C#进行)。这样,我们的架构可以简单快速的支持各种不同的终端接入:
有朋友担心一个Servlet提供所有API太变态,其实不必担心。没错,我们的模块API至少上万,但是这个后台的Façade Servlet其实只有不超过10个方法。最主要的一个是invoke,方法都是通过一个对象封装了模块、方法名、参数序列等来通过反射机制完成的,所以,无论后台模块API有多少,只要通过这一个唯一的业务入口出入就行了。至于前台使用不太方便的问题,可以通过前台再次封装展开来解决。
最后在透漏一下这套免费ERP的下一步进度:目前正在紧张汉化工作,预计在本月内会发布全中文版本。Linux打包文件也在进行中,有望很快可以下载。其他还有很多很好的模块,会陆续推出,期待大家支持和反馈。如果你身边有人在研究或选型ERP,不放推荐一下这个全免费的、高质量的、专注机械制造业的大型ERP:2BizBox。
套用一句刘仪伟的说法:现在谁还花钱用ERP啊?!
最后送Swing界面:设置会计年度
风信子长到第十天,没有换水。
posted @
2011-01-19 16:57 zhangchuanzheng 阅读(3174) |
评论 (3) |
编辑 收藏
摘要: 这些年大家都在说:Swing学起来费劲,用的也不多,见到的应用也不多,能做大型应用么?
阅读全文
posted @
2011-01-18 15:12 zhangchuanzheng 阅读(2233) |
评论 (2) |
编辑 收藏