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

//    "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

}

}

}

///

/// 登录

///

///

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(

//                               "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save",

//                               new object[] { formid, jsonstr });

result = client.Save(formid, jsonstr);

}

return result;

}

///

/// 审核

///

///

///

///

public static string Audit(string formid, string jsonstr)

{

string result = "登录失败,请检查与站点地址、数据中心Id,用户名及密码!";

result = client.Execute("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit", new object[] { formid, jsonstr });

result = client.Execute("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit", new object[] { formid, jsonstr });

return result;

}

}

java金蝶云单据查询_金蝶云星空使用WebAPI来新增单据相关推荐

  1. 金蝶云星空使用WebAPI来新增单据

    有很多客户需求在后台自动生成某张单据,金蝶云星空提供了WebApi,包含了保存,提交,审核,删除单据的接口,下面以生产订单的保存,提交,审核为例,说明一下应用WebApi后台自动生成生产订单的功能,下 ...

  2. java金蝶云单据查询_金蝶云苍穹单据列表开发demo

    控件使用 列表分组字段 在左侧大纲中选择表格视图后在实体列表元素中选择列表字段分组,而后将申请数据和已订货数量拖进列表分组字段中,并更改列表分组字段名称为数量 合并列表字段 同上述步骤一样,只不过在实 ...

  3. java实现快递物流查询(阿里云快递物流)

    java实现快递物流查询(阿里云快递物流) 链接:阿里云快递物流直达通道 购买成功接下来去图下找到AppCode,调用快递接口时用的到 接下来直接贴上代码 /*** 查询物流信息* @return*/ ...

  4. 金蝶k3财务接口_金蝶云为企业成长而生,让工作更高效!

    业家才 能等) 金蝶云介绍 金蝶云是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台.金蝶云围绕着"生态.人人.体验",旨在帮助企业打造面向新时代的生 ...

  5. JAVA看云判断天气_看云测天气_气象常识天气知

    看云测天气_气象常识天气知 因为古代没有先进的科技预报天气,所以古人在日常生活中通过对云的观察,总结出了很多的谚语,用以预测天气的变化.从云的形状.颜色.高低.薄厚.动向等很多方面都可以预测出天气的变 ...

  6. JAVA看云判断天气_看云识天气:如何利用云层判断天气?

    一旦身处山区,特别是高海拔山区,就进入了极端环境和天气中.天气的好坏对于山友们的出行安全至关重要.一个老练的攀登者不但要在出行前了解好天气,更要懂的在攀登的过程中随时判断天气. 在登山的时候,利用云层 ...

  7. 阿里云mysql价格_阿里云超级计算mysql价格

    Re阿里云的IO很不给力啊 有图有真相的啊. 这个是该机器的网络流量.这么低的流量 情何以堪 这就是 中国的阿里云啊?!! 和linode的vps比较起来,太搓了!! 希望解决处理! -------- ...

  8. 华为云桌面客户端_华为云CloudIDE的前世今生

    在华为开发者大会HDC.Cloud上,华为云发布了基于鲲鹏计算的开发者服务 - CloudIDE服务,为鲲鹏开发者提供了很好的云端开发体验.(延伸阅读:华为云CloudIDE,云时代的精创利器) 体验 ...

  9. 阿里云mysql容量_阿里云RDS的mysql数据库占用空间超过90%的处理

    阿里云RDS数据库最大支持2T,目前已经占用了90%,如果进行分库或者迁移比较麻烦,思路是找出占用空间过大的日志或不重要的文件进行删除操作 查询所有数据库占用磁盘空间大小的SQL语句: show bi ...

  10. ecs 云服务器 管理控制台_阿里云ECS服务器监控资源使用情况

    阿里云Ecs服务器运维过程中,无论是Centos系统还是Windows系统,有时候我们需要监控分析最新的服务器资源利用率等运行情况,例如最近3个小时CPU使用率情况.内存使用率.网络流入带宽.网络流出 ...

最新文章

  1. Laravel Predis Error while reading line from the server.
  2. Ext之Combobox的远程加载数据实例(附前后台代码)
  3. 五十一、结合百度API接口打造 Python小项目
  4. 在哪里买铁甲格斗机器人_铁甲雄心Ⅱ火了 优必选“超变铁甲”掀起闯关赢免单热潮...
  5. python 人数取整_在python中如何取整到10的最高倍数?
  6. Java 15 即将到来,新特性速览!
  7. 如何测试前台获得的数据
  8. 4. Linux 高性能服务器编程 --- TCP/IP 通信
  9. 22考研全程时间计划安排表!
  10. 解决数据库日期返回格式不是yyyy-MM-dd HH:mm:ss 的问题
  11. 家用服务器 无线路由器,评测六款热门家用Wi-Fi 6路由器
  12. vue2中取消严格检查模式/关闭语法检查
  13. 3GPP TS 23501-g51 中英文对照 | 5.2.4 Authorisation
  14. 数据库基本操作(创建主键、外键以及索引)
  15. 阿里云服务器被检测到有wa kuang程序
  16. 如何将微信素材库的文章保留格式的复制到自己的博客论坛或者其他素材库
  17. RK3568平台开发系列讲解(驱动篇)驱动开发之RTC 使用
  18. 云原生之使用Docker部署Dashdot服务器仪表盘
  19. anjuta , 88
  20. [PyFlink 从入门到精通] 基于 PyFlink 实现在线机器学习

热门文章

  1. go和python哪个好就业_python就业方向哪个好?没基础学python
  2. 根据读取数据库字段去linux下载文件到本地
  3. 论“詹姆斯*哈登”到底是不是球队毒瘤
  4. IDEA卸载和删除注册表
  5. 《持续集成实践指南》第3章 Gitlab基本配置与使用
  6. 植被覆盖度时空变化规律分析实例
  7. Activity启动流程(二)system_server进程处理启动Activity请求
  8. 机器学习(Machine Learning)大家与资源
  9. apple 关闭双重认证_如何在Apple Mail中关闭联系人和事件建议
  10. flush和evit