SystemJobAppService.cs 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173
  1. using Business.Core.Enum;
  2. using Business.Core.Utilities;
  3. using Business.Domain;
  4. using Business.EntityFrameworkCore;
  5. using Business.EntityFrameworkCore.SqlRepositories;
  6. using Business.ResourceExamineManagement;
  7. using Business.ResourceExamineManagement.Dto;
  8. using Business.SystemJob;
  9. using EFCore.BulkExtensions;
  10. using Microsoft.Extensions.Configuration;
  11. using MongoDB.Driver.Linq;
  12. using NLog;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Threading.Tasks;
  17. using Volo.Abp.Application.Services;
  18. using Volo.Abp.Domain.Repositories;
  19. using Volo.Abp.MultiTenancy;
  20. using WkHtmlToPdfDotNet;
  21. namespace Business.SystemJobManagement
  22. {
  23. public class SystemJobAppService : ApplicationService, ISystemJobAppService
  24. {
  25. /// <summary>
  26. /// 物料bom
  27. /// </summary>
  28. private IRepository<ic_bom, long> _mysql_ic_bom;
  29. /// <summary>
  30. /// 物料bom子表
  31. /// </summary>
  32. private IRepository<ic_bom_child, long> _mysql_ic_bom_child;
  33. /// <summary>
  34. /// 物料
  35. /// </summary>
  36. private IRepository<ic_item, long> _mysql_ic_item;
  37. /// <summary>
  38. /// 供应商
  39. /// </summary>
  40. private IRepository<srm_supplier, long> _mysql_srm_supplier;
  41. /// <summary>
  42. /// 物料采购报价单
  43. /// </summary>
  44. private IRepository<srm_purchase, long> _mysql_srm_purchase;
  45. /// <summary>
  46. /// 物料采购报价单
  47. /// </summary>
  48. private IRepository<crm_customer, long> _mysql_crm_customer;
  49. /// <summary>
  50. /// 销售订单
  51. /// </summary>
  52. private IRepository<crm_seorder, long> _mysql_crm_seorder;
  53. /// <summary>
  54. /// 销售订单明细
  55. /// </summary>
  56. private IRepository<crm_seorderentry, long> _mysql_crm_seorderentry;
  57. /// <summary>
  58. /// 雪花算法
  59. /// </summary>
  60. SnowFlake help = new SnowFlake();
  61. private readonly BusinessDbContext _businessDbContext;
  62. private readonly ISqlRepository<CustMaster> _custMaster;
  63. private readonly ISqlRepository<SuppMaster> _suppMaster;
  64. private readonly ISqlRepository<ConsigneeAddressMaster> _consigneeAddressMaster;
  65. private readonly ISqlRepository<ItemMaster> _itemMaster;
  66. private readonly ISqlRepository<ProductStructureMaster> _productStructureMaster;
  67. private readonly ISqlRepository<PurOrdMaster> _purOrdMaster;
  68. private readonly ISqlRepository<PurOrdDetail> _purOrdDetail;
  69. /// <summary>
  70. /// 生产工单主表
  71. /// </summary>
  72. private readonly IRepository<mes_morder, long> _mysql_mes_morder;
  73. /// <summary>
  74. /// 生产工单子表
  75. /// </summary>
  76. private readonly IRepository<mes_moentry, long> _mysql_mes_moentry;
  77. /// <summary>
  78. /// 工单主表
  79. /// </summary>
  80. private readonly ISqlRepository<WorkOrdMaster> _workOrdMaster;
  81. /// <summary>
  82. /// 替代群组
  83. /// </summary>
  84. private IRepository<ic_substitute, long> _mysql_ic_substitute;
  85. /// <summary>
  86. /// 物料替代多群组
  87. /// </summary>
  88. private IRepository<ic_substitute_group, long> _mysql_ic_substitute_group;
  89. /// <summary>
  90. /// 物料替代多群组明细
  91. /// </summary>
  92. private IRepository<ic_substitute_group_detail, long> _mysql_ic_substitute_group_detail;
  93. /// <summary>
  94. /// 工艺路径
  95. /// </summary>
  96. private readonly IRepository<mo_mes_technique, long> _mes_technique;
  97. private IRepository<mes_technique, long> _mysql_mes_technique;
  98. /// <summary>
  99. /// 工序
  100. /// </summary>
  101. private readonly IRepository<mo_mes_process, long> _mes_process;
  102. private IRepository<mes_process, long> _mysql_mes_process;
  103. /// <summary>
  104. /// 工艺路径关联工序
  105. /// </summary>
  106. private readonly IRepository<mo_mes_tech_process, long> _mes_tech_process;
  107. private IRepository<mes_tech_process, long> _mysql_mes_tech_process;
  108. private IRepository<srm_po_main, long> _srm_po_main;
  109. private IRepository<srm_po_list, long> _srm_po_list;
  110. /// <summary>
  111. /// 生产排产
  112. /// </summary>
  113. private readonly ProductionScheduleAppService _productionScheduleAppService;
  114. public SystemJobAppService(
  115. IRepository<ic_bom, long> mysql_ic_bom,
  116. IRepository<ic_bom_child, long> mysql_ic_bom_child,
  117. IRepository<ic_item, long> mysql_ic_item,
  118. IRepository<srm_supplier, long> mysql_srm_supplier,
  119. IRepository<srm_purchase, long> mysql_srm_purchase,
  120. IRepository<crm_customer, long> mysql_crm_customer,
  121. IRepository<crm_seorder, long> mysql_crm_seorder,
  122. IRepository<crm_seorderentry, long> mysql_crm_seorderentry,
  123. IRepository<ic_substitute, long> mysql_ic_substitute,
  124. IRepository<ic_substitute_group, long> mysql_ic_substitute_group,
  125. IRepository<ic_substitute_group_detail, long> mysql_ic_substitute_group_detail,
  126. IRepository<mes_technique, long> mysql_mes_technique,
  127. IRepository<mes_process, long> mysql_mes_process,
  128. IRepository<mes_tech_process, long> mysql_mes_tech_process,
  129. ISqlRepository<CustMaster> custMaster,
  130. ISqlRepository<SuppMaster> suppMaster,
  131. ISqlRepository<ConsigneeAddressMaster> consigneeAddressMaster,
  132. ISqlRepository<ItemMaster> itemMaster,
  133. ISqlRepository<ProductStructureMaster> productStructureMaster,
  134. IRepository<mo_mes_technique, long> mes_technique,
  135. IRepository<mo_mes_process, long> mes_process,
  136. IRepository<mo_mes_tech_process, long> mes_tech_process,
  137. ProductionScheduleAppService productionScheduleAppService,
  138. ISqlRepository<WorkOrdMaster> workOrdMaster,
  139. IRepository<mes_morder, long> mysql_mes_morder,
  140. IRepository<mes_moentry, long> mysql_mes_moentry,
  141. ISqlRepository<PurOrdMaster> purOrdMaster,
  142. ISqlRepository<PurOrdDetail> purOrdDetail,
  143. IRepository<srm_po_main, long> srm_po_main,
  144. IRepository<srm_po_list, long> srm_po_list,
  145. BusinessDbContext businessDbContext
  146. )
  147. {
  148. _mysql_ic_bom = mysql_ic_bom;
  149. _mysql_ic_bom_child = mysql_ic_bom_child;
  150. _mysql_ic_item = mysql_ic_item;
  151. _mysql_srm_supplier = mysql_srm_supplier;
  152. _mysql_srm_purchase = mysql_srm_purchase;
  153. _mysql_crm_customer = mysql_crm_customer;
  154. _mysql_crm_seorder = mysql_crm_seorder;
  155. _mysql_crm_seorderentry = mysql_crm_seorderentry;
  156. _mysql_ic_substitute = mysql_ic_substitute;
  157. _mysql_ic_substitute_group = mysql_ic_substitute_group;
  158. _mysql_ic_substitute_group_detail = mysql_ic_substitute_group_detail;
  159. _mysql_mes_technique = mysql_mes_technique;
  160. _mysql_mes_process = mysql_mes_process;
  161. _mysql_mes_tech_process = mysql_mes_tech_process;
  162. _custMaster = custMaster;
  163. _suppMaster = suppMaster;
  164. _consigneeAddressMaster = consigneeAddressMaster;
  165. _itemMaster = itemMaster;
  166. _productStructureMaster = productStructureMaster;
  167. _mes_technique = mes_technique;
  168. _mes_process = mes_process;
  169. _mes_tech_process = mes_tech_process;
  170. _businessDbContext = businessDbContext;
  171. _itemMaster = itemMaster;
  172. _productionScheduleAppService = productionScheduleAppService;
  173. _workOrdMaster = workOrdMaster;
  174. _mysql_mes_morder = mysql_mes_morder;
  175. _mysql_mes_moentry = mysql_mes_moentry;
  176. _purOrdMaster = purOrdMaster;
  177. _purOrdDetail = purOrdDetail;
  178. _srm_po_main = srm_po_main;
  179. _srm_po_list = srm_po_list;
  180. }
  181. public string SyncWMSDataToMySQLJob()
  182. {
  183. try
  184. {
  185. SyncCustMaster();
  186. SyncSuppMaster();
  187. //SyncSalesOrdMaster();
  188. //SyncSalesOrdMasterEntry();
  189. SyncItemMaster();
  190. SyncBom();
  191. }
  192. catch (Exception ex)
  193. {
  194. return ex.Message;
  195. }
  196. return "同步完成";
  197. }
  198. public string LogInstallJob()
  199. {
  200. try
  201. {
  202. LogManager.Configuration.Install(new NLog.Config.InstallationContext());//每天0点执行一次
  203. }
  204. catch (Exception ex)
  205. {
  206. return ex.Message;
  207. }
  208. return "任务执行成功";
  209. }
  210. public async Task<string> SyncBaseDataToMongoDBJob()
  211. {
  212. try
  213. {
  214. //物料采购报价单
  215. List<srm_purchase> srm_purchases = _mysql_srm_purchase.GetListAsync().Result;
  216. if (srm_purchases.Count > 0)
  217. {
  218. //先清空表数据
  219. await MongoHelper<mo_srm_purchase>.DeleteManyAsync(p => p.mysql_id != -1);
  220. var mosrm_purchase = ObjectMapper.Map<List<srm_purchase>, List<mo_srm_purchase>>(srm_purchases);
  221. mosrm_purchase.ForEach(s => s.GenerateNewId(help.NextId()));
  222. await MongoHelper<mo_srm_purchase>.InsertManyAsync(mosrm_purchase);
  223. }
  224. //同步物料BOM明细数据
  225. var icbom_childs = _mysql_ic_bom_child.GetListAsync().Result;
  226. if (icbom_childs.Count > 0)
  227. {
  228. //先清空表数据
  229. await MongoHelper<mo_ic_bom_child>.DeleteManyAsync(p => p.mysql_id != -1);
  230. var moIcbom_childs = ObjectMapper.Map<List<ic_bom_child>, List<mo_ic_bom_child>>(icbom_childs);
  231. moIcbom_childs.ForEach(s => s.GenerateNewId(help.NextId()));
  232. await MongoHelper<mo_ic_bom_child>.InsertManyAsync(moIcbom_childs);
  233. }
  234. //同步物料Bom数据
  235. var icBoms = _mysql_ic_bom.GetListAsync().Result;
  236. if (icBoms.Count > 0)
  237. {
  238. //先清空表数据
  239. await MongoHelper<mo_ic_bom>.DeleteManyAsync(p => p.mysql_id != -1);
  240. var moIcBoms = ObjectMapper.Map<List<ic_bom>, List<mo_ic_bom>>(icBoms);
  241. moIcBoms.ForEach(s => s.GenerateNewId(help.NextId()));
  242. await MongoHelper<mo_ic_bom>.InsertManyAsync(moIcBoms);
  243. }
  244. //同步物料数据
  245. var icItems = _mysql_ic_item.GetListAsync().Result;
  246. if (icItems.Count > 0)
  247. {
  248. //先清空表数据
  249. await MongoHelper<mo_ic_item>.DeleteManyAsync(p => p.mysql_id != -1);
  250. var moIcItems = ObjectMapper.Map<List<ic_item>, List<mo_ic_item>>(icItems);
  251. moIcItems.ForEach(s => s.GenerateNewId(help.NextId()));
  252. await MongoHelper<mo_ic_item>.InsertManyAsync(moIcItems);
  253. }
  254. //同步替代群组数据
  255. var subtitutes = _mysql_ic_substitute.GetListAsync().Result;
  256. if (subtitutes.Count > 0)
  257. {
  258. //先清空表数据
  259. await MongoHelper<mo_ic_substitute>.DeleteManyAsync(p => p.mysql_id != -1);
  260. var moSubtitutes = ObjectMapper.Map<List<ic_substitute>, List<mo_ic_substitute>>(subtitutes);
  261. moSubtitutes.ForEach(s => s.GenerateNewId(help.NextId()));
  262. await MongoHelper<mo_ic_substitute>.InsertManyAsync(moSubtitutes);
  263. }
  264. //同步物料替代多群组数据
  265. var subAlls = _mysql_ic_substitute_group.GetListAsync().Result;
  266. if (subAlls.Count > 0)
  267. {
  268. //先清空表数据
  269. await MongoHelper<mo_ic_substitute_group>.DeleteManyAsync(p => p.mysql_id != -1);
  270. var moSubAlls = ObjectMapper.Map<List<ic_substitute_group>, List<mo_ic_substitute_group>>(subAlls);
  271. moSubAlls.ForEach(s => s.GenerateNewId(help.NextId()));
  272. await MongoHelper<mo_ic_substitute_group>.InsertManyAsync(moSubAlls);
  273. }
  274. //同步物料替代多群组明细数据
  275. var subAllDtls = _mysql_ic_substitute_group_detail.GetListAsync().Result;
  276. if (subAllDtls.Count > 0)
  277. {
  278. //先清空表数据
  279. await MongoHelper<mo_ic_substitute_group_detail>.DeleteManyAsync(p => p.mysql_id != -1);
  280. var moSubAllDtls = ObjectMapper.Map<List<ic_substitute_group_detail>, List<mo_ic_substitute_group_detail>>(subAllDtls);
  281. moSubAllDtls.ForEach(s => s.GenerateNewId(help.NextId()));
  282. await MongoHelper<mo_ic_substitute_group_detail>.InsertManyAsync(moSubAllDtls);
  283. }
  284. //同步供应商数据
  285. var suppliers = _mysql_srm_supplier.GetListAsync().Result;
  286. if (suppliers.Count > 0)
  287. {
  288. //先清空表数据
  289. await MongoHelper<mo_srm_supplier>.DeleteManyAsync(p => p.mysql_id != -1);
  290. var moSuppliers = ObjectMapper.Map<List<srm_supplier>, List<mo_srm_supplier>>(suppliers);
  291. moSuppliers.ForEach(s => s.GenerateNewId(help.NextId()));
  292. await MongoHelper<mo_srm_supplier>.InsertManyAsync(moSuppliers);
  293. }
  294. }
  295. catch (Exception ex)
  296. {
  297. return ex.Message;
  298. }
  299. return "任务执行成功";
  300. }
  301. //同步客户
  302. public void SyncCustMaster()
  303. {
  304. var customerList = _mysql_crm_customer.GetListAsync().Result;
  305. List<CustMaster> custList = _custMaster.Select(a => a.IsActive);
  306. var addressList = _consigneeAddressMaster.Select(a => a.Typed == "Cust" && a.IsActive);
  307. List<crm_customer> ItemsAdd = new List<crm_customer>();
  308. if (custList != null && custList.Count > 0)
  309. {
  310. for (int i = 0; i < custList.Count; i++)
  311. {
  312. long domain = Convert.ToInt64(custList[i].Domain);
  313. long factory_id = domain;
  314. long tenant_id = 1000;
  315. var cust = customerList.Find(x => x.customer_no == custList[i].Cust);
  316. if (cust is null)
  317. {
  318. ConsigneeAddressMaster address = addressList.Find(a => a.Address == custList[i].Cust);
  319. var customer = new crm_customer
  320. {
  321. customer_no = custList[i].Cust,
  322. customer_name = address is not null ? address.Name : "",
  323. telephone = address is not null ? address.Telephone : "",
  324. email = address is not null ? address.AttentionEmail : "",
  325. contact = address is not null ? address.Attention1 : "",
  326. post_code = address is not null ? address.Post : "",
  327. country = address is not null ? address.Country : "",
  328. province = address is not null ? address.State : "",
  329. city = address is not null ? address.City : "",
  330. region = address is not null ? address.State : "",
  331. address = address is not null ? address.Address1 : "",
  332. short_name = custList[i].SortName,
  333. carrying_aos = custList[i].CustShippingLT.GetValueOrDefault(),
  334. currency = custList[i].Curr,
  335. employee_name = custList[i].Salesperson1,
  336. factory_id = factory_id,
  337. tenant_id=tenant_id,
  338. company_id = tenant_id
  339. };
  340. customer.GenerateNewId(help.NextId());
  341. ItemsAdd.Add(customer);
  342. }
  343. }
  344. _businessDbContext.BulkInsert(ItemsAdd);
  345. }
  346. }
  347. //同步供应商
  348. public void SyncSuppMaster()
  349. {
  350. var suppList = _mysql_srm_supplier.GetListAsync().Result;
  351. List<SuppMaster> custList = _suppMaster.Select(a => a.IsActive);
  352. var addressList = _consigneeAddressMaster.Select(a => a.Typed == "Supp" && a.IsActive);
  353. List<srm_supplier> ItemsAdd = new List<srm_supplier>();
  354. if (custList != null && custList.Count > 0)
  355. {
  356. for (int i = 0; i < custList.Count; i++)
  357. {
  358. long domain = Convert.ToInt64(custList[i].Domain.ToString());
  359. long factory_id = domain;
  360. long tenant_id = 1000;
  361. var supp = suppList.Find(x => x.supplier_no == custList[i].Supp.ToString() && x.company_id == tenant_id && x.factory_id == factory_id);
  362. if (supp is null)
  363. {
  364. ConsigneeAddressMaster address = addressList.Find(a => a.Address == custList[i].Supp);
  365. var supplier = new srm_supplier
  366. {
  367. supplier_no = custList[i].Supp,
  368. supplier_name = address is not null ? address.Name : "",
  369. supplier_short_name = custList[i].SortName,
  370. country = address is not null ? address.Country : "",
  371. state = address is not null ? address.State : "",
  372. region = address is not null ? address.City : "",
  373. contact = address is not null ? address.Attention1 : "",
  374. telephone = address is not null ? address.Telephone : "",
  375. post_code = address is not null ? address.Post : "",
  376. email = address is not null ? address.AttentionEmail : "",
  377. currency = custList[i].Curr,
  378. supply_type = custList[i].Type,
  379. settlement = custList[i].CrTerms,
  380. factory_id = factory_id,
  381. tenant_id = tenant_id,
  382. company_id = tenant_id
  383. };
  384. supplier.GenerateNewId(help.NextId());
  385. ItemsAdd.Add(supplier);
  386. }
  387. }
  388. _businessDbContext.BulkInsert(ItemsAdd);
  389. }
  390. }
  391. //////同步销售订单
  392. ////public void SyncSalesOrdMaster()
  393. ////{
  394. //// var customerList = _mysql_crm_customer.GetListAsync().Result;
  395. //// var saleOrderList = _mysql_crm_seorder.GetListAsync().Result;
  396. //// 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");
  397. //// List<crm_seorder> ItemsAdd = new List<crm_seorder>();
  398. //// List<crm_seorder> ItemsUpdate = new List<crm_seorder>();
  399. //// if (ItemMasterDS != null && ItemMasterDS.Tables.Count > 0 && ItemMasterDS.Tables[0].Rows.Count > 0)
  400. //// {
  401. //// for (int i = 0; i < ItemMasterDS.Tables[0].Rows.Count; i++)
  402. //// {
  403. //// long domain = Convert.ToInt64(ItemMasterDS.Tables[0].Rows[i]["Domain"].ToString());
  404. //// long factory_id = domain % 1000;
  405. //// long tenant_id = domain - factory_id;
  406. //// var custno = ItemMasterDS.Tables[0].Rows[i]["Cust"].ToString();
  407. //// var cust = customerList.Find(a => a.customer_no == custno && a.factory_id == factory_id && a.tenant_id == tenant_id);
  408. //// long? custom_id = cust is null ? cust.Id : null;
  409. //// 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);
  410. //// if (saleorder is null)
  411. //// {
  412. //// var order = new crm_seorder
  413. //// {
  414. //// bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString(),
  415. //// custom_id = custom_id,
  416. //// custom_name = ItemMasterDS.Tables[0].Rows[i]["CustomName"].ToString(),
  417. //// custom_no = ItemMasterDS.Tables[0].Rows[i]["Cust"].ToString(),
  418. //// //custom_level = ItemMasterDS.Tables[0].Rows[i]["PurMfg"].ToString() == "P" ? "外购" : "自制",
  419. //// date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  420. //// rdate = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["RequiredDate"],
  421. //// //urgent = "",
  422. //// currency = ItemMasterDS.Tables[0].Rows[i]["Curr"].ToString() == "RMB" ? 1 : 0,
  423. //// exchange_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  424. //// //biller = ItemMasterDS.Tables[0].Rows[i]["NetWeightUM"].ToString(),
  425. //// //emp_no = (decimal)ItemMasterDS.Tables[0].Rows[i]["Length"],
  426. //// emp_name = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  427. //// //auditor = (decimal)ItemMasterDS.Tables[0].Rows[i]["Height"],
  428. //// //audit_date = ItemMasterDS.Tables[0].Rows[i]["PurMfg"].ToString() == "P" ? 1 : 0,
  429. //// //status = 1,
  430. //// //closed = "",
  431. //// //op_time = 1,
  432. //// bill_from = "",
  433. //// //project_name = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["LotSerialControl"]) == true ? 1 : 0,
  434. //// //project_code = "",
  435. //// out_stock_type = 1,//TODO
  436. //// //sale_dept_id = "",
  437. //// //sale_dept_name = 1,
  438. //// //sale_dept_code = 1,
  439. //// //create_dept = 1
  440. //// factory_id = factory_id,
  441. //// tenant_id = tenant_id
  442. //// };
  443. //// order.GenerateNewId();
  444. //// ItemsAdd.Add(order);
  445. //// }
  446. //// else
  447. //// {
  448. //// saleorder.bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString();
  449. //// saleorder.custom_id = custom_id;
  450. //// saleorder.custom_name = ItemMasterDS.Tables[0].Rows[i]["CustomName"].ToString();
  451. //// saleorder.custom_no = ItemMasterDS.Tables[0].Rows[i]["Cust"].ToString();
  452. //// //custom_level = ItemMasterDS.Tables[0].Rows[i]["PurMfg"].ToString() == "P" ? "外购" : "自制",
  453. //// saleorder.date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"];
  454. //// saleorder.rdate = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["RequiredDate"];
  455. //// saleorder.urgent = (int?)ItemMasterDS.Tables[0].Rows[i]["Sequence"];
  456. //// saleorder.currency = ItemMasterDS.Tables[0].Rows[i]["Curr"].ToString() == "RMB" ? 1 : 0;
  457. //// saleorder.exchange_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"];
  458. //// //biller = ItemMasterDS.Tables[0].Rows[i]["NetWeightUM"].ToString(),
  459. //// //emp_no = (decimal)ItemMasterDS.Tables[0].Rows[i]["Length"],
  460. //// saleorder.emp_name = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString();
  461. //// //auditor = (decimal)ItemMasterDS.Tables[0].Rows[i]["Height"],
  462. //// //audit_date = ItemMasterDS.Tables[0].Rows[i]["PurMfg"].ToString() == "P" ? 1 : 0,
  463. //// //status = 1,
  464. //// //closed = "",
  465. //// //op_time = 1,
  466. //// saleorder.bill_from = "";
  467. //// saleorder.project_name = ItemMasterDS.Tables[0].Rows[i]["ProjectName"].ToString();
  468. //// saleorder.project_code = ItemMasterDS.Tables[0].Rows[i]["Project"].ToString();
  469. //// saleorder.out_stock_type = 1;//TODO
  470. //// //sale_dept_id = "",
  471. //// //sale_dept_name = 1,
  472. //// //sale_dept_code = 1,
  473. //// //create_dept = 1
  474. //// ItemsUpdate.Add(saleorder);
  475. //// }
  476. //// }
  477. //// //_businessDbContext.crm_seorder.Delete();
  478. //// _businessDbContext.crm_seorder.BulkInsert(ItemsAdd);
  479. //// _businessDbContext.crm_seorder.BulkUpdate(ItemsUpdate);
  480. //// }
  481. ////}
  482. //////同步销售订单明细
  483. ////public void SyncSalesOrdMasterEntry()
  484. ////{
  485. //// var saleOrderEntryList = _mysql_crm_seorderentry.GetListAsync().Result;
  486. //// var saleOrderList = _mysql_crm_seorder.GetListAsync().Result;
  487. //// 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");
  488. //// List<crm_seorderentry> ItemsAdd = new List<crm_seorderentry>();
  489. //// List<crm_seorderentry> ItemsUpdate = new List<crm_seorderentry>();
  490. //// if (ItemMasterDS != null && ItemMasterDS.Tables.Count > 0 && ItemMasterDS.Tables[0].Rows.Count > 0)
  491. //// {
  492. //// for (int i = 0; i < ItemMasterDS.Tables[0].Rows.Count; i++)
  493. //// {
  494. //// long domain = Convert.ToInt64(ItemMasterDS.Tables[0].Rows[i]["Domain"].ToString());
  495. //// long factory_id = domain % 1000;
  496. //// long tenant_id = domain - factory_id;
  497. //// var bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString();
  498. //// var seorder = saleOrderList.Find(a => a.bill_no == bill_no && a.factory_id == factory_id && a.tenant_id == tenant_id);
  499. //// long? seorder_id = seorder is null ? seorder.Id : null;
  500. //// var saleorderentry = saleOrderEntryList.Find(x => x.bill_no == bill_no && x.tenant_id == factory_id && x.factory_id == tenant_id);
  501. //// if (saleorderentry is null)
  502. //// {
  503. //// var entry = new crm_seorderentry
  504. //// {
  505. //// seorder_id = seorder_id,
  506. //// bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString(),
  507. //// entry_seq = (int?)ItemMasterDS.Tables[0].Rows[i]["Line"],
  508. //// item_number = ItemMasterDS.Tables[0].Rows[i]["ItemNum"].ToString(),
  509. //// item_name = ItemMasterDS.Tables[0].Rows[i]["Descr"].ToString(),
  510. //// specification = ItemMasterDS.Tables[0].Rows[i]["Descr1"].ToString(),
  511. //// //urgent = (int?)ItemMasterDS.Tables[0].Rows[i]["PLPriority"],
  512. //// bom_number = ItemMasterDS.Tables[0].Rows[i]["ItemNum"].ToString(),
  513. //// unit = ItemMasterDS.Tables[0].Rows[i]["UM"].ToString(),
  514. //// qty = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyOrded"],
  515. //// //price = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Price"],
  516. //// //tax_price = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  517. //// //tax_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  518. //// amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Price"],
  519. //// //discount_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  520. //// discount_amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Disc"],
  521. //// //total_amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  522. //// plan_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["RequiredDate"],
  523. //// //date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  524. //// //planner_name = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  525. //// //planner_no = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  526. //// remark = ItemMasterDS.Tables[0].Rows[i]["Remark"].ToString(),
  527. //// //soure_bill_no = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  528. //// custom_order_bill_no = ItemMasterDS.Tables[0].Rows[i]["CustPO"].ToString(),
  529. //// //custom_order_entryid = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  530. //// //sys_capacity_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  531. //// //adjust_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  532. //// //mrp_closed = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  533. //// custom_order_itemno = ItemMasterDS.Tables[0].Rows[i]["CustItem"].ToString(),
  534. //// state = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["Status"]),//TODO
  535. //// deliver_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyShipped"],
  536. //// returned_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyReturned"],
  537. //// //se_reject_reason = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  538. //// //out_stock_type = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  539. //// //is_checked = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  540. //// //sys_material_date = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  541. //// contract_no = ItemMasterDS.Tables[0].Rows[i]["Contract"].ToString(),
  542. //// //create_dept = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"])
  543. //// factory_id = factory_id,
  544. //// tenant_id = tenant_id
  545. //// };
  546. //// entry.GenerateNewId();
  547. //// ItemsAdd.Add(entry);
  548. //// }
  549. //// else
  550. //// {
  551. //// saleorderentry.seorder_id = seorder_id;
  552. //// saleorderentry.bill_no = ItemMasterDS.Tables[0].Rows[i]["SalesOrd"].ToString();
  553. //// saleorderentry.entry_seq = (int?)ItemMasterDS.Tables[0].Rows[i]["Line"];
  554. //// saleorderentry.item_number = ItemMasterDS.Tables[0].Rows[i]["ItemNum"].ToString();
  555. //// saleorderentry.item_name = ItemMasterDS.Tables[0].Rows[i]["Descr"].ToString();
  556. //// saleorderentry.specification = ItemMasterDS.Tables[0].Rows[i]["Descr1"].ToString();
  557. //// //urgent = (int?)ItemMasterDS.Tables[0].Rows[i]["PLPriority"],
  558. //// saleorderentry.bom_number = ItemMasterDS.Tables[0].Rows[i]["ItemNum"].ToString();
  559. //// saleorderentry.unit = ItemMasterDS.Tables[0].Rows[i]["UM"].ToString();
  560. //// saleorderentry.qty = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyOrded"];
  561. //// //price = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Price"],
  562. //// //tax_price = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  563. //// //tax_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  564. //// saleorderentry.amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Price"];
  565. //// //discount_rate = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  566. //// saleorderentry.discount_amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["Disc"];
  567. //// //total_amount = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  568. //// saleorderentry.plan_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["RequiredDate"];
  569. //// //date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  570. //// //planner_name = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  571. //// //planner_no = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  572. //// saleorderentry.remark = ItemMasterDS.Tables[0].Rows[i]["Remark"].ToString();
  573. //// //soure_bill_no = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  574. //// saleorderentry.custom_order_bill_no = ItemMasterDS.Tables[0].Rows[i]["CustPO"].ToString();
  575. //// //custom_order_entryid = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  576. //// //sys_capacity_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  577. //// //adjust_date = (DateTime?)ItemMasterDS.Tables[0].Rows[i]["OrdDate"],
  578. //// //mrp_closed = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  579. //// saleorderentry.custom_order_itemno = ItemMasterDS.Tables[0].Rows[i]["CustItem"].ToString();
  580. //// saleorderentry.state = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["Status"]);//TODO
  581. //// //rnumber = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  582. //// //deliver_notice_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["ExchRate"],
  583. //// saleorderentry.deliver_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyShipped"];
  584. //// saleorderentry.returned_count = (decimal?)ItemMasterDS.Tables[0].Rows[i]["QtyReturned"];
  585. //// //se_reject_reason = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  586. //// //out_stock_type = ItemMasterDS.Tables[0].Rows[i]["Salesperson1"].ToString(),
  587. //// //is_checked = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  588. //// //sys_material_date = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"]),
  589. //// saleorderentry.contract_no = ItemMasterDS.Tables[0].Rows[i]["Contract"].ToString();
  590. //// //create_dept = Convert.ToBoolean(ItemMasterDS.Tables[0].Rows[i]["OrdDate"])
  591. //// ItemsUpdate.Add(saleorderentry);
  592. //// }
  593. //// }
  594. //// //_businessDbContext.crm_seorder.Delete();
  595. //// _businessDbContext.crm_seorderentry.BulkInsert(ItemsAdd);
  596. //// _businessDbContext.crm_seorderentry.BulkUpdate(ItemsUpdate);
  597. //// }
  598. ////}
  599. //同步物料
  600. public void SyncItemMaster()
  601. {
  602. //bool isAll = true;//是否同步所有物料
  603. var ic_itemList = _mysql_ic_item.GetListAsync().Result;
  604. List<ItemMaster> custList = new List<ItemMaster>();
  605. custList = _itemMaster.Select(a => a.IsActive);
  606. List<ic_item> ItemsAdd = new List<ic_item>();
  607. List<ic_item_stock> stockAdd = new List<ic_item_stock>();
  608. List<ic_item> ItemsUpd = new List<ic_item>();
  609. List<srm_purchase> srm_purchaseAdd = new List<srm_purchase>();
  610. if (custList != null && custList.Count > 0)
  611. {
  612. for (int i = 0; i < custList.Count; i++)
  613. {
  614. var ic_item = ic_itemList.Find(x => x.number == custList[i].ItemNum);
  615. int erpcls = 0;
  616. string erpclsText = "配置类";
  617. long itemId = help.NextId();
  618. if (custList[i].PurMfg == "L")
  619. {
  620. if (custList[i].EMTType == "50")
  621. {
  622. erpcls = 4;
  623. erpclsText = "虚拟";
  624. }
  625. else
  626. {
  627. erpcls = 1;
  628. erpclsText = "自制";
  629. }
  630. }
  631. else
  632. {
  633. if (custList[i].EMTType == "30")
  634. {
  635. erpcls = 2;
  636. erpclsText = "委外";
  637. }
  638. else
  639. {
  640. erpcls = 3;
  641. erpclsText = "外购";
  642. }
  643. }
  644. if (ic_item == null)
  645. {
  646. ItemsAdd.Add(new ic_item(itemId)
  647. {
  648. number = custList[i].ItemNum, //物料编码
  649. name = custList[i].Descr, //物料名称
  650. model = custList[i].Descr1,//规格型号
  651. fversion = custList[i].Rev,//版本号
  652. erp_cls = erpcls,//物料属性
  653. erp_cls_name = erpclsText,//物料属性名称
  654. unit = custList[i].UM,//单位
  655. item_level = 0,//物料等级
  656. source = "",//来源
  657. iskeyitem = custList[i].IsMainMas ? 1 : 0,//是否关键件
  658. net_weight = (decimal)custList[i].NetWeight,//净重
  659. maund = custList[i].NetWeightUM,//重量单位
  660. length = (decimal)custList[i].Length,//长度
  661. width = (decimal)custList[i].Width,//宽度
  662. height = (decimal)custList[i].Height,//高度
  663. allowpur = custList[i].PurMfg == "P" ? 1 : 0,//允许采购
  664. allowsale = 1,//允许销售
  665. allowmanu = custList[i].PurMfg == "L" ? 1 : 0,//允许生产
  666. allowout = 1,//允许委外
  667. allowbatch = custList[i].LotSerialControl ? 1 : 0,//批号管理
  668. allowserial = custList[i].LotSerialControl ? 1 : 0,//序列号管理
  669. photo = "",//图片
  670. enable_warning = 1,//启用预警
  671. factory_id = long.Parse(custList[i].Domain),
  672. company_id = 1000,
  673. tenant_id = 1000,
  674. IsDeleted = false,
  675. clean_leadtime = custList[i].MFGMTTR,
  676. is_clean = custList[i].IssuePolicy ? 1 : 0,
  677. batch_manager = custList[i].LotSerialControl ? 1 : 0,
  678. minorderqty = custList[i].MinOrd,
  679. minpackqty = 1,
  680. ordissu_days = 1,
  681. transportation_leadtime = 3,
  682. stock_leadtime = 1,
  683. production_leadtime = 4,
  684. order_leadtime = 4,
  685. fix_leadtime = 1,
  686. order_inter_val = 1,
  687. lead_time = 1,
  688. bat_change_economy = 1,
  689. total_tqq = 1,
  690. order_point = 1,
  691. secinv = 1,
  692. secinv_ratio = 1,
  693. self_inspection_date = custList[i].InsLT,
  694. Warehousing_date = 1,
  695. Shipping_date = 3,
  696. PurLT = custList[i].PurLT
  697. });;
  698. ic_item_stock addStock = new ic_item_stock();
  699. addStock.GenerateNewId(help.NextId());
  700. addStock.icitem_id = itemId;
  701. addStock.icitem_number = custList[i].ItemNum; //物料编码
  702. addStock.icitem_name = custList[i].Descr; //物料名称
  703. addStock.sqty = 0;
  704. addStock.quantity_in_transit = 0;
  705. addStock.fversion = "";
  706. addStock.factory_id = long.Parse(custList[i].Domain);
  707. addStock.company_id = 1000;
  708. addStock.tenant_id = 1000;
  709. addStock.create_time = DateTime.Now;
  710. addStock.update_time = DateTime.Now;
  711. addStock.create_by_name = "admin";
  712. addStock.update_by_name = "admin";
  713. stockAdd.Add(addStock);
  714. }
  715. else
  716. {
  717. ic_item.name = custList[i].Descr;
  718. ic_item.model = custList[i].Descr1;//规格型号
  719. ic_item.fversion = custList[i].Rev;//版本号
  720. ic_item.erp_cls = erpcls;//物料属性
  721. ic_item.erp_cls_name = erpclsText;//物料属性名称
  722. ic_item.unit = custList[i].UM;//单位
  723. ic_item.clean_leadtime = custList[i].MFGMTTR;
  724. ic_item.PurLT = custList[i].PurLT;
  725. ItemsUpd.Add(ic_item);
  726. }
  727. }
  728. }
  729. _businessDbContext.BulkInsert(ItemsAdd);
  730. _businessDbContext.BulkInsert(stockAdd);
  731. _businessDbContext.ic_item.UpdateRange(ItemsUpd);
  732. }
  733. public void SyncBom()
  734. {
  735. var ic_bomList = _mysql_ic_bom.GetListAsync().Result;
  736. var ic_itemList = _mysql_ic_item.GetListAsync().Result;
  737. var ic_bomchildList = _mysql_ic_bom_child.GetListAsync().Result;
  738. List<ProductStructureMaster> wmsBomList = _productStructureMaster.Select(a => a.IsActive);
  739. List<ic_bom> ItemsAdd = new List<ic_bom>();
  740. List<ic_bom_child> childItemsAdd = new List<ic_bom_child>();
  741. List<ic_bom_child> childItemsUpd = new List<ic_bom_child>();
  742. if (wmsBomList != null && wmsBomList.Count > 0)
  743. {
  744. var ItemMasterDS = wmsBomList.Select(a => a.ParentItem).Distinct().ToList();
  745. foreach (var c in ItemMasterDS)
  746. {
  747. var icbom = ic_bomList.Find(x => x.item_number == c);
  748. var ItemList = wmsBomList.Where(a => a.ParentItem == c);
  749. var item = ic_itemList.Find(a => a.number == c);
  750. if (item == null)
  751. {
  752. continue;
  753. }
  754. if (icbom == null)
  755. {
  756. long domain = Convert.ToInt64(ItemList.First().Domain);
  757. long factory_id = domain % 8010;
  758. //long tenant_id = domain - factory_id;
  759. var bom = new ic_bom(help.NextId())
  760. {
  761. bom_number = c,
  762. icitem_id = item.Id,
  763. item_name = item.name,
  764. item_number = c,
  765. version = ItemList.First().Refs,
  766. factory_id = item.factory_id,
  767. company_id = item.company_id,
  768. tenant_id = item.company_id,
  769. IsDeleted = false,
  770. use_status = 1
  771. };
  772. ItemsAdd.Add(bom);
  773. foreach (var child in ItemList)
  774. {
  775. var itemchild = ic_itemList.Find(a => a.number == child.ComponentItem);
  776. if (itemchild == null) { continue; }
  777. var bomchild = new ic_bom_child(help.NextId())
  778. {
  779. bom_id = bom.Id,
  780. bom_number = bom.bom_number,
  781. icitem_id = itemchild == null ? long.MinValue : itemchild.Id,
  782. item_number = child.ComponentItem,
  783. item_name = itemchild == null ? "" : itemchild.name,
  784. unit = child.UM,
  785. qty = child.Qty,
  786. entryid = child.SequenceNum,
  787. erp_cls = itemchild == null ? 2 : itemchild.erp_cls,
  788. begin_day = child.StartEff,
  789. end_day = child.EndEff,
  790. child_num = child.SequenceNum,
  791. version = child.Refs,
  792. factory_id = item.factory_id,
  793. company_id = item.company_id,
  794. tenant_id = item.company_id,
  795. IsDeleted = false,
  796. Op = child.Op,
  797. use_status = 1,
  798. scrap = child.Scrap,
  799. wastage = child.QtyConsumed
  800. };
  801. childItemsAdd.Add(bomchild);
  802. }
  803. }
  804. else
  805. {
  806. foreach (var child in ItemList)
  807. {
  808. var itemchild = ic_itemList.Find(a => a.number == child.ComponentItem);
  809. if (itemchild == null) { continue; }
  810. var icbomchild = ic_bomchildList.Find(s => s.bom_number == c && s.item_number == child.ComponentItem);
  811. if (icbomchild == null)
  812. {
  813. var bomchild = new ic_bom_child(help.NextId())
  814. {
  815. bom_id = icbom.Id,
  816. bom_number = icbom.bom_number,
  817. icitem_id = itemchild == null ? long.MinValue : itemchild.Id,
  818. item_number = child.ComponentItem,
  819. item_name = itemchild == null ? "" : itemchild.name,
  820. unit = child.UM,
  821. qty = child.Qty,
  822. entryid = child.SequenceNum,
  823. erp_cls = itemchild == null ? 2 : itemchild.erp_cls,
  824. begin_day = child.StartEff,
  825. end_day = child.EndEff,
  826. child_num = child.SequenceNum,
  827. version = child.Refs,
  828. factory_id = item.factory_id,
  829. company_id = item.company_id,
  830. tenant_id = item.company_id,
  831. IsDeleted = false,
  832. Op = child.Op,
  833. use_status = 1,
  834. scrap = child.Scrap,
  835. wastage = child.QtyConsumed
  836. };
  837. childItemsAdd.Add(bomchild);
  838. }
  839. else
  840. {
  841. icbomchild.qty = child.Qty;
  842. icbomchild.erp_cls = itemchild == null ? 2 : itemchild.erp_cls;
  843. icbomchild.begin_day = child.StartEff;
  844. icbomchild.end_day = child.EndEff;
  845. icbomchild.version = child.Refs;
  846. icbomchild.factory_id = item.factory_id;
  847. icbomchild.company_id = item.company_id;
  848. icbomchild.tenant_id = item.company_id;
  849. icbomchild.Op = child.Op;
  850. icbomchild.scrap = child.Scrap;
  851. icbomchild.wastage = child.QtyConsumed;
  852. childItemsUpd.Add(icbomchild);
  853. }
  854. }
  855. }
  856. }
  857. _businessDbContext.BulkInsert(ItemsAdd);
  858. _businessDbContext.BulkInsert(childItemsAdd);
  859. _businessDbContext.ic_bom_child.UpdateRange(childItemsUpd);
  860. }
  861. }
  862. public string DoProductScheduleJob()
  863. {
  864. try
  865. {
  866. _productionScheduleAppService.DoExt();
  867. }
  868. catch (Exception ex)
  869. {
  870. return ex.Message;
  871. }
  872. return "任务执行成功";
  873. }
  874. /// <summary>
  875. /// 同步工单和采购订单数据
  876. /// </summary>
  877. /// <returns></returns>
  878. public string SyncOrderAndPurOrd()
  879. {
  880. try
  881. {
  882. IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
  883. string domain = configuration.GetConnectionString("Factory_id");
  884. string companyid = configuration.GetConnectionString("Company_id");
  885. if (string.IsNullOrEmpty(domain) || string.IsNullOrEmpty(companyid))
  886. {
  887. return "请检查配置文件中公司和工厂编码是否维护。";
  888. }
  889. var sysResult = SyncOrder(domain).Result;
  890. if (sysResult == "ok")
  891. {
  892. sysResult = SyncPurOrd(domain, companyid).Result;
  893. }
  894. return sysResult;
  895. }
  896. catch (Exception ex)
  897. {
  898. return ex.Message;
  899. }
  900. }
  901. private async Task<string> SyncOrder(string domain)
  902. {
  903. try
  904. {
  905. DateTime time = DateTime.Now.AddMonths(-2).Date;
  906. //取数范围 需明确数据范围
  907. var workList = _workOrdMaster.Select(c => c.CreateTime >= time && c.Domain == domain && string.IsNullOrWhiteSpace(c.Status) == false).ToList();
  908. var mesMorder = _mysql_mes_morder.GetListAsync(x => x.factory_id.ToString() == domain && x.create_time >= time).Result;
  909. var mesMoentry = _mysql_mes_moentry.GetListAsync(x => x.factory_id.ToString() == domain && x.create_time >= time).Result;
  910. List<mes_morder> updateList = new List<mes_morder>();
  911. List<mes_moentry> updateMoentryList = new List<mes_moentry>();
  912. foreach (var work in workList)
  913. {
  914. var morder = mesMorder.Find(x => x.morder_no == work.WorkOrd);
  915. if (morder != null)
  916. {
  917. //修改
  918. morder.moentry_sys_stime = work.OrdDate;
  919. morder.moentry_sys_etime = work.DueDate;
  920. morder.need_number = work.QtyOrded;
  921. morder.morder_production_number = work.QtyOrded;
  922. morder.morder_need_time = work.LbrVar;
  923. string status = "";
  924. switch (work.Status.ToUpper())
  925. {
  926. case "P":
  927. status = MorderEnum.Initial_state;
  928. break;
  929. case "R":
  930. status = MorderEnum.Xd_state;
  931. break;
  932. case "W":
  933. status = MorderEnum.tc_state;
  934. break;
  935. case "C":
  936. status = MorderEnum.Accomplish_state;
  937. break;
  938. default:
  939. status = MorderEnum.Initial_state;
  940. break;
  941. }
  942. morder.morder_state = status;
  943. updateList.Add(morder);
  944. var moentry = mesMoentry.Find(x => x.moentry_moid == morder.Id);
  945. if (moentry != null)
  946. {
  947. moentry.morder_production_number = morder.morder_production_number;
  948. moentry.need_number = morder.need_number;
  949. updateMoentryList.Add(moentry);
  950. }
  951. }
  952. }
  953. await _mysql_mes_morder.UpdateManyAsync(updateList);
  954. await _mysql_mes_moentry.UpdateManyAsync(updateMoentryList);
  955. }
  956. catch (Exception e)
  957. {
  958. return e.Message;
  959. }
  960. return "ok";
  961. }
  962. private async Task<string> SyncPurOrd(string domain,string companyid)
  963. {
  964. DateTime time = DateTime.Now.AddMonths(-2).Date;
  965. var masters = _purOrdMaster.Select(x => x.Domain == domain && x.CreateTime>= time).ToList();
  966. var details = _purOrdDetail.Select(x => x.Domain == domain && x.CreateTime >= time).ToList();
  967. //日期上多查询一天。
  968. var pomains = _srm_po_main.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid && x.create_time >= time.AddDays(-1)).Result;
  969. var polists = _srm_po_list.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid && x.create_time >= time.AddDays(-1)).Result;
  970. List<ic_item> itemList = _mysql_ic_item.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid).Result;
  971. List<srm_po_main> poList = new List<srm_po_main>();
  972. List<srm_po_list> detailList = new List<srm_po_list>();
  973. List<srm_po_main> addPo = new List<srm_po_main>();
  974. List<srm_po_main> updatePo = new List<srm_po_main>();
  975. List<srm_po_list> addPolist = new List<srm_po_list>();
  976. List<srm_po_list> updatePolist = new List<srm_po_list>();
  977. List<srm_po_list> delPolist = new List<srm_po_list>();
  978. try
  979. {
  980. foreach (var m in masters)
  981. {
  982. var po = pomains.Find(x => x.po_billno == m.PurOrd);
  983. if (po != null)
  984. {
  985. updatePo.Add(po);
  986. }
  987. else
  988. {
  989. //add PO Polist
  990. po = new srm_po_main();
  991. po.GenerateNewId(help.NextId());
  992. po.po_billno = m.PurOrd;
  993. //var pr = list.Find(s => s.Id == dto.polist[0].pr_id);
  994. //var itemsupplier = itemsupplierList.Find(a => a.Id == pr.pr_purchaseid);
  995. //po.po_purchaser = m.;
  996. po.po_purchaser_no = m.Buyer;
  997. po.po_ssend_date = m.OrdDate;
  998. po.po_tax_rate = m.Tax1;
  999. po.po_express = 1;
  1000. po.po_note = "";
  1001. po.po_order_type = 1;
  1002. po.po_total = 0;
  1003. po.supplier_type = m.USAGE;
  1004. //po.currency = pr.currencytype;
  1005. po.bill_type = 1;
  1006. //po.supplier_id = pr.pr_purchaseid;
  1007. //po.supplier_name = m.;
  1008. po.supplier_no = m.Supp;
  1009. //po.contact = m.cus;
  1010. po.suppliertelephone = m.CustPhone;
  1011. //po.deliveryaddress = "";
  1012. po.supplierdddress = m.CustAddress;
  1013. po.confirmstate = 1;
  1014. po.logisticsstate = 0;
  1015. po.financialstate = 0;
  1016. po.create_time = DateTime.Now;
  1017. po.factory_id = long.Parse(domain);
  1018. po.company_id = long.Parse(companyid);
  1019. po.po_delivery = 1;
  1020. addPo.Add(po);
  1021. }
  1022. po.state = GetPurOrdStatus(m.Status);
  1023. var dtls = details.Where(x => x.PurOrdRecID == m.RecID).ToList();
  1024. var plists = polists.Where(x => x.po_id == po.Id).ToList();
  1025. //所有数据先默认删除
  1026. delPolist.AddRange(plists);
  1027. foreach (var dtl in dtls)
  1028. {
  1029. var plist = plists.Find(x => x.number == dtl.ItemNum);
  1030. if (plist != null)
  1031. {
  1032. //如果有存在,则从删除集合移除
  1033. delPolist.Remove(plist);
  1034. plist.state = dtl.Status.ToUpper() == "C" ? 0 : 1;
  1035. updatePolist.Add(plist);
  1036. }
  1037. else
  1038. {
  1039. plist = new srm_po_list();
  1040. plist.GenerateNewId(help.NextId());
  1041. var icitem = itemList.Find(a => a.number == dtl.ItemNum);
  1042. if (icitem == null)
  1043. {
  1044. continue;
  1045. }
  1046. plist.icitem_id = icitem.Id;
  1047. plist.model = icitem.model;
  1048. plist.ItemNum = icitem.number;
  1049. plist.icitem_name = icitem.name;
  1050. plist.qty = dtl.QtyOrded.GetValueOrDefault();
  1051. plist.netprice = dtl.PurCost.GetValueOrDefault();
  1052. plist.netmoney = dtl.QtyOrded.GetValueOrDefault() * dtl.PurCost.GetValueOrDefault();
  1053. plist.rate = dtl.TaxRate;
  1054. plist.price = dtl.PurCost.GetValueOrDefault();
  1055. plist.total_price = dtl.QtyOrded.GetValueOrDefault() * dtl.PurCost.GetValueOrDefault();
  1056. //plist.taxamount = item.pr_orderprice.GetValueOrDefault() - podetail.netmoney;
  1057. plist.plan_qty = dtl.QtyOrded.GetValueOrDefault();
  1058. plist.unit = icitem.unit;
  1059. plist.state = dtl.Status.ToUpper() == "C" ? 0 : 1;
  1060. plist.rarrdate = dtl.DueDate;
  1061. plist.rnumber = 0;
  1062. //plist.currencytype = m.Curr;
  1063. plist.create_time = DateTime.Now;
  1064. plist.factory_id = po.factory_id;
  1065. plist.company_id = po.company_id;
  1066. plist.tenant_id = po.tenant_id;
  1067. plist.stock_id = 1;
  1068. plist.state = dtl.Status.ToUpper() == "C" ? 0 : 1;
  1069. addPolist.Add(plist);
  1070. }
  1071. }
  1072. }
  1073. if (addPo.Any())
  1074. {
  1075. await _srm_po_main.InsertManyAsync(addPo);
  1076. }
  1077. if (updatePo.Any())
  1078. {
  1079. await _srm_po_main.UpdateManyAsync(updatePo);
  1080. }
  1081. if (addPolist.Any())
  1082. {
  1083. await _srm_po_list.InsertManyAsync(addPolist);
  1084. }
  1085. if (updatePolist.Any())
  1086. {
  1087. await _srm_po_list.UpdateManyAsync(updatePolist);
  1088. }
  1089. if (delPolist.Any())
  1090. {
  1091. await _srm_po_list.HardDeleteAsync(delPolist);
  1092. }
  1093. }
  1094. catch(Exception ex)
  1095. {
  1096. return ex.Message;
  1097. }
  1098. return "ok";
  1099. }
  1100. private int GetPurOrdStatus(string status)
  1101. {
  1102. int poStatu = 0;
  1103. switch (status)
  1104. {
  1105. case "":
  1106. poStatu = 0;
  1107. break;
  1108. case "A":
  1109. poStatu = 1;
  1110. break;
  1111. case "B":
  1112. poStatu = 2;
  1113. break;
  1114. case "C":
  1115. poStatu = 3;
  1116. break;
  1117. default:
  1118. poStatu = 0;
  1119. break;
  1120. }
  1121. return poStatu;
  1122. }
  1123. }
  1124. }