Ver Fonte

nâng cấp cấu hình fomat trả thưởng theo mytel

student há 1 dia atrás
pai
commit
f910066a05

+ 4 - 0
Kitty_Fall/Kitty_Fall/Common/CommonConstants.cs

@@ -199,6 +199,10 @@ namespace Common
 
     public static class CommonErrorCode
     {
+        public const int AddPointSuccess = 0;
+        public const int AddPointFailure = -1;
+        public const int AddPointWaiting = 100;
+
         // http code
         public const string WAITING_OTP = "100";
         public const int USER_EXISTED = 2;

+ 3 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/Kitty_Fall.Woker.csproj

@@ -27,6 +27,9 @@
   <ItemGroup>
     <ProjectReference Include="..\Common\Common.csproj" />
     <ProjectReference Include="..\Database\Database.csproj" />
+    <Reference Include="DotnetLib">
+      <HintPath>..\..\lib\DotnetLib.dll</HintPath>
+    </Reference>
   </ItemGroup>
 
 </Project>

+ 77 - 82
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/Services/GameRewardPayoutWorker.cs

@@ -1,12 +1,10 @@
 using Common;
 using Database.Database;
-using Kitty_FallVasWs;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using Microsoft.EntityFrameworkCore;
 using System.Globalization;
-using System.ServiceModel;
 
 namespace Kitty_Fall.Woker.Services
 {
@@ -55,7 +53,7 @@ namespace Kitty_Fall.Woker.Services
 
             var batchSize = GetInt("RewardWorker:BatchSize", 20);
 
-            // Chi lay NEW de moi reward chi duoc tu dong goi WS mot lan.
+            // Chi lay NEW de moi reward chi duoc tu dong cong mot lan.
             // FAILED va PROCESSING (ke ca sau restart) phai duoc admin doi soat thu cong,
             // tuyet doi khong tu retry vi ket qua phia WS co the da thanh cong.
             var rewardLogIds = await dbContext.GameRewardLogs
@@ -116,20 +114,31 @@ namespace Kitty_Fall.Woker.Services
                     return;
                 }
 
-                var wsResponse = await CallRewardWsAsync(rewardLog);
-                var response = wsResponse.Response;
-                var isSuccess = IsWsSuccess(response);
+                var addPointRes = DotnetLib.Mytel.AddingPointLogic.AddingPointHandler(
+                    log,
+                    configuration,
+                    rewardLog.Msisdn,
+                    rewardLog.RewardLogId.ToString(CultureInfo.InvariantCulture),
+                    GetPackageName(rewardLog));
+                var isSuccess = addPointRes?.success == true;
 
                 rewardLog.ResponseTime = DateTime.Now;
-                rewardLog.ResponseCode = response?.errorCode ?? response?.resultCode ?? (isSuccess ? "0" : "-1");
-                rewardLog.ResponseMessage = Truncate(response?.content ?? response?.status ?? wsResponse.RawMessage, 500);
-                rewardLog.ExternalTransId = Truncate(response?.resultCode ?? rewardLog.ExternalTransId ?? rewardLog.ChildTransId, 100);
+                // DotnetLib tra ma/trang thai cua doi tac trong result.status.
+                rewardLog.ResponseCode = addPointRes?.result?.status
+                    ?? (isSuccess
+                        ? CommonErrorCode.AddPointSuccess.ToString(CultureInfo.InvariantCulture)
+                        : CommonErrorCode.AddPointFailure.ToString(CultureInfo.InvariantCulture));
+                rewardLog.ResponseMessage = Truncate(addPointRes?.message, 500);
+                rewardLog.ExternalTransId = rewardLog.RewardLogId.ToString(CultureInfo.InvariantCulture);
                 rewardLog.UpdatedTime = DateTime.Now;
 
                 if (isSuccess)
                 {
                     rewardLog.Status = StatusSuccess;
                     await UpdateLimitUsageAsync(dbContext, rewardLog, now, cancellationToken);
+                    await dbContext.SaveChangesAsync(cancellationToken);
+                    await SendSuccessMtAsync(dbContext, rewardLog, cancellationToken);
+                    return;
                 }
                 else
                 {
@@ -158,6 +167,63 @@ namespace Kitty_Fall.Woker.Services
             }
         }
 
