|
|
@@ -284,6 +284,7 @@ namespace Business.ResourceExamineManagement
|
|
|
private ISqlRepository<PurOrdDetail> _purOrdDetail;
|
|
|
private ISqlRepository<ItemPackMaster> _itemPackMaster;
|
|
|
private ISqlRepository<GeneralizedCodeMaster> _generalizedCodeMaster;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 生产排产
|
|
|
/// </summary>
|
|
|
@@ -1024,7 +1025,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//拉取所有,然后根据送货周期来合并第一次得合并数据
|
|
|
//List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.state == 1 || s.state == 2).Result;
|
|
|
//直接按间隔多少天一次来处理数据,定时任务按周四来考虑。
|
|
|
- DateTime toTime = new DateTime(2023, 7, 6);
|
|
|
+ DateTime toTime = DateTime.Now; //new DateTime(2023, 7, 6);
|
|
|
DateTime starttime = toTime.Date.AddDays(8);
|
|
|
DateTime endtime = toTime.Date.AddDays(14);
|
|
|
List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && (s.state == 1 || s.state == 3)).Result;
|
|
|
@@ -1950,19 +1951,26 @@ namespace Business.ResourceExamineManagement
|
|
|
pOGroupDtos.Add(poDto);
|
|
|
}
|
|
|
item.state = 0;
|
|
|
-
|
|
|
srm_po_list podetail = new srm_po_list();
|
|
|
podetail.GenerateNewId(help.NextId());
|
|
|
podetail.pr_id = item.Id;
|
|
|
podetail.pr_billno = item.pr_billno;
|
|
|
+ var icitem = itemList.First(a => a.Id == item.icitem_id);
|
|
|
+ if (icitem == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
podetail.icitem_id = item.icitem_id;
|
|
|
- podetail.ItemNum = itemList.First(a => a.Id == item.icitem_id).number;
|
|
|
- podetail.icitem_name = item.icitem_name;
|
|
|
+ podetail.model = icitem.model;
|
|
|
+ podetail.ItemNum = icitem.number;
|
|
|
+ podetail.icitem_name = icitem.name;
|
|
|
podetail.qty = item.pr_aqty;
|
|
|
podetail.netprice = item.pr_price;
|
|
|
+ podetail.netmoney = item.pr_aqty.GetValueOrDefault() * item.pr_price.GetValueOrDefault();
|
|
|
podetail.rate = item.pr_rate;
|
|
|
podetail.price = item.pr_orderprice / item.pr_aqty;
|
|
|
podetail.total_price = item.pr_orderprice;
|
|
|
+ podetail.taxamount = item.pr_orderprice.GetValueOrDefault() - podetail.netmoney;
|
|
|
podetail.plan_qty = item.pr_aqty;
|
|
|
podetail.unit = item.pr_unit;
|
|
|
podetail.state = item.state;
|
|
|
@@ -2145,20 +2153,35 @@ namespace Business.ResourceExamineManagement
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<string> PlanOrderResourceCheck()
|
|
|
+ public async Task<string> PlanOrderResourceCheck(string companyid)
|
|
|
{
|
|
|
/*List<string> workOrds = workOrd.Split(",").ToList();
|
|
|
if (workOrds.Count == 0)
|
|
|
{
|
|
|
return "";
|
|
|
}*/
|
|
|
- List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => x.morder_type == "计划工单").Result;
|
|
|
+ if (string.IsNullOrEmpty(companyid))
|
|
|
+ {
|
|
|
+ return "当前任务公司编码为空,请检查。";
|
|
|
+ }
|
|
|
+
|
|
|
+ List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => x.morder_type == "计划工单" && x.morder_state == "初始" && x.company_id == long.Parse(companyid)).Result;
|
|
|
+
|
|
|
//先排除锁定期内的工单 //优先级排序
|
|
|
- DateTime lookTime = DateTime.Now.Date.AddDays((double)8);
|
|
|
- Mes_Morders = Mes_Morders.Where(s => s.moentry_sys_stime > lookTime).OrderBy(s => s.moentry_sys_stime).ToList();
|
|
|
+ var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "WorkOrderLockPeriod" && s.Domain == companyid).ToList();
|
|
|
+ decimal lookDay = 0;
|
|
|
+ if (sysSet.Any())
|
|
|
+ {
|
|
|
+ //锁定期
|
|
|
+ lookDay = sysSet[0].UDeci1.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ lookDay = lookDay == 0 ? 7 : lookDay;
|
|
|
+ DateTime lookTime = DateTime.Now.Date.AddDays((double)lookDay);
|
|
|
+ Mes_Morders = Mes_Morders.Where(s => s.moentry_sys_stime > lookTime || s.moentry_sys_stime == null).OrderBy(s => s.moentry_sys_stime).ToList();
|
|
|
|
|
|
if (Mes_Morders.Any())
|
|
|
{
|
|
|
+ Mes_Morders.ForEach(s => { s.moentry_sys_stime = DateTime.Now.Date.AddDays((double)lookDay + 1); });
|
|
|
List<string> monolist = Mes_Morders.Select(c => c.morder_no).ToList();
|
|
|
//清理PR的占用。
|
|
|
List<srm_po_occupy> occupy = await _mysql_srm_po_occupy.GetListAsync(s => monolist.Contains(s.morder_mo));
|
|
|
@@ -2173,7 +2196,7 @@ namespace Business.ResourceExamineManagement
|
|
|
else {
|
|
|
return JsonConvert.SerializeObject("未查找到对应的计划工单,请联系管理员。");
|
|
|
}
|
|
|
- return JsonConvert.SerializeObject("ok");
|
|
|
+ return "ok";
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -2181,7 +2204,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<string> OrderResourceCheck(int day, string workOrd)
|
|
|
+ public async Task<string> OrderResourceCheck(int day, string workOrd, string companyid)
|
|
|
{
|
|
|
List<mes_morder> mo_Mes_Morders = new List<mes_morder>();
|
|
|
if (day == 0)
|
|
|
@@ -2191,20 +2214,131 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
return "";
|
|
|
}
|
|
|
- mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => workOrds.Contains(x.morder_no)).Result;
|
|
|
+ mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => companyid == x.company_id.ToString() && workOrds.Contains(x.morder_no)).Result;
|
|
|
+ //如果工单有今天和之前的,则提示不处理
|
|
|
+ if (mo_Mes_Morders.Where(s => s.moentry_sys_stime >= DateTime.Now.Date).Count() > 0)
|
|
|
+ {
|
|
|
+ return "请选择开工时间在今天之后的工单。";
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => x.start_time > DateTime.Now.Date.AddDays(1) && x.start_time < DateTime.Now.Date.AddDays(day) && x.morder_state == MorderEnum.Xd_state && !x.IsDeleted).Result;
|
|
|
+ mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => companyid == x.company_id.ToString() && x.moentry_sys_stime > DateTime.Now.Date.AddDays(1) && x.moentry_sys_stime < DateTime.Now.Date.AddDays(day) && x.morder_state == MorderEnum.Initial_state && !x.IsDeleted).Result;
|
|
|
}
|
|
|
+
|
|
|
+ List<mes_morder> checkMo = new List<mes_morder>();
|
|
|
//只做库存是否齐套检查
|
|
|
if (mo_Mes_Morders.Any())
|
|
|
{
|
|
|
- var rtn = await OrderKittingCheck(mo_Mes_Morders);
|
|
|
- OrderResourceViewDto result = DataPackage(rtn);
|
|
|
- result.DayBulletinBoardList = result.DayBulletinBoardList.OrderByDescending(d => d.day).ToList();
|
|
|
- //保存检查结果
|
|
|
- SaveExamineResult(result.KittingCheckResultList, result.DayBulletinBoardList, 1);
|
|
|
+ //检查工单是否已经下了领料单
|
|
|
+ var nbrList = _nbrMaster.Select(a => a.Domain == mo_Mes_Morders[0].factory_id.GetValueOrDefault().ToString() && a.Type == "SM" && mo_Mes_Morders.Select(c => c.morder_no).Contains(a.WorkOrd));
|
|
|
+ foreach (var mo in mo_Mes_Morders)
|
|
|
+ {
|
|
|
+ //查出已产生领料单、过滤掉,取出未领料的工单
|
|
|
+ var nbr = nbrList.Find(s => s.WorkOrd == mo.morder_no);
|
|
|
+ if (nbr != null)
|
|
|
+ {
|
|
|
+ //完成时间到了
|
|
|
+ if (nbr.EffDate.GetValueOrDefault().Date == DateTime.Now.Date)
|
|
|
+ {
|
|
|
+ //如果应完成日期,没有完成,则更新工单状态
|
|
|
+ if (nbr.Ufld1 == "completed")
|
|
|
+ {
|
|
|
+ //工单状态为 “生产齐套”
|
|
|
+ mo.MaterialSituation = "生产齐套";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //工单状态为 “备料滞后”
|
|
|
+ mo.MaterialSituation = "备料滞后";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //完成时间未到
|
|
|
+ else if (nbr.EffDate.GetValueOrDefault().Date > DateTime.Now.Date)
|
|
|
+ {
|
|
|
+ //工单状态为 “备料中”
|
|
|
+ mo.MaterialSituation = "备料中";
|
|
|
+ }
|
|
|
+ //完成时间已经过去,则不做处理
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ checkMo.Add(mo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ string workords = "";
|
|
|
+
|
|
|
+ if (checkMo.Any())
|
|
|
+ {
|
|
|
+ var rtn = await OrderKittingCheck(mo_Mes_Morders);
|
|
|
+ if (rtn != null && rtn.examines != null)
|
|
|
+ {
|
|
|
+ var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "WorkOrderLockPeriod" && s.Domain == companyid).ToList();
|
|
|
+ decimal lookDay = 0;
|
|
|
+ if (sysSet.Any())
|
|
|
+ {
|
|
|
+ //锁定期
|
|
|
+ lookDay = sysSet[0].UDeci1.GetValueOrDefault();
|
|
|
+ }
|
|
|
+ lookDay = lookDay == 0 ? 7 : lookDay;
|
|
|
+ DateTime lookTime = DateTime.Now.Date.AddDays((double)lookDay);
|
|
|
+ //循环处理工单
|
|
|
+ foreach (var cmo in checkMo)
|
|
|
+ {
|
|
|
+ bool flag = true;
|
|
|
+ var exm = rtn.examines.Find(s => s.morder_no == cmo.morder_no);
|
|
|
+ if (exm != null && exm.BomChildExamineList != null && exm.BomChildExamineList.Any())
|
|
|
+ {
|
|
|
+ foreach (var bce in exm.BomChildExamineList)
|
|
|
+ {
|
|
|
+ //如果有缺料
|
|
|
+ if (bce.is_use && bce.stock_state == 0)
|
|
|
+ {
|
|
|
+ //如果当前数据没有子级,则代表原材料
|
|
|
+ if (exm.BomChildExamineList.Where(s => s.parent_id == bce.fid).Count() == 0)
|
|
|
+ {
|
|
|
+ flag = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ flag = false;
|
|
|
+ }
|
|
|
+ if (flag)
|
|
|
+ {
|
|
|
+ //锁定期内生产备料单,并且更新为备料中,锁定期外的则更新成仓库齐套。
|
|
|
+ if (cmo.moentry_sys_stime.GetValueOrDefault().Date <= lookTime)
|
|
|
+ {
|
|
|
+ //生成领料单
|
|
|
+ workords += "," + cmo.morder_no;
|
|
|
+ cmo.MaterialSituation = "备料中";
|
|
|
+ cmo.morder_state = MorderEnum.Xd_state;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ cmo.MaterialSituation = "仓库齐套";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //工单状态为 “仓库不齐套”
|
|
|
+ cmo.MaterialSituation = "仓库不齐套";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*OrderResourceViewDto result = DataPackage(rtn);
|
|
|
+ result.DayBulletinBoardList = result.DayBulletinBoardList.OrderByDescending(d => d.day).ToList();
|
|
|
+ //保存检查结果
|
|
|
+ SaveExamineResult(result.KittingCheckResultList, result.DayBulletinBoardList, 1);*/
|
|
|
+ }
|
|
|
+ _businessDbContext.BulkUpdate(mo_Mes_Morders);
|
|
|
+ if (workords.Length > 0)
|
|
|
+ {
|
|
|
+ workords = workords.Substring(1, workords.Length - 1);
|
|
|
+ await CreatePickBill(workords);
|
|
|
+ }
|
|
|
return JsonConvert.SerializeObject("ok");
|
|
|
}
|
|
|
else {
|
|
|
@@ -2420,9 +2554,9 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
List<mo_mes_moentry> mo_Mes_Moentries = _mes_moentry.GetManyByCondition(x=> mo_Mes_Morders.Select(s => s.id).Contains(x.moentry_moid.Value)).Result;*/
|
|
|
|
|
|
+ var morderIdList = mo_Mes_Morders.Select(s => s.Id).ToList();
|
|
|
|
|
|
-
|
|
|
- List<mes_moentry> mo_Mes_Moentries = _mysql_mes_moentry.GetListAsync(x => mo_Mes_Morders.Select(s => s.Id).Contains(x.moentry_moid.Value)).Result;
|
|
|
+ List<mes_moentry> mo_Mes_Moentries = _mysql_mes_moentry.GetListAsync(x => morderIdList.Contains(x.moentry_moid.Value)).Result;
|
|
|
|
|
|
//获取订单行数据
|
|
|
List<crm_seorderentry> sentrys = _mysql_crm_seorderentry.GetListAsync(p => p.company_id == input.company_id && p.factory_id == input.factoryId && !p.IsDeleted && mo_Mes_Moentries.Select(x => x.soentry_id).Contains(p.Id)).Result;
|
|
|
@@ -2547,8 +2681,14 @@ namespace Business.ResourceExamineManagement
|
|
|
//获取工单数据
|
|
|
var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c=>c.morder_no).Contains(p.WorkOrd));
|
|
|
workOrdMasters.ForEach(s => {
|
|
|
- s.OrdDate = DateTime.Now.Date.AddDays(14);//锁定期
|
|
|
- s.DueDate = DateTime.Now.Date.AddDays(14);
|
|
|
+ var mo = mo_Mes_Morders.Find(m => m.morder_no == s.WorkOrd);
|
|
|
+ if (mo != null)
|
|
|
+ {
|
|
|
+ //锁定期
|
|
|
+ s.OrdDate = mo.moentry_sys_stime;
|
|
|
+ s.DueDate = mo.moentry_sys_stime;
|
|
|
+ }
|
|
|
+
|
|
|
});
|
|
|
//优先级排序
|
|
|
workOrdMasters = workOrdMasters.OrderBy(s => s.OrdDate).ToList();
|
|
|
@@ -2938,23 +3078,23 @@ namespace Business.ResourceExamineManagement
|
|
|
AutoCreateBomBill();
|
|
|
}
|
|
|
|
|
|
- public async Task AutoCreatePickBill(List<string> workOrds, List<PeriodSequenceDet> dbPeriodSequences, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList)
|
|
|
+ public async Task AutoCreatePickBill(List<WorkOrdMaster> workOrdMasters, List<PeriodSequenceDet> dbPeriodSequences, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList)
|
|
|
{
|
|
|
if (dbPeriodSequences.Any())
|
|
|
{
|
|
|
//按照工单领料,一个工单一个领料单,之前是按照排产日期和产线分别领料
|
|
|
- foreach (var workord in workOrds)
|
|
|
+ foreach (var workord in workOrdMasters)
|
|
|
{
|
|
|
Dictionary<string, decimal> dictItemQty = new Dictionary<string, decimal>();
|
|
|
- List<string> lines = dbPeriodSequences.Where(a => a.WorkOrds == workord).Select(a => a.Line).Distinct().ToList();
|
|
|
+ List<string> lines = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Select(a => a.Line).Distinct().ToList();
|
|
|
List<LineMaster> lineMasters = _lineMaster.Select(p => lines.Contains(p.Line) && p.Domain == "1001" && p.IsActive);
|
|
|
- List<ProductStructureMaster> itemList = GetProductStructure(dbPeriodSequences.First(a => a.WorkOrds == workord).ItemNum);
|
|
|
+ List<ProductStructureMaster> itemList = GetProductStructure(dbPeriodSequences.First(a => a.WorkOrds == workord.WorkOrd).ItemNum);
|
|
|
var childrenList = itemList.Select(a => a.ComponentItem).Distinct().ToList();
|
|
|
List<ItemMaster> itemLocList = _itemMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == "1001" && p.IsActive).Distinct().ToList();
|
|
|
List<ItemPackMaster> itemPackList = _itemPackMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == "1001" && p.IsActive).Distinct().ToList();
|
|
|
var Nbr = GetMaxSerialNumber(417416915624005);
|
|
|
//根据某一产线汇总即该工单的总数
|
|
|
- decimal QtyOrdSum = dbPeriodSequences.Where(a => a.WorkOrds == workord && a.Line == lines[0]).Sum(a => a.OrdQty.GetValueOrDefault());
|
|
|
+ decimal QtyOrdSum = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd && a.Line == lines[0]).Sum(a => a.OrdQty.GetValueOrDefault());
|
|
|
string LocationTo= lineMasters.FirstOrDefault()?.Location;
|
|
|
nbrMasterList.Add(new NbrMaster
|
|
|
{
|
|
|
@@ -2962,10 +3102,11 @@ namespace Business.ResourceExamineManagement
|
|
|
Type = "SM",
|
|
|
Nbr = Nbr,
|
|
|
Remark = "下达自动领料",
|
|
|
- Date = dbPeriodSequences.Where(a => a.WorkOrds == workord).Min(a => a.PlanDate),
|
|
|
+ Date = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Min(a => a.PlanDate),
|
|
|
//ProdLine = item.Line,
|
|
|
+ EffDate = workord.OrdDate.GetValueOrDefault().Date.AddDays(-1),
|
|
|
Status = "",
|
|
|
- WorkOrd = workord,
|
|
|
+ WorkOrd = workord.WorkOrd,
|
|
|
QtyOrd = QtyOrdSum,
|
|
|
IsActive = true,
|
|
|
IsChanged = true,
|
|
|
@@ -2999,7 +3140,7 @@ namespace Business.ResourceExamineManagement
|
|
|
QtyTo = 0,
|
|
|
LocationFrom = LocationFrom,
|
|
|
LocationTo = LocationTo,//现在这几条线是同一线边仓,暂时不考虑多个线边仓
|
|
|
- WorkOrd = workord,
|
|
|
+ WorkOrd = workord.WorkOrd,
|
|
|
QtyOrd = QtyOrdSum * a.Qty,
|
|
|
CurrQtyOpened = QtyOrdSum * a.Qty,
|
|
|
Line = i,
|
|
|
@@ -3040,11 +3181,11 @@ namespace Business.ResourceExamineManagement
|
|
|
//没有维护备料提前期,默认取7天
|
|
|
if (leadTimes > 0)
|
|
|
{
|
|
|
- nbrMasterList.First(a => a.Nbr == Nbr).Date = dbPeriodSequences.Where(a => a.WorkOrds == workord).Min(a => a.PlanDate).GetValueOrDefault().AddDays(-1 * Convert.ToDouble(leadTimes));
|
|
|
+ nbrMasterList.First(a => a.Nbr == Nbr).Date = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Min(a => a.PlanDate).GetValueOrDefault().AddDays(-1 * Convert.ToDouble(leadTimes));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- nbrMasterList.First(a => a.Nbr == Nbr).Date = dbPeriodSequences.Where(a => a.WorkOrds == workord).Min(a => a.PlanDate).GetValueOrDefault().AddDays(-7);
|
|
|
+ nbrMasterList.First(a => a.Nbr == Nbr).Date = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Min(a => a.PlanDate).GetValueOrDefault().AddDays(-7);
|
|
|
}
|
|
|
//TODO:
|
|
|
//因为我们并没有模拟发料的过程,在自动生成领料单的时候就要扣减库存,实际业务不能这么做。
|
|
|
@@ -3255,7 +3396,7 @@ namespace Business.ResourceExamineManagement
|
|
|
var ords = workOrdMasters.Select(p => p.WorkOrd).ToList();
|
|
|
|
|
|
dbPeriodSequences = dbPeriodSequences.Where(p => ords.Contains(p.WorkOrds)).ToList();
|
|
|
- await AutoCreatePickBill(ords, dbPeriodSequences, nbrMasterList, nbrDetailList);
|
|
|
+ await AutoCreatePickBill(workOrdMasters, dbPeriodSequences, nbrMasterList, nbrDetailList);
|
|
|
if (nbrMasterList.Any())
|
|
|
{
|
|
|
dbPeriodSequences.ForEach(p => { p.Status = "r"; });
|
|
|
@@ -3295,7 +3436,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return "";
|
|
|
+ return "ok";
|
|
|
}
|
|
|
|
|
|
|