[K/3Cloud]K3Cloud平台开发之Python插件
有时候我们的表单可能很简单,只是一个简单交互的表单,但有可能还是要劳师动众的给它建个工程写个插件,是不是很不爽?例如我有如下一个表单:

功能很简单就是选个业务对象,收集绑定几个字段名,然后确定返回一个对象而已。我不想写插件,因为K3Cloud是基于.net 4.0的,它对动态语言有了支持,于是我选择使用python来实现这个简单逻辑,以下是我的py插件,有注释,小伙伴们应该读得懂:
#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.K3.Core')
clr.AddReference('LUTAI.K3.BOS.Core')
clr.AddReference('Kingdee.BOS.ServiceHelper')
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from Kingdee.BOS import *
from Kingdee.BOS.Util import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from Kingdee.BOS.Core.Interaction import *
from Kingdee.BOS.Core.Metadata import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Metadata.FieldElement import *
from Kingdee.BOS.ServiceHelper import *
from Kingdee.K3.Core import *
from LUTAI.K3.BOS.Core import *
from LUTAI.K3.BOS.Core.Metadata.Operation import *
from System import *
from System.Collections.Generic import *
#这里是重载cloud插件模型的按钮点击事件,其它事件的重写也一样
def ButtonClick(e):
if e.Key=="FOK":
#这里是实例化C#中的实体对象
selParams = BatchEditBomOpParams();
#这里就是取表单模型里某字段的模型对象了
selFormIdField = this.View.BillBusinessInfo.GetField("FSelFormId");
mtrlFieldKeyField = this.View.BillBusinessInfo.GetField("FMtrlIdFieldKey");
auxPropIdFieldKeyField = this.View.BillBusinessInfo.GetField("FAuxPropIdFieldKey");
bomIdFieldKeyField = this.View.BillBusinessInfo.GetField("FBomIdFieldKey");
#从模型取值赋值给C#实体对象
selParams.FormId=selFormIdField.RefIDDynamicProperty.GetValue(this.Model.DataObject);
selParams.MaterialIdFieldKey=mtrlFieldKeyField.DynamicProperty.GetValue(this.Model.DataObject);
selParams.AuxPropIdFieldKey=auxPropIdFieldKeyField.DynamicProperty.GetValue(this.Model.DataObject);
selParams.BomIdFieldKey=bomIdFieldKeyField.DynamicProperty.GetValue(this.Model.DataObject);
if len(selParams.FormId)<=0:
this.View.ShowMessage("表单对象字段必录!");
return;
if len(selParams.MaterialIdFieldKey)<=0:
this.View.ShowMessage("成品编码字段必录!");
return;
if len(selParams.BomIdFieldKey)<=0:
this.View.ShowMessage("BOM版本字段必录!");
return;
this.View.ReturnToParentWindow(selParams);
this.View.Close();
def DataChanged(e):
if e.Key=="FSelFormId":
if len(e.NewValue)>0:
#这里要注意的是,使用this.Context获取上下文,不要使用this.View.get_Context(),这是智能感知的,被害死了
metadata = MetaDataServiceHelper.Load(this.Context, e.NewValue);
lstMtrlFieldItems = List[EnumItem]();
lstAuxPropIdFieldItems = List[EnumItem]();
lstBomIdFieldItems = List[EnumItem]();
lstAuxPropIdFieldItems.Add(EnumItem());
if e.NewValue == "ENG_BOM":
enumItem=EnumItem();
enumItem.Caption=LocaleValue("物料清单内码", this.Context.UserLocale.LCID);
enumItem.Value=metadata.BusinessInfo.GetForm().PkFieldName;
enumItem.Seq=0;
enumItem.EnumId=Guid.NewGuid().ToString();
lstBomIdFieldItems.Add(enumItem);
iFlag = 0;
for field in metadata.BusinessInfo.GetFieldList():
enumItem2 = EnumItem();
enumItem2.Seq = iFlag;
enumItem2.Caption = field.Name;
enumItem2.Value = field.Key;
enumItem2.EnumId = Guid.NewGuid().ToString();
iFlag=iFlag+1;
if isinstance(field,BaseDataField):
lookupObjId = field.LookUpObject.FormId;
if lookupObjId=="ENG_BOM":
lstBomIdFieldItems.Add(enumItem2);
if lookupObjId=="BD_MATERIAL":
lstMtrlFieldItems.Add(enumItem2);
if isinstance(field,RelatedFlexGroupField):
lstAuxPropIdFieldItems.Add(enumItem2);
if lstMtrlFieldItems.Count>0:
fieldEditor = this.View.GetControl("FMtrlIdFieldKey");
fieldEditor.SetComboItems(lstMtrlFieldItems);
this.Model.SetValue("FMtrlIdFieldKey",lstMtrlFieldItems[0].Value);
if lstAuxPropIdFieldItems.Count>0:
fieldEditor = this.View.GetControl("FAuxPropIdFieldKey");
fieldEditor.SetComboItems(lstAuxPropIdFieldItems);
this.Model.SetValue("FAuxPropIdFieldKey",lstAuxPropIdFieldItems[0].Value);
if lstBomIdFieldItems.Count>0:
fieldEditor = this.View.GetControl("FBomIdFieldKey");
fieldEditor.SetComboItems(lstBomIdFieldItems);
this.Model.SetValue("FBomIdFieldKey",lstBomIdFieldItems[0].Value);
如果没有LUTAI.K3.BOS.Core.DLL文件的话,可能会报错:Could not add reference to assembly LUTAI.K3.BOS.Core,可以先删掉。
我顺便发个py编译的小工具,小工具依赖cloud产品类库,所以请放到ide临时目录里执行或者website\bin目录下执行,本来让sp2在这个编辑窗口上加个编译按钮,常见的语法错误都能查出来,不知sp2出来后为啥没有,可能是在3.0里做了。
LUTAI.Tools.IronPythonCheckTool.exe
[K/3Cloud]K3Cloud平台开发之Python插件的更多相关文章
- 【原】K3Cloud平台开发之Python插件
有时候我们的表单可能很简单,只是一个简单交互的表单,但有可能还是要劳师动众的给它建个工程写个插件,是不是很不爽?例如我有如下一个表单: 功能很简单就是选个业务对象,收集绑定几个字段名,然后确定返回一个 ...
- [K/3Cloud]K3Cloud的移动审批方面
基于最新的K3Cloud2的SP2,当前K3Cloud上所有的工作流都可以在移动手机上进行移动审批,具体如下: K/3 Cloud 支持移动审批,支持安卓和IOS. 关于申请试用: 1.打开浏览器,进 ...
- 企业级监控平台开发之nagios二次开发(七)
背景: A公司里有很多服务器(>3000台),每台服务器都有不同的用途,如DB Server.WEB Server.ESXI等,每个组使用其中的一批,每个组可能有多个服务器管理员.现在问题出来了 ...
- Java微信公众平台开发之OAuth2.0网页授权
根据官方文档点击查看在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修 ...
- Python自动化开发之python的常用模块
python常用模块 模块的种类:模块分为三种,分别是自定义模块:内置标准模块(即标准库):开源模块(第三方). 以下主要研究标准模块即标准库:标准库直接导入即可,不需要安装. 时间模块:time , ...
- 前端开发之Chrome插件
Postman - REST Client Postman是Ajax开发的神器,对于Restful开发方式特别有帮助,可以用来模拟各种请求来测试API的正确性,比如用来模拟Ajax请求.它还支持认证, ...
- Vim下的Web开发之html,CSS,javascript插件
Vim下的Web开发之html,CSS,javascript插件 HTML 下载HTML.zip 解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vi ...
- 谷歌插件Image downloader开发之popup
Image downloader的交互逻辑是这样的:用户点击Image downloader的图标,会向页面(content script,见上一篇文章:谷歌插件Image downloader开发之 ...
- 插件开发之360 DroidPlugin源码分析(五)Service预注册占坑
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broa ...
随机推荐
- robotframework - Edit编辑器
1.测试项目&套件 提供的Edit编辑器 2.在 Edit 标签页中主要分:加载外部文件.定义内部变量.定义元数据等三个部分. (1):加载外部文件Add Library:加载测试库,主要是[ ...
- 二分搜索 POJ 3273 Monthly Expense
题目传送门 /* 题意:分成m个集合,使最大的集合值(求和)最小 二分搜索:二分集合大小,判断能否有m个集合. */ #include <cstdio> #include <algo ...
- 倒计时和div幻灯片
倒计时从10秒开始,10秒之后,同意按钮可以使用. 设置一个区域背景,三张照片滚动显示,左右按钮可以下一张上一张,如果点击了左右按钮就不再自动滚动.
- Jquery 全选、反选问题的记录
<div id="list"> <ul id="choseList" > <li><input type=" ...
- leetcode486 Predict the Winner
思路: 博弈. 实现: class Solution { public: bool PredictTheWinner(vector<int>& nums) { ][]; int n ...
- 在Redux中使用插件createAction之后
我们知道在React的Redux的中的action在项目开发过程中,一般时使用createAction来生成 举个栗子,小李子: const createTodo=createACtion('CREA ...
- Learning Face Age Progression: A Pyramid Architecture of GANs
前言 作为IP模式识别的CNN初始模型是作为单纯判别式-模式识别存在的,并以此为基本模型扩展到各个方向.基本功能为图像判别模型,此后基于Loc+CNN的检测模型-分离式.end2end.以及MaskC ...
- Layui数据表单的编辑
使用layui对单元格进行编辑并保存 先是要引入layui的JS和CSS 然后创建一个表格 而重要的是edit这个属性,只有使用了这个属性的一列数据表格才可以编辑,其余的都不可以进行编辑 然后使用la ...
- js继承的方式
深入理解继承的实现方式不仅仅有利于自己去造轮子,封装插件,更有利于我们去阅读一些框架的源码, 以下记录几种常见的继承方式 1. 原型链实现继承 function Father(){ this.name ...
- lombok无法解析log
首先确认开发工具是否安装lombok,已安装的话打开lombok插件页,选择update, 然后重启idea.