nc65金盘2018nc6开发参考pubapp高级课件2012版_第1页
nc65金盘2018nc6开发参考pubapp高级课件2012版_第2页
nc65金盘2018nc6开发参考pubapp高级课件2012版_第3页
nc65金盘2018nc6开发参考pubapp高级课件2012版_第4页
nc65金盘2018nc6开发参考pubapp高级课件2012版_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PUBAPP对UIF2的扩 对外API以及工具 业务扩 配置方 PubApp一览 定义对 打开界面 第五章扩展开 PUBAPPUI控件介 第八章常用组件、工 当前解析中的处 PUBAPP主子孙扩 主子孙UI扩 分页设 第十一章关键术语、重要知识点JAR Pubapp下的public下的 Pubapp下的下的 第一章PubAppafterEdit、sort等。标准视图控件(如BillForm、BillListView)中值对模型进行了处理,如需处理一个加入的会覆盖之前加入的,不方便且不好管理和。PubApp在解决UIFactoryII基础上支持业务、并封装标准控件增加支持对模型UIF2的开发规范,仍然是以模型为中心,不同控件对模型进行的观察者模式。同时也是MVC的典型应用。PUBAPP和UIF2并不是的,而是依赖的,开发人员也可以使用UIF2开发更灵活的业务功能,推荐同时使用并掌握UIF2PUBAPP。UAPUIF2典型界面组织形式,开发业务流程,或者开发流程节点等典型的NC节点时均可以提供支持。Pubapp的设计目标是提供快速开发单据节点并实现ERP管理功能Pubappuif2uif2进行了封装、无论是在标准控件还是在领域模型中、对标准控件的支持扩展了业务支持、懒加载、分UI以及模型转发、结构介绍PubApp的内容按照上述结构来展开进行详细解析。第三章为PubApp在性能上扩展第四章为PubApp对流程的扩展第七章介绍了Pubapp提供的配置功能的解析第八章介绍了Pubapp提供的常用工具的解析第九章介绍了对Pubapp扩展的主子孙模式单据的解析第十章提供了一个使用Pubapp开发的案例DemoPubAppuif2的基础上进行扩展、下面分三个模块按照PubAppuif2PubAppBillListView、卡片BillForm、单表BatchBillTable都在初始化方法中增加了重新定义转发机制、丰富了类型、其中在卡片BillForm下增加了主组织OrgPanel面板、以便定义单据的数据层次。此外、PubAppShowUpableBillListViewShowUpableBillForm、Action改变状态的接口、表UIF2BillManageModelBatchBillTableModel、这些领域模型了界面数据、数据状态、触发、业务逻辑等功能、PubApp在此基础上进行单表扩展了BatchBillTableModel添加业务、主要针对处理批量数据。UIF2的Actions提供了对单据的操作、例如增加、修改、删除、查询操作、PubApp在第二章PubappUIF2列表BillListVIewBIllForm、单表BatchBillTableBillTreeView、主子孙界面等model的并进行处理、这里的包括控件和模型、pubapp里面在接收的时候并不区单表扩展pubapp扩展UIFactoryII的AppModel模型接口,新增IAppModelEx接口继承自IAppModel, 自定义按钮、目前扩展的按钮有以下Action、这些按钮可以直接配置使用:左边是查询面板queryAreaS、是通过七巧板布局放置、上面是查询按钮、是通nc.ui.uif2.TangramContainerActions目前的单据管理模型都是继承了流程平台模型的自定义的处理类通过配置文件装载入AppEventHandlerMediator中并根据时间对象类型对分类,之后在模型中。模型中按照类型分类。已提供的路径:nc.ui.pubapp.uif2app.event包对于有返回值的Event必须设置其返回值,不能为空通过handleMap进行配出的会被相应的对象捕捉到、例如上图的为卡片表头表尾编辑后。通过handlerGroup进行配多用来处理表体多页签的情况,使得的对哪些页签有效。handlerGroup来进行配置、同时可以在里面设置可以挑剔的事件以便对具体的业务进行处理、配置如下所示:属性event取值为具体的event属性picky取值可实现IPickyEventHandler接口来过滤是否派发,如果取值为类才会派发到对应的处理中 在自定义中、首先需要自定义对象、对象中有”类型Type”、”source”以及的环境对象”contextObject”、对象中对这三种类型进行了封装进行定义、以便在触发不同的操作件源可以发出不同类型的定义的类型。源面封装好的逻辑、现在需要自定义源和触发时机、当然以Swing触发的为基础、在此基础上通过领域模型也即(model)发送自定义的、通过模型驱动机制、然后由监听model的器去处理针对不同类型的逻辑操作。平台中目前是在Swing的基础上又封装了一层、是通过标准界面控件触发、然后在这个时机通过model触发、分别被不同的器进行捕捉并进行相应的处理个时候平台中的控件到、例如BillScrollPane到DefaultListSelectionModel发出的事件、然后进行相应的逻辑处理、处理完毕后通过自己的数据模型(BillManageModel)发出器上面的“模型”或者“控件”发出对应的器可以到、器可以是控件、也可以是单独的一个类对象、但是即使定义好器也不知道改器的是哪个模型、义的器是直接显示EventListener的然后直接到需要被的控件或者模型中就可会到改变、从而做出相应对于UIFactoryII中的类型进行区分并分别进行不同的处理、支持流程处理、转Pubapp中支持前台Action抽第三章PubApp差异LazilyLoadManager的lazilyLoadSupporter属性中、之后前台界面在列表界面下点击一条主数据、这时会懒加载改主数据下的子数据(前提是也没vo的内容、可以根据构造函数来确定当前的查询要加载多少种类型的表体,VOVO可能不是在表头的一共查出三条主数据、但只查出第一条主数据下的子数据、其他主数据下的子数据为*@param *@return@paramchildrenClz@parambills由于UIFactoryII的分页经过了两次调用、第一次调用查询pks、第二次调用根据这些pks来查数据、比较耗费性能、Pubapp了这一点、现在把两次调用合并为一次调用、即在分页第一次查询所有pk的时候,顺便把第一页数据查到前台、PubApp提供了一个对象PaginationTransferObject来所有的PK以及第一页的数据。model分页model派发PaginationBar接收更新数据、页分页model派发取配置查询、只是实现的接口不一样、其中模型管理器需要实现IPaginationModelListener、refreshable以及AppEventListener接口voidvoid间的数据、保证数据同步、但后面由于提供了一个BillManagePaginationDelegator作为内部实现来完成这些事情、数据模型管理器仅仅初始化数据注意一下使用的model为pubapp下的分页model、注入的service需要实现IPaginationQueryServicepk查询数据即分页ServicePubapp提供了一个nc.ui.pubapp.uif2app.model.pagination.UIPageQueryService、前台分页服dataOfPksQueryServiceMethod、需要注入定义的接口根据pk来查数据的方法。获取的数据结果集过30万。其主要目的就是防止错误的编程代码造成数据库的内容被加载到内存的时候出现内存溢出,导致中间件。而防止内存溢出也就成为V6支持大V515万行时就能达到中间件内ID查询到内存,然后以一万为一批,分批加载整个VO的数据到内存中计算。这样也就防止了内存的溢出。但是结果集过30万行存单据行ID,然后继续分批计算。 异VO传到使用。行、方法后执行、从轻量级差异VO获取一个完整的客户端VO、然后操作保存.更新的是带有PK的数据、差异保存逻辑如下:通过前台界面中获取到新增的数据VOs、通过model获取缓存中的VO数据oldVO、oldVO和VOsVOVO、也即轻量级VO(LightVO)、然后作为参数传递到。据库中、返回数据库中的单据VO。然后利用保存后具有完整数据的VO(这时VO已经带有TS和最新数据)用 合并客户端VO和保存后的聚合VO得到一个只有改变字段的聚合VO、通常有ts、pk组成、但也可能有其他数据组成并返回客户端、这样数据在传输的过程中减少VOVO合并、得到一个完整的聚合VO、界面状态为新增状态、然后更新model、然后model发去更新标准界面。删除操作、更新model以及界面。减少网络的传输、提升性能、另外差异vo一般和流程业务有关、例如插入前规则、插入后需要的调用最多不超过6次、平台中提供了 binatorCaller类来记性然后调用BillTemoader的prepare(param1,param2,param3,..)方法进行获取单据模板和板都会用一个Token来记录状态信息、Tokeninvoke程调用信息的收集、当然Token中的状态在收集完调用信息后会被置会ready状态、然 3.4.3调用类第四章PubAppVO在下游单据中点在下游单据中点框及选择上游单据中需要加载的上接转到目的单据接转到目的单据当前单据是否支持{return}然后在配置文件中把该Action注入进去,如下所示:<!--新增--<!--按钮可以随便写--<!--按钮的名称POBillType.Order.getCode(),getModel().getContext().getEntranceUI(),null,null);if(PfUtil.isCloseOK())////}<!--参照采购订单新增<!--来源单据类型编码<!--来源单据类型名称:<!--参照请购单新增<!--来源单据类型编码<!--来源单据类型名称<!--<!--新增菜单<!--<!--方法)获取到下游单据VO,再调用下游单据提供的服务接口实现推单型和来源单据id,将这两个属性对应到元数据的子实体对应字段上,如下图所示:V6中都需要删除,保持为空的状态,使用默认的查询类model和单据类型,配置如下:下所示,更详细的配置见文档《打开界面.doc》<bean VO 4.3.5IBillFlowIMutiBillFlowFactory,通定类型的上游单据id的情况,使用时只需要在对应id字段的元数据上配置如下:用时对于每一组的来源单据type和id,在元数据上分别配上“SRCGROUP_TYPE:X”和“SRCGROUP_ID:X”,其中X可以自己任意指定,只要保证对于每一组一致即可;4.3.6方publicpublicclassTagMutiSrcTypeDataFinderextendsMutiSrcTypeDataFinder CompositeBillFlowFactoryfactory=new}}第五章PubappAction、但是如果提供的Action不满足当前的业务需求、可直接定义Action继承目前所使用的Action、通过重写其doAction(ActionEvente)方法加入自己特有的逻辑并替换目前的Action。doAction(ActionEvente)方法然后去实现自己的业务逻辑。继承更次的NCAction、自定义Action的code和name、覆盖其doAction(ActionEvente)一般直接在继承UIFactoryII的基础上扩展界面、需要在实现继承的类中实现 ponentWithActions这三个接继承PubApp提供的列表ShowUpableBillListView、卡片ShowUpableBillForm、单表ShowUpableBatchBillTable、直接继承即可、不需在重新实现 ponent、 、ponentWithActions接口、这些接口Pubapp在上面提供 、ponentWithActions这三个接平时的业务如果对流程要求比较少、直接使用UIFactoryII的BillManageModel即可。继承PubApp的BillManageModel基础上进行扩展、PubApp的领域模型继承了UIFactoryII的BillManageModel、在上面扩展了支持业务流程功能、懒加载功能、转发采用代ActionUIAction、领域模型BeanConfigFilePath的xml文件进行定义需要在”功能”节点中为需要扩展的功能节点添加PluginBeanConfigFilePath参数以及参数值、其中参数值为XMLXML文件中进行扩展操作、这样做可以在不改变原有功能的前提下进行扩展、有利于二次开发。Action、给需要的目标Action添加器、在器中定义Action执行前操作、执行规则组织方式简单,可性强; 可以从配置文件中加载行业和二次开发增加的业务规则 用户需实现nc.impl.pubapp.pattern.rule.plugin.IPluginPoint接口,来进行服务、操作、BP的二次开发插入点定义新增BPBP修改BPpublicAggApplyPayVO[]insert(AggApplyPayVO[]returnbp.insert(bills);}//为BP模板的规则处理器加入新增前业务规则IRule<AggApplyPayVOrulenewFillInsertDataRule();}}}字段vextendtype的值支持以下三种,不可为空,参见对map每个key对应的插件集合按本地化+行业化优先级进行过滤,只保留优先级最高的一个行业(行业匹配)+本地化(本地化匹配)行业为水平+本地化(本地化匹配)行业(行业匹配)+本地化为第六章PubAppUI暂时只与BillManageModel配合使用PubApp中提供的标准列表控件为nc.ui.pubapp.uif2app.view.BillListView、其中nc.ui.pubapp.uif2app.view.ShowUpableBillListView继承该类并实现了 ponent切换时对外通知的接口、其中的单据模板为以设置不同的BillItem出平台中的一个节点“客户-”作为参考6.2卡片视图(聚合VO的上卡片下列表形式)PubApp中提供的标准卡片控件为nc.ui.pubapp.uif2app.view.BillForm、其中nc.ui.pubapp.uif2app.view.ShowUpableBillForm继承该类并实现了 ponent自动切换 ponent切换时对外通知的接口、IComponentWithActions肩膀页签按钮接口、其中的单据模板为BillCardPanel、BillCardPanel中一个在BillModel中可以设置不同的BillItemBIllForm多为标准主子表单据所采用的卡片模型、大多数节点都会使用这种卡片模型用这里给出平台中的一个节点“客户-”作为参考形面板、右边为卡片界面、采用的就是BillCardPanelForm控件以及模型。实现对BatchBillTableModel模型数据的展现及的响应,与BatchEditAction、BatchAddLineAction、BatchDelLineAction等动作配合使用PubAppnc.ui.pubapp.uif2app.view.BatchBillTable、里面增加了一些转发和一些业务逻辑、继承UIF2工厂的BatchBillTable、其中的单据模板为它是BillItem的集合、也了一个BillModel、在BillModel中可以设置不同的在左边选择一棵树上的节点添加到右边的那刻树上时、需要处理其的model中的数据模型中的数据同步到ListToListPanel的IItemChooserModel模型中的数据。ListToListPanel一般用在两边都是树形选择的情形下、平台中的“用户”节点中在卡片的状态下使用了ListToListPanel、效果如下树表结构、里面的单据模板为BillListPanel、但一般在卡片界面中的表体配置单表单据模板、并把第一列的信息替换为树结构、其他单元格的信息仍为表格模型,这里面在初始化初始化单据模板的据所有的BillItem

