路径算法调整为动态规划方式,新增预任务申请功能

This commit is contained in:
DEVICE8\12494
2023-06-13 18:11:37 +08:00
parent 759b66d789
commit 5a49b9ba97
14 changed files with 602 additions and 69 deletions

View File

@@ -30,7 +30,6 @@ using Tnb.Common.Utils;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
@@ -224,6 +223,31 @@ namespace Tnb.WarehouseMgr
var row = await _db.Insertable(preTasks).ExecuteCommandAsync();
return row > 0;
}
/// <summary>
/// 生成预任务后续处理
/// </summary>
/// <returns></returns>
[NonAction]
public async Task GenTaskHandleAfter(GenPreTaskUpInput input)
{
try
{
await _db.Ado.BeginTranAsync();
//根据载具移入Id回更单据状态
await _db.Updateable<WmsMoveInstock>().SetColumns(it => new WmsMoveInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == input.PreTaskId).ExecuteCommandAsync();
//根据生成的预任务,插入预任务操作记录
await _db.Insertable(input.PreTaskRecords).ExecuteCommandAsync();
//根据载具ID更新是否锁定和赋值起始库位
await _db.Updateable<WmsCarryH>().SetColumns(it => new WmsCarryH { is_lock = 1, location_id = input.CarryStartLocationId, location_code = input.CarryStartLocationCode }).Where(it => it.id == input.CarryId).ExecuteCommandAsync();
//根据所有库位更新库位的锁定状态为“锁定”
await _db.Updateable<BasLocation>().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => input.LocationIds.Contains(it.id)).ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
catch (Exception)
{
await _db.Ado.RollbackTranAsync();
}
}
/// <summary>
/// 路径算法
@@ -243,34 +267,84 @@ namespace Tnb.WarehouseMgr
private async Task<List<WmsPointH>> LocPathCalcAlgorithms(string pStartId, string pEndId, List<WmsRoad> roads)
{
var points = await _db.Queryable<WmsPointH>().ToListAsync();
var startObj = points.Find(x => x.id == pStartId);
var endObj = points.Find(x => x.id == pEndId);
var sIndex = points.IndexOf(startObj);
var eIndex = points.IndexOf(endObj);
var vexs = points.Select(p => p.id).ToArray();
EData[] edges = new EData[roads.Count];
for (int i = 0; i < edges.Length; i++)
List<WmsPointH> results = new();
List<WmsRoad> subRoads = new();
Dictionary<string, bool> isVisited = roads.Select(x => x.startpoint_id).Distinct().ToDictionary(x => x, x => false);
List<string> pointIds = new();
List<string> codes = new();
Dp dp = new();
dp.DpFunc(roads, subRoads, pointIds, isVisited, pStartId, pEndId);
foreach (var pid in pointIds)
{
var start = roads[i].startpoint_id;
var end = roads[i].endpoint_id;
var weight = roads[i].distance;
edges[i] = new EData(start, end, weight);
var point = points.Find(x => x.id == pid);
results.Add(point);
}
Dijkstra<WmsPointH> pG = new(vexs, edges);
int[] prev = new int[pG.mVexs.Length];
int[] dist = new int[pG.mVexs.Length];
List<WmsPointH> vertexs = new() { startObj };
pG.CalcDijkstra(sIndex, prev, dist);
var pointIds = points.Select(p => p.id).ToList();
List<string> result = new();
GetPoints(pointIds, prev, result, eIndex);
var shortestPathPoints = points.FindAll(x => result.Contains(x.id));
shortestPathPoints.Add(points.Find(x => x.id == pStartId));
List<WmsPointH> results = new() { startObj };
var isVisited = shortestPathPoints.ToDictionary(x => x.id, x => false);
isVisited[pStartId] = true;
MatchPoint(results, roads, shortestPathPoints, isVisited, pStartId, pEndId);
results.Add(endObj);
#region dijkstra
//var points = await _db.Queryable<WmsPointH>().ToListAsync();
//var startObj = points.Find(x => x.id == pStartId);
//var endObj = points.Find(x => x.id == pEndId);
//var sIndex = points.IndexOf(startObj);
//var eIndex = points.IndexOf(endObj);
//if (eIndex < sIndex)
//{
// var tempIndex = sIndex;
// sIndex = eIndex;
// eIndex = tempIndex;
// var temp = points[sIndex];
// points[sIndex] = points[eIndex];
// points[eIndex] = temp;
//}
////MatchPoint(results, roads, shortestPathPoints, isVisited, pStartId, pEndId);
//var vexs = points.Select(p => p.id).ToArray();
//EData[] edges = new EData[roads.Count];
//for (int i = 0; i < edges.Length; i++)
//{
// var start = roads[i].startpoint_id;
// var end = roads[i].endpoint_id;
// var weight = roads[i].distance;
// edges[i] = new EData(start, end, weight);
//}
//Dijkstra pG = new(vexs, edges);
//int[] prev = new int[pG.mVexs.Length];
//int[] dist = new int[pG.mVexs.Length];
//List<WmsPointH> vertexs = new() { startObj };
//pG.CalcDijkstra(sIndex, prev, dist);
//var pointIds = points.Select(p => p.id).ToList();
//List<string> result = new();
//GetPoints(pointIds, prev, result, eIndex);
//var items =new List<string>();
//foreach (var item in prev.Where(x=>x!=0))
//{
// if (points[item] != null)
// {
// items.Add(points[item].point_code);
// }
//}
//var @strings = string.Join(",", items.OrderBy(o=>o));
//var shortestPathPoints = points.FindAll(x => result.Contains(x.id));
//if (shortestPathPoints.IndexOf(startObj) < 0)
//{
// shortestPathPoints.Add(startObj);
//}
//List<WmsPointH> results = new() { startObj };
//var isVisited = shortestPathPoints.ToDictionary(x => x.id, x => false);
//var isVisited2 = shortestPathPoints.ToDictionary(x => x.id, x => false);
//isVisited[pStartId] = true;
//MatchPoint(results, roads, shortestPathPoints, isVisited, pStartId, pEndId);
//results.Add(endObj);
#endregion
return results;
}
/// <summary>
@@ -319,18 +393,18 @@ namespace Tnb.WarehouseMgr
var isOk = false;
try
{
//await _db.Ado.BeginTranAsync();
await _db.Ado.BeginTranAsync();
isOk = await _db.Updateable(entity).ExecuteCommandHasChangeAsync();
if (entities?.Count > 0)
{
var row = await _db.Storageable(entities).ExecuteCommandAsync();
isOk = row > 0;
}
//await _db.Ado.CommitTranAsync();
await _db.Ado.CommitTranAsync();
}
catch (Exception)
{
//await _db.Ado.RollbackTranAsync();
await _db.Ado.RollbackTranAsync();
}
return isOk;
}