SyncWMSDataAppService.cs 41 KB

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