金蝶云苍穹插件开发

2020-10-04  本文已影响0人  涎涎

选择插件基类

页面类型 应用场景 插件基类
动态表单 PC端界面 AbstractFormPlugin
移动端界面 AbstractMobFormPlugin
单据/基础资料 单据界面 AbstractBillPlugIn
标准单据列表 AbstractListPlugin
左树右表单据列表 AbstractTreeListPlugin
树型基础资料列表 StandardTreeListPlugin
移动端单据列表 AbstractMobListPlugin
单据操作 AbstractOperationServicePlugIn
单据转换 AbstractConvertPlugIn
报表插件 报表界面插件 AbstractReportFormPlugin
报表查询插件 AbstractReportListDataPlugin
工作流 工作流参与人插件 IWorkflowPlugin
工作流服务插件 IWorkflowPlugin
工作流条件插件 IWorkflowPlugin
开放接口 自定义开放接口插件 IBillWebApiPlugin
打印插件 打印数据处理插件 AbstractPrintServicePlugin
引入插件 引入数据加工 IImportPlugin

插件事件

分类 序号 事件 触发时机
界面显示前 1 setPluginName 显示界面前,准备构建界面显示参数之前,创建插件后,触 发此事件
2 preOpenForm 显示界面前,准备构建界面显示参数之前,触发此事件
3 loadCustomControlMetas 显示界面前,构建界面显示参数时,触发此事件 界面初始化
4 setView 表单视图模型初始化,创建插件时,调用此方法,向插件传 入表单视图模型IFormView实例;
5 initialize 表单视图模型初始化,创建插件后,触发此事件
6 registerListener 用户与界面上的控件交互时,触发此事件
7 getEntityType 表单基于实体模型,创建数据包之前,触发此事件
8 createNewData 界面初始化或刷新,开始新建数据包时触发此事件
9 afterCreateNewData 界面初始化或刷新,新建数据包完毕后,触发此事件
10 beforeBindData 界面数据包构建完毕,开始生成指令,刷新前端字段值、控 件状态之前,触发此事件
11 afterBindData 界面数据包构建完毕,生成指令,刷新前端字段值、控件状 态之后,触发此事件
用户交互 12 beforeItemClick 用户点击界面菜单按钮时,执行绑定的操作前,触发此事件
13 itemClick 用户点击界面菜单按钮时触发此事件
14 beforeDoOperation 用户点击按钮、菜单,执行绑定的操作前,触发此事件
15 afterDoOperation 用户点击按钮、菜单,执行完绑定的操作后,不论成功与否, 均会触发此事件
16 confirmCallBack 前端交互提示确认后,通知插件进行后续处理
17 closedCallBack 子界面关闭时,如果回调函数由父界面处理,则会触发父界 面的此事
18 beforeClick 用户点击按钮,标签,执行绑定的操作前,触发此事件
19 click 用户点击界面按钮或者标签时触发此事件
18 flexBeforeClosed 弹性域维护界面关闭时,触发父界面此事件
19 onGetControl 在有代码尝试获取控件的编程模型时,触发此事件
20 customEvent 触发自定义控件的定制事件
21 TimerElapsed 定时触发此事件
22 afterDeleteRow 删除单据体行后触发此事件
23 afterAddRow 新增单据体行后触发此事件
24 propertyChanged 字段值更新后触发此事件
25 beforeF7Select F7字段打开时触发 界面关闭
26 beforeClosed 界面关闭之前触发此事件
27 destory 界面关闭后,释放资源时,触发此事件
28 pageRelease 界面关闭后,释放资源时,触发此事件

表单插件及其子类

表单插件-AbstractFormPlugin常用事件

preOpenForm

afterCreateNewData

afterBindData

registerListener

beforeClick

click

beforeItemClick

ItemClick

beforeDoOperation

afterDoOperation

confirmCallBack

closedCallBack

propertyChanged

preOpenForm

触发时机:系统收到showForm指令,显示界面前,准备构建界面显示参数时,触发此事件。 此事件触发时,新界面还没有显示出来,可以在此事件,取消界面的显示,或者修改显示参数。

public class PreOpenForm extends AbstractFormPlugin {
    @Override
    public void preOpenForm(PreOpenFormEventArgs e) {
        super.preOpenForm(e);
// TODO : 可以在此取消界面显示
    }
}
afterCreateNewData

