From b470d88ccbff8474e894cb68b375cee90b63f1ef Mon Sep 17 00:00:00 2001 From: syc_zhaoqianyan Date: Tue, 11 Nov 2025 09:20:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seyounth.auto.hs.metadata.v9.bin | Bin 6565 -> 6565 bytes .../seyounth.auto.hs.projects.v9.bin | Bin 1967942 -> 2056745 bytes .../seyounth.auto.hs.strings.v9.bin | Bin 264937 -> 266515 bytes .../DesignTimeBuild/.dtbcache.v2 | Bin 580998 -> 580998 bytes .vs/Seyounth.Auto.Hs/v17/.futdcache.v2 | Bin 11395 -> 11395 bytes .vs/Seyounth.Auto.Hs/v17/.suo | Bin 478720 -> 510976 bytes .../v17/DocumentLayout.backup.json | 643 ++++++++++-------- .vs/Seyounth.Auto.Hs/v17/DocumentLayout.json | 513 +++++++------- .../Syc.Basic.Web.WMS.HttpApi.Host/Program.cs | 2 + .../Syc.Basic.Web.WMS.HttpApi.Host.csproj | 1 + ...Syc.Basic.Web.WMS.HttpApi.Host.csproj.user | 2 + .../Dtos/Box/BoxDto.cs | 1 + .../BarTenderHelper/ExcelExporter.cs | 92 +++ .../DefaultBalanceEventHandle.cs | 12 +- .../Dto/BoxInput.cs | 6 + .../Dto/DownSilkDto.cs | 62 ++ .../Dto/IdsInput.cs | 13 + .../Dto/SilkDto.cs | 2 + .../Dto/SilkInput.cs | 9 +- .../Dto/SumInput.cs | 22 + .../Dto/ValuesDto.cs | 15 + .../Dto/ValuesInput.cs | 14 + .../Service/BoxService.cs | 86 ++- .../Service/DownService.cs | 138 ++++ .../Service/SilkService.cs | 92 ++- .../Service/ValuesService.cs | 49 ++ .../Syc.Basic.Web.WMS.Application.csproj | 1 + .../Syc.Basic.Web.WMS.Application.xml | 24 + .../Syc.Basic.Web.WMS.Domain/Entitys/Box.cs | 1 + .../Syc.Basic.Web.WMS.Domain/Entitys/Silk.cs | 2 + .../Entitys/Values.cs | 20 + .../BasicDbContextModelCreatingExtensions.cs | 6 + .../EntityFrameworkCore/WMSDbContext.cs | 1 + 33 files changed, 1293 insertions(+), 536 deletions(-) create mode 100644 services/Syc.Basic.Web.WMS.Application/BarTenderHelper/ExcelExporter.cs create mode 100644 services/Syc.Basic.Web.WMS.Application/Dto/DownSilkDto.cs create mode 100644 services/Syc.Basic.Web.WMS.Application/Dto/IdsInput.cs create mode 100644 services/Syc.Basic.Web.WMS.Application/Dto/SumInput.cs create mode 100644 services/Syc.Basic.Web.WMS.Application/Dto/ValuesDto.cs create mode 100644 services/Syc.Basic.Web.WMS.Application/Dto/ValuesInput.cs create mode 100644 services/Syc.Basic.Web.WMS.Application/Service/DownService.cs create mode 100644 services/Syc.Basic.Web.WMS.Application/Service/ValuesService.cs create mode 100644 services/Syc.Basic.Web.WMS.Domain/Entitys/Values.cs diff --git a/.vs/ProjectEvaluation/seyounth.auto.hs.metadata.v9.bin b/.vs/ProjectEvaluation/seyounth.auto.hs.metadata.v9.bin index c3547a81f988cf13840cff81332e6f74c40b369e..7491f045d661fff0785cd465742be629775a64a4 100644 GIT binary patch delta 209 zcmZ2#ywrGugOH5qWH|;9m<+_0yIC@FrSEYtKlr$RYq0da$>%tvChy_q;o8B&?6!zW zAP6YbBjh0qmFD<;pP7Lzq^9K7ZH_+&c$ketn1M=Q-g;-g^e`9DwyrGKb`hY_38EUZP&UW!yUYyp8K)=!jsAUw+2Fe% k*z%>KF~Vvdu2(niy36tB3?s9(x=vB{j=P&h#3nKW0M~~}Qvd(} diff --git a/.vs/ProjectEvaluation/seyounth.auto.hs.projects.v9.bin b/.vs/ProjectEvaluation/seyounth.auto.hs.projects.v9.bin index 17f6a0b609b3c94092c09477c8a9fb9e4fec10fe..1146a20401b2e3f769e2e4f0b1233b2ea08f8cf4 100644 GIT binary patch delta 1486 zcmZ|P?MqWp90%~-tL<)g4|hA8b91{_%~qKYsZ)CtBve8y$%3fAAbLS?c zhI?>4D>CSf;ofPNx4)jR?SI=V;Ev}GJ+A%53d%6w%`u;F_=mnhX+yKt%mhO?L<~r~ z!!QdAhUCr9I%TYoy!z0t6Wd z%#hQ>mLl9TGjTE7Qn9kA65#`i(9P~Z_?aSH zV0R+*>#%du$nQeQ_?a}5-AE1p6g!0i618Yd+Tt-@H18X|+I+2MVk#bLICiCK#6B9k q_4!HM*mm?=qtss4g>#Rj`P8vWTQILU5A3f|Iq$WdJbN>aAeZK4f delta 69 zcmV~$w+({;001!2LmC9qDd%t#OC$!*`GcJk5O-nE>u>vylRzjEOQbRfxucV_i>pHE Trc%3mczSvJ_-eGer5~~#KfD$F diff --git a/.vs/ProjectEvaluation/seyounth.auto.hs.strings.v9.bin b/.vs/ProjectEvaluation/seyounth.auto.hs.strings.v9.bin index 273fb19aa51d51a0fb4a51716cd799ea723a9f79..5bb43a43a338e5aeecb73639bbc6dc1ef9cdfb9f 100644 GIT binary patch delta 1396 zcmaKs&x_MQ6vv6Xig>Yl5OD>)c<|DlH$Tz@1Yz5NJuDO=i-&-ObXKcrrc9>W_B8Ba z{{Ru$yZ?j#lIYR@z-iNvZOL26Vdj0_ukXy8{Qc4S{}-)hIQepJ}Dc zabHcRsyIG9>$~Nq?4hgs`#OE=efXBVy8dSlzSyJ1VzKs4D4_y?aG-)v(p~1|vW)@9 z7$XbI2Fcg}R>ISI-y&fh6U(G|EYUs^=u6 zNHZ2V00pcd&|8>5)pH2YYvPoVrk>rsd(H@{k7oa5I0J@V1?N7lo`(dR3vPJ`Jxsj- z!4W2i5RHmm5rPCa6z(w~J9A-gPQCy_u}&Qm*j%`G!_hd3&y!E6A=k-D3ej|WC21GOmPN&eNX zo$2A)G#r=1Vm3GRKAunOeP_+j(tIw&l##TlkVrpe%-pa`Gf(rm$O$MR> diff --git a/.vs/Seyounth.Auto.Hs/DesignTimeBuild/.dtbcache.v2 b/.vs/Seyounth.Auto.Hs/DesignTimeBuild/.dtbcache.v2 index dab09072aad78ebcfe4e2e61d8bd1478d9a65ce1..07c49379f821d9fe61f170eeb6fe8ecb79e17d74 100644 GIT binary patch delta 17142 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 diff --git a/.vs/Seyounth.Auto.Hs/v17/.futdcache.v2 b/.vs/Seyounth.Auto.Hs/v17/.futdcache.v2 index 3e324e47fc2500d95732186091c3eb7e16d83ee3..52a80c6911796ca7322453b9d9e544af1010ab61 100644 GIT binary patch delta 306 zcmZpUY>wRUQ=DzhO@?VRWheg^pT)L^lMTe2FENeNbQKGbd5C zp9D+a<0t`&m`pYh%n%d)GjsXNQ%{o}fucS4*um=i7@^Wqlk1seLh#2J|hF)SBs`8hSa$q(4X zCJV^j;r#s`Vpbj8mV9CE$$s*_qAsFoW{v7L8M#2mT+|c>+gJlsWjy(USgFwcw+?=J vK$*w~9!o*qYC$-20Y}zkE*|;G7c`21)+llAt>8q_96dQfO=5G4(tl0>*e7+! delta 306 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 PgKvvi+lS8MF~t9W93tl% delta 32318 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 Main(string[] args) { + ExcelPackage.License.SetNonCommercialPersonal("dddd"); string logPath = AppDomain.CurrentDomain.BaseDirectory + "logs/log-.txt"; Log.Logger = new LoggerConfiguration() #if DEBUG diff --git a/apps/Syc.Basic.Web.WMS.HttpApi.Host/Syc.Basic.Web.WMS.HttpApi.Host.csproj b/apps/Syc.Basic.Web.WMS.HttpApi.Host/Syc.Basic.Web.WMS.HttpApi.Host.csproj index c4ef545..27fccfc 100644 --- a/apps/Syc.Basic.Web.WMS.HttpApi.Host/Syc.Basic.Web.WMS.HttpApi.Host.csproj +++ b/apps/Syc.Basic.Web.WMS.HttpApi.Host/Syc.Basic.Web.WMS.HttpApi.Host.csproj @@ -37,6 +37,7 @@ + diff --git a/apps/Syc.Basic.Web.WMS.HttpApi.Host/Syc.Basic.Web.WMS.HttpApi.Host.csproj.user b/apps/Syc.Basic.Web.WMS.HttpApi.Host/Syc.Basic.Web.WMS.HttpApi.Host.csproj.user index a2cd7b4..b602a32 100644 --- a/apps/Syc.Basic.Web.WMS.HttpApi.Host/Syc.Basic.Web.WMS.HttpApi.Host.csproj.user +++ b/apps/Syc.Basic.Web.WMS.HttpApi.Host/Syc.Basic.Web.WMS.HttpApi.Host.csproj.user @@ -6,5 +6,7 @@ Syc.Basic.Web.WMS.HttpApi.Host D:\D盘\项目\榆林\YuLInHSCode\Seyounth.Auto.Hs\apps\Syc.Basic.Web.WMS.HttpApi.Host\Properties\PublishProfiles\FolderProfile.pubxml + MvcControllerEmptyScaffolder + root/Common/MVC/Controller \ No newline at end of file diff --git a/services/Syc.Basic.Web.WMS.Application.Contracts/Dtos/Box/BoxDto.cs b/services/Syc.Basic.Web.WMS.Application.Contracts/Dtos/Box/BoxDto.cs index 443fe9e..644047b 100644 --- a/services/Syc.Basic.Web.WMS.Application.Contracts/Dtos/Box/BoxDto.cs +++ b/services/Syc.Basic.Web.WMS.Application.Contracts/Dtos/Box/BoxDto.cs @@ -15,6 +15,7 @@ namespace Syc.Basic.Web.WMS.Dto public string Spec { get; set; } //名称 public string Type { get; set; } + public string Color { get; set; } //数量 public int? Qty { get; set; } //净重 diff --git a/services/Syc.Basic.Web.WMS.Application/BarTenderHelper/ExcelExporter.cs b/services/Syc.Basic.Web.WMS.Application/BarTenderHelper/ExcelExporter.cs new file mode 100644 index 0000000..0643cf5 --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Application/BarTenderHelper/ExcelExporter.cs @@ -0,0 +1,92 @@ +using OfficeOpenXml; +using OfficeOpenXml.Style; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Reflection; + +namespace Syc.Basic.Web.WMS +{ + public static class ExcelExporter + { + /// + /// EPPlus 8.0+ 导出 List 数据为 Excel 内存流(带样式美化) + /// + /// 数据模型类型 + /// 要导出的数据集合 + /// Excel 工作表名称 + /// 自定义表头(key:模型属性名,value:Excel 表头文本) + /// Excel 内存流(需手动释放) + public static string ExportToExcelStream( + List dataList, + string sheetName = "数据报表", + string filePath = null, + Dictionary headerMap = null) + { + // 1. 配置 EPPlus 许可证(非商业用途,商业需购买许可证) + //ExcelPackage.License = License.NonCommercial; + + // 2. 初始化 Excel 包和工作表 + using var package = new ExcelPackage(); + var worksheet = package.Workbook.Worksheets.Add(sheetName); + + // 3. 处理表头(支持自定义列名,无自定义则用模型属性名) + PropertyInfo[] properties = typeof(T).GetProperties(); + int colIndex = 1; + + // 写入表头 + foreach (var prop in properties) + { + string headerText = headerMap?.ContainsKey(prop.Name) ?? false + ? headerMap[prop.Name] + : prop.Name; // 优先用自定义表头,否则用属性名 + worksheet.Cells[1, colIndex].Value = headerText; + colIndex++; + } + + // 4. 写入数据(逐行逐列绑定) + int rowIndex = 2; // 第1行是表头,从第2行开始写数据 + foreach (var data in dataList) + { + colIndex = 1; + foreach (var prop in properties) + { + var value = prop.GetValue(data); + // 特殊类型处理(避免日期/布尔值格式异常) + switch (value) + { + case DateTime date: + worksheet.Cells[rowIndex, colIndex].Value = date.ToString("yyyy-MM-dd HH:mm:ss"); + break; + case bool b: + worksheet.Cells[rowIndex, colIndex].Value = b ? "是" : "否"; + break; + case decimal d: + worksheet.Cells[rowIndex, colIndex].Value = d; + worksheet.Cells[rowIndex, colIndex].Style.Numberformat.Format = "0.00"; // 金额保留2位小数 + break; + default: + worksheet.Cells[rowIndex, colIndex].Value = value ?? string.Empty; + break; + } + colIndex++; + } + rowIndex++; + } + + // 5. 样式美化(表头加粗+背景色、自动列宽) + var headerRange = worksheet.Cells[1, 1, 1, properties.Length]; + headerRange.Style.Font.Bold = true; // 表头加粗 + headerRange.Style.Fill.PatternType = ExcelFillStyle.Solid; + headerRange.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightSkyBlue); // 表头背景色 + worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); // 自动调整所有列宽 + + // 6. 保存到内存流并返回 + //var stream = new MemoryStream(); + package.SaveAs(filePath); + // stream.Position = 0; // 重置流指针(关键:否则下载的文件为空) + return filePath; + } + } +} diff --git a/services/Syc.Basic.Web.WMS.Application/DeviceEventHandle/DefaultBalanceEventHandle.cs b/services/Syc.Basic.Web.WMS.Application/DeviceEventHandle/DefaultBalanceEventHandle.cs index e824cfa..cb4df7d 100644 --- a/services/Syc.Basic.Web.WMS.Application/DeviceEventHandle/DefaultBalanceEventHandle.cs +++ b/services/Syc.Basic.Web.WMS.Application/DeviceEventHandle/DefaultBalanceEventHandle.cs @@ -28,8 +28,9 @@ namespace Syc.Basic.Web.WMS.DeviceEventHandle private readonly IUnitOfWorkManager unitOfWork; private readonly ILogger logger; private readonly IRepository autoRepository; + private readonly IRepository valueRepository; private readonly static object _lock = new object(); - public DefaultBalanceEventHandle(IRepository silkRepository, IPlcService plcService, IRepository produceRepository, IRepository boxRepository, IPrinterService printerService, IUnitOfWorkManager unitOfWork, ILogger logger, IRepository autoRepository) + public DefaultBalanceEventHandle(IRepository silkRepository, IPlcService plcService, IRepository produceRepository, IRepository boxRepository, IPrinterService printerService, IUnitOfWorkManager unitOfWork, ILogger logger, IRepository autoRepository, IRepository valueRepository) { this.silkRepository = silkRepository; this.plcService = plcService; @@ -39,6 +40,7 @@ namespace Syc.Basic.Web.WMS.DeviceEventHandle this.unitOfWork = unitOfWork; this.logger = logger; this.autoRepository = autoRepository; + this.valueRepository = valueRepository; } public async Task ExecAsync(decimal weight, int id) @@ -126,6 +128,8 @@ namespace Syc.Basic.Web.WMS.DeviceEventHandle return; var produce = await produceRepository.FirstOrDefaultAsync(x => x.IfUse == 1 && x.IsDelete == 0); + var values = await valueRepository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1); + var keys = values.Key1.Split(','); if (produce == null) throw Oops.Oh("没有生产设置"); @@ -157,6 +161,7 @@ namespace Syc.Basic.Web.WMS.DeviceEventHandle Code = timestr + autolabel.Sort.ToString().PadLeft(4, '0'), Createtime = DateTime.Now, IsDelete = 0, + Color = keys[int.Parse(values.Value)], Date = DateTime.Now, Name = produce.Type, Length = produce.Length, @@ -196,6 +201,10 @@ namespace Syc.Basic.Web.WMS.DeviceEventHandle var query = await silkRepository.GetQueryableAsync(); query = query.Where(x => x.Status == 1 && x.IsDelete == 0 && x.Type == produce.Spec && x.Name == produce.Type && x.Length == produce.Length && x.Lot_No == produce.Lot_No); + + var values = await valueRepository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1); + var keys = values.Key1.Split(','); + var count = query.Count(); if (produce is null) @@ -239,6 +248,7 @@ namespace Syc.Basic.Web.WMS.DeviceEventHandle Length = produce.Length, Lot_No = produce.Lot_No, //Code = Guid.NewGuid().ToString().Substring(9, 18), + Color = keys[int.Parse(values.Value)], Code = timestr + autolabel.Sort.ToString().PadLeft(4, '0'), Net_Weight = netWeight, Spec = produce.Spec, diff --git a/services/Syc.Basic.Web.WMS.Application/Dto/BoxInput.cs b/services/Syc.Basic.Web.WMS.Application/Dto/BoxInput.cs index 80722eb..ef91a38 100644 --- a/services/Syc.Basic.Web.WMS.Application/Dto/BoxInput.cs +++ b/services/Syc.Basic.Web.WMS.Application/Dto/BoxInput.cs @@ -9,6 +9,12 @@ namespace Syc.Basic.Web.WMS.Dto public class BoxInput: PagedInput { public string Lot_No { get; set; } + public string Type { get; set; } public string Spec { get; set; } + public string Chang { get; set; } + public int Qty { get; set; } + public string Start_Time { get; set; } + public string End_Time { get; set; } + public string Color { get; set; } } } diff --git a/services/Syc.Basic.Web.WMS.Application/Dto/DownSilkDto.cs b/services/Syc.Basic.Web.WMS.Application/Dto/DownSilkDto.cs new file mode 100644 index 0000000..b23372e --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Application/Dto/DownSilkDto.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Syc.Basic.Web.WMS.Dto +{ + public class DownSilkDto + { + public int Id { get; set; } + //条码 + public string Code { get; set; } + //名称 + public string Name { get; set; } + //颜色 + public string Color { get; set; } + //配方 + public string Type { get; set; } + //净重 + public double? Net_Weight { get; set; } + //长度 + public string? Length { get; set; } + //包装时间 + public DateTime? Date { get; set; } + //生产批号 + public string Lot_No { get; set; } + public string Status_Details { get; set; } + + public int? BoxId { get; set; } + public DateTime? Createtime { get; set; } + } + + public class DownBoxDto + { + public int Id { get; set; } + //条码 + public string Code { get; set; } + //规格 + public string Spec { get; set; } + //名称 + public string Type { get; set; } + public string Color { get; set; } + //数量 + public int? Qty { get; set; } + //净重 + public double? Net_Weight { get; set; } + //毛重 + public double? Gross_Weight { get; set; } + //生产批号 + public string Lot_No { get; set; } + //长度 + public string? Length { get; set; } + //打包时间 + public DateTime? Dom_Time { get; set; } + //生产日期 + public DateTime? Exp_Time { get; set; } + public string Mark { get; set; } + public DateTime? Create_Time { get; set; } + } + +} diff --git a/services/Syc.Basic.Web.WMS.Application/Dto/IdsInput.cs b/services/Syc.Basic.Web.WMS.Application/Dto/IdsInput.cs new file mode 100644 index 0000000..0ebe813 --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Application/Dto/IdsInput.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Syc.Basic.Web.WMS.Dto +{ + public class IdsInput + { + public int[] Ids { get; set; } + } +} diff --git a/services/Syc.Basic.Web.WMS.Application/Dto/SilkDto.cs b/services/Syc.Basic.Web.WMS.Application/Dto/SilkDto.cs index 7da90e4..cdc1382 100644 --- a/services/Syc.Basic.Web.WMS.Application/Dto/SilkDto.cs +++ b/services/Syc.Basic.Web.WMS.Application/Dto/SilkDto.cs @@ -13,6 +13,8 @@ namespace Syc.Basic.Web.WMS.Dto public string Code { get; set; } //名称 public string Name { get; set; } + //颜色 + public string Color { get; set; } //配方 public string Type { get; set; } //净重 diff --git a/services/Syc.Basic.Web.WMS.Application/Dto/SilkInput.cs b/services/Syc.Basic.Web.WMS.Application/Dto/SilkInput.cs index 80dfa7d..9992f48 100644 --- a/services/Syc.Basic.Web.WMS.Application/Dto/SilkInput.cs +++ b/services/Syc.Basic.Web.WMS.Application/Dto/SilkInput.cs @@ -6,9 +6,16 @@ using System.Threading.Tasks; namespace Syc.Basic.Web.WMS.Dto { - public class SilkInput: PagedInput + public class SilkInput : PagedInput { public string Lot_No { get; set; } + public string Name { get; set; } public string Spec { get; set; } + public string Chang { get; set; } + + public int Qty { get; set; } + public string Start_Time { get; set; } + public string End_Time { get; set; } + public string Color { get; set; } } } diff --git a/services/Syc.Basic.Web.WMS.Application/Dto/SumInput.cs b/services/Syc.Basic.Web.WMS.Application/Dto/SumInput.cs new file mode 100644 index 0000000..09875de --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Application/Dto/SumInput.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Syc.Basic.Web.WMS.Dto +{ + public class SumInput + { + //public int[] Ids { get; set; } + public string Value { get; set; } + public string Spec { get; set; } + public string Lot_No { get; set; } + public string Name { get; set; } + public string Start_Time { get; set; } + public string End_Time { get; set; } + public string Chang { get; set; } + public int Qty { get; set; } + public int Type { get; set; } + } +} diff --git a/services/Syc.Basic.Web.WMS.Application/Dto/ValuesDto.cs b/services/Syc.Basic.Web.WMS.Application/Dto/ValuesDto.cs new file mode 100644 index 0000000..87fdbfc --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Application/Dto/ValuesDto.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Syc.Basic.Web.WMS.Dto +{ + public class ValuesDto + { + public int Id { get; set; } + public string[] Keys { get; set; } + public int Value { get; set; } + } +} diff --git a/services/Syc.Basic.Web.WMS.Application/Dto/ValuesInput.cs b/services/Syc.Basic.Web.WMS.Application/Dto/ValuesInput.cs new file mode 100644 index 0000000..93121d4 --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Application/Dto/ValuesInput.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Syc.Basic.Web.WMS.Dto +{ + public class ValuesInput + { + public int Id { get; set; } + public int Value { get; set; } + } +} diff --git a/services/Syc.Basic.Web.WMS.Application/Service/BoxService.cs b/services/Syc.Basic.Web.WMS.Application/Service/BoxService.cs index 19ee183..d2b96e4 100644 --- a/services/Syc.Basic.Web.WMS.Application/Service/BoxService.cs +++ b/services/Syc.Basic.Web.WMS.Application/Service/BoxService.cs @@ -30,8 +30,9 @@ namespace Syc.Basic.Web.WMS.Service private readonly ILogger logger; private readonly IPrinterService printerService; private readonly IRepository autoRepository; + private readonly IRepository valueRepository; - public BoxService(IRepository boxRepository, IRepository produceRepository, IRepository silkRepository, IPlcService plcService, ILogger logger, IPrinterService printerService, IRepository autoRepository) + public BoxService(IRepository boxRepository, IRepository produceRepository, IRepository silkRepository, IPlcService plcService, ILogger logger, IPrinterService printerService, IRepository autoRepository,IRepository valueRepository) { this.boxRepository = boxRepository; this.produceRepository = produceRepository; @@ -40,6 +41,7 @@ namespace Syc.Basic.Web.WMS.Service this.logger = logger; this.printerService = printerService; this.autoRepository = autoRepository; + this.valueRepository = valueRepository; } /// /// 查询纸箱 @@ -55,6 +57,21 @@ namespace Syc.Basic.Web.WMS.Service boxlist = boxlist.Where(x => x.Lot_No.Contains(input.Lot_No)); if (input.Spec != null) boxlist = boxlist.Where(x => x.Spec.Contains(input.Spec)); + if (input.Type != null) + boxlist = boxlist.Where(x => x.Type.Contains(input.Type)); + if (input.Color != null) + { + if (input.Color == "无") + boxlist = boxlist.Where(x => x.Color == input.Color||x.Color==null); + else + boxlist = boxlist.Where(x => x.Color == input.Color); + } + if (input.Chang != null) + boxlist = boxlist.Where(x => x.Length.Contains(input.Chang)); + if (input.Qty >0) + boxlist = boxlist.Where(x => x.Qty == input.Qty); + if (input.Start_Time != null && input.End_Time != null) + boxlist = boxlist.Where(x => x.Dom_Time >= DateTime.Parse(input.Start_Time) && x.Dom_Time <= DateTime.Parse(input.End_Time)); var result = boxlist.OrderByDescending(x => x.Id).PageResult(input.Page, input.PageSize); var data = result.Queryable.Select(e => new BoxDto() @@ -67,6 +84,7 @@ namespace Syc.Basic.Web.WMS.Service Dom_Time = DateTime.Parse(e.Dom_Time.ToString()).ToString("yyyy-MM-dd HH:mm:ss"), DataType = e.DataType, Mark = e.Mark, + Color = e.Color, Create_Time = e.Create_Time, Exp_Time = DateTime.Parse(e.Exp_Time.ToString()).ToString("yyyy-MM-dd HH:mm:ss"), Lot_No = e.Lot_No, @@ -116,6 +134,9 @@ namespace Syc.Basic.Web.WMS.Service [HttpPost] public async Task InsertBox(BoxDto input) { + var values = await valueRepository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1); + var keys = values.Key1.Split(','); + var produce = await produceRepository.FirstOrDefaultAsync(x => x.IfUse == 1); var silksQuery = await silkRepository.GetQueryableAsync(); var silks = silksQuery.Where(x => x.IsDelete == 0 && x.Status == (int)SilkStatus.手动添加称重).OrderBy(x => x.Id).Take((int)produce.Qty).ToList(); @@ -162,6 +183,7 @@ namespace Syc.Basic.Web.WMS.Service Code = timestr + autolabel.Sort.ToString().PadLeft(4, '0'), Net_Weight = netWeight, Spec = produce.Spec, + Color = keys[int.Parse(values.Value)], Create_Time = DateTime.Now, Type = produce.Type, IsUse = true, @@ -224,6 +246,7 @@ namespace Syc.Basic.Web.WMS.Service Code = timestr + autolabel.Sort.ToString().PadLeft(4, '0'), Net_Weight = input.Net_Weight, Spec = input.Spec, + Color = input.Color, Create_Time = DateTime.Now, Type = input.Type, IsUse = true, @@ -270,6 +293,7 @@ namespace Syc.Basic.Web.WMS.Service box.Length = input.Length; //box.Code = input.Code; box.Lot_No = input.Lot_No; + box.Color = input.Color; box.Net_Weight = input.Net_Weight; box.Dom_Time = DateTime.Now; box.Type = input.Type; @@ -510,5 +534,65 @@ namespace Syc.Basic.Web.WMS.Service //throw Oops.Oh("丝锭码垛标签打印成功"); #endregion } + + /// + /// 求总 + /// + /// + /// + [HttpPost] + public async Task Sum(SumInput input) + { + var boxlist = await boxRepository.GetQueryableAsync(); + boxlist = boxlist.Where(x => x.IsDelete == 0); + + if (input.Spec != null) + boxlist = boxlist.Where(x => x.Spec.Contains(input.Spec)); + if (input.Name != null) + boxlist = boxlist.Where(x => x.Type.Contains(input.Name)); + + if (input.Lot_No != null) + boxlist = boxlist.Where(x => x.Lot_No.Contains(input.Lot_No)); + if (input.Value != null) + { + if(input.Value=="无") + boxlist = boxlist.Where(x => x.Color == input.Value||x.Color==null); + else + boxlist = boxlist.Where(x => x.Color == input.Value); + } + + if (input.Chang != null) + boxlist = boxlist.Where(x => x.Length.Contains(input.Chang)); + if (input.Qty > 0) + boxlist = boxlist.Where(x => x.Qty == input.Qty); + if (input.Start_Time != null && input.End_Time != null) + boxlist = boxlist.Where(x => x.Dom_Time >= DateTime.Parse(input.Start_Time) && x.Dom_Time <= DateTime.Parse(input.End_Time)); + + //1:求颜色总数 + if (input.Type == 1) + { + + if (boxlist.Count() == 0) + throw Oops.Oh("求和失败,数据为空"); + + int sum = boxlist.Count(); + return sum; + } + //2:求重量总和 + else + { + if (boxlist.Count() == 0) + throw Oops.Oh("求和失败,数据为空"); + + double sum = 0; + foreach (var box in boxlist) + { + + sum += (double)box.Net_Weight; + } + return Math.Round(sum, 2); + } + + } } } diff --git a/services/Syc.Basic.Web.WMS.Application/Service/DownService.cs b/services/Syc.Basic.Web.WMS.Application/Service/DownService.cs new file mode 100644 index 0000000..6690442 --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Application/Service/DownService.cs @@ -0,0 +1,138 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using Syc.Basic.Web.WMS.Dto; +using Syc.Basic.Web.WMS.Entitys; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Syc.Basic.Web.WMS.Service +{ + [AllowAnonymous] + public class DownService:ApiService + { + private readonly IRepository silkRepository; + private readonly IRepository boxRepository; + + public DownService(IRepository silkRepository, IRepository boxRepository) + { + this.silkRepository = silkRepository; + this.boxRepository = boxRepository; + } + + [HttpPost("api/DownSilk")] + public async Task DownLoadSilk(IdsInput input) + { + var silks = await silkRepository.GetListAsync(x => input.Ids.Contains(x.Id)); + var silklist = silks.Select(x => new DownSilkDto + { + Id = x.Id, + Code = x.Code, + Lot_No = x.Lot_No, + Name = x.Name, + Type = x.Type, + Length = x.Length, + Net_Weight = x.Net_Weight, + Color = x.Color, + Date = x.Date, + BoxId = x.BoxId, + Createtime = x.Createtime, + Status_Details = x.Status_Details + }).ToList(); + + if (silks.Count == 0) + throw Oops.Oh("没有导出的数据"); + + // 2. 自定义 Excel 表头(可选:替换模型属性名) + var customHeaders = new Dictionary + { + { nameof(Silk.Id), "Id" }, + { nameof(Silk.Code), "编号" }, + { nameof(Silk.Lot_No), "批次号" }, + { nameof(Silk.Name), "名称" }, + { nameof(Silk.Type), "规格" }, + { nameof(Silk.Length), "长度" }, + { nameof(Silk.Net_Weight), "重量(kg)" }, + { nameof(Silk.Color), "标注" }, + { nameof(Silk.BoxId), "成箱编号" }, + { nameof(Silk.Date), "生产时间" }, + { nameof(Silk.Status_Details), "状态说明" }, + { nameof(Silk.Createtime), "创建时间" } + }; + + var webHost = base.HttpContext.RequestServices.GetService(typeof(IWebHostEnvironment)) as IWebHostEnvironment; + // 3. 生成 Excel 内存流 + var fileName1 = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"; + var fiePath = Path.Combine(webHost.WebRootPath, fileName1); + ExcelExporter.ExportToExcelStream(silklist, "丝锭数据报表", fiePath, customHeaders); + + // 4. 配置下载响应(解决中文文件名乱码) + string fileName = $"丝锭数据报表_{DateTime.Now:yyyyMMddHHmmss}.xlsx"; + string encodedFileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); + + // 5. 返回文件流(浏览器自动下载)xx + return $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host.Host}:{HttpContext.Request.Host.Port}/{fileName1}"; + } + + [HttpPost("api/DownBox")] + public async Task DownLoadBox(IdsInput input) + { + var box = await boxRepository.GetListAsync(x => input.Ids.Contains(x.Id)); + var boxlist = box.Select(x => new DownBoxDto + { + Code = x.Code, + Lot_No = x.Lot_No, + Type = x.Type, + Spec = x.Spec, + Length = x.Length, + Net_Weight = x.Net_Weight, + Gross_Weight = x.Gross_Weight, + Qty = x.Qty, + Color = x.Color, + Dom_Time = x.Dom_Time, + Exp_Time = x.Exp_Time, + Mark = x.Mark, + Create_Time = x.Create_Time + }).ToList(); + + if (box.Count == 0) + throw Oops.Oh("没有导出的数据"); + + // 2. 自定义 Excel 表头(可选:替换模型属性名) + var customHeaders = new Dictionary + { + { nameof(Box.Code), "编号" }, + { nameof(Box.Lot_No), "批次号" }, + { nameof(Box.Type), "名称" }, + { nameof(Box.Spec), "规格" }, + { nameof(Box.Length), "长度" }, + { nameof(Box.Net_Weight), "重量(kg)" }, + { nameof(Box.Gross_Weight), "毛重(kg)" }, + { nameof(Box.Qty), "每箱/个" }, + { nameof(Box.Color), "标注" }, + { nameof(Box.Dom_Time), "生产时间" }, + { nameof(Box.Exp_Time), "有效期" }, + { nameof(Box.Mark), "状态说明" }, + { nameof(Box.Create_Time), "创建时间" } + }; + + var webHost = base.HttpContext.RequestServices.GetService(typeof(IWebHostEnvironment)) as IWebHostEnvironment; + // 3. 生成 Excel 内存流 + var fileName1 = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"; + var fiePath = Path.Combine(webHost.WebRootPath, fileName1); + ExcelExporter.ExportToExcelStream(boxlist, "丝锭数据报表", fiePath, customHeaders); + + // 4. 配置下载响应(解决中文文件名乱码) + string fileName = $"成箱数据报表_{DateTime.Now:yyyyMMddHHmmss}.xlsx"; + string encodedFileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); + + // 5. 返回文件流(浏览器自动下载)xx + return $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host.Host}:{HttpContext.Request.Host.Port}/{fileName1}"; + } + } +} diff --git a/services/Syc.Basic.Web.WMS.Application/Service/SilkService.cs b/services/Syc.Basic.Web.WMS.Application/Service/SilkService.cs index 8e977ab..30b43fe 100644 --- a/services/Syc.Basic.Web.WMS.Application/Service/SilkService.cs +++ b/services/Syc.Basic.Web.WMS.Application/Service/SilkService.cs @@ -1,12 +1,16 @@ using JetBrains.Annotations; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ActionConstraints; +using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; using Seyounth.Auto.Hs.Runtime.Printer; +using Syc.Basic.Web.WMS; using Syc.Basic.Web.WMS.Dto; using Syc.Basic.Web.WMS.Entitys; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Linq.Dynamic.Core; using System.Text; @@ -23,14 +27,16 @@ namespace Syc.Basic.Web.WMS.Service private readonly IRepository silkRepository; private readonly ILogger logger; private readonly IRepository autoRepository; + private readonly IRepository valueRepository; - public SilkService(IPrinterService printerService, IRepository produceRepository, IRepository silkRepository, ILogger logger, IRepository autoRepository) + public SilkService(IPrinterService printerService, IRepository produceRepository, IRepository silkRepository, ILogger logger, IRepository autoRepository, IRepository valueRepository) { this.printerService = printerService; this.produceRepository = produceRepository; this.silkRepository = silkRepository; this.logger = logger; this.autoRepository = autoRepository; + this.valueRepository = valueRepository; } /// /// 根据数量查询丝锭 @@ -67,10 +73,26 @@ namespace Syc.Basic.Web.WMS.Service { var silklist = await silkRepository.GetQueryableAsync(); silklist = silklist.Where(x => x.IsDelete == 0); + if (input.Name != null) + silklist = silklist.Where(x => x.Name.Contains(input.Name)); if (input.Spec != null) silklist = silklist.Where(x => x.Type.Contains(input.Spec)); if (input.Lot_No != null) - silklist = silklist.Where(x => x.Type.Contains(input.Lot_No)); + silklist = silklist.Where(x => x.Lot_No.Contains(input.Lot_No)); + if (input.Chang != null) + silklist = silklist.Where(x => x.Length.Contains(input.Chang)); + if (input.Start_Time != null && input.End_Time != null) + silklist = silklist.Where(x => x.Date >= DateTime.Parse(input.Start_Time) && x.Date <= DateTime.Parse(input.End_Time)); + if (input.Qty > 0) + silklist = silklist.OrderByDescending(x => x.Id).Take(input.Qty); + if (input.Color != null) + { + if (input.Color == "无") + silklist = silklist.Where(x => x.Color == input.Color || x.Color == null); + else + silklist = silklist.Where(x => x.Color == input.Color); + } + var result = silklist.OrderByDescending(x => x.Id).PageResult(input.Page, input.PageSize); var data = result.Queryable.Select(x => new SilkDto() @@ -81,6 +103,7 @@ namespace Syc.Basic.Web.WMS.Service Code = x.Code, Date = x.Date, Id = x.Id, + Color = x.Color, Length = x.Length, Type = x.Type, BoxId = x.BoxId, @@ -104,7 +127,8 @@ namespace Syc.Basic.Web.WMS.Service public async Task InsertSilk(SilkDto input) { var produce = await produceRepository.FirstOrDefaultAsync(x => x.IfUse == 1); - + var values = await valueRepository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1); + var keys = values.Key1.Split(','); if (produce == null) throw Oops.Oh("没有生产设置"); @@ -136,6 +160,7 @@ namespace Syc.Basic.Web.WMS.Service Net_Weight = input.Net_Weight, Name = produce.Type, Type = produce.Spec, + Color = keys[int.Parse(values.Value)], Createtime = DateTime.Now, Status = (int)SilkStatus.手动添加称重, Status_Details = "手动添加称重", @@ -176,6 +201,7 @@ namespace Syc.Basic.Web.WMS.Service silks.Type = input.Type; silks.Length = input.Length; //silks.Code = input.Code; + silks.Color = input.Color; silks.Lot_No = input.Lot_No; silks.Net_Weight = input.Net_Weight; silks.Date = DateTime.Now; @@ -213,5 +239,65 @@ namespace Syc.Basic.Web.WMS.Service } await silkRepository.UpdateManyAsync(silks); } + + /// + /// 求总 + /// + /// + /// + [HttpPost] + public async Task Sum(SumInput input) + { + var silklist = await silkRepository.GetQueryableAsync(); + silklist = silklist.Where(x => x.IsDelete == 0); + + if (input.Spec != null) + silklist = silklist.Where(x => x.Type.Contains(input.Spec)); + if (input.Name != null) + silklist = silklist.Where(x => x.Name.Contains(input.Name)); + + if (input.Lot_No != null) + silklist = silklist.Where(x => x.Lot_No.Contains(input.Lot_No)); + if (input.Chang != null) + silklist = silklist.Where(x => x.Length.Contains(input.Chang)); + if (input.Start_Time != null && input.End_Time != null) + silklist = silklist.Where(x => x.Date >= DateTime.Parse(input.Start_Time) && x.Date <= DateTime.Parse(input.End_Time)); + if (input.Qty > 0) + silklist = silklist.OrderByDescending(x => x.Id).Take(input.Qty); + if (input.Value != null) + { + if (input.Value == "无") + silklist = silklist.Where(x => x.Color == input.Value || x.Color == null); + else + silklist = silklist.Where(x => x.Color == input.Value); + } + + + //1:求颜色总数 + if (input.Type == 1) + { + if (silklist.Count() == 0) + throw Oops.Oh("求和失败,数据为空"); + + int sum = silklist.Count(); + return sum; + } + //2:求重量总和 + else + { + if (silklist.Count() == 0) + throw Oops.Oh("求和失败,数据为空"); + + double sum = 0; + foreach (var silk in silklist) + { + + sum += (double)silk.Net_Weight; + } + return Math.Round(sum, 2); + } + + } + } } diff --git a/services/Syc.Basic.Web.WMS.Application/Service/ValuesService.cs b/services/Syc.Basic.Web.WMS.Application/Service/ValuesService.cs new file mode 100644 index 0000000..8f275ec --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Application/Service/ValuesService.cs @@ -0,0 +1,49 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Syc.Basic.Web.WMS.Dto; +using Syc.Basic.Web.WMS.Entitys; +using Syc.Basic.Web.WMS.IServices; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Syc.Basic.Web.WMS.Service +{ + [AllowAnonymous] + public class ValuesService:ApiService + { + private readonly IRepository repository; + + public ValuesService(IRepository repository) + { + this.repository = repository; + } + + [HttpGet] + public async Task Get() + { + var values = await repository.FirstOrDefaultAsync(x => x.Type == 0 && x.IsDelete == 0 && x.IfUse == 1); + var keys = values.Key1.Split(','); + + var data = new ValuesDto() + { + Id=values.Id, + Keys = keys, + Value = int.Parse(values.Value) + }; + return data; + } + + [HttpPost] + public async Task Post(ValuesInput input) + { + var values = await repository.FirstOrDefaultAsync(x => x.Id==1); + values.Value = input.Value.ToString(); + + await repository.UpdateAsync(values); + } + } +} diff --git a/services/Syc.Basic.Web.WMS.Application/Syc.Basic.Web.WMS.Application.csproj b/services/Syc.Basic.Web.WMS.Application/Syc.Basic.Web.WMS.Application.csproj index 80a4a07..d384ed6 100644 --- a/services/Syc.Basic.Web.WMS.Application/Syc.Basic.Web.WMS.Application.csproj +++ b/services/Syc.Basic.Web.WMS.Application/Syc.Basic.Web.WMS.Application.csproj @@ -23,6 +23,7 @@ + diff --git a/services/Syc.Basic.Web.WMS.Application/Syc.Basic.Web.WMS.Application.xml b/services/Syc.Basic.Web.WMS.Application/Syc.Basic.Web.WMS.Application.xml index c9755a6..435a4a0 100644 --- a/services/Syc.Basic.Web.WMS.Application/Syc.Basic.Web.WMS.Application.xml +++ b/services/Syc.Basic.Web.WMS.Application/Syc.Basic.Web.WMS.Application.xml @@ -25,6 +25,16 @@ + + + EPPlus 8.0+ 导出 List 数据为 Excel 内存流(带样式美化) + + 数据模型类型 + 要导出的数据集合 + Excel 工作表名称 + 自定义表头(key:模型属性名,value:Excel 表头文本) + Excel 内存流(需手动释放) + 丝锭称重 @@ -192,6 +202,13 @@ + + + 求总 + + + + 查询生产 @@ -290,6 +307,13 @@ + + + 求总 + + + + 修改密码 diff --git a/services/Syc.Basic.Web.WMS.Domain/Entitys/Box.cs b/services/Syc.Basic.Web.WMS.Domain/Entitys/Box.cs index 0a356fc..7981b25 100644 --- a/services/Syc.Basic.Web.WMS.Domain/Entitys/Box.cs +++ b/services/Syc.Basic.Web.WMS.Domain/Entitys/Box.cs @@ -15,6 +15,7 @@ namespace Syc.Basic.Web.WMS.Entitys public string Spec { get; set; } //名称 public string Type { get; set; } + public string Color { get; set; } //数量 public int? Qty { get; set; } //净重 diff --git a/services/Syc.Basic.Web.WMS.Domain/Entitys/Silk.cs b/services/Syc.Basic.Web.WMS.Domain/Entitys/Silk.cs index ebe620e..39eff17 100644 --- a/services/Syc.Basic.Web.WMS.Domain/Entitys/Silk.cs +++ b/services/Syc.Basic.Web.WMS.Domain/Entitys/Silk.cs @@ -16,6 +16,8 @@ namespace Syc.Basic.Web.WMS.Entitys public string Name { get; set; } //配方 public string Type { get; set; } + //颜色 + public string Color { get; set; } //净重 public double? Net_Weight { get; set; } //长度 diff --git a/services/Syc.Basic.Web.WMS.Domain/Entitys/Values.cs b/services/Syc.Basic.Web.WMS.Domain/Entitys/Values.cs new file mode 100644 index 0000000..065fc13 --- /dev/null +++ b/services/Syc.Basic.Web.WMS.Domain/Entitys/Values.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Entities; + +namespace Syc.Basic.Web.WMS.Entitys +{ + public class Values:Entity + { + public string Key1 { get; set; } + public string Key2 { get; set; } + public string Value { get; set; } + public int Type { get; set; } + public string TypeData { get; set; } + public int IsDelete { get; set; } + public int IfUse { get; set; } + } +} diff --git a/services/Syc.Basic.Web.WMS.EntityFrameworkCore/EntityFrameworkCore/BasicDbContextModelCreatingExtensions.cs b/services/Syc.Basic.Web.WMS.EntityFrameworkCore/EntityFrameworkCore/BasicDbContextModelCreatingExtensions.cs index db1ff07..5283110 100644 --- a/services/Syc.Basic.Web.WMS.EntityFrameworkCore/EntityFrameworkCore/BasicDbContextModelCreatingExtensions.cs +++ b/services/Syc.Basic.Web.WMS.EntityFrameworkCore/EntityFrameworkCore/BasicDbContextModelCreatingExtensions.cs @@ -186,6 +186,12 @@ namespace Syc.Basic.Web.EntityFrameworkCore b.ConfigureByConvention(); }); + modelBuilder.Entity(b => + { + b.ToTable(nameof(Values)); + b.ConfigureByConvention(); + }); + return modelBuilder; } } diff --git a/services/Syc.Basic.Web.WMS.EntityFrameworkCore/EntityFrameworkCore/WMSDbContext.cs b/services/Syc.Basic.Web.WMS.EntityFrameworkCore/EntityFrameworkCore/WMSDbContext.cs index 9e1dec3..a3bf242 100644 --- a/services/Syc.Basic.Web.WMS.EntityFrameworkCore/EntityFrameworkCore/WMSDbContext.cs +++ b/services/Syc.Basic.Web.WMS.EntityFrameworkCore/EntityFrameworkCore/WMSDbContext.cs @@ -84,6 +84,7 @@ public class WMSDbContext : public virtual DbSet Produce { get; set; } //自动生成条码 public virtual DbSet AutoLabel { get; set; } + public virtual DbSet Values { get; set; } protected override void OnModelCreating(ModelBuilder builder)