using DOAN.Model.MES.product;
using DOAN.Model.MES.product.Dto;
using DOAN.Service.MES.product.IService;
using Infrastructure;
using Infrastructure.Attribute;
using linesider_screen_tool;
using Microsoft.AspNetCore.Routing.Template;
namespace DOAN.Service.MES.product
{
///
/// 工单工具服务
///
[AppService(
ServiceType = typeof(IProWorkorderUtilityService),
ServiceLifetime = LifeTime.Transient
)]
public class ProWorkorderUtilityService : BaseService, IProWorkorderUtilityService
{
private readonly BartenderPrintHelper _printHelper = new();
///
/// 生成工单号
///
///
///
public int Generate_workorder(ProWorkorderQueryDto2 parm)
{
DateTime update_time = parm.WorkorderDate.ToLocalTime().Date;
List proWorkorderList = Context
.Queryable()
.Where(it => it.WorkorderDate == update_time)
.Where(it => it.Status == 1)
.OrderBy(it => it.Sort)
.ToList();
string maxs = Context
.Queryable()
.Where(it => it.WorkorderDate == update_time)
.Where(it => it.Status == 3)
.Max(it => it.Workorder);
if (proWorkorderList != null && proWorkorderList.Count() > 0)
{
string baseSort = update_time.ToString("yyyyMMdd");
int index = 1;
if (!string.IsNullOrEmpty(maxs))
{
index = Convert.ToInt32(maxs.Substring(maxs.Length - 3)) + 1;
}
foreach (ProWorkorder item in proWorkorderList)
{
item.Workorder = baseSort + index.ToString("000");
item.Sort = index * 10;
index++;
}
}
return Context.Updateable(proWorkorderList).ExecuteCommand();
}
///
/// 移动工单
///
///
///
///
public int MoveWorkorder(string id, int type)
{
int result = 0;
try
{
// 获取要移动的工单
ProWorkorder toMove = Context
.Queryable()
.Where(it => it.Id == id)
.First();
// 检查工单是否存在
if (toMove == null)
{
return result;
}
// 检查Sort值是否存在
if (!toMove.Sort.HasValue)
{
return result;
}
ProWorkorder exchange = null;
// 上移动:找到Sort值小于当前工单的最大Sort值的工单
if (type == 1)
{
exchange = Context
.Queryable()
.Where(it => it.WorkorderDate == toMove.WorkorderDate)
.Where(it => it.PlanNum > 0)
.Where(it => it.Sort.HasValue && it.Sort < toMove.Sort)
.OrderByDescending(it => it.Sort)
.First();
}
// 下移:找到Sort值大于当前工单的最小Sort值的工单
else if (type == 2)
{
exchange = Context
.Queryable()
.Where(it => it.WorkorderDate == toMove.WorkorderDate)
.Where(it => it.PlanNum > 0)
.Where(it => it.Sort.HasValue && it.Sort > toMove.Sort)
.OrderBy(it => it.Sort)
.First();
}
// 检查交换工单是否存在
if (exchange != null && exchange.Sort.HasValue)
{
// 使用事务确保两个工单的Sort值同时更新
UseTran2(() =>
{
// 交换Sort值
int temp = toMove.Sort.Value;
toMove.Sort = exchange.Sort;
exchange.Sort = temp;
// 更新工单
result += Context.Updateable(toMove).ExecuteCommand();
result += Context.Updateable(exchange).ExecuteCommand();
});
}
}
catch (Exception ex)
{
// 记录错误日志
Console.WriteLine($"移动工单时出错: {ex.Message}");
}
return result;
}
///
/// 查询BOM及其所需数量
///
///
///
public List SearchBOMNum(string workorder_num)
{
// 这里需要实现BOM查询逻辑
// 暂时返回空列表
return new List();
}
///
/// 工单变更日志
///
///
///
///
///
public List WorkOrderLog(string workorder)
{
var result = Context
.Queryable()
.Where(it => it.Workorder == workorder)
.OrderByDescending(it => it.ChangeTime)
.ToList();
return result;
}
///
/// 导出PDF
///
///
///
public Task<(string, Stream)> ExportPDFByQuestPDFDemo(string[] workorderArray)
{
// 这里需要实现PDF导出逻辑
// 暂时返回空结果
return Task.FromResult(("", (Stream)new MemoryStream()));
}
///
/// 打印工单
///
///
///
public string PrintTicketsByTemplate(ProWorkorderExportDto param)
{
try
{
string templatePath = param.Path;
if (string.IsNullOrEmpty(templatePath))
{
return "标签地址传入为空!";
}
// 检查文件是否存在
if (!File.Exists(templatePath))
{
return $"标签文件不存在: {templatePath}";
}
// 获取标签中的变量名
var subString = _printHelper.GetNamedSubStrings(templatePath: templatePath);
// 检查是否成功获取到标签变量
if (subString == null || subString.Result == null || subString.Result.Count == 0)
{
return $"无法获取标签变量: {templatePath}";
}
// 获取工单信息
List workorders = Context
.Queryable()
.Where(it => param.WorkorderArray.Contains(it.Workorder))
.ToList();
if (workorders.Count == 0)
{
return "未找到指定的工单信息!";
}
// 对每个工单执行打印
int successCount = 0;
foreach (ProWorkorder workorder in workorders)
{
try
{
// 为每个工单生成标签参数
Dictionary parameters = new Dictionary
{
{ "workorder", workorder.Workorder },
{ "stoveCode", workorder.StoveCode },
{ "qty", workorder.PlanNum.ToString() },
//{ "productionName", workorder.productionName },
//{ "productionCode", workorder.productionCode },
//{ "materialCode", workorder.MaterialCode },
//{ "drawingCode", workorder.DrawingCode }
};
// 过滤出标签中存在的参数
var intersect = parameters.Where(x => subString.Result.Contains(x.Key)).ToDictionary(
x => x.Key, x => x.Value);
// 执行打印
bool printSuccess = _printHelper.PrintLabel(
templatePath: templatePath,
subStringValues: intersect);
if (printSuccess)
{
successCount++;
}
}
catch (Exception ex)
{
// 记录单个工单打印失败的异常,但继续打印其他工单
Console.WriteLine($"打印工单 {workorder.Workorder} 失败: {ex.Message}");
}
}
if (successCount > 0)
{
return $"ok";
}
else
{
return $"工单标签打印失败: {templatePath}";
}
}
catch (Exception ex)
{
return $"打印失败: {ex.Message}";
}
}
}
}