SyncWMSDataAppService.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. using Business.Core.Utilities;
  2. using Business.EntityFrameworkCore;
  3. using Business.EntityFrameworkCore.SqlRepositories;
  4. using Business.Model.MES.IC;
  5. using Business.Model.Sale;
  6. using Business.Model.SRM;
  7. using EFCore.BulkExtensions;
  8. using Microsoft.EntityFrameworkCore;
  9. using NetTopologySuite.Algorithm;
  10. using Newtonsoft.Json;
  11. using SixLabors.ImageSharp;
  12. using Spire.Pdf;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.ComponentModel;
  16. using System.ComponentModel.DataAnnotations;
  17. using System.ComponentModel.DataAnnotations.Schema;
  18. using System.Linq;
  19. using Volo.Abp.Application.Services;
  20. using Volo.Abp.Domain.Repositories;
  21. using WkHtmlToPdfDotNet;
  22. namespace Business.SyncDataManagement
  23. {
  24. /// <summary>
  25. /// 同步mysql数据到mongodb
  26. /// </summary>
  27. public class SyncWMSDataAppService : ApplicationService
  28. {
  29. #region 服务
  30. /// <summary>
  31. /// 物料bom
  32. /// </summary>
  33. private IRepository<ic_bom, long> _mysql_ic_bom;
  34. /// <summary>
  35. /// 物料bom子表
  36. /// </summary>
  37. private IRepository<ic_bom_child, long> _mysql_ic_bom_child;
  38. /// <summary>
  39. /// 物料
  40. /// </summary>
  41. private IRepository<ic_item, long> _mysql_ic_item;
  42. /// <summary>
  43. /// 供应商
  44. /// </summary>
  45. private IRepository<srm_supplier, long> _mysql_srm_supplier;
  46. /// <summary>
  47. /// 物料采购报价单
  48. /// </summary>
  49. private IRepository<srm_purchase, long> _mysql_srm_purchase;
  50. /// <summary>
  51. /// 物料采购报价单
  52. /// </summary>
  53. private IRepository<crm_customer, long> _mysql_crm_customer;
  54. /// <summary>
  55. /// 销售订单
  56. /// </summary>
  57. private IRepository<crm_seorder, long> _mysql_crm_seorder;
  58. /// <summary>
  59. /// 销售订单明细
  60. /// </summary>
  61. private IRepository<crm_seorderentry, long> _mysql_crm_seorderentry;
  62. /// <summary>
  63. /// 雪花算法
  64. /// </summary>
  65. SnowFlake help = new SnowFlake();
  66. private readonly BusinessDbContext _businessDbContext;
  67. private readonly ISqlRepository<CustMaster> _custMaster;
  68. private readonly ISqlRepository<SuppMaster> _suppMaster;
  69. private readonly ISqlRepository<ConsigneeAddressMaster> _consigneeAddressMaster;
  70. private readonly ISqlRepository<ItemMaster> _itemMaster;
  71. private readonly ISqlRepository<ProductStructureMaster> _productStructureMaster;
  72. #endregion
  73. /// <summary>
  74. /// 构造函数
  75. /// </summary>
  76. public SyncWMSDataAppService(
  77. IRepository<ic_bom, long> mysql_ic_bom,
  78. IRepository<ic_bom_child, long> mysql_ic_bom_child,
  79. IRepository<ic_item, long> mysql_ic_item,
  80. IRepository<srm_supplier, long> mysql_srm_supplier,
  81. IRepository<srm_purchase, long> mysql_srm_purchase,
  82. IRepository<crm_customer, long> mysql_crm_customer,
  83. IRepository<crm_seorder, long> mysql_crm_seorder,
  84. IRepository<crm_seorderentry, long> mysql_crm_seorderentry,
  85. ISqlRepository<CustMaster> custMaster,
  86. ISqlRepository<SuppMaster> suppMaster,
  87. ISqlRepository<ConsigneeAddressMaster> consigneeAddressMaster,
  88. ISqlRepository<ItemMaster> itemMaster,
  89. ISqlRepository<ProductStructureMaster> productStructureMaster,
  90. BusinessDbContext businessDbContext
  91. )
  92. {
  93. _mysql_ic_bom = mysql_ic_bom;
  94. _mysql_ic_bom_child = mysql_ic_bom_child;
  95. _mysql_ic_item = mysql_ic_item;
  96. _mysql_srm_supplier = mysql_srm_supplier;
  97. _mysql_srm_purchase = mysql_srm_purchase;
  98. _mysql_crm_customer = mysql_crm_customer;
  99. _mysql_crm_seorder = mysql_crm_seorder;
  100. _mysql_crm_seorderentry = mysql_crm_seorderentry;
  101. _custMaster = custMaster;
  102. _suppMaster = suppMaster;
  103. _consigneeAddressMaster = consigneeAddressMaster;
  104. _itemMaster = itemMaster;
  105. _productStructureMaster = productStructureMaster;
  106. _businessDbContext = businessDbContext;
  107. }
  108. /// <summary>
  109. /// 同步WMS基础数据到MySQL
  110. /// </summary>
  111. /// <returns></returns>
  112. /// <exception cref="NotImplementedException"></exception>
  113. public void SyncWMSDataToMySQL()
  114. {
  115. //SyncCustMaster();
  116. //SyncSuppMaster();
  117. //SyncSalesOrdMaster();
  118. //SyncSalesOrdMasterEntry();
  119. //SyncItemMaster();
  120. //SyncBom();
  121. }
  122. //同步客户
  123. public void SyncCustMaster()
  124. {
  125. var customerList = _mysql_crm_customer.GetListAsync().Result;
  126. List<CustMaster> custList = _custMaster.Select(a => a.Domain == "1001" && a.IsActive);
  127. var addressList = _consigneeAddressMaster.Select(a => a.Domain == "1001" && a.Typed == "Cust" && a.IsActive);
  128. List<crm_customer> ItemsAdd = new List<crm_customer>();
  129. if (custList != null && custList.Count > 0)
  130. {
  131. for (int i = 0; i < custList.Count; i++)
  132. {
  133. long domain = Convert.ToInt64(custList[i].Domain);
  134. long factory_id = domain % 1000;
  135. long tenant_id = domain - factory_id;
  136. var cust = customerList.Find(x => x.customer_no == custList[i].Cust && x.tenant_id == 1000 && x.factory_id == 1001);
  137. if (cust is null)
  138. {
  139. ConsigneeAddressMaster address = addressList.Find(a => a.Address == custList[i].Cust);
  140. var customer = new crm_customer
  141. {
  142. customer_no = custList[i].Cust,
  143. customer_name = address is null ? address.Name : "",
  144. telephone = address is null ? address.Telephone : "",
  145. email = address is null ? address.AttentionEmail : "",
  146. contact = address is null ? address.Attention1 : "",
  147. post_code = address is null ? address.Post : "",
  148. country = address is null ? address.Country : "",
  149. province = address is null ? address.State : "",
  150. city = address is null ? address.City : "",
  151. region = address is null ? address.State : "",
  152. address = address is null ? address.Address1 : "",
  153. short_name = custList[i].SortName,
  154. carrying_aos = Convert.ToInt32(custList[i].CustShippingLT),
  155. currency = custList[i].Curr,
  156. employee_name = custList[i].Salesperson1,
  157. factory_id = 1001,
  158. tenant_id = 1000
  159. };
  160. customer.GenerateNewId(help.NextId());
  161. ItemsAdd.Add(customer);
  162. }
  163. }
  164. _businessDbContext.BulkInsert(ItemsAdd);
  165. }
  166. }
  167. //同步供应商
  168. public void SyncSuppMaster()
  169. {
  170. var suppList = _mysql_srm_supplier.GetListAsync().Result;
  171. List<SuppMaster> custList = _suppMaster.Select(a => a.Domain == "1001" && a.IsActive);
  172. var addressList = _consigneeAddressMaster.Select(a => a.Domain == "1001" && a.Typed == "Supp" && a.IsActive);
  173. List<srm_supplier> ItemsAdd = new List<srm_supplier>();
  174. if (custList != null && custList.Count > 0)
  175. {
  176. for (int i = 0; i < custList.Count; i++)
  177. {
  178. long domain = Convert.ToInt64(custList[i].Domain.ToString());
  179. long factory_id = domain % 1000;
  180. long tenant_id = domain - factory_id;
  181. var supp = suppList.Find(x => x.supplier_no == custList[i].Supp.ToString() && x.tenant_id == factory_id && x.factory_id == tenant_id);
  182. if (supp is null)
  183. {
  184. ConsigneeAddressMaster address = addressList.Find(a => a.Address == custList[i].Supp);
  185. var supplier = new srm_supplier
  186. {
  187. supplier_no = custList[i].Supp,
  188. supplier_name = address is null ? address.Name : "",
  189. supplier_short_name = custList[i].SortName,
  190. country = address is null ? address.Country : "",
  191. state = address is null ? address.State : "",
  192. region = address is null ? address.City : "",
  193. contact = address is null ? address.Attention1 : "",
  194. telephone = address is null ? address.Telephone : "",
  195. post_code = address is null ? address.Post : "",
  196. email = address is null ? address.AttentionEmail : "",
  197. currency = custList[i].Curr,
  198. supply_type = custList[i].Type,
  199. settlement = custList[i].CrTerms,
  200. factory_id = factory_id,
  201. tenant_id = tenant_id
  202. };
  203. supplier.GenerateNewId(help.NextId());
  204. ItemsAdd.Add(supplier);
  205. }
  206. }
  207. _businessDbContext.BulkInsert(ItemsAdd);
  208. }
  209. }
  210. ////同步销售订单
  211. //public void SyncSalesOrdMaster()
  212. //{
  213. // var customerList = _mysql_crm_customer.GetListAsync().Result;
  214. // var saleOrderList = _mysql_crm_seorder.GetListAsync().Result;
  215. // var ItemMasterDS = _repository.SelectDataBaseBySql("SELECT A.SalesOrd,C.SortName AS CustomName,A.SoldTo AS Cust,A.OrdDate,A.RequiredDate,A.Sequence,A.Curr,A.ExchRate,A.Salesperson1,A.Project,B.Descr AS ProjectName,A.[Domain] from SalesOrdMaster A INNER JOIN CustMaster C ON A.SoldTo=C.Cust and A.[Domain]=C.[Domain]\r\nLEFT JOIN ProjectMaster B On A.Project=B.Project AND A.[Domain]=B.[Domain] ", "SalesOrdMaster");
  216. // List<crm_seorder> ItemsAdd = new List<crm_seorder>();
  217. // List<crm_seorder> ItemsUpdate = new List<crm_seorder>();
  218. // if (ItemMasterDS != null && ItemMasterDS.Tables.Count > 0 && ItemMasterDS.Tables[0].Rows.Count > 0)
  219. // {
  220. // for (int i = 0; i < ItemMasterDS.Tables[0].Rows.Count; i++)
  221. // {
  222. // long domain = Convert.ToInt64(ItemMasterDS.Tables[0].Rows[i]["Domain"].ToString());
  223. // long factory_id = domain % 1000;
  224. // long tenant_id = domain - factory_id;
  225. // var custno = ItemMasterDS.Tables[0].Rows[i]["Cust"].ToString();
  226. // var cust = customerList.Find(a => a.customer_no == custno && a.factory_id == factory_id && a.tenant_id == tenant_id);
  227. // long? custom_id = cust is null ? cust.Id : null;
  228. // var saleorder = saleOrderList.Find(x => x.bill_no == ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString() && x.tenant_id == factory_id && x.factory_id == tenant_id);
  229. // if (saleorder is null)
  230. // {
  231. // var order = new crm_seorder
  232. // {
  233. // bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString(),
  234. // custom_id = custom_id,
  235. // custom_name = ItemMasterDS.Tables[0].Rows[i]["CustomName"].ToString(),
  236. // custom_no = ItemMasterDS.Tables[0].Rows[i]["Cust"].ToString(),
  237. // //custom_level = ItemMasterDS.Tables[0].Rows[i]["PurMfg"].ToString() == "P" ? "外购" : "自制",
  238. // date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  239. // rdate = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["RequiredDate"],
  240. // //urgent = "",
  241. // currency = ItemMasterDS.Tables[0].Rows[i]["Curr"].ToString() == "RMB" ? 1 : 0,
  242. // exchange_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  243. // //biller = ItemMasterDS.Tables[0].Rows[i]["NetWeightUM"].ToString(),
  244. // //emp_no = (decimal)ItemMasterDS.Tables[0].Rows[i]["Length"],
  245. // emp_name = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  246. // //auditor = (decimal)ItemMasterDS.Tables[0].Rows[i]["Height"],
  247. // //audit_date = ItemMasterDS.Tables[0].Rows[i]["PurMfg"].ToString() == "P" ? 1 : 0,
  248. // //status = 1,
  249. // //closed = "",
  250. // //op_time = 1,
  251. // bill_from = "",
  252. // //project_name = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["LotSerialControl"]) == true ? 1 : 0,
  253. // //project_code = "",
  254. // out_stock_type = 1,//TODO
  255. // //sale_dept_id = "",
  256. // //sale_dept_name = 1,
  257. // //sale_dept_code = 1,
  258. // //create_dept = 1
  259. // factory_id = factory_id,
  260. // tenant_id = tenant_id
  261. // };
  262. // order.GenerateNewId();
  263. // ItemsAdd.Add(order);
  264. // }
  265. // else
  266. // {
  267. // saleorder.bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString();
  268. // saleorder.custom_id = custom_id;
  269. // saleorder.custom_name = ItemMasterDS.Tables[0].Rows[i]["CustomName"].ToString();
  270. // saleorder.custom_no = ItemMasterDS.Tables[0].Rows[i]["Cust"].ToString();
  271. // //custom_level = ItemMasterDS.Tables[0].Rows[i]["PurMfg"].ToString() == "P" ? "外购" : "自制",
  272. // saleorder.date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"];
  273. // saleorder.rdate = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["RequiredDate"];
  274. // saleorder.urgent = (int?)ItemMasterDS.Tables[0].Rows[i]["Sequence"];
  275. // saleorder.currency = ItemMasterDS.Tables[0].Rows[i]["Curr"].ToString() == "RMB" ? 1 : 0;
  276. // saleorder.exchange_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"];
  277. // //biller = ItemMasterDS.Tables[0].Rows[i]["NetWeightUM"].ToString(),
  278. // //emp_no = (decimal)ItemMasterDS.Tables[0].Rows[i]["Length"],
  279. // saleorder.emp_name = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString();
  280. // //auditor = (decimal)ItemMasterDS.Tables[0].Rows[i]["Height"],
  281. // //audit_date = ItemMasterDS.Tables[0].Rows[i]["PurMfg"].ToString() == "P" ? 1 : 0,
  282. // //status = 1,
  283. // //closed = "",
  284. // //op_time = 1,
  285. // saleorder.bill_from = "";
  286. // saleorder.project_name = ItemMasterDS.Tables[0].Rows[i]["ProjectName"].ToString();
  287. // saleorder.project_code = ItemMasterDS.Tables[0].Rows[i]["Project"].ToString();
  288. // saleorder.out_stock_type = 1;//TODO
  289. // //sale_dept_id = "",
  290. // //sale_dept_name = 1,
  291. // //sale_dept_code = 1,
  292. // //create_dept = 1
  293. // ItemsUpdate.Add(saleorder);
  294. // }
  295. // }
  296. // //_businessDbContext.crm_seorder.Delete();
  297. // _businessDbContext.crm_seorder.BulkInsert(ItemsAdd);
  298. // _businessDbContext.crm_seorder.BulkUpdate(ItemsUpdate);
  299. // }
  300. //}
  301. ////同步销售订单明细
  302. //public void SyncSalesOrdMasterEntry()
  303. //{
  304. // var saleOrderEntryList = _mysql_crm_seorderentry.GetListAsync().Result;
  305. // var saleOrderList = _mysql_crm_seorder.GetListAsync().Result;
  306. // var ItemMasterDS = _repository.SelectDataBaseBySql("SELECT A.SalesOrd,A.Line,C.Descr,C.Descr1,A.ItemNum,A.UM,A.QtyOrded,A.Price,A.Disc,A.RequiredDate,A.Remark,B.CustPO,A.CustItem,A.Status,A.QtyShipped,A.QtyReturned,B.Contract,A.Domain from SalesOrdDetail A INNER JOIN SalesOrdMaster B On A.SalesOrd=B.SalesOrd and A.[Domain]=B.[Domain] INNER JOIN ItemMaster C on A.ItemNum=C.ItemNum and A.[Domain]=C.[Domain]", "SalesOrdDetail");
  307. // List<crm_seorderentry> ItemsAdd = new List<crm_seorderentry>();
  308. // List<crm_seorderentry> ItemsUpdate = new List<crm_seorderentry>();
  309. // if (ItemMasterDS != null && ItemMasterDS.Tables.Count > 0 && ItemMasterDS.Tables[0].Rows.Count > 0)
  310. // {
  311. // for (int i = 0; i < ItemMasterDS.Tables[0].Rows.Count; i++)
  312. // {
  313. // long domain = Convert.ToInt64(ItemMasterDS.Tables[0].Rows[i]["Domain"].ToString());
  314. // long factory_id = domain % 1000;
  315. // long tenant_id = domain - factory_id;
  316. // var bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString();
  317. // var seorder = saleOrderList.Find(a => a.bill_no == bill_no && a.factory_id == factory_id && a.tenant_id == tenant_id);
  318. // long? seorder_id = seorder is null ? seorder.Id : null;
  319. // var saleorderentry = saleOrderEntryList.Find(x => x.bill_no == bill_no && x.tenant_id == factory_id && x.factory_id == tenant_id);
  320. // if (saleorderentry is null)
  321. // {
  322. // var entry = new crm_seorderentry
  323. // {
  324. // seorder_id = seorder_id,
  325. // bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString(),
  326. // entry_seq = (int?)ItemMasterDS.Tables[0].Rows[i]["Line"],
  327. // item_number = ItemMasterDS.Tables[0].Rows[i]["ItemNum"].ToString(),
  328. // item_name = ItemMasterDS.Tables[0].Rows[i]["Descr"].ToString(),
  329. // specification = ItemMasterDS.Tables[0].Rows[i]["Descr1"].ToString(),
  330. // //urgent = (int?)ItemMasterDS.Tables[0].Rows[i]["PLPriority"],
  331. // bom_number = ItemMasterDS.Tables[0].Rows[i]["ItemNum"].ToString(),
  332. // unit = ItemMasterDS.Tables[0].Rows[i]["UM"].ToString(),
  333. // qty = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyOrded"],
  334. // //price = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Price"],
  335. // //tax_price = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  336. // //tax_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  337. // amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Price"],
  338. // //discount_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  339. // discount_amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Disc"],
  340. // //total_amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  341. // plan_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["RequiredDate"],
  342. // //date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  343. // //planner_name = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  344. // //planner_no = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  345. // remark = ItemMasterDS.Tables[0].Rows[i]["Remark"].ToString(),
  346. // //soure_bill_no = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  347. // custom_order_bill_no = ItemMasterDS.Tables[0].Rows[i]["CustPO"].ToString(),
  348. // //custom_order_entryid = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  349. // //sys_capacity_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  350. // //adjust_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  351. // //mrp_closed = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  352. // custom_order_itemno = ItemMasterDS.Tables[0].Rows[i]["CustItem"].ToString(),
  353. // state = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["Status"]),//TODO
  354. // deliver_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyShipped"],
  355. // returned_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyReturned"],
  356. // //se_reject_reason = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  357. // //out_stock_type = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  358. // //is_checked = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  359. // //sys_material_date = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  360. // contract_no = ItemMasterDS.Tables[0].Rows[i]["Contract"].ToString(),
  361. // //create_dept = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"])
  362. // factory_id = factory_id,
  363. // tenant_id = tenant_id
  364. // };
  365. // entry.GenerateNewId();
  366. // ItemsAdd.Add(entry);
  367. // }
  368. // else
  369. // {
  370. // saleorderentry.seorder_id = seorder_id;
  371. // saleorderentry.bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString();
  372. // saleorderentry.entry_seq = (int?)ItemMasterDS.Tables[0].Rows[i]["Line"];
  373. // saleorderentry.item_number = ItemMasterDS.Tables[0].Rows[i]["ItemNum"].ToString();
  374. // saleorderentry.item_name = ItemMasterDS.Tables[0].Rows[i]["Descr"].ToString();
  375. // saleorderentry.specification = ItemMasterDS.Tables[0].Rows[i]["Descr1"].ToString();
  376. // //urgent = (int?)ItemMasterDS.Tables[0].Rows[i]["PLPriority"],
  377. // saleorderentry.bom_number = ItemMasterDS.Tables[0].Rows[i]["ItemNum"].ToString();
  378. // saleorderentry.unit = ItemMasterDS.Tables[0].Rows[i]["UM"].ToString();
  379. // saleorderentry.qty = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyOrded"];
  380. // //price = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Price"],
  381. // //tax_price = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  382. // //tax_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  383. // saleorderentry.amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Price"];
  384. // //discount_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  385. // saleorderentry.discount_amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Disc"];
  386. // //total_amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  387. // saleorderentry.plan_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["RequiredDate"];
  388. // //date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  389. // //planner_name = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  390. // //planner_no = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  391. // saleorderentry.remark = ItemMasterDS.Tables[0].Rows[i]["Remark"].ToString();
  392. // //soure_bill_no = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  393. // saleorderentry.custom_order_bill_no = ItemMasterDS.Tables[0].Rows[i]["CustPO"].ToString();
  394. // //custom_order_entryid = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  395. // //sys_capacity_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  396. // //adjust_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  397. // //mrp_closed = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  398. // saleorderentry.custom_order_itemno = ItemMasterDS.Tables[0].Rows[i]["CustItem"].ToString();
  399. // saleorderentry.state = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["Status"]);//TODO
  400. // //rnumber = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  401. // //deliver_notice_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  402. // saleorderentry.deliver_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyShipped"];
  403. // saleorderentry.returned_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyReturned"];
  404. // //se_reject_reason = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  405. // //out_stock_type = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  406. // //is_checked = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  407. // //sys_material_date = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  408. // saleorderentry.contract_no = ItemMasterDS.Tables[0].Rows[i]["Contract"].ToString();
  409. // //create_dept = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"])
  410. // ItemsUpdate.Add(saleorderentry);
  411. // }
  412. // }
  413. // //_businessDbContext.crm_seorder.Delete();
  414. // _businessDbContext.crm_seorderentry.BulkInsert(ItemsAdd);
  415. // _businessDbContext.crm_seorderentry.BulkUpdate(ItemsUpdate);
  416. // }
  417. //}
  418. //同步物料
  419. public void SyncItemMaster()
  420. {
  421. bool isAll = true;//是否同步所有物料
  422. var ic_itemList = _mysql_ic_item.GetListAsync(a => a.tenant_id == 1000 && a.factory_id == 1001).Result;
  423. List<ItemMaster> custList = new List<ItemMaster>();
  424. if(isAll)
  425. {
  426. custList = _itemMaster.Select(a => a.IsActive && a.Domain=="1001");
  427. }else
  428. {
  429. //格努产品编码同步子级物料
  430. List<string> childItems = GetChildItemNumber("", new List<string>());
  431. custList= _itemMaster.Select(a => a.IsActive && a.Domain == "1001" && childItems.Distinct().Contains(a.ItemNum));
  432. }
  433. List<ic_item> ItemsAdd = new List<ic_item>();
  434. List<srm_purchase> srm_purchaseAdd = new List<srm_purchase>();
  435. if (custList != null && custList.Count > 0)
  436. {
  437. for (int i = 0; i < custList.Count; i++)
  438. {
  439. var ic_item = ic_itemList.Find(x => x.number == custList[i].ItemNum && x.tenant_id == 1000 && x.factory_id == 1001);
  440. if (ic_item == null)
  441. {
  442. long itemId = help.NextId();
  443. ItemsAdd.Add(new ic_item(itemId)
  444. {
  445. number = custList[i].ItemNum, //物料编码
  446. name = custList[i].Descr, //物料名称
  447. model = custList[i].Descr1,//规格型号
  448. fversion = "",//版本号
  449. //ext.FErpClsID == "配置类" ? 0 : ext.FErpClsID == "自制" ? 1 : ext.FErpClsID == "委外" ? 2 : ext.FErpClsID == "外购" ? 3 : ext.FErpClsID == "虚拟" ? 4 : ext.FErpClsID == "费用" ? 5 : ext.FErpClsID == "服务" ? 6 : -1;
  450. //erp_cls = custList[i].PurMfg == "P" ? 3 : 1,//物料属性
  451. erp_cls = custList[i].ItemNum == "1.SD1.D.0056-F" || custList[i].ItemNum == "1.ZC1.D.0001" || custList[i].ItemNum == "1.BW1.D.0030" ? 1 : 3,
  452. //erp_cls_name = custList[i].PurMfg == "P" ? "外购" : "自制",//物料属性名称
  453. erp_cls_name = custList[i].ItemNum == "1.SD1.D.0056-F" || custList[i].ItemNum == "1.ZC1.D.0001" || custList[i].ItemNum == "1.BW1.D.0030" ? "自制" : "外购",
  454. unit = custList[i].UM,//单位
  455. item_level = 0,//物料等级
  456. source = "",//来源
  457. iskeyitem = custList[i].IsMainMas ? 1 : 0,//是否关键件
  458. net_weight = (decimal)custList[i].NetWeight,//净重
  459. maund = custList[i].NetWeightUM,//重量单位
  460. length = (decimal)custList[i].Length,//长度
  461. width = (decimal)custList[i].Width,//宽度
  462. height = (decimal)custList[i].Height,//高度
  463. allowpur = custList[i].PurMfg == "P" ? 1 : 0,//允许采购
  464. allowsale = 1,//允许销售
  465. allowmanu = custList[i].PurMfg == "L" ? 1 : 0,//允许生产
  466. allowout = 1,//允许委外
  467. allowbatch = custList[i].LotSerialControl ? 1 : 0,//批号管理
  468. allowserial = custList[i].LotSerialControl ? 1 : 0,//序列号管理
  469. photo = "",//图片
  470. enable_warning = 1,//启用预警
  471. factory_id = 1001,
  472. tenant_id = 1000,
  473. IsDeleted = false,
  474. batch_manager = custList[i].LotSerialControl ? 1 : 0,
  475. minorderqty = custList[i].MinOrd,
  476. minpackqty = 1,
  477. ordissu_days = 1,
  478. transportation_leadtime = 3,
  479. stock_leadtime = 1,
  480. production_leadtime = 4,
  481. order_leadtime = 4,
  482. fix_leadtime = 1,
  483. order_inter_val = 1,
  484. lead_time = 1,
  485. bat_change_economy = 1,
  486. total_tqq = 1,
  487. order_point = 1,
  488. secinv = 1,
  489. secinv_ratio = 1,
  490. self_inspection_date = 1,
  491. Warehousing_date = 1,
  492. Shipping_date = 3,
  493. });
  494. srm_purchaseAdd.Add(new srm_purchase(help.NextId())
  495. {
  496. icitem_id = itemId,
  497. icitem_name = custList[i].Descr,
  498. sourcelist_number = "HYQD12064",
  499. supplier_id = 10101000051,
  500. supplier_number = "",
  501. supplier_name = "广州市伟正金属构件有限公司",
  502. purchgroup = "",
  503. purcher = "",
  504. purchase_unit = "",
  505. netpurchase_price = 1,
  506. taxrate = 0.13m,
  507. currency_type = 1,
  508. order_rector_name = "",
  509. order_rector_num = "",
  510. factory_code = "",
  511. order_dept = "",
  512. order_price = 13,
  513. sale_price = 130,
  514. qty_min = 10,
  515. batch_append_qty = 10,
  516. factory_id = 1001,
  517. tenant_id = 1000,
  518. IsDeleted = false
  519. });
  520. }
  521. }
  522. }
  523. _businessDbContext.BulkInsert(ItemsAdd);
  524. _businessDbContext.BulkInsert(srm_purchaseAdd);
  525. }
  526. public void SyncBom()
  527. {
  528. var ic_bomList = _mysql_ic_bom.GetListAsync(a => a.tenant_id == 1000 && a.factory_id == 1001).Result;
  529. var ic_itemList = _mysql_ic_item.GetListAsync(a => a.tenant_id == 1000 && a.factory_id == 1001).Result;
  530. var ic_bomchildList = _mysql_ic_bom_child.GetListAsync(a => a.tenant_id == 1000 && a.factory_id == 1001 && (a.bom_number == "1.SD1.D.0056-F" || a.bom_number == "1.ZC1.D.0001" || a.bom_number == "1.BW1.D.0030")).Result;
  531. List<ProductStructureMaster> wmsBomList = _productStructureMaster.Select(a => a.Domain == "1001" && (a.ParentItem == "1.SD1.D.0056-F" || a.ParentItem == "1.ZC1.D.0001" || a.ParentItem == "1.BW1.D.0030") && a.IsActive);
  532. List<ic_bom> ItemsAdd = new List<ic_bom>();
  533. List<ic_bom_child> childItemsAdd = new List<ic_bom_child>();
  534. if (wmsBomList != null && wmsBomList.Count > 0)
  535. {
  536. var ItemMasterDS = wmsBomList.Select(a => a.ParentItem).Distinct().ToList();
  537. foreach (var c in ItemMasterDS)
  538. {
  539. var icbom = ic_bomList.Find(x => x.item_number == c && x.tenant_id == 1000 && x.factory_id == 1001);
  540. var ItemList = wmsBomList.Where(a => a.ParentItem == c);
  541. var item = ic_itemList.Find(a => a.number == c);
  542. if (item == null)
  543. {
  544. continue;
  545. }
  546. if (icbom == null)
  547. {
  548. long domain = Convert.ToInt64(ItemList.First().Domain);
  549. long factory_id = domain % 1000;
  550. long tenant_id = domain - factory_id;
  551. var bom = new ic_bom(help.NextId())
  552. {
  553. bom_number = c,
  554. icitem_id = item.Id,
  555. item_name = item.name,
  556. item_number = c,
  557. version = ItemList.First().Refs,
  558. factory_id = 1001,
  559. tenant_id = 1000,
  560. IsDeleted = false,
  561. use_status = 1
  562. };
  563. ItemsAdd.Add(bom);
  564. foreach (var child in ItemList)
  565. {
  566. var itemchild = ic_itemList.Find(a => a.number == child.ComponentItem);
  567. if (itemchild == null) { continue; }
  568. var bomchild = new ic_bom_child(help.NextId())
  569. {
  570. bom_id = bom.Id,
  571. bom_number = bom.bom_number,
  572. icitem_id = itemchild == null ? long.MinValue : itemchild.Id,
  573. item_number = child.ComponentItem,
  574. item_name = itemchild == null ? "" : itemchild.name,
  575. unit = child.UM,
  576. qty = child.Qty,
  577. entryid = child.SequenceNum,
  578. erp_cls = itemchild == null ? 2 : itemchild.erp_cls,
  579. begin_day = child.StartEff,
  580. end_day = child.EndEff,
  581. child_num = child.SequenceNum,
  582. version = child.Refs,
  583. factory_id = 1001,
  584. tenant_id = 1000,
  585. IsDeleted = false,
  586. use_status = 1
  587. };
  588. childItemsAdd.Add(bomchild);
  589. }
  590. }
  591. else {
  592. foreach (var child in ItemList)
  593. {
  594. var itemchild = ic_itemList.Find(a => a.number == child.ComponentItem);
  595. if (itemchild == null) { continue; }
  596. var icbomchild = ic_bomchildList.Find(s => s.bom_number == c && s.item_number == child.ComponentItem);
  597. if (icbomchild == null)
  598. {
  599. var bomchild = new ic_bom_child(help.NextId())
  600. {
  601. bom_id = icbom.Id,
  602. bom_number = icbom.bom_number,
  603. icitem_id = itemchild == null ? long.MinValue : itemchild.Id,
  604. item_number = child.ComponentItem,
  605. item_name = itemchild == null ? "" : itemchild.name,
  606. unit = child.UM,
  607. qty = child.Qty,
  608. entryid = child.SequenceNum,
  609. erp_cls = itemchild == null ? 2 : itemchild.erp_cls,
  610. begin_day = child.StartEff,
  611. end_day = child.EndEff,
  612. child_num = child.SequenceNum,
  613. version = child.Refs,
  614. factory_id = 1001,
  615. tenant_id = 1000,
  616. IsDeleted = false,
  617. use_status = 1
  618. };
  619. childItemsAdd.Add(bomchild);
  620. }
  621. }
  622. }
  623. }
  624. _businessDbContext.BulkInsert(ItemsAdd);
  625. _businessDbContext.BulkInsert(childItemsAdd);
  626. }
  627. }
  628. //循环获取子级物料编码,包括产品本身,有重复的结果去重即可
  629. public List<string> GetChildItemNumber(string itemNum, List<string> list)
  630. {
  631. list.Add(itemNum);
  632. var productStructures = _productStructureMaster.Select(p => p.ParentItem == itemNum && p.Domain == "1001" && p.IsActive);
  633. list.AddRange(productStructures.Select(a => a.ComponentItem));
  634. foreach (var item in productStructures)
  635. {
  636. if (item.StructureType.ToUpper() == "X")
  637. {
  638. GetChildItemNumber(item.ComponentItem, list);
  639. }
  640. }
  641. return list;
  642. }
  643. }
  644. }