案例:

Cloud的采购订单同步到第三方系统,第三方系统入库后同步生成Cloud采购入库单。

解决方案:调用采购订单的下推API,先生成保存状态的采购入库单(采购入库单中的仓库是必填项,可以在采购订单中默认一个仓库通过单据转换关系携带,或者通过单据转换插件默认一个仓库),然后根据第三方的系统传过来的数据,调用这个采购入库单的保存API(JSON中的FID和FEntryID需要给定值,这个定值就是这个采购入库单的FID和FEntryID),将数量等信息按照第三方系统传过来的数据进行修改。

示例代码,仅供参考。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Contracts;
using Kingdee.BOS;
using Kingdee.BOS.Core;
using System.IO;
using System.Configuration;
using Newtonsoft.Json.Linq;
using Kingdee.BOS.WebApi.Client;
using Kingdee.BOS.Core.Msg;
using Kingdee.BOS.Util;
using System.Dynamic;
using Kingdee.BOS.Orm.Drivers;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.DataEntity;
using Newtonsoft.Json;

namespace K3CloudPlugIn
{
    public class GetInstockDataInfo : IScheduleService
    {
        K3CloudApiClient client = new K3CloudApiClient(Common.url);
        /// <summary>
        /// 实际运行的Run 方法
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="schedule"></param>
        public void Run(Context ctx, Schedule schedule)
        {
            //获取入库单中间表数据,并生成相应的采购入库单,委外入库单,生产入库单
            K3JSTService.XZGTCBS InstockService = new K3JSTService.XZGTCBS();
            string FDate = DateTime.Now.ToShortDateString();
            //调用WebService,将数据插入中间表
            //FDate = "2019-12-11";
            InstockService.GetCaiGouRuKuInfo(FDate);
            string ReturnInfo = "";
            string JsonInfo = "";
            string BillSql = "";
            string EntrySql = "";
            string result = "";
            int TotalRows = 0;
            string io_id = "";//聚水潭入库单ID
            string po_id = "";//聚水潭入库单关联的采购单ID
            DataSet ds_BillSql = new DataSet();
            DataSet ds_EntrySql = new DataSet();
            string OrderSql = "";
            DataSet ds_OrderSql = new DataSet();
            string FBillNo = "";
            string FBillID = "";
            JObject jsonRoot;
            JArray Numbers;
            JObject CustomParams;
            var loginResult = "";
            var resultType = 0;
            string autrjson;
            JObject joAudit;
            JObject joAuditIsSucess;
            JArray Fields;
            string AlterSql = "";
            DataSet ds_AlterSql = new DataSet();
            JObject basedata;
            string SaveResult = "";
            string FOrgId = "";
            BillSql = @"/*dialect*/select distinct a.* from MyOrderHouse a left join MyOrderHouseEntry b on a.io_id = b.io_id ";
            BillSql = BillSql + "left join T_BD_MATERIAL c on c.F_RFGW_TEXT = b.sku_id where ISNULL(c.FMATERIALID,0) > 0 and ISNULL(a.WinBillID,0) = 0 ";
            ds_BillSql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(ctx, BillSql);
            TotalRows = ds_BillSql.Tables[0].Rows.Count;
            if (TotalRows > 0)
            {
                for (int i = 0; i < TotalRows; i++)
                {
                    io_id = ds_BillSql.Tables[0].Rows[i]["io_id"].ToString();
                    po_id = ds_BillSql.Tables[0].Rows[i]["po_id"].ToString();

#region 第一种情况:该入库单对应的采购订单是由Cloud的采购订单同步过去的
                    //第一种情况:该入库单对应的采购订单是由Cloud的采购订单同步过去的
                    OrderSql = @"/*dialect*/select * from t_PUR_POOrder where FJSTORDERNO = '" + po_id + "'";
                    ds_OrderSql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(ctx,OrderSql);
                    if (ds_OrderSql.Tables[0].Rows.Count > 0)
                    {
                        FOrgId = ds_OrderSql.Tables[0].Rows[0]["FPURCHASEORGID"].ToString();
                        //获取入库单的物料编码和数量,以及对应采购订单的分录内码
                        EntrySql = @"/*dialect*/select distinct e.FENTRYID as 'EntryID',b.qty as 'Qty',c.FNUMBER as 'MatNO' from MyOrderHouse a left join MyOrderHouseEntry b on a.io_id = b.io_id ";
                        EntrySql = EntrySql + "left join T_BD_MATERIAL c on b.sku_id = c.F_RFGW_TEXT left join t_PUR_POOrder d on a.po_id = d.FJSTORDERNO ";
                        EntrySql = EntrySql + "left join t_PUR_POOrderEntry e on d.FID = e.FID and c.FMATERIALID = e.FMATERIALID ";
                        EntrySql = EntrySql + "where a.io_id = '" + io_id + "' and ISNULL(e.FENTRYID,0) > 0 and ISNULL(c.FMATERIALID,0) > 0 and c.FUSEORGID = '" + FOrgId + "'";
                        ds_EntrySql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(ctx,EntrySql);
                        if (ds_EntrySql.Tables[0].Rows.Count > 0)
                        {
                            Common.STKEntryIds = new string[ds_EntrySql.Tables[0].Rows.Count];
                            Common.STKMats = new string[ds_EntrySql.Tables[0].Rows.Count];
                            Common.STKMatIds = new int[ds_EntrySql.Tables[0].Rows.Count];
                            Common.STKqty = new decimal[ds_EntrySql.Tables[0].Rows.Count];
                            Common.STKprice = new decimal[ds_EntrySql.Tables[0].Rows.Count];
                            for (int j = 0; j < ds_EntrySql.Tables[0].Rows.Count; j++)
                            {
                                Common.STKMats[j] = ds_EntrySql.Tables[0].Rows[j]["MatNO"].ToString();
                                Common.STKEntryIds[j] = ds_EntrySql.Tables[0].Rows[j]["EntryID"].ToString();
                                Common.STKqty[j] = Convert.ToDecimal(ds_EntrySql.Tables[0].Rows[j]["Qty"].ToString());
                            }
                        }
                        //调用采购订单的下推API
                        // 开始构建Web API参数对象
                        // using Newtonsoft.Json.Linq;  // (需引用Newtonsoft.Json.dll)
                        jsonRoot = new JObject();
                        jsonRoot.Add("Ids", "");//单据内码集合,字符串类型,格式:"Id1,Id2,..."(使用内码时必录)
                        Numbers = new JArray();
                        jsonRoot.Add("Numbers", Numbers);//单据编码集合,数组类型,格式:[No1,No2,...](使用编码时必录)
                        jsonRoot.Add("EntryIds", string.Join(",", Common.STKEntryIds));//分录内码集合,逗号分隔(分录下推时必录),注(按分录下推时,单据内码和编码不需要填,否则按整单下推)
                        jsonRoot.Add("RuleId", "44789b6e-ef2e-44a3-bcb9-dd38b8f13eae");//转换规则内码,字符串类型(未启用默认转换规则时,则必录)
                        jsonRoot.Add("TargetBillTypeId", "");//目标单据类型内码,字符串类型(非必录)
                        jsonRoot.Add("TargetOrgId", 0);//目标组织内码,整型(非必录)
                        jsonRoot.Add("TargetFormId", "STK_InStock");//目标单据FormId,字符串类型,(启用默认转换规则时,则必录)
                        jsonRoot.Add("IsEnableDefaultRule", "true"); //是否启用默认转换规则,布尔类型,默认false(非必录)
                        jsonRoot.Add("IsDraftWhenSaveFail", "false");
                        CustomParams = new JObject();//自定义参数,字典类型,格式:"{key1:value1,key2:value2,...}"(非必录) ,注(传到转换插件的操作选项中,平台不会解析里面的值)
                        jsonRoot.Add("CustomParams", CustomParams);
                        JsonInfo = jsonRoot.ToString();
                        loginResult = client.ValidateLogin(Common.dbid, Common.username,Common.password, 2052);
                        resultType = JObject.Parse(loginResult)["LoginResultType"].Value<int>();
                        //登录结果类型等于1,代表登录成功
                        if (resultType == 1)
                        {
                            ReturnInfo = client.Push("PUR_PurchaseOrder", JsonInfo);
                            try
                            {
                                JObject jo = (JObject)JsonConvert.DeserializeObject(ReturnInfo);
                                JObject JoResult = (JObject)JsonConvert.DeserializeObject(jo["Result"]["ResponseStatus"].ToString());
                                JArray array = (JArray)JsonConvert.DeserializeObject(JoResult["SuccessEntitys"].ToString());
                                FBillNo = array[0]["Number"].ToString();
                                FBillID = array[0]["Id"].ToString();

if (FBillNo != "")
                                {
                                    //调用采购入库单的保存API,修改实收数量和仓库
                                    jsonRoot = new JObject();
                                    jsonRoot.Add("Creator", "");
                                    Fields = new JArray();
                                    Fields.Add("FInStockEntry");
                                    Fields.Add("FRealQty");

jsonRoot.Add("NeedUpDateFields", Fields);
                                    jsonRoot.Add("NeedReturnFields", new JArray());
                                    jsonRoot.Add("IsDeleteEntry", "false");
                                    jsonRoot.Add("SubSystemId", "");
                                    jsonRoot.Add("IsVerifyBaseDataField", "false");
                                    jsonRoot.Add("IsEntryBatchFill", "True");
                                    jsonRoot.Add("ValidateFlag", "True");
                                    jsonRoot.Add("NumberSearch", "True");
                                    jsonRoot.Add("InterationFlags", "STK_InvCheckResult");
                                    // Model: 单据详细数据参数
                                    JObject model = new JObject();
                                    jsonRoot.Add("Model", model);
                                    // 单据主键:必须填写,系统据此判断是新增还是修改单据;新增单据,填0
                                    model.Add("FID", FBillID.ToString());

JArray entryRows = new JArray();
                                    // 把单据体行集合,添加到model中,以单据体Key为标识
                                    string entityKey = "FInStockEntry";
                                    model.Add(entityKey, entryRows);

AlterSql = @"/*dialect*/select b.FSEQ,b.FENTRYID,c.FNUMBER,b.FREALQTY from t_STK_InStock a left join T_STK_INSTOCKENTRY b on a.fid = b.fid ";
                                    AlterSql = AlterSql + "left join T_BD_MATERIAL c on b.FMATERIALID = c.FMATERIALID where a.fbillno = '" + FBillNo + "'";
                                    ds_AlterSql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(ctx, AlterSql);
                                    for (int j = 0; j < ds_AlterSql.Tables[0].Rows.Count; j++)
                                    {
                                        for (int k = 0; k < Common.STKEntryIds.Length; k++)
                                        {
                                            //if (ds_AlterSql.Tables[0].Rows[j]["FSEQ"].ToString().Equals(Common.Seqs[k].ToString()) && ds_AlterSql.Tables[0].Rows[j]["FMATERIALID"].ToString().Equals(Common.TarMatIds[k].ToString()))
                                            if (ds_AlterSql.Tables[0].Rows[j]["FNUMBER"].ToString().Equals(Common.STKMats[k].ToString()))
                                            {
                                                // 添加新行,把新行加入到单据体行集合
                                                JObject entryRow = new JObject();
                                                entryRows.Add(entryRow);
                                                // 给新行,设置关键字段值
                                                // 单据体主键:必须填写,系统据此判断是新增还是修改行
                                                entryRow.Add("FEntryID", ds_AlterSql.Tables[0].Rows[j]["FENTRYID"].ToString());
                                                entryRow.Add("FRealQty", Convert.ToDecimal(Common.STKqty[k].ToString()));
                                            }
                                        }
                                    }
                                    SaveResult = Save("STK_InStock", jsonRoot.ToString());
                                    try
                                    {
                                        JObject josave = (JObject)JsonConvert.DeserializeObject(SaveResult);
                                        string number = josave["Result"]["Number"].ToString();
                                        string id = josave["Result"]["Id"].ToString();
                                        if (number != "")
                                        {
                                            autrjson = "{\"CreateOrgId\":0,\"Numbers\":[\"" + FBillNo + "\"],\"InterationFlags\":\"STK_InvCheckResult\"}";
                                            result = Audit("STK_InStock", autrjson);
                                            joAudit = (JObject)JsonConvert.DeserializeObject(result);
                                            joAuditIsSucess = (JObject)JsonConvert.DeserializeObject(joAudit["Result"]["ResponseStatus"].ToString());
                                            string IsSucess = joAuditIsSucess["IsSuccess"].ToString();
                                            if (IsSucess.Equals("True"))
                                            {
                                                Kingdee.BOS.ServiceHelper.DBServiceHelper.Execute(ctx, @"/*dialect*/update MyOrderHouse set WinBillID = '" + FBillID + "',WinBillNO = '" + FBillNo + "' where io_id = '" + io_id + "'");
                                            }
                                        }
                                    }
                                    catch (Exception)
                                    {                                       
                                        throw;
                                    }                                   
                                }
                            }
                            catch (Exception)
                            {
                            }
                        }
                    }
                    #endregion
                }
            }

}

/// <summary>
        /// 登录
        /// </summary>
        /// <returns></returns>
        public bool Login()
        {
            string dbid = Common.dbid;
            string username = Common.username;
            string password = Common.password;
            var loginResult = client.Login(
                               dbid,
                               username,
                               password,
                               2052);
            return loginResult;
        }
        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="formid"></param>
        /// <param name="jsonstr"></param>
        /// <returns></returns>
        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 });
            }
            return result;
        }
        /// <summary>
        /// 审核
        /// </summary>
        /// <param name="formid"></param>
        /// <param name="jsonstr"></param>
        /// <returns></returns>
        public 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;
        }
    }
}

