自动费用模板

dev
嵇文龙 1 month ago
parent 9356cd96b3
commit 2a68b0b06b

@ -47,4 +47,33 @@ public static class HangfireModuleInstall
// options.Queues = AppSetting.app(new string[] { "HangfireSettings", "Queues" }).Split(','); // options.Queues = AppSetting.app(new string[] { "HangfireSettings", "Queues" }).Split(',');
//}); //});
} }
public static void AddHangfireFeeInstall(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170) //设置Hangfire 存储的数据兼容性级别为 Version_170
.UseSimpleAssemblyNameTypeSerializer()//使用简单的程序集名称类型序列化器。这是一种用于序列化和反序列化 Hangfire 任务数据的方法
.UseRecommendedSerializerSettings()//使用推荐的序列化器设置。这将使用推荐的序列化器选项进行配置
.UseStorage(new MySqlStorage(
AppSetting.app(new string[] { "HangfireSettings", "DbString" }),
new MySqlStorageOptions
{
TransactionIsolationLevel = IsolationLevel.ReadCommitted,// 事务隔离级别。默认是读取已提交。
QueuePollInterval = TimeSpan.FromSeconds(15), //- 作业队列轮询间隔。默认值为15秒。
JobExpirationCheckInterval = TimeSpan.FromHours(1), //- 作业到期检查间隔管理过期记录。默认值为1小时。
CountersAggregateInterval = TimeSpan.FromMinutes(5), //- 聚合计数器的间隔。默认为5分钟。
PrepareSchemaIfNecessary = true, //- 如果设置为true则创建数据库表。默认是true。
DashboardJobListLimit = 50000,//- 仪表板作业列表限制。默认值为50000。
TransactionTimeout = TimeSpan.FromMinutes(1), //- 交易超时。默认为1分钟。
TablesPrefix = "Hangfire"
})).UseHangfireHttpJob());
services.AddHangfireServer(options =>
{
//options.WorkerCount = AppSetting.app(new string[] { "HangfireSettings", "WorkerCount" }).ToInt();
//options.ServerName = AppSetting.app(new string[] { "HangfireSettings", "ServerName" });
options.Queues = ["fee"];
});
}
} }

@ -1,4 +1,6 @@
namespace DS.WMS.Core.HangfireJob.Interface using Hangfire;
namespace DS.WMS.Core.HangfireJob.Interface
{ {
/// <summary> /// <summary>
/// 自动费用模板后台任务 /// 自动费用模板后台任务
@ -9,6 +11,7 @@
/// 生成费用 /// 生成费用
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[Queue("fee")]
Task GenerateFeesAsync(); Task GenerateFeesAsync();
} }
} }