触发时机:界面初始化或刷新,新建表单数据包成功,并给字段填写了默认值之后,触发此事件;

插件可以在此事件,重设字段的默认值。部分字段的默认值难以通过设计器配置出来,如需要计算的值、根据系统 参数选项决定的值,必须写插件实现

public class AfterCreateNewData extends AbstractFormPlugin {
    @Override
    public void afterCreateNewData(EventObject e) {
        // TODO 在此添加业务逻辑
    }
}
afterBindData

触发时机:界面数据包构建完毕,生成指令,刷新前端字段值、控件状态之后,触发此事件; 插件可以在此事件,根据各字段值数据,重新设置控件、字段的可用、可见性等。 不要在此事件,修改字段值


public class AfterBindData extends AbstractFormPlugin {
    @Override
    public void afterBindData(EventObject e) {
        super.afterBindData(e);
        // TODO 在此添加业务逻辑
    }
}
registerListener

触发时机:用户与界面上的控件进行交互时,即会触发此事件。建议在此事件,侦听各个控件的插件事件

public class RegisterListener extends AbstractFormPlugin {
    @Override
    public void registerListener(EventObject e) {
        // TODO 侦听控件的插件事件
    }
}
beforeClick

触发时机:用户点击按钮或者标签等控件时,触发此事件;插件可以在此事件,取消后续点击处理,不响应按钮绑定的操作;

public class BeforeClick extends AbstractFormPlugin {
    @Override
    public void beforeClick(BeforeClickEvent evt) {
        super.beforeClick(evt);
        // TODO Auto-generated method stub 
    }
}
click

触发时机:用户点击按钮时,触发此事件;插件可以在此响应点击事件, 实现定制的业务功能。 特别说明: 如果在beforeClick事件中,取消了后续操作,则不会触发本事件;

public class Click extends AbstractFormPlugin
{
  @Override 
  public void click(EventObject evt){}
}
beforeItemClick

触发时机:用户点击菜单按钮后,在执行按钮绑定的操作前,触发此事件; 插件可以在此事件,取消菜单绑定的操作;

public class BeforeItemClick extends AbstractFormPlugin
{
    private final static String KEY_MAINBAR = "tbar_main";
    private final static String KEY_BARITEM_NEW = "baritem_new";
  @Override 
  public void registerListener(EventObject e)
     {
        super.registerListener(e); 
    // 侦听主菜单按钮点击事件 
    this.addItemClickListeners(KEY_MAINBAR);
  }
  @Override 
  public void beforeItemClick(BeforeItemClickEvent evt) { 
    if (StringUtils.equals(KEY_BARITEM_NEW, evt.getItemKey()))
    { 
      // TODO 在此添加业务逻辑 
    }
  }
ItemClick

触发时机:用户点击菜单项时,触发此事件;插件可以在此响应自定义菜单项的点击处理。

public class ItemClick extends AbstractFormPlugin
{ 
  //工具栏的标识 
  private final static String KEY_MAINBAR = "tbar_main"; 
  //按钮的标识 
  private final static String KEY_BARITEM_NEW = "baritem_new"; 
  @Override 
  public void registerListener(EventObject e) { 
    super.registerListener(e); 
    // 侦听主菜单按钮点击事件 
    this.addItemClickListeners(KEY_MAINBAR); 
  }
  @Override 
  public void itemClick(ItemClickEvent evt) { 
    super.itemClick(evt); 
    if (StringUtils.equals(KEY_BARITEM_NEW, evt.getItemKey()))
    { 
      // TODO 在此添加业务逻辑 
    } 
  } 
}
beforeDoOperation

触发时机:用户点击按钮、菜单,执行绑定的操作逻辑前,触发此事件; 插件可以在此事件:

  1. 提示确认消息;

  2. 校验数据,取消操作的执行;

