zoukankan      html  css  js  c++  java
  • 商城-折扣活动设计方案

    • 需求:
    1. 折扣管理:
      1. 商品支持打折活动,打折活动支持多种形式;
      2. 活动折扣要求:大于0,小于10,允许包含一位小树;
      3. 一旦折扣活动创建后,不可以修改折扣;
    2. 促销管理:
      1. 可以按照折扣活动查询对应参与活动的商品,显示对应活动商品的原价,折扣,减价,折扣后;
      2. 允许商家查看可以参加某活动的商品,且一个商品最多允许参加一个活动即使活动已经过期,必须取消已参与的其他活动后,才能参加另外一个活动;
      3. 设置某产品参加某活动时,默认按照该活动的折扣进行计算折扣、减价、折扣后,但也允许用户手动修改某个商品或者批量改变某几个商品的折扣,或者减价。
    • 受影响的业务:

      目前系统中,关于购物添加了该业务还会影响业务地方:

    1. 商品展示信息:当展示商品信息时,需要判定该商品是否参加了活动;
      1. 如果参加了活动,那么就要显示活动信息,同时根据对该产品定制的活动信息改变对应的折扣后价格,折扣信息。
      2. 这里提到“商品定制的活动信息”,它是在促销管理添加某个活动时,生成的一条记录,所有的参加了折扣活动的商品都有一个条这样的信息;
        1. 如何判断某个商品是否已经参加了活动,就是根据商品ID从“商品定制的活动信息”查询,是否记录。
        2. 但删除某个折扣活动时,会提示:“如果该折扣活动已经被其他商品使用,删除后参与该活动的商品将取消活动,是否继续?”,也就是说,当删除了某个折扣活动,将会从“商品定制的活动信息”中删除该活动下的所有记录。
      3. 如果没有参加活动,那么商品将不会显示活动信息,没有折扣、折扣价信息。
    2. 购物车信息:当展示商品信息时,需要判定该商品是否参加了活动;
      1. 如果参加了活动,那么就要显示活动信息,同时根据对该产品定制的活动信息改变对应的折扣后价格,折扣信息。
      2. 如果没有参加活动(只有当该商品参与的活动在活动期间,且已经开启的情况下),那么商品将不会显示活动信息,没有折扣、折扣价信息.
      3. 在某个商品价格小计是,如果有折扣活动(只有当该商品参与的活动在活动期间,且已经开启的情况下)需要按照折扣后价格进行计算;
      4. 在计算总价时,如果有折扣活动()需要按照折扣后价格进行汇总;
    3. 订单信息:
      1. 在生成需要支付总价格时,需要取值为购物车中的总价格--购物车中的总价格是更具商品ID,查询到对应信息()进而综合计算的总价;
      2. 购物车中总价,及订单中的总价,不能靠cookie中的信息,很危险,一定要从数据库中查询计算得到总价。
    4. 订单商品信息:
      1. 订单商品信息中的必须要保存的字段:商品价格,是否参加折扣活动,活动名称,折扣,折扣后价格。为什么要显示这些信息?为了跟踪产品价格,避免别人订单信息无法追踪。
      2. 当然这里“是否参加折扣活动”字段,只有当该商品参与的活动在活动期间,且已经开启的情况下,才标识为true.
      3. 用来冗余:一旦取消了某个折扣活动,但若某个已经参加了该活动且已经包含在订单商品中,在取消活动后,这时就无法知道用户提交时,是否参与过什么活动。
    • 开发
    1. 添加表“活动信息”
      1. 脚本:
        /****** Object:  Table [dbo].[cx_GoodsMarketingCampaignCategory]    Script Date: 05/23/2015 11:17:53 ******/
        SET ANSI_NULLS ON
        GO
        
        SET QUOTED_IDENTIFIER ON
        GO
        
        CREATE TABLE [dbo].[cx_GoodsMarketingCampaignCategory](
            [ID] [int] IDENTITY(1,1) NOT NULL,
            [Title] [nvarchar](64) NOT NULL,
            [Discount] [decimal](9, 1) NOT NULL,
            [IsWipingPoints11] [bit] NOT NULL,
            [IsWipingPoints01] [bit] NOT NULL,
            [BeginDate] [datetime] NOT NULL,
            [EndDate] [datetime] NOT NULL,
            [Enabled] [bit] NOT NULL,
            [SortID] [int] NOT NULL,
            [ModifyDate] [datetime] NOT NULL,
            [CreateDate] [datetime] NOT NULL,
         CONSTRAINT [PK_cx_GoodsMarketingCampaignCategory] PRIMARY KEY CLUSTERED 
        (
            [ID] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]
        
        GO
        
        ALTER TABLE [dbo].[cx_GoodsMarketingCampaignCategory] ADD  CONSTRAINT [DF_cx_GoodsMarketingCampaignCategory_CreateDate]  DEFAULT (getdate()) FOR [CreateDate]
        GO
    2. 添加表“商品定制的活动信息
      1. 脚本:
         1 SET ANSI_NULLS ON
         2 GO
         3 
         4 SET QUOTED_IDENTIFIER ON
         5 GO
         6 
         7 CREATE TABLE [dbo].[cx_GoodsMarketingCampaign](
         8     [ID] [int] IDENTITY(1,1) NOT NULL,
         9     [GoodsID] [int] NOT NULL,
        10     [GoodsMarketingCampaignCategoryOID] [int] NOT NULL,
        11     [Discount] [decimal](9, 1) NOT NULL,
        12     [CreateDate] [datetime] NOT NULL,
        13     [ModifyDate] [datetime] NOT NULL,
        14  CONSTRAINT [PK_cx_GoodsMarketingCampaign] PRIMARY KEY CLUSTERED 
        15 (
        16     [ID] ASC
        17 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        18 ) ON [PRIMARY]
        19 
        20 GO
      2. Discount,就是商品参加活动时设置的折扣,为了避免店主修改某个商品的价格后折扣后价格没有发生变化,这里就就没有保存折扣价、折扣价格,当界面显示查看某个参加活动商品折扣,折扣后价格时,动态生成该“折扣后价格”。
         1 Declare @GoodsID Int;
         2 Declare @NowDateTime Datetime;
         3 
         4 Set @GoodsID=1;
         5 Set @NowDateTime=GETDATE();
         6 
         7 -- 获取参与过活动的产品的原始价格,活动折扣,折扣后价格
         8 Select 
         9     T11.SellPrice,
        10     T12.Discount,
        11     (Case When T13.IsWipingPoints01=1 Then Round(T11.SellPrice*T12.Discount,1) 
        12         When T13.IsWipingPoints11=1 Then ROUND(T11.SellPrice*T12.Discount,0)
        13     Else Round(T11.SellPrice*T12.Discount,2) End) as RealPrice
        14 From cx_Article as T10 
        15     inner join cx_ArticleAttributeValue as T11 on T10.ID=T11.ArticleID
        16     inner join cx_ArticleGoodsMarketingCampaign as T12 on T10.ID=T12.ArticleID
        17     inner join cx_GoodsMarketingCampaignCategory as T13 on T12.GoodsMarketingCampaignCategoryOID=T13.ID
        18 Where T13.[Enabled]=1
        19     and T13.BeginDate<=@NowDateTime and T13.EndDate>@NowDateTime
      3. 怎么判断该商品活动是否有效,需要关联到“活动信息”表:
         1 Declare @GoodsID Int;
         2 Declare @NowDateTime Datetime;
         3 
         4 Set @GoodsID=1;
         5 Set @NowDateTime=GETDATE();
         6 
         7 -- 判断是否该产品是否参与过有效活动
         8 Select COUNT(T10.ID)
         9 From cx_Article as T10 
        10     inner join cx_ArticleGoodsMarketingCampaign as T11 on T10.ID=T11.ArticleID
        11     inner join cx_GoodsMarketingCampaignCategory as T12 on T11.GoodsMarketingCampaignCategoryOID=T12.ID
        12 Where T12.[Enabled]=1
        13     and T12.BeginDate<=@NowDateTime and T12.EndDate>@NowDateTime 
    3. 修改表“订单商品信息”阿萨德
      1. 订单信息表中,必须添加冗余字段:是否参加折扣活动,活动名称,折扣,折扣后价格

      到此,该逻辑已经完整的清晰了。突然感觉到文字的力量很神奇,苦想了,也没有理清的业务,文字写出来后竟然清晰了很多。

    折扣活动编辑

    折扣活动管理

    可参加某活动商品

    已参加某活动商品

  • 相关阅读:
    前端工程化
    前端模块化CommonJS&ES6
    为什么浮点型运算结果会有误差?
    RequestAnimationFrame知多少?
    CSS三栏布局
    秋招面试
    实现Storage
    Angular
    TypeScript
    微服务架构设计模式
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/4523872.html
Copyright © 2011-2022 走看看