优化
This commit is contained in:
@@ -4,10 +4,12 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using WMS.Web.Core.Dto;
|
using WMS.Web.Core.Dto;
|
||||||
using WMS.Web.Core.Dto.ChangeBoxRecord;
|
using WMS.Web.Core.Dto.ChangeBoxRecord;
|
||||||
@@ -49,6 +51,8 @@ namespace WMS.Web.Domain.Services
|
|||||||
private readonly IBoxInventoryRepositories _boxInventoryRepositories;
|
private readonly IBoxInventoryRepositories _boxInventoryRepositories;
|
||||||
private readonly ILogger<InStockService> _logger;
|
private readonly ILogger<InStockService> _logger;
|
||||||
private readonly IServiceScopeFactory _serviceScopeFactory;
|
private readonly IServiceScopeFactory _serviceScopeFactory;
|
||||||
|
|
||||||
|
private readonly ConcurrentDictionary<int, SemaphoreSlim> _locks = new ConcurrentDictionary<int, SemaphoreSlim>();
|
||||||
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, IServiceScopeFactory serviceScopeFactory)
|
IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories, IBoxInventoryRepositories boxInventoryRepositories, ILogger<InStockService> logger, IServiceScopeFactory serviceScopeFactory)
|
||||||
@@ -129,29 +133,42 @@ namespace WMS.Web.Domain.Services
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<Result> Shelf(PurchaseShelfRequest instock, LoginInDto loginInfo)
|
public async Task<Result> Shelf(PurchaseShelfRequest instock, LoginInDto loginInfo)
|
||||||
{
|
{
|
||||||
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
|
var taskId= instock.Details.Select(x => x.TaskId).FirstOrDefault();
|
||||||
bool isRollback = false;
|
|
||||||
bool isTransaction = false;
|
|
||||||
//1.添加入库单:(同步金蝶在save方法里面进行)
|
|
||||||
var save_result = await this.ShelfSave(instock, InstockType.Purchase, loginInfo, isTransaction);
|
|
||||||
if (!save_result.IsSuccess) isRollback = true;
|
|
||||||
|
|
||||||
//实体
|
var taskLock = _locks.GetOrAdd(taskId, _ => new SemaphoreSlim(1, 1));
|
||||||
var entity = save_result.Data;
|
await taskLock.WaitAsync();
|
||||||
|
try
|
||||||
//提交事务
|
|
||||||
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction);
|
|
||||||
if (!isSuccess)
|
|
||||||
return save_result;
|
|
||||||
|
|
||||||
//同步金蝶
|
|
||||||
if (entity.Type == InstockType.Purchase)
|
|
||||||
{
|
{
|
||||||
OperateRequest oRequest = new OperateRequest();
|
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
|
||||||
oRequest.Ids.Add(entity.Id);
|
bool isRollback = false;
|
||||||
await Sync(oRequest, loginInfo, false);
|
bool isTransaction = false;
|
||||||
|
//1.添加入库单:(同步金蝶在save方法里面进行)
|
||||||
|
var save_result = await this.ShelfSave(instock, InstockType.Purchase, loginInfo, isTransaction);
|
||||||
|
if (!save_result.IsSuccess) isRollback = true;
|
||||||
|
|
||||||
|
//实体
|
||||||
|
var entity = save_result.Data;
|
||||||
|
|
||||||
|
//提交事务
|
||||||
|
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction);
|
||||||
|
if (!isSuccess)
|
||||||
|
return save_result;
|
||||||
|
|
||||||
|
//同步金蝶
|
||||||
|
if (entity.Type == InstockType.Purchase)
|
||||||
|
{
|
||||||
|
OperateRequest oRequest = new OperateRequest();
|
||||||
|
oRequest.Ids.Add(entity.Id);
|
||||||
|
await Sync(oRequest, loginInfo, false);
|
||||||
|
}
|
||||||
|
return Result.ReSuccess();
|
||||||
}
|
}
|
||||||
return Result.ReSuccess();
|
finally
|
||||||
|
{
|
||||||
|
taskLock.Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -585,7 +602,7 @@ namespace WMS.Web.Domain.Services
|
|||||||
return Result<InStockTask>.ReFailure(ResultCodes.InStockTaskBoxIsHaveData);
|
return Result<InStockTask>.ReFailure(ResultCodes.InStockTaskBoxIsHaveData);
|
||||||
|
|
||||||
//序列号
|
//序列号
|
||||||
var serialNumbs= await _serialNumbersRepositories.GetEntityListByBoxIds(dto_boxIds);
|
var serialNumbs = await _serialNumbersRepositories.GetEntityListByBoxIds(dto_boxIds);
|
||||||
|
|
||||||
//3.组装绑定关系表,要添加的集合
|
//3.组装绑定关系表,要添加的集合
|
||||||
var boxEntitys = await _boxRepositories.GetEntityList(dto_boxIds);
|
var boxEntitys = await _boxRepositories.GetEntityList(dto_boxIds);
|
||||||
@@ -596,13 +613,13 @@ namespace WMS.Web.Domain.Services
|
|||||||
taskBox.TaskId = entity.Id;
|
taskBox.TaskId = entity.Id;
|
||||||
taskBox.Receiver(staffId);
|
taskBox.Receiver(staffId);
|
||||||
|
|
||||||
var currentBox_serialNumbs= serialNumbs.Where(s => s.BoxId == taskBox.BoxId).ToList();
|
var currentBox_serialNumbs = serialNumbs.Where(s => s.BoxId == taskBox.BoxId).ToList();
|
||||||
var current_dto_box_dets = boxEntitys.Where(x => x.Id == item.BoxId).SelectMany(x => x.Details).ToList();
|
var current_dto_box_dets = boxEntitys.Where(x => x.Id == item.BoxId).SelectMany(x => x.Details).ToList();
|
||||||
taskBox.Details = _mapper.Map<List<InStockTaskBoxDetails>>(current_dto_box_dets);
|
taskBox.Details = _mapper.Map<List<InStockTaskBoxDetails>>(current_dto_box_dets);
|
||||||
taskBox.Details.ForEach(x =>
|
taskBox.Details.ForEach(x =>
|
||||||
{
|
{
|
||||||
x.ErpDetailId = item.ErpDetailId;
|
x.ErpDetailId = item.ErpDetailId;
|
||||||
x.SerialNumbers= currentBox_serialNumbs.Where(s => s.MaterialNumber == x.MaterialNumber).Select(s => s.SerialNumber).ToList();
|
x.SerialNumbers = currentBox_serialNumbs.Where(s => s.MaterialNumber == x.MaterialNumber).Select(s => s.SerialNumber).ToList();
|
||||||
});
|
});
|
||||||
taskBoxAdd.Add(taskBox);
|
taskBoxAdd.Add(taskBox);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user