fix(物料管理): 修复批次号默认值问题并优化工单导入逻辑

修复QcScrapRecordsService和ReportFlowService中批次号默认值为"000"的问题,改为使用实际批次号
重构ProWorkorderImportService中的工单编号生成逻辑,改为按导入顺序生成而非按产品分组
完善IProWorkorderMaterialService接口定义,增加参数并调整方法位置
优化ProWorkorderMaterialService中的库存查询方法,增加过滤条件和参数
This commit is contained in:
2026-03-02 11:32:13 +08:00
parent b68a277d8e
commit dc8cb4053d
5 changed files with 290 additions and 260 deletions

View File

@@ -108,6 +108,32 @@ namespace DOAN.Service.MES.product
return workorderNumbers.Count > 0 ? workorderNumbers.Max() : 0;
}
/// <summary>
/// 获取当天所有工单的最大编号索引
/// </summary>
/// <param name="dateValue">日期值</param>
/// <returns>最大编号索引</returns>
private int GetMaxWorkorderIndex(DateTime dateValue)
{
var workorderNumbers = Context
.Queryable<ProWorkorder>()
.Where(it => it.WorkorderDate == dateValue.Date)
.Select(it => it.Workorder)
.ToList()
.Where(w => w.StartsWith(dateValue.ToString("yyyyMMdd")))
.Select(w =>
{
var parts = w.Split('_');
if (parts.Length >= 4 && int.TryParse(parts[3], out int index))
return index;
return 0;
})
.ToList();
// 如果没有找到记录返回0
return workorderNumbers.Count > 0 ? workorderNumbers.Max() : 0;
}
/// <summary>
/// 从Excel文件读取工单数据
/// </summary>
@@ -419,17 +445,16 @@ namespace DOAN.Service.MES.product
workorderList = ReadWorkordersFromExcel(formFile, username, out dateValue);
Logger.Info($"读取到 {workorderList.Count} 条工单数据");
// 按productionCode分组并顺序编号
// 先按productionCode分组确保同一产品的工单连续排序
var productionCodeGroups = workorderList
.GroupBy(w => w.productionCode)
.ToList();
// 获取当天所有工单的最大编号索引,用于后续编号
int maxIndex = GetMaxWorkorderIndex(dateValue);
// 从最大编号+1开始顺序编号
int currentIndex = maxIndex + 1;
Logger.Info($"当天所有工单最大编号索引: {maxIndex},开始编号: {currentIndex}");
// 获取所有工单的最大sort值用于后续排序
var maxSortNullable = Context
.Queryable<ProWorkorder>()
.Where(it => it.WorkorderDate == dateValue.Date)
//.Select(it => it.Sort)
.Max(it => it.Sort);
// 如果没有找到记录设置默认值0
@@ -438,33 +463,24 @@ namespace DOAN.Service.MES.product
// 从maxSort + 10开始确保sort值按10、20、30...递增
int currentSort = (maxSort / 10) * 10 + 10;
foreach (var group in productionCodeGroups)
// 直接按照Excel导入顺序生成工单号
foreach (var workorder in workorderList)
{
Logger.Info($"处理产品代码: {group.Key},共 {group.Count()} 条工单");
// 获取当前productionCode当天已有的最大编号
int maxIndex = GetMaxWorkorderIndex(group.Key, dateValue);
// 从最大编号+1开始顺序编号
int currentIndex = maxIndex + 1;
Logger.Info($"产品代码: {group.Key},当前最大编号索引: {maxIndex},开始编号: {currentIndex}");
string nickCode = mmMaterials
.Where(it => it.MaterialCode == workorder.productionCode)
.Select(it => it.Type)
.FirstOrDefault();
foreach (var workorder in group)
{
string nickCode = mmMaterials
.Where(it => it.MaterialCode == workorder.productionCode)
.Select(it => it.Type)
.FirstOrDefault();
// 生成唯一的工单编号
var generateResult = GenerateUniqueWorkorderNo(workorder, dateValue, currentIndex, nickCode);
workorder.Workorder = generateResult.Item1;
// 使用连续的sort值不受编号冲突影响
workorder.Sort = currentSort;
// 生成唯一的工单编号
var generateResult = GenerateUniqueWorkorderNo(workorder, dateValue, currentIndex, nickCode);
workorder.Workorder = generateResult.Item1;
// 使用连续的sort值不受编号冲突影响
workorder.Sort = currentSort;
Logger.Info($"生成工单编号: {workorder.Workorder},产品: {workorder.productionName}sort: {currentSort}");
currentIndex = generateResult.Item2 + 1;
// 增加sort值确保下一个工单的sort值为当前值+10
currentSort += 10;
}
Logger.Info($"生成工单编号: {workorder.Workorder},产品: {workorder.productionName}sort: {currentSort}");
currentIndex = generateResult.Item2 + 1;
// 增加sort值确保下一个工单的sort值为当前值+10
currentSort += 10;
}
UseTran2(() =>
@@ -511,14 +527,16 @@ namespace DOAN.Service.MES.product
workorderList = ReadWorkordersFromExcel(formFile, username, out dateValue);
Logger.Info($"读取到 {workorderList.Count} 条工单数据");
// 按productionCode分组并顺序编号
var productionCodeGroups = workorderList.GroupBy(w => w.productionCode).ToList();
// 获取当天所有工单的最大编号索引,用于后续编号
int maxIndex = GetMaxWorkorderIndex(dateValue);
// 从最大编号+1开始顺序编号
int currentIndex = maxIndex + 1;
Logger.Info($"当天所有工单最大编号索引: {maxIndex},开始编号: {currentIndex}");
// 获取所有工单的最大sort值用于后续排序
var maxSortNullable = Context
.Queryable<ProWorkorder>()
.Where(it => it.WorkorderDate == dateValue.Date)
//.Select(it => it.Sort)
.Max(it => it.Sort);
// 如果没有找到记录设置默认值0
@@ -527,33 +545,24 @@ namespace DOAN.Service.MES.product
// 从maxSort + 10开始确保sort值按10、20、30...递增
int currentSort = (maxSort / 10) * 10 + 10;
foreach (var group in productionCodeGroups)
// 直接按照Excel导入顺序生成工单号
foreach (var workorder in workorderList)
{
Logger.Info($"处理产品代码: {group.Key},共 {group.Count()} 条工单");
// 获取当前productionCode当天已有的最大编号
int maxIndex = GetMaxWorkorderIndex(group.Key, dateValue);
// 从最大编号+1开始顺序编号
int currentIndex = maxIndex + 1;
Logger.Info($"产品代码: {group.Key},当前最大编号索引: {maxIndex},开始编号: {currentIndex}");
string nickCode = mmMaterials
.Where(it => it.MaterialCode == workorder.productionCode)
.Select(it => it.Type)
.FirstOrDefault();
foreach (var workorder in group)
{
string nickCode = mmMaterials
.Where(it => it.MaterialCode == workorder.productionCode)
.Select(it => it.Type)
.FirstOrDefault();
// 生成唯一的工单编号
var generateResult = GenerateUniqueWorkorderNo(workorder, dateValue, currentIndex, nickCode);
workorder.Workorder = generateResult.Item1;
// 使用连续的sort值不受编号冲突影响
workorder.Sort = currentSort;
// 生成唯一的工单编号
var generateResult = GenerateUniqueWorkorderNo(workorder, dateValue, currentIndex, nickCode);
workorder.Workorder = generateResult.Item1;
// 使用连续的sort值不受编号冲突影响
workorder.Sort = currentSort;
Logger.Info($"生成工单编号: {workorder.Workorder},产品: {workorder.productionName}sort: {currentSort}");
currentIndex = generateResult.Item2 + 1;
// 增加sort值确保下一个工单的sort值为当前值+10
currentSort += 10;
}
Logger.Info($"生成工单编号: {workorder.Workorder},产品: {workorder.productionName}sort: {currentSort}");
currentIndex = generateResult.Item2 + 1;
// 增加sort值确保下一个工单的sort值为当前值+10
currentSort += 10;
}
UseTran2(() =>