Beispiel #1
0
 /// <summary>
 /// 出库提交
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void btnSave_Press(object sender, EventArgs e)
 {
     try
     {
         List <ConSalesOrderRowInputDto> Rows = new List <ConSalesOrderRowInputDto>();
         foreach (ListViewRow row in listCons.Rows)
         {
             frmConSOROutboundLayout Layout = row.Control as frmConSOROutboundLayout;
             if (Layout.getData() != null)
             {
                 Rows.Add(Layout.getData());   //添加入库信息
             }
         }
         if (Rows.Count == 0)
         {
             throw new Exception("请选择退库耗材!");
         }
         ConSOOutboundInputDto outInputDto = new ConSOOutboundInputDto();
         outInputDto.SOID       = SOID;
         outInputDto.CREATEUSER = Client.Session["UserID"].ToString();
         outInputDto.RowDatas   = Rows;
         ReturnInfo RInfo = autofacConfig.ConSalesOrderService.OutboundConSalesOrder(outInputDto);
         if (RInfo.IsSuccess)
         {
             List <ConSalesOrderOutboundOutputDto> rows = autofacConfig.ConSalesOrderService.GetOutRowsBySOID(SOID);
             if (rows.Count == 0)
             {
                 Toast("该销售单出库完成!");
                 Form.Close();
             }
             else
             {
                 Toast("出库成功!");
                 Bind();         //刷新当前页面入库数据
                 Checkall.Checked = false;
             }
         }
     }
     catch (Exception ex)
     {
         Toast(ex.Message);
     }
 }
        /// <summary>
        /// 耗材销售单退货
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public ReturnInfo RetConSalesOrder(ConSOOutboundInputDto entity)
        {
            ReturnInfo    RInfo = new ReturnInfo();
            StringBuilder sb    = new StringBuilder();

            foreach (ConSalesOrderRowInputDto Row in entity.RowDatas)
            {
                //新增退库行项
                List <ConSalesOrderOutbound> orderOutList = _ConSalesOrderOutboundReposity.GetBySOIDAndSOROWID(entity.SOID, Row.SOROWID).AsNoTracking().ToList();
                ConSalesOrderRow             orderRow     = _ConSalesOrderRowReposity.GetOrderRowByCID(entity.SOID, Row.CID).FirstOrDefault();
                decimal hasRet  = orderRow.QUANTRETREATED;  //已经退货数
                decimal waitRet = Row.QUANTRETREATED;       //等待退货数
                foreach (ConSalesOrderOutbound orderOut in orderOutList)
                {
                    if (waitRet > 0)
                    {
                        if (hasRet >= orderOut.QUANT)
                        {
                            hasRet -= orderOut.QUANT;
                        }
                        else
                        {
                            //新增退库单数据
                            decimal canRetNum = orderOut.QUANT - hasRet;    //此行项可退库数量
                            ConSalesOrderRetiring orderRetiring = _ConSalesOrderRetiringReposity.GetBySOIDAndWareID(entity.SOID, Row.SOROWID, orderOut.WAREID, orderOut.STID, orderOut.SLID).FirstOrDefault();
                            if (orderRetiring == null)
                            {
                                ConSalesOrderRetiring orderNewRetiring = new ConSalesOrderRetiring();
                                orderNewRetiring.SOID    = entity.SOID;
                                orderNewRetiring.SOROWID = Row.SOROWID;
                                orderNewRetiring.WAREID  = orderOut.WAREID;
                                orderNewRetiring.STID    = orderOut.STID;
                                orderNewRetiring.SLID    = orderOut.SLID;
                                if (waitRet > canRetNum)
                                {
                                    waitRet -= canRetNum;
                                    orderNewRetiring.QUANT = canRetNum;
                                }
                                else
                                {
                                    orderNewRetiring.QUANT = waitRet;
                                    waitRet = 0;
                                }
                                _unitOfWork.RegisterNew(orderNewRetiring);
                                //新增或者修改ConQuant数据
                                ConQuant conQuant = _ConQuantRepository.GetByCID(Row.CID, orderNewRetiring.WAREID, orderNewRetiring.STID, orderNewRetiring.SLID).FirstOrDefault();
                                if (conQuant == null)  //当前库位不存在库存,则新增
                                {
                                    ConQuant newQuant = new ConQuant();
                                    newQuant.CID        = Row.CID;
                                    newQuant.WAREID     = orderNewRetiring.WAREID;
                                    newQuant.STID       = orderNewRetiring.STID;
                                    newQuant.SLID       = orderNewRetiring.SLID;
                                    newQuant.QUANTITY   = orderNewRetiring.QUANT;
                                    newQuant.CREATEUSER = entity.CREATEUSER;
                                    newQuant.CREATEDATE = DateTime.Now;
                                    newQuant.MODIFYUSER = entity.CREATEUSER;
                                    newQuant.MODIFYDATE = DateTime.Now;
                                    _unitOfWork.RegisterNew(newQuant);
                                }
                                else          //当前库位存在库存,则添加数量
                                {
                                    conQuant.QUANTITY += orderNewRetiring.QUANT;
                                    _unitOfWork.RegisterDirty(conQuant);
                                }
                                hasRet -= orderNewRetiring.QUANT;
                            }
                            else
                            {
                                decimal retNumThisTime = 0;
                                if (waitRet > canRetNum)
                                {
                                    waitRet            -= canRetNum;
                                    retNumThisTime      = canRetNum;
                                    orderRetiring.QUANT = orderRetiring.QUANT + canRetNum;
                                }
                                else
                                {
                                    orderRetiring.QUANT = orderRetiring.QUANT + waitRet;
                                    retNumThisTime      = waitRet;
                                    waitRet             = 0;
                                }
                                _unitOfWork.RegisterDirty(orderRetiring);
                                //新增或者修改ConQuant数据
                                ConQuant conQuant = _ConQuantRepository.GetByCID(Row.CID, orderRetiring.WAREID, orderRetiring.STID, orderRetiring.SLID).FirstOrDefault();
                                if (conQuant == null)  //当前库位不存在库存,则新增
                                {
                                    ConQuant newQuant = new ConQuant();
                                    newQuant.CID        = Row.CID;
                                    newQuant.WAREID     = orderRetiring.WAREID;
                                    newQuant.STID       = orderRetiring.STID;
                                    newQuant.SLID       = orderRetiring.SLID;
                                    newQuant.QUANTITY   = retNumThisTime;
                                    newQuant.CREATEUSER = entity.CREATEUSER;
                                    newQuant.CREATEDATE = DateTime.Now;
                                    newQuant.MODIFYUSER = entity.CREATEUSER;
                                    newQuant.MODIFYDATE = DateTime.Now;
                                    _unitOfWork.RegisterNew(newQuant);
                                }
                                else          //当前库位存在库存,则添加数量
                                {
                                    conQuant.QUANTITY += retNumThisTime;
                                    _unitOfWork.RegisterDirty(conQuant);
                                }
                                hasRet -= retNumThisTime;
                            }
                        }
                    }
                }

                //修改OrderRow行项表退库数量
                ConSalesOrderRow conSalesOrderRow = _ConSalesOrderRowReposity.GetOrderRowByCID(entity.SOID, Row.CID).FirstOrDefault();
                conSalesOrderRow.QUANTRETREATED = conSalesOrderRow.QUANTRETREATED + Row.QUANTRETREATED;
                if (conSalesOrderRow.QUANTRETREATED > conSalesOrderRow.QUANTOUT)
                {
                    throw new Exception("退货数量不能大于出库数量!");
                }
                _unitOfWork.RegisterDirty(conSalesOrderRow);
            }
            try
            {
                _unitOfWork.Commit();
                RInfo.IsSuccess = true;
                return(RInfo);
            }
            catch (Exception ex)
            {
                _unitOfWork.Rollback();
                sb.Append(ex.Message);
                RInfo.IsSuccess = false;
                RInfo.ErrorInfo = sb.ToString();
                return(RInfo);
            }
        }
        /// <summary>
        /// 耗材销售单出库
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public ReturnInfo OutboundConSalesOrder(ConSOOutboundInputDto entity)
        {
            ReturnInfo    RInfo    = new ReturnInfo();
            StringBuilder sb       = new StringBuilder();
            int           thisOver = 0; //此次完成出库的行项数

            foreach (ConSalesOrderRowInputDto Row in entity.RowDatas)
            {
                decimal quantSum = _ConQuantRepository.GetSumByCID(Row.CID);
                if (quantSum < Row.QUANTOUT)
                {
                    throw new Exception("耗材" + Row.CID + "库存不足,请先补充库存!");
                }
                List <ConQuant> conQuantList = _ConQuantRepository.GetQuantByCID(Row.CID).ToList();
                decimal         quantOut     = Row.QUANTOUT;
                while (quantOut > 0)
                {
                    foreach (ConQuant conQuant in conQuantList)
                    {
                        ConSalesOrderOutbound outbound = new ConSalesOrderOutbound();
                        outbound.SOID    = entity.SOID;
                        outbound.SOROWID = Row.SOROWID;
                        outbound.WAREID  = conQuant.WAREID;
                        outbound.STID    = conQuant.STID;
                        outbound.SLID    = conQuant.SLID;
                        if (conQuant.QUANTITY > quantOut)
                        {
                            conQuant.QUANTITY = conQuant.QUANTITY - quantOut;
                            _unitOfWork.RegisterDirty(conQuant);
                            outbound.QUANT = quantOut;
                            quantOut       = 0;
                            _unitOfWork.RegisterNew(outbound);
                            break;
                        }
                        else if (conQuant.QUANTITY == quantOut)
                        {
                            outbound.QUANT = quantOut;
                            _unitOfWork.RegisterDeleted(conQuant);
                            quantOut = 0;
                            _unitOfWork.RegisterNew(outbound);
                            break;
                        }
                        else
                        {
                            outbound.QUANT = conQuant.QUANTITY;
                            quantOut       = quantOut - conQuant.QUANTITY;
                            _unitOfWork.RegisterDeleted(conQuant);
                            _unitOfWork.RegisterNew(outbound);
                        }
                    }
                }

                ConSalesOrderRow orderRow = _ConSalesOrderRowReposity.GetOrderRowByCID(entity.SOID, Row.CID).FirstOrDefault();
                orderRow.QUANTOUT = orderRow.QUANTOUT + Row.QUANTOUT;
                orderRow.STATUS   = (int)SalesOrderStatus.出库中;
                if (orderRow.QUANTOUT == orderRow.QUANTSALED)
                {
                    orderRow.STATUS = (int)PurchaseOrderStatus.已完成;
                    thisOver       += 1;
                }
                if (orderRow.QUANTOUT > orderRow.QUANTSALED)
                {
                    throw new Exception("出库数量不可大于实际销售数量!");
                }
                _unitOfWork.RegisterDirty(orderRow);
            }

            ConSalesOrder conSalesOrder = _ConSalesOrderReposity.GetById(entity.SOID).AsNoTracking().FirstOrDefault();
            int           allRowsCount  = _ConSalesOrderRowReposity.GetBySOID(entity.SOID).ToList().Count;
            int           hasOverCount  = _ConSalesOrderRowReposity.GetOrderRowsByStatus(entity.SOID, (int)PurchaseOrderStatus.已完成).ToList().Count;

            if (allRowsCount == hasOverCount + thisOver)
            {
                conSalesOrder.STATUS = (int)PurchaseOrderStatus.已完成;
            }
            else
            {
                conSalesOrder.STATUS = (int)PurchaseOrderStatus.入库中;
            }
            _unitOfWork.RegisterDirty(conSalesOrder);
            try
            {
                _unitOfWork.Commit();
                RInfo.IsSuccess = true;
                return(RInfo);
            }
            catch (Exception ex)
            {
                _unitOfWork.Rollback();
                sb.Append(ex.Message);
                RInfo.IsSuccess = false;
                RInfo.ErrorInfo = sb.ToString();
                return(RInfo);
            }
        }