与第三方系统对接,生成Cloud出入库单据的更多相关文章

  1. 安卓智能POS终端手持机PDA应用仓库出入库,移库,盘点,销售开单系统

    随着移动互联网的兴起,目前仓储管理所面临的的问题可以迎刃而解,WMS仓库系统解决方案通过智能终端扫描条码技术应用解决了工作量大导致工作效率不高,以及数据实时传输等问题,该方案主要提供仓库出入库,移库, ...

  2. PDA手持终端在ERP系统仓库管理出入库盘点环节的应用

    PDA手持终端在ERP系统仓库管理出入库盘点环节的应用 传统库存管理的数据录入过程,常采用PC机录入数据,或在电脑上结合条码枪扫描条码进行管理(非实时),造成管理上的不便.因而,采用无线(WIFI)手 ...

  3. 腾讯EC .net API对接第三方系统

    最近公司销售部门用到了腾讯EC,实现公司内部OA系统与腾讯ec的数据同步,要求如下: 1.OA内部系统账号与腾讯ec登陆账号同步 2.首先做义工客户端工具用来把现有客户导入到EC,销售人员的客户信息与 ...

  4. PDA应用在WMS仓储管理系统 实现无线扫描出入库作业

    WMS系统是根据仓储物流管理的建设实施经验而推出的一款专业化仓储管理软件.与传统进销存软件相比优势在于,其不但包含了正常的出入库.盘点等库存管理基本功能,重点在于可以实现仓库作业过程的管理,通过条码及 ...

  5. 第三方系统打开EAFC的实现

    前言:EAFC是我们公司的一个框架,一个项目上,客户的OA系统要调用我们推送过去的代办任务,希望能打开我们的代办处理界面,我们的代办处理界面是winform的.引出给出了以下的一个方案.在此备存. - ...

  6. U811.1接口EAI系列之二--生成销售出库单调用U8的EAI通用处理方法--PowerBuilder语言

    1.销售系统销售出库,更新U811.1材料库存的EAI的XML生成. 2.主要根据U8配置会生成出库单和同时是否更新库存量,还是更新现存量等等. 3.具体参考代码如下: 作者:王春天 2013-11- ...

  7. 第三方API对接如何设计接口认证?

    一.前言 在与第三方系统做接口对接时,往往需要考虑接口的安全性问题,本文主要分享几个常见的系统之间做接口对接时的认证方案. 二.认证方案 例如订单下单后通过 延时任务 对接 物流系统 这种 异步 的场 ...

  8. 基于IdentityServer的系统对接微信公众号

    业务需求 公司有两个业务系统,A和B,AB用户之间属于多对一的关系,数据库里面也就是两张表,A表有个外键指向B.现在需要实现以下几个功能. A用户扫描B的二维码,填写相关的注册信息,注册完成之后自动属 ...

  9. 应用SAP PI实现SAP BW数据仓库对于第三方系统数据完美集成以及DELTA加载的分析

    注明:本篇的技术性细节参考了SAP SCN上的一篇SAP PI 和BW集成的文章,本篇文章并不打算过多探讨实现的技术细节,因为在SCN上的这篇英文文章已经完全涵盖了技术细节和配置步骤 大家可以通过搜索 ...