+        private static async Task SendSuccessMtAsync(
+            ModelContext dbContext,
+            GameRewardLog rewardLog,
+            CancellationToken cancellationToken)
+        {
+            var paramName = string.Equals(
+                rewardLog.RewardType,
+                "DATA",
+                StringComparison.OrdinalIgnoreCase)
+                ? "EXCHANGE_DATA_SUCCESS"
+                : "EXCHANGE_LOYALTY_SUCCESS";
+
+            var msg = await dbContext.Configs
+                .AsNoTracking()
+                .FirstOrDefaultAsync(x => x.ParamName == paramName, cancellationToken);
+            var messageData = msg?.ParamValueFr ?? msg?.ParamValue;
+            if (string.IsNullOrWhiteSpace(messageData))
+            {
+                log.Warn($"Success MT template not found. paramName={paramName}, rewardLogId={rewardLog.RewardLogId}");
+                return;
+            }
+
+            var rewardValue = FormatRewardValue(rewardLog.RewardValue);
+            var point = string.Equals(
+                rewardLog.RewardType,
+                "LOYALTY",
+                StringComparison.OrdinalIgnoreCase)
+                ? rewardValue
+                : "0";
+            var data = string.Equals(
+                rewardLog.RewardType,
+                "DATA",
+                StringComparison.OrdinalIgnoreCase)
+                ? rewardValue
+                : "0";
+            var message = messageData
+                .Replace(
+                    "%point%",
+                    point)
+                .Replace(
+                    "%data%",
+                    data)
+                .Replace(
+                    "%date%",
+                    rewardLog.CreatedTime.ToString(CommonConstants.DateTimeFormar12));
+
+            try
+            {
+                await CommonLogic.SendMtToUserAsync(dbContext, rewardLog.Msisdn, message);
+            }
+            catch (Exception ex)
+            {
+                // Cong thuong da thanh cong nen loi tao MT khong duoc doi reward thanh FAILED.
+                log.Error($"Send success MT error. rewardLogId={rewardLog.RewardLogId}, paramName={paramName}", ex);
+            }
+        }
+
         private async Task<LimitCheckResult> ApplyLimitBeforePayoutAsync(
             ModelContext dbContext,
             GameRewardLog rewardLog,
@@ -288,67 +354,6 @@ namespace Kitty_Fall.Woker.Services
             usage.UpdatedTime = now;
         }
 
-        private async Task<RewardWsResult> CallRewardWsAsync(GameRewardLog rewardLog)
-        {
-            var wsUrl = GetString("wsUrl");
-            using var wsClient = new KittyFallWsClient();
-            if (!string.IsNullOrWhiteSpace(wsUrl))
-            {
-                wsClient.Endpoint.Address = new EndpointAddress(wsUrl);
-            }
-
-            var wsUser = GetString("wsUser");
-            var wsPass = GetString("wsPass");
-            var serviceId = GetString("RewardWorker:ServiceId", GetString("RewardWorker:DefaultServiceId", "KittyFall"));
-            var packageName = GetPackageName(rewardLog);
-            var valueText = FormatRewardValue(rewardLog.RewardValue);
-
-            // Goi dung WS theo loai thuong can cong cho user.
-            if (string.Equals(rewardLog.RewardType, "DATA", StringComparison.OrdinalIgnoreCase))
-            {
-                var response = await wsClient.wsAddDataAsync(
-                    wsUser,
-                    wsPass,
-                    rewardLog.Msisdn,
-                    packageName,
-                    valueText,
-                    serviceId);
-
-                return new RewardWsResult(response.@return, $"wsAddData rewardLogId={rewardLog.RewardLogId}");
-            }
-
-            if (string.Equals(rewardLog.RewardType, "LOYALTY", StringComparison.OrdinalIgnoreCase))
-            {
-                var response = await wsClient.wsAddPointAsync(
-                    wsUser,
-                    wsPass,
-                    rewardLog.Msisdn,
-                    packageName,
-                    valueText,
-                    serviceId);
-
-                return new RewardWsResult(response.@return, $"wsAddPoint rewardLogId={rewardLog.RewardLogId}");
-            }
-
-
-            if (string.Equals(rewardLog.RewardType, "MONEY", StringComparison.OrdinalIgnoreCase))
-            {
-                var response = await wsClient.wsAddMoneyAsync(
-                    wsUser,
-                    wsPass,
-                    rewardLog.Msisdn,
-                    packageName,
-                    valueText,
-                    serviceId,
-                    "",
-                    "");
-
-                return new RewardWsResult(response.@return, $"wsAddPoint rewardLogId={rewardLog.RewardLogId}");
-            }
-
-            return new RewardWsResult(null, $"Unsupported reward type {rewardLog.RewardType}");
-        }
-
         private static bool IsExternalReward(string? rewardType)
         {
             return string.Equals(rewardType, "DATA", StringComparison.OrdinalIgnoreCase)
@@ -359,26 +364,17 @@ namespace Kitty_Fall.Woker.Services
         {
             if (string.Equals(rewardLog.RewardType, "DATA", StringComparison.OrdinalIgnoreCase))
             {
-                return GetString("RewardWorker:DataPackageName", $"GAME_DATA_{FormatRewardValue(rewardLog.RewardValue)}{rewardLog.RewardUnit}");
+                return $"DATA_{FormatRewardValue(rewardLog.RewardValue)}";
             }
 
             if (string.Equals(rewardLog.RewardType, "LOYALTY", StringComparison.OrdinalIgnoreCase))
             {
-                return GetString("RewardWorker:LoyaltyPackageName", "GAME_LOYALTY");
+                return $"LOYALTY_{FormatRewardValue(rewardLog.RewardValue)}";
             }
 
             return GetString("RewardWorker:DefaultPackageName", "GAME_REWARD");
         }
 
-        private static bool IsWsSuccess(response? response)
-        {
-            return response?.errorCode == CommonErrorCode.Success
-                || response?.errorCode == CommonErrorCode.SuccessFirstRegister
-                || response?.resultCode == CommonErrorCode.Success
-                || string.Equals(response?.status, "SUCCESS", StringComparison.OrdinalIgnoreCase)
-                || string.Equals(response?.status, "TRUE", StringComparison.OrdinalIgnoreCase);
-        }
-
         private static int GetPeriodKey(string? periodType, DateTime now)
         {
             return string.Equals(periodType, "MONTHLY", StringComparison.OrdinalIgnoreCase)
@@ -419,6 +415,5 @@ namespace Kitty_Fall.Woker.Services
 
         private readonly record struct LimitCheckResult(bool CanPayout);
 
-        private readonly record struct RewardWsResult(response? Response, string RawMessage);
     }
 }

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

@@ -2,10 +2,17 @@
   //"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",
-  
+
   "wsUrl": "http://127.0.0.1:8199/KittyFallWs?wsdl",
   "wsUser": "ws_KittyFall",
   "wsPass": "KittyFall@123A",
+
+  "UsernameAddData": "xxx",
+  "PasswordAddData": "xxxx",
+  // "UrlAddData": "http://10.201.5.123:9350/vas-gw/api/v1/add-prize",
+  "UrlAddData": "http://127.0.0.1:9350/vas-gw/api/v1/add-prize",
+  "Hmac256KeyAddData": "xxxxasaxxx",
+
   "RewardWorker": {
     // Worker chi goi moi reward NEW mot lan; loi/timeout/PROCESSING de admin doi soat, khong auto retry.
     "IntervalSeconds": 10,