1
z8018
2025-06-10 e46aa927d231af83724683c7286d9db503e24cf7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.PlacedBlockDTO;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_IBasicInfoService;
 
namespace WIDESEAWCS_BasicInfoService
{
    /// <summary>
    /// 异常放置区块服务,用于计算和处理异常情况下的货物放置位置
    /// </summary>
    /// <remarks>
    /// 该类根据容器尺寸和货物尺寸计算取放位置坐标,
    /// 包含横向Y坐标的最小/最大限制处理逻辑,
    /// 并返回包含完整位置信息的TaskPosition对象
    /// </remarks>
    public class ExceptionPlaceBlockService
    {
        public ContainerSize ContainerSize { get; private set; }
 
        /// <summary>
        /// 最小横向Y坐标限制(毫米)
        /// </summary>
        public static int MinY = AppSettings.GetValue("MinY").ObjToInt();
 
        /// <summary>
        /// 最大Y坐标限制(毫米)
        /// </summary>
        public const int MaxY = 600;
 
        /// <summary>
        /// 构造函数,初始化异常位置区块服务
        /// </summary>
        /// <param name="containerSize">容器尺寸参数</param>
        public ExceptionPlaceBlockService(ContainerSize containerSize)
        {
            ContainerSize = containerSize;
        }
 
        /// <summary>
        /// 计算异常放置块的任务位置
        /// </summary>
        /// <param name="length">物品长度</param>
        /// <param name="width">物品宽度</param>
        /// <param name="height">物品高度</param>
        /// <param name="count">物品数量</param>
        /// <returns>包含取放位置信息的TaskPosition对象</returns>
        /// <remarks>
        /// 该方法会根据物品尺寸自动调整取放位置:
        /// 1. 当长度小于宽度时会交换两者
        /// 2. 根据物品尺寸选择不同的设备中心点
        /// 3. 确保Y轴位置在MinY和MaxY之间
        /// </remarks>
        public TaskPosition ExceptionPlaceBlock(int length, int width, int height, int count)
        {
            int tempLength = length;
            int tempWidth = width;
            if (length < width)
            {
                length = tempWidth;
                width = tempLength;
            }
 
            int takePositionX = 0;
            int takePositionY = 0;
            int takePositionZ = 0;
            int putPositionX = 0;
            int putPositionY = 0;
            int putPositionZ = 0;
 
            Point3D deviceCenter = new Point3D(530 / 2, 920 / 2, 0);
            if (length <= 920) //横向双吸
            {
                deviceCenter = new Point3D(530 / 2, 130 / 2, 0);
            }
 
            takePositionX = width / 2 - deviceCenter.X;
            takePositionY = length / 2 - deviceCenter.Y;
            takePositionZ = 10;
 
            putPositionX = ContainerSize.Width / 2 - deviceCenter.X;
            putPositionY = takePositionY;
            putPositionZ = count * height;
 
            if (takePositionY < MinY)
            {
                takePositionY = 0;
                putPositionY = MinY;
            }
            else
            {
                takePositionY -= MinY;
            }
 
            if (putPositionY > MaxY)
            {
                int moreY = putPositionY - MaxY;
                if (takePositionY - moreY > 0)
                {
                    takePositionY -= moreY;
                    putPositionY = MaxY;
                }
            }
 
            TaskPosition taskPosition = new TaskPosition()
            {
                PositionR = 1,
                TakePositionX = takePositionX,
                TakePositionY = takePositionY,
                TakePositionZ = takePositionZ,
                PutPositionX = putPositionX,
                PutPositionY = putPositionY,
                PutPositionZ = putPositionZ,
                TakeCenterPositionX = takePositionX,
                TakeCenterPositionY = takePositionY,
                TakeCenterPositionZ = takePositionZ,
                PutCenterPositionX = putPositionX,
                PutCenterPositionY = putPositionY,
                PutCenterPositionZ = putPositionZ,
                PositionX = putPositionX,
                PositionY = putPositionY,
                PositionZ = putPositionZ
            };
 
            return taskPosition;
        }
    }
}