diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs
index 353944d3..bffeecf3 100644
--- a/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs
+++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs
@@ -228,5 +228,18 @@ namespace ZR.Admin.WebApi.Controllers
var result = ExportExcelMini(list, "wm_one_time_inventory", "一次合格品仓库数据");
return ExportExcel(result.Item2, result.Item1);
}
+
+ ///
+ /// 一次合格品仓库数据导出
+ ///
+ ///
+ ///
+ [HttpGet("ErrorCheck")]
+ [AllowAnonymous]
+ public IActionResult ErrorCheck()
+ {
+ var list = _WmOneTimeInventoryService.CheckErrorTable();
+ return SUCCESS(list);
+ }
}
}
diff --git a/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs b/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs
index 897c7b0e..742471a1 100644
--- a/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs
+++ b/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs
@@ -70,6 +70,15 @@ namespace ZR.Model.MES.wms.Dto
public List Result { get; set; }
}
+ public class ErrorCheckTableDto
+ {
+ public string Name { get; set; }
+ public string Partnumber { get; set; }
+ public string Description { get; set; }
+ public string ErrorMessage { get; set; }
+ public DateTime CheckTime { get; set; }
+ }
+
// 一次合格(产成品)导出
[SugarTable("wm_one_time_record", "一次合格表")]
public class WmOneTimeInventoryExportDto
diff --git a/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs b/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs
index b4229233..3103efc4 100644
--- a/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs
+++ b/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs
@@ -59,5 +59,13 @@ namespace ZR.Service.mes.wms.IService
///
public (string, object, object) ImportExcel(List excel);
+
+ ///
+ /// 检查一次合格品记录,抛光记录错误原因
+ ///
+ ///
+ public List CheckErrorTable();
+
+
}
}
diff --git a/ZR.Service/mes/wms/WmBlankRecordService.cs b/ZR.Service/mes/wms/WmBlankRecordService.cs
index cae0ec08..e03bd688 100644
--- a/ZR.Service/mes/wms/WmBlankRecordService.cs
+++ b/ZR.Service/mes/wms/WmBlankRecordService.cs
@@ -326,11 +326,21 @@ namespace ZR.Service.mes.wms
.Queryable()
.Where(it => it.ClientWorkorder == workOrderId)
.First();
+
+
if (workOrderInfo == null)
{
Context.Ado.RollbackTran();
throw new Exception("工单记录不存在!" + workOrderId);
}
+ //TODO 20250325 remark1 存在不扣,则不扣除
+ if (workOrderInfo.Remark1.Contains("不扣"))
+ {
+ Context.Ado.CommitTran();
+ return 0;
+ }
+
+
if (workOrderInfo.Remark1.Contains("返工"))
{
type = 2;
diff --git a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs
index 4bd65460..22f51885 100644
--- a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs
+++ b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs
@@ -231,126 +231,122 @@ namespace ZR.Service.mes.wms
return response;*/
}
-
-
- ///
- /// 查询一次合格品仓库列表
- ///
- ///
- ///
- public WmOneTimeInventoryTableDto GetListNew(WmOneTimeInventoryQueryDto parm)
- {
- var list = Context
- .Queryable()
- .LeftJoin((m, p) => m.Partnumber == p.Partnumber)
- .Distinct()
- .WhereIF(
- !string.IsNullOrEmpty(parm.Description),
- (m, p) => m.Description.Contains(parm.Description)
- )
- .WhereIF(
- !string.IsNullOrEmpty(parm.Partnumber),
- (m, p) => m.Partnumber.Contains(parm.Partnumber)
- )
- .Where((m, p) => m.Status == 1)
- .Where((m, p) => m.Type == 1)
- // .WhereIF(string.IsNullOrEmpty(parm.Partnumber), (m, p) => p.Status == 1)
- .OrderBy((m, p) => m.Description)
- .Select(
- (m, p) =>
- new WmOneTimeInventoryDto
- {
- RealQuantity = 0,
- Partnumber = m.Partnumber,
- Color = m.Color,
- Specification = m.Specification,
- Description = m.Description,
- Id = p.Id ?? m.Id,
- BlankNum = p.BlankNum,
- Quantity = p.Quantity ?? 0,
- MaxNum = p.MaxNum,
- MinNum = p.MinNum,
- WarnNum = p.WarnNum,
- Type = p.Type ?? 1,
- Status = p.Status,
- Remark = p.Remark,
- CreatedBy = p.CreatedBy,
- CreatedTime = p.CreatedTime,
- UpdatedBy = p.UpdatedBy,
- UpdatedTime = p.UpdatedTime,
- }
- )
- .ToList();
- //TODO 取出库存表 WmOneTimeInventory 最小CreatedTime时间
- DateTime minDateTime =
- Context
- .Queryable()
- .OrderBy(it => it.CreatedTime)
- .Select(it => it.CreatedTime)
- .First() ?? DateTime.Now;
- //TODO 根据时间范围取出所有记录数据
- List wmOneTimeRecords = Context
- .Queryable()
- //.Where(it => it.Code == "自动")
- .Where(it => it.ActionTime >= minDateTime)
- .ToList();
+ ///
+ /// 查询一次合格品仓库列表
+ ///
+ ///
+ ///
+ public WmOneTimeInventoryTableDto GetListNew(WmOneTimeInventoryQueryDto parm)
+ {
+ var list = Context
+ .Queryable()
+ .LeftJoin((m, p) => m.Partnumber == p.Partnumber)
+ .Distinct()
+ .WhereIF(
+ !string.IsNullOrEmpty(parm.Description),
+ (m, p) => m.Description.Contains(parm.Description)
+ )
+ .WhereIF(
+ !string.IsNullOrEmpty(parm.Partnumber),
+ (m, p) => m.Partnumber.Contains(parm.Partnumber)
+ )
+ .Where((m, p) => m.Status == 1)
+ .Where((m, p) => m.Type == 1)
+ // .WhereIF(string.IsNullOrEmpty(parm.Partnumber), (m, p) => p.Status == 1)
+ .OrderBy((m, p) => m.Description)
+ .Select(
+ (m, p) =>
+ new WmOneTimeInventoryDto
+ {
+ RealQuantity = 0,
+ Partnumber = m.Partnumber,
+ Color = m.Color,
+ Specification = m.Specification,
+ Description = m.Description,
+ Id = p.Id ?? m.Id,
+ BlankNum = p.BlankNum,
+ Quantity = p.Quantity ?? 0,
+ MaxNum = p.MaxNum,
+ MinNum = p.MinNum,
+ WarnNum = p.WarnNum,
+ Type = p.Type ?? 1,
+ Status = p.Status,
+ Remark = p.Remark,
+ CreatedBy = p.CreatedBy,
+ CreatedTime = p.CreatedTime,
+ UpdatedBy = p.UpdatedBy,
+ UpdatedTime = p.UpdatedTime,
+ }
+ )
+ .ToList();
+ //TODO 取出库存表 WmOneTimeInventory 最小CreatedTime时间
+ DateTime minDateTime =
+ Context
+ .Queryable()
+ .OrderBy(it => it.CreatedTime)
+ .Select(it => it.CreatedTime)
+ .First() ?? DateTime.Now;
+ //TODO 根据时间范围取出所有记录数据
+ List wmOneTimeRecords = Context
+ .Queryable()
+ //.Where(it => it.Code == "自动")
+ .Where(it => it.ActionTime >= minDateTime)
+ .ToList();
foreach (WmOneTimeInventoryDto item in list)
- {
- int? runum = wmOneTimeRecords
- .Where(o =>
- o.ActionTime >= item.CreatedTime
- && o.Partnumber == item.Partnumber
- && o.ChangeType == 1
- )
- .Select(o => o.ChangeQuantity)
- .Sum();
- int? chunum = wmOneTimeRecords
- .Where(o =>
- o.ActionTime >= item.CreatedTime
- && o.Partnumber == item.Partnumber
- && o.ChangeType == 2
- )
- .Select(o => o.ChangeQuantity)
- .Sum();
- item.RealQuantity = item.Quantity.Value + (runum.Value - chunum.Value);
- }
- list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0)
- .Where(it => !string.IsNullOrEmpty(it.Partnumber))
- .DistinctBy(it => it.Partnumber)
+ {
+ int? runum = wmOneTimeRecords
+ .Where(o =>
+ o.ActionTime >= item.CreatedTime
+ && o.Partnumber == item.Partnumber
+ && o.ChangeType == 1
+ )
+ .Select(o => o.ChangeQuantity)
+ .Sum();
+ int? chunum = wmOneTimeRecords
+ .Where(o =>
+ o.ActionTime >= item.CreatedTime
+ && o.Partnumber == item.Partnumber
+ && o.ChangeType == 2
+ )
+ .Select(o => o.ChangeQuantity)
+ .Sum();
+ item.RealQuantity = item.Quantity.Value + (runum.Value - chunum.Value);
+ }
+ list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0)
+ .Where(it => !string.IsNullOrEmpty(it.Partnumber))
+ .DistinctBy(it => it.Partnumber)
.OrderBy(it => it.RealQuantity)
- .ToList();
+ .ToList();
- int total = list.Count;
- // 仓库总盘点零件数
- int StocktakingTotal =
- Context.Queryable().Sum(it => it.Quantity) ?? 0;
- // 仓库当前查询盘点零件数
- int QuantitySum = list.Sum(it => it.Quantity) ?? 0;
- // 仓库当前查询实际零件数
- int RealQuantitySum = list.Sum(it => it.RealQuantity);
- WmOneTimeInventoryTableDto response =
- new()
- {
- Total = total,
- StocktakingTotal = StocktakingTotal,
- QuantitySum = QuantitySum,
- RealQuantitySum = RealQuantitySum,
+ int total = list.Count;
+ // 仓库总盘点零件数
+ int StocktakingTotal =
+ Context.Queryable().Sum(it => it.Quantity) ?? 0;
+ // 仓库当前查询盘点零件数
+ int QuantitySum = list.Sum(it => it.Quantity) ?? 0;
+ // 仓库当前查询实际零件数
+ int RealQuantitySum = list.Sum(it => it.RealQuantity);
+ WmOneTimeInventoryTableDto response =
+ new()
+ {
+ Total = total,
+ StocktakingTotal = StocktakingTotal,
+ QuantitySum = QuantitySum,
+ RealQuantitySum = RealQuantitySum,
MinStocktakingTime = minDateTime,
Result = list.Skip((parm.PageNum - 1) * parm.PageSize)
- .Take(parm.PageSize)
- .ToList(),
- };
- return response;
+ .Take(parm.PageSize)
+ .ToList(),
+ };
+ return response;
+ }
-
- }
-
- ///
- /// 获取详情
- ///
- ///
- ///
- public WmOneTimeInventory GetInfo(string Id)
+ ///
+ /// 获取详情
+ ///
+ ///
+ ///
+ public WmOneTimeInventory GetInfo(string Id)
{
var response = Queryable().Where(x => x.Id == Id).First();
@@ -764,11 +760,14 @@ namespace ZR.Service.mes.wms
.First() ?? new DateTime(2024, 11, 16, 12, 0, 0);
// DateTime
CommonFQCService commonFQCService = new();
- // 获取报表数据
- // 一次合格计算后库存 = 盘点库存 + 产线合格 + 抛光合格 - gp12投入 - 后道直接出库
- //return commonFQCService.GetBatchOneTimePartRealStock(partnumbers, checkTime.Value);
- return commonFQCService.GetBatchOneTimePartRealStockNew(partnumbers, checkTime.Value);
- }
+ // 获取报表数据
+ // 一次合格计算后库存 = 盘点库存 + 产线合格 + 抛光合格 - gp12投入 - 后道直接出库
+ //return commonFQCService.GetBatchOneTimePartRealStock(partnumbers, checkTime.Value);
+ return commonFQCService.GetBatchOneTimePartRealStockNew(
+ partnumbers,
+ checkTime.Value
+ );
+ }
catch (Exception e)
{
throw;
@@ -832,5 +831,141 @@ namespace ZR.Service.mes.wms
return (msg, x.ErrorList, x.IgnoreList);
}
+
+ public List CheckErrorTable()
+ {
+ List errorCheckTableDtos = new List();
+
+ // 盘点数据的零件号与物料内零件号不匹配异常进行检查
+ // 获取物料列表并将零件号提取到 HashSet 中以进行快速查找
+ HashSet materialPartnumbers =
+ new(GetWmMaterialList("").Select(m => m.Partnumber));
+ List oneTimeInventoryList = Context
+ .Queryable()
+ .ToList();
+ List polishInventoryList = Context
+ .Queryable()
+ .ToList();
+ foreach (var inventoryItem in oneTimeInventoryList)
+ {
+ if (!materialPartnumbers.Contains(inventoryItem.Partnumber))
+ {
+ errorCheckTableDtos.Add(
+ new ErrorCheckTableDto
+ {
+ Name = "零件号不存在",
+ Partnumber = inventoryItem.Partnumber,
+ Description = "该零件号在物料列表中不存在。",
+ ErrorMessage = "检测到【一次合格盘点记录】中的零件号不匹配。",
+ CheckTime = DateTime.Now
+ }
+ );
+ }
+ }
+ foreach (var inventoryItem in polishInventoryList)
+ {
+ if (!materialPartnumbers.Contains(inventoryItem.Partnumber))
+ {
+ errorCheckTableDtos.Add(
+ new ErrorCheckTableDto
+ {
+ Name = "零件号不存在",
+ Partnumber = inventoryItem.Partnumber,
+ Description = "该零件号在物料列表中不存在。",
+ ErrorMessage = "检测到【抛光品盘点记录】中的零件号不匹配。",
+ CheckTime = DateTime.Now
+ }
+ );
+ }
+ }
+
+ DateTime minOneTimeStocktakingTime =
+ oneTimeInventoryList.Min(x => x.CreatedTime) ?? DateTime.Now;
+ DateTime minPolishStocktakingTime =
+ polishInventoryList.Min(x => x.CreatedTime) ?? DateTime.Now;
+
+ List oneTimeRecordList = Context
+ .Queryable()
+ .Where(it => it.ActionTime >= minOneTimeStocktakingTime)
+ .ToList();
+ List polishRecordList = Context
+ .Queryable()
+ .Where(it => it.ActionTime >= minPolishStocktakingTime)
+ .ToList();
+
+ foreach (var recordItem in oneTimeRecordList)
+ {
+ if (!materialPartnumbers.Contains(recordItem.Partnumber))
+ {
+ errorCheckTableDtos.Add(
+ new ErrorCheckTableDto
+ {
+ Name = "零件号不存在",
+ Partnumber = recordItem.Partnumber,
+ Description = "该零件号在物料列表中不存在。",
+ ErrorMessage = "检测到【一次合格品报表】中的零件号不匹配。记录时间:" + recordItem.ActionTime,
+ CheckTime = DateTime.Now
+ }
+ );
+ }
+ }
+
+ foreach (var recordItem in polishRecordList)
+ {
+ if (!materialPartnumbers.Contains(recordItem.Partnumber))
+ {
+ errorCheckTableDtos.Add(
+ new ErrorCheckTableDto
+ {
+ Name = "零件号不存在",
+ Partnumber = recordItem.Partnumber,
+ Description = "该零件号在物料列表中不存在。",
+ ErrorMessage = "检测到【抛光品报表】中的零件号不匹配。记录时间:" + recordItem.ActionTime,
+ CheckTime = DateTime.Now
+ }
+ );
+ }
+ }
+
+ //TODO 判断oneTimeRecordList中是否存在oneTimeInventoryList没有的零件号
+ // 提取 oneTimeInventoryList 中的所有零件号
+ HashSet oneTimeInventoryPartnumbers = new HashSet(oneTimeInventoryList.Select(i => i.Partnumber));
+ foreach (var recordItem in oneTimeRecordList)
+ {
+ if (!oneTimeInventoryPartnumbers.Contains(recordItem.Partnumber))
+ {
+ errorCheckTableDtos.Add(
+ new ErrorCheckTableDto
+ {
+ Name = "该零件号记录丢失",
+ Partnumber = recordItem.Partnumber,
+ Description = "该零件号与盘点数据不匹配。请确认情况,是否未盘点到!",
+ ErrorMessage = $"检测到【一次合格品记录】中的零件号在盘点清单中不存在。记录时间: {recordItem.ActionTime}",
+ CheckTime = DateTime.Now
+ }
+ );
+ }
+ }
+ //TODO 判断polishRecordList中是否存在polishInventoryList没有的零件号
+ HashSet polishInventoryPartnumbers = new HashSet(polishInventoryList.Select(i => i.Partnumber));
+ foreach (var recordItem in polishRecordList)
+ {
+ if (!polishInventoryPartnumbers.Contains(recordItem.Partnumber))
+ {
+ errorCheckTableDtos.Add(
+ new ErrorCheckTableDto
+ {
+ Name = "该零件号记录丢失",
+ Partnumber = recordItem.Partnumber,
+ Description = "该零件号与盘点数据不匹配。请确认情况,是否未盘点到!",
+ ErrorMessage = $"检测到【抛光品记录】中的零件号在盘点清单中不存在。记录时间: {recordItem.ActionTime}",
+ CheckTime = DateTime.Now
+ }
+ );
+ }
+ }
+
+ return errorCheckTableDtos;
+ }
}
}
diff --git a/ZR.Tasks/TaskScheduler/Job_Blank.cs b/ZR.Tasks/TaskScheduler/Job_Blank.cs
index aeee1f7f..83522d39 100644
--- a/ZR.Tasks/TaskScheduler/Job_Blank.cs
+++ b/ZR.Tasks/TaskScheduler/Job_Blank.cs
@@ -116,6 +116,7 @@ namespace ZR.Tasks.TaskScheduler
.And(it => it.Year == year)
.And(it => it.Week == week)
.And(it => it.Date == date)
+ .And(it => !it.Remark1.Contains("不扣"))
.And(it => it.Remark2.Contains("调试"))
// .And(it => it.Remark3 == "是")
.ToExpression();