调用金蝶单据查询接口同步基础资料,账户信息改为从c盘获取,接口改为放到同步基础资料控制器里;夏宝生产入库单接口
2个文件已修改
1个文件已添加
2116 ■■■■ 已修改文件
WebAPI/Controllers/数据同步/金蝶基础资料同步/KDBaseInfoSyncController.cs 1077 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebAPI/Controllers/条码管理/WEBSController.cs 1038 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebAPI/WebAPI.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebAPI/Controllers/Êý¾Ýͬ²½/½ðµû»ù´¡×ÊÁÏͬ²½/KDBaseInfoSyncController.cs
New file
@@ -0,0 +1,1077 @@
using DAL;
using DBUtility;
using Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using SQLHelper;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Windows.Forms;
using WebAPI;
using WebAPI.Models;
using WebAPI.Service;
using WebAPI.Utility;
using Alex.Kingdee.Cloud.WebAPI.Client;
namespace WebAPI.Controllers.数据同步.金蝶基础资料同步
{
    public class KDBaseInfoSyncController : ApiController
    {
        private json objJsonResult = new json();
        SQLHelper.ClsCN oCn = new SQLHelper.ClsCN();
        private static string CloudUrl = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl");//K/3 Cloud ä¸šåŠ¡ç«™ç‚¹åœ°å€
        #region è°ƒç”¨é‡‘蝶webapi接口同步基础资料方法
        #region å°†é‡‘蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
        public static JArray ConvertKingdeeResultToObjects(string rawJson, string fieldKeys)
        {
            // <param name="rawJson">API è¿”回的原始 JSON å­—符串(如 [[...],[...]])</param>
            // <param name="fieldKeys">查询时传入的 FieldKeys å­—符串(逗号分隔)</param>
            // 1. è§£æžåŽŸå§‹æ•°æ®ä¸º JArray(二维数组)
            JArray rawData = JArray.Parse(rawJson);
            // 2. æ‹†åˆ†å­—段名数组
            string[] fieldNames = fieldKeys.Split(',')
                                           .Select(f => f.Trim())
                                           .ToArray();
            // 3. åˆ›å»ºç»“果数组
            JArray result = new JArray();
            // 4. éåŽ†æ¯ä¸€è¡Œæ•°æ®
            foreach (JArray row in rawData)
            {
                JObject obj = new JObject();
                // 5. æŒ‰ç´¢å¼•位置映射字段名和值
                for (int i = 0; i < fieldNames.Length && i < row.Count; i++)
                {
                    obj[fieldNames[i]] = row[i];
                }
                result.Add(obj);
            }
            return result;
        }
        #endregion
        #region ç‰©æ–™åŸºç¡€èµ„料同步
        [Route("WEBSController/MaterialDataToLocalByKDWebApi")]
        [HttpGet]
        public object MaterialDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            string sJson = "";
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FMATERIALID,FNumber,FName,FSpecification,FFORBIDSTATUS,FErpClsID,FSTOREUNITID,FLENGTH,FWIDTH,FHEIGHT,FNETWEIGHT,FGROSSWEIGHT,FOLDNUMBER,FSTOCKID,FStockPlaceID,FPLANMODE,FCREATORID,FAPPROVERID,FAPPROVEDATE,FMODIFYDATE,FCREATEORGID,FUSEORGID,FISBATCHMANAGE,FCHECKINCOMING,FISENABLE1,FISKFPERIOD,FEXPUNIT,FEXPPERIOD,FAUXUNITID,FSNUNIT,FBASEUNITID,FSALEUNITID,FSALEPRICEUNITID,FPERUNITSTANDHOUR,FSTDLABORPREPARETIME,FSTDMACHINEPREPARETIME,FMASTERID,FMAXPOQTY,FMINPOQTY,FMATERIALGROUP";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    sJson = $"{{\"FormId\":\"BD_MATERIAL\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FApproveDate >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Material where HItemID = {item["FMATERIALID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Material on");
                        //重新写入表
                        oCn.RunProc($"insert into Gy_Material(HItemID,HERPItemID,HNumber,HName,HModel,HShortNumber,HParentID" +
                        $", HLevel, HEndFlag, HStopflag, HRemark, HMaterClsID, HUnitID, HUnitGroupID" +
                        $", HLength, HWidth, HHeight, HJQty, HMQty, HOldMaterNumber, HBarCodeType" +
                        $", HWHID, HSPID, HPlanMode, HUseFlag, HMinPickQty" +
                        $", HMakeEmp, HMakeTime, HCheckEmp, HCheckTime, HUpdateTime" +
                        $", HCREATEORGID, HUSEORGID, HBatchManager, HCHECKINCOMING" +
                        $", HAuxPropFlag, HISKFPERIOD, HEXPUNIT, HEXPPERIOD" +
                        $", HAuxUnitID, HSNUnitID, HBASEUNITID, HSALEUNITID, HSALEPRICEUNITID" +
                        $", HPERUNITSTANDHOUR, HSTDLABORPREPARETIME, HSTDMACHINEPREPARETIME, HMASTERID" +
                        $", HMaxPOQty, HMinPOQty, HMaterTypeID) " +
                        $" values ( {item["FMATERIALID"]?.ToString()},{item["FMATERIALID"]?.ToString()},'{item["FNumber"]?.ToString()}','{item["FName"]?.ToString()}','{item["FSpecification"]?.ToString()}'" +
                        $",'{item["FNumber"]?.ToString()}',0,1,1,'{(item["FFORBIDSTATUS"]?.ToString() == "A" ? 0 : 1)}','WEBAPI-导入'" +
                        $",'{item["FErpClsID"]?.ToString()}','{item["FSTOREUNITID"]?.ToString()}',0,'{item["FLENGTH"]?.ToString()}','{item["FWIDTH"]?.ToString()}','{item["FHEIGHT"]?.ToString()}'" +
                        $",'{item["FNETWEIGHT"]?.ToString()}','{item["FGROSSWEIGHT"]?.ToString()}','{item["FOLDNUMBER"]?.ToString()}','','{item["FSTOCKID"]?.ToString()}','{item["FStockPlaceID"]?.ToString()}'" +
                        $",'{item["FPLANMODE"]?.ToString()}','未检验',0,'{item["FCREATORID"]?.ToString()}',getdate(),'{item["FAPPROVERID"]?.ToString()}'" +
                        $",'{item["FAPPROVEDATE"]?.ToString()}','{item["FMODIFYDATE"]?.ToString()}','{item["FCREATEORGID"]?.ToString()}','{item["FUSEORGID"]?.ToString()}','{(item["FISBATCHMANAGE"]?.ToString() == "1" ? 1 : 0)}','{(item["FCHECKINCOMING"]?.ToString() == "1" ? 1 : 0)}'" +
                        $",'{(item["FISENABLE1"]?.ToString() == "1" ? 1 : 0)}','{(item["FISKFPERIOD"]?.ToString() == "1" ? 1 : 0)}','{item["FEXPUNIT"]?.ToString()}','{item["FEXPPERIOD"]?.ToString()}','{item["FAUXUNITID"]?.ToString()}','{item["FSNUNIT"]?.ToString()}'" +
                        $",'{item["FBASEUNITID"]?.ToString()}','{item["FSALEUNITID"]?.ToString()}','{item["FSALEPRICEUNITID"]?.ToString()}','{item["FPERUNITSTANDHOUR"]?.ToString()}','{item["FSTDLABORPREPARETIME"]?.ToString()}','{item["FSTDMACHINEPREPARETIME"]?.ToString()}'" +
                        $",'{item["FMASTERID"]?.ToString()}','{item["FMAXPOQTY"]?.ToString()}','{item["FMINPOQTY"]?.ToString()}','{item["FMATERIALGROUP"]?.ToString()}'" +
                        $")");
                        oCn.RunProc("set identity_insert Gy_Material off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "物料信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                LogService.Write("单据查询物料信息发生异常!:" + e.ToString() + "=======递入JSON参数:" + sJson);
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询物料信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region è®¡é‡å•位基础资料同步[接口里面查询不到创建组织和使用组织,先存0,然后数据库刷新下]
        [Route("WEBSController/UnitDataToLocalByKDWebApi")]
        [HttpGet]
        public object UnitDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FUNITID,FNumber,FName,FFORBIDSTATUS";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_UNIT\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FApproveDate >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Unit where HItemID = {item["FUNITID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Unit on");
                        //重新写入表
                        oCn.RunProc($"insert into Gy_Unit(HItemID,HERPItemID,HNumber,HName,HShortNumber,HParentID" +
                        $", HLevel,HEndFlag,HStopflag,HRemark,HUseFlag,HRate" +
                        $", HMakeTime,HStandard,HCREATEORGID,HUSEORGID) " +
                        $" values ( {item["FUNITID"]?.ToString()},{item["FUNITID"]?.ToString()},'{item["FNumber"]?.ToString()}','{item["FName"]?.ToString()}','{item["FNumber"]?.ToString()}'" +
                        $",0,1,1,{(item["FFORBIDSTATUS"]?.ToString() == "A" ? 0 : 1)},'WEBAPI-导入','未检测','1',getdate(),1,{0},{0}" +
                        $")");
                        oCn.RunProc("set identity_insert Gy_Unit off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "计量单位信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询计量单位信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region éƒ¨é—¨åŸºç¡€èµ„料同步
        [Route("WEBSController/DepartmentDataToLocalByKDWebApi")]
        [HttpGet]
        public object DepartmentDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FDEPTID,FNumber,FName,FFORBIDSTATUS,FCREATEORGID,FUSEORGID";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_Department\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAuditDate  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Department where HItemID = {item["FDEPTID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Department on");
                        //重新写入表
                        oCn.RunProc("Insert Into Gy_Department " +
              "(HItemID,HNumber,HShortNumber,HName,HParentID" +
              ",HLevel,HEndFlag,HRemark,HStopFlag,HUseFlag" +
              ",HCREATEORGID,HUSEORGID,HERPItemID" +
              ") " +
              " values('" + item["FDEPTID"] + "','" + item["FNumber"] + "','" + item["FNumber"] + "','" + item["FName"] + "',0" +
              ",'',0,'" + "WEBAPI-导入" + "',0,''" +
              "," + item["FCREATEORGID"] + "," + item["FCREATEORGID"] + "," + item["FDEPTID"] +
            ") ");
                        oCn.RunProc("set identity_insert Gy_Department off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "部门信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询部门信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region ä»“库基础资料同步
        [Route("WEBSController/StockDataToLocalByKDWebApi")]
        [HttpGet]
        public object StockDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FSTOCKID,FNumber,FName,FUSEORGID,FCREATEORGID,FFORBIDSTATUS,FIsOpenLocation,FAllowMinusQty,FSTOCKPROPERTY";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_STOCK\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAuditDate  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Warehouse where HItemID = {item["FSTOCKID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Warehouse on");
                        //重新写入表
                        oCn.RunProc("Insert into Gy_Warehouse  " +
                        " (HItemID,HNumber,HName,HHelpCode,HShortNumber,HParentID" +
                        ",HLevel,HEndFlag,HStopflag,HRemark,HEmpID,HAddress,HPhone,HUSEORGID,HCREATEORGID,HSPFlag,HSPGroupID,HUnderStock,HSTOCKPROPERTY,HERPItemID) " +
                        " Values('" + item["FSTOCKID"] + "','" + item["FNumber"] + "','" + item["FName"] + "','" + 0 + "','" + item["FNumber"] + "'," + 1 +
                        "," + 1 + "," + "'true'" + "," + Convert.ToString(item["FFORBIDSTATUS"].ToString() == "A" ? 0 : 1) + ",'" + "WEBAPI-导入" + "'," + 0 + ",'" + item["FAddress"] + "','" + item["FTel"] + "','" + item["FUSEORGID"] + "','" + item["FUSEORGID"] + "','" + item["FIsOpenLocation"] + "','" + item["FSTOCKID"] + "','" + item["FAllowMinusQty"] + "','" + item["FSTOCKPROPERTY"] + "'," + item["FSTOCKID"] + ")", ref DBUtility.ClsPub.sExeReturnInfo);
                        oCn.RunProc("set identity_insert Gy_Warehouse off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "仓库信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询仓库信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region ä¾›åº”商基础资料同步
        [Route("WEBSController/SupplierDataToLocalByKDWebApi")]
        [HttpGet]
        public object SupplierDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FSUPPLIERID,FNumber,FName,FUSEORGID,FCREATEORGID,FFORBIDSTATUS,FAddress,FContact,FMobile,FLocNewContact ,FFax,FEMail ,FBankCode ,FBankHolder,FTaxType,FTaxRateId ,FCountry ,FPayCurrencyId";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_Supplier\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAuditDate  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Supplier where HItemID = {item["FSUPPLIERID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Supplier on");
                        oCn.RunProc("Insert Into Gy_Supplier " +
                         "(HItemID,HNumber,HName,HHelpCode,HShortNumber,HParentID" +
                             ",HLevel,HEndFlag,HStopflag,HRemark" +
                             ",HShortName,HAddress,HLinkMan,HLinkPhone,HMobilePhone" +
                             ",HFax,HPostalCode,HEmail,HBank,HBankAccount" +
                             ",HTaxNum,HTaxRate,HCountry,HCorMan,HEnglishName" +
                             ",HEnglishAddress,HCurID,HSSID,HAreaID,HMaterClass,HERPItemID,HUseOrgID,HCreateOrgID) " +
                         " values('" + item["FSUPPLIERID"] + "','" + item["FNumber"] + "','" + item["FName"] + "','" + 1 + "','" + item["FNumber"] + "','" + 1 + "'" +
                         "," + 1 + ",0,'" + (item["FFORBIDSTATUS"].ToString() == "A" ? 0 : 1) + "','" + "WEBAPI-导入" + "'" +
                         ",'" + item["FName"] + "','" + item["FAddress"] + "','" + item["FLocNewContact"] + "','" + item["FMobile"] + "','" + item["FMobile"] + "'" +
                         ",'" + item["FFax"] + "','" + 0 + "','" + item["FEMail "] + "','" + item["FBankHolder"] + "','" + item["FBankCode"] + "'" +
                         ",'" + item["FTaxType"] + "','" + item["FTaxRateId  "] + "','" + item["FCountry "] + "','" + "" + "','" + "" + "'" +
                         ",'" + item["FAddress"] + "'," + item["FPayCurrencyId"] + "," + 0 + "," + 0 + ",'" + 0 +
                         "'," + item["FSUPPLIERID"] + ",'" + item["FCREATEORGID"] + "','" + item["FCREATEORGID"] +
                          "') ");
                        oCn.RunProc("set identity_insert Gy_Supplier off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "供应商信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询供应商信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region å•位换算基础资料同步
        [Route("WEBSController/UnitConvertRateDataToLocalByKDWebApi")]
        [HttpGet]
        public object UnitConvertRateDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FUNITCONVERTRATEID,FUSEORGID,FCREATEORGID,FFORBIDSTATUS,FBILLNO,FMATERIALID,FCURRENTUNITID,FDESTUNITID,FCONVERTTYPE,FCONVERTNUMERATOR,FCONVERTDENOMINATOR,FCREATORID,FCREATEDATE,FAPPROVERID,FAPPROVEDATE,FMODIFIERID,FMODIFYDATE,FFORBIDDERID,FFORBIDDATE";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_MATERIALUNITCONVERT\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FApproveDate   >= '{HDate}'\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_UnitConvertRate where HItemID = {item["FUNITCONVERTRATEID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_UnitConvertRate on");
                        string sql = "Insert into Gy_UnitConvertRate " +
                    "(HItemID,HNumber,HName,HShortNumber,HParentID,HLevel," +
                    "HEndFlag,HStopflag,HRemark,HUseFlag,HUSEORGID,HCREATEORGID," +
                    "HBILLNO,HMATERID,HCURRENTUNITID,HDESTUNITID,HCONVERTTYPE,HCONVERTNUMERATOR," +
                    "HCONVERTDENOMINATOR,HFORBIDSTATUS,HUnitID,HMaterNumber," +
                    "HMakeEmp,HMakeTime,HCheckEmp,HCheckTime,HModifyEmp,HModifyTime,HStopEmp,HStopTime) " +
                    "values('" + item["FUNITCONVERTRATEID"] + "','" + "','" + "','" + "'," + 1 + "," + 1 + ",'" +
                    "true" + "','" + (item["FFORBIDSTATUS"].ToString() == "A" ? 0 : 1) + "','WEBAPI-导入','已使用','" + item["FUSEORGID"] + "','" + item["FUSEORGID"] + "'" +
                    ",'" + item["FBILLNO"] + "','" + item["FMATERIALID"] + "','" + item["FCURRENTUNITID"] + "','" + item["FDESTUNITID"] + "','" + item["FCONVERTTYPE"] + "','" + item["FCONVERTNUMERATOR"] + "'" +
                    ",'" + item["FCONVERTDENOMINATOR"] + "','" + item["FFORBIDSTATUS"] + "','" + 0 + "','" + "'" +
                    ",'" + item["FCREATORID"] + "','" + item["FCREATEDATE"] + "','" + item["FAPPROVERID"] + "','" + item["FAPPROVEDATE"] + "','" +
                    item["FMODIFIERID"] + "','" + item["FMODIFYDATE"] + "','" + item["FFORBIDDERID"] + "','" + item["FFORBIDDATE"] + "')";
                        oCn.RunProc(sql);
                        oCn.RunProc("set identity_insert Gy_UnitConvertRate off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "单位换算信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询单位换算信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region å‘˜å·¥åŸºç¡€èµ„料同步
        [Route("WEBSController/StaffDataToLocalByKDWebApi")]
        [HttpGet]
        public object StaffDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FPERSONID,FNumber,FName,FUSEORGID,FCREATEORGID,FPOSTID,FFIRSTCARDID,FSTAFFNUMBER";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_Empinfo\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAuditDate  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Staff where HItemID = {item["FPERSONID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Staff on");
                        oCn.RunProc($@"insert into Gy_Staff(HItemID,HNumber,HName,HHelpCode,HShortNumber,HParentID
                            ,HLevel,HEndFlag,HStopflag,HRemark,HUseFlag,HUSEORGID
                            ,HCREATEORGID,HPERSONID,HPOSTID,HFIRSTCARDID,HDEPTID,HSTAFFNUMBER)
                  values({item["FPERSONID"]},'{item["FNUMBER"]}','{item["FNAME"]}','{""}','{item["FNUMBER"]}',
                        {1},{1},{"'true'"},{ 0 },
                        '{"WEBAPI-导入"}','{""}',{item["FUSEORGID"]},{item["FCREATEORGID"]},{item["FPERSONID"]},
                        {item["FPOSTID"]},{item["FFIRSTCARDID"]},{0},'{item["FSTAFFNUMBER"]}')", ref DBUtility.ClsPub.sExeReturnInfo);
                        oCn.RunProc("set identity_insert Gy_Staff off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "员工信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询员工信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region å®¢æˆ·åŸºç¡€èµ„料同步
        [Route("WEBSController/CustomerDataToLocalByKDWebApi")]
        [HttpGet]
        public object CustomerDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FCUSTID,FNUMBER,FName,FUSEORGID,FCREATEORGID,FFORBIDSTATUS,FLOCATIONSTATUS,FADDRESS,FTContact,FMOBILE ,FTAXRATE1,FZIP,FTEL,FEMail ,FINVOICEBANKNAME,FINVOICEBANKACCOUNT,FTaxRate ,FTAXREGISTERCODE ,FCOUNTRY ,FTRADINGCURRID ,FSETTLETYPEID ,FSELLER ,FCustTypeId ";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_Customer\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAPPROVEDATE  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Customer where HItemID = {item["FCUSTID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Customer on");
                        oCn.RunProc("Insert into Gy_Customer " +
                    " (HItemID,HNumber,HName,HHelpCode,HShortNumber,HParentID" +
                    ",HLevel,HEndFlag,HStopflag,HRemark" +
                    ",HShortName,HAddress,HLinkMan,HLinkPhone,HMobilePhone" +
                    ",HFax,HPostalCode,HEmail,HBank,HBankAccount" +
                    ",HTaxNum,HTaxRate,HCountry,HCorMan,HEnglishName" +
                    ",HEnglishAddress,HCurID,HSSID,HAreaID,HCusStatus" +
                    ",HEmpID,HCreditDate,HCreditRatingDate,HMaxCreditRatingDate" +
                    ",HMonthUseQty,HForecastCreditRating,HCreditLevelID,HCountAccrualRating" +
                    ",HSubsidyAccrualRating,HCreditRating,HMaxCreditRating" +
                    ",HCusTypeID,HERPItemID,HUseOrgID,HCreateOrgID) " +
                    " Values('" + item["FCUSTID"] + "','" + item["FNUMBER"] + "','" + item["FName"] + "','" + 1 + "','" + item["FNUMBER"] + "'," + 1 +
                    ", " + 1 + ",0,'" + (item["FFORBIDSTATUS"].ToString() == "A" ? 0 : 1) + "','" + "WEBAPI-导入" + "'" +
                    ",'" + item["FName"] + "','" + item["FADDRESS"] + "','" + item["FTContact"] + "','" + item["FMOBILE"] + "','" + item["FTEL"] + "'" +
                    ",'" + item["FTAXRATE1"] + "','" + item["FZIP"] + "','" + item["FEMail"] + "','" + item["FINVOICEBANKNAME"] + "','" + item["FINVOICEBANKACCOUNT"] + "'" +
                    ",'" + item["FTAXREGISTERCODE"] + "'," + item["FTaxRate"] + ",'" + item["FCOUNTRY"] + "','','','','" + item["FTRADINGCURRID"] + "','" + item["FSETTLETYPEID"] + "'," + 0 + ",'" + "合格" + "'" +
                    ",'" + 0 + "'," + 0 + "," + 0 + "," + 0 +
                    "," + 0 + "," + 0 + "," + 0 + "," + 0 +
                    "," + 0 + "," + 0 + "," + 0 +
                    ", '" + 0 + "','" + item["FCUSTID"] + "','" + item["FUSEORGID"] + "','" + item["FCREATEORGID"] + "')");
                        string sql = "set identity_insert gy_Customer off";
                        oCn.RunProc(sql);
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "客户信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询客户信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region ç»„织基础资料同步
        [Route("WEBSController/ORGANIZATIONSDataToLocalByKDWebApi")]
        [HttpGet]
        public object ORGANIZATIONSDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FORGID,FNUMBER,FName,FParentid,FFORBIDSTATUS";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"ORG_Organizations\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAUDITDATE  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Xt_ORGANIZATIONS where HItemID = {item["FORGID"]?.ToString()}");
                        // oCn.RunProc("set identity_insert Xt_ORGANIZATIONS on");
                        string sql = "Insert into Xt_ORGANIZATIONS  (HItemID,HNumber,HName,HParentID,HStopflag,HMakeTime,HRemark)" +
                          " values('" + item["FORGID"] + "','" + item["FNUMBER"] + "','" + item["FNAME"] + "','" + item["FParentid"] + "','" + (item["FFORBIDSTATUS"].ToString() == "A" ? 0 : 1) + "'," +
                         "getdate(),'" + "WEBAPI-导入" +
                          "') ";
                        oCn.RunProc(sql);
                        //oCn.RunProc("set identity_insert Xt_ORGANIZATIONS off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "组织信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询组织信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region è¾…助属性基础资料同步
        [Route("WEBSController/PropertyDataToLocalByKDWebApi")]
        [HttpGet]
        public object PropertyDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                //从C盘配置文件获取 CLOUD网址、账套信息、登录用户、登录密码
                Pub_Class.ClsPub.GetCLOUDLoginInfo(ref Pub_Class.ClsPub.sExeReturnInfo);
                var sCLOUDUseName = Pub_Class.ClsPub.sCLOUDUseName;
                var sCLOUDPsd = Pub_Class.ClsPub.sCLOUDPsd;
                var dbId = Pub_Class.ClsPub.sCLOUDAcc;
                CloudUrl = Pub_Class.ClsPub.sCLOUDUrl;
                ApiClient client = new ApiClient(CloudUrl);
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FAuxPtyValueID,FAuxPtyNumber,FAuxPtyName,FBillNo,FFORBIDSTATUS";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_AuxPtyValue\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Property where HItemID = {item["FAuxPtyValueID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Property on");
                        oCn.RunProc($@"insert into Gy_Property(HItemID,HNumber,HShortNumber,HName,HHelpCode,HParentID
                    ,HLevel,HEndFlag,HStopflag,HRemark,HPropertyTypeID,HUseFlag,HERPItemID,HMakeTime)
                  values({item["FAuxPtyValueID"]},'{item["FAuxPtyNumber"]}','{item["FAuxPtyNumber"]}','{item["FAuxPtyName"]}','{1}',{1},{1}
           ,{ 1},{Convert.ToString(item["FFORBIDSTATUS"].ToString() == "A" ? 0 : 1) },'{"WEBAPI-导入"}',{1},'{1}',{item["FAuxPtyValueID"]},{"getdate()"})", ref DBUtility.ClsPub.sExeReturnInfo);
                        oCn.RunProc("set identity_insert Gy_Property off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "辅助属性信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询辅助属性信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #endregion
    }
}
WebAPI/Controllers/ÌõÂë¹ÜÀí/WEBSController.cs
@@ -17,7 +17,6 @@
using WebAPI.Models;
using WebAPI.Service;
using WebAPI.Utility;
using Alex.Kingdee.Cloud.WebAPI.Client;
namespace WebAPI.Controllers
{
@@ -15580,1011 +15579,88 @@
        #endregion
        #region è°ƒç”¨é‡‘蝶webapi接口同步基础资料方法
        #region å°†é‡‘蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
        public static JArray ConvertKingdeeResultToObjects(string rawJson, string fieldKeys)
        {
            // <param name="rawJson">API è¿”回的原始 JSON å­—符串(如 [[...],[...]])</param>
            // <param name="fieldKeys">查询时传入的 FieldKeys å­—符串(逗号分隔)</param>
            // 1. è§£æžåŽŸå§‹æ•°æ®ä¸º JArray(二维数组)
            JArray rawData = JArray.Parse(rawJson);
            // 2. æ‹†åˆ†å­—段名数组
            string[] fieldNames = fieldKeys.Split(',')
                                           .Select(f => f.Trim())
                                           .ToArray();
            // 3. åˆ›å»ºç»“果数组
            JArray result = new JArray();
            // 4. éåŽ†æ¯ä¸€è¡Œæ•°æ®
            foreach (JArray row in rawData)
            {
                JObject obj = new JObject();
                // 5. æŒ‰ç´¢å¼•位置映射字段名和值
                for (int i = 0; i < fieldNames.Length && i < row.Count; i++)
                {
                    obj[fieldNames[i]] = row[i];
                }
                result.Add(obj);
            }
            return result;
        }
        #endregion
        #region ç‰©æ–™åŸºç¡€èµ„料同步
        [Route("WEBSController/MaterialDataToLocalByKDWebApi")]
        #region å¤å®ç”Ÿäº§å…¥åº“扫码对接接口【流水线扫描头自动扫码,mes方把入库单号、条码编号传到中间表,调用接口生成生产入库单】
        [Route("WEBSController/GetBarCodeByProdInBillNo_XB")]
        [HttpGet]
        public object MaterialDataToLocalByKDWebApi(string HDate, int limit)
        public Object GetBarCodeByProductInBillNo_XB(string HProdInBillNo)
        {
            bool hasMore = true;//是否循环查询
            string sJson = "";
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                //根据递入的生产入库单号,到扫码中间表中查询获取物料条码,并把条码写入扫码临时表
                ds = oCn.RunProcReturn("exec h_p_Kf_BarInfoIntoTemp_XB '" + HProdInBillNo + "'", "h_p_Kf_BarInfoIntoTemp_XB");
                if (!bLogin)
                if (ds.Tables[0].Rows.Count > 0)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FMATERIALID,FNumber,FName,FSpecification,FFORBIDSTATUS,FErpClsID,FSTOREUNITID,FLENGTH,FWIDTH,FHEIGHT,FNETWEIGHT,FGROSSWEIGHT,FOLDNUMBER,FSTOCKID,FStockPlaceID,FPLANMODE,FCREATORID,FAPPROVERID,FAPPROVEDATE,FMODIFYDATE,FCREATEORGID,FUSEORGID,FISBATCHMANAGE,FCHECKINCOMING,FISENABLE1,FISKFPERIOD,FEXPUNIT,FEXPPERIOD,FAUXUNITID,FSNUNIT,FBASEUNITID,FSALEUNITID,FSALEPRICEUNITID,FPERUNITSTANDHOUR,FSTDLABORPREPARETIME,FSTDMACHINEPREPARETIME,FMASTERID,FMAXPOQTY,FMINPOQTY,FMATERIALGROUP";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    sJson = $"{{\"FormId\":\"BD_MATERIAL\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FApproveDate >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    if (ds.Tables[0].Rows[0]["HBack"].ToString() == "1")
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                        objJsonResult.code = "0";
                        objJsonResult.count = 0;
                        objJsonResult.Message = ds.Tables[0].Rows[0]["HBackRemark"].ToString();  //失败!
                        objJsonResult.data = null;
                        return objJsonResult;
                    }
                    WebS.ClsKf_ProductInBillMain websLsmain = new WebS.ClsKf_ProductInBillMain();
                    string sSourceType = ds.Tables[0].Rows[0]["HMainSourceBillType"].ToString();
                    websLsmain.HInterID = Convert.ToInt32(ds.Tables[0].Rows[0]["HInterID"]);
                    websLsmain.HBillNo = ds.Tables[0].Rows[0]["HBillNo"].ToString();
                    websLsmain.HBillType = ds.Tables[0].Rows[0]["HBillType"].ToString();
                    websLsmain.HDate = Convert.ToDateTime(ds.Tables[0].Rows[0]["HDate"]);
                    websLsmain.HDeptID = Convert.ToInt32(ds.Tables[0].Rows[0]["HDeptID"]);
                    websLsmain.HWHID = Convert.ToInt32(ds.Tables[0].Rows[0]["HWHID"]);
                    websLsmain.HSCWHID = Convert.ToInt32(ds.Tables[0].Rows[0]["HSCWHID"]);
                    websLsmain.HSupID = Convert.ToInt32(ds.Tables[0].Rows[0]["HSupID"]);
                    websLsmain.HKeeperID = Convert.ToInt32(ds.Tables[0].Rows[0]["HKeeperID"]);
                    websLsmain.HSecManagerID = Convert.ToInt32(ds.Tables[0].Rows[0]["HSecManagerID"]);
                    websLsmain.HEmpID = Convert.ToInt32(ds.Tables[0].Rows[0]["HEmpID"]);
                    websLsmain.HManagerID = Convert.ToInt32(ds.Tables[0].Rows[0]["HManagerID"]);
                    websLsmain.HRemark = ds.Tables[0].Rows[0]["HRemark"].ToString();
                    websLsmain.HExplanation = ds.Tables[0].Rows[0]["HExplanation"].ToString();
                    websLsmain.HInnerBillNo = ds.Tables[0].Rows[0]["HInnerBillNo"].ToString();
                    websLsmain.HRedBlueFlag = Convert.ToBoolean(ds.Tables[0].Rows[0]["HRedBlueFlag"]);
                    websLsmain.HBillSubType = ds.Tables[0].Rows[0]["HBillSubType"].ToString();
                    websLsmain.HMainSourceBillType = "生产订单";
                    websLsmain.HMaker = ds.Tables[0].Rows[0]["HMaker"].ToString();
                    websLsmain.HBillerID = Convert.ToInt32(ds.Tables[0].Rows[0]["HBillerID"]);
                    websLsmain.HSTOCKORGID = Convert.ToInt32(ds.Tables[0].Rows[0]["HSTOCKORGID"]);
                    websLsmain.HOWNERID = Convert.ToInt32(ds.Tables[0].Rows[0]["HSTOCKORGID"]);
                    if (oWebs.set_SaveProductInBill_New(websLsmain, sSourceType, ref DBUtility.ClsPub.sErrInfo))
                    {
                        objJsonResult.code = "1";
                        objJsonResult.count = 1;
                        objJsonResult.Message = DBUtility.ClsPub.sErrInfo;  //成功!
                        objJsonResult.data = null;
                        return objJsonResult;
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Material where HItemID = {item["FMATERIALID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Material on");
                        //重新写入表
                        oCn.RunProc($"insert into Gy_Material(HItemID,HERPItemID,HNumber,HName,HModel,HShortNumber,HParentID" +
                        $", HLevel, HEndFlag, HStopflag, HRemark, HMaterClsID, HUnitID, HUnitGroupID" +
                        $", HLength, HWidth, HHeight, HJQty, HMQty, HOldMaterNumber, HBarCodeType" +
                        $", HWHID, HSPID, HPlanMode, HUseFlag, HMinPickQty" +
                        $", HMakeEmp, HMakeTime, HCheckEmp, HCheckTime, HUpdateTime" +
                        $", HCREATEORGID, HUSEORGID, HBatchManager, HCHECKINCOMING" +
                        $", HAuxPropFlag, HISKFPERIOD, HEXPUNIT, HEXPPERIOD" +
                        $", HAuxUnitID, HSNUnitID, HBASEUNITID, HSALEUNITID, HSALEPRICEUNITID" +
                        $", HPERUNITSTANDHOUR, HSTDLABORPREPARETIME, HSTDMACHINEPREPARETIME, HMASTERID" +
                        $", HMaxPOQty, HMinPOQty, HMaterTypeID) " +
                        $" values ( {item["FMATERIALID"]?.ToString()},{item["FMATERIALID"]?.ToString()},'{item["FNumber"]?.ToString()}','{item["FName"]?.ToString()}','{item["FSpecification"]?.ToString()}'" +
                        $",'{item["FNumber"]?.ToString()}',0,1,1,'{(item["FFORBIDSTATUS"]?.ToString() == "A" ? 0 : 1)}','WEBAPI-导入'" +
                        $",'{item["FErpClsID"]?.ToString()}','{item["FSTOREUNITID"]?.ToString()}',0,'{item["FLENGTH"]?.ToString()}','{item["FWIDTH"]?.ToString()}','{item["FHEIGHT"]?.ToString()}'" +
                        $",'{item["FNETWEIGHT"]?.ToString()}','{item["FGROSSWEIGHT"]?.ToString()}','{item["FOLDNUMBER"]?.ToString()}','','{item["FSTOCKID"]?.ToString()}','{item["FStockPlaceID"]?.ToString()}'" +
                        $",'{item["FPLANMODE"]?.ToString()}','未检验',0,'{item["FCREATORID"]?.ToString()}',getdate(),'{item["FAPPROVERID"]?.ToString()}'" +
                        $",'{item["FAPPROVEDATE"]?.ToString()}','{item["FMODIFYDATE"]?.ToString()}','{item["FCREATEORGID"]?.ToString()}','{item["FUSEORGID"]?.ToString()}','{(item["FISBATCHMANAGE"]?.ToString() == "1" ? 1 : 0)}','{(item["FCHECKINCOMING"]?.ToString() == "1" ? 1 : 0)}'" +
                        $",'{(item["FISENABLE1"]?.ToString() == "1" ? 1 : 0)}','{(item["FISKFPERIOD"]?.ToString() == "1" ? 1 : 0)}','{item["FEXPUNIT"]?.ToString()}','{item["FEXPPERIOD"]?.ToString()}','{item["FAUXUNITID"]?.ToString()}','{item["FSNUNIT"]?.ToString()}'" +
                        $",'{item["FBASEUNITID"]?.ToString()}','{item["FSALEUNITID"]?.ToString()}','{item["FSALEPRICEUNITID"]?.ToString()}','{item["FPERUNITSTANDHOUR"]?.ToString()}','{item["FSTDLABORPREPARETIME"]?.ToString()}','{item["FSTDMACHINEPREPARETIME"]?.ToString()}'" +
                        $",'{item["FMASTERID"]?.ToString()}','{item["FMAXPOQTY"]?.ToString()}','{item["FMINPOQTY"]?.ToString()}','{item["FMATERIALGROUP"]?.ToString()}'" +
                        $")");
                        oCn.RunProc("set identity_insert Gy_Material off");
                        objJsonResult.code = "0";
                        objJsonResult.count = 0;
                        objJsonResult.Message = DBUtility.ClsPub.sErrInfo;  //失败!
                        objJsonResult.data = null;
                        return objJsonResult;
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "物料信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                LogService.Write("单据查询物料信息发生异常!:" + e.ToString() + "=======递入JSON参数:" + sJson);
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询物料信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region è®¡é‡å•位基础资料同步[接口里面查询不到创建组织和使用组织,先存0,然后数据库刷新下]
        [Route("WEBSController/UnitDataToLocalByKDWebApi")]
        [HttpGet]
        public object UnitDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                else
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.Message = "未返回数据。";  //失败!
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FUNITID,FNumber,FName,FFORBIDSTATUS";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_UNIT\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FApproveDate >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Unit where HItemID = {item["FUNITID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Unit on");
                        //重新写入表
                        oCn.RunProc($"insert into Gy_Unit(HItemID,HERPItemID,HNumber,HName,HShortNumber,HParentID" +
                        $", HLevel,HEndFlag,HStopflag,HRemark,HUseFlag,HRate" +
                        $", HMakeTime,HStandard,HCREATEORGID,HUSEORGID) " +
                        $" values ( {item["FUNITID"]?.ToString()},{item["FUNITID"]?.ToString()},'{item["FNumber"]?.ToString()}','{item["FName"]?.ToString()}','{item["FNumber"]?.ToString()}'" +
                        $",0,1,1,{(item["FFORBIDSTATUS"]?.ToString() == "A" ? 0 : 1)},'WEBAPI-导入','未检测','1',getdate(),1,{0},{0}" +
                        $")");
                        oCn.RunProc("set identity_insert Gy_Unit off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "计量单位信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
                }
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询计量单位信息发生异常!" + e.ToString();
                objJsonResult.Message = "接口请求异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
            }
        }
        #endregion
        #region éƒ¨é—¨åŸºç¡€èµ„料同步
        [Route("WEBSController/DepartmentDataToLocalByKDWebApi")]
        [HttpGet]
        public object DepartmentDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FDEPTID,FNumber,FName,FFORBIDSTATUS,FCREATEORGID,FUSEORGID";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_Department\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAuditDate  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Department where HItemID = {item["FDEPTID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Department on");
                        //重新写入表
                        oCn.RunProc("Insert Into Gy_Department " +
              "(HItemID,HNumber,HShortNumber,HName,HParentID" +
              ",HLevel,HEndFlag,HRemark,HStopFlag,HUseFlag" +
              ",HCREATEORGID,HUSEORGID,HERPItemID" +
              ") " +
              " values('" + item["FDEPTID"] + "','" + item["FNumber"] + "','" + item["FNumber"] + "','" + item["FName"] + "',0" +
              ",'',0,'" + "CLD-ERP导入" + "',0,''" +
              "," + item["FCREATEORGID"] + "," + item["FCREATEORGID"] + "," + item["FDEPTID"] +
            ") ");
                        oCn.RunProc("set identity_insert Gy_Department off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "部门信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询部门信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region ä»“库基础资料同步
        [Route("WEBSController/StockDataToLocalByKDWebApi")]
        [HttpGet]
        public object StockDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FSTOCKID,FNumber,FName,FUSEORGID,FCREATEORGID,FFORBIDSTATUS,FIsOpenLocation,FAllowMinusQty,FSTOCKPROPERTY";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_STOCK\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAuditDate  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Warehouse where HItemID = {item["FSTOCKID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Warehouse on");
                        //重新写入表
                        oCn.RunProc("Insert into Gy_Warehouse  " +
                        " (HItemID,HNumber,HName,HHelpCode,HShortNumber,HParentID" +
                        ",HLevel,HEndFlag,HStopflag,HRemark,HEmpID,HAddress,HPhone,HUSEORGID,HCREATEORGID,HSPFlag,HSPGroupID,HUnderStock,HSTOCKPROPERTY,HERPItemID) " +
                        " Values('" + item["FSTOCKID"] + "','" + item["FNumber"] + "','" + item["FName"] + "','" +0 + "','" + item["FNumber"] + "'," + 1 +
                        "," + 1 + "," + "'true'" + "," + Convert.ToString(item["FFORBIDSTATUS"].ToString()=="A" ? 0 : 1) + ",'" + "CLD-ERP导入" + "'," + 0 + ",'" + item["FAddress"] + "','" + item["FTel"] + "','" + item["FUSEORGID"] + "','" + item["FUSEORGID"] + "','" + item["FIsOpenLocation"] + "','" + item["FSTOCKID"] + "','" + item["FAllowMinusQty"] + "','" + item["FSTOCKPROPERTY"] + "'," + item["FSTOCKID"] + ")", ref DBUtility.ClsPub.sExeReturnInfo);
                        oCn.RunProc("set identity_insert Gy_Warehouse off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "仓库信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询仓库信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region ä¾›åº”商基础资料同步
        [Route("WEBSController/SupplierDataToLocalByKDWebApi")]
        [HttpGet]
        public object SupplierDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FSUPPLIERID,FNumber,FName,FUSEORGID,FCREATEORGID,FFORBIDSTATUS,FAddress,FContact,FMobile,FLocNewContact ,FFax,FEMail ,FBankCode ,FBankHolder,FTaxType,FTaxRateId ,FCountry ,FPayCurrencyId";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_Supplier\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAuditDate  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Supplier where HItemID = {item["FSUPPLIERID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Supplier on");
                        oCn.RunProc("Insert Into Gy_Supplier " +
                         "(HItemID,HNumber,HName,HHelpCode,HShortNumber,HParentID" +
                             ",HLevel,HEndFlag,HStopflag,HRemark" +
                             ",HShortName,HAddress,HLinkMan,HLinkPhone,HMobilePhone" +
                             ",HFax,HPostalCode,HEmail,HBank,HBankAccount" +
                             ",HTaxNum,HTaxRate,HCountry,HCorMan,HEnglishName" +
                             ",HEnglishAddress,HCurID,HSSID,HAreaID,HMaterClass,HERPItemID,HUseOrgID,HCreateOrgID) " +
                         " values('" + item["FSUPPLIERID"] + "','" + item["FNumber"] + "','" + item["FName"] + "','" + 1 + "','" + item["FNumber"] + "','" + 1 + "'" +
                         "," + 1+ ",0,'" + (item["FFORBIDSTATUS"].ToString() == "A" ? 0 : 1) + "','" + "CLD-ERP导入" + "'" +
                         ",'" + item["FName"] + "','" + item["FAddress"] + "','" + item["FLocNewContact"] + "','" + item["FMobile"] + "','" + item["FMobile"] + "'" +
                         ",'" + item["FFax"] + "','" + 0 + "','" + item["FEMail "] + "','" + item["FBankHolder"] + "','" + item["FBankCode"] + "'" +
                         ",'" + item["FTaxType"] + "','" + item["FTaxRateId  "] + "','" + item["FCountry "] + "','" + "" + "','" + "" + "'" +
                         ",'" + item["FAddress"] + "'," + item["FPayCurrencyId"] + "," + 0 + "," + 0 + ",'" + 0 +
                         "'," + item["FSUPPLIERID"] + ",'" + item["FCREATEORGID"] + "','" + item["FCREATEORGID"] +
                          "') ");
                        oCn.RunProc("set identity_insert Gy_Supplier off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "供应商信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询供应商信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region å•位换算基础资料同步
        [Route("WEBSController/UnitConvertRateDataToLocalByKDWebApi")]
        [HttpGet]
        public object UnitConvertRateDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FUNITCONVERTRATEID,FUSEORGID,FCREATEORGID,FFORBIDSTATUS,FBILLNO,FMATERIALID,FCURRENTUNITID,FDESTUNITID,FCONVERTTYPE,FCONVERTNUMERATOR,FCONVERTDENOMINATOR,FCREATORID,FCREATEDATE,FAPPROVERID,FAPPROVEDATE,FMODIFIERID,FMODIFYDATE,FFORBIDDERID,FFORBIDDATE";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_MATERIALUNITCONVERT\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FApproveDate   >= '{HDate}'\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_UnitConvertRate where HItemID = {item["FUNITCONVERTRATEID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_UnitConvertRate on");
                       string sql = "Insert into Gy_UnitConvertRate " +
                   "(HItemID,HNumber,HName,HShortNumber,HParentID,HLevel," +
                   "HEndFlag,HStopflag,HRemark,HUseFlag,HUSEORGID,HCREATEORGID," +
                   "HBILLNO,HMATERID,HCURRENTUNITID,HDESTUNITID,HCONVERTTYPE,HCONVERTNUMERATOR," +
                   "HCONVERTDENOMINATOR,HFORBIDSTATUS,HUnitID,HMaterNumber," +
                   "HMakeEmp,HMakeTime,HCheckEmp,HCheckTime,HModifyEmp,HModifyTime,HStopEmp,HStopTime) " +
                   "values('" + item["FUNITCONVERTRATEID"] + "','"  + "','"  + "','"  + "'," + 1 + "," + 1 + ",'" +
                   "true" + "','" + (item["FFORBIDSTATUS"].ToString()=="A"?0:1) + "','CLD-ERP导入','已使用','" + item["FUSEORGID"] + "','" + item["FUSEORGID"] + "'" +
                   ",'" + item["FBILLNO"] + "','" + item["FMATERIALID"] + "','" + item["FCURRENTUNITID"] + "','" + item["FDESTUNITID"] + "','" + item["FCONVERTTYPE"] + "','" + item["FCONVERTNUMERATOR"] + "'" +
                   ",'" + item["FCONVERTDENOMINATOR"] + "','" + item["FFORBIDSTATUS"] + "','" + 0 + "','"  + "'" +
                   ",'" + item["FCREATORID"] + "','" + item["FCREATEDATE"] + "','" + item["FAPPROVERID"] + "','" + item["FAPPROVEDATE"] + "','" +
                   item["FMODIFIERID"] + "','" + item["FMODIFYDATE"] + "','" + item["FFORBIDDERID"] + "','" + item["FFORBIDDATE"] + "')";
                        oCn.RunProc(sql);
                        oCn.RunProc("set identity_insert Gy_UnitConvertRate off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "单位换算信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询单位换算信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region å‘˜å·¥åŸºç¡€èµ„料同步
        [Route("WEBSController/StaffDataToLocalByKDWebApi")]
        [HttpGet]
        public object StaffDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FPERSONID,FNumber,FName,FUSEORGID,FCREATEORGID,FPOSTID,FFIRSTCARDID,FSTAFFNUMBER";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_Empinfo\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAuditDate  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Staff where HItemID = {item["FPERSONID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Staff on");
                        oCn.RunProc($@"insert into Gy_Staff(HItemID,HNumber,HName,HHelpCode,HShortNumber,HParentID
                            ,HLevel,HEndFlag,HStopflag,HRemark,HUseFlag,HUSEORGID
                            ,HCREATEORGID,HPERSONID,HPOSTID,HFIRSTCARDID,HDEPTID,HSTAFFNUMBER)
                  values({item["FPERSONID"]},'{item["FNUMBER"]}','{item["FNAME"]}','{""}','{item["FNUMBER"]}',
                        {1},{1},{"'true'"},{ 0 },
                        '{"CLD-ERP"}','{""}',{item["FUSEORGID"]},{item["FCREATEORGID"]},{item["FPERSONID"]},
                        {item["FPOSTID"]},{item["FFIRSTCARDID"]},{0},'{item["FSTAFFNUMBER"]}')", ref DBUtility.ClsPub.sExeReturnInfo);
                        oCn.RunProc("set identity_insert Gy_Staff off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "员工信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询员工信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region å®¢æˆ·åŸºç¡€èµ„料同步
        [Route("WEBSController/CustomerDataToLocalByKDWebApi")]
        [HttpGet]
        public object CustomerDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FCUSTID,FNUMBER,FName,FUSEORGID,FCREATEORGID,FFORBIDSTATUS,FLOCATIONSTATUS,FADDRESS,FTContact,FMOBILE ,FTAXRATE1,FZIP,FTEL,FEMail ,FINVOICEBANKNAME,FINVOICEBANKACCOUNT,FTaxRate ,FTAXREGISTERCODE ,FCOUNTRY ,FTRADINGCURRID ,FSETTLETYPEID ,FSELLER ,FCustTypeId ";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_Customer\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAPPROVEDATE  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Customer where HItemID = {item["FCUSTID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Customer on");
                        oCn.RunProc("Insert into Gy_Customer " +
                    " (HItemID,HNumber,HName,HHelpCode,HShortNumber,HParentID" +
                    ",HLevel,HEndFlag,HStopflag,HRemark" +
                    ",HShortName,HAddress,HLinkMan,HLinkPhone,HMobilePhone" +
                    ",HFax,HPostalCode,HEmail,HBank,HBankAccount" +
                    ",HTaxNum,HTaxRate,HCountry,HCorMan,HEnglishName" +
                    ",HEnglishAddress,HCurID,HSSID,HAreaID,HCusStatus" +
                    ",HEmpID,HCreditDate,HCreditRatingDate,HMaxCreditRatingDate" +
                    ",HMonthUseQty,HForecastCreditRating,HCreditLevelID,HCountAccrualRating" +
                    ",HSubsidyAccrualRating,HCreditRating,HMaxCreditRating" +
                    ",HCusTypeID,HERPItemID,HUseOrgID,HCreateOrgID) " +
                    " Values('" + item["FCUSTID"] + "','" + item["FNUMBER"] + "','" + item["FName"] + "','" + 1 + "','" + item["FNUMBER"] + "'," + 1 +
                    ", " + 1 + ",0,'" + (item["FFORBIDSTATUS"].ToString()=="A"?0:1) + "','" + "ERP导入" + "'" +
                    ",'" + item["FName"] + "','" + item["FADDRESS"] + "','" + item["FTContact"] + "','" + item["FMOBILE"] + "','" + item["FTEL"] + "'" +
                    ",'" + item["FTAXRATE1"] + "','" + item["FZIP"] + "','" + item["FEMail"] + "','" + item["FINVOICEBANKNAME"] + "','" + item["FINVOICEBANKACCOUNT"] + "'" +
                    ",'" + item["FTAXREGISTERCODE"] + "'," + item["FTaxRate"] + ",'" + item["FCOUNTRY"] + "','','','','" + item["FTRADINGCURRID"] + "','" + item["FSETTLETYPEID"] + "'," + 0 + ",'" + "合格" + "'" +
                    ",'" + 0+ "'," + 0 + "," + 0 + "," + 0 +
                    "," + 0 + "," + 0 + "," + 0+ "," + 0 +
                    "," + 0 + "," + 0 + "," + 0 +
                    ", '" + 0 + "','" + item["FCUSTID"] + "','" + item["FUSEORGID"] + "','" + item["FCREATEORGID"] + "')");
                        string sql = "set identity_insert gy_Customer off";
                        oCn.RunProc(sql);
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "客户信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询客户信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region ç»„织基础资料同步
        [Route("WEBSController/ORGANIZATIONSDataToLocalByKDWebApi")]
        [HttpGet]
        public object ORGANIZATIONSDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FORGID,FNUMBER,FName,FParentid,FFORBIDSTATUS";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"ORG_Organizations\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"FAUDITDATE  >= '{HDate}' and FLOCALEID = 2052\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Xt_ORGANIZATIONS where HItemID = {item["FORGID"]?.ToString()}");
                       // oCn.RunProc("set identity_insert Xt_ORGANIZATIONS on");
                        string sql = "Insert into Xt_ORGANIZATIONS  (HItemID,HNumber,HName,HParentID,HStopflag,HMakeTime,HRemark)" +
                          " values('" + item["FORGID"] + "','" + item["FNUMBER"] + "','" + item["FNAME"] + "','" + item["FParentid"] + "','" + (item["FFORBIDSTATUS"].ToString()=="A"?0:1) + "'," +
                         "getdate(),'" + "CLD导入" +
                          "') ";
                        oCn.RunProc(sql);
                        //oCn.RunProc("set identity_insert Xt_ORGANIZATIONS off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "组织信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询组织信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #region è¾…助属性基础资料同步
        [Route("WEBSController/PropertyDataToLocalByKDWebApi")]
        [HttpGet]
        public object PropertyDataToLocalByKDWebApi(string HDate, int limit)
        {
            bool hasMore = true;//是否循环查询
            try
            {
                //访问金蝶
                string sCLOUDUseName = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "UserName");
                string sCLOUDPsd = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "PassWord");
                string dbId = Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "DbId");
                ApiClient client = new ApiClient(Util.GetConfigKey(AppDomain.CurrentDomain.BaseDirectory + "/Config/kdapi.config", "KDApiUrl"));
                bool bLogin = client.Login(dbId, sCLOUDUseName, sCLOUDPsd, 2052);
                string HReturn;
                int startRow = 0;//分页,从第1条开始查询
                List<JObject> allData = new List<JObject>();//接收存储所有查询到的数据
                if (!bLogin)
                {
                    objJsonResult.code = "0";
                    objJsonResult.count = 0;
                    objJsonResult.Message = "同步基础资料失败,金蝶账号登录异常。";
                    objJsonResult.data = null;
                    return objJsonResult;
                }
                //要通过接口查询的字段
                string fieldKeys = "FAuxPtyValueID,FAuxPtyNumber,FAuxPtyName,FBillNo,FFORBIDSTATUS";
                oCn.BeginTran();//开始事务
                while (hasMore) //循环分组查询,避免漏同步
                {
                    //拼接单据查询接口参数
                    string sJson = $"{{\"FormId\":\"BD_AuxPtyValue\",\"FieldKeys\":\"{fieldKeys}\",\"FilterString\":\"\",\"Limit\":{limit},\"StartRow\":{startRow},\"TopRowCount\":0}}";
                    //调用金蝶webapi单据查询接口
                    var HReurnData = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery",
                    new object[] { sJson });
                    //将金蝶单据查询WEBAPI接口返回的纯数组转换为带字段名的对象列表
                    JArray formattedData = ConvertKingdeeResultToObjects(HReurnData, fieldKeys);
                    if (formattedData.Count < limit)
                    {
                        hasMore = false; // å¦‚果本次返回的数量少于请求的 limit,说明已经是最后一页了
                    }
                    else
                    {
                        startRow += limit; // å¦åˆ™ï¼Œå¢žåŠ èµ·å§‹è¡Œç´¢å¼•ï¼Œå‡†å¤‡è¯·æ±‚ä¸‹ä¸€é¡µ
                    }
                    foreach (JObject item in formattedData)
                    {
                        //删除原有记录
                        oCn.RunProc($"delete from Gy_Property where HItemID = {item["FAuxPtyValueID"]?.ToString()}");
                        oCn.RunProc("set identity_insert Gy_Property on");
                        oCn.RunProc($@"insert into Gy_Property(HItemID,HNumber,HShortNumber,HName,HHelpCode,HParentID
                    ,HLevel,HEndFlag,HStopflag,HRemark,HPropertyTypeID,HUseFlag,HERPItemID,HMakeTime)
                  values({item["FAuxPtyValueID"]},'{item["FAuxPtyNumber"]}','{item["FAuxPtyNumber"]}','{item["FAuxPtyName"]}','{1}',{1},{1}
           ,{ 1},{Convert.ToString(item["FFORBIDSTATUS"].ToString()=="A" ? 0 : 1) },'{"ERP导入"}',{1},'{1}',{item["FAuxPtyValueID"]},{"getdate()"})", ref DBUtility.ClsPub.sExeReturnInfo);
                        oCn.RunProc("set identity_insert Gy_Property off");
                    }
                }
                oCn.Commit(); //提交事务
                objJsonResult.code = "1";
                objJsonResult.count = 1;
                objJsonResult.Message = "辅助属性信息同步成功";
                objJsonResult.data = "";
                return objJsonResult;
            }
            catch (Exception e)
            {
                hasMore = false;
                oCn.RollBack();//回滚事务
                objJsonResult.code = "0";
                objJsonResult.count = 0;
                objJsonResult.Message = "单据查询辅助属性信息发生异常!" + e.ToString();
                objJsonResult.data = null;
                return objJsonResult;
            }
        }
        #endregion
        #endregion
        #endregion
    }
}
WebAPI/WebAPI.csproj
@@ -736,6 +736,7 @@
    <Compile Include="Controllers\成本管理\CB_ActualItemMoneyCostController.cs" />
    <Compile Include="Controllers\成本管理\CB_WipProcessTableController.cs" />
    <Compile Include="Controllers\成本管理\成本费用调整单\CB_ChangeMoneyBillController.cs" />
    <Compile Include="Controllers\数据同步\金蝶基础资料同步\KDBaseInfoSyncController.cs" />
    <Compile Include="Controllers\检验申请单\QC_RequestCheckBillController.cs" />
    <Compile Include="Controllers\物流管理\其他结算单\YF_PayMentOtherBillTranController.cs" />
    <Compile Include="Controllers\物流管理\出运单\WLYayBillController.cs" />