1.主任务与分任务执行优化

2.AGV与提升机逻辑优化
dev
zhangxy 6 days ago
parent 909ece55d4
commit 26cbd6a78b

@ -40,7 +40,7 @@ namespace Sln.Wcs.Model.Domain
/// 所属机台 /// 所属机台
/// </summary> /// </summary>
[SugarColumn(ColumnName = "machine_id", ColumnDescription = "所属机台")] [SugarColumn(ColumnName = "machine_id", ColumnDescription = "所属机台")]
public int? MachineId { get; set; } public string? MachineId { get; set; }
/// <summary> /// <summary>
/// 库位编码 /// 库位编码

@ -25,7 +25,6 @@ namespace Sln.Wcs.Controllers
public class TaskController : ControllerBase public class TaskController : ControllerBase
{ {
private readonly CreateMainTask createMainTask; private readonly CreateMainTask createMainTask;
private readonly ISqlSugarClient sqlSugarClient;
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private readonly ISqlSugarClient _db; private readonly ISqlSugarClient _db;
@ -33,7 +32,6 @@ namespace Sln.Wcs.Controllers
{ {
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_db = _serviceProvider.GetService<ISqlSugarClient>(); _db = _serviceProvider.GetService<ISqlSugarClient>();
sqlSugarClient = serviceProvider.GetRequiredService<ISqlSugarClient>();
createMainTask = new CreateMainTask(_serviceProvider); createMainTask = new CreateMainTask(_serviceProvider);
} }
@ -59,6 +57,9 @@ namespace Sln.Wcs.Controllers
[HttpPost("agvCallback")] [HttpPost("agvCallback")]
public void AgvCallback(AgvCallbackDto agvCallbackDto) public void AgvCallback(AgvCallbackDto agvCallbackDto)
{ {
//_db.AsTenant().ChangeDatabase("wcs");
var sqlSugarClient = _db.CopyNew();
sqlSugarClient.AsTenant().ChangeDatabase("wcs");
SubTaskInstance subTaskInstance = sqlSugarClient.Queryable<SubTaskInstance>().First(t => t.TaskCode == agvCallbackDto.taskCode); SubTaskInstance subTaskInstance = sqlSugarClient.Queryable<SubTaskInstance>().First(t => t.TaskCode == agvCallbackDto.taskCode);
var mainTaskInstance = sqlSugarClient.Queryable<WcsTaskInstance>().First(t => t.TaskCode == subTaskInstance.MaintaskCode); var mainTaskInstance = sqlSugarClient.Queryable<WcsTaskInstance>().First(t => t.TaskCode == subTaskInstance.MaintaskCode);
if (agvCallbackDto.method.ToLower() == "end") if (agvCallbackDto.method.ToLower() == "end")
@ -66,16 +67,15 @@ namespace Sln.Wcs.Controllers
try try
{ {
mainTaskInstance.ResultCode = 1; mainTaskInstance.ResultCode = 1;
var result = sqlSugarClient.Updateable<WcsTaskInstance>(mainTaskInstance).ExecuteCommandAsync(); var result = sqlSugarClient.Updateable<WcsTaskInstance>(mainTaskInstance).UpdateColumns(x => new {
x.ResultCode,
}).ExecuteCommandAsync();
sqlSugarClient.Deleteable<SubTaskInstance>(subTaskInstance).ExecuteCommandAsync();
sqlSugarClient.AsTenant().CommitTranAsync();
} }
catch(Exception ex) catch(Exception ex)
{ {
mainTaskInstance.ResultCode = 1; sqlSugarClient.AsTenant().RollbackTranAsync();
var result = sqlSugarClient.Updateable<WcsTaskInstance>(mainTaskInstance).ExecuteCommandAsync();
}
finally
{
sqlSugarClient.Deleteable(subTaskInstance);
} }
} }
} }

