电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

U8Cloud开发课件-二次开发培训-20180302.docxVIP免费

U8Cloud开发课件-二次开发培训-20180302.docx_第1页
1/45
U8Cloud开发课件-二次开发培训-20180302.docx_第2页
2/45
U8Cloud开发课件-二次开发培训-20180302.docx_第3页
3/45
二次开发培训目录一、总述..3二、基于外部交换平台开发..31.目前外部交换平台支持的单据.32.注册外部交换平台插件.52.1.注册单据相关信息.62.2.生成&配置交换规则定义文件.82.3.辅助信息项设置.102.4.插件代码维护.112.5.交换平台测试.122.6.导出和插件相关的配置文件.122.7.查询插件注册.133.向U8C系统发送数据方式..153.1.手动界面发送.153.2.后台预警发送.163.3.自定义程序发送.18三、基于事件开发..201.IBDOperate接口.202.事件类型.203.IBDOperateContextObject..214.表名.225.目前支持的档案事件.226.开发过程.22四、基于OpenAPI开发..264月19日下面这些API就可以使用.26五、基于预警和后台任务开发..261.简介及开发步骤.272.业务插件接口.272.1.业务预警插件接口1..272.2.业务预警插件接口2..282.3.业务预警插件接口3..292.4.后台任务插件接口.292.5.预警代码示例.293.注册任务类型.324.测试插件条目.34一、总述二次开发主要分为两大类,一类是针对外部系统,可以用通过外部交换平台和OpenAPI;另外一个是对U8C内部业务需要,可使用插件,新增按钮,后台预警任务等。二、基于外部交换平台开发外部数据交换平台主要用于外部系统和U8C系统进行集成。利用外部数据交换平台,可以将外系统的基本档案和业务数据发送到U8C系统中,并进行相关的业务操作,如审批、弃审,也可以通过发送XML格式的查询条件导出U8C系统的数据(需业务插件支持),导出的数据可以附着在回执文件中,也可以直接向外部系统回发HTTP请求。1.目前外部交换平台支持的单据模块单据名称单据编码arap应收单据D0应付单据D1应收单据D2应付单据D3cm材料成本M2自制半成品转移M3外购辅助服务消耗M6自制辅助服务消耗M7作业量统计MA费用成本归集M5费用成本归集M4完工产品统计M8废品即收回统计M9cmp银行对账单bc现金管理单据D4现金管理单据D5现金管理单据D6ct合同单据CTerm报销单据264X借款单据263Xfa固定资产卡片增加h1固定资产卡片减少h2固定资产卡片变动h3固定资产评估h6fip会计平台14A0fipub财务凭证gl期初凭证glqcfts明细账36LQACBL对帐单ACQU委托付款LA委托付款36LDQia存货核算出入库单IAicBILL-ICBillQueryICBillQuery库存出库入库单ICictG0010101业务流程档案G0010102obm对账单查询querydetail对账单查询结果retdetail余额单查询queryBalance余额单查询返回retBalancepd工艺路线AXAVpu采购订单21采购发票25请购单20采购到货单23询报价单29so销售发票32预订单38销售订单30so2销售报价单37to调拨订单5X调入申请5AU8RM上传要货申请U8RMLoadApplyU8RM上传组织内调拨订单U8RMLoad5Iuapbd结算方式bsbaltype人员档案bspsn人员分类bspsncl项目综合档案bsjobbas存货分类bsinvcl部门档案bsdept地区分类bsareacl客商档案bscubas会计科目bsaccsubj存货基础档案bsinvbas存货管理档案bsinvman存货生产档案bsinvproduce存货基本档案invbas自定义档案defdoc公司目录bscorp计量档案bsmeasdoc仓库档案bsstordoc银行档案bankdoc银行账户bankaccount客商账号custbank公司目录crmcorp用户crmuser地区分类crmareacl存货分类crminvcl存货基本档案crminvbasdoc币种档案crmcurrtype计量档案crmmeasdoc人员档案crmpsndoc客户档案crmcustomer2.注册外部交换平台插件信息交换平台配套的二次开发向导工具,利用这个工具,可以非常方便的给U8C系统里还没有集成功能的单据,或者用户自定义的单据,快速添加集成的功能。从[二次开发工具]-[集成开发工具]打开单据集成开发,然后在左边选择功能节点导航,选中相应的需要进行交换功能开发的单据节点,点击菜单项的信息交换平台-插件开发,便会出现信息交换平台的二次开发向导工具。下面按照向导的步骤依次介绍开发工具的使用方法及注意事项:2.1.注册单据相关信息说明:==模块信息==[模块名]–单据所属模块,比如部门档案属于”uapbd”模块,凭证属于”gl”模块,模块会影响交换插件最终的部署位置。==插件配置==[单据标识]一般填写相应的单据类型即可,如果没有单据类型,比如基础档案,可以取一个能唯一标识当前档案的名称。比如部门档案取名为”bsdept”。[单据描述]一般写单据的名称或者简单的功能描述。[业务操作]选择框,常见的业务操作有add、update、delete、query、audit、unaudit…等等,用户发送数据时,会在XML文件头里写上各种的业务操作,如果这里没有注册相应的业务操作,则会提示相应的业务插件没有找到。所以如果希望支持各种业务操作,这里就一定要在这里进行注册。[导入范围]选择框,表示该单据是否只能导入到集团,还是只能导入到公司,或者集团公司均可。[单据加锁级别]选择框,锁的控制级别,用户控制并发问题,对于大多数单据,如果没有特别的要求,保持默认值即可。详细情况请参照开发红皮书。[插件类名称]针对该单据+选定的业务操作,最终的插件处理类名称,如果这个插件类写的比较通用,不同的业务操作也可以注册同一个业务插件类,关键要看业务插件类的处理能力。这里插件类需要遵循特定的接口,具体可以看后面的[插件类生成及维护]。[扩展插件类名称]这个主要是为了兼容以前版本的老插件而设置的,因为老的插件不符合新的接口规范,如果新开发交换插件,此处无需填写。==单据信息==[VO类型]根据单据在U8C内部的VO结构的不同,我们将其分为三类:单子表――无聚合关系,整个单据对应一个VO(此VO内部可能还嵌套其他VO),大多数基础档案都属于这个类型,包括凭证,虽然是比较复杂的结构,但早期的设计还是属于单子表类型。主子表――有明显的聚合关系,整个单据对应一个聚合VO(主子表VO),聚合VO的表头VO对应单据的主表数据,聚合VO的子表VO对应单据的子表数据,大多数业务单据均属于这种类型,这种类型的VO对应了UI工厂里的管理型界面。多子表――同主子表类似,整个单据对应一个聚合VO(多子表VO),聚合VO的表头VO对应单据的主表数据,只是聚合VO有多个子表VO,每个子表VO对应单据里相应的子表数据。根据以上分类,可以快速的定位当前单据的VO类型。选择了不同的VO类型,下面的注册信息也各有不同。另外对于我们前面提到的VO里如果还有嵌套VO的情况,可以通过[内联VO]来设置内嵌VO和数据表的信息。2.2.生成&配置交换规则定义文件配置好单据注册相关信息后,就可以自动生成交换规则定义文件的大纲了,之所以叫大纲,是因为生成后的文件,还需要进一步配置,比如对需要翻译的字段配置参照档案等。首先是设置一些生成参数,以决定是否重新生成,生成通用的规则定义文件,还是针对特定外部系统生成等,如下图所示:生成后的规则校验文件:样本数据预览:此界面右上方有一保存按钮,可以保存生成的样本数据到本地硬盘。2.3.辅助信息项设置利用交换平台做数据交互时,业务数据一般都放在具体的XML文档中,但是,发送过程中往往还有一些数据,并不需要也不能写到每个具体的XML文档里,这些数据,用户往往需要根据当前的发送方、接受方、单据类型及具体的业务场景进行设定,比如说发送凭证时,针对凭证表头表体的控制参数是根据不同的发送方、接受方、及凭证类别由用户灵活控制的;另外如存货基础档案发送到集团时,用户也需要配置,档案可以分配到那些公司。诸如此类的信息,在交换平台中称之为辅助信息。辅助信息分设计态和运行态,设计态是指从程序开发的角度,交换平台提供了一个类似数据池的数据存贮区,插件开发人员先定义当前单据所需要的辅助信息项目,比如上面所说的凭证控制信息、存货的分配公司等,插件开发人员定义好这些项目之后,在[交换平台维护]-[辅助信息设置]界面,用户就可以在运行态时配置这些项目的值,最终在业务插件类里,用户配置好的这些值被交给插件使用。简单的说就是插件开发人员借助信息交换平台辅助信息这个数据池,存放一些特定的项目,在运行态时收集用户的设置,最终在插件处理这些用户的设置信息。2.4.插件代码维护【插件全路径类名】根据单据注册信息自动带过来,不可以再修改。【包含测试代码】如果选中此项,生成的代码中会包含测试代码,主要是将转换后的VO序列化到后台,最终在前台进行展现,以便开发人员观察转换后的VO是否正确,便于定位错误。仅适合在测试时使用,最终代码开发时一定要删除测试代码。【包含导出代码】如果选中此项,会生成如何将VO转换为XML文档的代码实例,以便开发人员参考。选择生成代码的存放路径,便可以按“生成”,生成代码。这个代码是插件的通用框架,如果有辅助信息或者其他的业务处理,请自行拷贝到Eclipse修改。修改好的代码也可以拷贝到这里,进行编译(中间件需要设置参数enableHotDeployed=true),然后便可以测试了。2.5.交换平台测试测试OK后,可以导出相关的配置文件,提交到git服务器或者其他的测试环境上。2.6.导出和插件相关的配置文件2.7.查询插件注册单据插件注册,查询的业务操作也得注册add方式。其他的步骤和保存是一样的。查询插件代码示例:packagetest;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.NodeList;importnc.vo.pfxx.exception.PfxxPluginException;importnc.vo.pfxx.manualload.UfinterfaceVO;importnc.vo.pfxx.util.PfxxUtils;importnc.vo.pfxx.xxchangereg.XsysregisterVO;importnc.vo.pub.BusinessException;importnc.vo.uapbd.bankdoc.BankdocVO;importnc.itf.bd.bankdoc.IBankDocQueryService;importnc.itf.uap.pfxx.IPFxxEJBService;importnc.bs.framework.common.NCLocator;importnc.bs.logging.Logger;/****@since*@version2018-3-1上午9:55:09*@authorAdministrator*/publicclassQueryPluginextendsAbstractPfxxPlugin{@OverrideprotectedObjectprocessBill(Objectvo,UfinterfaceVOufvo,XsysregisterVOxsysvo)throwsBusinessException{//得到转换后的VO数据,取决于向导第一步注册的VO信息CommonQueryVOresvo=(CommonQueryVO)vo;KeyValueVO[]keyValueVOs=resvo.getConditions();intn=keyValueVOs.length;String[]keys=newString[n];for(inti=0;i<n;i++){keys[i]=keyValueVOs[i].getValue();}//查询NC数据,通过回执返回到外系统示例代码开始Documentresdoc=null;/*获取导出服务*/IPFxxEJBServicerunner=PfxxUtils.lookUpPFxxEJBService();try{/*查询需要导出的VO,这里查全部,实际应用应该通过XML传递条件过来进行查询*/IBankDocQueryServicequeryService=NCLocator.getInstance().lookup(IBankDocQueryService.class);BankdocVO[]vos=queryService.queryAllBankDoc();/*实例代码仅演示ValueObject,如果是AGGVO请修改*/resdoc=runner.exportBills(vos,ufvo.getAccount(),-bankdoc-,ufvo.getPk_corp(),ufvo.getSender(),null);//getidsfromdocumentandinserttodbString[]docids=newString[vos.length];NodeListbasdocList=resdoc.getDocumentElement().getElementsByTagName(-basdoc-);inttotal=basdocList.getLength();for(inti=0;i<total;i++){Elementnode=(Element)basdocList.item(i);docids[i]=node.getAttribute(-id-);}for(inti=0;i<docids.length;i++){UfinterfaceVOaccsubjUfvo=newUfinterfaceVO();accsubjUfvo.setBilltype(-bankdoc-);accsubjUfvo.setDocid(docids[i]);}}catch(Exceptione){Logger.error(-导出单据失败-,e);thrownewPfxxPluginException(this.getClass().getName(),-导出单据失败:-+e.getMessage());}returnresdoc;}}3.向U8C系统发送数据方式3.1.手动界面发送这是外部数据最简单也最常用的一种客户端发送方式,点击:[应用集成]→[信息交换平台]→[手工加载界面],在打开的界面中选择需要发送的文件,如有必要,修改目标URL地址的receiver参数值,选择“发送”菜单即可。详细内容请参考信息交换平台的用户手册。3.2.后台预警发送点击:[企业建模平台]→[预警平台]→[预警条件配置]→[条目配置]→[增加],在弹出的预警条目设置对话框中配置一个类型为“外部交换数据后台发送”的预警条目。在该预警条件标签页中内置了四个预警条件:待发送文件目录该预警条件阈值用于设置用户数据文件目录(不能为空);回执目录该预警条件阈值用于设置存放单据导入之后的回执信息的目录,每张单据一个回执文件,如果用户不设置这个阈值,系统在待发送文件目录下默认创建目录/logdir作为回执目录;发送后文件转移目录该预警条件阈值对于想将能够成功加载的文件备份走的用户有用(一般不用设置);发送配置信息该预警条件阈值是一个可扩展的预警条件阈值,它用于配置将什么样的文件发送到哪个URL地址(不能为空)。这个配置值的格式如下:第一部分是单据类型:第二部分是外系统编码:第三部分是目的URL地址:上面所列发送配置信息项取值的意思就是将单据类型是“Test1”,外部系统编码为“1101”的文件发送到U8C外部数据接收的Servlet地址:urladdress=http://localhost:80/service/XChangeServlet?account=0001&receiver=yy。这个地方如果我们将单据类型的取值设为“XX”或“xx”的话,表示任何单据类型的文件都可以往某个地址发送,相当于通配符的意思,但对于外部系统编码没有通配符。发送配置信息是一个可扩展的预警条件阈值,意思就是用户可以在预警平台的类型注册对话框中修改名为“外部交换数据后台发送”的预警类型定义,增加作为预警条件的发送配置信息项,以实现数据文件的多点发送,操作方法如下:在上一步的菜单中选中“外部数据交换后台发送”行,点击修改按钮,弹出“类型注册”对话框,为其增加一个发送配置信息阈值项。需要注意的是该新增阈值项的名称必须以字符串“postconfig”开头,如“postconfig1”、“postconfig2”等。这样配置更多的发送配置信息,使得能有选择地将某个特殊单据类型特殊外部系统的数据文件能够发送到某个指定服务器地址去。配置完毕,即可由预警平台调度和执行发送任务。另请注意,在待发送文件目录、回执目录和发送后转移目录的设置上本地客户端和服务器端文件系统的差别,如目录“c:/aaa”指的是服务器端文件系统路径而非客户端文件系统地址。3.3.自定义程序发送外系统对接U8C外部交换平台上传报文时,需要对报文进行加密处理,同时平台会进行权限校验(要求上传可以唯一标识友户通用户身份的accessToken),具体报文加解密和友户通对接事宜请联系U8C开发人员。以Java代码为例,介绍如何自定义程序向U8C系统发送数据,以下代码仅做参考:packagecom.yonyou.test.demo;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.Writer;importjava.net.HttpURLConnection;importjava.net.MalformedURLException;importjava.net.ProtocolException;importjava.net.URL;importorg.apache.commons.io.IOUtils;importcom.yonyou.yht.sdk.SDKUtils;publicclassSendDemo{//U8C的IP地址privatestaticfinalStringIP=-127.0.0.1-;//U8C的IP地址端口号privatestaticfinalStringPORT=-80-;//用户编码,友户通的用户、U8C的用户编码,都是手机号privatestaticfinalStringUSER_CODE=-14444444002-;//用户密码,友户通的用户、U8C的用户密码,明文密码,后面会进行加密和检查privatestaticfinalStringUSER_PWD=-tiyan*123-;//U8C的账套编码,如果填写不正确,会报错privatestaticfinalStringACCONUT=-U8cloud-;//U8C外部交换平台数据传输服务的地址privatestaticfinalStringXCHANGE_URL=-/service/XChangeServlet-;//友户通获取token的URLprivatestaticfinalStringYHT_TOKEN_URL=-/service/YhtUserWebServer-;//待发送XML文件地址privatestaticfinalStringfilePath=-C:\\Users\\Administrator\\Desktop\\二次开发培训\\30_import.xml-;/***程序运行入口*/publicstaticvoidmain(String[]args){//获取友户通accessToken,安全性要求Stringtoken=SendDemo.createToken();if(token==null){return;}//文件发送主体程序SendDemo.pfxxSend(token);}/***获取友户通accessToken基于安全性要求,在进行数据传输时,u8c使用token进行安全性校验*http://ip:port/service*/YhtUserWebServer?usercode=XXXX&md5pwd=XXXX&shapwd=XXXX**@return*/privatestaticStringcreateToken(){//计算md5pwd和shapwd,需要依赖友户通的SDKStringpwd_md5=SDKUtils.encodeUsingMD5(SendDemo.USER_PWD);Stringpwd_sha=SDKUtils.encodeUsingSHA(SendDemo.USER_PWD);StringyhtURL=-http://-+SendDemo.IP+-:-+SendDemo.PORT+SendDemo.YHT_TOKEN_URL+-?usercode=-+SendDemo.USER_CODE+-&md5pwd=-+pwd_md5+-&shapwd=-+pwd_sha;HttpURLConnectionconn=null;InputStreamtoken=null;try{//建立http请求链接conn=SendDemo.getHTTPConnect(yhtURL);//把结果信息打印出来token=conn.getInputStream();StringtokenStr=newString(IOUtils.toByteArray(token),-UTF-8-);System.out.println(-获取Token成功:-+tokenStr);token.close();returntokenStr;}catch(MalformedURLExceptione){//自行处理异常}catch(IOExceptione){//自行处理异常}finally{if(token!=null){try{token.close();}catch(IOExceptione){//自行处理异常}}if(null!=conn){conn.disconnect();}}returnnull;}/***文件发送主体程序**@paramtoken*@throwsException*/privatestaticvoidpfxxSend(Stringtoken){Writerw=null;HttpURLConnectionconn=null;BufferedReaderreader=null;InputStreamresult=null;try{Stringurl=-http://-+SendDemo.IP+-:-+SendDemo.PORT+SendDemo.XCHANGE_URL+-?account=-+SendDemo.ACCONUT+-&token=-+token;//调用U8C的服务conn=SendDemo.getHTTPConnect(url);//此处使用的是xml文件转成文件流进行传输,也可以直接使用文件流进行传输,务必使用UTF-8格式w=newOutputStreamWriter(conn.getOutputStream(),-UTF-8-);reader=newBufferedReader(newInputStreamReader(newFileInputStream(SendDemo.filePath),-UTF-8-));StringtempString=null;StringBuffersb=newStringBuffer();//一次读入一行,直到读入null为文件结束while((tempString=reader.readLine())!=null){sb.append(tempString);}w.append(sb);w.flush();//把结果信息打印出来result=conn.getInputStream();System.out.println(newString(IOUtils.toByteArray(result),-UTF-8-));}catch(MalformedURLExceptione){//自行处理异常}catch(ProtocolExceptione){//自行处理异常}catch(IOExceptione){//自行处理异常}finally{if(w!=null){try{w.close();}catch(IOExceptione){//自行处理异常}}if(reader!=null){try{reader.close();}catch(IOExceptione){//自行处理异常}}if(result!=null){try{result.close();}catch(IOExceptione){//自行处理异常}}if(null!=conn){conn.disconnect();}}}/****@paramurl*@return*@throwsIOException*@throwsMalformedURLException*@throwsProtocolException*/privatestaticHttpURLConnectiongetHTTPConnect(Stringurl)throwsIOException,MalformedURLException,ProtocolException{HttpURLConnectionconn;conn=(HttpURLConnection)newURL(url).openConnection();conn.setDoOutput(true);conn.setRequestProperty(-Content-type-,-text/xml-);conn.setRequestMethod(-POST-);returnconn;}}三、基于事件开发大部分基本档案引入了类似Swing的事件机制,在档案的增、删、改、封存操作时会产生相应的事件。如果需要在这些操作发生前或发生后增加一些业务处理(比如删除档案前需要校验是否有单据引用,或者客商合并后需要更新单据引用的pk)把这些业务处理逻辑封装成对相应事件的监听类,注册到系统中。注册的信息保存在表bd_interfaceexec中。所有的监听类都必须实现接口IBDOperate。其他的业务单据目前没有此机制。1.IBDOperate接口IBDOperate接口有两个方法,分别为beforeOperate和afterOperate,其声明如下所示:publicvoidbeforeOperate(Stringfun_code,intopType,Stringpk1,Stringpk2,Objectbd_docData)throwsBusinessException;publicvoidafterOperate(Stringfun_code,intopType,Stringpk1,Stringpk2,Objectbd_docData)throwsBusinessException;这两个方法分别在监听的事件开始前和结束后调用,其参数基本一样。参数含义参数参数含义Fun_code档案结点号,表明当前事件是属于哪个档案。OpType当前的事件类型,即是增加或是删除或者其他等等。Pk1当前操作的档案的主键。Pk2大部分情况下无意义。仅在特殊操作,比如档案新增下级等操作才有意义。需要参看具体档案的文档。Bd_docData不同情况下意义不同。需要参看具体的档案的文档。2.事件类型对于事件类型(即参数opType的取值),IBDOperate接口中定义了一些常见的事件。常量名取值含义BDOPERATION_SEAL1档案封存BDOPERATION_STOP2档案停用BDOPERATION_ALTER3档案属性被修改BDOPERATION_COMBINE4档案合并BDOPERATION_ADDSUB5增加该档案下级BDOPERATION_DEL6档案删除BDOPERATION_INSERT7档案新增BDOPERATION_COPY8档案复制BDOPERATION_BEGIN_USE12档案启用BDOPERATION_REF13档案引用BDOPERATION_DELLOG14档案删除日志BDOPERATION_CANCELASSIGN15当取消分配BUSOPERATION_MONTHEND21月末结账BUSOPERATION_CANCELMONTHEND23月末反结账这里列举出来的是常见的一些事件类型,对于个别的档案可能会有它特有的事件类型定义,这也需要查看各个档案的具体文档。参数bd_docData用来解决在很多的事件中需要比当前操作的档案主键更多的信息的问题。其具体类型可能随不同的档案或业务组件的不同事件而不同。3.IBDOperateContextObject对于修改(BDOPERATION_ALTER)事件,bd_docData都统一为IBDOperateContextObject。其定义如下:publicinterfaceIBDOperateContextObject{publicabstractIBDBaseDocgetBaseVO();publicabstractObjectgetContextInfo();publicabstractObjectgetNewVO();publicabstractObjectgetOldVO();}这个接口里getNewVO和getOldVO分别返回的是修改前和修改后的档案VO。如果是新增或删除操作则getOldVO返回null.方法getContextInfo是一个用来应付扩展的属性,一般为null,实际使用中的具体含义要看相应档案的文档。getBaseVO是为满足总账辅助核算同步更新档案的名称编码而增加的。IBDBaseDoc有三个方法分别返回档案修改后的名称编码和主键。同样这个方法在新增和删除没有意义。一般来说,监听处理程序仅需要getNewVO和getOldVO返回的两个VO就可以完成大部分的业务逻辑了。4.表名bd_interfaceexec各主要字段介绍字段名描述Funcode为节点号,如果要监听所有的档案则可以注册为”ALL”InterfaceclassnameIBDOperate的实现类名。Opertype操作类型5.目前支持的档案事件详细情况见事件通知红皮书。6.开发过程第一步:实现接口IBDOperate。packagenc.impl.uap.bd.account;importjava.util.Collection;importnc.bs.bd.cache.CacheProxy;importnc.bs.bd.pub.IBDOperateContextObject;importnc.bs.dao.BaseDAO;importnc.vo.bd.CorpVO;importnc.vo.bd.b203.SettleunitHeaderVO;importnc.vo.bd.service.IBDOperate;importnc.vo.pub.BusinessException;/**当公司信息发生变化时,同步成员单位信息*@authorjingli**/publicclassCorpInfoUpdateOperatorimplementsIBDOperate{publicvoidafterOperate(Stringfun_code,intopType,Stringpk1,Stringpk2,Objectbd_docData)throwsBusinessException{if(!-100406-.equals(fun_code)||IBDOperate.BDOPERATION_ALTER!=opType){return;}IBDOperateContextObjectcontextObject=(IBDOperateContextObject)bd_docData;Objecto=contextObject.getNewVO();if(o!=null&&oinstanceofCorpVO){CorpVOnewVO=(CorpVO)o;CorpVOoldVO=(CorpVO)contextObject.getOldVO();synCorpInfoToSettleUnit(newVO,oldVO);}}/**将公司信息同步到对应的结算单位*@paramnewVO*@paramoldVO*/@SuppressWarnings(-unchecked-)privatevoidsynCorpInfoToSettleUnit(CorpVOnewVO,CorpVOoldVO)throwsBusinessException{Stringpk_corp=oldVO.getPrimaryKey();Collection<SettleunitHeaderVO>col=newBaseDAO().retrieveByClause(SettleunitHeaderVO.class,-pk_corp1='-+pk_corp+-'-);SettleunitHeaderVOunitVO=col==null||col.size()==0?null:((SettleunitHeaderVO[])col.toArray(newSettleunitHeaderVO[0]))[0];if(unitVO!=null){unitVO.setSettleunitcode(newVO.getUnitcode());unitVO.setSettleunitname(newVO.getUnitname());unitVO.setShortname(newVO.getUnitshortname());newBaseDAO().updateVO(unitVO);CacheProxy.fireDataUpdated(unitVO.getTableName(),unitVO.getPrimaryKey());}}publicvoidbeforeOperate(Stringfun_code,intopType,Stringpk1,Stringpk2,Objectbd_docData)throwsBusinessException{//TODOAuto-generatedmethodstub}}第二步:将对应的实现类注册到bd_interfaceexec。第三步:在对应的操作的代码中用nc.bs.bd.service.BDOperateServ调用对应的事件,在更新组织信息的时候触发这个事件来同步成员单位信息。/***用VO对象的属性值更新数据库。**创建日期:(2001-5-16)**@paramcorp*nc.vo.bd.CorpVO*/publicStringupdate(CorpVOcorp)throwsBusinessException{newCheckSealCanChg(corp,-pk_corp-,-fathercorp-,-isseal-).checkCanChgSeal();IPfBusinessLockbdLock=newPfBusinessLock();try{HYBillVObillVo=newHYBillVO();billVo.setParentVO(corp);if(corp.getTs()!=null)bdLock.lock(newBDLockData(billVo),newBDConsistenceCheck(billVo));//校验是否存在上级循环引用checkIsCycleForFathercorp(corp);//检查唯一性checkIsOnly(corp,false);//chenwei040522封存CorpVOoldVO=findCorpVOByPK(corp.getPrimaryKey());nc.bs.bd.service.BDOperateServbdOS=newnc.bs.bd.service.BDOperateServ();booleanisSeal=isSeal(corp,oldVO);//是否封存beforeSeal(isSeal,corp,bdOS);IBDOperateContextObjectcontextObj=newBDOperateContextObject(corp,oldVO,newIBDBaseDoc(){publicStringgetCode(){return-unitcode-;}publicStringgetName(){return-unitname-;}publicStringgetPk(){return-pk_corp-;}});bdOS.beforeOperate(-100406-,nc.vo.bd.service.IBDOperate.BDOPERATION_ALTER,corp.getPrimaryKey(),null,contextObj);updateInnerCode(corp);getBaseDAO().updateVO(corp);//数据库操作bdOS.afterOperate(-100406-,nc.vo.bd.service.IBDOperate.BDOPERATION_ALTER,corp.getPrimaryKey(),null,contextObj);nc.bs.bd.cache.CacheProxy.fireDataUpdated(-bd_corp-,corp.getPrimaryKey());afterSeal(isSeal,corp,bdOS);//添加历史记录if(corp.isBackup()){oldVO.setBusienddate(corp.getBusibegindate());insertHistory(oldVO);}return-ok-;}finally{bdLock.unLock();}}}四、基于OpenAPI开发4月19日下面这些API就可以使用领域模块单据(档案)操作平台类基本档案人员仓库部门科目存货分类存货财务领域总账凭证应收应付应收单新增、审批、弃审收款单新增、审批、弃审供应链销售管理销售订单新增、审批、弃审、批量审批,批量弃审采购管理采购订单新增、审批、弃审、批量审批,批量弃审库存管理现存量采购入库新增、签字、取消签字其他出库单新增、签字、取消签字其他入库单新增、签字、取消签字五、基于预警和后台任务开发1.简介及开发步骤适用人群:本指南适用于基于任务中心进行二次开发的开发人员。开发步骤:1)开发人员先实现规定的接口;2)注册任务类型;3)测试插件条目。依照条目定义,或打开节点,或登录系统,或定制时间。并查看消息是否如插件所意。2.业务插件接口定义预警类型时必须提供做业务检查的业务插件,由开发人员编写。该业务插件必须实现预警业务插件接口。预警服务运行时,根据定义的预警条目执行业务插件的适当业务,并将产生的预警信息写入预警文件,进行企业业务预警。2.1.业务预警插件接口1nc.bs.pub.pa.IBusinessPlugin最普通最原始的接口,一般用于定时的预警条目,也可以用于即时预警条目,但执行时不能向插件传入客户端的登陆信息(包括用户主键、公司等信息)。定义接口如下:publicinterfaceIBusinessPlugin{publicintIMPLEMENT_RETURNMESSAGE=0;//返回一个字符串信息,后台会生成只包含一个字符串的HTML文件publicintIMPLEMENT_RETURNOBJECT=1;//返回一个可以序列化的对象,后台会生成一个序列化的文件publicintIMPLEMENT_WRITEFILE=2;//自定义写一个文件,即插件自.

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

U8Cloud开发课件-二次开发培训-20180302.docx

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信