feat: enhance sp_CalculateWeeklyBalances to track package activity and optimize member calculations
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 10m21s
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 10m21s
This commit is contained in:
+114
-33
@@ -24,6 +24,7 @@ BEGIN
|
|||||||
DECLARE @MaxBalancesPerLeg INT;
|
DECLARE @MaxBalancesPerLeg INT;
|
||||||
DECLARE @MaxNetworkLevel INT;
|
DECLARE @MaxNetworkLevel INT;
|
||||||
DECLARE @CalculatedAt DATETIME = GETDATE();
|
DECLARE @CalculatedAt DATETIME = GETDATE();
|
||||||
|
DECLARE @HasPackageActivityUntilWeek BIT = 0;
|
||||||
|
|
||||||
-- تعیین PackageId پیشفرض (پکیج پایه)
|
-- تعیین PackageId پیشفرض (پکیج پایه)
|
||||||
IF @PackageId IS NULL
|
IF @PackageId IS NULL
|
||||||
@@ -66,6 +67,26 @@ BEGIN
|
|||||||
FROM CMS.WeekDefinitions
|
FROM CMS.WeekDefinitions
|
||||||
WHERE Id = @WeekDefinitionId;
|
WHERE Id = @WeekDefinitionId;
|
||||||
|
|
||||||
|
-- اگر تا پایان این هفته هنوز هیچ Cycle برای این پکیج وجود نداشته،
|
||||||
|
-- این پکیج نباید برای هفتههای قبل از شروعش هیچ رکوردی بسازد.
|
||||||
|
IF EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM CMS.ClubMembershipCycles cc
|
||||||
|
WHERE cc.PackageId = @PackageId
|
||||||
|
AND cc.IsDeleted = 0
|
||||||
|
AND cc.PackagePurchasedAt <= @EndDate
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
SET @HasPackageActivityUntilWeek = 1;
|
||||||
|
END
|
||||||
|
|
||||||
|
IF @HasPackageActivityUntilWeek = 0
|
||||||
|
BEGIN
|
||||||
|
SET @RowCount = 0;
|
||||||
|
COMMIT TRANSACTION;
|
||||||
|
RETURN;
|
||||||
|
END
|
||||||
|
|
||||||
-- =============================================
|
-- =============================================
|
||||||
-- 2. بررسی محاسبه قبلی
|
-- 2. بررسی محاسبه قبلی
|
||||||
-- =============================================
|
-- =============================================
|
||||||
@@ -104,7 +125,7 @@ BEGIN
|
|||||||
-- @MaxBalancesPerLeg و @MaxNetworkLevel قبلاً مقداردهی شدهاند
|
-- @MaxBalancesPerLeg و @MaxNetworkLevel قبلاً مقداردهی شدهاند
|
||||||
|
|
||||||
-- =============================================
|
-- =============================================
|
||||||
-- 5. ایجاد جدول موقت برای نتایج
|
-- 5. ایجاد جداول موقت برای نتایج
|
||||||
-- =============================================
|
-- =============================================
|
||||||
CREATE TABLE #Balances (
|
CREATE TABLE #Balances (
|
||||||
UserId BIGINT PRIMARY KEY,
|
UserId BIGINT PRIMARY KEY,
|
||||||
@@ -122,31 +143,18 @@ BEGIN
|
|||||||
SubordinateBalances INT DEFAULT 0
|
SubordinateBalances INT DEFAULT 0
|
||||||
);
|
);
|
||||||
|
|
||||||
-- =============================================
|
CREATE TABLE #LeftNewMembers (
|
||||||
-- 6. دریافت کاربران فعال باشگاه
|
UserId BIGINT PRIMARY KEY,
|
||||||
-- =============================================
|
NewMembersCount INT NOT NULL
|
||||||
INSERT INTO #Balances (UserId)
|
);
|
||||||
SELECT DISTINCT u.Id
|
|
||||||
FROM CMS.Users u
|
CREATE TABLE #RightNewMembers (
|
||||||
INNER JOIN CMS.ClubMemberships cm ON cm.UserId = u.Id AND cm.IsActive = 1
|
UserId BIGINT PRIMARY KEY,
|
||||||
WHERE cm.LastPackageId = @PackageId;
|
NewMembersCount INT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
-- =============================================
|
-- =============================================
|
||||||
-- 7. دریافت باقیمانده هفته قبل
|
-- 6. محاسبه اعضای جدید هر پا با CTE (بهینه!)
|
||||||
-- =============================================
|
|
||||||
IF @PreviousWeekDefinitionId IS NOT NULL
|
|
||||||
BEGIN
|
|
||||||
UPDATE b
|
|
||||||
SET b.LeftLegCarryover = ISNULL(nb.LeftLegRemainder, 0),
|
|
||||||
b.RightLegCarryover = ISNULL(nb.RightLegRemainder, 0)
|
|
||||||
FROM #Balances b
|
|
||||||
LEFT JOIN CMS.NetworkWeeklyBalances nb ON nb.UserId = b.UserId
|
|
||||||
AND nb.WeekDefinitionId = @PreviousWeekDefinitionId
|
|
||||||
AND nb.PackageId = @PackageId;
|
|
||||||
END
|
|
||||||
|
|
||||||
-- =============================================
|
|
||||||
-- 8. محاسبه اعضای جدید هر پا با CTE (بهینه!)
|
|
||||||
-- =============================================
|
-- =============================================
|
||||||
|
|
||||||
-- CTE برای شمارش اعضای جدید شاخه چپ
|
-- CTE برای شمارش اعضای جدید شاخه چپ
|
||||||
@@ -177,13 +185,15 @@ BEGIN
|
|||||||
COUNT(DISTINCT cte.ChildId) AS NewMembersCount
|
COUNT(DISTINCT cte.ChildId) AS NewMembersCount
|
||||||
FROM LeftLegCTE cte
|
FROM LeftLegCTE cte
|
||||||
INNER JOIN CMS.ClubMembershipCycles cc ON cc.UserId = cte.ChildId
|
INNER JOIN CMS.ClubMembershipCycles cc ON cc.UserId = cte.ChildId
|
||||||
WHERE cc.PackagePurchasedAt >= @StartDate AND cc.PackagePurchasedAt <= @EndDate
|
WHERE cc.PackagePurchasedAt >= @StartDate
|
||||||
|
AND cc.PackagePurchasedAt <= @EndDate
|
||||||
|
AND cc.PackageId = @PackageId
|
||||||
|
AND cc.IsDeleted = 0
|
||||||
GROUP BY cte.ParentId
|
GROUP BY cte.ParentId
|
||||||
)
|
)
|
||||||
UPDATE b
|
INSERT INTO #LeftNewMembers (UserId, NewMembersCount)
|
||||||
SET b.LeftLegNewMembers = ISNULL(lnm.NewMembersCount, 0)
|
SELECT UserId, NewMembersCount
|
||||||
FROM #Balances b
|
FROM LeftNewMembers
|
||||||
LEFT JOIN LeftNewMembers lnm ON lnm.UserId = b.UserId
|
|
||||||
OPTION (MAXRECURSION 100);
|
OPTION (MAXRECURSION 100);
|
||||||
|
|
||||||
-- CTE برای شمارش اعضای جدید شاخه راست
|
-- CTE برای شمارش اعضای جدید شاخه راست
|
||||||
@@ -214,14 +224,65 @@ BEGIN
|
|||||||
COUNT(DISTINCT cte.ChildId) AS NewMembersCount
|
COUNT(DISTINCT cte.ChildId) AS NewMembersCount
|
||||||
FROM RightLegCTE cte
|
FROM RightLegCTE cte
|
||||||
INNER JOIN CMS.ClubMembershipCycles cc ON cc.UserId = cte.ChildId
|
INNER JOIN CMS.ClubMembershipCycles cc ON cc.UserId = cte.ChildId
|
||||||
WHERE cc.PackagePurchasedAt >= @StartDate AND cc.PackagePurchasedAt <= @EndDate
|
WHERE cc.PackagePurchasedAt >= @StartDate
|
||||||
|
AND cc.PackagePurchasedAt <= @EndDate
|
||||||
|
AND cc.PackageId = @PackageId
|
||||||
|
AND cc.IsDeleted = 0
|
||||||
GROUP BY cte.ParentId
|
GROUP BY cte.ParentId
|
||||||
)
|
)
|
||||||
|
INSERT INTO #RightNewMembers (UserId, NewMembersCount)
|
||||||
|
SELECT UserId, NewMembersCount
|
||||||
|
FROM RightNewMembers
|
||||||
|
OPTION (MAXRECURSION 100);
|
||||||
|
|
||||||
|
-- =============================================
|
||||||
|
-- 7. انتخاب parentهایی که باید برای این پکیج/هفته row بگیرند
|
||||||
|
-- شرط ورود:
|
||||||
|
-- - عضو فعال باشگاه باشند
|
||||||
|
-- - یا از هفته قبل برای همین پکیج carryover داشته باشند
|
||||||
|
-- - یا این هفته recruit جدید همین پکیج در چپ/راست subtree داشته باشند
|
||||||
|
-- =============================================
|
||||||
|
INSERT INTO #Balances (UserId)
|
||||||
|
SELECT DISTINCT cm.UserId
|
||||||
|
FROM CMS.ClubMemberships cm
|
||||||
|
INNER JOIN CMS.Users u ON u.Id = cm.UserId
|
||||||
|
LEFT JOIN #LeftNewMembers lnm ON lnm.UserId = cm.UserId
|
||||||
|
LEFT JOIN #RightNewMembers rnm ON rnm.UserId = cm.UserId
|
||||||
|
LEFT JOIN CMS.NetworkWeeklyBalances prev ON prev.UserId = cm.UserId
|
||||||
|
AND prev.WeekDefinitionId = @PreviousWeekDefinitionId
|
||||||
|
AND prev.PackageId = @PackageId
|
||||||
|
WHERE cm.IsActive = 1
|
||||||
|
AND u.IsDeleted = 0
|
||||||
|
AND (
|
||||||
|
ISNULL(lnm.NewMembersCount, 0) > 0
|
||||||
|
OR ISNULL(rnm.NewMembersCount, 0) > 0
|
||||||
|
OR ISNULL(prev.LeftLegRemainder, 0) > 0
|
||||||
|
OR ISNULL(prev.RightLegRemainder, 0) > 0
|
||||||
|
);
|
||||||
|
|
||||||
|
-- =============================================
|
||||||
|
-- 8. دریافت باقیمانده هفته قبل + اعمال counts محاسبهشده
|
||||||
|
-- =============================================
|
||||||
|
IF @PreviousWeekDefinitionId IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
UPDATE b
|
||||||
|
SET b.LeftLegCarryover = ISNULL(nb.LeftLegRemainder, 0),
|
||||||
|
b.RightLegCarryover = ISNULL(nb.RightLegRemainder, 0)
|
||||||
|
FROM #Balances b
|
||||||
|
LEFT JOIN CMS.NetworkWeeklyBalances nb ON nb.UserId = b.UserId
|
||||||
|
AND nb.WeekDefinitionId = @PreviousWeekDefinitionId
|
||||||
|
AND nb.PackageId = @PackageId;
|
||||||
|
END
|
||||||
|
|
||||||
|
UPDATE b
|
||||||
|
SET b.LeftLegNewMembers = ISNULL(lnm.NewMembersCount, 0)
|
||||||
|
FROM #Balances b
|
||||||
|
LEFT JOIN #LeftNewMembers lnm ON lnm.UserId = b.UserId;
|
||||||
|
|
||||||
UPDATE b
|
UPDATE b
|
||||||
SET b.RightLegNewMembers = ISNULL(rnm.NewMembersCount, 0)
|
SET b.RightLegNewMembers = ISNULL(rnm.NewMembersCount, 0)
|
||||||
FROM #Balances b
|
FROM #Balances b
|
||||||
LEFT JOIN RightNewMembers rnm ON rnm.UserId = b.UserId
|
LEFT JOIN #RightNewMembers rnm ON rnm.UserId = b.UserId;
|
||||||
OPTION (MAXRECURSION 100);
|
|
||||||
|
|
||||||
-- =============================================
|
-- =============================================
|
||||||
-- 9. محاسبه تعادلها
|
-- 9. محاسبه تعادلها
|
||||||
@@ -354,11 +415,25 @@ BEGIN
|
|||||||
'SP', -- CreatedBy
|
'SP', -- CreatedBy
|
||||||
@CalculatedAt, -- LastModified
|
@CalculatedAt, -- LastModified
|
||||||
'SP' -- LastModifiedBy
|
'SP' -- LastModifiedBy
|
||||||
FROM #Balances;
|
FROM #Balances
|
||||||
|
WHERE LeftLegNewMembers <> 0
|
||||||
|
OR RightLegNewMembers <> 0
|
||||||
|
OR LeftLegCarryover <> 0
|
||||||
|
OR RightLegCarryover <> 0
|
||||||
|
OR LeftLegTotal <> 0
|
||||||
|
OR RightLegTotal <> 0
|
||||||
|
OR TotalBalances <> 0
|
||||||
|
OR LeftLegRemainder <> 0
|
||||||
|
OR RightLegRemainder <> 0
|
||||||
|
OR FlushedPerSide <> 0
|
||||||
|
OR TotalFlushed <> 0
|
||||||
|
OR SubordinateBalances <> 0;
|
||||||
|
|
||||||
SET @RowCount = @@ROWCOUNT;
|
SET @RowCount = @@ROWCOUNT;
|
||||||
|
|
||||||
-- پاکسازی
|
-- پاکسازی
|
||||||
|
DROP TABLE #RightNewMembers;
|
||||||
|
DROP TABLE #LeftNewMembers;
|
||||||
DROP TABLE #Balances;
|
DROP TABLE #Balances;
|
||||||
|
|
||||||
COMMIT TRANSACTION;
|
COMMIT TRANSACTION;
|
||||||
@@ -369,6 +444,12 @@ BEGIN
|
|||||||
ROLLBACK TRANSACTION;
|
ROLLBACK TRANSACTION;
|
||||||
|
|
||||||
-- پاکسازی در صورت خطا
|
-- پاکسازی در صورت خطا
|
||||||
|
IF OBJECT_ID('tempdb..#RightNewMembers') IS NOT NULL
|
||||||
|
DROP TABLE #RightNewMembers;
|
||||||
|
|
||||||
|
IF OBJECT_ID('tempdb..#LeftNewMembers') IS NOT NULL
|
||||||
|
DROP TABLE #LeftNewMembers;
|
||||||
|
|
||||||
IF OBJECT_ID('tempdb..#Balances') IS NOT NULL
|
IF OBJECT_ID('tempdb..#Balances') IS NOT NULL
|
||||||
DROP TABLE #Balances;
|
DROP TABLE #Balances;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user