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

namespace Rcs.Application.Common.Mapping
{
    /// <summary>
    /// AutoMapper 闂佹澘绉堕悿鍡涘棘閸ワ附顐?
    /// </summary>
    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            // 闁哄牆鎼▍鎺撶閻戞ɑ衼閻?- 闁告牕鎳庨幆鍫ュ几濮橆偄顩柛鎺撴緲閻⊙呯箔閿旇儻顩柣銊ュ濞村棝骞?
            // @author zzy - 濞e浂鍠楅弫鍏肩▔鏉炴澘鈻忛柣顫妼椤曢亶鎳滈鍕剑闁?
            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))
                .ForMember(dest => dest.ForkAngleOffset, opt => opt.MapFrom(src => src.ForkRadOffset != null ? src.ForkRadOffset.Select(r => AngleConverter.ToCycleDegrees(r)).ToList() : null))
                .ForMember(dest => dest.CacheLocations, opt => opt.MapFrom(src => src.CacheLocations));

            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))
                .ForMember(dest => dest.CacheLocations, opt => opt.MapFrom(src => src.CacheLocations));


            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 闁哄嫮濮撮惃?- 闁哄鐭俊鍥礆閺夎法鎽熺紒妤嬬細鐟曞棝鎯冮崟顔界ギ闁硅婢佺槐婊竨id闁告帞娈渢ring闁汇劌瀚ù鍡涘箲?
            // @author zzy - 婵烇綀顕ф慨?MaxSpeed, CanRotate, EntryAction, ExitAction 闁哄嫮濮撮惃鐘绘晬鐎涱摰cationCoordinates Polygon閺夌偟鎮媔st<PointDto>
            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))
                .ForMember(dest => dest.LocationCoordinates,
                    opt => opt.MapFrom(src =>
                        PolygonConverter.ToPointList(src.LocationCoordinates) != null
                            ? PolygonConverter.ToPointList(src.LocationCoordinates)!
                                .Select(p => new Point { X = p.X, Y = p.Y }).ToList()
                            : null))
                .ForMember(dest => dest.PreAction1Type, opt => opt.MapFrom(src => src.PreAction1Type.HasValue ? (int?)src.PreAction1Type.Value : null))
                .ForMember(dest => dest.PreNetActions1, opt => opt.MapFrom(src => src.PreNetActions1 != null ? src.PreNetActions1.Select(n => n.ToString()).ToList() : null))
                .ForMember(dest => dest.PostAction1Type, opt => opt.MapFrom(src => src.PostAction1Type.HasValue ? (int?)src.PostAction1Type.Value : null))
                .ForMember(dest => dest.PostNetActions1, opt => opt.MapFrom(src => src.PostNetActions1 != null ? src.PostNetActions1.Select(n => n.ToString()).ToList() : null))
                .ForMember(dest => dest.PreAction2Type, opt => opt.MapFrom(src => src.PreAction2Type.HasValue ? (int?)src.PreAction2Type.Value : null))
                .ForMember(dest => dest.PreNetActions2, opt => opt.MapFrom(src => src.PreNetActions2 != null ? src.PreNetActions2.Select(n => n.ToString()).ToList() : null))
                .ForMember(dest => dest.PostAction2Type, opt => opt.MapFrom(src => src.PostAction2Type.HasValue ? (int?)src.PostAction2Type.Value : null))
                .ForMember(dest => dest.PostNetActions2, opt => opt.MapFrom(src => src.PostNetActions2 != null ? src.PostNetActions2.Select(n => n.ToString()).ToList() : null));

            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.LocationCoordinates, opt => opt.MapFrom<LocationCoordinatesResolver>())

                .ForMember(dest => dest.Maps, opt => opt.Ignore());

            // MapNode 闁哄嫮濮撮惃?- 闁哄鐭俊鍥礆閺夎法鎽熺紒妤嬬細鐟曞棝鎯冮崟顔界ギ闁硅婢佺槐婊竨id闁告帞娈渢ring闁汇劌瀚ù鍡涘箲?
            // @author zzy - 婵烇綀顕ф慨?StorageLocations 闁哄嫮濮撮惃? StorageLocationTypeId 闁哄嫮濮撮惃? Theta鐎殿啫鍐唺閺夌儐鍓濋~妤佹償?
            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()))
                .ForMember(dest => dest.StorageLocationTypeId, opt => opt.MapFrom(src => src.StorageLocationTypeId.HasValue ? src.StorageLocationTypeId.Value.ToString() : null))
                .ForMember(dest => dest.Theta, opt => opt.MapFrom(src => src.Theta.HasValue ? AngleConverter.ToCycleDegrees(src.Theta.Value) : (double?)null));  // 鐎殿啫鍐唺閺夌儐鍓濋~妤佹償閿旇偐绀夊ǎ鍥ㄧ箘閺嗏偓6濞达絽绉撮惃顒勫极?

            // 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.LocationTypeId, opt => opt.MapFrom(src => src.LocationTypeId.HasValue ? src.LocationTypeId.Value.ToString() : null))
                .ForMember(dest => dest.Orientation, opt => opt.MapFrom(src => src.Orientation))
                .ForMember(dest => dest.Status, opt => opt.MapFrom(src => (int)src.Status));

            CreateMap<StorageLocation, StorageLocationListItemDto>()
                .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.AreaCode, opt => opt.MapFrom(src => src.StorageArea != null ? src.StorageArea.AreaCode : null))
                .ForMember(dest => dest.AreaName, opt => opt.MapFrom(src => src.StorageArea != null ? src.StorageArea.AreaName : null))
                .ForMember(dest => dest.MapNodeId, opt => opt.MapFrom(src => src.MapNodeId.HasValue ? src.MapNodeId.Value.ToString() : null))
                .ForMember(dest => dest.MapNodeCode, opt => opt.MapFrom(src => src.MapNode != null ? src.MapNode.NodeCode : null))
                .ForMember(dest => dest.MapNodeName, opt => opt.MapFrom(src => src.MapNode != null ? src.MapNode.NodeName : null))
                .ForMember(dest => dest.LocationTypeId, opt => opt.MapFrom(src => src.LocationTypeId.HasValue ? src.LocationTypeId.Value.ToString() : null))
                .ForMember(dest => dest.LocationTypeCode, opt => opt.MapFrom(src => src.LocationType != null ? src.LocationType.TypeCode : null))
                .ForMember(dest => dest.LocationTypeName, opt => opt.MapFrom(src => src.LocationType != null ? src.LocationType.TypeName : null))
                .ForMember(dest => dest.Orientation, opt => opt.MapFrom(src => src.Orientation))
                .ForMember(dest => dest.Status, opt => opt.MapFrom(src => (int)src.Status));

            // StorageLocationType 闁哄嫮濮撮惃?
            // @author zzy
            CreateMap<StorageLocationType, StorageLocationTypeDto>()
                .ForMember(dest => dest.TypeId, opt => opt.MapFrom(src => src.TypeId.ToString()))
                .ForMember(dest => dest.PickupApplyRequestConfigId, opt => opt.MapFrom(src => src.PickupApplyRequestConfigId.HasValue ? src.PickupApplyRequestConfigId.Value.ToString() : null))
                .ForMember(dest => dest.PickupCompleteRequestConfigId, opt => opt.MapFrom(src => src.PickupCompleteRequestConfigId.HasValue ? src.PickupCompleteRequestConfigId.Value.ToString() : null))
                .ForMember(dest => dest.DropApplyRequestConfigId, opt => opt.MapFrom(src => src.DropApplyRequestConfigId.HasValue ? src.DropApplyRequestConfigId.Value.ToString() : null))
                .ForMember(dest => dest.DropCompleteRequestConfigId, opt => opt.MapFrom(src => src.DropCompleteRequestConfigId.HasValue ? src.DropCompleteRequestConfigId.Value.ToString() : null));

            CreateMap<StorageLocationType, StorageLocationTypeListItemDto>()
                .ForMember(dest => dest.TypeId, opt => opt.MapFrom(src => src.TypeId.ToString()))
                .ForMember(dest => dest.PickupApplyRequestConfigId, opt => opt.MapFrom(src => src.PickupApplyRequestConfigId.HasValue ? src.PickupApplyRequestConfigId.Value.ToString() : null))
                .ForMember(dest => dest.PickupCompleteRequestConfigId, opt => opt.MapFrom(src => src.PickupCompleteRequestConfigId.HasValue ? src.PickupCompleteRequestConfigId.Value.ToString() : null))
                .ForMember(dest => dest.DropApplyRequestConfigId, opt => opt.MapFrom(src => src.DropApplyRequestConfigId.HasValue ? src.DropApplyRequestConfigId.Value.ToString() : null))
                .ForMember(dest => dest.DropCompleteRequestConfigId, opt => opt.MapFrom(src => src.DropCompleteRequestConfigId.HasValue ? src.DropCompleteRequestConfigId.Value.ToString() : null));

            // ChargingPile 鏄犲皠
            CreateMap<ChargingPile, ChargingPileDto>()
                .ForMember(dest => dest.PileId, opt => opt.MapFrom(src => src.PileId.ToString()))
                .ForMember(dest => dest.MapNodeId, opt => opt.MapFrom(src => src.MapNodeId.HasValue ? src.MapNodeId.Value.ToString() : null))
                .ForMember(dest => dest.CurrentChargingRobotId, opt => opt.MapFrom(src => src.CurrentChargingRobotId.HasValue ? src.CurrentChargingRobotId.Value.ToString() : null))
                .ForMember(dest => dest.BoundRobotIds, opt => opt.MapFrom(src => src.BoundRobotIds.Select(x => x.ToString()).ToList()));

            CreateMap<ChargingPile, ChargingPileListItemDto>()
                .ForMember(dest => dest.PileId, opt => opt.MapFrom(src => src.PileId.ToString()))
                .ForMember(dest => dest.MapNodeId, opt => opt.MapFrom(src => src.MapNodeId.HasValue ? src.MapNodeId.Value.ToString() : null))
                .ForMember(dest => dest.CurrentChargingRobotId, opt => opt.MapFrom(src => src.CurrentChargingRobotId.HasValue ? src.CurrentChargingRobotId.Value.ToString() : null))
                .ForMember(dest => dest.BoundRobotIds, opt => opt.MapFrom(src => src.BoundRobotIds.Select(x => x.ToString()).ToList()));

            // RobotCacheLocation 映射
            CreateMap<RobotCacheLocation, RobotCacheLocationListItemDto>()
                .ForMember(dest => dest.CacheLocationId, opt => opt.MapFrom(src => src.CacheLocationId.ToString()))
                .ForMember(dest => dest.RobotId, opt => opt.MapFrom(src => src.RobotId.ToString()))
                .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));

            CreateMap<RobotCacheLocation, RobotCacheLocationDto>()
                .ForMember(dest => dest.CacheLocationId, opt => opt.MapFrom(src => src.CacheLocationId.ToString()))
                .ForMember(dest => dest.RobotId, opt => opt.MapFrom(src => src.RobotId.ToString()));

            CreateMap<CreateRobotCacheLocationDto, RobotCacheLocation>()
                .ForMember(dest => dest.CacheLocationId, opt => opt.Ignore()) // 闁汇垹宕导鎰板储閸屾稒鐓欐繛澶嬫礈閺佹捇骞?
                .ForMember(dest => dest.RobotId, opt => opt.MapFrom(src => Guid.Parse(src.RobotId)))
                .ForMember(dest => dest.CreatedAt, opt => opt.Ignore()) // 闁汇垹宕导鎰板储閸屾稒鐓欐繛澶嬫礉椤旀洜绱?
                .ForMember(dest => dest.UpdatedAt, opt => opt.Ignore()) // 闁汇垹宕导鎰板储閸屾稒鐓欐繛澶嬫礉椤旀洜绱?
                .ForMember(dest => dest.Robot, opt => opt.Ignore()); // 閻庝絻澹堥崺鍛沪閻愮补鍋撹閹风兘鎮?

            CreateMap<UpdateRobotCacheLocationDto, RobotCacheLocation>()
                .ForMember(dest => dest.CacheLocationId, opt => opt.Ignore())
                .ForMember(dest => dest.RobotId, opt => opt.Ignore())
                .ForMember(dest => dest.CreatedAt, opt => opt.Ignore())
                .ForMember(dest => dest.UpdatedAt, opt => opt.Ignore())
                .ForMember(dest => dest.Robot, opt => opt.Ignore());

            // @author zzy - Theta閻熸瑦甯掔€硅櫕娼鈧慨顒佹償?
            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.StorageLocationTypeId,
                    opt => opt.MapFrom(src => string.IsNullOrEmpty(src.StorageLocationTypeId) ? (Guid?)null : Guid.Parse(src.StorageLocationTypeId)))
                .ForMember(dest => dest.Theta, opt => opt.MapFrom(src => src.Theta.HasValue ? AngleConverter.ToCycleRadians(src.Theta.Value) : (double?)null))  // 閻熸瑦甯掔€硅櫕娼鈧慨顒佹償?
                .ForMember(dest => dest.Map, opt => opt.Ignore())
                .ForMember(dest => dest.StorageLocationType, 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闁告帞娈渢ring闁汇劌瀚ù鍡涘箲椤喚绀夌€殿啫鍐唺濞戞挸姘﹂~妤佹償閿旇法闉嶉弶?
            // @author zzy - OrientationRads/MaxRadDeviation(鐎殿啫鍐唺) 濞?OrientationAngles/MaxAngleDeviation(閻熸瑦甯掔€? 濞存粍甯熷ù?
            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()))
                .ForMember(dest => dest.OrientationAngles, opt => opt.MapFrom(src => src.OrientationRads != null ? src.OrientationRads.Select(r => AngleConverter.ToCycleDegrees(r)).ToList() : null))  // 鐎殿啫鍐唺闁告帗顨夐妴鍐╂姜椤掑喚娼¢幖杈剧畱閸亞鎮伴…鎺旂濞e洦绻勯弳鈧?濞达絽绉撮惃顒勫极?
                .ForMember(dest => dest.MaxAngleDeviation, opt => opt.MapFrom(src => src.MaxRadDeviation.HasValue ? AngleConverter.ToCycleDegrees(src.MaxRadDeviation.Value): (double?)null));  // 鐎殿啫鍐唺閺夌儐鍓濋~妤佹償閿旇偐绀夊ǎ鍥ㄧ箘閺嗏偓6濞达絽绉撮惃顒勫极?

            // @author zzy - OrientationAngles/MaxAngleDeviation(閻熸瑦甯掔€? 閺?OrientationRads/MaxRadDeviation(鐎殿啫鍐唺)
            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.OrientationRads, opt => opt.MapFrom(src => src.OrientationAngles != null ? src.OrientationAngles.Select(a => AngleConverter.ToCycleRadians(a)).ToList() : null))  // 閻熸瑦甯掔€规娊宕氬Δ鍕┾偓鍐╂姜椤掆偓婵剚鎯旈敃鈧崹顏嗘偘?
                .ForMember(dest => dest.MaxRadDeviation, opt => opt.MapFrom(src => src.MaxAngleDeviation.HasValue ? AngleConverter.ToCycleRadians(src.MaxAngleDeviation.Value) : (double?)null))  // 閻熸瑦甯掔€硅櫕娼鈧慨顒佹償?
                .ForMember(dest => dest.Maps, opt => opt.Ignore())
                .ForMember(dest => dest.MapNodesFromNode, opt => opt.Ignore())
                .ForMember(dest => dest.MapNodesToNode, opt => opt.Ignore());

            // 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 - 濞e浂鍠栭ˇ?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.PreAction1Type, opt => opt.MapFrom(src => src.PreAction1Type.HasValue ? (int?)src.PreAction1Type.Value : null))
                .ForMember(dest => dest.PreNetActions1, opt => opt.MapFrom(src => src.PreNetActions1 != null ? src.PreNetActions1.Select(n => n.ToString()).ToList() : null))
                .ForMember(dest => dest.PostAction1Type, opt => opt.MapFrom(src => src.PostAction1Type.HasValue ? (int?)src.PostAction1Type.Value : null))
                .ForMember(dest => dest.PostNetActions1, opt => opt.MapFrom(src => src.PostNetActions1 != null ? src.PostNetActions1.Select(n => n.ToString()).ToList() : null))
                .ForMember(dest => dest.PreAction2Type, opt => opt.MapFrom(src => src.PreAction2Type.HasValue ? (int?)src.PreAction2Type.Value : null))
                .ForMember(dest => dest.PreNetActions2, opt => opt.MapFrom(src => src.PreNetActions2 != null ? src.PreNetActions2.Select(n => n.ToString()).ToList() : null))
                .ForMember(dest => dest.PostAction2Type, opt => opt.MapFrom(src => src.PostAction2Type.HasValue ? (int?)src.PostAction2Type.Value : null))
                .ForMember(dest => dest.PostNetActions2, opt => opt.MapFrom(src => src.PostNetActions2 != null ? src.PostNetActions2.Select(n => n.ToString()).ToList() : null));

            // @author zzy - StepPropertyAction 闁哄嫮濮撮惃?
            CreateMap<NetActionPropertys, NetActionPropertyDto>()
                .ForMember(dest => dest.ActionConfigId, opt => opt.MapFrom(src => src.NetActionId.ToString()));

            CreateMap<StepAction, ActionDto>()
                .ForMember(dest => dest.Id, 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))
                .ForMember(dest => dest.StepActionId, opt => opt.MapFrom(src => src.StepAction != null ? src.StepAction.ActionId.ToString() : null));

            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))
                .ForMember(dest => dest.StepActionId, opt => opt.MapFrom(src => src.StepAction != null ? src.StepAction.ActionId.ToString() : null));

            // 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));

            // NetActionPropertys 闁哄嫮濮撮惃?
            // @author zzy - 婵烇綀顕ф慨?WaitResponseType 闁哄鐭俊鍥礆?int 闁汇劌瀚Σ褏浜?
            CreateMap<NetActionPropertys, NetActionPropertysDto>()
                .ForMember(dest => dest.NetActionId, opt => opt.MapFrom(src => src.NetActionId.ToString()))
                .ForMember(dest => dest.WaitResponseType, opt => opt.MapFrom(src => (int)src.WaitResponseType));

            CreateMap<NetActionPropertys, NetActionPropertysListItemDto>()
                .ForMember(dest => dest.NetActionId, opt => opt.MapFrom(src => src.NetActionId.ToString()))
                .ForMember(dest => dest.WaitResponseType, opt => opt.MapFrom(src => (int)src.WaitResponseType));

            // 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.ShelfCode, opt => opt.MapFrom(src => src.ShelfCode))
                .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.ShelfCode, opt => opt.MapFrom(src => src.ShelfCode))
                .ForMember(dest => dest.Status, opt => opt.MapFrom(src => (int)src.Status))
                .ForMember(dest => dest.StatusName, opt => opt.MapFrom(src => GetTaskStatusName(src.Status)));

            CreateMap<RobotTaskHistory, RobotTaskHistoryListItemDto>()
                .ForMember(dest => dest.TaskId, opt => opt.MapFrom(src => src.TaskId.ToString()))
                .ForMember(dest => dest.ShelfCode, opt => opt.MapFrom(src => src.ShelfCode))
                .ForMember(dest => dest.Status, opt => opt.MapFrom(src => (int)src.Status))
                .ForMember(dest => dest.StatusName, opt => opt.MapFrom(src => GetTaskStatusName(src.Status)));

            // RobotSubTask 闁哄嫮濮撮惃?
            // @author zzy
            CreateMap<RobotSubTask, RobotSubTaskDto>()
                .ForMember(dest => dest.SubTaskId, opt => opt.MapFrom(src => src.SubTaskId.ToString()))
                .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.BeginNodeId, opt => opt.MapFrom(src => src.BeginNodeId.ToString()))
                .ForMember(dest => dest.BeginNodeName, opt => opt.MapFrom(src => src.BeginNode != null ? src.BeginNode.NodeName : null))
                .ForMember(dest => dest.EndNodeId, opt => opt.MapFrom(src => src.EndNodeId.ToString()))
                .ForMember(dest => dest.EndNodeName, opt => opt.MapFrom(src => src.EndNode != null ? src.EndNode.NodeName : null))
                .ForMember(dest => dest.Sequence, opt => opt.MapFrom(src => src.Sequence))
                .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 => "Pending",
                TaskStatus.Assigned => "Assigned",
                TaskStatus.InProgress => "In Progress",
                TaskStatus.WaitingForResource => "Waiting For Resource",
                TaskStatus.Completed => "Completed",
                TaskStatus.Cancelled => "Cancelled",
                TaskStatus.Failed => "Failed",
                TaskStatus.Timeout => "Timeout",
                TaskStatus.Reassigned => "Reassigned",
                _ => "Unknown"
            };
        }
    }

    /// <summary>
    /// LocationCoordinates 闁煎浜滈悾鐐▕婢跺ň鍋撻懝闈舵帡寮搁幇顒佺彜
    /// @author zzy
    /// </summary>
    public class LocationCoordinatesResolver : IValueResolver<MapResourceDto, MapResource, NetTopologySuite.Geometries.Polygon?>
    {
        public NetTopologySuite.Geometries.Polygon? Resolve(MapResourceDto source, MapResource destination, NetTopologySuite.Geometries.Polygon? destMember, ResolutionContext context)
        {
            if (source.LocationCoordinates == null || source.LocationCoordinates.Count < 3)
                return null;
            return PolygonConverter.ToPolygonFromXY(source.LocationCoordinates.Select(p => new double[] { p.X, p.Y }));
        }
    }
}