為nopcommerce自定義使用者積分功能(2)

weixin_34219944發表於2010-02-23

由於此功能為定製功能,所以不方便把所有程式碼都發上來,而且功能或許還有BUG,有興趣的同學可以一起研究,大家也可以訪問中文站www.nopchina.com或者 www.nopcommerce.org或者加入QQ群101675096一起討論。

積分功能第二部,不瞭解情況的可以先看看第一部

nopcommerce的總體架構我們就不多說了,從WEB到邏輯再到資料庫訪問都有地方要修改,本文主要演示邏輯和資料庫訪問的修改,Web介面上的後邊會提到如何呼叫。

首先我們有一個新的reward point provider,那麼在web.config的sectionGroup裡要加上:<section name=”RewardProvider” type=”NopSolutions.NopCommerce.DataAccess.DBProviderSection, Nop.DataAccess” requirePermission=”false”/>

在nopDataProviders的最後也要加上:

<RewardProvider defaultProvider=”SQLRewardProvider”>
<providers>
<add name=”SQLRewardProvider” type=”NopSolutions.NopCommerce.DataAccess.Promo.SQLRewardProvider, Nop.DataAccess.SqlServer” connectionStringName=”NopSqlConnection”/>
</providers>
</RewardProvider>

NopContext裡也要加個欄位用來儲存當前session下的積分值:

public decimal RewardPoint
{
get {
if (HttpContext.Current.Session["RewardPoint"] == null)
return decimal.Zero;

decimal ret = decimal.Zero;
if (decimal.TryParse(HttpContext.Current.Session["RewardPoint"].ToString(), out ret))
return ret;
else
return decimal.Zero;
}
set
{
HttpContext.Current.Session["RewardPoint"] = value;
}
}

現在再來看資料庫抽象介面的程式碼,各個方法什麼意思想必大家一看就懂:

namespace NopSolutions.NopCommerce.DataAccess.Promo
{
[DBProviderSectionName("nopDataProviders/RewardProvider")]
public abstract partial class DBRewardProvider : BaseDBProvider
{
public abstract bool RewardCalculation(decimal point, int customerID, int orderid, string details);
public abstract DBCustomerCollection CustomerRewardList();
public abstract DBRewardAuditCollection GetAllAuditList(DateTime from, DateTime to);
public abstract DBRewardAuditCollection GetAuditByOrderID(DateTime from, DateTime to, int OrderID);
public abstract bool RewardPointSetTo(decimal point, int customerID, string details);
}
}

DBRewardAudit的定義:

namespace NopSolutions.NopCommerce.DataAccess.Promo
{
public partial class DBRewardAudit : BaseDBEntity
{
public int RewardID { get; set; }
public int OrderID { get; set; }
public DateTime RewardTime { get; set; }
public string Status { get; set; }
public decimal Amount { get; set; }
public string RewardDetails { get; set; }
}
}

按照標配來說還得要個DBRewardAuditCollection,我形式上加了這個檔案,但沒實質內容,如果管理員要求在登入網店後看到歷史記錄,可以用這個。

資料層的DBCustomer還要加上個RewardPoint屬性:

namespace NopSolutions.NopCommerce.DataAccess.CustomerManagement
{
public partial class DBCustomer : BaseDBEntity
{
public decimal RewardPoint { get; set; }
}
}

資料庫層的UpdateCustomer方法的引數要修改,把reward point屬性傳進去,SQL裡update的時候也能更新積分,在這兒就省略了。DBOrder也要加同樣的public decimal RewardPoint { get; set; }屬性。InsertOrder方法也要把RewardPoint包含進來。

具體的資料訪問層,我這兒有個SQLRewardProvider.cs供參考。SQLRewardProvider

然後再看看業務邏輯層的RewardManager.cs,RewardManager,簡單的程式碼,就不用再描述了。

OK到這兒大部分介面已經實現了,只等客戶端程式碼呼叫了,所有的邏輯層,web層的程式碼都可以稱為客戶端程式碼,那麼我們來試試下訂單後消耗積分的情況。OrderManager.cs 中的PlaceOrder,

