KP_HK_SyncService.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. using HH.YiDaSyncNC.Dtos;
  2. using HH.YiDaSyncNC.Dtos.NC;
  3. using HH.YiDaSyncNC.Helper;
  4. using HH.YiDaSyncNC.Models;
  5. using Newtonsoft.Json;
  6. using SqlSugar;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Configuration;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Xml.Linq;
  14. namespace HH.YiDaSyncNC.DataSync
  15. {
  16. class KP_HK_SyncService
  17. {
  18. public string _AppType;
  19. public string _SystemToken;
  20. public string _UserId;
  21. public string _FormId;
  22. public SqlSugarClient _db;
  23. public SqlSugarClient _db_nc;
  24. public string _NCApiUrl;
  25. public static string _Static_PK_so_saleorder = ConfigurationManager.AppSettings["so_saleorder"];
  26. public static string _Static_PK_so_saleorder_b = ConfigurationManager.AppSettings["so_saleorder_b"];
  27. public static string _Static_pk_org_jt = ConfigurationManager.AppSettings["pk_org_jt"];
  28. public KP_HK_SyncService(string AppType, string SystemToken, string UserId, string FormId, SqlSugarClient db, SqlSugarClient db_nc, string NCApiUrl)
  29. {
  30. _AppType = AppType;
  31. _SystemToken = SystemToken;
  32. _UserId = UserId;
  33. _FormId = FormId;
  34. _db = db;
  35. _db_nc = db_nc;
  36. _NCApiUrl = NCApiUrl;
  37. }
  38. public class IdCodeModel
  39. {
  40. public int sourceId { get; set; }
  41. public string Id { get; set; }
  42. }
  43. public class FormItem
  44. {
  45. public string title { get; set; }
  46. }
  47. public class DetailItem
  48. {
  49. public decimal ncMoney { get; set; }
  50. public decimal ydMoney { get; set; }
  51. public long ncBilldate { get; set; }
  52. public bool bAll { get; set; }
  53. }
  54. public void DataSync()
  55. {
  56. DingTalkService _dingTalkService = new DingTalkService(_AppType, _SystemToken, _UserId, _FormId);
  57. {
  58. //var idList2= _dingTalkService.GetFormIdList("{\"textField_ltxyt75i\":\"" + "同步完成" + "\"}");
  59. //foreach (var item in idList2)
  60. //{
  61. // var ydRes1 = _dingTalkService.UpdateFormDataSyncDataByIdOnlyState(item);
  62. //}
  63. }
  64. // 宜搭全量数据Id
  65. //var idList = _dingTalkService.GetFormIdList("{\"radioField_lycrvvtk\":\"Y\",\"selectField_lvituew9\":\"正常\"}");
  66. //var idList = _dingTalkService.GetFormIdList("{\"textField_lvdosccc\":\"KP_2025030300450\"}");
  67. var idList = _dingTalkService.GetFormIdList("{\"radioField_m06hhw2p\":\"未回款\",\"textField_ltxyt75i\":\"同步成功\"}");
  68. idList.AddRange(_dingTalkService.GetFormIdList("{\"radioField_m06hhw2p\":\"已回款\",\"textField_ltxyt75i\":\"同步成功\"}"));
  69. idList.AddRange(_dingTalkService.GetFormIdList("{\"radioField_m06hhw2p\":\"未回款\",\"textField_ltxyt75i\":\"同步失败\"}"));
  70. idList.AddRange(_dingTalkService.GetFormIdList("{\"radioField_m06hhw2p\":\"已回款\",\"textField_ltxyt75i\":\"同步失败\"}"));
  71. LogHelper.WriteLog(JsonConvert.SerializeObject(idList.Count), "idList");
  72. #region 获取NC中选项数据的Id
  73. var so_saleorder_bList = _db_nc.Queryable<so_saleorder_b>().Where(w => w.vbdef10 != "~" && w.dr == 0).ToList();
  74. var ar_gatheritemList = _db_nc.Queryable<ar_gatheritem>().Where(w => so_saleorder_bList.Select(s => s.csaleorderbid).ToList().Contains(w.src_itemid)).ToList();
  75. var ar_gatherbillList = _db_nc.Queryable<ar_gatherbill>().Where(w => ar_gatheritemList.Select(s => s.pk_gatherbill).ToList().Contains(w.pk_gatherbill) && w.billstatus == "1").Select(s => s.pk_gatherbill).ToList();
  76. #endregion
  77. var i = 1;
  78. #region 接口方式
  79. // 向NC插入数据
  80. foreach (var item in idList)
  81. {
  82. string createTime = "";
  83. string modifyTime = "";
  84. var ydDataSource = _dingTalkService.GetFormDataById(item, out createTime, out modifyTime);
  85. // 如果NC单据号为空,说明没有传入过NC,此时跳过
  86. if (ydDataSource.FirstOrDefault(f => f.Key == "textField_ltxyt75m").Value != null && !string.IsNullOrWhiteSpace(ydDataSource["textField_ltxyt75m"].ToString()))
  87. {
  88. }
  89. else
  90. {
  91. continue;
  92. }
  93. LogHelper.WriteLog("", "【序号 " + i + " / " + idList.Count + "】" + item + " 开始回写");
  94. i++;
  95. var updateData = new Dictionary<string, string>();
  96. var detailData = new List<DetailItem>();
  97. #region 大业主开票明细
  98. if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvc9x4vt").Value != null)
  99. {
  100. if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvc9x4vt").Value != null)
  101. {
  102. var detailObjList1 = (List<object>)ydDataSource["tableField_lvc9x4vt"]; // 大业主开票明细
  103. if (detailObjList1.Count() > 0 && !string.IsNullOrWhiteSpace(((Dictionary<string, object>)detailObjList1.FirstOrDefault())["textField_lvdojfup"].ToString()))
  104. {
  105. var bChange = false;
  106. foreach (var objItem in detailObjList1)
  107. {
  108. var rowId = ((Dictionary<string, object>)objItem)["textField_lvdojfup"].ToString();
  109. var sbData = so_saleorder_bList.Where(f => f.vbdef10 == rowId);
  110. if (sbData != null)
  111. {
  112. var giData = ar_gatheritemList.Where(w => sbData.Select(s => s.csaleorderbid).ToList().Contains(w.src_itemid) && ar_gatherbillList.Contains(w.pk_gatherbill)).ToList();
  113. if (giData.Count > 0)
  114. {
  115. var ncMoney = giData.Sum(s => s.money_cr);
  116. var ydMoney = Convert.ToDecimal(((Dictionary<string, object>)objItem)["numberField_lvd8pp2y"].ToString());
  117. decimal ydReMoney = 0;
  118. object ydReMoney_;
  119. if (((Dictionary<string, object>)objItem).TryGetValue("numberField_lvg084lb", out ydReMoney_))
  120. {
  121. ydReMoney = Convert.ToDecimal(((Dictionary<string, object>)objItem)["numberField_lvg084lb"].ToString());
  122. }
  123. var ncBilldate = UnixTimeHelper.ConvertToMilliseconds(Convert.ToDateTime(giData.OrderByDescending(ob => Convert.ToDateTime(ob.billdate)).FirstOrDefault().billdate));
  124. //var detailItem = new DetailItem()
  125. //{
  126. // ncMoney = (ncMoney + ydReMoney) > ydMoney ? ydMoney : (ncMoney + ydReMoney),
  127. // ydMoney = ydMoney,
  128. // ncBilldate = ncBilldate,
  129. // bAll = ((ncMoney + ydReMoney) >= ydMoney)
  130. //};
  131. var detailItem = new DetailItem()
  132. {
  133. ncMoney = ncMoney > ydMoney ? ydMoney : ncMoney,
  134. ydMoney = ydMoney,
  135. ncBilldate = ncBilldate,
  136. bAll = ncMoney >= ydMoney
  137. };
  138. detailData.Add(detailItem);
  139. ((Dictionary<string, object>)objItem)["numberField_lvg084lb"] = (detailItem.ncMoney).ToString("#0.00");
  140. ((Dictionary<string, object>)objItem)["dateField_m0f55roc"] = ncBilldate.ToString();
  141. bChange = true;
  142. }
  143. }
  144. }
  145. if (bChange)
  146. updateData.Add("tableField_lvc9x4vt", JsonConvert.SerializeObject(detailObjList1));
  147. }
  148. }
  149. }
  150. #endregion
  151. #region 工程订单开票明细
  152. if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvd8pp44").Value != null)
  153. {
  154. var detailObjList2 = (List<object>)ydDataSource["tableField_lvd8pp44"]; // 工程订单开票明细
  155. if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvd8pp44").Value != null)
  156. {
  157. if (detailObjList2.Count() > 0 && !string.IsNullOrWhiteSpace(((Dictionary<string, object>)detailObjList2.FirstOrDefault())["textField_lvdojfur"].ToString()))
  158. {
  159. var bChange = false;
  160. foreach (var objItem in detailObjList2)
  161. {
  162. var rowId = ((Dictionary<string, object>)objItem)["textField_lvdojfur"].ToString();
  163. var sbData = so_saleorder_bList.Where(f => f.vbdef10 == rowId);
  164. if (sbData != null)
  165. {
  166. var giData = ar_gatheritemList.Where(w => sbData.Select(s => s.csaleorderbid).ToList().Contains(w.src_itemid) && ar_gatherbillList.Contains(w.pk_gatherbill)).ToList();
  167. if (giData.Count > 0)
  168. {
  169. var ncMoney = giData.Sum(s => s.money_cr);
  170. var ydMoney = Convert.ToDecimal(((Dictionary<string, object>)objItem)["numberField_lvd8pp41"].ToString());
  171. decimal ydReMoney = 0;
  172. object ydReMoney_;
  173. if (((Dictionary<string, object>)objItem).TryGetValue("numberField_lvg084l9", out ydReMoney_))
  174. {
  175. ydReMoney = Convert.ToDecimal(((Dictionary<string, object>)objItem)["numberField_lvg084l9"].ToString());
  176. }
  177. var ncBilldate = UnixTimeHelper.ConvertToMilliseconds(Convert.ToDateTime(giData.OrderByDescending(ob => Convert.ToDateTime(ob.billdate)).FirstOrDefault().billdate));
  178. //var detailItem = new DetailItem()
  179. //{
  180. // ncMoney = (ncMoney + ydReMoney) > ydMoney ? ydMoney : (ncMoney + ydReMoney),
  181. // ydMoney = ydMoney,
  182. // ncBilldate = ncBilldate,
  183. // bAll = ((ncMoney + ydReMoney) >= ydMoney)
  184. //};
  185. var detailItem = new DetailItem()
  186. {
  187. ncMoney = ncMoney > ydMoney ? ydMoney : ncMoney,
  188. ydMoney = ydMoney,
  189. ncBilldate = ncBilldate,
  190. bAll = ncMoney >= ydMoney
  191. };
  192. detailData.Add(detailItem);
  193. ((Dictionary<string, object>)objItem)["numberField_lvg084l9"] = (detailItem.ncMoney).ToString("#0.00");
  194. ((Dictionary<string, object>)objItem)["dateField_m0dp1g0e"] = ncBilldate.ToString();
  195. bChange = true;
  196. }
  197. }
  198. }
  199. if (bChange)
  200. updateData.Add("tableField_lvd8pp44", JsonConvert.SerializeObject(detailObjList2));
  201. }
  202. }
  203. }
  204. #endregion
  205. #region 小业主开票明细
  206. if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvdnme13").Value != null)
  207. {
  208. var detailObjList3 = (List<object>)ydDataSource["tableField_lvdnme13"]; // 小业主
  209. if (ydDataSource.FirstOrDefault(f => f.Key == "tableField_lvdnme13").Value != null)
  210. {
  211. if (detailObjList3.Count() > 0 && !string.IsNullOrWhiteSpace(((Dictionary<string, object>)detailObjList3.FirstOrDefault())["textField_lvdojfus"].ToString()))
  212. {
  213. var bChange = false;
  214. foreach (var objItem in detailObjList3)
  215. {
  216. var rowId = ((Dictionary<string, object>)objItem)["textField_lvdojfus"].ToString();
  217. var sbData = so_saleorder_bList.Where(f => f.vbdef10 == rowId);
  218. if (sbData != null)
  219. {
  220. var giData = ar_gatheritemList.Where(w => sbData.Select(s => s.csaleorderbid).ToList().Contains(w.src_itemid) && ar_gatherbillList.Contains(w.pk_gatherbill)).ToList();
  221. if (giData.Count > 0)
  222. {
  223. var ncMoney = giData.Sum(s => s.money_cr);
  224. var ydMoney = Convert.ToDecimal(((Dictionary<string, object>)objItem)["numberField_lvdnme0z"].ToString());
  225. decimal ydReMoney = 0;
  226. object ydReMoney_;
  227. if (((Dictionary<string, object>)objItem).TryGetValue("numberField_lvg084la", out ydReMoney_))
  228. {
  229. ydReMoney = Convert.ToDecimal(((Dictionary<string, object>)objItem)["numberField_lvg084la"].ToString());
  230. }
  231. var ncBilldate = UnixTimeHelper.ConvertToMilliseconds(Convert.ToDateTime(giData.OrderByDescending(ob => Convert.ToDateTime(ob.billdate)).FirstOrDefault().billdate));
  232. //var detailItem = new DetailItem()
  233. //{
  234. // ncMoney = (ncMoney + ydReMoney) > ydMoney ? ydMoney : (ncMoney + ydReMoney),
  235. // ydMoney = ydMoney,
  236. // ncBilldate = ncBilldate,
  237. // bAll = ((ncMoney + ydReMoney) >= ydMoney)
  238. //};
  239. var detailItem = new DetailItem()
  240. {
  241. ncMoney = ncMoney > ydMoney ? ydMoney : ncMoney,
  242. ydMoney = ydMoney,
  243. ncBilldate = ncBilldate,
  244. bAll = ncMoney >= ydMoney
  245. };
  246. detailData.Add(detailItem);
  247. ((Dictionary<string, object>)objItem)["numberField_lvg084la"] = (detailItem.ncMoney).ToString("#0.00");
  248. ((Dictionary<string, object>)objItem)["dateField_m0f55roe"] = ncBilldate.ToString();
  249. bChange = true;
  250. }
  251. }
  252. }
  253. if (bChange)
  254. updateData.Add("tableField_lvdnme13", JsonConvert.SerializeObject(detailObjList3));
  255. }
  256. }
  257. }
  258. #endregion
  259. if (detailData.Count > 0)
  260. {
  261. // 回款时间
  262. updateData.Add("dateField_m0f5xiio", detailData.OrderByDescending(ob => ob.ncBilldate).FirstOrDefault().ncBilldate.ToString());
  263. // 已回款金额
  264. updateData.Add("numberField_m0f55roa", detailData.Sum(s => s.ncMoney).ToString("#0.00"));
  265. // 回款状态
  266. updateData.Add("radioField_m06hhw2p", detailData.FirstOrDefault(f => !f.bAll) != null ? "已回款" : "回款完成");
  267. LogHelper.WriteLog(JsonConvert.SerializeObject(updateData), "数据构建完成");
  268. // 回传状态
  269. updateData.Add("radioField_m4253oqe", "N");
  270. // 回传状态
  271. updateData.Add("textField_m4253oqd", "回传成功");
  272. var ydRes = _dingTalkService.UpdateFormDataById(updateData, item);
  273. LogHelper.WriteLog(JsonConvert.SerializeObject(ydRes), "ydRes 回写完成------------------------------------------------");
  274. }
  275. else
  276. {
  277. LogHelper.WriteLog("无回款记录", "回写完成------------------------------------------------");
  278. }
  279. }
  280. #endregion
  281. }
  282. }
  283. }