add-添加人工选择库位成品出库线程

master
liuwf 1 year ago
parent 84d0b5bccc
commit 16d74d9db8

@ -41,6 +41,13 @@ namespace Khd.Core.Wcs.Wcs
//createRemoveThread.Name = "CreateRemoveLogic";
//createRemoveThread.Start();
//二楼、五楼人工指定库位成品出库任务
var CreateProductTaskByLocationCodeThread = new Thread(CreateProductTaskByLocationCodeLogic);
CreateProductTaskByLocationCodeThread.IsBackground = true;
CreateProductTaskByLocationCodeThread.Name = "CreateFiveProductTaskLogic";
CreateProductTaskByLocationCodeThread.Start();
//创建退库任务
var stockReturnThread = new Thread(StockReturnLogic);
stockReturnThread.IsBackground = true;
@ -134,7 +141,7 @@ namespace Khd.Core.Wcs.Wcs
.Where(t => t.executeStatus == "0")
.Where(t => t.outstockAmount > t.realOutstockAmount)
.Where(t => t.taskType == "5")
.Where(t => t.operationType =="0")
.Where(t => t.operationType == "0")
.Where(t => t.auditStatus == "1")
.ToList();
@ -143,7 +150,7 @@ namespace Khd.Core.Wcs.Wcs
{
var locations = dbContext.WmsBaseLocation
.Where(t => rawOutStock.Select(x => x.locationCode).Contains(t.locationCode))
.AsEnumerable()
.AsEnumerable()
.OrderBy(x => x.locDeep == 2 ? 0 : 99)
.Select((loc, index) => new { loc.locationCode, Index = index })
.ToDictionary(item => item.locationCode, item => item.Index);
@ -1358,7 +1365,7 @@ namespace Khd.Core.Wcs.Wcs
.Where(t => wmsRawStockLocations.Contains(t.locationCode))
.WhereIf(!string.IsNullOrEmpty(wcsTaskManual.startPointNo), t => t.locationCode == wcsTaskManual.startPointNo)
.ToList();
//手动模式
if (!string.IsNullOrEmpty(wcsTaskManual.startPointNo))
{
@ -1388,7 +1395,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
bill = bill.OrderBy(t => list.Contains(t.a.locationCode) ? 0 : 1).OrderBy(t => t.b.instockDate.Value.Date);//按某个时间段
//#endregion
//#endregion
foreach (var item in bill)
{
@ -1442,7 +1449,7 @@ namespace Khd.Core.Wcs.Wcs
WmsBaseLocation? toLocation = null;
var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == fromBaseLocation.warehouseId)
.Where(t => t.warehouseId != fromBaseLocation.locationId)
.Where(t => t.locationId != fromBaseLocation.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode)).OrderBy(t => t.locDeep).ToList();
foreach (WmsBaseLocation itemLocation in moveLocationList)
@ -1608,7 +1615,7 @@ namespace Khd.Core.Wcs.Wcs
useFlag = 1,
qty = 1
};
SystemData.LockOutLocation(wmsBaseLocation, dbContext);
wmsBaseLocation.locationStatus = "6";
dbContext.Update(wmsBaseLocation);
@ -1727,6 +1734,278 @@ namespace Khd.Core.Wcs.Wcs
}
}
#region 2楼、3楼指定库位成品出库
/// <summary>
/// 人工指定库位成品出库
/// 二楼、五楼指定库位成品出库任务
/// </summary>
private void CreateProductTaskByLocationCodeLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Clear();
bool fiveTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any();
if (!fiveTask)
{
var fiveProOutStock = dbContext.WmsProductOutstock
.Where(t => t.outstockQty < t.applyQty)
.Where(t => t.auditStatus == "1")
.Where(t => t.warehouseId == 531)
.Where(t => t.operationType == "1") //不指定库位0指定库位1
.Where(t => t.productType == "3")
.Where(t => t.executeStatus == "0" || t.executeStatus == "1").FirstOrDefault();
//创建任务
if (fiveProOutStock != null)
{
CreateTask(fiveProOutStock);
}
}
bool twoTask = dbContext.WcsTask.Where(t => t.nextPointId == 8 && t.taskStatus <= 7).Any();
if (!twoTask)
{
var twoProOutStock = dbContext.WmsProductOutstock
.Where(t => t.outstockQty < t.applyQty)
.Where(t => t.auditStatus == "1")
.Where(t => t.warehouseId == 231)
.Where(t => t.operationType == "1") //不指定库位0指定库位1
.Where(t => t.productType == "3")
.Where(t => t.executeStatus == "0" || t.executeStatus == "1").FirstOrDefault();
//创建任务
if (twoProOutStock != null)
{
CreateTask(twoProOutStock);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + ex.StackTrace);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 二楼、五楼指定库位根据申请单成品出库任务
/// </summary>
/// <param name="wmsProductOutstock"></param>
private void CreateTask(WmsProductOutstock wmsProductOutstock)
{
try
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == (wmsProductOutstock.warehouseId == 531 ? 28 : 8));
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == (wmsProductOutstock.warehouseId == 531 ? 5 : 1));
List<WmsBaseLocation> AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == wmsProductOutstock.warehouseId).ToList();
List<WmsProductOutstockDetail> details = dbContext.WmsProductOutstockDetail.Where(t => t.productOutstockId == wmsProductOutstock.productOutstockId).ToList();
if (details.Count == 0) return;
var locationCodes = details.Select(t => t.locationCode).Distinct().ToList();
//待出库列表
List<WmsBaseLocation> baseLocations = AllWmsBaseLocations.Where(t => locationCodes.Contains(t.locationCode) && t.warehouseId == wmsProductOutstock.warehouseId).ToList();
baseLocations = baseLocations.OrderByDescending(t => t.locDeep).ToList(); // 浅库位优先
//目标出库库位
WmsBaseLocation targetLocation = null;
foreach (var item in baseLocations)
{
//二次校验任务
bool hasTask = false;
if (wmsProductOutstock.warehouseId == 531)
{
hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any();
}
else
{
hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 8 && t.taskStatus <= 7).Any();
}
if (hasTask)
{
continue;
}
if (item.locDeep == 2 && item.locationStatus == "1" && !string.IsNullOrEmpty(item.containerCode))
{ // 浅库位满足条件直接出
targetLocation = item;
break;
}
if (item.locDeep == 1 && item.locationStatus == "1" && !string.IsNullOrEmpty(item.containerCode)) //深库位出库 ,若浅库位有东西需要移库
{
// 计算对应浅库位坐标
int? locRow = item.locRow % 2 == 0 ? item.locRow - 1 : item.locRow + 1;
// 外侧浅库位
WmsBaseLocation? wmsBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == locRow)
.Where(t => t.locColumn == item.locColumn)
.Where(t => t.warehouseId == item.warehouseId).FirstOrDefault();
if (wmsBaseLocation.locationStatus == "1" && !string.IsNullOrEmpty(wmsBaseLocation.containerCode))
{ //移库
#region 找寻移库目标库位
WmsBaseLocation? toLocation = null;
var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == item.warehouseId)
.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList();
foreach (WmsBaseLocation itemLocation in moveLocationList)
{
if (itemLocation.locDeep == 1)
{
bool hasLocation = AllWmsBaseLocations
.Where(t => t.locRow == (itemLocation.locRow % 2 == 1 ? (itemLocation.locRow + 1) : (itemLocation.locRow - 1)))
.Where(t => t.locColumn == itemLocation.locColumn)
.Where(t => t.locationStatus == "1" && string.IsNullOrEmpty(t.containerCode))
.Any();
if (!hasLocation)
{
Console.WriteLine(DateTime.Now + $":目标库位的浅库位库位状态异常,无法移库");
_logger.Info($"目标库位的浅库位库位状态异常,无法移库");
continue;
}
else
{
// 找到可以移库的目标库位
toLocation = itemLocation;
break;
}
}
else
{
// 找到可以移库的目标库位
toLocation = itemLocation;
break;
}
}
if (toLocation == null)
{
// 找寻下一个移库库位
continue;
}
var RemoveTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = wmsProductOutstock.productOutstockId,
taskType = wmsProductOutstock.warehouseId == 231 ? StaticTaskType.SecondRemove : StaticTaskType.FiveRemove,
containerNo = wmsBaseLocation.containerCode,
createBy = "WCS",
createTime = DateTime.Now.AddSeconds(-10),
taskStatus = 0,
materialId = wmsProductOutstock.productId,
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = toLocation.locationId,
endPointNo = toLocation.locationCode,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = 1
};
SystemData.LockOutLocation(toLocation, dbContext);
SystemData.LockOutLocation(wmsBaseLocation, dbContext);
toLocation.locationStatus = "4";
toLocation.updateBy = "WCS";
toLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "WCS";
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.locationStatus = "4";
dbContext.Update(toLocation);
dbContext.Update(wmsBaseLocation);
dbContext.Add(RemoveTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(RemoveTask);
dbContext.Add(wcsTaskLog);
targetLocation = item;
break;
#endregion
}
else if(wmsBaseLocation.locationStatus == "1" && string.IsNullOrEmpty(wmsBaseLocation.containerCode))
{
targetLocation = item;
break;
}
else if(wmsBaseLocation.locationStatus != "1")
{
//浅库位状态异常
continue;
}
}
}
WcsTask wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = wmsProductOutstock.productOutstockId,
taskType = wmsProductOutstock.warehouseId == 231 ? StaticTaskType.SecondStorageToLift : StaticTaskType.FiveProductOut,
containerNo = targetLocation.containerCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = wmsProductOutstock.productId,
currPointId = targetLocation.locationId,
currPointNo = targetLocation.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = 1
};
SystemData.LockOutLocation(targetLocation, dbContext);
targetLocation.locationStatus = "6";
targetLocation.updateBy = "WCS";
targetLocation.updateTime = DateTime.Now;
dbContext.Update(targetLocation);
dbContext.Add(wcsTask);
wmsProductOutstock.updateBy = "WCS";
wmsProductOutstock.updateDate = DateTime.Now;
if (wmsProductOutstock.executeStatus == "0")
{
wmsProductOutstock.executeStatus = "1";
wmsProductOutstock.beginTime = DateTime.Now;
}
dbContext.Update(wmsProductOutstock);
WmsProductOutstockDetail? wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(x => x.productOutstockId == wmsProductOutstock.productOutstockId && x.locationCode == targetLocation.locationCode);
if (wmsProductOutstockDetail != null)
{
wmsProductOutstockDetail.executeStatus = "1";
wmsProductOutstockDetail.updateBy = "WCS";
wmsProductOutstockDetail.updateDate = DateTime.Now;
wmsProductOutstockDetail.beginTime = DateTime.Now;
dbContext.Update(wmsProductOutstockDetail);
}
dbContext.SaveChanges();
}catch (Exception ex)
{
Console.WriteLine(ex.Message + ex.StackTrace);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
#endregion
/// <summary>
/// 成品出库
/// </summary>
@ -1851,9 +2130,9 @@ namespace Khd.Core.Wcs.Wcs
WmsBaseLocation? toLocation = null;
var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.warehouseId != location.locationId)
.Where(t => t.locationId != location.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList();
foreach (WmsBaseLocation itemLocation in moveLocationList)
@ -2083,7 +2362,7 @@ namespace Khd.Core.Wcs.Wcs
Console.WriteLine(ex.Message + ex.StackTrace);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
@ -2570,7 +2849,7 @@ namespace Khd.Core.Wcs.Wcs
{
//原材料库存
var rawStock = dbContext.WmsRawStock
.Where(t => t.activeFlag == "1").ToList();
BaseEquip endStationCodeEquip = dbContext.BaseEquip.First(t => t.objid == 10);
if (!string.IsNullOrEmpty(endStationCodeEquip.endStationCode) && endStationCodeEquip.IsOut == 1)
@ -2583,9 +2862,9 @@ namespace Khd.Core.Wcs.Wcs
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 11).Any();
if (!hasTask)
{
var orderList = rawOutStock.Where(t => endStationCodeEquip.endStationCode.Contains(t.endStationCode)).ToList();
List<WcsTask> tasks = new();
List<long?> canOut = orderList.Select(t => t.saleOrderId).ToList();
rawStock = rawStock.Where(t => canOut.Contains(t.saleOrderId)).OrderByDescending(t => t.saleOrderId).ToList();
@ -2946,9 +3225,9 @@ namespace Khd.Core.Wcs.Wcs
// 寻找移库目的库位
WmsBaseLocation? toLocation = null;
var moveLocationList = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.warehouseId != location.locationId)
.Where(t => t.locationId != location.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1").OrderBy(t => t.locDeep).ToList();
foreach (WmsBaseLocation itemLocation in moveLocationList)

@ -614,24 +614,33 @@ namespace Khd.Core.Wcs.Wcs
wmsProductOutstock.endTime = DateTime.Now;
wmsProductOutstock.executeStatus = "2";
}
WmsProductOutstockDetail newWmsProductOutstockDetail = new WmsProductOutstockDetail();
newWmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId;
newWmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId;
newWmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode;
newWmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch;
newWmsProductOutstockDetail.productId = wmsProductStock.productId;
newWmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty;
newWmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty;
newWmsProductOutstockDetail.executeStatus = "2";
newWmsProductOutstockDetail.updateBy = "WCS";
newWmsProductOutstockDetail.updateDate = DateTime.Now;
newWmsProductOutstockDetail.beginTime = DateTime.Now;
newWmsProductOutstockDetail.endTime = DateTime.Now;
WmsProductOutstockDetail? wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(x => x.productOutstockId == wmsProductOutstock.productOutstockId && x.locationCode == item.currPointId.ToString());
if (wmsProductOutstockDetail != null)
{ //人工出库mes会自动插入wcs只需要更新即可
wmsProductOutstockDetail.outstockAmount = 1;
wmsProductOutstockDetail.executeStatus = "2";
wmsProductOutstockDetail.updateDate = DateTime.Now;
wmsProductOutstockDetail.endTime = DateTime.Now;
dbContext.Update(wmsProductOutstockDetail);
}
else
{
wmsProductOutstockDetail = new WmsProductOutstockDetail();
wmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId;
wmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId;
wmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode;
wmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch;
wmsProductOutstockDetail.productId = wmsProductStock.productId;
wmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty;
wmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty;
wmsProductOutstockDetail.executeStatus = "2";
wmsProductOutstockDetail.updateBy = "WCS";
wmsProductOutstockDetail.updateDate = DateTime.Now;
wmsProductOutstockDetail.beginTime = DateTime.Now;
wmsProductOutstockDetail.endTime = DateTime.Now;
dbContext.Add(wmsProductOutstockDetail);
}
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.containerCode = null;
wmsBaseLocation.updateTime = DateTime.Now;
@ -648,8 +657,7 @@ namespace Khd.Core.Wcs.Wcs
newTask.fromFloorNo = 5;
newTask.floorNo = 1;
newTask.taskStatus = 6;
newTask.objid = StaticData.SnowId.NextId();
dbContext.Add(newWmsProductOutstockDetail);
newTask.objid = StaticData.SnowId.NextId();
dbContext.Remove(item);
dbContext.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);

@ -857,23 +857,33 @@ namespace Khd.Core.Wcs.Wcs
wmsProductOutstock.endTime = DateTime.Now;
wmsProductOutstock.executeStatus = "2";
}
WmsProductOutstockDetail newWmsProductOutstockDetail = new WmsProductOutstockDetail();
newWmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId;
newWmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId;
newWmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode;
newWmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch;
newWmsProductOutstockDetail.productId = wmsProductStock.productId;
newWmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty;
newWmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty;
newWmsProductOutstockDetail.executeStatus = "2";
newWmsProductOutstockDetail.updateBy = "WCS";
newWmsProductOutstockDetail.updateDate = DateTime.Now;
newWmsProductOutstockDetail.beginTime = DateTime.Now;
newWmsProductOutstockDetail.endTime = DateTime.Now;
WmsProductOutstockDetail? wmsProductOutstockDetail = dbContext.WmsProductOutstockDetail.FirstOrDefault(x=>x.productOutstockId== wmsProductOutstock.productOutstockId && x.locationCode== item.currPointId.ToString());
if (wmsProductOutstockDetail != null)
{ //人工出库mes会自动插入wcs只需要更新即可
wmsProductOutstockDetail.outstockAmount = 1;
wmsProductOutstockDetail.executeStatus = "2";
wmsProductOutstockDetail.updateDate = DateTime.Now;
wmsProductOutstockDetail.endTime = DateTime.Now;
dbContext.Update(wmsProductOutstockDetail);
}
else
{
wmsProductOutstockDetail = new WmsProductOutstockDetail();
wmsProductOutstockDetail.productOutstockId = wmsProductOutstock.productOutstockId;
wmsProductOutstockDetail.warehouseId = wmsProductOutstock.warehouseId;
wmsProductOutstockDetail.locationCode = wmsBaseLocation.locationCode;
wmsProductOutstockDetail.productBarcode = wmsProductStock.productBatch;
wmsProductOutstockDetail.productId = wmsProductStock.productId;
wmsProductOutstockDetail.planAmount = wmsProductOutstock.applyQty;
wmsProductOutstockDetail.outstockAmount = wmsProductOutstock.outstockQty;
wmsProductOutstockDetail.executeStatus = "2";
wmsProductOutstockDetail.updateBy = "WCS";
wmsProductOutstockDetail.updateDate = DateTime.Now;
wmsProductOutstockDetail.beginTime = DateTime.Now;
wmsProductOutstockDetail.endTime = DateTime.Now;
dbContext.Add(wmsProductOutstockDetail);
}
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.containerCode = null;
item.nextPointId = 2;
@ -881,7 +891,7 @@ namespace Khd.Core.Wcs.Wcs
SystemData.UnLockOutLocation(wmsBaseLocation, dbContext);
dbContext.Remove(wmsProductStock);
dbContext.Update(wmsBaseLocation);
dbContext.Add(newWmsProductOutstockDetail);
dbContext.Update(wmsProductOutstock);
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 });

Loading…
Cancel
Save