  3. 传递给自定义操作参数给操作服务、操作插件;

public class BeforeDoOperation extends AbstractFormPlugin
{
    final static String KEY_OPKEY = "myoperation";
   @Override
    public void beforeDoOperation(BeforeDoOperationEventArgs args)
    {
        super.beforeDoOperation(args);
        FormOperate formOperate = (FormOperate) args.getSource();
        if(StringUtils.equals(KEY_OPKEY, formOperate.getOperateKey()))
        {
            // TODO 在此添加业务逻辑 
        }
    }
}
afterDoOperation

触发时机:用户点击按钮、菜单,执行完绑定的操作后,不论成功与否,均会触发此事件;插件可以在此事件,根 据操作结果控制界面

public class AfterDoOperation extends AbstractFormPlugin
{
    final static String KEY_OPKEY = "myoperation";
    @Override
    public void afterDoOperation(AfterDoOperationEventArgs args)
    {
        super.afterDoOperation(args);
        FormOperate formOperate = (FormOperate) args.getSource();
        if(StringUtils.equals(KEY_OPKEY, formOperate.getOperateKey()) && args.getOperationResult() != null && args.getOperationResult().isSuccess())
        {
            // TODO 在此添加业务逻辑 
        }
    }
}
confirmCallBack

触发时机:用户确认了交互提示信息后,触发此事件,通知插件进行后续处理;插件可以在此事件,了解用户的态 度,决定后续业务逻辑。

public class ConfirmCallBack extends AbstractFormPlugin
{
    private final static String CALLBACKID_MYMESSAGE = "mymessage";
  @Override 
  public void click(EventObject evt)
    {
        ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener("contentChange", this);
        String confirmTip = sConfirmMsg + "";
        this.getView().showConfirm(confirmTip, MessageBoxOptions.OKCancel, ConfirmTypes.Default, confirmCallBacks);
    }

  public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent)
    {
        super.confirmCallBack(messageBoxClosedEvent);
        if(StringUtils.equals(CALLBACKID_MYMESSAGE, messageBoxClosedEvent.getCallBackId()) && messageBoxClosedEvent.getResult() == MessageBoxResult.Yes)
        {
            // TODO 在此添加业务逻辑
        }
    }
}
closedCallBack

触发时机:子界面关闭时,触发父界面的closedCallBack事件;父界面的插件,可以在此事件,接收子界面返回的 数据。

public class ClosedCallBack extends AbstractFormPlugin
{
    private final static String CALLBACKID_MYCALLBACK = "mycallback";
    @Override 
    public void click(EventObject evt)
    {
        FormShowParameter showParameter = new FormShowParameter();
        showParameter.setFormId(GetValByConditionEdit.FormId_ValByCondition);
        showParameter.setCloseCallBack(new CloseCallBack(plugin, CALLBACKID_MYCALLBACK));
        showParameter.getOpenStyle().setShowType(ShowType.Modal);
        this.getView().showForm(showParameter);
    }
    @Override 
    public void closedCallBack(ClosedCallBackEvent closedCallBackEvent)
        {
            super.closedCallBack(closedCallBackEvent);
            if(StringUtils.equals(closedCallBackEvent.getActionId(), CALLBACKID_MYCALLBACK) && closedCallBackEvent.getReturnData() != null)
            { 
      // TODO 在此添加业务逻辑 
    } 
  } 
}
propertyChanged

触发时机:表单模型某个字段值改变的时候就会触发此事件。 注意:单据头文本字段,日期字段等基础字段需勾选即时触发值更新,基础资料字段,单据体字段不需要。

public class DemoBillPlugin extends AbstractBillPlugIn
{  
    @Override
    public void propertyChanged(PropertyChangedArgs e)
    {
        //获取到改变的属性名 
        String pname = e.getProperty().getName();
        ChangeData[] changeset = e.getChangeSet();
        Object oldvalue = (Date) changeset[0].getOldValue();
        Object newvalue = (Date) changeset[0].getNewValue();
        //如果是单据体字段还可以获取到行索引
        int index = changeset[0].getRowIndex();
        super.propertyChanged(e);
    }
}

单据插件-AbstractBillPlugIn

继承自表单插件,拥有所有表单插件事件,默认注册了工具栏的”tbmain”的 点击事件,新增加了以下事件:

afterLoadData

事件触发时机:单据界面加载完毕,会根据传入的单据主键值,到数据库加载单据数据包。

本事件在单据数据包加载完毕后触发。

插件可以在此事件,根据单据的数据决定业务逻辑的执行。

afterLoadData事件与afterCreateNewData的差别: 这两个事件的触发时机一样,都是在界面数据包准备完毕之后触发,但数据包来源不同: afterCreateNewData事件的数据包,是全新创建的数据包,适合在此事件调整默认值; afterLoadData事件的数据包,来自于数据库,不建议在此事件修改字段值; 这两个事件,在单据界面加载、刷新过程中,只会触发其中一个(互斥): 单据界面以新增模式打开,不需要到数据库加载单据,触发afterCreateNewData事件; 单据界面以修改、查看模式打开,需到数据库加载单据,触发afterLoadData事件;

