Ejemplo n.º 1
0
        /// <summary>
        /// 检查补单实体
        /// </summary>
        /// <returns>返回检查结果</returns>
        /// <remarks>2013-07-16 沈强 创建</remarks>
        private Result CheckOrder(ParaLogisticsControllerAdditionalOrders model)
        {
            var result = new Result {
                Status = true, Message = "检查通过"
            };

            #region 检查配送员是否存在
            IList <SyUser> syUsers = Hyt.DataAccess.Warehouse.IWhWarehouseDao.Instance.GetWhDeliveryUser(model.WarehouseSysNo,
                                                                                                         Hyt.Model.WorkflowStatus.LogisticsStatus
                                                                                                         .配送员是否允许配送.是);
            int count = syUsers.Count(s => s.SysNo == model.DeliverymanSysNo);
            if (count != 1)
            {
                result.Status  = false;
                result.Message = "配送员不存在!";
                return(result);
            }
            #endregion

            #region 会员是否存在

            CrCustomer crCustomer = Hyt.DataAccess.CRM.ICrCustomerDao.Instance.GetCrCustomerItem(model.UserSysNo);
            if (crCustomer == null)
            {
                result.Status  = false;
                result.Message = "会员不存在!";
                return(result);
            }
            #endregion

            #region 检查收货地址、收货人手机号、收货地区编号是否输入

            if (string.IsNullOrEmpty(model.ReceiveAddress.Address.Trim()))
            {
                result.Status  = false;
                result.Message = "请输入收货地址!";
                return(result);
            }
            if (string.IsNullOrEmpty(model.ReceiveAddress.MobilePhoneNumber.Trim()))
            {
                result.Status  = false;
                result.Message = "请输入收货人手机号!";
                return(result);
            }
            if (model.ReceiveAddress.AreaSysNo == -1)
            {
                result.Status  = false;
                result.Message = "请选择收货地区!";
                return(result);
            }

            #endregion

            #region 支付方式是否为货到付款类型

            BsPaymentType bsPaymentType = PaymentTypeBo.Instance.GetPaymentTypeFromMemory(model.PaymentTypeSysNo);
            if (bsPaymentType == null ||
                bsPaymentType.PaymentType != (int)Hyt.Model.WorkflowStatus.BasicStatus.支付方式类型.到付)
            {
                result.Status  = false;
                result.Message = "支付方式不是货到付款类型!";
                return(result);
            }

            #endregion

            #region 检查是否添加了订单

            if (model.OrderInformations == null || model.OrderInformations.Count == 0)
            {
                result.Status  = false;
                result.Message = "请添加订单再提交!";
                return(result);
            }

            #endregion

            #region 检查订单中的商品订购数量是否超过库存数量

            IList <CBPdProductJson> cbPdProductJsons = Hyt.DataAccess.Warehouse.IWhWarehouseDao.Instance.GetProductLendGoods(model.DeliverymanSysNo,
                                                                                                                             model.LevelSysNo);
            //获取订购数量大于借货单存货数量的订单数
            int orderCount = (from c in cbPdProductJsons
                              join o in model.OrderInformations
                              on c.ProductSysNo equals o.ProductSysNo
                              where o.ProductOrderNumber > c.ProductNum
                              select o).Count();

            if (orderCount > 0)
            {
                result.Status  = false;
                result.Message = "订单中的商品订购数量超过库存数量!";
                return(result);
            }

            #endregion

            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 补单
        /// </summary>
        /// <param name="model">补单实体</param>
        /// <param name="user">当前用户实体</param>
        /// <returns>true:成功,失败抛出异常</returns>
        /// <remarks>2013-07-16 黄伟 创建</remarks>
        /// <remarks>2013-11-15 周唐炬 加入商品借货、EAS业务、恢复配送员信用</remarks>
        private Result CreateOrder(ParaLogisticsControllerAdditionalOrders model, SyUser user)
        {
            var result = new Result {
                Status = false, StatusCode = -1, Message = "补单失败!"
            };
            var so          = new SoOrder();
            var currentTime = DateTime.Now;
            var client      = EasProviderFactory.CreateProvider();  //EAS Provider

            var borrowInfoGroupList = new List <BorrowInfoGroup>(); //EAS还货数据
            var saleInfoGroupList   = new List <SaleInfoGroup>();   //EAS出库分组数据
            var deliveryUser        = SyUserBo.Instance.GetSyUser(model.DeliverymanSysNo);

            #region 补单实体数据
            //保存收货地址
            var address          = model.ReceiveAddress;
            var soReceiveAddress = new SoReceiveAddress
            {
                AreaSysNo         = address.AreaSysNo,
                MobilePhoneNumber = address.MobilePhoneNumber,
                Name          = address.Name,
                PhoneNumber   = address.PhoneNumber,
                StreetAddress = address.Address,
                ZipCode       = address.ZipCode
            };
            //创建收货地址
            ISoReceiveAddressDao.Instance.InsertEntity(soReceiveAddress);

            so.ReceiveAddressSysNo = soReceiveAddress.SysNo;
            so.CustomerSysNo       = model.UserSysNo;
            so.LevelSysNo          = model.LevelSysNo;

            var deliveryType = GetDelTypeByNameLike("普通百城当日"); //普通百城当日
            so.DeliveryTypeSysNo = deliveryType.SysNo;
            so.Remarks           = so.DeliveryRemarks = "补单";
            so.DeliveryTime      = deliveryType.DeliveryTime; //全天

            so.PayTypeSysNo          = model.PaymentTypeSysNo;
            so.DefaultWarehouseSysNo = model.WarehouseSysNo;
            so.CreateDate            = currentTime;
            so.LastUpdateBy          = user.SysNo;
            so.LastUpdateDate        = currentTime;
            so.OrderCreatorSysNo     = user.SysNo;
            //order status related
            so.OrderSource      = (int)OrderStatus.销售单来源.业务员补单;
            so.OrderSourceSysNo = model.DeliverymanSysNo;
            so.PayStatus        = (int)OrderStatus.销售单支付状态.已支付;
            so.SalesSysNo       = 0;
            so.SalesType        = (int)OrderStatus.销售方式.普通订单;
            so.Status           = (int)OrderStatus.销售单状态.已完成;
            so.OnlineStatus     = Constant.OlineStatusType.已发货;

            //创建订单主表
            ISoOrderDao.Instance.InsertEntity(so);
            so = SoOrderBo.Instance.GetEntity(so.SysNo);
            var lstSoOrderItem = new List <SoOrderItem>();
            var soItems        = model.OrderInformations;
            #endregion

            //该商品配送员等级价总金额
            var deliveryPrice = decimal.Zero;

            foreach (var item in soItems)
            {
                var originalPrice = SoOrderBo.Instance.GetOriginalPrice(model.UserSysNo, item.ProductSysNo);
                var soItem        = new SoOrderItem()
                {
                    OrderSysNo           = so.SysNo,
                    OriginalPrice        = originalPrice,
                    ProductName          = item.ProductName,
                    ProductSysNo         = item.ProductSysNo,
                    TransactionSysNo     = so.TransactionSysNo,
                    Quantity             = item.ProductOrderNumber,
                    SalesAmount          = originalPrice * item.ProductOrderNumber,
                    RealStockOutQuantity = item.ProductOrderNumber,
                    ProductSalesType     = (int)CustomerStatus.商品销售类型.普通,
                    SalesUnitPrice       = originalPrice
                };
                so.OrderAmount += originalPrice * item.ProductOrderNumber;
                //创建订单明细
                soItem.SysNo = ISoOrderItemDao.Instance.Insert(soItem);
                lstSoOrderItem.Add(soItem);

                #region 计算商品配送员进货价
                var productLendItem = IProductLendDao.Instance.GetWhProductLendItemInfo(new ParaWhProductLendItemFilter()
                {
                    DeliveryUserSysNo = model.DeliverymanSysNo,
                    ProductSysNo      = item.ProductSysNo,
                    PriceSource       = ProductStatus.产品价格来源.配送员进货价.GetHashCode()
                });
                if (productLendItem != null)
                {
                    deliveryPrice += item.ProductOrderNumber * productLendItem.Price;
                }
                #endregion

                #region 修改借货数量
                //配送员补单的时候,eas 要做还货,然后再做销售出库
                //(即补单完成后,要先调用还货接口、再调用销售出库接口)
                ProductReturn(model.DeliverymanSysNo, item, user.SysNo);

                #endregion

                #region EAS业务数据

                var product = PdProductBo.Instance.GetProduct(item.ProductSysNo);
                if (product == null)
                {
                    continue;
                }
                //重新获取到包含信用等级价格的借货明细
                var productLend = IProductLendDao.Instance.GetWhProductLendItemInfo(new ParaWhProductLendItemFilter()
                {
                    ProductSysNo      = product.SysNo,
                    DeliveryUserSysNo = model.DeliverymanSysNo,
                    PriceSource       = ProductStatus.产品价格来源.配送员进货价.GetHashCode()
                });
                var    warehouse        = WhWarehouseBo.Instance.GetWarehouse(model.WarehouseSysNo);
                var    warehouseErpCode = string.Empty;
                string organizationCode = string.Empty;//组织机构代码
                if (warehouse != null)
                {
                    warehouseErpCode = warehouse.ErpCode;
                    var oraganization = OrganizationBo.Instance.GetOrganization(warehouse.SysNo);
                    if (oraganization != null)
                    {
                        organizationCode = oraganization.Code;
                    }
                }
                if (productLend == null)
                {
                    continue;
                }

                #region EAS还货数据

                var borrowInfoGroup = borrowInfoGroupList.SingleOrDefault(x => x.ProductLendSysNo == productLend.ProductLendSysNo) ?? new BorrowInfoGroup()
                {
                    ProductLendSysNo = productLend.ProductLendSysNo
                };
                var borrowInfo = new BorrowInfo()
                {
                    ErpCode         = product.ErpCode,
                    Quantity        = item.ProductOrderNumber,
                    WarehouseNumber = warehouseErpCode,
                    Amount          = productLend.Price,
                    Remark          = string.Empty,
                    WarehouseSysNo  = model.WarehouseSysNo
                };
                //入库单
                var stockin = IInStockDao.Instance.GetStockInBySource(WarehouseStatus.入库单据类型.借货单.GetHashCode(), productLend.SysNo);
                if (stockin != null)
                {
                    borrowInfoGroup.StockInSysno = stockin.SysNo;
                }
                borrowInfoGroup.BorrowInfoList.Add(borrowInfo);
                //添加到GroupList中
                if (borrowInfoGroupList.All(x => x.ProductLendSysNo != productLend.ProductLendSysNo))
                {
                    borrowInfoGroupList.Add(borrowInfoGroup);
                }
                #endregion

                #region EAS销售出库数据

                //根据借货单编号查询分组数据中的SaleInfo信息
                var saleInfoGroup = saleInfoGroupList.SingleOrDefault(x => x.ProductLendSysNo == productLend.ProductLendSysNo) ?? new SaleInfoGroup()
                {
                    ProductLendSysNo = productLend.ProductLendSysNo
                };
                var saleInfo = new SaleInfo()
                {
                    ErpCode          = product.ErpCode,
                    Quantity         = item.ProductOrderNumber,
                    WarehouseNumber  = warehouseErpCode,
                    WarehouseSysNo   = model.WarehouseSysNo,
                    OrganizationCode = organizationCode,
                    Amount           = originalPrice,
                    //销售出库接口的备注格式:JC[Hyt借货单系统编号]-[借货员姓名]-XS[Hyt订单号]
                    Remark = string.Format("JC[{0}]-[{1}]-XS[{2}],配送方式:百城当日达(补单)", saleInfoGroup.ProductLendSysNo, deliveryUser != null ? deliveryUser.UserName : model.DeliverymanSysNo.ToString(CultureInfo.InvariantCulture), so.SysNo)
                };
                saleInfoGroup.SaleInfoList.Add(saleInfo);
                //添加到Groups中
                if (saleInfoGroupList.All(x => x.ProductLendSysNo != productLend.ProductLendSysNo))
                {
                    saleInfoGroupList.Add(saleInfoGroup);
                }
                #endregion

                #endregion
            }
            #region 恢复配送员信用

            if (deliveryPrice > decimal.Zero)
            {
                DeliveryUserCreditBo.Instance.UpdateRemaining(model.WarehouseSysNo, model.DeliverymanSysNo, 0, deliveryPrice, "补单,单号:" + so.SysNo);
            }
            #endregion

            #region 更新订单、创建收款单、加入订单池、创建配送单配送在途
            //从接口调用金额计算
            so.CashPay = ISoOrderItemDao.Instance.SynchronousOrderAmount(so.SysNo);//同步订单价格
            //so.CashPay = so.OrderAmount; //订单现金支付金额

            //更新订单金额
            so.ProductAmount = so.OrderAmount;

            SoOrderBo.Instance.UpdateOrder(so); //更新订单 余勇修改为调用业务层方法 ISoOrderDao.Instance.Update(so);

            //创建订单收款单
            FnReceiptVoucherBo.Instance.CreateReceiptVoucherByOrder(so);
            SoOrderBo.Instance.WriteSoTransactionLog(so.TransactionSysNo
                                                     , string.Format(Constant.ORDER_TRANSACTIONLOG_CREATE, so.SysNo)
                                                     , user.UserName);
            //补单不用加入订单池
            //创建出库单已签收
            var stockOut = CreateOutStock(lstSoOrderItem, model.WarehouseSysNo, user);

            //配送方式
            var delivertType = DeliveryTypeBo.Instance.GetDeliveryType(so.DeliveryTypeSysNo);

            //创建配送单配送在途
            LgDeliveryBo.Instance.CreateLgDelivery(model.WarehouseSysNo, model.DeliverymanSysNo, delivertType,
                                                   user.SysNo, new List <LgDeliveryItem> {
                new LgDeliveryItem
                {
                    NoteType  = (int)LogisticsStatus.配送单据类型.出库单,
                    NoteSysNo = stockOut.SysNo,
                    ExpressNo = ""
                }
            }, true);

            #endregion

            #region EAS还货
            if (borrowInfoGroupList.Any())
            {
                //摘要:JC[Hyt借出编号]-[借货员姓名]-RK[Hyt入库编号]
                //(如果还货的商品在不同 借货单中,就以借货单明细分开调用)
                borrowInfoGroupList.ForEach(x =>
                {
                    if (x.BorrowInfoList.Count > 0)
                    {
                        client.Return(x.BorrowInfoList, string.Format("JC[{0}]-[{1}]-RK[{2}]", x.ProductLendSysNo,
                                                                      deliveryUser != null ? deliveryUser.UserName : model.DeliverymanSysNo.ToString(),
                                                                      x.StockInSysno), x.ProductLendSysNo.ToString());
                    }
                });
            }
            #endregion

            #region EAS出库
            if (saleInfoGroupList.Any())
            {
                saleInfoGroupList.ForEach(x =>
                {
                    if (x.SaleInfoList.Count > 0)
                    {
                        client.SaleOutStock(x.SaleInfoList, Extra.Erp.Model.EasConstant.HytCustomer, so.SysNo.ToString(), so.TransactionSysNo);
                    }
                });
            }
            #endregion

            //新增会员明细 2014-1-17 黄志勇 添加
            LgSettlementBo.Instance.WriteShopNewCustomerDetail(so.CustomerSysNo, stockOut.StockOutAmount);

            result.Status     = true;
            result.StatusCode = so.SysNo;
            result.Message    = "补单成功!";
            return(result);
        }