using HH.YiDaSyncNC.Dtos; using HH.YiDaSyncNC.Dtos.NC; using HH.YiDaSyncNC.Dtos.YIDA; using HH.YiDaSyncNC.Helper; using HH.YiDaSyncNC.Models; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Reflection; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace HH.YiDaSyncNC.DataSync { public class FKGL_SyncService { public string _AppType; public string _SystemToken; public string _UserId; public string _FormId; public SqlSugarClient _db; public SqlSugarClient _db_nc; public string _NCApiUrl; public static string _Static_PK_bd_project = ConfigurationManager.AppSettings["bd_project"]; public static string _Static_pk_org_jt = ConfigurationManager.AppSettings["pk_org_jt"]; public FKGL_SyncService(string AppType, string SystemToken, string UserId, string FormId, SqlSugarClient db, SqlSugarClient db_nc, string NCApiUrl) { _AppType = AppType; _SystemToken = SystemToken; _UserId = UserId; _FormId = FormId; _db = db; _db_nc = db_nc; _NCApiUrl = NCApiUrl; } public void DataSync() { try { DingTalkService _dingTalkService = new DingTalkService(_AppType, _SystemToken, _UserId, _FormId); // 宜搭全量数据Id var serchKeyListJson = new { radioField_lycrvvtk = "Y", selectField_lrnh633d = "预付", }; var idList = _dingTalkService.GetFormIdList(JsonConvert.SerializeObject(serchKeyListJson)); //LogHelper.WriteLog(JsonConvert.SerializeObject(idList.Count), "idList"); #region 获取NC中选项数据的Id var bd_customerDic = _db_nc.Queryable().ToList(); var bd_incomeDic = _db_nc.Queryable().ToList(); var org_orgsDic = _db_nc.Queryable().ToList(); var bd_projectDic = _db_nc.Queryable().ToList(); var bd_materialDic = _db_nc.Queryable().ToList(); var bd_measdocDic = _db_nc.Queryable().ToList(); var org_deptDic = _db_nc.Queryable().ToList(); var bd_psndocDic = _db_nc.Queryable().ToList(); var sm_userDic = _db_nc.Queryable().ToList(); var org_accountingbookDic = _db_nc.Queryable().ToList(); #endregion foreach (var item in idList) { string createTime = ""; string modifyTime = ""; var ydDataSource = _dingTalkService.GetFormDataById(item, out createTime, out modifyTime); string jsonData = JsonConvert.SerializeObject(ydDataSource); YiDa_SKDNC thisYiDaData = JsonConvert.DeserializeObject(jsonData); //取值 宜搭表单的某个字段当作凭证日期 如果 支付完成时间 为null,就用 提交时间 DateTime 凭证日期 = thisYiDaData.dateField_lwitiobz is null ? UnixTimeHelper.ConvertMillisecondsToDateTime(thisYiDaData.dateField_lviv4sfy) : UnixTimeHelper.ConvertMillisecondsToDateTime((long)thisYiDaData.dateField_lwitiobz); string 组织 = ""; if (!string.IsNullOrWhiteSpace(thisYiDaData.selectField_lvywoqmb)) { var tempData = org_orgsDic.FirstOrDefault(f => f.name == thisYiDaData.selectField_lvywoqmb); if (tempData != null) { 组织 = tempData.code; // 组织 } } string 账簿 = ""; if (!string.IsNullOrWhiteSpace(thisYiDaData.selectField_lvywoqmb)) { var tempData = org_accountingbookDic.FirstOrDefault(f => f.name == thisYiDaData.selectField_lvywoqmb + "-蓝云账簿"); if (tempData != null) { 账簿 = tempData.code; // 账簿 } } string 制单人 = "OA-NC"; // 表头 var headModel = new FKGL_SyncServiceModel.DataModel.voucher_header() { year = 凭证日期.ToString("yyyy"),//会计年度 prepareddate = 凭证日期.ToString("yyyy-MM-dd"),//制单日期 period = 凭证日期.ToString("MM"),//会计期间 pk_prepared = 制单人,//凭证制单人--操作员工工号 no = "",//凭证号 pk_accountingbook = 账簿,//账簿 org = 组织,//组织编码 pk_vouchertype = "03",//凭证类别 : 01-记账凭证 ,02-收款凭证 ,03-付款凭证 ,04-转账凭证 要确定 }; //表体 var detailList = new List(); if (thisYiDaData.tableField_lrngrtgu != null) { var detailObjList1 = thisYiDaData.tableField_lrngrtgu; //明细 int index = 1; foreach (var objItem in detailObjList1) { //借方分录 detailList.Add(new FKGL_SyncServiceModel.DataModel.voucher_body() { detailindex = index, accsubjcode = "1123",//科目编码 预付账款 pk_accasoa = "1123",//科目编码 explanation = objItem.textField_lvxa4v05,//摘要 verifydate = 凭证日期.ToString("yyyy-MM-dd"), price = "0.00000000", excrate2 = "1", debitquantity = "0.00000000", debitamount = objItem.numberField_lvua3j17.ToString(),//借方金额 groupdebitamount = "0.00000000", globaldebitamount = "0.00000000", localdebitamount = objItem.numberField_lvua3j17.ToString(),//借方金额 creditquantity = "0.00000000", creditamount = "0.00000000", groupcreditamount = "0.00000000", globalcreditamount = "0.00000000", localcreditamount = "0.00000000", billtype = "", bankaccount = "", checkstyle = "", checkno = "", checkdate = "", bill_id = "", bill_date = "", pk_currtype = "CNY", cash_flow = new FKGL_SyncServiceModel.DataModel.cash_flow()//现金流 { m_pk_currtype = "CNY", money = objItem.numberField_lvua3j17.ToString(),//金额 moneymain = objItem.numberField_lvua3j17.ToString(),//金额 moneygroup = "", moneyglobal = "", pk_cashflow = "1124",//现金流编码 pk_innercorp = "", }, ass = new List()// { new FKGL_SyncServiceModel.DataModel.ass() { pk_Checktype ="0019",//0019-供应商辅助核算 pk_Checkvalue = thisYiDaData.textField_lwitiobt,//供应商编码 } }, }); } //贷方 detailList.Add( new FKGL_SyncServiceModel.DataModel.voucher_body() { detailindex = index, accsubjcode = thisYiDaData.textField_lyodct8u,//科目编码 pk_accasoa = "100204",//科目编码 explanation = "贷方摘要",//摘要 要确定 verifydate = 凭证日期.ToString("yyyy-MM-dd"), price = "0.00000000", excrate2 = "1", debitquantity = "0.00000000", debitamount = "0.00000000", groupdebitamount = "0.00000000", globaldebitamount = "0.00000000", localdebitamount = "0.00000000", creditquantity = "0.00000000", creditamount = thisYiDaData.numberField_lvua3j18.ToString(),//贷方金额 groupcreditamount = "0.00000000", globalcreditamount = "0.00000000", localcreditamount = thisYiDaData.numberField_lvua3j18.ToString(),//贷方金额 billtype = "", bankaccount = "", checkstyle = "", checkno = "", checkdate = "", bill_id = "", bill_date = "", pk_currtype = "CNY", cash_flow = new FKGL_SyncServiceModel.DataModel.cash_flow() { }, ass = new List()//辅助核算 { new FKGL_SyncServiceModel.DataModel.ass() { pk_Checktype ="0011",//0011-银行账户辅助核算 pk_Checkvalue = thisYiDaData.textField_lrngrtgj,//银行账户 } }, } ); #region 例子 ////循环内是借方分录赋值 //foreach (var objItem in detailObjList1) //{ // var detailItem = new FKGL_SyncServiceModel.DataModel.voucher_body() // { // detailindex = index, // accsubjcode = objItem.textField_lwitioce,//科目编码 要确定 // pk_accasoa = objItem.textField_lwitioce,//科目编码 要确定 // explanation = objItem.textField_lvxa4v05,//摘要 要确定 // verifydate = 凭证日期.ToString("yyyy-MM-dd"), // price = "0.00000000", // excrate2 = "1", // debitquantity = "0.00000000", // debitamount = objItem.numberField_lvxa4v09.ToString(),//借方金额 要确定 // groupdebitamount = "0.00000000", // globaldebitamount = "0.00000000", // localdebitamount = objItem.numberField_lvxa4v09.ToString(),//借方金额 要确定 // creditquantity = "0.00000000", // creditamount = "0.00000000", // groupcreditamount = "0.00000000", // globalcreditamount = "0.00000000", // localcreditamount = "0.00000000", // billtype = "", // bankaccount = "", // checkstyle = "", // checkno = "", // checkdate = "", // bill_id = "", // bill_date = "", // pk_currtype = "CNY", // cash_flow = new FKGL_SyncServiceModel.DataModel.cash_flow()//现金流 要确定 // { // m_pk_currtype = "CNY", // money = objItem.numberField_lvxa4v09.ToString(),//金额 要确定 // moneymain = objItem.numberField_lvxa4v09.ToString(),//金额 要确定 // moneygroup = "", // moneyglobal = "", // pk_cashflow = "1124",//写死目前 要确定 // pk_innercorp = "", // }, // ass = new List()//要确定 // { // new FKGL_SyncServiceModel.DataModel.ass() // { // pk_Checktype ="0010",//0010-项目辅助核算 要确定 // pk_Checkvalue = "XM00368",//项目编码 目前写死 要确定 // } // }, // }; // detailList.Add(detailItem); // //销项税分录 要确认 // detailList.Add( // new FKGL_SyncServiceModel.DataModel.voucher_body() // { // detailindex = index + 1, // accsubjcode = "22210103",//科目编码 要确定 // pk_accasoa = "22210103",//科目编码 要确定 // explanation = objItem.textField_lvxa4v05,//摘要 要确定 // verifydate = 凭证日期.ToString("yyyy-MM-dd"), // price = "0.00000000", // excrate2 = "1", // debitquantity = "0.00000000", // debitamount = objItem.numberField_lvxa4v08.ToString(),//借方金额 要确定 // groupdebitamount = "0.00000000", // globaldebitamount = "0.00000000", // localdebitamount = objItem.numberField_lvxa4v08.ToString(),//借方金额 要确定 // creditquantity = "0.00000000", // creditamount = "0.00000000",//贷方金额 // groupcreditamount = "0.00000000", // globalcreditamount = "0.00000000", // localcreditamount = "0.00000000",//贷方金额 // billtype = "", // bankaccount = "", // checkstyle = "", // checkno = "", // checkdate = "", // bill_id = "", // bill_date = "", // pk_currtype = "CNY", // cash_flow = new FKGL_SyncServiceModel.DataModel.cash_flow()//现金流 要确定 // { // m_pk_currtype = "CNY", // money = objItem.numberField_lvxa4v08.ToString(),//金额 要确定 // moneymain = objItem.numberField_lvxa4v08.ToString(),//金额 要确定 // moneygroup = "", // moneyglobal = "", // pk_cashflow = "1124",//写死目前 要确定 // pk_innercorp = "", // }, // ass = new List() // { // }, // } // ); // index++; //} ////销项税分录 要确认 ////贷方 //detailList.Add( // new FKGL_SyncServiceModel.DataModel.voucher_body() // { // detailindex = index, // accsubjcode = "100204",//科目编码 要确定 用哪个贷方科目? 100204-光大银行 // pk_accasoa = "100204",//科目编码 要确定 用哪个贷方科目? // explanation = "贷方摘要",//摘要 要确定 // verifydate = 凭证日期.ToString("yyyy-MM-dd"), // price = "0.00000000", // excrate2 = "1", // debitquantity = "0.00000000", // debitamount = "0.00000000", // groupdebitamount = "0.00000000", // globaldebitamount = "0.00000000", // localdebitamount = "0.00000000", // creditquantity = "0.00000000", // creditamount = thisYiDaData.numberField_lvua3j18.ToString(),//贷方金额 要确定 // groupcreditamount = "0.00000000", // globalcreditamount = "0.00000000", // localcreditamount = thisYiDaData.numberField_lvua3j18.ToString(),//贷方金额 要确定 // billtype = "", // bankaccount = "", // checkstyle = "", // checkno = "", // checkdate = "", // bill_id = "", // bill_date = "", // pk_currtype = "CNY", // cash_flow = new FKGL_SyncServiceModel.DataModel.cash_flow() // { // }, // ass = new List()//辅助核算 要确定 // { // new FKGL_SyncServiceModel.DataModel.ass() // { // pk_Checktype ="0011",//0011-银行账户辅助核算 要确定 // pk_Checkvalue = "36640188000164043",//银行账户 目前写死(36640188000164043:上海蓝云环境科技有限公司(光大银行)) 要确定 // } // }, // } //); #endregion } XElement xElement = FKGL_SyncServiceModel.ImportXml_凭证.TemplateHeade(headModel); xElement.Add(FKGL_SyncServiceModel.ImportXml_凭证.Header(headModel));//添加表头数据 xElement.Element("voucher").Element("voucher_head").Element("details").Add(FKGL_SyncServiceModel.ImportXml_凭证.Bodydebit(detailList)); //生成凭证 var results_凭证 = NCImportFunc.NCImport2(xElement, _NCApiUrl + "?account=01&groupcode=0"); LogHelper.WriteLog(JsonConvert.SerializeObject(results_凭证), "results_凭证"); XElement xE = XElement.Parse(results_凭证); string resultcode = xE.Element("sendresult").Element("resultcode").Value; string content = xE.Element("sendresult").Element("content")?.Value; string resultdescription = xE.Element("sendresult").Element("resultdescription")?.Value; var ncResData = new YiDaResDto(); if (resultcode == "1") { ncResData = (new YiDaResDto() { bSuccess = true, syncTime = DateTime.Now, ncNo = resultdescription,//xE.Element("sendresult").Element("content").Value, log = "同步成功!" }); } else { ncResData = (new YiDaResDto() { bSuccess = false, syncTime = DateTime.Now, ncNo = "", log = "同步失败!原因为【" + resultdescription + "】!" }); } //更新同步标识 var ydRes = _dingTalkService.UpdateFormDataSyncDataById(ncResData, item); } } catch (Exception ex) { throw; } } } }