金蝶云星空Python插件例子

 使用http get进行操作的例子,包含请求和接收两部分

金蝶bos python开发gethttp的代码
#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference("System")
clr.AddReference("System.Web.Extensions")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Newtonsoft.Json")
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
import sys
from System import *
from System.Collections.Generic import *
from System.Threading import *
from System.IO import *
from System.Net import *
from System.Text import *
from System.Security.Cryptography import *
from System.Web.Script.Serialization import *
from System.Collections.Generic import Dictionary
from Newtonsoft.Json.Linq import *
 
 
def BarItemClick(e) :
	if e.BarItemKey=="SLJH_tbButton_2" :
        #例如我这边要get这个网址,auth_code主要是做服务器验证用的,防止恶意请求
		test = get("http://ltxsd.com:18000/api/cycle?auth_code=SECRET123")
        #这边是返回值信息
		this.View.ShowMessage(test)

#这个get函数	
def get(url):
	req = HttpWebRequest.Create(url);
	req.Method = "GET";
	rsp = req.GetResponse();
	stream = rsp.GetResponseStream();
	reader = StreamReader(stream, Encoding.GetEncoding("utf-8"));
	result = reader.ReadToEnd();
	return result

#get服务器
#python接受get的代码例子,这个案例中,通过get获取当前年份的周数,比如25年第9周,返回的就是2509
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
import datetime
from typing import Optional, Tuple
# 配置常量
CONFIG = {
    "PORT": 18000,
    "VALID_AUTH_CODES": {"SECRET123", "TOKEN456"},
    "API_ENDPOINT": "/api/cycle"
}
class CycleAPIHandler(BaseHTTPRequestHandler):
    """处理周期信息请求的HTTP处理器"""
    def _parse_auth_code(self) -> Tuple[Optional[str], Optional[int]]:
        """解析查询参数中的认证码"""
        query = urlparse(self.path).query
        params = parse_qs(query)
        if 'auth_code' not in params:
            return None, 400
        auth_codes = params['auth_code']
        if len(auth_codes) != 1:
            return None, 400
        return auth_codes[0], None
    def _generate_cycle_info(self) -> str:
        """生成当前周期信息"""
        current_date = datetime.datetime.now()
        year = current_date.isocalendar().year
        week_number = current_date.isocalendar().week
        # ISO 标准可能存在跨年周数,需要修正年份
        if current_date.month == 1 and week_number > 50:
            year -= 1
        elif current_date.month == 12 and week_number == 1:
            year += 1
        return f"{year % 100:02d}{week_number:02d}"
    def _send_text_response(self, status_code: int, data: str):
        """发送纯文本格式响应"""
        self.send_response(status_code)
        self.send_header("Content-type", "text/plain")
        self.end_headers()
        self.wfile.write(data.encode("utf-8"))
    def do_GET(self):
        """处理GET请求"""
        # 端点验证
        if urlparse(self.path).path != CONFIG["API_ENDPOINT"]:
            self._send_text_response(404, "Endpoint not found")
            return
        # 解析认证码
        auth_code, error_code = self._parse_auth_code()
        if error_code:
            self._send_text_response(error_code, "Missing auth_code parameter")
            return
        # 认证验证
        if auth_code not in CONFIG["VALID_AUTH_CODES"]:
            self._send_text_response(401, "Invalid authentication")
            return
        # 生成并返回周期信息
        try:
            cycle = self._generate_cycle_info()
            self._send_text_response(200, cycle)
        except Exception as e:
            self._send_text_response(500, f"Internal server error: {str(e)}")
def run_server(port: int = CONFIG["PORT"]):
    """启动HTTP服务器"""
    server_address = ("", port)
    httpd = HTTPServer(server_address, CycleAPIHandler)
    print(f"Server running on port {port}...")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("\nServer shutting down...")
        httpd.server_close()
if __name__ == "__main__":
    # 可以通过修改CONFIG配置不同环境参数
    run_server()

写入对应字段 ,如果有点击按钮就执行插入到指定字段,F_ORA_SRKHMC_83G1是我的字段名称

#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
from Kingdee.BOS.Core import *
def DataChanged(e):
#写入指定字段的值
    this.Model.SetValue("F_ORA_SRKHMC_83G1","测试信息数据");

