如何在.NET中以REST API的形式实现POS现金终端存储机?

问题描述 投票:0回答:1

我正在处理一个(大学项目)项目,由于我是 .NET 的新手,我需要一些帮助来了解什么是最适合我的需求的方法。

我正在编写一个饮料机,具有购买 1 瓶类型的功能(整数类型,0=水,1=橙汁等..)。

现在机器开始时每种类型有 5 瓶。我是否应该为机器本身创建一个新的模型类(具有 id、bottle_water_amount 等属性),然后将

DbSet<ATMMachine>
添加到
APIContext
,然后我可以访问
_context.ATMMachines.First()
来获取第一个(也是唯一的)代表这台机器的行。

这个方法看起来不错吗?这是不好的做法吗?我该如何处理这个问题?

谢谢你:)

c# .net rest entity-framework point-of-sale
1个回答
0
投票

我给你举个例子。作为一名程序员,您希望在代码中表示事物,就像它们在现实生活中一样。

对于人造事物使用小数、长整型和整数,对于自然事物使用浮点数和双精度数。

所以让我们这样做吧!我们需要一个现金终端,即销售点机器。它将需要保存产品,如果我们想在业务上取得好成绩,我们还需要应用折扣:) 产品将有名称、价格、包装价格、税率,也许还有条形码和类别。

设计完类(我将其包含在 GitHub 中)后,您就可以采用代码优先方法来生成 EF 数据库和上下文。您将在此处更改工厂模式

CreateProduct
CreateDiscounts
以执行数据库 INSERT 操作(在 EF 代码中:
dbContext.Product.Add(item);
),并将这些类转变为更多的存储库模式。

由于这是一项大学作业,我会自己添加数据库功能,为了获得额外分数,请尝试构建 Winform/WPF 前端或将方法转换为 REST API,并使用 PointOfSaleTerminal 作为控制器,控制台非常适合看看代码是如何工作的,并添加一个免责声明,表明您是基于此代码进行设计的 - 因为该存储库现在是公开的...... https://github.com/MeaningOfLights/CashTerminal

public class PointOfSaleTerminal : IPointOfSaleTerminal
{
    private readonly IEnumerable<IDiscount> _discounts;
    private readonly List<ProductQuantity> _productItems;

    public PointOfSaleTerminal(IEnumerable<IDiscount> discounts)
    {
        _discounts = discounts ?? throw new ArgumentNullException(nameof(discounts));           // You wont do well in business if you can't discount stock.
        _productItems = new List<ProductQuantity>(); // Store ShoppingCart
    }

    public void AddProducts(IEnumerable<ProductQuantity> productItems)
    {
        _productItems.AddRange(productItems);       // Someone buys an item
    }

    public int ProductCount => _productItems.Count;  // For a FrontEnd you might bind the ShoppingCart to the ProductCount

    public decimal SubTotal =>  _productItems.Sum(item => item.Product.UnitPrice * item.Quantity);  // For a FrontEnd you might bind the ShoppingCart to the Total Price

    public IEnumerable<AppliedDiscount> GetBasketDiscounts()
    {
        var discounts = new List<AppliedDiscount>();

        foreach (var discount in _discounts)
        {
            discounts.AddRange(discount.DiscountsApplicable(_productItems));
        }

        if (!discounts.Any())
            discounts.Add(new AppliedDiscount
            {
                Type = DiscountType.None,
                Text = "(No offers available)",
                Amount = 0.00m
            });           

        return discounts;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.