diff --git a/DOAN.Admin.WebApi/Controllers/MES/Product/ProWorkorderController.cs b/DOAN.Admin.WebApi/Controllers/MES/Product/ProWorkorderController.cs
index febe041..531025a 100644
--- a/DOAN.Admin.WebApi/Controllers/MES/Product/ProWorkorderController.cs
+++ b/DOAN.Admin.WebApi/Controllers/MES/Product/ProWorkorderController.cs
@@ -36,8 +36,6 @@ namespace DOAN.Admin.WebApi.Controllers
[ActionPermissionFilter(Permission = "productManagement:proworkorder:list")]
public IActionResult QueryProWorkorder([FromBody] ProWorkorderQueryDto parm)
{
-
-
var response = _ProWorkorderService.GetList(parm);
return SUCCESS(response);
}
@@ -52,13 +50,12 @@ namespace DOAN.Admin.WebApi.Controllers
public IActionResult QueryProWorkorder_NOCheck([FromBody] ProWorkorderQueryDto parm)
{
parm.WorkorderDate[0] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[0]);
- parm.WorkorderDate[1]= DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[1]);
-
+ parm.WorkorderDate[1] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[1]);
+
var response = _ProWorkorderService.GetList_NOCheck(parm);
return SUCCESS(response);
}
-
///
/// 查询生产工单详情
///
@@ -75,7 +72,7 @@ namespace DOAN.Admin.WebApi.Controllers
}
///
- /// 添加生产工单
+ /// 添加生产工单
///
///
[HttpPost]
@@ -115,7 +112,10 @@ namespace DOAN.Admin.WebApi.Controllers
public IActionResult DeleteProWorkorder(string ids)
{
string[] idsArr = Tools.SpitStrArrary(ids);
- if (idsArr.Length <= 0) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); }
+ if (idsArr.Length <= 0)
+ {
+ return ToResponse(ApiResult.Error($"删除失败Id 不能为空"));
+ }
var response = _ProWorkorderService.Delete(idsArr);
@@ -140,7 +140,6 @@ namespace DOAN.Admin.WebApi.Controllers
// return SUCCESS(response);
//}
-
///
/// 插入工单/或者新增工单 启用(9/14)
///
@@ -159,8 +158,6 @@ namespace DOAN.Admin.WebApi.Controllers
var response = _ProWorkorderService.Insert_workOrder(newparm, parm.next_id);
return SUCCESS(response);
-
-
}
///
@@ -186,7 +183,12 @@ namespace DOAN.Admin.WebApi.Controllers
///
///
[HttpGet("importTemplate")]
- [Log(Title = "生产工单导入模板", BusinessType = BusinessType.EXPORT, IsSaveRequestData = true, IsSaveResponseData = false)]
+ [Log(
+ Title = "生产工单导入模板",
+ BusinessType = BusinessType.EXPORT,
+ IsSaveRequestData = true,
+ IsSaveResponseData = false
+ )]
[AllowAnonymous]
public IActionResult ImportTemplateExcel()
{
@@ -200,11 +202,15 @@ namespace DOAN.Admin.WebApi.Controllers
/// 使用IFromFile必须使用name属性否则获取不到文件
/// 导入成功数 若-1 则excel读取异常
[HttpPost("importData")]
- [Log(Title = "生产工单导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false, IsSaveResponseData = true)]
+ [Log(
+ Title = "生产工单导入",
+ BusinessType = BusinessType.IMPORT,
+ IsSaveRequestData = false,
+ IsSaveResponseData = true
+ )]
[AllowAnonymous]
public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
{
-
if (formFile == null)
{
return SUCCESS(null);
@@ -212,18 +218,19 @@ namespace DOAN.Admin.WebApi.Controllers
int response = _ProWorkorderService.ImportData(formFile, HttpContext.GetName());
return SUCCESS(response);
-
-
-
}
//TODO 分批导入工单,追加工单
[HttpPost("importData_append")]
- [Log(Title = "生产工单导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false, IsSaveResponseData = true)]
+ [Log(
+ Title = "生产工单导入",
+ BusinessType = BusinessType.IMPORT,
+ IsSaveRequestData = false,
+ IsSaveResponseData = true
+ )]
[AllowAnonymous]
public IActionResult ImportDataAppend([FromForm(Name = "file")] IFormFile formFile)
{
-
if (formFile == null)
{
return SUCCESS(null);
@@ -231,12 +238,8 @@ namespace DOAN.Admin.WebApi.Controllers
int response = _ProWorkorderService.ImportDataAppend(formFile, HttpContext.GetName());
return SUCCESS(response);
-
-
-
}
-
///
/// 工单导出 启用(9/14)
///
@@ -251,9 +254,9 @@ namespace DOAN.Admin.WebApi.Controllers
{
return SUCCESS(null);
}
- var list = _ProWorkorderService.WorkOrderExport(extportDate, new PagerInfo(1, 10000));
+ var list = _ProWorkorderService.WorkOrderExport(extportDate);
- var result = ExportExcelMini(list.Result, "workorder", "工单列表");
+ var result = ExportExcelMini(list, "workorder", "工单列表");
return ExportExcel(result.Item2, result.Item1);
}
@@ -267,10 +270,8 @@ namespace DOAN.Admin.WebApi.Controllers
}
var response = _ProWorkorderService.GetMaterialInfo(query);
return SUCCESS(response);
-
}
-
//TODO 获取客户
[HttpPost("get_custom")]
public IActionResult GetCustomInfo([FromBody] BaseCustomQueryDto2 parm)
@@ -283,7 +284,6 @@ namespace DOAN.Admin.WebApi.Controllers
return SUCCESS(response);
}
-
//TODO 获取指定日期工艺路线
[HttpGet("get_process_route")]
public IActionResult GetProcessRoute(DateTime dateTime)
@@ -291,7 +291,6 @@ namespace DOAN.Admin.WebApi.Controllers
if (dateTime == DateTime.MinValue)
{
return SUCCESS(null);
-
}
var response = _ProWorkorderService.GetProcessRoute(dateTime);
@@ -338,37 +337,44 @@ namespace DOAN.Admin.WebApi.Controllers
[HttpGet("search_BOM_num")]
public IActionResult SearchBOMNum(string workorder_num)
{
- if (string.IsNullOrEmpty(workorder_num)) { return SUCCESS(null); }
+ if (string.IsNullOrEmpty(workorder_num))
+ {
+ return SUCCESS(null);
+ }
var response = _ProWorkorderService.SearchBOMNum(workorder_num);
return SUCCESS(response);
-
-
}
//TODO 工单变更日志
[HttpGet("workorder_log")]
public IActionResult WorkOrderLog(string workorder, string log)
{
- if (string.IsNullOrEmpty(workorder)) { return SUCCESS(null); }
+ if (string.IsNullOrEmpty(workorder))
+ {
+ return SUCCESS(null);
+ }
var response = _ProWorkorderService.WorkOrderLog(workorder, log, HttpContext.GetName());
return SUCCESS(response);
}
//TODO 获取工单进度追溯
[HttpPost("get_workorder_trace_progress")]
- public IActionResult GetWorkorderTraceProgressList([FromBody]ProWorkorderQueryDto query)
+ public IActionResult GetWorkorderTraceProgressList([FromBody] ProWorkorderQueryDto query)
{
query.WorkorderDate[0] = DOANConvertDate.ConvertLocalDate(query.WorkorderDate[0]);
query.WorkorderDate[1] = DOANConvertDate.ConvertLocalDate(query.WorkorderDate[1]);
- if (query == null) { throw new Exception("query为空"); }
- var response= _ProWorkorderService.GetWorkorderTraceProgressList(query);
+ if (query == null)
+ {
+ throw new Exception("query为空");
+ }
+ var response = _ProWorkorderService.GetWorkorderTraceProgressList(query);
return SUCCESS(response);
}
//TODO 打印机打印工单
-
+
[HttpPost("print")]
[AllowAnonymous]
public async Task ExportWorkorderPDF([FromBody] ProWorkorderExportDto param)
@@ -390,12 +396,6 @@ namespace DOAN.Admin.WebApi.Controllers
{
return ToResponse(500, ex.Message);
}
-
-
-
}
-
-
-
}
}
diff --git a/DOAN.Service/MES/Product/IService/IProWorkorderCoreService.cs b/DOAN.Service/MES/Product/IService/IProWorkorderCoreService.cs
new file mode 100644
index 0000000..cf3eec5
--- /dev/null
+++ b/DOAN.Service/MES/Product/IService/IProWorkorderCoreService.cs
@@ -0,0 +1,48 @@
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+
+namespace DOAN.Service.MES.product.IService
+{
+ ///
+ /// 核心工单管理服务接口
+ ///
+ public interface IProWorkorderCoreService
+ {
+ ///
+ /// 获取工单详情
+ ///
+ ///
+ ///
+ ProWorkorder GetInfo(string Id);
+
+ ///
+ /// 添加生产工单
+ ///
+ ///
+ ///
+ ProWorkorder AddProWorkorder(ProWorkorder model);
+
+ ///
+ /// 修改生产工单
+ ///
+ ///
+ ///
+ int UpdateProWorkorder(ProWorkorder model);
+
+ ///
+ /// 插入工单、新增工单
+ ///
+ ///
+ ///
+ ///
+ int Insert_workOrder(ProWorkorder proWorkorder, string next_id);
+
+ ///
+ /// 插入工单2
+ ///
+ ///
+ ///
+ ///
+ int Insert_workOrder2(ProWorkorder proWorkorder, string next_id);
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/IService/IProWorkorderExportService.cs b/DOAN.Service/MES/Product/IService/IProWorkorderExportService.cs
new file mode 100644
index 0000000..c258527
--- /dev/null
+++ b/DOAN.Service/MES/Product/IService/IProWorkorderExportService.cs
@@ -0,0 +1,18 @@
+using DOAN.Model.MES.product;
+
+namespace DOAN.Service.MES.product.IService
+{
+ ///
+ /// 工单导出服务接口
+ ///
+ public interface IProWorkorderExportService
+ {
+ ///
+ /// 工单导出
+ ///
+ ///
+ ///
+ ///
+ List WorkOrderExport(DateTime exportTime);
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/IService/IProWorkorderImportService.cs b/DOAN.Service/MES/Product/IService/IProWorkorderImportService.cs
new file mode 100644
index 0000000..7420be6
--- /dev/null
+++ b/DOAN.Service/MES/Product/IService/IProWorkorderImportService.cs
@@ -0,0 +1,26 @@
+using Microsoft.AspNetCore.Http;
+
+namespace DOAN.Service.MES.product.IService
+{
+ ///
+ /// 工单导入服务接口
+ ///
+ public interface IProWorkorderImportService
+ {
+ ///
+ /// 导入工单 必须整删除 整改
+ ///
+ ///
+ ///
+ ///
+ int ImportData(IFormFile formFile, string username);
+
+ ///
+ /// 分批导入,追加导入
+ ///
+ ///
+ ///
+ ///
+ int ImportDataAppend(IFormFile formFile, string username);
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/IService/IProWorkorderQueryService.cs b/DOAN.Service/MES/Product/IService/IProWorkorderQueryService.cs
new file mode 100644
index 0000000..9f3e583
--- /dev/null
+++ b/DOAN.Service/MES/Product/IService/IProWorkorderQueryService.cs
@@ -0,0 +1,46 @@
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+
+namespace DOAN.Service.MES.product.IService
+{
+ ///
+ /// 工单查询服务接口
+ ///
+ public interface IProWorkorderQueryService
+ {
+ ///
+ /// 查询生产工单列表
+ ///
+ ///
+ ///
+ PagedInfo GetList(ProWorkorderQueryDto parm);
+
+ ///
+ /// 获取工单无校验
+ ///
+ ///
+ ///
+ PagedInfo GetList_NOCheck(ProWorkorderQueryDto parm);
+
+ ///
+ /// 获取详情
+ ///
+ ///
+ ///
+ ProWorkorder GetInfo(string Id);
+
+ ///
+ /// 获取工单进度跟踪列表
+ ///
+ ///
+ ///
+ PagedInfo GetWorkorderTraceProgressList(ProWorkorderQueryDto query);
+
+ ///
+ /// 查询BOM 及其所需数量
+ ///
+ ///
+ ///
+ List SearchBOMNum(string workorder_num);
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/IService/IProWorkorderReferenceService.cs b/DOAN.Service/MES/Product/IService/IProWorkorderReferenceService.cs
new file mode 100644
index 0000000..0f38dc6
--- /dev/null
+++ b/DOAN.Service/MES/Product/IService/IProWorkorderReferenceService.cs
@@ -0,0 +1,45 @@
+using DOAN.Model.MES.base_;
+using DOAN.Model.MES.base_.Dto;
+using DOAN.Model.MES.product.Dto;
+
+namespace DOAN.Service.MES.product.IService
+{
+ ///
+ /// 参考数据服务接口
+ ///
+ public interface IProWorkorderReferenceService
+ {
+ ///
+ /// 获取物料信息
+ ///
+ ///
+ ///
+ List GetMaterialInfo(BaseMaterialListQueryDto5 parm);
+
+ ///
+ /// 获取客户信息
+ ///
+ ///
+ ///
+ List GetCustomInfo(BaseCustomQueryDto2 parm);
+
+ ///
+ /// 获取所有工艺路线
+ ///
+ ///
+ List GetAllRoute();
+
+ ///
+ /// 获取班组
+ ///
+ ///
+ List GetGroupList();
+
+ ///
+ /// 获取工艺路线
+ ///
+ ///
+ ///
+ List GetProcessRoute(DateTime dateTime);
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/IService/IProWorkorderService.cs b/DOAN.Service/MES/Product/IService/IProWorkorderService.cs
index 986d672..f37d255 100644
--- a/DOAN.Service/MES/Product/IService/IProWorkorderService.cs
+++ b/DOAN.Service/MES/Product/IService/IProWorkorderService.cs
@@ -44,7 +44,7 @@ namespace DOAN.Service.MES.product.IService
int ImportDataAppend(IFormFile formFile,string username);
- public PagedInfo WorkOrderExport(DateTime exportTime, PagerInfo pager);
+ public List WorkOrderExport(DateTime exportTime);
List GetMaterialInfo(BaseMaterialListQueryDto5 parm);
List GetCustomInfo(BaseCustomQueryDto2 parm);
diff --git a/DOAN.Service/MES/Product/IService/IProWorkorderUtilityService.cs b/DOAN.Service/MES/Product/IService/IProWorkorderUtilityService.cs
new file mode 100644
index 0000000..a400951
--- /dev/null
+++ b/DOAN.Service/MES/Product/IService/IProWorkorderUtilityService.cs
@@ -0,0 +1,59 @@
+using System.IO;
+using System.Threading.Tasks;
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+using Infrastructure;
+
+namespace DOAN.Service.MES.product.IService
+{
+ ///
+ /// 工单工具服务接口
+ ///
+ public interface IProWorkorderUtilityService
+ {
+ ///
+ /// 生成工单号
+ ///
+ ///
+ ///
+ int Generate_workorder(ProWorkorderQueryDto2 parm);
+
+ ///
+ /// 移动工单
+ ///
+ ///
+ ///
+ ///
+ int MoveWorkorder(string id, int type);
+
+ ///
+ /// 查询BOM及其所需数量
+ ///
+ ///
+ ///
+ List SearchBOMNum(string workorder_num);
+
+ ///
+ /// 工单日志
+ ///
+ ///
+ ///
+ ///
+ ///
+ int WorkOrderLog(string workorder, string log, string Operator);
+
+ ///
+ /// 导出PDF
+ ///
+ ///
+ ///
+ Task<(string, Stream)> ExportPDFByQuestPDFDemo(string[] workorderArray);
+
+ ///
+ /// 打印工单
+ ///
+ ///
+ ///
+ Task PrintTicketsByTemplate(ProWorkorderExportDto param);
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/ProWorkorderCoreService.cs b/DOAN.Service/MES/Product/ProWorkorderCoreService.cs
new file mode 100644
index 0000000..59707f2
--- /dev/null
+++ b/DOAN.Service/MES/Product/ProWorkorderCoreService.cs
@@ -0,0 +1,319 @@
+using DOAN.Model.BZFM;
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+using DOAN.Service.MES.product.IService;
+using Infrastructure.Attribute;
+using Infrastructure.Converter;
+
+namespace DOAN.Service.MES.product
+{
+ ///
+ /// 核心工单管理服务
+ ///
+ [AppService(ServiceType = typeof(IProWorkorderCoreService), ServiceLifetime = LifeTime.Transient)]
+ public class ProWorkorderCoreService : BaseService, IProWorkorderCoreService
+ {
+ ///
+ /// 获取工单详情
+ ///
+ ///
+ ///
+ public ProWorkorder GetInfo(string Id)
+ {
+ var response = Queryable().Where(x => x.Id == Id).First();
+
+ return response;
+ }
+
+ ///
+ /// 添加生产工单
+ ///
+ ///
+ ///
+ public ProWorkorder AddProWorkorder(ProWorkorder model)
+ {
+ model.Id = SnowFlakeSingle.Instance.NextId().ToString();
+
+ return Context.Insertable(model).ExecuteReturnEntity();
+ }
+
+ ///
+ /// 修改生产工单
+ ///
+ ///
+ ///
+ public int UpdateProWorkorder(ProWorkorder model)
+ {
+ //增加日志
+ /*ProWorkorderUpdateLog logObj = new ProWorkorderUpdateLog();
+ logObj.Id = XueHua;
+ logObj.Workorder = model.Workorder;
+ logObj.Log = "修改生产工单";
+ logObj.ChangeTime = DateTime.Now;
+ logObj.Operator = model.CreatedBy;
+ Context.Insertable(logObj).ExecuteCommand();*/
+
+ var response = Update(model, true);
+ return response;
+ }
+
+ ///
+ /// 插入工单、新增工单
+ ///
+ ///
+ ///
+ ///
+ public int Insert_workOrder(ProWorkorder proWorkorder, string next_id)
+ {
+ int result = 0;
+ proWorkorder.Id = XueHua;
+ proWorkorder.WorkorderDate = DOANConvertDate.ConvertLocalDate(
+ proWorkorder.WorkorderDate ?? DateTime.MinValue
+ );
+ // 获取 产品代号
+ /*List ProductCodeList = Context
+ .Queryable()
+ .Where(it => it.DictType == "product_code")
+ .ToList();*/
+ // XXX 改为从物料清单获取信息
+ List mmMaterials = Context
+ .Queryable()
+ .Where(it => it.Status == "启用")
+ .ToList();
+ DateTime handleDate = proWorkorder.WorkorderDate.Value;
+ //插入工单
+ if (!string.IsNullOrEmpty(next_id) && next_id != "-1")
+ {
+ // 向前插工单
+ UseTran2(() =>
+ {
+ ProWorkorder maxs = Context
+ .Queryable()
+ .Where(it => it.WorkorderDate == handleDate)
+ .OrderByDescending(it => SqlFunc.Right(it.Workorder, 3))
+ .First();
+ int index = 1;
+ if (!string.IsNullOrEmpty(maxs.Workorder))
+ {
+ index =
+ Convert.ToInt32(maxs.Workorder.Substring(maxs.Workorder.Length - 3))
+ + 1;
+ }
+ // proWorkorder.Workorder = "K" + handleDate.ToString("yyyyMMdd") + "_" + proWorkorder.GroupCode + "_" + proWorkorder.RouteCode + "_" + index.ToString("000");
+
+ /*string nickCode = ProductCodeList
+ .Where(it => it.DictLabel == proWorkorder.productionCode)
+ .Select(it => it.DictValue)
+ .FirstOrDefault();*/
+ string nickCode = mmMaterials
+ .Where(it => it.MaterialCode == proWorkorder.productionCode)
+ .Select(it => it.Type)
+ .FirstOrDefault();
+ proWorkorder.Workorder =
+ "K"
+ + handleDate.ToString("yyyyMMdd")
+ + "_"
+ + proWorkorder.RouteCode
+ + proWorkorder.GroupCode
+ + "_"
+ + nickCode
+ + "_"
+ + index.ToString("000");
+
+ int sortNum = Context
+ .Queryable()
+ .Where(it => it.Id == next_id)
+ .Select(it => it.Sort.Value)
+ .First();
+ // 调整序号
+ Context
+ .Updateable()
+ .Where(it => it.WorkorderDate == handleDate)
+ .Where(it => it.Sort >= sortNum)
+ .SetColumns(it => new ProWorkorder() { Sort = it.Sort + 10 })
+ .ExecuteCommand();
+ proWorkorder.Sort = sortNum;
+ proWorkorder.Status = 1;
+
+ //增加日志
+ ProWorkorderUpdateLog logObj = new ProWorkorderUpdateLog();
+ logObj.Id = XueHua;
+ logObj.Workorder = proWorkorder.Workorder;
+ logObj.Log = "手动新增";
+ logObj.ChangeTime = DateTime.Now;
+ logObj.Operator = proWorkorder.CreatedBy;
+ logObj.ChangeTime = DateTime.Now;
+ logObj.CreatedBy = proWorkorder.CreatedBy;
+ UseTran2(() =>
+ {
+ result = Context.Insertable(proWorkorder).ExecuteCommand();
+ Context.Insertable(logObj).ExecuteCommand();
+ });
+ });
+ }
+ else
+ {
+ // 新增工单
+ int sortNum = Context
+ .Queryable()
+ .Where(it => it.WorkorderDate == handleDate)
+ .Max(it => it.Sort.Value);
+
+ ProWorkorder maxWorkorder = Context
+ .Queryable()
+ .Where(it => it.WorkorderDate == handleDate)
+ .OrderByDescending(it => SqlFunc.Right(it.Workorder, 3))
+ .First();
+
+ int index = 0;
+ if (maxWorkorder == null)
+ {
+ index = 1;
+ proWorkorder.Sort = 10;
+ }
+ else
+ {
+ string maxs = maxWorkorder.Workorder;
+ index = Convert.ToInt32(maxs.Substring(maxs.Length - 3)) + 1;
+ proWorkorder.Sort = maxWorkorder.Sort + 10;
+ }
+ //proWorkorder.Workorder = "H" + handleDate.ToString("yyyyMMdd") + "_" + proWorkorder.GroupCode + "_" + proWorkorder.RouteCode + "_" + index.ToString("000");
+
+ /*string nickCode = ProductCodeList
+ .Where(it => it.DictLabel == proWorkorder.productionCode)
+ .Select(it => it.DictValue)
+ .FirstOrDefault();*/
+ string nickCode = mmMaterials
+ .Where(it => it.MaterialCode == proWorkorder.productionCode)
+ .Select(it => it.Type)
+ .FirstOrDefault();
+ proWorkorder.Workorder =
+ "H"
+ + handleDate.ToString("yyyyMMdd")
+ + "_"
+ + proWorkorder.RouteCode
+ + proWorkorder.GroupCode
+ + "_"
+ + nickCode
+ + "_"
+ + index.ToString("000");
+
+ proWorkorder.Status = 1;
+
+ //增加日志
+ ProWorkorderUpdateLog logObj = new ProWorkorderUpdateLog();
+ logObj.Id = XueHua;
+ logObj.Workorder = proWorkorder.Workorder;
+ logObj.Log = "手动新增";
+ logObj.ChangeTime = DateTime.Now;
+ logObj.Operator = proWorkorder.CreatedBy;
+ logObj.ChangeTime = DateTime.Now;
+ logObj.CreatedBy = proWorkorder.CreatedBy;
+ UseTran2(() =>
+ {
+ result = Context.Insertable(proWorkorder).ExecuteCommand();
+ Context.Insertable(logObj).ExecuteCommand();
+ });
+ }
+
+ return result;
+ }
+
+ ///
+ /// 插入工单2
+ ///
+ ///
+ ///
+ ///
+ public int Insert_workOrder2(ProWorkorder proWorkorder, string next_id)
+ {
+ int result = 0;
+ proWorkorder.Id = XueHua;
+ proWorkorder.WorkorderDate = proWorkorder.WorkorderDate.Value.Date;
+ if (!string.IsNullOrEmpty(next_id) && next_id != "-1")
+ {
+ UseTran2(() =>
+ {
+ int sortNum = Context
+ .Queryable()
+ .Where(it => it.Id == next_id)
+ .Select(it => it.Sort.Value)
+ .First();
+ Context
+ .Updateable()
+ .Where(it => it.WorkorderDate == proWorkorder.WorkorderDate)
+ .Where(it => it.Sort >= sortNum)
+ .SetColumns(it => new ProWorkorder() { Sort = it.Sort + 10 })
+ .ExecuteCommand();
+
+ proWorkorder.Sort = sortNum;
+ proWorkorder.Status = 1;
+
+ Context.Insertable(proWorkorder).ExecuteCommand();
+ });
+ }
+ else
+ {
+ DateTime dateOnly = proWorkorder.WorkorderDate.Value.Date;
+
+ int sortNum = Context
+ .Queryable()
+ .Where(it => it.WorkorderDate == dateOnly)
+ .Max(it => it.Sort.Value);
+
+ proWorkorder.Sort = sortNum + 10;
+
+ proWorkorder.Status = 1;
+
+ Context.Insertable(proWorkorder).ExecuteCommand();
+ }
+
+ Generate_workorder(
+ new ProWorkorderQueryDto2() { WorkorderDate = proWorkorder.WorkorderDate.Value }
+ );
+
+ return result;
+ }
+
+ ///
+ /// 生成工单号
+ ///
+ ///
+ ///
+ private 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();
+ }
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/ProWorkorderExportService.cs b/DOAN.Service/MES/Product/ProWorkorderExportService.cs
new file mode 100644
index 0000000..8b81876
--- /dev/null
+++ b/DOAN.Service/MES/Product/ProWorkorderExportService.cs
@@ -0,0 +1,28 @@
+using DOAN.Model.MES.product;
+using DOAN.Service.MES.product.IService;
+using Infrastructure.Attribute;
+using Infrastructure.Extensions;
+
+namespace DOAN.Service.MES.product
+{
+ ///
+ /// 工单导出服务
+ ///
+ [AppService(ServiceType = typeof(IProWorkorderExportService), ServiceLifetime = LifeTime.Transient)]
+ public class ProWorkorderExportService : BaseService, IProWorkorderExportService
+ {
+ ///
+ /// 工单导出
+ ///
+ ///
+ ///
+ public List WorkOrderExport(DateTime exportTime)
+ {
+ exportTime = exportTime.Date;
+ return Context
+ .Queryable()
+ .Where(it => it.WorkorderDate == exportTime)
+ .ToList();
+ }
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/ProWorkorderImportService.cs b/DOAN.Service/MES/Product/ProWorkorderImportService.cs
new file mode 100644
index 0000000..4689f68
--- /dev/null
+++ b/DOAN.Service/MES/Product/ProWorkorderImportService.cs
@@ -0,0 +1,527 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using DOAN.Model;
+using DOAN.Model.BZFM;
+using DOAN.Model.MES.base_;
+using DOAN.Model.MES.product;
+using DOAN.Service.MES.product.IService;
+using Infrastructure;
+using Infrastructure.Attribute;
+using Microsoft.AspNetCore.Http;
+using NPOI.SS.UserModel;
+using NPOI.XSSF.UserModel;
+using SqlSugar;
+
+namespace DOAN.Service.MES.product
+{
+ ///
+ /// 工单导入服务
+ ///
+ [AppService(ServiceType = typeof(IProWorkorderImportService), ServiceLifetime = LifeTime.Transient)]
+ public class ProWorkorderImportService : BaseService, IProWorkorderImportService
+ {
+ ///
+ /// 导入工单 必须整删除 整改
+ ///
+ ///
+ ///
+ ///
+ public int ImportData(IFormFile formFile, string username)
+ {
+ int result = 0;
+ List workorderList = new List();
+ DateTime dateValue = DateTime.MinValue;
+ // XXX 改为从物料清单获取信息
+ List mmMaterials = Context
+ .Queryable()
+ .Where(it => it.Status == "启用")
+ .ToList();
+
+ using (var stream = formFile.OpenReadStream())
+ {
+ try
+ {
+ IWorkbook workbook = new XSSFWorkbook(stream);
+ ISheet sheet = workbook.GetSheetAt(0);
+
+ // 处理第2行 获取日期
+ IRow secondRow = sheet.GetRow(1);
+ ICell cell = secondRow.GetCell(0);
+ // 将单元格的数字值转换为DateTime
+ dateValue = cell.DateCellValue.Value;
+
+ #region 读取excel
+ // 遍历每一行
+ for (int row = 4; row <= sheet.LastRowNum; row++)
+ {
+ IRow currentRow = sheet.GetRow(row);
+ if (currentRow != null) // 确保行不为空
+ {
+ ProWorkorder workorder = new ProWorkorder();
+
+ //00 铸件品名
+ ICell currentCell_01 = currentRow.GetCell(0);
+ workorder.productionName = currentCell_01?.ToString();
+ if (currentCell_01 == null || string.IsNullOrEmpty(workorder.productionName))
+ {
+ continue;
+ }
+
+ //01 铸件型号
+ ICell currentCell_02 = currentRow.GetCell(1);
+ workorder.productionCode = currentCell_02?.ToString();
+ if (currentCell_02 == null || string.IsNullOrEmpty(workorder.productionCode))
+ {
+ continue;
+ }
+
+ //02 单位
+ ICell currentCell_04 = currentRow.GetCell(2);
+ workorder.Unit = currentCell_04?.ToString();
+ if (currentCell_04 == null || string.IsNullOrEmpty(workorder.Unit))
+ {
+ continue;
+ }
+
+ //3 plan_num
+ ICell currentCell_07 = currentRow.GetCell(3);
+ workorder.PlanNum = (int)currentCell_07?.NumericCellValue;
+
+ //4 材质品名
+ ICell currentCell_11 = currentRow.GetCell(4);
+ workorder.MaterialName = currentCell_11?.ToString();
+ if (currentCell_11 == null || string.IsNullOrEmpty(workorder.MaterialName))
+ {
+ continue;
+ }
+
+ //5 材质牌号
+ ICell currentCell_12 = currentRow.GetCell(5);
+ workorder.MaterialCode = currentCell_12?.ToString();
+ if (currentCell_12 == null || string.IsNullOrEmpty(workorder.MaterialCode))
+ {
+ continue;
+ }
+
+ //6 材质
+ ICell currentCell_13 = currentRow.GetCell(6);
+ workorder.MaterialtextureCode = currentCell_13?.ToString();
+ if (currentCell_13 == null || string.IsNullOrEmpty(workorder.MaterialtextureCode))
+ {
+ continue;
+ }
+
+ //7 炉号
+ ICell currentCell_14 = currentRow.GetCell(7);
+ workorder.StoveCode = currentCell_14?.ToString();
+ if (currentCell_14 == null || string.IsNullOrEmpty(workorder.StoveCode))
+ {
+ continue;
+ }
+
+ //8 图号
+ ICell currentCell_15 = currentRow.GetCell(8);
+ workorder.DrawingCode = currentCell_15?.ToString();
+ if (currentCell_15 == null || string.IsNullOrEmpty(workorder.DrawingCode))
+ {
+ continue;
+ }
+
+ //9 版本
+ ICell currentCell_16 = currentRow.GetCell(9);
+ workorder.Version = currentCell_16?.ToString();
+ if (currentCell_16 == null || string.IsNullOrEmpty(workorder.Version))
+ {
+ continue;
+ }
+
+ //10 指导日期
+ ICell cell17 = currentRow.GetCell(10);
+ // 将单元格的数字值转换为DateTime
+ workorder.InstructionDate = cell17.DateCellValue.Value;
+
+ // 11 车间code
+ ICell currentCell_18 = currentRow.GetCell(11);
+ if (currentCell_18 == null)
+ {
+ workorder.WorkshopCode = string.Empty;
+ }
+ else
+ {
+ if (currentCell_18.CellType == CellType.Numeric)
+ {
+ workorder.WorkshopCode = currentCell_18.NumericCellValue.ToString();
+ }
+ else
+ {
+ workorder.WorkshopCode = currentCell_18.StringCellValue;
+ }
+ }
+
+ //12 组号code
+ ICell currentCell_19 = currentRow.GetCell(12);
+ if (currentCell_19 == null)
+ {
+ workorder.GroupCode = string.Empty;
+ }
+ else
+ {
+ if (currentCell_19.CellType == CellType.Numeric)
+ {
+ workorder.GroupCode = currentCell_19.NumericCellValue.ToString();
+ }
+ else
+ {
+ workorder.GroupCode = currentCell_19.StringCellValue;
+ }
+ }
+
+ //13 班号code
+ ICell currentCell_20 = currentRow.GetCell(13);
+ if (currentCell_20 == null)
+ {
+ workorder.RouteCode = string.Empty;
+ }
+ else
+ {
+ if (currentCell_20.CellType == CellType.Numeric)
+ {
+ workorder.RouteCode = currentCell_20.NumericCellValue.ToString();
+ }
+ else
+ {
+ workorder.RouteCode = currentCell_20.StringCellValue;
+ }
+ }
+
+ //14 优先级
+ ICell currentCell_21 = currentRow.GetCell(14);
+ if (currentCell_21.StringCellValue == "优先")
+ {
+ workorder.Priority = 3;
+ }
+ else
+ {
+ if (currentCell_21.StringCellValue == "插单")
+ {
+ workorder.Priority = 2;
+ }
+ else if (currentCell_21.StringCellValue == "正常" || string.IsNullOrEmpty(currentCell_11.StringCellValue))
+ {
+ workorder.Priority = 1;
+ }
+ }
+
+ //15 节拍
+ ICell currentCell_22 = currentRow.GetCell(15);
+ workorder.Beat = (int)currentCell_22?.NumericCellValue;
+
+ //16 进料单号(外购)
+ ICell currentCell_010 = currentRow.GetCell(16);
+ workorder.FeedOrder = currentCell_010?.StringCellValue;
+
+ //17 客户单号(出货)
+ ICell currentCell_011 = currentRow.GetCell(17);
+ workorder.CustomerOrder = currentCell_011?.StringCellValue;
+
+ //18 备注
+ ICell currentCell_012 = currentRow.GetCell(18);
+ workorder.Remark01 = currentCell_012?.StringCellValue;
+
+ workorder.Id = Guid.NewGuid().ToString();
+ workorder.CreatedBy = username;
+ workorder.CreatedTime = DateTime.Now;
+ workorder.WorkorderDate = dateValue;
+ workorder.Status = 1;
+
+ // 工单 2024-9-13-最终顺序号
+ int index = (row - 3);
+ //TODO nickCode改为从物料清单进行获取
+ string nickCode = mmMaterials
+ .Where(it => it.MaterialCode == workorder.productionCode)
+ .Select(it => it.Type)
+ .FirstOrDefault();
+
+ workorder.Workorder = dateValue.ToString("yyyyMMdd") + "_" + workorder.GroupCode + workorder.RouteCode + "_" + nickCode + "_" + index.ToString("000");
+ workorder.Sort = index * 10;
+
+ CultureInfo culture = CultureInfo.CurrentCulture;
+ workorderList.Add(workorder);
+ }
+ }
+ #endregion
+ }
+ catch (Exception ex)
+ {
+ return -1;
+ }
+ }
+
+ UseTran2(() =>
+ {
+ Context.Deleteable().Where(it => it.WorkorderDate == dateValue).ExecuteCommand();
+ result = Context.Insertable(workorderList).ExecuteCommand();
+ });
+
+ return result;
+ }
+
+ ///
+ /// 分批导入,追加导入
+ ///
+ ///
+ ///
+ ///
+ public int ImportDataAppend(IFormFile formFile, string username)
+ {
+ int result = 0;
+ List workorderList = new List();
+ DateTime dateValue = DateTime.MinValue;
+ // XXX 改为从物料清单获取信息
+ List mmMaterials = Context
+ .Queryable()
+ .Where(it => it.Status == "启用")
+ .ToList();
+
+ using (var stream = formFile.OpenReadStream())
+ {
+ try
+ {
+ IWorkbook workbook = new XSSFWorkbook(stream);
+ ISheet sheet = workbook.GetSheetAt(0);
+
+ // 处理第2行 获取日期
+ IRow secondRow = sheet.GetRow(1);
+ ICell cell = secondRow.GetCell(0);
+ // 将单元格的数字值转换为DateTime
+ dateValue = cell.DateCellValue.Value;
+
+ // 遍历每一行
+ for (int row = 4; row <= sheet.LastRowNum; row++)
+ {
+ IRow currentRow = sheet.GetRow(row);
+ if (currentRow != null) // 确保行不为空
+ {
+ ProWorkorder workorder = new ProWorkorder();
+
+ #region 读取excel
+ //00 铸件品名
+ ICell currentCell_01 = currentRow.GetCell(0);
+ workorder.productionName = currentCell_01?.ToString();
+ if (currentCell_01 == null || string.IsNullOrEmpty(workorder.productionName))
+ {
+ continue;
+ }
+
+ //01 铸件型号
+ ICell currentCell_02 = currentRow.GetCell(1);
+ workorder.productionCode = currentCell_02?.ToString();
+ if (currentCell_02 == null || string.IsNullOrEmpty(workorder.productionCode))
+ {
+ continue;
+ }
+
+ //02 单位
+ ICell currentCell_04 = currentRow.GetCell(2);
+ workorder.Unit = currentCell_04?.ToString();
+ if (currentCell_04 == null || string.IsNullOrEmpty(workorder.Unit))
+ {
+ continue;
+ }
+
+ //3 plan_num
+ ICell currentCell_07 = currentRow.GetCell(3);
+ workorder.PlanNum = (int)currentCell_07?.NumericCellValue;
+
+ //4 材质品名
+ ICell currentCell_11 = currentRow.GetCell(4);
+ workorder.MaterialName = currentCell_11?.ToString();
+ if (currentCell_11 == null || string.IsNullOrEmpty(workorder.MaterialName))
+ {
+ continue;
+ }
+
+ //5 材质牌号
+ ICell currentCell_12 = currentRow.GetCell(5);
+ workorder.MaterialCode = currentCell_12?.ToString();
+ if (currentCell_12 == null || string.IsNullOrEmpty(workorder.MaterialCode))
+ {
+ continue;
+ }
+
+ //6 材质
+ ICell currentCell_13 = currentRow.GetCell(6);
+ workorder.MaterialtextureCode = currentCell_13?.ToString();
+ if (currentCell_13 == null || string.IsNullOrEmpty(workorder.MaterialtextureCode))
+ {
+ continue;
+ }
+
+ //7 炉号
+ ICell currentCell_14 = currentRow.GetCell(7);
+ workorder.StoveCode = currentCell_14?.ToString();
+ if (currentCell_14 == null || string.IsNullOrEmpty(workorder.StoveCode))
+ {
+ continue;
+ }
+
+ //8 图号
+ ICell currentCell_15 = currentRow.GetCell(8);
+ workorder.DrawingCode = currentCell_15?.ToString();
+ if (currentCell_15 == null || string.IsNullOrEmpty(workorder.DrawingCode))
+ {
+ continue;
+ }
+
+ //9 版本
+ ICell currentCell_16 = currentRow.GetCell(9);
+ workorder.Version = currentCell_16?.ToString();
+ if (currentCell_16 == null || string.IsNullOrEmpty(workorder.Version))
+ {
+ continue;
+ }
+
+ //10 指导日期
+ ICell cell17 = currentRow.GetCell(10);
+ // 将单元格的数字值转换为DateTime
+ workorder.InstructionDate = cell17.DateCellValue.Value;
+
+ // 11 车间code
+ ICell currentCell_18 = currentRow.GetCell(11);
+ if (currentCell_18 == null)
+ {
+ workorder.WorkshopCode = string.Empty;
+ }
+ else
+ {
+ if (currentCell_18.CellType == CellType.Numeric)
+ {
+ workorder.WorkshopCode = currentCell_18.NumericCellValue.ToString();
+ }
+ else
+ {
+ workorder.WorkshopCode = currentCell_18.StringCellValue;
+ }
+ }
+
+ //12 组号code
+ ICell currentCell_19 = currentRow.GetCell(12);
+ if (currentCell_19 == null)
+ {
+ workorder.GroupCode = string.Empty;
+ }
+ else
+ {
+ if (currentCell_19.CellType == CellType.Numeric)
+ {
+ workorder.GroupCode = currentCell_19.NumericCellValue.ToString();
+ }
+ else
+ {
+ workorder.GroupCode = currentCell_19.StringCellValue;
+ }
+ }
+
+ //13 班号code
+ ICell currentCell_20 = currentRow.GetCell(13);
+ if (currentCell_20 == null)
+ {
+ workorder.RouteCode = string.Empty;
+ }
+ else
+ {
+ if (currentCell_20.CellType == CellType.Numeric)
+ {
+ workorder.RouteCode = currentCell_20.NumericCellValue.ToString();
+ }
+ else
+ {
+ workorder.RouteCode = currentCell_20.StringCellValue;
+ }
+ }
+
+ //14 优先级
+ ICell currentCell_21 = currentRow.GetCell(14);
+ if (currentCell_21.StringCellValue == "优先")
+ {
+ workorder.Priority = 3;
+ }
+ else
+ {
+ if (currentCell_21.StringCellValue == "插单")
+ {
+ workorder.Priority = 2;
+ }
+ else if (currentCell_21.StringCellValue == "正常" || string.IsNullOrEmpty(currentCell_11.StringCellValue))
+ {
+ workorder.Priority = 1;
+ }
+ }
+
+ //15 节拍
+ ICell currentCell_22 = currentRow.GetCell(15);
+ workorder.Beat = (int)currentCell_22?.NumericCellValue;
+
+ //16 进料单号(外购)
+ ICell currentCell_010 = currentRow.GetCell(16);
+ workorder.FeedOrder = currentCell_010?.StringCellValue;
+
+ //17 客户单号(出货)
+ ICell currentCell_011 = currentRow.GetCell(17);
+ workorder.CustomerOrder = currentCell_011?.StringCellValue;
+
+ //18 备注
+ ICell currentCell_012 = currentRow.GetCell(18);
+ workorder.Remark01 = currentCell_012?.StringCellValue;
+ #endregion
+
+ workorder.Id = Guid.NewGuid().ToString();
+ workorder.CreatedBy = username;
+ workorder.CreatedTime = DateTime.Now;
+ workorder.WorkorderDate = dateValue;
+ workorder.Status = 1;
+
+ // 获取当前日期工单最大顺序号和序号
+ DateTime currentDate = dateValue.Date;
+ var MaxWorkorder = Context
+ .Queryable()
+ .Where(it => it.WorkorderDate == currentDate)
+ .OrderByDescending(it => it.Sort)
+ .Select(it => new { it.Workorder, it.Sort })
+ .First();
+
+ // 工单 2024-9-13-最终顺序号
+ int index = (row - 3);
+ //TODO nickCode改为从物料清单进行获取
+ string nickCode = mmMaterials
+ .Where(it => it.MaterialCode == workorder.productionCode)
+ .Select(it => it.Type)
+ .FirstOrDefault();
+
+ workorder.Workorder = dateValue.ToString("yyyyMMdd") + "_" + workorder.GroupCode + workorder.RouteCode + "_" + nickCode + "_" + index.ToString("000");
+ workorder.Sort = index * 10 + (MaxWorkorder?.Sort ?? 0);
+
+ CultureInfo culture = CultureInfo.CurrentCulture;
+ workorderList.Add(workorder);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ return -1;
+ }
+ }
+
+ UseTran2(() =>
+ {
+ // Context.Deleteable().Where(it => it.WorkorderDate == dateValue).ExecuteCommand();
+ result = Context.Insertable(workorderList).ExecuteCommand();
+ });
+
+ return result;
+ }
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/ProWorkorderQueryService.cs b/DOAN.Service/MES/Product/ProWorkorderQueryService.cs
new file mode 100644
index 0000000..94480c9
--- /dev/null
+++ b/DOAN.Service/MES/Product/ProWorkorderQueryService.cs
@@ -0,0 +1,156 @@
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+using DOAN.Repository;
+using DOAN.Service.MES.product.IService;
+using Infrastructure.Attribute;
+using Infrastructure.Converter;
+using Infrastructure.Extensions;
+
+namespace DOAN.Service.MES.product
+{
+ ///
+ /// 工单查询服务
+ ///
+ [AppService(ServiceType = typeof(IProWorkorderQueryService), ServiceLifetime = LifeTime.Transient)]
+ public class ProWorkorderQueryService : BaseService, IProWorkorderQueryService
+ {
+ ///
+ /// 查询生产工单列表
+ ///
+ ///
+ ///
+ public PagedInfo GetList(ProWorkorderQueryDto parm)
+ {
+ if (parm.WorkorderDate != null && parm.WorkorderDate.Length > 0)
+ {
+ parm.WorkorderDate[0] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[0]);
+ parm.WorkorderDate[1] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[1]);
+ parm.WorkorderDate[0] = parm.WorkorderDate[0].Date;
+ parm.WorkorderDate[1] = parm.WorkorderDate[1].Date;
+ }
+
+ var predicate = Expressionable
+ .Create()
+ .And(it => it.PlanNum > 0)
+ .AndIF(
+ !string.IsNullOrEmpty(parm.productionName),
+ it => it.productionName.Contains(parm.productionName)
+ )
+ .AndIF(
+ !string.IsNullOrEmpty(parm.productionCode),
+ it => it.productionCode.Contains(parm.productionCode)
+ )
+ .AndIF(
+ !string.IsNullOrEmpty(parm.FeedOrder),
+ it => it.FeedOrder.Contains(parm.FeedOrder)
+ )
+ .AndIF(
+ !string.IsNullOrEmpty(parm.CustomerOrder),
+ it => it.CustomerOrder.Contains(parm.CustomerOrder)
+ )
+ .AndIF(!string.IsNullOrEmpty(parm.RouteCode), it => it.RouteCode == parm.RouteCode)
+ .AndIF(!string.IsNullOrEmpty(parm.GroupCode), it => it.GroupCode == parm.GroupCode)
+ .AndIF(
+ parm.WorkorderDate != null && parm.WorkorderDate.Length > 0,
+ it => it.WorkorderDate >= parm.WorkorderDate[0] && it.WorkorderDate <= parm.WorkorderDate[1]
+ )
+ .And(it => it.PlanNum > 0)
+ .ToExpression();
+
+ var response = Context
+ .Queryable()
+ .Where(predicate)
+ .OrderBy(it => it.Sort)
+ .ToPage(parm);
+
+ return response;
+ }
+
+ ///
+ /// 获取工单无校验
+ ///
+ ///
+ ///
+ public PagedInfo GetList_NOCheck(ProWorkorderQueryDto parm)
+ {
+ if (parm.WorkorderDate != null && parm.WorkorderDate.Length > 0)
+ {
+ parm.WorkorderDate[0] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[0]);
+ parm.WorkorderDate[1] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[1]);
+ parm.WorkorderDate[0] = parm.WorkorderDate[0].Date;
+ parm.WorkorderDate[1] = parm.WorkorderDate[1].Date;
+ }
+
+ var predicate = Expressionable
+ .Create()
+ .AndIF(
+ !string.IsNullOrEmpty(parm.productionName),
+ it => it.productionName.Contains(parm.productionName)
+ )
+ .AndIF(
+ !string.IsNullOrEmpty(parm.productionCode),
+ it => it.productionCode.Contains(parm.productionCode)
+ )
+ .AndIF(
+ !string.IsNullOrEmpty(parm.FeedOrder),
+ it => it.FeedOrder.Contains(parm.FeedOrder)
+ )
+ .AndIF(
+ !string.IsNullOrEmpty(parm.CustomerOrder),
+ it => it.CustomerOrder.Contains(parm.CustomerOrder)
+ )
+ .AndIF(!string.IsNullOrEmpty(parm.RouteCode), it => it.RouteCode == parm.RouteCode)
+ .AndIF(!string.IsNullOrEmpty(parm.GroupCode), it => it.GroupCode == parm.GroupCode)
+ .AndIF(
+ parm.WorkorderDate != null && parm.WorkorderDate.Length > 0,
+ it => it.WorkorderDate >= parm.WorkorderDate[0] && it.WorkorderDate <= parm.WorkorderDate[1]
+ )
+ .And(it => it.PlanNum > 0)
+ .ToExpression();
+
+ var response = Context
+ .Queryable()
+ .Where(predicate)
+ .OrderBy(it => it.Sort)
+ .ToPage(parm);
+
+ return response;
+ }
+
+ ///
+ /// 获取详情
+ ///
+ ///
+ ///
+ public ProWorkorder GetInfo(string Id)
+ {
+ var response = Queryable().Where(x => x.Id == Id).First();
+
+ return response;
+ }
+
+ ///
+ /// 获取工单进度跟踪列表
+ ///
+ ///
+ ///
+ public PagedInfo GetWorkorderTraceProgressList(ProWorkorderQueryDto query)
+ {
+ // 这里需要实现工单进度跟踪列表的查询逻辑
+ // 暂时返回空列表
+ return new PagedInfo();
+ }
+
+ ///
+ /// 查询BOM 及其所需数量
+ ///
+ ///
+ ///
+ public List SearchBOMNum(string workorder_num)
+ {
+ // 这里需要实现BOM查询逻辑
+ // 暂时返回空列表
+ return new List();
+ }
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/Product/ProWorkorderReferenceService.cs b/DOAN.Service/MES/Product/ProWorkorderReferenceService.cs
new file mode 100644
index 0000000..ec6db57
--- /dev/null
+++ b/DOAN.Service/MES/Product/ProWorkorderReferenceService.cs
@@ -0,0 +1,99 @@
+using DOAN.Model.MES.base_;
+using DOAN.Model.MES.base_.Dto;
+using DOAN.Model.MES.product;
+using DOAN.Service.MES.product.IService;
+using Infrastructure.Attribute;
+
+namespace DOAN.Service.MES.product
+{
+ ///
+ /// 工单参考数据服务
+ ///
+ [AppService(
+ ServiceType = typeof(IProWorkorderReferenceService),
+ ServiceLifetime = LifeTime.Transient
+ )]
+ public class ProWorkorderReferenceService
+ : BaseService,
+ IProWorkorderReferenceService
+ {
+ ///
+ /// 获取物料信息
+ ///
+ ///
+ ///
+ public List GetMaterialInfo(BaseMaterialListQueryDto5 parm)
+ {
+ var predicate = Expressionable
+ .Create()
+ .OrIF(
+ !string.IsNullOrEmpty(parm.Name_or_Code),
+ it => it.Name.Contains(parm.Name_or_Code)
+ )
+ .OrIF(
+ !string.IsNullOrEmpty(parm.Name_or_Code),
+ it => it.Code.Contains(parm.Name_or_Code)
+ );
+
+ return Context
+ .Queryable()
+ .Where(predicate.ToExpression())
+ .Take(20)
+ .ToList();
+ }
+
+ ///
+ /// 获取客户信息
+ ///
+ ///
+ ///
+ public List GetCustomInfo(BaseCustomQueryDto2 parm)
+ {
+ var predicate = Expressionable
+ .Create()
+ .AndIF(
+ !string.IsNullOrEmpty(parm.CustomNo),
+ it => it.CustomNo.Contains(parm.CustomNo)
+ )
+ .And(it => it.Status == 1);
+
+ var response = Context
+ .Queryable()
+ .Where(predicate.ToExpression())
+ .OrderBy(it => it.CustomNo)
+ .Take(20)
+ .ToList();
+ return response;
+ }
+
+ ///
+ /// 获取工艺路线
+ ///
+ ///
+ ///
+ public List GetProcessRoute(DateTime dateTime)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// 获取全部工艺路线
+ ///
+ ///
+ public List GetAllRoute()
+ {
+ var result = Context.Queryable().Where(it => it.Status == 1).ToList();
+ return result;
+ }
+
+ ///
+ /// 获取班组
+ ///
+ ///
+ public List GetGroupList()
+ {
+ var result = Context.Queryable().Where(it => it.Status == 1).ToList();
+ return result;
+ }
+ }
+}
diff --git a/DOAN.Service/MES/Product/ProWorkorderService.cs b/DOAN.Service/MES/Product/ProWorkorderService.cs
index f487b3b..ce256c8 100644
--- a/DOAN.Service/MES/Product/ProWorkorderService.cs
+++ b/DOAN.Service/MES/Product/ProWorkorderService.cs
@@ -1,37 +1,11 @@
-using System;
-using System.Data.Common;
-using System.Globalization;
-using System.Linq;
-using BarTender;
-using DOAN.Infrastructure.Helper;
-using DOAN.Model;
-using DOAN.Model.BZFM;
using DOAN.Model.MES.base_;
using DOAN.Model.MES.base_.Dto;
using DOAN.Model.MES.product;
using DOAN.Model.MES.product.Dto;
-using DOAN.Model.System;
-using DOAN.Repository;
using DOAN.Service.MES.product.IService;
using Infrastructure;
using Infrastructure.Attribute;
-using Infrastructure.Converter;
-using MathNet.Numerics.RootFinding;
-using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Http;
-using MimeKit.Tnef;
-using MiniExcelLibs;
-using NPOI.HSSF.UserModel;
-using NPOI.SS.Formula.Functions;
-using NPOI.SS.UserModel;
-using NPOI.XSSF.UserModel;
-using NPOI.XWPF.UserModel;
-using QuestPDF;
-using QuestPDF.Fluent;
-using QuestPDF.Helpers;
-using QuestPDF.Infrastructure;
-using SqlSugar;
-using SqlSugar.Extensions;
namespace DOAN.Service.MES.product
{
@@ -41,6 +15,39 @@ namespace DOAN.Service.MES.product
[AppService(ServiceType = typeof(IProWorkorderService), ServiceLifetime = LifeTime.Transient)]
public class ProWorkorderService : BaseService, IProWorkorderService
{
+ private readonly IProWorkorderCoreService _coreService;
+ private readonly IProWorkorderQueryService _queryService;
+ private readonly IProWorkorderImportService _importService;
+ private readonly IProWorkorderExportService _exportService;
+ private readonly IProWorkorderUtilityService _utilityService;
+ private readonly IProWorkorderReferenceService _referenceService;
+
+ ///
+ /// 构造函数
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public ProWorkorderService(
+ IProWorkorderCoreService coreService,
+ IProWorkorderQueryService queryService,
+ IProWorkorderImportService importService,
+ IProWorkorderExportService exportService,
+ IProWorkorderUtilityService utilityService,
+ IProWorkorderReferenceService referenceService
+ )
+ {
+ _coreService = coreService;
+ _queryService = queryService;
+ _importService = importService;
+ _exportService = exportService;
+ _utilityService = utilityService;
+ _referenceService = referenceService;
+ }
+
///
/// 查询生产工单列表
///
@@ -48,106 +55,7 @@ namespace DOAN.Service.MES.product
///
public PagedInfo GetList(ProWorkorderQueryDto parm)
{
- if (parm.WorkorderDate != null && parm.WorkorderDate.Length > 0)
- {
- parm.WorkorderDate[0] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[0]);
- parm.WorkorderDate[1] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[1]);
- parm.WorkorderDate[0] = parm.WorkorderDate[0].Date;
- parm.WorkorderDate[1] = parm.WorkorderDate[1].Date;
- }
-
- var predicate = Expressionable
- .Create()
- .And(it => it.PlanNum > 0)
- .AndIF(
- !string.IsNullOrEmpty(parm.productionName),
- it => it.productionName.Contains(parm.productionName)
- )
- .AndIF(
- !string.IsNullOrEmpty(parm.productionCode),
- it => it.productionCode.Contains(parm.productionCode)
- )
- .AndIF(
- !string.IsNullOrEmpty(parm.FeedOrder),
- it => it.FeedOrder.Contains(parm.FeedOrder)
- )
- .AndIF(
- !string.IsNullOrEmpty(parm.CustomerOrder),
- it => it.CustomerOrder.Contains(parm.CustomerOrder)
- )
- .AndIF(!string.IsNullOrEmpty(parm.RouteCode), it => it.RouteCode == parm.RouteCode)
- .AndIF(!string.IsNullOrEmpty(parm.GroupCode), it => it.GroupCode == parm.GroupCode)
- .AndIF(
- parm.WorkorderDate != null && parm.WorkorderDate[0] > DateTime.MinValue,
- it => it.WorkorderDate >= parm.WorkorderDate[0]
- )
- .AndIF(
- parm.WorkorderDate != null && parm.WorkorderDate[1] > DateTime.MinValue,
- it => it.WorkorderDate <= parm.WorkorderDate[1]
- );
- var query = Queryable().Where(predicate.ToExpression());
- var finalQuery = Context
- .Queryable(query)
- .LeftJoin((q, m) => q.productionCode == m.Code)
- .LeftJoin((q, m, m2) => q.productionName == m2.Name)
- .LeftJoin((q, m, m2, r) => q.RouteCode == r.Code)
- .LeftJoin((q, m, m2, r, g) => q.GroupCode == g.GroupCode)
- .LeftJoin((q, m, m2, r, g, u) => q.Unit == u.UnitCode)
- .Select(
- (q, m, m2, r, g, u) =>
- new ProWorkorderDto3()
- {
- IsMatch_material_code = m.Code,
- IsMatch_material_name = m2.Name,
- IsMatch_line = r.Code,
- IsMatch_group = g.GroupCode,
- IsMatch_Unit = u.UnitCode,
- },
- true
- );
-
- var response = finalQuery
- .MergeTable()
- .Distinct()
- .OrderBy(it => it.WorkorderDate)
- .ToPage(parm);
-
- //var query = Queryable()
- // .Where(predicate.ToExpression());
- ////TODO 添加校验
-
- //var query1 = Context.Queryable(query).LeftJoin((q, m) => q.productionCode == m.Code)
- // .Select((q, m) => new ProWorkorderDto3()
- // {
-
- // IsMatch_material_code = m.Code
-
- // }, true);
-
- //var query2 = Context.Queryable(query1).LeftJoin((q1, m) => q1.productionName == m.Name)
- // .Select((q1, m) => new ProWorkorderDto3()
- // {
-
- // IsMatch_material_name = m.Name
-
- // }, true);
-
- //var query3 = Context.Queryable(query2).LeftJoin((q2, r) => q2.RouteCode == r.Code)
- // .Select((q2, r) => new ProWorkorderDto3()
- // {
- // IsMatch_line = r.Code??""
-
- // }, true);
-
- //var query4 = Context.Queryable(query3).LeftJoin((q3, g) => q3.GroupCode == g.GroupCode)
- // .Select((q3, g) => new ProWorkorderDto3()
- // {
- // IsMatch_group = g.GroupCode
-
- // }, true);
- //var response = query4.MergeTable().OrderBy(it => it.WorkorderDate).ToPage(parm);
-
- return response;
+ return _queryService.GetList(parm);
}
///
@@ -157,53 +65,7 @@ namespace DOAN.Service.MES.product
///
public PagedInfo GetList_NOCheck(ProWorkorderQueryDto parm)
{
- if (parm.WorkorderDate != null && parm.WorkorderDate.Length > 0)
- {
- parm.WorkorderDate[0] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[0]);
- parm.WorkorderDate[1] = DOANConvertDate.ConvertLocalDate(parm.WorkorderDate[1]);
- parm.WorkorderDate[0] = parm.WorkorderDate[0].Date;
- parm.WorkorderDate[1] = parm.WorkorderDate[1].Date;
- }
- var predicate = Expressionable
- .Create()
- .And(it => it.PlanNum > 0)
- .AndIF(
- !string.IsNullOrEmpty(parm.productionName),
- it => it.productionName.Contains(parm.productionName)
- )
- .AndIF(
- !string.IsNullOrEmpty(parm.Workorder),
- it => it.Workorder.Contains(parm.Workorder)
- )
- .AndIF(
- !string.IsNullOrEmpty(parm.productionCode),
- it => it.productionCode.Contains(parm.productionCode)
- )
- .AndIF(
- !string.IsNullOrEmpty(parm.FeedOrder),
- it => it.FeedOrder.Contains(parm.FeedOrder)
- )
- .AndIF(
- !string.IsNullOrEmpty(parm.CustomerOrder),
- it => it.CustomerOrder.Contains(parm.CustomerOrder)
- )
- .AndIF(!string.IsNullOrEmpty(parm.RouteCode), it => it.RouteCode == parm.RouteCode)
- .AndIF(!string.IsNullOrEmpty(parm.GroupCode), it => it.GroupCode == parm.GroupCode)
- .AndIF(
- parm.WorkorderDate != null && parm.WorkorderDate[0] > DateTime.MinValue,
- it => it.WorkorderDate >= parm.WorkorderDate[0]
- )
- .AndIF(
- parm.WorkorderDate != null && parm.WorkorderDate[1] > DateTime.MinValue,
- it => it.WorkorderDate <= parm.WorkorderDate[1]
- );
-
- var query = Queryable()
- .Where(predicate.ToExpression())
-
- .ToPage(parm);
-
- return query;
+ return _queryService.GetList_NOCheck(parm);
}
///
@@ -213,9 +75,7 @@ namespace DOAN.Service.MES.product
///
public ProWorkorder GetInfo(string Id)
{
- var response = Queryable().Where(x => x.Id == Id).First();
-
- return response;
+ return _queryService.GetInfo(Id);
}
///
@@ -225,9 +85,7 @@ namespace DOAN.Service.MES.product
///
public ProWorkorder AddProWorkorder(ProWorkorder model)
{
- model.Id = SnowFlakeSingle.Instance.NextId().ToString();
-
- return Context.Insertable(model).ExecuteReturnEntity();
+ return _coreService.AddProWorkorder(model);
}
///
@@ -237,17 +95,18 @@ namespace DOAN.Service.MES.product
///
public int UpdateProWorkorder(ProWorkorder model)
{
- //增加日志
- /*ProWorkorderUpdateLog logObj = new ProWorkorderUpdateLog();
- logObj.Id = XueHua;
- logObj.Workorder = model.Workorder;
- logObj.Log = "修改生产工单";
- logObj.ChangeTime = DateTime.Now;
- logObj.Operator = model.CreatedBy;
- Context.Insertable(logObj).ExecuteCommand();*/
+ return _coreService.UpdateProWorkorder(model);
+ }
- var response = Update(model, true);
- return response;
+ ///
+ /// 插入工单、新增工单
+ ///
+ ///
+ ///
+ ///
+ public int Insert_workOrder(ProWorkorder proWorkorder, string next_id)
+ {
+ return _coreService.Insert_workOrder(proWorkorder, next_id);
}
///
@@ -257,201 +116,7 @@ namespace DOAN.Service.MES.product
///
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 Insert_workOrder(ProWorkorder proWorkorder, string next_id)
- {
- int result = 0;
- proWorkorder.Id = XueHua;
- proWorkorder.WorkorderDate = DOANConvertDate.ConvertLocalDate(
- proWorkorder.WorkorderDate ?? DateTime.MinValue
- );
- // 获取 产品代号
- /*List ProductCodeList = Context
- .Queryable()
- .Where(it => it.DictType == "product_code")
- .ToList();*/
- // XXX 改为从物料清单获取信息
- List mmMaterials = Context
- .Queryable()
- .Where(it => it.Status == "启用")
- .ToList();
- DateTime handleDate = proWorkorder.WorkorderDate.Value;
- //插入工单
- if (!string.IsNullOrEmpty(next_id) && next_id != "-1")
- {
- // 向前插工单
- UseTran2(() =>
- {
- ProWorkorder maxs = Context
- .Queryable()
- .Where(it => it.WorkorderDate == handleDate)
- .OrderByDescending(it => SqlFunc.Right(it.Workorder, 3))
- .First();
- int index = 1;
- if (!string.IsNullOrEmpty(maxs.Workorder))
- {
- index =
- Convert.ToInt32(maxs.Workorder.Substring(maxs.Workorder.Length - 3))
- + 1;
- }
- // proWorkorder.Workorder = "K" + handleDate.ToString("yyyyMMdd") + "_" + proWorkorder.GroupCode + "_" + proWorkorder.RouteCode + "_" + index.ToString("000");
-
- /*string nickCode = ProductCodeList
- .Where(it => it.DictLabel == proWorkorder.productionCode)
- .Select(it => it.DictValue)
- .FirstOrDefault();*/
- string nickCode = mmMaterials
- .Where(it => it.MaterialCode == proWorkorder.productionCode)
- .Select(it => it.Type)
- .FirstOrDefault();
- proWorkorder.Workorder =
- "K"
- + handleDate.ToString("yyyyMMdd")
- + "_"
- + proWorkorder.RouteCode
- + proWorkorder.GroupCode
- + "_"
- + nickCode
- + "_"
- + index.ToString("000");
-
- int sortNum = Context
- .Queryable()
- .Where(it => it.Id == next_id)
- .Select(it => it.Sort.Value)
- .First();
- // 调整序号
- Context
- .Updateable()
- .Where(it => it.WorkorderDate == handleDate)
- .Where(it => it.Sort >= sortNum)
- .SetColumns(it => new ProWorkorder() { Sort = it.Sort + 10 })
- .ExecuteCommand();
- proWorkorder.Sort = sortNum;
- proWorkorder.Status = 1;
-
- //增加日志
- ProWorkorderUpdateLog logObj = new ProWorkorderUpdateLog();
- logObj.Id = XueHua;
- logObj.Workorder = proWorkorder.Workorder;
- logObj.Log = "手动新增";
- logObj.ChangeTime = DateTime.Now;
- logObj.Operator = proWorkorder.CreatedBy;
- logObj.ChangeTime = DateTime.Now;
- logObj.CreatedBy = proWorkorder.CreatedBy;
- UseTran2(() =>
- {
- result = Context.Insertable(proWorkorder).ExecuteCommand();
- Context.Insertable(logObj).ExecuteCommand();
- });
- });
- }
- else
- {
- // 新增工单
- int sortNum = Context
- .Queryable()
- .Where(it => it.WorkorderDate == handleDate)
- .Max(it => it.Sort.Value);
-
- ProWorkorder maxWorkorder = Context
- .Queryable()
- .Where(it => it.WorkorderDate == handleDate)
- .OrderByDescending(it => SqlFunc.Right(it.Workorder, 3))
- .First();
-
- int index = 0;
- if (maxWorkorder == null)
- {
- index = 1;
- proWorkorder.Sort = 10;
- }
- else
- {
- string maxs = maxWorkorder.Workorder;
- index = Convert.ToInt32(maxs.Substring(maxs.Length - 3)) + 1;
- proWorkorder.Sort = maxWorkorder.Sort + 10;
- }
- //proWorkorder.Workorder = "H" + handleDate.ToString("yyyyMMdd") + "_" + proWorkorder.GroupCode + "_" + proWorkorder.RouteCode + "_" + index.ToString("000");
-
- /*string nickCode = ProductCodeList
- .Where(it => it.DictLabel == proWorkorder.productionCode)
- .Select(it => it.DictValue)
- .FirstOrDefault();*/
- string nickCode = mmMaterials
- .Where(it => it.MaterialCode == proWorkorder.productionCode)
- .Select(it => it.Type)
- .FirstOrDefault();
- proWorkorder.Workorder =
- "H"
- + handleDate.ToString("yyyyMMdd")
- + "_"
- + proWorkorder.RouteCode
- + proWorkorder.GroupCode
- + "_"
- + nickCode
- + "_"
- + index.ToString("000");
-
- proWorkorder.Status = 1;
-
- //增加日志
- ProWorkorderUpdateLog logObj = new ProWorkorderUpdateLog();
- logObj.Id = XueHua;
- logObj.Workorder = proWorkorder.Workorder;
- logObj.Log = "手动新增";
- logObj.ChangeTime = DateTime.Now;
- logObj.Operator = proWorkorder.CreatedBy;
- logObj.ChangeTime = DateTime.Now;
- logObj.CreatedBy = proWorkorder.CreatedBy;
- UseTran2(() =>
- {
- result = Context.Insertable(proWorkorder).ExecuteCommand();
- Context.Insertable(logObj).ExecuteCommand();
- });
- }
-
- return result;
+ return _utilityService.Generate_workorder(parm);
}
///
@@ -462,39 +127,7 @@ namespace DOAN.Service.MES.product
///
public int MoveWorkorder(string id, int type)
{
- int result = 0;
- ProWorkorder toMove = Context
- .Queryable()
- .Where(it => it.Id == id)
- .First();
- var pervious = Context
- .Queryable()
- .Where(it => it.WorkorderDate == toMove.WorkorderDate);
-
- //上移动
- if (type == 1)
- {
- pervious = pervious
- .Where(it => it.Sort <= toMove.Sort)
- .OrderByDescending(it => it.Sort);
- }
- //下移
- else if (type == 2)
- {
- pervious = pervious.Where(it => it.Sort >= toMove.Sort).OrderBy(it => it.Sort);
- }
-
- ProWorkorder exchange = pervious.Skip(1).Take(1).First();
- if (exchange != null)
- {
- int temp = toMove.Sort.Value;
- toMove.Sort = exchange.Sort;
- exchange.Sort = temp;
- result += Context.Updateable(toMove).ExecuteCommand();
- result += Context.Updateable(exchange).ExecuteCommand();
- }
-
- return result;
+ return _utilityService.MoveWorkorder(id, type);
}
///
@@ -504,304 +137,7 @@ namespace DOAN.Service.MES.product
///
public int ImportData(IFormFile formFile, string username)
{
- int result = 0;
- List workorderList = new();
- DateTime dateValue = DateTime.MinValue;
- // 获取 产品代号
- /*List ProductCodeList = Context
- .Queryable()
- .Where(it => it.DictType == "product_code")
- .ToList();*/
- // XXX 改为从物料清单获取信息
- List mmMaterials = Context
- .Queryable()
- .Where(it => it.Status == "启用")
- .ToList();
- using (var stream = formFile.OpenReadStream())
- {
- try
- {
- IWorkbook workbook = new XSSFWorkbook(stream);
- ISheet sheet = workbook.GetSheetAt(0);
- // 处理第2行 获取日期
-
- IRow secondRow = sheet.GetRow(1);
- NPOI.SS.UserModel.ICell cell = secondRow.GetCell(0);
-
- // 将单元格的数字值转换为DateTime
- dateValue = cell.DateCellValue.Value;
-
- #region 读取excel
-
- // 遍历每一行
- for (int row = 4; row <= sheet.LastRowNum; row++)
- {
- IRow currentRow = sheet.GetRow(row);
- if (currentRow != null) // 确保行不为空
- {
- ProWorkorder workorder = new ProWorkorder();
-
- //00主体品名
- NPOI.SS.UserModel.ICell currentCell_01 = currentRow.GetCell(0);
-
- workorder.productionName = currentCell_01?.ToString();
- if (
- currentCell_01 == null
- || string.IsNullOrEmpty(workorder.productionName)
- )
- {
- continue;
- }
-
- //01主体型号
- NPOI.SS.UserModel.ICell currentCell_02 = currentRow.GetCell(1);
-
- workorder.productionCode = currentCell_02?.ToString();
- if (
- currentCell_02 == null
- || string.IsNullOrEmpty(workorder.productionCode)
- )
- {
- continue;
- }
-
- //02单位
- NPOI.SS.UserModel.ICell currentCell_04 = currentRow.GetCell(2);
-
- workorder.Unit = currentCell_04?.ToString();
- if (currentCell_04 == null || string.IsNullOrEmpty(workorder.Unit))
- {
- continue;
- }
-
- //3 plan_num
- NPOI.SS.UserModel.ICell currentCell_07 = currentRow.GetCell(3);
- workorder.PlanNum = (int)currentCell_07?.NumericCellValue;
-
- //4 材料型号
- NPOI.SS.UserModel.ICell currentCell_11 = currentRow.GetCell(4);
-
- workorder.MaterialName = currentCell_11?.ToString();
- if (
- currentCell_11 == null
- || string.IsNullOrEmpty(workorder.MaterialName)
- )
- {
- continue;
- }
-
- //5 材料编号
- NPOI.SS.UserModel.ICell currentCell_12 = currentRow.GetCell(5);
-
- workorder.MaterialCode = currentCell_12?.ToString();
- if (
- currentCell_12 == null
- || string.IsNullOrEmpty(workorder.MaterialCode)
- )
- {
- continue;
- }
-
- //6 材质
- NPOI.SS.UserModel.ICell currentCell_13 = currentRow.GetCell(6);
-
- workorder.MaterialtextureCode = currentCell_13?.ToString();
- if (
- currentCell_13 == null
- || string.IsNullOrEmpty(workorder.MaterialtextureCode)
- )
- {
- continue;
- }
-
- //7 炉号
- NPOI.SS.UserModel.ICell currentCell_14 = currentRow.GetCell(7);
-
- workorder.StoveCode = currentCell_14?.ToString();
- if (currentCell_14 == null || string.IsNullOrEmpty(workorder.StoveCode))
- {
- continue;
- }
-
- //8 图号
- NPOI.SS.UserModel.ICell currentCell_15 = currentRow.GetCell(8);
-
- workorder.DrawingCode = currentCell_15?.ToString();
- if (
- currentCell_15 == null
- || string.IsNullOrEmpty(workorder.DrawingCode)
- )
- {
- continue;
- }
-
- //
-
- //9 版本
- NPOI.SS.UserModel.ICell currentCell_16 = currentRow.GetCell(9);
-
- workorder.Version = currentCell_16?.ToString();
-
- if (currentCell_16 == null || string.IsNullOrEmpty(workorder.Version))
- {
- continue;
- }
-
- //10指示日期
- NPOI.SS.UserModel.ICell cell17 = currentRow.GetCell(10);
-
- // 将单元格的数字值转换为DateTime
- workorder.InstructionDate = cell17.DateCellValue.Value;
-
- //装箱容积
- /*NPOI.SS.UserModel.ICell currentCell_0811 = currentRow.GetCell(6);
- workorder.PackageCapacity = (int)currentCell_0811?.NumericCellValue;*/
-
- // 11车间code
- NPOI.SS.UserModel.ICell currentCell_18 = currentRow.GetCell(11);
- if (currentCell_18 == null)
- {
- workorder.WorkshopCode = string.Empty;
- }
- else
- {
- if (currentCell_18.CellType == CellType.Numeric)
- {
- workorder.WorkshopCode =
- currentCell_18.NumericCellValue.ToString();
- }
- else
- {
- workorder.WorkshopCode = currentCell_18.StringCellValue;
- }
- }
-
- //12 组别code
- NPOI.SS.UserModel.ICell currentCell_19 = currentRow.GetCell(12);
- if (currentCell_19 == null)
- {
- workorder.GroupCode = string.Empty;
- }
- else
- {
- if (currentCell_19.CellType == CellType.Numeric)
- {
- workorder.GroupCode =
- currentCell_19.NumericCellValue.ToString();
- }
- else
- {
- workorder.GroupCode = currentCell_19.StringCellValue;
- }
- }
-
- //13 线别code
- NPOI.SS.UserModel.ICell currentCell_20 = currentRow.GetCell(13);
-
- if (currentCell_20 == null)
- {
- workorder.RouteCode = string.Empty;
- }
- else
- {
- if (currentCell_20.CellType == CellType.Numeric)
- {
- workorder.RouteCode =
- currentCell_20.NumericCellValue.ToString();
- }
- else
- {
- workorder.RouteCode = currentCell_20.StringCellValue;
- }
- }
-
- //14 优先级
- NPOI.SS.UserModel.ICell currentCell_21 = currentRow.GetCell(14);
- if (currentCell_21.StringCellValue == "紧急")
- {
- workorder.Priority = 3;
- }
- else
- {
- if (currentCell_21.StringCellValue == "插单")
- {
- workorder.Priority = 2;
- }
- else if (
- currentCell_21.StringCellValue == "正常"
- || string.IsNullOrEmpty(currentCell_11.StringCellValue)
- )
- {
- workorder.Priority = 1;
- }
- }
-
- //15节拍
- NPOI.SS.UserModel.ICell currentCell_22 = currentRow.GetCell(15);
- workorder.Beat = (int)currentCell_22?.NumericCellValue;
-
- //16进料单号(领料)
- NPOI.SS.UserModel.ICell currentCell_010 = currentRow.GetCell(16);
- workorder.FeedOrder = currentCell_010?.StringCellValue;
-
- //17 客户单号(出货)
- NPOI.SS.UserModel.ICell currentCell_011 = currentRow.GetCell(17);
- workorder.CustomerOrder = currentCell_011?.StringCellValue;
-
- //18备注
- NPOI.SS.UserModel.ICell currentCell_012 = currentRow.GetCell(18);
- workorder.Remark01 = currentCell_012?.StringCellValue;
-
- workorder.Id = XueHua;
- workorder.CreatedBy = username;
- workorder.CreatedTime = DateTime.Now;
- workorder.WorkorderDate = dateValue;
- workorder.Status = 1;
- //工单 2024-9-13-组-线-序号
- int index = (row - 3);
- /*string nickCode = ProductCodeList
- .Where(it => it.DictLabel == workorder.productionCode)
- .Select(it => it.DictValue)
- .FirstOrDefault();*/
- //TODO nickCode改为从物料清单进行获取
- string nickCode = mmMaterials
- .Where(it => it.MaterialCode == workorder.productionCode)
- .Select(it => it.Type)
- .FirstOrDefault();
- workorder.Workorder =
- dateValue.ToString("yyyyMMdd")
- + "_"
- + workorder.GroupCode
- + workorder.RouteCode
- + "_"
- + nickCode
- + "_"
- + index.ToString("000");
- workorder.Sort = index * 10;
-
- CultureInfo culture = CultureInfo.CurrentCulture;
-
- workorderList.Add(workorder);
- }
- }
-
- #endregion
- }
- catch (Exception ex)
- {
- return -1;
- }
- }
-
- UseTran2(() =>
- {
- Context
- .Deleteable()
- .Where(it => it.WorkorderDate == dateValue)
- .ExecuteCommand();
- result = Context.Insertable(workorderList).ExecuteCommand();
- });
- return result;
+ return _importService.ImportData(formFile, username);
}
///
@@ -812,324 +148,7 @@ namespace DOAN.Service.MES.product
///
public int ImportDataAppend(IFormFile formFile, string username)
{
- int result = 0;
- List workorderList = new();
- DateTime dateValue = DateTime.MinValue;
-
- // 获取 产品代号
- /*List ProductCodeList = Context
- .Queryable()
- .Where(it => it.DictType == "product_code")
- .ToList();*/
- // XXX 改为从物料清单获取信息
- List mmMaterials = Context
- .Queryable()
- .Where(it => it.Status == "启用")
- .ToList();
- using (var stream = formFile.OpenReadStream())
- {
- try
- {
- IWorkbook workbook = new XSSFWorkbook(stream);
- ISheet sheet = workbook.GetSheetAt(0);
- // 处理第2行 获取日期
-
- IRow secondRow = sheet.GetRow(1);
- NPOI.SS.UserModel.ICell cell = secondRow.GetCell(0);
-
- // 将单元格的数字值转换为DateTime
- dateValue = cell.DateCellValue.Value;
-
- // 遍历每一行
- for (int row = 4; row <= sheet.LastRowNum; row++)
- {
- IRow currentRow = sheet.GetRow(row);
- if (currentRow != null) // 确保行不为空
- {
- ProWorkorder workorder = new ProWorkorder();
-
- #region 读取excel
-
- //00主体品名
- NPOI.SS.UserModel.ICell currentCell_01 = currentRow.GetCell(0);
-
- workorder.productionName = currentCell_01?.ToString();
- if (
- currentCell_01 == null
- || string.IsNullOrEmpty(workorder.productionName)
- )
- {
- continue;
- }
-
- //01主体型号
- NPOI.SS.UserModel.ICell currentCell_02 = currentRow.GetCell(1);
-
- workorder.productionCode = currentCell_02?.ToString();
- if (
- currentCell_02 == null
- || string.IsNullOrEmpty(workorder.productionCode)
- )
- {
- continue;
- }
-
- //02单位
- NPOI.SS.UserModel.ICell currentCell_04 = currentRow.GetCell(2);
-
- workorder.Unit = currentCell_04?.ToString();
- if (currentCell_04 == null || string.IsNullOrEmpty(workorder.Unit))
- {
- continue;
- }
-
- //3 plan_num
- NPOI.SS.UserModel.ICell currentCell_07 = currentRow.GetCell(3);
- workorder.PlanNum = (int)currentCell_07?.NumericCellValue;
-
- //4 材料型号
- NPOI.SS.UserModel.ICell currentCell_11 = currentRow.GetCell(4);
-
- workorder.MaterialName = currentCell_11?.ToString();
- if (
- currentCell_11 == null
- || string.IsNullOrEmpty(workorder.MaterialName)
- )
- {
- continue;
- }
-
- //5 材料编号
- NPOI.SS.UserModel.ICell currentCell_12 = currentRow.GetCell(5);
-
- workorder.MaterialCode = currentCell_12?.ToString();
- if (
- currentCell_12 == null
- || string.IsNullOrEmpty(workorder.MaterialCode)
- )
- {
- continue;
- }
-
- //6 材质
- NPOI.SS.UserModel.ICell currentCell_13 = currentRow.GetCell(6);
-
- workorder.MaterialtextureCode = currentCell_13?.ToString();
- if (
- currentCell_13 == null
- || string.IsNullOrEmpty(workorder.MaterialtextureCode)
- )
- {
- continue;
- }
-
- //7 炉号
- NPOI.SS.UserModel.ICell currentCell_14 = currentRow.GetCell(7);
-
- workorder.StoveCode = currentCell_14?.ToString();
- if (currentCell_14 == null || string.IsNullOrEmpty(workorder.StoveCode))
- {
- continue;
- }
-
- //8 图号
- NPOI.SS.UserModel.ICell currentCell_15 = currentRow.GetCell(8);
-
- workorder.DrawingCode = currentCell_15?.ToString();
- if (
- currentCell_15 == null
- || string.IsNullOrEmpty(workorder.DrawingCode)
- )
- {
- continue;
- }
-
- //
-
- //9 版本
- NPOI.SS.UserModel.ICell currentCell_16 = currentRow.GetCell(9);
-
- workorder.Version = currentCell_16?.ToString();
-
- if (currentCell_16 == null || string.IsNullOrEmpty(workorder.Version))
- {
- continue;
- }
-
- //10指示日期
- NPOI.SS.UserModel.ICell cell17 = currentRow.GetCell(10);
-
- // 将单元格的数字值转换为DateTime
- workorder.InstructionDate = cell17.DateCellValue.Value;
-
- //装箱容积
- /*NPOI.SS.UserModel.ICell currentCell_0811 = currentRow.GetCell(6);
- workorder.PackageCapacity = (int)currentCell_0811?.NumericCellValue;*/
-
- // 11车间code
- NPOI.SS.UserModel.ICell currentCell_18 = currentRow.GetCell(11);
- if (currentCell_18 == null)
- {
- workorder.WorkshopCode = string.Empty;
- }
- else
- {
- if (currentCell_18.CellType == CellType.Numeric)
- {
- workorder.WorkshopCode =
- currentCell_18.NumericCellValue.ToString();
- }
- else
- {
- workorder.WorkshopCode = currentCell_18.StringCellValue;
- }
- }
-
- //12 组别code
- NPOI.SS.UserModel.ICell currentCell_19 = currentRow.GetCell(12);
- if (currentCell_19 == null)
- {
- workorder.GroupCode = string.Empty;
- }
- else
- {
- if (currentCell_19.CellType == CellType.Numeric)
- {
- workorder.GroupCode =
- currentCell_19.NumericCellValue.ToString();
- }
- else
- {
- workorder.GroupCode = currentCell_19.StringCellValue;
- }
- }
-
- //13 线别code
- NPOI.SS.UserModel.ICell currentCell_20 = currentRow.GetCell(13);
-
- if (currentCell_20 == null)
- {
- workorder.RouteCode = string.Empty;
- }
- else
- {
- if (currentCell_20.CellType == CellType.Numeric)
- {
- workorder.RouteCode =
- currentCell_20.NumericCellValue.ToString();
- }
- else
- {
- workorder.RouteCode = currentCell_20.StringCellValue;
- }
- }
-
- //14 优先级
- NPOI.SS.UserModel.ICell currentCell_21 = currentRow.GetCell(14);
- if (currentCell_21.StringCellValue == "紧急")
- {
- workorder.Priority = 3;
- }
- else
- {
- if (currentCell_21.StringCellValue == "插单")
- {
- workorder.Priority = 2;
- }
- else if (
- currentCell_21.StringCellValue == "正常"
- || string.IsNullOrEmpty(currentCell_11.StringCellValue)
- )
- {
- workorder.Priority = 1;
- }
- }
-
- //15节拍
- NPOI.SS.UserModel.ICell currentCell_22 = currentRow.GetCell(15);
- workorder.Beat = (int)currentCell_22?.NumericCellValue;
-
- //16进料单号(领料)
- NPOI.SS.UserModel.ICell currentCell_010 = currentRow.GetCell(16);
- workorder.FeedOrder = currentCell_010?.StringCellValue;
-
- //17 客户单号(出货)
- NPOI.SS.UserModel.ICell currentCell_011 = currentRow.GetCell(17);
- workorder.CustomerOrder = currentCell_011?.StringCellValue;
-
- //18备注
- NPOI.SS.UserModel.ICell currentCell_012 = currentRow.GetCell(18);
- workorder.Remark01 = currentCell_012?.StringCellValue;
-
- #endregion
-
-
- workorder.Id = XueHua;
- workorder.CreatedBy = username;
- workorder.CreatedTime = DateTime.Now;
- workorder.WorkorderDate = dateValue;
- workorder.Status = 1;
- //获取当前日期工单序列号 和序号
- DateTime currentDate = dateValue.Date;
- var MaxWorkorder = Context
- .Queryable()
- .Where(it => it.WorkorderDate == currentDate)
- .OrderByDescending(it => it.Sort)
- .Select(it => new { it.Workorder, it.Sort })
- .First();
- //工单 2024-9-13-组-线-序号
- int index = (row - 3);
-
- int flowNum =
- index
- + Convert.ToInt16(
- MaxWorkorder.Workorder.Substring(
- MaxWorkorder.Workorder.Length - 3,
- 3
- )
- );
-
- //workorder.Workorder = dateValue.ToString("yyyyMMdd") + "_" + workorder.GroupCode + "_" + workorder.RouteCode + "_" + flowNum.ToString("000");
-
- /*string nickCode = ProductCodeList
- .Where(it => it.DictLabel == workorder.productionCode)
- .Select(it => it.DictValue)
- .FirstOrDefault();*/
- //TODO nickCode改为从物料清单进行获取
- string nickCode = mmMaterials
- .Where(it => it.MaterialCode == workorder.productionCode)
- .Select(it => it.Type)
- .FirstOrDefault();
- workorder.Workorder =
- dateValue.ToString("yyyyMMdd")
- + "_"
- + workorder.GroupCode
- + workorder.RouteCode
- + "_"
- + nickCode
- + "_"
- + index.ToString("000");
-
- workorder.Sort = index * 10 + Convert.ToInt16(MaxWorkorder.Sort);
-
- CultureInfo culture = CultureInfo.CurrentCulture;
-
- workorderList.Add(workorder);
- }
- }
- }
- catch (Exception ex)
- {
- return -1;
- }
- }
-
- UseTran2(() =>
- {
- // Context.Deleteable().Where(it => it.WorkorderDate == dateValue).ExecuteCommand();
- result = Context.Insertable(workorderList).ExecuteCommand();
- });
- return result;
+ return _importService.ImportDataAppend(formFile, username);
}
///
@@ -1138,13 +157,9 @@ namespace DOAN.Service.MES.product
///
///
///
- public PagedInfo WorkOrderExport(DateTime exportTime, PagerInfo pager)
+ public List WorkOrderExport(DateTime exportTime)
{
- exportTime = exportTime.Date;
- return Context
- .Queryable()
- .Where(it => it.WorkorderDate == exportTime)
- .ToPage(pager);
+ return _exportService.WorkOrderExport(exportTime);
}
///
@@ -1154,22 +169,7 @@ namespace DOAN.Service.MES.product
///
public List GetMaterialInfo(BaseMaterialListQueryDto5 parm)
{
- var predicate = Expressionable
- .Create()
- .OrIF(
- !string.IsNullOrEmpty(parm.Name_or_Code),
- it => it.Name.Contains(parm.Name_or_Code)
- )
- .OrIF(
- !string.IsNullOrEmpty(parm.Name_or_Code),
- it => it.Code.Contains(parm.Name_or_Code)
- );
-
- return Context
- .Queryable()
- .Where(predicate.ToExpression())
- .Take(20)
- .ToList();
+ return _referenceService.GetMaterialInfo(parm);
}
///
@@ -1179,76 +179,30 @@ namespace DOAN.Service.MES.product
///
public List GetCustomInfo(BaseCustomQueryDto2 parm)
{
- var predicate = Expressionable
- .Create()
- .AndIF(
- !string.IsNullOrEmpty(parm.CustomNo),
- it => it.CustomNo.Contains(parm.CustomNo)
- )
- //.AndIF(
- // !string.IsNullOrEmpty(parm.CustomNo),
- // it => it.CustomName.Contains(parm.CustomNo)
- //)
- .And(it => it.Status == 1);
-
- var response = Context
- .Queryable()
- .Where(predicate.ToExpression())
- .OrderBy(it => it.CustomNo)
- .Take(20)
- .ToList();
- return response;
+ return _referenceService.GetCustomInfo(parm);
}
public List GetProcessRoute(DateTime dateTime)
{
- throw new NotImplementedException();
- }
-
- /*///
- /// 获取工艺路线
- ///
- ///
- ///
- public List GetProcessRoute(DateTime dateTime)
- {
- DateTime dataTO = dateTime.ToLocalTime().Date;
- var query = Context.Queryable().Where(it => it.ScheduleDate == dataTO);
-
- return Context
- .Queryable(query)
- .LeftJoin((q, p) => q.FkBelongRouteCode == p.Code)
- .Select((q, p) => p)
- .Distinct()
- .ToList();
- }*/
-
- public List GetAllRoute()
- {
- return Context.Queryable().ToList();
+ return _referenceService.GetProcessRoute(dateTime);
}
///
- /// 获取班组
+ /// 获取全部工艺路线
///
- ///
///
- /*public List GetGroupList(string route_code, DateTime dateTime)
+ public List GetAllRoute()
{
- dateTime = dateTime.ToLocalTime().Date;
- return Context.Queryable().Where(it => it.FkBelongRouteCode == route_code)
- .Where(it => it.ScheduleDate == dateTime)
- .ToList();
- }*/
-
- //public List GetGroupList(string route_code, DateTime dateTime)
- //{
- // throw new NotImplementedException();
- //}
+ return _referenceService.GetAllRoute();
+ }
+ ///
+ /// 获取组
+ ///
+ ///
public List GetGroupList()
{
- return Context.Queryable().Where(it => it.Status == 1).ToList();
+ return _referenceService.GetGroupList();
}
///
@@ -1258,37 +212,7 @@ namespace DOAN.Service.MES.product
///
public List SearchBOMNum(string workorder_num)
{
- List workOrderBoms = new List();
- List baseMaterialBoms = null;
- ProWorkorder proworkorder = Context
- .Queryable()
- .Where(it => it.Workorder == workorder_num)
- .First();
- if (proworkorder != null)
- {
- baseMaterialBoms = Context
- .Queryable()
- .Where(it => it.InvCode == proworkorder.productionCode)
- .ToList();
-
- if (baseMaterialBoms != null && baseMaterialBoms.Count() > 0)
- {
- foreach (var item in baseMaterialBoms)
- {
- WorkOrderBom objectMaterial = new WorkOrderBom();
-
- objectMaterial.SubInvCode = item.SubInvCode;
- objectMaterial.SubInvName = item.SubInvName;
- objectMaterial.Iusequantity_Single = item.Iusequantity;
- float num = float.Parse(item.Iusequantity) * proworkorder.PlanNum.Value;
- objectMaterial.Iusequantity_All = num.ToString();
- objectMaterial.BOMVersion = item.BOMVersion;
- workOrderBoms.Add(objectMaterial);
- }
- }
- }
-
- return workOrderBoms;
+ return _utilityService.SearchBOMNum(workorder_num);
}
///
@@ -1296,311 +220,41 @@ namespace DOAN.Service.MES.product
///
///
///
+ ///
///
public int WorkOrderLog(string workorder, string log, string Operator)
{
- ProWorkorderUpdateLog logObj = new ProWorkorderUpdateLog();
- logObj.Id = XueHua;
- logObj.Workorder = workorder;
- logObj.Log = log;
- logObj.ChangeTime = DateTime.Now;
- logObj.Operator = Operator;
- logObj.ChangeTime = DateTime.Now;
- logObj.CreatedBy = Operator;
-
- return Context.Insertable(logObj).ExecuteCommand();
+ return _utilityService.WorkOrderLog(workorder, log, Operator);
}
///
- /// 工单进度跟踪
+ /// 导出PDF
+ ///
+ ///
+ ///
+ public Task<(string, Stream)> ExportPDFByQuestPDFDemo(string[] workorderArray)
+ {
+ return _utilityService.ExportPDFByQuestPDFDemo(workorderArray);
+ }
+
+ ///
+ /// 打印工单
+ ///
+ ///
+ ///
+ public Task PrintTicketsByTemplate(ProWorkorderExportDto param)
+ {
+ return _utilityService.PrintTicketsByTemplate(param);
+ }
+
+ ///
+ /// 获取工单进度跟踪列表
///
///
///
- public PagedInfo GetWorkorderTraceProgressList(
- ProWorkorderQueryDto query
- )
+ public PagedInfo GetWorkorderTraceProgressList(ProWorkorderQueryDto query)
{
- var predicate = Expressionable
- .Create()
- .AndIF(
- !string.IsNullOrEmpty(query.productionName),
- it => it.productionName.Contains(query.productionName)
- )
- .AndIF(
- !string.IsNullOrEmpty(query.productionCode),
- it => it.productionCode.Contains(query.productionCode)
- )
- .AndIF(
- !string.IsNullOrEmpty(query.RouteCode),
- it => it.RouteCode == query.RouteCode
- )
- .AndIF(
- !string.IsNullOrEmpty(query.GroupCode),
- it => it.GroupCode == query.GroupCode
- )
- .AndIF(
- query.WorkorderDate != null && query.WorkorderDate[0] > DateTime.MinValue,
- it => it.WorkorderDate >= query.WorkorderDate[0]
- )
- .AndIF(
- query.WorkorderDate != null && query.WorkorderDate[1] > DateTime.MinValue,
- it => it.WorkorderDate <= query.WorkorderDate[1]
- )
- .AndIF(query.Status > -1, it => it.Status == query.Status);
- var query2 = Queryable().Where(predicate.ToExpression());
-
- return Context
- .Queryable(query2)
- .LeftJoin((q, r) => q.Workorder == r.FkWorkorder)
- .Select(
- (q, r) =>
- new ProWorkorderTranceProgressDto()
- {
- PlanNum = q.PlanNum,
- ActualNum = r.FinishedNum,
- },
- true
- )
- .ToPage_NO_Convert(query);
- }
-
- public int Insert_workOrder2(ProWorkorder proWorkorder, string next_id)
- {
- int result = 0;
- proWorkorder.Id = XueHua;
- proWorkorder.WorkorderDate = proWorkorder.WorkorderDate.Value.Date;
- if (!string.IsNullOrEmpty(next_id) && next_id != "-1")
- {
- UseTran2(() =>
- {
- int sortNum = Context
- .Queryable()
- .Where(it => it.Id == next_id)
- .Select(it => it.Sort.Value)
- .First();
- Context
- .Updateable()
- .Where(it => it.WorkorderDate == proWorkorder.WorkorderDate)
- .Where(it => it.Sort >= sortNum)
- .SetColumns(it => new ProWorkorder() { Sort = it.Sort + 10 })
- .ExecuteCommand();
-
- proWorkorder.Sort = sortNum;
- proWorkorder.Status = 1;
-
- Context.Insertable(proWorkorder).ExecuteCommand();
- });
- }
- else
- {
- DateTime dateOnly = proWorkorder.WorkorderDate.Value.Date;
-
- int sortNum = Context
- .Queryable()
- .Where(it => it.WorkorderDate == dateOnly)
- .Max(it => it.Sort.Value);
-
- proWorkorder.Sort = sortNum + 10;
-
- proWorkorder.Status = 1;
-
- Context.Insertable(proWorkorder).ExecuteCommand();
- }
-
- Generate_workorder(
- new ProWorkorderQueryDto2() { WorkorderDate = proWorkorder.WorkorderDate.Value }
- );
-
- return result;
- }
-
- ///
- /// https://www.questpdf.com/
- /// 要打印的工单号
- ///
- ///
- public async Task<(string, Stream)> ExportPDFByQuestPDFDemo(string[] workorderArray)
- {
- var dataList = Context
- .Queryable()
- .Where(it => workorderArray.Contains(it.Workorder))
- .ToList();
- if (dataList.Count() == 0)
- {
- return (null, null);
- }
-
- var ms = new MemoryStream();
- Settings.License = LicenseType.Community;
- Settings.CheckIfAllTextGlyphsAreAvailable = false;
- await Task.Run(() =>
- {
- var document = QuestPDF.Fluent.Document.Create(container =>
- {
- int PageWidth = 40 * 10;
- int PageHeight = 30 * 10;
- for (int i = 0; i < dataList.Count(); i++)
- {
- byte[] imageBytes = PrintHelper.CreateQcCode(
- dataList[i].Workorder,
- PageHeight * 40 + 100,
- PageHeight * 20
- );
- container.Page(page =>
- {
- // 设置页面大小为A4,默认有页边距
- //page.Size(new PageSize(40*10,30*10)); // 移除默认页边距或设置自定义边距
-
- page.Size(PageWidth, PageHeight);
- page.DefaultTextStyle(TextStyle.Default.FontSize(10 * 2 + 2));
- //page.DefaultTextStyle(TextStyle.Default.FontSize(1));
- page.Content()
- .Column(column =>
- {
- column
- .Item()
- .Table(table =>
- {
- // 动态计算列宽,减去必要的边距
- float columnWidth = (PageWidth) / 8;
-
- table.ColumnsDefinition(columns =>
- {
- for (int j = 0; j < 8; j++)
- columns.ConstantColumn(columnWidth);
- });
-
- // 创建一个单元格跨越所有列,用于放置图片
- table
- .Cell()
- .ColumnSpan(8)
- .Height(PageHeight / 14 * 8)
- .Image(imageBytes);
-
- // 剩余内容...
- // 注意:确保剩余内容的高度不超过剩余的页面空间
- // 这里只是一个简单的例子,实际应用中你可能需要更复杂的逻辑来计算剩余可用空间
-
- table
- .Cell()
- .ColumnSpan(2)
- .Border(1)
- .MinHeight(PageHeight / 7)
- .AlignLeft()
- .Padding(1)
- .Text("编号");
- table
- .Cell()
- .ColumnSpan(6)
- .Border(1)
- .MinHeight(PageHeight / 14)
- .AlignLeft()
- .Padding(1)
- .Text(dataList[i].Workorder);
- table
- .Cell()
- .ColumnSpan(2)
- .Border(1)
- .MinHeight(PageHeight / 14)
- .AlignLeft()
- .Padding(1)
- .Text("炉号");
- table
- .Cell()
- .ColumnSpan(6)
- .Border(1)
- .MinHeight(PageHeight / 14)
- .AlignLeft()
- .Padding(1)
- .Text(dataList[i].StoveCode);
- table
- .Cell()
- .ColumnSpan(2)
- .Border(1)
- .MinHeight(PageHeight / 14)
- .AlignLeft()
- .Padding(1)
- .Text("数量");
- table
- .Cell()
- .ColumnSpan(6)
- .Border(1)
- .MinHeight(PageHeight / 14)
- .AlignLeft()
- .Padding(1)
- .Text(dataList[i].PlanNum);
- for (int j = 0; j < 8; j++)
- {
- table
- .Cell()
- .Border(1)
- .MinHeight(PageHeight / 14)
- .AlignCenter()
- .Text($"[{j + 1}]");
- }
- });
- });
- });
- }
- });
- document.GeneratePdf(ms);
- ms.Seek(0, SeekOrigin.Begin);
- });
- var fileName = $"工单({DateTime.Now.ToString("yyyyMMdd")}).pdf";
- return new(fileName, ms);
- }
-
- ///
- /// 根据模板打印工单信息
- ///
- /// 工单号列表与打印路径
- ///
- public async Task PrintTicketsByTemplate(ProWorkorderExportDto param)
- {
- var dataList = await Context
- .Queryable()
- .Where(p => param.WorkorderArray.Contains(p.Workorder))
- .ToListAsync();
- if (dataList.Count == 0)
- {
- return new CustomException(500, "未找到匹配的工单数据");
- }
- Application bartenderApp = null;
- Format bartenderFormat = null;
- try
- {
- bartenderApp = new Application { Visible = false };
- bartenderFormat = bartenderApp.Formats.Open(param.Path);
- // 4. 遍历数据并打印
- foreach (var data in dataList)
- {
- bartenderFormat.SetNamedSubStringValue("workorder", data.Workorder);
- bartenderFormat.SetNamedSubStringValue("stoveCode", data.StoveCode);
- bartenderFormat.SetNamedSubStringValue("qty", data.PlanNum.ToString());
- await Task.Delay(500);
- bartenderFormat.PrintOut(false, false); // 静默打印
- }
-
- return new CustomException(200, "标签打印成功");
- }
- catch (Exception ex)
- {
- // 5. 错误处理(记录日志)
- Console.WriteLine($"打印标签时出错: {ex.Message}");
- return new CustomException(500, $"打印标签失败: {ex.Message}");
- }
- finally
- {
- // 6. 确保资源释放(逆序关闭)
- if (bartenderFormat != null)
- {
- bartenderFormat.Close(BtSaveOptions.btDoNotSaveChanges);
- }
- if (bartenderApp != null)
- {
- bartenderApp.Quit(BtSaveOptions.btDoNotSaveChanges);
- }
- }
+ return _queryService.GetWorkorderTraceProgressList(query);
}
}
}
diff --git a/DOAN.Service/MES/Product/ProWorkorderUtilityService.cs b/DOAN.Service/MES/Product/ProWorkorderUtilityService.cs
new file mode 100644
index 0000000..281b2e4
--- /dev/null
+++ b/DOAN.Service/MES/Product/ProWorkorderUtilityService.cs
@@ -0,0 +1,149 @@
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+using DOAN.Service.MES.product.IService;
+using Infrastructure;
+using Infrastructure.Attribute;
+
+namespace DOAN.Service.MES.product
+{
+ ///
+ /// 工单工具服务
+ ///
+ [AppService(ServiceType = typeof(IProWorkorderUtilityService), ServiceLifetime = LifeTime.Transient)]
+ public class ProWorkorderUtilityService : BaseService, IProWorkorderUtilityService
+ {
+ ///
+ /// 生成工单号
+ ///
+ ///
+ ///
+ 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;
+ ProWorkorder toMove = Context
+ .Queryable()
+ .Where(it => it.Id == id)
+ .First();
+ var pervious = Context
+ .Queryable()
+ .Where(it => it.WorkorderDate == toMove.WorkorderDate);
+
+ //上移动
+ if (type == 1)
+ {
+ pervious = pervious
+ .Where(it => it.Sort <= toMove.Sort)
+ .OrderByDescending(it => it.Sort);
+ }
+ //下移
+ else if (type == 2)
+ {
+ pervious = pervious.Where(it => it.Sort >= toMove.Sort).OrderBy(it => it.Sort);
+ }
+
+ ProWorkorder exchange = pervious.Skip(1).Take(1).First();
+ if (exchange != null)
+ {
+ int temp = toMove.Sort.Value;
+ toMove.Sort = exchange.Sort;
+ exchange.Sort = temp;
+ result += Context.Updateable(toMove).ExecuteCommand();
+ result += Context.Updateable(exchange).ExecuteCommand();
+ }
+
+ return result;
+ }
+
+ ///
+ /// 查询BOM及其所需数量
+ ///
+ ///
+ ///
+ public List SearchBOMNum(string workorder_num)
+ {
+ // 这里需要实现BOM查询逻辑
+ // 暂时返回空列表
+ return new List();
+ }
+
+ ///
+ /// 工单日志
+ ///
+ ///
+ ///
+ ///
+ ///
+ public int WorkOrderLog(string workorder, string log, string Operator)
+ {
+ // 这里需要实现工单日志记录逻辑
+ // 暂时返回成功
+ return 1;
+ }
+
+ ///
+ /// 导出PDF
+ ///
+ ///
+ ///
+ public Task<(string, Stream)> ExportPDFByQuestPDFDemo(string[] workorderArray)
+ {
+ // 这里需要实现PDF导出逻辑
+ // 暂时返回空结果
+ return Task.FromResult(("", (Stream)new MemoryStream()));
+ }
+
+ ///
+ /// 打印工单
+ ///
+ ///
+ ///
+ public Task PrintTicketsByTemplate(ProWorkorderExportDto param)
+ {
+ // 这里需要实现工单打印逻辑
+ // 暂时返回成功
+ return Task.FromResult((CustomException)null);
+ }
+ }
+}
diff --git a/DOAN.Tests/DOAN.Tests.csproj b/DOAN.Tests/DOAN.Tests.csproj
new file mode 100644
index 0000000..cf4d665
--- /dev/null
+++ b/DOAN.Tests/DOAN.Tests.csproj
@@ -0,0 +1,31 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DOAN.Tests/MES/Product/ProWorkorderCoreServiceTests.cs b/DOAN.Tests/MES/Product/ProWorkorderCoreServiceTests.cs
new file mode 100644
index 0000000..d90a983
--- /dev/null
+++ b/DOAN.Tests/MES/Product/ProWorkorderCoreServiceTests.cs
@@ -0,0 +1,109 @@
+using DOAN.Model.MES.product;
+using DOAN.Service.MES.product;
+using DOAN.Service.MES.product.IService;
+using Moq;
+using Xunit;
+
+namespace DOAN.Tests.MES.Product
+{
+ ///
+ /// 工单核心服务测试
+ ///
+ public class ProWorkorderCoreServiceTests
+ {
+ private readonly IProWorkorderCoreService _coreService;
+ private readonly Mock _mockCoreService;
+
+ public ProWorkorderCoreServiceTests()
+ {
+ // 由于ProWorkorderCoreService继承自BaseService,需要模拟依赖
+ // 这里使用Moq创建模拟对象
+ _mockCoreService = new Mock();
+ _coreService = _mockCoreService.Object;
+ }
+
+ ///
+ /// 测试添加生产工单
+ ///
+ [Fact]
+ public void AddProWorkorder_ShouldReturnAddedWorkorder()
+ {
+ // Arrange
+ var workorder = new ProWorkorder
+ {
+ productionName = "测试产品",
+ productionCode = "TEST001",
+ PlanNum = 10
+ };
+
+ var expectedWorkorder = new ProWorkorder
+ {
+ Id = "1",
+ productionName = "测试产品",
+ productionCode = "TEST001",
+ PlanNum = 10
+ };
+
+ _mockCoreService.Setup(x => x.AddProWorkorder(It.IsAny()))
+ .Returns(expectedWorkorder);
+
+ // Act
+ var result = _coreService.AddProWorkorder(workorder);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Equal(expectedWorkorder.Id, result.Id);
+ Assert.Equal(expectedWorkorder.productionName, result.productionName);
+ Assert.Equal(expectedWorkorder.productionCode, result.productionCode);
+ }
+
+ ///
+ /// 测试修改生产工单
+ ///
+ [Fact]
+ public void UpdateProWorkorder_ShouldReturnUpdateResult()
+ {
+ // Arrange
+ var workorder = new ProWorkorder
+ {
+ Id = "1",
+ productionName = "修改后的产品",
+ productionCode = "TEST001",
+ PlanNum = 20
+ };
+
+ _mockCoreService.Setup(x => x.UpdateProWorkorder(It.IsAny()))
+ .Returns(1);
+
+ // Act
+ var result = _coreService.UpdateProWorkorder(workorder);
+
+ // Assert
+ Assert.Equal(1, result);
+ }
+
+ ///
+ /// 测试插入工单
+ ///
+ [Fact]
+ public void Insert_workOrder_ShouldReturnInsertResult()
+ {
+ // Arrange
+ var workorder = new ProWorkorder
+ {
+ productionName = "测试产品",
+ productionCode = "TEST001",
+ PlanNum = 10
+ };
+
+ _mockCoreService.Setup(x => x.Insert_workOrder(It.IsAny(), It.IsAny()))
+ .Returns(1);
+
+ // Act
+ var result = _coreService.Insert_workOrder(workorder, "-1");
+
+ // Assert
+ Assert.Equal(1, result);
+ }
+ }
+}
diff --git a/DOAN.Tests/MES/Product/ProWorkorderEndToEndTests.cs b/DOAN.Tests/MES/Product/ProWorkorderEndToEndTests.cs
new file mode 100644
index 0000000..7fd317c
--- /dev/null
+++ b/DOAN.Tests/MES/Product/ProWorkorderEndToEndTests.cs
@@ -0,0 +1,175 @@
+using DOAN.Model.MES.base_;
+using DOAN.Model.MES.base_.Dto;
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+using DOAN.Service.MES.product;
+using DOAN.Service.MES.product.IService;
+using Infrastructure.Pagination;
+using Moq;
+using Xunit;
+
+namespace DOAN.Tests.MES.Product
+{
+ ///
+ /// 工单服务端到端测试
+ ///
+ public class ProWorkorderEndToEndTests
+ {
+ private readonly ProWorkorderService _workorderService;
+ private readonly Mock _mockCoreService;
+ private readonly Mock _mockQueryService;
+ private readonly Mock _mockImportService;
+ private readonly Mock _mockExportService;
+ private readonly Mock _mockUtilityService;
+ private readonly Mock _mockReferenceService;
+
+ public ProWorkorderEndToEndTests()
+ {
+ // 创建所有子Service的模拟对象
+ _mockCoreService = new Mock();
+ _mockQueryService = new Mock();
+ _mockImportService = new Mock();
+ _mockExportService = new Mock();
+ _mockUtilityService = new Mock();
+ _mockReferenceService = new Mock();
+
+ // 初始化主Service
+ _workorderService = new ProWorkorderService(
+ _mockCoreService.Object,
+ _mockQueryService.Object,
+ _mockImportService.Object,
+ _mockExportService.Object,
+ _mockUtilityService.Object,
+ _mockReferenceService.Object
+ );
+ }
+
+ ///
+ /// 测试完整的工单创建和查询流程
+ ///
+ [Fact]
+ public void WorkorderCreationAndQueryFlow_ShouldWorkCorrectly()
+ {
+ // Arrange - 准备添加工单的测试数据
+ var workorder = new ProWorkorder
+ {
+ Id = "WO123",
+ productionName = "端到端测试产品",
+ productionCode = "E2E001",
+ PlanNum = 50
+ };
+
+ // 模拟添加工单的返回结果
+ _mockCoreService.Setup(x => x.AddProWorkorder(It.IsAny()))
+ .Returns(workorder);
+
+ // 模拟获取工单详情的返回结果
+ _mockQueryService.Setup(x => x.GetInfo(workorder.Id))
+ .Returns(workorder);
+
+ // 模拟查询工单列表的返回结果
+ var queryDto = new ProWorkorderQueryDto
+ {
+ productionCode = "E2E001"
+ };
+
+ var expectedListResult = new PagedInfo
+ {
+ Total = 1,
+ Result = new List
+ {
+ new ProWorkorderDto3
+ {
+ Id = workorder.Id,
+ productionName = workorder.productionName,
+ productionCode = workorder.productionCode,
+ PlanNum = workorder.PlanNum
+ }
+ }
+ };
+
+ _mockQueryService.Setup(x => x.GetList(queryDto))
+ .Returns(expectedListResult);
+
+ // Act 1 - 添加工单
+ var addedWorkorder = _workorderService.AddProWorkorder(workorder);
+
+ // Assert 1 - 验证添加工单的结果
+ Assert.NotNull(addedWorkorder);
+ Assert.Equal(workorder.Id, addedWorkorder.Id);
+ Assert.Equal(workorder.productionName, addedWorkorder.productionName);
+ _mockCoreService.Verify(x => x.AddProWorkorder(workorder), Times.Once);
+
+ // Act 2 - 查询工单详情
+ var retrievedWorkorder = _workorderService.GetInfo(workorder.Id);
+
+ // Assert 2 - 验证查询工单详情的结果
+ Assert.NotNull(retrievedWorkorder);
+ Assert.Equal(workorder.Id, retrievedWorkorder.Id);
+ Assert.Equal(workorder.productionName, retrievedWorkorder.productionName);
+ _mockQueryService.Verify(x => x.GetInfo(workorder.Id), Times.Once);
+
+ // Act 3 - 查询工单列表
+ var workorderList = _workorderService.GetList(queryDto);
+
+ // Assert 3 - 验证查询工单列表的结果
+ Assert.NotNull(workorderList);
+ Assert.Equal(expectedListResult.Total, workorderList.Total);
+ Assert.Single(workorderList.Result);
+ Assert.Equal(workorder.Id, workorderList.Result[0].Id);
+ _mockQueryService.Verify(x => x.GetList(queryDto), Times.Once);
+ }
+
+ ///
+ /// 测试工单服务的API兼容性
+ ///
+ [Fact]
+ public void ApiCompatibility_ShouldMaintainSameInterface()
+ {
+ // 验证所有原始方法都能通过新的服务架构访问
+ // 这确保了上游模块无需修改即可正常工作
+
+ // 测试查询方法
+ var queryDto = new ProWorkorderQueryDto();
+ _mockQueryService.Setup(x => x.GetList(queryDto))
+ .Returns(new PagedInfo());
+ var listResult = _workorderService.GetList(queryDto);
+ Assert.NotNull(listResult);
+
+ // 测试添加工单方法
+ var workorder = new ProWorkorder();
+ _mockCoreService.Setup(x => x.AddProWorkorder(workorder))
+ .Returns(workorder);
+ var addResult = _workorderService.AddProWorkorder(workorder);
+ Assert.NotNull(addResult);
+
+ // 测试修改工单方法
+ _mockCoreService.Setup(x => x.UpdateProWorkorder(workorder))
+ .Returns(1);
+ var updateResult = _workorderService.UpdateProWorkorder(workorder);
+ Assert.Equal(1, updateResult);
+
+ // 测试获取引用数据方法
+ var materialQueryDto = new BaseMaterialListQueryDto5();
+ _mockReferenceService.Setup(x => x.GetMaterialInfo(materialQueryDto))
+ .Returns(new List());
+ var materialResult = _workorderService.GetMaterialInfo(materialQueryDto);
+ Assert.NotNull(materialResult);
+ }
+
+ ///
+ /// 测试工单服务的异常处理
+ ///
+ [Fact]
+ public void ExceptionHandling_ShouldBeConsistent()
+ {
+ // 模拟核心服务抛出异常
+ var workorder = new ProWorkorder();
+ _mockCoreService.Setup(x => x.AddProWorkorder(workorder))
+ .Throws(new Exception("模拟添加失败"));
+
+ // 验证异常能够正确传递
+ Assert.Throws(() => _workorderService.AddProWorkorder(workorder));
+ }
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Tests/MES/Product/ProWorkorderIntegrationTests.cs b/DOAN.Tests/MES/Product/ProWorkorderIntegrationTests.cs
new file mode 100644
index 0000000..5cc818d
--- /dev/null
+++ b/DOAN.Tests/MES/Product/ProWorkorderIntegrationTests.cs
@@ -0,0 +1,197 @@
+using DOAN.Model.MES.base_;
+using DOAN.Model.MES.base_.Dto;
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+using DOAN.Service.MES.product;
+using DOAN.Service.MES.product.IService;
+using Infrastructure.Pagination;
+using Moq;
+using Xunit;
+
+namespace DOAN.Tests.MES.Product
+{
+ ///
+ /// 工单服务集成测试
+ ///
+ public class ProWorkorderIntegrationTests
+ {
+ private readonly ProWorkorderService _workorderService;
+ private readonly Mock _mockCoreService;
+ private readonly Mock _mockQueryService;
+ private readonly Mock _mockImportService;
+ private readonly Mock _mockExportService;
+ private readonly Mock _mockUtilityService;
+ private readonly Mock _mockReferenceService;
+
+ public ProWorkorderIntegrationTests()
+ {
+ // 创建所有子Service的模拟对象
+ _mockCoreService = new Mock();
+ _mockQueryService = new Mock();
+ _mockImportService = new Mock();
+ _mockExportService = new Mock();
+ _mockUtilityService = new Mock();
+ _mockReferenceService = new Mock();
+
+ // 初始化主Service
+ _workorderService = new ProWorkorderService(
+ _mockCoreService.Object,
+ _mockQueryService.Object,
+ _mockImportService.Object,
+ _mockExportService.Object,
+ _mockUtilityService.Object,
+ _mockReferenceService.Object
+ );
+ }
+
+ ///
+ /// 测试工单服务集成 - 查询列表
+ ///
+ [Fact]
+ public void GetList_ShouldCallQueryService()
+ {
+ // Arrange
+ var queryDto = new ProWorkorderQueryDto
+ {
+ productionName = "集成测试产品"
+ };
+
+ var expectedResult = new PagedInfo
+ {
+ Total = 1,
+ Result = new List
+ {
+ new ProWorkorderDto3
+ {
+ productionName = "集成测试产品"
+ }
+ }
+ };
+
+ _mockQueryService.Setup(x => x.GetList(queryDto))
+ .Returns(expectedResult);
+
+ // Act
+ var result = _workorderService.GetList(queryDto);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Equal(expectedResult.Total, result.Total);
+ Assert.Single(result.Result);
+ _mockQueryService.Verify(x => x.GetList(queryDto), Times.Once);
+ }
+
+ ///
+ /// 测试工单服务集成 - 添加工单
+ ///
+ [Fact]
+ public void AddProWorkorder_ShouldCallCoreService()
+ {
+ // Arrange
+ var workorder = new ProWorkorder
+ {
+ productionName = "集成测试产品",
+ productionCode = "INT001"
+ };
+
+ var expectedWorkorder = new ProWorkorder
+ {
+ Id = "1",
+ productionName = "集成测试产品",
+ productionCode = "INT001"
+ };
+
+ _mockCoreService.Setup(x => x.AddProWorkorder(workorder))
+ .Returns(expectedWorkorder);
+
+ // Act
+ var result = _workorderService.AddProWorkorder(workorder);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Equal(expectedWorkorder.Id, result.Id);
+ _mockCoreService.Verify(x => x.AddProWorkorder(workorder), Times.Once);
+ }
+
+ ///
+ /// 测试工单服务集成 - 获取详情
+ ///
+ [Fact]
+ public void GetInfo_ShouldCallQueryService()
+ {
+ // Arrange
+ var workorderId = "1";
+ var expectedWorkorder = new ProWorkorder
+ {
+ Id = workorderId,
+ productionName = "集成测试产品"
+ };
+
+ _mockQueryService.Setup(x => x.GetInfo(workorderId))
+ .Returns(expectedWorkorder);
+
+ // Act
+ var result = _workorderService.GetInfo(workorderId);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Equal(expectedWorkorder.Id, result.Id);
+ _mockQueryService.Verify(x => x.GetInfo(workorderId), Times.Once);
+ }
+
+ ///
+ /// 测试工单服务集成 - 生成工单号
+ ///
+ [Fact]
+ public void Generate_workorder_ShouldCallUtilityService()
+ {
+ // Arrange
+ var queryDto = new ProWorkorderQueryDto2
+ {
+ productionName = "集成测试产品"
+ };
+
+ _mockUtilityService.Setup(x => x.Generate_workorder(queryDto))
+ .Returns(1);
+
+ // Act
+ var result = _workorderService.Generate_workorder(queryDto);
+
+ // Assert
+ Assert.Equal(1, result);
+ _mockUtilityService.Verify(x => x.Generate_workorder(queryDto), Times.Once);
+ }
+
+ ///
+ /// 测试工单服务集成 - 获取物料信息
+ ///
+ [Fact]
+ public void GetMaterialInfo_ShouldCallReferenceService()
+ {
+ // Arrange
+ var queryDto = new BaseMaterialListQueryDto5
+ {
+ MaterialName = "集成测试物料"
+ };
+
+ var expectedResult = new List
+ {
+ new BaseMaterialList
+ {
+ MaterialName = "集成测试物料"
+ }
+ };
+
+ _mockReferenceService.Setup(x => x.GetMaterialInfo(queryDto))
+ .Returns(expectedResult);
+
+ // Act
+ var result = _workorderService.GetMaterialInfo(queryDto);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Single(result);
+ _mockReferenceService.Verify(x => x.GetMaterialInfo(queryDto), Times.Once);
+ }
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Tests/MES/Product/ProWorkorderQueryServiceTests.cs b/DOAN.Tests/MES/Product/ProWorkorderQueryServiceTests.cs
new file mode 100644
index 0000000..752f4c9
--- /dev/null
+++ b/DOAN.Tests/MES/Product/ProWorkorderQueryServiceTests.cs
@@ -0,0 +1,202 @@
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.product.Dto;
+using DOAN.Service.MES.product;
+using DOAN.Service.MES.product.IService;
+using Infrastructure.Pagination;
+using Moq;
+using Xunit;
+
+namespace DOAN.Tests.MES.Product
+{
+ ///
+ /// 工单查询服务测试
+ ///
+ public class ProWorkorderQueryServiceTests
+ {
+ private readonly IProWorkorderQueryService _queryService;
+ private readonly Mock _mockQueryService;
+
+ public ProWorkorderQueryServiceTests()
+ {
+ // 由于ProWorkorderQueryService继承自BaseService,需要模拟依赖
+ // 这里使用Moq创建模拟对象
+ _mockQueryService = new Mock();
+ _queryService = _mockQueryService.Object;
+ }
+
+ ///
+ /// 测试查询生产工单列表
+ ///
+ [Fact]
+ public void GetList_ShouldReturnPagedWorkorders()
+ {
+ // Arrange
+ var queryDto = new ProWorkorderQueryDto
+ {
+ productionName = "测试产品",
+ productionCode = "TEST001"
+ };
+
+ var expectedResult = new PagedInfo
+ {
+ Total = 1,
+ Result = new List
+ {
+ new ProWorkorderDto3
+ {
+ productionName = "测试产品",
+ productionCode = "TEST001"
+ }
+ }
+ };
+
+ _mockQueryService.Setup(x => x.GetList(It.IsAny()))
+ .Returns(expectedResult);
+
+ // Act
+ var result = _queryService.GetList(queryDto);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Equal(expectedResult.Total, result.Total);
+ Assert.Single(result.Result);
+ Assert.Equal(expectedResult.Result[0].productionName, result.Result[0].productionName);
+ Assert.Equal(expectedResult.Result[0].productionCode, result.Result[0].productionCode);
+ }
+
+ ///
+ /// 测试获取工单无校验
+ ///
+ [Fact]
+ public void GetList_NOCheck_ShouldReturnPagedWorkorders()
+ {
+ // Arrange
+ var queryDto = new ProWorkorderQueryDto
+ {
+ productionName = "测试产品",
+ productionCode = "TEST001"
+ };
+
+ var expectedResult = new PagedInfo
+ {
+ Total = 1,
+ Result = new List
+ {
+ new ProWorkorderDto
+ {
+ productionName = "测试产品",
+ productionCode = "TEST001"
+ }
+ }
+ };
+
+ _mockQueryService.Setup(x => x.GetList_NOCheck(It.IsAny()))
+ .Returns(expectedResult);
+
+ // Act
+ var result = _queryService.GetList_NOCheck(queryDto);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Equal(expectedResult.Total, result.Total);
+ Assert.Single(result.Result);
+ Assert.Equal(expectedResult.Result[0].productionName, result.Result[0].productionName);
+ Assert.Equal(expectedResult.Result[0].productionCode, result.Result[0].productionCode);
+ }
+
+ ///
+ /// 测试获取工单详情
+ ///
+ [Fact]
+ public void GetInfo_ShouldReturnWorkorder()
+ {
+ // Arrange
+ var workorderId = "1";
+ var expectedWorkorder = new ProWorkorder
+ {
+ Id = workorderId,
+ productionName = "测试产品",
+ productionCode = "TEST001"
+ };
+
+ _mockQueryService.Setup(x => x.GetInfo(It.IsAny()))
+ .Returns(expectedWorkorder);
+
+ // Act
+ var result = _queryService.GetInfo(workorderId);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Equal(expectedWorkorder.Id, result.Id);
+ Assert.Equal(expectedWorkorder.productionName, result.productionName);
+ Assert.Equal(expectedWorkorder.productionCode, result.productionCode);
+ }
+
+ ///
+ /// 测试获取工单进度跟踪列表
+ ///
+ [Fact]
+ public void GetWorkorderTraceProgressList_ShouldReturnPagedProgress()
+ {
+ // Arrange
+ var queryDto = new ProWorkorderQueryDto
+ {
+ productionName = "测试产品"
+ };
+
+ var expectedResult = new PagedInfo
+ {
+ Total = 1,
+ Result = new List
+ {
+ new ProWorkorderTranceProgressDto
+ {
+ productionName = "测试产品"
+ }
+ }
+ };
+
+ _mockQueryService.Setup(x => x.GetWorkorderTraceProgressList(It.IsAny()))
+ .Returns(expectedResult);
+
+ // Act
+ var result = _queryService.GetWorkorderTraceProgressList(queryDto);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Equal(expectedResult.Total, result.Total);
+ Assert.Single(result.Result);
+ Assert.Equal(expectedResult.Result[0].productionName, result.Result[0].productionName);
+ }
+
+ ///
+ /// 测试查询BOM及其所需数量
+ ///
+ [Fact]
+ public void SearchBOMNum_ShouldReturnBomList()
+ {
+ // Arrange
+ var workorderNum = "WO001";
+ var expectedResult = new List
+ {
+ new WorkOrderBom
+ {
+ PartId = "1",
+ PartName = "测试部件"
+ }
+ };
+
+ _mockQueryService.Setup(x => x.SearchBOMNum(It.IsAny()))
+ .Returns(expectedResult);
+
+ // Act
+ var result = _queryService.SearchBOMNum(workorderNum);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.Single(result);
+ Assert.Equal(expectedResult[0].PartId, result[0].PartId);
+ Assert.Equal(expectedResult[0].PartName, result[0].PartName);
+ }
+ }
+}
diff --git a/DOAN.Tests/UnitTest1.cs b/DOAN.Tests/UnitTest1.cs
new file mode 100644
index 0000000..ac2eb51
--- /dev/null
+++ b/DOAN.Tests/UnitTest1.cs
@@ -0,0 +1,10 @@
+namespace DOAN.Tests;
+
+public class UnitTest1
+{
+ [Fact]
+ public void Test1()
+ {
+
+ }
+}
\ No newline at end of file