金蝶云星空企业版 Golang SDK,通过webapi实现。在金蝶云星空企业版8.x版本测试通过。
- 内置30+操作方法
- 可直接根据服务名请求
- 支持三种登录方式
- 支持定时刷新session
- 支持被动刷新session
- 可后置登录接口
- 可使用池并发执行
go get github.com/deep-project/kingdeepackage main
import (
"fmt"
"github.com/deep-project/kingdee"
"github.com/deep-project/kingdee/adapters"
)
func main() {
cli, err := kingdee.New("http://127.0.0.1:9010/K3Cloud/", &adapters.LoginBySign{
AccountID: "ACCOUNT_ID",
Username: "USER_NAME",
AppID: "APP_ID",
AppSecret: "APP_SECRET",
LanguageID: "LANGUAGE_ID",
})
if err != nil {
return
}
raw, err := cli.View("STK_InStock", map[string]any{"Number": "CGRK00019"})
if err != nil {
return
}
fmt.Println(string(raw))
}基本上内置了大部分方法,如果有缺失或新需求,可以提pr,也可以告诉我加上。也可以看下面的“直接根据服务名称调用”
// 获取账套列表(获取数据中心列表)
cli.GetDataCenterList()
// 查看
cli.View(formid string, data any)
// 保存
cli.Save(formid string, data any)
// 批量保存
cli.BatchSave(formid string, data any)
// 弹性域保存
cli.FlexSave(formid string, data any)
// 暂存
cli.Draft(formid string, data any)
// 删除
cli.Delete(formid string, data any)
// 提交
cli.Submit(formid string, data any)
// 审核
cli.Audit(formid string, data any)
// 反审核
cli.UnAudit(formid string, data any)
// 下推
cli.Push(formid string, data any)
// 撤销
cli.CancelAssign(formid string, data any)
// 单据查询
cli.ExecuteBillQuery(data any)
// 单据查询(json)
cli.BillQuery(data any)
// 操作
cli.ExecuteOperation(formid string, operateNumber string, data any)
cli.ExcuteOperation(formid string, operateNumber string, data any)
// 元数据查询(查询单据信息)
cli.QueryBusinessInfo(data any)
// 工作流审批
cli.WorkflowAudit(data any)
// 切换组织
cli.SwitchOrg(data any)
// 上传附件
cli.AttachmentUpLoad(data any)
// 下载附件
cli.AttachmentDownLoad(data any)
// 分配
cli.Allocate(formid string, data any)
// 取消分配
cli.CancelAllocate(formid string, data any)
// 拆单
cli.Disassembly(formid string, data any)
// 分组保存
cli.GroupSave(formid string, data any)
// 分组信息查询
cli.QueryGroupInfo(formid string, data any)
// 分组删除
cli.GroupDelete(formid string, data any)
// 查询报表数据
cli.GetSysReportData(formid string, data any)
// 发送消息
cli.SendMsg(data any)
// 获取即时库存(官方自定义版本)
cli.GetInventoryData(data any)import (
"github.com/deep-project/kingdee/pkg/methods"
)
m := methods.New(client)
// 根据附件ID下载附件 (内部实现了轮询逻辑)
m.AttachmentDownLoad(fileId string)
// 通用单据列表查询 (内部实现了翻页逻辑)
m.BillQuery(opt methods.BillQueryOptions)
methods.BillQuery[T](m, opt) // 可以自定义返回列表的类型如果内置方法无法满足需求,亦可以直接通过服务名请求结果。
cli.Core.Call("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.CancelAllocate.common.kdsvc" , map[string]any{"data": data})官方推荐的是sign登录方式,更安全。
&adapters.LoginBySign{
AccountID: "ACCOUNT_ID",
Username: "USER_NAME",
AppID: "APP_ID",
AppSecret: "APP_SECRET",
LanguageID: "LANGUAGE_ID",
}&adapters.LoginByAppSecret{
AccountID: "ACCOUNT_ID",
Username: "USER_NAME",
AppID: "APP_ID",
AppSecret: "APP_SECRET",
LanguageID: "LANGUAGE_ID",
}&adapters.LoginByValidateUser{
AccountID: "ACCOUNT_ID",
Username: "USER_NAME",
Password: "USER_PASSWORD",
LanguageID: "LANGUAGE_ID",
}可设置每隔多久刷新一次session,防止过期。默认15分钟(因为金蝶服务端默认20分钟过期),可以在配置设置。根据金蝶内部规则,如果20分钟内请求不闲置的话,session是会自动续期的。但以防万一,启用定时刷新更保险一些。
cli, _ := kingdee.New("http://127.0.0.1:9010/K3Cloud/", &adapters.LoginBySign{})
// 每30分钟刷新一次session
cli.Core.SetRefreshSessionInterval(30 * time.Minute)如果访问接口发现已经过期,则刷新session再次请求。默认重试1次,可以在配置设置。
cli, _ := kingdee.New("http://127.0.0.1:9010/K3Cloud/", &adapters.LoginBySign{})
// 过期时重试3次
cli.Core.SetSessionExpiredRetryCount(3)如果初始需要通过免登录的GetDataCenterList()接口获取账套列表,可以先不设置登录接口,拿到账套信息后再设置
cli, _ := kingdee.New("http://127.0.0.1:9010/K3Cloud/",nil)
// 先获取账套信息
accountInfoBytes,_ :=cli.GetDataCenterList()
// 再用完善的信息设置登录接口
cli.Core.SetSession(&adapters.LoginByValidateUser{
AccountID: "ACCOUNT_ID",
Username: "USER_NAME",
Password: "USER_PASSWORD",
LanguageID: "LANGUAGE_ID",
})
// 进行其他操作
cli.View("STK_InStock", map[string]any{"Number": "CGRK00019"})因为金蝶云星空的请求默认是同步模式,也就是说,一个session多次访问时,是同步请求,所以要实现并发执行,就要创建多个client携带不同的session去请求。
import (
"sync"
"github.com/deep-project/kingdee"
"github.com/deep-project/kingdee/adapters"
"github.com/deep-project/kingdee/pkg/client"
"github.com/deep-project/kingdee/pkg/pool"
)
func main() {
// 创建5个客户端
// 金蝶建议的并发是3-5个
baseURL := "http://127.0.0.1:9010/K3Cloud/"
client_1, _ := kingdee.New(baseURL, &adapters.LoginBySign{})
client_2, _ := kingdee.New(baseURL, &adapters.LoginBySign{})
client_3, _ := kingdee.New(baseURL, &adapters.LoginBySign{})
client_4, _ := kingdee.New(baseURL, &adapters.LoginBySign{})
client_5, _ := kingdee.New(baseURL, &adapters.LoginBySign{})
var p = pool.New([]*client.Client{client_1, client_2, client_3, client_4, client_5})
defer p.Close()
var wg sync.WaitGroup
for range 100 {
wg.Add(1)
go func() {
defer wg.Done()
// 只有存在空闲client时,才会被Get到
// 否则会停在这里等待
client := p.Get()
// 用完必须归还,否则资源耗尽程序卡死
defer p.Put(client)
// 调用金蝶接口
client.View("STK_InStock", map[string]any{"Number": "CGRK00019"})
}()
}
wg.Wait()
}import (
"sync"
"github.com/deep-project/kingdee"
"github.com/deep-project/kingdee/adapters"
"github.com/deep-project/kingdee/pkg/client"
"github.com/deep-project/kingdee/pkg/pool"
)
func main() {
// 一次性创建5个client池
p,_ := pool.NewBySize(5, func(i int) (*client.Client, error) {
return kingdee.New("http://127.0.0.1:9010/K3Cloud/", &adapters.LoginBySign{})
})
defer p.Close()
var wg sync.WaitGroup
for range 100 {
wg.Add(1)
go func() {
defer wg.Done()
// 只有存在空闲client时,才会被Get到
// 否则会停在这里等待
client := p.Get()
// 用完必须归还,否则资源耗尽程序卡死
defer p.Put(client)
// 调用金蝶接口
client.View("STK_InStock", map[string]any{"Number": "CGRK00019"})
}()
}
wg.Wait()
}