using AutoMapper; using Microsoft.EntityFrameworkCore; 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; using WMS.Web.Core.Dto.Erp; using WMS.Web.Core.Dto.Erp.Customer; using WMS.Web.Core.Dto.SerialNumbers; using WMS.Web.Core.Help; using WMS.Web.Domain.Entitys; using WMS.Web.Domain.Infrastructure; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Mappers; using WMS.Web.Repositories.Configuration; namespace WMS.Web.Repositories { /// /// 序列号 /// public class SerialNumbersRepositories : ISerialNumbersRepositories { private readonly IMapper _mapper; private readonly IServiceProvider _serviceProvider; private readonly RepositoryDbContext _context; private readonly IErpService _erpService; private readonly IErpBasicDataExtendService _erpBasicDataExtendService; public SerialNumbersRepositories(RepositoryDbContext context, IMapper mapper, IServiceProvider serviceProvider, IErpService erpService, IErpBasicDataExtendService erpBasicDataExtendService) { _context = context; _mapper = mapper; _serviceProvider = serviceProvider; _erpService = erpService; _erpBasicDataExtendService = erpBasicDataExtendService; } public async Task AddRange(List entitys, bool isTransaction = true) { IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _context.Database.BeginTransaction(); try { if (entitys != null && entitys.Count != 0) { await _context.SerialNumbers.AddRangeAsync(entitys); await _context.SaveChangesAsync(); } if (_transaction != null) _transaction.Commit(); return true; } catch (Exception ex) { if (_transaction != null) _transaction.Rollback(); return false; } } /// /// 批量修改 /// /// /// /// public async Task EditEntityList(List entitys, bool isTransaction = true) { IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _context.Database.BeginTransaction(); try { List list = entitys.Select(s => s.Id).ToList(); var res = await _context.SerialNumbers .Where(f => list.Contains(f.Id)).ToListAsync(); var ids_e = res.Select(s => s.Id).ToList(); //在序列表里没找到的序列码 则到老ops序列码数据里去处理 list比较 取差集 var ids_c = list.Except(ids_e); if (ids_c.Count() > 0) { var entitys_ops = entitys.Where(w => ids_c.Contains(w.Id)).ToList(); var res_ops = await EditEntityList_Ops(entitys_ops, false); if (!res_ops) return false; } _mapper.ToMapList(entitys, res); await _context.SaveChangesAsync(); if (_transaction != null) _transaction.Commit(); } catch (Exception ex) { if (_transaction != null) _transaction.Rollback(); return false; } return true; } /// /// 根据序列号搜索信息 /// /// /// public async Task Get(string serialNumber) { List materials = new List(); var materials_result = await _erpService.BillQueryForMaterial(); if (materials_result.IsSuccess) materials = materials_result.Data.ToList(); List customers = new List(); var customer_result = await _erpService.BillQueryForCustomer(); if (customer_result.IsSuccess) customers = customer_result.Data.ToList(); var s = await _context.SerialNumbers .FirstOrDefaultAsync(f => serialNumber.Equals(f.SerialNumber)); if (s == null) { var so = await _context.SerialNumbers_Ops .FirstOrDefaultAsync(f => serialNumber.Equals(f.SerialNumber)); if (so == null) return null; else s = _mapper.Map(so); } SerialNumbersResponse respone = new SerialNumbersResponse() { MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, s.MaterialNumber), MaterialNumber = s.MaterialNumber, Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.MaterialNumber), CompleteCartonTime = s.CompleteCartonTime.DateToStringSeconds(), InStockTime = s.InStockTime.DateToStringSeconds(), OutStockTime = s.OutStockTime.DateToStringSeconds(), PurchaseBillNo = s.PurchaseBillNo, Customer = _erpBasicDataExtendService.GetCustomerName(customers, s.CustomerId), SerialNumber = s.SerialNumber }; if (!string.IsNullOrEmpty(s.SalBillNo)) { var list = JsonConvert.DeserializeObject>(s.SalBillNo); if (list.Count() > 0) respone.SalBillNo = list[0]; } return respone; } /// /// 根据序列号查询 /// /// /// public async Task> GetEntityList(List serialNumbers) { var res = await _context.SerialNumbers .Where(f => serialNumbers.Contains(f.SerialNumber)) .ToListAsync(); var res_c = res.Clone(); var s_e = res.Select(s => s.SerialNumber).ToList(); //在序列表里没找到的序列码 则到老ops序列码数据里去处理 list比较 取差集 var s_c = serialNumbers.Except(s_e); if (s_c.Count() > 0) { var entitys_ops = serialNumbers.Where(w => s_c.Contains(w)).ToList(); var r_o = await _context.SerialNumbers_Ops .Where(f => serialNumbers.Contains(f.SerialNumber)) .ToListAsync(); res_c.AddRange(_mapper.Map>(r_o.Clone())); } return res_c; } public async Task> GetEntityListByBoxId(int boxId) { var res = await _context.SerialNumbers .Where(f => f.BoxId == boxId) .ToListAsync(); var res_c = res.Clone(); var r_o = await _context.SerialNumbers_Ops .Where(f => f.BoxId == boxId) .ToListAsync(); if (r_o.Count() > 0) res_c.AddRange(_mapper.Map>(r_o.Clone())); return res_c; } /// /// 根据箱Ids查询集合 /// /// /// public async Task> GetEntityListByBoxIds(List boxIds) { var res = await _context.SerialNumbers .Where(f => boxIds.Contains(f.BoxId)) .ToListAsync(); var res_c = res.Clone(); var r_o = await _context.SerialNumbers_Ops .Where(f => boxIds.Contains(f.BoxId)) .ToListAsync(); if (r_o.Count() > 0) res_c.AddRange(_mapper.Map>(r_o.Clone())); return res_c; } /// /// 根据套装码获取序列码 /// /// /// public async Task> GetEntityListBySuitNumber(string suitNumber) { return await _context.SerialNumbers.AsNoTracking() .Where(f => f.SerialNumber.Contains(suitNumber)) .ToListAsync(); //var res = await _context.SerialNumbers // .Where(f => serialNumbers.Contains(f.SerialNumber)) // .ToListAsync(); //var res_c = res.Clone(); //var s_e = res.Select(s => s.SerialNumber).ToList(); ////在序列表里没找到的序列码 则到老ops序列码数据里去处理 list比较 取差集 //var s_c = serialNumbers.Except(s_e); //if (s_c.Count() > 0) //{ // var entitys_ops = serialNumbers.Where(w => s_c.Contains(w)).ToList(); // var r_o = await _context.SerialNumbers_Ops // .Where(f => serialNumbers.Contains(f.SerialNumber)) // .ToListAsync(); // res_c.AddRange(_mapper.Map>(r_o.Clone())); //} //return res_c; } /// /// 根据序列号 /// /// /// public async Task> GetSerialNumber(string serialNumber, string orgCode, bool IsOps = false, int serialStatus = 0) { List response2 = new List(); MaterialResponse response = new MaterialResponse(); var materials_result = await _erpService.BillQueryForMaterial(); if (!materials_result.IsSuccess) { response2.Add(response); return response2; } var materials = materials_result.Data.ToList(); var m = materials.Where(f => (f.Specifications.Equals(serialNumber) || f.MaterialNumber.Equals(serialNumber))); if (!string.IsNullOrEmpty(orgCode)) m = m.Where(w => w.OrgCode.Equals(orgCode)); var material = m.FirstOrDefault(); if (material != null) { response.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, material.MaterialNumber); response.MaterialNumber = material.MaterialNumber; response.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, material.MaterialNumber); response2.Add(response); return response2; } var res = _context.SerialNumbers .GroupJoin(_context.BoxInventory.Include(x => x.Details), serial => serial.BoxId, boxInventory => boxInventory.BoxId, (serial, boxInventory) => new { serial, boxInventory }) .SelectMany(x => x.boxInventory.DefaultIfEmpty(), (p, boxInventory) => new { p.serial, boxInventory }) .GroupJoin(_context.Box, s => s.serial.BoxId, box => box.Id, (s, box) => new { s.serial, s.boxInventory, box }) .SelectMany(x => x.box.DefaultIfEmpty(), (p, box) => new { p.serial, p.boxInventory, box }) .Where(w => serialNumber.Equals(w.serial.SerialNumber)); //0:所有 1 非激活的或者(激活被冻结) 2 激活被冻结 3 激活非冻结 //因为要 1和2的情况 要区分提示 所以条件扩大 然后根据具体的情况提示 //if (serialStatus == 1) // res = res.Where(w => w.serial.IsActivate != true || (w.serial.IsActivate == true && w.serial.IsDelete == true)); if (serialStatus == 2) res = res.Where(w => w.serial.IsActivate == true); else if (serialStatus == 3) res = res.Where(w => w.serial.IsActivate == true && w.serial.IsDelete != true); var entity = await res.FirstOrDefaultAsync(); if (entity == null || entity.serial == null) { if (IsOps) return await GetSerialNumber_Ops(serialNumber, serialStatus); else return null; } response.IsOldOps = false; response.BoxId = entity.serial.BoxId; response.BoxBillNo = entity?.box?.BoxBillNo ?? ""; response.SubStockCode = entity?.boxInventory?.SubStockCode ?? ""; response.StockCode = entity?.boxInventory?.StockCode ?? ""; response.SerialNumber = entity.serial.SerialNumber; response.IsDelete = entity.serial.IsDelete ?? false; response.IsActivate = entity.serial.IsActivate ?? false; response.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, entity.serial.MaterialNumber); response.MaterialNumber = entity.serial.MaterialNumber; response.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, entity.serial.MaterialNumber); if (entity.boxInventory != null) response.IsBoxInventory = entity.boxInventory.Details.SelectMany(s => s.SerialNumbers).Where(w => serialNumber.Equals(w)).Count() >= 1 ? true : false; response.IsTwo = entity.serial.IsTwo; if(entity.serial.TwoSerialNumber!=null) { response.TwoSerialNumber=entity.serial.TwoSerialNumber.Replace(entity.serial.SerialNumber,"").Replace(",",""); response.IsNotCount = entity.serial.IsNotCount; } else { response.TwoSerialNumber = ""; response.IsNotCount = "0"; } response.IsNotCount = entity.serial.IsNotCount; response2.Add(response); return response2; } /// /// 查询老ops序列码 /// /// /// private async Task> GetSerialNumber_Ops(string serialNumber, int serialStatus = 0) { List response2 = new List(); MaterialResponse response = new MaterialResponse(); var materials_result = await _erpService.BillQueryForMaterial(); if (!materials_result.IsSuccess) { response2.Add(response); return response2; } var materials = materials_result.Data.ToList(); var res = _context.SerialNumbers_Ops .GroupJoin(_context.BoxInventory.Include(x => x.Details), serial => serial.BoxId, boxInventory => boxInventory.BoxId, (serial, boxInventory) => new { serial, boxInventory }) .SelectMany(x => x.boxInventory.DefaultIfEmpty(), (p, boxInventory) => new { p.serial, boxInventory }) .GroupJoin(_context.Box, s => s.serial.BoxId, box => box.Id, (s, box) => new { s.serial, s.boxInventory, box }) .SelectMany(x => x.box.DefaultIfEmpty(), (p, box) => new { p.serial, p.boxInventory, box }) .Where(w => serialNumber.Equals(w.serial.SerialNumber)); //0:所有 1 非激活的或者(激活被冻结) 2 激活被冻结 3 激活非冻结 //因为要 1和2的情况 要区分提示 所以条件扩大 然后根据具体的情况提示 //if (serialStatus == 1) // res = res.Where(w => w.serial.IsActivate != true || (w.serial.IsActivate == true && w.serial.IsDelete == true)); if (serialStatus == 2) res = res.Where(w => w.serial.IsActivate == true); else if (serialStatus == 3) res = res.Where(w => w.serial.IsActivate == true && w.serial.IsDelete != true); var entity = await res.FirstOrDefaultAsync(); if (entity == null) return null; response.IsOldOps = true; response.IsBoxInventory = true;//如果是老ops序列号 默认有库存 response.BoxId = entity.serial.BoxId; response.BoxBillNo = entity?.box?.BoxBillNo ?? ""; response.SubStockCode = entity?.boxInventory?.SubStockCode ?? ""; response.StockCode = entity?.boxInventory?.StockCode ?? ""; response.SerialNumber = entity.serial.SerialNumber; response.IsDelete = entity.serial.IsDelete ?? false; response.IsActivate = entity.serial.IsActivate ?? false; response.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, entity.serial.MaterialNumber); response.MaterialNumber = entity.serial.MaterialNumber; response.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, entity.serial.MaterialNumber); //if (entity.boxInventory != null) // response.IsBoxInventory = entity.boxInventory.Details.SelectMany(s => s.SerialNumbers).Where(w => serialNumber.Equals(w)).Count() >= 1 ? true : false; response2.Add(response); return response2; } /// /// 老ops条码批量修改 /// /// /// /// private async Task EditEntityList_Ops(List entitys, bool isTransaction = true) { IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _context.Database.BeginTransaction(); try { var opsList = _mapper.Map>(entitys); List list = opsList.Select(s => s.Id).ToList(); var res = await _context.SerialNumbers_Ops .Where(f => list.Contains(f.Id)).ToListAsync(); _mapper.ToMapList(opsList, res); await _context.SaveChangesAsync(); if (_transaction != null) _transaction.Commit(); } catch (Exception ex) { if (_transaction != null) _transaction.Rollback(); return false; } return true; } /// /// 根据序列号查询老ops /// /// /// public async Task> GetEntityList_Ops(List serialNumbers) { var res = await _context.SerialNumbers_Ops .Where(f => serialNumbers.Contains(f.SerialNumber)) .ToListAsync(); return _mapper.Map>(res.Clone()); } /// /// 根据箱id批量删除 /// /// /// /// public async Task DeleteEntityList(List boxIds, bool isTransaction = true) { IDbContextTransaction _transaction = null; if (isTransaction) _transaction = _context.Database.BeginTransaction(); try { var res = await _context.SerialNumbers .Where(f => boxIds.Contains(f.BoxId)).ToListAsync(); _context.SerialNumbers.RemoveRange(res); await _context.SaveChangesAsync(); if (_transaction != null) _transaction.Commit(); } catch (Exception ex) { if (_transaction != null) _transaction.Rollback(); return false; } return true; } } }