Как рассчитать комиссионное вознаграждение на основе приведенных членов? - PullRequest
0 голосов
/ 27 марта 2010

Я занимаюсь разработкой небольшого программного обеспечения на C # WPF для консалтинга, который занимается сетевым бизнесом. Я закодировал древовидную структуру, чтобы показать, кто кого послал. Теперь у него есть комиссия в зависимости от уровня. Если 1 сослался на 2 и 3, тогда 1 получит комиссию уровня 1. Если 2 ссылаются на 4, 5 и 3 ссылаются на 6, 7, то 1 получит комиссию уровня 2. Эта цепочка перейдет к определенному общему количеству. Моя проблема в том, как бы я реализовал эту логику; Я могу рассчитать, кто ссылался, сколько членов через UDF написано для добавления TreeViewItem в TreeView. Или подскажите, как я могу считать предметы в древовидной структуре на определенном уровне? Узел добавления UDF:

Я использую MySQL, и в нем есть члены таблицы, состоящие из столбцов: id, полное имя, код ссылки.

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);                       
    }

Помогите мне ПОЖАЛУЙСТА !!!!

1 Ответ

1 голос
/ 28 марта 2010

Расчет такого рода вещей путем подсчета узлов в древовидном представлении довольно глуп, вы будете выполнять вычисления после привязки его к элементу пользовательского интерфейса.

В этом конкретном случае я также не фанат делать это с помощью LINQ, в то время как LINQ будет делать это очень хорошо, у него есть следующие недостатки:

  • вы должны позволить серверу баз данных выполнять тяжелую работу где это возможно , это то, что нужно для
  • если уровни будут добавлены или изменены на каком-то этапе в будущем, это означает, что у вас есть еще несколько мест, требующих рефакторинга
  • может быть проще развернуть изменение в хранимой процедуре базы данных, чем изменение скомпилированного кода

Вы не указали, какую базу данных вы используете, я предполагаю, что SQL. Вы легко сможете рассчитать это, если у вас есть имена людей и ключ к тому, кто их сослал в таблицу самоссылки в базе данных.

Ваш стол будет выглядеть так:

int             RecordID
varchar(100)    Name
int             ReferrerID

Тогда для данных это будет выглядеть так (на примере выше):

_______________________________________________
| RecordID |  Name              |  ReferrerID |
_______________________________________________
|        1 | Person 1           |       null  | 
|        2 | Person 2           |          1  |
|        3 | Person 3           |          1  | 
|        4 | Person 4           |          2  |
|        5 | Person 5           |          2  |
|        6 | Person 6           |          3  |
|        7 | Person 7           |          3  |
_______________________________________________

Я также собираюсь использовать таблицу с именем Levels, в которой указана сумма комиссии за каждый уровень. В этой таблице я назначаю 0,50 для каждого реферала уровня 1 и 0,25 для каждого реферала уровня 2:

int    LevelID
money  LevelAmount  

Теперь, используя свою самоссылающуюся таблицу, вы можете рассчитать, что вам нужно для уровня 1 и уровня 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

Все, что я делаю, - это присоединяюсь к самой таблице для каждого возможного уровня комиссии. Если бы вы вводили комиссию для рефералов 3-го уровня, вы просто добавили бы еще одно объединение.

Если вы запустите это утверждение, вы заметите, однако, что 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             

Я немного прибавил утверждение и ввел несколько имен столбцов. Это создает набор результатов, который выглядит следующим образом:

_____________________________________________________________________________
| 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       |
_____________________________________________________________________________
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...