1 year ago
parent f72c19ffed
commit d8392e2202

@ -45,7 +45,7 @@ namespace Khd.Core.Domain.Models
public string HandleUser { get; set; }
[Column("handle_time")]
public DateTime HandleTime { get; set; }
public DateTime? HandleTime { get; set; }
[Column("cause_analysis")]
public string CauseAnalysis { get; set; }
@ -63,6 +63,6 @@ namespace Khd.Core.Domain.Models
public string UpdateBy { get; set; }
[Column("update_time")]
public DateTime UpdateTime { get; set; }
public DateTime? UpdateTime { get; set; }
}
}

@ -51,8 +51,6 @@ namespace Khd.Core.Plc
byte[] dataToWrite = new byte[len];
Array.Copy(byteArray, dataToWrite, byteArray.Length);
plc.Write(S7.DataType.DataBlock, db, startByteAdr, dataToWrite);
}

@ -46,7 +46,7 @@ namespace Khd.Core.Wcs
StaticData.BaseEquip = dbContext.BaseEquip.ToList();//设备信息
StaticData.BaseDictionary = dbContext.BaseDictionary.ToList();//字典表Agv任务模板
StaticData.DmsBaseAlarmRuleList = dbContext.DmsBaseAlarmRule.ToList();
foreach (var plcConfig in StaticData.PlcConfigs)
{
if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code))

@ -115,7 +115,11 @@ namespace Khd.Core.Wcs.Wcs
{
int thirdTray = dbContext.BaseEquip
.Where(t => t.equipType == 15)
.Where(t => t.useFlag == 1)
.Where(t => t.emptyCount == SystemData.maxTray).Count();
int thirdBTray = dbContext.BaseEquip
.Where(t => t.equipType == 15)
.Where(t => t.emptyCount > 0).Count();
List<BaseEquip> baseEquips = dbContext.BaseEquip.Where(t => t.useFlag == 1).Where(t => t.equipType == 20).ToList();
int emptyCount = baseEquips.Where(t => t.emptyCount == 0).Count();
int maxCount = baseEquips.Where(t => t.emptyCount == SystemData.maxTray).Count();
@ -125,10 +129,14 @@ namespace Khd.Core.Wcs.Wcs
{
create = true;
}
if (emptyCount > 6 && thirdBTray >= 1)
{
create = true;
}
}
if (create)
{
var baseEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.emptyCount == SystemData.maxTray);//三楼三个周转区是否存在空托盘
var baseEquip = dbContext.BaseEquip.Where(t => t.equipType == 15).OrderByDescending(t => t.emptyCount).FirstOrDefault();//三楼三个周转区是否存在空托盘
if (baseEquip != null)//如果三楼有空托盘
{
BaseEquip ThirdLineEquip = dbContext.BaseEquip.First(t => t.objid == 3);//三楼接驳位
@ -585,7 +593,7 @@ namespace Khd.Core.Wcs.Wcs
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 9).Any();
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 9).Where(t => t.useFlag == 1).Any();
if (!hasTask)
{
WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.nextPointId == 9 || t.nextPointId == 8).OrderBy(t => t.createBy).FirstOrDefault();

@ -1,4 +1,5 @@
using Khd.Core.Domain.Dto.waring;
using Khd.Core.Domain.Dto.TaskType;
using Khd.Core.Domain.Dto.waring;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
@ -320,7 +321,7 @@ namespace Khd.Core.Wcs.Wcs
fromFloorNo = 1,
floorNo = 4,
useFlag = 1,
ud1=20,
ud1 = 20,
createBy = "一楼接驳位",
createTime = DateTime.Now,
remark = "一楼创建入库任务"
@ -424,7 +425,7 @@ namespace Khd.Core.Wcs.Wcs
else
{
//TODO 物料未绑定仓库,添加报警
SystemData.InsertWaringLog(dbContext,WaringType.);
SystemData.InsertWaringLog(dbContext, WaringType.);
continue;
}
}
@ -496,7 +497,7 @@ namespace Khd.Core.Wcs.Wcs
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
SystemData.DeleteWaringLog(dbContext,WaringType.);
SystemData.DeleteWaringLog(dbContext, WaringType.);
Thread.Sleep(3000);
}
}
@ -536,6 +537,21 @@ namespace Khd.Core.Wcs.Wcs
.OrderBy(t => t.ud1).OrderBy(t => t.createTime).ToList();
foreach (var wcsTask in wcsTasks)
{
if (wcsTask.taskType == StaticTaskType.SecondTransitToLift && !string.IsNullOrEmpty(wcsTask.containerNo))
{
var mesBasePalletInfo = dbContext.MesBasePalletInfo
.Where(t => t.palletInfoCode == wcsTask.containerNo).FirstOrDefault();
if (mesBasePalletInfo == null || string.IsNullOrEmpty(mesBasePalletInfo.materialBarcode))
{
continue;
}
var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo
.Where(t => t.palletInfoCode == wcsTask.containerNo && t.barcodeInfo == mesBasePalletInfo.materialBarcode).FirstOrDefault();
if (mesBaseBarcodeInfo == null)
{
continue;
}
}
_logger.Info($"当前任务?{wcsTask.ToJsonString()}");
bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == wcsTask.endPointId && t.objid != wcsTask.objid && t.nextPointId != 6).Any();
if (!hasTask)
@ -549,10 +565,10 @@ namespace Khd.Core.Wcs.Wcs
BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == wcsTask.floorNo);
if (wcsTask.taskStatus == 0 && Convert.ToInt32(hoisterTrayIn06Value) == 0)//创建状态,并且里面没有货物
{
// 目的楼层从接驳位出发入库的任务 --待测试
// 目的楼层从接驳位出发入库的任务 --待测试
var InTask = dbContext.WcsTask.FirstOrDefault(t => t.currPointId == lineEquip.objid);
if (lineEquip.equipStatus == 1 && InTask==null)
if (lineEquip.equipStatus == 1 && InTask == null)
{
_logger.Info("提升机线程:" + wcsTask.floorNo + "楼接驳位有AGV任务跳过当前任务");
continue;

@ -71,6 +71,10 @@ namespace Khd.Core.Wcs.Wcs
.FirstOrDefault(t => t.containerNo == rfid && t.nextPointId == baseEquip.objid);
if (wcsTask != null)
{
if (wcsTask.taskType == 99)
{
continue;
}
if (StaticData.BigContainerCodes.Contains(rfid))
{
if (rfid == lastRFID)

@ -805,6 +805,7 @@ namespace Khd.Core.Wcs.Wcs
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
endEquip.equipStatus = 1;
endEquip.emptyCount = item.qty;
endEquip.ud3 = "1";
dbContext.Update(endEquip);
dbContext.Remove(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 });
@ -819,6 +820,7 @@ namespace Khd.Core.Wcs.Wcs
endEquip.equipStatus = 1;
endEquip.emptyCount = 1;
endEquip.containerNo = item.containerNo;
endEquip.ud3 = "2";
dbContext.Update(endEquip);
dbContext.Update(startEquip);
dbContext.Remove(item);
@ -847,11 +849,13 @@ namespace Khd.Core.Wcs.Wcs
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId);
startEquip.equipStatus = 0;
startEquip.emptyCount = 0;
startEquip.ud3 = "0";
startEquip.containerNo = null;
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
endEquip.equipStatus = 1;
endEquip.emptyCount = 1;
endEquip.containerNo = item.containerNo;
endEquip.ud3 = "2";
dbContext.Update(startEquip);
dbContext.Update(endEquip);
dbContext.Remove(item);
@ -956,6 +960,7 @@ namespace Khd.Core.Wcs.Wcs
{
wasteEquip.emptyCount = 0;
wasteEquip.equipStatus = 0;
wasteEquip.ud3 = "0";
BaseEquip endEquip = dbContext.BaseEquip.First(t => t.objid == item.endPointId);
endEquip.emptyCount = 1;
endEquip.equipStatus = 2;
@ -971,6 +976,7 @@ namespace Khd.Core.Wcs.Wcs
BaseEquip emptyEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId);
emptyEquip.emptyCount = 0;
emptyEquip.equipStatus = 0;
emptyEquip.ud3 = "0";
emptyEquip.containerNo = null;
item.nextPointId = 2;
item.taskStatus = 8;
@ -985,6 +991,7 @@ namespace Khd.Core.Wcs.Wcs
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId);
startEquip.equipStatus = 0;
startEquip.emptyCount = 0;
startEquip.ud3 = "0";
startEquip.containerNo = null;
dbContext.Update(startEquip);
dbContext.Remove(item);

@ -272,18 +272,18 @@ namespace Khd.Core.Wcs.Wcs
//相同型号及销售订单的深库位库存
List<WmsProductStock> productStocks = dbContext.WmsProductStock.Where(t => t.productId == mesBaseBarcodeInfo.materialId)
.Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId)
.Where(t => t.warehouseId== 231)
.Where(t => t.warehouseId == 231)
.Where(t => DeepContainerCodes.Contains(t.palletInfoCode)).ToList();
if(productStocks.Count > 0)
if (productStocks.Count > 0)
{ //优先找同销售订单的有库存的深库位对应的浅库位
foreach(var productStock in productStocks)
foreach (var productStock in productStocks)
{
// 深库位库存对用的Location信息
var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == productStock.palletInfoCode).FirstOrDefault();
wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus=="1")
.Where(t=> t.locDeep == 2 && t.locColumn ==deepStockLocation.locColumn)
.Where(t=> t.locRow == (deepStockLocation.locRow % 2 == 0 ? (deepStockLocation.locRow - 1) :(deepStockLocation.locRow + 1)) )
// 深库位库存对用的Location信息
var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == productStock.palletInfoCode).FirstOrDefault();
wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1")
.Where(t => t.locDeep == 2 && t.locColumn == deepStockLocation.locColumn)
.Where(t => t.locRow == (deepStockLocation.locRow % 2 == 0 ? (deepStockLocation.locRow - 1) : (deepStockLocation.locRow + 1)))
.FirstOrDefault();
if (wmsBaseLocation != null)
{
@ -306,18 +306,18 @@ namespace Khd.Core.Wcs.Wcs
// }
// }
//}
if(wmsBaseLocation == null)
if (wmsBaseLocation == null)
{ // 在所有符合条件的库位里,找一个库位,优先深库位,但是如果是深库位,需要判断浅库位状态是否正常
var searchLocations = wmsBaseLocations.Where(x => string.IsNullOrEmpty(x.containerCode) && x.locationStatus == "1").OrderBy(x=>x.locDeep).ToList();
var searchLocations = wmsBaseLocations.Where(x => string.IsNullOrEmpty(x.containerCode) && x.locationStatus == "1").OrderBy(x => x.locDeep).ToList();
foreach (var item in searchLocations)
{
if(item.locDeep == 1)
if (item.locDeep == 1)
{
//浅库位能否使用
var shallowLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1")
.Where(t => t.locDeep == 2 && t.locColumn == item.locColumn)
.Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1)))
.FirstOrDefault();
var shallowLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1")
.Where(t => t.locDeep == 2 && t.locColumn == item.locColumn)
.Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1)))
.FirstOrDefault();
if (shallowLocation != null)
{
wmsBaseLocation = item;
@ -326,16 +326,15 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
wmsBaseLocation = item;
break;
wmsBaseLocation = item;
break;
}
}
}
if (wmsBaseLocation != null)//如果找到库位,生成入库任务
{
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 37);
var wcsTask = new WcsTask()
{

@ -50,7 +50,9 @@ namespace Khd.Core.Wcs.Wcs
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 2);//二楼接驳位
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8);//二楼叉车
BaseEquip tsjEquip = StaticData.BaseEquip.First(t => t.objid == 6);//提升机
var PalletInIsHas2FPoint = StaticData.BasePlcpointList.First(t => t.id == 74);
var agvPutPoint = StaticData.BasePlcpointList.First(t => t.id == 54);//二楼小包入口点位
var ConnectStatus2FPoint = StaticData.BasePlcpointList.First(t => t.id == 73);
while (true)
{
try
@ -58,6 +60,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
//入库任务
var rfid = StaticData.PlcDic[0].ReadRFID(LineRFID.plcpointAddress);
//2F托盘库产线数据通讯情况
var isSignal = StaticData.PlcDic[0].Read(LineSignal.plcpointAddress);
if (rfid != null && isSignal != null)
@ -73,9 +76,13 @@ namespace Khd.Core.Wcs.Wcs
if (wcsTask.taskStatus == 5 && (wcsTask.nextPointId == 6 || wcsTask.nextPointId == 2))//入托盘入口,提升机任务是完成状态
{
object? agvPutValue = null;
object? PalletInIsHas2F = null;
object? ConnectStatus2F = null;
try
{
ConnectStatus2F = StaticData.PlcDic[2].Read(ConnectStatus2FPoint.plcpointAddress);//2F托盘库产线数据通讯情况
agvPutValue = StaticData.PlcDic[2].Read(agvPutPoint.plcpointAddress);
PalletInIsHas2F = StaticData.PlcDic[2].Read(PalletInIsHas2FPoint.plcpointAddress);//2F托盘库入口上料光电
}
catch
{
@ -84,7 +91,7 @@ namespace Khd.Core.Wcs.Wcs
if (wcsTask.taskType != 99)//不是人工任务
{
bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == inEquip.objid).Any();
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask)//小包入口要料
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask && Convert.ToInt32(PalletInIsHas2F) == 0 && Convert.ToInt32(ConnectStatus2F) == 1)//小包入口要料
{
dbContext.WcsTask.Remove(wcsTask);//删除原本的任务
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
@ -110,7 +117,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0);//二楼周转位
BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.useFlag == 1 && t.equipStatus == 0 && t.emptyCount == 0);//二楼周转位
if (endEquip != null)
{
dbContext.WcsTask.Remove(wcsTask);//删除原本的任务
@ -142,7 +149,7 @@ namespace Khd.Core.Wcs.Wcs
if (wcsTask.endPointId == 36)//目的地是小包入口
{
bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == inEquip.objid).Any();
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask)//小包入口要料
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask&& Convert.ToInt32(PalletInIsHas2F) == 0 && Convert.ToInt32(ConnectStatus2F) == 1)//小包入口要料
{
dbContext.WcsTask.Remove(wcsTask);
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);

