商城-折扣活動設計方案


  • 需求:
  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. 訂單信息表中,必須添加冗余字段:是否參加折扣活動,活動名稱,折扣,折扣后價格

  到此,該邏輯已經完整的清晰了。突然感覺到文字的力量很神奇,苦想了,也沒有理清的業務,文字寫出來后竟然清晰了很多。

 

折扣活動編輯

折扣活動管理

可參加某活動商品

已參加某活動商品


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM