* Added Lot table and service

* Changed behaviour of scanning to scan first PartNumber, select specific record and then scan MeylePartNumber
This commit is contained in:
2025-06-17 08:30:10 +02:00
parent e96bcc95ba
commit a8e3a8be66
15 changed files with 374 additions and 25 deletions

View File

@@ -0,0 +1,32 @@
namespace SytelineSaAppEfDataModel.Dtos;
public class LotDto
{
public string Item { get; set; }
public string LotNumber { get; set; }
public decimal? RcvdQty { get; set; }
public DateTime? CreateDate { get; set; }
public DateTime? ExpDate { get; set; }
public DateTime? PurgeDate { get; set; }
public string VendLot { get; set; }
public string CertNum { get; set; }
public string Charfld1 { get; set; }
public string Charfld2 { get; set; }
public string Charfld3 { get; set; }
public DateTime? Datefld { get; set; }
public decimal? Decifld1 { get; set; }
public decimal? Decifld2 { get; set; }
public decimal? Decifld3 { get; set; }
public bool Logifld { get; set; }
public bool NoteExistsFlag { get; set; }
public DateTime RecordDate { get; set; }
public Guid RowPointer { get; set; }
public string CreatedBy { get; set; }
public string UpdatedBy { get; set; }
public DateTime CreateDateField { get; set; }
public bool InWorkflow { get; set; }
public bool ContainsTaxFreeMatl { get; set; }
public string AttrGroup { get; set; }
public string ManufacturerId { get; set; }
public string ManufacturerItem { get; set; }
}

View File

@@ -11,4 +11,6 @@ public class WzRowMeyleDto
public string WzNumber { get; set; }
public string? PartNumber { get; set; }
public int? TransactionNumber { get; set; }
public string? FaIndex { get; set; }
public string? PartNumberSl { get; set; }
}

View File

@@ -0,0 +1,32 @@
namespace SytelineSaAppEfDataModel.Entities;
public class Lot
{
public string Item { get; set; }
public string LotNumber { get; set; }
public decimal? RcvdQty { get; set; }
public DateTime? CreateDate { get; set; }
public DateTime? ExpDate { get; set; }
public DateTime? PurgeDate { get; set; }
public string VendLot { get; set; }
public string CertNum { get; set; }
public string Charfld1 { get; set; }
public string Charfld2 { get; set; }
public string Charfld3 { get; set; }
public DateTime? Datefld { get; set; }
public decimal? Decifld1 { get; set; }
public decimal? Decifld2 { get; set; }
public decimal? Decifld3 { get; set; }
public bool Logifld { get; set; }
public bool NoteExistsFlag { get; set; }
public DateTime RecordDate { get; set; }
public Guid RowPointer { get; set; }
public string CreatedBy { get; set; }
public string UpdatedBy { get; set; }
public DateTime CreateDateField { get; set; }
public bool InWorkflow { get; set; }
public bool ContainsTaxFreeMatl { get; set; }
public string AttrGroup { get; set; }
public string ManufacturerId { get; set; }
public string ManufacturerItem { get; set; }
}

View File

@@ -11,6 +11,8 @@ public class WzRowMeyle
public string WzNumber { get; set; }
public string? PartNumber { get; set; }
public int? TransactionNumber { get; set; }
public string? FaIndex { get; set; }
public string? PartNumberSl { get; set; }
// Navigation property
public WzHeader Header { get; set; }

View File

@@ -24,6 +24,7 @@ namespace SytelineSaAppEfDataModel
CreateMap<WzHeader, WzHeaderDto>().ReverseMap();
CreateMap<WzRowMeyle, WzRowMeyleDto>().ReverseMap();
CreateMap<ItemCust, ItemCustDto>().ReverseMap();
CreateMap<Lot, LotDto>().ReverseMap();
}
}
}

View File

@@ -0,0 +1,10 @@
using SytelineSaAppEfDataModel.Dtos;
namespace SytelineSaAppEfDataModel.Services;
public interface ILotService
{
Task<IEnumerable<LotDto>> GetAll();
Task<LotDto?> GetByItemNumber(string itemNumber);
Task<LotDto?> GetByLotNumber(string lotNumber);
}

View File

@@ -10,4 +10,5 @@ public interface IMaterialTransactionService
Task<IEnumerable<MaterialTransactionDto>> GetByOrderNumber(string orderNumber);
Task<IEnumerable<MaterialTransactionDto>> GetOrderNumbersByWz(ISet<string> wzNumbers);
Task<IEnumerable<MaterialTransactionDto>> GetByCustomerNumber(string customerNumber, int customerSequence);
Task<MaterialTransactionDto?> GetByPartNumber(string partNumber);
}

View File

@@ -0,0 +1,25 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using SytelineSaAppEfDataModel.Dtos;
namespace SytelineSaAppEfDataModel.Services;
public class LotService(SytelineSaAppDbContext context, IMapper mapper) : ILotService
{
public async Task<IEnumerable<LotDto>> GetAll()
{
return await context.Lots.Select(x => mapper.Map<LotDto>(x)).ToListAsync();
}
public async Task<LotDto?> GetByItemNumber(string itemNumber)
{
return await context.Lots.Where(x => x.Item == itemNumber).Select(x => mapper.Map<LotDto>(x))
.FirstOrDefaultAsync();
}
public async Task<LotDto?> GetByLotNumber(string lotNumber)
{
return await context.Lots.Where(x => x.LotNumber == lotNumber).Select(x => mapper.Map<LotDto>(x))
.FirstOrDefaultAsync();
}
}

View File

