GM_JF:客戶總積分表GM_JF_DETAIL:積分明細流水表GM_JF_ACTION_RULES:積分動作規則表(週期、頻次限制)GM_JF_GOODS_RULES:積分商品兌換規則表sp_GM_JF_AddScore功能:新增積分,含重複獲取檢查、事務保證一致性。
| 參數 | 型別 | 說明 |
|---|---|---|
| @ACCOUNT_ID | varchar(30) | 帳戶 ID |
| @JF_CategoryNumber | varchar(15) | 積分類別編碼 |
| @CARD_NUM | int | 卡號/數量 |
| @HQ_JF_AMOUNT | int | 獲得積分數 |
| @State | varchar(16) | 狀態 |
| @USE_DESC | varchar(400) | 備註 |
| @StatusCode | int OUTPUT | 0失敗 1成功 2重複 |
RepetitionsCycle(週期天數)與 RepetitionsFrequency(週期內最大次數)。@realFrequency。@realFrequency >= @repetitionsFrequency 則回傳狀態碼 2(重複獲取),終止。GM_JF_DETAILGM_JF 是否存在該帳戶:@@ERROR <> 0 時回滾,回傳 0。-- 週期換算(天/秒)
IF @repetitionsCycle < 1
SET @repetitionsCycle_second = (@repetitionsCycle - 1) * 86400;
ELSE
SET @repetitionsCycle_second = (@repetitionsCycle - 1) * 86400; -- 實際邏輯需細化
-- 統計實際頻次
SELECT @realFrequency = COUNT(1)
FROM GM_JF_DETAIL
WHERE ACCOUNT_ID = @ACCOUNT_ID
AND JF_CategoryNumber = @JF_CategoryNumber
AND USE_DATE BETWEEN DATEADD(second, -@repetitionsCycle_second, @USE_DATE) AND @USE_DATE;
-- 事務與版本號樂觀鎖
BEGIN TRAN;
INSERT INTO GM_JF_DETAIL ...;
INSERT INTO @temp_table SELECT ... FROM GM_JF WHERE ACCOUNT_ID = @ACCOUNT_ID;
IF (SELECT COUNT(1) FROM @temp_table) = 0
INSERT INTO GM_JF ...;
ELSE
UPDATE GM_JF SET
JF_AMOUNT = JF_AMOUNT + @HQ_JF_AMOUNT,
TTL_JF_AMOUNT = TTL_JF_AMOUNT + @HQ_JF_AMOUNT,
Last_Update_Time = GETDATE(),
[Version] = [Version] + 1
WHERE ACCOUNT_ID = @ACCOUNT_ID;
COMMIT TRAN;
@temp_table 暫存舊值,避免多次查表。[Version] 實現樂觀鎖,防止併發更新丟失。