金蝶云星空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=否
              #如果字段内容匹配,就进一步执行动作

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

### 关于金蝶云星空系统附件菜单配置的方法 在金蝶云星空系统中,附件管理功能对于业务流程的支持至关重要。为了确保文档和数据的有效关联以及提高工作效率,正确配置附件菜单显得尤为重要。 #### 1. 进入设置界面 登录到金蝶云星空平台后,在左侧导航栏找到并点击【基础资料】选项卡下的【公共参数】模块进入相应页面[^3]。 #### 2. 启用附件上传功能 在公共参数列表里定位至“是否允许上传文件”这一项,并将其状态更改为启用模式。这一步骤决定了整个系统内能否正常使用附件上传的功能[^4]。 #### 3. 定制化配置附件属性 通过访问具体业务对象(如销售订单、采购合同等),可以在其详情页下方发现名为“更多”的按钮;点击该按钮会展开一系列附加选项,其中就包含了对当前记录所附带文件的操作入口——即“附件”。此时可以进一步自定义这些文件夹名称及其显示顺序等内容[^5]。 #### 4. 设置权限控制 考虑到不同角色可能拥有不同的查看/编辑权利需求,因此还需要针对特定岗位设定相应的读写权限。此过程通常是在安全中心完成,通过对用户组赋予适当级别的许可来达成目的[^6]。 ```python # Python伪代码示例展示如何模拟上述某些配置动作 def enable_attachment_upload(system_config): system_config['allow_file_upload'] = True def customize_attachment_properties(business_object, properties): business_object.set_attachments(properties) def set_permission(role_group, permission_level): role_group.assign(permission_level) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值