@Override 
public void afterLoadData(EventObject e)
{
    super.afterLoadData(e);
}

列表插件-AbstractListPlugin

继承自表单插件,并新增了IListPlugin、ListRowClickListener等接口

分类 事件 触发时机
列表初始化 createTreeListView 不触发,仅树形列表界面会触发此事件;
filterContainerInit 初始化过滤控件时,触发此事件把配置的过滤字段传递给插件
beforeCreateListColumns 在构建列表列之前触发,传入当前待创建的列分组、列
beforeCreateListDataProvider 列表初始化,构建列表取数器前触发此事件
setFilter 列表在生成了过滤条件之后,准备查询数据之前,触发此事件
用户交互 filterContainerSearchClick 用户修改了快捷过滤、常用过滤条件,或者点击过滤面板确定按钮,触发此事件
beforeItemClick 用户点击列表主菜单按钮时,触发此事件
itemClick 用户点击列表主菜单按钮时,触发此事件
billListHyperLinkClick 点击超链接单元格时,触发此事件
beforeShowBill 执行新建、修改、查看等操作,打开单据维护界面之前,触发此事件
billClosedCallBack 列表打开的单据维护界面关闭后返回时,触发此事件
listRowClick 列表行点击时,触发此事件
listRowDoubleClick 列表行双击时,触发此事件
filterContainerInit

本事件,有两次触发时机: 1. 列表界面,初始化过滤面板时,触发此事件; 2. 用户在过滤面板点击搜索时,也会重新初始化过滤面板,触发此事件; 插件可以在此事件,获取到列表过滤面板中,快捷过滤、常用过滤、方案过滤所包含的过 滤字段信息,并对这些过滤字段进行调整; 特别注意: 本事件会多次触发,如果逻辑只能在界面初始化时执行一次,需要增加标志变量,进行区分;

@Override 
public void filterContainerInit(FilterContainerInitArgs e)
    {
        List < FilterColumn > filters = e.getCommonFilterColumns();
        CommonFilterColumn comfilter = (CommonFilterColumn) filters.get(1);
        comfilter.setDefaultValue("A"); 
        //super.filterContainerInit(e); 
    }
beforeCreateListColumns

事件触发时机 刷新单据列表,构建单据列表显示的列时,触发此事件,传入在设计器中已配置的列集合; 插件可以在此事件中,根据页面参数、过滤条件,动态添加、删除单据列表的显示列;

@Override 
public void beforeCreateListColumns(BeforeCreateListColumnsArgs e)
{
    List < IListColumn > columns = e.getListColumns();
    ListColumn colUser = this.createListColumn("creator.name", "创建人");
    columns.add(colUser);
    super.beforeCreateListColumns(e);
}
beforeCreateListDataProvider

事件触发时机 构建列表取数器之前,触发此事件; 插件可以在此事件,构建自定义的列表取数器,实现自主取数;

@Override 
public void beforeCreateListDataProvider(BeforeCreateListDataProviderArgs e)
{
    e.setListDataProvider(new ListDataProvider()
    {
      @Override 
      public DynamicObjectCollection getData(int arg0, int arg1)
        {
            return super.getData(arg0, arg1);
        }
    });
}
setFilter

事件触发时机 单据列表控件,在构建好取数条件,准备重新取数之前,触发此事件; 插件可以调整条件内容、追加条件,从而影响列表取数;

@Override 
public void setFilter(SetFilterEvent e)
{
    QFilter cfilter = new QFilter("billstatus", QCP.equals, "B");
    e.addCustomQFilter(cfilter);
    super.setFilter(e);
}
filterContainerSearchClick

用户在过滤条件面版上改变过滤条件,触发此事件: 插件可以在此事件,调整用户在过滤面板上的条件配置,后续系统会根据调整后的条件配 置,生成取数条件;

@Override 
public void filterContainerSearchClick(FilterContainerSearchClickArgs e)
{ 
    //获取全部过滤条件,按快捷过滤、常用过滤,方案过滤分开 
    Map<String, List<Map<String, List<Object>>>> filterValues = e.getFilterValues();
    System.out.println(filterValues);
}
billListHyperLinkClick

