using Microsoft.EntityFrameworkCore.Storage; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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; using WMS.Web.Domain.Values.Single; namespace WMS.Web.Domain.Services { /// /// 序列号服务 /// public class SerialNumberService : ISerialNumberService { private readonly ISerialNumberOperateRepositories _serialNumberOperateRepositories; private readonly ISerialNumbersRepositories _serialNumbersRepositories; public readonly IBasicsRepositories _transactionRepositories; public readonly IBoxRepositories _boxRepositories; private readonly ISingleDataService _singleDataService; private readonly IErpService _erpService; public SerialNumberService(ISerialNumberOperateRepositories serialNumberOperateRepositories, ISerialNumbersRepositories serialNumbersRepositories, IBasicsRepositories transactionRepositories, IBoxRepositories boxRepositories, ISingleDataService singleDataService, IErpService erpService) { _serialNumberOperateRepositories = serialNumberOperateRepositories; _serialNumbersRepositories = serialNumbersRepositories; _transactionRepositories = transactionRepositories; _boxRepositories = boxRepositories; _singleDataService = singleDataService; _erpService = erpService; } /// /// 改箱 /// /// /// /// public async Task ChangeBox(List changeBoxRecords, LoginInDto loginInfo, bool isTransaction = true) { //获取序列号信息 var serialNumbers = changeBoxRecords.SelectMany(s => s.SerialNumbers).ToList(); var entityList = await _serialNumbersRepositories.GetEntityList(serialNumbers); var boxIds = changeBoxRecords.Select(s => s.DestBoxId).ToList(); var boxList = await _boxRepositories.GetEntityList(boxIds); var userName = _singleDataService.GetSingleData(SingleAction.Staffs, loginInfo.UserInfo.CompanyId, loginInfo.UserInfo.StaffId); IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; List sList = new List(); foreach (var entity in entityList) { var destBox = changeBoxRecords.FirstOrDefault(f => f.SerialNumbers.Contains(entity.SerialNumber)); var box = boxList.FirstOrDefault(f => f.Id == destBox.DestBoxId); //修改序列号和箱绑定关系 entity.Bind(destBox.DestBoxId, box.CompleteCartonTime); //记录序列号操作日志 SerialNumberOperate op = new SerialNumberOperate() { MaterialId = entity.MaterialId, SerialNumber = entity.SerialNumber, OrgId = box.OrgId, SupplierId = box.SupplierId, OperateTime = DateTime.Now, OperateType = SerialNumberOperateType.ChangeBox, OperateUser = userName, Remark = "单号:" + destBox.BillNo + "\r\n" + "箱号:" + box.BoxBillNo }; //取目标箱子仓位 记录目标箱仓位号 //if (moveBoxRecord.Type == MoveBoxType.Up) //{ //var srcSubStock = _singleDataService.GetSingleData(SingleAction.SubStocks, loginInfo.UserInfo.CompanyId, moveBoxRecord.DestSubStockId); //op.Remark += "\r\n" + "仓位:" + srcSubStock; //} sList.Add(op); } isSuccess = await _serialNumbersRepositories.EditEntityList(entityList, false); //序列号操作记录 var res = await this.SerialNumberOperate(sList, false); //提交事务 if (isTransaction) { if (!isSuccess) isRollback = true; if (!res.Success) isRollback = true; isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); if (!res.Success) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 移箱 /// /// /// /// /// public async Task MoveBox(List moveBoxRecords, LoginInDto loginInfo, bool isTransaction = true) { //获取序列号信息 var boxids = moveBoxRecords.Select(s => s.BoxId).ToList(); var entityList = await _serialNumbersRepositories.GetEntityListByBoxIds(boxids); var boxList = await _boxRepositories.GetEntityList(boxids); var userName = _singleDataService.GetSingleData(SingleAction.Staffs, loginInfo.UserInfo.CompanyId, loginInfo.UserInfo.StaffId); IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; List sList = new List(); foreach (var entity in entityList) { var box = boxList.FirstOrDefault(f => f.Id == entity.BoxId); var moveBoxRecord = moveBoxRecords.FirstOrDefault(f => f.BoxId == entity.BoxId); //修改序列号和箱绑定关系 //entity.Bind(moveBoxRecord.BoxId); //记录序列号操作日志 SerialNumberOperate op = new SerialNumberOperate() { MaterialId = entity.MaterialId, SerialNumber = entity.SerialNumber, OrgId = box.OrgId, SupplierId = box.SupplierId, OperateTime = DateTime.Now, OperateType = moveBoxRecord.Type == MoveBoxType.Up ? SerialNumberOperateType.MoveBox_Up : SerialNumberOperateType.MoveBox_Down, OperateUser = userName, Remark = "单号:" + moveBoxRecord.BillNo + "\r\n" + "箱号:" + box.BoxBillNo }; if (moveBoxRecord.Type == MoveBoxType.Up) { var srcSubStock = _singleDataService.GetSingleData(SingleAction.SubStocks, loginInfo.UserInfo.CompanyId, moveBoxRecord.DestSubStockId); op.Remark += "\r\n" + "仓位:" + srcSubStock; } sList.Add(op); } isSuccess = await _serialNumbersRepositories.EditEntityList(entityList, false); //序列号操作记录 var res = await this.SerialNumberOperate(sList, false); //提交事务 if (isTransaction) { if (!isSuccess) isRollback = true; if (!res.Success) isRollback = true; isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); if (!res.Success) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 出库 /// /// /// /// /// public async Task OutStock(OutStock outStock, LoginInDto loginInfo, bool isTransaction = true) { //获取序列号信息 var serialNumbers = outStock.Details.SelectMany(s => s.SerialNumbers).ToList(); var entityList = await _serialNumbersRepositories.GetEntityList(serialNumbers); var boxIds = entityList.Select(s => s.BoxId).ToList(); var boxList = await _boxRepositories.GetEntityList(boxIds); var userName = _singleDataService.GetSingleData(SingleAction.Staffs, loginInfo.UserInfo.CompanyId, loginInfo.UserInfo.StaffId); IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; List sList = new List(); foreach (var entity in entityList) { var box = boxList.FirstOrDefault(f => f.Id == entity.BoxId); var outstockDetail = outStock.Details.FirstOrDefault(f => f.MaterialId == entity.MaterialId); if (outstockDetail == null) continue; //修改序列号和箱绑定关系 entity.OutStock(outStock, entity.MaterialId); //记录序列号操作日志 SerialNumberOperate op = new SerialNumberOperate() { MaterialId = entity.MaterialId, SerialNumber = entity.SerialNumber, OrgId = box.OrgId, SupplierId = box.SupplierId, OperateTime = DateTime.Now, OperateType = OutStockTypeConvert(outStock.Type), OperateUser = userName, Remark = "来源单号:" + string.Join(",", outstockDetail.ErpDetails.Select(s => s.SourceBillNo)) + "\r\n" + "出库单号:" + outStock.BillNo }; if (outStock.Type == OutStockType.Sal) { var detail = outStock.Details.FirstOrDefault(f => f.MaterialId == entity.MaterialId); var res_c = await _erpService.BillQueryForCustomer(); var customer = res_c.Data.FirstOrDefault(f => f.Id == outStock.ReceiptCustomerId); op.Remark += "\r\n" + "销售订单号:" + string.Join(",", detail.ErpDetails.Select(s => s.SaleBillNo)); op.Remark += "\r\n" + "客户:" + customer?.Name; } sList.Add(op); } isSuccess = await _serialNumbersRepositories.EditEntityList(entityList, false); //序列号操作记录 var res = await this.SerialNumberOperate(sList, false); //提交事务 if (isTransaction) { if (!isSuccess) isRollback = true; if (!res.Success) isRollback = true; isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); if (!res.Success) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 出库单类型转化序列号记录类型 /// /// /// private SerialNumberOperateType OutStockTypeConvert(OutStockType type) { switch (type) { case OutStockType.Sal: return SerialNumberOperateType.Sal_Out; case OutStockType.Assembled: return SerialNumberOperateType.Assembled_Out; case OutStockType.Miscellaneous: return SerialNumberOperateType.Miscellaneous_Out; case OutStockType.Stkdirecttransfers: return SerialNumberOperateType.Stkdirecttransfers_Out; case OutStockType.StktransferInst: return SerialNumberOperateType.StktransferInst_Out; default: return SerialNumberOperateType.StktransferInst_Out; } } /// /// 出库单类型转化序列号记录类型 /// /// /// private SerialNumberOperateType InStockTypeConvert(InstockType type) { switch (type) { case InstockType.Purchase: return SerialNumberOperateType.Purchase_In; case InstockType.Assembled: return SerialNumberOperateType.Assembled_In; case InstockType.Miscellaneous: return SerialNumberOperateType.Miscellaneous_In; case InstockType.Stkdirecttransfers: return SerialNumberOperateType.Stkdirecttransfers_In; case InstockType.StktransferInst: return SerialNumberOperateType.StktransferInst_In; default: return SerialNumberOperateType.StktransferInst_In; } } /// /// 序列号操作记录日志 /// /// /// /// public async Task SerialNumberOperate(List list, bool isTransaction = true) { var isSuccess = await _serialNumberOperateRepositories.AddRange(list, isTransaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 入库 /// /// /// /// /// public async Task InStock(InStock inStock, LoginInDto loginInfo, bool isTransaction = true) { //获取序列号信息 var serialNumbers = inStock.Details.SelectMany(s => s.SerialNumbers).ToList(); var entityList = await _serialNumbersRepositories.GetEntityList(serialNumbers); var boxIds = entityList.Select(s => s.BoxId).ToList(); var boxList = await _boxRepositories.GetEntityList(boxIds); var userName = _singleDataService.GetSingleData(SingleAction.Staffs, loginInfo.UserInfo.CompanyId, loginInfo.UserInfo.StaffId); IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; List sList = new List(); foreach (var entity in entityList) { var box = boxList.FirstOrDefault(f => f.Id == entity.BoxId); var instockDetail = inStock.Details.FirstOrDefault(f => f.MaterialId == entity.MaterialId); var subStock = _singleDataService.GetSingleData(SingleAction.SubStocks, loginInfo.UserInfo.CompanyId, inStock.SubStockId); //修改序列号和箱绑定关系 entity.InStock(instockDetail.SourceBillNo, inStock.Type); //记录序列号操作日志 SerialNumberOperate op = new SerialNumberOperate() { MaterialId = entity.MaterialId, SerialNumber = entity.SerialNumber, OrgId = box.OrgId, SupplierId = box.SupplierId, OperateTime = DateTime.Now, OperateType = InStockTypeConvert(inStock.Type), OperateUser = userName, Remark = "来源单号:" + inStock.Details.First().SourceBillNo + "\r\n" + "入库单号:" + inStock.BillNo + "\r\n" + "仓位号:" + subStock }; sList.Add(op); } isSuccess = await _serialNumbersRepositories.EditEntityList(entityList, false); //序列号操作记录 var res = await this.SerialNumberOperate(sList, false); //提交事务 if (isTransaction) { if (!isSuccess) isRollback = true; if (!res.Success) isRollback = true; isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); if (!res.Success) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 出入库回退 /// /// /// /// /// public async Task BackRecord(BackRecord backRecord, LoginInDto loginInfo, bool isTransaction = true) { //获取序列号信息 var serialNumbers = backRecord.Details.SelectMany(s => s.SerialNumbers).ToList(); var entityList = await _serialNumbersRepositories.GetEntityList(serialNumbers); var boxIds = entityList.Select(s => s.BoxId).ToList(); var boxList = await _boxRepositories.GetEntityList(boxIds); var userName = _singleDataService.GetSingleData(SingleAction.Staffs, loginInfo.UserInfo.CompanyId, loginInfo.UserInfo.StaffId); IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; List sList = new List(); foreach (var entity in entityList) { var box = boxList.FirstOrDefault(f => f.Id == entity.BoxId); var detail = backRecord.Details.FirstOrDefault(w => w.SerialNumbers.Contains(entity.SerialNumber)); //if (backRecord.Type == BackRecordType.InstockOff) // entity.UnBind(); if (backRecord.Type == BackRecordType.OutstockOn) entity.Bind(detail.BoxId, box.CompleteCartonTime); //记录序列号操作日志 SerialNumberOperate op = new SerialNumberOperate() { MaterialId = entity.MaterialId, SerialNumber = entity.SerialNumber, OrgId = box.OrgId, SupplierId = box.SupplierId, OperateTime = DateTime.Now, OperateType = backRecord.Type == BackRecordType.InstockOff ? SerialNumberOperateType.BackRecord_Off : SerialNumberOperateType.BackRecord_On, OperateUser = userName, Remark = "单号:" + backRecord.BillNo + "\r\n" + "箱号:" + box.BoxBillNo }; if (backRecord.Type == BackRecordType.OutstockOn) { var subStockId = backRecord?.SubStockId ?? 0; var srcSubStock = _singleDataService.GetSingleData(SingleAction.SubStocks, loginInfo.UserInfo.CompanyId, subStockId); op.Remark += "\r\n" + "仓位:" + srcSubStock; } sList.Add(op); } isSuccess = await _serialNumbersRepositories.EditEntityList(entityList, false); //序列号操作记录 var res = await this.SerialNumberOperate(sList, false); //提交事务 if (isTransaction) { if (!isSuccess) isRollback = true; if (!res.Success) isRollback = true; isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); if (!res.Success) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } /// /// 盘点 /// /// /// /// /// public async Task TakeStock(List takeStocks, LoginInDto loginInfo, bool isTransaction = true) { var serialNumbers = takeStocks.SelectMany(s => s.Details).SelectMany(s => s.SerialNumbers).ToList(); var entityList = await _serialNumbersRepositories.GetEntityList(serialNumbers); var boxIds = entityList.Select(s => s.BoxId).ToList(); var boxList = await _boxRepositories.GetEntityList(boxIds); List box_New_List = new List(); List soList = new List(); List sList = new List(); foreach (var s in serialNumbers) { var takeStockDetail = takeStocks.SelectMany(s => s.Details).FirstOrDefault(w => w.SerialNumbers.Contains(s)); if (takeStockDetail == null) continue; var box = boxList.FirstOrDefault(f => f.Id == takeStockDetail.BoxId); var s_entity = entityList.FirstOrDefault(f => f.SerialNumber.Equals(s)); if (box != null && box.Details.FirstOrDefault(f => f.MaterialId == takeStockDetail.MaterialId) == null) { //如果这个物料不存在箱箱信息 添加进去 box.TakeStock(takeStockDetail.MaterialId, takeStockDetail.AfterQty); box_New_List.Add(box); } if (s_entity == null) { //序列号 SerialNumbers s_new = new SerialNumbers(s, takeStockDetail.MaterialId, takeStockDetail.Id, 0, "", DateTime.Now, DateTime.Now); sList.Add(s_new); } else { s_entity.BoxId = takeStockDetail.BoxId; var takeStock = takeStocks.FirstOrDefault(w => w.Details.FirstOrDefault(w => w.SerialNumbers.Contains(s)) != null); //记录序列号操作日志 SerialNumberOperate op = new SerialNumberOperate() { MaterialId = takeStockDetail.MaterialId, SerialNumber = s, OrgId = box.OrgId, SupplierId = box.SupplierId, OperateTime = DateTime.Now, OperateType = SerialNumberOperateType.TakeStock, OperateUser = "", Remark = "单号:" + takeStock.BillNo + "\r\n" + "箱号:" + box.BoxBillNo }; soList.Add(op); } } IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _transactionRepositories.GetTransaction(); bool isRollback = false; bool isSuccess = true; isSuccess = await _serialNumbersRepositories.EditEntityList(entityList, false); if (isSuccess) isSuccess = await _serialNumbersRepositories.AddRange(sList, false); if (isSuccess) isSuccess = await _boxRepositories.EditEntityList(box_New_List,false); //序列号操作记录 var res = await this.SerialNumberOperate(soList, false); //提交事务 if (isTransaction) { if (!isSuccess) isRollback = true; if (!res.Success) isRollback = true; isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction); if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); } if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError); if (!res.Success) return Result.ReFailure(ResultCodes.DateWriteError); return Result.ReSuccess(); } } }