通过sql语句更新数据 (一个通过SQL生成年+周数,并更新数据库的例子)

#表单插件执行更新的例子SQL语句前最好加一句/*dialect*/代表是使用mssql环境而非KSQL环境
#具体例子看这个老师的资料说明:https://vip.kingdee.com/link/s/ZzKXy
import clr
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS.App.Data import *
def BarItemClick(e):
#在列表点击任意按钮触发更新周期信息
#FAPPROVEDATE 审核日期
#F_SLJH_DATECODE_83G 周期
#F_ORA_COMBO_QTR 是否末道工序
	sql ="""/*dialect*/UPDATE b
		SET b.F_SLJH_DATECODE_83G = RIGHT(CAST(YEAR(a.FAPPROVEDATE) AS VARCHAR(4)), 2) + 
		RIGHT('0' + CAST(DATEPART(ISO_WEEK, a.FAPPROVEDATE) AS VARCHAR(2)), 2)
		FROM T_SFC_OPTRPT a
		LEFT JOIN T_SFC_OPTRPTENTRY b ON a.fid = b.fid
		WHERE b.F_SLJH_DATECODE_83G = '' 
		  AND a.FAPPROVEDATE > '2025-02-24' 
		  AND a.F_ORA_COMBO_QTR = '1';
		"""
	DBUtils.Execute(this.Context,sql);

#如果是select的方式进行查询数据,那么就改为:DBUtils.ExecuteScalar(this.Context,sql,None);
#主要就是ExecuteScalar和Execute的区别
/*
在金蝶云星空的DBUtils类中,ExecuteScalar和Execute是两个常用的方法,但它们在用途和返回值方面有显著区别。以下是对两者的详细解释和区别:

DBUtils.ExecuteScalar
用途:
ExecuteScalar用于执行查询语句(如SELECT语句),并返回查询结果的第一行第一列的值。
常用于需要返回单个值的情况,例如查询计数、求和等聚合函数的结果。
返回值:
返回查询结果的第一行第一列的值。如果查询结果为空,可以设置一个默认值来替代返回的空值。
示例:
sql = "SELECT COUNT(*) FROM T_SFC_OPTRPT WHERE FAPPROVEDATE > '2025-02-24'"
count = DBUtils.ExecuteScalar(this.Context, sql, 0)
这段代码会返回满足条件的记录数,如果没有任何记录,则返回默认值0。
DBUtils.Execute
用途:
Execute用于执行不需要返回数据的语句,如DDL(数据定义语言)、UPDATE、DELETE语句。
常用于执行更新、删除操作或创建表等操作。
返回值:
返回值为影响的行数。即执行操作后,有多少行数据受到了影响。
*/

读取列表字段内容进行判断:

import clr
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS.App.Data import *
def BarItemClick(e):
	#如果是条码打印按钮
	if e.BarItemKey=="tbBarCodePrint" :
		this.ListModel;#获取列表数据模型
		selectedRowsInfo = this.ListView.SelectedRowsInfo;
		datas = this.ListModel.GetData(selectedRowsInfo);
		for row in datas:
	        sfmdgj=row["F_ora_Combo_qtr"];#是否末道工序字段
			if 	sfmdgj=='1':  #1=是 0=否
              #如果字段内容匹配,就进一步执行动作

BOS平台使用sql读取返回值:

import clr
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS.App.Data import *

def BarItemClick(e):
    if e.BarItemKey == "tbtbgylx":
        sql = "/*dialect*/select b.FName from T_ENG_ROUTE a left join T_ENG_ROUTE_L b on                         
        a.fid=b.fid where b.fid=119098"
        #如果是int类返回值,使用(this.Context, sql,0)
        #如果是nvarchar类返回值,使用(this.Context, sql,None)
        FMATERIAL = DBUtils.ExecuteScalar(this.Context, sql,None)
        this.View.ShowMessage(FMATERIAL)

 

金蝶云星空使用python插件直接更新数据

