有很多客户需求在后台自动生成某张单据,金蝶云星空提供了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;
        }

}

金蝶云星空使用WebAPI来新增单据的更多相关文章

  1. 金蝶云星空BOS开发视频分享

    https://vip.kingdee.com/school/implementCourseOnline

  2. 金蝶云星空Python案例地址

    https://club.kingdee.com/forum.php?mod=viewthread&tid=1235461

  3. 泛微云桥e-birdge之金蝶云之家集成配置手册

    最近在配置金蝶云之家与泛微ecology的打通,没有看官方文档,直接配置,一直配置不通,看了官方文档后知道了少配置参数了,转载一下,省得四处去找了. 泛微云桥e-birdge之金蝶云之家集成配置手册 ...

  4. 金蝶K/3 跟踪语句_业务单据

    跟踪语句_业务单据_BOM select * from t_TableDescription where Ftablename like '%ICBOM%' order by FFieldName o ...

  5. 金蝶云k3 cloud采购入库单校验日期不通过

    新增采购入库单的时候提示单据日期必须大于等于货主组织在核算系统最后关账日期 解决办法:库存系统和存货核算系统的反关账

  6. .NetCore对接各大财务软件凭证API——金蝶系列(1)

    哈喽,又和大家见面了,虽然看文章的小伙伴不多,但是我相信总有一天,自己写的这些文章或多或少会对其他人有些帮助,让他们在相关的业务开发下能少走些弯路,那我的目的就达到了,好了,今天就正式开始我们的系列了 ...

  7. T100——单据别的新增、修改设置

    何为单据别,例如下图,新增的时候开窗选择单据别: 新增单据别: 1.首先在azzi600 系统分类码维护作业里面新增新的系统分类码(在系统分类码24下新增),如图: 2.在azzi910 作业基本数据 ...

  8. K3CLOUD新增用户

    1.在金蝶云之家对应的产品序列中新增用户 2.在CLOUD本地查询用户-同步注册用户后,云平台用户会同步至本地

  9. k3 cloud在站点中新增用户

    1.进去金蝶云企业平台: 网址:https://cloud.kingdee.com/pt/ 2.进入控制台页面,我的产品下面选择添加用户 去cloud平台新增并同步用户注册信息 3.去管理中心更新用户 ...

随机推荐

  1. C# WPF之Material Design自定义颜色

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF之Material Design自定义颜色 阅读导航 本文背景 代码实现 本文参考 ...

  2. mysql将bin-log日志文件转为sql文件

    查看mysqlbinlog版本 mysqlbinlog -V [--version] 查看binlog日志开启状态 show variables like '%log_bin%'; mysql打开bi ...

  3. P1055 ISBN号码(getline(cin,s); printf("%s",str); )

    题目描述 每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字.1 位识别码和 3 位分隔符,其规定格式如 x-xxx-xxxxx-x,其中符号 - 就是分隔符(键盘上的 ...

  4. IntelliJ IDEA 2018.3.2 永久破解

    PS:动手能力强的来,手残的去淘宝买吧,大概15块钱1年.建议看完后在动手,有一个全局观,浪费不了多少时间 一. 下载破解补丁文件 链接:https://pan.baidu.com/s/1wFp14t ...

  5. 网络流最大流——dinic算法

    前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...

  6. git同步代码至github和gitee(码云)

    注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/git-to-g ...

  7. JMeter-查找元素

    参考文档:https://jmeter.apache.org/usermanual/hints_and_tips.html 有时很难使用变量或包含某个URL或参数的方法在“测试计划”树和元素中找到. ...

  8. JS阻止事件冒泡与浏览器默认行为

    阻止冒泡 W3C的方法是e.stopPropagation() IE是e.cancelBubble = true; 阻止默认行为 W3C的方法e.preventDefault(), IE是e.retu ...

  9. 输出《Harry Potter and the Sorcerer's Stone》文本中的前N个最长用的英文单词及其数量

    输出<Harry Potter and the Sorcerer's Stone>文本中的前N个最长用的英文单词及其数量 实验思路: 1. 利用输入流将文件当中内容读入. 2. 将文件内容 ...

  10. IO流学习之字符流(二)

    用字符流完成文档的复制: 测试文档: 代码1: package InputOutput; import java.io.FileReader; import java.io.FileWriter; i ...