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;
}
///