using AutoMapper; using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WMS.Web.Core.Dto.BackRecord; using WMS.Web.Core.Dto.ChangeBoxRecord; using WMS.Web.Core.Dto.Inventory; using WMS.Web.Core.Dto.Login; using WMS.Web.Core.Internal.Results; using WMS.Web.Domain.Entitys; using WMS.Web.Domain.Infrastructure; using WMS.Web.Domain.IService; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Values; namespace WMS.Web.Domain.Services { /// /// 出入库回退上下架:服务接口 /// public class BackRecordService : IBackRecordService { private readonly IMapper _mapper; private readonly ILoginService _loginService; private readonly ILogger _logger; public readonly IBasicsRepositories _basicsRepositories; private readonly ISerialNumberService _serialNumberService; private readonly IBackRecordRepositories _backRecordRepositories; private readonly IBoxInventoryService _boxInventoryService; private readonly IChangeMoveBoxService _changeMoveBoxService; private readonly ISerialNumbersRepositories _serialNumbersRepositories; private readonly IInStockTaskBoxService _inStockTaskBoxService; public BackRecordService(IMapper mapper, ILoginService loginService, ILogger logger, IBasicsRepositories basicsRepositories, IBoxInventoryService boxInventoryService, ISerialNumberService serialNumberService, IChangeMoveBoxService changeMoveBoxService, ISerialNumbersRepositories serialNumbersRepositories, IBackRecordRepositories backRecordRepositories, IInStockTaskBoxService inStockTaskBoxService) { _mapper = mapper; _logger = logger; _loginService = loginService; _inStockTaskBoxService = inStockTaskBoxService; _changeMoveBoxService = changeMoveBoxService; _serialNumberService = serialNumberService; _boxInventoryService = boxInventoryService; _basicsRepositories = basicsRepositories; _serialNumbersRepositories = serialNumbersRepositories; _backRecordRepositories = backRecordRepositories; } /// /// 回退上下架 /// /// /// /// /// public async Task BackShelf(BackRecordOnOffRequest dto, BackRecordType type, LoginInDto loginInfo) { IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); bool isRollback = false; bool isTransaction = false; var stocks = await _basicsRepositories.GetUcStockAsync(ManagementSystemCode.GLXT0004.ToString(), "", loginInfo.UserInfo.CompanyId); if (stocks.Count == 0) return Result.ReFailure(ResultCodes.ErpStockNoData); var entity = new BackRecord(); entity.Method = (InventoryInOutMethod)dto.Method; entity.OrgCode = dto.OrgCode; entity.StockCode = dto.StockCode; entity.SubStockId = dto.SubStockId; entity.Type = type; entity.Details = _mapper.Map>(dto.Details); entity.Create(loginInfo.UserInfo.StaffId); entity = await _backRecordRepositories.Add(entity, isTransaction); if (entity == null) return Result.ReFailure(ResultCodes.DateWriteError); //保存成功后:序列号跟踪流程添加 var serialNumber_result = await _serialNumberService.BackRecord(entity, loginInfo, isTransaction); if (!serialNumber_result.IsSuccess) return serialNumber_result; //#region 需要改箱操作 ////获取目标箱和原箱信息 //var current_box_about = dto.Details.GroupBy(x => new { x.BoxId }).Select(x => new { x.Key.BoxId }).ToList(); //var current_sernub_box = dto.Details.GroupBy(x => x.SerialNumberBoxId).Select(x => x.Key).ToList(); ////要改箱的数据集合 //var ganenrateChangeBoxs = new List(); ////遍历组装:改箱dto的头部集合 //foreach (var boxAbout in current_box_about) //{ // foreach (var serBoxId in current_sernub_box) // { // if (boxAbout.BoxId != serBoxId) // { // var changeBox = new SaveChangeBoxRecordRequest(); // changeBox.SrcBoxId = serBoxId; // changeBox.DestBoxId = boxAbout.BoxId; // changeBox.SubStockId = entity.SubStockId; // ganenrateChangeBoxs.Add(changeBox); // } // } //} ////遍历组装明细:改箱dto的明细集合 //foreach (var detItem in dto.Details) //{ // ganenrateChangeBoxs.ForEach(x => // { // if (x.SrcBoxId == detItem.SerialNumberBoxId && x.DestBoxId == detItem.BoxId) // { // var changeBoxRD = new SaveChangeBoxRecordDetailsRequest(); // changeBoxRD.MaterialId = detItem.MaterialId; // changeBoxRD.Qty = detItem.Qty; // changeBoxRD.SerialNumbers = detItem.SerialNumbers; // x.Details.Add(changeBoxRD); // } // }); //} ////改箱保存操作:这里不需要在改箱的操作-进行库存的变更(因为会有问题),下面会去更新库存的 //var changeBoxSave_Result = await _changeMoveBoxService.ChangeBoxSave(ganenrateChangeBoxs, loginInfo, isTransaction,false); //if (!changeBoxSave_Result.IsSuccess) // return changeBoxSave_Result; //#endregion //改箱保存操作 var changeBoxSave_Result = await _changeMoveBoxService.ChangeBox_BackRecord(entity, loginInfo, isTransaction); if (!changeBoxSave_Result.IsSuccess) return changeBoxSave_Result; //保存成功后:变更库存 var boxInventoryResult = await _boxInventoryService.GenerateBackBox(entity, isTransaction); if (!boxInventoryResult.IsSuccess) return boxInventoryResult; //下架:需要解绑收货过的箱子 if (entity.Type == BackRecordType.InstockOff) { _logger.LogInformation("入库回退下架:" + entity.BillNo); var boxIds= entity.Details.GroupBy(x => x.BoxId).Select(x => x.Key).ToList(); var unBindResult= await _inStockTaskBoxService.UnBind(boxIds, isTransaction); _logger.LogInformation("入库回退下架-BOXID:" + JsonConvert.SerializeObject(boxIds)); if (!unBindResult.IsSuccess) return unBindResult; _logger.LogInformation("入库回退下架-结果:" + unBindResult.IsSuccess); } //提交事务 var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } } }