From 20c7855995e91cb32ae9f75af1db66ea2961ec66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=AD=A3=E6=98=93?= Date: Fri, 15 Aug 2025 14:58:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=BA=93=E5=AD=98=E6=8A=A5=E8=A1=A8):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=87=BA=E5=85=A5=E5=BA=93=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=8A=E5=8F=98=E5=8A=A8=E7=AE=B1=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加成品库出入库报表功能,包括入库报表和出库报表的查询接口 在WmGoodsRecord模型中新增ChangePackage字段记录变动箱数 修复Job_Blank.cs中多余的return null语句 --- .../mes/mm/MmInventoryReportController.cs | 43 ++++++ .../mes/mm/MmOutboundReportController.cs | 43 ++++++ ...y-ab5766eb-3e33-4d3f-9868-b1dbae6dbefb.xml | 16 ++ .../MES/mm/Dto/WmGoodsRecordReportQueryDto.cs | 40 +++++ ZR.Model/MES/mm/WmGoodsRecordReport.cs | 124 +++++++++++++++ ZR.Model/MES/wms/WmGoodsRecord.cs | 6 + .../mm/IService/IMmInventoryReportService.cs | 24 +++ .../mm/IService/IMmOutboundReportService.cs | 24 +++ ZR.Service/mes/mm/MmInventoryReportService.cs | 142 ++++++++++++++++++ ZR.Service/mes/mm/MmOutboundReportService.cs | 141 +++++++++++++++++ .../wms/WMentryWarehousing_productService.cs | 1 + .../mes/wms/WmGoodsOutProductionService.cs | 1 + ZR.Service/mes/wms/WmOutOrderService.cs | 3 +- ZR.Tasks/TaskScheduler/Job_Blank.cs | 3 +- 14 files changed, 608 insertions(+), 3 deletions(-) create mode 100644 ZR.Admin.WebApi/Controllers/mes/mm/MmInventoryReportController.cs create mode 100644 ZR.Admin.WebApi/Controllers/mes/mm/MmOutboundReportController.cs create mode 100644 ZR.Admin.WebApi/DataProtection/key-ab5766eb-3e33-4d3f-9868-b1dbae6dbefb.xml create mode 100644 ZR.Model/MES/mm/Dto/WmGoodsRecordReportQueryDto.cs create mode 100644 ZR.Model/MES/mm/WmGoodsRecordReport.cs create mode 100644 ZR.Service/mes/mm/IService/IMmInventoryReportService.cs create mode 100644 ZR.Service/mes/mm/IService/IMmOutboundReportService.cs create mode 100644 ZR.Service/mes/mm/MmInventoryReportService.cs create mode 100644 ZR.Service/mes/mm/MmOutboundReportService.cs diff --git a/ZR.Admin.WebApi/Controllers/mes/mm/MmInventoryReportController.cs b/ZR.Admin.WebApi/Controllers/mes/mm/MmInventoryReportController.cs new file mode 100644 index 00000000..5eb9b82f --- /dev/null +++ b/ZR.Admin.WebApi/Controllers/mes/mm/MmInventoryReportController.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Mvc; +using ZR.Admin.WebApi.Extensions; +using ZR.Model.MES.mm; +using ZR.Model.MES.mm.Dto; +using ZR.Service.mes.mm.IService; + +namespace ZR.Admin.WebApi.Controllers.mes.mm +{ + /// + /// 生产投料 + /// + [Route("mes/mm/mmInventoryReport")] + + public class MmInventoryReportController : BaseController + { + + readonly IMmInventoryReportService mmInventoryReportService; + + public MmInventoryReportController(IMmInventoryReportService mmInventoryReportService) + { + this.mmInventoryReportService = mmInventoryReportService; + + } + /// + /// 成品库,入库清单 + /// + /// + [HttpPost("GetInventoryReportByPage")] + public IActionResult GetInventoryReportByPage([FromBody] WmGoodsRecordReportQueryDto query) + { + try + { + var response = mmInventoryReportService.GetInventoryReportByPage(query); + return SUCCESS(response); + } + catch (Exception) + { + throw; + } + } + + } +} \ No newline at end of file diff --git a/ZR.Admin.WebApi/Controllers/mes/mm/MmOutboundReportController.cs b/ZR.Admin.WebApi/Controllers/mes/mm/MmOutboundReportController.cs new file mode 100644 index 00000000..cf045fd8 --- /dev/null +++ b/ZR.Admin.WebApi/Controllers/mes/mm/MmOutboundReportController.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Mvc; +using ZR.Admin.WebApi.Extensions; +using ZR.Model.MES.mm; +using ZR.Model.MES.mm.Dto; +using ZR.Service.mes.mm.IService; + +namespace ZR.Admin.WebApi.Controllers.mes.mm +{ + /// + /// 生产投料 + /// + [Route("mes/mm/mmOutboundReport")] + + public class MmOutboundReportController : BaseController + { + + readonly IMmOutboundReportService mmOutboundReportService; + + public MmOutboundReportController(IMmOutboundReportService mmOutboundReportService) + { + this.mmOutboundReportService = mmOutboundReportService; + + } + /// + /// 成品库,入库清单 + /// + /// + [HttpPost("GetOutboundReportByPage")] + public IActionResult GetOutboundReportByPage([FromBody] WmGoodsRecordReportQueryDto query) + { + try + { + var response = mmOutboundReportService.GetOutboundReportByPage(query); + return SUCCESS(response); + } + catch (Exception) + { + throw; + } + } + + } +} \ No newline at end of file diff --git a/ZR.Admin.WebApi/DataProtection/key-ab5766eb-3e33-4d3f-9868-b1dbae6dbefb.xml b/ZR.Admin.WebApi/DataProtection/key-ab5766eb-3e33-4d3f-9868-b1dbae6dbefb.xml new file mode 100644 index 00000000..38fb28c8 --- /dev/null +++ b/ZR.Admin.WebApi/DataProtection/key-ab5766eb-3e33-4d3f-9868-b1dbae6dbefb.xml @@ -0,0 +1,16 @@ + + + 2025-08-13T05:44:14.9326709Z + 2025-08-13T05:44:14.877032Z + 2025-11-11T05:44:14.877032Z + + + + + + + XS+y3HmCKGimKj5oZV6Oq/747D2R8k7rQtVfVswIGOhbE6OHFfJo3mLhKICIDrk5ACcTP4ea5z+Uo5qMAGqp+Q== + + + + \ No newline at end of file diff --git a/ZR.Model/MES/mm/Dto/WmGoodsRecordReportQueryDto.cs b/ZR.Model/MES/mm/Dto/WmGoodsRecordReportQueryDto.cs new file mode 100644 index 00000000..5b7acbe8 --- /dev/null +++ b/ZR.Model/MES/mm/Dto/WmGoodsRecordReportQueryDto.cs @@ -0,0 +1,40 @@ +using System; +using ZR.Model; + +namespace ZR.Model.MES.mm.Dto +{ + /// + /// 成品库记录查询参数 + /// + public class WmGoodsRecordReportQueryDto : PagerInfo + { + /// + /// 数据来源 + /// + public string Source { get; set; } + /// + /// 开始时间 + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime? EndTime { get; set; } + + /// + /// 物料号(零件号) + /// + public string PartNumber { get; set; } + + /// + /// 物料名称(暂无对应字段,可考虑用零件号替代或添加新字段) + /// + public string MaterialName { get; set; } + + /// + /// 操作人(创建人) + /// + public string Operator { get; set; } + } +} \ No newline at end of file diff --git a/ZR.Model/MES/mm/WmGoodsRecordReport.cs b/ZR.Model/MES/mm/WmGoodsRecordReport.cs new file mode 100644 index 00000000..ac4ee430 --- /dev/null +++ b/ZR.Model/MES/mm/WmGoodsRecordReport.cs @@ -0,0 +1,124 @@ +namespace ZR.Model.MES.mm +{ + /// + /// 成品库出入库报表清单 + /// + public class WmGoodsRecordReport + { + #region 基础信息 + + /// + /// 主键 + /// + public string Id { get; set; } + + /// + /// 库存主键 + /// + public string FkInventoryId { get; set; } + + /// + /// 关联记录字段,识别记录字段如PDA + /// + public string Code { get; set; } + + /// + /// 零件号 + /// + public string Partnumber { get; set; } + + /// + /// 毛坯号 + /// + public string BlankNum { get; set; } + + #endregion + + #region 变动信息 + + /// + /// 变动类别 1-入库 2-出库 3-盘点 + /// + public int? ChangeType { get; set; } + + /// + /// 变动箱数 + /// + public int? ChangePackage { get; set; } + + /// + /// 变动零件数量 + /// + public int? ChangeQuantity { get; set; } + + /// + /// 时间(操作时间) + /// + public DateTime? ActionTime { get; set; } + + /// + /// 状态(暂定) + /// + public int? Status { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + #endregion + + #region 物料信息 + + /// + /// 产品描述(产品名称) + /// + public string ProductName { get; set; } + + /// + /// 产品颜色 + /// + public string Color { get; set; } + + /// + /// 规格(左右脚) + /// + public string Specification { get; set; } + + /// + /// 显示描述(产品描述+颜色+规格) + /// + public string Description { get; set; } + + /// + /// 单位 + /// + public string Unit { get; set; } + + #endregion + + #region 审计信息 + + /// + /// 创建人 + /// + public string CreatedBy { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreatedTime { get; set; } + + /// + /// 更新人 + /// + public string UpdatedBy { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdatedTime { get; set; } + + #endregion + } +} \ No newline at end of file diff --git a/ZR.Model/MES/wms/WmGoodsRecord.cs b/ZR.Model/MES/wms/WmGoodsRecord.cs index 1d12e75f..0f6ea6cc 100644 --- a/ZR.Model/MES/wms/WmGoodsRecord.cs +++ b/ZR.Model/MES/wms/WmGoodsRecord.cs @@ -40,6 +40,12 @@ namespace ZR.Model.MES.wms [SugarColumn(ColumnName = "change_type")] public int? ChangeType { get; set; } + /// + /// 变动箱数 + /// + [SugarColumn(ColumnName = "change_package")] + public int? ChangePackage { get; set; } + /// /// 变动数量 /// diff --git a/ZR.Service/mes/mm/IService/IMmInventoryReportService.cs b/ZR.Service/mes/mm/IService/IMmInventoryReportService.cs new file mode 100644 index 00000000..9328d13c --- /dev/null +++ b/ZR.Service/mes/mm/IService/IMmInventoryReportService.cs @@ -0,0 +1,24 @@ +using ZR.Model; +using ZR.Model.MES.mm; +using ZR.Model.MES.mm.Dto; + +namespace ZR.Service.mes.mm.IService +{ + public interface IMmInventoryReportService + { + /// + /// 按时间、物料号、物料名称、操作人获取分页数据 + /// + /// 查询参数 + /// 分页信息 + /// 分页结果 + PagedInfo GetInventoryReportByPage(WmGoodsRecordReportQueryDto query); + + /// + /// 根据ID获取详细数据清单 + /// + /// 记录ID + /// 详细数据 + WmGoodsRecordReport GetInventoryReportDetail(string id); + } +} \ No newline at end of file diff --git a/ZR.Service/mes/mm/IService/IMmOutboundReportService.cs b/ZR.Service/mes/mm/IService/IMmOutboundReportService.cs new file mode 100644 index 00000000..ba5ebc52 --- /dev/null +++ b/ZR.Service/mes/mm/IService/IMmOutboundReportService.cs @@ -0,0 +1,24 @@ +using ZR.Model.MES.mm; +using ZR.Model.MES.mm.Dto; +using ZR.Model; + +namespace ZR.Service.mes.mm.IService +{ + public interface IMmOutboundReportService + { + /// + /// 按时间、物料号、物料名称、操作人获取分页数据 + /// + /// 查询参数 + /// 分页信息 + /// 分页结果 + PagedInfo GetOutboundReportByPage(WmGoodsRecordReportQueryDto query); + + /// + /// 根据ID获取详细数据清单 + /// + /// 记录ID + /// 详细数据 + WmGoodsRecordReport GetOutboundReportDetail(string id); + } +} \ No newline at end of file diff --git a/ZR.Service/mes/mm/MmInventoryReportService.cs b/ZR.Service/mes/mm/MmInventoryReportService.cs new file mode 100644 index 00000000..19a416cf --- /dev/null +++ b/ZR.Service/mes/mm/MmInventoryReportService.cs @@ -0,0 +1,142 @@ +using System.Linq; +using Infrastructure.Attribute; +using SqlSugar; +using ZR.Model; +using ZR.Model.MES.mm; +using ZR.Model.MES.mm.Dto; +using ZR.Model.MES.wms; +using ZR.Repository; +using ZR.Service.mes.mm.IService; +using ZR.Service.mes.wms; + +namespace ZR.Service.mes.mm +{ + [AppService( + ServiceType = typeof(IMmInventoryReportService), + ServiceLifetime = LifeTime.Transient + )] + public class MmInventoryReportService : BaseService, IMmInventoryReportService + { + /// + /// 按时间、物料号、物料名称、操作人获取分页数据 + /// + /// 查询参数 + /// 分页信息 + /// 分页结果 + public PagedInfo GetInventoryReportByPage( + WmGoodsRecordReportQueryDto query + ) + { + // 添加查询条件 + var predicate = Expressionable + .Create() + .AndIF(query.StartTime.HasValue, (gr, m) => gr.ActionTime >= query.StartTime) + .AndIF(query.EndTime.HasValue, (gr, m) => gr.ActionTime <= query.EndTime) + .AndIF( + !string.IsNullOrEmpty(query.PartNumber), + (gr, m) => gr.Partnumber.Contains(query.PartNumber) + ) + .AndIF( + !string.IsNullOrEmpty(query.Source), + (gr, m) => gr.Code.Contains(query.Source) + ) + .AndIF( + !string.IsNullOrEmpty(query.MaterialName), + (gr, m) => m.Description.Contains(query.MaterialName) + ) + .AndIF( + !string.IsNullOrEmpty(query.Operator), + (gr, m) => gr.CreatedBy.Contains(query.Operator) + ) + .And((gr, m) => gr.ChangeType == 1); // 入库记录 + + // 按零件号分组并计算ChangeQuantity合计 + var result = Context + .Queryable( + (gr, m) => new JoinQueryInfos(JoinType.Left, gr.Partnumber == m.Partnumber) + ) + .Where(predicate.ToExpression()) + .GroupBy( + (gr, m) => + new + { + gr.Partnumber, + m.ProductName, + m.Color, + m.Specification, + m.Description, + m.Unit, + gr.CreatedBy + } + ) + .Select( + (gr, m) => + new WmGoodsRecordReport + { + Code = gr.Code, + Partnumber = gr.Partnumber, + ProductName = m.ProductName, + Color = m.Color, + Specification = m.Specification, + Description = m.Description, + Unit = m.Unit, + ChangePackage = SqlFunc.AggregateSum(gr.ChangePackage), + ChangeQuantity = SqlFunc.AggregateSum(gr.ChangeQuantity), + CreatedBy = gr.CreatedBy, + } + ) + .ToPage(query); + + return result; + } + + /// + /// 根据ID获取详细数据清单 + /// + /// 记录ID + /// 详细数据 + public WmGoodsRecordReport GetInventoryReportDetail(string id) + { + // 获取原始记录 + var record = this.GetId(id); + if (record == null) + return null; + + // 创建报表模型实例 + var report = new WmGoodsRecordReport + { + Id = record.Id, + FkInventoryId = record.FkInventoryId, + Code = record.Code, + Partnumber = record.Partnumber, + BlankNum = record.BlankNum, + ChangeType = record.ChangeType, + ChangeQuantity = record.ChangeQuantity, + ActionTime = record.ActionTime, + Status = record.Status, + Remark = record.Remark, + CreatedBy = record.CreatedBy, + CreatedTime = record.CreatedTime, + UpdatedBy = record.UpdatedBy, + UpdatedTime = record.UpdatedTime + }; + + // 如果有零件号,尝试获取物料信息 + if (!string.IsNullOrEmpty(record.Partnumber)) + { + var materialService = new WmMaterialService(); + var material = materialService.GetFirst(it => it.Partnumber == record.Partnumber); + if (material != null) + { + report.ProductName = material.ProductName; + report.Color = material.Color; + report.Specification = material.Specification; + report.Description = material.Description; + report.Unit = material.Unit; + } + } + + return report; + } + } +} diff --git a/ZR.Service/mes/mm/MmOutboundReportService.cs b/ZR.Service/mes/mm/MmOutboundReportService.cs new file mode 100644 index 00000000..f4e4ecbd --- /dev/null +++ b/ZR.Service/mes/mm/MmOutboundReportService.cs @@ -0,0 +1,141 @@ +using Infrastructure.Attribute; +using SqlSugar; +using ZR.Model; +using ZR.Model.MES.mm; +using ZR.Model.MES.mm.Dto; +using ZR.Model.MES.wms; +using ZR.Repository; +using ZR.Service.mes.mm.IService; +using ZR.Service.mes.wms; + +namespace ZR.Service.mes.mm +{ + [AppService( + ServiceType = typeof(IMmOutboundReportService), + ServiceLifetime = LifeTime.Transient + )] + public class MmOutboundReportService : BaseService, IMmOutboundReportService + { + /// + /// 按时间、物料号、物料名称、操作人获取分页数据 + /// + /// 查询参数 + /// 分页信息 + /// 分页结果 + public PagedInfo GetOutboundReportByPage( + WmGoodsRecordReportQueryDto query + ) + { + // 添加查询条件 + var predicate = Expressionable + .Create() + .AndIF(query.StartTime.HasValue, (gr, m) => gr.ActionTime >= query.StartTime) + .AndIF(query.EndTime.HasValue, (gr, m) => gr.ActionTime <= query.EndTime) + .AndIF( + !string.IsNullOrEmpty(query.PartNumber), + (gr, m) => gr.Partnumber.Contains(query.PartNumber) + ) + .AndIF( + !string.IsNullOrEmpty(query.Source), + (gr, m) => gr.Code.Contains(query.Source) + ) + .AndIF( + !string.IsNullOrEmpty(query.MaterialName), + (gr, m) => m.Description.Contains(query.MaterialName) + ) + .AndIF( + !string.IsNullOrEmpty(query.Operator), + (gr, m) => gr.CreatedBy.Contains(query.Operator) + ) + .And((gr, m) => gr.ChangeType == 2); // 入库记录 + + // 按零件号分组并计算ChangeQuantity合计 + var result = Context + .Queryable( + (gr, m) => new JoinQueryInfos(JoinType.Left, gr.Partnumber == m.Partnumber) + ) + .Where(predicate.ToExpression()) + .GroupBy( + (gr, m) => + new + { + gr.Partnumber, + m.ProductName, + m.Color, + m.Specification, + m.Description, + m.Unit, + gr.CreatedBy + } + ) + .Select( + (gr, m) => + new WmGoodsRecordReport + { + Code = gr.Code, + Partnumber = gr.Partnumber, + ProductName = m.ProductName, + Color = m.Color, + Specification = m.Specification, + Description = m.Description, + Unit = m.Unit, + ChangePackage = SqlFunc.AggregateSum(gr.ChangePackage), + ChangeQuantity = SqlFunc.AggregateSum(gr.ChangeQuantity), + CreatedBy = gr.CreatedBy, + } + ) + .ToPage(query); + + return result; + } + + /// + /// 根据ID获取详细数据清单 + /// + /// 记录ID + /// 详细数据 + public WmGoodsRecordReport GetOutboundReportDetail(string id) + { + // 获取原始记录 + var record = this.GetId(id); + if (record == null) + return null; + + // 创建报表模型实例 + var report = new WmGoodsRecordReport + { + Id = record.Id, + FkInventoryId = record.FkInventoryId, + Code = record.Code, + Partnumber = record.Partnumber, + BlankNum = record.BlankNum, + ChangeType = record.ChangeType, + ChangeQuantity = record.ChangeQuantity, + ActionTime = record.ActionTime, + Status = record.Status, + Remark = record.Remark, + CreatedBy = record.CreatedBy, + CreatedTime = record.CreatedTime, + UpdatedBy = record.UpdatedBy, + UpdatedTime = record.UpdatedTime + }; + + // 如果有零件号,尝试获取物料信息 + if (!string.IsNullOrEmpty(record.Partnumber)) + { + var materialService = new WmMaterialService(); + var material = materialService.GetFirst(it => it.Partnumber == record.Partnumber); + if (material != null) + { + report.ProductName = material.ProductName; + report.Color = material.Color; + report.Specification = material.Specification; + report.Description = material.Description; + report.Unit = material.Unit; + } + } + + return report; + } + } +} diff --git a/ZR.Service/mes/wms/WMentryWarehousing_productService.cs b/ZR.Service/mes/wms/WMentryWarehousing_productService.cs index 0f1d47bd..9b56c76a 100644 --- a/ZR.Service/mes/wms/WMentryWarehousing_productService.cs +++ b/ZR.Service/mes/wms/WMentryWarehousing_productService.cs @@ -141,6 +141,7 @@ namespace ZR.Service.mes.wms Partnumber = partnumbers[0] ?? "无零件号", BlankNum = "", ChangeType = 1, + ChangePackage = totalPackage, ChangeQuantity = totalPartnumber, ActionTime = DateTime.Now, Status = 1, diff --git a/ZR.Service/mes/wms/WmGoodsOutProductionService.cs b/ZR.Service/mes/wms/WmGoodsOutProductionService.cs index a858a1eb..24dd38dd 100644 --- a/ZR.Service/mes/wms/WmGoodsOutProductionService.cs +++ b/ZR.Service/mes/wms/WmGoodsOutProductionService.cs @@ -368,6 +368,7 @@ namespace ZR.Service.mes.wms Partnumber = partnumbers[0] ?? "无零件号", BlankNum = "", ChangeType = 2, + ChangePackage = totalPackage, ChangeQuantity = totalPartnumber, ActionTime = DateTime.Now, Status = 1, diff --git a/ZR.Service/mes/wms/WmOutOrderService.cs b/ZR.Service/mes/wms/WmOutOrderService.cs index be2797d5..95230f10 100644 --- a/ZR.Service/mes/wms/WmOutOrderService.cs +++ b/ZR.Service/mes/wms/WmOutOrderService.cs @@ -551,6 +551,7 @@ namespace ZR.Service.mes.wms Partnumber = partnumbers[0] ?? "无零件号", BlankNum = "", ChangeType = 2, + ChangePackage = totalPackage, ChangeQuantity = totalPartnumber, ActionTime = DateTime.Now, Status = 1, @@ -571,7 +572,7 @@ namespace ZR.Service.mes.wms + "\n涉及批次号:\n" + string.Join(',', packageCodeRemark), - CreatedBy = Createby, + CreatedBy = Createby ?? "系统操作", CreatedTime = DateTime.Now, }; int recordNum = Context.Insertable(wmGoodsRecord).ExecuteCommand(); diff --git a/ZR.Tasks/TaskScheduler/Job_Blank.cs b/ZR.Tasks/TaskScheduler/Job_Blank.cs index 7038b3d4..1da4d6fe 100644 --- a/ZR.Tasks/TaskScheduler/Job_Blank.cs +++ b/ZR.Tasks/TaskScheduler/Job_Blank.cs @@ -121,11 +121,10 @@ namespace ZR.Tasks.TaskScheduler .ToList(); } } - catch (Exception ex) + catch (Exception) { return null; } - return null; } ///