student 1 месяц назад
Родитель
Сommit
37b7b3d9f8

+ 2 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Program.cs

@@ -7,7 +7,8 @@ using Kitty_Fall.Apis.Business;
 using System.Reflection;
 using System.Xml;
 
-Environment.SetEnvironmentVariable("ORA_SDTZ", "UTC");
+// Myanmar Standard Time. Dung offset de Oracle cu khong phai resolve timezone region.
+Environment.SetEnvironmentVariable("ORA_SDTZ", "+06:30");
 
 XmlDocument log4netConfig = new XmlDocument();
 log4netConfig.Load(File.OpenRead("log4net.config"));

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/appsettings.json

@@ -1,7 +1,7 @@
 {
   //"Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=KittyFall;Password=HHwx4ISVN51cDam;Connection Timeout=120;",
   "Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1539))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=Kitty_Fall;Password=123456;Connection Timeout=120;",
-  "OracleSessionTimeZone": "UTC",
+  "OracleSessionTimeZone": "+06:30",
   "CountryCode": "95",
   "MyIdVerifySubscription": false,
   "MyIdSubscriptionUrl": "https://apis.mytel.com.mm/myid-login/v1.0/api/individual/subscription?offset=0&limit=20",

+ 5 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/Program.cs

@@ -8,7 +8,11 @@ using Microsoft.Extensions.Hosting;
 using System.Reflection;
 using System.Xml;
 
-Environment.SetEnvironmentVariable("ORA_SDTZ", "UTC");
+// Oracle 12c tren moi truong nay khong nhan region Asia/Yangon. Ep driver dung
+// UTC de mo connection; thoi gian nghiep vu van dung MyanmarClock (UTC+06:30).
+Environment.SetEnvironmentVariable("TZ", "UTC");
+Environment.SetEnvironmentVariable("ORA_SDTZ", "+00:00");
+TimeZoneInfo.ClearCachedData();
 
 XmlDocument log4netConfig = new XmlDocument();
 log4netConfig.Load(File.OpenRead("log4net.config"));

+ 6 - 6
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/Services/GameMonthlyWinnerWorker.cs

@@ -37,7 +37,7 @@ namespace Kitty_Fall.Woker.Services
                 {
                     if (GetBool("MonthlyWinner:AutoGenerate", true))
                     {
-                        var now = DateTime.Now;
+                        var now = MyanmarClock.Now;
                         if (TryGetScheduledTargetMonth(now, out var targetMonth, out var scheduledTime))
                         {
                             await ProcessMonthlyWinnerAsync(targetMonth, stoppingToken);
@@ -98,7 +98,7 @@ namespace Kitty_Fall.Woker.Services
                 return;
             }
 
-            var startedAt = DateTime.Now;
+            var startedAt = MyanmarClock.Now;
             // Claim ky quay truoc khi sinh ticket/chon winner. UPDATE co dieu kien bao dam
             // nhieu instance worker khong the cung xu ly mot thang.
             var claimed = await dbContext.GameMonthlyDraws
@@ -129,7 +129,7 @@ namespace Kitty_Fall.Woker.Services
 
         private async Task<GameMonthlyDraw> EnsureDrawAsync(ModelContext dbContext, int monthKey, CancellationToken cancellationToken)
         {
-            var now = DateTime.Now;
+            var now = MyanmarClock.Now;
             var draw = await dbContext.GameMonthlyDraws
                 .FirstOrDefaultAsync(x => x.MonthKey == monthKey, cancellationToken);
 
@@ -161,7 +161,7 @@ namespace Kitty_Fall.Woker.Services
                 return;
             }
 
-            var now = DateTime.Now;
+            var now = MyanmarClock.Now;
             // Chi user dat diem toi thieu moi duoc sinh ticket tham gia giai thang.
             var minScore = GetLong("MonthlyWinner:MinEligibleScore", 5000);
             var minPlay = GetLong("MonthlyWinner:MinEligiblePlay", 1);
@@ -268,7 +268,7 @@ namespace Kitty_Fall.Woker.Services
                 existingWinners.Select(x => x.Msisdn),
                 StringComparer.OrdinalIgnoreCase);
             var random = new Random(BuildSeed(draw.MonthKey));
-            var now = DateTime.Now;
+            var now = MyanmarClock.Now;
             var autoAnnounce = GetBool("MonthlyWinner:AutoAnnounceWinners", false);
             var winnerStatus = autoAnnounce ? WinnerStatusAnnounced : WinnerStatusDraft;
 
@@ -322,7 +322,7 @@ namespace Kitty_Fall.Woker.Services
         {
             if (draw.Status >= DrawStatusCompleted) return;
 
-            var now = DateTime.Now;
+            var now = MyanmarClock.Now;
             draw.Status = DrawStatusCompleted;
             draw.DrawTime ??= now;
             draw.UpdatedTime = now;

+ 8 - 8
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/Services/GameRewardPayoutWorker.cs

@@ -75,7 +75,7 @@ namespace Kitty_Fall.Woker.Services
             {
                 if (cancellationToken.IsCancellationRequested) return;
 
-                var now = DateTime.Now;
+                var now = MyanmarClock.Now;
                 // Claim bang UPDATE co dieu kien de hai instance worker khong the cung tra.
                 var claimed = await dbContext.GameRewardLogs
                     .Where(x => x.RewardLogId == rewardLogId && x.Status == StatusNew)
@@ -96,7 +96,7 @@ namespace Kitty_Fall.Woker.Services
             GameRewardLog rewardLog,
             CancellationToken cancellationToken)
         {
-            var now = DateTime.Now;
+            var now = MyanmarClock.Now;
 
             try
             {
@@ -104,10 +104,10 @@ namespace Kitty_Fall.Woker.Services
                 {
                     // Fallback khong can goi WS thi danh dau xong de khong retry vo nghia.
                     rewardLog.Status = StatusSuccess;
-                    rewardLog.ResponseTime = DateTime.Now;
+                    rewardLog.ResponseTime = MyanmarClock.Now;
                     rewardLog.ResponseCode = "SUCCESS";
                     rewardLog.ResponseMessage = "fallback reward completed";
-                    rewardLog.UpdatedTime = DateTime.Now;
+                    rewardLog.UpdatedTime = MyanmarClock.Now;
                     await dbContext.SaveChangesAsync(cancellationToken);
                     return;
                 }
@@ -150,7 +150,7 @@ namespace Kitty_Fall.Woker.Services
                 var isWaiting = hasResponseCode
                     && responseCode == CommonLogic.AddPointWaiting;
 
-                rewardLog.ResponseTime = DateTime.Now;
+                rewardLog.ResponseTime = MyanmarClock.Now;
                 // DotnetLib tra ma/trang thai cua doi tac trong result.status.
                 rewardLog.ResponseCode = responseStatus
                     ?? (isSuccess
@@ -158,7 +158,7 @@ namespace Kitty_Fall.Woker.Services
                         : CommonLogic.AddPointFailure.ToString(CultureInfo.InvariantCulture));
                 rewardLog.ResponseMessage = Truncate(addPointRes?.message, 500);
                 rewardLog.ExternalTransId = rewardLog.RewardLogId.ToString(CultureInfo.InvariantCulture);
-                rewardLog.UpdatedTime = DateTime.Now;
+                rewardLog.UpdatedTime = MyanmarClock.Now;
 
                 if (isSuccess)
                 {
@@ -201,12 +201,12 @@ namespace Kitty_Fall.Woker.Services
 
                 rewardLog.RetryCount++;
                 rewardLog.Status = StatusFailed;
-                rewardLog.ResponseTime = DateTime.Now;
+                rewardLog.ResponseTime = MyanmarClock.Now;
                 rewardLog.ResponseCode = "EXCEPTION";
                 rewardLog.ResponseMessage = Truncate(
                     $"Manual review required; automatic retry is disabled. {ex.Message}",
                     500);
-                rewardLog.UpdatedTime = DateTime.Now;
+                rewardLog.UpdatedTime = MyanmarClock.Now;
                 await dbContext.SaveChangesAsync(cancellationToken);
             }
         }

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/appsettings.Development.json

@@ -1,7 +1,7 @@
 {
   //"Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=myjob;Password=HHwx4ISVN51cDam;Connection Timeout=120;",
   "Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1539))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=Kitty_Fall;Password=123456;Connection Timeout=120;",
-  "OracleSessionTimeZone": "UTC",
+  "OracleSessionTimeZone": "+00:00",
 
   "wsUrl": "http://127.0.0.1:8199/KittyFallWs?wsdl",
   "wsUser": "ws_KittyFall",

+ 3 - 3
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/appsettings.json

@@ -1,7 +1,7 @@
 {
-  //"Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=myjob;Password=HHwx4ISVN51cDam;Connection Timeout=120;",
-  "Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1539))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=Kitty_Fall;Password=123456;Connection Timeout=120;",
-  "OracleSessionTimeZone": "UTC",
+  "Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.201.42.182)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=kitty_fall;Password=yBwS7bF5pL0qJtJ;Connection Timeout=120;",
+  // "Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1539))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=Kitty_Fall;Password=123456;Connection Timeout=120;",
+  "OracleSessionTimeZone": "+00:00",
 
   "wsUrl": "http://127.0.0.1:8199/KittyFallWs?wsdl",
   "wsUser": "ws_KittyFall",