fix(物料管理): 修复批次号默认值问题并优化工单导入逻辑
修复QcScrapRecordsService和ReportFlowService中批次号默认值为"000"的问题,改为使用实际批次号 重构ProWorkorderImportService中的工单编号生成逻辑,改为按导入顺序生成而非按产品分组 完善IProWorkorderMaterialService接口定义,增加参数并调整方法位置 优化ProWorkorderMaterialService中的库存查询方法,增加过滤条件和参数
This commit is contained in:
@@ -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(() =>
|
||||
|
||||
Reference in New Issue
Block a user