diff --git a/ds-wms-service/DS.WMS.Core/Application/Dtos/ApplicationRequest.cs b/ds-wms-service/DS.WMS.Core/Application/Dtos/ApplicationRequest.cs index 00f43dac..3a440832 100644 --- a/ds-wms-service/DS.WMS.Core/Application/Dtos/ApplicationRequest.cs +++ b/ds-wms-service/DS.WMS.Core/Application/Dtos/ApplicationRequest.cs @@ -1,5 +1,6 @@ using DS.WMS.Core.Application.Entity; using DS.WMS.Core.Fee.Dtos; +using SqlSugar; namespace DS.WMS.Core.Application.Dtos { @@ -18,9 +19,28 @@ namespace DS.WMS.Core.Application.Dtos /// public List Items { get; set; } = []; + /// + /// 汇率转换信息 + /// + public List? Exchanges { get; set; } + /// /// 查询条件字符串 /// public string? QueryString { get; set; } + + /// + /// 根据查询条件字符串提取查询条件对象 + /// + /// + /// + public List GetQueryConditions(ISqlSugarClient client) + { + List whereList = []; + if (!string.IsNullOrEmpty(QueryString)) + whereList = client.ConfigQuery.Context.Utilities.JsonToConditionalModels(QueryString); + + return whereList; + } } } diff --git a/ds-wms-service/DS.WMS.Core/Application/Method/ApplicationService`1.cs b/ds-wms-service/DS.WMS.Core/Application/Method/ApplicationService`1.cs index 13050a4a..0c5d1990 100644 --- a/ds-wms-service/DS.WMS.Core/Application/Method/ApplicationService`1.cs +++ b/ds-wms-service/DS.WMS.Core/Application/Method/ApplicationService`1.cs @@ -1,10 +1,8 @@ -using System.Collections.Generic; -using DS.Module.Core; +using DS.Module.Core; using DS.Module.Core.Extensions; using DS.WMS.Core.Application.Dtos; using DS.WMS.Core.Application.Entity; using DS.WMS.Core.Application.Interface; -using DS.WMS.Core.Fee.Dtos; using DS.WMS.Core.Fee.Entity; using DS.WMS.Core.Fee.Method; using DS.WMS.Core.Flow.Dtos; @@ -188,11 +186,18 @@ namespace DS.WMS.Core.Application.Method { request.Application ??= new(); - List whereList = []; - if (!string.IsNullOrEmpty(request.QueryString)) - whereList = Db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryString); + request.Application.Details = await GetDetailsAsync(request); + if (!string.IsNullOrEmpty(request.Application.Currency) && request.Exchanges?.Count > 0) //非原币申请 + { + var details = request.Application.Details.FindAll(x => x.Currency != request.Application.Currency); + foreach (var detail in details) + { + var exchange = request.Exchanges.Find(x => x.CurrencyFrom == detail.Currency && x.CurrencyTo == request.Application.Currency); + detail.ExchangeRate = exchange == null ? 1 : exchange.Rate; + detail.Currency = request.Application.Currency; + } + } - request.Application.Details = await GetDetailsAsync(request.Items, whereList); return await SaveAsync(request.Application); } @@ -260,10 +265,9 @@ namespace DS.WMS.Core.Application.Method /// /// 获取业务所关联的申请明细 /// - /// - /// + /// /// - protected virtual Task> GetDetailsAsync(IEnumerable items, List? conditions) + protected virtual Task> GetDetailsAsync(ApplicationRequest request) { return Task.FromResult(new List()); } diff --git a/ds-wms-service/DS.WMS.Core/Application/Method/InvoiceApplicationService.cs b/ds-wms-service/DS.WMS.Core/Application/Method/InvoiceApplicationService.cs index 6d1cce05..4ed6ca8d 100644 --- a/ds-wms-service/DS.WMS.Core/Application/Method/InvoiceApplicationService.cs +++ b/ds-wms-service/DS.WMS.Core/Application/Method/InvoiceApplicationService.cs @@ -410,17 +410,22 @@ namespace DS.WMS.Core.Application.Method return rows > 0 ? DataResult.Success : DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed)); } - protected override async Task> GetDetailsAsync(IEnumerable items, List? conditions) + protected override async Task> GetDetailsAsync(ApplicationRequest request) { - var ids1 = items.Select(x => x.Id); - var ids2 = items.Select(x => x.BusinessType); + var ids1 = request.Items.Select(x => x.Id); + var ids2 = request.Items.Select(x => x.BusinessType); var list = await TenantDb.Queryable().Where(x => ids1.Contains(x.BusinessId) && ids2.Contains(x.BusinessType) && x.FeeStatus == FeeStatus.AuditPassed) - .Where(conditions) + .Where(request.GetQueryConditions(Db)) .Select(x => new ApplicationDetail { - Id = x.Id, + RecordId = x.Id, + CustomerName = x.CustomerName, + FeeType = x.FeeType, + FeeId = x.FeeId, + FeeName = x.FeeName, + Currency = x.Currency, ApplyAmount = x.Amount - x.InvoiceAmount - x.OrderInvoiceAmount + x.OrderInvSettlementAmount, ExchangeRate = x.ExchangeRate, OriginalCurrency = x.Currency diff --git a/ds-wms-service/DS.WMS.Core/Application/Method/PaymentApplicationService.cs b/ds-wms-service/DS.WMS.Core/Application/Method/PaymentApplicationService.cs index 741b9073..9b83205c 100644 --- a/ds-wms-service/DS.WMS.Core/Application/Method/PaymentApplicationService.cs +++ b/ds-wms-service/DS.WMS.Core/Application/Method/PaymentApplicationService.cs @@ -8,6 +8,7 @@ using DS.WMS.Core.Application.Interface; using DS.WMS.Core.Fee.Dtos; using DS.WMS.Core.Fee.Entity; using DS.WMS.Core.Info.Entity; +using DS.WMS.Core.Invoice.Dtos; using DS.WMS.Core.Op.Entity; using DS.WMS.Core.Sys.Entity; using SqlSugar; @@ -378,19 +379,23 @@ namespace DS.WMS.Core.Application.Method return DataResult.Success(dto); } - protected override async Task> GetDetailsAsync(IEnumerable items, List? conditions) + protected override async Task> GetDetailsAsync(ApplicationRequest request) { - var ids1 = items.Select(x => x.Id); - var ids2 = items.Select(x => x.BusinessType); + var ids1 = request.Items.Select(x => x.Id); + var ids2 = request.Items.Select(x => x.BusinessType); var list = await TenantDb.Queryable().Where(x => ids1.Contains(x.BusinessId) && ids2.Contains(x.BusinessType) && x.FeeStatus == FeeStatus.AuditPassed) - .Where(conditions) + .Where(request.GetQueryConditions(Db)) .Select(x => new ApplicationDetail { RecordId = x.Id, - ApplyAmount = x.Amount - x.SettlementAmount - x.OrderAmount + x.OrderSettlementAmount, + CustomerName = x.CustomerName, + FeeType = x.FeeType, + FeeId = x.FeeId, + FeeName = x.FeeName, Currency = x.Currency, + ApplyAmount = x.Amount - x.SettlementAmount - x.OrderAmount + x.OrderSettlementAmount, ExchangeRate = x.ExchangeRate, OriginalCurrency = x.Currency }).ToListAsync(); @@ -402,7 +407,6 @@ namespace DS.WMS.Core.Application.Method return list; } - protected override DataResult EnsureApplication(PaymentApplication application, PaymentApplication? dbValue) { if (dbValue != null) diff --git a/ds-wms-service/DS.WMS.Core/Fee/Dtos/ExchangeInfo.cs b/ds-wms-service/DS.WMS.Core/Fee/Dtos/ExchangeInfo.cs index fe9b0df6..52a45cf8 100644 --- a/ds-wms-service/DS.WMS.Core/Fee/Dtos/ExchangeInfo.cs +++ b/ds-wms-service/DS.WMS.Core/Fee/Dtos/ExchangeInfo.cs @@ -10,12 +10,12 @@ namespace DS.WMS.Core.Fee.Dtos /// /// 原币别 /// - public string CurrencyFrom { get; set; } + public string CurrencyFrom { get; set; } = string.Empty; /// /// 目标币别 /// - public string CurrencyTo { get; set; } + public string CurrencyTo { get; set; } = string.Empty; /// /// 费用类型(用于指定应收/应付汇率) diff --git a/ds-wms-service/DS.WMS.Core/Invoice/Interface/IInvoiceIssuanceService.cs b/ds-wms-service/DS.WMS.Core/Invoice/Interface/IInvoiceIssuanceService.cs new file mode 100644 index 00000000..3c5cae8c --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/Invoice/Interface/IInvoiceIssuanceService.cs @@ -0,0 +1,26 @@ +using DS.Module.Core; +using DS.WMS.Core.Invoice.Dtos; + +namespace DS.WMS.Core.Invoice.Interface +{ + /// + /// 发票开具 + /// + public interface IInvoiceIssuanceService + { + /// + /// 发起开票请求 + /// + /// 开票的发票ID + /// + Task> InitiateAsync(params long[] ids); + + /// + /// 添加租户信息 + /// + /// 租户信息 + /// + /// 为null时引发。 + Task AddTenantAsync(Tenant tenant); + } +} diff --git a/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeCustTemplateController.cs b/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeCustTemplateController.cs index 52fabf79..d4ea4ef7 100644 --- a/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeCustTemplateController.cs +++ b/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeCustTemplateController.cs @@ -96,5 +96,19 @@ namespace DS.WMS.FeeApi.Controllers return await _invokeService.DeleteAsync(model); } + + /// + /// 根据ID删除明细 + /// + /// + /// + [HttpPost, Route("DeleteDetails")] + public async Task DeleteAsync([FromServices] IFeeCustTemplateDetailService detailService, [FromBody] IdModel model) + { + if (!ModelState.IsValid) + return DataResult.Failed(ModelState.GetErrorMessage(), MultiLanguageConst.IllegalRequest); + + return await detailService.DeleteAsync(model); + } } } diff --git a/ds-wms-service/DS.WMS.FeeApi/Controllers/GeneralInvoiceController.cs b/ds-wms-service/DS.WMS.FeeApi/Controllers/GeneralInvoiceController.cs index 9037fec8..25fae756 100644 --- a/ds-wms-service/DS.WMS.FeeApi/Controllers/GeneralInvoiceController.cs +++ b/ds-wms-service/DS.WMS.FeeApi/Controllers/GeneralInvoiceController.cs @@ -31,22 +31,11 @@ namespace DS.WMS.FeeApi.Controllers /// /// [HttpPost, Route("GetApplicationList")] - public async Task>> GetApplicationListAsync([FromBody]PageRequest request) + public async Task>> GetApplicationListAsync([FromBody] PageRequest request) { return await _service.GetApplicationListAsync(request); } - /// - /// 获取发票申请明细 - /// - /// 申请单ID - /// - [HttpGet, Route("GetApplicationDetails")] - public async Task>> GetApplicationDetailsAsync([FromQuery]long id) - { - return await _service.GetApplicationDetailsAsync(id); - } - /// /// 获取发票申请明细 /// @@ -78,7 +67,7 @@ namespace DS.WMS.FeeApi.Controllers /// 请求参数 /// [HttpPost, Route("Save")] - public async Task> SaveAsync([FromBody]InvoiceRequest request) + public async Task> SaveAsync([FromBody] InvoiceRequest request) { if (!ModelState.IsValid) return DataResult.Failed(ModelState.GetErrorMessage(), MultiLanguageConst.IllegalRequest); @@ -142,5 +131,33 @@ namespace DS.WMS.FeeApi.Controllers bool isLocked = Convert.ToBoolean(model.Value); return await _service.SetLockAsync(isLocked, model.Ids); } + + /// + /// 发起开票请求 + /// + /// + /// 开票的发票ID + /// + [HttpPost, Route("Initiate")] + public async Task> InitiateAsync([FromServices] IInvoiceIssuanceService issuanceService, + [FromBody] IdModel idModel) + { + if (!ModelState.IsValid) + return DataResult.Failed(ModelState.GetErrorMessage(), MultiLanguageConst.IllegalRequest); + + return await issuanceService.InitiateAsync(idModel.Ids); + } + + /// + /// 添加租户信息 + /// + /// + /// 租户信息 + /// + [HttpPost, Route("AddTenant")] + public async Task AddTenantAsync([FromServices] IInvoiceIssuanceService issuanceService, Tenant tenant) + { + return await issuanceService.AddTenantAsync(tenant); + } } } diff --git a/ds-wms-service/DS.WMS.FeeApi/Properties/PublishProfiles/FolderProfile1.pubxml.user b/ds-wms-service/DS.WMS.FeeApi/Properties/PublishProfiles/FolderProfile1.pubxml.user index 39730bbb..d4b9acf1 100644 --- a/ds-wms-service/DS.WMS.FeeApi/Properties/PublishProfiles/FolderProfile1.pubxml.user +++ b/ds-wms-service/DS.WMS.FeeApi/Properties/PublishProfiles/FolderProfile1.pubxml.user @@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. <_PublishTargetUrl>D:\Publish\DS8\FeeApi - True|2024-09-04T02:07:38.3707398Z||;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||;True|2024-07-23T17:41:01.7494842+08:00||;True|2024-07-23T17:25:11.8773492+08:00||;True|2024-07-23T17:07:16.5460273+08:00||;True|2024-07-22T08:59:23.3235603+08:00||;True|2024-07-12T17:35:11.1225017+08:00||;True|2024-07-11T11:40:17.3581147+08:00||;True|2024-07-04T17:20:50.0175739+08:00||;True|2024-07-02T11:26:14.2092751+08:00||;True|2024-07-02T09:21:51.3513605+08:00||;True|2024-07-01T17:47:56.0407256+08:00||;True|2024-07-01T16:42:55.7374984+08:00||;True|2024-07-01T15:49:58.9266967+08:00||;True|2024-07-01T14:35:48.1117178+08:00||;True|2024-07-01T11:41:52.2969338+08:00||;True|2024-07-01T11:13:02.6561160+08:00||;True|2024-06-28T15:28:43.1470725+08:00||;True|2024-06-28T15:16:20.1999596+08:00||;True|2024-06-28T15:14:56.2534743+08:00||;True|2024-06-28T15:02:41.3033806+08:00||;True|2024-06-28T13:37:28.2462742+08:00||;True|2024-06-28T11:06:30.7400535+08:00||;True|2024-06-26T15:24:17.1939896+08:00||;True|2024-06-26T14:33:06.3530466+08:00||;True|2024-06-26T09:45:24.4055568+08:00||;True|2024-06-25T15:45:57.6052473+08:00||;True|2024-06-25T10:17:17.7408916+08:00||;False|2024-06-25T10:16:23.5639654+08:00||;False|2024-06-25T10:15:28.3857721+08:00||;False|2024-06-25T10:10:59.5536995+08:00||;False|2024-06-25T10:07:10.4050937+08:00||;True|2024-06-24T15:22:18.2672769+08:00||;True|2024-06-24T15:01:04.8153621+08:00||;False|2024-06-24T15:00:29.9618848+08:00||;True|2024-06-24T14:07:19.9401637+08:00||;False|2024-06-24T14:06:36.1250570+08:00||;True|2024-06-21T15:13:57.4273503+08:00||;True|2024-06-21T15:04:37.8218608+08:00||;True|2024-06-21T14:12:48.0266638+08:00||;True|2024-06-21T13:52:30.0950155+08:00||;True|2024-06-20T11:02:42.9508506+08:00||;True|2024-06-19T11:43:01.1899282+08:00||;True|2024-06-19T11:23:01.2938141+08:00||;True|2024-06-18T08:51:21.6222152+08:00||;True|2024-06-17T09:20:35.0804494+08:00||;True|2024-06-17T08:41:58.1319484+08:00||;True|2024-06-17T08:38:09.0137102+08:00||;True|2024-06-14T15:19:45.7395180+08:00||;True|2024-06-14T14:38:49.7094421+08:00||;True|2024-06-14T14:27:39.2815370+08:00||;True|2024-06-14T09:42:21.5397525+08:00||;True|2024-06-13T16:03:39.8475642+08:00||;True|2024-06-13T14:12:10.1725629+08:00||;True|2024-06-13T10:46:52.6971321+08:00||;True|2024-06-11T17:03:44.8328978+08:00||;True|2024-06-06T17:41:51.1810315+08:00||;True|2024-06-06T10:57:27.8273617+08:00||;True|2024-06-04T14:23:21.3742450+08:00||;True|2024-05-31T17:01:42.4717460+08:00||;True|2024-05-31T13:56:03.0734064+08:00||;True|2024-05-31T08:45:52.3549394+08:00||;True|2024-05-30T17:16:32.8907958+08:00||;True|2024-05-30T16:18:06.9957657+08:00||;True|2024-05-29T15:44:18.4051203+08:00||;True|2024-05-29T15:11:03.1518632+08:00||;True|2024-05-29T14:52:26.0823495+08:00||;True|2024-05-29T11:17:20.2245101+08:00||;True|2024-05-29T08:36:28.9569161+08:00||;True|2024-05-28T08:44:31.4427261+08:00||;False|2024-05-28T08:44:02.5254826+08:00||;True|2024-05-27T15:16:32.9413631+08:00||;True|2024-05-27T15:03:42.9803879+08:00||;True|2024-05-27T08:49:54.3933663+08:00||;True|2024-05-27T08:46:13.5862236+08:00||;True|2024-05-23T17:19:32.8154451+08:00||;True|2024-05-23T17:19:01.4587615+08:00||;True|2024-05-22T16:52:42.2166228+08:00||;True|2024-05-22T15:19:49.1773202+08:00||;True|2024-05-22T15:13:31.9485525+08:00||;True|2024-05-22T13:29:02.1355808+08:00||;True|2024-05-22T09:48:40.8753914+08:00||;True|2024-05-22T09:25:06.2068137+08:00||;True|2024-05-22T09:18:53.0759815+08:00||; + True|2024-09-05T01:12:44.5610882Z||;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||;True|2024-07-23T17:41:01.7494842+08:00||;True|2024-07-23T17:25:11.8773492+08:00||;True|2024-07-23T17:07:16.5460273+08:00||;True|2024-07-22T08:59:23.3235603+08:00||;True|2024-07-12T17:35:11.1225017+08:00||;True|2024-07-11T11:40:17.3581147+08:00||;True|2024-07-04T17:20:50.0175739+08:00||;True|2024-07-02T11:26:14.2092751+08:00||;True|2024-07-02T09:21:51.3513605+08:00||;True|2024-07-01T17:47:56.0407256+08:00||;True|2024-07-01T16:42:55.7374984+08:00||;True|2024-07-01T15:49:58.9266967+08:00||;True|2024-07-01T14:35:48.1117178+08:00||;True|2024-07-01T11:41:52.2969338+08:00||;True|2024-07-01T11:13:02.6561160+08:00||;True|2024-06-28T15:28:43.1470725+08:00||;True|2024-06-28T15:16:20.1999596+08:00||;True|2024-06-28T15:14:56.2534743+08:00||;True|2024-06-28T15:02:41.3033806+08:00||;True|2024-06-28T13:37:28.2462742+08:00||;True|2024-06-28T11:06:30.7400535+08:00||;True|2024-06-26T15:24:17.1939896+08:00||;True|2024-06-26T14:33:06.3530466+08:00||;True|2024-06-26T09:45:24.4055568+08:00||;True|2024-06-25T15:45:57.6052473+08:00||;True|2024-06-25T10:17:17.7408916+08:00||;False|2024-06-25T10:16:23.5639654+08:00||;False|2024-06-25T10:15:28.3857721+08:00||;False|2024-06-25T10:10:59.5536995+08:00||;False|2024-06-25T10:07:10.4050937+08:00||;True|2024-06-24T15:22:18.2672769+08:00||;True|2024-06-24T15:01:04.8153621+08:00||;False|2024-06-24T15:00:29.9618848+08:00||;True|2024-06-24T14:07:19.9401637+08:00||;False|2024-06-24T14:06:36.1250570+08:00||;True|2024-06-21T15:13:57.4273503+08:00||;True|2024-06-21T15:04:37.8218608+08:00||;True|2024-06-21T14:12:48.0266638+08:00||;True|2024-06-21T13:52:30.0950155+08:00||;True|2024-06-20T11:02:42.9508506+08:00||;True|2024-06-19T11:43:01.1899282+08:00||;True|2024-06-19T11:23:01.2938141+08:00||;True|2024-06-18T08:51:21.6222152+08:00||;True|2024-06-17T09:20:35.0804494+08:00||;True|2024-06-17T08:41:58.1319484+08:00||;True|2024-06-17T08:38:09.0137102+08:00||;True|2024-06-14T15:19:45.7395180+08:00||;True|2024-06-14T14:38:49.7094421+08:00||;True|2024-06-14T14:27:39.2815370+08:00||;True|2024-06-14T09:42:21.5397525+08:00||;True|2024-06-13T16:03:39.8475642+08:00||;True|2024-06-13T14:12:10.1725629+08:00||;True|2024-06-13T10:46:52.6971321+08:00||;True|2024-06-11T17:03:44.8328978+08:00||;True|2024-06-06T17:41:51.1810315+08:00||;True|2024-06-06T10:57:27.8273617+08:00||;True|2024-06-04T14:23:21.3742450+08:00||;True|2024-05-31T17:01:42.4717460+08:00||;True|2024-05-31T13:56:03.0734064+08:00||;True|2024-05-31T08:45:52.3549394+08:00||;True|2024-05-30T17:16:32.8907958+08:00||;True|2024-05-30T16:18:06.9957657+08:00||;True|2024-05-29T15:44:18.4051203+08:00||;True|2024-05-29T15:11:03.1518632+08:00||;True|2024-05-29T14:52:26.0823495+08:00||;True|2024-05-29T11:17:20.2245101+08:00||;True|2024-05-29T08:36:28.9569161+08:00||;True|2024-05-28T08:44:31.4427261+08:00||;False|2024-05-28T08:44:02.5254826+08:00||;True|2024-05-27T15:16:32.9413631+08:00||;True|2024-05-27T15:03:42.9803879+08:00||;True|2024-05-27T08:49:54.3933663+08:00||;True|2024-05-27T08:46:13.5862236+08:00||;True|2024-05-23T17:19:32.8154451+08:00||;True|2024-05-23T17:19:01.4587615+08:00||;True|2024-05-22T16:52:42.2166228+08:00||;True|2024-05-22T15:19:49.1773202+08:00||;True|2024-05-22T15:13:31.9485525+08:00||;True|2024-05-22T13:29:02.1355808+08:00||;True|2024-05-22T09:48:40.8753914+08:00||;True|2024-05-22T09:25:06.2068137+08:00||; \ No newline at end of file