Commit 5c16ef62 by yiyu.li
parents 3d2af0bc ae802d94
...@@ -10,7 +10,7 @@ using Siger.Middlelayer.AccRepository.Request; ...@@ -10,7 +10,7 @@ using Siger.Middlelayer.AccRepository.Request;
using Siger.Middlelayer.Common; using Siger.Middlelayer.Common;
using Siger.ApiCommon.Filters; using Siger.ApiCommon.Filters;
using Siger.Middlelayer.Common.Extensions; using Siger.Middlelayer.Common.Extensions;
using Siger.Middlelayer.Common.Log; using Siger.Middlelayer.Log;
using Siger.Middlelayer.Common.ModuleEnum; using Siger.Middlelayer.Common.ModuleEnum;
using Siger.Middlelayer.Repository; using Siger.Middlelayer.Repository;
using Siger.Middlelayer.Repository.Repositories.Interface; using Siger.Middlelayer.Repository.Repositories.Interface;
...@@ -21,6 +21,7 @@ using Siger.Middlelayer.Repository.Entities; ...@@ -21,6 +21,7 @@ using Siger.Middlelayer.Repository.Entities;
using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
using Siger.Middlelayer.AccRepository.Response; using Siger.Middlelayer.AccRepository.Response;
using Siger.Middlelayer.Common.Helpers; using Siger.Middlelayer.Common.Helpers;
using NPOI.SS.Formula;
namespace Siger.ApiACC.Controllers namespace Siger.ApiACC.Controllers
{ {
...@@ -39,10 +40,11 @@ namespace Siger.ApiACC.Controllers ...@@ -39,10 +40,11 @@ namespace Siger.ApiACC.Controllers
private readonly IProductionBeatSetRepository _productionBeatSet; private readonly IProductionBeatSetRepository _productionBeatSet;
private readonly IAutomationFixtureToolsProductRepository _automationFixtureToolsProduct; private readonly IAutomationFixtureToolsProductRepository _automationFixtureToolsProduct;
private readonly IAutomationFixtureToolsRepository _automationFixtureTools; private readonly IAutomationFixtureToolsRepository _automationFixtureTools;
private readonly IProductRouteRepository _productRoute;
public AutomationController(IUnitOfWork unitOfWork,ISigerProjectLevelSectionRepository sigerProjectLevelSection,IAutomationLineMode automationLineMode,IAutomationMachineStatus automationMachineStatus,ISigerDict sigerDict,IAutomationTaskListRepository automationTaskList, public AutomationController(IUnitOfWork unitOfWork,ISigerProjectLevelSectionRepository sigerProjectLevelSection,IAutomationLineMode automationLineMode,IAutomationMachineStatus automationMachineStatus,ISigerDict sigerDict,IAutomationTaskListRepository automationTaskList,
ISigerProjectMachineAttributionRepository sigerProjectMachineAttribution, IAutomationFixtureMonitor automationFixtureMonitor, IAutomationLocationRepository automationLocation, IProductionBeatSetRepository productionBeatSet, IAutomationFixtureToolsProductRepository automationFixtureToolsProduct, ISigerProjectMachineAttributionRepository sigerProjectMachineAttribution, IAutomationFixtureMonitor automationFixtureMonitor, IAutomationLocationRepository automationLocation, IProductionBeatSetRepository productionBeatSet, IAutomationFixtureToolsProductRepository automationFixtureToolsProduct,
IAutomationFixtureToolsRepository automationFixtureTools) IAutomationFixtureToolsRepository automationFixtureTools, IProductRouteRepository productRoute)
{ {
_unitOfWork = unitOfWork; _unitOfWork = unitOfWork;
_sigerProjectLevelSection = sigerProjectLevelSection; _sigerProjectLevelSection = sigerProjectLevelSection;
...@@ -56,6 +58,7 @@ namespace Siger.ApiACC.Controllers ...@@ -56,6 +58,7 @@ namespace Siger.ApiACC.Controllers
_productionBeatSet = productionBeatSet; _productionBeatSet = productionBeatSet;
_automationFixtureToolsProduct = automationFixtureToolsProduct; _automationFixtureToolsProduct = automationFixtureToolsProduct;
_automationFixtureTools = automationFixtureTools; _automationFixtureTools = automationFixtureTools;
_productRoute = productRoute;
} }
/// <summary> /// <summary>
...@@ -105,6 +108,7 @@ namespace Siger.ApiACC.Controllers ...@@ -105,6 +108,7 @@ namespace Siger.ApiACC.Controllers
Logger.WriteLineInfo($"AutoProcess 未配置设备类型字典"); Logger.WriteLineInfo($"AutoProcess 未配置设备类型字典");
throw new BadRequestException(AccEnum.AutomationDictNotfound); throw new BadRequestException(AccEnum.AutomationDictNotfound);
} }
Logger.WriteLineInfo($"设备状态更变{request.status}触发");
if (_automationTaskList.CanTask(PID, machineAttr.station)) if (_automationTaskList.CanTask(PID, machineAttr.station))
{ {
var uploadStation = stationDicts.Where(f => f.dkey == DictKeyValConst.UploadloadStation); var uploadStation = stationDicts.Where(f => f.dkey == DictKeyValConst.UploadloadStation);
...@@ -239,6 +243,7 @@ namespace Siger.ApiACC.Controllers ...@@ -239,6 +243,7 @@ namespace Siger.ApiACC.Controllers
Logger.WriteLineInfo($"AutoProcess 未配置设备类型字典"); Logger.WriteLineInfo($"AutoProcess 未配置设备类型字典");
throw new BadRequestException(AccEnum.AutomationDictNotfound); throw new BadRequestException(AccEnum.AutomationDictNotfound);
} }
//更新Tasklist //更新Tasklist
PlCfeeback(taskObj, request.status, stationDicts); PlCfeeback(taskObj, request.status, stationDicts);
...@@ -291,6 +296,7 @@ namespace Siger.ApiACC.Controllers ...@@ -291,6 +296,7 @@ namespace Siger.ApiACC.Controllers
taskObj.completetime = DateTime.Now; taskObj.completetime = DateTime.Now;
_automationTaskList.Update(taskObj); _automationTaskList.Update(taskObj);
var monitor = _automationFixtureMonitor.Get(f => f.section == taskObj.sectionid);
//PLC 反馈结束. //PLC 反馈结束.
if (status == (int)TaskResultStatus.Complated) if (status == (int)TaskResultStatus.Complated)
{ {
...@@ -313,18 +319,22 @@ namespace Siger.ApiACC.Controllers ...@@ -313,18 +319,22 @@ namespace Siger.ApiACC.Controllers
location.ordernumber = taskObj.ordercode; location.ordernumber = taskObj.ordercode;
location.productcode = taskObj.productcode; location.productcode = taskObj.productcode;
location.productid = taskObj.productid; location.productid = taskObj.productid;
location.routeid = taskObj.route;
location.sn = taskObj.sn; location.sn = taskObj.sn;
_automationLocation.Update(location); _automationLocation.Update(location);
var monitor = _automationFixtureMonitor.Get(f => f.section == taskObj.sectionid);
if (monitor != null)
{
monitor.section = 0;
_automationFixtureMonitor.Update(monitor);
}
} }
} }
if (monitor != null)
{
monitor.section = 0;
}
}
if (monitor != null)
{
monitor.status = status;
_automationFixtureMonitor.Update(monitor);
} }
} }
...@@ -378,11 +388,11 @@ namespace Siger.ApiACC.Controllers ...@@ -378,11 +388,11 @@ namespace Siger.ApiACC.Controllers
{ {
if (cleanMachine.status == (int)Automation.MachineStatus.Complated) if (cleanMachine.status == (int)Automation.MachineStatus.Complated)
{ {
Logger.WriteLineInfo($"AutoProcess 有清洗机完成,创建清洗机Task"); Logger.WriteLineError($"AutoProcess 有清洗机完成,创建清洗机Task");
var monitor = _automationFixtureMonitor.Get(f => f.section == cleanMachine.section); var monitor = _automationFixtureMonitor.Get(f => f.section == cleanMachine.section);
if (monitor != null) if (monitor != null)
{ {
CreateTask(cleanMachine, TaskActionType.Unload, TaskAction.Step_QXJ_LK, monitor.fixtureguid, monitor.ordernumber, monitor.sn, "无程序",monitor.productId, monitor.productCode, monitor.locationId); CreateTask(cleanMachine.section, TaskActionType.Unload, TaskAction.Step_QXJ_LK, monitor.fixtureguid, monitor.ordernumber, monitor.sn, "无程序",monitor.productId, monitor.productCode, monitor.locationId,monitor.route);
return; //完成当前任务 退出 return; //完成当前任务 退出
} }
} }
...@@ -390,14 +400,14 @@ namespace Siger.ApiACC.Controllers ...@@ -390,14 +400,14 @@ namespace Siger.ApiACC.Controllers
//优先级2 :其他设备待上料 (立库->加工中心) //优先级2 :其他设备待上料 (立库->加工中心)
var freeMachine = machineStatusList.FirstOrDefault(f=>f.status==(int)Automation.MachineStatus.Waiting); var freeMachine = machineStatusList.Where(f=>f.status==(int)Automation.MachineStatus.Waiting);
if (freeMachine != null) if (freeMachine != null)
{ {
Logger.WriteLineInfo($"AutoProcess 普通空闲,创建普通设备上料Task"); Logger.WriteLineError($"AutoProcess 普通空闲,创建普通设备上料Task");
var location = SelectLocation(freeMachine.machineid); var location = SelectLocation(freeMachine.Select(s=>s.machineid).ToList());
if (location != null) if (location != null)
{ {
var monitor = _automationFixtureMonitor.Get(f => f.section == freeMachine.section); var monitor = _automationFixtureMonitor.Get(f => f.section == location.section);
if (monitor == null) if (monitor == null)
{ {
_automationFixtureMonitor.Insert(new siger_automation_fixture_tools_monitor _automationFixtureMonitor.Insert(new siger_automation_fixture_tools_monitor
...@@ -410,10 +420,11 @@ namespace Siger.ApiACC.Controllers ...@@ -410,10 +420,11 @@ namespace Siger.ApiACC.Controllers
fixturename = location.fixturename, fixturename = location.fixturename,
ordernumber = location.ordernumber, ordernumber = location.ordernumber,
locationId = location.location, locationId = location.location,
section = freeMachine.section, section = location.section,
sn = location.sn, sn = location.sn,
createtime = DateTime.Now, createtime = DateTime.Now,
updatetime = DateTime.Now updatetime = DateTime.Now,
route=location.route,
}); });
} }
else else
...@@ -427,10 +438,33 @@ namespace Siger.ApiACC.Controllers ...@@ -427,10 +438,33 @@ namespace Siger.ApiACC.Controllers
monitor.locationId = location.location; monitor.locationId = location.location;
monitor.sn = location.sn; monitor.sn = location.sn;
monitor.updatetime = DateTime.Now; monitor.updatetime = DateTime.Now;
monitor.route = location.route;
_automationFixtureMonitor.Update(monitor); _automationFixtureMonitor.Update(monitor);
} }
CreateTask(freeMachine, TaskActionType.Load, TaskAction.Step_LK_JGZX, location.fixture, location.ordernumber, location.sn, location.pn,location.productId, location.productCode, location.location);
return; //完成当前任务 退出 // * 更新下一个工序到储位
var locationObj = _automationLocation.Get(f => f.id == location.lid);
if (locationObj != null)
{
var doneRoute = _productRoute.Get(f => f.id == location.route);
if (doneRoute == null)
return;
var productRoutes = _productRoute.GetList(f => f.projectId == PID && f.productId == location.productId && f.status == (int)RowState.Valid && f.serialNumber > doneRoute.serialNumber);
if (!productRoutes.Any())
{
locationObj.route = string.Empty;
}
else
{
var nextRoute = productRoutes.OrderBy(d => d.serialNumber).FirstOrDefault();
locationObj.route = nextRoute != null ? nextRoute.id.ToString() : "";
}
_automationLocation.Update(locationObj);
CreateTask(location.section, TaskActionType.Load, TaskAction.Step_LK_JGZX, location.fixture, location.ordernumber, location.sn, location.pn, location.productId, location.productCode, location.location,location.route);
return; //完成当前任务 退出
}
} }
} }
//优先级3:其他设备下料 (加工中心 ->清洗机) //优先级3:其他设备下料 (加工中心 ->清洗机)
...@@ -439,15 +473,15 @@ namespace Siger.ApiACC.Controllers ...@@ -439,15 +473,15 @@ namespace Siger.ApiACC.Controllers
var fullMachine = machineStatusList.FirstOrDefault(f => f.status == (int)Automation.MachineStatus.Complated); var fullMachine = machineStatusList.FirstOrDefault(f => f.status == (int)Automation.MachineStatus.Complated);
if (fullMachine != null && cleanMachine.status==(int)Automation.MachineStatus.Waiting) if (fullMachine != null && cleanMachine.status==(int)Automation.MachineStatus.Waiting)
{ {
Logger.WriteLineInfo($"AutoProcess 普通空闲,创建普通设备下料Task "); Logger.WriteLineError($"AutoProcess 普通空闲,创建普通设备下料Task ");
var monitor = _automationFixtureMonitor.Get(f => f.section == fullMachine.section); var monitor = _automationFixtureMonitor.Get(f => f.section == fullMachine.section);
if (monitor == null) if (monitor == null)
{ {
Logger.WriteLineInfo($"AutoProcess 找不到CNC监控信息"); Logger.WriteLineError($"AutoProcess 找不到CNC监控信息");
return; return;
} }
CreateTask(fullMachine,TaskActionType.Unload, TaskAction.Step_JGZX_QXJ, monitor.fixtureguid, monitor.ordernumber, monitor.sn,"无程序",monitor.productId, monitor.productCode, monitor.locationId); CreateTask(fullMachine.section,TaskActionType.Unload, TaskAction.Step_JGZX_QXJ, monitor.fixtureguid, monitor.ordernumber, monitor.sn,"无程序",monitor.productId, monitor.productCode, monitor.locationId,monitor.route);
return; //完成当前任务 退出 return; //完成当前任务 退出
} }
...@@ -458,7 +492,7 @@ namespace Siger.ApiACC.Controllers ...@@ -458,7 +492,7 @@ namespace Siger.ApiACC.Controllers
/// <summary> /// <summary>
/// 创建自动任务 /// 创建自动任务
/// </summary> /// </summary>
/// <param name="machineStatus"></param> /// <param name="section"></param>
/// <param name="actionType"></param> /// <param name="actionType"></param>
/// <param name="taskAction"></param> /// <param name="taskAction"></param>
/// <param name="guid">工装GUID</param> /// <param name="guid">工装GUID</param>
...@@ -466,14 +500,14 @@ namespace Siger.ApiACC.Controllers ...@@ -466,14 +500,14 @@ namespace Siger.ApiACC.Controllers
/// <param name="sn">工件</param> /// <param name="sn">工件</param>
/// <param name="productCode">产品CODE</param> /// <param name="productCode">产品CODE</param>
/// <param name="locationid">储位ID</param> /// <param name="locationid">储位ID</param>
void CreateTask(siger_automation_machine_status machineStatus,TaskActionType actionType, TaskAction taskAction,string guid,string orderno,string sn,string program,int productId,string productCode,int locationid) void CreateTask(int section,TaskActionType actionType, TaskAction taskAction,string guid,string orderno,string sn,string program,int productId,string productCode,int locationid,int route)
{ {
var taskNo = _automationTaskList.CrateTaskNumber(Automation.TaskTrigerType.Auto); var taskNo = _automationTaskList.CrateTaskNumber(Automation.TaskTrigerType.Auto);
_automationTaskList.Insert(new siger_automation_task_list _automationTaskList.Insert(new siger_automation_task_list
{ {
no= taskNo, no= taskNo,
projectId = PID, projectId = PID,
sectionid = machineStatus.section, sectionid = section,
trigger = TaskTrigerType.Auto, trigger = TaskTrigerType.Auto,
action = taskAction, action = taskAction,
actiontype = ExcueType.None, actiontype = ExcueType.None,
...@@ -491,70 +525,77 @@ namespace Siger.ApiACC.Controllers ...@@ -491,70 +525,77 @@ namespace Siger.ApiACC.Controllers
locationid= locationid, locationid= locationid,
ordercode= orderno, ordercode= orderno,
sn= sn, sn= sn,
remark= EnumHelper.GetEnumDesc(taskAction) remark= EnumHelper.GetEnumDesc(taskAction),
route=route
}); });
if (_unitOfWork.Commit() > 0) if (_unitOfWork.Commit() > 0)
Logger.WriteLineInfo($"CreateTask 工站 完成"); Logger.WriteLineInfo($"CreateTask sectionId:{section}工站 {EnumHelper.GetEnumDesc(taskAction)} 完成");
else else
Logger.WriteLineInfo($"CreateTask 工站 失败"); Logger.WriteLineInfo($"CreateTask sectionId:{section}工站 {EnumHelper.GetEnumDesc(taskAction)}失败");
} }
/// <summary> /// <summary>
/// 自动匹配储位 储位 ->CNC /// 自动匹配储位 储位 ->CNC
/// </summary> /// </summary>
ResponseAutomationLocationRouteInfo SelectLocation(int machine) ResponseAutomationLocationRouteInfo SelectLocation(List<int> machines)
{ {
// 当前空闲设备能加工的产品 // 当前空闲设备能加工的产品
var beats = _productionBeatSet.GetList(f => f.projectID == PID && f.machineID == machine); var beats = _productionBeatSet.GetList(f => f.projectID == PID && machines.Contains(f.machineID) && f.status==(int)RowState.Valid).ToList();
var productIds = beats.Select(f => f.product_name.ToInt()).Distinct().ToList(); var TempList = new List<ResponseAutoRouteInfo>();
foreach (var b in beats)
// 取产品交期最近的订单
var planOrder = _automationFixtureToolsProduct.GetDeliveryOrder(productIds, PID);
if (!planOrder.Any())
{ {
Logger.WriteLineInfo($"SelectLocation 未找到最近订单号信息"); var autoLocation = _automationLocation.Get(f => f.projectId == b.projectID && !string.IsNullOrEmpty(f.sn) && f.routeid == b.route_number.ToInt() && f.productid == b.product_name.ToInt());
return null; if (autoLocation == null)
continue;
TempList.Add(new ResponseAutoRouteInfo
{
FixtureGuid=autoLocation.fixturetools,
FixtureName=autoLocation.fixturename,
Section=b.section_id,
Machine=b.machineID,
Pn=b.process_number,
ProductId=b.product_name.ToInt(),
ProductName=b.product_name_text,
Location=autoLocation.locationid,
Route=b.route_number.ToInt(),
RouteName=b.route_name,
OrderNo=autoLocation.ordernumber,
Sn=autoLocation.sn,
LId=autoLocation.id
});
} }
var order = planOrder.FirstOrDefault();
//TODO 20210126
var beatset = beats.Where(f => f.product_name == order.productId.ToString());
//var location = _automationLocation.GetList(f => f.projectId == PID && f.ordernumber == order.ordernumber && productIds.Contains(f.productid));
//if (!location.Any())
//{
// Logger.WriteLineInfo($"SelectLocation 未找到最近交期订单号{order.ordernumber} 对应产品 {order.productName}的储位信息");
// return null;
//} var ordernos = TempList.Select(f => f.OrderNo).ToList();
//储位有SN 工件
var location = _automationLocation.GetList(f => f.projectId == PID && productIds.Contains(f.productid));
var hasSnloaction = location.Where(f =>!string.IsNullOrEmpty(f.sn));
if (!hasSnloaction.Any())
return null;
var result = location.FirstOrDefault();
var valiateBeat = beatset.FirstOrDefault(f=>f.route_number.ToInt()>result.routenum); // 取产品交期最近的订单
if (valiateBeat==null) var planOrder = _automationFixtureToolsProduct.GetDeliveryOrder(ordernos, PID);
if (!planOrder.Any())
{ {
Logger.WriteLineInfo($"SelectLocation 未找到产品的工艺顺序"); Logger.WriteLineError($"SelectLocation 未找到最近订单号信息");
return null; return null;
} }
var order = planOrder.FirstOrDefault();
var autoRouteInfo = TempList.Where(f => f.OrderNo == order.ordernumber).OrderBy(d=>d.Sn);
var result = autoRouteInfo.FirstOrDefault();
return new ResponseAutomationLocationRouteInfo return new ResponseAutomationLocationRouteInfo
{ {
fixture = result.fixturetools, section=result.Section,
fixturename = result.fixturename, machine=result.Machine,
ordernumber =result.ordernumber, fixture = result.FixtureGuid,
location=result.locationid, fixturename = result.FixtureName,
productId=result.productid, ordernumber =result.OrderNo,
productCode=result.productcode, location=result.Location,
productName = result.productname, productId=result.ProductId,
sn =result.sn, //productCode=result.productcode,
pn= valiateBeat.process_number, productName = result.ProductName,
route=valiateBeat.route_name sn =result.Sn,
pn= result.Pn,
route=result.Route,
lid=result.LId
}; };
} }
......
...@@ -361,6 +361,9 @@ namespace Siger.ApiACC.Controllers ...@@ -361,6 +361,9 @@ namespace Siger.ApiACC.Controllers
[HttpGet] [HttpGet]
public IActionResult GetLocationList(string productcode, int fillsn=0) public IActionResult GetLocationList(string productcode, int fillsn=0)
{ {
var productFix = _automationFixtureToolsProduct.Get(f => f.productcode == productcode);
var locations = _autoLocationRepository.GetFulllocation(ProjectId, fillsn); var locations = _autoLocationRepository.GetFulllocation(ProjectId, fillsn);
return new ObjectResult(locations); return new ObjectResult(locations);
//if (fillsn == 1) //if (fillsn == 1)
......
...@@ -41,9 +41,11 @@ namespace Siger.ApiACC.Controllers ...@@ -41,9 +41,11 @@ namespace Siger.ApiACC.Controllers
private readonly IAutomationFixtureToolsRepository _automationFixtureTools; private readonly IAutomationFixtureToolsRepository _automationFixtureTools;
private readonly IAutomationLocationRepository _automationLocation; private readonly IAutomationLocationRepository _automationLocation;
private readonly IAutomationLineMode _automationLine; private readonly IAutomationLineMode _automationLine;
private readonly IProductRouteRepository _productRoute;
public AutomationOperateController(IUnitOfWork unitOfWork,ISigerProjectLevelSectionRepository sigerProjectLevelSection , ISigerDict sigerDict,IAutomationMachineStatus automationMachineStatus,ISigerProjectMachineAttributionRepository sigerProjectMachineAttribution,IAutomationTaskListRepository automationTaskList, public AutomationOperateController(IUnitOfWork unitOfWork,ISigerProjectLevelSectionRepository sigerProjectLevelSection , ISigerDict sigerDict,IAutomationMachineStatus automationMachineStatus,ISigerProjectMachineAttributionRepository sigerProjectMachineAttribution,IAutomationTaskListRepository automationTaskList,
IProductPlanDetails planDetails,IProductPlanRepository productPlan,IAutomationFixtureMonitor automationFixtureMonitor ,IAutomationFixtureToolsProductRepository automationFixtureToolsProduct,IAutomationFixtureToolsRepository automationFixtureTools, IAutomationLocationRepository automationLocation, IAutomationLineMode automationLine) IProductPlanDetails planDetails,IProductPlanRepository productPlan,IAutomationFixtureMonitor automationFixtureMonitor ,IAutomationFixtureToolsProductRepository automationFixtureToolsProduct,IAutomationFixtureToolsRepository automationFixtureTools, IAutomationLocationRepository automationLocation,
IAutomationLineMode automationLine, IProductRouteRepository productRoute)
{ {
_unitOfWork = unitOfWork; _unitOfWork = unitOfWork;
_sigerProjectLevelSection = sigerProjectLevelSection; _sigerProjectLevelSection = sigerProjectLevelSection;
...@@ -58,6 +60,7 @@ namespace Siger.ApiACC.Controllers ...@@ -58,6 +60,7 @@ namespace Siger.ApiACC.Controllers
_automationFixtureTools = automationFixtureTools; _automationFixtureTools = automationFixtureTools;
_automationLocation = automationLocation; _automationLocation = automationLocation;
_automationLine = automationLine; _automationLine = automationLine;
_productRoute = productRoute;
} }
/// <summary> /// <summary>
...@@ -366,6 +369,12 @@ namespace Siger.ApiACC.Controllers ...@@ -366,6 +369,12 @@ namespace Siger.ApiACC.Controllers
var taskNo = _automationTaskList.CrateTaskNumber(Automation.TaskTrigerType.Manual); var taskNo = _automationTaskList.CrateTaskNumber(Automation.TaskTrigerType.Manual);
var sn = _automationTaskList.CreateRandonSn(plan.product_code); var sn = _automationTaskList.CreateRandonSn(plan.product_code);
//上料 指定的第一道工序
var route = _productRoute.GetList(f => f.productId == plan.product_id && f.status==(int)RowState.Valid, "serialNumber",false).FirstOrDefault();
if (route==null)
{
throw new BadRequestException(AccEnum.ProductRouteMissing);
}
var unixtime = UnixTimeHelper.GetNow(); var unixtime = UnixTimeHelper.GetNow();
_automationTaskList.Insert(new siger_automation_task_list _automationTaskList.Insert(new siger_automation_task_list
{ {
...@@ -392,6 +401,7 @@ namespace Siger.ApiACC.Controllers ...@@ -392,6 +401,7 @@ namespace Siger.ApiACC.Controllers
processid=0, processid=0,
programnumber="", programnumber="",
remark ="手动任务-准备上料", remark ="手动任务-准备上料",
route=route.id,
extend1= unixtime.ToString() extend1= unixtime.ToString()
}); });
...@@ -411,11 +421,12 @@ namespace Siger.ApiACC.Controllers ...@@ -411,11 +421,12 @@ namespace Siger.ApiACC.Controllers
updatetime = DateTime.Now, updatetime = DateTime.Now,
status = (int)Automation.MachineStatus.Produce, status = (int)Automation.MachineStatus.Produce,
productId = plan.product_id, productId = plan.product_id,
productCode = plan.product_code, productCode = plan.product_code,
productName = plan.product_name, productName = plan.product_name,
ordernumber = plandts.OrderNumber, ordernumber = plandts.OrderNumber,
locationId = fixtureToolsObj.Location, locationId = fixtureToolsObj.Location,
unixtime = unixtime unixtime = unixtime,
route= route.id
}); });
} }
else else
...@@ -430,6 +441,7 @@ namespace Siger.ApiACC.Controllers ...@@ -430,6 +441,7 @@ namespace Siger.ApiACC.Controllers
monitor.ordernumber = plandts.OrderNumber; monitor.ordernumber = plandts.OrderNumber;
monitor.locationId = fixtureToolsObj.Location; monitor.locationId = fixtureToolsObj.Location;
monitor.unixtime = unixtime; monitor.unixtime = unixtime;
monitor.route = route.id;
_automationFixtureMonitor.Update(monitor); _automationFixtureMonitor.Update(monitor);
} }
......
...@@ -58,7 +58,7 @@ namespace Siger.ApiACC.Controllers ...@@ -58,7 +58,7 @@ namespace Siger.ApiACC.Controllers
fixtureCode="", fixtureCode="",
fixtureName="", fixtureName="",
lastupdate="", lastupdate="",
status=(int)Automation.MachineStatus.Waiting, machineStatus=d.status,
linemode=d.linemode linemode=d.linemode
}; };
...@@ -71,6 +71,7 @@ namespace Siger.ApiACC.Controllers ...@@ -71,6 +71,7 @@ namespace Siger.ApiACC.Controllers
item.fixtureCode = fixture.fixtureguid; item.fixtureCode = fixture.fixtureguid;
item.fixtureName = fixture.fixturename; item.fixtureName = fixture.fixturename;
item.machineStatus = d.status;
item.status = fixture.status; item.status = fixture.status;
} }
result.Add(item); result.Add(item);
...@@ -80,9 +81,9 @@ namespace Siger.ApiACC.Controllers ...@@ -80,9 +81,9 @@ namespace Siger.ApiACC.Controllers
{ {
sum=new ResponseAutomationMachineStatusTotal { sum=new ResponseAutomationMachineStatusTotal {
waittingTotal =result.Where(f=>f.status==(int)Automation.MachineStatus.Waiting).Count(), waittingTotal =result.Where(f=>f.machineStatus == (int)Automation.MachineStatus.Waiting).Count(),
produceTotal= result.Where(f => f.status == (int)Automation.MachineStatus.Produce).Count(), produceTotal= result.Where(f => f.machineStatus == (int)Automation.MachineStatus.Produce).Count(),
complateTotal= result.Where(f => f.status == (int)Automation.MachineStatus.Complated).Count(), complateTotal= result.Where(f => f.machineStatus == (int)Automation.MachineStatus.Complated).Count(),
disableTotal= result.Where(f => f.enable ==0).Count(), disableTotal= result.Where(f => f.enable ==0).Count(),
}, },
dts=result dts=result
......
...@@ -23,14 +23,16 @@ namespace Siger.ApiCNC.Controllers ...@@ -23,14 +23,16 @@ namespace Siger.ApiCNC.Controllers
private readonly IProductionBeatSetRepository _beatSetRepository; private readonly IProductionBeatSetRepository _beatSetRepository;
private readonly ISigerProjectMachineRepository _machineRepository; private readonly ISigerProjectMachineRepository _machineRepository;
private readonly ISigerProjectProductRepository _productRepository; private readonly ISigerProjectProductRepository _productRepository;
private readonly IProductRouteRepository _productRoute;
public BeatAllocationController(IUnitOfWork unitOfWork, IProductionBeatSetRepository beatSetRepository, ISigerProjectMachineRepository machineRepository, public BeatAllocationController(IUnitOfWork unitOfWork, IProductionBeatSetRepository beatSetRepository, ISigerProjectMachineRepository machineRepository,
ISigerProjectProductRepository productRepository) ISigerProjectProductRepository productRepository, IProductRouteRepository productRoute)
{ {
_unitOfWork = unitOfWork; _unitOfWork = unitOfWork;
_beatSetRepository = beatSetRepository; _beatSetRepository = beatSetRepository;
_machineRepository = machineRepository; _machineRepository = machineRepository;
_productRepository = productRepository; _productRepository = productRepository;
_productRoute = productRoute;
} }
[HttpGet] [HttpGet]
...@@ -43,6 +45,7 @@ namespace Siger.ApiCNC.Controllers ...@@ -43,6 +45,7 @@ namespace Siger.ApiCNC.Controllers
var validMachines = _machineRepository.GetLevelSectionNames(sectionID, ProjectId); var validMachines = _machineRepository.GetLevelSectionNames(sectionID, ProjectId);
foreach (var time in data.Data) foreach (var time in data.Data)
{ {
var route = _productRoute.Get(f => f.id == time.route_number.ToInt());
var entity = Mapper<ResponseBeatSet, ResponseBeatSet>.Map(time); var entity = Mapper<ResponseBeatSet, ResponseBeatSet>.Map(time);
var section = validMachines.FirstOrDefault(q => q.machine_id == time.machineID); var section = validMachines.FirstOrDefault(q => q.machine_id == time.machineID);
if (section != null) if (section != null)
...@@ -50,6 +53,10 @@ namespace Siger.ApiCNC.Controllers ...@@ -50,6 +53,10 @@ namespace Siger.ApiCNC.Controllers
entity.sectionName = section.machine_name; entity.sectionName = section.machine_name;
entity.stationName = section.lastSecondSectionTitle + "-" + section.lastSectionTitle; entity.stationName = section.lastSecondSectionTitle + "-" + section.lastSectionTitle;
} }
if (route!=null)
{
entity.routeName = route.name;
}
list.Add(entity); list.Add(entity);
} }
return new PagedObjectResult(list, data.Total, page, pagesize); return new PagedObjectResult(list, data.Total, page, pagesize);
...@@ -104,6 +111,11 @@ namespace Siger.ApiCNC.Controllers ...@@ -104,6 +111,11 @@ namespace Siger.ApiCNC.Controllers
{ {
throw new BadRequestException(RequestEnum.ProductNotFound); throw new BadRequestException(RequestEnum.ProductNotFound);
} }
var route = _productRoute.Get(f =>f.id==request.route_id);
if (route==null)
{
throw new BadRequestException(RequestEnum.RouteNotFound);
}
var beatSet = new siger_project_beat_set var beatSet = new siger_project_beat_set
{ {
daily_standard_output = request.daily_standard_output, daily_standard_output = request.daily_standard_output,
...@@ -117,8 +129,8 @@ namespace Siger.ApiCNC.Controllers ...@@ -117,8 +129,8 @@ namespace Siger.ApiCNC.Controllers
standard_besat = request.standard_besat, standard_besat = request.standard_besat,
projectID = ProjectId, projectID = ProjectId,
changemodeltime = request.time_num.ToInt(), changemodeltime = request.time_num.ToInt(),
route_number = request.route_number.ToStr(), route_number = request.route_id.ToStr(),
route_name = request.route_name, route_name = route.name,
updown_besat = request.updown_besat.ToDouble(), updown_besat = request.updown_besat.ToDouble(),
yieldrate = request.yieldratio, yieldrate = request.yieldratio,
start_time = timSet ? start : DateTime.MinValue, start_time = timSet ? start : DateTime.MinValue,
......
...@@ -103,5 +103,7 @@ namespace Siger.Middlelayer.AccRepository.Entities ...@@ -103,5 +103,7 @@ namespace Siger.Middlelayer.AccRepository.Entities
public string remark { get; set; } public string remark { get; set; }
public string extend1 { get; set; } public string extend1 { get; set; }
public int route { get; set; }
} }
} }
...@@ -67,8 +67,8 @@ namespace Siger.Middlelayer.AccRepository.Entities ...@@ -67,8 +67,8 @@ namespace Siger.Middlelayer.AccRepository.Entities
public int changemodeltime { get; set; } public int changemodeltime { get; set; }
/// <summary> /// <summary>
/// 工序顺序 /// 工序ID Route.Id
/// </summary> /// </summary>
public string route_number { get; set; } = ""; public string route_number { get; set; } = "";
/// <summary> /// <summary>
......
...@@ -103,11 +103,11 @@ namespace Siger.Middlelayer.AccRepository.Repositories ...@@ -103,11 +103,11 @@ namespace Siger.Middlelayer.AccRepository.Repositories
/// <param name="productIds"></param> /// <param name="productIds"></param>
/// <param name="projectId"></param> /// <param name="projectId"></param>
/// <returns></returns> /// <returns></returns>
public IEnumerable<ResponseAutomationPlanOrder> GetDeliveryOrder(List<int>productIds,int projectId) public IEnumerable<ResponseAutomationPlanOrder> GetDeliveryOrder(List<string>Ordernums,int projectId)
{ {
var query = from d in _context.siger_project_product_plan_detail var query = from d in _context.siger_project_product_plan_detail
join p in _context.siger_project_product_plan on d.PlanId equals p.id join p in _context.siger_project_product_plan on d.PlanId equals p.id
where d.projectId == projectId && productIds.Contains(p.product_id) && d.status != (int)RowState.Invalid && p.status != (int)RowState.Invalid where d.projectId == projectId && Ordernums.Contains(d.OrderNumber) && d.status != (int)RowState.Invalid && p.status != (int)RowState.Invalid
select new ResponseAutomationPlanOrder select new ResponseAutomationPlanOrder
{ {
productId=p.product_id, productId=p.product_id,
...@@ -136,7 +136,8 @@ namespace Siger.Middlelayer.AccRepository.Repositories ...@@ -136,7 +136,8 @@ namespace Siger.Middlelayer.AccRepository.Repositories
ProductName = p.product_name, ProductName = p.product_name,
Url=pd.image, Url=pd.image,
FixtureName=t.name, FixtureName=t.name,
FixtureGuid=t.code, FixtureGuid=t.guid,
FixtureCode=t.code,
ProductCode =q!=null? q.productcode:"", ProductCode =q!=null? q.productcode:"",
Location =l!=null? l.locationid:0, Location =l!=null? l.locationid:0,
}; };
......
...@@ -33,7 +33,7 @@ namespace Siger.Middlelayer.AccRepository.Repositories ...@@ -33,7 +33,7 @@ namespace Siger.Middlelayer.AccRepository.Repositories
join w in _context.siger_wms_storage on l.storageid equals w.id join w in _context.siger_wms_storage on l.storageid equals w.id
join u in _context.siger_project_user on q.updator equals u.mid into uu join u in _context.siger_project_user on q.updator equals u.mid into uu
from u in uu.DefaultIfEmpty() from u in uu.DefaultIfEmpty()
join r in _context.siger_project_beat_set on q.routeid equals r.id into rr join r in _context.siger_project_product_route on q.routeid equals r.id into rr
from r in rr.DefaultIfEmpty() from r in rr.DefaultIfEmpty()
where q.projectId == projectid && q.status == (int)RowState.Valid where q.projectId == projectid && q.status == (int)RowState.Valid
select new ResponseAutomationLocation select new ResponseAutomationLocation
...@@ -56,8 +56,9 @@ namespace Siger.Middlelayer.AccRepository.Repositories ...@@ -56,8 +56,9 @@ namespace Siger.Middlelayer.AccRepository.Repositories
status = q.status, status = q.status,
updatetime = q.updatetime.HasValue && q.updatetime > DateTime.MinValue ? q.updatetime.Value.ToString(ParameterConstant.DateTimeFormat) : "", updatetime = q.updatetime.HasValue && q.updatetime > DateTime.MinValue ? q.updatetime.Value.ToString(ParameterConstant.DateTimeFormat) : "",
sn = q.sn ?? "", sn = q.sn ?? "",
route = r.route_name ?? "", route = r.name ?? "",
routenumber = r == null ? "" : r.route_number.ToString(), routenumber = r == null ? "" : r.serialNumber.ToString(),
routeid=q.routeid,
cate_guid = c.guid ?? "", cate_guid = c.guid ?? "",
categoryId = c == null ? 0 : c.id categoryId = c == null ? 0 : c.id
}; };
...@@ -238,42 +239,64 @@ namespace Siger.Middlelayer.AccRepository.Repositories ...@@ -238,42 +239,64 @@ namespace Siger.Middlelayer.AccRepository.Repositories
public IEnumerable<ResponseAutomationLocationList> GetFulllocation(int projectId,int full) public IEnumerable<ResponseAutomationLocationList> GetFulllocation(int projectId,int full)
{ {
var query = from q in _context.siger_automation_location //获取有SN 的储位
join t in _context.siger_automation_fixture_tools on q.fixturetools equals t.guid if (full==1)
join l in _context.siger_wms_storage_location on q.location_cid equals l.id
join w in _context.siger_wms_storage on l.storageid equals w.id
where q.projectId==projectId
&& q.status==(int)RowState.Valid
&& t.status==(int)RowState.Valid
&& l.status==(int)RowState.Valid
&& w.status==(int)RowState.Valid
select new ResponseAutomationLocationList
{
id = q.id,
typeid = t.id,
fixtureguid = t.guid,
locationid = l.locationid,
location = l.realname,
locationcode = l.serial_number,
wavehouseid = w.id,
wavehouse = w.name,
wavehousecode = w.serial_number,
fixturetoolid = t.id,
code = t.code,
name = t.name,
materialsn = q.sn ?? ""
};
Expression<Func<ResponseAutomationLocationList, bool>> locationidExpression = f => true;
if (full != 0)
{ {
locationidExpression = q => !string.IsNullOrEmpty(q.materialsn); var query = from q in _context.siger_automation_location
join t in _context.siger_automation_fixture_tools on q.fixturetools equals t.guid
join l in _context.siger_wms_storage_location on q.location_cid equals l.id
join w in _context.siger_wms_storage on l.storageid equals w.id
where q.projectId == projectId && !string.IsNullOrEmpty(q.sn)
&& q.status == (int)RowState.Valid&& t.status == (int)RowState.Valid
&& l.status == (int)RowState.Valid && w.status == (int)RowState.Valid
select new ResponseAutomationLocationList
{
id = q.id,
typeid = t.id,
fixtureguid = t.guid,
locationid = l.locationid,
location = l.realname,
locationcode = l.serial_number,
wavehouseid = w.id,
wavehouse = w.name,
wavehousecode = w.serial_number,
fixturetoolid = t.id,
code = t.code,
name = t.name,
materialsn = q.sn
};
Expression<Func<ResponseAutomationLocationList, bool>> locationidExpression = f => true;
return query.Where(locationidExpression);
}else }else
{ {
locationidExpression = q => string.IsNullOrEmpty(q.materialsn); //选择SN为空的储位
var query = from q in _context.siger_automation_location
join t in _context.siger_automation_fixture_tools on q.fixturetools equals t.guid
join l in _context.siger_wms_storage_location on q.location_cid equals l.id
join w in _context.siger_wms_storage on l.storageid equals w.id
where q.projectId == projectId && string.IsNullOrEmpty(q.sn)
&& q.status == (int)RowState.Valid && t.status == (int)RowState.Valid
&& l.status == (int)RowState.Valid&& w.status == (int)RowState.Valid
select new ResponseAutomationLocationList
{
id = q.id,
typeid = t.id,
fixtureguid = t.guid,
locationid = l.locationid,
location = l.realname,
locationcode = l.serial_number,
wavehouseid = w.id,
wavehouse = w.name,
wavehousecode = w.serial_number,
fixturetoolid = t.id,
code = t.code,
name = t.name,
materialsn = q.sn
};
Expression<Func<ResponseAutomationLocationList, bool>> locationidExpression = f => true;
return query.Where(locationidExpression);
} }
return query.Where(locationidExpression);
} }
} }
} }
...@@ -37,7 +37,7 @@ namespace Siger.Middlelayer.AccRepository.Repositories.Interface ...@@ -37,7 +37,7 @@ namespace Siger.Middlelayer.AccRepository.Repositories.Interface
/// <param name="productIds"></param> /// <param name="productIds"></param>
/// <param name="projectId"></param> /// <param name="projectId"></param>
/// <returns></returns> /// <returns></returns>
IEnumerable<ResponseAutomationPlanOrder> GetDeliveryOrder(List<int> productIds, int projectId); IEnumerable<ResponseAutomationPlanOrder> GetDeliveryOrder(List<string> Ordernums, int projectId);
} }
} }
...@@ -31,6 +31,8 @@ namespace Siger.Middlelayer.AccRepository.Response ...@@ -31,6 +31,8 @@ namespace Siger.Middlelayer.AccRepository.Response
public class ResponseAutomationLocationRouteInfo public class ResponseAutomationLocationRouteInfo
{ {
public int section { get; set; }
public int machine { get; set; }
public string fixture { get; set; } public string fixture { get; set; }
public string fixturename { get; set; } public string fixturename { get; set; }
public string ordernumber { get; set; } public string ordernumber { get; set; }
...@@ -39,8 +41,35 @@ namespace Siger.Middlelayer.AccRepository.Response ...@@ -39,8 +41,35 @@ namespace Siger.Middlelayer.AccRepository.Response
public int productId { get; set; } public int productId { get; set; }
public string productCode { get; set; } public string productCode { get; set; }
public string productName { get; set; } public string productName { get; set; }
public string route { get; set; } public int route { get; set; }
public string pn { get; set; } public string pn { get; set; }
/// <summary>
/// location.id主键
/// </summary>
public int lid { get; set; }
} }
public class ResponseAutoRouteInfo
{
public int Section { get; set; }
public int Machine { get; set; }
public string Pn { get; set; }
public int ProductId { get; set; }
public string ProductName { get; set; }
public int Route { get; set; }
public string RouteName { get; set; }
public string OrderNo { get; set; }
public string FixtureGuid { get; set; }
public string FixtureName { get; set; }
public string Sn { get; set; }
/// <summary>
/// 储位编号
/// </summary>
public int Location { get; set; }
/// <summary>
/// location.id
/// </summary>
public int LId { get; set; }
}
} }
...@@ -31,9 +31,19 @@ namespace Siger.Middlelayer.AccRepository.Response ...@@ -31,9 +31,19 @@ namespace Siger.Middlelayer.AccRepository.Response
/// 工件 /// 工件
/// </summary> /// </summary>
public string sn { get; set; } public string sn { get; set; }
/// <summary>
/// 工序顺序
/// </summary>
public string routenumber { get; set; } public string routenumber { get; set; }
/// <summary>
/// 工序萌宠
/// </summary>
public string route { get; set; } public string route { get; set; }
/// <summary> /// <summary>
/// 工序id
/// </summary>
public int routeid { get; set; }
/// <summary>
/// 物料状态 /// 物料状态
/// </summary> /// </summary>
public int materialstate { get; set; } public int materialstate { get; set; }
......
...@@ -15,6 +15,13 @@ namespace Siger.Middlelayer.AccRepository.Response ...@@ -15,6 +15,13 @@ namespace Siger.Middlelayer.AccRepository.Response
public int location { get; set; } public int location { get; set; }
public string sn { get; set; } public string sn { get; set; }
public int enable { get; set; } public int enable { get; set; }
/// <summary>
/// 设备状态
/// </summary>
public int machineStatus { get; set; }
/// <summary>
/// 任务状态
/// </summary>
public int status { get; set; } public int status { get; set; }
public string lastupdate { get; set; } public string lastupdate { get; set; }
public string linemode { get; set; } public string linemode { get; set; }
......
...@@ -101,6 +101,8 @@ namespace Siger.Middlelayer.CncRepository.Repositories ...@@ -101,6 +101,8 @@ namespace Siger.Middlelayer.CncRepository.Repositories
var sectionIds = new List<int>(); var sectionIds = new List<int>();
var productIds = new List<string>(); var productIds = new List<string>();
var machineIds = new List<int>(); var machineIds = new List<int>();
var validates = new List<BeatSetEntity>();
foreach (var beatSetEntity in beatSetEntities) foreach (var beatSetEntity in beatSetEntities)
{ {
var sectionId = 0; var sectionId = 0;
...@@ -180,14 +182,26 @@ namespace Siger.Middlelayer.CncRepository.Repositories ...@@ -180,14 +182,26 @@ namespace Siger.Middlelayer.CncRepository.Repositories
{ {
errors.Add($"{rowIndex},{(int)RequestEnum.UpDownBesatNotInteger}"); errors.Add($"{rowIndex},{(int)RequestEnum.UpDownBesatNotInteger}");
} }
var route = _context.siger_project_product_route.FirstOrDefault(f =>f.projectId==projectid && f.productId == product.id && f.name == beatSetEntity.RouteName);
if (route == null)
{
errors.Add($"{rowIndex},{(int)RequestEnum.RouteNotFound}");
}
if (errors.Any()) if (errors.Any())
{ {
return new CommonImportResult(0, string.Join(";", errors)); return new CommonImportResult(0, string.Join(";", errors));
} }
beatSetEntity.RouteNumber = route.id.ToString();
validates.Add(beatSetEntity);
} }
var index = 0; var index = 0;
var maxTime = "2199-01-01 00:00:00".ToDateTime(); var maxTime = "2199-01-01 00:00:00".ToDateTime();
foreach (var entity in beatSetEntities) foreach (var entity in validates)
{ {
var beat = new siger_project_beat_set var beat = new siger_project_beat_set
{ {
...@@ -201,12 +215,14 @@ namespace Siger.Middlelayer.CncRepository.Repositories ...@@ -201,12 +215,14 @@ namespace Siger.Middlelayer.CncRepository.Repositories
product_name = productIds[index], product_name = productIds[index],
section_id = sectionIds[index], section_id = sectionIds[index],
standard_besat = entity.CycleTime.ToInt(), standard_besat = entity.CycleTime.ToInt(),
route_name = entity.RouteName, route_name = entity.RouteName,
machineID = machineIds.Count>index?machineIds[index]:0, machineID = machineIds.Count>index?machineIds[index]:0,
changemodeltime = entity.ChangeModelTime.ToInt(), changemodeltime = entity.ChangeModelTime.ToInt(),
updown_besat = entity.UpDownBesat.ToDouble(), updown_besat = entity.UpDownBesat.ToDouble(),
yieldrate = entity.YieldRate.ToInt(), yieldrate = entity.YieldRate.ToInt(),
route_number = entity.RouteNumber, //route_number = entity.RouteNumber,
route_number=entity.RouteNumber,
start_time = string.IsNullOrEmpty(entity.StartTime) ? DateTime.MinValue : entity.StartTime.ToDateTime(), start_time = string.IsNullOrEmpty(entity.StartTime) ? DateTime.MinValue : entity.StartTime.ToDateTime(),
end_time = string.IsNullOrEmpty(entity.EndTime) ? maxTime : entity.EndTime.ToDateTime().AddDays(1).AddSeconds(-1) end_time = string.IsNullOrEmpty(entity.EndTime) ? maxTime : entity.EndTime.ToDateTime().AddDays(1).AddSeconds(-1)
}; };
......
...@@ -13,6 +13,10 @@ namespace Siger.Middlelayer.CncRepository.Request ...@@ -13,6 +13,10 @@ namespace Siger.Middlelayer.CncRepository.Request
public string product_name_text { get; set; } public string product_name_text { get; set; }
/// <summary>
/// productId
/// </summary>
[Required(ErrorMessage = "ProductNameIsEmpty")] [Required(ErrorMessage = "ProductNameIsEmpty")]
public string product_name { get; set; } public string product_name { get; set; }
...@@ -24,6 +28,11 @@ namespace Siger.Middlelayer.CncRepository.Request ...@@ -24,6 +28,11 @@ namespace Siger.Middlelayer.CncRepository.Request
public string time_num { get; set; } public string time_num { get; set; }
/// <summary>
/// 产品工序表ID
/// </summary>
public int route_id { get; set; }
public string route_number { get; set; } public string route_number { get; set; }
public string route_name { get; set; } public string route_name { get; set; }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment