From 25b301c7e63ea77cb006eecc010d88eee921b119 Mon Sep 17 00:00:00 2001 From: 18942506660 <18942506660@A18942506660> Date: Fri, 22 Dec 2023 14:26:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml | 19 ++++++++-- src/WMS.Web.Domain/Entitys/OutStock.cs | 24 ++++++++++-- src/WMS.Web.Domain/Entitys/TakeStock.cs | 11 ++++++ .../IService/IOutStockService.cs | 2 +- .../IService/ITakeStockService.cs | 4 +- .../Infrastructure/ITakeStockRepositories.cs | 2 + .../Services/OutStockService.cs | 22 +++++++---- .../Services/TakeStockService.cs | 27 ++++++++----- .../TakeStockRepositories.cs | 38 ++++++++++++++++--- 9 files changed, 116 insertions(+), 33 deletions(-) diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 1a32a39b..8b453182 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -1264,6 +1264,11 @@ + + + 重传 + + 生成单据号 @@ -1805,6 +1810,11 @@ + + + 重传 + + 生成单据号 @@ -2416,6 +2426,9 @@ 查询实体集合 + + 修改实体集合 + 获取事务 用来处理即时库存 @@ -4101,7 +4114,7 @@ - + 同步金蝶 @@ -4969,14 +4982,14 @@ - + 同步金蝶 - + 盘盈盘亏同步金蝶 diff --git a/src/WMS.Web.Domain/Entitys/OutStock.cs b/src/WMS.Web.Domain/Entitys/OutStock.cs index b57263b1..ae3ea180 100644 --- a/src/WMS.Web.Domain/Entitys/OutStock.cs +++ b/src/WMS.Web.Domain/Entitys/OutStock.cs @@ -133,11 +133,11 @@ namespace WMS.Web.Domain.Entitys /// 同步金蝶(成功) /// /// - public void SyncSuccess(int erpDetailId, int operateId,string erpBillNo) + public void SyncSuccess(int erpDetailId, int operateId, string erpBillNo) { //foreach (var e in erpDetailIds) // this.SuccessSyncFail.Remove(e); - var erpd = this.Details.SelectMany(s => s.ErpDetails).FirstOrDefault(w => w.Erp_DetailId==erpDetailId); + var erpd = this.Details.SelectMany(s => s.ErpDetails).FirstOrDefault(w => w.Erp_DetailId == erpDetailId); erpd.SuccessSync = SyncStatus.Success; erpd.ErpSyncBillNo = erpBillNo; //foreach (var e in erpd) @@ -147,7 +147,7 @@ namespace WMS.Web.Domain.Entitys //} //所有erp明细同步成功才是整个单据成功 var erpDetails = this.Details.SelectMany(s => s.ErpDetails); - if (erpDetails.Where(w => w.SuccessSync == SyncStatus.Success).Count()== erpDetails.Count()) + if (erpDetails.Where(w => w.SuccessSync == SyncStatus.Success).Count() == erpDetails.Count()) { this.SuccessSync = SyncStatus.Success; this.Remark = ""; @@ -168,7 +168,23 @@ namespace WMS.Web.Domain.Entitys this.OperateId = operateId; this.SyncTime = DateTime.Now; } - + /// + /// 重传 + /// + public void RepeatSync() + { + //只有完全失败的情况下才能重传 + if (this.SuccessSync != SyncStatus.Fail) return; + this.SuccessSync = SyncStatus.SyncIng; + var erpDetails = this.Details.SelectMany(s => s.ErpDetails) + .Where(w => w.SuccessSync == SyncStatus.Fail) + .ToList(); + foreach (var e in erpDetails) + { + e.SuccessSync = SyncStatus.SyncIng; + } + this.Remark = ""; + } /// /// 生成单据号 /// diff --git a/src/WMS.Web.Domain/Entitys/TakeStock.cs b/src/WMS.Web.Domain/Entitys/TakeStock.cs index 2a5e0ab6..828aea38 100644 --- a/src/WMS.Web.Domain/Entitys/TakeStock.cs +++ b/src/WMS.Web.Domain/Entitys/TakeStock.cs @@ -81,6 +81,17 @@ namespace WMS.Web.Domain.Entitys this.FailRemark = remark; this.ErpSyncBillNo = erpBillNo; } + /// + /// 重传 + /// + public void RepeatSync() + { + //只有完全失败的情况下才能重传 + if (this.SuccessSync != SyncStatus.Fail) return; + this.SuccessSync = SyncStatus.SyncIng; + this.FailRemark = ""; + } + /// /// 生成单据号 /// diff --git a/src/WMS.Web.Domain/IService/IOutStockService.cs b/src/WMS.Web.Domain/IService/IOutStockService.cs index 872409c8..73389d95 100644 --- a/src/WMS.Web.Domain/IService/IOutStockService.cs +++ b/src/WMS.Web.Domain/IService/IOutStockService.cs @@ -18,7 +18,7 @@ namespace WMS.Web.Domain.IService //出库单保存 Task Save(SaveOutStockRequest dto, LoginInDto loginInfo); // 同步金蝶 - Task Sync(OperateRequest dto, LoginInDto loginInfo); + Task Sync(OperateRequest dto, LoginInDto loginInfo, bool isRepeatSync = true); } } diff --git a/src/WMS.Web.Domain/IService/ITakeStockService.cs b/src/WMS.Web.Domain/IService/ITakeStockService.cs index 9b9071f8..3ae84aa8 100644 --- a/src/WMS.Web.Domain/IService/ITakeStockService.cs +++ b/src/WMS.Web.Domain/IService/ITakeStockService.cs @@ -19,8 +19,8 @@ namespace WMS.Web.Domain.IService //保存 Task Save(List dto, LoginInDto loginInfo); // 同步金蝶 - Task Sync(OperateRequest dto); + Task Sync(OperateRequest dto,bool isRepeatSync=true); //盘亏盘亏 - Task Loss_Profit(TakeStock entity, IServiceScope scope); + Task Loss_Profit(TakeStock entity); } } diff --git a/src/WMS.Web.Domain/Infrastructure/ITakeStockRepositories.cs b/src/WMS.Web.Domain/Infrastructure/ITakeStockRepositories.cs index 2e23ac83..7311c221 100644 --- a/src/WMS.Web.Domain/Infrastructure/ITakeStockRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/ITakeStockRepositories.cs @@ -24,5 +24,7 @@ namespace WMS.Web.Domain.Infrastructure Task<(List list, int total)> GetListAsync(TakeStockQueryRequest dto, int companyId = 0); /// 查询实体集合 Task> GetEntityList(List ids); + /// 修改实体集合 + Task EditEntityList(List entitys, bool isTransaction = true); } } diff --git a/src/WMS.Web.Domain/Services/OutStockService.cs b/src/WMS.Web.Domain/Services/OutStockService.cs index 9c7bef16..f8d73efd 100644 --- a/src/WMS.Web.Domain/Services/OutStockService.cs +++ b/src/WMS.Web.Domain/Services/OutStockService.cs @@ -202,7 +202,7 @@ namespace WMS.Web.Domain.Services { OperateRequest oRequest = new OperateRequest(); oRequest.Ids.Add(entity.Id); - await Sync(oRequest, loginInfo); + await Sync(oRequest, loginInfo,false); } return Result.ReSuccess(); @@ -212,16 +212,21 @@ namespace WMS.Web.Domain.Services /// /// /// - public Task Sync(OperateRequest dto, LoginInDto loginInfo) + public Task Sync(OperateRequest dto, LoginInDto loginInfo, bool isRepeatSync = true) { + var list = _outStockRepositories.GetEntityList(dto.Ids).GetAwaiter().GetResult(); + list = list.Where(w => w.SuccessSync == SyncStatus.Fail).ToList(); + var isSuccess = true; + if (isRepeatSync) + { + list.ForEach(f => f.RepeatSync()); + isSuccess = _outStockRepositories.EditEntityList(list, true).GetAwaiter().GetResult(); + } Task.Run(async () => { - var scope = _serviceScopeFactory.CreateScope(); - var sc_outStockRepositories = scope.ServiceProvider.GetRequiredService(); - var list =await sc_outStockRepositories.GetEntityList(dto.Ids); foreach (var entity in list) { - var res = await SalOutStock(entity, loginInfo, scope); + var res = await SalOutStock(entity, loginInfo); if (!res.IsSuccess) _logger.LogError($"出库单同步失败:{res.Message}"); } @@ -233,8 +238,9 @@ namespace WMS.Web.Domain.Services /// 同步金蝶销售出库 /// /// - private async Task SalOutStock(OutStock entity, LoginInDto loginInfo, IServiceScope scope) + private async Task SalOutStock(OutStock entity, LoginInDto loginInfo) { + var scope = _serviceScopeFactory.CreateScope(); var sc_outStockRepositories = scope.ServiceProvider.GetRequiredService(); if (entity.Type != OutStockType.Sal) return Result.ReSuccess(); @@ -244,7 +250,7 @@ namespace WMS.Web.Domain.Services // .Select(s => s.Key).ToList();//同步失败的来源单号 // //找到单据里需要同步的单据 //var sourcNos = entity.Details.SelectMany(s => s.ErpDetails).GroupBy(s => s.SourceBillNo).Select(s => s.Key); - var erpDetails = entity.Details.SelectMany(s => s.ErpDetails).Where(w => w.SuccessSync == SyncStatus.Fail).ToList(); + var erpDetails = entity.Details.SelectMany(s => s.ErpDetails).Where(w => w.SuccessSync == SyncStatus.SyncIng).ToList(); foreach (var s in erpDetails) { var erp_details = entity.Details diff --git a/src/WMS.Web.Domain/Services/TakeStockService.cs b/src/WMS.Web.Domain/Services/TakeStockService.cs index 3747ba96..b0dac7aa 100644 --- a/src/WMS.Web.Domain/Services/TakeStockService.cs +++ b/src/WMS.Web.Domain/Services/TakeStockService.cs @@ -141,7 +141,7 @@ namespace WMS.Web.Domain.Services //同步金蝶 OperateRequest oRequest = new OperateRequest(); oRequest.Ids = list.Select(s => s.Id).ToList(); - await Sync(oRequest); + await Sync(oRequest,false); return Result.ReSuccess(); } @@ -151,23 +151,29 @@ namespace WMS.Web.Domain.Services /// /// /// - public Task Sync(OperateRequest dto) + public Task Sync(OperateRequest dto, bool isRepeatSync = true) { + var list = _takeStockRepositories.GetEntityList(dto.Ids).GetAwaiter().GetResult(); + list = list.Where(w => w.SuccessSync == SyncStatus.Fail).ToList(); + var isSuccess = true; + if (isRepeatSync) + { + list.ForEach(f => f.RepeatSync()); + isSuccess = _takeStockRepositories.EditEntityList(list, true).GetAwaiter().GetResult(); + } Task.Run(async () => { - var scope = _serviceScopeFactory.CreateScope(); - var sc_takeStockRepositories = scope.ServiceProvider.GetRequiredService(); - var list = await sc_takeStockRepositories.GetEntityList(dto.Ids); - list = list.Where(w => w.SuccessSync == SyncStatus.Fail || w.SuccessSync == SyncStatus.SyncIng).ToList(); foreach (var entity in list) { - var res = await Loss_Profit(entity, scope); + var res = await Loss_Profit(entity); if (!res.IsSuccess) _logger.LogError($"盘点同步失败:{res.Message}"); } }); - - return Task.FromResult(Result.ReSuccess()); + if (isSuccess) + return Task.FromResult(Result.ReSuccess()); + else + return Task.FromResult(Result.ReFailure(ResultCodes.DateWriteError)); } /// @@ -175,11 +181,12 @@ namespace WMS.Web.Domain.Services /// /// /// - public async Task Loss_Profit(TakeStock entity, IServiceScope scope) + public async Task Loss_Profit(TakeStock entity) { _logger.LogInformation($"盘点同步金蝶: {JsonConvert.SerializeObject(entity)}"); try { + var scope = _serviceScopeFactory.CreateScope(); var sc_erpService = scope.ServiceProvider.GetRequiredService(); var sc_erpBasicDataExtendService = scope.ServiceProvider.GetRequiredService(); var sc_takeStockRepositories = scope.ServiceProvider.GetRequiredService(); diff --git a/src/WMS.Web.Repositories/TakeStockRepositories.cs b/src/WMS.Web.Repositories/TakeStockRepositories.cs index 78aae65c..97ba483a 100644 --- a/src/WMS.Web.Repositories/TakeStockRepositories.cs +++ b/src/WMS.Web.Repositories/TakeStockRepositories.cs @@ -127,7 +127,7 @@ namespace WMS.Web.Repositories try { - var res = await _context.TakeStock.Include(x=>x.Details) + var res = await _context.TakeStock.Include(x => x.Details) .FirstOrDefaultAsync(f => f.Id == entity.Id); if (res == null) return null; @@ -148,9 +148,37 @@ namespace WMS.Web.Repositories } } + public async Task EditEntityList(List entitys, bool isTransaction = true) + { + IDbContextTransaction _transaction = null; + if (isTransaction) + _transaction = _context.Database.BeginTransaction(); + try + { + List list = entitys.Select(s => s.Id).ToList(); + + var res = await _context.TakeStock + .Include(s => s.Details) + .Where(f => list.Contains(f.Id)).ToListAsync(); + + _mapper.ToMapList(entitys, res); + _mapper.ToMapList(entitys.SelectMany(s => s.Details).ToList(), res.SelectMany(s => s.Details).ToList()); + await _context.SaveChangesAsync(); + if (_transaction != null) + _transaction.Commit(); + } + catch (Exception ex) + { + if (_transaction != null) + _transaction.Rollback(); + return false; + } + return true; + } + public async Task> GetEntityList(List ids) { - var res = await _context.TakeStock.Include(x=>x.Details) + var res = await _context.TakeStock.Include(x => x.Details) .Where(f => ids.Contains(f.Id)) .ToListAsync(); @@ -213,7 +241,7 @@ namespace WMS.Web.Repositories Unit = _erpBasicDataExtendService.GetMaterialUnitName(materials, s.detail.MaterialId), Stock = _singleDataService.GetSingleData(SingleAction.StocksJoinOrgCode, companyId, s.detail.StockCode + s.detail.OrgCode), SubStock = _singleDataService.GetSingleData(SingleAction.SubStocks, companyId, s.detail.SubStockId), - Erp_SubStock= _erpBasicDataExtendService.GetSubStockName(subStocks, s.detail.Erp_SubStockCode), + Erp_SubStock = _erpBasicDataExtendService.GetSubStockName(subStocks, s.detail.Erp_SubStockCode), MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, s.detail.MaterialId), MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, s.detail.MaterialId), Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.detail.MaterialId), @@ -222,7 +250,7 @@ namespace WMS.Web.Repositories FinalQty = s.detail.FinalQty, ResultType = s.order.ResultType.GetRemark(), Remark = s.detail.Remark, - FailRemark=s.order.FailRemark, + FailRemark = s.order.FailRemark, Creator = _singleDataService.GetSingleData(SingleAction.Staffs, _loginRepositories.CompanyId, s.order.CreatorId), Date = s.order.Date.DateToStringSeconds(), SuccessSync = s.order.SuccessSync == SyncStatus.Success ? "成功" : (s.order.SuccessSync == SyncStatus.SyncIng ? "同步中" : "失败"), @@ -234,7 +262,7 @@ namespace WMS.Web.Repositories public async Task<(object obj, int total)> GetListField(TakeStockQueryRequest dto, int companyId) { - return await GetListAsync(dto,companyId); + return await GetListAsync(dto, companyId); } } }