….

Order order = InsertOrder(OrderGuid,    //這兒注意,用剛才修改過的方法,把積分傳進去。

….

等有了OrderID = order.OrderID;這句,訂單也生成了,那麼就要扣掉相應的積分了,直接在這句後邊加上:

//reward function
if (NopContext.Current.RewardPoint > customer.RewardPoint)//reward point cannot greater than customer’s point.
NopContext.Current.RewardPoint = customer.RewardPoint;

if (OrderID >= 0 && NopContext.Current.RewardPoint > decimal.Zero)//success, deduct reward points
RewardManager.RewardCalculation(decimal.Zero – NopContext.Current.RewardPoint, customer.CustomerID, OrderID,”Order placed with ” + RewardManager.RewardName + NopContext.Current.RewardPoint.ToString());

然後再接著往下走找到SendOrderPlacedStoreOwnerNotification和SendOrderPlacedCustomerNotification,裡邊的方法改改,讓email可以支援reward point的訊息:

首先要定義這些訊息的token是什麼,在GetListOfAllowedTokens裡新增:

//added comments and reward points – by dingsea:
allowedTokens.Add(“%Order.RewardPointApplied%”);
allowedTokens.Add(“%Customer.CurrentRewardPoint%”);
allowedTokens.Add(“%Customer.WinRewardPoint%”);
allowedTokens.Add(“%Settings.RewardName%”);
//ends here.

ReplaceMessageTemplateTokens里加上如下欄位以方便在正則替換的時候找到對應的文字:

//added: dingsea
tokens.Add(“Order.RewardPointApplied”, HttpUtility.HtmlEncode(order.RewardPoint.ToString(“N2″)));
tokens.Add(“Customer.WinRewardPoint”,HttpUtility.HtmlEncode((order.OrderTotal * RewardManager.RewardPercentage).ToString(“N2″)));
tokens.Add(“Customer.CurrentRewardPoint”,HttpUtility.HtmlEncode(NopContext.Current.User.RewardPoint.ToString(“N2″)));
tokens.Add(“Settings.RewardName”,HttpUtility.HtmlEncode(RewardManager.RewardName));

既然都到這裡了,那也把nopcommerce的一個小BUG也補上:

ProductListToHtmlTable方法中沒有打折資訊(在order details頁面也有同樣問題,同學們自行加上吧),所以我把打折和積分資訊一起加上了:

//fixed by dingsea – discount is missing
string CusDiscount = string.Empty;
string CusRewardPoint = string.Empty;

……

//fixed by dingsea – discount and reward point
CusDiscount = order.OrderDiscount == decimal.Zero ? string.Empty : PriceHelper.FormatPrice(order.OrderDiscount, true, order.CustomerCurrencyCode, language, false);
CusRewardPoint = order.RewardPoint.ToString(“N2″);

…….

//fixed by dingsea – discount and reward point
if(CusDiscount!=string.Empty)
sb.AppendLine(“<tr><td style=\”text-align:right;\” colspan=\”3\”><strong>” + LocalizationManager.GetLocaleResourceString(“ShoppingCart.Sub-TotalDiscount”, LanguageID) + “</strong></td> <td style=\”text-align:right;\”><strong>” + CusDiscount + “</strong></td></tr>”);
sb.AppendLine(“<tr><td style=\”text-align:right;\” colspan=\”3\”><strong>” + LocalizationManager.GetLocaleResourceString(“Promotion.RewardPointName”, LanguageID) + “</strong></td> <td style=\”text-align:right;\”><strong>” + CusRewardPoint + “</strong></td></tr>”);
//fix ends

於是呼,在你的template->message template裡訂單生成時向使用者和店主發的email裡就可以支援積分的token了。

至於在web如何呼叫,那就比較容易了,在你想要的頁面加上一個textbox,確保使用者輸入的是decimal,那就夠了,這個數字會存到session裡直到使用者下單。而且在管理介面,利用rewardmanager的方法可以直接操作積分,方便快捷。

 

相關文章