@ -27,117 +27,39 @@ namespace Sln.Wcs.Function
public void CreateMainTaskByMessage(TaskInfo taskInfo) public void CreateMainTaskByMessage(TaskInfo taskInfo)
{ {
try
{
sqlSugarClient.AsTenant().ChangeDatabase("wcs");
sqlSugarClient.AsTenant().BeginTranAsync();
WcsTaskInstance taskInstance = new WcsTaskInstance(); WcsTaskInstance taskInstance = new WcsTaskInstance();
BaseTasktypeInfo baseTasktypeInfo = new BaseTasktypeInfo(); BaseTasktypeInfo baseTasktypeInfo = new BaseTasktypeInfo();
List<SubTaskInstance> subTaskInstances = new List<SubTaskInstance>(); List<SubTaskInstance> subTaskInstances = new List<SubTaskInstance>();
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(); taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId();
taskInstance.Status = "Starting"; taskInstance.Status = "Starting";
taskInstance.CurrentSubtaskNo = 1; taskInstance.CurrentSubtaskNo = 0;
taskInstance.CreateTime = DateTime.Now; taskInstance.CreateTime = DateTime.Now;
taskInstance.CreateUser = "wcs"; taskInstance.CreateUser = "wcs";
var startPoint = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.LocationCode == taskInfo.TaskStartPoint).First(); var startPoint = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.LocationCode == taskInfo.TaskStartPoint).First();
var endPoint = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.LocationCode == taskInfo.TaskStartPoint).First(); var endPoint = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.LocationCode == taskInfo.TaskEndPoint).First();
taskInstance.SourceLocation = startPoint.LocationCode; taskInstance.SourceLocation = startPoint.LocationCode;
taskInstance.TargetLocation = endPoint.LocationCode; taskInstance.TargetLocation = endPoint.LocationCode;
//同楼
if (startPoint.WorkshopId == endPoint.WorkshopId) if (startPoint.WorkshopId == endPoint.WorkshopId)
{ {
//同楼同层任务 //同楼同层任务
if (startPoint.WorkshopLevel == endPoint.WorkshopLevel) if (startPoint.WorkshopLevel == endPoint.WorkshopLevel)
{ {
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(); SSTask(taskInstance, subTaskInstances, startPoint, endPoint);
taskInstance.TaskName = $"{startPoint.WorkshopId}楼-{startPoint.WorkshopLevel}层运输任务";
baseTasktypeInfo = sqlSugarClient.Queryable<BaseTasktypeInfo>().Where(x => x.TaskTypeKey == "001").First();
taskInstance.TaskTypeKey = baseTasktypeInfo.TaskTypeKey;
taskInstance.TaskTypeName = baseTasktypeInfo.TaskTypeName;
taskInstance.SubtaskCount = 1;
SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletXTGTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletXTGTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = startPoint.LocationCode,
EndPointId = endPoint.LocationCode,
CurrPointId = startPoint.LocationCode,
StartAGVPoint = startPoint.AgvPositionCode,
EndAGVPoint = endPoint.AgvPositionCode,
CurrAGVPoint = startPoint.AgvPositionCode,
CreatedBy = "wcs",
CreatedTime = DateTime.Now,
};
subTaskInstances.Add(subTaskInstance1);
taskInstance.CurrentSubtaskCode = subTaskInstance1.TaskCode;
} }
else //同楼不同层任务 else //同楼不同层任务
{ {
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(); SDTask(taskInstance, subTaskInstances, startPoint, endPoint);
taskInstance.TaskName = $"{startPoint.WorkshopId}楼-{startPoint.WorkshopLevel}层到{endPoint.WorkshopId}楼-{endPoint.WorkshopLevel}层运输任务";
baseTasktypeInfo = sqlSugarClient.Queryable<BaseTasktypeInfo>().Where(x => x.TaskTypeKey == "001").First();
taskInstance.TaskTypeKey = baseTasktypeInfo.TaskTypeKey;
taskInstance.TaskTypeName = baseTasktypeInfo.TaskTypeName;
taskInstance.SubtaskCount = 3;
var elevatorPoint1 = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == startPoint.WorkshopId && x.WorkshopLevel == startPoint.WorkshopLevel).First();
var elevatorPoint2 = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == startPoint.WorkshopId && x.WorkshopLevel == endPoint.WorkshopLevel).First();
SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletGTXTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletGTXTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = startPoint.LocationCode,
EndPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
CurrPointId = startPoint.LocationCode,
StartAGVPoint = startPoint.AgvPositionCode,
EndAGVPoint = elevatorPoint1.AgvPositionCode,
CurrAGVPoint = startPoint.AgvPositionCode,
CreatedBy = "wcs",
CreatedTime = DateTime.Now,
};
SubTaskInstance subTaskInstance2 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.ElevatorBoxTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.ElevatorBoxTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
EndPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
CurrPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
StartAGVPoint = elevatorPoint1.AgvPositionCode,
EndAGVPoint = elevatorPoint2.AgvPositionCode,
CurrAGVPoint = elevatorPoint1.AgvPositionCode,
CreatedBy = "wcs",
};
SubTaskInstance subTaskInstance3 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletXTGTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletXTGTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
EndPointId = endPoint.LocationCode,
CurrPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
StartAGVPoint = elevatorPoint2.AgvPositionCode,
EndAGVPoint = endPoint.AgvPositionCode,
CurrAGVPoint = elevatorPoint2.AgvPositionCode,
CreatedBy = "wcs",
};
subTaskInstances.Add(subTaskInstance1);
subTaskInstances.Add(subTaskInstance2);
subTaskInstances.Add(subTaskInstance3);
taskInstance.CurrentSubtaskCode = subTaskInstance1.TaskCode;
} }
} }
//不同楼
else if (startPoint.WorkshopId != endPoint.WorkshopId) else if (startPoint.WorkshopId != endPoint.WorkshopId)
{ {
//起点终点不包括15楼 //起点终点不包括15楼
@ -156,106 +78,37 @@ namespace Sln.Wcs.Function
else else
{ {
//前往连廊部分 //前往连廊部分
if (startPoint.WorkshopLevel != 2) //如果不和连廊同层 ArrivingTPTask(taskInstance, subTaskInstances, startPoint, endPoint);
{
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId();
taskInstance.TaskName = $"{startPoint.WorkshopId}楼-{startPoint.WorkshopLevel}层到{endPoint.WorkshopId}楼-{endPoint.WorkshopLevel}层运输任务";
baseTasktypeInfo = sqlSugarClient.Queryable<BaseTasktypeInfo>().Where(x => x.TaskTypeKey == "001").First();
taskInstance.TaskTypeKey = baseTasktypeInfo.TaskTypeKey;
taskInstance.TaskTypeName = baseTasktypeInfo.TaskTypeName;
taskInstance.SubtaskCount = 3;
var elevatorPoint1 = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == startPoint.WorkshopId && x.WorkshopLevel == startPoint.WorkshopLevel).First();
var elevatorPoint2 = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == startPoint.WorkshopId && x.WorkshopLevel == 2).First();
var transformPoint = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 4 && x.WorkshopId == 1415 && x.WorkshopLevel == 2 && x.ContainerCode == null).First();
SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletXTGTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletXTGTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = startPoint.LocationCode,
EndPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
CurrPointId = startPoint.LocationCode,
StartAGVPoint = startPoint.AgvPositionCode,
EndAGVPoint = elevatorPoint1.AgvPositionCode,
CurrAGVPoint = startPoint.AgvPositionCode,
CreatedBy = "wcs",
CreatedTime = DateTime.Now,
};
if (startPoint.WorkshopId == 15) //离开连廊部分
LeavingTPTask(taskInstance, subTaskInstances, endPoint);
}
}
else
{ {
subTaskInstance1.TaskType = StaticTaskType.MovePalletHTGTask;
subTaskInstance1.TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletHTGTask);
} }
SubTaskInstance subTaskInstance2 = new SubTaskInstance() sqlSugarClient.Insertable(taskInstance).ExecuteCommand();
}
catch (Exception ex)
{ {
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(), _logger.Error(ex.Message);
TaskType = StaticTaskType.ElevatorBoxTask, sqlSugarClient.AsTenant().RollbackTranAsync();
TaskName = StaticTaskType.GetDescription(StaticTaskType.ElevatorBoxTask), }
MaintaskCode = taskInstance.TaskCode, finally {
TaskStatus = 0, sqlSugarClient.AsTenant().CommitTranAsync();
StartPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位", }
EndPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位", }
CurrPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
StartAGVPoint = elevatorPoint1.AgvPositionCode,
EndAGVPoint = elevatorPoint2.AgvPositionCode,
CurrAGVPoint = elevatorPoint1.AgvPositionCode,
CreatedBy = "wcs",
};
SubTaskInstance subTaskInstance3 = new SubTaskInstance() private void LeavingTPTask(WcsTaskInstance taskInstance, List<SubTaskInstance> subTaskInstances, BaseLocation endPoint)
{ {
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletGTXJTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletGTXJTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
EndPointId = "连廊中转点",
CurrPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
StartAGVPoint = elevatorPoint2.AgvPositionCode,
EndAGVPoint = transformPoint.AgvPositionCode,
CurrAGVPoint = elevatorPoint2.AgvPositionCode,
CreatedBy = "wcs",
};
subTaskInstances.Add(subTaskInstance1);
subTaskInstances.Add(subTaskInstance2);
subTaskInstances.Add(subTaskInstance3);
}
else //和连廊同层
{
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId();
taskInstance.TaskName = $"{startPoint.WorkshopId}楼-{startPoint.WorkshopLevel}层到{endPoint.WorkshopId}楼-{endPoint.WorkshopLevel}层运输任务";
baseTasktypeInfo = sqlSugarClient.Queryable<BaseTasktypeInfo>().Where(x => x.TaskTypeKey == "001").First();
taskInstance.TaskTypeKey = baseTasktypeInfo.TaskTypeKey;
taskInstance.TaskTypeName = baseTasktypeInfo.TaskTypeName;
taskInstance.SubtaskCount = 1;
var transformPoint = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 4 && x.WorkshopId == 1415 && x.WorkshopLevel == 2 && x.ContainerCode == null).First();
SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletHTGJTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletHTGJTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = startPoint.LocationCode,
EndPointId = $"{transformPoint.WorkshopId}楼{transformPoint.WorkshopLevel}层中转点位",
CurrPointId = startPoint.LocationCode,
StartAGVPoint = startPoint.AgvPositionCode,
EndAGVPoint = transformPoint.AgvPositionCode,
CurrAGVPoint = startPoint.AgvPositionCode,
CreatedBy = "wcs",
CreatedTime = DateTime.Now,
};
}
if (endPoint.WorkshopLevel != 2) if (endPoint.WorkshopLevel != 2)
{ {
taskInstance.SubtaskCount = taskInstance.SubtaskCount + 3; taskInstance.SubtaskCount = taskInstance.SubtaskCount + 3;
var elevatorPoint1 = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == endPoint.WorkshopId && x.WorkshopLevel == 2).First(); var elevator = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == endPoint.WorkshopId && x.WorkshopLevel == endPoint.WorkshopLevel).First();
var elevatorPoint2 = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == endPoint.WorkshopId && x.WorkshopLevel == endPoint.WorkshopLevel).First(); var elevatorPoint1 = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.MachineId == elevator.EquipNo && x.WorkshopId == endPoint.WorkshopId && x.WorkshopLevel == 2).First();
var elevatorPoint2 = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.MachineId == elevator.EquipNo && x.WorkshopId == endPoint.WorkshopId && x.WorkshopLevel == endPoint.WorkshopLevel).First();
var transformPoint = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 4 && x.WorkshopId == 1415 && x.WorkshopLevel == 2 && x.ContainerCode == null).First(); var transformPoint = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 4 && x.WorkshopId == 1415 && x.WorkshopLevel == 2 && x.ContainerCode == null).First();
SubTaskInstance subTaskInstance1 = new SubTaskInstance() SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{ {
@ -315,6 +168,10 @@ namespace Sln.Wcs.Function
subTaskInstances.Add(subTaskInstance1); subTaskInstances.Add(subTaskInstance1);
subTaskInstances.Add(subTaskInstance2); subTaskInstances.Add(subTaskInstance2);
subTaskInstances.Add(subTaskInstance3); subTaskInstances.Add(subTaskInstance3);
taskInstance.TaskParams = JsonConvert.SerializeObject(subTaskInstances);
taskInstance.CurrentSubtaskCode = subTaskInstance1.TaskCode;
sqlSugarClient.Insertable(taskInstance).ExecuteCommand();
} }
else else
{ {
@ -338,14 +195,216 @@ namespace Sln.Wcs.Function
}; };
subTaskInstances.Add(subTaskInstance1); subTaskInstances.Add(subTaskInstance1);
taskInstance.TaskParams = JsonConvert.SerializeObject(subTaskInstances);
taskInstance.CurrentSubtaskCode = subTaskInstance1.TaskCode;
} }
} }
}
else private void ArrivingTPTask(WcsTaskInstance taskInstance, List<SubTaskInstance> subTaskInstances, BaseLocation startPoint, BaseLocation endPoint)
{ {
BaseTasktypeInfo baseTasktypeInfo;
if (startPoint.WorkshopLevel != 2) //如果不和连廊同层
{
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId();
taskInstance.TaskName = $"{startPoint.WorkshopId}楼-{startPoint.WorkshopLevel}层到{endPoint.WorkshopId}楼-{endPoint.WorkshopLevel}层运输任务";
baseTasktypeInfo = sqlSugarClient.Queryable<BaseTasktypeInfo>().Where(x => x.TaskTypeKey == "001").First();
taskInstance.TaskTypeKey = baseTasktypeInfo.TaskTypeKey;
taskInstance.TaskTypeName = baseTasktypeInfo.TaskTypeName;
taskInstance.SubtaskCount = 3;
var elevator = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == startPoint.WorkshopId && x.WorkshopLevel == startPoint.WorkshopLevel).First();
var elevatorPoint1 = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.MachineId == elevator.EquipNo && x.WorkshopId == startPoint.WorkshopId && x.WorkshopLevel == startPoint.WorkshopLevel).First();
var elevatorPoint2 = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.MachineId == elevator.EquipNo && x.WorkshopId == endPoint.WorkshopId && x.WorkshopLevel == 2).First();
var transformPoint = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 4 && x.WorkshopId == 1415 && x.WorkshopLevel == 2 && x.ContainerCode == null).First();
SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletXTGTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletXTGTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = startPoint.LocationCode,
EndPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
CurrPointId = startPoint.LocationCode,
StartAGVPoint = startPoint.AgvPositionCode,
EndAGVPoint = elevatorPoint1.AgvPositionCode,
CurrAGVPoint = startPoint.AgvPositionCode,
CreatedBy = "wcs",
CreatedTime = DateTime.Now,
};
if (startPoint.WorkshopId == 15)
{
subTaskInstance1.TaskType = StaticTaskType.MovePalletHTGTask;
subTaskInstance1.TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletHTGTask);
}
SubTaskInstance subTaskInstance2 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.ElevatorBoxTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.ElevatorBoxTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
EndPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
CurrPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
StartAGVPoint = elevatorPoint1.AgvPositionCode,
EndAGVPoint = elevatorPoint2.AgvPositionCode,
CurrAGVPoint = elevatorPoint1.AgvPositionCode,
CreatedBy = "wcs",
};
SubTaskInstance subTaskInstance3 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletGTXJTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletGTXJTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
EndPointId = "连廊中转点",
CurrPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
StartAGVPoint = elevatorPoint2.AgvPositionCode,
EndAGVPoint = transformPoint.AgvPositionCode,
CurrAGVPoint = elevatorPoint2.AgvPositionCode,
CreatedBy = "wcs",
};
subTaskInstances.Add(subTaskInstance1);
subTaskInstances.Add(subTaskInstance2);
subTaskInstances.Add(subTaskInstance3);
taskInstance.TaskParams = JsonConvert.SerializeObject(subTaskInstances);
taskInstance.CurrentSubtaskCode = subTaskInstance1.TaskCode;
}
else //和连廊同层
{
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId();
taskInstance.TaskName = $"{startPoint.WorkshopId}楼-{startPoint.WorkshopLevel}层到{endPoint.WorkshopId}楼-{endPoint.WorkshopLevel}层运输任务";
baseTasktypeInfo = sqlSugarClient.Queryable<BaseTasktypeInfo>().Where(x => x.TaskTypeKey == "001").First();
taskInstance.TaskTypeKey = baseTasktypeInfo.TaskTypeKey;
taskInstance.TaskTypeName = baseTasktypeInfo.TaskTypeName;
taskInstance.SubtaskCount = 1;
var transformPoint = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 4 && x.WorkshopId == 1415 && x.WorkshopLevel == 2 && x.ContainerCode == null).First();
SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletHTGJTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletHTGJTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = startPoint.LocationCode,
EndPointId = $"{transformPoint.WorkshopId}楼{transformPoint.WorkshopLevel}层中转点位",
CurrPointId = startPoint.LocationCode,
StartAGVPoint = startPoint.AgvPositionCode,
EndAGVPoint = transformPoint.AgvPositionCode,
CurrAGVPoint = startPoint.AgvPositionCode,
CreatedBy = "wcs",
CreatedTime = DateTime.Now,
};
taskInstance.TaskParams = JsonConvert.SerializeObject(subTaskInstances);
taskInstance.CurrentSubtaskCode = subTaskInstance1.TaskCode;
}
} }
sqlSugarClient.Insertable(taskInstance).ExecuteCommand();
private void SDTask(WcsTaskInstance taskInstance, List<SubTaskInstance> subTaskInstances, BaseLocation startPoint, BaseLocation endPoint)
{
BaseTasktypeInfo baseTasktypeInfo;
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId();
taskInstance.TaskName = $"{startPoint.WorkshopId}楼-{startPoint.WorkshopLevel}层到{endPoint.WorkshopId}楼-{endPoint.WorkshopLevel}层运输任务";
baseTasktypeInfo = sqlSugarClient.Queryable<BaseTasktypeInfo>().Where(x => x.TaskTypeKey == "001").First();
taskInstance.TaskTypeKey = baseTasktypeInfo.TaskTypeKey;
taskInstance.TaskTypeName = baseTasktypeInfo.TaskTypeName;
taskInstance.SubtaskCount = 3;
var elevator = sqlSugarClient.Queryable<BaseEquipInfo>().Where(x => x.EquipType == 3 && x.WorkshopId == startPoint.WorkshopId && x.WorkshopLevel == startPoint.WorkshopLevel).First();
var elevatorPoint1 = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.MachineId == elevator.EquipNo && x.WorkshopId == startPoint.WorkshopId && x.WorkshopLevel == startPoint.WorkshopLevel).First();
var elevatorPoint2 = sqlSugarClient.Queryable<BaseLocation>().Where(x => x.MachineId == elevator.EquipNo && x.WorkshopId == endPoint.WorkshopId && x.WorkshopLevel == endPoint.WorkshopLevel).First();
SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletGTXTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletGTXTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = startPoint.LocationCode,
EndPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
CurrPointId = startPoint.LocationCode,
StartAGVPoint = startPoint.AgvPositionCode,
EndAGVPoint = elevatorPoint1.AgvPositionCode,
CurrAGVPoint = startPoint.AgvPositionCode,
CreatedBy = "wcs",
CreatedTime = DateTime.Now,
};
SubTaskInstance subTaskInstance2 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.ElevatorBoxTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.ElevatorBoxTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
EndPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
CurrPointId = $"{elevatorPoint1.WorkshopId}楼{elevatorPoint1.WorkshopLevel}层提升机点位",
StartAGVPoint = elevatorPoint1.AgvPositionCode,
EndAGVPoint = elevatorPoint2.AgvPositionCode,
CurrAGVPoint = elevatorPoint1.AgvPositionCode,
CreatedBy = "wcs",
};
SubTaskInstance subTaskInstance3 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletXTGTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletXTGTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
EndPointId = endPoint.LocationCode,
CurrPointId = $"{elevatorPoint2.WorkshopId}楼{elevatorPoint2.WorkshopLevel}层提升机点位",
StartAGVPoint = elevatorPoint2.AgvPositionCode,
EndAGVPoint = endPoint.AgvPositionCode,
CurrAGVPoint = elevatorPoint2.AgvPositionCode,
CreatedBy = "wcs",
};
subTaskInstances.Add(subTaskInstance1);
subTaskInstances.Add(subTaskInstance2);
subTaskInstances.Add(subTaskInstance3);
taskInstance.TaskParams = JsonConvert.SerializeObject(subTaskInstances);
taskInstance.CurrentSubtaskCode = subTaskInstance1.TaskCode;
}
private void SSTask(WcsTaskInstance taskInstance, List<SubTaskInstance> subTaskInstances, BaseLocation startPoint, BaseLocation endPoint)
{
BaseTasktypeInfo baseTasktypeInfo;
taskInstance.TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId();
taskInstance.TaskName = $"{startPoint.WorkshopId}楼-{startPoint.WorkshopLevel}层运输任务";
baseTasktypeInfo = sqlSugarClient.Queryable<BaseTasktypeInfo>().Where(x => x.TaskTypeKey == "001").First();
taskInstance.TaskTypeKey = baseTasktypeInfo.TaskTypeKey;
taskInstance.TaskTypeName = baseTasktypeInfo.TaskTypeName;
taskInstance.SubtaskCount = 1;
SubTaskInstance subTaskInstance1 = new SubTaskInstance()
{
TaskCode = SnowflakeIdGenerator.GenerateSnowflakeId(),
TaskType = StaticTaskType.MovePalletXTGTask,
TaskName = StaticTaskType.GetDescription(StaticTaskType.MovePalletXTGTask),
MaintaskCode = taskInstance.TaskCode,
TaskStatus = 0,
StartPointId = startPoint.LocationCode,
EndPointId = endPoint.LocationCode,
CurrPointId = startPoint.LocationCode,
StartAGVPoint = startPoint.AgvPositionCode,
EndAGVPoint = endPoint.AgvPositionCode,
CurrAGVPoint = startPoint.AgvPositionCode,
CreatedBy = "wcs",
CreatedTime = DateTime.Now,
};
subTaskInstances.Add(subTaskInstance1);
taskInstance.TaskParams = JsonConvert.SerializeObject(subTaskInstances);
taskInstance.CurrentSubtaskCode = subTaskInstance1.TaskCode;
} }
} }
} }

@ -37,7 +37,7 @@ namespace Sln.Wcs.Function
while (true) while (true)
{ {
await ExecuteMainTaskAsync(); await ExecuteMainTaskAsync();
await Task.Delay(1000); await Task.Delay(5000);
} }
}); });
} }
@ -65,16 +65,20 @@ namespace Sln.Wcs.Function
continue; continue;
} }
string TaskJson = item.TaskParams.Trim('"');
TaskJson = TaskJson.Replace("\\\"", "\"");
item.UpdateTime = DateTime.Now; item.UpdateTime = DateTime.Now;
switch (item.Status) switch (item.Status)
{ {
case "Starting": case "Starting":
try try
{ {
item.UpdateTime = DateTime.Now; item.UpdateTime = DateTime.Now;
if (!string.IsNullOrEmpty(item.TaskParams)) if (!string.IsNullOrEmpty(item.TaskParams))
{ {
List<SubTaskInstance> taskParams = JsonConvert.DeserializeObject<List<SubTaskInstance>>(item.TaskParams); List<SubTaskInstance> taskParams = JsonConvert.DeserializeObject<List<SubTaskInstance>>(TaskJson);
var firstSubtask = taskParams.First(); var firstSubtask = taskParams.First();
var subtaskId = await sqlSugarClient.Insertable(firstSubtask).ExecuteReturnIdentityAsync(); var subtaskId = await sqlSugarClient.Insertable(firstSubtask).ExecuteReturnIdentityAsync();
if (subtaskId > 0) if (subtaskId > 0)
@ -86,7 +90,7 @@ namespace Sln.Wcs.Function
await sqlSugarClient.Updateable(item) await sqlSugarClient.Updateable(item)
.UpdateColumns(x => new { .UpdateColumns(x => new {
x.SubtaskCount, x.CurrentSubtaskNo,
x.CurrentSubtaskCode, x.CurrentSubtaskCode,
x.Status, x.Status,
x.UpdateTime x.UpdateTime
@ -121,7 +125,7 @@ namespace Sln.Wcs.Function
item.UpdateTime = DateTime.Now; item.UpdateTime = DateTime.Now;
if (!string.IsNullOrEmpty(item.TaskParams)) if (!string.IsNullOrEmpty(item.TaskParams))
{ {
List<SubTaskInstance> taskParams = JsonConvert.DeserializeObject<List<SubTaskInstance>>(item.TaskParams); List<SubTaskInstance> taskParams = JsonConvert.DeserializeObject<List<SubTaskInstance>>(TaskJson);
int currenttaskno = (int)(item.CurrentSubtaskNo); int currenttaskno = (int)(item.CurrentSubtaskNo);
var Subtask = taskParams[currenttaskno]; var Subtask = taskParams[currenttaskno];
var subtaskId = await sqlSugarClient.Insertable(Subtask).ExecuteReturnIdentityAsync(); var subtaskId = await sqlSugarClient.Insertable(Subtask).ExecuteReturnIdentityAsync();
@ -132,9 +136,10 @@ namespace Sln.Wcs.Function
item.CurrentSubtaskNo++; item.CurrentSubtaskNo++;
item.Status = "Running"; // 更新主任务状态为执行中 item.Status = "Running"; // 更新主任务状态为执行中
item.ResultCode = 0; // 更新分任务标志位 item.ResultCode = 0; // 更新分任务标志位
item.UpdateTime = DateTime.Now;
await sqlSugarClient.Updateable(item) await sqlSugarClient.Updateable(item)
.UpdateColumns(x => new { .UpdateColumns(x => new {
x.SubtaskCount, x.CurrentSubtaskNo,
x.CurrentSubtaskCode, x.CurrentSubtaskCode,
x.Status, x.Status,
x.ResultCode, x.ResultCode,
@ -142,7 +147,7 @@ namespace Sln.Wcs.Function
}) })
.ExecuteCommandAsync(); .ExecuteCommandAsync();
_logger.Info($"主任务 {item.TaskCode} 已启动,创建第一个子任务 {item.TaskCode}"); _logger.Info($"主任务 {item.TaskCode} 已启动,创建子任务 {item.TaskCode}");
} }
} }
else else

@ -39,6 +39,7 @@ namespace Sln.Wcs.Function
hikRoBotService = serviceProvider.GetRequiredService<HikRoBotService>(); hikRoBotService = serviceProvider.GetRequiredService<HikRoBotService>();
sqlSugarClient = serviceProvider.GetRequiredService<ISqlSugarClient>(); sqlSugarClient = serviceProvider.GetRequiredService<ISqlSugarClient>();
_logger = serviceProvider.GetRequiredService<SerilogHelper>(); _logger = serviceProvider.GetRequiredService<SerilogHelper>();
} }
/// <summary> /// <summary>
@ -55,7 +56,7 @@ namespace Sln.Wcs.Function
while (true) while (true)
{ {
await ExecuteSubTaskAsync(); await ExecuteSubTaskAsync();
await Task.Delay(1000); await Task.Delay(5000);
} }
}); });
} }
@ -73,7 +74,9 @@ namespace Sln.Wcs.Function
{ {
try try
{ {
List<SubTaskInstance> taskList = sqlSugarClient.Queryable<SubTaskInstance>().OrderBy(x => x.CreatedTime).ToList(); sqlSugarClient.AsTenant().ChangeDatabase("wcs");
var db = sqlSugarClient.CopyNew();
List<SubTaskInstance> taskList = db.Queryable<SubTaskInstance>().OrderBy(x => x.CreatedTime).ToList();
foreach (SubTaskInstance item in taskList) foreach (SubTaskInstance item in taskList)
{ {
item.UpdatedTime = DateTime.Now; item.UpdatedTime = DateTime.Now;
@ -117,9 +120,10 @@ namespace Sln.Wcs.Function
{ {
try try
{ {
var wcsLocation = sqlSugarClient.Queryable<BaseLocation>().First(t => t.LocationCode == task.CurrAGVPoint); var db = sqlSugarClient.CopyNew();
var wcsLocation = db.Queryable<BaseLocation>().First(t => t.AgvPositionCode == task.CurrAGVPoint);
workShopPlc1 = base.GetPlcByKey("workshop" + wcsLocation.WorkshopId + "Plc"); workShopPlc1 = base.GetPlcByKey("workshop" + wcsLocation.WorkshopId + "Plc");
WcsBaseDictionary wcsBaseDictionary = sqlSugarClient.Queryable<WcsBaseDictionary>().First(t => t.Id == task.TaskType); WcsBaseDictionary wcsBaseDictionary = db.Queryable<WcsBaseDictionary>().First(t => t.Id == task.TaskType);
List<Position> PathList = new List<Position>(); List<Position> PathList = new List<Position>();
PathList.Add(new Position { positionCode = task.CurrAGVPoint, type = "00" }); PathList.Add(new Position { positionCode = task.CurrAGVPoint, type = "00" });
PathList.Add(new Position { positionCode = task.EndAGVPoint, type = "00" }); PathList.Add(new Position { positionCode = task.EndAGVPoint, type = "00" });
@ -130,11 +134,15 @@ namespace Sln.Wcs.Function
taskTyp = wcsBaseDictionary.DicValue, taskTyp = wcsBaseDictionary.DicValue,
ctnrTyp = "2", ctnrTyp = "2",
}; };
var result = hikRoBotService.GetGenAgvSchedulingTask(agvTask); var result = hikRoBotService.GetGenAgvSchedulingTask(agvTask);
result.code = 0; //测试用,记得删除
if (result.code == 0) if (result.code == 0)
{ {
task.TaskStatus = 1; task.TaskStatus = 1;
var updateflag = sqlSugarClient.Updateable<SubTaskInstance>(task).ExecuteCommandAsync(); var updateflag = db.Updateable<SubTaskInstance>(task).ExecuteCommandAsync();
} }
} }
@ -153,10 +161,11 @@ namespace Sln.Wcs.Function
{ {
try try
{ {
var startLocation = sqlSugarClient.Queryable<BaseLocation>().First(t => t.LocationCode == task.CurrAGVPoint); var db = sqlSugarClient.CopyNew();
var endLocation = sqlSugarClient.Queryable<BaseLocation>().First(t => t.LocationCode == task.EndAGVPoint); var startLocation = db.Queryable<BaseLocation>().First(t => t.AgvPositionCode == task.CurrAGVPoint);
var endLocation = db.Queryable<BaseLocation>().First(t => t.AgvPositionCode == task.EndAGVPoint);
workShopPlc1 = base.GetPlcByKey("workshop" + startLocation.WorkshopId + "Plc"); workShopPlc1 = base.GetPlcByKey("workshop" + startLocation.WorkshopId + "Plc");
var elevator = sqlSugarClient.Queryable<BaseEquipInfo>().First(t => t.EquipNo == task.EquipmentNo); var elevator = db.Queryable<BaseEquipInfo>().First(t => t.EquipNo == task.EquipmentNo);
if (workShopPlc1 == null || !workShopPlc1.IsConnected) if (workShopPlc1 == null || !workShopPlc1.IsConnected)
{ {
@ -221,10 +230,10 @@ namespace Sln.Wcs.Function
workShopPlc1.writeBoolByAddress("提升完成", true); //继续下一步任务<-待定 workShopPlc1.writeBoolByAddress("提升完成", true); //继续下一步任务<-待定
if (workShopPlc1.readBoolByAddress(elevator.EquipName + "提升机"+ NumberConverter((int)endLocation.WorkshopLevel) + "楼接驳位状态")) if (workShopPlc1.readBoolByAddress(elevator.EquipName + "提升机"+ NumberConverter((int)endLocation.WorkshopLevel) + "楼接驳位状态"))
{ {
var mainTask = sqlSugarClient.Queryable<WcsTaskInstance>().First(t => t.TaskCode == task.MaintaskCode); var mainTask = db.Queryable<WcsTaskInstance>().First(t => t.TaskCode == task.MaintaskCode);
mainTask.ResultCode = 1; mainTask.ResultCode = 1;
sqlSugarClient.Updateable(mainTask).ExecuteCommand(); db.Updateable(mainTask).ExecuteCommand();
sqlSugarClient.Deleteable(task).ExecuteCommand(); db.Deleteable(task).ExecuteCommand();
return; return;
} }
} }
@ -232,12 +241,12 @@ namespace Sln.Wcs.Function
sqlSugarClient.AsTenant().BeginTran(); sqlSugarClient.AsTenant().BeginTran();
try try
{ {
sqlSugarClient.Updateable(task).ExecuteCommand(); db.Updateable(task).ExecuteCommand();
sqlSugarClient.AsTenant().CommitTran(); db.AsTenant().CommitTran();
} }
catch (Exception ex) catch (Exception ex)
{ {
sqlSugarClient.AsTenant().RollbackTran(); db.AsTenant().RollbackTran();
_logger.Error("提交事务异常:" + ex.Message); _logger.Error("提交事务异常:" + ex.Message);
} }
} }

@ -77,7 +77,7 @@ namespace Sln.Wcs
var subtaskcontrol = new SubTaskControl(serviceProvider); var subtaskcontrol = new SubTaskControl(serviceProvider);
maintaskcontrol.StartPoint(); maintaskcontrol.StartPoint();
//subtaskcontrol.StartPoint(); subtaskcontrol.StartPoint();
StartCheckStatus(); StartCheckStatus();
//GetAgvStatus(); //GetAgvStatus();
_logger.Agv("WCS调度程序启动成功!"); _logger.Agv("WCS调度程序启动成功!");

@ -22,12 +22,19 @@ using Sln.Wcs.Function.Functions;
using Sln.Wcs.Rfid; using Sln.Wcs.Rfid;
using System.Windows; using System.Windows;
using Sln.Wcs.ElevatorSdk; using Sln.Wcs.ElevatorSdk;
using Sln.Wcs.Repository.@base;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Swashbuckle;
using Microsoft.OpenApi;
namespace Sln.Wcs namespace Sln.Wcs
{ {
public class Program public class Program
{ {
private static IConfiguration _apolloConfiguration;
[STAThread] [STAThread]
static async Task Main(string[] args) static async Task Main(string[] args)
{ {
var services = new ServiceCollection(); var services = new ServiceCollection();
@ -41,9 +48,10 @@ namespace Sln.Wcs
var log = serviceProvider.GetService<SerilogHelper>(); var log = serviceProvider.GetService<SerilogHelper>();
var sqlconfig = serviceProvider.GetRequiredService<ISqlSugarClient>(); var sqlconfig = serviceProvider.GetRequiredService<ISqlSugarClient>();
#region 测试场地 #region 测试场地
var cts = new CancellationTokenSource();
var apiTask = StartSwaggerApiServer(_apolloConfiguration, serviceProvider, cts.Token);
Thread wpfThread = new Thread(() => Thread wpfThread = new Thread(() =>
{ {
Sln_Wpf.App app = new Sln_Wpf.App(); Sln_Wpf.App app = new Sln_Wpf.App();
@ -60,37 +68,14 @@ namespace Sln.Wcs
MainCentralControl mainCentralControl = new MainCentralControl(serviceProvider); MainCentralControl mainCentralControl = new MainCentralControl(serviceProvider);
mainCentralControl.Start(); mainCentralControl.Start();
sqlconfig.AsTenant().ChangeDatabase("wcs");
//var configtable = sqlconfig.Queryable<BaseConfigInfo>().First();
BaseConfigInfo baseConfigInfo = new BaseConfigInfo();
baseConfigInfo.ConfigKey = "测试场地";
baseConfigInfo.ConfigValue = "测试";
baseConfigInfo.CreateTime = DateTime.Now;
baseConfigInfo.IsFlag = 1;
baseConfigInfo.Type = "bool";
baseConfigInfo.PlcConfigId = 1;
var plcSqlServer = new plcSqlFunction(serviceProvider);
//plcSqlServer.insertFunction(baseConfigInfo);
//plcSqlServer.deleteFunction(baseConfigInfo);
var material = new BaseMaterialInfo
{
MaterialCode = "MAT001",
MaterialName = "测试物料",
MaterialType = "原材料",
MaterialCategory = "电子",
Status = 1,
IsDeleted = false,
CreateUser = "admin",
UpdateUser = "admin"
};
var MaterialSqlServer = new materialinfoSqlFunction(serviceProvider);
MaterialSqlServer.insertFunction(material);
#endregion #endregion
log.Info($"系统启动成功,日志存放位置:{config["logPath"]}"); log.Info($"系统启动成功,日志存放位置:{config["logPath"]}");
await Task.WhenAny(apiTask);
cts.Cancel();
} }
private static void ConfigureServices(IServiceCollection services) private static void ConfigureServices(IServiceCollection services)
{ {
var basePath = AppContext.BaseDirectory; var basePath = AppContext.BaseDirectory;
@ -134,8 +119,6 @@ namespace Sln.Wcs
services.AddRfidFactorySetup(); services.AddRfidFactorySetup();
services.AddElevatorSetup();
services.AddFusionCache() services.AddFusionCache()
.WithSerializer( .WithSerializer(
new FusionCacheNewtonsoftJsonSerializer() new FusionCacheNewtonsoftJsonSerializer()
@ -146,6 +129,63 @@ namespace Sln.Wcs
})); }));
} }
private static async Task StartSwaggerApiServer(IConfiguration configuration, IServiceProvider serviceProvider, CancellationToken cancellationToken)
{
// 需要安装: dotnet add package Microsoft.AspNetCore.App
var builder = WebApplication.CreateBuilder();
// 复用配置
builder.Services.AddSingleton(configuration);
// 如果有需要从 serviceProvider 复制的服务,可以在这里添加
// 例如builder.Services.AddSingleton(serviceProvider.GetService<SomeService>());
builder.Services.AddSingleton(serviceProvider.GetService<ISqlSugarClient>());
builder.Services.AddSingleton(serviceProvider.GetService<SerilogHelper>());
builder.Services.AddControllers()
.AddApplicationPart(Assembly.LoadFrom(Path.Combine(AppContext.BaseDirectory, "Sln.Wcs.HikRoBotApi.dll")))
.AddControllersAsServices(); // 使用容器中的服务
// 添加 Swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "WCS AGV API",
Version = "v1",
Description = "海康AGV调度系统内部API"
});
});
var app = builder.Build();
// 配置 Swagger UI
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "WCS API V1");
c.RoutePrefix = "swagger"; // 访问地址http://localhost:端口/swagger
});
// 路由配置
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
// 从配置读取端口,默认 5000
var port = configuration["InternalApiPort"] ?? "5000";
var urls = $"http://*:{port}";
app.Urls.Add(urls);
Console.WriteLine($"[Swagger API] 启动,监听: {urls}");
Console.WriteLine($"[Swagger API] 文档地址: http://localhost:{port}/swagger");
await app.RunAsync(cancellationToken);
}
/// <summary> /// <summary>
/// Apollo 配置中心 /// Apollo 配置中心
/// </summary> /// </summary>
@ -171,6 +211,8 @@ namespace Sln.Wcs
apolloConfiguration = configurationBuilder.Build(); apolloConfiguration = configurationBuilder.Build();
_apolloConfiguration = configurationBuilder.Build();
services.Remove(new ServiceDescriptor(typeof(IConfiguration), localConfiguration)); services.Remove(new ServiceDescriptor(typeof(IConfiguration), localConfiguration));
services.AddSingleton<IConfiguration>(apolloConfiguration); services.AddSingleton<IConfiguration>(apolloConfiguration);
} }

@ -26,6 +26,8 @@
<PackageReference Include="Scrutor" Version="7.0.0" /> <PackageReference Include="Scrutor" Version="7.0.0" />
<PackageReference Include="SQLite" Version="3.13.0" /> <PackageReference Include="SQLite" Version="3.13.0" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.214" /> <PackageReference Include="SqlSugarCore" Version="5.1.4.214" />
<PackageReference Include="Swashbuckle" Version="5.6.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -16,6 +16,8 @@ using Sln.Wcs.Function;
using SqlSugar; using SqlSugar;
using Sln.Wcs.Function.Functions; using Sln.Wcs.Function.Functions;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Sln.Wcs.Repository.@base;
using Sln.Wcs.Repository;
namespace Sln_Wpf.Page namespace Sln_Wpf.Page
{ {
@ -29,12 +31,15 @@ namespace Sln_Wpf.Page
/// </summary> /// </summary>
public BaseEquipInfo NewDevice { get; private set; } public BaseEquipInfo NewDevice { get; private set; }
private ISqlSugarClient? sqlSugarClient; private ISqlSugarClient? sqlSugarClient;
private BaseServiceImpl<BaseEquipInfo> baseService;
private equipInfoSqlFunction EquipInfoSqlFunction; private equipInfoSqlFunction EquipInfoSqlFunction;
private int WorkingType; private int WorkingType;
public AddEquipWindow() public AddEquipWindow()
{ {
InitializeComponent(); InitializeComponent();
sqlSugarClient = App.ServiceProvider.GetService<ISqlSugarClient>();
baseService = new BaseServiceImpl<BaseEquipInfo>(new Repository<BaseEquipInfo>(sqlSugarClient));
EquipInfoSqlFunction = new equipInfoSqlFunction(App.ServiceProvider); EquipInfoSqlFunction = new equipInfoSqlFunction(App.ServiceProvider);
WorkingType = 0; WorkingType = 0;
} }
@ -43,7 +48,7 @@ namespace Sln_Wpf.Page
{ {
InitializeComponent(); InitializeComponent();
sqlSugarClient = App.ServiceProvider.GetService<ISqlSugarClient>(); sqlSugarClient = App.ServiceProvider.GetService<ISqlSugarClient>();
EquipInfoSqlFunction = new equipInfoSqlFunction(App.ServiceProvider); baseService = new BaseServiceImpl<BaseEquipInfo>(new Repository<BaseEquipInfo>(sqlSugarClient));
WorkingType = 1; WorkingType = 1;
TxtEquipNo.Text = equipInfo.EquipNo; TxtEquipNo.Text = equipInfo.EquipNo;
TxtEquipName.Text = equipInfo.EquipName; TxtEquipName.Text = equipInfo.EquipName;
@ -80,8 +85,7 @@ namespace Sln_Wpf.Page
int Typeflag = 0; int Typeflag = 0;
int level = Convert.ToInt32(((CmbWorkshopLevel.SelectedItem as ComboBoxItem)?.Content.ToString() ?? "1F").Substring(0, 1)); int level = Convert.ToInt32(((CmbWorkshopLevel.SelectedItem as ComboBoxItem)?.Content.ToString() ?? "1F").Substring(0, 1));
Typeflag = StringTypetoInt(); Typeflag = StringTypetoInt();
sqlSugarClient.Updateable<BaseEquipInfo>().Where(it => it.EquipNo == TxtEquipNo.Text.Trim()).SetColumns(it => new BaseEquipInfo() NewDevice = new BaseEquipInfo {
{
EquipNo = TxtEquipNo.Text.Trim(), EquipNo = TxtEquipNo.Text.Trim(),
EquipName = TxtEquipName.Text.Trim(), EquipName = TxtEquipName.Text.Trim(),
EquipType = Typeflag, EquipType = Typeflag,
@ -89,7 +93,8 @@ namespace Sln_Wpf.Page
ServerPort = Convert.ToInt32(TxtServerPort.Text), ServerPort = Convert.ToInt32(TxtServerPort.Text),
WorkshopLevel = level, WorkshopLevel = level,
UseFlag = ChkUseFlag.IsChecked == true ? 1 : 0, UseFlag = ChkUseFlag.IsChecked == true ? 1 : 0,
}).ExecuteCommand(); };
baseService.Update(NewDevice, $"equip_no = '{TxtEquipNo.Text.Trim()}'");
DialogResult = true; DialogResult = true;
Close(); Close();
} }
@ -101,8 +106,6 @@ namespace Sln_Wpf.Page
return; return;
int Typeflag = 0; int Typeflag = 0;
Typeflag = StringTypetoInt(); Typeflag = StringTypetoInt();
// 创建设备信息对象 // 创建设备信息对象
NewDevice = new BaseEquipInfo NewDevice = new BaseEquipInfo
{ {
@ -114,7 +117,7 @@ namespace Sln_Wpf.Page
WorkshopLevel = Convert.ToInt32(((CmbWorkshopLevel.SelectedItem as ComboBoxItem)?.Content.ToString() ?? "1F").Substring(0, 1)), WorkshopLevel = Convert.ToInt32(((CmbWorkshopLevel.SelectedItem as ComboBoxItem)?.Content.ToString() ?? "1F").Substring(0, 1)),
UseFlag = ChkUseFlag.IsChecked == true ? 1 : 0, UseFlag = ChkUseFlag.IsChecked == true ? 1 : 0,
}; };
EquipInfoSqlFunction.insertFunction(NewDevice); baseService.Insert(NewDevice);
DialogResult = true; DialogResult = true;
Close(); Close();
} }

@ -106,7 +106,7 @@ namespace Sln_Wpf.Page.AddWindows
NewLocation = new BaseLocation NewLocation = new BaseLocation
{ {
WarehouseId = Convert.ToInt32(TxtWarehouseID.Text.Trim()), WarehouseId = Convert.ToInt32(TxtWarehouseID.Text.Trim()),
MachineId = Convert.ToInt32(TxtMachineID.Text.Trim()), MachineId = TxtMachineID.Text.Trim(),
LocationCode = TxtLocationCode.Text.Trim(), LocationCode = TxtLocationCode.Text.Trim(),
AgvPositionCode = TxtAgvPositionCode.Text.Trim(), AgvPositionCode = TxtAgvPositionCode.Text.Trim(),
ContainerCode = TxtContainerCode.Text.Trim(), ContainerCode = TxtContainerCode.Text.Trim(),
@ -127,7 +127,7 @@ namespace Sln_Wpf.Page.AddWindows
sqlSugarClient.Updateable<BaseLocation>().Where(it => it.LocationCode == TxtLocationCode.Text.Trim()).SetColumns(it => new BaseLocation() sqlSugarClient.Updateable<BaseLocation>().Where(it => it.LocationCode == TxtLocationCode.Text.Trim()).SetColumns(it => new BaseLocation()
{ {
WarehouseId = Convert.ToInt32(TxtWarehouseID.Text.Trim()), WarehouseId = Convert.ToInt32(TxtWarehouseID.Text.Trim()),
MachineId = Convert.ToInt32(TxtMachineID.Text.Trim()), MachineId = TxtMachineID.Text.Trim(),
LocationCode = TxtLocationCode.Text.Trim(), LocationCode = TxtLocationCode.Text.Trim(),
AgvPositionCode = TxtAgvPositionCode.Text.Trim(), AgvPositionCode = TxtAgvPositionCode.Text.Trim(),
ContainerCode = TxtContainerCode.Text.Trim(), ContainerCode = TxtContainerCode.Text.Trim(),
@ -141,7 +141,7 @@ namespace Sln_Wpf.Page.AddWindows
NewLocation = new BaseLocation NewLocation = new BaseLocation
{ {
WarehouseId = Convert.ToInt32(TxtWarehouseID.Text.Trim()), WarehouseId = Convert.ToInt32(TxtWarehouseID.Text.Trim()),
MachineId = Convert.ToInt32(TxtMachineID.Text.Trim()), MachineId = TxtMachineID.Text.Trim(),
LocationCode = TxtLocationCode.Text.Trim(), LocationCode = TxtLocationCode.Text.Trim(),
AgvPositionCode = TxtAgvPositionCode.Text.Trim(), AgvPositionCode = TxtAgvPositionCode.Text.Trim(),
ContainerCode = TxtContainerCode.Text.Trim(), ContainerCode = TxtContainerCode.Text.Trim(),

@ -81,7 +81,12 @@ namespace Sln_Wpf.Page
private void BtnAdd_Click(object sender, RoutedEventArgs e) private void BtnAdd_Click(object sender, RoutedEventArgs e)
{ {
AddEquipWindow addEquipWindow = new AddEquipWindow(); AddEquipWindow addEquipWindow = new AddEquipWindow();
addEquipWindow.ShowDialog(); bool? result = addEquipWindow.ShowDialog();
if (result == true)
{
_equips = sqlSugarClient.Queryable<BaseEquipInfo>().ToList();
BindDeviceData();
}
// 实际项目中:打开新增设备对话框,输入设备信息后保存 // 实际项目中:打开新增设备对话框,输入设备信息后保存
} }
@ -94,7 +99,12 @@ namespace Sln_Wpf.Page
return; return;
} }
AddEquipWindow addEquipWindow = new AddEquipWindow(_selectedDevice); AddEquipWindow addEquipWindow = new AddEquipWindow(_selectedDevice);
addEquipWindow.ShowDialog(); bool? result = addEquipWindow.ShowDialog();
if (result == true)
{
_equips = sqlSugarClient.Queryable<BaseEquipInfo>().ToList();
BindDeviceData();
}
} }
// 设备信息 - 删除 // 设备信息 - 删除

Loading…
Cancel
Save