using AutoMapper; using Microsoft.EntityFrameworkCore.Storage; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WMS.Web.Core.Dto.ChangeBoxRecord; using WMS.Web.Core.Dto.Inventory; using WMS.Web.Core.Dto.Login; using WMS.Web.Core.Dto.MoveBoxRecord; 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 ChangeMoveBoxService : IChangeMoveBoxService { private readonly IMapper _mapper; private readonly ILoginService _loginService; private readonly IChangeBoxRecordRepositories _changeBoxRecordRepositories; public readonly IBasicsRepositories _transactionRepositories; private readonly IMoveBoxRecordRepositories _moveBoxRecordRepositories; private readonly IBoxRepositories _boxRepositories; private readonly ISerialNumberService _serialNumberService; private readonly IBoxInventoryService _boxInventoryService; public ChangeMoveBoxService(IMapper mapper, ILoginService loginService, IChangeBoxRecordRepositories changeBoxRecordRepositories, IBasicsRepositories transactionRepositories, IMoveBoxRecordRepositories moveBoxRecordRepositories, IBoxRepositories boxRepositories, ISerialNumberService serialNumberService, IBoxInventoryService boxInventoryService) { _mapper = mapper; _loginService = loginService; _changeBoxRecordRepositories = changeBoxRecordRepositories; _transactionRepositories = transactionRepositories; _moveBoxRecordRepositories = moveBoxRecordRepositories; _boxRepositories = boxRepositories; _serialNumberService = serialNumberService; _boxInventoryService = boxInventoryService; } /// /// 改箱保存 /// /// /// /// public async Task ChangeBoxSave(SaveChangeBoxRecordRequest dto, LoginInDto loginInfo, bool isTransaction = false) { //1.有原箱时 需要判断 物料对应的序列号是否存在 List boxList = new List(); //原箱有可能没有 var srcBox = await _boxRepositories.Get(dto.SrcBoxId); var destBox = await _boxRepositories.Get(dto.DestBoxId); //if (srcBox == null) return Result.ReFailure(ResultCodes.BoxNoData); if (destBox == null) return Result.ReFailure(ResultCodes.BoxNoData); var l = dto.Details.Select(s => (s.MaterialId, s.Qty, s.SerialNumbers)).ToList(); //原箱移出 Result res; if (srcBox != null) { res = srcBox.Out(l); if (!res.IsSuccess) return res; } //目标箱移入 res = destBox.In(l); if (!res.IsSuccess) return res; if (srcBox != null) boxList.Add(srcBox); if (destBox != null) boxList.Add(destBox); //2.修改库存时需要区别 有原箱和没有原箱的情况 //var entity = _mapper.Map(dto);\ List list = new List(); foreach (var d in dto.Details) { ChangeBoxRecord entity = new ChangeBoxRecord(); entity.Create(loginInfo.UserInfo.StaffId, d.Qty, d.MaterialId, d.SerialNumbers, dto.SrcBoxId, dto.DestBoxId); list.Add(entity); } var inventoryList = new List(); inventoryList.Add(_mapper.Map(dto)); //需要填写序列号 //需要修改库存 IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _transactionRepositories.GetTransaction(); Result res_Rollback = Result.ReSuccess(); bool isSuccess = true; var res_Inventory = await _boxInventoryService.GenerateChangeBox(inventoryList, false); if (!res_Inventory.IsSuccess) res_Rollback = res_Inventory; if (res_Rollback.IsSuccess) { isSuccess = await _changeBoxRecordRepositories.AddRange(list, false); if (!isSuccess) res_Rollback=Result.ReFailure(ResultCodes.DateWriteError); } if (res_Rollback.IsSuccess) { var res_change = await _serialNumberService.ChangeBox(list, loginInfo, false); if (!res_change.IsSuccess) res_Rollback = res_change; } if (res_Rollback.IsSuccess) { isSuccess = await _boxRepositories.EditEntityList(boxList, false); if (!isSuccess) res_Rollback= Result.ReFailure(ResultCodes.DateWriteError); } //提交事务 if (isTransaction) { isSuccess = _transactionRepositories.CommitTransaction(res_Rollback.IsSuccess ? false : true, _transaction); if (!res_Rollback.IsSuccess) return res_Rollback; if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } return Result.ReSuccess(); } /// /// 移箱保存 /// /// /// /// public async Task MoveBoxSave(List dto, bool IsUp, LoginInDto loginInfo) { //1.下架时 需要验证箱是否在库存里 List entityList = new List(); foreach (var d in dto) { var entity = new MoveBoxRecord(); entity.Create(IsUp == true ? MoveBoxType.Up : MoveBoxType.Down, d.BoxId, d.StockCode, d.SubStockId, loginInfo.UserInfo.StaffId); entityList.Add(entity); } var inventoryList = _mapper.Map>(dto); inventoryList.ForEach(f => f.InventoryInOutType = IsUp == true ? 1 : 2); IDbContextTransaction _transaction = _transactionRepositories.GetTransaction(); bool isSuccess = true; Result res_Rollback = Result.ReSuccess(); var res_Inventory = await _boxInventoryService.GenerateMoveBox(inventoryList, false); if (!res_Inventory.IsSuccess) res_Rollback = res_Inventory; if (res_Rollback.IsSuccess) { isSuccess = await _moveBoxRecordRepositories.AddRange(entityList, false); if (!isSuccess) res_Rollback = Result.ReFailure(ResultCodes.DateWriteError); } if (res_Rollback.IsSuccess) { var res_change = await _serialNumberService.MoveBox(entityList, loginInfo, false); if (!res_change.IsSuccess) res_Rollback = res_change; } //提交事务 isSuccess = _transactionRepositories.CommitTransaction(res_Rollback.IsSuccess ? false : true, _transaction); if (!res_Rollback.IsSuccess) return res_Rollback; if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } } }