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; 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 BoxService : IBoxService { private readonly IMapper _mapper; private readonly ILoginService _loginService; public readonly IBasicsRepositories _transactionRepositories; private readonly IBoxRepositories _boxRepositories; private readonly IOpsService _opsService; private readonly ISerialNumberService _serialNumberService; private readonly IErpOpsSyncDateRepositories _erpOpsSyncDateRepositories; private readonly ISerialNumbersRepositories _serialNumbersRepositories; public BoxService(IMapper mapper, ILoginService loginService, IBasicsRepositories transactionRepositories, IBoxRepositories boxRepositories, IOpsService opsService, ISerialNumberService serialNumberService, IErpOpsSyncDateRepositories erpOpsSyncDateRepositories, ISerialNumbersRepositories serialNumbersRepositories) { _mapper = mapper; _loginService = loginService; _transactionRepositories = transactionRepositories; _boxRepositories = boxRepositories; _opsService = opsService; _serialNumberService = serialNumberService; _erpOpsSyncDateRepositories = erpOpsSyncDateRepositories; _serialNumbersRepositories = serialNumbersRepositories; } public async Task Sync() { DateTime begin = await _erpOpsSyncDateRepositories.Get(ErpOpsSyncType.Ops); OpsBoxRequest request = new OpsBoxRequest(begin, DateTime.Now); var list = await _opsService.GetBox(request); var nos = list.Select(s => s.BoxBillNo).ToList(); var old_nos = await _boxRepositories.GetByNos(nos); foreach (var s in old_nos) { //数据库里已经存在箱信息 移除 var box = list.FirstOrDefault(f => f.BoxBillNo.Equals(s)); if (box != null) list.Remove(box); } var boxs = _mapper.Map>(list); IDbContextTransaction _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; //批量添加 isSuccess = await _boxRepositories.AddRange(boxs, false); if (!isSuccess) isRollback = true; #region 序列号和序列号记录 因为要得到wsm插入数据库后生成Id //需要添加序列号表和记录 List soList = new List(); List sList = new List(); foreach (var b in boxs) { var ops_box = list.FirstOrDefault(f => f.OpsBoxId == b.OpsBoxId); foreach (var sn in ops_box.Details.SelectMany(s => s.SerialNumbers)) { var detail = ops_box.Details.FirstOrDefault(f => f.SerialNumbers.Select(s => s.SerialNumber).Contains(sn.SerialNumber)); if (detail == null) continue; var opsSerial = list.FirstOrDefault(f => f.OpsBoxId == b.OpsBoxId).Details .SelectMany(s => s.SerialNumbers) .FirstOrDefault(s => s.SerialNumber.Equals(sn.SerialNumber)); //序列号 SerialNumbers s = new SerialNumbers(sn.SerialNumber, detail.MaterialId, b.Id, b.OpsBoxId, opsSerial.BarCereateUser, opsSerial.BarCreateTime); sList.Add(s); //序列号记录(序列号生成) SerialNumberOperate so = new SerialNumberOperate(sn.SerialNumber, SerialNumberOperateType.Generate, detail.MaterialId, opsSerial.BarCereateUser, "", b.SupplierId, b.OrgId, null, opsSerial.BarCreateTime); soList.Add(so); //序列号记录(装箱) SerialNumberOperate so_g = new SerialNumberOperate(); so_g.CompleteCartonBox(sn.SerialNumber, detail.MaterialId, b); soList.Add(so_g); } } #endregion //序列号 isSuccess = await _serialNumbersRepositories.AddRange(sList, false); if (!isSuccess) isRollback = true; //序列号操作记录 var res = await _serialNumberService.SerialNumberOperate(soList, false); if (!res.Success) isRollback = true; //更新时间管理 isSuccess = await _erpOpsSyncDateRepositories.Edit(ErpOpsSyncType.Ops, false); if (!isSuccess) isRollback = true; //提交事务 isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } } }