22,207
社区成员
发帖
与我相关
我的任务
分享
DECLARE @i INT;--循环变量
DECLARE @cnt INT;--循环结束条件
DECLARE @autoId BIGINT;--当前会员的autoId
DECLARE @hongLiToal DECIMAL(18, 3);--当前会员的分红总数
DECLARE @tuiJianCnt INT;--当前会员的直推人数
DECLARE @maxLevel INT;--当前会员应该收取代利的最大层级数
DECLARE @curr HIERARCHYID;--当前会员层级对象
DECLARE @currMemDaiLi DECIMAL(18, 3);--当前会员应收代利总和
DECLARE @daiLi_jinBi DECIMAL(18, 3);--代利的金币
DECLARE @daiLi_zhongZiBi DECIMAL(18, 3);--代利的金种子
DECLARE @daiLi_liuTong DECIMAL(18, 3);--代利的流通市值
DECLARE @daiLi_xiaoFei DECIMAL(18, 3);--代利的消费市值
--所有需要收代利的人,放到这个临时表里
DECLARE @daiLiTempTable TABLE
(
id INT ,--row_number()
autoId BIGINT ,--会员的自增长id
hongLiTotal DECIMAL(18, 3) ,--总共分红的数字
tuiJianCnt INT--直接推荐了几个人
);
--分红未出局比例,出局与未出局比例是不一样的,所以会有两种比例,下面是第二种比例
--k的值是1-9层,v的值是1-9层对应的比例值
DECLARE @dlTable TABLE (k INT, v DECIMAL(18, 3));
INSERT @dlTable
SELECT [level] ,
[rate]
FROM [dbo].[S_DaiLiRate]
WHERE [type] = 1;
--分红出局比例
DECLARE @dlTable2 TABLE (k INT, v DECIMAL(18, 3));
INSERT @dlTable2
SELECT [level] ,
[rate]
FROM [dbo].[S_DaiLiRate]
WHERE [type] = 2;
--当前会员应收每层代利的人数
DECLARE @level_CntTempTable TABLE (level INT, cnt INT);
--初始化所有需要收代利的人
--这里是说除了公司(autoId=1),其它所有有效并且激活的会员都可能收取代利
INSERT @daiLiTempTable
SELECT ROW_NUMBER() OVER (ORDER BY [T1].[autoId] DESC) AS id ,
[T1].[autoId] ,
[T1].[hongLiTotal] ,
(
SELECT COUNT(1)
FROM dbo.D_Member T2
WHERE T2.tuiJianId = T1.autoId
) AS tuiJianCnt
FROM [dbo].[D_Member] T1
WHERE [T1].[status] = 1
AND [T1].[isActive] = 1
AND [T1].[autoId] <> 1;
--初始化循环变量
SELECT @i = 1 ,
@cnt = COUNT(1)
FROM @daiLiTempTable;
BEGIN TRANSACTION;
SET @ERROR = 0;
--循环所有需要收代利的人
WHILE @i <= @cnt
BEGIN
--取到当前人的信息
SELECT @autoId = [autoId] ,
@hongLiToal = [hongLiTotal] ,
@tuiJianCnt = [tuiJianCnt]
FROM @daiLiTempTable
WHERE [id] = @i;
--清空临时表
DELETE @level_CntTempTable;
--如果当前人没有直推会员,则该会员不收代利,直接跳过
IF @tuiJianCnt = 0
BEGIN
SET @i += 1;
CONTINUE;
END;
--设置最大层级数
--直推1人能收取第1层的代利,直推2人能收取第1、2层的代利,……,直推9人或以上,收取第1-9层的代利
SET @maxLevel = CASE WHEN @tuiJianCnt < 9 THEN @tuiJianCnt
ELSE 9
END;
--得到当前会员应收代利每层的人数
SELECT @curr = hierarchy
FROM dbo.D_Member
WHERE autoId = @autoId;
INSERT @level_CntTempTable
SELECT hierarchy.GetLevel() - @curr.GetLevel() ,
COUNT(1)
FROM dbo.D_Member
WHERE hierarchy.IsDescendantOf(@curr) = 1
AND hongLiTotal < 3900
AND status = 1
AND isActive = 1
AND hierarchy.GetLevel() <= @curr.GetLevel() + @maxLevel
GROUP BY hierarchy.GetLevel();
--得到当前会员应收代利总和
--这里就是根据分红出局与未出局算出的当前会员应该能得到多少代利的总和放在@currMemDaiLi变量里
IF @hongLiToal < @sys_maxHongLi
BEGIN
--分红未出局
SELECT @currMemDaiLi = SUM(T.s)
FROM (
SELECT lc.[cnt] * dt.[v] * @sys_hongLi AS s
FROM @level_CntTempTable lc
INNER JOIN @dlTable dt ON [lc].[level] = dt.[k]
) AS T;
END;
ELSE
BEGIN
--分红出局
SELECT @currMemDaiLi = SUM(T.s)
FROM (
SELECT lc.[cnt] * dt.[v] * @sys_hongLi AS s
FROM @level_CntTempTable lc
INNER JOIN @dlTable2 dt ON [lc].[level] = dt.[k]
) AS T;
END;
--这里已经得到当前这个人的应收代利放在@currMemDaiLi变量里
--在下面就是要做插入记录,更新数据库的操作,代码就给省略了,感觉速度慢的原因不会在这里
SET @ERROR += @@ERROR;
SET @i += 1;
END;