Python表单插件-自定义配置进度条,执行复杂任务时预防"系统卡死、响应超时"原创
金蝶云社区-CQ周玉立
CQ周玉立
133人赞赏了该文章 6773次浏览 未经作者许可,禁止转载编辑于2022年05月12日 16:47:26
封面

在实际应用中,经常会遇到需要花费较长时间处理业务或者加载数据的场景。比如:执行某种数据结算操作、批量生成单据、导入自定义Excel表数据等等。


在这些场景中,如果耗时过长,就会出现系统"卡死",甚至响应超时的现象,对用户体验非常不友好。此时,如果能显示进度条,在避免页面响应超时的同时,也能给用户更好的交互体验。


接下来,以金蝶云·星空产品为例,给大家介绍通过Python表单插件完成2种进度添加方式的技巧,通过Python脚本可以形成一个"固定模式的代码套用框架",快速复用到多个功能里面。



场景1:弹出式进度条加载提示,进度条出现时用户不可进行下一步操作

image.png


应用场景:

1、单据录入时,系统自动加载大量数据,需要屏蔽用户操作数据加载完毕之后才能允许进行下一步操作......

2、执行某个耗时较长的任务时,需要屏蔽用户操作,任务执行完成后才能允许进行下一步操作.....


以上场景,在界面上不方便加入进度条控件,此时便可通过Python脚本配置进度条,优化用户体验


注:本案例采用Python脚本实现,C#参考:https://vip.kingdee.com/article/110013932148173824?productLineId=1


Python脚本表单插件代码参考如下:

#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('System')
clr.AddReference('System.Data')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
clr.AddReference('Kingdee.BOS.ServiceHelper')
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DependencyRules import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from System import *
from System.Data import *
from Kingdee.BOS.App.Data import *
from System.Collections.Generic import List
from Kingdee.BOS.ServiceHelper import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Metadata.FieldElement import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.KDThread import *

def showRslt(asynResult):
    if (asynResult <> None and asynResult.Exception <>None):
        this.View.ShowErrMessage(asynResult.Exception.Message);
#进度条达到100%之后,关闭进度条弹窗,回调此方法,弹出提示信息
def showFinishMsg(formResult):
    this.View.ShowMessage("数据加载完成!");
def ShowProgressBar():

#调试执行任务时,可以先通过这两行调试任务执行代码

#因为启用进度条之后,是在子线程中运行,不方便分析代码问题。调试成功之后,再屏蔽这两行,启用进度条

    #setData();
    #return;
    progressFormParameter = DynamicFormShowParameter();
    progressFormParameter.PageId = Guid.NewGuid().ToString();
    progressFormParameter.FormId = "BOS_ReportProgressMsg";
    progressFormParameter.OpenStyle.ShowType = ShowType.Modal;
    progressFormParameter.Caption = "正在加载数据...";
    progressFormParameter.HiddenCloseButton = True;
    #true表示使用真实进度,在执行任务的方法中更新进度值:代码示例,this.View.Session["ProcessRateValue"] =10
    progressFormParameter.CustomParams.Add("UseTruePro""true");
    this.View.ShowForm(progressFormParameter,Action[FormResult](showFinishMsg));
    MainWorker.QuequeTask(Action(setData),Action[AsynResult](showRslt));
#自定义方法,在这里实现加载数据的任务,需要根据自己的个性化编写代码
def setData():
    billObj = this.Model.DataObject;

#根据代码执行过程大致估算出进度值,整数,最后一定要有100%,否则进度弹窗无法自动关闭

    this.View.Session["ProcessRateValue"] = 100;
#本案例是通过值更新事件,选择年份或者月份的时候,动态加载出对应的数据

#也可以根据实际情况ShowProgressBar();放到按钮点击事件等其他事件中即可
def DataChanged(e):
    key=e.Field.Key.ToUpperInvariant();
    if(str(key)=="F_ORA_YEAR" or str(key)=="F_ORA_MONTH"):
        ShowProgressBar();#弹出进度条,并执行数据加载
#进入单据新增界面,默认当前年月,并加载当前年月的数据
def AfterCreateNewData(e):
    year=str(DateTime.Now.Year);
    month=str(DateTime.Now.Month);
    this.View.Model.SetValue("F_ora_Year",year,0);
    this.View.Model.SetValue("F_ora_Month",month,0);
    ShowProgressBar();#弹出进度条,并执行数据加载
 


       

场景2:自定义添加进度条提示,进度条出现时用户可以进行下一步操作

image.png

应用场景:

在动态表单界面(或者向导式操作界面)中,执行一项耗时任务时,例如:执行某种数据结算操作、批量生成单据、导入自定义Excel表数据等,可以利用配置进度条展示任务执行的进度。


此时,我们便可利用以下Python脚本配置进度条,让用户可以继续进行产品操作,又可以展示该耗时任务的执执行进展。


实现方式:

1.通过BOS开发动态表单操作界面,在界面中添加【进度条控件】:F_ora_ProgressBar

2.在界面中添加【标签控件】:FPercentLabel,用于显示进度条的进度值。