事件触发时机 单据列表上显示为超链接的单元格,用户点击时,系统默认会打开单据维护界面。 在打开单据界面之前,触发此事件; 插件可以在此事件,判断点击的列,取消单据界面打开,自行显示其它界面

@Override 
public void billListHyperLinkClick(HyperLinkClickArgs args)
{
    String fieldName = args.getFieldName();
    if("createtime".equals(fieldName))
    {
        args.setCancel(true);
        this.getView().showMessage("您点击了创建时间");
    }
    super.billListHyperLinkClick(args);
}
beforeShowBill

事件触发时机 在执行操作时,打开子界面之前,触发此事件; 插件可以修改子界面显示参数,或取消显示;

@Override 
public void beforeShowBill(BeforeShowBillFormEvent e)
{ 
    //传值到打开的单据界面 
    e.getParameter().setCustomParam("test", "test"); 
    //动态添加插件 
    e.getParameter().addCustPlugin("kd.bos.demo.formplugin.DemoBillPlugin"); 
    //终止打开 
    e.setCancel(true); 
    super.beforeShowBill(e); 
}
listRowClick

用户点击单据列表行时,触发此事件。 在移动端的单据列表上,用户点击行时,系统会自动打开单据的详情界面。插件可以在此 事件,取消上述系统内置的逻辑;

@Override 
public void listRowClick(ListRowClickEvent evt)
{
    this.getView().showMessage("点击列表");
    super.listRowClick(evt);
}
@Override 
public void registerListener(EventObject e)
{
    BillList list = this.getControl(this.BILLLISTID);
    list.addListRowClickListener(this);
    super.registerListener(e);
}

操作插件-AbstractOperationServicePlugIn

单据操作插件接口为IOperationServicePlugIn、IOperationService;

系统预置了一个操作插件基类 AbstractOperationServicePlugIn,实现了上述操作插件接口;

自定义的操作插件,扩展预置的操作插件基类 AbstractOperationServicePlugIn 即可。

插件基类 AbstractOperationServicePlugIn 内置了如下属性方法和本地变量,供插件访问,用以获取操 作执行上下文

方法 属性 说明
billEntityType 单据主实体
operateMeta 操作配置,据此获知当前执行的操作信息
operationResult 操作结果,可以向其中添加操作提示信息
getOption() 自定义操作参数选项,可以包含各种自定义操作参数
onPreparePropertys 在单据列表上执行单据操作,系统需要先根据传入的单据内码,加载单据 数据包;在加载单据数据包之前,触发此事件;插件需要在此事件,添加 需要用到的字段;
onAddValidators 系统预置的操作校验器加载完毕,执行校验之前,触发此事件;
beforeExecuteOperationTransaction 操作校验通过之后,开启事务之前,触发此事件;
beginOperationTransaction 操作校验通过,开启了事务,准备把数据提交到数据库之前触发此事件;
endOperationTransaction 数据已经提交到数据库之后,事务未提交之前,触发此事件;
rollbackOperation 操作事务提交失败,事务回滚之后触发此事件;
afterExecuteOperationTransaction 操作执行完毕,事务提交之后,触发此事件;
onPreparePropertys

操作执行,加载单据数据包之前,触发此事件;

在单据列表上执行单据操作,传入的是单据内码; 操作引擎需要先根据传入的单据内码,加载单据数据包,其中只包含操作要用到的字段, 然后再执行操作;在加载单据数据包之前,触发此事件;

在单据维护界面,执行单据操作时,传入的是单据数据包,不需要操作引擎自行加载单据, 不会触发此事件;

插件需要在此事件,添加需要用到的字段;否则,操作引擎加载出的单据数据包,可能没 有插件要用到的字段值,从而引发中断

@Override 
public void onPreparePropertys(PreparePropertysEventArgs e)
    { 
    // 要求备注字段 
    e.getFieldKeys().add(“note”);
  }
onAddValidators

构建好操作校验器之后,执行操作校验之前,触发此事件;

插件可以在此事件,增加自定义操作校验器,或者去掉内置的校验器。

@Override 
public void onAddValidators(AddValidatorsEventArgs e)
    {
        e.addValidator(new AbstractValidator()
                {
        @Override 
        public void validate(){
           for(ExtendedDataEntity obj: this.getDataEntities())
          { 
            
            //this.addErrorMessage(obj, "校验数据不通过"); 
          } 
        } 
      }); 
    super.onAddValidators(e); 
  }

