金蝶云星空API调用实践

SDK的方式没法在NetCore平台中使用。所以就采用了最原始的HTTP访问调用来实现,具体如下:

1、设定接口IK3CloudApi,IAfterK3CloudApi(有需要的可以自行扩展与实现)

 public interface IK3CloudApi
    {
        /// <summary>
        /// 开启新实例
        /// </summary>
        /// <returns></returns>
        IK3CloudApi StartNew();

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Save(string formid, string data);

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Save<T>(string formid, SaveParam<T> data, JsonSerializerSettings jsonSerializerSettings = default) where T : class;

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        IK3CloudApi BatchSave(string formid, string data);

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        IK3CloudApi BatchSave<T>(string formid, BatchSaveParam<T> data, JsonSerializerSettings jsonSerializerSettings = default) where T : class;

        /// <summary>
        /// 执行审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Audit(string formid, string data);

        /// <summary>
        /// 执行审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Audit(string formid, OperationParam data, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行反审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi UnAudit(string formid, string data);

        /// <summary>
        /// 执行反审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi UnAudit(string formid, OperationParam data, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行提交
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Submit(string formid, string data);

        /// <summary>
        /// 执行提交
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Submit(string formid, OperationParam data, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行删除
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Delete(string formid, string data);

        /// <summary>
        /// 执行删除
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Delete(string formid, OperationParam data, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行下推
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Push(string formid, string data);

        /// <summary>
        /// 执行下推
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Push(string formid, PushParam data, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行操作
        /// </summary>
        /// <returns></returns>
        IK3CloudApi ExcuteOperation(string formid, string opNumber, string data);

        /// <summary>
        /// 随后执行
        /// </summary>
        /// <returns></returns>
        IAfterK3CloudApi After();

        /// <summary>
        /// 执行
        /// </summary>
        /// <param name="resultCallback">回调方法</param>
        /// <returns></returns>
        Task<MessageResult> SendAsync(Func<CloudCallBack, bool> resultCallback = null);

        /// <summary>
        /// 执行
        /// </summary>
        /// <param name="resultCallback">回调方法</param>
        /// <returns></returns>
        MessageResult Send(Func<CloudCallBack, bool> resultCallback = null);
    }

其中随后执行是为了满足 单据审核时 需要先调用提交动作 而产生的,具体如下:

随后执行 目前只支持通过formid的操作,也就是只能操作同一个类型的单据/档案

public interface IAfterK3CloudApi
    {
        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Save(string data = null);

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Save(string formid, string data = null);

        /// <summary>
        /// 执行审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Audit(string data = null);

        /// <summary>
        /// 执行反审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi UnAudit(string data = null);

        /// <summary>
        /// 执行提交
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Submit(string data = null);

        /// <summary>
        /// 执行删除
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Delete(string data = null);

        /// <summary>
        /// 执行操作
        /// </summary>
        /// <returns></returns>
        IK3CloudApi ExcuteOperation(string opNumber, string data = null);

        /// <summary>
        /// 执行审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Audit(Func<CloudOperationResult, string> func);

        /// <summary>
        /// 执行反审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi UnAudit(Func<CloudOperationResult, string> func);

        /// <summary>
        /// 执行提交
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Submit(Func<CloudOperationResult, string> func);

        /// <summary>
        /// 执行删除
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Delete(Func<CloudOperationResult, string> func);

        /// <summary>
        /// 执行下推
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Push(Func<CloudOperationResult, string> func);

        /// <summary>
        /// 执行下推
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Push(string data = null);

        /// <summary>
        /// 执行下推
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Push(PushParam data = null, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Audit(OperationParam data = null, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行反审核
        /// </summary>
        /// <returns></returns>
        IK3CloudApi UnAudit(OperationParam data = null, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行提交
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Submit(OperationParam data = null, JsonSerializerSettings jsonSerializerSettings = default);

        /// <summary>
        /// 执行删除
        /// </summary>
        /// <returns></returns>
        IK3CloudApi Delete(OperationParam data = null, JsonSerializerSettings jsonSerializerSettings = default);
    }

实现类如下:

1、AppSettings 是对接配置文件,有需要可以自行替换为IConfiguration获取

2、需要配置的有地址、用户名、密码、数据帐套,对应(urlValue,starryskyusername,starryskyuserpwd,starryskyid)这里我区分了测试环境与生产环境的取值

3、SendAsync与Send方法设置了processResultCallback的回调,传入Action与返回值,并要求回传True或者False。作用是多个动作执行过程中,返回True (默认值)则前面的动作执行失败后不执行后续动作

4、插入动作的那个方法如果参数有多个则自行在新增方法实现,

/// <summary>
    /// 云星空的API调用
    /// </summary>
    [Serializable]
    internal class K3CloudApi : IK3CloudApi
    {
        private readonly string LoginServiceName = "Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUserEnDeCode";
        private readonly string ExceServiceName = "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.";
        private readonly AppConfigurationOption optionSetting = null;
        private readonly IHttpClientFactory httpClientFactory = null;
        private readonly List<ExecuteItem> executeList = null;
        private readonly AfterK3CloudApi afterK3CloudApi = null;
        private readonly string urlValue = string.Empty;
        private readonly string starryskyid = string.Empty;
        private readonly string starryskyusername = string.Empty;
        private readonly string starryskyuserpwd = string.Empty;
        private readonly ILogger logger;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="appSettings"></param>
        /// <param name="httpClientFactory"></param>
        /// <param name="logger"></param>
        public K3CloudApi(IOptionsMonitor<AppConfigurationOption> appSettings, IHttpClientFactory httpClientFactory, ILogger logger)
            : this(appSettings.CurrentValue, httpClientFactory, logger)
        {
            this.optionSetting = appSettings.CurrentValue;
        }

        private K3CloudApi(AppConfigurationOption optionSetting, IHttpClientFactory httpClientFactory, ILogger logger)
        {
            this.httpClientFactory = httpClientFactory;
            this.executeList = new List<ExecuteItem>();
            this.urlValue = optionSetting.erpurl;
            this.starryskyid = optionSetting.starryskyid;
            this.starryskyusername = optionSetting.starryskyusername;
            this.starryskyuserpwd = optionSetting.starryskyuserpwd;
            if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development")
            {
                this.urlValue = optionSetting.erpurlDevelopment;
                this.starryskyid = optionSetting.starryskyidDevelopment;
                this.starryskyusername = optionSetting.starryskyusernameDevelopment;
                this.starryskyuserpwd = optionSetting.starryskyuserpwdDevelopment;
            }
            if (this.urlValue.EndsWith("/") == false)
                this.urlValue += "/";
            this.afterK3CloudApi = new AfterK3CloudApi(this);
            this.logger = logger.ForContext<K3CloudApi>();
        }

        /// <summary>
        /// 开启新实例
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi StartNew()
        {
            return new K3CloudApi(this.optionSetting, this.httpClientFactory, this.logger);
        }

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Save(string formid, string data)
        {
            this.InsertAction(formid, "Save", data);
            return this;
        }

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Save<T>(string formid, T data)
        {
            this.InsertAction(formid, "Save", JsonConvert.SerializeObject(data));
            return this;
        }

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi BatchSave(string formid, string data)
        {
            this.InsertAction(formid, "BatchSave", data);
            return this;
        }

        /// <summary>
        /// 执行审核
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Audit(string formid, string data)
        {
            this.InsertAction(formid, "Audit", data);
            return this;
        }

        /// <summary>
        /// 执行反审核
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi UnAudit(string formid, string data)
        {
            this.InsertAction(formid, "UnAudit", data);
            return this;
        }

        /// <summary>
        /// 执行反审核
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Submit(string formid, string data)
        {
            this.InsertAction(formid, "Submit", data);
            return this;
        }

        /// <summary>
        /// 执行删除
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Delete(string formid, string data)
        {
            this.InsertAction(formid, "Delete", data);
            return this;
        }

        /// <summary>
        /// 执行下推
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Push(string formid, string data)
        {
            this.InsertAction(formid, "Push", data);
            return this;
        }

        /// <summary>
        /// 执行操作
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi ExcuteOperation(string formid, string opNumber, string data)
        {
            this.InsertAction(formid, "ExcuteOperation", opNumber: opNumber, data: data);
            return this;
        }

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Save<T>(string formid, SaveParam<T> data, JsonSerializerSettings jsonSerializerSettings = null) where T : class
        {
            this.InsertAction(formid, "Save", JsonConvert.SerializeObject(data, jsonSerializerSettings));
            return this;
        }

        /// <summary>
        /// 执行保存
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi BatchSave<T>(string formid, BatchSaveParam<T> data, JsonSerializerSettings jsonSerializerSettings = null) where T : class
        {
            this.InsertAction(formid, "BatchSave", JsonConvert.SerializeObject(data, jsonSerializerSettings));
            return this;
        }

        /// <summary>
        /// 执行审核
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Audit(string formid, OperationParam data, JsonSerializerSettings jsonSerializerSettings = null)
        {
            this.InsertAction(formid, "Audit", JsonConvert.SerializeObject(data, jsonSerializerSettings));
            return this;
        }

        /// <summary>
        /// 执行反审核
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi UnAudit(string formid, OperationParam data, JsonSerializerSettings jsonSerializerSettings = null)
        {
            this.InsertAction(formid, "UnAudit", JsonConvert.SerializeObject(data, jsonSerializerSettings));
            return this;
        }

        /// <summary>
        /// 执行提交
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Submit(string formid, OperationParam data, JsonSerializerSettings jsonSerializerSettings = null)
        {
            this.InsertAction(formid, "Submit", JsonConvert.SerializeObject(data, jsonSerializerSettings));
            return this;
        }

        /// <summary>
        /// 执行删除
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Delete(string formid, OperationParam data, JsonSerializerSettings jsonSerializerSettings = null)
        {
            this.InsertAction(formid, "Delete", JsonConvert.SerializeObject(data, jsonSerializerSettings));
            return this;
        }

        /// <summary>
        /// 执行下推
        /// </summary>
        /// <returns></returns>
        public IK3CloudApi Push(string formid, PushParam data, JsonSerializerSettings jsonSerializerSettings = null)
        {
            this.InsertAction(formid, "Push", JsonConvert.SerializeObject(data, jsonSerializerSettings));
            return this;
        }

        /// <summary>
        /// 执行
        /// </summary>
        /// <param name="resultCallback">回调方法</param>
        /// <returns></returns>
        public Task<MessageResult> SendAsync(Func<CloudCallBack, bool> resultCallback = null)
        {
            return Task.FromResult(Send(resultCallback));
        }

        /// <summary>
        /// 执行
        /// </summary>
        /// <param name="resultCallback">回调方法</param>
        /// <returns></returns>
        public MessageResult Send(Func<CloudCallBack, bool> resultCallback = null)
        {
            MessageResult loginTuple = Login();
            if (loginTuple.IsSuccess == false)
                return loginTuple;
            CloudOperationResult lastreponseEntity = null;
            Func<CloudCallBack, bool> defaultCallback = resultCallback ??= (t) => true;
            MessageResult messageResult = new(string.Empty);
            foreach (var tuple in executeList)
            {
                object[] postContent = new object[2] { tuple.Formid, tuple.PostContent };
                if (lastreponseEntity != null)
                {
                    postContent[1] = tuple.Func?.Invoke(lastreponseEntity);
                    postContent[1] ??= tuple.PostContent;
                }
                var successProcess = SafeDo(action: () => Request(string.Concat(ExceServiceName, tuple.Action), JsonConvert.SerializeObject(postContent), tuple.Formid),
                    successCallback: (result) =>
                    {
                        var jsonObj = JObject.Parse(result);
                        CloudOperationResult operationResult = JsonConvert.DeserializeObject<CloudOperationResult>(jsonObj["Result"].ToString());
                        lastreponseEntity = operationResult;
                        defaultCallback(new CloudCallBack(tuple.Formid, operationResult));
                        messageResult.CombineCloudResult(operationResult);
                        return true;
                    },
                    failCallback: (ex) => defaultCallback(new CloudCallBack(tuple.Formid, ex)));
                if (successProcess == false)
                    break;
            }
            lastreponseEntity = null;
            if (executeList != null)
                executeList.Clear();
            return messageResult;
        }

        private bool SafeDo(Func<string> action, Func<string, bool> successCallback, Func<Exception, bool> failCallback)
        {
            try
            {
                return successCallback(action());
            }
            catch (Exception ex)
            {
                bool? flag = failCallback?.Invoke(ex);
                if (flag.GetValueOrDefault(true) == false)
                    throw;
            }
            return true;
        }

        /// <summary>
        /// 登录
        /// </summary>
        /// <returns></returns>
        private MessageResult Login()
        {
            object[] paramslist = new object[] { this.starryskyid, EnDecode.Encode(this.starryskyusername), EnDecode.Encode(this.starryskyuserpwd), 2052 };
            string loginResult = Request(LoginServiceName, JsonConvert.SerializeObject(paramslist), "Login");
            var resultJson = JObject.Parse(loginResult);
            var resultType = resultJson["LoginResultType"].Value<int>();
            //登录结果类型等于1,代表登录成功
            if (resultType != 1)
                return new MessageResult(false, resultJson["Message"].Value<string>());
            return new MessageResult(true, string.Empty);
        }

        /// <summary>
        /// 执行请求
        /// </summary>
        /// <returns></returns>
        private string Request(string serviceName, string postContent, string formid)
        {
            using HttpClient httpClient = this.httpClientFactory.CreateClient("k3cloudapi");
            Stopwatch stopwatch = Stopwatch.StartNew();
            httpClient.DefaultRequestHeaders.Add("Accept-Charset", Encoding.UTF8.HeaderName);
            JObject jObj = new();
            jObj.Add("format", 1);
            jObj.Add("useragent", "ApiClient");
            jObj.Add("rid", Guid.NewGuid().ToString().GetHashCode().ToString());
            jObj.Add("parameters", postContent);
            jObj.Add("timestamp", DateTime.Now);
            jObj.Add("v", "1.0");
            var buffer = Encoding.UTF8.GetBytes(jObj.ToString());
            var byteContent = new ByteArrayContent(buffer);
            byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            HttpRequestMessage httpRequestMessage = new HttpRequestMessage
            {
                Method = HttpMethod.Post,
                Content = byteContent,
                RequestUri = new Uri(new Uri(this.urlValue), string.Concat(serviceName, ".common.kdsvc"))
            };
            var requestMsg = httpClient.Send(httpRequestMessage);
            var responseString = requestMsg.Content.ReadAsStringAsync().GetAwaiter().GetResult();
            responseString = ValidateResult(responseString);
            stopwatch.Stop();
            using (LogContext.PushProperty("RequestBody", postContent))
            using (LogContext.PushProperty("ResponseBody", responseString))
            using (LogContext.PushProperty("serviceName", serviceName))
            using (LogContext.PushProperty("StatusCode", requestMsg.StatusCode.ToString()))
            using (LogContext.PushProperty("Formid", formid))
            using (LogContext.PushProperty("Consuming", stopwatch.Elapsed.TotalMilliseconds))
                this.logger.Information(messageTemplate: "{urlValue}", this.urlValue);
            return responseString;
        }

        /// <summary>
        /// 校验返回值
        /// </summary>
        /// <param name="responseText"></param>
        /// <returns></returns>
        private string ValidateResult(string responseText)
        {
            if (responseText.StartsWith("response_error:"))
                return responseText.TrimStart("response_error:".ToCharArray());
            return responseText;
        }

        /// <summary>
        /// 插入动作
        /// </summary>
        private void InsertAction(string formid, string action, string data = "")
        {
            var lastItem = this.executeList.LastOrDefault();
            if (lastItem != null)
            {
                if (string.IsNullOrEmpty(data))
                    data = lastItem.PostContent;
                if (string.IsNullOrEmpty(formid))
                    formid = lastItem.Formid;
            }
            ExecuteItem executeItem = new(action, formid: formid, opNumber: string.Empty, data: data);
            this.executeList.Add(executeItem);
        }

        /// <summary>
        /// 插入动作
        /// </summary>
        private void InsertAction(string formid, string action, string opNumber, string data = "")
        {
            var lastItem = this.executeList.LastOrDefault();
            if (lastItem != null)
            {
                if (string.IsNullOrEmpty(data))
                    data = lastItem.PostContent;
                if (string.IsNullOrEmpty(formid))
                    formid = lastItem.Formid;
            }
            ExecuteItem executeItem = new(action, formid: formid, opNumber: opNumber, data: data);
            this.executeList.Add(executeItem);
        }

        /// <summary>
        /// 插入动作
        /// </summary>
        private void InsertAction(string formid, string action, Func<CloudOperationResult, string> func)
        {
            var lastItem = this.executeList.LastOrDefault();
            if (lastItem != null)
            {
                if (string.IsNullOrEmpty(formid))
                    formid = lastItem.Formid;
            }
            ExecuteItem executeItem = new(action, formid: formid, opNumber: string.Empty, func: func);
            this.executeList.Add(executeItem);
        }

        /// <summary>
        /// 随后执行
        /// </summary>
        /// <returns></returns>
        public IAfterK3CloudApi After()
        {
            return this.afterK3CloudApi;
        }

        /// <summary>
        /// 之后执行
        /// </summary>
        private class AfterK3CloudApi : IAfterK3CloudApi
        {
            private readonly K3CloudApi cloudApi;

            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="k3CloudApi"></param>
            internal AfterK3CloudApi(K3CloudApi k3CloudApi)
            {
                this.cloudApi = k3CloudApi;
            }

            /// <summary>
            /// 执行审核
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Audit(string data = null)
            {
                this.cloudApi.InsertAction(string.Empty, "Audit", data);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行删除
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Delete(string data = null)
            {
                this.cloudApi.InsertAction(string.Empty, "Delete", data);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行保存
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Save(string data = null)
            {
                this.cloudApi.InsertAction(string.Empty, "Save", data);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行提交
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Submit(string data = null)
            {
                this.cloudApi.InsertAction(string.Empty, "Submit", data);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行反审核
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi UnAudit(string data = null)
            {
                this.cloudApi.InsertAction(string.Empty, "UnAudit", data);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行操作
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi ExcuteOperation(string opNumber, string data = null)
            {
                this.cloudApi.InsertAction(string.Empty, "ExcuteOperation", opNumber, data);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行审核
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Audit(Func<CloudOperationResult, string> func)
            {
                this.cloudApi.InsertAction(string.Empty, "Audit", func);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行反审核
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi UnAudit(Func<CloudOperationResult, string> func)
            {
                this.cloudApi.InsertAction(string.Empty, "UnAudit", func);
                return this.cloudApi;
            }
            /// <summary>
            /// 执行提交
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Submit(Func<CloudOperationResult, string> func)
            {
                this.cloudApi.InsertAction(string.Empty, "Submit", func);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行删除
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Delete(Func<CloudOperationResult, string> func)
            {
                this.cloudApi.InsertAction(string.Empty, "Delete", func);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行保存
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Save(string formid, string data = null)
            {
                this.cloudApi.InsertAction(formid, "Save", data);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行下推
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Push(Func<CloudOperationResult, string> func)
            {
                this.cloudApi.InsertAction(string.Empty, "Push", func);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行下推
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Push(string data = null)
            {
                this.cloudApi.InsertAction(string.Empty, "Push", data);
                return this.cloudApi;
            }

            /// <summary>
            /// 执行下推
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Push(PushParam data = null, JsonSerializerSettings jsonSerializerSettings = null)
            {
                return this.Push(JsonConvert.SerializeObject(data, jsonSerializerSettings));
            }

            /// <summary>
            /// 执行审核
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Audit(OperationParam data = null, JsonSerializerSettings jsonSerializerSettings = null)
            {
                return this.Audit(JsonConvert.SerializeObject(data, jsonSerializerSettings));
            }

            /// <summary>
            /// 执行反审核
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi UnAudit(OperationParam data = null, JsonSerializerSettings jsonSerializerSettings = null)
            {
                return this.Audit(JsonConvert.SerializeObject(data, jsonSerializerSettings));
            }

            /// <summary>
            /// 执行提交
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Submit(OperationParam data = null, JsonSerializerSettings jsonSerializerSettings = null)
            {
                return this.Submit(JsonConvert.SerializeObject(data, jsonSerializerSettings));
            }

            /// <summary>
            /// 执行删除
            /// </summary>
            /// <returns></returns>
            public IK3CloudApi Delete(OperationParam data = null, JsonSerializerSettings jsonSerializerSettings = null)
            {
                return this.Delete(JsonConvert.SerializeObject(data, jsonSerializerSettings));
            }
        }
    }

反馈消息实体如下:

1、K3ResponseEntity 构造函数实现了返回JSON的解析,目前只取了部分

 /// <summary>
    /// 云星空反馈消息实体
    /// </summary>
    [Serializable]
    public sealed class CloudOperationResult
    {
        [JsonConstructor]
        public CloudOperationResult(string id, ReponseStatus repoStatus, string number, JArray needReturnData)
        {
            this.Id = id; this.ResponseStatus = repoStatus;
            this.Number = number;
            this.NeedReturnData = needReturnData;
        }

        public string Id { get; private set; }

        [JsonProperty("ResponseStatus")]
        public ReponseStatus ResponseStatus { get; private set; }

        /// <summary>
        /// 
        /// </summary>
        public JArray NeedReturnData { get; private set; }

        /// <summary>
        /// 
        /// </summary>
        public string Number { get; private set; }

        /// <summary>
        /// 
        /// </summary>
        [Serializable]
        public class ReponseStatus
        {
            [JsonConstructor]
            public ReponseStatus(int errorCode, int msgcode, bool issuccess, IEnumerable<ErrorsItem> errors, IEnumerable<SuccessItem> SuccessEntitys, IEnumerable<ErrorsItem> SuccessMessages)
            {
                this.ErrorCode = errorCode;
                this.MsgCode = msgcode;
                this.IsSuccess = issuccess;
                this.Errors = errors;
                this.SuccessEntitys = SuccessEntitys;
                this.SuccessMessages = SuccessMessages;
            }

            public int ErrorCode { get; private set; }

            public int MsgCode { get; private set; }

            public bool IsSuccess { get; private set; }

            public IEnumerable<ErrorsItem> Errors { get; private set; }

            public IEnumerable<SuccessItem> SuccessEntitys { get; private set; }

            public IEnumerable<ErrorsItem> SuccessMessages { get; private set; }
        }

        /// <summary>
        /// 
        /// </summary>
        [Serializable]
        public class ErrorsItem
        {
            [JsonConstructor]
            public ErrorsItem(string fieldname, string message, int dindex)
            {
                this.FieldName = fieldname;
                this.Message = message;
                this.DIndex = dindex;
            }

            public string FieldName { get; private set; }

            public string Message { get; private set; }

            public int DIndex { get; private set; }
        }

        /// <summary>
        /// 
        /// </summary>
        [Serializable]
        public class SuccessItem
        {
            [JsonConstructor]
            public SuccessItem(string id, string number, int dindex)
            {
                this.Id = id;
                this.Number = number;
                this.DIndex = dindex;
            }

            public string Id { get; private set; }

            public string Number { get; private set; }

            public int DIndex { get; private set; }
        }

    }
/// <summary>
    /// 
    /// </summary>
    [Serializable]
    class ExecuteItem
    {
        public ExecuteItem()
        {
        }

        public ExecuteItem(string action, string formid, string opNumber, string data)
            : base()
        {
            this.Action = action;
            this.Formid = formid;
            this.PostContent = data;
            this.opNumber = opNumber;
        }

        public ExecuteItem(string action, string formid, string opNumber, Func<CloudOperationResult, string> func)
            : base()
        {
            this.Action = action;
            this.Formid = formid;
            this.Func = func;
            this.opNumber = opNumber;
        }

        public string Formid { get; }

        public string Action { get; }

        public string PostContent { get; }

        public string opNumber { get; }

        public Func<CloudOperationResult, string> Func { get; }
    }

其他参数类:

 /// <summary>
    /// 返回值
    /// </summary>
    [Serializable]
    public sealed class CloudCallBack
    {
        /// <summary>
        /// 消息结果
        /// </summary>
        internal CloudCallBack(string formId, CloudOperationResult result)
        {
            this.FormId = formId;
            this.Result = result;
        }
        internal CloudCallBack(string formId, Exception exception)
        {
            this.FormId = formId;
            this.Exception = exception;
        }
        public string FormId { get; private set; }
        public CloudOperationResult Result { get; private set; }
        public Exception Exception { get; private set; }
    }
 public class BatchSaveParam<T> : SaveParamBase where T : class
    {
        public BatchSaveParam(List<T> model)
        {
            this.Model = model;
        }

        public List<T> Model { get; set; }

    }
 public class OperationParam
    {
        public OperationParam()
        {
            this.Numbers = new List<string>();
        }

        public string Ids { get; set; }

        public string CreateOrgId { get; set; }

        public IList<string> Numbers { get; set; }
    }

public class PushParam
    {
        public PushParam()
        {
        }
        public string Ids { get; set; }
        public string EntryIds { get; set; }
        public IList<string> Numbers { get; set; }
        public string RuleId { get; set; }
        public string TargetBillTypeId { get; set; }
        public int TargetOrgId { get; set; } = 0;
        public string TargetFormId { get; set; }
        public bool IsEnableDefaultRule { get; set; } = false;
        public bool IsDraftWhenSaveFail { get; set; } = false;
        [JsonProperty("CustomParams")]
        public CustomParams CustomParam { get; set; }
        public class CustomParams
        {
            public CustomParams()
            {
                this.QtyParams = new List<ListQtyParams>();
            }

            [JsonProperty("CustomParams")]
            public List<ListQtyParams> QtyParams { get; set; }
        }

        public class ListQtyParams
        {
            public int EntryID { get; set; }
            public double FQty { get; set; }
        }
    }
public class SaveParam<T> : SaveParamBase where T : class
    {
        public SaveParam(T model)
        {
            this.Model = model;
        }

        public T Model { get; set; }

    }

 public class SaveParamBase
    {
        public SaveParamBase()
        {
            this.NeedReturnFields = new List<string>();
            this.NeedUpdateFields = new List<string>();
            this.IsAutoSubmitAndAudit = false;
        }

        public IList<string> NeedReturnFields { get; set; }
        public IList<string> NeedUpdateFields { get; set; }
        public bool IsAutoSubmitAndAudit { get; set; }
        public bool IsDeleteEntry { get; set; } = false;
        public bool IsEntryBatchFill { get; set; } = true;
        public bool IsAutoAdjustField { get; set; } = false;
        public bool IsControlPrecision { get; set; } = false;


    }

登录时使用了DES加密了账号与密码,代码如下:

/// <summary>
    /// 
    /// </summary>
    [Serializable]
    public class EnDecode
    {
        public static string Encode(object data)
        {
            string result = string.Empty;
            try
            {
                byte[] inArray = null;
                int length = 0;
                using (DESCryptoServiceProvider dESCryptoServiceProvider = new DESCryptoServiceProvider())
                {
                    int arg_38_0 = dESCryptoServiceProvider.KeySize;
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, dESCryptoServiceProvider.CreateEncryptor(Encoding.ASCII.GetBytes("KingdeeK"), Encoding.ASCII.GetBytes("KingdeeK")), CryptoStreamMode.Write))
                        {
                            using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
                            {
                                streamWriter.Write(data);
                                streamWriter.Flush();
                                cryptoStream.FlushFinalBlock();
                                streamWriter.Flush();
                                inArray = memoryStream.GetBuffer();
                                length = (int)memoryStream.Length;
                            }
                        }
                    }
                }
                result = Convert.ToBase64String(inArray, 0, length);
            }
            catch (Exception ex)
            {
                result = ex.Message;
            }
            return result;
        }
    }

在Startup注册:

//注入接口
services.AddTransient<IK3CloudApi, K3CloudApi>();

调用如下:

/// <summary>
/// 构造函数
/// </summary>
public PoorderService(IOptionsMonitor<AppSettings> appSettings, IFreeSql freeSql, IHttpClientFactory httpClientFactory, ILogger<PoorderService> logger, IK3CloudApi iK3CloudApi)
{
    this.optionSetting = appSettings.CurrentValue;
    this.logger = logger;
    this.freeSql = freeSql;
    this.httpClientFactory = httpClientFactory;
    this.iK3CloudApi = iK3CloudApi;
}


//采购订单审核时:

MessageResult messageResult = await this.iK3CloudApi.Audit("PUR_PurchaseOrder", postJson).SendAsync();

//采购订单提交&审核:
MessageResult messageResult = await this.iK3CloudApi.Submit("PUR_PurchaseOrder", postJson).After().Audit().SendAsync();

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Excel VBA中调用金蝶云星空API,您可以按照以下步骤进行操作: 1. 首先,确保您的计算机已安装了金蝶云星空的开发工具包(SDK)并进行了正确的配置。 2. 在Excel中,按下“ALT+F11”键,打开Visual Basic for Applications(VBA)编辑器。 3. 在VBA编辑器中,导航到“工具”菜单,选择“引用”。 4. 在“引用”对话框中,选择“浏览”,然后找到并选择金蝶云星空的SDK安装目录。 5. 在SDK安装目录中,找到并选择对应的API接口文件,通常是一个名为“Kingdee.BOS.WebApi.Client.dll”的文件。 6. 单击“确定”按钮,然后等待引用的添加。 7. 现在,您已经成功引用了金蝶云星空的API接口文件,可以在VBA代码中调用相关方法了。 8. 您可以使用VBA的对象和函数来实例化金蝶云星空的API接口,调用所需的服务和操作。 9. 例如,您可以创建一个新的对象来调用金蝶云星空的用户服务接口,并使用其中的方法来获取、创建或更新用户信息。 10. 在代码中,您还可以设置相关的参数、验证身份、处理返回的数据等等。 11. 当您完成代码编写后,您可以按下“F5”键或点击“运行”按钮来执行代码并调用金蝶云星空的API接口。 总之,通过在Excel VBA中引用金蝶云星空的API接口文件,您可以方便地调用并集成金蝶云星空的功能和数据,从而实现更高效的数据管理和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值