金蝶K3Cloud Python插件写法
一、背景
金蝶K3Cloud支持使用Python语言开发插件,本文记录Python插件的编写方法。
二、插件结构
2.1 基础插件类
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlEventArgs import *
class MyPlugin(AbstractDynamicFormPlugin):
pass
2.2 插件方法
class MyPlugin(AbstractDynamicFormPlugin):
def OnLoad(self, e):
"""表单加载事件"""
pass
def OnShowInitialize(self, e):
"""初始化显示事件"""
pass
def DataChanged(self, e):
"""数据变更事件"""
pass
def BeforeDoOperation(self, e):
"""操作前事件"""
pass
def AfterDoOperation(self, e):
"""操作后事件"""
pass
三、常见业务场景
3.1 获取字段值
def get_field_value(self, field_key):
"""获取字段值"""
return self.Model.GetValue(field_key)
def set_field_value(self, field_key, value):
"""设置字段值"""
self.Model.SetValue(field_key, value)
3.2 触发重新计算
def recalculate(self, field_key):
"""触发字段重新计算"""
this.View.InvokeFieldUpdateService(field_key, this.View.Model.PrimaryKeyValue)
3.3 设置字段可用性
def set_field_enabled(self, field_key, enabled):
"""设置字段可用性"""
this.View.GetControl(field_key).Enabled = enabled
def set_field_visibility(self, field_key, visible):
"""设置字段可见性"""
this.View.GetControl(field_key).Visible = visible
3.4 弹出消息
def show_message(self, msg):
"""显示消息"""
this.View.ShowMessage(msg)
def show_warnning(self, msg):
"""显示警告"""
this.View.ShowWarnningMessage(msg)
3.5 刷新数据
def refresh(self):
"""刷新数据"""
this.Model.DataChanged()
this.View.UpdateView()
四、数据库操作
4.1 查询数据
from Kingdee.BOS.Core.SqlBuilder import *
from Kingdee.BOS.App.Data import *
def query_data(self, sql, parameters=None):
"""执行SQL查询"""
builder = QueryObjectBean(sql)
if parameters:
for key, value in parameters.items():
builder.AddSelectPara(key, value)
return builder.Execute(this.Context)
4.2 执行SQL
def execute_sql(self, sql, parameters=None):
"""执行SQL语句"""
return this.DBExecutor.Execute(sql, parameters, this.Context)
五、事件处理
5.1 按钮点击事件
def BarItemClick(self, e):
"""工具栏按钮点击"""
if e.BarItemKey == "MyButton":
self.process_button_click()
def process_button_click(self):
"""处理按钮点击逻辑"""
# 获取选单数据
selected_rows = this.View.GetSelectedRowIndexes()
if not selected_rows:
this.View.ShowWarnningMessage("请选择数据!")
return
# 执行处理逻辑
for row in selected_rows:
# 处理每一行数据
pass
# 刷新数据
this.View.Refresh()
5.2 字段变更事件
def DataChanged(self, e):
"""数据变更事件"""
field_key = e.Field.Key
if field_key == "FMaterialId":
material_id = self.Model.GetValue("FMaterialId")
if material_id:
self.on_material_changed(material_id)
elif field_key == "FQty":
qty = self.Model.GetValue("FQty")
price = self.Model.GetValue("FPrice")
if qty and price:
amount = qty * price
self.Model.SetValue("FAmount", amount)
def on_material_changed(self, material_id):
"""物料变更处理"""
# 获取物料信息
# 设置默认仓库
# 设置默认单位
pass
六、插件注册
6.1 插件配置
在K3Cloud管理后台进行插件配置:
- 进入【系统管理】→【插件管理】
- 新增插件,填写插件信息
- 上传插件文件
- 配置插件参数
6.2 表单绑定
在表单属性中绑定插件:
- 进入【系统管理】→【动态表单开发】
- 编辑表单属性
- 在插件列表中添加已注册的插件
七、调试方法
7.1 日志输出
import logging
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def debug_log(self, message):
"""输出调试日志"""
logger.info(message)
7.2 常见错误处理
try:
# 业务逻辑
pass
except Exception as ex:
this.View.ShowWarnningMessage(f"操作失败:{str(ex)}")
logger.error(f"Error: {str(ex)}")
八、实战示例
8.1 自动填充销售订单信息
class AutoFillSaleOrderPlugin(AbstractDynamicFormPlugin):
def DataChanged(self, e):
if e.Field.Key == "FCustomerId":
customer_id = self.Model.GetValue("FCustomerId")
if customer_id:
self.auto_fill_customer_info(customer_id)
def auto_fill_customer_info(self, customer_id):
"""自动填充客户信息"""
# 查询客户联系人
sql = "SELECT FCONTACT, FPHONE FROM T_BD_CUSTOMER WHERE FCUSTID = @CustId"
result = this.DBExecutor.Select(sql, {"CustId": customer_id}, this.Context)
if result and len(result) > 0:
self.Model.SetValue("FContact", result[0]["FCONTACT"])
self.Model.SetValue("FPhone", result[0]["FPHONE"])
8.2 校验数据唯一性
def check_unique(self, table_name, field_name, field_value, exclude_id=None):
"""检查数据唯一性"""
sql = f"SELECT COUNT(*) FROM {table_name} WHERE {field_name} = @Value"
params = {"Value": field_value}
if exclude_id:
sql += " AND FId != @ExcludeId"
params["ExcludeId"] = exclude_id
result = this.DBExecutor.ExecuteScalar(sql, params, this.Context)
return result == 0
九、注意事项
- 性能优化:避免在循环中频繁访问数据库
- 异常处理:对可能出错的操作进行异常捕获
- 事务管理:涉及多表操作时注意事务控制
- 权限控制:考虑用户的操作权限
- 日志记录:关键操作应记录日志便于排查问题
- 版本兼容:注意K3Cloud版本升级对插件的影响
十、参考资源
- K3Cloud插件开发文档
- 金蝶社区技术文章
作者: CLP ; 日期: 2022-9-15 ; 地点: 武汉; 天气: 晴
QQ: 53258372; Mail : 53258372@QQ.com
微信:
