public void AddMiscOrderLocationDetail(MiscOrderLocationDetail miscOrderLocationDetail)
 {
     if (this.MiscOrderLocationDetails == null)
     {
         this.MiscOrderLocationDetails = new List<MiscOrderLocationDetail>();
     }
     this.MiscOrderLocationDetails.Add(miscOrderLocationDetail);
 }
        public void CloseMiscOrder(MiscOrderMaster miscOrderMaster, DateTime effectiveDate)
        {
            #region 检查
            BusinessException businessException = new BusinessException();
            if (miscOrderMaster.Status != CodeMaster.MiscOrderStatus.Create)
            {
                if (miscOrderMaster.Type == CodeMaster.MiscOrderType.GI)
                {
                    businessException.AddMessage("计划外出库单{0}的状态为{1}不能确认。",
                          miscOrderMaster.MiscOrderNo, systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.MiscOrderStatus, ((int)miscOrderMaster.Status).ToString()));
                }
                else
                {
                    businessException.AddMessage("计划外入库单{0}的状态为{1}不能确认。",
                         miscOrderMaster.MiscOrderNo, systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.MiscOrderStatus, ((int)miscOrderMaster.Status).ToString()));
                }
            }

            IList<MiscOrderDetail> miscOrderDetailList = TryLoadMiscOrderDetails(miscOrderMaster);
            if (miscOrderDetailList == null || miscOrderDetailList.Count() == 0)
            {
                if (miscOrderMaster.Type == CodeMaster.MiscOrderType.GI)
                {
                    businessException.AddMessage("计划外出库单{0}明细为空。", miscOrderMaster.MiscOrderNo);
                }
                else
                {
                    businessException.AddMessage("计划外入库单{0}明细为空。", miscOrderMaster.MiscOrderNo);
                }
            }
            else
            {
                foreach (MiscOrderDetail miscOrderDetail in miscOrderDetailList)
                {
                    if (miscOrderDetail.Qty <= 0)
                    {
                        businessException.AddMessage("计划外入库单{0}明细行{1}的数量不能小于0。", miscOrderMaster.MiscOrderNo, miscOrderDetail.Sequence.ToString());
                    }
                }
            }

            if (businessException.HasMessage)
            {
                throw businessException;
            }
            #endregion

            User user = SecurityContextHolder.Get();
            miscOrderMaster.CloseDate = DateTime.Now;
            miscOrderMaster.CloseUserId = user.Id;
            miscOrderMaster.CloseUserName = user.FullName;
            miscOrderMaster.Status = com.Sconit.CodeMaster.MiscOrderStatus.Close;
            this.genericMgr.Update(miscOrderMaster);
            //后加工废品报工不影响库存
            if (miscOrderMaster.SubType == CodeMaster.MiscOrderSubType.MES27)
            {
                return;
            }
            //
            IList<MiscOrderLocationDetail> miscOrderLocationDetailList = TryLoadMiscOrderLocationDetails(miscOrderMaster);

            foreach (MiscOrderDetail miscOrderDetail in miscOrderDetailList.OrderByDescending(det => det.ManufactureParty))
            {
                miscOrderDetail.ManufactureParty = miscOrderMaster.IsCs ? miscOrderDetail.ManufactureParty : null;
                IList<InventoryTransaction> inventoryTransactionList = this.locationDetailMgr.InventoryOtherInOut(miscOrderMaster, miscOrderDetail, effectiveDate);

                #region 新增、更新订单库存明细
                foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList)
                {
                    if (miscOrderMaster.IsScanHu)
                    {
                        #region 条码
                        MiscOrderLocationDetail miscOrderLocationDetail = miscOrderLocationDetailList.Where(m => m.HuId == inventoryTransaction.HuId).Single();
                        if (inventoryTransaction.ActingBill.HasValue)
                        {
                            miscOrderLocationDetail.IsConsignment = false;
                            miscOrderLocationDetail.PlanBill = null;
                            miscOrderLocationDetail.ActingBill = inventoryTransaction.ActingBill;
                        }

                        this.genericMgr.Update(miscOrderLocationDetail);
                        #endregion
                    }
                    else
                    {
                        #region 数量
                        MiscOrderLocationDetail miscOrderLocationDetail = new MiscOrderLocationDetail();

                        miscOrderLocationDetail.MiscOrderNo = miscOrderMaster.MiscOrderNo;
                        miscOrderLocationDetail.MiscOrderDetailId = miscOrderDetail.Id;
                        miscOrderLocationDetail.MiscOrderDetailSequence = miscOrderDetail.Sequence;
                        miscOrderLocationDetail.Item = inventoryTransaction.Item;
                        miscOrderLocationDetail.Uom = miscOrderDetail.Uom;
                        //miscOrderLocationDetail.HuId = locationLotDetail.HuId;
                        //miscOrderLocationDetail.LotNo = locationLotDetail.LotNo;
                        miscOrderLocationDetail.IsCreatePlanBill = inventoryTransaction.IsCreatePlanBill;
                        miscOrderLocationDetail.IsConsignment = inventoryTransaction.IsConsignment;
                        miscOrderLocationDetail.PlanBill = inventoryTransaction.PlanBill;
                        #region 查找寄售供应商
                        if (inventoryTransaction.IsConsignment && inventoryTransaction.PlanBill.HasValue)
                        {
                            miscOrderLocationDetail.ConsignmentSupplier = this.genericMgr.FindAll<string>("select Party from PlanBill where Id = ?", inventoryTransaction.PlanBill.Value).Single();
                        }
                        #endregion
                        miscOrderLocationDetail.ActingBill = null;
                        miscOrderLocationDetail.QualityType = inventoryTransaction.QualityType;
                        miscOrderLocationDetail.IsFreeze = inventoryTransaction.IsFreeze;
                        miscOrderLocationDetail.IsATP = inventoryTransaction.IsATP;
                        miscOrderLocationDetail.OccupyType = inventoryTransaction.OccupyType;
                        miscOrderLocationDetail.OccupyReferenceNo = inventoryTransaction.OccupyReferenceNo;
                        miscOrderLocationDetail.Qty = inventoryTransaction.Qty;

                        this.genericMgr.Create(miscOrderLocationDetail);
                        #endregion
                    }
                }
                #endregion
            }
        }
        public void BatchUpdateMiscOrderDetails(MiscOrderMaster miscOrderMaster, IList<string> addHuIdList, IList<string> deleteHuIdList)
        {
            if (miscOrderMaster.Status != CodeMaster.MiscOrderStatus.Create)
            {
                if (miscOrderMaster.Type == CodeMaster.MiscOrderType.GI)
                {
                    throw new BusinessException("计划外出库单{0}的状态为{1}不能修改明细。",
                          miscOrderMaster.MiscOrderNo, systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.MiscOrderStatus, ((int)miscOrderMaster.Status).ToString()));
                }
                else
                {
                    throw new BusinessException("计划外入库单{0}的状态为{1}不能修改明细。",
                        miscOrderMaster.MiscOrderNo, systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.MiscOrderStatus, ((int)miscOrderMaster.Status).ToString()));
                }
            }

            TryLoadMiscOrderDetails(miscOrderMaster);
            IList<MiscOrderLocationDetail> miscOrderLocationDetailList = TryLoadMiscOrderLocationDetails(miscOrderMaster);

            #region 新增计划外出入库明细
            if (addHuIdList != null && addHuIdList.Count > 0)
            {
                #region 获取最大订单明细序号
                string hql = "select max(Sequence) as seq from MiscOrderDetail where MiscOrderNo = ?";
                IList maxSeqList = genericMgr.FindAll(hql, miscOrderMaster.MiscOrderNo);
                int maxSeq = maxSeqList != null && maxSeqList.Count > 0 && maxSeqList[0] != null ? (int)maxSeqList[0] : 0;
                #endregion

                #region 条码处理
                #region 明细重复输入校验
                #region 合并新增的HuId和原有的HuId
                IList<string> huIdList = new List<string>();
                ((List<string>)huIdList).AddRange(addHuIdList);
                if (miscOrderLocationDetailList != null && miscOrderLocationDetailList.Count > 0)
                {
                    ((List<string>)huIdList).AddRange(miscOrderLocationDetailList.Select(det => det.HuId).ToList());
                }
                #endregion

                #region 检查是否重复
                BusinessException businessException = new BusinessException();
                var groupedHuIds = from huId in huIdList
                                   group huId by huId into result
                                   select new
                                   {
                                       HuId = result.Key,
                                       Count = result.Count()
                                   };

                foreach (var groupedHuId in groupedHuIds.Where(g => g.Count > 1))
                {
                    businessException = new BusinessException(string.Format("重复扫描条码{0}。", groupedHuId.HuId));
                }

                if (businessException.HasMessage)
                {
                    throw businessException;
                }
                #endregion
                #endregion

                if (miscOrderMaster.Type == CodeMaster.MiscOrderType.GI)
                {
                    #region 计划外出库
                    #region 库存占用
                    IList<InventoryOccupy> inventoryOccupyList = (from huId in addHuIdList
                                                                  select new InventoryOccupy
                                                                  {
                                                                      HuId = huId,
                                                                      //Location = miscOrderMaster.Location,  不指定库位
                                                                      QualityType = miscOrderMaster.QualityType,
                                                                      OccupyType = CodeMaster.OccupyType.MiscOrder,
                                                                      OccupyReferenceNo = miscOrderMaster.MiscOrderNo
                                                                  }).ToList();

                    IList<LocationLotDetail> locationLotDetailList = this.locationDetailMgr.InventoryOccupy(inventoryOccupyList);
                    #endregion

                    #region 新增明细
                    foreach (LocationLotDetail locationLotDetail in locationLotDetailList)
                    {
                        MiscOrderDetail matchedMiscOrderDetail = null;

                        #region 明细处理
                        if (miscOrderMaster.MiscOrderDetails != null && miscOrderMaster.MiscOrderDetails.Count > 0)
                        {
                            //查找匹配的明细行
                            matchedMiscOrderDetail = miscOrderMaster.MiscOrderDetails.Where(det => det.Item == locationLotDetail.Item
                                                                                                && det.Uom == locationLotDetail.HuUom
                                                                                                && det.UnitCount == locationLotDetail.UnitCount
                                                                                                && det.Location == locationLotDetail.Location).SingleOrDefault();
                        }

                        if (matchedMiscOrderDetail == null)
                        {
                            //没有找到明细行,新增明细
                            Item item = this.genericMgr.FindById<Item>(locationLotDetail.Item);                                //没有找到匹配的明细行,新增一行
                            matchedMiscOrderDetail = new MiscOrderDetail();

                            matchedMiscOrderDetail.MiscOrderNo = miscOrderMaster.MiscOrderNo;
                            matchedMiscOrderDetail.Sequence = ++maxSeq;
                            matchedMiscOrderDetail.Item = locationLotDetail.Item;
                            matchedMiscOrderDetail.ItemDescription = item.Description;
                            matchedMiscOrderDetail.ReferenceItemCode = item.ReferenceCode;
                            matchedMiscOrderDetail.Uom = locationLotDetail.HuUom;
                            matchedMiscOrderDetail.BaseUom = locationLotDetail.BaseUom;
                            matchedMiscOrderDetail.UnitCount = locationLotDetail.UnitCount;
                            matchedMiscOrderDetail.UnitQty = locationLotDetail.UnitQty;
                            matchedMiscOrderDetail.Location = locationLotDetail.Location;
                            //matchedMiscOrderDetail.ReserveNo = addMiscOrderDetail.ReserveNo;
                            //matchedMiscOrderDetail.ReserveLine = addMiscOrderDetail.ReserveLine;
                            matchedMiscOrderDetail.Qty = locationLotDetail.Qty;

                            this.genericMgr.Create(matchedMiscOrderDetail);

                            miscOrderMaster.MiscOrderDetails.Add(matchedMiscOrderDetail);
                        }
                        else
                        {
                            //找到明细行,更新数量
                            matchedMiscOrderDetail.Qty += locationLotDetail.Qty;
                            this.genericMgr.Update(matchedMiscOrderDetail);
                        }
                        #endregion

                        #region 库存明细新增
                        MiscOrderLocationDetail miscOrderLocationDetail = new MiscOrderLocationDetail();

                        miscOrderLocationDetail.MiscOrderNo = miscOrderMaster.MiscOrderNo;
                        miscOrderLocationDetail.MiscOrderDetailId = matchedMiscOrderDetail.Id;
                        miscOrderLocationDetail.MiscOrderDetailSequence = matchedMiscOrderDetail.Sequence;
                        miscOrderLocationDetail.Item = locationLotDetail.Item;
                        miscOrderLocationDetail.Uom = locationLotDetail.HuUom;
                        miscOrderLocationDetail.HuId = locationLotDetail.HuId;
                        miscOrderLocationDetail.LotNo = locationLotDetail.LotNo;
                        miscOrderLocationDetail.IsCreatePlanBill = false;
                        miscOrderLocationDetail.IsConsignment = locationLotDetail.IsConsignment;
                        miscOrderLocationDetail.PlanBill = locationLotDetail.PlanBill;
                        #region 查找寄售供应商
                        if (locationLotDetail.IsConsignment && locationLotDetail.PlanBill.HasValue)
                        {
                            miscOrderLocationDetail.ConsignmentSupplier = this.genericMgr.FindAll<string>("select Party from PlanBill where Id = ?", locationLotDetail.PlanBill.Value)[0];
                        }
                        #endregion
                        miscOrderLocationDetail.ActingBill = null;
                        miscOrderLocationDetail.QualityType = locationLotDetail.QualityType;
                        miscOrderLocationDetail.IsFreeze = locationLotDetail.IsFreeze;
                        miscOrderLocationDetail.IsATP = locationLotDetail.IsATP;
                        miscOrderLocationDetail.OccupyType = locationLotDetail.OccupyType;
                        miscOrderLocationDetail.OccupyReferenceNo = locationLotDetail.OccupyReferenceNo;
                        miscOrderLocationDetail.Qty = locationLotDetail.Qty;
                        if (addHuIdList.Contains(miscOrderLocationDetail.HuId))
                        {
                            this.genericMgr.Create(miscOrderLocationDetail);
                        }
                        #endregion
                    }
                    #endregion
                    #endregion
                }
                else
                {
                    #region 计划外入库
                    #region 检查条码状态
                    IList<HuStatus> huStatusList = this.huMgr.GetHuStatus(addHuIdList);

                    foreach (string huId in addHuIdList)
                    {
                        HuStatus huStatus = huStatusList.Where(h => h.HuId == huId).SingleOrDefault();
                        if (huStatus == null)
                        {
                            businessException = new BusinessException(string.Format("条码{0}不存在。", huId));
                        }
                        else if (huStatus.Status == CodeMaster.HuStatus.Location)
                        {
                            businessException = new BusinessException(string.Format("条码{0}在库位{1}中,不能计划外入库。", huStatus.HuId, huStatus.Location));
                        }
                        else if (huStatus.Status == CodeMaster.HuStatus.Ip)
                        {
                            businessException = new BusinessException(string.Format("条码{0}为库位{1}至库位{2}的在途库存,不能计划外入库。", huStatus.HuId, huStatus.LocationFrom, huStatus.LocationTo));
                        }
                    }

                    if (businessException.HasMessage)
                    {
                        throw businessException;
                    }
                    #endregion

                    #region 新增明细
                    foreach (HuStatus huStatus in huStatusList)
                    {
                        MiscOrderDetail matchedMiscOrderDetail = null;

                        #region 明细处理
                        if (miscOrderMaster.MiscOrderDetails != null && miscOrderMaster.MiscOrderDetails.Count > 0)
                        {
                            //查找匹配的明细行
                            matchedMiscOrderDetail = miscOrderMaster.MiscOrderDetails
                                .Where(det => det.Item == huStatus.Item && det.Uom == huStatus.Uom && det.UnitCount == huStatus.UnitCount)
                                .SingleOrDefault();
                        }

                        if (matchedMiscOrderDetail == null)
                        {
                            //没有找到明细行,新增明细//没有找到匹配的明细行,新增一行
                            Item item = this.genericMgr.FindById<Item>(huStatus.Item);
                            matchedMiscOrderDetail = new MiscOrderDetail();

                            matchedMiscOrderDetail.MiscOrderNo = miscOrderMaster.MiscOrderNo;
                            matchedMiscOrderDetail.Sequence = ++maxSeq;
                            matchedMiscOrderDetail.Item = huStatus.Item;
                            matchedMiscOrderDetail.ItemDescription = item.Description;
                            matchedMiscOrderDetail.ReferenceItemCode = item.ReferenceCode;
                            matchedMiscOrderDetail.Uom = huStatus.Uom;
                            matchedMiscOrderDetail.BaseUom = huStatus.BaseUom;
                            matchedMiscOrderDetail.UnitCount = huStatus.UnitCount;
                            matchedMiscOrderDetail.UnitQty = huStatus.UnitQty;
                            matchedMiscOrderDetail.ManufactureParty = huStatus.ManufactureParty;
                            //matchedMiscOrderDetail.Location = 
                            //matchedMiscOrderDetail.ReserveNo = addMiscOrderDetail.ReserveNo;
                            //matchedMiscOrderDetail.ReserveLine = addMiscOrderDetail.ReserveLine;
                            matchedMiscOrderDetail.Qty = huStatus.Qty;

                            this.genericMgr.Create(matchedMiscOrderDetail);

                            miscOrderMaster.MiscOrderDetails.Add(matchedMiscOrderDetail);
                        }
                        else
                        {
                            //找到明细行,更新数量
                            matchedMiscOrderDetail.Qty += huStatus.Qty;
                            this.genericMgr.Update(matchedMiscOrderDetail);
                        }
                        #endregion

                        #region 库存明细新增
                        MiscOrderLocationDetail miscOrderLocationDetail = new MiscOrderLocationDetail();

                        miscOrderLocationDetail.MiscOrderNo = miscOrderMaster.MiscOrderNo;
                        miscOrderLocationDetail.MiscOrderDetailId = matchedMiscOrderDetail.Id;
                        miscOrderLocationDetail.MiscOrderDetailSequence = matchedMiscOrderDetail.Sequence;
                        miscOrderLocationDetail.Item = huStatus.Item;
                        miscOrderLocationDetail.Uom = huStatus.Uom;
                        miscOrderLocationDetail.HuId = huStatus.HuId;
                        miscOrderLocationDetail.LotNo = huStatus.LotNo;
                        miscOrderLocationDetail.IsCreatePlanBill = false;
                        miscOrderLocationDetail.IsConsignment = false;
                        miscOrderLocationDetail.PlanBill = null;
                        miscOrderLocationDetail.ConsignmentSupplier = null;
                        miscOrderLocationDetail.ActingBill = null;
                        miscOrderLocationDetail.QualityType = huStatus.QualityType;
                        miscOrderLocationDetail.IsFreeze = false;
                        miscOrderLocationDetail.IsATP = true;
                        miscOrderLocationDetail.OccupyType = CodeMaster.OccupyType.None;
                        miscOrderLocationDetail.OccupyReferenceNo = null;
                        miscOrderLocationDetail.Qty = huStatus.Qty * huStatus.UnitQty;

                        this.genericMgr.Create(miscOrderLocationDetail);
                        #endregion
                    }
                    #endregion
                    #endregion
                }
                #endregion
            }
            #endregion

            #region 删除计划外出入库明细

            if (deleteHuIdList != null && deleteHuIdList.Count > 0)
            {
                #region 条码处理
                #region 条码是否在计划外出入库单中存在检查
                BusinessException businessException = new BusinessException();
                foreach (string huId in deleteHuIdList)
                {
                    if (miscOrderLocationDetailList == null || miscOrderLocationDetailList.Where(m => m.HuId == huId).Count() == 0)
                    {
                        if (miscOrderMaster.Type == CodeMaster.MiscOrderType.GI)
                        {
                            businessException.AddMessage("条码{0}在计划外出库单{1}中不存在。", huId, miscOrderMaster.MiscOrderNo);
                        }
                        else
                        {
                            businessException.AddMessage("条码{0}在计划外入库单{1}中不存在。", huId, miscOrderMaster.MiscOrderNo);
                        }
                    }
                }

                if (businessException.HasMessage)
                {
                    throw businessException;
                }
                #endregion

                #region 循环删除
                #region 取消占用
                if (miscOrderMaster.Type == CodeMaster.MiscOrderType.GI)
                {
                    this.locationDetailMgr.CancelInventoryOccupy(CodeMaster.OccupyType.MiscOrder, miscOrderMaster.MiscOrderNo, deleteHuIdList);
                }
                #endregion

                foreach (string huId in deleteHuIdList)
                {
                    #region 扣减明细数量,删除库存明细
                    MiscOrderLocationDetail miscOrderLocationDetail = miscOrderLocationDetailList.Where(det => det.HuId == huId).Single();
                    MiscOrderDetail miscOrderDetail = miscOrderMaster.MiscOrderDetails.Where(det => det.Id == miscOrderLocationDetail.MiscOrderDetailId).Single();
                    miscOrderDetail.Qty -= miscOrderLocationDetail.Qty / miscOrderDetail.UnitQty;

                    this.genericMgr.Update(miscOrderDetail);
                    this.genericMgr.Delete(miscOrderLocationDetail);
                    #endregion
                }
                #endregion
                #endregion
            }
            #endregion
        }
Example #4
0
        public PlanBill CreatePlanBill(MiscOrderMaster miscOrderMaster, MiscOrderDetail miscOrderDetail, MiscOrderLocationDetail miscOrderLocationDetail, DateTime effectiveDate)
        {
            PlanBill planBill = new PlanBill();
            planBill.OrderNo = miscOrderMaster.MiscOrderNo;
            planBill.ReceiptNo = miscOrderMaster.MiscOrderNo;
            planBill.ExternalReceiptNo = miscOrderMaster.ReferenceNo;
            planBill.Type = com.Sconit.CodeMaster.BillType.Procurement;
            planBill.Party = miscOrderDetail.ManufactureParty;
            planBill.Item = miscOrderDetail.Item;
            planBill.ItemDescription = miscOrderDetail.ItemDescription;
            planBill.Uom = miscOrderDetail.Uom;
            planBill.UnitCount = miscOrderDetail.UnitCount;
            planBill.BillTerm = CodeMaster.OrderBillTerm.OnlineBilling;
            PartyAddress partyAddress = this.genericMgr.FindAll<PartyAddress>(
                "from PartyAddress as pa where pa.Party = ? and pa.Type = ? order by IsPrimary desc,Sequence asc ",
                new object[] { planBill.Party, CodeMaster.AddressType.BillAddress }, 0, 1).FirstOrDefault();
            if (partyAddress == null)
            {
                throw new BusinessException(Resources.EXT.ServiceLan.TheBillAddressNotSpecialSupplier, planBill.Party);
            }
            planBill.BillAddress = partyAddress.Address.Code;
            planBill.PlanAmount = 0;
            int refId = 0;
            if (miscOrderMaster.IsScanHu)
            {
                planBill.PlanQty = miscOrderLocationDetail.Qty;
                planBill.UnitQty = miscOrderDetail.UnitQty;
                planBill.HuId = miscOrderLocationDetail.HuId;
                refId = miscOrderLocationDetail.Id;
            }
            else
            {
                planBill.PlanQty = miscOrderDetail.Qty;
                planBill.UnitQty = miscOrderDetail.UnitQty;
                refId = miscOrderDetail.Id;
            }
            planBill.LocationFrom = string.IsNullOrWhiteSpace(miscOrderDetail.Location) ? miscOrderMaster.Location : miscOrderDetail.Location;
            planBill.EffectiveDate = effectiveDate;
            this.genericMgr.Create(planBill);

            this.RecordPlanBillTransaction(planBill, effectiveDate, refId, false);
            return planBill;
        }
Example #5
0
        public void CloseMiscOrder(MiscOrderMaster miscOrderMaster, DateTime effectiveDate)
        {
            #region 检查
            BusinessException businessException = new BusinessException();
            if (miscOrderMaster.Status != CodeMaster.MiscOrderStatus.Create)
            {
                if (miscOrderMaster.Type == CodeMaster.MiscOrderType.GI)
                {
                    businessException.AddMessage("计划外出库单{0}的状态为{1}不能确认。",
                          miscOrderMaster.MiscOrderNo, systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.MiscOrderStatus, ((int)miscOrderMaster.Status).ToString()));
                }
                else
                {
                    businessException.AddMessage("计划外入库单{0}的状态为{1}不能确认。",
                         miscOrderMaster.MiscOrderNo, systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.MiscOrderStatus, ((int)miscOrderMaster.Status).ToString()));
                }
            }

            IList<MiscOrderDetail> miscOrderDetailList = TryLoadMiscOrderDetails(miscOrderMaster);
            if (miscOrderDetailList == null || miscOrderDetailList.Count() == 0)
            {
                if (miscOrderMaster.Type == CodeMaster.MiscOrderType.GI)
                {
                    businessException.AddMessage("计划外出库单{0}明细为空。", miscOrderMaster.MiscOrderNo);
                }
                else
                {
                    businessException.AddMessage("计划外入库单{0}明细为空。", miscOrderMaster.MiscOrderNo);
                }
            }
            else
            {
                foreach (MiscOrderDetail miscOrderDetail in miscOrderDetailList)
                {
                    if (miscOrderDetail.Qty <= 0)
                    {
                        businessException.AddMessage("计划外入库单{0}明细行{1}的数量不能小于0。", miscOrderMaster.MiscOrderNo, miscOrderDetail.Sequence.ToString());
                    }
                }
            }

            if (businessException.HasMessage)
            {
                throw businessException;
            }

            businessException = CheckInventory(miscOrderDetailList, miscOrderMaster);

            if (businessException.HasMessage)
            {
                throw businessException;
            }

            #endregion

            User user = SecurityContextHolder.Get();
            miscOrderMaster.CloseDate = DateTime.Now;
            miscOrderMaster.CloseUserId = user.Id;
            miscOrderMaster.CloseUserName = user.FullName;
            miscOrderMaster.Status = com.Sconit.CodeMaster.MiscOrderStatus.Close;
            this.genericMgr.Update(miscOrderMaster);
            //如果是退货的 直接转为出库
            miscOrderMaster.Type = miscOrderMaster.Type == com.Sconit.CodeMaster.MiscOrderType.Return ? com.Sconit.CodeMaster.MiscOrderType.GI : miscOrderMaster.Type;
            IList<MiscOrderLocationDetail> miscOrderLocationDetailList = TryLoadMiscOrderLocationDetails(miscOrderMaster);

            foreach (MiscOrderDetail miscOrderDetail in miscOrderDetailList.OrderByDescending(det => det.ManufactureParty))
            {
                IList<InventoryTransaction> inventoryTransactionList = this.locationDetailMgr.InventoryOtherInOut(miscOrderMaster, miscOrderDetail, effectiveDate);

                #region 新增、更新订单库存明细
                var groupInventoryTransactionList = from trans in inventoryTransactionList
                                                    group trans by new
                                                    {
                                                        Item = trans.Item,
                                                        HuId = trans.HuId,
                                                        IsCreatePlanBill = trans.IsCreatePlanBill,
                                                        IsConsignment = trans.IsConsignment,
                                                        PlanBill = trans.PlanBill,
                                                        ActingBill = trans.ActingBill,
                                                        QualityType = trans.QualityType,
                                                        IsFreeze = trans.IsFreeze,
                                                        IsATP = trans.IsATP,
                                                        OccupyType = trans.OccupyType,
                                                        OccupyReferenceNo = trans.OccupyReferenceNo,
                                                    } into result
                                                    select new
                                                    {
                                                        Item = result.Key.Item,
                                                        HuId = result.Key.HuId,
                                                        IsCreatePlanBill = result.Key.IsCreatePlanBill,
                                                        IsConsignment = result.Key.IsConsignment,
                                                        PlanBill = result.Key.PlanBill,
                                                        ActingBill = result.Key.ActingBill,
                                                        QualityType = result.Key.QualityType,
                                                        IsFreeze = result.Key.IsFreeze,
                                                        IsATP = result.Key.IsATP,
                                                        OccupyType = result.Key.OccupyType,
                                                        OccupyReferenceNo = result.Key.OccupyReferenceNo,
                                                        Qty = result.Sum(trans => trans.Qty)
                                                    };

                foreach (var groupInventoryTransaction in groupInventoryTransactionList)
                {
                    if (miscOrderMaster.IsScanHu)
                    {
                        #region 条码
                        MiscOrderLocationDetail miscOrderLocationDetail = miscOrderLocationDetailList.Where(m => m.HuId == groupInventoryTransaction.HuId).Single();
                        if (groupInventoryTransaction.ActingBill.HasValue)
                        {
                            miscOrderLocationDetail.IsConsignment = false;
                            miscOrderLocationDetail.PlanBill = null;
                            miscOrderLocationDetail.ActingBill = groupInventoryTransaction.ActingBill;
                        }

                        this.genericMgr.Update(miscOrderLocationDetail);
                        #endregion
                    }
                    else
                    {
                        #region 数量
                        MiscOrderLocationDetail miscOrderLocationDetail = new MiscOrderLocationDetail();

                        miscOrderLocationDetail.MiscOrderNo = miscOrderMaster.MiscOrderNo;
                        miscOrderLocationDetail.MiscOrderDetailId = miscOrderDetail.Id;
                        miscOrderLocationDetail.MiscOrderDetailSequence = miscOrderDetail.Sequence;
                        miscOrderLocationDetail.Item = groupInventoryTransaction.Item;
                        miscOrderLocationDetail.Uom = miscOrderDetail.Uom;
                        //miscOrderLocationDetail.HuId = locationLotDetail.HuId;
                        //miscOrderLocationDetail.LotNo = locationLotDetail.LotNo;
                        miscOrderLocationDetail.IsCreatePlanBill = groupInventoryTransaction.IsCreatePlanBill;
                        miscOrderLocationDetail.IsConsignment = groupInventoryTransaction.IsConsignment;
                        miscOrderLocationDetail.PlanBill = groupInventoryTransaction.PlanBill;
                        //#region 查找寄售供应商
                        //if (inventoryTransaction.IsConsignment && inventoryTransaction.PlanBill.HasValue)
                        //{
                        //miscOrderLocationDetail.ConsignmentSupplier = this.genericMgr.FindAll<string>("select Party from PlanBill where Id = ?", inventoryTransaction.PlanBill.Value).Single();
                        //}
                        //#endregion
                        miscOrderLocationDetail.ActingBill = groupInventoryTransaction.ActingBill;
                        miscOrderLocationDetail.QualityType = groupInventoryTransaction.QualityType;
                        miscOrderLocationDetail.IsFreeze = groupInventoryTransaction.IsFreeze;
                        miscOrderLocationDetail.IsATP = groupInventoryTransaction.IsATP;
                        miscOrderLocationDetail.OccupyType = groupInventoryTransaction.OccupyType;
                        miscOrderLocationDetail.OccupyReferenceNo = groupInventoryTransaction.OccupyReferenceNo;
                        miscOrderLocationDetail.Qty = groupInventoryTransaction.Qty;

                        this.genericMgr.Create(miscOrderLocationDetail);
                        #endregion
                    }
                }
                #endregion
            }
        }