|
@@ -1,12 +1,10 @@
|
|
|
using Common;
|
|
using Common;
|
|
|
using Database.Database;
|
|
using Database.Database;
|
|
|
-using Kitty_FallVasWs;
|
|
|
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.Configuration;
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Extensions.Hosting;
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
using System.Globalization;
|
|
using System.Globalization;
|
|
|
-using System.ServiceModel;
|
|
|
|
|
|
|
|
|
|
namespace Kitty_Fall.Woker.Services
|
|
namespace Kitty_Fall.Woker.Services
|
|
|
{
|
|
{
|
|
@@ -55,7 +53,7 @@ namespace Kitty_Fall.Woker.Services
|
|
|
|
|
|
|
|
var batchSize = GetInt("RewardWorker:BatchSize", 20);
|
|
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,
|
|
// 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.
|
|
// tuyet doi khong tu retry vi ket qua phia WS co the da thanh cong.
|
|
|
var rewardLogIds = await dbContext.GameRewardLogs
|
|
var rewardLogIds = await dbContext.GameRewardLogs
|
|
@@ -116,20 +114,31 @@ namespace Kitty_Fall.Woker.Services
|
|
|
return;
|
|
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.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;
|
|
rewardLog.UpdatedTime = DateTime.Now;
|
|
|
|
|
|
|
|
if (isSuccess)
|
|
if (isSuccess)
|
|
|
{
|
|
{
|
|
|
rewardLog.Status = StatusSuccess;
|
|
rewardLog.Status = StatusSuccess;
|
|
|
await UpdateLimitUsageAsync(dbContext, rewardLog, now, cancellationToken);
|
|
await UpdateLimitUsageAsync(dbContext, rewardLog, now, cancellationToken);
|
|
|
|
|
+ await dbContext.SaveChangesAsync(cancellationToken);
|
|
|
|
|
+ await SendSuccessMtAsync(dbContext, rewardLog, cancellationToken);
|
|
|
|
|
+ return;
|
|
|
}
|
|
}
|
|
|
else
|
|
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(
|
|
private async Task<LimitCheckResult> ApplyLimitBeforePayoutAsync(
|
|
|
ModelContext dbContext,
|
|
ModelContext dbContext,
|
|
|
GameRewardLog rewardLog,
|
|
GameRewardLog rewardLog,
|
|
@@ -288,67 +354,6 @@ namespace Kitty_Fall.Woker.Services
|
|
|
usage.UpdatedTime = now;
|
|
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)
|
|
private static bool IsExternalReward(string? rewardType)
|
|
|
{
|
|
{
|
|
|
return string.Equals(rewardType, "DATA", StringComparison.OrdinalIgnoreCase)
|
|
return string.Equals(rewardType, "DATA", StringComparison.OrdinalIgnoreCase)
|
|
@@ -359,26 +364,17 @@ namespace Kitty_Fall.Woker.Services
|
|
|
{
|
|
{
|
|
|
if (string.Equals(rewardLog.RewardType, "DATA", StringComparison.OrdinalIgnoreCase))
|
|
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))
|
|
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");
|
|
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)
|
|
private static int GetPeriodKey(string? periodType, DateTime now)
|
|
|
{
|
|
{
|
|
|
return string.Equals(periodType, "MONTHLY", StringComparison.OrdinalIgnoreCase)
|
|
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 LimitCheckResult(bool CanPayout);
|
|
|
|
|
|
|
|
- private readonly record struct RewardWsResult(response? Response, string RawMessage);
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|