|
|
@@ -1,10 +1,13 @@
|
|
|
-using Business.Core.Utilities;
|
|
|
+using Business.Core.Enum;
|
|
|
+using Business.Core.Utilities;
|
|
|
using Business.Domain;
|
|
|
using Business.EntityFrameworkCore;
|
|
|
using Business.EntityFrameworkCore.SqlRepositories;
|
|
|
using Business.ResourceExamineManagement;
|
|
|
+using Business.ResourceExamineManagement.Dto;
|
|
|
using Business.SystemJob;
|
|
|
using EFCore.BulkExtensions;
|
|
|
+using Microsoft.Extensions.Configuration;
|
|
|
using MongoDB.Driver.Linq;
|
|
|
using NLog;
|
|
|
using System;
|
|
|
@@ -71,6 +74,23 @@ namespace Business.SystemJobManagement
|
|
|
private readonly ISqlRepository<ItemMaster> _itemMaster;
|
|
|
private readonly ISqlRepository<ProductStructureMaster> _productStructureMaster;
|
|
|
|
|
|
+ private readonly ISqlRepository<PurOrdMaster> _purOrdMaster;
|
|
|
+ private readonly ISqlRepository<PurOrdDetail> _purOrdDetail;
|
|
|
+
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 生产工单主表
|
|
|
+ /// </summary>
|
|
|
+ private readonly IRepository<mes_morder, long> _mysql_mes_morder;
|
|
|
+ /// <summary>
|
|
|
+ /// 生产工单子表
|
|
|
+ /// </summary>
|
|
|
+ private readonly IRepository<mes_moentry, long> _mysql_mes_moentry;
|
|
|
+ /// <summary>
|
|
|
+ /// 工单主表
|
|
|
+ /// </summary>
|
|
|
+ private readonly ISqlRepository<WorkOrdMaster> _workOrdMaster;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 替代群组
|
|
|
/// </summary>
|
|
|
@@ -104,6 +124,8 @@ namespace Business.SystemJobManagement
|
|
|
private readonly IRepository<mo_mes_tech_process, long> _mes_tech_process;
|
|
|
private IRepository<mes_tech_process, long> _mysql_mes_tech_process;
|
|
|
|
|
|
+ private IRepository<srm_po_main, long> _srm_po_main;
|
|
|
+ private IRepository<srm_po_list, long> _srm_po_list;
|
|
|
|
|
|
/// <summary>
|
|
|
/// 生产排产
|
|
|
@@ -134,6 +156,13 @@ namespace Business.SystemJobManagement
|
|
|
IRepository<mo_mes_process, long> mes_process,
|
|
|
IRepository<mo_mes_tech_process, long> mes_tech_process,
|
|
|
ProductionScheduleAppService productionScheduleAppService,
|
|
|
+ ISqlRepository<WorkOrdMaster> workOrdMaster,
|
|
|
+ IRepository<mes_morder, long> mysql_mes_morder,
|
|
|
+ IRepository<mes_moentry, long> mysql_mes_moentry,
|
|
|
+ ISqlRepository<PurOrdMaster> purOrdMaster,
|
|
|
+ ISqlRepository<PurOrdDetail> purOrdDetail,
|
|
|
+ IRepository<srm_po_main, long> srm_po_main,
|
|
|
+ IRepository<srm_po_list, long> srm_po_list,
|
|
|
BusinessDbContext businessDbContext
|
|
|
)
|
|
|
{
|
|
|
@@ -162,6 +191,13 @@ namespace Business.SystemJobManagement
|
|
|
_businessDbContext = businessDbContext;
|
|
|
_itemMaster = itemMaster;
|
|
|
_productionScheduleAppService = productionScheduleAppService;
|
|
|
+ _workOrdMaster = workOrdMaster;
|
|
|
+ _mysql_mes_morder = mysql_mes_morder;
|
|
|
+ _mysql_mes_moentry = mysql_mes_moentry;
|
|
|
+ _purOrdMaster = purOrdMaster;
|
|
|
+ _purOrdDetail = purOrdDetail;
|
|
|
+ _srm_po_main = srm_po_main;
|
|
|
+ _srm_po_list = srm_po_list;
|
|
|
}
|
|
|
|
|
|
public string SyncWMSDataToMySQLJob()
|
|
|
@@ -712,32 +748,6 @@ namespace Business.SystemJobManagement
|
|
|
addStock.create_by_name = "admin";
|
|
|
addStock.update_by_name = "admin";
|
|
|
stockAdd.Add(addStock);
|
|
|
- /*srm_purchaseAdd.Add(new srm_purchase(help.NextId())
|
|
|
- {
|
|
|
- icitem_id = itemId,
|
|
|
- icitem_name = custList[i].Descr,
|
|
|
- sourcelist_number = "HYQD12064",
|
|
|
- supplier_id = 10101000051,
|
|
|
- supplier_number = "",
|
|
|
- supplier_name = "广州市伟正金属构件有限公司",
|
|
|
- purchgroup = "",
|
|
|
- purcher = "",
|
|
|
- purchase_unit = "",
|
|
|
- netpurchase_price = 1,
|
|
|
- taxrate = 0.13m,
|
|
|
- currency_type = 1,
|
|
|
- order_rector_name = "",
|
|
|
- order_rector_num = "",
|
|
|
- factory_code = "",
|
|
|
- order_dept = "",
|
|
|
- order_price = 13,
|
|
|
- sale_price = 130,
|
|
|
- qty_min = 10,
|
|
|
- batch_append_qty = 10,
|
|
|
- factory_id = 1001,
|
|
|
- tenant_id = 1000,
|
|
|
- IsDeleted = false
|
|
|
- });*/
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -888,8 +898,6 @@ namespace Business.SystemJobManagement
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
public string DoProductScheduleJob()
|
|
|
{
|
|
|
try
|
|
|
@@ -903,5 +911,259 @@ namespace Business.SystemJobManagement
|
|
|
return "任务执行成功";
|
|
|
|
|
|
}
|
|
|
+ /// <summary>
|
|
|
+ /// 同步工单和采购订单数据
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public string SyncOrderAndPurOrd()
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
|
|
|
+ string domain = configuration.GetConnectionString("Factory_id");
|
|
|
+ string companyid = configuration.GetConnectionString("Company_id");
|
|
|
+ if (string.IsNullOrEmpty(domain) || string.IsNullOrEmpty(companyid))
|
|
|
+ {
|
|
|
+ return "请检查配置文件中公司和工厂编码是否维护。";
|
|
|
+ }
|
|
|
+ var sysResult = SyncOrder(domain).Result;
|
|
|
+ if (sysResult == "ok")
|
|
|
+ {
|
|
|
+ //sysResult = SyncPurOrd(domain, companyid).Result;
|
|
|
+ }
|
|
|
+ return sysResult;
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ return ex.Message;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<string> SyncOrder(string domain)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ //取数范围 需明确数据范围
|
|
|
+ var workList = _workOrdMaster.Select(c => c.Domain == domain && string.IsNullOrWhiteSpace(c.Status) == false).ToList();
|
|
|
+ var mesMorder = _mysql_mes_morder.GetListAsync(x => x.factory_id.ToString() == domain).Result;
|
|
|
+ var mesMoentry = _mysql_mes_moentry.GetListAsync(x => x.factory_id.ToString() == domain).Result;
|
|
|
+ List<mes_morder> updateList = new List<mes_morder>();
|
|
|
+ List<mes_moentry> updateMoentryList = new List<mes_moentry>();
|
|
|
+ foreach (var work in workList)
|
|
|
+ {
|
|
|
+ var morder = mesMorder.Find(x => x.morder_no == work.WorkOrd);
|
|
|
+ if (morder != null)
|
|
|
+ {
|
|
|
+ //修改
|
|
|
+ morder.moentry_sys_stime = work.OrdDate;
|
|
|
+ morder.moentry_sys_etime = work.DueDate;
|
|
|
+ morder.need_number = work.QtyOrded;
|
|
|
+ morder.morder_production_number = work.QtyOrded;
|
|
|
+ morder.morder_need_time = work.LbrVar;
|
|
|
+ string status = "";
|
|
|
+ switch (work.Status.ToUpper())
|
|
|
+ {
|
|
|
+ case "P":
|
|
|
+ status = MorderEnum.Initial_state;
|
|
|
+ break;
|
|
|
+ case "R":
|
|
|
+ status = MorderEnum.Xd_state;
|
|
|
+ break;
|
|
|
+ case "W":
|
|
|
+ status = MorderEnum.tc_state;
|
|
|
+ break;
|
|
|
+ case "C":
|
|
|
+ status = MorderEnum.Accomplish_state;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ status = MorderEnum.Initial_state;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ morder.morder_state = status;
|
|
|
+ updateList.Add(morder);
|
|
|
+ var moentry = mesMoentry.Find(x => x.moentry_moid == morder.Id);
|
|
|
+ if (moentry != null)
|
|
|
+ {
|
|
|
+ moentry.morder_production_number = morder.morder_production_number;
|
|
|
+ moentry.need_number = morder.need_number;
|
|
|
+ updateMoentryList.Add(moentry);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ await _mysql_mes_morder.UpdateManyAsync(updateList);
|
|
|
+ await _mysql_mes_moentry.UpdateManyAsync(updateMoentryList);
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ return e.Message;
|
|
|
+ }
|
|
|
+ return "ok";
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<string> SyncPurOrd(string domain,string companyid)
|
|
|
+ {
|
|
|
+ var masters = _purOrdMaster.Select(x => x.Domain == domain).ToList();
|
|
|
+ var details = _purOrdDetail.Select(x => x.Domain == domain).ToList();
|
|
|
+ var pomains = _srm_po_main.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid).Result;
|
|
|
+ var polists = _srm_po_list.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid).Result;
|
|
|
+ List<ic_item> itemList = _mysql_ic_item.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid).Result;
|
|
|
+ List<srm_po_main> poList = new List<srm_po_main>();
|
|
|
+ List<srm_po_list> detailList = new List<srm_po_list>();
|
|
|
+
|
|
|
+ List<srm_po_main> addPo = new List<srm_po_main>();
|
|
|
+ List<srm_po_main> updatePo = new List<srm_po_main>();
|
|
|
+
|
|
|
+ List<srm_po_list> addPolist = new List<srm_po_list>();
|
|
|
+ List<srm_po_list> updatePolist = new List<srm_po_list>();
|
|
|
+ List<srm_po_list> delPolist = new List<srm_po_list>();
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ foreach (var m in masters)
|
|
|
+ {
|
|
|
+ var po = pomains.Find(x => x.po_billno == m.PurOrd);
|
|
|
+ if (po != null)
|
|
|
+ {
|
|
|
+ updatePo.Add(po);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //add PO Polist
|
|
|
+ po = new srm_po_main();
|
|
|
+ po.GenerateNewId(help.NextId());
|
|
|
+ po.po_billno = m.PurOrd;
|
|
|
+ //var pr = list.Find(s => s.Id == dto.polist[0].pr_id);
|
|
|
+ //var itemsupplier = itemsupplierList.Find(a => a.Id == pr.pr_purchaseid);
|
|
|
+ //po.po_purchaser = m.;
|
|
|
+ po.po_purchaser_no = m.Buyer;
|
|
|
+ po.po_ssend_date = m.OrdDate;
|
|
|
+ po.po_tax_rate = m.Tax1;
|
|
|
+ po.po_express = 1;
|
|
|
+ po.po_note = "";
|
|
|
+ po.po_order_type = 1;
|
|
|
+ po.po_total = 0;
|
|
|
+ po.supplier_type = m.USAGE;
|
|
|
+ //po.currency = pr.currencytype;
|
|
|
+ po.bill_type = 1;
|
|
|
+ //po.supplier_id = pr.pr_purchaseid;
|
|
|
+ //po.supplier_name = m.;
|
|
|
+ po.supplier_no = m.Supp;
|
|
|
+ //po.contact = m.cus;
|
|
|
+ po.suppliertelephone = m.CustPhone;
|
|
|
+ //po.deliveryaddress = "";
|
|
|
+ po.supplierdddress = m.CustAddress;
|
|
|
+ po.confirmstate = 1;
|
|
|
+ po.logisticsstate = 0;
|
|
|
+ po.financialstate = 0;
|
|
|
+ po.create_time = DateTime.Now;
|
|
|
+ po.factory_id = long.Parse(domain);
|
|
|
+ po.company_id = long.Parse(companyid);
|
|
|
+ po.po_delivery = 1;
|
|
|
+ addPo.Add(po);
|
|
|
+ }
|
|
|
+ po.state = GetPurOrdStatus(m.Status);
|
|
|
+
|
|
|
+ var dtls = details.Where(x => x.PurOrdRecID == m.RecID).ToList();
|
|
|
+ var plists = polists.Where(x => x.po_id == po.Id).ToList();
|
|
|
+ //所有数据先默认删除
|
|
|
+ delPolist.AddRange(plists);
|
|
|
+ foreach (var dtl in dtls)
|
|
|
+ {
|
|
|
+ var plist = plists.Find(x => x.number == dtl.ItemNum);
|
|
|
+ if (plist != null)
|
|
|
+ {
|
|
|
+ //如果有存在,则从删除集合移除
|
|
|
+ delPolist.Remove(plist);
|
|
|
+ plist.state = dtl.Status.ToUpper() == "C" ? 0 : 1;
|
|
|
+ updatePolist.Add(plist);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ plist = new srm_po_list();
|
|
|
+
|
|
|
+ plist.GenerateNewId(help.NextId());
|
|
|
+ var icitem = itemList.Find(a => a.number == dtl.ItemNum);
|
|
|
+ if (icitem == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ plist.icitem_id = icitem.Id;
|
|
|
+ plist.model = icitem.model;
|
|
|
+ plist.ItemNum = icitem.number;
|
|
|
+ plist.icitem_name = icitem.name;
|
|
|
+ plist.qty = dtl.QtyOrded.GetValueOrDefault();
|
|
|
+ plist.netprice = dtl.PurCost.GetValueOrDefault();
|
|
|
+ plist.netmoney = dtl.QtyOrded.GetValueOrDefault() * dtl.PurCost.GetValueOrDefault();
|
|
|
+ plist.rate = dtl.TaxRate;
|
|
|
+ plist.price = dtl.PurCost.GetValueOrDefault();
|
|
|
+ plist.total_price = dtl.QtyOrded.GetValueOrDefault() * dtl.PurCost.GetValueOrDefault();
|
|
|
+ //plist.taxamount = item.pr_orderprice.GetValueOrDefault() - podetail.netmoney;
|
|
|
+ plist.plan_qty = dtl.QtyOrded.GetValueOrDefault();
|
|
|
+ plist.unit = icitem.unit;
|
|
|
+ plist.state = dtl.Status.ToUpper() == "C" ? 0 : 1;
|
|
|
+ plist.rarrdate = dtl.DueDate;
|
|
|
+ plist.rnumber = 0;
|
|
|
+ //plist.currencytype = m.Curr;
|
|
|
+ plist.create_time = DateTime.Now;
|
|
|
+ plist.factory_id = po.factory_id;
|
|
|
+ plist.company_id = po.company_id;
|
|
|
+ plist.tenant_id = po.tenant_id;
|
|
|
+ plist.stock_id = 1;
|
|
|
+ plist.state = dtl.Status.ToUpper() == "C" ? 0 : 1;
|
|
|
+ addPolist.Add(plist);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (addPo.Any())
|
|
|
+ {
|
|
|
+ await _srm_po_main.InsertManyAsync(addPo);
|
|
|
+ }
|
|
|
+ if (updatePo.Any())
|
|
|
+ {
|
|
|
+ await _srm_po_main.UpdateManyAsync(updatePo);
|
|
|
+ }
|
|
|
+ if (addPolist.Any())
|
|
|
+ {
|
|
|
+ await _srm_po_list.InsertManyAsync(addPolist);
|
|
|
+ }
|
|
|
+ if (updatePolist.Any())
|
|
|
+ {
|
|
|
+ await _srm_po_list.UpdateManyAsync(updatePolist);
|
|
|
+ }
|
|
|
+ if (delPolist.Any())
|
|
|
+ {
|
|
|
+ await _srm_po_list.HardDeleteAsync(delPolist);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch(Exception ex)
|
|
|
+ {
|
|
|
+ return ex.Message;
|
|
|
+ }
|
|
|
+ return "ok";
|
|
|
+ }
|
|
|
+
|
|
|
+ private int GetPurOrdStatus(string status)
|
|
|
+ {
|
|
|
+ int poStatu = 0;
|
|
|
+ switch (status)
|
|
|
+ {
|
|
|
+ case "":
|
|
|
+ poStatu = 0;
|
|
|
+ break;
|
|
|
+ case "A":
|
|
|
+ poStatu = 1;
|
|
|
+ break;
|
|
|
+ case "B":
|
|
|
+ poStatu = 2;
|
|
|
+ break;
|
|
|
+ case "C":
|
|
|
+ poStatu = 3;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ poStatu = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return poStatu;
|
|
|
+ }
|
|
|
}
|
|
|
}
|