Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
@@ -2084,10 +2084,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
{
|
{
|
||||||
if (s_agvElevatortaskDic.CurrentCount == 0)
|
if (s_agvElevatortaskDic.CurrentCount == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3outstock").FirstAsync();
|
||||||
|
if (floor3outstock != null && floor3outstock.value == "0")
|
||||||
|
return;
|
||||||
await s_agvElevatortaskDic.WaitAsync();
|
await s_agvElevatortaskDic.WaitAsync();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync();
|
||||||
// 获取暂存区需要生成任务的库位
|
// 获取暂存区需要生成任务的库位
|
||||||
List<BasLocation> agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
List<BasLocation> agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||||
.Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_use == "1" && r.is_lock == 0).ToListAsync();
|
.Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_use == "1" && r.is_lock == 0).ToListAsync();
|
||||||
@@ -2099,38 +2104,86 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
List<IGrouping<string, BasLocation>> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList();
|
List<IGrouping<string, BasLocation>> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList();
|
||||||
foreach (IGrouping<string, BasLocation> group in elevatorTaskGroup)
|
foreach (IGrouping<string, BasLocation> group in elevatorTaskGroup)
|
||||||
{
|
{
|
||||||
// 选一楼出货库位
|
|
||||||
List<BasLocation> outLocations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
|
||||||
.Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0")
|
|
||||||
.OrderBy("task_nums, location_code").ToListAsync();
|
|
||||||
|
|
||||||
if (outLocations.Count == 0)
|
|
||||||
{
|
|
||||||
LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
BasLocation outLocation = outLocations.FirstOrDefault();
|
|
||||||
WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().FirstAsync(it => it.location_id == outLocation.id);
|
|
||||||
|
|
||||||
List<BasLocation> locs = group.ToList();
|
List<BasLocation> locs = group.ToList();
|
||||||
LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务");
|
LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务");
|
||||||
for (int i = 0; i < locs.Count; i++)
|
for (int i = 0; i < locs.Count; i++)
|
||||||
{
|
{
|
||||||
|
// 选一楼出货库位
|
||||||
|
List<BasLocation> outLocations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||||
|
.Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0")
|
||||||
|
.OrderBy("location_code").ToListAsync();
|
||||||
|
|
||||||
|
if (outLocations.Count == 0)
|
||||||
|
{
|
||||||
|
LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
BasLocation outLocation = outLocations.FirstOrDefault();
|
||||||
|
WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().FirstAsync(it => it.location_id == outLocation.id);
|
||||||
|
|
||||||
// 交替选择缓存区库位
|
// 交替选择缓存区库位
|
||||||
var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3CurOutCacheLocation").FirstAsync();
|
var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3CurOutCacheLocation").FirstAsync();
|
||||||
|
|
||||||
if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右"))
|
if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右"))
|
||||||
{
|
|
||||||
throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前出库分区 项配置错误!需要配置值为【3楼发货左】或【3楼发货右】", 500);
|
throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前出库分区 项配置错误!需要配置值为【3楼发货左】或【3楼发货右】", 500);
|
||||||
}
|
|
||||||
|
|
||||||
BasLocation startloc = null;
|
BasLocation startloc = null;
|
||||||
|
// 如果没切换就是当前发货区
|
||||||
|
string 切换发货区 = YCLInnerTransfer.value;
|
||||||
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
||||||
{
|
{
|
||||||
List<BasLocation> locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
List<BasLocation> locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||||
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
||||||
.Where((a, b) => b.name == YCLInnerTransfer.value).OrderBy("a.location_code,a.is_lock,a.is_use,task_nums").ToListAsync();
|
.Where((a, b) => b.name == YCLInnerTransfer.value && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync();
|
||||||
|
|
||||||
startloc = locations.FirstOrDefault();
|
startloc = locations.FirstOrDefault();
|
||||||
|
#region 如果当前侧没有可用库位 切换另一侧继续发货,但是因为不能同时发两托同侧的货到同个电梯,所以必须保证当前优先级电梯是接第一托货
|
||||||
|
// 交替出的时候可能会选不到库位,做特殊处理
|
||||||
|
if (startloc == null)
|
||||||
|
{
|
||||||
|
LoggerAgvElevatorTask.LogInformation($"交替到{YCLInnerTransfer.value} 进行发货的时候,没有货物可以发");
|
||||||
|
var _floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
|
||||||
|
|
||||||
|
切换发货区 = YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左";
|
||||||
|
LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货");
|
||||||
|
|
||||||
|
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == 切换发货区)
|
||||||
|
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
|
||||||
|
locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||||
|
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
||||||
|
.Where((a, b) => b.name == 切换发货区 && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync();
|
||||||
|
|
||||||
|
startloc = locations.FirstOrDefault();
|
||||||
|
// 如果还是选不到
|
||||||
|
if (startloc == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"再次交替到{切换发货区} 进行发货,仍然没有货可发,属于暂存区数据异常");
|
||||||
|
}
|
||||||
|
|
||||||
|
var _floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
|
||||||
|
// 如果当前优先级电梯是空托盘 切换发货区之后不需要切换电梯
|
||||||
|
if (_floor3FirstSelectElevatorTasknums.value == "2")
|
||||||
|
{
|
||||||
|
LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}是空托盘 切换发货区之后不需要切换电梯");
|
||||||
|
}
|
||||||
|
// 如果当前优先级电梯不是空托盘 切换发货区之后还需要切换电梯
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}不是空托盘 切换发货区之后还需要切换电梯");
|
||||||
|
|
||||||
|
string 切换电梯 = _floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3";
|
||||||
|
LoggerAgvElevatorTask.LogInformation($"交替到{切换电梯} 进行发货");
|
||||||
|
// 选择另一个电梯座位首选电梯
|
||||||
|
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == 切换电梯)
|
||||||
|
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
||||||
|
// 剩余可放托数
|
||||||
|
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == "2")
|
||||||
|
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
List<WmsCarryH> wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsCarryH>().Where(r => r.location_id == startloc.id).ToListAsync();
|
List<WmsCarryH> wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsCarryH>().Where(r => r.location_id == startloc.id).ToListAsync();
|
||||||
if (wmsCarryHs.Count > 1)
|
if (wmsCarryHs.Count > 1)
|
||||||
@@ -2138,7 +2191,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}");
|
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (wmsCarryHs.Count == 1)
|
if (wmsCarryHs.Count == 0)
|
||||||
{
|
{
|
||||||
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘");
|
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘");
|
||||||
continue;
|
continue;
|
||||||
@@ -2149,18 +2202,23 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
// 选电梯
|
// 选电梯
|
||||||
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
||||||
{
|
{
|
||||||
List<WmsElevatorH> wmsElevatorHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_group == "2" && r.enabled == 1).ToListAsync();
|
var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
|
||||||
|
var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
|
||||||
|
|
||||||
foreach (WmsElevatorH _wmsElevatorH in wmsElevatorHs)
|
wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync();
|
||||||
|
|
||||||
|
floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString();
|
||||||
|
if (floor3FirstSelectElevatorTasknums.value == "0")
|
||||||
{
|
{
|
||||||
// 加上暂存区到电梯的任务数
|
// 选择另一个电梯座位首选电梯
|
||||||
List<WmsPretaskH> wmsPretaskHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPretaskH>()
|
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3"))
|
||||||
.Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID || r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.startlocation_id == startloc.id).ToListAsync();
|
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
||||||
|
// 重置为可放两托
|
||||||
_wmsElevatorH.carry_count += wmsPretaskHs.Count;
|
floor3FirstSelectElevatorTasknums.value = "2";
|
||||||
}
|
}
|
||||||
|
// 剩余可放托数
|
||||||
wmsElevatorH = wmsElevatorHs.OrderBy(r => r.carry_count).FirstOrDefault();
|
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value)
|
||||||
|
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
string elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", "");
|
string elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", "");
|
||||||
@@ -2192,7 +2250,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
|
|
||||||
WmsPretaskH preTask = new()
|
WmsPretaskH preTask = new()
|
||||||
{
|
{
|
||||||
org_id = _userManager!.User.OrganizeId,
|
org_id = WmsWareHouseConst.AdministratorOrgId,
|
||||||
startlocation_id = sPoint?.location_id!,
|
startlocation_id = sPoint?.location_id!,
|
||||||
startlocation_code = sPoint?.location_code!,
|
startlocation_code = sPoint?.location_code!,
|
||||||
endlocation_id = ePoint?.location_id!,
|
endlocation_id = ePoint?.location_id!,
|
||||||
@@ -2235,7 +2293,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
}).Where(it => it.id == wmsCarryH.id).ExecuteCommandAsync();
|
}).Where(it => it.id == wmsCarryH.id).ExecuteCommandAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左"))
|
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (切换发货区 == "3楼发货左" ? "3楼发货右" : "3楼发货左"))
|
||||||
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
|
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
|
||||||
|
|
||||||
//所有库位加锁
|
//所有库位加锁
|
||||||
@@ -2249,6 +2307,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await db_agvElevatorTaskExceptionHandles.Ado.CommitTranAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (ObjectDisposedException ex)
|
catch (ObjectDisposedException ex)
|
||||||
@@ -2587,6 +2647,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
|
|
||||||
DateTime dateTime = DateTime.Now;
|
DateTime dateTime = DateTime.Now;
|
||||||
WmsSterilizationInstockH wmsSterilizationInstockH = new WmsSterilizationInstockH();
|
WmsSterilizationInstockH wmsSterilizationInstockH = new WmsSterilizationInstockH();
|
||||||
|
string code = await _billRullService.GetBillNumber("WmsSterilizationInstockH");
|
||||||
|
wmsSterilizationInstockH.bill_code = code;
|
||||||
wmsSterilizationInstockH.carry_id = wmsCarryH.id;
|
wmsSterilizationInstockH.carry_id = wmsCarryH.id;
|
||||||
wmsSterilizationInstockH.carry_code = wmsCarryH.carry_code;
|
wmsSterilizationInstockH.carry_code = wmsCarryH.carry_code;
|
||||||
wmsSterilizationInstockH.location_id = endlocation.id;
|
wmsSterilizationInstockH.location_id = endlocation.id;
|
||||||
@@ -2868,7 +2930,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
public Task StartAsync(CancellationToken cancellationToken)
|
public Task StartAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
CheckGettimer = new Timer(CheckGet, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
CheckGettimer = new Timer(CheckGet, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||||
Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
|
Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
|
||||||
SSXcodetimer = new Timer(SSXcode, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
|
SSXcodetimer = new Timer(SSXcode, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
|
||||||
// 八工位缓存区补充空托盘
|
// 八工位缓存区补充空托盘
|
||||||
BGWCarrySupplementtimer = new Timer(BGWCarrySupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
|
BGWCarrySupplementtimer = new Timer(BGWCarrySupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
|
||||||
@@ -2893,15 +2955,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
// 停用
|
// 停用
|
||||||
//PackOutstockServicetimer = new Timer(PackOutstockService, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
|
//PackOutstockServicetimer = new Timer(PackOutstockService, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
|
||||||
|
|
||||||
Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
|
Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||||
Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
|
Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||||
Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
|
Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||||
|
|
||||||
F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
|
F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
|
||||||
YCLInternalTransfertimer = new Timer(YCLInternalTransfer, null, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(185));
|
YCLInternalTransfertimer = new Timer(YCLInternalTransfer, null, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(185));
|
||||||
|
|
||||||
elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20));
|
elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20));
|
||||||
//agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20));
|
agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20));
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
using JNPF.Common.Contracts;
|
||||||
|
using JNPF.Common.Security;
|
||||||
|
using SqlSugar;
|
||||||
|
|
||||||
|
namespace Tnb.WarehouseMgr.Entities.Entity;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 收货质检记录
|
||||||
|
/// </summary>
|
||||||
|
[SugarTable("wms_purchase_qcrecord")]
|
||||||
|
public partial class WmsPurchaseQcrecord : BaseEntity<string>
|
||||||
|
{
|
||||||
|
public WmsPurchaseQcrecord()
|
||||||
|
{
|
||||||
|
id = SnowflakeIdHelper.NextId();
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 创建用户
|
||||||
|
/// </summary>
|
||||||
|
public string? create_id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? create_time { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改用户
|
||||||
|
/// </summary>
|
||||||
|
public string? modify_id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? modify_time { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 来源单据
|
||||||
|
/// </summary>
|
||||||
|
public string? type { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 来源单号
|
||||||
|
/// </summary>
|
||||||
|
public string? ori_bill_code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 来源明细id
|
||||||
|
/// </summary>
|
||||||
|
public string? ori_detail_id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 仓库
|
||||||
|
/// </summary>
|
||||||
|
public string? warehouse_id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 物料id
|
||||||
|
/// </summary>
|
||||||
|
public string? material_id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 物料编码
|
||||||
|
/// </summary>
|
||||||
|
public string? material_code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 物料名称
|
||||||
|
/// </summary>
|
||||||
|
public string? material_name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 物料型号
|
||||||
|
/// </summary>
|
||||||
|
public string? material_spec { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 采购数量
|
||||||
|
/// </summary>
|
||||||
|
public decimal? purchase_qty { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已到货数量
|
||||||
|
/// </summary>
|
||||||
|
public decimal? purchase_prqty { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 本次到货数量
|
||||||
|
/// </summary>
|
||||||
|
public decimal? purchase_arriveqty { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 质检结论
|
||||||
|
/// </summary>
|
||||||
|
public string? result { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 单位
|
||||||
|
/// </summary>
|
||||||
|
public string? unit_id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 批次
|
||||||
|
/// </summary>
|
||||||
|
public string? batchno { get; set; }
|
||||||
|
}
|
||||||
@@ -541,7 +541,11 @@ namespace Tnb.WarehouseMgr
|
|||||||
Logger.Information($"未成功解锁起点库位{wmsDistaskH.startlocation_code}");
|
Logger.Information($"未成功解锁起点库位{wmsDistaskH.startlocation_code}");
|
||||||
}
|
}
|
||||||
|
|
||||||
int unlockEndRow = await _db.Updateable<BasLocation>().SetColumns(r => r.is_lock == 0).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync();
|
int unlockEndRow = await _db.Updateable<BasLocation>().SetColumns(r => new BasLocation
|
||||||
|
{
|
||||||
|
is_lock = 0,
|
||||||
|
task_nums = r.task_nums - 1,
|
||||||
|
}).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync();
|
||||||
if (unlockEndRow > 0)
|
if (unlockEndRow > 0)
|
||||||
Logger.Information($"成功解锁终点库位{wmsDistaskH.endlocation_code}");
|
Logger.Information($"成功解锁终点库位{wmsDistaskH.endlocation_code}");
|
||||||
else
|
else
|
||||||
@@ -668,7 +672,11 @@ namespace Tnb.WarehouseMgr
|
|||||||
Logger.Information($"未成功解锁起点库位{wmsDistaskH.startlocation_code}");
|
Logger.Information($"未成功解锁起点库位{wmsDistaskH.startlocation_code}");
|
||||||
}
|
}
|
||||||
|
|
||||||
int unlockEndRow = await _db.Updateable<BasLocation>().SetColumns(r => r.is_lock == 0).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync();
|
int unlockEndRow = await _db.Updateable<BasLocation>().SetColumns(r => new BasLocation
|
||||||
|
{
|
||||||
|
is_lock = 0,
|
||||||
|
task_nums = r.task_nums - 1,
|
||||||
|
}).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync();
|
||||||
if (unlockEndRow > 0)
|
if (unlockEndRow > 0)
|
||||||
Logger.Information($"成功解锁终点库位{wmsDistaskH.endlocation_code}");
|
Logger.Information($"成功解锁终点库位{wmsDistaskH.endlocation_code}");
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1460,21 +1460,57 @@ namespace Tnb.WarehouseMgr
|
|||||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
|
||||||
|
var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
|
var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList();
|
||||||
|
|
||||||
|
//Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks));
|
||||||
|
//Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks));
|
||||||
|
//Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks));
|
||||||
|
|
||||||
|
/* IEnumerable<WmsPretaskH?> firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault());
|
||||||
|
agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty<WmsPretaskH>().ToList()!;
|
||||||
|
*/
|
||||||
|
|
||||||
|
//如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行
|
||||||
|
var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code));
|
||||||
|
if (equalEndLocPreTasks.Any())
|
||||||
|
{
|
||||||
|
Logger.Information("【GenTaskExecute】 执行:如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 ");
|
||||||
|
agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
#region 三楼三四号梯如果与判断一托下有冲突
|
#region 三楼三四号梯如果与判断一托下有冲突
|
||||||
|
|
||||||
#region 电梯第三次改动
|
#region 电梯第三次改动
|
||||||
// 到暂存区的未完成任务
|
// 到暂存区的未完成任务
|
||||||
List<WmsDistaskH> wmsdistasks_agvElevator = await _db.Queryable<WmsDistaskH>()
|
List<WmsDistaskH> wmsdistasks_agvElevator = await db.Queryable<WmsDistaskH>()
|
||||||
.InnerJoin<BasLocation>((a, b) => a.endlocation_id == b.id)
|
.InnerJoin<BasLocation>((a, b) => a.endlocation_id == b.id)
|
||||||
.Where((a, b) => a.status != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID && a.status != WmsWareHouseConst.BILLSTATUS_CANCEL_ID
|
.Where((a, b) => a.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID
|
||||||
&& b.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
&& b.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
// 过滤同目标库位的正在执行的预任务
|
// 到暂存区的未完成预任务
|
||||||
agvElevatorTasks = agvElevatorTasks.Where(r => !wmsdistasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList();
|
List<WmsPretaskH> wmspretasks_agvElevator = await db.Queryable<WmsPretaskH>()
|
||||||
// 过滤重复目标库位的预任务
|
.InnerJoin<BasLocation>((a, b) => a.endlocation_id == b.id)
|
||||||
agvElevatorTasks = agvElevatorTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).ToList();
|
.InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id)
|
||||||
#endregion
|
.Where((a, b) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID
|
||||||
|
&& b.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && b.is_use == "0")
|
||||||
|
.Select((a, b, c) => new WmsPretaskH
|
||||||
|
{
|
||||||
|
move_num = c.move_num,
|
||||||
|
third_eqp_type = c.third_eqp_type,
|
||||||
|
}, true)
|
||||||
|
.ToListAsync();
|
||||||
|
// 过滤normalPreTasks中的到三楼暂存区任务
|
||||||
|
normalPreTasks = normalPreTasks.Where(r => !wmspretasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList();
|
||||||
|
|
||||||
|
// 过滤到三楼暂存区同目标库位的正在执行的任务
|
||||||
|
var cacheLocTasks = wmspretasks_agvElevator.Where(r => !wmsdistasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList();
|
||||||
|
// 过滤重复目标库位的预任务
|
||||||
|
cacheLocTasks = cacheLocTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).ToList();
|
||||||
|
|
||||||
|
normalPreTasks = normalPreTasks.Concat(cacheLocTasks).ToList();
|
||||||
|
#endregion
|
||||||
|
|
||||||
if (s_elevatortaskWCSRequestDic.Count > 0)
|
if (s_elevatortaskWCSRequestDic.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -1512,27 +1548,12 @@ namespace Tnb.WarehouseMgr
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
|
||||||
var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList();
|
|
||||||
|
|
||||||
//Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks));
|
|
||||||
//Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks));
|
|
||||||
//Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks));
|
|
||||||
|
|
||||||
/* IEnumerable<WmsPretaskH?> firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault());
|
|
||||||
agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty<WmsPretaskH>().ToList()!;
|
|
||||||
*/
|
|
||||||
|
|
||||||
//如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行
|
|
||||||
var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code));
|
|
||||||
if (equalEndLocPreTasks.Any())
|
|
||||||
{
|
|
||||||
Logger.Information("【GenTaskExecute】 执行:如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 ");
|
|
||||||
agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList();
|
|
||||||
}
|
|
||||||
preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList();
|
preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList();
|
||||||
|
|
||||||
|
if (preTasks.Count() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
//一楼中储仓CTU
|
//一楼中储仓CTU
|
||||||
|
|
||||||
List<string> ids = preTasks.Select(x => x.id).Distinct().ToList();
|
List<string> ids = preTasks.Select(x => x.id).Distinct().ToList();
|
||||||
@@ -2354,8 +2375,29 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
Logger.Information($"通知WCS电梯{devName}下行接口调用成功");
|
Logger.Information($"通知WCS电梯{devName}下行接口调用成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<WmsCarryH> carryHs = await db.Queryable<WmsCarryH>().Where(r => disTasks.Select(r => r.carry_id).Contains(r.id)).ToListAsync();
|
||||||
|
carryHs.ForEach(r => {
|
||||||
|
r.location_id = disTask.endlocation_id;
|
||||||
|
r.location_code = disTask.endlocation_code;
|
||||||
|
});
|
||||||
|
await db.Updateable(carryHs).ExecuteCommandAsync();
|
||||||
|
#region 电梯第三次改动
|
||||||
|
|
||||||
|
// 一托下的时候切换首选电梯
|
||||||
|
if (disTaskIds.Count == 1)
|
||||||
|
{
|
||||||
|
// 选择另一个电梯座位首选电梯
|
||||||
|
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3"))
|
||||||
|
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
||||||
|
// 剩余可放托数
|
||||||
|
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == "2")
|
||||||
|
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch { throw; }
|
catch { throw; }
|
||||||
@@ -2802,7 +2844,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
id = multiList[i].endlocation_id,
|
id = multiList[i].endlocation_id,
|
||||||
is_lock = 0,
|
is_lock = 0,
|
||||||
carry_count = locCarrycountMap[endLocId] == null ? 1: int.Parse(locCarrycountMap[endLocId].ToString()) + 1,
|
carry_count = locCarrycountMap[endLocId] == null || string.IsNullOrEmpty(locCarrycountMap[endLocId].ToString()) ? 1: int.Parse(locCarrycountMap[endLocId].ToString()) + 1,
|
||||||
is_use = string.IsNullOrEmpty(multiList[i].carry_status) ? ((int)EnumCarryStatus.占用).ToString() : multiList[i].carry_status
|
is_use = string.IsNullOrEmpty(multiList[i].carry_status) ? ((int)EnumCarryStatus.占用).ToString() : multiList[i].carry_status
|
||||||
};
|
};
|
||||||
if (!string.IsNullOrEmpty(multiList[i].carry_status))
|
if (!string.IsNullOrEmpty(multiList[i].carry_status))
|
||||||
@@ -2810,8 +2852,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
loc.is_use = ((int)EnumCarryStatus.占用).ToString();
|
loc.is_use = ((int)EnumCarryStatus.占用).ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 如果是出入库位 完成后解除占用
|
// 如果是出入库位 完成后解除占用
|
||||||
string? is_type = locTypeMap.ContainsKey(endLocId) ? locTypeMap[endLocId].ToString() : "";
|
string? is_type = locTypeMap.ContainsKey(endLocId) ? locTypeMap[endLocId].ToString() : "";
|
||||||
if (is_type == ((int)EnumLocationType.出入库位).ToString())
|
if (is_type == ((int)EnumLocationType.出入库位).ToString())
|
||||||
@@ -3197,7 +3237,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
BasLocation endlocation = await _db.Queryable<BasLocation>().InnerJoin<WmsPointH>((a, b) => a.id == b.location_id).Where((a, b) => b.id == pEndId).FirstAsync();
|
BasLocation endlocation = await _db.Queryable<BasLocation>().InnerJoin<WmsPointH>((a, b) => a.id == b.location_id).Where((a, b) => b.id == pEndId).FirstAsync();
|
||||||
|
|
||||||
// 后续可整理成配置表
|
// 后续可整理成配置表
|
||||||
#region 第二次改动弃用
|
#region 电梯第三次次改动弃用
|
||||||
//if (startlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CP_ID && endlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID)
|
//if (startlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CP_ID && endlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID)
|
||||||
//{
|
//{
|
||||||
// WmsElevatorH wmsElevatorH = await _db.Queryable<WmsElevatorH>().Where(it => it.elevator_group == "2" && it.enabled == 1).OrderBy(r => r.task_nums).FirstAsync();
|
// WmsElevatorH wmsElevatorH = await _db.Queryable<WmsElevatorH>().Where(it => it.elevator_group == "2" && it.enabled == 1).OrderBy(r => r.task_nums).FirstAsync();
|
||||||
|
|||||||
@@ -169,18 +169,21 @@ namespace Tnb.WarehouseMgr
|
|||||||
CarryCodeUnbindCodeInput carryCodeUnbindCodeInput = new CarryCodeUnbindCodeInput();
|
CarryCodeUnbindCodeInput carryCodeUnbindCodeInput = new CarryCodeUnbindCodeInput();
|
||||||
carryCodeUnbindCodeInput.carry_code_id = wmsCarryCode.id;
|
carryCodeUnbindCodeInput.carry_code_id = wmsCarryCode.id;
|
||||||
await _wmsCarryUnbindService.CarryCodeUnbindCode(carryCodeUnbindCodeInput, _db);
|
await _wmsCarryUnbindService.CarryCodeUnbindCode(carryCodeUnbindCodeInput, _db);
|
||||||
await _db.Updateable<WmsCarryH>().SetColumns(r => r.carry_status == "0").Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync();
|
|
||||||
}
|
}
|
||||||
await _db.Updateable<WmsTempCode>().SetColumns(r => r.codeqty == wmsCarryCode.codeqty)
|
await _db.Updateable<WmsTempCode>().SetColumns(r => r.codeqty == wmsCarryCode.codeqty)
|
||||||
.Where(r => r.barcode == wmsCarryCode.barcode).ExecuteCommandAsync();
|
.Where(r => r.barcode == wmsCarryCode.barcode).ExecuteCommandAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果没有条码 设置载具状态为空闲
|
||||||
|
List<WmsCarryCode> _wmsCarryCodes = _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).ToList();
|
||||||
|
await _db.Updateable<WmsCarryH>().SetColumns(r => r.carry_status == (_wmsCarryCodes.Count == 0 ? "0" : r.carry_status)).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync();
|
||||||
|
|
||||||
switch (carryLoc.wh_id)
|
switch (carryLoc.wh_id)
|
||||||
{
|
{
|
||||||
case WmsWareHouseConst.WAREHOUSE_YCL_ID:
|
case WmsWareHouseConst.WAREHOUSE_YCL_ID:
|
||||||
{
|
{
|
||||||
|
|
||||||
await _db.Updateable(wmsCarryCodes).ExecuteCommandAsync();
|
await _db.Updateable(wmsCarryCodes).ExecuteCommandAsync();
|
||||||
|
|
||||||
await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync();
|
await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync();
|
||||||
|
|||||||
@@ -81,10 +81,10 @@ namespace Tnb.WarehouseMgr
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _db.Ado.BeginTranAsync();
|
await _db.Ado.BeginTranAsync();
|
||||||
if (_db.Queryable<WmsTempCode>().Where(it => input.BillId == it.require_id).Any())
|
//if (_db.Queryable<WmsTempCode>().Where(it => input.BillId == it.require_id).Any())
|
||||||
{
|
//{
|
||||||
throw new AppFriendlyException("条码已生成", 500);
|
// throw new AppFriendlyException("条码已生成", 500);
|
||||||
};
|
//};
|
||||||
WmsOutsourceD WmsOutsourceD = await _db.Queryable<WmsOutsourceD>().Where(it => input.BillId == it.id).FirstAsync();
|
WmsOutsourceD WmsOutsourceD = await _db.Queryable<WmsOutsourceD>().Where(it => input.BillId == it.id).FirstAsync();
|
||||||
WmsOutsourceH WmsOutsourceH = await _db.Queryable<WmsOutsourceH>().Where(it => WmsOutsourceD.fk_wms_outsource_order_id == it.id).FirstAsync();
|
WmsOutsourceH WmsOutsourceH = await _db.Queryable<WmsOutsourceH>().Where(it => WmsOutsourceD.fk_wms_outsource_order_id == it.id).FirstAsync();
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ using Tnb.BasicData.Entities;
|
|||||||
using Tnb.BasicData;
|
using Tnb.BasicData;
|
||||||
using Tnb.ProductionMgr.Entities.Entity;
|
using Tnb.ProductionMgr.Entities.Entity;
|
||||||
using ModuleConst = Tnb.ProductionMgr.ModuleConst;
|
using ModuleConst = Tnb.ProductionMgr.ModuleConst;
|
||||||
|
using JNPF.Common.Dtos.VisualDev;
|
||||||
|
using JNPF.VisualDev.Entitys;
|
||||||
|
|
||||||
namespace Tnb.WarehouseMgr
|
namespace Tnb.WarehouseMgr
|
||||||
{
|
{
|
||||||
@@ -60,12 +62,40 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
string id = dic["id"];
|
string id = dic["id"];
|
||||||
string qcRes = dic["qc_res"];
|
string qcRes = dic["qc_res"];
|
||||||
|
|
||||||
WmsPurchaseD wmsPurchaseD = await _db.Queryable<WmsPurchaseD>().SingleAsync(x => x.id == id);
|
WmsPurchaseD wmsPurchaseD = await _db.Queryable<WmsPurchaseD>().SingleAsync(x => x.id == id);
|
||||||
|
|
||||||
string purchaseHId = wmsPurchaseD?.bill_id ?? "";
|
string purchaseHId = wmsPurchaseD?.bill_id ?? "";
|
||||||
WmsPurchaseH wmsPurchaseH = await _db.Queryable<WmsPurchaseH>().SingleAsync(x => x.id == purchaseHId);
|
WmsPurchaseH wmsPurchaseH = await _db.Queryable<WmsPurchaseH>().SingleAsync(x => x.id == purchaseHId);
|
||||||
|
|
||||||
|
#region 插入质检记录
|
||||||
|
|
||||||
|
string? create_id = _userManager.User.Id;
|
||||||
|
|
||||||
|
if (qcRes != (wmsPurchaseD.qc_res ?? ""))
|
||||||
|
{
|
||||||
|
BasMaterial basMaterial = await _db.Queryable<BasMaterial>().Where(r => r.id == wmsPurchaseD.material_id).FirstAsync();
|
||||||
|
WmsPurchaseQcrecord wmsPurchaseQcrecord = new WmsPurchaseQcrecord();
|
||||||
|
wmsPurchaseQcrecord.create_id = create_id;
|
||||||
|
wmsPurchaseQcrecord.create_time = DateTime.Now;
|
||||||
|
wmsPurchaseQcrecord.type = "采购收货";
|
||||||
|
wmsPurchaseQcrecord.ori_bill_code = wmsPurchaseH.bill_code;
|
||||||
|
wmsPurchaseQcrecord.ori_detail_id = wmsPurchaseD.id;
|
||||||
|
wmsPurchaseQcrecord.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
|
||||||
|
wmsPurchaseQcrecord.material_id = basMaterial.id;
|
||||||
|
wmsPurchaseQcrecord.material_code = basMaterial.code;
|
||||||
|
wmsPurchaseQcrecord.material_name = basMaterial.name;
|
||||||
|
wmsPurchaseQcrecord.material_spec = basMaterial.material_specification;
|
||||||
|
wmsPurchaseQcrecord.unit_id = wmsPurchaseD.unit_id;
|
||||||
|
wmsPurchaseQcrecord.batchno = wmsPurchaseD.code_batch;
|
||||||
|
wmsPurchaseQcrecord.purchase_qty = wmsPurchaseD.purchase_qty;
|
||||||
|
wmsPurchaseQcrecord.purchase_prqty = wmsPurchaseD.purchase_prqty;
|
||||||
|
wmsPurchaseQcrecord.purchase_arriveqty = wmsPurchaseD.purchase_arriveqty;
|
||||||
|
wmsPurchaseQcrecord.result = qcRes;
|
||||||
|
|
||||||
|
await _db.Insertable(wmsPurchaseQcrecord).ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
List<WmsOutinStockDetail> wmsOutinStockDetails = await _db.Queryable<WmsOutinStockDetail>()
|
List<WmsOutinStockDetail> wmsOutinStockDetails = await _db.Queryable<WmsOutinStockDetail>()
|
||||||
.Where(x => x.source_detail_id == wmsPurchaseD.id && x.source_type == WmsWareHouseConst.BIZTYPE_WMSINSTOCK_ID)
|
.Where(x => x.source_detail_id == wmsPurchaseD.id && x.source_type == WmsWareHouseConst.BIZTYPE_WMSINSTOCK_ID)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ using Tnb.ProductionMgr.Entities.Entity;
|
|||||||
using Tnb.WarehouseMgr.Entities.Entity;
|
using Tnb.WarehouseMgr.Entities.Entity;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using JNPF.VisualDev.Interfaces;
|
||||||
|
using JNPF.VisualDev.Entitys;
|
||||||
|
|
||||||
namespace Tnb.WarehouseMgr
|
namespace Tnb.WarehouseMgr
|
||||||
{
|
{
|
||||||
@@ -48,16 +50,25 @@ namespace Tnb.WarehouseMgr
|
|||||||
private readonly ISqlSugarClient _db;
|
private readonly ISqlSugarClient _db;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly IWareHouseService _wareHouseService;
|
private readonly IWareHouseService _wareHouseService;
|
||||||
|
private readonly IRunService _runService;
|
||||||
|
private readonly IVisualDevService _visualDevService;
|
||||||
public WmsPurchaseService(ISqlSugarRepository<WmsPurchaseH> repo, IUserManager userManager, IQcCheckPlanService qcCheckPlanService, IBillRullService billRullService,
|
public WmsPurchaseService(ISqlSugarRepository<WmsPurchaseH> repo, IUserManager userManager, IQcCheckPlanService qcCheckPlanService, IBillRullService billRullService,
|
||||||
IWareHouseService wareHouseService)
|
IWareHouseService wareHouseService, IRunService runService,
|
||||||
|
IVisualDevService visualDevService)
|
||||||
: base(repo, userManager, qcCheckPlanService)
|
: base(repo, userManager, qcCheckPlanService)
|
||||||
{
|
{
|
||||||
_db = repo.AsSugarClient();
|
_db = repo.AsSugarClient();
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_billRullService = billRullService;
|
_billRullService = billRullService;
|
||||||
_wareHouseService = wareHouseService;
|
_wareHouseService = wareHouseService;
|
||||||
|
_runService = runService;
|
||||||
|
_visualDevService = visualDevService;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private async Task<dynamic> xxx(VisualDevModelDataCrInput input)
|
private async Task<dynamic> xxx(VisualDevModelDataCrInput input)
|
||||||
{
|
{
|
||||||
PurchaseAndReceiveUpInput input2 = new();
|
PurchaseAndReceiveUpInput input2 = new();
|
||||||
@@ -320,10 +331,10 @@ namespace Tnb.WarehouseMgr
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _db.Ado.BeginTranAsync();
|
await _db.Ado.BeginTranAsync();
|
||||||
if (_db.Queryable<WmsTempCode>().Where(it => input.BillId == it.require_id).Any())
|
//if (_db.Queryable<WmsTempCode>().Where(it => input.BillId == it.require_id).Any())
|
||||||
{
|
//{
|
||||||
throw new AppFriendlyException("条码已生成", 500);
|
// throw new AppFriendlyException("条码已生成", 500);
|
||||||
};
|
//};
|
||||||
WmsPurchaseD WmsPurchaseD = await _db.Queryable<WmsPurchaseD>().Where(it => input.BillId == it.id).FirstAsync();
|
WmsPurchaseD WmsPurchaseD = await _db.Queryable<WmsPurchaseD>().Where(it => input.BillId == it.id).FirstAsync();
|
||||||
WmsPurchaseH WmsPurchaseH = await _db.Queryable<WmsPurchaseH>().Where(it => WmsPurchaseD.bill_id == it.id).FirstAsync();
|
WmsPurchaseH WmsPurchaseH = await _db.Queryable<WmsPurchaseH>().Where(it => WmsPurchaseD.bill_id == it.id).FirstAsync();
|
||||||
|
|
||||||
|
|||||||
@@ -207,10 +207,10 @@ namespace Tnb.WarehouseMgr
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _db.Ado.BeginTranAsync();
|
await _db.Ado.BeginTranAsync();
|
||||||
if (_db.Queryable<WmsTempCode>().Where(it => input.BillId == it.require_id).Any())
|
//if (_db.Queryable<WmsTempCode>().Where(it => input.BillId == it.require_id).Any())
|
||||||
{
|
//{
|
||||||
throw new AppFriendlyException("条码已生成", 500);
|
// throw new AppFriendlyException("条码已生成", 500);
|
||||||
};
|
//};
|
||||||
WmsRawmatTransferinstockD WmsRawmatTransferinstockD = await _db.Queryable<WmsRawmatTransferinstockD>().Where(it => input.BillId == it.id).FirstAsync();
|
WmsRawmatTransferinstockD WmsRawmatTransferinstockD = await _db.Queryable<WmsRawmatTransferinstockD>().Where(it => input.BillId == it.id).FirstAsync();
|
||||||
WmsRawmatTransferinstockH WmsRawmatTransferinstockH = await _db.Queryable<WmsRawmatTransferinstockH>().Where(it => WmsRawmatTransferinstockD.bill_id == it.id).FirstAsync();
|
WmsRawmatTransferinstockH WmsRawmatTransferinstockH = await _db.Queryable<WmsRawmatTransferinstockH>().Where(it => WmsRawmatTransferinstockD.bill_id == it.id).FirstAsync();
|
||||||
|
|
||||||
|
|||||||
@@ -224,21 +224,25 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
#region 电梯第三次改动 延迟预任务生成
|
#region 电梯第三次改动 延迟预任务生成
|
||||||
// 3-1 第三次改动
|
// 3-1 第三次改动
|
||||||
var YCLInnerTransfer = await _db.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3CurInCacheLocation").FirstAsync();
|
endLocation = null;
|
||||||
Logger.Information($"当前发货区: {YCLInnerTransfer.value}");
|
// 正常情况下交替入,如果左右两侧缓存数量不一致 优先补充托盘数量少那一侧
|
||||||
if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右"))
|
List<BasLocation> locations_left = await _db.Queryable<BasLocation>()
|
||||||
{
|
|
||||||
throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前入库分区 项配置错误!需要配置值为【3楼发货左】或【3楼发货右】", 500);
|
|
||||||
}
|
|
||||||
List<BasLocation> locations = await _db.Queryable<BasLocation>()
|
|
||||||
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
||||||
.Where((a, b) => b.name == YCLInnerTransfer.value).OrderBy("a.is_lock,a.is_use,carry_count,a.location_code").ToListAsync();
|
.Where((a, b) => b.name == "3楼发货左").OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync();
|
||||||
|
List<BasLocation> locations_right = await _db.Queryable<BasLocation>()
|
||||||
endLocation = locations.FirstOrDefault();
|
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
||||||
|
.Where((a, b) => b.name == "3楼发货右").OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync();
|
||||||
await _db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左"))
|
decimal leftQty = locations_left.Sum(r => r.carry_count + r.task_nums);
|
||||||
.Where(r => r.key == "floor3CurInCacheLocation").ExecuteCommandAsync();
|
decimal rightQty = locations_right.Sum(r => r.carry_count + r.task_nums);
|
||||||
|
if (leftQty <= rightQty)
|
||||||
|
endLocation = locations_left.FirstOrDefault();
|
||||||
|
else
|
||||||
|
endLocation = locations_right.FirstOrDefault();
|
||||||
|
|
||||||
|
if (endLocation == null)
|
||||||
|
{
|
||||||
|
throw new AppFriendlyException($"载具{carry.carry_code}无法选到缓存区库位,请检查电梯缓存分区配置表", 500);
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
//人工发货
|
//人工发货
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
throw new ArgumentNullException(nameof(input));
|
throw new ArgumentNullException(nameof(input));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BasLocation endLocation = await _db.Queryable<BasLocation>().Where(r => r.id == input.wmsDistaskH.endlocation_id).FirstAsync();
|
BasLocation endLocation = await _db.Queryable<BasLocation>().Where(r => r.id == input.wmsDistaskH.endlocation_id).FirstAsync();
|
||||||
string outWhid = "";
|
string outWhid = "";
|
||||||
string inWhid = "";
|
string inWhid = "";
|
||||||
|
|||||||
@@ -114,12 +114,12 @@ namespace Tnb.WarehouseMgr
|
|||||||
// 自动发货
|
// 自动发货
|
||||||
if (!input.isManual)
|
if (!input.isManual)
|
||||||
{
|
{
|
||||||
endLocations = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").ToListAsync();
|
//endLocations = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").ToListAsync();
|
||||||
|
|
||||||
if (endLocations.Count < items_pretask.Count)
|
//if (endLocations.Count < items_pretask.Count)
|
||||||
{
|
//{
|
||||||
throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500);
|
// throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
//人工发货
|
//人工发货
|
||||||
else
|
else
|
||||||
@@ -145,18 +145,28 @@ namespace Tnb.WarehouseMgr
|
|||||||
// 自动发货
|
// 自动发货
|
||||||
if (!input.isManual)
|
if (!input.isManual)
|
||||||
{
|
{
|
||||||
endLocation = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync();
|
#region 电梯第三次改动 延迟预任务生成
|
||||||
|
// 3-1 第三次改动
|
||||||
|
endLocation = null;
|
||||||
|
// 正常情况下交替入,如果左右两侧缓存数量不一致 优先补充托盘数量少那一侧
|
||||||
|
List<BasLocation> locations_left = await _db.Queryable<BasLocation>()
|
||||||
|
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
||||||
|
.Where((a, b) => b.name == "3楼发货左").OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync();
|
||||||
|
List<BasLocation> locations_right = await _db.Queryable<BasLocation>()
|
||||||
|
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
||||||
|
.Where((a, b) => b.name == "3楼发货右").OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync();
|
||||||
|
decimal leftQty = locations_left.Sum(r => r.carry_count + r.task_nums);
|
||||||
|
decimal rightQty = locations_right.Sum(r => r.carry_count + r.task_nums);
|
||||||
|
if (leftQty <= rightQty)
|
||||||
|
endLocation = locations_left.FirstOrDefault();
|
||||||
|
else
|
||||||
|
endLocation = locations_right.FirstOrDefault();
|
||||||
|
|
||||||
if (endLocation == null)
|
if (endLocation == null)
|
||||||
{
|
{
|
||||||
throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500);
|
throw new AppFriendlyException($"载具{carry.carry_code}无法选到缓存区库位,请检查电梯缓存分区配置表", 500);
|
||||||
}
|
|
||||||
List<BasLocation> endLocations_temp = await _db.Queryable<BasLocation>().Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_lock == 0 && r.is_use == "0").ToListAsync();
|
|
||||||
|
|
||||||
if (endLocations_temp.Count < items_pretask.Count)
|
|
||||||
{
|
|
||||||
throw new AppFriendlyException($"三楼发货时,没有可用的暂存库位可以使用,需要下发任务{items_pretask.Count}条,可用的暂存库位只有{endLocations_temp.Count}条", 500);
|
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
//人工发货
|
//人工发货
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -116,21 +116,23 @@ namespace Tnb.Common.Utils
|
|||||||
{
|
{
|
||||||
Log.Information($"开始请求 {url} 请求参数: {JsonConvert.SerializeObject(pars)}");
|
Log.Information($"开始请求 {url} 请求参数: {JsonConvert.SerializeObject(pars)}");
|
||||||
}
|
}
|
||||||
HttpClient Client = new HttpClient();
|
using (HttpClient Client = new HttpClient())
|
||||||
var reqUri = url;
|
|
||||||
if (pars?.Count > 0)
|
|
||||||
{
|
{
|
||||||
reqUri = QueryHelpers.AddQueryString(url, pars);
|
var reqUri = url;
|
||||||
//await Console.Out.WriteLineAsync(reqUri);
|
if (pars?.Count > 0)
|
||||||
|
{
|
||||||
|
reqUri = QueryHelpers.AddQueryString(url, pars);
|
||||||
|
//await Console.Out.WriteLineAsync(reqUri);
|
||||||
|
}
|
||||||
|
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
||||||
|
var respBody = await Client.GetAsync(reqUri);
|
||||||
|
var result = await respBody.Content.ReadAsStringAsync();
|
||||||
|
if (isLog)
|
||||||
|
{
|
||||||
|
Log.Information($"请求 {url} 参数: {JsonConvert.SerializeObject(pars)} 结果: {result}");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
|
||||||
var respBody = await Client.GetAsync(reqUri);
|
|
||||||
var result = await respBody.Content.ReadAsStringAsync();
|
|
||||||
if (isLog)
|
|
||||||
{
|
|
||||||
Log.Information($"请求 {url} 结果: {result}");
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<string> GetAsync(string url, Dictionary<string, string> headers = null, Dictionary<string, string> pars = null)
|
public static async Task<string> GetAsync(string url, Dictionary<string, string> headers = null, Dictionary<string, string> pars = null)
|
||||||
|
|||||||
Reference in New Issue
Block a user