From 08b5c296f30f58e8a36aa8cfe0ee95a9b13abf2e Mon Sep 17 00:00:00 2001 From: jianghaiqing Date: Tue, 5 Nov 2024 17:45:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E5=8D=95?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Op/Dtos/BLIssueManage/BLCheckInOutDto.cs | 14 +- .../BLIssueManageBaseInputDto.cs | 18 +- .../BLIssueManage/ShipCertCheckInOutDto.cs | 2 +- .../Entity/BLIssueManage/BLIssueManageBase.cs | 6 + .../BLIssueManage/BLIssueManageService.cs | 1396 ++++++++++++----- 5 files changed, 1038 insertions(+), 398 deletions(-) diff --git a/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/BLCheckInOutDto.cs b/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/BLCheckInOutDto.cs index 943799c9..8a55bce0 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/BLCheckInOutDto.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/BLCheckInOutDto.cs @@ -14,7 +14,7 @@ namespace DS.WMS.Core.Op.Dtos /// /// 订舱编号 /// - public long[] bookids { get; set; } + public List bookids { get; set; } /// /// 签入或签出时间 @@ -25,6 +25,18 @@ namespace DS.WMS.Core.Op.Dtos /// 签入或签出备注 /// public string Notes { get; set; } + } + public class BLCheckInOutBookDto + { + /// + /// 主单或分单ID + /// + public long bookid { get; set; } + + /// + /// 主分单类型(M-主单 H-分单) + /// + public string MHBillType { get; set; } } } diff --git a/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/BLIssueManageBaseInputDto.cs b/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/BLIssueManageBaseInputDto.cs index 389e5d9d..5379f46e 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/BLIssueManageBaseInputDto.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/BLIssueManageBaseInputDto.cs @@ -1,4 +1,5 @@ -using System; +using SqlSugar; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -325,5 +326,20 @@ namespace DS.WMS.Core.Op.Dtos /// 客服名称 /// public string CustomerServiceName { get; set; } + + /// + /// 分单编号 + /// + public string HBLNo { get; set; } + + /// + /// 结算方式 + /// + public string StlName { get; set; } + + /// + /// 主分单类型 + /// + public string MHBillType { get; set; } } } diff --git a/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/ShipCertCheckInOutDto.cs b/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/ShipCertCheckInOutDto.cs index 4765b5bf..f0eeda68 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/ShipCertCheckInOutDto.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Dtos/BLIssueManage/ShipCertCheckInOutDto.cs @@ -14,7 +14,7 @@ namespace DS.WMS.Core.Op.Dtos /// /// 订舱编号 /// - public long[] bookids { get; set; } + public List bookids { get; set; } /// /// 签入或签出时间 diff --git a/ds-wms-service/DS.WMS.Core/Op/Entity/BLIssueManage/BLIssueManageBase.cs b/ds-wms-service/DS.WMS.Core/Op/Entity/BLIssueManage/BLIssueManageBase.cs index 4d28520f..6454ae46 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Entity/BLIssueManage/BLIssueManageBase.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Entity/BLIssueManage/BLIssueManageBase.cs @@ -69,6 +69,12 @@ namespace DS.WMS.Core.Op.Entity [SugarColumn(ColumnDescription = "结算方式", IsNullable = true, Length = 30)] public string StlName { get; set; } + /// + /// 主分单类型 + /// + [SugarColumn(ColumnDescription = "主分单类型", IsNullable = true, Length = 20)] + public string MHBillType { get; set; } + /// /// 提单签发状态代码 /// diff --git a/ds-wms-service/DS.WMS.Core/Op/Method/BLIssueManage/BLIssueManageService.cs b/ds-wms-service/DS.WMS.Core/Op/Method/BLIssueManage/BLIssueManageService.cs index 9b4895a6..323a2ed9 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Method/BLIssueManage/BLIssueManageService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Method/BLIssueManage/BLIssueManageService.cs @@ -583,76 +583,160 @@ namespace DS.WMS.Core.Op.Method */ var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); - var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + if (model.bookids.Any(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l,r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) - { - return DataResult.Failed("部分订单查询失败,请重新查询台账"); - } - - DateTime nowDate = DateTime.Now; + //if (orderList.Count != model.bookids.Length) + //{ + // return DataResult.Failed("部分订单查询失败,请重新查询台账"); + //} - foreach(var data in orderList) - { - var blModel = data.bl; + DateTime nowDate = DateTime.Now; - if (blModel == null || blModel.Id == 0) + foreach (var data in orderList) { - var dto = GetReadSaveInfo(data.order); + var blModel = data.bl; - var saveRlt = await Save(dto); + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order, null); - if (saveRlt.Succeeded) - blModel = saveRlt.Data; + var saveRlt = await Save(dto); + + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + + if (!blModel.IsCheckIn) + { + blModel.IsCheckIn = true; + blModel.CheckInBy = long.Parse(user.UserId); + blModel.CheckInUserName = user.UserName; + blModel.CheckInDate = nowDate; + blModel.CheckInNote = model.Notes; + blModel.Status = BLIssueStatusEnum.CheckIn.ToString(); + blModel.StatusName = BLIssueStatusEnum.CheckIn.GetDescription(); + + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.IsCheckIn, + x.CheckInBy, + x.CheckInUserName, + x.CheckInDate, + x.CheckInNote, + x.Status, + x.StatusName + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.CheckIn.ToString(), + ActionName = BLIssueActionEnum.CheckIn.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + #endregion + } + + if (model.bookids.Any(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.BusinessId == r.Id) + .Select((l,r) => new { m = r, h=l }) + .MergeTable() + .LeftJoin((l, r) => l.h.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.h.Id) && l.h.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); + + //if (orderList.Count != model.bookids.Length) + //{ + // return DataResult.Failed("部分订单查询失败,请重新查询台账"); + //} - if (!blModel.IsCheckIn) + DateTime nowDate = DateTime.Now; + + foreach (var data in orderList) { - blModel.IsCheckIn = true; - blModel.CheckInBy = long.Parse(user.UserId); - blModel.CheckInUserName = user.UserName; - blModel.CheckInDate = nowDate; - blModel.CheckInNote = model.Notes; - blModel.Status = BLIssueStatusEnum.CheckIn.ToString(); - blModel.StatusName = BLIssueStatusEnum.CheckIn.GetDescription(); + var blModel = data.bl; + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order.m, data.order.h); - await tenantDb.Updateable(blModel) - .UpdateColumns(x => new - { - x.IsCheckIn, - x.CheckInBy, - x.CheckInUserName, - x.CheckInDate, - x.CheckInNote, - x.Status, - x.StatusName - }).ExecuteCommandAsync(); + var saveRlt = await Save(dto); + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } - var log = new BLIssueManageLog + if (!blModel.IsCheckIn) { - Pid = blModel.Id, - ActionCode = BLIssueActionEnum.CheckIn.ToString(), - ActionName = BLIssueActionEnum.CheckIn.GetDescription(), - Note = model.Notes, - Result = "成功", - CreateBy = long.Parse(user.UserId), - CreateUserName = user.UserName, - CreateTime = nowDate, - }; + blModel.IsCheckIn = true; + blModel.CheckInBy = long.Parse(user.UserId); + blModel.CheckInUserName = user.UserName; + blModel.CheckInDate = nowDate; + blModel.CheckInNote = model.Notes; + blModel.Status = BLIssueStatusEnum.CheckIn.ToString(); + blModel.StatusName = BLIssueStatusEnum.CheckIn.GetDescription(); - await tenantDb.Insertable(log).ExecuteCommandAsync(); + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.IsCheckIn, + x.CheckInBy, + x.CheckInUserName, + x.CheckInDate, + x.CheckInNote, + x.Status, + x.StatusName + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.CheckIn.ToString(), + ActionName = BLIssueActionEnum.CheckIn.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + #endregion } + + return DataResult.Successed("成功"); } #endregion @@ -703,16 +787,18 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); + var checkIds = model.bookids.Select(a => a.bookid).ToArray(); + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) + if (orderList.Count != model.bookids.Count) { return DataResult.Failed("部分订单查询失败,请重新查询台账"); } @@ -779,72 +865,143 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); - var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + DateTime nowDate = DateTime.Now; + + if (model.bookids.Any(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) - { - return DataResult.Failed("部分订单查询失败,请重新查询台账"); - } + //if (orderList.Count != model.bookids.Length) + //{ + // return DataResult.Failed("部分订单查询失败,请重新查询台账"); + //} + foreach (var data in orderList) + { + var blModel = data.bl; - DateTime nowDate = DateTime.Now; + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order, null); - foreach (var data in orderList) - { - var blModel = data.bl; + var saveRlt = await Save(dto); - if (blModel == null || blModel.Id == 0) - { - var dto = GetReadSaveInfo(data.order); + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + if (!blModel.IsCheckOut) + { + blModel.IsCheckOut = true; + blModel.CheckOutBy = long.Parse(user.UserId); + blModel.CheckOutUserName = user.UserName; + blModel.CheckOutDate = nowDate; + blModel.CheckOutNote = model.Notes; + blModel.Status = BLIssueStatusEnum.CheckOut.ToString(); + blModel.StatusName = BLIssueStatusEnum.CheckOut.GetDescription(); - var saveRlt = await Save(dto); + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.IsCheckOut, + x.CheckOutBy, + x.CheckOutUserName, + x.CheckOutDate, + x.CheckOutNote, + x.Status, + x.StatusName + }).ExecuteCommandAsync(); - if (saveRlt.Succeeded) - blModel = saveRlt.Data; + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.CheckIn.ToString(), + ActionName = BLIssueActionEnum.CheckIn.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } - if (!blModel.IsCheckOut) + } + + if (model.bookids.Any(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.BusinessId == r.Id) + .Select((l, r) => new { m = r, h = l }) + .MergeTable() + .LeftJoin((l, r) => l.h.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.h.Id) && l.h.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); + + foreach (var data in orderList) { - blModel.IsCheckOut = true; - blModel.CheckOutBy = long.Parse(user.UserId); - blModel.CheckOutUserName = user.UserName; - blModel.CheckOutDate = nowDate; - blModel.CheckOutNote = model.Notes; - blModel.Status = BLIssueStatusEnum.CheckOut.ToString(); - blModel.StatusName = BLIssueStatusEnum.CheckOut.GetDescription(); + var blModel = data.bl; - await tenantDb.Updateable(blModel) - .UpdateColumns(x => new - { - x.IsCheckOut, - x.CheckOutBy, - x.CheckOutUserName, - x.CheckOutDate, - x.CheckOutNote, - x.Status, - x.StatusName - }).ExecuteCommandAsync(); + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order.m, data.order.h); + var saveRlt = await Save(dto); - var log = new BLIssueManageLog + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + if (!blModel.IsCheckOut) { - Pid = blModel.Id, - ActionCode = BLIssueActionEnum.CheckIn.ToString(), - ActionName = BLIssueActionEnum.CheckIn.GetDescription(), - Note = model.Notes, - Result = "成功", - CreateBy = long.Parse(user.UserId), - CreateUserName = user.UserName, - CreateTime = nowDate, - }; + blModel.IsCheckOut = true; + blModel.CheckOutBy = long.Parse(user.UserId); + blModel.CheckOutUserName = user.UserName; + blModel.CheckOutDate = nowDate; + blModel.CheckOutNote = model.Notes; + blModel.Status = BLIssueStatusEnum.CheckOut.ToString(); + blModel.StatusName = BLIssueStatusEnum.CheckOut.GetDescription(); - await tenantDb.Insertable(log).ExecuteCommandAsync(); + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.IsCheckOut, + x.CheckOutBy, + x.CheckOutUserName, + x.CheckOutDate, + x.CheckOutNote, + x.Status, + x.StatusName + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.CheckIn.ToString(), + ActionName = BLIssueActionEnum.CheckIn.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + #endregion } return DataResult.Successed(""); @@ -861,16 +1018,18 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); + var checkIds = model.bookids.Select(a => a.bookid).ToArray(); + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) + if (orderList.Count != model.bookids.Count) { return DataResult.Failed("部分订单查询失败,请重新查询台账"); } @@ -937,76 +1096,148 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); - var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + DateTime nowDate = DateTime.Now; + + if (model.bookids.Any(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) - { - return DataResult.Failed("部分订单查询失败,请重新查询台账"); - } - - DateTime nowDate = DateTime.Now; + //if (orderList.Count != model.bookids.Length) + //{ + // return DataResult.Failed("部分订单查询失败,请重新查询台账"); + //} - foreach (var data in orderList) - { - var blModel = data.bl; - if (blModel == null || blModel.Id == 0) + foreach (var data in orderList) { - var dto = GetReadSaveInfo(data.order); + var blModel = data.bl; - var saveRlt = await Save(dto); + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order, null); - if (saveRlt.Succeeded) - blModel = saveRlt.Data; - } + var saveRlt = await Save(dto); - if (!blModel.IsShipCertCheckIn) - { - blModel.IsShipCertCheckIn = true; - blModel.IsShipCertificate = true; - blModel.ShipCertCheckInBy = long.Parse(user.UserId); - blModel.ShipCertCheckInUserName = user.UserName; - blModel.ShipCertCheckInDate = nowDate; - blModel.ShipCertCheckInNote = model.Notes; + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } - await tenantDb.Updateable(blModel) - .UpdateColumns(x => new - { - x.IsShipCertificate, - x.IsShipCertCheckIn, - x.ShipCertCheckInBy, - x.ShipCertCheckInUserName, - x.ShipCertCheckInDate, - x.ShipCertCheckInNote, - }).ExecuteCommandAsync(); + if (!blModel.IsShipCertCheckIn) + { + blModel.IsShipCertCheckIn = true; + blModel.IsShipCertificate = true; + blModel.ShipCertCheckInBy = long.Parse(user.UserId); + blModel.ShipCertCheckInUserName = user.UserName; + blModel.ShipCertCheckInDate = nowDate; + blModel.ShipCertCheckInNote = model.Notes; + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.IsShipCertificate, + x.IsShipCertCheckIn, + x.ShipCertCheckInBy, + x.ShipCertCheckInUserName, + x.ShipCertCheckInDate, + x.ShipCertCheckInNote, + }).ExecuteCommandAsync(); - var log = new BLIssueManageLog - { - Pid = blModel.Id, - ActionCode = BLIssueActionEnum.ShipCertCheckIn.ToString(), - ActionName = BLIssueActionEnum.ShipCertCheckIn.GetDescription(), - Note = model.Notes, - Result = "成功", - CreateBy = long.Parse(user.UserId), - CreateUserName = user.UserName, - CreateTime = nowDate, - }; + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.ShipCertCheckIn.ToString(), + ActionName = BLIssueActionEnum.ShipCertCheckIn.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; - await tenantDb.Insertable(log).ExecuteCommandAsync(); + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } } - return DataResult.Successed("成功"); - } - #endregion + if (model.bookids.Any(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.BusinessId == r.Id) + .Select((l, r) => new { m = r, h = l }) + .MergeTable() + .LeftJoin((l, r) => l.h.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.h.Id) && l.h.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); + + foreach (var data in orderList) + { + var blModel = data.bl; + + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order.m, data.order.h); + + var saveRlt = await Save(dto); + + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + + if (!blModel.IsShipCertCheckIn) + { + blModel.IsShipCertCheckIn = true; + blModel.IsShipCertificate = true; + blModel.ShipCertCheckInBy = long.Parse(user.UserId); + blModel.ShipCertCheckInUserName = user.UserName; + blModel.ShipCertCheckInDate = nowDate; + blModel.ShipCertCheckInNote = model.Notes; + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.IsShipCertificate, + x.IsShipCertCheckIn, + x.ShipCertCheckInBy, + x.ShipCertCheckInUserName, + x.ShipCertCheckInDate, + x.ShipCertCheckInNote, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.ShipCertCheckIn.ToString(), + ActionName = BLIssueActionEnum.ShipCertCheckIn.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } + } + #endregion + } + + return DataResult.Successed("成功"); + } + #endregion #region 取消船证签入 /// @@ -1018,16 +1249,18 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); + var checkIds = model.bookids.Select(a => a.bookid).ToArray(); + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) + if (orderList.Count != model.bookids.Count) { return DataResult.Failed("部分订单查询失败,请重新查询台账"); } @@ -1090,70 +1323,141 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); - var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + DateTime nowDate = DateTime.Now; + + if (model.bookids.Any(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) - { - return DataResult.Failed("部分订单查询失败,请重新查询台账"); - } + //if (orderList.Count != model.bookids.Length) + //{ + // return DataResult.Failed("部分订单查询失败,请重新查询台账"); + //} - DateTime nowDate = DateTime.Now; + foreach (var data in orderList) + { + var blModel = data.bl; - foreach (var data in orderList) - { - var blModel = data.bl; + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order, null); - if (blModel == null || blModel.Id == 0) - { - var dto = GetReadSaveInfo(data.order); + var saveRlt = await Save(dto); - var saveRlt = await Save(dto); + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + if (!blModel.IsShipCertCheckOut) + { + blModel.IsShipCertCheckOut = true; + blModel.IsShipCertificate = true; + blModel.ShipCertCheckOutBy = long.Parse(user.UserId); + blModel.ShipCertCheckOutUserName = user.UserName; + blModel.ShipCertCheckOutDate = nowDate; + blModel.ShipCertCheckOutNote = model.Notes; - if (saveRlt.Succeeded) - blModel = saveRlt.Data; + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.IsShipCertificate, + x.IsShipCertCheckOut, + x.ShipCertCheckOutBy, + x.ShipCertCheckOutUserName, + x.ShipCertCheckOutDate, + x.ShipCertCheckOutNote, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.ShipCertCheckOut.ToString(), + ActionName = BLIssueActionEnum.ShipCertCheckOut.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } - if (!blModel.IsShipCertCheckOut) + } + + if (model.bookids.Any(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.BusinessId == r.Id) + .Select((l, r) => new { m = r, h = l }) + .MergeTable() + .LeftJoin((l, r) => l.h.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.h.Id) && l.h.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); + + foreach (var data in orderList) { - blModel.IsShipCertCheckOut = true; - blModel.IsShipCertificate = true; - blModel.ShipCertCheckOutBy = long.Parse(user.UserId); - blModel.ShipCertCheckOutUserName = user.UserName; - blModel.ShipCertCheckOutDate = nowDate; - blModel.ShipCertCheckOutNote = model.Notes; + var blModel = data.bl; - await tenantDb.Updateable(blModel) - .UpdateColumns(x => new - { - x.IsShipCertificate, - x.IsShipCertCheckOut, - x.ShipCertCheckOutBy, - x.ShipCertCheckOutUserName, - x.ShipCertCheckOutDate, - x.ShipCertCheckOutNote, - }).ExecuteCommandAsync(); + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order.m, data.order.h); + var saveRlt = await Save(dto); - var log = new BLIssueManageLog + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + if (!blModel.IsShipCertCheckOut) { - Pid = blModel.Id, - ActionCode = BLIssueActionEnum.ShipCertCheckOut.ToString(), - ActionName = BLIssueActionEnum.ShipCertCheckOut.GetDescription(), - Note = model.Notes, - Result = "成功", - CreateBy = long.Parse(user.UserId), - CreateUserName = user.UserName, - CreateTime = nowDate, - }; + blModel.IsShipCertCheckOut = true; + blModel.IsShipCertificate = true; + blModel.ShipCertCheckOutBy = long.Parse(user.UserId); + blModel.ShipCertCheckOutUserName = user.UserName; + blModel.ShipCertCheckOutDate = nowDate; + blModel.ShipCertCheckOutNote = model.Notes; - await tenantDb.Insertable(log).ExecuteCommandAsync(); + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.IsShipCertificate, + x.IsShipCertCheckOut, + x.ShipCertCheckOutBy, + x.ShipCertCheckOutUserName, + x.ShipCertCheckOutDate, + x.ShipCertCheckOutNote, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.ShipCertCheckOut.ToString(), + ActionName = BLIssueActionEnum.ShipCertCheckOut.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + #endregion } return DataResult.Successed("成功"); @@ -1170,16 +1474,18 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); + var checkIds = model.bookids.Select(a => a.bookid).ToArray(); + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) + if (orderList.Count != model.bookids.Count) { return DataResult.Failed("部分订单查询失败,请重新查询台账"); } @@ -1245,73 +1551,139 @@ namespace DS.WMS.Core.Op.Method */ var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); - var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + DateTime nowDate = DateTime.Now; + + if (model.bookids.Any(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) - { - return DataResult.Failed("部分订单查询失败,请重新查询台账"); - } + //if (orderList.Count != model.bookids.Length) + //{ + // return DataResult.Failed("部分订单查询失败,请重新查询台账"); + //} - if (orderList.Any(p => !p.bl.IsCheckIn)) - { - string s = string.Join(",", orderList.Where(p => !p.bl.IsCheckIn) - .Select(b => b.bl.BLNo).ToArray()); + if (orderList.Any(p => !p.bl.IsCheckIn)) + { + string s = string.Join(",", orderList.Where(p => !p.bl.IsCheckIn) + .Select(b => b.bl.BLNo).ToArray()); - return DataResult.Failed($"提单号:{s} 不能操作,只有已提单已签入才能进行 提单换签(背书)"); - } + return DataResult.Failed($"提单号:{s} 不能操作,只有已提单已签入才能进行 提单换签(背书)"); + } - DateTime nowDate = DateTime.Now; + foreach (var data in orderList) + { + var blModel = data.bl; - foreach (var data in orderList) - { - var blModel = data.bl; + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order, null); - if (blModel == null || blModel.Id == 0) - { - var dto = GetReadSaveInfo(data.order); + var saveRlt = await Save(dto); - var saveRlt = await Save(dto); + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } - if (saveRlt.Succeeded) - blModel = saveRlt.Data; + if (blModel.IsCheckIn) + { + blModel.Status = BLIssueStatusEnum.ChangeEndorse.ToString(); + blModel.StatusName = BLIssueStatusEnum.ChangeEndorse.GetDescription(); + blModel.IsChangeEndorse = true; + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.Status, + x.StatusName, + x.IsChangeEndorse, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.ChangeEndorse.ToString(), + ActionName = BLIssueActionEnum.ChangeEndorse.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + } + + if (model.bookids.Any(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.BusinessId == r.Id) + .Select((l, r) => new { m = r, h = l }) + .MergeTable() + .LeftJoin((l, r) => l.h.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.h.Id) && l.h.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); - if (blModel.IsCheckIn) + foreach (var data in orderList) { - blModel.Status = BLIssueStatusEnum.ChangeEndorse.ToString(); - blModel.StatusName = BLIssueStatusEnum.ChangeEndorse.GetDescription(); - blModel.IsChangeEndorse = true; + var blModel = data.bl; - await tenantDb.Updateable(blModel) - .UpdateColumns(x => new - { - x.Status, - x.StatusName, - x.IsChangeEndorse, - }).ExecuteCommandAsync(); + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order.m, data.order.h); + var saveRlt = await Save(dto); - var log = new BLIssueManageLog + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + + if (blModel.IsCheckIn) { - Pid = blModel.Id, - ActionCode = BLIssueActionEnum.ChangeEndorse.ToString(), - ActionName = BLIssueActionEnum.ChangeEndorse.GetDescription(), - Note = model.Notes, - Result = "成功", - CreateBy = long.Parse(user.UserId), - CreateUserName = user.UserName, - CreateTime = nowDate, - }; + blModel.Status = BLIssueStatusEnum.ChangeEndorse.ToString(); + blModel.StatusName = BLIssueStatusEnum.ChangeEndorse.GetDescription(); + blModel.IsChangeEndorse = true; - await tenantDb.Insertable(log).ExecuteCommandAsync(); + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.Status, + x.StatusName, + x.IsChangeEndorse, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.ChangeEndorse.ToString(), + ActionName = BLIssueActionEnum.ChangeEndorse.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + #endregion } return DataResult.Successed("成功"); @@ -1331,16 +1703,18 @@ namespace DS.WMS.Core.Op.Method */ var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); + var checkIds = model.bookids.Select(a => a.bookid).ToArray(); + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) + if (orderList.Count != model.bookids.Count) { return DataResult.Failed("部分订单查询失败,请重新查询台账"); } @@ -1439,73 +1813,140 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); - var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) - .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) - .Select((l, r) => new { order = l, bl = r }) - .ToList(); + DateTime nowDate = DateTime.Now; - if (orderList.Count != model.bookids.Length) + if (model.bookids.Any(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase))) { - return DataResult.Failed("部分订单查询失败,请重新查询台账"); - } + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); - if (orderList.Any(p => !p.bl.IsCheckIn)) - { - string s = string.Join(",", orderList.Where(p => !p.bl.IsCheckIn) - .Select(b => b.bl.BLNo).ToArray()); + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); - return DataResult.Failed($"提单号:{s} 不能操作,只有已提单已签入才能进行 驳回放单通知"); - } + //if (orderList.Count != model.bookids.Length) + //{ + // return DataResult.Failed("部分订单查询失败,请重新查询台账"); + //} - DateTime nowDate = DateTime.Now; + if (orderList.Any(p => !p.bl.IsCheckIn)) + { + string s = string.Join(",", orderList.Where(p => !p.bl.IsCheckIn) + .Select(b => b.bl.BLNo).ToArray()); - foreach (var data in orderList) - { - var blModel = data.bl; + return DataResult.Failed($"提单号:{s} 不能操作,只有已提单已签入才能进行 驳回放单通知"); + } - if (blModel == null || blModel.Id == 0) + foreach (var data in orderList) { - var dto = GetReadSaveInfo(data.order); + var blModel = data.bl; - var saveRlt = await Save(dto); + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order, null); - if (saveRlt.Succeeded) - blModel = saveRlt.Data; - } + var saveRlt = await Save(dto); - if (blModel.IsCheckIn) - { - blModel.Status = BLIssueStatusEnum.RejectReleaeNotice.ToString(); - blModel.StatusName = BLIssueStatusEnum.RejectReleaeNotice.GetDescription(); - blModel.IsChangeEndorse = true; + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } - await tenantDb.Updateable(blModel) - .UpdateColumns(x => new + if (blModel.IsCheckIn) + { + blModel.Status = BLIssueStatusEnum.RejectReleaeNotice.ToString(); + blModel.StatusName = BLIssueStatusEnum.RejectReleaeNotice.GetDescription(); + blModel.IsChangeEndorse = true; + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.Status, + x.StatusName, + x.IsChangeEndorse, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog { - x.Status, - x.StatusName, - x.IsChangeEndorse, - }).ExecuteCommandAsync(); + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.RejectReleaeNotice.ToString(), + ActionName = BLIssueActionEnum.RejectReleaeNotice.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } + } + } - var log = new BLIssueManageLog + if (model.bookids.Any(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.BusinessId == r.Id) + .Select((l, r) => new { m = r, h = l }) + .MergeTable() + .LeftJoin((l, r) => l.h.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.h.Id) && l.h.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); + + foreach (var data in orderList) + { + var blModel = data.bl; + + if (blModel == null || blModel.Id == 0) { - Pid = blModel.Id, - ActionCode = BLIssueActionEnum.RejectReleaeNotice.ToString(), - ActionName = BLIssueActionEnum.RejectReleaeNotice.GetDescription(), - Note = model.Notes, - Result = "成功", - CreateBy = long.Parse(user.UserId), - CreateUserName = user.UserName, - CreateTime = nowDate, - }; + var dto = GetReadSaveInfo(data.order.m, data.order.h); - await tenantDb.Insertable(log).ExecuteCommandAsync(); + var saveRlt = await Save(dto); + + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + + if (blModel.IsCheckIn) + { + blModel.Status = BLIssueStatusEnum.RejectReleaeNotice.ToString(); + blModel.StatusName = BLIssueStatusEnum.RejectReleaeNotice.GetDescription(); + blModel.IsChangeEndorse = true; + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.Status, + x.StatusName, + x.IsChangeEndorse, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.RejectReleaeNotice.ToString(), + ActionName = BLIssueActionEnum.RejectReleaeNotice.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + + #endregion } return DataResult.Successed("成功"); @@ -1522,71 +1963,136 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); - var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + DateTime nowDate = DateTime.Now; + + if (model.bookids.Any(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) - { - return DataResult.Failed("部分订单查询失败,请重新查询台账"); - } + if (orderList.Count != model.bookids.Count) + { + return DataResult.Failed("部分订单查询失败,请重新查询台账"); + } - if (orderList.Any(p => !p.bl.IsCheckIn)) - { - string s = string.Join(",", orderList.Where(p => !p.bl.IsCheckIn) - .Select(b => b.bl.BLNo).ToArray()); + if (orderList.Any(p => !p.bl.IsCheckIn)) + { + string s = string.Join(",", orderList.Where(p => !p.bl.IsCheckIn) + .Select(b => b.bl.BLNo).ToArray()); - return DataResult.Failed($"提单号:{s} 不能操作,只有已提单已签入才能进行 更改提单(其他)"); - } + return DataResult.Failed($"提单号:{s} 不能操作,只有已提单已签入才能进行 更改提单(其他)"); + } - DateTime nowDate = DateTime.Now; + foreach (var data in orderList) + { + var blModel = data.bl; - foreach (var data in orderList) - { - var blModel = data.bl; + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order, null); - if (blModel == null || blModel.Id == 0) - { - var dto = GetReadSaveInfo(data.order); + var saveRlt = await Save(dto); - var saveRlt = await Save(dto); + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } - if (saveRlt.Succeeded) - blModel = saveRlt.Data; + if (blModel.IsCheckIn) + { + blModel.Status = BLIssueStatusEnum.BLModify.ToString(); + blModel.StatusName = BLIssueStatusEnum.BLModify.GetDescription(); + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.Status, + x.StatusName, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.RejectReleaeNotice.ToString(), + ActionName = BLIssueActionEnum.RejectReleaeNotice.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + } - if (blModel.IsCheckIn) + if (model.bookids.Any(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.BusinessId == r.Id) + .Select((l, r) => new { m = r, h = l }) + .MergeTable() + .LeftJoin((l, r) => l.h.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.h.Id) && l.h.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); + + foreach (var data in orderList) { - blModel.Status = BLIssueStatusEnum.BLModify.ToString(); - blModel.StatusName = BLIssueStatusEnum.BLModify.GetDescription(); + var blModel = data.bl; - await tenantDb.Updateable(blModel) - .UpdateColumns(x => new - { - x.Status, - x.StatusName, - }).ExecuteCommandAsync(); + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order.m, data.order.h); + var saveRlt = await Save(dto); - var log = new BLIssueManageLog + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + + if (blModel.IsCheckIn) { - Pid = blModel.Id, - ActionCode = BLIssueActionEnum.RejectReleaeNotice.ToString(), - ActionName = BLIssueActionEnum.RejectReleaeNotice.GetDescription(), - Note = model.Notes, - Result = "成功", - CreateBy = long.Parse(user.UserId), - CreateUserName = user.UserName, - CreateTime = nowDate, - }; + blModel.Status = BLIssueStatusEnum.BLModify.ToString(); + blModel.StatusName = BLIssueStatusEnum.BLModify.GetDescription(); - await tenantDb.Insertable(log).ExecuteCommandAsync(); + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.Status, + x.StatusName, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.RejectReleaeNotice.ToString(), + ActionName = BLIssueActionEnum.RejectReleaeNotice.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + #endregion } return DataResult.Successed("成功"); @@ -1603,71 +2109,135 @@ namespace DS.WMS.Core.Op.Method { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); - if (model.bookids.Length == 0) + if (model.bookids.Count == 0) return DataResult.Failed("请求参数错误,请选择提单记录"); - var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + DateTime nowDate = DateTime.Now; + + if (model.bookids.Any(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("M", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) .LeftJoin((l, r) => l.Id == r.BookingId) - .Where((l, r) => model.bookids.Contains(l.Id) && l.Deleted == false) + .Where((l, r) => checkIds.Contains(l.Id) && l.Deleted == false) .Select((l, r) => new { order = l, bl = r }) .ToList(); - if (orderList.Count != model.bookids.Length) - { - return DataResult.Failed("部分订单查询失败,请重新查询台账"); - } + //if (orderList.Count != model.bookids.Length) + //{ + // return DataResult.Failed("部分订单查询失败,请重新查询台账"); + //} - if (orderList.Any(p => !p.bl.IsCheckIn)) - { - string s = string.Join(",", orderList.Where(p => !p.bl.IsCheckIn) - .Select(b => b.bl.BLNo).ToArray()); + if (orderList.Any(p => !p.bl.IsCheckIn)) + { + string s = string.Join(",", orderList.Where(p => !p.bl.IsCheckIn) + .Select(b => b.bl.BLNo).ToArray()); - return DataResult.Failed($"提单号:{s} 不能操作,只有已提单已签入才能进行 状态更改"); - } + return DataResult.Failed($"提单号:{s} 不能操作,只有已提单已签入才能进行 状态更改"); + } - DateTime nowDate = DateTime.Now; + foreach (var data in orderList) + { + var blModel = data.bl; - foreach (var data in orderList) - { - var blModel = data.bl; + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order, null); - if (blModel == null || blModel.Id == 0) - { - var dto = GetReadSaveInfo(data.order); + var saveRlt = await Save(dto); - var saveRlt = await Save(dto); + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } - if (saveRlt.Succeeded) - blModel = saveRlt.Data; + if (blModel.IsCheckIn) + { + blModel.Status = BLIssueStatusEnum.StatusModify.ToString(); + blModel.StatusName = BLIssueStatusEnum.StatusModify.GetDescription(); + + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.Status, + x.StatusName, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.StatusModify.ToString(), + ActionName = BLIssueActionEnum.StatusModify.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + } + + if (model.bookids.Any(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase))) + { + var checkIds = model.bookids.Where(a => a.MHBillType.Equals("H", StringComparison.OrdinalIgnoreCase)).Select(a => a.bookid).ToArray(); + + #region 主单处理 + var orderList = tenantDb.Queryable().ClearFilter(typeof(IOrgId)) + .LeftJoin((l, r) => l.BusinessId == r.Id) + .Select((l, r) => new { m = r, h = l }) + .MergeTable() + .LeftJoin((l, r) => l.h.Id == r.BookingId) + .Where((l, r) => checkIds.Contains(l.h.Id) && l.h.Deleted == false) + .Select((l, r) => new { order = l, bl = r }) + .ToList(); - if (blModel.IsCheckIn) + foreach (var data in orderList) { - blModel.Status = BLIssueStatusEnum.StatusModify.ToString(); - blModel.StatusName = BLIssueStatusEnum.StatusModify.GetDescription(); + var blModel = data.bl; - await tenantDb.Updateable(blModel) - .UpdateColumns(x => new - { - x.Status, - x.StatusName, - }).ExecuteCommandAsync(); + if (blModel == null || blModel.Id == 0) + { + var dto = GetReadSaveInfo(data.order.m, data.order.h); + var saveRlt = await Save(dto); - var log = new BLIssueManageLog + if (saveRlt.Succeeded) + blModel = saveRlt.Data; + } + + if (blModel.IsCheckIn) { - Pid = blModel.Id, - ActionCode = BLIssueActionEnum.StatusModify.ToString(), - ActionName = BLIssueActionEnum.StatusModify.GetDescription(), - Note = model.Notes, - Result = "成功", - CreateBy = long.Parse(user.UserId), - CreateUserName = user.UserName, - CreateTime = nowDate, - }; + blModel.Status = BLIssueStatusEnum.StatusModify.ToString(); + blModel.StatusName = BLIssueStatusEnum.StatusModify.GetDescription(); - await tenantDb.Insertable(log).ExecuteCommandAsync(); + await tenantDb.Updateable(blModel) + .UpdateColumns(x => new + { + x.Status, + x.StatusName, + }).ExecuteCommandAsync(); + + + var log = new BLIssueManageLog + { + Pid = blModel.Id, + ActionCode = BLIssueActionEnum.StatusModify.ToString(), + ActionName = BLIssueActionEnum.StatusModify.GetDescription(), + Note = model.Notes, + Result = "成功", + CreateBy = long.Parse(user.UserId), + CreateUserName = user.UserName, + CreateTime = nowDate, + }; + + await tenantDb.Insertable(log).ExecuteCommandAsync(); + } } + #endregion } return DataResult.Successed("成功"); @@ -1775,11 +2345,13 @@ namespace DS.WMS.Core.Op.Method /// 获取待保存提单管理详情 /// /// 订单详情 + /// 分单详情 + /// 是否分单 true-分单 false-主单 /// 业务类型 /// - private BLIssueManageBaseInputDto GetReadSaveInfo(SeaExport order, BLIssueBusiTypeEnum busiTypeEnum = BLIssueBusiTypeEnum.SeaExport) + private BLIssueManageBaseInputDto GetReadSaveInfo(SeaExport order, SeaExportBillManage hOrder, bool isHouseBill = false, BLIssueBusiTypeEnum busiTypeEnum = BLIssueBusiTypeEnum.SeaExport) { - return new BLIssueManageBaseInputDto + var model = new BLIssueManageBaseInputDto { BookingId = order.Id, BLNo = order.MBLNO, @@ -1787,23 +2359,57 @@ namespace DS.WMS.Core.Op.Method CustomerName = order.CustomerName, SaleId = order.SaleId, Sale = order.Sale, - IssueType = order.IssueType, - IssueTypeCode = order.IssueTypeCode, - IssuePlaceCode = order.IssuePlaceCode, - IssuePlace = order.IssuePlace, - LoadPortId = order.LoadPortId, - LoadPortCode = order.LoadPortCode, - LoadPort = order.LoadPort, - DischargePortId = order.DischargePortId, - DischargePortCode = order.DischargePortCode, - DischargePort = order.DischargePort, CustomerService = order.CustomerService, CustomerServiceName = order.CustomerServiceName, BusiType = busiTypeEnum.ToString(), BusiTypeName = busiTypeEnum.GetDescription(), BLType = BLTypeEnum.BL.ToString(), BLTypeName = BLTypeEnum.BL.GetDescription(), + ETD = order.ETD, + ETA = order.ETA, + StlDate = order.StlDate, + StlName = order.StlName, + HBLNo = hOrder != null ? order.HBLNO : "", + MHBillType = isHouseBill ? "H" : "M" }; + + if (hOrder != null && hOrder.Id > 0) + { + model.IssueType = order.IssueType; + model.IssueTypeCode = order.IssueTypeCode; + model.IssuePlaceCode = order.IssuePlaceCode; + model.IssuePlace = order.IssuePlace; + model.LoadPortId = order.LoadPortId; + model.LoadPortCode = order.LoadPortCode; + model.LoadPort = order.LoadPort; + model.DischargePortId = order.DischargePortId; + model.DischargePortCode = order.DischargePortCode; + model.DischargePort = order.DischargePort; + model.CustomerService = order.CustomerService; + } + else + { + model.IssueType = hOrder.IssueType; + //model.IssueTypeCode = hOrder.IssueTypeCode; + //model.IssuePlaceCode = hOrder.IssuePlaceCode; + model.IssuePlace = hOrder.IssuePlace; + model.LoadPortId = hOrder.LoadPortId; + //model.LoadPortCode = hOrder.LoadPortCode; + model.LoadPort = hOrder.LoadPort; + model.DischargePortId = hOrder.DischargePortId; + //model.DischargePortCode = hOrder.DischargePortCode; + model.DischargePort = hOrder.DischargePort; + } + + if (order.ETD.HasValue && order.StlDate.HasValue) + { + TimeSpan ts = order.StlDate.Value.Subtract(order.ETD.Value); + var timeDiff = (decimal)ts.TotalMinutes; + + model.AgreementDays = (Int16)Math.Ceiling(timeDiff / (24 * 60m)); + } + + return model; } #endregion } From 160bfad259195adbf79faac0c56d9d7427aa0609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B5=87=E6=96=87=E9=BE=99?= Date: Tue, 5 Nov 2024 17:46:17 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E5=88=A4=E6=96=ADbug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DS.Module.Quartz/QuartzModuleInstall.cs | 26 ++- .../DS.WMS.Core/Flow/Method/FlowRuntime.cs | 11 +- .../QuarztJobs/BackgroundTaskJob.cs | 150 ++++++++++++++++++ .../TaskInteraction/Dtos/TaskJobContext.cs | 26 +++ .../TaskInteraction/Dtos/TaskRequest.cs | 6 + .../TaskInteraction/Entity/TaskJob.cs | 72 +++++++++ .../TaskInteraction/Interface/ITaskJob.cs | 17 ++ .../Method/FeeBillTaskService.cs | 28 ++-- .../TaskInteraction/Method/TaskService.cs | 22 ++- .../Controllers/FeeAuditController.cs | 29 +++- .../FolderProfile1.pubxml.user | 2 +- 11 files changed, 361 insertions(+), 28 deletions(-) create mode 100644 ds-wms-service/DS.WMS.Core/QuarztJobs/BackgroundTaskJob.cs create mode 100644 ds-wms-service/DS.WMS.Core/TaskInteraction/Dtos/TaskJobContext.cs create mode 100644 ds-wms-service/DS.WMS.Core/TaskInteraction/Entity/TaskJob.cs create mode 100644 ds-wms-service/DS.WMS.Core/TaskInteraction/Interface/ITaskJob.cs diff --git a/ds-wms-service/DS.Module.Quartz/QuartzModuleInstall.cs b/ds-wms-service/DS.Module.Quartz/QuartzModuleInstall.cs index 5ebddd1a..58f42b17 100644 --- a/ds-wms-service/DS.Module.Quartz/QuartzModuleInstall.cs +++ b/ds-wms-service/DS.Module.Quartz/QuartzModuleInstall.cs @@ -9,6 +9,11 @@ namespace DS.Module.QuartzModuleInstall { public static class QuartzModuleInstall { + /// + /// 添加费用模块定时任务 + /// + /// + /// public static void AddFeeQuartzModuleInstall(this IServiceCollection services, IConfiguration configuration) { //获取进项发票 @@ -62,6 +67,11 @@ namespace DS.Module.QuartzModuleInstall services.AddQuartzServer(q => q.WaitForJobsToComplete = true); } + /// + /// 添加操作模块定时任务 + /// + /// + /// public static void AddOpQuartzModuleInstall(this IServiceCollection services, IConfiguration configuration) { var jobKey1 = new JobKey(nameof(WSLReportJob)); @@ -73,10 +83,24 @@ namespace DS.Module.QuartzModuleInstall .ForJob(jobKey1) .WithIdentity(nameof(WSLReportJob) + "-trigger") .WithCronSchedule(configuration["JobConfig:" + jobKey1.Name]) - //.WithSimpleSchedule(s => s.WithIntervalInMinutes(1).WithRepeatCount(1)) //测试用 ); }); + //var jobKey2 = new JobKey(nameof(BackgroundTaskJob)); + //services.AddQuartz(q => + //{ + // // 配置 Quartz + // q.UseMicrosoftDependencyInjectionJobFactory(); + + // q.AddJob(opts => opts.WithIdentity(jobKey2)); + // q.AddTrigger(opts => opts + // .ForJob(jobKey2) + // .WithIdentity(nameof(BackgroundTaskJob) + "-trigger") + // .WithSimpleSchedule(x => x + // .WithIntervalInMinutes(2) + // .RepeatForever())); + //}); + services.AddQuartzServer(q => q.WaitForJobsToComplete = true); } } diff --git a/ds-wms-service/DS.WMS.Core/Flow/Method/FlowRuntime.cs b/ds-wms-service/DS.WMS.Core/Flow/Method/FlowRuntime.cs index 67f5e825..3016604b 100644 --- a/ds-wms-service/DS.WMS.Core/Flow/Method/FlowRuntime.cs +++ b/ds-wms-service/DS.WMS.Core/Flow/Method/FlowRuntime.cs @@ -266,10 +266,10 @@ public class FlowRuntime if (scalar.ObjToInt() > 0 || scalar.ObjToBool()) { conditionId = conditionNode.Id; - //break; + break; } - else { - + else + { conditionId = conditionNode.Pid; } } @@ -361,14 +361,15 @@ public class FlowRuntime if (nextChild.Type == FlowChild.Exclusive) { var childId = GetNextConditionNodeId(nextChild); - if (childId == null) { + if (childId == null) + { childId = "end"; return ChildNodes.Where(x => x.Id == childId).First(); //下一个节点 } else { return ChildNodes.Where(x => x.Id == childId).First(); //下一个节点 - } + } } //todo:前端组织JSON结构有误,加入临时修复代码,待前端改正后移除 else if (nextChild.Type == null) diff --git a/ds-wms-service/DS.WMS.Core/QuarztJobs/BackgroundTaskJob.cs b/ds-wms-service/DS.WMS.Core/QuarztJobs/BackgroundTaskJob.cs new file mode 100644 index 00000000..f040071c --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/QuarztJobs/BackgroundTaskJob.cs @@ -0,0 +1,150 @@ +using DS.Module.Core; +using DS.WMS.Core.TaskInteraction.Dtos; +using DS.WMS.Core.TaskInteraction.Entity; +using DS.WMS.Core.TaskInteraction.Interface; +using Fasterflect; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Quartz; +using SqlSugar; + +namespace DS.WMS.Core.QuarztJobs +{ + /// + /// 定时作业触发 + /// + public sealed class BackgroundTaskJob : IJob + { + IServiceProvider serviceProvider; + ISqlSugarClient? db; + ILogger logger; + + /// + /// 初始化 + /// + /// + public BackgroundTaskJob(IServiceProvider serviceProvider) + { + this.serviceProvider = serviceProvider; + logger = serviceProvider.GetRequiredService>(); + db = serviceProvider.GetRequiredService(); + } + + /// + /// 执行任务 + /// + /// + /// + public async Task Execute(IJobExecutionContext context) + { + var dbLinks = await db.Queryable().ToListAsync(); + SqlSugarClient? tenantDb = null; + try + { + foreach (var dbLink in dbLinks) + { + tenantDb = new SqlSugarClient(new ConnectionConfig + { + ConfigId = dbLink.Id, + ConnectionString = dbLink.Connection, + DbType = dbLink.DbType, + IsAutoCloseConnection = true + }); + tenantDb.QueryFilter.Clear(); + var jobs = await tenantDb.Queryable() + .InnerJoin((x, y) => x.TaskId == y.Id) + .Where((x, y) => y.TaskStatus == TaskStatusEnum.Create && !x.IsExecuted && SqlFunc.GetDate() >= x.NextTriggerTime) + .Select((x, y) => new TaskJob + { + Id = x.Id, + TaskId = x.TaskId, + NextTriggerTime = x.NextTriggerTime, + TypeName = x.TypeName, + BusinessId = y.BusinessId, + BusinessType = y.BusinessType, + }).ToListAsync(); + if (jobs.Count == 0) + return; + + var jobContext = new TaskJobContext + { + AdditionalData = context.MergedJobDataMap! + }; + + foreach (var item in jobs) + { + var type = Type.GetType(item.TypeName, false); + if (type == null) + continue; + + try + { + if (ConstructorExtensions.CreateInstance(type, serviceProvider) is ITaskJob job) + { + jobContext.JobInfo = item; + jobContext.Result = DataResult.Success; + await job.Execute(jobContext); + + if (jobContext.Result.Succeeded) + { + item.IsExecuted = true; + item.NextTriggerTime = null; + } + } + } + catch (Exception ex) + { + item.LastException = $"执行作业({item.Id})时发生错误:" + ex.Message + Environment.NewLine + ex.StackTrace; + } + } + + await tenantDb.Updateable(jobs).UpdateColumns(x => new + { + x.IsExecuted, + x.NextTriggerTime, + x.LastException + }).ExecuteCommandAsync(); + + var finishedJobs = jobs.FindAll(x => x.IsExecuted); + if (finishedJobs.Count > 0) //尝试更新关联任务 + { + List tasks = []; + var ids = finishedJobs.Select(x => x.TaskId).Distinct(); + var list = await tenantDb.Queryable().Where(x => ids.Contains(x.TaskId)) + .Select(x => new + { + x.Id, + x.TaskId, + x.IsExecuted + }).ToListAsync(); + var groups = list.GroupBy(x => x.TaskId); + DateTime dtNow = DateTime.Now; + foreach (var group in groups) + { + if (group.Count() == group.Count(x => x.IsExecuted)) + { + tasks.Add(new BusinessTask + { + Id = group.Key, + TaskStatus = TaskStatusEnum.Complete, + UpdateTime = dtNow + }); + } + } + + await tenantDb.Updateable(tasks).UpdateColumns(x => new + { + x.TaskStatus, + x.UpdateBy, + x.UpdateTime + }).ExecuteCommandAsync(); + } + } + } + catch (Exception ex) + { + logger.LogError(ex, "执行定时作业时发生异常"); + } + } + } +} diff --git a/ds-wms-service/DS.WMS.Core/TaskInteraction/Dtos/TaskJobContext.cs b/ds-wms-service/DS.WMS.Core/TaskInteraction/Dtos/TaskJobContext.cs new file mode 100644 index 00000000..fa1cf399 --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/TaskInteraction/Dtos/TaskJobContext.cs @@ -0,0 +1,26 @@ +using DS.Module.Core; +using DS.WMS.Core.TaskInteraction.Entity; + +namespace DS.WMS.Core.TaskInteraction.Dtos +{ + /// + /// 定时任务执行上下文 + /// + public class TaskJobContext + { + /// + /// 任务信息 + /// + public TaskJob JobInfo { get; set; } + + /// + /// 任务参数 + /// + public IDictionary? AdditionalData { get; set; } + + /// + /// 执行结果 + /// + public DataResult Result { get; set; } = DataResult.Success; + } +} diff --git a/ds-wms-service/DS.WMS.Core/TaskInteraction/Dtos/TaskRequest.cs b/ds-wms-service/DS.WMS.Core/TaskInteraction/Dtos/TaskRequest.cs index 86962496..a58bae8f 100644 --- a/ds-wms-service/DS.WMS.Core/TaskInteraction/Dtos/TaskRequest.cs +++ b/ds-wms-service/DS.WMS.Core/TaskInteraction/Dtos/TaskRequest.cs @@ -2,6 +2,7 @@ using System.Runtime.Serialization; using DS.Module.Core; using DS.WMS.Core.Op.Entity; +using DS.WMS.Core.TaskInteraction.Entity; using DS.WMS.Core.TaskInteraction.Method; using Masuit.Tools.Systems; @@ -74,6 +75,11 @@ namespace DS.WMS.Core.TaskInteraction.Dtos /// public List? Steps { get; set; } + /// + /// 定时任务 + /// + public List? Jobs { get; set; } + /// /// 确定当前对象是否有效 /// diff --git a/ds-wms-service/DS.WMS.Core/TaskInteraction/Entity/TaskJob.cs b/ds-wms-service/DS.WMS.Core/TaskInteraction/Entity/TaskJob.cs new file mode 100644 index 00000000..b0ac722a --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/TaskInteraction/Entity/TaskJob.cs @@ -0,0 +1,72 @@ +using DS.WMS.Core.Op.Entity; +using SqlSugar; + +namespace DS.WMS.Core.TaskInteraction.Entity +{ + /// + /// 任务定时作业 + /// + [SugarTable("business_task_job", "任务定时作业")] + public class TaskJob + { + /// + /// ID + /// + [SugarColumn(IsPrimaryKey = true)] + public long Id { get; set; } + + /// + /// 任务ID + /// + [SugarColumn(ColumnDescription = "任务ID")] + public long TaskId { get; set; } + + /// + /// 定时任务类型 + /// + [SugarColumn(ColumnDescription = "定时任务类型", Length = 100, IsNullable = false)] + public string TypeName { get; set; } + + /// + /// 下次触发时间 + /// + [SugarColumn(ColumnDescription = "下次触发时间", IsNullable = true)] + public DateTime? NextTriggerTime { get; set; } + + /// + /// 是否已执行 + /// + [SugarColumn(ColumnDescription = "是否已执行")] + public bool IsExecuted { get; set; } + + /// + /// 上次执行异常信息 + /// + [SugarColumn(ColumnDescription = "上次执行异常信息", IsNullable = true)] + public string? LastException { get; set; } + + /// + /// 创建人 + /// + [SugarColumn(ColumnDescription = "创建人", IsNullable = false)] + public long CreateBy { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnDescription = "创建时间", IsNullable = false)] + public DateTime CreateTime { get; set; } + + /// + /// 业务ID + /// + [SugarColumn(IsIgnore = true)] + public long BusinessId { get; set; } + + /// + /// 业务类型 + /// + [SugarColumn(IsIgnore = true)] + public BusinessType? BusinessType { get; set; } + } +} diff --git a/ds-wms-service/DS.WMS.Core/TaskInteraction/Interface/ITaskJob.cs b/ds-wms-service/DS.WMS.Core/TaskInteraction/Interface/ITaskJob.cs new file mode 100644 index 00000000..0dd614ec --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/TaskInteraction/Interface/ITaskJob.cs @@ -0,0 +1,17 @@ +using DS.WMS.Core.TaskInteraction.Dtos; + +namespace DS.WMS.Core.TaskInteraction.Interface +{ + /// + /// 任务定时服务 + /// + public interface ITaskJob + { + /// + /// 执行 + /// + /// + /// + Task Execute(TaskJobContext context); + } +} diff --git a/ds-wms-service/DS.WMS.Core/TaskInteraction/Method/FeeBillTaskService.cs b/ds-wms-service/DS.WMS.Core/TaskInteraction/Method/FeeBillTaskService.cs index 7e807f3e..1fb1121b 100644 --- a/ds-wms-service/DS.WMS.Core/TaskInteraction/Method/FeeBillTaskService.cs +++ b/ds-wms-service/DS.WMS.Core/TaskInteraction/Method/FeeBillTaskService.cs @@ -189,22 +189,26 @@ namespace DS.WMS.Core.TaskInteraction.Method logger.LogError($"生成【{TaskBaseTypeEnum.BILL_LOCK_AUDIT.GetDescription()}】任务失败:" + result.Message); } + var req = new TaskCreationRequest + { + BusinessId = biz.BusinessId, + BusinessType = biz.BusinessType, + TaskTypeName = TaskBaseTypeEnum.BILL_SENDING.ToString(), + TaskTitle = $"【{TaskBaseTypeEnum.BILL_SENDING.GetDescription()}】{biz.CustomerNo}", + Jobs = [] + }; + req.Jobs.Add(new TaskJob + { + TypeName = "", + NextTriggerTime = dtNow.AddMinutes(60) + }); //生成账单任务 - + result = await CreateTaskAsync(req); + if (!result.Succeeded) + logger.LogError($"生成【{TaskBaseTypeEnum.BILL_SENDING.GetDescription()}】任务失败:" + result.Message); } } - /// - /// 锁单审核 - /// - /// - /// - public async Task BillLockAuditAsync(TaskAuditRequest request) - { - request.TaskTypeName = TaskBaseTypeEnum.BILL_LOCK_AUDIT.ToString(); - return await AuditAsync(request); - } - /// /// 设置锁定 /// diff --git a/ds-wms-service/DS.WMS.Core/TaskInteraction/Method/TaskService.cs b/ds-wms-service/DS.WMS.Core/TaskInteraction/Method/TaskService.cs index 015532db..60e9071c 100644 --- a/ds-wms-service/DS.WMS.Core/TaskInteraction/Method/TaskService.cs +++ b/ds-wms-service/DS.WMS.Core/TaskInteraction/Method/TaskService.cs @@ -9,7 +9,6 @@ using DS.WMS.Core.Flow.Entity; using DS.WMS.Core.Flow.Interface; using DS.WMS.Core.Flow.Method; using DS.WMS.Core.Info.Interface; -using DS.WMS.Core.Invoice.Dtos; using DS.WMS.Core.Op.Dtos; using DS.WMS.Core.Op.Entity; using DS.WMS.Core.Op.Interface; @@ -290,6 +289,7 @@ namespace DS.WMS.Core.TaskInteraction.Method task.NextType = await GetNextTypeAsync(task); await TenantDb.Insertable(task).ExecuteCommandAsync(); + if (request.Steps?.Count > 0) { var steps = request.Steps.Select(x => new TaskStep @@ -305,6 +305,15 @@ namespace DS.WMS.Core.TaskInteraction.Method await TenantDb.Insertable(steps).ExecuteCommandAsync(); } + if (request.Jobs?.Count > 0) + { + foreach (var item in request.Jobs) + { + item.TaskId = task.Id; + //item.NextTriggerTime ??= dtNow.AddMinutes(30); + } + await TenantDb.Insertable(request.Jobs).ExecuteCommandAsync(); + } result = await OnTaskCreated(task); if (!result.Succeeded) @@ -648,6 +657,11 @@ namespace DS.WMS.Core.TaskInteraction.Method } } + //public async Task SetJobsAsync(List jobs) + //{ + + //} + /// /// 当任务状态发生变化时调用 /// @@ -1046,13 +1060,17 @@ namespace DS.WMS.Core.TaskInteraction.Method var users = await FillInUserInfoAsync(userId); var dt = DateTime.Now; - await ManagerService.SetTaskUserStatus( + var result = await ManagerService.SetTaskUserStatus( callback.BusinessId, callback.AuditType.GetValueOrDefault(), TaskStatusEnum.Complete, //callback.Status == FlowStatusEnum.Approve ? TaskStatusEnum.Complete : TaskStatusEnum.Pending dt, users); + if (!result.Succeeded) + { + + } //记录日志 await LogService.WriteLogAsync(new BusinessTaskLog diff --git a/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeAuditController.cs b/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeAuditController.cs index 49995ab8..f622c4b8 100644 --- a/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeAuditController.cs +++ b/ds-wms-service/DS.WMS.FeeApi/Controllers/FeeAuditController.cs @@ -56,7 +56,7 @@ namespace DS.WMS.FeeApi.Controllers /// 查询条件 /// [HttpPost, Route("GetStat")] - public async Task> GetStatAsync(FeeStatisticsRequestV2 request) + public async Task> GetStatAsync([FromBody] FeeStatisticsRequestV2 request) { return await _auditService.GetStatAsync(request.Id, request.BusinessType, request.FeeId); } @@ -78,7 +78,7 @@ namespace DS.WMS.FeeApi.Controllers /// /// [HttpPost, Route("Audit")] - public async Task AuditAsync(AuditRequest request) + public async Task AuditAsync([FromBody] AuditRequest request) { if (request == null || request.Ids.Length == 0 || (request.Result != 1 && request.Result != 2)) return DataResult.Failed("参数无效", MultiLanguageConst.IllegalRequest); @@ -92,7 +92,7 @@ namespace DS.WMS.FeeApi.Controllers /// /// [HttpPost, Route("AuditByBiz")] - public async Task AuditAsync(BizAuditRequest request) + public async Task AuditAsync([FromBody] BizAuditRequest request) { if (request == null || (request.Result != 1 && request.Result != 2) || request.Items == null || request.Items.Count == 0) return DataResult.Failed("参数无效", MultiLanguageConst.IllegalRequest); @@ -106,7 +106,7 @@ namespace DS.WMS.FeeApi.Controllers /// /// [HttpPost, Route("OneClickAudit")] - public async Task OneClickAuditAsync(AuditConditionRequest request) + public async Task OneClickAuditAsync([FromBody] AuditConditionRequest request) { if (request.Result != 1 && request.Result != 2) return DataResult.Failed("参数无效", MultiLanguageConst.IllegalRequest); @@ -120,7 +120,7 @@ namespace DS.WMS.FeeApi.Controllers /// /// [HttpPost, Route("BusinessAudit")] - public async Task AuditBillAsync(TaskAuditRequest request) + public async Task AuditBillAsync([FromBody] TaskAuditRequest request) { if (request == null || (request.Result != 1 && request.Result != 2)) return DataResult.Failed("参数无效", MultiLanguageConst.IllegalRequest); @@ -128,13 +128,28 @@ namespace DS.WMS.FeeApi.Controllers return await _auditService.AuditBillAsync(request); } + /// + /// 锁单审核 + /// + /// + /// + /// + [HttpPost, Route("BusinessLockAudit")] + public async Task AuditBillLockAsync([FromServices] IFeeBillTaskService service, [FromBody] TaskAuditRequest request) + { + if (request == null || (request.Result != 1 && request.Result != 2)) + return DataResult.Failed("参数无效", MultiLanguageConst.IllegalRequest); + + return await service.AuditAsync(request); + } + /// /// 设置业务锁定状态 /// /// 请求信息 /// [HttpPost, Route("SetLocking")] - public async Task SetLockingAsync(BizOperation operation) + public async Task SetLockingAsync([FromBody] BizOperation operation) { bool? isLocked = null; try @@ -160,7 +175,7 @@ namespace DS.WMS.FeeApi.Controllers /// /// [HttpPost, Route("SetFeeStatus")] - public async Task SetFeeStatusAsync(IdModel idModel) + public async Task SetFeeStatusAsync([FromBody] IdModel idModel) { return await _auditService.SetFeeStatusAsync(idModel.Value, idModel.Ids); } 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 1f70f192..80d7b48a 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-11-04T09:39:07.1315345Z||;True|2024-11-04T17:32:28.9239052+08:00||;True|2024-11-04T15:49:58.6422421+08:00||;True|2024-11-04T15:39:25.1892907+08:00||;True|2024-11-04T15:21:49.7395112+08:00||;True|2024-11-04T11:26:53.4821041+08:00||;True|2024-11-04T11:19:48.8467193+08:00||;True|2024-11-04T11:01:39.9398452+08:00||;True|2024-11-04T10:30:55.0743204+08:00||;True|2024-11-02T21:17:44.8575190+08:00||;True|2024-11-02T20:54:29.9931812+08:00||;True|2024-11-02T20:39:20.4100370+08:00||;True|2024-11-02T18:33:41.0724285+08:00||;True|2024-11-02T18:21:55.8561639+08:00||;True|2024-11-02T17:36:24.3401782+08:00||;True|2024-11-02T16:38:03.0054105+08:00||;True|2024-11-02T16:26:26.1698304+08:00||;True|2024-11-02T16:15:20.2872358+08:00||;True|2024-11-02T15:19:14.9663838+08:00||;True|2024-11-02T14:39:47.8808708+08:00||;False|2024-11-02T14:22:04.2841792+08:00||;True|2024-11-02T11:50:48.2452805+08:00||;True|2024-10-29T18:52:12.7978878+08:00||;True|2024-10-29T10:27:49.1623527+08:00||;True|2024-10-25T15:09:27.7029075+08:00||;True|2024-10-25T10:29:26.9218878+08:00||;True|2024-10-22T17:58:39.9582805+08:00||;True|2024-10-21T17:57:21.7047579+08:00||;True|2024-10-21T14:30:54.4520206+08:00||;True|2024-10-21T10:19:05.7405749+08:00||;True|2024-10-18T16:11:05.4049685+08:00||;True|2024-10-18T14:59:49.1162741+08:00||;True|2024-10-16T16:29:15.3185348+08:00||;True|2024-10-16T14:12:58.1754214+08:00||;True|2024-10-16T14:08:06.5805581+08:00||;True|2024-10-16T11:55:29.8273176+08:00||;True|2024-10-15T17:39:40.4090324+08:00||;True|2024-10-15T17:06:43.0181578+08:00||;True|2024-10-15T15:07:38.9601925+08:00||;True|2024-10-12T13:33:32.4412583+08:00||;True|2024-10-11T17:00:54.0916209+08:00||;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-11-05T03:48:07.5089999Z||;True|2024-11-04T17:39:07.1315345+08:00||;True|2024-11-04T17:32:28.9239052+08:00||;True|2024-11-04T15:49:58.6422421+08:00||;True|2024-11-04T15:39:25.1892907+08:00||;True|2024-11-04T15:21:49.7395112+08:00||;True|2024-11-04T11:26:53.4821041+08:00||;True|2024-11-04T11:19:48.8467193+08:00||;True|2024-11-04T11:01:39.9398452+08:00||;True|2024-11-04T10:30:55.0743204+08:00||;True|2024-11-02T21:17:44.8575190+08:00||;True|2024-11-02T20:54:29.9931812+08:00||;True|2024-11-02T20:39:20.4100370+08:00||;True|2024-11-02T18:33:41.0724285+08:00||;True|2024-11-02T18:21:55.8561639+08:00||;True|2024-11-02T17:36:24.3401782+08:00||;True|2024-11-02T16:38:03.0054105+08:00||;True|2024-11-02T16:26:26.1698304+08:00||;True|2024-11-02T16:15:20.2872358+08:00||;True|2024-11-02T15:19:14.9663838+08:00||;True|2024-11-02T14:39:47.8808708+08:00||;False|2024-11-02T14:22:04.2841792+08:00||;True|2024-11-02T11:50:48.2452805+08:00||;True|2024-10-29T18:52:12.7978878+08:00||;True|2024-10-29T10:27:49.1623527+08:00||;True|2024-10-25T15:09:27.7029075+08:00||;True|2024-10-25T10:29:26.9218878+08:00||;True|2024-10-22T17:58:39.9582805+08:00||;True|2024-10-21T17:57:21.7047579+08:00||;True|2024-10-21T14:30:54.4520206+08:00||;True|2024-10-21T10:19:05.7405749+08:00||;True|2024-10-18T16:11:05.4049685+08:00||;True|2024-10-18T14:59:49.1162741+08:00||;True|2024-10-16T16:29:15.3185348+08:00||;True|2024-10-16T14:12:58.1754214+08:00||;True|2024-10-16T14:08:06.5805581+08:00||;True|2024-10-16T11:55:29.8273176+08:00||;True|2024-10-15T17:39:40.4090324+08:00||;True|2024-10-15T17:06:43.0181578+08:00||;True|2024-10-15T15:07:38.9601925+08:00||;True|2024-10-12T13:33:32.4412583+08:00||;True|2024-10-11T17:00:54.0916209+08:00||;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||; \ No newline at end of file