first commit

This commit is contained in:
2026-09-02 16:31:50 +08:00
commit a461727193
911 changed files with 692450 additions and 0 deletions
@@ -0,0 +1,39 @@
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.Dto.Enum;
using JSMachine.WMS.App.IService;
using JSMachine.WMS.App.ServiceImpl;
using JSMachine.WMS.Business.RcsCallBack.IService.StaePattern;
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern
{
/// <summary>
/// agv任务执行失败处理器
/// </summary>
public class FailedStateHandler : IAgvTaskStateHandler
{
private readonly IAGVTaskService _agvTaskService;
/// <summary>创建失败状态处理器。</summary>
/// <param name="agvTaskService">AGV 任务持久化服务。</param>
public FailedStateHandler(IAGVTaskService agvTaskService)
{
_agvTaskService=agvTaskService;
}
/// <summary>将当前 AGV 任务标记为失败并保存状态。</summary>
/// <param name="agvExcutionInfo">RCS 执行信息。</param>
/// <param name="agvTask">待更新的 AGV 任务。</param>
/// <param name="destWarehouse">目标库位。</param>
/// <returns>状态更新是否成功。</returns>
public async Task<bool> HandleAsync(AgvExcutionInfo agvExcutionInfo, AGVTaskDto agvTask, StorageRackDto destWarehouse)
{
agvTask.TaskStatus = TaskStatusEnum.Failed;
return await _agvTaskService.UpdateAgvTaskStatus(agvTask);
}
}
}
@@ -0,0 +1,92 @@
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.Dto.Enum;
using JSMachine.WMS.App.IService;
using JSMachine.WMS.Business.RcsCallBack.IService.StaePattern;
using JSMachine.WMS.Business.SSE;
using JSMachine.WMS.Infrastructure.Helper;
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern
{
/// <summary>
/// agv取货完成处理器
/// </summary>
public class PickupCompletedStateHandler : IAgvTaskStateHandler
{
private readonly IStorageRackService _storageRackService;
private readonly IAGVTaskService _agvTaskService;
public PickupCompletedStateHandler(IStorageRackService storageRackService, IAGVTaskService agvTaskService)
{
_storageRackService = storageRackService;
_agvTaskService = agvTaskService;
}
public async Task<bool> HandleAsync(AgvExcutionInfo agvExcutionInfo, AGVTaskDto agvTask, StorageRackDto destWarehouse)
{
// 清空出库库位上的物料、解锁库位
await ClearMateriaInfo(agvTask);
//更新AgvTask的状态为 取货完成
agvTask.TaskStatus = TaskStatusEnum.PickupCompleted;
return await _agvTaskService.UpdateAgvTaskStatus(agvTask);
}
/// <summary>
/// 清空起点库位上的物料信息
/// </summary>
/// <param name="agvTask"></param>
/// <returns></returns>
private async Task<bool> ClearMateriaInfo(AGVTaskDto agvTask)
{
var clearResult = false;
var typeMsg = "";
if (agvTask.TaskType == TaskTypeEnum.SaleOut)
{
typeMsg = "销售出库,";
}
else if (agvTask.TaskType == TaskTypeEnum.Carry)
{
typeMsg = "搬运物料,";
}
var clearWarehouse = await _storageRackService.GetSingalByExpression(p => p.StorageRackNo == agvTask.StartPositionCode);
if (clearWarehouse != null)
{
clearWarehouse.MateriaBatch = "";
clearWarehouse.MateriaNum = 0;
clearWarehouse.OrderNo = "";
clearWarehouse.MateriaName = "";
clearWarehouse.MateriaType = "";
clearWarehouse.MateriaCode = "";
clearWarehouse.BarCode = "";
clearWarehouse.IsLock = false;
clearResult = await _storageRackService.EditSingal(clearWarehouse);
if (!clearResult)
{
LogHelper.Error($"{typeMsg}清空库位{clearWarehouse.StorageRackNo}上的物料信息{clearWarehouse.MateriaCode}失败");
}
else
{
LogHelper.Info($"{typeMsg}清空库位{clearWarehouse.StorageRackNo}上的物料信息{clearWarehouse.MateriaCode}成功");
}
}
else
{
LogHelper.Error($"{typeMsg}清空库位时,未查询到库位{agvTask.StartPositionCode}上的物料信息");
}
//发送广播通知前端网站刷新页面
SseEngine.BrodCast(agvTask.Floor.ToString());
return clearResult;
}
}
}
@@ -0,0 +1,104 @@
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.Dto.Enum;
using JSMachine.WMS.App.IService;
using JSMachine.WMS.App.ServiceImpl;
using JSMachine.WMS.Business.SSE;
using JSMachine.WMS.Infrastructure;
using JSMachine.WMS.Infrastructure.Helper;
using JSMachine.WMS.PLC.ModbusImpl.Elevator.Model;
using JSMachine.WMS.PLC.ModbusImpl.PaperFeedGroundRack.ModbusIO.Write;
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern.PutdownCompleted
{
/// <summary>
/// 提升机处理器
/// </summary>
public class ElevatorDeliveryHandler : PutdownCompletedStateHandler
{
public ElevatorDeliveryHandler
(IStorageRackService storageRackService,
IAGVTaskService agvTaskService,
IElevatorPlcQueueService elevatorPlcQueueService,
IElevatorCountService elevatorCountService,
IERPTaskService erpTaskService) :
base(storageRackService, agvTaskService, elevatorPlcQueueService, elevatorCountService, erpTaskService)
{
}
public async override Task<bool> HandleAsync(AgvExcutionInfo agvExcutionInfo, AGVTaskDto agvTask, StorageRackDto destWarehouse)
{
var elevatorPlcStatus = new ElevatorPlcStatus();
//2.1 写PLC放货完成
int elevatorNo = destWarehouse.StorageRackName.Contains("1号") ? 1 : 2;
elevatorPlcStatus.ElevatorNo = elevatorNo;
if (destWarehouse.ElevatorChannel == 1001)
{
elevatorPlcStatus.StockInPutdownChanelTwo = true;
}
if (destWarehouse.ElevatorChannel == 1011)
{
elevatorPlcStatus.StockInPutdownChanelOne = true;
}
if (destWarehouse.ElevatorChannel == 2001)
{
elevatorPlcStatus.StockOutPutdownChanelTwo = true;
}
if (destWarehouse.ElevatorChannel == 2011)
{
elevatorPlcStatus.StockOutPutdownChanelOne = true;
}
bool bRet = await ElevatorWrite.WriteElevator(elevatorPlcStatus);
if (!bRet)
{
LogHelper.Error($"{agvTask.TaskType.GetDescription()}: " +
$"向 {elevatorPlcStatus.ElevatorNo} 号提升机 {destWarehouse.ElevatorChannel} 网带写放货完成信号失败");
return false;
}
if(agvTask.TaskType!=TaskTypeEnum.Carry)
{
//2.2 写PLC队列信息
ElevatorPlcQueueDto elevatorPlcQueue = new()
{
ElevatorNo = elevatorNo,
ElevatorChannel = destWarehouse.ElevatorChannel.Value,
AgvTaskId = agvTask.Id,
IsLock = false
};
bRet = await _elevatorPlcQueueService.Add(elevatorPlcQueue);
if (!bRet)
{
LogHelper.Error($"{agvTask.TaskType.GetDescription()}:写PLC队列失败");
return false;
}
else
{
LogHelper.Info($"{agvTask.TaskType.GetDescription()}:" +
$"写PLC队列成功,提升机编号 {elevatorPlcQueue.ElevatorNo} 通道号 {elevatorPlcQueue.ElevatorChannel}");
}
//提升机计数
await _elevatorCountService.IncrementCount(elevatorNo, elevatorPlcQueue.ElevatorChannel);
}
//2.3 更新agvtask的状态为完成
await base.CompleteTask(agvTask);
//2.4 解锁提升机库位
await _storageRackService.Unlock(destWarehouse);
//发送广播通知前端网站刷新页面
SseEngine.BrodCast(agvTask.Floor.ToString());
return true;
}
}
}
@@ -0,0 +1,49 @@
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.Dto.Enum;
using JSMachine.WMS.App.IService;
using JSMachine.WMS.App.ServiceImpl;
using JSMachine.WMS.Business.RcsCallBack.IService.StaePattern;
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern.PutdownCompleted
{
/// <summary>
/// 放货完成处理器
/// </summary>
public abstract class PutdownCompletedStateHandler : IAgvTaskStateHandler
{
protected readonly IStorageRackService _storageRackService;
protected readonly IAGVTaskService _agvTaskService;
protected readonly IElevatorPlcQueueService _elevatorPlcQueueService;
protected readonly IElevatorCountService _elevatorCountService;
protected readonly IERPTaskService _erpTaskService;
public PutdownCompletedStateHandler(
IStorageRackService storageRackService,
IAGVTaskService agvTaskService,
IElevatorPlcQueueService elevatorPlcQueueService,
IElevatorCountService elevatorCountService,
IERPTaskService erpTaskService
)
{
_storageRackService = storageRackService;
_agvTaskService = agvTaskService;
_elevatorPlcQueueService = elevatorPlcQueueService;
_elevatorCountService= elevatorCountService;
_erpTaskService = erpTaskService;
}
public abstract Task<bool> HandleAsync(AgvExcutionInfo agvExcutionInfo, AGVTaskDto agvTask, StorageRackDto destWarehouse);
protected async Task CompleteTask(AGVTaskDto agvTask)
{
agvTask.TaskStatus = TaskStatusEnum.Completed;
await _agvTaskService.UpdateAgvTaskStatus(agvTask);
}
}
}
@@ -0,0 +1,75 @@
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.Dto.Enum;
using JSMachine.WMS.App.IService;
using JSMachine.WMS.App.ServiceImpl;
using JSMachine.WMS.Business.Common.IService;
using JSMachine.WMS.Business.RcsCallBack.IService.StaePattern;
using JSMachine.WMS.Business.SSE;
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static JSMachine.WMS.App.Dto.StorageRackDto;
namespace JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern.PutdownCompleted
{
/// <summary>
/// 存储区(包括中转区)放货完成处理器
/// </summary>
public class StockAreaHandler : PutdownCompletedStateHandler
{
public StockAreaHandler(
IStorageRackService storageRackService,
IAGVTaskService agvTaskService,
IElevatorPlcQueueService elevatorPlcQueueService,
IElevatorCountService elevatorCountService,
IERPTaskService erpTaskService) :
base(storageRackService, agvTaskService, elevatorPlcQueueService, elevatorCountService, erpTaskService)
{
}
public async override Task<bool> HandleAsync(AgvExcutionInfo agvExcutionInfo, AGVTaskDto agvTask, StorageRackDto destWarehouse)
{
//1.将物料绑定到目标库位
//2.解锁目标库位
//3.更改agv任务为完成
destWarehouse.BingdingMaterial(new MateriaInfo
{
BarCode = agvTask.BarCode,
MateriaBatch = agvTask.MateriaBatch,
MateriaCode = agvTask.MateriaCode,
MateriaName = agvTask.MateriaName,
MateriaNum = agvTask.MateriaNum.ToString(),
MateriaType = agvTask.MateriaType,
OrderNo = agvTask.OrderNo
});
destWarehouse.IsLock = false;
await _storageRackService.EditSingal(destWarehouse);
await CompleteTask(agvTask);
//更新erp任务为完成状态
if (agvTask.TaskType == TaskTypeEnum.PdaIn ||
agvTask.TaskType == TaskTypeEnum.TailIn ||
agvTask.TaskType == TaskTypeEnum.TransferStockIn)
{
ERPTaskDto erpTask = await _erpTaskService.GetSingalByExpression(p => p.Id == agvTask.ErpTaskId);
if (erpTask != null)
{
erpTask.TaskStatus = TaskStatusEnum.Completed;
erpTask.TaskMsg = "";
await _erpTaskService.EditSingalWithSpecificCols(erpTask, ["TaskStatus", "TaskMsg"]);
}
}
//发送广播通知前端网站刷新页面
SseEngine.BrodCast(agvTask.Floor.ToString());
return true;
}
}
}
@@ -0,0 +1,52 @@
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.Dto.Enum;
using JSMachine.WMS.App.IService;
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern.PutdownCompleted
{
/// <summary>
/// 出库码头处理器
/// </summary>
public class StockOutWharfHandler : PutdownCompletedStateHandler
{
public StockOutWharfHandler
(IStorageRackService storageRackService,
IAGVTaskService agvTaskService,
IElevatorPlcQueueService elevatorPlcQueueService,
IElevatorCountService elevatorCountService,
IERPTaskService erpTaskService) :
base(storageRackService, agvTaskService, elevatorPlcQueueService, elevatorCountService, erpTaskService)
{
}
public async override Task<bool> HandleAsync(AgvExcutionInfo agvExcutionInfo, AGVTaskDto agvTask, StorageRackDto destWarehouse)
{
destWarehouse.BarCode = agvTask.BarCode;
agvTask.TaskStatus = TaskStatusEnum.Completed;
await UnlockAndSetMiddleWarehouse(destWarehouse);
return await _agvTaskService.UpdateAgvTaskStatus(agvTask);
}
/// <summary>
/// 解锁中区库位并绑定合格证
/// </summary>
/// <returns></returns>
private async Task UnlockAndSetMiddleWarehouse(StorageRackDto storageRack)
{
if (storageRack.Transport != TransportEnum.MiddleOutArea)
return;
storageRack.IsLock = false;
await _storageRackService.EditSingalWithSpecificCols(storageRack, ["IsLock", "BarCode"]);
}
}
}
@@ -0,0 +1,55 @@
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.Dto.Enum;
using JSMachine.WMS.App.IService;
using JSMachine.WMS.Business.SSE;
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static JSMachine.WMS.App.Dto.StorageRackDto;
namespace JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern.PutdownCompleted
{
public class TransitAreaHandler : PutdownCompletedStateHandler
{
public TransitAreaHandler(
IStorageRackService storageRackService,
IAGVTaskService agvTaskService,
IElevatorPlcQueueService elevatorPlcQueueService,
IElevatorCountService elevatorCountService,
IERPTaskService erpTaskService) :
base(storageRackService, agvTaskService, elevatorPlcQueueService, elevatorCountService, erpTaskService)
{
}
public async override Task<bool> HandleAsync(AgvExcutionInfo agvExcutionInfo, AGVTaskDto agvTask, StorageRackDto destWarehouse)
{
//1.将物料绑定到目标库位
//2.解锁目标库位
//3.更改agv任务为完成
destWarehouse.BingdingMaterial(new MateriaInfo
{
BarCode = agvTask.BarCode,
MateriaBatch = agvTask.MateriaBatch,
MateriaCode = agvTask.MateriaCode,
MateriaName = agvTask.MateriaName,
MateriaNum = agvTask.MateriaNum.ToString(),
MateriaType = agvTask.MateriaType,
OrderNo = agvTask.OrderNo
});
destWarehouse.IsLock = false;
await _storageRackService.EditSingal(destWarehouse);
await CompleteTask(agvTask);
//发送广播通知前端网站刷新页面
SseEngine.BrodCast(agvTask.Floor.ToString());
return true;
}
}
}
@@ -0,0 +1,42 @@
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.Dto.Enum;
using JSMachine.WMS.Business.RcsCallBack.IService.StaePattern;
using JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern.PutdownCompleted;
using JSMachine.WMS.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JSMachine.WMS.Business.RcsCallBack.ServiceImpl.StatePattern
{
/// <summary>
/// rcs回调处理器工厂类
/// </summary>
public class RcsCallbackHandlerFactory
{
/// <summary>
/// 根据 RCS 返回状态和目标库位运输区域选择状态处理器。
/// </summary>
/// <param name="status">RCS 任务状态码。</param>
/// <param name="destWarehouse">任务目标库位。</param>
/// <returns>负责当前状态后续处理的处理器。</returns>
public IAgvTaskStateHandler CreateHandler(int status, StorageRackDto destWarehouse)
{
return status switch
{
21 => GlobalServericeProvidor.GetService<PickupCompletedStateHandler>(),
23 => destWarehouse.Transport switch
{
TransportEnum.NorthArea or TransportEnum.SouthArea or TransportEnum.MiddleOutArea or TransportEnum.ReturnStockArea
=> GlobalServericeProvidor.GetService<StockOutWharfHandler>(),
TransportEnum.NormalArea => GlobalServericeProvidor.GetService<StockAreaHandler>(),
TransportEnum.TransitArea => GlobalServericeProvidor.GetService<TransitAreaHandler>(),
TransportEnum.Elevator => GlobalServericeProvidor.GetService<ElevatorDeliveryHandler>(),
}
};
}
}
}