金蝶K3Cloud的Python插件写法

金蝶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管理后台进行插件配置:

  1. 进入【系统管理】→【插件管理】
  2. 新增插件,填写插件信息
  3. 上传插件文件
  4. 配置插件参数

6.2 表单绑定

在表单属性中绑定插件:

  1. 进入【系统管理】→【动态表单开发】
  2. 编辑表单属性
  3. 在插件列表中添加已注册的插件

七、调试方法

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

九、注意事项

  1. 性能优化:避免在循环中频繁访问数据库
  2. 异常处理:对可能出错的操作进行异常捕获
  3. 事务管理:涉及多表操作时注意事务控制
  4. 权限控制:考虑用户的操作权限
  5. 日志记录:关键操作应记录日志便于排查问题
  6. 版本兼容:注意K3Cloud版本升级对插件的影响

十、参考资源

  • K3Cloud插件开发文档
  • 金蝶社区技术文章


作者: CLP ; 日期: 2022-9-15 ; 地点: 武汉; 天气: 晴

QQ: 53258372; Mail : 53258372@QQ.com

微信: image-20220903114619121