U8cloud开发入门培训U8CHR开发部王立高级开发工程师2018年3月6日目录01搭建开发环境02U8C数据库持久化技术03开发一个普通单据04开发一个支持审批流的节点搭建开发环境01搭建开发环境1.本文软件开发环境 操作系统:Windows10 数据库设计工具:SybasePowerDesigner(以下简称PD) 数据库:MSSQLServer2012 开发工具:Eclipse3.8.22.建立开发工程打开eclipse,新建MDE工程。如果是在原工程增加节点,则省略此步。用友网络科技股份有限公司新建工程用友网络科技股份有限公司UAP集成开发配置选择U8CHOME配置数据源支持3种数据库用友网络科技股份有限公司U8C数据库持久化技术02U8C数据库持久化技术在U8C中很多时候需要我们直接操作数据库,对数据库的访问U8C提供了框架类。JDBCFrameWork为U8C访问数据库提供统一的数据操作访问,简化数据访问操作。BaseDao是在JDBCFrameWork之上提供数据持久化的工具类。下图是U8C数据库访问的层次图:DataBaseJDBCAPIJDBCFrameworkDataAccessObjectBusinessService业务委托接口,提供EJB封装数据访问对象,组织数据访问逻辑提供统一的数据操作访问,简化数据访问操作用友网络科技股份有限公司核心类介绍PersistenceManager管理连接会话的生命周期,并提供了对单表VO操作的常用实现;可以传递构造参数选择不同的数据源。JdbcSession对JDBC的API封装和简化SQLParameter封装执行SQL的参数ResultSetProcessor结果集处理回调接口,封装结果集处理DbException封装不同数据库的异常,和统一处理不同数据库的ErrorCodeBaseDAO/IUAPQueryBS/IVOPersistence管理连接会话的生命周期,提供了对单表VO操作的常用实现用友网络科技股份有限公司JdbcSession几种参数语法无参查询Stringsql="select*frombd_deptdoc";//构造查询语句Listlist=(List)session.executeQuery(sql,newArrayListProcessor());有参查询Stringsql="select*frombd_deptdocwheredept_code=?";SQLParameterparam=newSQLParameter();//构造参数对象param.addParam(“aaa”);//添加参数Listlist=(List)session.executeQuery(sql,param,newArrayListProcessor());用友网络科技股份有限公司JdbcSession几种参数语法有参更新Stringsql="updatebd_deptdocsetdept_code=‘aaa’wheredept_code=?”;SQLParameterparam=newSQLParameter();//构造参数对象param.addParam(“bbb”);//添加参数session.executeUpdate(sql,param);无参批量更新Stringsql="updatebd_deptdocsetdept_code=‘aaa’wheredept_code=‘bbb’";session.addBatch(sql);//添加需要执行的同构SQLintrows=session.executeBatch();//执行用友网络科技股份有限公司特殊参数Null参数param.addNullParam(java.sql.Types.INTEGER);Blob参数param.addBlobParam(newObject());Clob参数param.addClobParam(newString());用友网络科技股份有限公司结果集合操作对查询结果集合的操作,主要由ResultProcessor类来实现,这是一个接口ResultProcessor包含有一个简单的方法,不同的ResultProcessor实现返回不同的结果对象。系统提供了一系列常用的默认实现。ResultSetProcessorArrayListProcessorArrayProcessorMapProcessorVectorProcessorBeanProcessorColumnProcessorMapListProcessorBeanListProcessor用友网络科技股份有限公司结果集合ArrayProcessor数组处理器,返回一个对象数组,结果集中只有一行数据,其中结果集中每一列对应数组的一个元素。ArrayListProcessor数组集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个数组,每个数组对应结果集中的一行数据,其中结果集中每一列对应数组的一个元素。MapProcessorHashMap处理器,返回一个HashMap,结果集中只有一行数据,其中结果集合中每一列的列名和列值对应HashMap的一个关键字和相应的值。MapListProcessorHashMap集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个HashMap,每个HashMap对应结果集中的一行数据,其中结果集合中每一列的列名和列值对应HashMap的一个关键字和相应的值。BeanProcessor值对象处理器,返回一个JavaBean,结果集中只有一行数据,该处理器能自动把结果集中的值按列的名称映射到javaBean中,如:结果集中有名称为”name”的字段,那么只要该java对象中有getName()方法就能把结果集合中”name”对应的值映射到对象中。BeanListProcessor值对象集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个javaBean,每个javaBean对应结果集合中一行数据,其中每个JavaBean中的数据映射关系和BeanProcess同理。还有ColumnProcessor,BeanMappingListProcessor,BeanMappingProcessor几个类用友网络科技股份有限公司BeanListProcessor作为结果集的例子ArrayListlist=(ArrayList)session.executeQuery(sql,param,newBeanListProcessor(TrainReqmatbillVO.class));//TrainReqmatbillVO是一个普通vo类intlistcount=list.size();TrainReqmatbillVO[]vos=newTrainReqmatbillVO[listcount];for(inti=0;i
Table或者点击右侧Toolbox,拖动下图圈选图标至主面板。先点击这个图标,然后在面板空白处点击,出现一个table,双击弹出右边的属性界面用友网络科技股份有限公司生成pdm步骤第四步、在Columns选项卡中定义列,列的中文描述。注意此处列的数据类型,一般地,主键前缀为pk_,数据类型为char(20),boolean类型的列前缀为b,数据类型为char(1),日期类型前缀为d,数据类型为char(10)等。用友网络科技股份有限公司数据库表pdm及SQL脚本的生成用友网络科技股份有限公司导入数据字典数据字典是U8cloud二次开发工具中探测数据库表结构的数据基础,而不是采用每次需要数据都连接数据库的方式。数据字典由上一步骤生成的pdm文件生成,U8cloud二次开发工具提供了相应的生成工具。步骤如下:第一步、启动U8cloud企业建模平台,选择菜单系统管理工具->数据字典管理。用友网络科技股份有限公司导入数据字典第二步、在弹出的界面中,选择菜单项工具->导入数据字典。用友网络科技股份有限公司确认数据字典是否导入成功在数据字典管理节点,点击查找,根据编码查找用友网络科技股份有限公司生成VOVO值对象是数据传递的载体,其结构和数据库表结构紧密相关。一般我们在一个专门的包中存放VO对象,VO对象命名规则表现为类名以VO结尾。U8cloud二次开发工具中也提供了相应的工具,用于生成数据库表的VO类。首先要生成的SQL脚本,生成数据库表。建立了数据库表后就可以手动生成VO了。第一步、启动企业建模平台二次开发平台,选择集成开发工具。用友网络科技股份有限公司生成VO用友网络科技股份有限公司功能注册用友网络科技股份有限公司自定义菜单新建的功能节点,可以自定义菜单,修改菜单的位置。用友网络科技股份有限公司权限分配权限管理中引入了“角色”概念。先规划好各种角色并分配权限,再将用户与角色关联起来,将角色作为桥梁把“用户”和“权限”连接起来。换句话说就是:通过规划好各种角色先将用户分类,再为各类用户分配权限。用友网络科技股份有限公司建立单据模板第一步,输入单据模板类型,再点显示模板第二步,选择对应的主子表第三步,增加用友网络科技股份有限公司建立单据模板弹出的界面的右上是我们刚才选择的数据表,左上为表头部分,左中为表体部分。左键单击选中主表(wa_tm_apply_main)不放,拖动到表头区域松开,此时会弹出对话框。用友网络科技股份有限公司建立单据模板同样的方法,我们可以把一个子表拖到表体位置,再拖另外一个表体的时候我们先右键点这个按钮用友网络科技股份有限公司建立单据模板把开始新建的项目删除掉。用友网络科技股份有限公司单据模板项目显示属性与高级属性单据模板相应区域,项目上点击右键可以新加项目,项目排序;在编辑区选择某个属性控件后可以在右下方的属性编辑区进行属性编辑。可以设置其可见性、是否必输项、参照信息等属性。在高级页签可以设置数据类型,编辑,显示公式。数据类型选择参照时,可以通过下拉框选择系统内置的参照。对于一些字段我们可能需要显示公式,编辑公式。显示公式界面加载时会执行,编辑公式在编辑框发生改变时会被执行。用友网络科技股份有限公司根据单据模板生成查询打印模板用友网络科技股份有限公司建立工程包结构Public目录存放接口和公共代码(比如VO和公共算法)Private目录存放实现和其它实现细节Client目录存放客户端代码META-INF目录存放模块配置文件目录,包括module.xml文件和xxx.upm接口配置文件。详细代码结构请看视频讲解。用友网络科技股份有限公司各个目录区别与关系用友网络科技股份有限公司配置文件规范用友网络科技股份有限公司后台接口packagenc.itf.sample;publicinterfaceIHelloWorld{StringsayHello(StringtoName);}packagenc.impl.sample;importnc.itf.sample.IHelloWorld;publicclassHelloWorldImplimplementsIHelloWorld{publicStringsayHello(StringtoName){StringretValue="Welcome"+toName+"exploreU8C";System.out.println(retValue);returnretValue;}}用友网络科技股份有限公司部署组件nc.itf.sample.IHelloWorldnc.impl.sample.HelloWorldImpl编辑或新建该产品模块下的模块部署描述文件(META-INF下的ncdemo.upm文件),加入一个公共组件:远程组件只要指出他的remote属性为true即可。用友网络科技股份有限公司Junit客户端调用packagenc.ui.sample;importnc.bs.framework.common.NCLocator;importnc.bs.framework.test.AbstractTestCase;importnc.itf.sample.IHelloWorld;publicclassTestHelloWorldRemotInterfaceextendsAbstractTestCase{publicvoidtest123(){try{IHelloWorldhello=(IHelloWorld)NCLocator.getInstance().lookup("nc.itf.sample.IHelloWorld");System.out.println(hello.sayHello("u8c"));}catch(java.lang.ThrowableivjExc){ivjExc.printStackTrace();}}publicTestHelloWorldRemotInterface(){super();}protectedStringgetHost(){returnSystem.getProperty("nc.host","localhost");}}用友网络科技股份有限公司UIFrame框架实现层结构图BaseUIFrameUIUIPanelStateChangeListenerLeftPanelUIPanelStateChangeListenerObserverMainPanelUIPanelStateChangeListenerTopPanel.hr.uiframe.impl.LeftListPanel.uiframe.impl.LeftTablePanel.hr.uiframe.impl.LeftTreePanel.impl.MainBillCardPanelBillEditListenerBillEditListener2.uiframe.impl.MainBillListPanel数据通讯机制-观察者模式Observablenc.ui.hr.uiframe.Subjectnc.ui.hr.uiframe.LeftSubjectjava.lang.Objectjava.util.ObservableUIPanelStateChangeListenerObservernc.ui.hr.uiframe.LeftPanelUIPanelStateChangeListenernc.ui.hr.uiframe.TopPanelinterfacejava.util.ObserverUIPanelStateChangeListenerObservernc.ui.hr.uiframe.MainPanel按钮管理Êý¾Ý¿â²Ù×÷DataModel¶¯×÷ICommand°´Å¥¹ÜÀíButtonManager¿Í»§¶Ë½çÃæÈë¿ÚBaseUI½çÃæPanel2:createState():StateRegister//´´½¨×´Ì¬Áбí1:createBtnRegister():AbstractBtnRgst//´´½¨°´Å¥3:createButtonStateRegister():ButtonStateRegister//´´½¨°´Å¥¶ÔӦ״̬4:registerCommand(int,ICommand):void//×¢²á°´Å¥¶¯×÷5.1.2:execute():void//Ö´Ðж¯×÷5.1.1:validate():boolean//¶¯×÷Ö´ÐÐ֮ǰУÑé5.1.2.3:²Ù×÷½çÃæ¿Ø¼þ5.1.2.1:´Ó½çÃæ»ñÈ¡Êý¾Ý5.1.2.2:Êý¾Ý³Ö¾Ã»¯²Ù×÷5:onButtonClicked(ButtonObject):void//µã»÷°´Å¥5.1:executeCommand(int):void//ת·¢µã»÷¶¯×÷状态管理״̬¼àÌý½Ó¿ÚStateChangeListener½çÃæ¶¯×÷DataModelDataModel¿Í»§¶Ë2:µã»÷°´Å¥¡¢Ê÷¡¢¿Ø¼þ2.1.1.1:stateChanged(StateChangeEvent):void//֪ͨʵÏÖ״̬¼àÌý½Ó.2.1.1:fireStateChanged():void//·¢ËÍ״̬ʼþ1:createState():StateRegister//´´½¨×´Ì¬Áбí2.1:setCurrentState(int):void//ÉèÖÃ״̬标准动作实现AbstractActioninterfaceICommandAddLineActionEditLineActionEditActionAddActionDeleteLineActionQueryActionVirtualNodeQueryActionPrintActionCancelActionDeleteActionRefreshActionVirtualNodeRefreshActionSaveActionVirtualNodeSaveAction开发一个支持审批流的节点04升级demo支持审批流用友网络科技股份有限公司增加单据类型用友网络科技股份有限公司增加单据类型项目说明:类型代码:手工输入,最大长度为4个字符,可以输入字母和数字,不允许重复。类型名称:业务单据名称,手工输入,不允许重复。单据大类:表示单据类别,用于区分单据类型的主子关系。节点编号:标识单据类型的关联UI,一般为关联的制单功能节点编码。审批节点编号:标识单据类型的关联UI,一般为关联的审批维护类功能节点编码。主表参照的固定条件语句:被其它单据参照时自己填写的固定的SQL条件语句。参照查询对应的DMO类:用于查询单据VO数据的业务逻辑类。必须实现接口nc.bs.pub.pf.IQueryData以及nc.bs.pub.pf.IQueryData2(参见后面章节)。审批流检查类:通过编写审批流检查类,并在该类中实现审批流相关接口,来达到使用审批流管理业务单据以及控制审批流行为的目的(参见后面章节)。实现IcheckState,IbackCheckState(可不实现)的接口的DMO类文件会计平台类:财务会计平台所需的类。实现IaccountProcMsgIAccountRetVoucher的接口的DMO类文件是否项目核算:项目是否参与核算。是否为根节点:针对单据大类,用于实现单据主子关系。是否发送会计平台:用于财务会计平台。如果该单据不直接传送财务会计平台,则不选择自定义1(def1):流程配置的单据业务关联(业务流程)更新后的处理类。自定义2(def2):存取会计平台的产品组自定义查询。自定义3(def3):动作执行前的UI端处理类。如果单据类型关联了多个功能节点,该类还需要实现节点查找接口。用友网络科技股份有限公司VO对照管理项目说明:主子VO类名称:单据VO模型中的主子VO类名称。单据VO类名称:单据聚合VO类名称。主表的关键字段:单据物理模型中主表的主键字段。子表编码:为空审批人:单据VO模型中表示审批人的属性名称。制单人:单据VO模型中表示制单人的属性名称。单据ID:单据VO模型中表示单据ID的属性名称。业务类型:单据VO模型中表示业务类型的属性名称。对于数据库表:注册单据主子物理表名称。单据编号:单据VO模型中表示单据号的属性名称。用友网络科技股份有限公司单据动作管理项目说明:动作选择:提供四种动作各供选择:保存、审核、推式动作、其它。保存、审核是单据的基本动作,动作代码有严格规定;推式动作表示该动作可被其他单据推式驱动。动作编码:当前单据动作的编码。注意,当动作选择为“保存”时,动作编码必须为以“SAVE”结尾;而当动作选择为“审核”时,动作编码必须为以“APPROVE”开头。长度限制为20个英文字符。动作名称:当前单据动作的显示名称动作执行前提示:如此处输入文字,则在该动作被触发时,会弹出一个带有提示性文字的对话框,如:是否保存?动作控制:提供三个选项:动作可配置、进行驱动配置、进行约束检查。勾选“动作可配置”,表示该动作可在流程配置中进行配置;勾选“进行驱动配置”,则该动作在流程配置中可以对其他单据动作进行推式操作,驱动其他单据;勾选“进行约束检查”,则此动作要根据业务流程的配置在执行前进行条件检验,满足条件动作才执行,否则就不执行用友网络科技股份有限公司单据动作执行脚本单据动作的处理统一由平台API来调用用友网络科技股份有限公司单据项目管理是对单据业务数据的描述。一般与单据的VO模型对应。用友网络科技股份有限公司谢谢大家用友网络科技股份有限公司