EAS费用报销模块web二次开发指南(document 36页).docx
最新资料推荐EAS费用报销模块Web二次开发指南 EAS HR系统部 作者 李大伟,贺鹏辉 整理 陈昕 导读 本文从头开始介绍了EAS费用报销Web表单的二次开发方法,同时也说明了开发环境的安装和配置方法。可供机构开发人员对费用报销web表单进行二次开发时参考。 适用范围 EAS费用报销模块web二次开发人员请注意:本文件只作为产品介绍之用,不属于您与金蝶签署的任何协议。本文件仅包括金蝶既定策略、产品及功能方面的信息,不能以本文件作为要求金蝶履行商务条款、产品策略以及开发义务的依据。本文件内容可能随时变更,恕不另行通知。目 录概述4目的4范围4定义、首字母缩写词和缩略语4环境准备4jdk安装4pt环境准备4统一的web开发目录 w:webdev4统一开发工作区间 webdev/workspace4W:webdevapusicstudio-5.1为开发工具,双击studio.cmd启动开发工具5更新和部署AOM5部署easweb.ear5修改W:easServerserverdeployeasweb.eareas_web.warWEB-INF下operamasks.xml6启动服务器,以协同办公费用报销单为例:可以通过7新建WEB工程7新建Apusic标准工程7添加web模块8新建faces页面13添加Apusic服务器16运行我们的应用18定义及发布元数据19实体的定义和发布19查询的定义和发布19生成WEB界面代码19设置web界面代码路径19生成web界面代码20添加库文件23添加用户库23添加WAF包23添加业务逻辑类引用23WEB界面代码的修正25* EditBean.java的修正25*Edit.xhtml文件的修正25*List.xhtml文件的修正27部署及启动EAS WEB应用27部署EAS WEB27Pt环境下启动EAS 服务27二次开发应用28修改业务单元28发布业务单元28执行升级脚本29搭建web开发环境29修改web页面29修改managedBean29部署二次开发应用30常见问题30#message* EL Expression 错误30编辑界面单据体(分录部分)无法显示30如何检查调用类的物理路径30下载文件时会在线打开,且出现乱码(如何进行文件的下载)30表单编辑页中点击新增分录时出错33在EditBean或ListBean中,通过IBOSBizCtrl设置了某个接口(如:IBOSBizCtrl private IDocReceive service;),但发现在使用该接口service时,service为null33在view上找不到managedBean33按钮或者其他控件的状态被缓存,如单据查看时某按钮被置灰后,新增时按钮仍是置灰的。33WEB主界面开发方法33编制jsp页面。33配置portlet模板信息。34Portlet业务配置信息设置。34Portlet基础定义设置。34页签配置35参考资料35概述目的根据标准web单据开发流程,描述以下内容:l 环境准备l Web工程的创建l 元数据的定义和发布l Web界面代码的生成l Web界面代码的修正l EAS web的部署和运行l 二次开发应用l Web主界面的开发方法范围适用版本:Kingdee EAS 6.0,Kingdee BOS 6.0定义、首字母缩写词和缩略语l AOM:Apusic OperaMask,金蝶中间件公司的Web开发框架l AAS:Apusic Application Server:金蝶中间件公司的J2EE应用服务器产品l Ext JS:一套基于Java Script的浏览器端UI组件库环境准备jdk安装jdk要求5.0以上版本。pt环境准备pt搭建一个gui的开发环境。统一的web开发目录 w:webdev统一开发工作区间 webdev/workspace如图所示:W:webdevapusicstudio-5.1为开发工具,双击studio.cmd启动开发工具Apusicstudio可以到更新和部署AOM可以到http:/www.operamasks.org/dist/aom/snap/binaries/获取AOM最新版本部署easweb.ear修改部署文件W:apusicdomainsserver1configserver.xml加入<application name="EASWeb" base="W:/eas/Server/server/deploy/easweb.ear" start="auto"/>如图所示:easweb.ear结构如图:修改W:easServerserverdeployeasweb.eareas_web.warWEB-INF下operamasks.xml开发那个项目将哪个项目的jar包配置项删掉。如开发协同费用报销就将<jar>cp_bc_web.jar</jar>删除掉。如图: 将从cvs上获得的或开发完成的view (即xXXX.xhtml)拷贝到W:easServerserverdeployeasweb.eareas_web.war 将从cvs上获得的开发完成的ManagedBean(即XXXXBean)拷贝到 W:easServerserverdeployeasweb.eareas_web.warWEB-INFclasses 注:以上路径没有包含包名,拷贝时需要将自己加上包路径,如cpbc 如图所示:启动服务器,以协同办公费用报销单为例:可以通过http:/localhost:6888/easweb/cp/bc/bizAccountBillList.jsf访问。新建web工程由于WAF目前混合使用Apusic Studio(Web UI开发)与BOS Studio(Web元数据定义与框架代码发布),所以是先进行web工程的新建还是先进行EAS元数据的定义,我们并没有严格的限制,可根据个人熟悉程度决定。新建Apusic标准工程我们使用Apusic作为我们的web容器,所以我们从新建Apusic标准工程开始我们的标准单据开发的旅程。在Apusic studio中点击“文件新建Apusic标准工程”,如下图:包含以下几个点的定义:项目名称,空间及存储位置选择,服务器选择,域选择及J2EE版本的选择,输出文件夹。我们可以在此进行本地服务器的新建也可以在后续过程中添加服务器,为不影响新建流程的顺畅,我们将在后续步骤中单独描述。J2EE版本的选择应该引起注意,我们须要选择5.0以上的版本。定义好上述内容后点击完成,我们可以在打开包视图查看工程目录结构如下:添加web模块点击新建工程根目录,右键选择“新建web模块”:打开对话框如下:需要注意源文件夹(用来存放源代码)及web内容文件夹(用来存放页面,配置信息等资源文件)。点击下一步:EAS web应用框架建立在AOM基础上,所以我们不得取消“支持AOM”的选项。AOM的配置中需要注意url后缀的配置,该配置意味该后缀的请求都将由AOM处理。我们按习惯修改成*.jsf,定义好以后我们将可以在web.xml中发现相应的配置内容: <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping>完成上述步骤,点击完成web模块的新建,我们发现工程目录下增加了src及WebContent目录:新建faces页面选择“文件新建Faces页面”:选择是否生成managebean,以及managebean设置,如果只是新建一个静态视图,那么可以不进行managebean的定义。点击完成页面新建。添加Apusic服务器前面在新建工程中已经提到服务器的选择,在此将对服务器新建做进一步描述。在新建或增加服务器之前请确保已正确安装了Apusic服务器,Apusic服务器的安装再次不再累述。打开Apusic服务器列表视图,在视图中点击右键,并选择增加服务器:添加服务器后我们需要为我们的应用指定对应的Apusic服务器,打开工程属性对话框如下图:运行我们的应用服务器启动过程中我们可以在控制台看到相应信息,部分截图如下:可以看到服务器已成功启动,我们定义的上下文根目录是mydemo,接下来我们使用http:/localhost:6888/mydemo/hello.jsf进行访问,结果如下图:至此,web工程的新建完成。定义及发布元数据元数据的定义在此特指单据实体及查询的定义,因为只有实体及查询才能发布成web界面,生成web界面代码。实体及查询的定义与非web应用中实体及查询的定义一样,没有差别。实体的定义和发布与一般实体的定义和无差别 查询的定义和发布与一般查询的定义和无差别生成web界面代码设置web界面代码路径生成web界面代码前我们需要对生成代码的存放位置进行设置,在BOS Studio中通过“窗口首选项”进入首选项配置页,左侧树形菜单中选择“BOS生成web界面代码”:将代码路径设置成我们web工程的源文件路径,将页面路径设置成我们web工程的web内容文件夹路径,点击确定完成设置。生成web界面代码接下来我们可以生成web界面代码:选择要生成界面代码的实体或查询,点击右键并选择“生成web界面代码”:回到Apusic studio并刷新工程,我们可以看到工程目录如下图:增加了相应的页面文件及逻辑代码。通常一个实体通过上述步骤会生成以下几个文件:编辑逻辑managebean及分录bean及相应属性文件:编辑页面文件:查询元数据生成web界面的过程与实体生成web界面的过程一样,只是结果文件不同:列表逻辑managebean及相应属性文件:序时薄页面文件:至此,web界面代码的生成过程已经完成。至于生成的代码内容大家可以打开相应文件细看,我们也将在后续部分中插述部分重要内容。后续将做个表格,对生成的代码及页面文件进行说明添加库文件添加用户库发布web界面代码并刷新web工程后我们的web工程出现了诸多错误,让我们看看究竟是什么原因引起了错误:发布的界面代码找不到依赖的业务逻辑类。我们需要添加用户自定义库。在web工程的构建路径中引入W:easdev下的boslib_for_eas.userlibraries和easlib_for_eas.userlibraries添加WAF包从W:easServerserverdeployeasweb.eareas_web.warWEB-INFlib下拷贝以下文件到工程目录的WebContentWEB-INFlib中,当然你也可以通过在构建路径中引入外部jar包的方式配置。添加业务逻辑类引用这里指的业务逻辑相关类即发布元数据时生成的类文件。我们有多种方式去引用这些类,由于业务的需要,我们可能需要修正这些类中的部分代码,所以打包加载的方式有些不方便,故建议在构建路径的源代码一项中添加关联目录:选择元数据发布的源代码目录。Web界面代码的修正* EditBean.java的修正在EditBean的pageOnload()中有类似语句:我们须要修正为:*Edit.xhtml文件的修正l 将#messages'*'形式的表达式都直接换成相应的信息,如#messages'creator'替换为creator或“创建人”。l 将messages'entries.seq'替换为entries_seq或其他。l 将<ui:define name="entry>">修改为<ui:define name="entry">l 去除了多余字段。l 将重新定义分录操作界面:把biz:billEntryActions标签的内容替换为分录操作的自定义部分,可以如下:修正前:<div class="kd-panel-btns-right"> <biz:billEntryActions beanName="#phdemo.PhInWarehouseBillEditBean" entryBeanName="#phdemo.PhInWarehouseBillEntryBean"></biz:billEntryActions> </div>界面效果(点击操作按钮出错,且无具体提示信息):修正后:<h:panelGrid columns="3" style="float: right"><w:button id="addRow" value="新增" alwaysSubmit="true"immediate="true"action="#phdemo.PhInWarehouseBillEntryBean.appendRow" /><w:button id="insertRow" value="插入"alwaysSubmit="true" immediate="true"action="#phdemo.PhInWarehouseBillEntryBean.insertRow" /><w:button id="removeRow" value="删除"alwaysSubmit="true" immediate="true"action="#phdemo.PhInWarehouseBillEntryBean.removeRow" /></h:panelGrid>界面效果(新增):*List.xhtml文件的修正l 将#messages'*'形式的表达式都直接换成相应的信息,如#messages'creator'替换为creator或“创建人”。l 将messages'entries.seq'替换为entries_seq或其他。部署及启动eas web应用部署EAS WEBEAS web应用必须与EAS应用服务(非web)场景同时使用, Eas统一的应用部署路径为W:easServerserverdeployeas.eareas_web.war 访问路径http:/localhost:6888/easweb,我们需要做以下几个步骤的部署:l 拷贝工程下的scm_channel_web webWebContentWEB-INFclasses到W:easServerserverdeployeas.eareas_web.warWEB-INFclassesl 拷贝scm_channel_web webWebContent下的相关文件到W:easServerserverdeployeas.eareas_web.war该部分的拷贝比较繁琐麻烦,我们提供了相应的批处理文件进行处理。Pt环境下启动EAS 服务运行W:easServerserverprofilesserver1bindebugserver.bat访问单据编辑页http:/localhost:6888/easweb/mydemo/phInWarehouseBillEdit.jsf访问http:/localhost:6888/easweb/mydemo/phInWarehouseBillList.jsf二次开发应用修改业务单元l 打开金蝶bos,切换到金蝶bos业务建模透视图l 打开需要二次开发修改的单据,使用选用板添加字段,以报销单为例,如图所示: 发布业务单元l 在费用报销单界面里,单击右键,选择单据信息,确认不生成生成实现类,如图所示:l 在菜单选择费用报销单,单击右键,单击发布业务单元/报表即可。执行升级脚本在管理控制台或直接数据库中执行升级脚本,将新加字段添加到数据库相应的数据表中。搭建web开发环境l 按照2、3、4、5步骤搭建web开发环境修改web页面l 将easServerserverdeployeasweb.eareas_web.warcpbcbizAccountBillEdit.xhtml的页面内容,覆盖步骤5 中生成bizAccountBillEdit.xhtml页面。l 在页面间将新添加的字段绑定,如下:<kd:labelContainer caption="主题" style="margin-left:120px;" width="270" lineWidth="80"><w:textField value="#cp.bc.BizAccountBillEditBean.model.name" required="false" maxLength="80"></w:textField></kd:labelContainer>修改managedBeanl 将easServerserverdeployeasweb.eareas_web.warWEB-INFlibcp_bc_web_jar解压缩,反编译BizAccountBillEditBean.class,将内容覆盖步骤5 生成的代码。l 修改代码逻辑部署二次开发应用l 将修改的bizAccountBillEdit.xhtml,覆盖easServerserverdeployeasweb.eareas_web.warcpbcbizAccountBillEdit.xhtmll 将修改的BizAccountBillEditBean后编译生成的BizAccountBillEditBean.class重新拖入easServerserverdeployeasweb.eareas_web.warWEB-INFlibcp_bc_web_jar包中,替换原来的class文件。常见问题#message* EL Expression 错误 目前不支持该种表达式显示信息,我们需要替换该表达式为实际要使用的信息,如:将#messages'*'形式的表达式都直接换成相应的信息,如#messages'creator'替换为creator。同样,我们需要将messages'entries.seq'替换为entries_seq或其他。编辑界面单据体(分录部分)无法显示将编辑页面的将<ui:define name="entry>">修改为<ui:define name="entry">如何检查调用类的物理路径在调试过程中,在Display试图中如下调用方式:this.getClass().getResource("/com/kingdee/eas/cp/bc/web/TravelAccountBillListBean.class")下载文件时会在线打开,且出现乱码(如何进行文件的下载)ü AOM使用原生态AJAX后文件下载出现该问题的解决,且不论在服务端中对response做何处理。如果你去除f:view中renderKitId="AJAX"的设置,且保证不会影响页面其他功能,那当然是最好的解决。此外可以通过重定向到下载页进行下载。解决AOM的文件下载问题有两种方式,由于我们的实际应用场景中不是已存在文件的下载,需要与数据库等的交互,中断jsf生命周期的方式不可取。故我使用了重定向新页面进行下载的方式,即在需要引入引出功能的页面上加入iframe框,并引用文件下载页面资源:<layout:window id="exportDialog" width="350" height="210" modal="true" title="文件引出"><iframe src="/easweb/scm/downfile.jsf" width="100%" scrolling="No" height="100%"></iframe></layout:window>在单一文件下载页面中不使用AOM的原生态ajax:下载效果如下:点击引出模板,将出现下载页面如下图:表单编辑页中点击新增分录时出错首先点击增加分录按钮时出错:#phdemo.PhStockBalanceBillEntryBean.appendRow: /phdemo/phStockBalanceBillEdit.xhtml 117,65 action="#phdemo.PhStockBalanceBillEntryBean.appendRow": java.lang.NullPointerException at _expression_(0)。 解决办法:在<w:editDataGrid 下增加jsvar="editEntryGrid"相关内容请查看operamasks 文档:在EditBean或ListBean中,通过IBOSBizCtrl设置了某个接口(如:IBOSBizCtrl private IDocReceive service;),但发现在使用该接口service时,service为null这时,需要检查APUSIC运行环境中的metas/entity_pkmapping.properties是否存在该service对应的entity.因为,在发布元数据时,有可能没有将eneity_pkmapping.properties发布到apusic/metas,或没有将entity加入到entity_pkmapping.properties文件中在view上找不到managedBean检查managedBean的目录和bean的名称是否符合规范,如果包名不一致或者文件名不一致都回出现此问题,如HR的绩效模块(performance),新增一个View时,xhtml命名为 MyPerf.xhtml, 必须存在WebContent/hr/performance下,而且对应的ManagedBean为com.kingdee.eas.hr.performance.MyPerfBean.按钮或者其他控件的状态被缓存,如单据查看时某按钮被置灰后,新增时按钮仍是置灰的。要在置灰状态的地方,将不符合置灰条件的按钮再显示的变亮。因为managedBean可能定义为session的,所以存在会缓存状态的可能。Web主界面开发方法编制jsp页面。在目录W:easServerserverdeployeas.earcp_web.warhtmlportlet新建一个目录,并在新建目录下创建一个jsp文件。内容为:<% include file="/html/common/init.jsp"%><% page import="com.kingdee.bos.Context"%> <% page import="java.util.Locale"%> <% page import="com.kingdee.eas.util.app.ContextUtil" %><iframe height="480px" width="100%" src="./easweb/cp/index.jsf" frameborder="no" scrolling="no"></iframe> 注:src="./easweb/cp/index.jsf"就指向portlet的内容页。配置portlet模板信息。打开文件W:easServerserverdeployeas.earcp_web.warWEB-INF portlets.xml添加内容如下:<portlet><portletID>43</portletID><title>协同办公</title><modes><mode><name>view</name><value>portlet.cp_index</value></mode></modes></portlet>Portlet业务配置信息设置。打开文件w:easserverdeployeas.earcp_web.warWEB-INFtiles-defs.xml添加内容如下:<definition name="portlet.cp_index"extends="portlet_default_eas50"controllerUrl="/PortletAssembleAction.do"><put name="portlet_id" value="43"/><put name="portlet_content"value="/html/portlet/cp/cp_index.jsp"/></definition>Portlet基础定义设置。通过上述配置后,还需要通过EAS管理控制台执行如下脚本,在数据库中插入一条记录,sql语句如下:Insert Into T_Portal_Portlet(FID,FCreatorID,FCreateTime,FLastUpdateUserID,FLastUpdateTime,FControlUnitID,FPortletDefineId,FPortletName_L1,FPortletName_L2,FPortletName_L3,FEnable,FPortletNumber,FDescription_L1,FDescription_L2,FDescription_L3)Values(newbosid('0B344890'),'00000000-0000-0000-0000-00000000000013B7DE7F',ts'2005-11-07 14:01:53','00000000-0000-0000-0000-00000000000013B7DE7F',ts'2005-11-07 14:01:53','00000000-0000-0000-0000-000000000000CCE7AED4',N'43',NULL,N'协同办公',N'协同办公',1,'PN-43',NULL, N'协同办公', N'协同办公');注意事项:重点关注红色的部分,红色部分需要修改为上述配置文件中对应的值。蓝色部分会导致每次执行sql语句都会产生新id,如果作为脚本提交,请记得改为一个确定的ID值,且一定要支持可重复升级。繁体字段一定要是繁体的值,否则和语言不匹配。FPortletNumber字段的值一定要和portlets.xml中定义的值保持一致。页签配置 进行上述操作之后,还需要重新启动EAS服务器,才能进行页签配置。先进入“Portlet管理”查看先前建立的Portlet是否已经存在,如果不存在则上述操作存在问题,需要检查确认。确定已经存在后,到系统页签中建立对应的页签,配置上对应的Portlet,然后发布,退出系统,重新登陆即可看见对应的页签,其中便会展示对应Portlet的内容。参考资料l Apusicstudio下载:l AOM下载:http:/www.operamasks.org/dist/aom/snap/binaries/l AOM帮助:l AOM示例:http:/www.operamasks.org/download/aom_samplesl 其中rdcdemos是AOM比较全面的控件示例,下载后需要部署到相应的apusic版本,才能正常访问。l Ext下载:l Ext帮助:l 注:extjs帮助下载,要部署到应用服务器上才能正常访问。 l最新精品资料整理推荐,更新于二二年十二月十九日2020年12月19日星期六20:27:47