C# 如何根据所引用的成员计算佣金?
我正在为一家从事连锁系统业务的咨询公司开发一个C#WPF小软件。我对树结构进行了编码,以显示谁引用了谁。现在它有佣金取决于级别。如果1提及2和3,则1将获得1级佣金。如果2号提交4号、5号和3号提交6号、7号,则1号将获得2级佣金。这条链将继续到一定的总数。我的问题是如何实现这个逻辑;我能够计算出谁通过UDF推荐了多少成员,这些成员是为向TreeView添加TreeView而编写的。或者告诉我如何在特定级别计算treeview中的项目节点添加自定义项: 我使用的是MySQL,它有表成员,包括列id、fullname和refercodeC# 如何根据所引用的成员计算佣金?,c#,wpf,treeview,C#,Wpf,Treeview,我正在为一家从事连锁系统业务的咨询公司开发一个C#WPF小软件。我对树结构进行了编码,以显示谁引用了谁。现在它有佣金取决于级别。如果1提及2和3,则1将获得1级佣金。如果2号提交4号、5号和3号提交6号、7号,则1号将获得2级佣金。这条链将继续到一定的总数。我的问题是如何实现这个逻辑;我能够计算出谁通过UDF推荐了多少成员,这些成员是为向TreeView添加TreeView而编写的。或者告诉我如何在特定级别计算treeview中的项目节点添加自定义项: 我使用的是MySQL,它有表成员,包括列i
public void AddNodes(int uid, TreeViewItem tSubNode)
{
string query = "select fullname, id from members where refCode=" + uid + ";";
MySqlCommand cmd = new MySqlCommand(query, db.conn);
MySqlDataAdapter _DA = new MySqlDataAdapter(cmd);
DataTable _DT = new DataTable();
tSubNode.IsExpanded = true;
_DA.Fill(_DT);
foreach (DataRow _dr in _DT.Rows)
{
TreeViewItem tNode = new TreeViewItem();
tNode.Header = _dr["fullname"].ToString()+" ("+_dr["id"].ToString()+")";
tSubNode.Items.Add(tNode);
if (db.HasMembers(Convert.ToInt32(_dr["id"].ToString())))
{
AddNodes(Convert.ToInt32(_dr["id"]), tNode);
}
}
//This line tracks who has referred how many members
Console.WriteLine("Tree node Count : "+tSubNode.Items.Count.ToString()+", UID "+uid);
}
请帮帮我通过计算树视图中的节点来计算这类事情是非常愚蠢的,您将在将其绑定到UI元素后进行计算 在这种情况下,我也不喜欢使用LINQ,虽然LINQ会做得很好,但它有以下缺点:
- 在可能的情况下,您应该让数据库服务器来完成这项艰巨的工作,这就是它的目的
- 如果在将来的某个阶段添加或更改级别,这意味着您还有几个位置需要重构
- 对数据库存储过程进行更改比对编译代码进行更改更容易
int RecordID
varchar(100) Name
int ReferrerID
_____________________________________________________________________________
| Commission | Commission | Number | Level 1 | Number | Level 2 |
| Earner ID | Earner | of L1 | Commission | of L2 | Commission |
| | Name | Referrals | | Referrals | |
_____________________________________________________________________________
| 1 | Person 1 | 2 | 1.00 | 4 | 1.00 |
| 2 | Person 2 | 2 | 1.00 | 0 | 0.00 |
| 3 | Person 3 | 2 | 1.00 | 0 | 0.00 |
| 4 | Person 4 | 0 | 0.00 | 0 | 0.00 |
| 5 | Person 5 | 0 | 0.00 | 0 | 0.00 |
| 6 | Person 6 | 0 | 0.00 | 0 | 0.00 |
| 7 | Person 7 | 0 | 0.00 | 0 | 0.00 |
_____________________________________________________________________________
然后对于数据,它将如下所示(使用上面的示例):
我还将使用一个名为Levels
的表,其中包含每个级别的佣金金额。在本表中,我为每个1级转诊分配0.50,为每个2级转诊分配0.25:
int LevelID
money LevelAmount
现在,使用自引用表,您可以通过将其自身连接两次来计算level 1和level 2所需的内容。此sql将为您提供初始表:
SELECT p.RecordID
,p.PersonName
,Level1Referral.PersonName
,Level1Commission.LevelAmount
,Level2Referral.PersonName
,Level2Commission.LevelAmount
FROM People p
LEFT JOIN People Level1Referral
ON Level1Referral.ReferrerID = p.RecordID
LEFT JOIN Levels Level1Commission
ON Level1Referral.ReferrerID IS NOT NULL
AND Level1Commission.LevelID = 1
LEFT JOIN People Level2Referral
ON Level2Referral.ReferrerID = Level1Referral.RecordID
LEFT JOIN Levels Level2Commission
ON Level2Referral.ReferrerID IS NOT NULL
AND Level2Commission.LevelID = 2
我所做的就是为每个可能的佣金级别加入表本身,如果您要为第三级推荐引入佣金,那么您只需添加另一个加入即可
如果运行此语句,您会注意到Level1Referral.PersonName
对于每个级别2的引用都有一个重复的条目,但这不是最佳的,并且不容易通过分组进行计算。但是,我们可以做的是使用一个周围的SELECT语句并对其进行分组,在此过程中计算每个级别的佣金金额。下面是完成所需操作的最后一条SQL语句:
SELECT CommissionEarnerID
,CommissionEarnerName
,COUNT(DISTINCT L1Referral) AS [Number Of L1 Referrals]
,COUNT(DISTINCT L1Referral)
* (SELECT LevelAmount
FROM Levels
WHERE LevelID = 1) AS [Level 1 Commission]
,COUNT(DISTINCT L2Referral) AS [Number Of L2 Referrals]
,COUNT(DISTINCT L2Referral)
* (SELECT LevelAmount
FROM Levels
WHERE LevelID = 2) AS [Level 2 Commission]
FROM (
SELECT p.RecordID AS CommissionEarnerID
,p.PersonName AS CommissionEarnerName
,Level1Referral.RecordID AS L1Referral
,Level1Referral.PersonName AS L1ReferralName
,Level2Referral.RecordID AS L2Referral
,Level2Referral.PersonName AS L2ReferralName
FROM People p
LEFT JOIN People Level1Referral
ON Level1Referral.ReferrerID = p.RecordID
LEFT JOIN People Level2Referral
ON Level2Referral.ReferrerID = Level1Referral.RecordID
) x
GROUP BY CommissionEarnerID
,CommissionEarnerName
我把声明整理了一下,并加了几个列名。这将生成如下所示的结果集:
int RecordID
varchar(100) Name
int ReferrerID
_____________________________________________________________________________
| Commission | Commission | Number | Level 1 | Number | Level 2 |
| Earner ID | Earner | of L1 | Commission | of L2 | Commission |
| | Name | Referrals | | Referrals | |
_____________________________________________________________________________
| 1 | Person 1 | 2 | 1.00 | 4 | 1.00 |
| 2 | Person 2 | 2 | 1.00 | 0 | 0.00 |
| 3 | Person 3 | 2 | 1.00 | 0 | 0.00 |
| 4 | Person 4 | 0 | 0.00 | 0 | 0.00 |
| 5 | Person 5 | 0 | 0.00 | 0 | 0.00 |
| 6 | Person 6 | 0 | 0.00 | 0 | 0.00 |
| 7 | Person 7 | 0 | 0.00 | 0 | 0.00 |
_____________________________________________________________________________
为什么要在这里重新发明轮子?您正在使用.NET3.5+,是否应该尝试使用LINQtoSQL,以便它为您构建正确的模型。您的问题的答案将是递归导航成员佣金树。