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; 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; private readonly ILogger _Logger; public readonly IBasicsRepositories _basbicsRepositories; public BoxService(IMapper mapper, ILoginService loginService, IBasicsRepositories transactionRepositories, IBoxRepositories boxRepositories, IOpsService opsService, ISerialNumberService serialNumberService, IErpOpsSyncDateRepositories erpOpsSyncDateRepositories, ISerialNumbersRepositories serialNumbersRepositories, IBasicsRepositories basbicsRepositories, ILogger Logger) { _mapper = mapper; _loginService = loginService; _transactionRepositories = transactionRepositories; _boxRepositories = boxRepositories; _opsService = opsService; _serialNumberService = serialNumberService; _erpOpsSyncDateRepositories = erpOpsSyncDateRepositories; _serialNumbersRepositories = serialNumbersRepositories; _Logger = Logger; _basbicsRepositories = basbicsRepositories; } public async Task Sync(List list) { if (list == null || list.Count() <= 0) { DateTime begin = await _erpOpsSyncDateRepositories.Get(ErpOpsSyncType.Ops); begin = begin.AddHours(-1); OpsBoxRequest request = new OpsBoxRequest(begin, DateTime.Now); list = await _opsService.GetBox(request); if (list.Count() > 0) _Logger.LogInformation($"获取老ops箱数据:{DateTime.Now}-{JsonConvert.SerializeObject(list)}"); } 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); var sns = list.SelectMany(s => s.Details).SelectMany(s => s.SerialNumbers).Select(s => s.SerialNumber).ToList(); var sEntityList = await _serialNumbersRepositories.GetEntityList(sns); 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 sn_s = sEntityList.FirstOrDefault(f => f.SerialNumber.Equals(sn.SerialNumber)); if (sn_s != 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.MaterialNumber, b.Id, b.OpsBoxId, opsSerial.BarCereateUser, opsSerial.BarCreateTime, b.CompleteCartonTime); sList.Add(s); //序列号记录(序列号生成) SerialNumberOperate so = new SerialNumberOperate(sn.SerialNumber, SerialNumberOperateType.Generate, detail.MaterialNumber, opsSerial.BarCereateUser, "", b.SupplierId, b.OrgId, null, opsSerial.BarCreateTime); soList.Add(so); //序列号记录(装箱) SerialNumberOperate so_g = new SerialNumberOperate(); so_g.CompleteCartonBox(sn.SerialNumber, detail.MaterialNumber, 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(); } /// /// 箱库存同步箱信息 /// /// /// /// public async Task BoxInventorySync(List list, bool isTransaction = true) { if (list.Count() == 0) return Result.ReSuccess(); var boxIds = list.Select(s => s.BoxId).Distinct().ToList(); var boxs = await _boxRepositories.GetEntityList(boxIds); foreach (var db in list) { var box = boxs.FirstOrDefault(f => f.Id == db.BoxId); if (box == null) continue; box.BoxInventory(db); } IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _basbicsRepositories.GetTransaction(); Result res_Rollback = Result.ReSuccess(); bool isSuccess = true; if (res_Rollback.IsSuccess) { isSuccess = await _boxRepositories.EditEntityList(boxs, false); if (!isSuccess) res_Rollback = Result.ReFailure(ResultCodes.DateWriteError); } //提交事务 if (isTransaction) { isSuccess = _basbicsRepositories.CommitTransaction(res_Rollback.IsSuccess ? false : true, _transaction); if (!res_Rollback.IsSuccess) return res_Rollback; if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } return Result.ReSuccess(); } } }