public void GenOrdersByShiftPlanScheduleId(int ShiftPlanScheduleId, string userCode) { ShiftPlanSchedule sps = this.LoadShiftPlanSchedule(ShiftPlanScheduleId); if (sps == null || sps.Shift == null) { return; } OrderHead oh = OrderMgr.TransferFlow2Order(sps.FlowDetail.Flow); oh.StartTime = ShiftMgr.GetShiftStartTime(sps.ReqDate, sps.Shift); oh.WindowTime = ShiftMgr.GetShiftEndTime(sps.ReqDate, sps.Shift); oh.Priority = BusinessConstants.CODE_MASTER_ORDER_PRIORITY_VALUE_NORMAL; if (oh.OrderDetails != null && oh.OrderDetails.Count > 0) { foreach (OrderDetail od in oh.OrderDetails) { if (od.FlowDetail.Equals(sps.FlowDetail)) { od.RequiredQty = sps.PlanQty; od.OrderedQty = sps.PlanQty; } } } LeanEngineMgr.CreateOrder(oh, userCode); }
public void CreateOrder(OrderHead order, string userCode) { if (order.OrderDetails == null || order.OrderDetails.Count == 0) { return; } IList <OrderHead> orderList = new List <OrderHead>(); //OrderLotSize Flow flow = this.FlowMgr.LoadFlow(order.Flow); if (order.OrderDetails.Count == 1 && flow.Type == BusinessConstants.CODE_MASTER_FLOW_TYPE_VALUE_PRODUCTION) { FlowDetail fd = order.OrderDetails[0].FlowDetail; decimal orderLotSize = fd.OrderLotSize.HasValue ? (decimal)fd.OrderLotSize : 0; decimal reqQty = order.OrderDetails[0].RequiredQty; decimal remainReqQty = order.OrderDetails[0].RequiredQty; if (orderLotSize > 0) { OrderDetail od = order.OrderDetails[0]; decimal oddQty = reqQty % orderLotSize; if (oddQty > 0) { order.OrderDetails[0].RequiredQty = oddQty; order.OrderDetails[0].OrderedQty = oddQty; orderList.Add(order); } int count = (int)Math.Floor(reqQty / orderLotSize); for (int i = 0; i < count; i++) { OrderHead or = new OrderHead(); or = OrderMgr.TransferFlow2Order(order.Flow); CloneHelper.CopyProperty(order, or, new string[] { "OrderNo", "OrderDetails" }, true); if (or.OrderDetails != null && or.OrderDetails.Count > 0) { foreach (OrderDetail orderDetail in or.OrderDetails) { if (orderDetail.FlowDetail.Id == od.FlowDetail.Id && od.FlowDetail.Id > 0) { orderDetail.RequiredQty = orderLotSize; orderDetail.OrderedQty = orderLotSize; } } } orderList.Add(or); } } else { orderList.Add(order); } } else { orderList.Add(order); } //Write to DB if (orderList != null && orderList.Count > 0) { foreach (OrderHead oh in orderList) { try { //all Empty check bool isValid = false; foreach (OrderDetail od in oh.OrderDetails) { if (od.RequiredQty > 0) { isValid = true; break; } } if (isValid) { //oh.Shift = shiftMgr.LoadShift("A");//temp,todo log.Debug("Begin to create order," + oh.Flow); this.OrderMgr.CreateOrder(oh, userCode); log.Debug("End to create order," + oh.OrderNo); log.Debug("----------------------------------Invincible's dividing line---------------------------------------"); } } catch (Exception ex) { this.OrderMgr.CleanSession(); log.Error("create order fail", ex); log.Debug("----------------------------------Invincible's dividing line---------------------------------------"); } } } }
public void RunMes() { #region 找到所有Mes的生产线,默认一个生产线对应一个线边库位 log.Info("Flow begin."); DetachedCriteria fCriteria = DetachedCriteria.For <Flow>(); fCriteria.Add(Expression.Eq("Type", BusinessConstants.CODE_MASTER_FLOW_TYPE_VALUE_PRODUCTION)); fCriteria.Add(Expression.Eq("FlowStrategy", BusinessConstants.CODE_MASTER_FLOW_STRATEGY_VALUE_MES)); fCriteria.Add(Expression.Eq("IsActive", true)); fCriteria.Add(Expression.Or(Expression.Le("NextWinTime", DateTime.Now), Expression.IsNull("NextWinTime"))); IList <Flow> flowList = criteriaMgr.FindAll <Flow>(fCriteria); log.Info("Flow end."); #endregion #region 找到所有Mes的移库路线 log.Info("TransferFlow begin."); DetachedCriteria tCriteria = DetachedCriteria.For <FlowDetail>(); tCriteria.CreateAlias("Flow", "f"); tCriteria.Add(Expression.Eq("f.Type", BusinessConstants.CODE_MASTER_FLOW_TYPE_VALUE_TRANSFER)); tCriteria.Add(Expression.Eq("f.IsActive", true)); tCriteria.Add(Expression.Ge("f.IsMes", true)); IList <FlowDetail> transferFlowList = criteriaMgr.FindAll <FlowDetail>(tCriteria); log.Info("TransferFlow end."); #endregion #region 找到所有货架和活动工单 log.Info("Shelf begin."); IList <Shelf> shelfList = shelfMgr.GetAllShelf(); log.Info("Shelf end."); log.Info("ActiveOrder begin."); DetachedCriteria oCriteria = DetachedCriteria.For(typeof(OrderLocationTransaction)); oCriteria.CreateAlias("OrderDetail", "od"); oCriteria.CreateAlias("od.OrderHead", "oh"); oCriteria.Add(Expression.In("oh.Status", new string[] { BusinessConstants.CODE_MASTER_STATUS_VALUE_INPROCESS, BusinessConstants.CODE_MASTER_STATUS_VALUE_SUBMIT })); oCriteria.Add(Expression.Eq("TransactionType", BusinessConstants.CODE_MASTER_LOCATION_TRANSACTION_TYPE_VALUE_ISS_WO)); oCriteria.Add(Expression.Gt("Cartons", 0)); oCriteria.Add(Expression.IsNotNull("Shelf")); IList <OrderLocationTransaction> orderLocTransList = criteriaMgr.FindAll <OrderLocationTransaction>(oCriteria); log.Info("ActiveOrder end."); IDictionary <string, int> rawDemandDic = new Dictionary <string, int>(); IDictionary <string, int> nonZeroRawDemandDic = new Dictionary <string, int>(); #endregion #region 找到所有库存 log.Info("Inventory begin."); string hql = @"select h.Location, h.Item.Code,Count(h.HuId) from Hu as h where h.Status = ? and h.IsMes = ? group by h.Location, h.Item.Code"; IList <object[]> invList = hqlMgr.FindAll <object[]>(hql, new Object[] { BusinessConstants.CODE_MASTER_STATUS_VALUE_INPROCESS, true }); log.Info("Inventory end."); #endregion #region 获取实时库存和在途,只有待发,全部为一步移库无待收 log.Info("ToShip begin."); hql = @"select olt.Location.Code, olt.Item.Code,olt.Cartons from OrderLocationTransaction as olt join olt.OrderDetail as od join od.OrderHead as oh where oh.Status in (?, ?) and oh.SubType = ? and oh.Type=? and olt.IOType = ? and oh.IsMes = ? and olt.Cartons > 0"; IList <object[]> expectTransitInvList = hqlMgr.FindAll <object[]>(hql, new Object[] { BusinessConstants.CODE_MASTER_STATUS_VALUE_SUBMIT, BusinessConstants.CODE_MASTER_STATUS_VALUE_INPROCESS, BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML, BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_TRANSFER, //只考虑移库 BusinessConstants.IO_TYPE_IN, true }); log.Info("ToShip end."); IList <object[]> totalInvList = new List <object[]>(); if (invList != null) { totalInvList = totalInvList.Union(invList).ToList(); } if (expectTransitInvList != null) { totalInvList = totalInvList.Union(expectTransitInvList).ToList(); } #endregion if (flowList != null && flowList.Count > 0) { foreach (Flow flow in flowList) { #region 对每个生产线找到下面的货架 IList <Shelf> flowShelfList = shelfList.Where(s => s.ProductLine.Code == flow.Code).ToList(); #endregion #region 计算总的毛需求 if (flowShelfList != null && flowShelfList.Count > 0) { foreach (Shelf shelf in flowShelfList) { #region 货架找到对应的活动工单 IList <OrderLocationTransaction> shelfOrderLocTransList = orderLocTransList.Where(l => l.Shelf.Trim().ToUpper() == shelf.Code.Trim().ToUpper()).OrderByDescending(l => l.OrderDetail.OrderHead.StartTime).ToList(); if (shelfOrderLocTransList != null && shelfOrderLocTransList.Count > 0) { int count = shelf.Capacity; foreach (OrderLocationTransaction ol in shelfOrderLocTransList) { if (rawDemandDic.ContainsKey(ol.Item.Code)) { rawDemandDic[ol.Item.Code] += ol.Cartons <= count ? ol.Cartons : count; } else { rawDemandDic.Add(ol.Item.Code, ol.Cartons <= count ? ol.Cartons : count); } count -= ol.Cartons <= count ? ol.Cartons : count; if (count == 0) { break; } } } #endregion } } #endregion #region 计算净需求,和整个库位比较 foreach (string item in rawDemandDic.Keys) { var locQty = totalInvList.Where(h => (string)h[0] == flow.LocationFrom.Code && (string)h[1] == item).Sum(h => Convert.ToInt32(h[2])); int requireQty = rawDemandDic[item] > locQty ? rawDemandDic[item] - locQty : 0; if (rawDemandDic[item] > 0) { nonZeroRawDemandDic.Add(item, requireQty); } } #endregion #region 生成要货单 var q = from l in transferFlowList where l.DefaultLocationTo.Code == flow.LocationFrom.Code && nonZeroRawDemandDic.Keys.ToArray <string>().Contains(l.Item.Code) group l by new { l.Flow } into g select new { g.Key }; foreach (var f in q) { try { OrderHead oh = orderMgr.TransferFlow2Order(f.Key.Flow); oh.StartTime = DateTime.Now; oh.WindowTime = DateTime.Now.AddHours(Convert.ToDouble(f.Key.Flow.LeadTime)); oh.Priority = BusinessConstants.CODE_MASTER_ORDER_PRIORITY_VALUE_NORMAL; IList <OrderDetail> nonZeroOrderDetailList = new List <OrderDetail>(); foreach (OrderDetail od in oh.OrderDetails) { if (nonZeroRawDemandDic.Count > 0) { var qty = (from r in nonZeroRawDemandDic where r.Key == od.Item.Code select new { Value = r.Value }).SingleOrDefault(); if (qty != null && Convert.ToDecimal(qty.Value) > 0) { OrderDetail newOrderDetail = od; newOrderDetail.OrderedQty = Convert.ToDecimal(qty.Value) * od.UnitCount; newOrderDetail.RequiredQty = Convert.ToDecimal(qty.Value) * od.UnitCount; nonZeroOrderDetailList.Add(newOrderDetail); nonZeroRawDemandDic.Remove(od.Item.Code); } } } if (nonZeroOrderDetailList.Count > 0) { oh.OrderDetails = nonZeroOrderDetailList; orderMgr.CreateOrder(oh, userMgr.GetMonitorUser()); } } catch (Exception e) { log.Error("error create order", e); continue; } } #endregion #region 更新路线 flow.NextOrderTime = DateTime.Now.AddHours(Convert.ToDouble(flow.Interval)); flowMgr.UpdateFlow(flow); #endregion } } }
public IList <OrderDetail> ConvertResolverToOrderDetails(Resolver resolver, Flow flow) { OrderHead orderHead = orderMgr.TransferFlow2Order(flow); IList <OrderDetail> orderDetails = new List <OrderDetail>(); if (resolver.Transformers == null) { throw new BusinessErrorException("OrderDetail.Error.OrderDetailEmpty"); } foreach (Transformer transformer in resolver.Transformers) { if (transformer.TransformerDetails != null) { foreach (TransformerDetail transformerDetail in transformer.TransformerDetails) { if (transformerDetail.CurrentQty == 0) //数量为零的过滤掉 { continue; } OrderDetail newOrderDetail = new OrderDetail(); //newOrderDetail.IsScanHu = true; int seqInterval = int.Parse(entityPreferenceMgr.LoadEntityPreference(BusinessConstants.ENTITY_PREFERENCE_CODE_SEQ_INTERVAL).Value); if (orderDetails == null || orderDetails.Count == 0) { newOrderDetail.Sequence = seqInterval; } else { newOrderDetail.Sequence = orderDetails.Last <OrderDetail>().Sequence + seqInterval; } newOrderDetail.Item = itemMgr.LoadItem(transformerDetail.ItemCode); newOrderDetail.Uom = uomMgr.LoadUom(transformerDetail.UomCode); newOrderDetail.HuId = transformerDetail.HuId; if ((resolver.ModuleType == BusinessConstants.TRANSFORMER_MODULE_TYPE_SHIPRETURN) || resolver.ModuleType == BusinessConstants.TRANSFORMER_MODULE_TYPE_RECEIVERETURN) { newOrderDetail.OrderedQty = -transformerDetail.CurrentQty; newOrderDetail.HuQty = -transformerDetail.Qty; } else { newOrderDetail.OrderedQty = transformerDetail.CurrentQty; newOrderDetail.HuQty = transformerDetail.Qty; } if (!(resolver.OrderType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PROCUREMENT || resolver.OrderType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_CUSTOMERGOODS)) { newOrderDetail.LocationFrom = locationMgr.LoadLocation(transformer.LocationFromCode); } if (!(resolver.OrderType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_DISTRIBUTION)) { newOrderDetail.LocationTo = locationMgr.LoadLocation(transformer.LocationToCode); } newOrderDetail.ReferenceItemCode = transformer.ReferenceItemCode; newOrderDetail.UnitCount = transformerDetail.UnitCount; //newOrderDetail.PackageType = transformerDetail.PackageType; newOrderDetail.OrderHead = orderHead; newOrderDetail.IsScanHu = true; newOrderDetail.PutAwayBinCode = resolver.BinCode; orderDetails.Add(newOrderDetail); } } } return(orderDetails); }