如何开发插件-运用插件上下文

插件事件参数中,封装了事件源,数 据包等对象,可直接使用。例如: propertyChanged事件的event中 包含有更新前的值和更新后的值。

表单插件实例中,可以获取数据模型和界面模型

IFormView提供的常用接口

方法 说明
getPageId * 获取界面实例的唯一标识pageId
getView * 获取其他界面的视图模型
getEntityId 获取表单的主实体编码,如bd_material
getModel 获取表单数据模型
getParentView * 获取父表单视图模型
getMainView 获取主界面视图模型
updateView * 把数据模型中的数据,发送到前端界面
getControl * 获取控件编程模型
getRootControl * 获取表单编程模型
getService * 获取服务实例
invokeOperation 执行操作
activate 激活表单
close 关闭表单
setEnable 设置控件可用性
setVisible 设置控件可见性
showForm * 传入表单显示参数,打开一个新的表单,作为本表单的子表单
getFormShowParameter 获取表单显示参数
cacheFormShowParameter 修改表单显示参数对象属性值之后,调用本方法把参数更新到缓存
returnDataToParent 设置返回到父表单的返回值
openUrl 打开一个新窗口链接到指定的URL
showUpload 显示一个文件上传界面;文件上传完毕,触发插件afterUpload事件;
showMessage 单据内悬浮消息框,默认没有按钮,自动消失
showErrMessage 显示错误消息
showOperationResult 显示操作结果
showConfirm 显示确认消息;用户确认完毕,会触发confirmCallBack事件;
showSuccessNotification 单据内成功悬浮消息框,默认2秒自动消失;消息内容,不能超过50字
showErrorNotification 单据内失败悬浮消息框,需要手动关闭
showTipNotification 单据内提示类别悬浮消息框,提示类会显示按钮,需要手动关闭
showRobotMessage 发送消息给机器人助手
closeRobotMessage 关闭消息给机器人助手
showFieldTip 字段上显示提示信息
showOperationResult 显示操作结果
showConfirm 显示确认消息;用户确认完毕,会触发confirmCallBack事件;
showSuccessNotification 单据内成功悬浮消息框,默认2秒自动消失;消息内容,不能超过50字
showErrorNotification 单据内失败悬浮消息框,需要手动关闭
showTipNotification 单据内提示类别悬浮消息框,提示类会显示按钮,需要手动关闭
showRobotMessage 发送消息给机器人助手
closeRobotMessage 关闭消息给机器人助手
showFieldTip 字段上显示提示信息

IDataModel提供的常用方法

方法 说明
getDataEntityType * 获取运行时表单实体元数据对象,又称为主实体模型
getProperty * 获取运行时字段元数据对象,又称为实体的属性对象
createNewData 根据表单主实体模型,创建表单新的数据包,字段填写好默认值
getDataEntity * 获取表单数据包
updateCache * 提交当前表单数据包到缓存
getValue * 获取字段值
setValue * 设置字段值
setItemValueByNumber 根据基础资料的编码,设置基础资料字段值
setItemValueByID 根据基础资料的内码,设置基础资料字段值
getContextVariable * 获取上下文变量
putContextVariable 添加上下文变量
removeContextVariable 删除上下文变量
addDataModelListener 订阅模型相关事件
addDataModelChangeListener 订阅模型改变事件
createNewEntryRow 创建分录行
batchCreateNewEntryRow 批量创建分录行

如何开发插件-合理运用工具类

bos-servicehelper工程含大量工具类

服务类 说明
SaveServiceHelper 保存服务
DeleteServiceHelper 删除服务
BusinessDataServiceHelper 单据、基础资料读取
QueryServiceHelper 查询服务
DBServiceHelper 生成全局唯一的数据内码(字符型、长整型)
TimeServiceHelper 获取系统时间
BaseDataServiceHelper 基础资料服务
ConvertServiceHelper 单据转换服务
CodeRuleServiceHelper 单据编号服务
OperationServiceHelper 单据各种操作服务(保存、提交、审核、反审核、禁用、作废等)

以上就是我关于 金蝶云苍穹插件开发 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。


分割线


上一篇下一篇

猜你喜欢

热点阅读