3.在表单插件中,根据实际功能逻辑处理,控制进度条显示,并反馈任务执行进度。

4.代码参考如下,在使用时,自定修改进度条标识和标签控件标识。


Python脚本表单插件模板参考如下:

#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('System')
clr.AddReference('System.Data')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
clr.AddReference('Kingdee.BOS.ServiceHelper')
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from System import *
from System.Data import *
from Kingdee.BOS.App.Data import *
from System.Collections.Generic import List;
from Kingdee.BOS.ServiceHelper import *;
from Kingdee.BOS.KDThread import *;

progressValue=0;#进度值全局变量
progressBar=None;#进度条控件
#执行任务的方法,在此方法里面这完成自定义的业务逻辑处理
def doSomeThing():
    global progressValue,progressBar;
    this.View.ShowMessage("XXXXXX");
    i=0;
    while(i<100):
        j=0;
        while(j<100*10000):
            j=j+1;
        i=i+1;
        progressValue=int(i);#将进度值更新到全局变量中
#子线程中出现了代码异常,会执行此方法
def showRslt(asynResult):
    if (asynResult <> None and asynResult.Exception <>None):
        this.View.ShowErrMessage(asynResult.Exception.Message);
#在初始化事件中 ,获取到界面的进度条控件
def OnInitialize(e):
    global progressBar;
    progressBar=this.View.GetControl[ProgressBar]("F_ora_ProgressBar");
#点击执行任务的按钮,触发任务执行,并启动进度条监控

#也可以根据 实际情况,用其他事件触发任务执行的动作
def ButtonClick(e):
    key=e.Key.ToUpper();
    if(key=="F_ora_Button".ToUpper()):
        global progressValue,progressBar;
        progressValue=0;
        progressBar.Start(1);#启动进度条监控
        MainWorker.QuequeTask(Action(doSomeThing),Action[AsynResult](showRslt));
        #this.View.ShowMessage("Test");
        #progressValue=100;
#定时询问进度值的事件,在此事件中反馈进度值,并用标签控件把百分比显示出来
def OnQueryProgressValue(e):
    key = e.Key;
    if (key == "F_ora_ProgressBar".ToUpperInvariant()):
        global progressValue,progressBar;
        e.Value = progressValue;
        this.View.GetControl("FPercentLabel").SetValue(("{0}{1}").format(e.Value,"%"));


==============================至此,分享结束=================================

【温馨提示】网页复制代码有格式问题,如需复制,请下载附件!



作者往期内容推荐:

Python动态表单插件-子页面关闭返回数据到父页面

https://vip.kingdee.com/article/291524092769768448?productLineId=1

 

Python表单插件-点击菜单弹出动态表单传递参数到子页面

https://vip.kingdee.com/article/291523970094684160?productLineId=1

 

Python表单插件直接SQL账表-表单插件中关键数据的获取方法

https://vip.kingdee.com/article/285470841159419392?productLineId=1

 

Python表单插件直接SQL账表-转换成单据

https://vip.kingdee.com/article/274209448334513408?productLineId=1

 

Python列表插件批量修改单据字段-进阶版

https://vip.kingdee.com/article/291170608069603584?productLineId=1

 

Python动态构建下拉列表-年份动态下拉选择

https://vip.kingdee.com/article/301688378930570752?productLineId=1

 

Python脚本各种应用场景设置颜色-整合介绍

https://vip.kingdee.com/article/298154365838782720?productLineId=1

 

Python开发简单账表

https://vip.kingdee.com/article/273864689480614144?productLineId=1

 

关于BOS中的标识、字段名、实体属性名的开发应用简介

https://vip.kingdee.com/article/283981316536560128?productLineId=1

 

Python单据转换插件示例-自定义单据下推付款单

https://vip.kingdee.com/article/271310474510186752?productLineId=1

 

Python脚本实现保存自动提交审核

https://vip.kingdee.com/article/157179291166940672?productLineId=1

 

Python服务插件推送云之家消息

https://vip.kingdee.com/article/268780660993811200?productLineId=1

 

Python获取财务报表平台的报表数据(支持自定义报表)

https://vip.kingdee.com/article/256749042355690496?productLineId=1

  

Python实现自定义单据选择往来单位银行信息

https://vip.kingdee.com/article/251000369826719488?productLineId=1

 

Python服务插件借助WebAPI实现基础资料审核后自动分配

https://vip.kingdee.com/article/250987583088513792?productLineId=1

 

Python获取当前用户对应的员工

https://vip.kingdee.com/article/158257867764321280?productLineId=1

 

Python显示单据体首行过滤

https://vip.kingdee.com/article/158239052469181952?productLineId=1

 

Python实现列表对暂存的单据批量保存

https://vip.kingdee.com/article/158234477305916928?productLineId=1

 

Python放开单据字段允许选择禁用/未审核的基础资料

https://vip.kingdee.com/article/157167808605429248?productLineId=1

 

Python实现单据批改(单据头字段)

https://vip.kingdee.com/article/157162374296835584?productLineId=1


发布于 金蝶云星空BOS开发交流圈 社群

赞 133