Просмотр исходного кода

feat: NC-55: 会员转账新规则.

zhangl 1 год назад
Родитель
Сommit
e8e70726e4
1 измененных файлов с 49 добавлено и 16 удалено
  1. 49 16
      common/models/forms/TransferForm.php

+ 49 - 16
common/models/forms/TransferForm.php

@@ -194,21 +194,18 @@ class TransferForm extends Model {
         $initiator = Info::getBaseUserByUserName($fromUser['USER_NAME']);
         // 发起人是否报单中心
         $initiatorIsDec = $initiator['IS_DEC'] == 1;
-        $initiatorId = $initiator['ID'];
 
         // 接受者
         $recipient = Info::getBaseUserByUserName($this->toUserName);
         // 发起人是否报单中心
         $recipientIsDec = $recipient['IS_DEC'] == 1;
-        $recipientId = $recipient['ID'];
 
         // 1. 如果发起人和接受者都是报单中心,则转账无限制
         if (($initiatorIsDec == 1) && ($recipientIsDec == 1)) {
-
+            return true;
         }
 
         // 2. 如果发起人是普通会员,则只能转给自己推荐网的上级某个节点
-        $relation = new Relation();
         if (!$initiatorIsDec) {
             $sql =<<<SQL
                 WITH recursive t_rec AS 
@@ -253,28 +250,64 @@ SQL;
             $relationNodes = array_column($relationNodes, 'USER_NAME');
             unset($relationNodes[$fromUser['USER_NAME']]);
 
-            LoggerTool::debug(json_encode(['$relationNodes', $relationNodes]));
             if (!in_array($this->toUserName, $relationNodes)) {
                 $this->addError($attribute, '转账失败:转入会员不是您的上级');
                 return null;
             }
+
+            return true;
         }
 
         // 3. 如果发起人是报单中心或者普通会员, 则可以转账给自己的推荐网下级
         // 判断接受者是否是自己的推荐网上级某个节点
-        $allowable = $relation->loopRelationParentDo($recipientId, function ($parent) use ($initiatorId) {
-            $parentUser = CalcCache::getUserInfo($parent['PARENT_UID'], $this->_periodNum);
-            if ($parentUser['USER_ID'] == $initiatorId) {
-                return self::LOOP_FINISH;
-            }
+            $sql =<<<SQL
+                WITH recursive t_rec AS 
+                (
+                    SELECT
+                        m.USER_ID,
+                        U.USER_NAME,
+                        m.PARENT_UID,
+                        U2.USER_NAME AS PARENT_NAME,
+                        1 AS node_level 
+                    FROM
+                        AR_USER_RELATION_NEW m 
+                        LEFT JOIN AR_USER U ON U.ID = m.USER_ID
+                        LEFT JOIN AR_USER U2 ON U2.ID = m.PARENT_UID
+                    WHERE
+                        U.USER_NAME = :USER_NAME 
+                        
+                    UNION ALL
+                    
+                    SELECT
+                        t1.USER_ID,
+                        U.USER_NAME,
+                        t1.PARENT_UID,
+                        U2.USER_NAME AS PARENT_NAME,
+                        t2.node_level + 1 -- 结点层级
+                        
+                    FROM
+                        AR_USER_RELATION_NEW t1
+                        JOIN t_rec t2 ON t2.PARENT_UID = t1.USER_ID
+                        LEFT JOIN AR_USER U ON U.ID = t1.USER_ID
+                        LEFT JOIN AR_USER U2 ON U2.ID = t1.PARENT_UID
+                    ) 
+                SELECT
+                    * 
+                FROM
+                    t_rec
+SQL;
+            // 查询接受者的所有上级,如果没有发起人,则不能转账
+            $relationNode = \Yii::$app->db->createCommand($sql)
+                ->bindValue(':USER_NAME' , $this->toUserName)
+                ->queryAll();
 
-            unset($parent);
-        });
+        $relationNode = array_column($relationNode, 'USER_NAME');
 
-        if (!$allowable) {
-            $this->addError($attribute, '转账失败:转入会员不是您的下级');
-            return null;
-        }
+            LoggerTool::debug(json_encode(['$relationNode', $relationNode]));
+            if (!in_array($fromUser['USER_NAME'], $relationNode)) {
+                $this->addError($attribute, '转账失败:转入会员不是您的下级');
+                return null;
+            }
     }
 
     /**