金蝶雲星空使用WebAPI來新增單據
有很多客戶需求在後臺自動生成某張單據,金蝶雲星空提供了WebApi,包含了儲存,提交,稽核,刪除單據的介面,下面以生產訂單的儲存,提交,稽核為例,說明一下應用WebApi後臺自動生成生產訂單的功能,下面是程式碼示例,其他單據可以根據示例程式碼做相應的修改:
using Kingdee.BOS.Core.Bill.PlugIn;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kingdee.BOS;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ControlElement;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Resource;
using Kingdee.BOS.Util;
//using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.Msg;
using Kingdee.BOS.Orm.Drivers;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.DataEntity;
using System.ComponentModel;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using System.Data;
using Newtonsoft.Json.Linq;
using Kingdee.BOS.WebApi.Client;
using Newtonsoft.Json;
public class DisProOrder : AbstractBillPlugIn
{
K3CloudApiClient client = new K3CloudApiClient("http://X.X.X.X:XXX/K3Cloud/");//引數是K3/Cloud的URL
//傳入的引數根據需求來自行修改
public void SaveBill(DataSet ds, string OrderQty, string TouLiaoQty,int billno)
{
DataSet dstemp = new DataSet();
DataTable dtTemp = new DataTable();
string result = "";
if (ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count == 0)
{
}
else
{
#region 儲存生產訂單資訊
try
{
// 開始構建Web API引數物件
// 引數根物件:包含Creator、NeedUpDateFields、Model這三個子引數
// using Newtonsoft.Json.Linq; // (需引用Newtonsoft.Json.dll)
JObject jsonRoot = new JObject();
// Creator: 建立使用者
jsonRoot.Add("CREATOR", "administrator");
// NeedUpDateFields: 哪些欄位需要更新?為空則表示引數中全部欄位,均需要更新
jsonRoot.Add("NEEDUPDATEFIELDS", new JArray(""));
jsonRoot.Add("NEEDRETURNFIELDS", new JArray(""));
jsonRoot.Add("ISDELETEENTRY", "TRUE");
jsonRoot.Add("SUBSYSTEMID", "");
// Model: 單據詳細資料引數
JObject model = new JObject();
jsonRoot.Add("Model", model);
// 開始設定單據欄位值
// 必須設定的欄位:主鍵、單據型別、主業務組織,各必錄且沒有設定預設值的欄位
// 特別注意:欄位Key大小寫是敏感的,建議從BOS設計器中,直接複製欄位的標識屬性過來
// 單據主鍵:必須填寫,系統據此判斷是新增還是修改單據;新增單據,填0
model.Add("FID", "0");
JObject basedata = new JObject();
//單據編號
model.Add("FBillNo", this.View.Model.GetValue("FBillNo").ToString()+billno.ToString("000"));
//單據型別
if (this.View.Model.GetValue("FBillType").ToString() != "")
{
basedata = new JObject();
DynamicObject BillType = this.View.Model.GetValue("FBillType") as DynamicObject;
string BillTypeNO = BillType["number"].ToString();
basedata.Add("FNumber", BillTypeNO);
model.Add("FBillType", basedata);
}
//單據日期
model.Add("FDate", this.View.Model.GetValue("FDate").ToString());
//生產組織
if (this.View.Model.GetValue("FPrdOrgId").ToString() != "")
{
basedata = new JObject();
DynamicObject FPrdOrg = this.View.Model.GetValue("FPrdOrgId") as DynamicObject;
string FPrdOrgNO = FPrdOrg["number"].ToString();
basedata.Add("FNumber", FPrdOrgNO);
model.Add("FPrdOrgId", basedata);
}
//計劃組:FWorkGroupId
if (ds.Tables[0].Rows[0]["FWORKGROUPID"].ToString() != "0")
{
basedata = new JObject();
DynamicObject FWorkGroup = this.View.Model.GetValue("FWorkGroupId") as DynamicObject;
string FWorkGroupNO = FWorkGroup["number"].ToString();
basedata.Add("FNumber", FWorkGroupNO);
model.Add("FWorkGroupId", basedata);
}
//計劃員:FPlannerID
if (ds.Tables[0].Rows[0]["FPLANNERID"].ToString() !="0")
{
basedata = new JObject();
DynamicObject FPlanner = this.View.Model.GetValue("FPlannerID") as DynamicObject;
string FPlannerNO = FPlanner["number"].ToString();
basedata.Add("FNumber", FPlannerNO);
model.Add("FPlannerID", basedata);
}
//備註
model.Add("FDescription", "");
//拆單數:F_PAEZ_CHAIDAN
model.Add("F_PAEZ_CHAIDAN", this.View.Model.GetValue("F_PAEZ_CHAIDAN").ToString());
//本單數:F_PAEZ_BENDAN
model.Add("F_PAEZ_BENDAN", OrderQty);
//原單數:F_PAEZ_YUANDAN
model.Add("F_PAEZ_YUANDAN", this.View.Model.GetValue("F_PAEZ_YUANDAN").ToString());
//投料數:F_PAEZ_TOULIAO
model.Add("F_PAEZ_TOULIAO", TouLiaoQty);
//是否已拆單:F_PAEZ_Text
model.Add("F_PAEZ_Text", "是");
// 單據型別:必須填寫,是基礎資料欄位
// 基礎資料型別欄位填值,必須再構建一個JObject物件,設定基礎資料編碼
// 單據編號:可以忽略,由系統根據編碼規則自動生成
//model.Add("FBILLNO", "201602160001");
// 開始構建單據體引數:集合引數JArray
JArray entryRows = new JArray();
// 把單據體行集合,新增到model中,以單據體Key為標識
string entityKey = "FTreeEntity";//單據體的標識
model.Add(entityKey, entryRows);
int rowscount;
rowscount = Convert.ToInt32(this.Model.GetEntryRowCount("FTreeEntity"));
// 通過迴圈建立單據體行:
for (int i = 0; i <= rowscount - 1; i++)
{
// 新增新行,把新行加入到單據體行集合
JObject entryRow = new JObject();
entryRows.Add(entryRow);
// 給新行,設定關鍵欄位值
// 單據體主鍵:必須填寫,系統據此判斷是新增還是修改行
entryRow.Add("FEntryID", "0");
//產品型別:FProductType
entryRow.Add("FProductType", "");
//物料:基礎資料,填寫編碼
DynamicObject Mat = this.View.Model.GetValue("FMaterialId", i) as DynamicObject;
string MatNO = Mat["number"].ToString();
//dtTemp = GetMaterialInfo(MatId);
basedata = new JObject();
basedata.Add("FNumber", MatNO);
entryRow.Add("FMaterialId", basedata);
//生產車間:FWorkShopID
if (ds.Tables[0].Rows[0]["FWORKSHOPID"].ToString() != "0")
{
basedata = new JObject();
DynamicObject FWorkShop = this.View.Model.GetValue("FWorkShopID", i) as DynamicObject;
string FWorkShopNO = FWorkShop["number"].ToString();
basedata.Add("FNumber", FWorkShopNO);
entryRow.Add("FWorkShopID", basedata);
}
////單位,基礎資料,填寫編碼
if (ds.Tables[0].Rows[0]["FUnitId"].ToString() != "0")
{
basedata = new JObject();
DynamicObject FUnit = this.View.Model.GetValue("FUnitId", i) as DynamicObject;
string FUnitNO = FUnit["number"].ToString();
basedata.Add("FNumber", FUnitNO);
entryRow.Add("FUnitId", basedata);
}
//數量:FQty
entryRow.Add("FQty", OrderQty);
//計劃開工時間:FPlanStartDate (必填項)
entryRow.Add("FPlanStartDate", this.View.Model.GetValue("FPlanStartDate", i).ToString());
//計劃完工時間:FPlanFinishDate (必填項)
entryRow.Add("FPlanFinishDate", this.View.Model.GetValue("FPlanFinishDate", i).ToString());
//BOM版本:FBomId
if (ds.Tables[0].Rows[0]["FBomId"].ToString() != "0")
{
basedata = new JObject();
DynamicObject FBom = this.View.Model.GetValue("FBomId", i) as DynamicObject;
string FBomNO = FBom["number"].ToString();
basedata.Add("FNumber", FBomNO);
entryRow.Add("FBomId", basedata);
}
//批號:FLot
//basedata = new JObject();
//basedata.Add("FNumber", "");
//entryRow.Add("FLot", basedata);
//備註:FMemoItem
entryRow.Add("FMemoItem", "");
//工藝路線:FRoutingId
if (ds.Tables[0].Rows[0]["FRoutingId"].ToString() != "0")
{
basedata = new JObject();
DynamicObject FRouting = this.View.Model.GetValue("FRoutingId") as DynamicObject;
string FRoutingNO = FRouting["number"].ToString();
basedata.Add("FNumber", FRoutingNO);
entryRow.Add("FRoutingId", basedata);
}
//倉庫:FStockId
if (ds.Tables[0].Rows[0]["FStockId"].ToString() != "0")
{
basedata = new JObject();
DynamicObject FStock = this.View.Model.GetValue("FStockId") as DynamicObject;
string FStockNO = FStock["number"].ToString();
basedata.Add("FNumber", FStockNO);
entryRow.Add("FStockId", basedata);
}
//// 建立Link行集合
//JArray linkRows = new JArray();
//// 新增到單據體行中:Link子單據體標識 = 關聯主單據體標識(POOrderEntry) + _Link
//string linkEntityKey = string.Format("{0}_Link", entityKey);
//entryRow.Add(linkEntityKey, linkRows);
//// 建立Link行:
//// 如有多條源單行,則分別建立Link行記錄各條源單行資訊
//JObject linkRow = new JObject();
//linkRows.Add(linkRow);
//// 填寫Link行上的欄位值
//// 特別說明:Link子單據體上欄位的標識,必須在前面增加子單據體標識
//// FFlowId : 業務流程圖,可選
//string fldFlowIdKey = string.Format("{0}_FFlowId", linkEntityKey);
//linkRow.Add(fldFlowIdKey, "");
//// FFlowLineId :業務流程圖路線,可選
//string fldFlowLineIdKey = string.Format("{0}_FFlowLineId", linkEntityKey);
//linkRow.Add(fldFlowLineIdKey, "");
//// FRuleId :兩單之間的轉換規則內碼,必填
//// 可以通過如下SQL語句到資料庫獲取
//// select FID, *
//// from T_META_CONVERTRULE
//// where FSOURCEFORMID = 'PUR_Requisition'
//// and FTARGETFORMID = 'PUR_PurchaseOrder'
//// and FDEVTYPE = 0;
//string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey);
//linkRow.Add(fldRuleIdKey, "605a20be-79f9-4e86-b87c-08fa9dfa98f4");
//// FSTableName :必填,源單單據體表格編碼,通過如下語句獲取:
//// SELECT FTableNumber
//// FROM t_bf_tabledefine
//// WHERE fformid = 'PUR_Requisition'
//// AND fentitykey = 'FEntity'
//// 如果如上語句未返回結果,請到K/3 Cloud中,手工選單一次,後臺會自動產生表格編碼
//string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey);
//linkRow.Add(fldSTableNameKey, "t_Dev_PUR_ReceiveEntry");
////通過收料單號獲取收料單內碼和單據體分錄內碼
//string BillNo = ds.Tables["InStockMatInfo"].Rows[i]["F_DEV_SOURCEBILLNO"].ToString();
//string MatId = ds.Tables["InStockMatInfo"].Rows[i]["F_DEV_MATID"].ToString();
//string StockId = ds.Tables["InStockMatInfo"].Rows[i]["F_Dev_StockID"].ToString();
//string Position = ds.Tables["InStockMatInfo"].Rows[i]["F_Dev_Position"].ToString();
//dtTemp = GetData.GetReceiveInfo(BillNo, MatId, StockId, Position);
//// FSBillId :必填,源單單據內碼
//string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey);
//linkRow.Add(fldSBillIdKey, dtTemp.Rows[0]["FID"].ToString());
//// FSId : 必填,源單單據體行內碼。如果源單主關聯實體是單據頭,則此屬性也填寫源單單據內碼
//string fldSIdKey = string.Format("{0}_FSId", linkEntityKey);
//linkRow.Add(fldSIdKey, dtTemp.Rows[0]["FEntryID"].ToString());
////// FEntity_Link_FBaseQty :數量實際攜帶值,下推後,使用者可以手工修改數量值;此欄位儲存最終的數量值
////// 可選欄位:
////// 在儲存時,系統會自動把單據體上數量值,更新到此欄位;因此,這個欄位可以不用填寫(即使填寫了,也會被覆蓋)
////string fldBaseQtyKey = string.Format("{0}_FBaseUnitQty", linkEntityKey);
////linkRow.Add(fldBaseQtyKey, 10);
}
//return jsonRoot.ToString();
// 呼叫Web API介面服務,儲存採購訂單
result = Save("PRD_MO", jsonRoot.ToString());
//result = client.Execute<string>(
// "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save",
// new object[] { "Dev_STK_InStock", jsonRoot.ToString() });
try
{
JObject jo = (JObject)JsonConvert.DeserializeObject(result);
string number = jo["Result"]["Number"].ToString();
//if (number != "")
//{
// string autrjson = "{\"CreateOrgId\":0,\"Numbers\":[\"" + number + "\"]}";
// result = Common.Audit("Dev_STK_InStock", autrjson);
//}
}
catch (Exception exp)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("程式執行遇到了未知的錯誤:");
sb.Append("錯誤提示:").AppendLine(exp.Message);
sb.Append("錯誤堆疊:").AppendLine(exp.StackTrace);
throw new Exception(sb.ToString() + result.ToString());
//throw new Exception(result);
}
}
catch (Exception exp)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("程式執行遇到了未知的錯誤:");
sb.Append("錯誤提示:").AppendLine(exp.Message);
sb.Append("錯誤堆疊:").AppendLine(exp.StackTrace);
throw new Exception(sb.ToString() + result.ToString());
}
#endregion
}
}
}
/// <summary>
/// 登入
/// </summary>
/// <returns></returns>
public bool Login()
{
string dbid = "5b59aae46cb7b1";//DBID,select FDATACENTERID from T_BAS_DATACENTER 在管理中心資料庫中執行,可查到賬套的DBID
string username = "administrator";//賬套使用者名稱
string password = "888888";//賬套使用者名稱密碼
var loginResult = client.Login(
dbid,
username,
password,
2052);
return loginResult;
//return true;
}
//儲存介面
public string Save(string formid, string jsonstr)
{
string result = "登入失敗,請檢查與站點地址、資料中心Id,使用者名稱及密碼!";
//string result = "";
if (Login())
{
//result = client.Execute<string>(
// "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save",
// new object[] { formid, jsonstr });
result = client.Save(formid, jsonstr);
}
return result;
}
/// <summary>
/// 稽核
/// </summary>
/// <param name="formid"></param>
/// <param name="jsonstr"></param>
/// <returns></returns>
public static string Audit(string formid, string jsonstr)
{
string result = "登入失敗,請檢查與站點地址、資料中心Id,使用者名稱及密碼!";
result = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit", new object[] { formid, jsonstr });
result = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit", new object[] { formid, jsonstr });
return result;
}
}