### Python金蝶云星空集成的SDK及相关开发资料 #### 背景介绍 金蝶云星空作为一款企业级管理软件,提供了丰富的API接口支持开发者通过编程方式与其交互。对于Python开发者而言,可以通过官方或第三方提供的SDK来简化与金蝶云星空系统的集成过程。 --- #### 官方及社区资源概述 1. **金蝶云K3Cloud WebAPI开发实例** 该资源包涵盖了金蝶云6.x至7.x版本的WebAPI应用开发实例[^1]。它不仅适用于不同版本的需求场景,还包含了详细的代码和技术指导,能够帮助开发者快速掌握如何基于WebAPI进行开发工作。此资源可以从以下链接获取: [项目地址](https://gitcode.com/open-source-toolkit/5939b) 2. **Python金蝶云星空WebAPI SDK新手指南** 社区提供了一个针对Python初学者的快速入门指南[^2]。其中提到安装方法如下: ```bash pip install F:\Python\k3cloud_webapi_sdk-1.0.0-py3-none-any.whl ``` 这一工具包封装了许多常用的API调用逻辑,使得开发者可以更高效地完成诸如数据查询、业务操作等功能。 3. **优快云课程——Python办公自动化系列之金蝶K3自动登录** 此教程分为两部分[^3],分别讲解了如何利用Python脚本实现金蝶K3 Wise客户端的自动登录功能。虽然主要面向桌面端的应用程序控制,但对于理解整个生态体系下的技术栈仍然具有一定的参考价值。 4. **金蝶云星空Python插件开发案例** 插件开发允许用户自定义扩展系统行为,在某些特定场合下非常有用[^4]。例如下面这段简单的代码展示了如何向某个字段赋值并触发事件处理函数`DataChanged()`: ```python # 引入CLR运行库以及必要的组件引用 import clr clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.Core') from Kingdee.BOS.Core import * def DataChanged(e): # 设置目标字段的新值 this.Model.SetValue("F_ORA_SRKHMC_83G1", "测试信息数据") ``` --- #### 集成示例分析 以下是几个典型的Python金蝶云星空集成的例子: ##### 数据读取与更新 假设我们需要定期同步数据库中的客户列表到外部系统,则可通过RESTful API发起请求完成此项任务。具体流程可能涉及以下几个方面: - 构建HTTP头携带认证令牌; - 发送GET请求检索所需记录集合; - 解析返回JSON对象提取关键属性; - 将结果保存回本地存储或者进一步加工后再提交给其他服务端点。 示例代码片段如下所示: ```python import requests from urllib.parse import urljoin base_url = 'http://your.kingdee.cloud/api/' auth_token = 'YOUR_ACCESS_TOKEN' headers = { 'Authorization': f'Bearer {auth_token}', 'Content-Type': 'application/json' } response = requests.get(url=urljoin(base_url, '/customers'), headers=headers) if response.status_code == 200: customers_data = response.json() for customer in customers_data['items']: print(f"{customer['name']} - {customer['id']}") else: raise Exception(f'Request failed with status code {response.status_code}') ``` ##### 自动化任务调度 借助定时器模块安排周期性的作业计划,比如每天凌晨两点钟批量导入前一天产生的销售订单详情表单进入ERP核心账套之中去。这里推荐使用APScheduler框架配合上述提及过的SDK一起运作起来更加顺畅一些。 配置样例如下: ```python from apscheduler.schedulers.background import BackgroundScheduler from k3cloud_webapi_sdk.client import K3CloudClient def sync_sales_orders(): client = K3CloudClient(auth_config={'token': auth_token}) orders_to_sync = fetch_pending_orders_from_external_system() # 假设存在这样一个辅助方法 try: result = client.create_or_update_records(model='SalesOrder', records=orders_to_sync) log_success(result) except Exception as ex: log_failure(ex) sched = BackgroundScheduler(daemon=True) job_id = sched.add_job(sync_sales_orders, trigger='cron', hour=2).id print(f'Scheduled job "{job_id}" to run daily at 2 AM.') sched.start() try: while True: pass except (KeyboardInterrupt, SystemExit): sched.shutdown(wait=False) ``` --- #### 总结说明 综上所述,无论是基础层面的数据交换还是高级别的定制化解决方案设计,都可以依托现有的开源项目成果降低学习门槛的同时提高工作效率。希望以上分享的内容能对你有所帮助! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值