diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 8f565c32..5adfb75d 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -155,11 +155,6 @@ 数量(装箱数量) - - - 序列号集 - - 箱库存表头 @@ -1052,6 +1047,46 @@ 备注 + + + 序列号 + + + + + 主键 订单编号 + + + + + 序列号 + + + + + 物料ID + + + + + wms箱ID + + + + + 对应老OPS的箱ID + + + + + 创建人(老ops过来) + + + + + 创建时间(老ops过来) + + wms盘点单 @@ -1541,6 +1576,19 @@ + + + 序列号 + + + + + 批量添加 + + + + + 批量添加 diff --git a/src/WMS.Web.Core/Dto/OpsBoxResponse.cs b/src/WMS.Web.Core/Dto/OpsBoxResponse.cs index 2ee37dfc..6b61d1e2 100644 --- a/src/WMS.Web.Core/Dto/OpsBoxResponse.cs +++ b/src/WMS.Web.Core/Dto/OpsBoxResponse.cs @@ -62,7 +62,7 @@ namespace WMS.Web.Core.Dto /// 序列号生成时间 /// [JsonProperty("barCreateTime")] - public string BarCreateTime { get; set; } + public DateTime? BarCreateTime { get; set; } /// /// 序列号生成用户 /// diff --git a/src/WMS.Web.Domain/Entitys/Box.cs b/src/WMS.Web.Domain/Entitys/Box.cs index c6492641..48ffea00 100644 --- a/src/WMS.Web.Domain/Entitys/Box.cs +++ b/src/WMS.Web.Domain/Entitys/Box.cs @@ -65,7 +65,7 @@ namespace WMS.Web.Domain.Entitys if (d == null) return Result.ReFailure(ResultCodes.BoxMateriaNoData); d.Qty = d.Qty - l.Qty; if (d.Qty <= 0) this.Details.Remove(d); - foreach (var s in l.SerialNumbers) d.SerialNumbers.Remove(s); + //foreach (var s in l.SerialNumbers) d.SerialNumbers.Remove(s); } return Result.ReSuccess(); } @@ -82,12 +82,12 @@ namespace WMS.Web.Domain.Entitys { MaterialId = l.MaterialId, Qty=l.Qty, - SerialNumbers=l.SerialNumbers + //SerialNumbers=l.SerialNumbers }); continue; } d.Qty = d.Qty + l.Qty; - d.SerialNumbers.AddRange(l.SerialNumbers); + //d.SerialNumbers.AddRange(l.SerialNumbers); } return Result.ReSuccess(); } diff --git a/src/WMS.Web.Domain/Entitys/BoxDetails.cs b/src/WMS.Web.Domain/Entitys/BoxDetails.cs index 027eac26..d2ee524d 100644 --- a/src/WMS.Web.Domain/Entitys/BoxDetails.cs +++ b/src/WMS.Web.Domain/Entitys/BoxDetails.cs @@ -31,9 +31,5 @@ namespace WMS.Web.Domain.Entitys /// 数量(装箱数量) /// public decimal Qty { get; set; } - /// - /// 序列号集 - /// - public List SerialNumbers { get; set; } = new List(); } } diff --git a/src/WMS.Web.Domain/Entitys/SerialNumbers.cs b/src/WMS.Web.Domain/Entitys/SerialNumbers.cs new file mode 100644 index 00000000..ea55eecf --- /dev/null +++ b/src/WMS.Web.Domain/Entitys/SerialNumbers.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; +using WMS.Web.Core; + +namespace WMS.Web.Domain.Entitys +{ + /// + /// 序列号 + /// + [Serializable] + [Table("t_wms_serialnumbers")] + public class SerialNumbers : EntityBase + { + public SerialNumbers() { } + public SerialNumbers(string serialNumber,int materialId,int boxId,int opsBoxId,string creator,DateTime? createTime) + { + this.SerialNumber = serialNumber; + this.MaterialId = materialId; + this.BoxId = boxId; + this.OpsBoxId = opsBoxId; + this.Creator = creator; + this.CreateTime = createTime == null ? DateTime.Now : (DateTime)createTime; + } + /// + /// 主键 订单编号 + /// + [Column("Id")] + public override int Id { get; set; } + /// + /// 序列号 + /// + [Column("SerialNumber")] + public string SerialNumber { get; set; } + /// + /// 物料ID + /// + [Column("MaterialId")] + public int MaterialId { get; set; } + /// + /// wms箱ID + /// + [Column("BoxId")] + public int BoxId { get; set; } + /// + /// 对应老OPS的箱ID + /// + [Column("OpsBoxId")] + public int OpsBoxId { get; set; } + /// + /// 创建人(老ops过来) + /// + [Column("Creator")] + public string Creator { get; set; } + /// + /// 创建时间(老ops过来) + /// + [Column("CreateTime")] + public DateTime CreateTime { get; set; } = DateTime.Now; + } +} diff --git a/src/WMS.Web.Domain/Infrastructure/ISerialNumbersRepositories.cs b/src/WMS.Web.Domain/Infrastructure/ISerialNumbersRepositories.cs new file mode 100644 index 00000000..201841ca --- /dev/null +++ b/src/WMS.Web.Domain/Infrastructure/ISerialNumbersRepositories.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Domain.Entitys; + +namespace WMS.Web.Domain.Infrastructure +{ + /// + /// 序列号 + /// + public interface ISerialNumbersRepositories + { + /// + /// 批量添加 + /// + /// + /// + /// + Task AddRange(List entitys, bool isTransaction = true); + } +} diff --git a/src/WMS.Web.Domain/Mappers/BoxMapper.cs b/src/WMS.Web.Domain/Mappers/BoxMapper.cs index 5c1114c7..adcf20db 100644 --- a/src/WMS.Web.Domain/Mappers/BoxMapper.cs +++ b/src/WMS.Web.Domain/Mappers/BoxMapper.cs @@ -19,8 +19,8 @@ namespace WMS.Web.Domain.Mappers CreateMap(); CreateMap(); - CreateMap() - .ForPath(x => x.SerialNumbers, ops => ops.MapFrom(x => x.SerialNumbers.Select(s=>s.SerialNumber).ToList())); + CreateMap(); + } } } diff --git a/src/WMS.Web.Domain/Services/BoxService.cs b/src/WMS.Web.Domain/Services/BoxService.cs index e08f2c1f..605dc4ea 100644 --- a/src/WMS.Web.Domain/Services/BoxService.cs +++ b/src/WMS.Web.Domain/Services/BoxService.cs @@ -27,11 +27,13 @@ namespace WMS.Web.Domain.Services private readonly IOpsService _opsService; private readonly ISerialNumberOperateRepositories _serialNumberOperateRepositories; private readonly IErpOpsSyncDateRepositories _erpOpsSyncDateRepositories; + private readonly ISerialNumbersRepositories _serialNumbersRepositories; public BoxService(IMapper mapper, ILoginService loginService, IBasicsRepositories transactionRepositories, IBoxRepositories boxRepositories, IOpsService opsService, ISerialNumberOperateRepositories serialNumberOperateRepositories, - IErpOpsSyncDateRepositories erpOpsSyncDateRepositories) + IErpOpsSyncDateRepositories erpOpsSyncDateRepositories, + ISerialNumbersRepositories serialNumbersRepositories) { _mapper = mapper; _loginService = loginService; @@ -40,6 +42,7 @@ namespace WMS.Web.Domain.Services _opsService = opsService; _serialNumberOperateRepositories = serialNumberOperateRepositories; _erpOpsSyncDateRepositories = erpOpsSyncDateRepositories; + _serialNumbersRepositories = serialNumbersRepositories; } public async Task Sync() @@ -57,25 +60,39 @@ namespace WMS.Web.Domain.Services } var boxs = _mapper.Map>(list); - //需要添加序列号记录表 - List sList = new List(); - foreach (var b in boxs) - { - foreach (var sn in b.Details.SelectMany(s => s.SerialNumbers)) - { - SerialNumberOperate s = new SerialNumberOperate(sn, SerialNumberOperateType.Generate, b.CreateUser, "", b.SupplierId, b.OrgId, null, b.CreateTime); - sList.Add(s); - } - } - 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).Equals(sn.SerialNumber)); + 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, opsSerial.BarCereateUser, "", b.SupplierId, b.OrgId, null, opsSerial.BarCreateTime); + soList.Add(so); + } + } + #endregion + //序列号 + isSuccess = await _serialNumbersRepositories.AddRange(sList, false); + if (!isSuccess) isRollback = true; //序列号操作记录 - var res = await this.SerialNumberOperate(sList, false); + var res = await this.SerialNumberOperate(soList, false); if (!res.Success) isRollback = true; //更新时间管理 isSuccess = await _erpOpsSyncDateRepositories.Edit(ErpOpsSyncType.Ops, false); diff --git a/src/WMS.Web.Repositories/BoxRepositories.cs b/src/WMS.Web.Repositories/BoxRepositories.cs index 110cb16a..c592c179 100644 --- a/src/WMS.Web.Repositories/BoxRepositories.cs +++ b/src/WMS.Web.Repositories/BoxRepositories.cs @@ -27,9 +27,12 @@ namespace WMS.Web.Repositories private readonly ISingleDataService _singleDataService; private readonly ILoginRepositories _loginRepositories; private readonly IBasicsRepositories _basicsRepositories; - + private readonly IErpBasicDataExtendService _erpBasicDataExtendService; + private readonly IErpService _erpService; public BoxRepositories(RepositoryDbContext context, IMapper mapper, IServiceProvider serviceProvider, - ISingleDataService singleDataService, ILoginRepositories loginRepositories, IBasicsRepositories basicsRepositories) + ISingleDataService singleDataService, ILoginRepositories loginRepositories, + IBasicsRepositories basicsRepositories, IErpBasicDataExtendService erpBasicDataExtendService, + IErpService erpServic) { _context = context; _mapper = mapper; @@ -37,6 +40,8 @@ namespace WMS.Web.Repositories _singleDataService = singleDataService; _loginRepositories = loginRepositories; _basicsRepositories = basicsRepositories; + _erpBasicDataExtendService = erpBasicDataExtendService; + _erpService = erpServic; } public async Task Get(int id) { @@ -54,11 +59,27 @@ namespace WMS.Web.Repositories { var list = await _context.Box.Include(x => x.Details).Where(f => BoxBillNos.Contains(f.BoxBillNo)).ToListAsync(); var resList = _mapper.Map>(list); - + + var materials_result = await _erpService.BillQueryForMaterial(); + if (!materials_result.IsSuccess) + return new List(); + var materials = materials_result.Data.ToList(); + + var ids = list.Select(s => s.Id).ToList(); + //获取所有序列号 + var serialList = await _context.SerialNumbers.Where(f => ids.Contains(f.BoxId)).ToListAsync(); + //获取物料信息 显示物料三件套 var mIds = list.SelectMany(s => s.Details).Select(s => s.MaterialId).ToList(); foreach (var r in resList) { + foreach (var detail in r.Details) + { + detail.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, detail.MaterialId); + detail.MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, detail.MaterialId); + detail.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, detail.MaterialId); + detail.SerialNumbers = serialList.Where(w => w.BoxId == r.Id && w.MaterialId == detail.MaterialId).Select(s => s.SerialNumber).ToList(); + } r.TotalQty = r.Details.Sum(s => s.Qty); } return resList; @@ -111,7 +132,7 @@ namespace WMS.Web.Repositories public async Task> GetByNos(List billNos) { return await _context.Box - .Where(w => billNos.Contains(w.BoxBillNo)).Select(s=>s.BoxBillNo).ToListAsync(); + .Where(w => billNos.Contains(w.BoxBillNo)).Select(s => s.BoxBillNo).ToListAsync(); } public async Task AddRange(List entitys, bool isTransaction = true) diff --git a/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs b/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs index 248e7e4b..3b92baaa 100644 --- a/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs +++ b/src/WMS.Web.Repositories/Configuration/RepositoryDbContext.cs @@ -49,6 +49,12 @@ namespace WMS.Web.Repositories.Configuration ent.HasKey(x => x.Id); }); + //序列号 + builder.Entity(ent => + { + ent.ToTable("t_wms_serialnumbers"); + ent.HasKey(x => x.Id); + }); //序列号操作记录 builder.Entity(ent => { @@ -226,10 +232,6 @@ namespace WMS.Web.Repositories.Configuration { ent.ToTable("t_ops_box_details"); ent.HasKey(x => x.Id); - - ent.Property(f => f.SerialNumbers).HasConversion( - v => JsonConvert.SerializeObject(v), - v => JsonConvert.DeserializeObject>(v)); }); #endregion @@ -238,6 +240,7 @@ namespace WMS.Web.Repositories.Configuration base.OnModelCreating(builder); } + public DbSet SerialNumbers { get; set; } public DbSet ErpOpsSyncDate { get; set; } public DbSet SerialNumberOperate { get; set; } public DbSet ChangeBoxRecord { get; set; } diff --git a/src/WMS.Web.Repositories/DependencyInjection/AppBuilderExtensions.cs b/src/WMS.Web.Repositories/DependencyInjection/AppBuilderExtensions.cs index 5ea91160..4ed35dbb 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AppBuilderExtensions.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AppBuilderExtensions.cs @@ -46,7 +46,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddTransient(); - + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/src/WMS.Web.Repositories/SerialNumbersRepositories.cs b/src/WMS.Web.Repositories/SerialNumbersRepositories.cs new file mode 100644 index 00000000..b9c5cf21 --- /dev/null +++ b/src/WMS.Web.Repositories/SerialNumbersRepositories.cs @@ -0,0 +1,53 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Domain.Entitys; +using WMS.Web.Domain.Infrastructure; +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; + + public SerialNumbersRepositories(RepositoryDbContext context, IMapper mapper, IServiceProvider serviceProvider) + { + _context = context; + _mapper = mapper; + _serviceProvider = serviceProvider; + } + + 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; + } + } + } +}