替换BillModel的第一列为树表模型即TableTreeModel

通过转换把具有树表转换为BiiModel第七章PubAppXxxMediator配置解析<beanid="doubleClickMediator" <propertyname="listView"ref="listView"<property 以为应用的场景比较多、这里通过一个”双击列表显示卡片”的方式来进行说明、eander例如d片。象,又能对特定对象信息进行操作。对象本身的管理。InitDataListener节点、配置方式比较简单、经提供好的、配置方式如下所示:<!--打开节点--<bean <propertyname="model"ref="manageAppModel"<propertyname="context"<propertyname="ui"ref="billFormEditor"VO<propertyname="voClassName"<property 的方法initData()进行一些初始化的逻辑操作。ClosingListener<bean <propertyname="model"ref="ManageAppModel"<propertyname="saveAction"ref="saveAction"BaseOrgPanel在V6中,大部分单据都有个主组织,组织类型有:、公司、部门、销售组织、库<!--组织面板<beanid="orgPanel"class="nc.ui.pubapp.uif2app.view.OrgPanel"<propertyname="model"ref="ManageAppModel" BaseOrgPanelBaseOrgPanel提供了一个showOrgPanelTrue的时候会显示主组织参照、当设置为false的时候不会显示主组织。则表示此VO属于空子表、配置方式如下:<property过滤空行--><propertyname="fieldName"value="xxxx"nFilter"><property第八章常用组件、工具据上设置某个billItem为日期参照类型、则可以按照如下设置即可:UFDateTime类型、然后//IRelationForItemsitem=new//IDataSetForCaldatanewBillCardPanelDataSet(newBillCardPanelrow,item);//row改变的行/**}/**}ScaleUtilsscale=//ConditioncondnewCondition();////////////通过pk_group以及对应卡片的billcardpanel来进行构造卡片精度处理对象privatevoidsetScale(BillScaleProcessorscale,TotalValueScaleProcessortotal){String[]costpricekeys=newString[] String[]globalmnykeys=new String[]groupmnykeys=new String[]orgmnykeys=new String[]mnykeys=newString[] String[]assistNumkeys=new String[]numkeys=new String[]pricekeys=new scale.setNumCtlInfo(assistNumkeys,PosEnum.body,null,ItemVO.CASTUNITID,PosEnum.body,null);scale.setNumCtlInfo(numkeys,PosEnum.body,null,PosEnum.body,scale.setMnyCtlInfo(mnykeys,PosEnum.body,null,PosEnum.head,scale.setMnyCtlInfo(orgmnykeys,PosEnum.body,null,PosEnum.head, }String[]numkeys=new scale.setNumCtlInfo(numkeys,PosEnum.body,null,ItemVO.CUNITID,PosEnum.body,null);模板上定义具有精度的item的code值、这里可以、也可以单独定义一个精度对象item、数据项,调用VO处理对象的process方法进行处理:解析器界面使用了UIF2基于配置文件的方式。nc.ui.pub.formulaedit.(c.u.b.ou.do.oruaReaEdoPan:(.tPlaud.rMPl解析器界面使用了UI工厂2,基于配置文件的方式。nc.ui.pub.formulaedit.在新的实现中,有两个地方可以添加,FormulaFunctionPanel(函数实现)新加入的IFormulaTabBuilder接口包含创建Tab需要的一些基本功能,包括的点击时发出相应的IFormulaListener通知,大多数需求使用此界面即可。如果用户需要自己实现界面进行展示,那么就需要在某个Panel中实现IFormulaTabBuilder接口,并在initUI()方法中进行初始化界面的操作,具体实现可以参照IFormulaTabBuilder接口实现配置到此list中(通过springIOC方式)builderIFormulaTabBuilderDefaultFormulaTabBuilder对象,使用UIList进行展示。如果想自己定义一个新的界面的话,那么就可以继承Component(或其子类实现)并实现IFormulaTabBuilder接口,此时就可以自己定义界面并进行实现。自己实现界面的话就必须在加入的IFormulaTabBuilder实现类中同时继承自某个Component(或更加通用的UIPanel),比如TableFieldTabBuilder。就要执行FormulaUtil类中的addKeyword并刷新(refresh)。为了兼容以前版本中对FormulaEditorDialog中一些加入页签Tab的操作,如addCustomTabBuilder,setCustomTabBuilderFormulaEditorDialog中仍然保存了虑解析的处理Tab实现,但是要自定义展示列表(UIList)据的formulaItems属性(List实现)中数据的顺序进行展示。用户也可以继承DefaultFormulaTabBuilder并实现 法返回null(默认实现为null),则按照字符串的大小顺序。行自定义页签展示(不实现IFormulaTabBuilder)管理,中加入FormulaTypeManager作为函数类型的管理器,将管理所有的函数,并将其在FormulaFunctionPanel中进行展示。FormulaTypeManager中可以对函数进行基本配置,其中basicTypeConfig是对基本函数类型(数学、字符串等)进行配置,可以设置这些是否进行显示(show属性),基本类型的FormulaTypetypeIdIFormulaConstantint值(String),用户可以配置相应的自定义类型FormulaType。FormulaType中配置了函数的类型,typeId可以唯一确定此type类型,故不能发生类似”1”,”3”的字符串),类型名称typeName作为显示在函数页签名称,用户可以配置name2FormulaItemMap类型,也可以配置 name2FormulaItemMap中,名称-> 在不扩展DefaultTabBuilder的同时加入一个自定义页签(名称为“新类型”,在customerTypeList中暂时注掉了)。中单据模板编辑器中变量“表头”信息就是用这种方法实现的。FormulaEditDialog中还有其他的实用方法,可参照为了支持“业务语言描述”到“原型”的转换(通过“转换器链”来实现)以及支持“原型”到“业务语言描述”的转换(通过“解析器链”来实现。现提供一个接口IConvertor接口用来实现“转换器”和“解析器”。@parampublicStringpreConvert(String@parampublicStringpostConvert(String中编辑器界面和提示信息界面均属于观察者,他们要对对象“数字按钮界面”、“逻辑按钮界面”、“功能函数多界面”进行。在新的解析中,观察者需要实现IFormulaEventListenerFormulaRealEditorPanelFormulaHintMsgPanel,他们都需要对对象发出的请求FormulaEventSource进行处理。对于对象,例如FormulaButtonPanel只需要配置一个listeners对象所有的观察者并在必要时刻发出即可(也是通过spring配置即可)如果用户需要实现自己的对象和观察者,那么只需要实现接口IFormulaListener并对于IFormulaTabBuilder中的listeners处理,在FormulaFunctionPanel和FormulaVariablePanel中的listeners主要是为了兼容老版本中和内置(将在后面介绍)的器实现,也即老版本中listener自动为其所在的FormulaFunctionPanelFormulaVariablePanelIFormulaTabBuilderbuilder中listeners。持、其中主要用到了Apache的POI对于excel的操作、支持批量导出与批量导入

IImportableEditor中获取

从单据模板中获取数据以及billData构造导出数

@return{@linkJComponent}对象publicJComponent publicList<InputItem>getInputItems();2,nc.ui.trade.excelimport.ExcelImporterexportToExcel这个3,nc.ui.trade.excelimport.Uif2BodyOnlyImportablePanelIImportableEditorExportAction需要注入模型以及导入/导出功和单表体导出类似、唯一不同的是主子表中导出导出实现 1,所有需要数据导入功能的(或单据)的UI类(即结点类)必须实底层程序已经确定的。IImportableEditor接口中的getInputItems方法用来返回(或单导入(如参数控制addNewsetValue方法,将save方法,进行保存数据操作,完成了和业务逻4,数据导入工具提供导入时的错误信息提示和日志功能,能够将调用各个(或单在导入的过程中、用户首选需要选择导出的文件格式(可以选择Excel2003、Excel2007Excel2010版本)Excel文件中根据提示信息输入数据、对于主子表录入数据请多数原因是因为没有设置好对应的主子表之间在excel中的对应关系。nc.ui.uif2.excelimport.ImportAction中需要注入对应的实现IImportableEditor接口专门处理单表体导入导出功能的类、而在Uif2BodyOnlyImportablePanel中需要注入只是注意IImportableEditor接口的实现、这里不再赘述。3、editor:卡片界面打印模板的nodeKey->–>tem2、model:单据领域件)每隔2天分为一组。<propertyname="model"ref="ManageAppModel"/><!--分表属性,可以根据具体单据进<propertync.ui.scmpub.print.split:SplitPrintParamDlg分单打印框PrintDataSplitProcessor打印分单前处理类SplitBillData分单处理类SplitPrintAction第九章Pubapp面为孙表视图(包括列表和卡片)UIPanel进行封装、上层为主子视图、下层uif2uif2以以上是主子孙模式的设计类图、平台提供了对UI的扩展即 posite列 以前的单据需要扩展为具有主子孙结构的单据、需要从三个层面上进行扩展:元数据扩展、UI扩展、以及模型扩展、下面先讲述元数据层面的扩展:UI主子孙模式提供了UI层次上的扩展、提供了一个抽象类 在此基础上提供了针对列表和卡片两种模式的主子孙封装界面、列表即 posite这两个主子孙UI控件分别组合了 模型、为了方便以及从统一的层面进行控制、平台提供了一个MainGrandModel来主子孙的数据、数据的状态、数据的业务逻辑、以及自定义的转发。定义一个实现IAppModel接口的抽象model对象、其中重要的是一个领域模现、MainGrandModel代码如下:主子孙model中了新增和编辑缓存是作为记录子数据中每一条数据下对应那些孙model中提供了增、删、改、查等方法来针对主子孙数据的增加、删除、修改类型定义:用枚举类型来对主子孙类型进行定但是针对孙面板单独的行为需要自定义Action继承NCAction进行特定行为的逻辑。第十章

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论