private void MatchIpDetailInput(IpDetail ipDetail, IpDetailInput ipDetailInput, IList<IpLocationDetail> ipLocationDetailList, ref IpDetail gapIpDetail) { decimal remainQty = ipDetailInput.ReceiveQty * ipDetail.UnitQty; //转为库存单位 foreach (IpLocationDetail ipLocationDetail in ipLocationDetailList) { if (ipLocationDetail.IsClose) { continue; } //iplocationdet只可能为正数 if (ipLocationDetail.RemainReceiveQty >= remainQty) { //收货明细匹配完 #region 添加收货记录和IpLocationDetail的映射关系 IpLocationDetail receivedIpLocationDetail = Mapper.Map<IpLocationDetail, IpLocationDetail>(ipLocationDetail); receivedIpLocationDetail.ReceivedQty = remainQty; ipDetailInput.AddReceivedIpLocationDetail(receivedIpLocationDetail); #endregion ipLocationDetail.ReceivedQty += remainQty; remainQty = 0; if (ipLocationDetail.Qty == ipLocationDetail.ReceivedQty) { ipLocationDetail.IsClose = true; } } else { //收货明细未匹配完 #region 添加收货记录和IpLocationDetail的映射关系 IpLocationDetail receivedIpLocationDetail = Mapper.Map<IpLocationDetail, IpLocationDetail>(ipLocationDetail); receivedIpLocationDetail.ReceivedQty = ipLocationDetail.RemainReceiveQty; ipDetailInput.AddReceivedIpLocationDetail(receivedIpLocationDetail); #endregion remainQty -= ipLocationDetail.RemainReceiveQty; ipLocationDetail.ReceivedQty = ipLocationDetail.Qty; ipLocationDetail.IsClose = true; } //更新 if (ipLocationDetail.Id > 0) { genericMgr.Update(ipLocationDetail); } if (remainQty == 0) { //匹配完,跳出循环 break; } } //超收,还有未匹配完的数量 if (remainQty > 0) { #region 记录差异 if (gapIpDetail == null || !gapIpDetail.GapIpDetailId.HasValue) { gapIpDetail = Mapper.Map<IpDetail, IpDetail>(ipDetail); gapIpDetail.Type = com.Sconit.CodeMaster.IpDetailType.Gap; gapIpDetail.GapReceiptNo = string.Empty; gapIpDetail.ReceivedQty = 0; gapIpDetail.IsClose = false; gapIpDetail.GapIpDetailId = ipDetail.Id; } gapIpDetail.Qty += -(remainQty / ipDetail.UnitQty); //多收,数量为负,转为订单单位 IpLocationDetail gapIpLocationDetail = new IpLocationDetail(); gapIpLocationDetail.IpNo = ipDetail.IpNo; gapIpLocationDetail.OrderType = ipDetail.OrderType; gapIpLocationDetail.OrderDetailId = ipDetail.OrderDetailId; gapIpLocationDetail.Item = ipDetail.Item; gapIpLocationDetail.HuId = null; //收货未匹配产生的差异全部为数量(除了条码匹配条码) gapIpLocationDetail.LotNo = null; gapIpLocationDetail.IsCreatePlanBill = false; gapIpLocationDetail.PlanBill = null; gapIpLocationDetail.ActingBill = null; gapIpLocationDetail.IsFreeze = false; gapIpLocationDetail.IsATP = false; //差异不能进行MRP运算 gapIpLocationDetail.QualityType = ipDetail.QualityType; gapIpLocationDetail.OccupyType = com.Sconit.CodeMaster.OccupyType.None; gapIpLocationDetail.OccupyReferenceNo = null; gapIpLocationDetail.Qty = -remainQty; //多收,产生负数的差异 gapIpLocationDetail.ReceivedQty = 0; gapIpLocationDetail.IsClose = false; gapIpDetail.AddIpLocationDetail(gapIpLocationDetail); #endregion } }
private void WrapHuStatus(HuStatus huStatus, IpLocationDetail ipLocationDetail) { if (ipLocationDetail != null && !ipLocationDetail.IsClose) { IpDetail ipDetail = this.genericMgr.FindById<IpDetail>(ipLocationDetail.IpDetailId); huStatus.IpNo = ipLocationDetail.IpNo; huStatus.LocationFrom = ipDetail.LocationFrom; huStatus.LocationTo = ipDetail.LocationTo; huStatus.Status = CodeMaster.HuStatus.Ip; huStatus.IsConsignment = ipLocationDetail.IsConsignment; huStatus.PlanBill = ipLocationDetail.PlanBill; huStatus.QualityType = ipLocationDetail.QualityType; huStatus.IsFreeze = ipLocationDetail.IsFreeze; huStatus.IsATP = ipLocationDetail.IsATP; huStatus.OccupyType = ipLocationDetail.OccupyType; huStatus.OccupyReferenceNo = ipLocationDetail.OccupyReferenceNo; } }
public void AddIpLocationDetail(IpLocationDetail ipLocationDetail) { if (IpLocationDetails == null) { IpLocationDetails = new List<IpLocationDetail>(); } IpLocationDetails.Add(ipLocationDetail); }
public void AddReceivedIpLocationDetail(IpLocationDetail receivedIpLocationDetail) { if (ReceivedIpLocationDetailList == null) { ReceivedIpLocationDetailList = new List<IpLocationDetail>(); } ReceivedIpLocationDetailList.Add(receivedIpLocationDetail); }
public void MakeupReceiveOrder() { IList<OrderMaster> orderMasterList = this.genericMgr.FindEntityWithNativeSql<OrderMaster>(@"select * from ORD_OrderMstr_2 where OrderNo in ( select ord.OrderNo from ORD_OrderDet_2 as ord left join ORD_RecDet_2 as rec on ord.Id = rec.OrderDetId where ord.RecQty <> 0 and rec.Id is null)"); foreach (OrderMaster orderMaster in orderMasterList) { SecurityContextHolder.Set(this.genericMgr.FindById<User>(orderMaster.CreateUserId)); try { IList<OrderDetail> orderDetailList = this.genericMgr.FindEntityWithNativeSql<OrderDetail>(@"select * from ORD_OrderDet_2 where OrderNo = ?", orderMaster.OrderNo); orderMaster.OrderDetails = orderDetailList; #region 发货 #region OrderDetailInput赋发货数量 foreach (OrderDetail orderDetail in orderDetailList) { OrderDetailInput orderDetailInput = new OrderDetailInput(); orderDetailInput.ShipQty = orderDetail.OrderedQty; orderDetailInput.ReceiveQty = orderDetail.OrderedQty; orderDetail.AddOrderDetailInput(orderDetailInput); } #endregion IpMaster ipMaster = null; IList<OrderMaster> omList = new List<OrderMaster>(); omList.Add(orderMaster); ipMaster = this.ipMgr.TransferOrder2Ip(omList); #region 循环发货 foreach (IpDetail ipDetail in ipMaster.IpDetails) { ipDetail.CurrentPartyFrom = ipMaster.PartyFrom; //为了记录库存事务 ipDetail.CurrentPartyFromName = ipMaster.PartyFromName; //为了记录库存事务 ipDetail.CurrentPartyTo = ipMaster.PartyTo; //为了记录库存事务 ipDetail.CurrentPartyToName = ipMaster.PartyToName; //为了记录库存事务 OrderDetail orderDetail = orderDetailList.Where(det => det.Id == ipDetail.OrderDetailId).Single(); #region 建立发货库明细和IpDetailInput的关系 ipDetail.IpLocationDetails = new List<IpLocationDetail>(); IpLocationDetail ipLocationDetail = new IpLocationDetail(); ipLocationDetail.HuId = null; ipLocationDetail.LotNo = null; ipLocationDetail.IsCreatePlanBill = false; ipLocationDetail.IsConsignment = false; ipLocationDetail.PlanBill = null; ipLocationDetail.ActingBill = null; ipLocationDetail.QualityType = CodeMaster.QualityType.Qualified; ipLocationDetail.IsFreeze = false; ipLocationDetail.IsATP = true; ipLocationDetail.OccupyType = CodeMaster.OccupyType.None; ipLocationDetail.OccupyReferenceNo = null; ipLocationDetail.Qty = orderDetail.OrderedQty; ipDetail.AddIpLocationDetail(ipLocationDetail); #endregion } #endregion #region 生成收货的IpInput foreach (OrderDetail orderDetail in orderDetailList) { //订单收货一定是一条订单明细对应一条发货单明细 IpDetail ipDetail = ipMaster.IpDetails.Where(det => det.OrderDetailId == orderDetail.Id).Single(); ipDetail.IpDetailInputs = null; //清空Ip的发货数据,准备添加收货数据 foreach (OrderDetailInput orderDetailInput in orderDetail.OrderDetailInputs) { IpDetailInput ipDetailInput = new IpDetailInput(); ipDetailInput.ReceiveQty = orderDetailInput.ShipQty; ipDetail.AddIpDetailInput(ipDetailInput); } } foreach (IpDetail ipDetail in ipMaster.IpDetails) { CycleMatchIpDetailInput(ipDetail, ipDetail.IpDetailInputs, ipDetail.IpLocationDetails); } #endregion #endregion #region 收货 ReceiptMaster receiptMaster = null; receiptMaster = this.receiptMgr.TransferIp2Receipt(ipMaster); this.receiptMgr.CreateReceipt(receiptMaster, false, orderMaster.CreateDate); #endregion this.genericMgr.FlushSession(); } catch (Exception ex) { this.genericMgr.CleanSession(); log.Error(ex); } } }