@ -538,12 +538,21 @@ namespace Khd.Core.Wpf.Form
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
List<WmsRawOutstock> wmsRawOutstocks = dbContext.WmsRawOutstock.Where(t => endStationCodes.Contains(t.endStationCode))
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
List<WmsRawOutstock> wmsRawOutstocks = dbContext.WmsRawOutstock
.Where(t => endStationCodes.Contains(t.endStationCode))
.Where(t => t.auditStatus == "1")
.Where(t => t.executeStatus == "0" || t.executeStatus == "1")
.Where(t => t.outstockAmount > t.realOutstockAmount)
.ToList();
List<string> list = wmsRawOutstocks.Select(t => t.endStationCode).ToList();
Dispatcher.Invoke(() =>
{
this.OutOrder.Text = "待出库单:\n" + list.Distinct().Join("\n");
});
wmsRawOutstocks = wmsRawOutstocks
.Where(t => baseEquip.endStationCode.Contains(t.endStationCode))
.ToList();
List<long?> orderIds = wmsRawOutstocks.Select(t => t.rawOutstockId).ToList();
var endStations = wmsRawOutstocks.Select(t => new
{
@ -551,7 +560,6 @@ namespace Khd.Core.Wpf.Form
t.materialId,
t.endStationCode
});
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
string nowStationCode = baseEquip.endStationCode;
if (!string.IsNullOrEmpty(nowStationCode))
{
@ -569,10 +577,7 @@ namespace Khd.Core.Wpf.Form
//SelectOutButton.IsEnabled = true;
});
}
Dispatcher.Invoke(() =>
{
this.OutOrder.Text = "待出库单:\n" + list.Distinct().Join("\n");
});
if (!string.IsNullOrEmpty(baseEquip.endStationCode))
@ -2763,11 +2768,11 @@ namespace Khd.Core.Wpf.Form
// 没有申请单
// 如果选中了出库单,并且无需要出库的申请单,则禁止出库
if (!string.IsNullOrEmpty(baseEquip.endStationCode))
{
scanOutMsg.Text = "申请单里该条码无需出库!";
return;
}
//if (!string.IsNullOrEmpty(baseEquip.endStationCode))
//{
// scanOutMsg.Text = "申请单里该条码无需出库!";
// return;
//}
if (wmsRawStock.safeFlag != "1")
{
scanOutMsg.Text = "该条码不是安全库存,且无申请单,禁止出库!";

Loading…
Cancel
Save