随机推荐

  1. python中调用函数时,参数顺序与参数赋值问题

    设置类和函数如下:class MM(): def ff(self,url(1),method(2),data=None(3),cookie=None(4)): if method.lower()==& ...

  2. 《C/C++实现Console下的加载进度条模拟[美观版]》

    前言   有时候我们会遇到在CMD或DOS控制台上出现的加载进度条,虽然不是如网页和软件写的美观.但确确实实也有着自己的特色.而且,一个好看的加载进度条也能增加用户使用控制台程序的体验!所以,拿来研究 ...

  3. 20191228--python学习第四天

    今日内容: 列表 元组 内容回顾与补充 1.计算机基础 硬件:CPU/内存/硬盘/主板/网卡 操作系统:linux(免费/开源) centos/ubuntu/redhat   windows   ma ...

  4. java String hashCode遇到的坑

    在进行数据交换时,如果主键不是整型,需要对字符串,或联合主键拼接为字符串,进行hash,再进行取模分片,使用的是String自带的hashCode()方法,本来是件很方便的事,但是有些字符串取hash ...

  5. 【算法总结】图论/dp-动态规划 大总结

    写于一只蹲在角落的蒟蒻-Z__X... 2020.2.7,图论和 \(dp\) 终于告一段落.蓦然回首,好似已走过许多...不曾细细品味,太多太多又绵延不断地向我涌来... 谨以此纪念 逝去 的图论和 ...

  6. 【2020】DBus,一个更能满足企业需求的大数据采集平台

    功能远超Sqoop.DataX.Flume.Logatash.Filebeat等采集工具 注:由于文章篇幅有限,完整文档可扫免费获取 深知其他组件的局限性,才能彰显DBus的优越感 当前有很多数据采集 ...

  7. 珠峰-babel

    #### babel 翻译的require为了给node使用么.浏览器可以使用么.#### amd, cmd的规范.和实现原理.#### babel的三个核心包,什么使用使用.#### babel的几 ...

  8. IO包中的RandomAccessFile类

    RandomAccessFile RandomAccessFile 是随机访问文件的类.它支持对文件随机访问的读取和写入,即我们也可以从指定的位置读取/写入文件数据,因为该类在其内部封装了一个数组和指 ...

  9. redis集群redis-cluster搭建

    redis集群搭建--参考微信公众号(诗情画意程序员):https://mp.weixin.qq.com/s/s5eJE801TInHgb8bzCapJQ 这是来自redis官网的一段介绍,大概意思就 ...

  10. 部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了

    部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 ​ momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Do ...