金蝶雲星空使用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;
        }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM