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.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; public ChangeMoveBoxService(IMapper mapper, ILoginService loginService, IChangeBoxRecordRepositories changeBoxRecordRepositories, IBasicsRepositories transactionRepositories, IMoveBoxRecordRepositories moveBoxRecordRepositories, IBoxRepositories boxRepositories, ISerialNumberService serialNumberService) { _mapper = mapper; _loginService = loginService; _changeBoxRecordRepositories = changeBoxRecordRepositories; _transactionRepositories = transactionRepositories; _moveBoxRecordRepositories = moveBoxRecordRepositories; _boxRepositories = boxRepositories; _serialNumberService = serialNumberService; } /// /// 改箱保存 /// /// /// /// public async Task ChangeBoxSave(SaveChangeBoxRecordRequest dto, LoginInDto loginInfo, bool isTransaction = false) { 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); //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); } //需要填写序列号 //需要修改库存 IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; isSuccess = await _changeBoxRecordRepositories.AddRange(list, false); if (!isSuccess) isRollback = true; var res_change = await _serialNumberService.ChangeBox(list, loginInfo, false); if (!res_change.IsSuccess) isRollback = true; isSuccess = await _boxRepositories.EditEntityList(boxList, false); if (!isSuccess) isRollback = true; //提交事务 if (isTransaction) { isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } return Result.ReSuccess(); } /// /// 移箱保存 /// /// /// /// public async Task MoveBoxSave(SaveMoveBoxRecordRequest dto, bool IsUp, LoginInDto loginInfo) { var entity = new MoveBoxRecord(); entity.Create(IsUp == true ? MoveBoxType.Up : MoveBoxType.Down, dto.BoxId, dto.SubStockId, loginInfo.UserInfo.StaffId); //需要填写规格型号 //需要修改库存 IDbContextTransaction _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; entity = await _moveBoxRecordRepositories.Add(entity, true); if (entity == null) isRollback = true; var res_change = await _serialNumberService.MoveBox(entity, loginInfo, false); if (!res_change.IsSuccess) isRollback = true; //提交事务 isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } } }