记录检测功能增加,毛坯扣除添加不扣逻辑

This commit is contained in:
赵正易 2025-03-25 16:27:06 +08:00
parent c12d428650
commit 0526dcb908
6 changed files with 295 additions and 119 deletions

View File

@ -228,5 +228,18 @@ namespace ZR.Admin.WebApi.Controllers
var result = ExportExcelMini(list, "wm_one_time_inventory", "一次合格品仓库数据"); var result = ExportExcelMini(list, "wm_one_time_inventory", "一次合格品仓库数据");
return ExportExcel(result.Item2, result.Item1); return ExportExcel(result.Item2, result.Item1);
} }
/// <summary>
/// 一次合格品仓库数据导出
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("ErrorCheck")]
[AllowAnonymous]
public IActionResult ErrorCheck()
{
var list = _WmOneTimeInventoryService.CheckErrorTable();
return SUCCESS(list);
}
} }
} }

View File

@ -70,6 +70,15 @@ namespace ZR.Model.MES.wms.Dto
public List<WmOneTimeInventoryDto> Result { get; set; } public List<WmOneTimeInventoryDto> 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", "一次合格表")] [SugarTable("wm_one_time_record", "一次合格表")]
public class WmOneTimeInventoryExportDto public class WmOneTimeInventoryExportDto

View File

@ -59,5 +59,13 @@ namespace ZR.Service.mes.wms.IService
/// <returns></returns> /// <returns></returns>
public (string, object, object) ImportExcel(List<WmOneTimeInventoryExportDto> excel); public (string, object, object) ImportExcel(List<WmOneTimeInventoryExportDto> excel);
/// <summary>
/// 检查一次合格品记录,抛光记录错误原因
/// </summary>
/// <returns></returns>
public List<ErrorCheckTableDto> CheckErrorTable();
} }
} }

View File

@ -326,11 +326,21 @@ namespace ZR.Service.mes.wms
.Queryable<ProWorkorder_v2>() .Queryable<ProWorkorder_v2>()
.Where(it => it.ClientWorkorder == workOrderId) .Where(it => it.ClientWorkorder == workOrderId)
.First(); .First();
if (workOrderInfo == null) if (workOrderInfo == null)
{ {
Context.Ado.RollbackTran(); Context.Ado.RollbackTran();
throw new Exception("工单记录不存在!" + workOrderId); throw new Exception("工单记录不存在!" + workOrderId);
} }
//TODO 20250325 remark1 存在不扣,则不扣除
if (workOrderInfo.Remark1.Contains("不扣"))
{
Context.Ado.CommitTran();
return 0;
}
if (workOrderInfo.Remark1.Contains("返工")) if (workOrderInfo.Remark1.Contains("返工"))
{ {
type = 2; type = 2;

View File

@ -231,126 +231,122 @@ namespace ZR.Service.mes.wms
return response;*/ return response;*/
} }
/// <summary>
/// 查询一次合格品仓库列表
/// <summary> /// </summary>
/// 查询一次合格品仓库列表 /// <param name="parm"></param>
/// </summary> /// <returns></returns>
/// <param name="parm"></param> public WmOneTimeInventoryTableDto GetListNew(WmOneTimeInventoryQueryDto parm)
/// <returns></returns> {
public WmOneTimeInventoryTableDto GetListNew(WmOneTimeInventoryQueryDto parm) var list = Context
{ .Queryable<WmMaterial>()
var list = Context .LeftJoin<WmOneTimeInventory>((m, p) => m.Partnumber == p.Partnumber)
.Queryable<WmMaterial>() .Distinct()
.LeftJoin<WmOneTimeInventory>((m, p) => m.Partnumber == p.Partnumber) .WhereIF(
.Distinct() !string.IsNullOrEmpty(parm.Description),
.WhereIF( (m, p) => m.Description.Contains(parm.Description)
!string.IsNullOrEmpty(parm.Description), )
(m, p) => m.Description.Contains(parm.Description) .WhereIF(
) !string.IsNullOrEmpty(parm.Partnumber),
.WhereIF( (m, p) => m.Partnumber.Contains(parm.Partnumber)
!string.IsNullOrEmpty(parm.Partnumber), )
(m, p) => m.Partnumber.Contains(parm.Partnumber) .Where((m, p) => m.Status == 1)
) .Where((m, p) => m.Type == 1)
.Where((m, p) => m.Status == 1) // .WhereIF(string.IsNullOrEmpty(parm.Partnumber), (m, p) => p.Status == 1)
.Where((m, p) => m.Type == 1) .OrderBy((m, p) => m.Description)
// .WhereIF(string.IsNullOrEmpty(parm.Partnumber), (m, p) => p.Status == 1) .Select(
.OrderBy((m, p) => m.Description) (m, p) =>
.Select( new WmOneTimeInventoryDto
(m, p) => {
new WmOneTimeInventoryDto RealQuantity = 0,
{ Partnumber = m.Partnumber,
RealQuantity = 0, Color = m.Color,
Partnumber = m.Partnumber, Specification = m.Specification,
Color = m.Color, Description = m.Description,
Specification = m.Specification, Id = p.Id ?? m.Id,
Description = m.Description, BlankNum = p.BlankNum,
Id = p.Id ?? m.Id, Quantity = p.Quantity ?? 0,
BlankNum = p.BlankNum, MaxNum = p.MaxNum,
Quantity = p.Quantity ?? 0, MinNum = p.MinNum,
MaxNum = p.MaxNum, WarnNum = p.WarnNum,
MinNum = p.MinNum, Type = p.Type ?? 1,
WarnNum = p.WarnNum, Status = p.Status,
Type = p.Type ?? 1, Remark = p.Remark,
Status = p.Status, CreatedBy = p.CreatedBy,
Remark = p.Remark, CreatedTime = p.CreatedTime,
CreatedBy = p.CreatedBy, UpdatedBy = p.UpdatedBy,
CreatedTime = p.CreatedTime, UpdatedTime = p.UpdatedTime,
UpdatedBy = p.UpdatedBy, }
UpdatedTime = p.UpdatedTime, )
} .ToList();
) //TODO 取出库存表 WmOneTimeInventory 最小CreatedTime时间
.ToList(); DateTime minDateTime =
//TODO 取出库存表 WmOneTimeInventory 最小CreatedTime时间 Context
DateTime minDateTime = .Queryable<WmOneTimeInventory>()
Context .OrderBy(it => it.CreatedTime)
.Queryable<WmOneTimeInventory>() .Select(it => it.CreatedTime)
.OrderBy(it => it.CreatedTime) .First() ?? DateTime.Now;
.Select(it => it.CreatedTime) //TODO 根据时间范围取出所有记录数据
.First() ?? DateTime.Now; List<WmOneTimeRecord> wmOneTimeRecords = Context
//TODO 根据时间范围取出所有记录数据 .Queryable<WmOneTimeRecord>()
List<WmOneTimeRecord> wmOneTimeRecords = Context //.Where(it => it.Code == "自动")
.Queryable<WmOneTimeRecord>() .Where(it => it.ActionTime >= minDateTime)
//.Where(it => it.Code == "自动") .ToList();
.Where(it => it.ActionTime >= minDateTime)
.ToList();
foreach (WmOneTimeInventoryDto item in list) foreach (WmOneTimeInventoryDto item in list)
{ {
int? runum = wmOneTimeRecords int? runum = wmOneTimeRecords
.Where(o => .Where(o =>
o.ActionTime >= item.CreatedTime o.ActionTime >= item.CreatedTime
&& o.Partnumber == item.Partnumber && o.Partnumber == item.Partnumber
&& o.ChangeType == 1 && o.ChangeType == 1
) )
.Select(o => o.ChangeQuantity) .Select(o => o.ChangeQuantity)
.Sum(); .Sum();
int? chunum = wmOneTimeRecords int? chunum = wmOneTimeRecords
.Where(o => .Where(o =>
o.ActionTime >= item.CreatedTime o.ActionTime >= item.CreatedTime
&& o.Partnumber == item.Partnumber && o.Partnumber == item.Partnumber
&& o.ChangeType == 2 && o.ChangeType == 2
) )
.Select(o => o.ChangeQuantity) .Select(o => o.ChangeQuantity)
.Sum(); .Sum();
item.RealQuantity = item.Quantity.Value + (runum.Value - chunum.Value); item.RealQuantity = item.Quantity.Value + (runum.Value - chunum.Value);
} }
list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0) list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0)
.Where(it => !string.IsNullOrEmpty(it.Partnumber)) .Where(it => !string.IsNullOrEmpty(it.Partnumber))
.DistinctBy(it => it.Partnumber) .DistinctBy(it => it.Partnumber)
.OrderBy(it => it.RealQuantity) .OrderBy(it => it.RealQuantity)
.ToList(); .ToList();
int total = list.Count; int total = list.Count;
// 仓库总盘点零件数 // 仓库总盘点零件数
int StocktakingTotal = int StocktakingTotal =
Context.Queryable<WmOneTimeInventory>().Sum(it => it.Quantity) ?? 0; Context.Queryable<WmOneTimeInventory>().Sum(it => it.Quantity) ?? 0;
// 仓库当前查询盘点零件数 // 仓库当前查询盘点零件数
int QuantitySum = list.Sum(it => it.Quantity) ?? 0; int QuantitySum = list.Sum(it => it.Quantity) ?? 0;
// 仓库当前查询实际零件数 // 仓库当前查询实际零件数
int RealQuantitySum = list.Sum(it => it.RealQuantity); int RealQuantitySum = list.Sum(it => it.RealQuantity);
WmOneTimeInventoryTableDto response = WmOneTimeInventoryTableDto response =
new() new()
{ {
Total = total, Total = total,
StocktakingTotal = StocktakingTotal, StocktakingTotal = StocktakingTotal,
QuantitySum = QuantitySum, QuantitySum = QuantitySum,
RealQuantitySum = RealQuantitySum, RealQuantitySum = RealQuantitySum,
MinStocktakingTime = minDateTime, MinStocktakingTime = minDateTime,
Result = list.Skip((parm.PageNum - 1) * parm.PageSize) Result = list.Skip((parm.PageNum - 1) * parm.PageSize)
.Take(parm.PageSize) .Take(parm.PageSize)
.ToList(), .ToList(),
}; };
return response; return response;
}
/// <summary>
} /// 获取详情
/// </summary>
/// <summary> /// <param name="Id"></param>
/// 获取详情 /// <returns></returns>
/// </summary> public WmOneTimeInventory GetInfo(string Id)
/// <param name="Id"></param>
/// <returns></returns>
public WmOneTimeInventory GetInfo(string Id)
{ {
var response = Queryable().Where(x => x.Id == Id).First(); 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); .First() ?? new DateTime(2024, 11, 16, 12, 0, 0);
// DateTime // DateTime
CommonFQCService commonFQCService = new(); CommonFQCService commonFQCService = new();
// 获取报表数据 // 获取报表数据
// 一次合格计算后库存 = 盘点库存 + 产线合格 + 抛光合格 - gp12投入 - 后道直接出库 // 一次合格计算后库存 = 盘点库存 + 产线合格 + 抛光合格 - gp12投入 - 后道直接出库
//return commonFQCService.GetBatchOneTimePartRealStock(partnumbers, checkTime.Value); //return commonFQCService.GetBatchOneTimePartRealStock(partnumbers, checkTime.Value);
return commonFQCService.GetBatchOneTimePartRealStockNew(partnumbers, checkTime.Value); return commonFQCService.GetBatchOneTimePartRealStockNew(
} partnumbers,
checkTime.Value
);
}
catch (Exception e) catch (Exception e)
{ {
throw; throw;
@ -832,5 +831,141 @@ namespace ZR.Service.mes.wms
return (msg, x.ErrorList, x.IgnoreList); return (msg, x.ErrorList, x.IgnoreList);
} }
public List<ErrorCheckTableDto> CheckErrorTable()
{
List<ErrorCheckTableDto> errorCheckTableDtos = new List<ErrorCheckTableDto>();
// 盘点数据的零件号与物料内零件号不匹配异常进行检查
// 获取物料列表并将零件号提取到 HashSet 中以进行快速查找
HashSet<string> materialPartnumbers =
new(GetWmMaterialList("").Select(m => m.Partnumber));
List<WmOneTimeInventory> oneTimeInventoryList = Context
.Queryable<WmOneTimeInventory>()
.ToList();
List<WmPolishInventory> polishInventoryList = Context
.Queryable<WmPolishInventory>()
.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<WmOneTimeRecord> oneTimeRecordList = Context
.Queryable<WmOneTimeRecord>()
.Where(it => it.ActionTime >= minOneTimeStocktakingTime)
.ToList();
List<WmPolishRecord> polishRecordList = Context
.Queryable<WmPolishRecord>()
.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<string> oneTimeInventoryPartnumbers = new HashSet<string>(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<string> polishInventoryPartnumbers = new HashSet<string>(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;
}
} }
} }

View File

@ -116,6 +116,7 @@ namespace ZR.Tasks.TaskScheduler
.And(it => it.Year == year) .And(it => it.Year == year)
.And(it => it.Week == week) .And(it => it.Week == week)
.And(it => it.Date == date) .And(it => it.Date == date)
.And(it => !it.Remark1.Contains("不扣"))
.And(it => it.Remark2.Contains("调试")) .And(it => it.Remark2.Contains("调试"))
// .And(it => it.Remark3 == "是") // .And(it => it.Remark3 == "是")
.ToExpression(); .ToExpression();