@@ -83,4 +83,11 @@ public class MaterialTransactionService(SytelineSaAppDbContext context, IMapper
return result.OrderByDescending(x => x.CreateDate);
}
public async Task<MaterialTransactionDto?> GetByPartNumber(string partNumber)
{
return await context.MaterialTransactions
.Where(x => x.NR_KARTY_KONTROLNEJ == partNumber)
.Select(x => mapper.Map<MaterialTransactionDto>(x)).FirstOrDefaultAsync();
}
}

View File

@@ -27,6 +27,8 @@ namespace SytelineSaAppEfDataModel
public DbSet<WzRowMeyle> WzRowsMeyle { get; set; }
public DbSet<ItemCust> ItemCusts { get; set; }
public DbSet<Lot> Lots { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var configuration = new ConfigurationBuilder()
@@ -1000,7 +1002,17 @@ namespace SytelineSaAppEfDataModel
.HasColumnName("trans_num")
.HasColumnType("int")
.IsRequired(false);
entity.Property(e => e.FaIndex)
.HasColumnName("fa_index")
.HasMaxLength(100)
.IsRequired(false);
entity.Property(e => e.PartNumberSl)
.HasColumnName("part_number_sl")
.HasMaxLength(100)
.IsRequired(false);
// Relationship
entity.HasOne(e => e.Header)
.WithMany()
@@ -1150,6 +1162,150 @@ namespace SytelineSaAppEfDataModel
.HasDatabaseName("IX_itemcust_RowPointer")
.IsUnique();
});
modelBuilder.Entity<Lot>(entity =>
{
entity.ToTable("lot");
entity.HasKey(e => new { e.Item, e.LotNumber });
entity.Property(e => e.Item)
.HasColumnName("item")
.HasMaxLength(60)
.IsRequired();
entity.Property(e => e.LotNumber)
.HasColumnName("lot")
.HasMaxLength(15)
.IsRequired();
entity.Property(e => e.RcvdQty)
.HasColumnName("rcvd_qty")
.HasDefaultValueSql("0")
.IsRequired(false);
entity.Property(e => e.CreateDate)
.HasColumnName("create_date")
.IsRequired(false);
entity.Property(e => e.ExpDate)
.HasColumnName("exp_date")
.IsRequired(false);
entity.Property(e => e.PurgeDate)
.HasColumnName("purge_date")
.IsRequired(false);
entity.Property(e => e.VendLot)
.HasColumnName("vend_lot")
.HasMaxLength(30)
.IsRequired(false);
entity.Property(e => e.CertNum)
.HasColumnName("cert_num")
.HasMaxLength(20)
.IsRequired(false);
entity.Property(e => e.Charfld1)
.HasColumnName("charfld1")
.HasMaxLength(40)
.IsRequired(false);
entity.Property(e => e.Charfld2)
.HasColumnName("charfld2")
.HasMaxLength(40)
.IsRequired(false);
entity.Property(e => e.Charfld3)
.HasColumnName("charfld3")
.HasMaxLength(40)
.IsRequired(false);
entity.Property(e => e.Datefld)
.HasColumnName("datefld")
.IsRequired(false);
entity.Property(e => e.Decifld1)
.HasColumnName("decifld1")
.HasDefaultValueSql("0")
.IsRequired(false);
entity.Property(e => e.Decifld2)
.HasColumnName("decifld2")
.HasDefaultValueSql("0")
.IsRequired(false);
entity.Property(e => e.Decifld3)
.HasColumnName("decifld3")
.HasDefaultValueSql("0")
.IsRequired(false);
entity.Property(e => e.Logifld)
.HasColumnName("logifld")
.HasColumnType("tinyint")
.HasDefaultValueSql("0");
entity.Property(e => e.NoteExistsFlag)
.HasColumnName("NoteExistsFlag")
.HasColumnType("tinyint")
.HasDefaultValueSql("0");
entity.Property(e => e.RecordDate)
.HasColumnName("RecordDate")
.HasDefaultValueSql("getdate()");
entity.Property(e => e.RowPointer)
.HasColumnName("RowPointer")
.HasColumnType("uniqueidentifier")
.HasDefaultValueSql("newid()");
entity.Property(e => e.CreatedBy)
.HasColumnName("CreatedBy")
.HasMaxLength(60)
.HasDefaultValueSql("suser_sname()");
entity.Property(e => e.UpdatedBy)
.HasColumnName("UpdatedBy")
.HasMaxLength(60)
.HasDefaultValueSql("suser_sname()");
entity.Property(e => e.CreateDateField)
.HasColumnName("CreateDate")
.HasDefaultValueSql("getdate()");
entity.Property(e => e.InWorkflow)
.HasColumnName("InWorkflow")
.HasColumnType("tinyint")
.HasDefaultValueSql("0");
entity.Property(e => e.ContainsTaxFreeMatl)
.HasColumnName("contains_tax_free_matl")
.HasColumnType("tinyint")
.HasDefaultValueSql("0");
entity.Property(e => e.AttrGroup)
.HasColumnName("attr_group")
.HasMaxLength(20)
.IsRequired(false);
entity.Property(e => e.ManufacturerId)
.HasColumnName("manufacturer_id")
.HasMaxLength(14)
.IsRequired(false);
entity.Property(e => e.ManufacturerItem)
.HasColumnName("manufacturer_item")
.HasMaxLength(60)
.IsRequired(false);
// Indexes
entity.HasIndex(e => e.LotNumber)
.HasDatabaseName("IX_lot");
entity.HasIndex(e => e.RowPointer)
.HasDatabaseName("IX_lot_RowPointer")
.IsUnique();
});
}
}
}