@ -1,9 +1,9 @@
using DS.Module.Core; using DS.Module.Core;
using DS.Module.Core.Condition; using DS.Module.Core.Condition;
using DS.Module.Core.Data; using DS.Module.Core.Data;
using DS.Module.SqlSugar; using DS.WMS.Core.Fee.Dtos;
using DS.WMS.Core.Fee.Entity; using DS.WMS.Core.Fee.Entity;
using DS.WMS.Core.Invoice.Dtos; using DS.WMS.Core.HangfireJob.Interface;
using DS.WMS.Core.Op.Dtos; using DS.WMS.Core.Op.Dtos;
using DS.WMS.Core.Op.Entity; using DS.WMS.Core.Op.Entity;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -15,7 +15,7 @@ namespace DS.WMS.Core.HangfireJob.Method
/// <summary> /// <summary>
/// 自动费用模板后台任务 /// 自动费用模板后台任务
/// </summary> /// </summary>
public class FeeCustTemplateJobService public class FeeCustTemplateJobService : IFeeCustTemplateJobService
{ {
ISqlSugarClient? db; ISqlSugarClient? db;
@ -34,7 +34,7 @@ namespace DS.WMS.Core.HangfireJob.Method
/// <returns></returns> /// <returns></returns>
public async Task GenerateFeesAsync() public async Task GenerateFeesAsync()
{ {
var dbLinks = await db.Queryable<SysTenantLink>().ToListAsync(); var dbLinks = await db.Queryable<Module.SqlSugar.SysTenantLink>().ToListAsync();
SqlSugarClient? tenantDb = null; SqlSugarClient? tenantDb = null;
try try
{ {
@ -59,11 +59,8 @@ namespace DS.WMS.Core.HangfireJob.Method
IsAutoCloseConnection = true, IsAutoCloseConnection = true,
ConnectionString = dbLink.Connection ConnectionString = dbLink.Connection
}); });
tenantDb.QueryFilter.Clear<IOrgId>();
tenantDb.QueryFilter.Clear<ISharedOrgId>();
tenantDb.QueryFilter.Clear<ITenantId>();
await GenerateFeesCoreAsync(tenantDb, DateTime.Now.Date);
} }
} }
finally finally
@ -79,7 +76,7 @@ namespace DS.WMS.Core.HangfireJob.Method
/// <param name="tenantDb"></param> /// <param name="tenantDb"></param>
/// <param name="etd">开船日</param> /// <param name="etd">开船日</param>
/// <returns></returns> /// <returns></returns>
internal static async Task GenerateFeesCoreAsync(SqlSugarClient tenantDb, DateTime etd) internal async Task GenerateFeesCoreAsync(SqlSugarClient tenantDb, DateTime etd)
{ {
DateTime dt = DateTime.Now; DateTime dt = DateTime.Now;
var list = await tenantDb.Queryable<FeeCustTemplate>() var list = await tenantDb.Queryable<FeeCustTemplate>()
@ -104,8 +101,6 @@ namespace DS.WMS.Core.HangfireJob.Method
}).ToListAsync(); }).ToListAsync();
if (list.Count == 0) if (list.Count == 0)
return; return;
if (etd == default)
etd = DateTime.Now.Date;
var tids = list.Select(x => x.Id); var tids = list.Select(x => x.Id);
var orders = await tenantDb.Queryable<SeaExport>().Where(x => SqlFunc.DateIsSame(x.ETD, etd) && var orders = await tenantDb.Queryable<SeaExport>().Where(x => SqlFunc.DateIsSame(x.ETD, etd) &&
@ -123,7 +118,7 @@ namespace DS.WMS.Core.HangfireJob.Method
var custList = list.Where(x => x.CustomerId == order.CustomerId).OrderBy(x => x.Priority); var custList = list.Where(x => x.CustomerId == order.CustomerId).OrderBy(x => x.Priority);
foreach (var template in custList) //遍历客户费用模板,查找匹配项 foreach (var template in custList) //遍历客户费用模板,查找匹配项
{ {
var fees = await CreateFeesIfMatchAsync(tenantDb,order, template); var fees = await CreateFeesIfMatchAsync(tenantDb, order, template);
if (fees != null) if (fees != null)
{ {
feeList.AddRange(fees); feeList.AddRange(fees);
@ -169,13 +164,7 @@ namespace DS.WMS.Core.HangfireJob.Method
//写入当前业务的费用 //写入当前业务的费用
if (feeList.Count > 0) if (feeList.Count > 0)
{ {
//var result = await feeService.Value.SaveAsync(tenantDb, feeList, true, false); await SaveAsync(tenantDb, feeList);
//if (!result.Succeeded)
//{
// //记录失败日志
// //await new ApplicationException(result.Message).LogAsync(Db);
//}
feeList.Clear(); feeList.Clear();
} }
} }
@ -185,8 +174,215 @@ namespace DS.WMS.Core.HangfireJob.Method
catch (Exception ex) catch (Exception ex)
{ {
await tenantDb.Ado.RollbackTranAsync(); await tenantDb.Ado.RollbackTranAsync();
//await ex.LogAsync(Db); await ex.LogAsync(db);
}
}
/// <summary>
/// 费用保存
/// </summary>
/// <param name="tenantDb"></param>
/// <param name="items">要提交的费用记录</param>
/// <returns></returns>
static async Task SaveAsync(SqlSugarClient tenantDb, List<FeeRecord> items)
{
var first = items.Select(x => new { x.BusinessType, x.BusinessId }).FirstOrDefault();
//if (await IsFeeLockedAsync(first.BusinessId, first.BusinessType))
// return DataResult.FailedWithDesc(nameof(MultiLanguageConst.FeeLocked));
var order = await tenantDb.Queryable<SeaExport>().Where(x => x.Id == first.BusinessId).Select(x => new
{
x.TEU,
x.KGS, //毛重
x.PKGS, //件数
x.CBM //尺码
}).FirstAsync();
if (order == null)
return;
//获取订单箱型箱量
string bsNo = first.BusinessId.ToString();
var ctns = await tenantDb.Queryable<OpCtn>().Where(y => y.BSNO == bsNo).Select(x => new
{
x.CtnCode,
x.CtnNum
}).ToListAsync();
items = items.FindAll(x => x.Amount != 0);
foreach (var item in items)
{
if (item.Quantity == 0)
{
//逐个判定处理标准
switch (item.Unit)
{
case "HOUR": //小时
goto case "P";
case "GE": //个
goto case "P";
case "DAY": //天
goto case "P";
//case "XX": //箱型
// goto default;
case "JJZL": //计价重量
goto case "Z";
case "ZJ": //总价
goto case "P";
case "JZ": //净重
item.Quantity = 0;
break;
case "TEU": //TEU
item.Quantity = order.TEU;
break;
case "JF": //计费吨
item.Quantity = order.KGS.GetValueOrDefault() / 1000 > order.CBM.GetValueOrDefault() ? order.KGS.GetValueOrDefault() : order.CBM.GetValueOrDefault();
break;
case "J": //件数
item.Quantity = order.PKGS.GetValueOrDefault();
break;
case "C": //尺码
item.Quantity = order.CBM.GetValueOrDefault();
break;
case "Z": //重量
item.Quantity = order.KGS.GetValueOrDefault();
break;
case "P": //单票
item.Quantity = 1;
break;
default: //查找箱型标准
var ctn = ctns.Find(x => x.CtnCode == item.Unit);
item.Quantity = ctn == null ? 0 : ctn.CtnNum.GetValueOrDefault();
break;
}
}
//计算税费
item.SetTax();
}
//若计价货币单位不等于本位币则尝试获取最新汇率
await FetchExchangeRateAsync(tenantDb, items);
//写入费用
await tenantDb.Insertable(items).ExecuteCommandAsync();
}
static async Task FetchExchangeRateAsync(SqlSugarClient tenantDb, List<FeeRecord> items)
{
var exRecords = items.Where(x => x.Currency != x.LocalCurrency && x.ExchangeRate == null);
if (exRecords.Any())
{
var exchanges = exRecords.GroupBy(x => new
{
x.Currency,
x.LocalCurrency,
x.FeeType,
}).Select(x => new ExchangeRate
{
CurrencyFrom = x.Key.Currency,
CurrencyTo = x.Key.LocalCurrency,
FeeType = x.Key.FeeType
});
List<ExchangeRate> exchangeRates = [];
foreach (var item in exchanges)
{
var result = await GetExchangeRateAsync(tenantDb, item);
if (result.Succeeded && result.Data != null)
exchangeRates.Add(result.Data);
}
foreach (var item in items)
{
item.ExchangeRate = exchangeRates.Find(x => x.CurrencyFrom == item.Currency &&
x.CurrencyTo == item.LocalCurrency && x.FeeType == item.FeeType)?.Rate;
}
}
}
static async Task<DataResult<ExchangeRate>> GetExchangeRateAsync(SqlSugarClient tenantDb, ExchangeRate exchange)
{
if (exchange.CurrencyFrom == exchange.CurrencyTo)
{
exchange.ReverseRate = exchange.Rate = 1m;
return DataResult<ExchangeRate>.Success(exchange);
}
//获取本位币,默认=人民币
string localCurrency = FeeCurrency.RMB_CODE;
if (string.IsNullOrWhiteSpace(exchange.CurrencyTo))
{
exchange.CurrencyTo = localCurrency;
} }
//需要做二次转换
if (exchange.CurrencyFrom != localCurrency && exchange.CurrencyTo != localCurrency)
{
//获取中间汇率
var middleRate = await GetLocalRateAsync(tenantDb, exchange.CurrencyFrom, localCurrency, exchange.FeeType);
if (middleRate == null)
return DataResult<ExchangeRate>.FailedData(exchange, message: $"{MultiLanguageConst.FeeCurrencyNotFound}{exchange.CurrencyFrom}");
var rate = await GetLocalRateAsync(tenantDb, exchange.CurrencyTo, localCurrency, exchange.FeeType);
exchange.Rate = Math.Round(1 / (rate ?? 1m) * middleRate.GetValueOrDefault(), 4, MidpointRounding.AwayFromZero);
exchange.ReverseRate = Math.Round(1 / exchange.Rate, 4, MidpointRounding.AwayFromZero);
}
else
{
string currency = exchange.CurrencyFrom == FeeCurrency.RMB_CODE ? exchange.CurrencyTo : exchange.CurrencyFrom;
var rate = await GetLocalRateAsync(tenantDb, currency, localCurrency, exchange.FeeType);
if (currency == exchange.CurrencyFrom)
{
exchange.Rate = rate ?? 1m;
exchange.ReverseRate = Math.Round(1 / exchange.Rate, 4, MidpointRounding.AwayFromZero);
}
else
{
exchange.ReverseRate = rate ?? 1m;
exchange.Rate = Math.Round(1 / exchange.ReverseRate, 4, MidpointRounding.AwayFromZero);
}
}
return DataResult<ExchangeRate>.Success(exchange);
}
static async Task<decimal?> GetLocalRateAsync(SqlSugarClient tenantDb, string currency, string localCurrency, FeeType? type)
{
var entity = await tenantDb.Queryable<FeeCurrency>().Where(x => x.CodeName == currency).Includes(x => x.Exchanges).FirstAsync();
if (entity == null)
return null;
var rate = entity.DefaultRate;
DateTime dtNow = DateTime.Now;
if (type.HasValue && entity.Exchanges != null && entity.Exchanges.Count > 0)
{
//取当前时间范围内的最新一条,优先获取本位币
var item = entity.Exchanges.FindAll(x => x.Status == StatusEnum.Enable && x.LocalCurrency == localCurrency &&
x.StartDate >= dtNow && x.EndDate <= dtNow).OrderByDescending(x => x.CreateTime).FirstOrDefault();
item ??= entity.Exchanges.FindAll(x => x.Status == StatusEnum.Enable &&
x.StartDate >= dtNow && x.EndDate <= dtNow).OrderByDescending(x => x.CreateTime).FirstOrDefault();
if (item != null)
rate = type.Value == FeeType.Receivable ? item.DRValue : item.CRValue;
}
return rate;
} }
static async Task<List<FeeRecord>?> CreateFeesIfMatchAsync(SqlSugarClient tenantDb, SeaExportRes order, FeeCustTemplate template) static async Task<List<FeeRecord>?> CreateFeesIfMatchAsync(SqlSugarClient tenantDb, SeaExportRes order, FeeCustTemplate template)
@ -239,13 +435,14 @@ namespace DS.WMS.Core.HangfireJob.Method
UnitPrice = SqlFunc.IsNull(x.UnitPrice.Value, 0), UnitPrice = SqlFunc.IsNull(x.UnitPrice.Value, 0),
//Quantity = x.IsCtn ? 1 : 0, //Quantity = x.IsCtn ? 1 : 0,
Currency = x.Currency, Currency = x.Currency,
ExchangeRate = x.ExchangeRate, ExchangeRate = x.ExchangeRate == null ? 1 : x.ExchangeRate,
TaxRate = SqlFunc.IsNull(x.TaxRate.Value, 0), TaxRate = SqlFunc.IsNull(x.TaxRate.Value, 0),
AccTaxRate = SqlFunc.IsNull(x.AccTaxRate.Value, 0), AccTaxRate = SqlFunc.IsNull(x.AccTaxRate.Value, 0),
Tax = SqlFunc.IsNull(x.Tax.Value, 0), Tax = SqlFunc.IsNull(x.Tax.Value, 0),
TaxUnitPrice = SqlFunc.IsNull(x.TaxUnitPrice.Value, 0), TaxUnitPrice = SqlFunc.IsNull(x.TaxUnitPrice.Value, 0),
IsInvoice = x.IsInvoice, IsInvoice = x.IsInvoice,
IsAdvancedPay = x.IsAdvancedPay, IsAdvancedPay = x.IsAdvancedPay,
LocalCurrency = FeeCurrency.RMB_CODE,
Remark = template.FeeCategoryName, Remark = template.FeeCategoryName,
TemplateId = x.TemplateId, TemplateId = x.TemplateId,
InputMethod = InputMethod.Automatic InputMethod = InputMethod.Automatic
@ -323,12 +520,6 @@ namespace DS.WMS.Core.HangfireJob.Method
return details; return details;
} }
/// <summary>
/// 根据指定条件返回是否匹配的结果
/// </summary>
/// <param name="source">要对比的数据源</param>
/// <param name="condition">匹配条件</param>
/// <returns></returns>
static bool IsMatch(object source, ConditionContent condition) static bool IsMatch(object source, ConditionContent condition)
{ {
if (source == null || condition == null) if (source == null || condition == null)

@ -1,5 +1,6 @@
using DS.WMS.Core.HangfireJob.Interface; using DS.WMS.Core.HangfireJob.Interface;
using Hangfire; using Hangfire;
using Hangfire.Dashboard.BasicAuthorization;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
namespace DS.WMS.Core.HangfireJob.Method namespace DS.WMS.Core.HangfireJob.Method
@ -16,8 +17,28 @@ namespace DS.WMS.Core.HangfireJob.Method
/// <returns></returns> /// <returns></returns>
public static WebApplication UseJobMiddlewares(this WebApplication app) public static WebApplication UseJobMiddlewares(this WebApplication app)
{ {
//RecurringJob.AddOrUpdate<IFeeCustTemplateJobService>(nameof(IFeeCustTemplateJobService), //app.UseHangfireServer(); // 用于将 Hangfire 任务处理服务器添加到请求处理管道中
// s => s.GenerateFeesAsync(), Cron.Daily(23, 30)); // 将 Hangfire 仪表板添加到应用程序的请求处理管道中
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new[] {new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions
{
RequireSsl = false,
SslRedirect = false,
LoginCaseSensitive = true,
Users = new []
{
new BasicAuthAuthorizationUser
{
Login = "admin",
PasswordClear = "ds2024"
}
}
})}
});
RecurringJob.AddOrUpdate<IFeeCustTemplateJobService>(nameof(IFeeCustTemplateJobService),
s => s.GenerateFeesAsync(), Cron.Daily(23, 30));
return app; return app;
} }

@ -555,7 +555,7 @@ public class ClientInfoService : ServiceBase, IClientInfoService
public async Task<DataResult> IsAvailableAsync(ClientInfoReq req) public async Task<DataResult> IsAvailableAsync(ClientInfoReq req)
{ {
var expr = Expressionable.Create<InfoClient>() var expr = Expressionable.Create<InfoClient>()
.And(x => x.ShortName == req.ShortName.Trim() || x.Description == req.Description.Trim()) .And(x => x.ShortName == req.ShortName.Trim() && x.Description == req.Description.Trim())
.AndIF(req.Id > 0, x => x.Id != req.Id); .AndIF(req.Id > 0, x => x.Id != req.Id);
var client = await TenantDb.Queryable<InfoClient>().Where(expr.ToExpression()).Select(x => new var client = await TenantDb.Queryable<InfoClient>().Where(expr.ToExpression()).Select(x => new

@ -23,6 +23,7 @@
<ProjectReference Include="..\DS.Module.AutofacModule\DS.Module.AutofacModule.csproj" /> <ProjectReference Include="..\DS.Module.AutofacModule\DS.Module.AutofacModule.csproj" />
<ProjectReference Include="..\DS.Module.Core\DS.Module.Core.csproj" /> <ProjectReference Include="..\DS.Module.Core\DS.Module.Core.csproj" />
<ProjectReference Include="..\DS.Module.ExcelModule\DS.Module.ExcelModule.csproj" /> <ProjectReference Include="..\DS.Module.ExcelModule\DS.Module.ExcelModule.csproj" />
<ProjectReference Include="..\DS.Module.HangfireModule\DS.Module.HangfireModule.csproj" />
<ProjectReference Include="..\DS.Module.Jwt\DS.Module.Jwt.csproj" /> <ProjectReference Include="..\DS.Module.Jwt\DS.Module.Jwt.csproj" />
<ProjectReference Include="..\DS.Module.MultiLanguage\DS.Module.MultiLanguage.csproj" /> <ProjectReference Include="..\DS.Module.MultiLanguage\DS.Module.MultiLanguage.csproj" />
<ProjectReference Include="..\DS.Module.Nuget\DS.Module.Nuget.csproj" /> <ProjectReference Include="..\DS.Module.Nuget\DS.Module.Nuget.csproj" />

@ -13,6 +13,8 @@ using DS.Module.Swagger;
using DS.Module.UserModule; using DS.Module.UserModule;
using NLog.Web; using NLog.Web;
using DS.WMS.Core.HangfireJob.Method; using DS.WMS.Core.HangfireJob.Method;
using DS.Module.HangfireModule;
using Hangfire;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
var environment = builder.Environment.EnvironmentName; var environment = builder.Environment.EnvironmentName;
@ -44,6 +46,8 @@ builder.Services.AddMultiLanguageInstall();//
builder.Services.AddDjyModuleInstall();//Djy·þÎñ builder.Services.AddDjyModuleInstall();//Djy·þÎñ
builder.Services.AddRuleEngineModuleInstall();//Djy¹æÔòÒýÇæУÑé·þÎñ builder.Services.AddRuleEngineModuleInstall();//Djy¹æÔòÒýÇæУÑé·þÎñ
builder.Services.AddHangfireFeeInstall();//Hangfire·þÎñ
// builder.Services.AddEndpointsApiExplorer(); // builder.Services.AddEndpointsApiExplorer();
// builder.Services.AddSwaggerGen(); // builder.Services.AddSwaggerGen();
@ -51,6 +55,7 @@ var app = builder.Build();
app.UsePublicMiddlewares(); app.UsePublicMiddlewares();
app.UseHangfireServer();
app.UseJobMiddlewares(); app.UseJobMiddlewares();
app.Run(); app.Run();

@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<_PublishTargetUrl>D:\Publish\DS8\FeeApi</_PublishTargetUrl> <_PublishTargetUrl>D:\Publish\DS8\FeeApi</_PublishTargetUrl>
<History>True|2024-10-11T02:54:50.3307087Z||;True|2024-10-11T10:45:07.8181500+08:00||;True|2024-10-11T10:40:44.2066046+08:00||;True|2024-10-11T10:21:25.7226983+08:00||;True|2024-10-11T10:09:05.5257478+08:00||;True|2024-10-10T14:58:29.1228618+08:00||;True|2024-10-10T14:05:59.4501659+08:00||;True|2024-10-10T11:08:58.9765455+08:00||;True|2024-10-08T17:59:07.5583287+08:00||;True|2024-09-27T19:01:59.6945760+08:00||;True|2024-09-27T18:45:48.2812860+08:00||;True|2024-09-27T18:10:25.5697467+08:00||;True|2024-09-27T17:39:06.3169139+08:00||;True|2024-09-27T17:30:14.1043193+08:00||;True|2024-09-27T16:02:09.0703159+08:00||;True|2024-09-27T15:53:05.1789245+08:00||;True|2024-09-27T15:32:52.1934490+08:00||;True|2024-09-27T13:51:24.9197626+08:00||;True|2024-09-27T13:48:17.2817346+08:00||;True|2024-09-27T11:51:46.8193040+08:00||;True|2024-09-27T10:58:33.1059648+08:00||;True|2024-09-27T10:37:35.0336563+08:00||;False|2024-09-27T10:31:52.6302264+08:00||;True|2024-09-26T19:50:15.5513195+08:00||;True|2024-09-26T19:47:14.0781788+08:00||;True|2024-09-26T19:01:26.5428388+08:00||;True|2024-09-26T18:35:28.7455319+08:00||;True|2024-09-26T18:24:30.8084807+08:00||;True|2024-09-26T18:20:47.3005460+08:00||;True|2024-09-26T18:04:39.8012913+08:00||;True|2024-09-26T17:48:13.8526872+08:00||;True|2024-09-26T16:08:20.1746970+08:00||;True|2024-09-26T16:01:01.1501975+08:00||;False|2024-09-26T16:00:34.1516745+08:00||;True|2024-09-26T14:33:03.4007570+08:00||;True|2024-09-25T19:14:27.8906774+08:00||;True|2024-09-25T18:57:40.1435131+08:00||;True|2024-09-25T17:38:44.0915841+08:00||;True|2024-09-25T15:33:58.4630618+08:00||;True|2024-09-25T15:10:31.3022063+08:00||;False|2024-09-25T14:14:40.9640545+08:00||;True|2024-09-25T10:09:32.2558600+08:00||;True|2024-09-25T09:59:17.1525160+08:00||;False|2024-09-25T09:57:58.7265103+08:00||;False|2024-09-25T09:53:36.7732713+08:00||;False|2024-09-24T18:40:10.0166224+08:00||;True|2024-09-24T08:59:56.1995425+08:00||;True|2024-09-23T18:07:54.7222163+08:00||;True|2024-09-23T17:23:57.7568406+08:00||;True|2024-09-23T16:28:49.3169826+08:00||;True|2024-09-23T15:57:31.8052490+08:00||;True|2024-09-23T11:47:21.1445419+08:00||;True|2024-09-23T09:24:36.0732229+08:00||;True|2024-09-21T11:59:19.0549926+08:00||;True|2024-09-21T11:24:32.4451752+08:00||;True|2024-09-21T10:39:11.5297411+08:00||;True|2024-09-20T18:24:31.7827684+08:00||;True|2024-09-19T17:55:53.1666689+08:00||;True|2024-09-19T17:42:47.9061485+08:00||;True|2024-09-19T16:08:21.7225571+08:00||;False|2024-09-19T14:15:42.9318446+08:00||;True|2024-09-19T11:20:03.5567568+08:00||;True|2024-09-18T11:35:18.1509724+08:00||;True|2024-09-18T09:08:59.1152574+08:00||;True|2024-09-14T15:48:22.9374486+08:00||;True|2024-09-14T15:42:19.0503983+08:00||;True|2024-09-14T11:51:53.3339222+08:00||;True|2024-09-14T11:41:38.3542237+08:00||;True|2024-09-14T11:19:13.1037012+08:00||;True|2024-09-13T14:31:12.4598160+08:00||;True|2024-09-13T10:44:56.1241214+08:00||;False|2024-09-13T10:44:26.6088271+08:00||;False|2024-09-13T10:44:06.1615137+08:00||;False|2024-09-13T10:43:19.2432517+08:00||;False|2024-09-13T10:38:18.1663387+08:00||;True|2024-09-06T18:49:17.9435308+08:00||;True|2024-09-06T17:01:39.6646353+08:00||;True|2024-09-06T10:27:36.9990456+08:00||;True|2024-09-06T09:48:23.4236094+08:00||;True|2024-09-05T13:57:23.8452431+08:00||;True|2024-09-05T10:21:34.6675149+08:00||;True|2024-09-05T09:12:44.5610882+08:00||;True|2024-09-04T10:07:38.3707398+08:00||;True|2024-09-04T09:52:47.0574599+08:00||;True|2024-09-03T16:41:23.7516960+08:00||;True|2024-09-03T15:22:31.8718097+08:00||;True|2024-09-03T10:01:09.7656702+08:00||;False|2024-09-03T09:46:46.8956531+08:00||;True|2024-09-02T17:07:41.0268500+08:00||;True|2024-09-02T13:50:22.0203254+08:00||;True|2024-09-02T13:34:23.3441546+08:00||;True|2024-08-30T11:25:14.7431645+08:00||;True|2024-08-29T16:38:26.3491372+08:00||;True|2024-08-29T16:32:31.8580864+08:00||;False|2024-08-29T16:30:41.4763198+08:00||;True|2024-08-09T09:18:05.8484398+08:00||;True|2024-08-09T08:45:38.7858906+08:00||;True|2024-08-05T11:37:07.3133020+08:00||;True|2024-07-24T16:45:58.2272340+08:00||;True|2024-07-24T15:48:52.0128987+08:00||;</History> <History>True|2024-10-11T09:00:54.0916209Z||;True|2024-10-11T10:54:50.3307087+08:00||;True|2024-10-11T10:45:07.8181500+08:00||;True|2024-10-11T10:40:44.2066046+08:00||;True|2024-10-11T10:21:25.7226983+08:00||;True|2024-10-11T10:09:05.5257478+08:00||;True|2024-10-10T14:58:29.1228618+08:00||;True|2024-10-10T14:05:59.4501659+08:00||;True|2024-10-10T11:08:58.9765455+08:00||;True|2024-10-08T17:59:07.5583287+08:00||;True|2024-09-27T19:01:59.6945760+08:00||;True|2024-09-27T18:45:48.2812860+08:00||;True|2024-09-27T18:10:25.5697467+08:00||;True|2024-09-27T17:39:06.3169139+08:00||;True|2024-09-27T17:30:14.1043193+08:00||;True|2024-09-27T16:02:09.0703159+08:00||;True|2024-09-27T15:53:05.1789245+08:00||;True|2024-09-27T15:32:52.1934490+08:00||;True|2024-09-27T13:51:24.9197626+08:00||;True|2024-09-27T13:48:17.2817346+08:00||;True|2024-09-27T11:51:46.8193040+08:00||;True|2024-09-27T10:58:33.1059648+08:00||;True|2024-09-27T10:37:35.0336563+08:00||;False|2024-09-27T10:31:52.6302264+08:00||;True|2024-09-26T19:50:15.5513195+08:00||;True|2024-09-26T19:47:14.0781788+08:00||;True|2024-09-26T19:01:26.5428388+08:00||;True|2024-09-26T18:35:28.7455319+08:00||;True|2024-09-26T18:24:30.8084807+08:00||;True|2024-09-26T18:20:47.3005460+08:00||;True|2024-09-26T18:04:39.8012913+08:00||;True|2024-09-26T17:48:13.8526872+08:00||;True|2024-09-26T16:08:20.1746970+08:00||;True|2024-09-26T16:01:01.1501975+08:00||;False|2024-09-26T16:00:34.1516745+08:00||;True|2024-09-26T14:33:03.4007570+08:00||;True|2024-09-25T19:14:27.8906774+08:00||;True|2024-09-25T18:57:40.1435131+08:00||;True|2024-09-25T17:38:44.0915841+08:00||;True|2024-09-25T15:33:58.4630618+08:00||;True|2024-09-25T15:10:31.3022063+08:00||;False|2024-09-25T14:14:40.9640545+08:00||;True|2024-09-25T10:09:32.2558600+08:00||;True|2024-09-25T09:59:17.1525160+08:00||;False|2024-09-25T09:57:58.7265103+08:00||;False|2024-09-25T09:53:36.7732713+08:00||;False|2024-09-24T18:40:10.0166224+08:00||;True|2024-09-24T08:59:56.1995425+08:00||;True|2024-09-23T18:07:54.7222163+08:00||;True|2024-09-23T17:23:57.7568406+08:00||;True|2024-09-23T16:28:49.3169826+08:00||;True|2024-09-23T15:57:31.8052490+08:00||;True|2024-09-23T11:47:21.1445419+08:00||;True|2024-09-23T09:24:36.0732229+08:00||;True|2024-09-21T11:59:19.0549926+08:00||;True|2024-09-21T11:24:32.4451752+08:00||;True|2024-09-21T10:39:11.5297411+08:00||;True|2024-09-20T18:24:31.7827684+08:00||;True|2024-09-19T17:55:53.1666689+08:00||;True|2024-09-19T17:42:47.9061485+08:00||;True|2024-09-19T16:08:21.7225571+08:00||;False|2024-09-19T14:15:42.9318446+08:00||;True|2024-09-19T11:20:03.5567568+08:00||;True|2024-09-18T11:35:18.1509724+08:00||;True|2024-09-18T09:08:59.1152574+08:00||;True|2024-09-14T15:48:22.9374486+08:00||;True|2024-09-14T15:42:19.0503983+08:00||;True|2024-09-14T11:51:53.3339222+08:00||;True|2024-09-14T11:41:38.3542237+08:00||;True|2024-09-14T11:19:13.1037012+08:00||;True|2024-09-13T14:31:12.4598160+08:00||;True|2024-09-13T10:44:56.1241214+08:00||;False|2024-09-13T10:44:26.6088271+08:00||;False|2024-09-13T10:44:06.1615137+08:00||;False|2024-09-13T10:43:19.2432517+08:00||;False|2024-09-13T10:38:18.1663387+08:00||;True|2024-09-06T18:49:17.9435308+08:00||;True|2024-09-06T17:01:39.6646353+08:00||;True|2024-09-06T10:27:36.9990456+08:00||;True|2024-09-06T09:48:23.4236094+08:00||;True|2024-09-05T13:57:23.8452431+08:00||;True|2024-09-05T10:21:34.6675149+08:00||;True|2024-09-05T09:12:44.5610882+08:00||;True|2024-09-04T10:07:38.3707398+08:00||;True|2024-09-04T09:52:47.0574599+08:00||;True|2024-09-03T16:41:23.7516960+08:00||;True|2024-09-03T15:22:31.8718097+08:00||;True|2024-09-03T10:01:09.7656702+08:00||;False|2024-09-03T09:46:46.8956531+08:00||;True|2024-09-02T17:07:41.0268500+08:00||;True|2024-09-02T13:50:22.0203254+08:00||;True|2024-09-02T13:34:23.3441546+08:00||;True|2024-08-30T11:25:14.7431645+08:00||;True|2024-08-29T16:38:26.3491372+08:00||;True|2024-08-29T16:32:31.8580864+08:00||;False|2024-08-29T16:30:41.4763198+08:00||;True|2024-08-09T09:18:05.8484398+08:00||;True|2024-08-09T08:45:38.7858906+08:00||;True|2024-08-05T11:37:07.3133020+08:00||;True|2024-07-24T16:45:58.2272340+08:00||;</History>
<LastFailureDetails /> <LastFailureDetails />
</PropertyGroup> </PropertyGroup>
</Project> </Project>

@ -62,5 +62,11 @@
"UserKey": "", "UserKey": "",
"UserSecret": "", "UserSecret": "",
"BaseUrl": "http://47.105.115.105:26650" "BaseUrl": "http://47.105.115.105:26650"
},
"HangfireSettings": {
"DbString": "server=rm-m5e06xxqpa68a68ry5o.mysql.rds.aliyuncs.com;port=3306;uid=rulesengine_admin;pwd=Rule1qaz2wsx!QAZ;database=shippingweb8_hangfire;Allow User Variables=true",
"WorkerCount": 10,
"ServerName": "OpApi",
"Queues": "op"
} }
} }

Loading…
Cancel
Save