本文介绍了在金蝶云·星空产品中,通过Python表单插件实现进度条添加的两种技巧,以优化长时间处理业务或加载数据时的用户体验。第一种是弹出式进度条加载提示,适用于需要屏蔽用户操作的场景,如单据录入时加载大量数据。第二种是自定义添加进度条提示,允许用户进行下一步操作,同时展示任务执行进度。文章详细说明了Python脚本的配置方法,包括进度条控件的添加、任务执行逻辑的处理以及进度值的更新等,并提供了代码示例和参考链接。
在实际应用中,经常会遇到需要花费较长时间处理业务或者加载数据的场景。比如:执行某种数据结算操作、批量生成单据、导入自定义Excel表数据等等。
在这些场景中,如果耗时过长,就会出现系统"卡死",甚至响应超时的现象,对用户体验非常不友好。此时,如果能显示进度条,在避免页面响应超时的同时,也能给用户更好的交互体验。
接下来,以金蝶云·星空产品为例,给大家介绍通过Python表单插件完成2种进度添加方式的技巧,通过Python脚本可以形成一个"固定模式的代码套用框架",快速复用到多个功能里面。
场景1:弹出式进度条加载提示,进度条出现时用户不可进行下一步操作
应用场景:
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:自定义添加进度条提示,进度条出现时用户可以进行下一步操作
应用场景:
在动态表单界面(或者向导式操作界面)中,执行一项耗时任务时,例如:执行某种数据结算操作、批量生成单据、导入自定义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
Python插件-进度条使用参考代码.rar(2.48KB)
发布于 金蝶云星空BOS开发交流圈 社群
推荐阅读