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();