using HH.YiDaSyncNC.Dtos; using HH.YiDaSyncNC.Dtos.NC; 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.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace HH.YiDaSyncNC.DataSync { class KP_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_so_saleorder = ConfigurationManager.AppSettings["so_saleorder"]; public static string _Static_PK_so_saleorder_b = ConfigurationManager.AppSettings["so_saleorder_b"]; public static string _Static_pk_org_jt = ConfigurationManager.AppSettings["pk_org_jt"]; public KP_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 class IdCodeModel { public int sourceId { get; set; } public string Id { get; set; } } public class FormItem { public string title { get; set; } } public void DataSync() { DingTalkService _dingTalkService = new DingTalkService(_AppType, _SystemToken, _UserId, _FormId); // 宜搭全量数据Id //var idList = _dingTalkService.GetFormIdList("{\"radioField_lycrvvtk\":\"Y\",\"selectField_lvituew9\":\"正常\"}"); //var idList = _dingTalkService.GetFormIdList("{\"textField_lvdosccc\":\"KP_2024071700252\"}"); var idList = _dingTalkService.GetFormIdList("{\"radioField_lycrvvtk\":\"Y\"}"); 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 bd_defdoc_kplx = _db_nc.Queryable().Where(w => w.pk_defdoclist == "1001G1100000000016FV").ToList(); // 开票类型 var bd_defdoc_htywlx = _db_nc.Queryable().Where(w => w.pk_defdoclist == "1001G1100000000010PV").ToList(); // 合同业务类型 #endregion #region 接口方式 // 向NC插入数据 foreach (var item in idList) { string createTime = ""; string modifyTime = ""; var ydDataSource = _dingTalkService.GetFormDataById(item, out createTime, out modifyTime); // 如果NC单据号为空,说明没有传入过NC,此时需要走此逻辑去创建销售订单等 if (ydDataSource.FirstOrDefault(f => f.Key == "textField_ltxyt75m").Value != null && !string.IsNullOrWhiteSpace(ydDataSource["textField_ltxyt75m"].ToString())) { continue; } var ncResData = new List(); #region 表头 // 表头 var dataSource = new KP_SyncServiceModel.DataModel(); if (ydDataSource.FirstOrDefault(f => f.Key == "selectField_lvc9x4vo").Value != null) { if (!string.IsNullOrWhiteSpace(ydDataSource["selectField_lvc9x4vo"].ToString())) { var tempData = org_orgsDic.FirstOrDefault(f => f.name == ydDataSource["selectField_lvc9x4vo"].ToString()); if (tempData != null) { dataSource.组织 = tempData.code; // 组织 } } } dataSource.单据日期 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if (!string.IsNullOrWhiteSpace(ydDataSource["dateField_lw5ud9bk"].ToString())) { dataSource.单据日期 = UnixTimeHelper.ConvertMillisecondsToDateTime(Convert.ToInt64(ydDataSource["dateField_lw5ud9bk"].ToString())).ToString("yyyy-MM-dd HH:mm:ss"); } if (ydDataSource.FirstOrDefault(f => f.Key == "textField_lvdojfuj").Value != null) { if (!string.IsNullOrWhiteSpace(ydDataSource["textField_lvdojfuj"].ToString())) { var tempData = bd_customerDic.FirstOrDefault(f => f.code == ydDataSource["textField_lvdojfuj"].ToString()); if (tempData != null) { dataSource.客户 = tempData.code; // 客户 } } } if (ydDataSource.FirstOrDefault(f => f.Key == "selectField_lvc9x4vq").Value != null) { if (!string.IsNullOrWhiteSpace(ydDataSource["selectField_lvc9x4vq"].ToString())) { var tempData = bd_incomeDic.FirstOrDefault(f => f.name == ydDataSource["selectField_lvc9x4vq"].ToString()); if (tempData != null) { dataSource.收款协议 = tempData.code; // 收款协议 } } } if (ydDataSource.FirstOrDefault(f => f.Key == "departmentSelectField_lvc7mi3w").Value != null) { if (!string.IsNullOrWhiteSpace(ydDataSource["departmentSelectField_lvc7mi3w"].ToString())) { var tempData = org_deptDic.FirstOrDefault(f => f.name == JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(ydDataSource["departmentSelectField_lvc7mi3w"]))[0]); if (tempData != null) { dataSource.部门 = tempData.code; // 部门 } } } dataSource.审批人 = "OA-NC"; dataSource.制单人 = "OA-NC"; dataSource.创建人 = "OA-NC"; dataSource.审批时间 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); dataSource.制单时间 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); dataSource.创建时间 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if (ydDataSource.FirstOrDefault(f => f.Key == "textField_lvdntzul").Value != null) { if (!string.IsNullOrWhiteSpace(ydDataSource["textField_lvdntzul"].ToString())) { var tempData = bd_projectDic.FirstOrDefault(f => f.project_code == ydDataSource["textField_lvdntzul"].ToString()); if (tempData != null) { dataSource.项目 = tempData.project_code; // 项目 } } } dataSource.发票号 = ydDataSource["textField_lvd8pp35"].ToString(); dataSource.客户打印名称 = ydDataSource["selectField_lvdojfui"].ToString(); if (ydDataSource.FirstOrDefault(f => f.Key == "selectField_lvc9x4vp").Value != null) { if (!string.IsNullOrWhiteSpace(ydDataSource["selectField_lvc9x4vp"].ToString())) { var tempName = ydDataSource["selectField_lvc9x4vp"].ToString(); if (ydDataSource["selectField_lvc9x4vp"].ToString() == "增值税专票") { tempName = "增值税专用发票"; } if (ydDataSource["selectField_lvc9x4vp"].ToString() == "增值税普票") { tempName = "增值税普通发票"; } var tempData = bd_defdoc_kplx.FirstOrDefault(f => f.name == tempName); if (tempData != null) { dataSource.开票类型 = tempData.pk_defdoc; // 开票类型 } } } dataSource.OA单据号 = ydDataSource["textField_lvdosccc"].ToString(); if (ydDataSource.FirstOrDefault(f => f.Key == "selectField_lvc9x4vn").Value != null) { if (!string.IsNullOrWhiteSpace(ydDataSource["selectField_lvc9x4vn"].ToString())) { if (ydDataSource["selectField_lvc9x4vn"].ToString().Contains("一次性") || ydDataSource["selectField_lvc9x4vn"].ToString().Contains("工程订单")) { dataSource.合同业务类型 = "1001G11000000000113F"; } else { var tempData = bd_defdoc_htywlx.FirstOrDefault(f => f.name == ydDataSource["selectField_lvc9x4vn"].ToString()); if (tempData != null) { dataSource.合同业务类型 = tempData.pk_defdoc; // 合同业务类型 } } } } dataSource.年份 = DateTime.Now.ToString("yyyy"); dataSource.月份 = DateTime.Now.ToString("MM"); #endregion var detailList = new List(); #region 大业主开票明细 if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvc9x4vt").Value != null) { if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvc9x4vt").Value != null) { var detailObjList1 = (List)ydDataSource["tableField_lvc9x4vt"]; // 大业主开票明细 LogHelper.WriteLog(JsonConvert.SerializeObject(detailObjList1.FirstOrDefault()), "大业主0"); if (detailObjList1.Count() > 0 && !string.IsNullOrWhiteSpace(((Dictionary)detailObjList1.FirstOrDefault())["textField_lvdojfup"].ToString()) && !string.IsNullOrWhiteSpace(((Dictionary)detailObjList1.FirstOrDefault())["textField_lvynhq7q"].ToString())) { LogHelper.WriteLog(JsonConvert.SerializeObject(dataSource), "大业主1"); foreach (var objItem in detailObjList1) { var detailItem = new KP_SyncServiceModel.DataModel.OrderB(); if (!string.IsNullOrWhiteSpace(((Dictionary)objItem)["associationFormField_lvynhq7p_id"].ToString())) { var sourceStr = ((Dictionary)objItem)["associationFormField_lvynhq7p_id"].ToString().Replace("\\", ""); var a = sourceStr = sourceStr.Substring(1, sourceStr.Length - 2); var b = JsonConvert.DeserializeObject>(a); var materialData = bd_materialDic.FirstOrDefault(f => f.name == b[0].title); detailItem.物料 = materialData.code; // 物料 var unitCode = bd_measdocDic.FirstOrDefault(f => f.pk_measdoc == materialData.pk_measdoc); detailItem.计量单位 = unitCode.code; // 计量单位 } var hsdj = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp2v"].ToString()); var se = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp2z"].ToString()); var wsdj = hsdj - se; var sl = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp2w"].ToString()); var wsje = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp30"].ToString()); var jshj = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp2y"].ToString()); // 含税单价 detailItem.含税单价 = hsdj.ToString(); // 无税单价 detailItem.无税单价 = wsdj.ToString(); // 含税净价 detailItem.含税净价 = hsdj.ToString(); // 无税净价 detailItem.无税净价 = wsdj.ToString(); // 税额 detailItem.税额 = se.ToString(); // 无税金额 detailItem.无税金额 = wsje.ToString(); // 数量 detailItem.数量 = sl.ToString(); // 价税合计 detailItem.价税合计 = jshj.ToString(); detailItem.换算率 = "1.00/1.00"; detailItem.税码 = ydDataSource["selectField_lvc9x4vp"].ToString() == "增值税普票" ? "CN11" : "CN04"; // 税率码 detailItem.税率 = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp2x"].ToString()).ToString(); // 税率 detailItem.开票内容 = ((Dictionary)objItem)["textField_lvd8pp2t"].ToString(); detailItem.行id = ((Dictionary)objItem)["textField_lvdojfup"].ToString(); detailList.Add(detailItem); } } } } #endregion #region 工程订单开票明细 if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvd8pp44").Value != null) { var detailObjList2 = (List)ydDataSource["tableField_lvd8pp44"]; // 工程订单开票明细 if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvd8pp44").Value != null) { LogHelper.WriteLog(JsonConvert.SerializeObject(detailObjList2.FirstOrDefault()), "gc0"); if (detailObjList2.Count() > 0 && !string.IsNullOrWhiteSpace(((Dictionary)detailObjList2.FirstOrDefault())["textField_lvdojfur"].ToString()) && !string.IsNullOrWhiteSpace(((Dictionary)detailObjList2.FirstOrDefault())["numberField_lvd8pp3y_value"].ToString())) { LogHelper.WriteLog(JsonConvert.SerializeObject(detailObjList2.FirstOrDefault()), "gc1"); dataSource.项目 = "PM99001"; foreach (var objItem in detailObjList2) { var detailItem = new KP_SyncServiceModel.DataModel.OrderB(); if (!string.IsNullOrWhiteSpace(((Dictionary)objItem)["associationFormField_lvynrr6a_id"].ToString())) { var sourceStr = ((Dictionary)objItem)["associationFormField_lvynrr6a_id"].ToString().Replace("\\", ""); var a = sourceStr = sourceStr.Substring(1, sourceStr.Length - 2); var b = JsonConvert.DeserializeObject>(a); var materialData = bd_materialDic.FirstOrDefault(f => f.name == b[0].title); detailItem.物料 = materialData.code; // 物料 var unitCode = bd_measdocDic.FirstOrDefault(f => f.pk_measdoc == materialData.pk_measdoc); detailItem.计量单位 = unitCode.code; // 计量单位 } var hsdj = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp3y"].ToString()); var se = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp42"].ToString()); var wsdj = hsdj - se; var sl = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp3z"].ToString()); var wsje = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp43"].ToString()); var jshj = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp41"].ToString()); // 含税单价 detailItem.含税单价 = hsdj.ToString(); // 无税单价 detailItem.无税单价 = wsdj.ToString(); // 含税净价 detailItem.含税净价 = hsdj.ToString(); // 无税净价 detailItem.无税净价 = wsdj.ToString(); // 税额 detailItem.税额 = se.ToString(); // 无税金额 detailItem.无税金额 = wsje.ToString(); // 数量 detailItem.数量 = sl.ToString(); // 价税合计 detailItem.价税合计 = jshj.ToString(); detailItem.换算率 = "1.00/1.00"; detailItem.税码 = ydDataSource["selectField_lvc9x4vp"].ToString() == "增值税普票" ? "CN11" : "CN04"; // 税率码 detailItem.税率 = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvd8pp40"].ToString()).ToString(); // 税率 detailItem.开票内容 = ((Dictionary)objItem)["textField_lvd8pp3w"].ToString(); detailItem.行id = ((Dictionary)objItem)["textField_lvdojfur"].ToString(); detailList.Add(detailItem); } } } } #endregion #region 小业主开票明细 if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvdnme13").Value != null) { var detailObjList3 = (List)ydDataSource["tableField_lvdnme13"]; // 小业主 if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvdnme13").Value != null) { LogHelper.WriteLog(JsonConvert.SerializeObject(detailObjList3.FirstOrDefault()), "x0"); if (detailObjList3.Count() > 0 && !string.IsNullOrWhiteSpace(((Dictionary)detailObjList3.FirstOrDefault())["textField_lvdojfus"].ToString()) && !string.IsNullOrWhiteSpace(((Dictionary)detailObjList3.FirstOrDefault())["numberField_lvdnme0w_value"].ToString())) { LogHelper.WriteLog(JsonConvert.SerializeObject(detailObjList3.FirstOrDefault()), "x1"); foreach (var objItem in detailObjList3) { var detailItem = new KP_SyncServiceModel.DataModel.OrderB(); if (!string.IsNullOrWhiteSpace(((Dictionary)objItem)["associationFormField_lvynrr6c_id"].ToString())) { var sourceStr = ((Dictionary)objItem)["associationFormField_lvynrr6c_id"].ToString().Replace("\\", ""); var a = sourceStr = sourceStr.Substring(1, sourceStr.Length - 2); var b = JsonConvert.DeserializeObject>(a); var materialData = bd_materialDic.FirstOrDefault(f => f.name == b[0].title); detailItem.物料 = materialData.code; // 物料 var unitCode = bd_measdocDic.FirstOrDefault(f => f.pk_measdoc == materialData.pk_measdoc); detailItem.计量单位 = unitCode.code; // 计量单位 } var hsdj = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvdnme0w"].ToString()); var se = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvdnme10"].ToString()); var wsdj = hsdj - se; var sl = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvdnme0x"].ToString()); var wsje = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvdnme11"].ToString()); var jshj = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvdnme0z"].ToString()); // 含税单价 detailItem.含税单价 = hsdj.ToString(); // 无税单价 detailItem.无税单价 = wsdj.ToString(); // 含税净价 detailItem.含税净价 = hsdj.ToString(); // 无税净价 detailItem.无税净价 = wsdj.ToString(); // 税额 detailItem.税额 = se.ToString(); // 无税金额 detailItem.无税金额 = wsje.ToString(); // 数量 detailItem.数量 = sl.ToString(); // 价税合计 detailItem.价税合计 = jshj.ToString(); detailItem.换算率 = "1.00/1.00"; detailItem.税码 = ydDataSource["selectField_lvc9x4vp"].ToString() == "增值税普票" ? "CN11" : "CN04"; // 税率码 detailItem.税率 = Convert.ToDecimal(((Dictionary)objItem)["numberField_lvdnme0y"].ToString()).ToString(); // 税率 detailItem.开票内容 = ((Dictionary)objItem)["textField_lvdnme0u"].ToString(); detailItem.行id = ((Dictionary)objItem)["textField_lvdojfus"].ToString(); detailList.Add(detailItem); } } } } #endregion dataSource.明细 = detailList; dataSource.数量 = dataSource.明细.Sum(s => Convert.ToDecimal(s.数量)).ToString(); dataSource.价税合计 = dataSource.明细.Sum(s => Convert.ToDecimal(s.价税合计)).ToString(); var results_销售订单 = NCImportFunc.NCImport(KP_SyncServiceModel.ImportXml_销售订单.TemplateHeade(), KP_SyncServiceModel.ImportXml_销售订单.Header(dataSource, item + DateTime.Now.ToString("MMddHHmmss")), _NCApiUrl + "?account=LY01&groupcode=0"); LogHelper.WriteLog(JsonConvert.SerializeObject(results_销售订单), "results_销售订单"); XElement xE_销售订单 = XElement.Parse(results_销售订单); string resultcode_销售订单 = xE_销售订单.Element("sendresult").Element("resultcode").Value; string resultdescription_销售订单 = xE_销售订单.Element("sendresult").Element("resultdescription")?.Value; if (resultcode_销售订单 == "1") { ncResData.Add(new YiDaResDto() { bSuccess = true, ncNo = xE_销售订单.Element("sendresult").Element("content").Value, log = "同步成功!" }); } else { ncResData.Add(new YiDaResDto() { bSuccess = false, ncNo = "", log = "同步失败!原因为【" + resultdescription_销售订单 + "】!" }); continue; } // -------------------------------销售订单同步完,开始同步销售发票 var saleorderData = _db_nc.Queryable().First(f => f.csaleorderid == xE_销售订单.Element("sendresult").Element("content").Value); var saleorderbData = _db_nc.Queryable().Where(f => f.csaleorderid == xE_销售订单.Element("sendresult").Element("content").Value).ToList(); dataSource.销售订单单据号 = saleorderData.vbillcode; dataSource.销售订单主表id = saleorderData.csaleorderid; foreach (var detailItem in dataSource.明细) { detailItem.销售订单子表id = saleorderbData.FirstOrDefault(f => f.vbdef10 == detailItem.行id).csaleorderbid; } var results_销售发票 = NCImportFunc.NCImport(KP_SyncServiceModel.ImportXml_销售发票.TemplateHeade(), KP_SyncServiceModel.ImportXml_销售发票.Header(dataSource, item + DateTime.Now.ToString("MMddHHmmss")), _NCApiUrl + "?account=LY01&groupcode=0"); LogHelper.WriteLog(JsonConvert.SerializeObject(results_销售发票), "results_销售发票"); XElement xE_销售发票 = XElement.Parse(results_销售发票); string resultcode_销售发票 = xE_销售发票.Element("sendresult").Element("resultcode").Value; string resultdescription_销售发票 = xE_销售发票.Element("sendresult").Element("resultdescription")?.Value; if (resultcode_销售发票 == "1") { ncResData.Add(new YiDaResDto() { bSuccess = true, ncNo = xE_销售发票.Element("sendresult").Element("content").Value, log = "同步成功!" }); } else { ncResData.Add(new YiDaResDto() { bSuccess = false, ncNo = "", log = "同步失败!原因为【" + resultdescription_销售发票 + "】!" }); } // -------------------------------销售发票同步完,开始同步应收 (新版)应收不同步,改为调用审核接口,让NC自动取生成应收单 var results_销售发票审核 = HttpRequestHelper.ApporeNCCSOBill(xE_销售发票.Element("sendresult").Element("content").Value); LogHelper.WriteLog(JsonConvert.SerializeObject(results_销售发票审核), "results_销售发票审核"); if (results_销售发票审核.state == 0) { ncResData.Add(new YiDaResDto() { bSuccess = true, ncNo = "", log = "同步成功!" }); if (ydDataSource["selectField_lvc9x4vp"].ToString() == "增值税普票") { _db_nc.Ado.ExecuteCommand($"UPDATE SO_SALEINVOICE SET VTRANTYPECODE='32-Cxx-01',CTRANTYPEID='1001G11000000000036J' WHERE CSALEINVOICEID='{xE_销售发票.Element("sendresult").Element("content").Value}'"); LogHelper.WriteLog("执行更新sql", "results_销售发票"); } } else { ncResData.Add(new YiDaResDto() { bSuccess = false, ncNo = "", log = "同步失败!原因为【" + results_销售发票审核.msg + "】!" }); } var finalResData = new YiDaResDto(); if (ncResData.FirstOrDefault(f => !f.bSuccess) != null) { finalResData.bSuccess = false; finalResData.syncTime = DateTime.Now; finalResData.ncNo = xE_销售订单.Element("sendresult").Element("content").Value; finalResData.log = string.Join(" || ", ncResData.Select(s => s.log)); } else { finalResData.bSuccess = true; finalResData.syncTime = DateTime.Now; finalResData.ncNo = xE_销售订单.Element("sendresult").Element("content").Value; finalResData.log = string.Join(" || ", ncResData.Select(s => s.log)); } if (ydDataSource["selectField_lvituew9"].ToString() == "已红冲" && finalResData.bSuccess) { finalResData.bNeedSync = "Y"; } var ydRes = _dingTalkService.UpdateFormDataSyncDataById(finalResData, item); } #endregion } } }