MappingProfile.cs 14 KB
using AutoMapper;
using Rcs.Application.Dtos;
using Rcs.Application.DTOs;
using Rcs.Domain.Entities;
using Rcs.Domain.Enums;
using TaskStatus = Rcs.Domain.Entities.TaskStatus;

namespace Rcs.Application.Common.Mapping
{
    /// <summary>
    /// AutoMapper 配置文件
    /// </summary>
    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            // 机器人映射 - 包含枚举到字符串的转换
            // @author zzy - 修改为使用导航属性
            CreateMap<Robot, RobotDto>()
                .ForMember(dest => dest.RobotId, opt => opt.MapFrom(src => src.RobotId.ToString()))
                .ForMember(dest => dest.RobotManufacturer, opt => opt.MapFrom(src => src.RobotManufacturer))
                .ForMember(dest => dest.RobotType, opt => opt.MapFrom(src => src.RobotType))
                .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.Status))
                .ForMember(dest => dest.Online, opt => opt.MapFrom(src => src.Online))
                .ForMember(dest => dest.OperatingMode, opt => opt.MapFrom(src => src.OperatingMode))
                .ForMember(dest => dest.CurrentMapCode, opt => opt.MapFrom(src => src.Map != null ? src.Map.MapCode : null));

            CreateMap<Robot, RobotListItemDto>()
                .ForMember(dest => dest.RobotId, opt => opt.MapFrom(src => src.RobotId.ToString()))
                .ForMember(dest => dest.RobotManufacturer, opt => opt.MapFrom(src => src.RobotManufacturer))
                .ForMember(dest => dest.RobotType, opt => opt.MapFrom(src => src.RobotType));


            CreateMap<Map, MapDto>()
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => src.MapId.ToString()))
                .ForMember(dest => dest.MapType, opt => opt.MapFrom(src => src.MapType));

            CreateMap<MapDto, Map>()
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => Guid.Parse(src.MapId)))
                .ForMember(dest => dest.MapType, opt => opt.MapFrom(src => (MapTYPE)src.MapType));

            CreateMap<Map, MapListItemDto>()
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => src.MapId.ToString()))
                .ForMember(dest => dest.MapType, opt => opt.MapFrom(src => src.MapType));

            CreateMap<MapListItemDto, Map>()
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => Guid.Parse(src.MapId)))
                .ForMember(dest => dest.MapType, opt => opt.MapFrom(src => (MapTYPE)src.MapType));

            // MapResource 映射 - 枚举到字符串的转换,Guid到string的转换
            CreateMap<MapResource, MapResourceDto>()
                .ForMember(dest => dest.ResourceId, opt => opt.MapFrom(src => src.ResourceId.ToString()))
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => src.MapId.ToString()))
                .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type));

            CreateMap<MapResourceDto, MapResource>()
                .ForMember(dest => dest.ResourceId, opt => opt.MapFrom(src => string.IsNullOrEmpty(src.ResourceId) ? Guid.Empty : Guid.Parse(src.ResourceId)))
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => string.IsNullOrEmpty(src.MapId) ? Guid.Empty : Guid.Parse(src.MapId)))
                .ForMember(dest => dest.Type, opt => opt.MapFrom(src => (MapResourcesTYPE)src.Type))
                .ForMember(dest => dest.Maps, opt => opt.Ignore());

            // MapNode 映射 - 枚举到字符串的转换,Guid到string的转换
            // @author zzy - 添加 StorageLocations 映射
            CreateMap<MapNode, MapNodeDto>()
                .ForMember(dest => dest.NodeId, opt => opt.MapFrom(src => src.NodeId.ToString()))
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => src.MapId.ToString()));

            // StorageArea 映射
            // @author zzy
            CreateMap<StorageArea, StorageAreaDto>()
                .ForMember(dest => dest.AreaId, opt => opt.MapFrom(src => src.AreaId.ToString()));

            // StorageLocation 映射
            // @author zzy
            CreateMap<StorageLocation, StorageLocationDto>()
                .ForMember(dest => dest.LocationId, opt => opt.MapFrom(src => src.LocationId.ToString()))
                .ForMember(dest => dest.AreaId, opt => opt.MapFrom(src => src.AreaId.ToString()))
                .ForMember(dest => dest.MapNodeId, opt => opt.MapFrom(src => src.MapNodeId.HasValue ? src.MapNodeId.Value.ToString() : null))
                .ForMember(dest => dest.Status, opt => opt.MapFrom(src => (int)src.Status));

            CreateMap<MapNodeDto, MapNode>()
                .ForMember(dest => dest.NodeId,
                    opt => opt.MapFrom(src => string.IsNullOrEmpty(src.NodeId) ? Guid.Empty : Guid.Parse(src.NodeId)))
                .ForMember(dest => dest.MapId,
                    opt => opt.MapFrom(src => string.IsNullOrEmpty(src.MapId) ? Guid.Empty : Guid.Parse(src.MapId)))
                .ForMember(dest => dest.Type,
                    opt => opt.MapFrom(src =>
                        (MapNodeTYPE)src.Type))
                .ForMember(dest => dest.Map, opt => opt.Ignore())
                .ForMember(dest => dest.MapEdgesFromNodes, opt => opt.Ignore())
                .ForMember(dest => dest.MapEdgesToNodes, opt => opt.Ignore())
                .ForMember(dest => dest.MapResourcess, opt => opt.Ignore());

            // MapEdge 映射 - Guid到string的转换
            CreateMap<MapEdge, MapEdgeDto>()
                .ForMember(dest => dest.EdgeId, opt => opt.MapFrom(src => src.EdgeId.ToString()))
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => src.MapId.ToString()))
                .ForMember(dest => dest.FromNode, opt => opt.MapFrom(src => src.FromNode.ToString()))
                .ForMember(dest => dest.ToNode, opt => opt.MapFrom(src => src.ToNode.ToString()));

            CreateMap<MapEdgeDto, MapEdge>()
                .ForMember(dest => dest.EdgeId, opt => opt.MapFrom(src => string.IsNullOrEmpty(src.EdgeId) ? Guid.Empty : Guid.Parse(src.EdgeId)))
                .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => string.IsNullOrEmpty(src.MapId) ? Guid.Empty : Guid.Parse(src.MapId)))
                .ForMember(dest => dest.FromNode, opt => opt.MapFrom(src => Guid.Parse(src.FromNode)))
                .ForMember(dest => dest.ToNode, opt => opt.MapFrom(src => Guid.Parse(src.ToNode)))
                .ForMember(dest => dest.Maps, opt => opt.Ignore())
                .ForMember(dest => dest.MapNodesFromNode, opt => opt.Ignore())
                .ForMember(dest => dest.MapNodesToNode, opt => opt.Ignore());

            // Point 映射
            CreateMap<Point, PointDto>();
            CreateMap<PointDto, Point>();

            // TaskTemplate 映射
            CreateMap<TaskTemplate, TaskTemplateDto>()
                .ForMember(dest => dest.TemplateId, opt => opt.MapFrom(src => src.TemplateId.ToString()))
                .ForMember(dest => dest.RobotType, opt => opt.MapFrom(src => src.RobotType));

            CreateMap<TaskTemplate, TaskTemplateListItemDto>()
                .ForMember(dest => dest.TemplateId, opt => opt.MapFrom(src => src.TemplateId.ToString()))
                .ForMember(dest => dest.RobotType, opt => opt.MapFrom(src => src.RobotType));

            CreateMap<TaskStep, TaskStepDto>()
                .ForMember(dest => dest.StepId, opt => opt.MapFrom(src => src.StepId.ToString()))
                .ForMember(dest => dest.TemplateId, opt => opt.MapFrom(src => src.TemplateId.ToString()))
                .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type));

            // @author zzy - 修复 NodeValue 映射类型错误
            CreateMap<StepProperty, StepPropertyDto>()
                .ForMember(dest => dest.PropertyId, opt => opt.MapFrom(src => src.PropertyId.ToString()))
                .ForMember(dest => dest.StepId, opt => opt.MapFrom(src => src.StepId.ToString()))
                .ForMember(dest => dest.PropertyType, opt => opt.MapFrom(src => src.PropertyType))
                .ForMember(dest => dest.NodeValue, opt => opt.MapFrom(src => src.NodeValue.HasValue ? (int)src.NodeValue.Value : 0))
                .ForMember(dest => dest.AfterActionType, opt => opt.MapFrom(src => src.AfterActionType));

            CreateMap<StepAction, ActionDto>()
                .ForMember(dest => dest.ActionId, opt => opt.MapFrom(src => src.ActionId.ToString()))
                .ForMember(dest => dest.PropertyId, opt => opt.MapFrom(src => src.PropertyId.ToString()))
                .ForMember(dest => dest.BlockingType, opt => opt.MapFrom(src => src.BlockingType));

            // ActionConfiguration 映射
            CreateMap<ActionConfiguration, ActionConfigurationDto>()
                .ForMember(dest => dest.ActionConfigId, opt => opt.MapFrom(src => src.ActionConfigId.ToString()))
                .ForMember(dest => dest.ActionCategory, opt => opt.MapFrom(src => (int)src.ActionCategory))
                .ForMember(dest => dest.RobotType, opt => opt.MapFrom(src => (int)src.RobotType))
                .ForMember(dest => dest.BlockingType, opt => opt.MapFrom(src => (int)src.BlockingType));

            CreateMap<ActionConfiguration, ActionConfigurationListItemDto>()
                .ForMember(dest => dest.ActionConfigId, opt => opt.MapFrom(src => src.ActionConfigId.ToString()))
                .ForMember(dest => dest.ActionCategory, opt => opt.MapFrom(src => (int)src.ActionCategory))
                .ForMember(dest => dest.RobotType, opt => opt.MapFrom(src => (int)src.RobotType))
                .ForMember(dest => dest.BlockingType, opt => opt.MapFrom(src => (int)src.BlockingType));

            // ActionParameterDefinition 映射
            CreateMap<ActionParameterDefinition, ActionParameterDefinitionDto>()
                .ForMember(dest => dest.ParamId, opt => opt.MapFrom(src => src.ParamId.ToString()))
                .ForMember(dest => dest.ActionConfigId, opt => opt.MapFrom(src => src.ActionConfigId.ToString()))
                .ForMember(dest => dest.ParameterValueType, opt => opt.MapFrom(src => (int)src.ParameterValueType))
                .ForMember(dest => dest.ParameterSourceType, opt => opt.MapFrom(src => src.ParameterSourceType.HasValue ? (int?)src.ParameterSourceType.Value : null));

            // RobotTask 映射
            // @author zzy
            CreateMap<RobotTask, RobotTaskListItemDto>()
                .ForMember(dest => dest.TaskId, opt => opt.MapFrom(src => src.TaskId.ToString()))
                .ForMember(dest => dest.RobotId, opt => opt.MapFrom(src => src.RobotId.HasValue ? src.RobotId.Value.ToString() : null))
                .ForMember(dest => dest.RobotCode, opt => opt.MapFrom(src => src.Robot != null ? src.Robot.RobotCode : null))
                .ForMember(dest => dest.TaskTemplateId, opt => opt.MapFrom(src => src.TaskTemplateId.ToString()))
                .ForMember(dest => dest.TaskTemplateName, opt => opt.MapFrom(src => src.TaskTemplate != null ? src.TaskTemplate.TemplateName : null))
                .ForMember(dest => dest.BeginLocationId, opt => opt.MapFrom(src => src.BeginLocationId.HasValue ? src.BeginLocationId.Value.ToString() : null))
                .ForMember(dest => dest.BeginLocationName, opt => opt.MapFrom(src => src.BeginLocation != null ? src.BeginLocation.LocationName : null))
                .ForMember(dest => dest.EndLocationId, opt => opt.MapFrom(src => src.EndLocationId.HasValue ? src.EndLocationId.Value.ToString() : null))
                .ForMember(dest => dest.EndLocationName, opt => opt.MapFrom(src => src.EndLocation != null ? src.EndLocation.LocationName : null))
                .ForMember(dest => dest.Status, opt => opt.MapFrom(src => (int)src.Status))
                .ForMember(dest => dest.StatusName, opt => opt.MapFrom(src => GetTaskStatusName(src.Status)));

            CreateMap<RobotTask, RobotTaskDto>()
                .ForMember(dest => dest.TaskId, opt => opt.MapFrom(src => src.TaskId.ToString()))
                .ForMember(dest => dest.RobotId, opt => opt.MapFrom(src => src.RobotId.HasValue ? src.RobotId.Value.ToString() : null))
                .ForMember(dest => dest.RobotCode, opt => opt.MapFrom(src => src.Robot != null ? src.Robot.RobotCode : null))
                .ForMember(dest => dest.RobotName, opt => opt.MapFrom(src => src.Robot != null ? src.Robot.RobotName : null))
                .ForMember(dest => dest.TaskTemplateId, opt => opt.MapFrom(src => src.TaskTemplateId.ToString()))
                .ForMember(dest => dest.TaskTemplateName, opt => opt.MapFrom(src => src.TaskTemplate != null ? src.TaskTemplate.TemplateName : null))
                .ForMember(dest => dest.BeginLocationId, opt => opt.MapFrom(src => src.BeginLocationId.HasValue ? src.BeginLocationId.Value.ToString() : null))
                .ForMember(dest => dest.BeginLocationCode, opt => opt.MapFrom(src => src.BeginLocation != null ? src.BeginLocation.LocationCode : null))
                .ForMember(dest => dest.EndLocationId, opt => opt.MapFrom(src => src.EndLocationId.HasValue ? src.EndLocationId.Value.ToString() : null))
                .ForMember(dest => dest.EndLocationCode, opt => opt.MapFrom(src => src.EndLocation != null ? src.EndLocation.LocationCode : null))
                .ForMember(dest => dest.Status, opt => opt.MapFrom(src => (int)src.Status))
                .ForMember(dest => dest.StatusName, opt => opt.MapFrom(src => GetTaskStatusName(src.Status)));

        }

        /// <summary>
        /// 获取任务状态名称
        /// @author zzy
        /// </summary>
        private static string GetTaskStatusName(TaskStatus status)
        {
            return status switch
            {
                TaskStatus.Pending => "等待中",
                TaskStatus.Assigned => "已分配",
                TaskStatus.InProgress => "执行中",
                TaskStatus.WaitingForResource => "等待资源",
                TaskStatus.Completed => "已完成",
                TaskStatus.Cancelled => "已取消",
                TaskStatus.Failed => "执行失败",
                TaskStatus.Timeout => "超时",
                TaskStatus.Reassigned => "重新分配",
                _ => "未知"
            };
        }
    }
}