StorageLocationRepository.cs
5.7 KB
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
133
134
135
136
137
138
139
140
141
using Microsoft.EntityFrameworkCore;
using Rcs.Domain.Entities;
using Rcs.Domain.Repositories;
using Rcs.Infrastructure.DB.MsSql;
namespace Rcs.Infrastructure.DB.Repositories
{
/// <summary>
/// 库位仓储实现
/// @author zzy
/// </summary>
public class StorageLocationRepository : Repository<StorageLocation>, IStorageLocationRepository
{
public StorageLocationRepository(AppDbContext context) : base(context)
{
}
/// <summary>
/// 根据区域ID获取库位列表
/// </summary>
/// <param name="areaId">区域ID</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>库位列表</returns>
/// <author>zzy</author>
public async Task<IEnumerable<StorageLocation>> GetByAreaIdAsync(Guid areaId, CancellationToken cancellationToken = default)
{
return await _dbSet
.Where(l => l.AreaId == areaId && l.IsActive)
.OrderBy(l => l.LocationCode)
.ToListAsync(cancellationToken);
}
/// <summary>
/// 根据库位编码获取库位
/// </summary>
/// <param name="locationCode">库位编码</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>库位实体</returns>
/// <author>zzy</author>
public async Task<StorageLocation?> GetByLocationCodeAsync(string locationCode, CancellationToken cancellationToken = default)
{
return await _dbSet
.FirstOrDefaultAsync(l => l.LocationCode == locationCode, cancellationToken);
}
/// <summary>
/// 根据地图节点ID获取库位(直接关联)
/// </summary>
/// <param name="mapNodeId">地图节点ID</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>库位列表</returns>
/// <author>zzy</author>
public async Task<IEnumerable<StorageLocation>?> GetByMapNodeIdAsync(Guid mapNodeId, CancellationToken cancellationToken = default)
{
return await _dbSet
.Where(l => l.MapNodeId == mapNodeId)
.Include(l => l.MapNode)
.ToListAsync(cancellationToken);
}
/// <summary>
/// 根据状态获取库位列表
/// </summary>
/// <param name="status">库位状态</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>库位列表</returns>
/// <author>zzy</author>
public async Task<IEnumerable<StorageLocation>> GetByStatusAsync(StorageLocationStatus status, CancellationToken cancellationToken = default)
{
return await _dbSet
.Where(l => l.Status == status && l.IsActive)
.ToListAsync(cancellationToken);
}
/// <summary>
/// 根据地图ID获取库位列表(通过MapNode直接关联)
/// </summary>
/// <param name="mapId">地图ID</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>库位列表</returns>
/// <author>zzy</author>
public async Task<IEnumerable<StorageLocation>> GetByMapIdAsync(Guid mapId, CancellationToken cancellationToken = default)
{
return await _dbSet
.Include(l => l.MapNode)
.Where(l => l.MapNode != null && l.MapNode.MapId == mapId && l.IsActive)
.ToListAsync(cancellationToken);
}
/// <summary>
/// 根据区域ID获取第一个空闲库位(按编码排序)
/// </summary>
/// <param name="areaId">区域ID</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>空闲库位</returns>
/// <author>zzy</author>
public async Task<StorageLocation?> GetFirstEmptyByAreaIdAsync(Guid areaId, CancellationToken cancellationToken = default)
{
return await _dbSet
.Where(l => l.AreaId == areaId && l.Status == StorageLocationStatus.Empty && l.IsActive)
.OrderBy(l => l.LocationCode)
.FirstOrDefaultAsync(cancellationToken);
}
/// <summary>
/// 根据多边形区域查找区域内的空货位
/// 使用 NetTopologySuite 空间查询判断节点坐标是否在多边形内
/// </summary>
/// <param name="mapId">地图ID</param>
/// <param name="polygon">多边形区域</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>库位列表</returns>
/// <author>zzy</author>
public async Task<IEnumerable<StorageLocation>> GetEmptyLocationsInPolygonAsync(
Guid mapId,
NetTopologySuite.Geometries.Polygon polygon,
CancellationToken cancellationToken = default)
{
if (polygon == null)
return Enumerable.Empty<StorageLocation>();
// 先从数据库查询指定地图内空闲且启用的库位(直接通过MapNode关联)
var locations = await _dbSet
.Include(l => l.MapNode)
.Where(l => l.MapNode != null
&& l.MapNode.MapId == mapId
&& l.Status == StorageLocationStatus.Empty
&& l.IsActive)
.ToListAsync(cancellationToken);
// 在内存中进行空间判断,筛选多边形区域内的库位
return locations
.Where(l => polygon.Contains(
new NetTopologySuite.Geometries.Point(l.MapNode!.X, l.MapNode.Y)))
.OrderBy(l => l.LocationCode)
.ToList();
}
}
}