同步优化

This commit is contained in:
tongfei
2023-12-22 13:59:44 +08:00
parent e7c0f78751
commit 2184ff33f7
3 changed files with 47 additions and 27 deletions

View File

@@ -3938,7 +3938,7 @@
<param name="dto"></param> <param name="dto"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Domain.Services.InStockService.PurchaseInStock(WMS.Web.Domain.Entitys.InStock,WMS.Web.Core.Dto.Login.LoginInDto)"> <member name="M:WMS.Web.Domain.Services.InStockService.PurchaseInStock(WMS.Web.Domain.Entitys.InStock,WMS.Web.Core.Dto.Login.LoginInDto,Microsoft.Extensions.DependencyInjection.IServiceScope)">
<summary> <summary>
采购:同步金蝶 采购:同步金蝶
</summary> </summary>
@@ -3946,7 +3946,7 @@
<param name="loginInfo"></param> <param name="loginInfo"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Domain.Services.InStockService.Push(WMS.Web.Core.Dto.Erp.ErpPushDto,WMS.Web.Domain.Entitys.InStockErpDetails,System.String)"> <member name="M:WMS.Web.Domain.Services.InStockService.Push(WMS.Web.Core.Dto.Erp.ErpPushDto,WMS.Web.Domain.Entitys.InStockErpDetails,System.String,Microsoft.Extensions.DependencyInjection.IServiceScope)">
<summary> <summary>
下推 下推
</summary> </summary>
@@ -4108,13 +4108,13 @@
<param name="dto"></param> <param name="dto"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Domain.Services.OutStockService.SalOutStock(WMS.Web.Domain.Entitys.OutStock,WMS.Web.Core.Dto.Login.LoginInDto)"> <member name="M:WMS.Web.Domain.Services.OutStockService.SalOutStock(WMS.Web.Domain.Entitys.OutStock,WMS.Web.Core.Dto.Login.LoginInDto,Microsoft.Extensions.DependencyInjection.IServiceScope)">
<summary> <summary>
同步金蝶销售出库 同步金蝶销售出库
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WMS.Web.Domain.Services.OutStockService.Push(WMS.Web.Core.Dto.Erp.ErpPushDto,WMS.Web.Domain.Entitys.OutStockErpDetails,System.String)"> <member name="M:WMS.Web.Domain.Services.OutStockService.Push(WMS.Web.Core.Dto.Erp.ErpPushDto,WMS.Web.Domain.Entitys.OutStockErpDetails,System.String,Microsoft.Extensions.DependencyInjection.IServiceScope)">
<summary> <summary>
下推 下推
</summary> </summary>

View File

@@ -93,6 +93,15 @@ namespace WMS.Web.Domain.Entitys
{ {
this.CreatorId = creatorId; this.CreatorId = creatorId;
this.CreateTime = DateTime.Now; this.CreateTime = DateTime.Now;
if (this.Type == InstockType.Purchase)
{
//只有采购订单入库才需要同步金蝶:单据头为同步中默认
this.SuccessSync = SyncStatus.SyncIng;
//erp明细为失败默认在处理同步时能找到该明细
this.ErpDetails.ForEach(f => f.SuccessSync = SyncStatus.Fail);
}
else//非采购订单这里就没有记录erpdetails的数据了
this.SuccessSync = SyncStatus.Success;
} }
/// <summary> /// <summary>

View File

@@ -1,5 +1,6 @@
using AutoMapper; using AutoMapper;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
@@ -47,14 +48,16 @@ namespace WMS.Web.Domain.Services
private readonly IErpBasicDataExtendService _erpBasicDataExtendService; private readonly IErpBasicDataExtendService _erpBasicDataExtendService;
private readonly IBoxInventoryRepositories _boxInventoryRepositories; private readonly IBoxInventoryRepositories _boxInventoryRepositories;
private readonly ILogger<InStockService> _logger; private readonly ILogger<InStockService> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
public InStockService(IMapper mapper, ISerialNumbersRepositories serialNumbersRepositories, IErpService erpService, IBoxInventoryService boxInventoryService, ISerialNumberService serialNumberService, ILoginService loginService, IBoxRepositories boxRepositories, public InStockService(IMapper mapper, ISerialNumbersRepositories serialNumbersRepositories, IErpService erpService, IBoxInventoryService boxInventoryService, ISerialNumberService serialNumberService, ILoginService loginService, IBoxRepositories boxRepositories,
IBasicsRepositories basicsRepositories, IErpBasicDataExtendService erpBasicDataExtendService, IChangeMoveBoxService changeMoveBoxService, IInStockTaskBoxRepositories inStockTaskBoxRepositories, IBasicsRepositories basicsRepositories, IErpBasicDataExtendService erpBasicDataExtendService, IChangeMoveBoxService changeMoveBoxService, IInStockTaskBoxRepositories inStockTaskBoxRepositories,
IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories, IBoxInventoryRepositories boxInventoryRepositories, ILogger<InStockService> logger) IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories, IBoxInventoryRepositories boxInventoryRepositories, ILogger<InStockService> logger, IServiceScopeFactory serviceScopeFactory)
{ {
_logger = logger; _logger = logger;
_mapper = mapper; _mapper = mapper;
_erpService = erpService; _erpService = erpService;
_loginService = loginService; _loginService = loginService;
_serviceScopeFactory = serviceScopeFactory;
_boxInventoryService = boxInventoryService; _boxInventoryService = boxInventoryService;
_serialNumberService = serialNumberService; _serialNumberService = serialNumberService;
_boxRepositories = boxRepositories; _boxRepositories = boxRepositories;
@@ -74,14 +77,21 @@ namespace WMS.Web.Domain.Services
/// <param name="dto"></param> /// <param name="dto"></param>
/// <param name="loginInfo"></param> /// <param name="loginInfo"></param>
/// <returns></returns> /// <returns></returns>
public async Task<Result> Sync(OperateRequest dto, LoginInDto loginInfo) public Task<Result> Sync(OperateRequest dto, LoginInDto loginInfo)
{ {
var list = await _inStockRepositories.GetList(dto.Ids); Task.Run(async () =>
{
var scope = _serviceScopeFactory.CreateScope();
var sc_inStockRepositories = scope.ServiceProvider.GetRequiredService<IInStockRepositories>();
var list = await sc_inStockRepositories.GetList(dto.Ids);
foreach (var entity in list) foreach (var entity in list)
{ {
await this.PurchaseInStock(entity, loginInfo); var res = await this.PurchaseInStock(entity, loginInfo, scope);
if (!res.IsSuccess)
_logger.LogError($"入库单同步失败:{res.Message}");
} }
return Result.ReSuccess(); });
return Task.FromResult(Result.ReSuccess());
} }
/// <summary> /// <summary>
@@ -132,10 +142,9 @@ namespace WMS.Web.Domain.Services
//同步金蝶 //同步金蝶
if (entity.Type == InstockType.Purchase) if (entity.Type == InstockType.Purchase)
{ {
Task.Run(async () => OperateRequest oRequest = new OperateRequest();
{ oRequest.Ids.Add(entity.Id);
await this.PurchaseInStock(entity, loginInfo); await Sync(oRequest, loginInfo);
}).GetAwaiter().GetResult();
} }
return Result.ReSuccess(); return Result.ReSuccess();
} }
@@ -722,11 +731,13 @@ namespace WMS.Web.Domain.Services
/// <param name="entity"></param> /// <param name="entity"></param>
/// <param name="loginInfo"></param> /// <param name="loginInfo"></param>
/// <returns></returns> /// <returns></returns>
private async Task<Result> PurchaseInStock(InStock entity, LoginInDto loginInfo) private async Task<Result> PurchaseInStock(InStock entity, LoginInDto loginInfo, IServiceScope scope)
{ {
var sc_InStockRepositories = scope.ServiceProvider.GetRequiredService<IInStockRepositories>();
if (entity.Type != InstockType.Purchase) return Result.ReSuccess(); if (entity.Type != InstockType.Purchase) return Result.ReSuccess();
if (entity.SuccessSync == SyncStatus.Success) return Result.ReSuccess(); if (entity.SuccessSync == SyncStatus.Success) return Result.ReSuccess();
var erpDetails = entity.ErpDetails.Where(w => w.SuccessSync == SyncStatus.Fail || w.SuccessSync==SyncStatus.SyncIng).ToList(); var erpDetails = entity.ErpDetails.Where(w => w.SuccessSync == SyncStatus.Fail).ToList();
foreach (var s in erpDetails) foreach (var s in erpDetails)
{ {
var erp_details = entity.ErpDetails var erp_details = entity.ErpDetails
@@ -739,14 +750,14 @@ namespace WMS.Web.Domain.Services
DetailsId = s.ErpDetailId.ToString() DetailsId = s.ErpDetailId.ToString()
}; };
//下推金蝶 //下推金蝶
var res = await this.Push(erpDto, s, entity.BillNo); var res = await this.Push(erpDto, s, entity.BillNo, scope);
if (res.result.IsSuccess) if (res.result.IsSuccess)
entity.SyncSuccess(s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.erpBillNo); entity.SyncSuccess(s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.erpBillNo);
else else
entity.SyncFail(res.result.Message, s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.syncStatus); entity.SyncFail(res.result.Message, s.ErpDetailId, loginInfo?.UserInfo?.StaffId ?? 0, res.syncStatus);
} }
//最好一条一条执行,否则执行失败 但是金蝶那边又同步成功 就会造成数据比价乱 //最好一条一条执行,否则执行失败 但是金蝶那边又同步成功 就会造成数据比价乱
var isSuccess = await _inStockRepositories.Update(entity, true); var isSuccess = await sc_InStockRepositories.Update(entity, true);
if (entity == null) return Result.ReFailure(ResultCodes.DateWriteError); if (entity == null) return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess(); return Result.ReSuccess();
} }
@@ -758,23 +769,23 @@ namespace WMS.Web.Domain.Services
/// <param name="erpDetail"></param> /// <param name="erpDetail"></param>
/// <param name="billNo"></param> /// <param name="billNo"></param>
/// <returns></returns> /// <returns></returns>
private async Task<(Result result, SyncStatus syncStatus, string erpBillNo)> Push(ErpPushDto dto, InStockErpDetails erpDetail, string billNo) private async Task<(Result result, SyncStatus syncStatus, string erpBillNo)> Push(ErpPushDto dto, InStockErpDetails erpDetail, string billNo, IServiceScope scope)
{ {
var res = await _erpService.Push(dto); var sc_erpService = scope.ServiceProvider.GetRequiredService<IErpService>();
var res = await sc_erpService.Push(dto);
if (!res.IsSuccess) if (!res.IsSuccess)
{ {
_logger.LogInformation($"入库单->下推失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{res.Message}"); _logger.LogInformation($"入库单->下推失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{res.Message}");
return (Result.ReFailure(res.Message, res.Status), SyncStatus.Fail, ""); return (Result.ReFailure(res.Message, res.Status), SyncStatus.Fail, "");
} }
string id = res.Data; string id = res.Data;
var resPurchaseInStock = await _erpService.BillQueryForPurchaseInStock(id); var resPurchaseInStock = await sc_erpService.BillQueryForPurchaseInStock(id);
var purchaseInStock = resPurchaseInStock.Data; var purchaseInStock = resPurchaseInStock.Data;
purchaseInStock.Details[0].Qty = erpDetail.Qty; purchaseInStock.Details[0].Qty = erpDetail.Qty;
//{"Id":12709885,"Number":"XSCKD10629570","DIndex":0}
string formId = dto.TargetFormId.ToString(); string formId = dto.TargetFormId.ToString();
_logger.LogInformation($"入库单->开始同步金蝶 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 数据: {JsonConvert.SerializeObject(dto)}"); _logger.LogInformation($"入库单->开始同步金蝶 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 数据: {JsonConvert.SerializeObject(dto)}");
var res_s = await _erpService.Save<ErpPurchaseInStockSaveDto>(purchaseInStock, formId); var res_s = await sc_erpService.Save<ErpPurchaseInStockSaveDto>(purchaseInStock, formId);
if (!res_s.IsSuccess) if (!res_s.IsSuccess)
{ {
_logger.LogInformation($"入库单->修改数量失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{res_s.Message}"); _logger.LogInformation($"入库单->修改数量失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{res_s.Message}");
@@ -783,7 +794,7 @@ namespace WMS.Web.Domain.Services
//提交 //提交
_logger.LogInformation($"入库单->保存成功 开始提交 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}"); _logger.LogInformation($"入库单->保存成功 开始提交 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}");
ErpOperateDto o_dto = new ErpOperateDto(formId, res_s.Data);//res_s.Data ErpOperateDto o_dto = new ErpOperateDto(formId, res_s.Data);//res_s.Data
var resSubmit = await _erpService.Submit(o_dto, formId); var resSubmit = await sc_erpService.Submit(o_dto, formId);
if (!resSubmit.IsSuccess) if (!resSubmit.IsSuccess)
{ {
_logger.LogInformation($"入库单->提交失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}"); _logger.LogInformation($"入库单->提交失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}");
@@ -791,7 +802,7 @@ namespace WMS.Web.Domain.Services
} }
//审核 //审核
_logger.LogInformation($"入库单->提交成功 开始审核 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}"); _logger.LogInformation($"入库单->提交成功 开始审核 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId}");
resSubmit = await _erpService.Audit(o_dto, formId); resSubmit = await sc_erpService.Audit(o_dto, formId);
if (!resSubmit.IsSuccess) if (!resSubmit.IsSuccess)
{ {
_logger.LogInformation($"入库单->审核失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}"); _logger.LogInformation($"入库单->审核失败 单号:{billNo} erp明细Id:{erpDetail.ErpDetailId} 错误:{resSubmit.Message}");