Ejemplo n.º 1
0
        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
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
 public void AddIpLocationDetail(IpLocationDetail ipLocationDetail)
 {
     if (IpLocationDetails == null)
     {
         IpLocationDetails = new List<IpLocationDetail>();
     }
     IpLocationDetails.Add(ipLocationDetail);
 }
Ejemplo n.º 4
0
        public void AddReceivedIpLocationDetail(IpLocationDetail receivedIpLocationDetail)
        {
            if (ReceivedIpLocationDetailList == null)
            {
                ReceivedIpLocationDetailList = new List<IpLocationDetail>();
            }

            ReceivedIpLocationDetailList.Add(receivedIpLocationDetail);
        }
Ejemplo n.º 5
0
        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);
                }
            }
        }