You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2605 lines
187 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Khd.Core.Domain.Dto.TaskType;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Wcs.Global;
using Masuit.Tools;
using Microsoft.CodeAnalysis;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SixLabors.ImageSharp;
using System.Data;
using System.Linq;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
{
/// <summary>
/// 根据出入库记录创建出入库任务
/// </summary>
public class CreateTaskByRecord
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost _host;
public CreateTaskByRecord(IHost host)
{
this._host = host;
}
/// <summary>
/// 启动上件扫描监听
/// </summary>
public void StartPoint()
{
//var createRemoveThread = new Thread(CreateRemoveLogic);
//createRemoveThread.IsBackground = true;
//createRemoveThread.Name = "CreateRemoveLogic";
//createRemoveThread.Start();
//背负式Agv返库任务
var createBearAgvReturnThread = new Thread(CreateBearAgvReturnLogic);
createBearAgvReturnThread.IsBackground = true;
createBearAgvReturnThread.Name = "CreateBearAgvReturnLogic";
createBearAgvReturnThread.Start();
//五楼半成品入库任务
var createFiveProductInTaskThread = new Thread(CreateFiveProductInTaskLogic);
createFiveProductInTaskThread.IsBackground = true;
createFiveProductInTaskThread.Name = "CreateFiveProductInTaskLogic";
createFiveProductInTaskThread.Start();
//五楼成品出库任务
var createFiveProductTaskThread = new Thread(CreateFiveProductTaskLogic);
createFiveProductTaskThread.IsBackground = true;
createFiveProductTaskThread.Name = "CreateFiveProductTaskLogic";
createFiveProductTaskThread.Start();
//五楼CTU出库任务以及原材料出库任务
var createRawTaskThread = new Thread(CreateRawTaskLogic);
createRawTaskThread.IsBackground = true;
createRawTaskThread.Name = "CreateRawTaskLogic";
createRawTaskThread.Start();
//五楼柜体拆分返库任务
var createRawInThread = new Thread(CreateRawInTaskLogic);
createRawInThread.IsBackground = true;
createRawInThread.Name = "CreateRawInTaskLogic";
createRawInThread.Start();
//三楼去翻转机任务
var createThirdOutTaskThread = new Thread(CreateThirdOutTaskLogic);
createThirdOutTaskThread.IsBackground = true;
createThirdOutTaskThread.Name = "CreateThirdOutTaskLogic";
createThirdOutTaskThread.Start();
//二楼成品出库任务
var CreateSecondProductTaskThread = new Thread(CreateSecondProductTaskLogic);
CreateSecondProductTaskThread.IsBackground = true;
CreateSecondProductTaskThread.Name = "CreateSecondProductTaskLogic";
CreateSecondProductTaskThread.Start();
//三楼托盘收集架满5个或10个时出库合盘任务
var createEmptyTrayThread = new Thread(CreateEmptyTrayLogic);
createEmptyTrayThread.IsBackground = true;
createEmptyTrayThread.Name = "CreateEmptyTrayLogic";
createEmptyTrayThread.Start();
//二楼废品区人工调度任务
var createThirdWasterTaskThread = new Thread(CreateThirdWasterTaskLogic);
createThirdWasterTaskThread.IsBackground = true;
createThirdWasterTaskThread.Name = "CreateThirdWasterTaskLogic";
createThirdWasterTaskThread.Start();
//背负式退库
var BackReturnTaskThread = new Thread(BackReturnTaskLogic);
BackReturnTaskThread.IsBackground = true;
BackReturnTaskThread.Name = "BackReturnTaskLogic";
BackReturnTaskThread.Start();
Console.WriteLine(DateTime.Now + ":出库任务监听启动成功");
_logger.Info("出库任务监听启动成功");
}
/// <summary>
/// 主动移库
/// </summary>
/// <param name="obj"></param>
private void CreateRemoveLogic(object? obj)
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
List<string> cannotIn = new List<string>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var CanRemoveWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.locationStatus == "7").ToList();
List<string> locationCodes = CanRemoveWmsBaseLocations.Select(t => t.locationCode).ToList();
List<WmsProductStock> CanRemoveWmsProductStocks = dbContext.WmsProductStock.Where(t => locationCodes.Contains(t.locationCode)).ToList();
foreach (var wmsProductStock in CanRemoveWmsProductStocks)
{
BaseEquip? agvEquip = null;
if (wmsProductStock.warehouseId == 531)
{
agvEquip = StaticData.BaseEquip.First(t => t.objid == 28);
}
else if (wmsProductStock.warehouseId == 231)
{
agvEquip = StaticData.BaseEquip.First(t => t.objid == 8);
}
if (agvEquip != null)
{
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == agvEquip.objid).Any();
if (!hasTask)
{
WmsBaseLocation fromLocationCode = CanRemoveWmsBaseLocations.First(t => t.locationCode == wmsProductStock.locationCode);
if (wmsProductStock.warehouseId == 531 || wmsProductStock.warehouseId == 231)//成品移库
{
var wmsBaseLocations = dbContext.WmsBaseLocation
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.Where(t => t.warehouseId == wmsProductStock.warehouseId)
.ToList();//所有可用库位
var wmsProductStocks = dbContext.WmsProductStock
.Where(t => t.warehouseId == wmsProductStock.warehouseId)
.ToList();//仓库的库存
WmsBaseLocation? wmsBaseLocation = null;
if (wmsBaseLocations.Count > 0)
{
List<string> containerCodes = wmsBaseLocations
.Where(t => t.locDeep == 1)
.Select(t => t.containerCode).ToList();//深库位的有托盘
List<MesBaseBarcodeInfo> mesBasePalletInfos = dbContext.MesBaseBarcodeInfo
.Where(t => t.saleOrderId == (wmsProductStock.saleOrderId == null ? 0 : wmsProductStock.saleOrderId))//销售订单
.Where(t => t.materialId == wmsProductStock.productId)//物料Id
.Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料
var bill = from a in mesBasePalletInfos
join b in wmsBaseLocations.Where(t => t.locDeep == 1) on a.palletInfoCode equals b.containerCode
select new { b };//等于当前任务的物料的托盘的库位信息
var outBill = from a in bill//深库位托盘和当前任务绑定物料一致的托盘库位
from b in wmsBaseLocations//所有库位
where b.locDeep == 2//浅库位
&& b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1)
//如果是4则找3如果是1则找2
&& a.b.locColumn == b.locColumn//列数相同
&& string.IsNullOrEmpty(b.containerCode)
select new { a, b };//在上面的基础上获取对应托盘的外侧库位的空库位信息
wmsBaseLocation ??= outBill.Where(t => !cannotIn.Contains(t.b.locationCode)).FirstOrDefault()?.b;//先找相同物料的外侧库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => !cannotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => !cannotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位
if (wmsBaseLocation != null)//如果找到库位,生成入库任务
{
if (wmsBaseLocation.locDeep == 1)
{
bool hasLocation = wmsBaseLocations
.Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1)))
.Where(t => t.locColumn == wmsBaseLocation.locColumn)
.Any();
if (!hasLocation)
{
cannotIn.Add(wmsBaseLocation.locationCode);
Console.WriteLine(DateTime.Now + $":目标库位{cannotIn.Join(",")}的浅库位库位状态异常,无法移库");
_logger.Info($"目标库位{cannotIn.Join(",")}的浅库位库位状态异常,无法移库");
continue;
}
}
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
currPointId = fromLocationCode.locationId,
currPointNo = fromLocationCode.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = wmsBaseLocation.locationId,
endPointNo = wmsBaseLocation.locationCode,
taskStatus = 0,
useFlag = 1,
containerNo = wmsProductStock.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now,
isEmpty = "0",
taskType = agvEquip.objid == 28 ? StaticTaskType.FiveRemove : StaticTaskType.SecondRemove,
qty = 1,
};
fromLocationCode.locationStatus = "4";
dbContext.Update(fromLocationCode);
wmsBaseLocation.locationStatus = "4";
dbContext.Update(wmsBaseLocation);
dbContext.Add(wcsTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
cannotIn.Clear();
Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid);
_logger.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid);
}
else
{
//报警
}
}
}
}
}
}
List<WmsRawStock> wmsRawStocks = dbContext.WmsRawStock.Where(t => locationCodes.Contains(t.locationCode)).ToList();
foreach (var wmsRawStock in wmsRawStocks)
{
WmsBaseLocation fromLocationCode = CanRemoveWmsBaseLocations.First(t => t.locationCode == wmsRawStock.locationCode);
if (wmsRawStock.warehouseId == 511 || wmsRawStock.warehouseId == 311)
{
BaseEquip? agvEquip = null;
if (wmsRawStock.warehouseId == 511)
{
agvEquip = StaticData.BaseEquip.First(t => t.objid == 28);
}
else if (wmsRawStock.warehouseId == 311)
{
agvEquip = StaticData.BaseEquip.First(t => t.objid == 9);
}
if (agvEquip != null)
{
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == agvEquip.objid).Any();
if (!hasTask)
{
var wmsBaseLocations = dbContext.WmsBaseLocation
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.Where(t => t.warehouseId == wmsRawStock.warehouseId)
.ToList();//所有可用库位
var wmsProductStocks = dbContext.WmsRawStock
.Where(t => t.warehouseId == wmsRawStock.warehouseId)
.ToList();//仓库的库存
WmsBaseLocation? wmsBaseLocation = null;
if (wmsBaseLocations.Count > 0)
{
List<string> containerCodes = wmsBaseLocations
.Where(t => t.locDeep == 1)
.Select(t => t.containerCode).ToList();//深库位的有托盘
List<MesBaseBarcodeInfo> mesBasePalletInfos = dbContext.MesBaseBarcodeInfo
.Where(t => t.saleOrderId == (wmsRawStock.saleOrderId == null ? 0 : wmsRawStock.saleOrderId))//销售订单
.Where(t => t.materialId == wmsRawStock.materialId)//物料Id
.Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料
var bill = from a in mesBasePalletInfos
join b in wmsBaseLocations.Where(t => t.locDeep == 1) on a.palletInfoCode equals b.containerCode
select new { b };//等于当前任务的物料的托盘的库位信息
var outBill = from a in bill//深库位托盘和当前任务绑定物料一致的托盘库位
from b in wmsBaseLocations//所有库位
where b.locDeep == 2//浅库位
&& b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1)
//如果是4则找3如果是1则找2
&& a.b.locColumn == b.locColumn//列数相同
&& string.IsNullOrEmpty(b.containerCode)
select new { a.b };//在上面的基础上获取对应托盘的外侧库位的空库位信息
wmsBaseLocation ??= outBill.FirstOrDefault()?.b;//先找相同物料的外侧库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位
if (wmsBaseLocation != null)//如果找到库位,生成入库任务
{
if (wmsBaseLocation.locDeep == 1)
{
bool hasLocation = wmsBaseLocations
.Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1)))
.Where(t => t.locColumn == wmsBaseLocation.locColumn)
.Any();
if (!hasLocation)
{
Console.WriteLine(DateTime.Now + $":目标库位{wmsBaseLocation.locationCode}的浅库位库位状态异常,无法移库");
_logger.Info($"目标库位{wmsBaseLocation.locationCode}的浅库位库位状态异常,无法移库");
continue;
}
}
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
currPointId = fromLocationCode.locationId,
currPointNo = fromLocationCode.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = wmsBaseLocation.locationId,
endPointNo = wmsBaseLocation.locationCode,
taskStatus = 0,
useFlag = 1,
containerNo = wmsRawStock.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now,
isEmpty = "0",
taskType = agvEquip.objid == 28 ? StaticTaskType.FiveRemove : StaticTaskType.ThirdRemove,
qty = 1,
};
fromLocationCode.locationStatus = "4";
dbContext.Update(fromLocationCode);
wmsBaseLocation.locationStatus = "4";
dbContext.Update(wmsBaseLocation);
dbContext.Add(wcsTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid);
_logger.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid);
}
else
{
//报警
}
}
}
}
}
}
}
catch
{
}
}
}
/// <summary>
/// 五楼柜体拆分返库任务
/// </summary>
private void CreateRawInTaskLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
List<string> cannotIn = new List<string>();
while (true)
{
try
{
lock (SystemData.FiveTaskLock)
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 29);
if (baseEquip.emptyCount == 1)
{
WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == 28).FirstOrDefault();
if (wcsTask == null)
{
WmsRawInstock? wmsRawInstock = dbContext.WmsRawInstock.Where(t => t.warehouseId == 511 && t.instockType == "2" && t.executeStatus == "0").FirstOrDefault();
if (wmsRawInstock != null)
{
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsRawInstock.palletInfoCode);
if (mesBasePalletInfo != null)
{
MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode);
if (mesBaseBarcodeInfo != null)
{
var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == 5)
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.warehouseId == 511)
.Where(t => t.locationStatus == "1")
.OrderByDescending(t => t.locColumn)
.ToList();
List<string> containerCodes = wmsBaseLocations
.Where(t => t.locDeep == 1)
.Select(t => t.containerCode).ToList();//深库位的托盘
containerCodes.RemoveAll(t => string.IsNullOrEmpty(t));
List<MesBaseBarcodeInfo> mesBasePalletInfos = dbContext.MesBaseBarcodeInfo
.Where(t => t.materialId == mesBasePalletInfo.materialId)
.Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId)
.Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料
var bill = from a in mesBasePalletInfos
join b in wmsBaseLocations.Where(t => t.locDeep == 1 && t.returnFlag == "1") on a.palletInfoCode equals b.containerCode
select new { b };//等于当前任务的物料的托盘的库位信息
var outBill = from a in bill
from b in wmsBaseLocations
where b.locDeep == 2
&& b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1)
&& a.b.locColumn == b.locColumn
&& b.locationStatus == "1"
&& string.IsNullOrEmpty(b.containerCode)
select new { a, b };//在上面的基础上获取对应托盘的外侧库位的空库位信息
WmsBaseLocation? wmsBaseLocation = null;
wmsBaseLocation ??= outBill.Where(t => !cannotIn.Contains(t.b.locationCode)).FirstOrDefault()?.b;//先找相同物料的外侧库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => !cannotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => !cannotIn.Contains(t.locationCode)).Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位
//深浅库位问题?库位入库优先级等
var AgvEquip = StaticData.BaseEquip.First(t => t.objid == 28);//5楼叉车
if (wmsBaseLocation != null)
{
if (wmsBaseLocation.locDeep == 1)
{
bool hasLocation = wmsBaseLocations
.Where(t => t.locRow == (wmsBaseLocation.locRow % 2 == 1 ? (wmsBaseLocation.locRow + 1) : (wmsBaseLocation.locRow - 1)))
.Where(t => t.locColumn == wmsBaseLocation.locColumn).Any();
if (!hasLocation)
{
cannotIn.Add(wmsBaseLocation.locationCode);
Console.WriteLine(DateTime.Now + $":目标库位{cannotIn.Join(",")}的浅库位库位状态异常,无法入库");
_logger.Info($"目标库位{cannotIn.Join(",")}的浅库位库位状态异常,无法入库");
continue;
}
}
WcsTask newTask = new WcsTask();
newTask.taskStatus = 0;//创建状态
newTask.updateTime = DateTime.Now;
newTask.currPointId = baseEquip.objid;
newTask.currPointNo = baseEquip.equipNo;
newTask.nextPointId = AgvEquip.objid;
newTask.nextPointNo = AgvEquip.equipNo;
newTask.endPointId = wmsBaseLocation.locationId;
newTask.endPointNo = wmsBaseLocation.locationCode;
newTask.containerNo = mesBasePalletInfo.palletInfoCode;
newTask.materialId = mesBasePalletInfo.materialId;
newTask.objid = StaticData.SnowId.NextId();
newTask.createTime = DateTime.Now;
newTask.taskType = StaticTaskType.FiveRawSplitReturn;
newTask.useFlag = 1;
wmsBaseLocation.locationStatus = "2";
WmsRawInstockDetail wmsRawInstockDetail = new WmsRawInstockDetail
{
rawInstockDetailId = StaticData.SnowId.NextId(),
stackAmount = 1,
erpStatus = "0",
executeStatus = "1",
qualityStatus = "0",
activeFlag = "1",
createBy = "WCS",
createDate = DateTime.Now,
erpAmount = 0,
instockAmount = 1,
instockBatch = mesBasePalletInfo.materialBarcode,
instockTime = DateTime.Now,
instockWay = "2",
locationCode = newTask.endPointNo,
machineName = mesBaseBarcodeInfo.machineName,
materialBarcode = mesBasePalletInfo.materialBarcode,
materialId = mesBaseBarcodeInfo.materialId,
materialProductionDate = mesBaseBarcodeInfo.productionDate,
planAmount = 1,
poNo = mesBaseBarcodeInfo.poNo,
rawInstockId = wmsRawInstock.rawInstockId,
taskCode = wmsRawInstock.taskCode,
};
SystemData.LockOutLocation(wmsBaseLocation, dbContext);
dbContext.Add(wmsRawInstockDetail);
dbContext.Update(wmsBaseLocation);
dbContext.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
cannotIn.Clear();
}
}
}
}
}
}
}
}
catch (Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 根据人工任务生成可执行任务
/// </summary>
/// <param name="obj"></param>
private void CreateThirdWasterTaskLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 9).Any();
if (!hasTask)
{
WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.nextPointId == 9 || t.nextPointId == 8).OrderBy(t => t.createBy).FirstOrDefault();
if (wcsTaskManual != null)
{
var equip = dbContext.BaseEquip.Where(t => t.objid == wcsTaskManual.endPointId).FirstOrDefault();
if (equip != null && equip.equipStatus == 0)
{
WcsTask wcsTask = CoreMapper.Map<WcsTask>(wcsTaskManual);
wcsTask.createTime = DateTime.Now;
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.Remove(wcsTaskManual);
dbContext.SaveChanges();
}
}
}
}
catch (Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 3楼托盘库出库任务
/// </summary>
/// <param name="obj"></param>
private void CreateEmptyTrayLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 9);
while (true)
{
try
{
bool isCreate = false;
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
bool canCreate = dbContext.WcsTask.Where(t => t.nextPointId == 9)
.Where(t => t.useFlag == 1)
.Where(t => t.taskStatus <= 6).Any();
if (!canCreate)
{
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 35);
#region 原逻辑
//if (baseEquip.emptyCount == (SystemData.maxTray / 2))
//{
// var endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 1 && t.emptyCount == (SystemData.maxTray / 2));
// if (endEquip != null)
// {
// var wcsTask = new WcsTask()
// {
// objid = StaticData.SnowId.NextId(),
// serialNo = SystemData.GetSerialNo(dbContext),
// taskType = 40,
// nextPointId = agvEquip.objid,
// nextPointNo = agvEquip.equipNo,
// endPointId = baseEquip.objid,
// endPointNo = baseEquip.equipNo,
// currPointId = endEquip.objid,
// currPointNo = endEquip.equipNo,
// equipmentNo = agvEquip.equipNo,
// useFlag = 1,
// qty = 5,
// isEmpty = "1",
// taskStatus = 0,
// createBy = "WCS",
// createTime = DateTime.Now,
// floorNo = 3,
// fromFloorNo = 3,
// masterId = 0,
// orderId = 0,
// materialId = 0,
// };
// WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
// dbContext.Add(wcsTask);
// dbContext.Add(wcsTaskLog);
// dbContext.SaveChanges();
// }
// else
// {
// endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 0 && t.emptyCount == 0);
// if (endEquip != null)
// {
// var wcsTask = new WcsTask()
// {
// objid = StaticData.SnowId.NextId(),
// serialNo = SystemData.GetSerialNo(dbContext),
// taskType = 43,
// nextPointId = agvEquip.objid,
// nextPointNo = agvEquip.equipNo,
// endPointId = endEquip.objid,
// endPointNo = endEquip.equipNo,
// currPointId = baseEquip.objid,
// currPointNo = baseEquip.equipNo,
// equipmentNo = agvEquip.equipNo,
// useFlag = 1,
// qty = 5,
// isEmpty = "1",
// taskStatus = 0,
// createBy = "WCS",
// createTime = DateTime.Now,
// floorNo = 3,
// fromFloorNo = 3,
// masterId = 0,
// orderId = 0,
// materialId = 0,
// };
// WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
// dbContext.Add(wcsTask);
// dbContext.Add(wcsTaskLog);
// dbContext.SaveChanges();
// }
// }
//}
//else
#endregion
if (baseEquip.emptyCount == SystemData.maxTray)//达到最大值
{
var endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 0 && t.emptyCount == 0);//找周转区
if (endEquip != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
serialNo = SystemData.GetSerialNo(dbContext),
taskType = StaticTaskType.ThirdBinToTransit,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
currPointId = baseEquip.objid,
currPointNo = baseEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = SystemData.maxTray,
isEmpty = "1",
taskStatus = 0,
createBy = "WCS",
createTime = DateTime.Now,
floorNo = 3,
fromFloorNo = 3,
masterId = 0,
orderId = 0,
materialId = 0,
};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
isCreate = true;
}
}
if (!isCreate)
{
var emptyEquip = dbContext.BaseEquip.Where(t => t.equipType == 15).Where(t => t.emptyCount == SystemData.maxTray).ToList();
var secondEmptyEquip = dbContext.BaseEquip.Where(t => t.equipType == 20).Where(t => t.emptyCount == 0).ToList();
if (emptyEquip.Count >= 2 && secondEmptyEquip.Count >= 4)//二楼空库位多余4个三楼空库位大于4个
{
BaseEquip startEquip = emptyEquip.First();
WcsTask wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
serialNo = SystemData.GetSerialNo(dbContext),
taskType = StaticTaskType.ThirdTransitToSecond,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
currPointId = startEquip.objid,
currPointNo = startEquip.equipNo,
endPointId = secondEmptyEquip.First().objid,
endPointNo = secondEmptyEquip.First().equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = startEquip.emptyCount,
isEmpty = "1",
taskStatus = 0,
createBy = "WCS",
createTime = DateTime.Now,
floorNo = 2,
fromFloorNo = 3,
masterId = 0,
orderId = 0,
materialId = 0,
};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else if (emptyEquip.Count == 3 && secondEmptyEquip.Count >= 2)
{
BaseEquip startEquip = emptyEquip.First();
WcsTask wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
serialNo = SystemData.GetSerialNo(dbContext),
taskType = StaticTaskType.ThirdTransitToSecond,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
currPointId = startEquip.objid,
currPointNo = startEquip.equipNo,
endPointId = secondEmptyEquip.First().objid,
endPointNo = secondEmptyEquip.First().equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = startEquip.emptyCount,
isEmpty = "1",
taskStatus = 0,
createBy = "WCS",
createTime = DateTime.Now,
floorNo = 2,
fromFloorNo = 3,
masterId = 0,
orderId = 0,
materialId = 0,
};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
//报警
}
}
}
}
catch (Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 背负式Agv退库
/// </summary>
private void BackReturnTaskLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
if (baseEquip.IsOut == 2 && !string.IsNullOrEmpty(baseEquip.endStationCode))
{
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 10).Any();
if (!hasTask)
{
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.endStationCode == baseEquip.endStationCode);
List<WmsRawReturn> wmsRawReturns = dbContext.WmsRawReturn.Where(t => t.endStationCode == baseEquip.endStationCode)
.Where(t => t.auditStatus == "1")
.Where(t => t.executeStatus == "0" || t.executeStatus == "1")
.ToList();
wmsRawReturns.ForEach(t => t.executeStatus = "1");
dbContext.UpdateRange(wmsRawReturns);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 21);
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
serialNo = SystemData.GetSerialNo(dbContext),
taskType = 48,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
currPointId = startEquip.objid,
currPointNo = startEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
equipmentNo = baseEquip.equipNo,
useFlag = 1,
qty = 1,
taskStatus = 0,
containerNo = "",
IsDelete = 0,
createTime = DateTime.Now,
};
baseEquip.IsOut = 0;
dbContext.Update(baseEquip);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
}
catch (Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 半成品入库
/// </summary>
/// <param name="obj"></param>
private void CreateFiveProductInTaskLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 30);
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
bool task = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.useFlag == 1 && t.taskStatus <= 5).Any();
if (!task)
{
var wmsProductInstock = dbContext.WmsProductInstock
.Where(t => t.productType == "2")
.Where(t => t.auditStatus == "1" && t.executeStatus == "0")
.Where(t => t.warehouseId == 521)
.FirstOrDefault();
if (wmsProductInstock != null)
{
var wmsBaseLocation = dbContext.WmsBaseLocation
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.Where(t => t.containerCode == null)
.Where(t => t.warehouseId == 521)
.OrderByDescending(t => t.locColumn)
.FirstOrDefault();
if (wmsBaseLocation != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
serialNo = SystemData.GetSerialNo(dbContext),
taskType = StaticTaskType.FiveHalfIn,
endPointId = wmsBaseLocation.locationId,
endPointNo = wmsBaseLocation.locationCode,
currPointId = endEquip.objid,
currPointNo = endEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = 1,
containerNo = wmsProductInstock.palletInfoCode,
taskStatus = 0,
createBy = "WCS",
createTime = DateTime.Now,
floorNo = 5,
fromFloorNo = 5,
isEmpty = "0",
masterId = wmsProductInstock.productId,
orderId = wmsProductInstock.productInstockId,
materialId = wmsProductInstock.productId,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
materialBarcode = wmsProductInstock.productBatch,
};
//WmsProductInstockDetail wmsProductInstockDetail = new WmsProductInstockDetail()
//{
// erpAmount = 0,
// productId = wmsProductInstock.productId,
// executeStatus = "1",
// productInstockDetailId = StaticData.SnowId.NextId(),
// instockAmount = 1,
// instockBy = "WCS",
// instockDate = DateTime.Now,
// instockWay = "2",
// locationCode = wmsBaseLocation.locationCode,
// planAmount = 1,
// productBarcode = wmsProductInstock.productBatch,
// productBatch = wmsProductInstock.productBatch,
// productInstockId = wmsProductInstock.productInstockId,
//};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
wmsProductInstock.executeStatus = "1";
wmsBaseLocation.locationStatus = "2";
//dbContext.Add(wmsProductInstockDetail);
dbContext.Update(wmsProductInstock);
dbContext.Update(wmsBaseLocation);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
//报警
}
}
}
}
catch (Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 创建去翻转机的任务
/// </summary>
/// <param name="obj"></param>
/// <exception cref="NotImplementedException"></exception>
private void CreateThirdOutTaskLogic()
{
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 31);
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == 9);
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
lock (SystemData.ThirdTaskLock)
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
bool task = dbContext.WcsTask.Where(t => t.nextPointId == 9 && t.taskStatus <= 5).Any();
if (!task)
{
endEquip = dbContext.BaseEquip.First(t => t.objid == 31);
if (endEquip.emptyCount == 0)
{
WcsTask? wcsTask = dbContext.WcsTask.FirstOrDefault(t => t.endPointId == endEquip.objid);
if (wcsTask == null)
{
WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.taskType == 999).FirstOrDefault();//调接口生成的任务
if (wcsTaskManual != null)
{
var wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.rawOutstockId == wcsTaskManual.orderId);
if (wmsRawOutstock != null)
{
var wmsRawStocks = dbContext.WmsRawStock
.Where(t => t.saleOrderId == (wmsRawOutstock.saleOrderId == null ? 0 : wmsRawOutstock.saleOrderId))
.Where(t => t.warehouseId == 311)
.ToList();
var AllWmsBaseLocations = dbContext.WmsBaseLocation
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.warehouseId == 311).ToList();
var wmsBaseLocations = AllWmsBaseLocations
.Where(t => t.warehouseId == 311)
.ToList();
var bill = from a in wmsBaseLocations
from b in wmsRawStocks
where a.locationCode == b.locationCode
select new { a, b };
WmsBaseLocation? wmsBaseLocation = null;
WmsRawStock? wmsRawStock = null;
bill = bill.OrderBy(t => t.b.instockDate.Value.Date);//按某个时间段
foreach (var item in bill)
{
var fistbill = bill.First();
if (fistbill != null)
{
int? locRow = 0;
if (fistbill.a.locRow % 2 == 1)
{
locRow = fistbill.a.locRow + 1;
}
else
{
locRow = fistbill.a.locRow - 1;
}
var lastbill = bill.Where(t => t.a.locRow == locRow)
.Where(t => t.a.locColumn == fistbill.a.locColumn)
.Where(t => t.a.locDeep == 2)
.FirstOrDefault();
wmsBaseLocation = fistbill.a;
if (lastbill != null)
{
if (lastbill.b.instockDate != null && fistbill.b.instockDate != null)
{
if (wmsBaseLocation.locDeep == 1)
{
int? row = 0;
if (wmsBaseLocation.locRow % 2 == 1)
{
row = wmsBaseLocation.locRow + 1;
}
else
{
row = wmsBaseLocation.locRow - 1;
}
var lowLocationBill = bill.Where(t => t.a.locRow == locRow).Where(t => t.a.locColumn == wmsBaseLocation.locColumn).Where(t => t.a.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault();
if (lowLocationBill != null)
{
wmsBaseLocation = lowLocationBill.a;
}
else
{
WmsBaseLocation? fromBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == row)
.Where(t => t.locColumn == wmsBaseLocation.locColumn)
.Where(t => t.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault();
if (fromBaseLocation != null && !string.IsNullOrEmpty(fromBaseLocation.containerCode))
{
WmsRawStock? wmsRawStock1 = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == fromBaseLocation.locationCode);
if (wmsRawStock1 != null)
{
WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.Where(t => t.locColumn > wmsBaseLocation.locColumn)
.OrderBy(t => t.locColumn)
.FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.Where(t => t.locColumn < wmsBaseLocation.locColumn)
.OrderByDescending(t => t.locColumn)
.FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.warehouseId != wmsBaseLocation.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.FirstOrDefault();
if (toLocation != null)
{
if (toLocation.locDeep == 1)
{
bool hasLocation = AllWmsBaseLocations
.Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1)))
.Where(t => t.locColumn == toLocation.locColumn)
.Any();
if (!hasLocation)
{
Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
_logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
continue;
}
}
var RemoveTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
taskType = StaticTaskType.ThirdRemove,
containerNo = wmsRawStock1.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now.AddSeconds(-10),
taskStatus = 0,
currPointId = fromBaseLocation.locationId,
currPointNo = fromBaseLocation.locationCode,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = toLocation.locationId,
endPointNo = toLocation.locationCode,
equipmentNo = baseEquip.equipNo,
useFlag = 1,
qty = 1
};
SystemData.LockOutLocation(toLocation, dbContext);
SystemData.LockOutLocation(fromBaseLocation, dbContext);
toLocation.locationStatus = "4";
toLocation.updateBy = "WCS";
toLocation.updateTime = DateTime.Now;
fromBaseLocation.updateBy = "WCS";
fromBaseLocation.updateTime = DateTime.Now;
fromBaseLocation.locationStatus = "4";
dbContext.Update(toLocation);
dbContext.Update(fromBaseLocation);
dbContext.Add(RemoveTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(RemoveTask);
dbContext.Add(wcsTaskLog);
}
else
{
continue;
}
}
else
{
continue;
}
}
}
}
}
}
if (wmsBaseLocation != null)
{
wmsRawStock = wmsRawStocks.Where(t => t.locationCode == wmsBaseLocation.locationCode).First();
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsRawStock.palletInfoCode);
if (mesBasePalletInfo != null)
{
MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode);
if (mesBaseBarcodeInfo != null)
{
WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail()
{
rawOutstockDetailId = StaticData.SnowId.NextId(),
createBy = "WCS",
createDate = DateTime.Now,
executeStatus = "0",
erpAmount = 0,
erpStatus = "0",
instockBatch = mesBaseBarcodeInfo.batchCode,
stackAmount = 1,
locationCode = wmsBaseLocation.locationCode,
rawOutstockId = wmsRawOutstock.rawOutstockId,
planAmount = 1,
outstockWay = "2",
outstockPerson = "WCS",
outstockTime = DateTime.Now,
materialProductionDate = mesBaseBarcodeInfo.productionDate,
materialBarcode = mesBasePalletInfo.materialBarcode,
materialId = wmsRawOutstock.materialId,
machineName = mesBaseBarcodeInfo.machineName,
outstockAmount = 1,
taskCode = wmsRawOutstock.taskCode
};
wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = wmsRawOutstock.rawOutstockId,
taskType = StaticTaskType.ThirdRawToFlip,
containerNo = wmsRawStock.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = wmsRawOutstock.materialId,
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.locationCode,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
equipmentNo = endEquip.equipNo,
useFlag = 1,
qty = 1
};
SystemData.LockOutLocation(wmsBaseLocation, dbContext);
wmsBaseLocation.locationStatus = "6";
dbContext.Update(wmsBaseLocation);
dbContext.Add(wmsRawOutstockDetail);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Remove(wcsTaskManual);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
}
}
}
}
}
}
}
}
}
}
catch (Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{
Thread.Sleep(5000);
}
}
}
/// <summary>
/// 创建返库任务
/// </summary>
/// <param name="obj"></param>
private void CreateBearAgvReturnLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 21);
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
if (!string.IsNullOrEmpty(baseEquip.endStationCode) && baseEquip.ud3 == "1")
{
var wmsRawReturn = dbContext.WmsRawReturn
.Where(t => t.auditStatus == "1")
.Where(t => t.executeStatus == "0")
.Where(t => t.endStationCode == baseEquip.endStationCode)
.FirstOrDefault();
if (wmsRawReturn != null)
{
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == baseEquip.objid).Any();
if (!hasTask)
{
//任务未开始Status=0
BaseEquip? startEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == wmsRawReturn.endStationCode);
if (startEquip != null)
{
WcsTask wcsTask = new()
{
objid = StaticData.SnowId.NextId(),
orderId = wmsRawReturn.rawReturnId,
taskType = 48,
containerNo = null,
currPointId = startEquip.objid,
currPointNo = startEquip.equipNo,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
serialNo = SystemData.GetSerialNo(dbContext),
taskStatus = 0,
createTime = DateTime.Now,
createBy = "WCS",
materialId = wmsRawReturn.materialId,
qty = 1,
useFlag = 1,
equipmentNo = startEquip.equipNo,
remark = "装配区返库",
floorNo = 5,
masterId = wmsRawReturn.materialId,
fromFloorNo = 5,
//materialNo = wmsRawReturn.materialBatch,
};
baseEquip.ud3 = null;
dbContext.Update(baseEquip);
dbContext.Add(wcsTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.Update(wmsRawReturn);
dbContext.SaveChanges();
}
}
}
}
}
catch (Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 成品出库
/// </summary>
private void CreateFiveProductTaskLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == 5);
if (lineEquip.equipStatus == 0)
{
bool task = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any();
if (!task)
{
var proStock = dbContext.WmsProductStock
.Where(t => t.warehouseId == 531)
.Where(t => t.activeFlag == "1").ToList();
var proOutStock = dbContext.WmsProductOutstock
.Where(t => t.outstockQty < t.applyQty)
.Where(t => t.auditStatus == "1")
.Where(t => t.warehouseId == 531)
.Where(t => t.productType == "3")
.Where(t => t.executeStatus == "0" || t.executeStatus == "1").ToList();
//获取最早入库时间
foreach (var item in proOutStock)
{
task = dbContext.WcsTask.Where(t => t.nextPointId == 28 && t.taskStatus <= 5).Any();
if (!task)
{
BaseEquip endEquip = dbContext.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
var wmsproStocks = proStock
.Where(t => t.productId == item.productId && t.warehouseId == item.warehouseId)
.Where(t => t.totalAmount > t.frozenAmount)
.Select(t => t.locationCode)
.ToList();
List<WmsBaseLocation> AllWmsBaseLocations = dbContext.WmsBaseLocation
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.Where(t => t.warehouseId == item.warehouseId).ToList();
var wmsBaseLocations = AllWmsBaseLocations
.Where(t => t.warehouseId == item.warehouseId)
.Where(t => wmsproStocks.Contains(t.locationCode))
.ToList();
decimal needNumber = Convert.ToDecimal(item.applyQty - item.outstockQty);
if (needNumber <= 0)
{
item.executeStatus = "2";
dbContext.Update(item);
dbContext.SaveChanges();
continue;
}
var bill = from a in wmsBaseLocations
from b in proStock
where a.locationCode == b.locationCode
select new { a, b };
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28);
foreach (var b in bill)
{
item.executeStatus = "1";
WmsBaseLocation location = b.a;
WmsProductStock stock = b.b;
WcsTask wcsTask;
stock.updateDate = DateTime.Now;
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == stock.palletInfoCode);
if (mesBasePalletInfo != null)
{
if (location.locDeep == 1)
{
int? row = 0;
if (location.locRow % 2 == 1)
{
row = location.locRow + 1;
}
else
{
row = location.locRow - 1;
}
var lowLocationBill = bill.Where(t => t.a.locRow == row).Where(t => t.a.locColumn == location.locColumn).Where(t => t.a.warehouseId == location.warehouseId).FirstOrDefault();
if (lowLocationBill != null)
{
location = lowLocationBill.a;
stock = lowLocationBill.b;
}
else
{
WmsBaseLocation? wmsBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == row)
.Where(t => t.locColumn == location.locColumn)
.Where(t => t.warehouseId == location.warehouseId).FirstOrDefault();
if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1")
{
WmsProductStock? wmsProductStock = dbContext.WmsProductStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode);
if (wmsProductStock != null)
{
WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.warehouseId != location.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.FirstOrDefault();
if (toLocation != null)
{
if (toLocation.locDeep == 1)
{
bool hasLocation = AllWmsBaseLocations
.Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1)))
.Where(t => t.locColumn == toLocation.locColumn)
.Any();
if (!hasLocation)
{
Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
_logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
continue;
}
}
var RemoveTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = item.productOutstockId,
taskType = StaticTaskType.FiveRemove,
containerNo = wmsProductStock.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now.AddSeconds(-10),
taskStatus = 0,
materialId = item.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);
}
else
{
continue;
}
}
else
{
continue;
}
}
else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1")
{
Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库");
_logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库");
continue;
}
}
}
WmsProductOutstockDetail detail = new()
{
productId = item.productId,
productOutstockId = item.productOutstockId,
locationCode = location.locationCode,
executeStatus = "1",
beginTime = DateTime.Now,
warehouseId = item.warehouseId,
erpAmount = 0,
confirmAmount = 0,
outstockAmount = 1,
planAmount = 1,
productBatch = item.productBatch,
productOutstockDetailId = StaticData.SnowId.NextId(),
productBarcode = mesBasePalletInfo.materialBarcode
};
wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = item.productOutstockId,
taskType = StaticTaskType.FiveProductOut,
containerNo = stock.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = item.productId,
currPointId = location.locationId,
currPointNo = location.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = lineEquip.objid,
endPointNo = lineEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = 1
};
SystemData.LockOutLocation(location, dbContext);
location.locationStatus = "6";
location.updateBy = "WCS";
location.updateTime = DateTime.Now;
dbContext.Add(detail);
dbContext.Update(location);
dbContext.Add(wcsTask);
dbContext.Update(stock);
break;
}
}
if (item.beginTime == null)
{
item.beginTime = DateTime.Now;
}
dbContext.Update(item);
dbContext.SaveChanges();
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + ex.StackTrace);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 成品出库
/// </summary>
private void CreateSecondProductTaskLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == 2);
if (lineEquip.equipStatus == 0)
{
bool task = dbContext.WcsTask.Where(t => t.nextPointId == 8 && t.taskStatus <= 7).Any();
if (!task)
{
lock (SystemData.SecondTaskLock)
{
var proStock = dbContext.WmsProductStock
.Where(t => t.warehouseId == 231)
.Where(t => t.activeFlag == "1")
.Where(t => t.totalAmount > t.frozenAmount)
.ToList();
var proOutStock = dbContext.WmsProductOutstock
.Where(t => t.outstockQty < t.applyQty)
.Where(t => t.auditStatus == "1")
.Where(t => t.warehouseId == 231)
.Where(t => t.productType == "3")
.Where(t => t.executeStatus == "0" || t.executeStatus == "1").ToList();
//获取最早入库时间
foreach (var item in proOutStock)
{
var wmsproStocks = proStock
.Where(t => t.productId == item.productId && t.saleOrderId == (item.saleOrderId == null ? 0 : item.saleOrderId) && t.warehouseId == item.warehouseId)
.Select(t => t.locationCode)
.ToList();
List<WmsBaseLocation> AllWmsBaseLocations = dbContext.WmsBaseLocation
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.Where(t => t.warehouseId == item.warehouseId).ToList();
var wmsBaseLocations = AllWmsBaseLocations
.Where(t => t.warehouseId == item.warehouseId)
.Where(t => wmsproStocks.Contains(t.locationCode))
.ToList();
decimal needNumber = Convert.ToDecimal(item.applyQty - item.outstockQty);
if (needNumber <= 0)
{
item.executeStatus = "2";
dbContext.Update(item);
dbContext.SaveChanges();
continue;
}
var bill = from a in wmsBaseLocations
from b in proStock
where a.locationCode == b.locationCode
select new { a, b };
WmsBaseLocation? location = null;
WmsProductStock? stock = null;
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 1);
foreach (var b in bill)
{
item.executeStatus = "1";
location = b.a;
stock = b.b;
WcsTask wcsTask;
stock.updateDate = DateTime.Now;
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == stock.palletInfoCode);
if (mesBasePalletInfo != null)
{
if (location.locDeep == 1)//如果是深库位
{
int? row = 0;
if (location.locRow % 2 == 1)
{
row = location.locRow + 1;
}
else
{
row = location.locRow - 1;
}
var lowLocationBill = bill.Where(t => t.a.locRow == row).Where(t => t.a.locColumn == location.locColumn).Where(t => t.a.warehouseId == location.warehouseId).FirstOrDefault();
if (lowLocationBill != null)
{
location = lowLocationBill.a;
stock = lowLocationBill.b;
}
else
{
WmsBaseLocation? wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == row)
.Where(t => t.locColumn == location.locColumn)
.Where(t => t.warehouseId == location.warehouseId).FirstOrDefault();
if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1")
{
WmsProductStock? wmsProductStock = dbContext.WmsProductStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode);
if (wmsProductStock != null)
{
WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.warehouseId != location.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.FirstOrDefault();
if (toLocation != null)
{
if (toLocation.locDeep == 1)
{
bool hasLocation = AllWmsBaseLocations
.Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1)))
.Where(t => t.locColumn == toLocation.locColumn)
.Any();
if (!hasLocation)
{
Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
_logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
continue;
}
}
var RemoveTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = item.productOutstockId,
taskType = StaticTaskType.SecondRemove,
containerNo = wmsBaseLocation.containerCode,
createBy = "WCS",
createTime = DateTime.Now.AddSeconds(-10),
taskStatus = 0,
materialId = item.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);
}
else
{
continue;
}
}
else
{
continue;
}
}
else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1")
{
Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库");
_logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库");
continue;
}
}
}
wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = item.productOutstockId,
taskType = StaticTaskType.SecondStorageToLift,
containerNo = stock.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = item.productId,
currPointId = location.locationId,
currPointNo = location.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = 1
};
WmsProductOutstockDetail detail = new()
{
productId = item.productId,
productOutstockId = item.productOutstockId,
locationCode = location.locationCode,
executeStatus = "1",
beginTime = DateTime.Now,
warehouseId = item.warehouseId,
erpAmount = 0,
confirmAmount = 0,
outstockAmount = 1,
planAmount = 1,
productBatch = item.productBatch,
productOutstockDetailId = StaticData.SnowId.NextId(),
productBarcode = mesBasePalletInfo.materialBarcode,
};
SystemData.LockOutLocation(location, dbContext);
location.locationStatus = "6";
location.updateBy = "WCS";
location.updateTime = DateTime.Now;
dbContext.Add(detail);
dbContext.Update(location);
dbContext.Add(wcsTask);
dbContext.Update(stock);
WcsTaskLog wcsTaskLog1 = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog1);
dbContext.SaveChanges();
break;
}
}
if (item.beginTime == null)
{
item.beginTime = DateTime.Now;
}
dbContext.Update(item);
dbContext.SaveChanges();
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + ex.StackTrace);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 原材料出库
/// </summary>
private void CreateRawTaskLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
//原材料出库记录
var rawOutStock = dbContext.WmsRawOutstock
.Where(t => t.executeStatus == "0" || t.executeStatus == "1")
.Where(t => t.outstockAmount > t.realOutstockAmount)
.Where(t => t.auditStatus == "1")
.ToList();
List<WcsTaskManual> wcsTaskManuals = dbContext.WcsTaskManual.Where(t => t.nextPointId == 11).OrderBy(t => t.createBy).ToList();
if (wcsTaskManuals.Count > 0)
{
int taskCount = dbContext.WcsTask.Where(t => t.nextPointId == 11).Count();
//if (taskCount == 0 && wcsOutstockLock.qty == 0 && wcsOutstockLock.boxStatus == 0)
if (taskCount == 0)
{
List<WcsTaskManual> list = wcsTaskManuals.Where(t => t.taskType == 100).ToList();
if (list.Count == 0)
{
list = wcsTaskManuals.Where(t => t.taskType == 30).ToList();
}
if (list.Count == 0)
{
list = wcsTaskManuals.Where(t => t.taskType == 102).ToList();
}
foreach (var wcs in list.Take(6))
{
WcsTask wcsTask = CoreMapper.Map<WcsTask>(wcs);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.WcsTaskManual.Where(t => t.objid == wcs.objid).Delete();
}
dbContext.SaveChanges();
}
}
foreach (var item in rawOutStock)
{
if (item.endStationCode == "BB_01")
{
}
decimal? RealOutNumber = item.realOutstockAmount;
var endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipNo == item.endStationCode);
if (endEquip != null && endEquip.floorNo == 5)
{
#region CTU出库没用背负Agv的逻辑
//if (endEquip.equipType == 8)//CTU出库
//{
// var wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First();
// if (wcsOutstockLock.qty == 0 && wcsOutstockLock.boxStatus == 0)
// {
// var wmsRawStocks = rawStock
// .Where(t => t.materialId == item.materialId)
// .Where(t => t.warehouseId == item.warehouseId)
// .Select(t => t.locationCode)
// .ToList();
// var wmsBaseLocations = dbContext.WmsBaseLocation
// .Where(t => t.activeFlag == "1")
// .Where(t => t.delFlag == "0")
// .Where(t => t.locationScrapType == "1")
//
//
// .Where(t => t.ContainerStatus == "1")
// .Where(t => t.warehouseId == item.warehouseId)
// .Where(t => wmsRawStocks.Contains(t.locationCode))
// .ToList();
// decimal? needNumber = item.outstockAmount - RealOutNumber;
// var bill = from a in wmsBaseLocations
// from b in rawStock
// where a.locationCode == b.locationCode
// select new { a, b };
// //如果第一列满足需求,则按第一列排序,否则按最后一列排序
// if (bill.Where(t => t.a.locColumn == 1).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() > needNumber)
// {
// bill = bill.OrderBy(t => t.a.locColumn).ToList();
// }
// else
// {
// bill = bill.OrderByDescending(t => t.a.locColumn).ToList();
// }
// //做数量限制
// //bill = bill.Take(5 - dbContext.WcsCmd.Where(t => t.cmdStatus < 3 && t.nextPointId == 20).Count());
// bill = bill.Take(6);
// BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
// BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20);
// foreach (var b in bill)
// {
// needNumber = item.outstockAmount - RealOutNumber;
// item.executeStatus = "1";
// WmsBaseLocation location = b.a;
// WmsRawStock stock = b.b;
// WcsTask wcsTask;
// int qty = 0;
// if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出
// {
// RealOutNumber += stock.totalAmount - stock.frozenAmount;
// qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount);
// stock.updateDate = DateTime.Now;
// }
// else
// {
// RealOutNumber += needNumber;
// qty = Convert.ToInt32(needNumber);
// stock.updateDate = DateTime.Now;
// }
// wcsTask = new WcsTask()
// {
// objid = StaticData.SnowId.NextId(),
// orderId = item.rawOutstockId,
// taskType = 38,
// containerNo = location.containerCode,
// createBy = "WCS",
// createTime = DateTime.Now,
// taskStatus = -1,
// materialId = item.materialId,
// currPointId = location.locationId,
// currPointNo = location.locationCode,
// nextPointId = ctuEquip.objid,
// nextPointNo = ctuEquip.equipNo,
// endPointId = lineEquip.objid,
// endPointNo = lineEquip.equipNo,
// equipmentNo = ctuEquip.equipNo,
// ud1 = location.locColumn,
// useFlag = 1,
// qty = qty
// };
// MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault();
// if (mesBaseBarcodeInfo != null)
// {
// WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail()
// {
// rawOutstockDetailId = StaticData.SnowId.NextId(),
// rawOutstockId = item.rawOutstockId,
// materialId = item.materialId,
// createDate = DateTime.Now,
// createBy = "WCS",
// taskCode = wcsTask.objid.ToString(),
// executeStatus = "1",
// locationCode = location.locationCode,
// outstockAmount = qty,
// planAmount = item.outstockAmount,
// warehouseId = item.warehouseId,
// materialBarcode = mesBaseBarcodeInfo.barcodeInfo,
// instockBatch = mesBaseBarcodeInfo.batchCode,
// stackAmount = qty,
// outstockPerson = "WCS",
// outstockTime = DateTime.Now,
// outstockWay = "2",
// materialProductionDate = mesBaseBarcodeInfo.productionDate
// };
// location.outstockFlag = "1";
// location.locationStatus = "6";
// location.updateBy = "WCS";
// location.updateTime = DateTime.Now;
// wcsOutstockLock.boxStatus = 1;
// dbContext.Add(wmsProductOutstockDetail);
// dbContext.Update(location);
// dbContext.Add(wcsTask);
// dbContext.Update(stock);
// if (qty >= needNumber)
// {
// break;
// }
// }
// }
// if (item.beginTime == null)
// {
// item.beginTime = DateTime.Now;
// }
// dbContext.Update(wcsOutstockLock);
// dbContext.Update(item);
// dbContext.SaveChanges();
// }
//}//CTU出库
#endregion
if (endEquip.equipType == 10)//CTU出库到装配区
{
lock (SystemData.outStockLock)
{
//原材料库存
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)
{
if (item.endStationCode != endStationCodeEquip.endStationCode)
{
continue;
}
bool CreateSuccess = false;
bool hasTask = dbContext.WcsTask.Where(t => t.nextPointId == 11).Any();
if (!hasTask)
{
var orderList = rawOutStock.Where(t => t.endStationCode == endStationCodeEquip.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();
//对物料和数量进行分组
var list = orderList.GroupBy(t => new { t.materialId, t.saleOrderId }).Select(t => new
{
MaterialId = t.Key.materialId,
SaleOrderId = t.Key.saleOrderId,
TotalAmount = t.Sum(x => x.outstockAmount),
realOutstockAmount = t.Sum(x => x.realOutstockAmount)
}
).ToList();
int? index = 1;
foreach (var order in list)
{
if (tasks.Count >= 6)
{
break;
}
var wmsRawStocks = rawStock
.Where(t => t.materialId == order.MaterialId && t.saleOrderId == (order.SaleOrderId == null ? 0 : order.SaleOrderId) && t.warehouseId == 512)
.Select(t => t.palletInfoCode)
.ToList();
var AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == 512).ToList();
var wmsBaseLocations = AllWmsBaseLocations
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.Where(t => t.warehouseId == 512)
.Where(t => t.ContainerStatus == "1")
.Where(t => wmsRawStocks.Contains(t.containerCode))
.ToList();
decimal? needNumber = order.TotalAmount - order.realOutstockAmount;
// 寻找已经创建任务的料箱中的是否含有当前物料A物料在料箱A\B中然后找B物料的时候是否在料箱A\B中
foreach (var task in tasks)
{
var wmsRawStock = rawStock.Where(t => t.palletInfoCode == task.containerNo && t.materialId == order.MaterialId && t.saleOrderId == order.SaleOrderId).ToList();
decimal? total = wmsRawStock.Sum(t => t.totalAmount)- wmsRawStock.Sum(t => t.frozenAmount);
needNumber -= total;
WmsBaseLocation wmsBaseLocation = AllWmsBaseLocations.Where(t => t.locationCode == task.currPointNo).First();
index = wmsBaseLocation.locRow;
}
if (needNumber <= 0)
{
continue;
}
var bill = from a in wmsBaseLocations
from b in rawStock
where a.containerCode == b.palletInfoCode && b.materialId == order.MaterialId && b.saleOrderId == (order.SaleOrderId == null ? 0 : order.SaleOrderId)
select new { a, b };
//如果第一列满足需求,则按第一列排序,否则按最后一列排序
if (bill.Where(t => t.a.locRow == index).Select(t => t.b.totalAmount - t.b.frozenAmount).Sum() >= needNumber)
{
if (index == 1)
{
bill = bill.OrderBy(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList();
index = 2;
}
else
{
bill = bill.OrderByDescending(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList();
index = 1;
}
}
else
{
bill = bill.OrderByDescending(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList();
if (index == 1)
{
bill = bill.OrderByDescending(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList();
index = 2;
}
else
{
bill = bill.OrderBy(t => t.a.locRow).ThenBy(t => t.a.locColumn).ToList();
index = 1;
}
}
BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 20);
foreach (var b in bill)
{
if (needNumber <= 0 || tasks.Count >= 6)
{
break;
}
if (tasks.Where(t => t.containerNo == b.a.containerCode).Any())//判读当前料箱是否存在出库任务
{
continue;
}
WmsBaseLocation location = b.a;
WmsRawStock stock = b.b;
int qty = 0;
if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出
{
needNumber -= (stock.totalAmount - stock.frozenAmount);
qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount);
stock.updateDate = DateTime.Now;
}
else
{
qty = Convert.ToInt32(needNumber);
needNumber = 0;
stock.updateDate = DateTime.Now;
}
WmsRawOutstock? wmsRawOutstock = orderList.Where(t => t.materialId == order.MaterialId).FirstOrDefault();
if (wmsRawOutstock != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = wmsRawOutstock.rawOutstockId,
taskType = StaticTaskType.FiveAccessoryOut,
containerNo = location.containerCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = wmsRawOutstock.materialId,
currPointId = location.locationId,
currPointNo = location.locationCode,
nextPointId = ctuEquip.objid,
nextPointNo = ctuEquip.equipNo,
endPointId = lineEquip.objid,
endPointNo = lineEquip.equipNo,
equipmentNo = ctuEquip.equipNo,
ud1 = location.locColumn,
useFlag = 1,
qty = qty
};
tasks.Add(wcsTask);
location.locationStatus = "6";
location.updateBy = "WCS";
location.ContainerStatus = "2";
location.updateTime = DateTime.Now;
dbContext.Update(location);
dbContext.Update(stock);
CreateSuccess = true;
if (tasks.Count >= 6)
{
break;
}
}
}
}
if (CreateSuccess)
{
endStationCodeEquip.IsOut = 0;
foreach (var orderItem in orderList)
{
if (orderItem.beginTime == null)
{
orderItem.beginTime = DateTime.Now;
}
orderItem.executeStatus = "1";
}
BaseEquip startStationEquip = StaticData.BaseEquip.First(t => t.objid == 21);
BaseEquip bearAgvEquip = StaticData.BaseEquip.First(t => t.objid == 10);
BaseEquip endStationEquip = StaticData.BaseEquip.First(t => t.equipNo == endStationCodeEquip.endStationCode);
hasTask = dbContext.WcsTask.Where(t => t.taskType == 32).Any();
if (!hasTask)
{
WcsTask bearAgvTask = new()
{
objid = StaticData.SnowId.NextId(),
orderId = item.rawOutstockId,
taskType = 32,
containerNo = null,
currPointId = startStationEquip.objid,
currPointNo = startStationEquip.equipNo,
nextPointId = bearAgvEquip.objid,
nextPointNo = bearAgvEquip.equipNo,
endPointId = endStationEquip.objid,
endPointNo = endStationEquip.equipNo,
serialNo = SystemData.GetSerialNo(dbContext),
taskStatus = 0,
createTime = DateTime.Now,
createBy = "WCS",
materialId = item.materialId,
qty = 1,
useFlag = 1,
equipmentNo = startStationEquip.equipNo,
remark = "组装出库",
floorNo = 5,
masterId = item.materialId,
fromFloorNo = 5,
};
dbContext.Add(bearAgvTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(bearAgvTask);
dbContext.Add(wcsTaskLog);
}
if (item.beginTime == null)
{
item.beginTime = DateTime.Now;
}
dbContext.UpdateRange(orderList);
dbContext.Update(item);
}
dbContext.Update(endStationCodeEquip);
if (tasks.Count > 0)
{
dbContext.AddRange(tasks);
}
dbContext.SaveChanges();
}
}
}
}
else
{
lock (SystemData.FiveTaskLock)
{
if (endEquip.equipType == 12)//原材料到柜体验收区,背板安装
{
var rawStock = dbContext.WmsRawStock
.Where(t => t.activeFlag == "1").ToList();
bool hasTask = dbContext.WcsTask.Where(t => t.currPointId == endEquip.objid || t.endPointId == endEquip.objid).Any();
if (!hasTask)
{
if (endEquip.emptyCount == 0)
{
var wmsRawStocks = rawStock
.Where(t => t.materialId == item.materialId && t.warehouseId == item.warehouseId)
.WhereIf(endEquip.equipType == 12, t => t.completeFlag == "1")
.Where(t => t.saleOrderId == (item.saleOrderId == null ? 0 : item.saleOrderId))
.Where(t => t.totalAmount > t.frozenAmount)
.Select(t => t.palletInfoCode)
.ToList();
List<WmsBaseLocation> AllWmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseId == item.warehouseId).ToList();
var wmsBaseLocations = AllWmsBaseLocations
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.Where(t => t.warehouseId == item.warehouseId)
.OrderByDescending(t => t.locDeep)
.Where(t => wmsRawStocks.Contains(t.containerCode))
.ToList();
decimal? needNumber = item.outstockAmount - item.realOutstockAmount;
var bill = from a in wmsBaseLocations
from b in rawStock
where a.locationCode == b.locationCode
select new { a, b };
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28);
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode);
foreach (var b in bill)
{
item.executeStatus = "1";
WmsBaseLocation location = b.a;
WmsRawStock stock = b.b;
WcsTask wcsTask;
int qty = 0;
if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出
{
qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount);
stock.updateDate = DateTime.Now;
}
else
{
qty = Convert.ToInt32(needNumber);
stock.updateDate = DateTime.Now;
}
MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault();
if (mesBaseBarcodeInfo != null)
{
if (location.locDeep == 1)
{
int? row = 0;
if (location.locRow % 2 == 1)//五楼原材料与其他的深浅库位相反
{
row = location.locRow + 1;
}
else
{
row = location.locRow - 1;//5
}
var lowLocationBill = bill.Where(t => t.a.locRow == row).Where(t => t.a.locColumn == location.locColumn).Where(t => t.a.warehouseId == location.warehouseId).FirstOrDefault();
if (lowLocationBill != null)
{
location = lowLocationBill.a;
stock = lowLocationBill.b;
}
else
{
WmsBaseLocation? wmsBaseLocation = AllWmsBaseLocations
.Where(t => t.locRow == row)
.Where(t => t.locColumn == location.locColumn)
.Where(t => t.warehouseId == location.warehouseId).FirstOrDefault();
if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1")
{
WmsRawStock? wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode);
if (wmsRawStock != null)
{
WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.warehouseId != location.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.FirstOrDefault();
if (toLocation != null)
{
if (toLocation.locDeep == 1)
{
bool hasLocation = AllWmsBaseLocations
.Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1)))
.Where(t => t.locColumn == toLocation.locColumn)
.Any();
if (!hasLocation)
{
Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
_logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
continue;
}
}
var RemoveTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = item.rawOutstockId,
taskType = StaticTaskType.FiveRemove,
containerNo = wmsRawStock.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now.AddSeconds(-10),
taskStatus = 0,
materialId = item.materialId,
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = toLocation.locationId,
endPointNo = toLocation.locationCode,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = qty
};
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);
}
else
{
continue;
}
}
else
{
continue;
}
}
else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1")
{
Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库");
_logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库");
continue;
}
}
}
wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = item.rawOutstockId,
taskType = StaticTaskType.FiveRawToSplit,//如果是12那么就是原材料到柜体验收区,如果是13那么就是原材料到背板安装区
containerNo = location.containerCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = item.materialId,
currPointId = location.locationId,
currPointNo = location.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = lineEquip.objid,
endPointNo = lineEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = qty
};
//location是出库的库位mesBaseBarcodeInfo是条码信息表数据item是出库申请单
WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail()
{
rawOutstockDetailId = StaticData.SnowId.NextId(),
rawOutstockId = item.rawOutstockId,
materialId = item.materialId,
createDate = DateTime.Now,
createBy = "WCS",
taskCode = wcsTask.objid.ToString(),
executeStatus = "1",
locationCode = location.locationCode,
outstockAmount = qty,
planAmount = item.outstockAmount,
warehouseId = item.warehouseId,
materialBarcode = mesBaseBarcodeInfo.barcodeInfo,
instockBatch = mesBaseBarcodeInfo.batchCode,
stackAmount = qty,
outstockPerson = "WCS",
outstockTime = DateTime.Now,
outstockWay = "2",
materialProductionDate = mesBaseBarcodeInfo.productionDate
};
if (item.beginTime == null)
{
item.beginTime = DateTime.Now;
}
SystemData.LockOutLocation(location, dbContext);
dbContext.Add(wmsProductOutstockDetail);
location.locationStatus = "6";
location.updateBy = "WCS";
location.updateTime = DateTime.Now;
endEquip.emptyCount = 1;
dbContext.Update(endEquip);
dbContext.Update(location);
dbContext.Add(wcsTask);
dbContext.Update(item);
dbContext.Update(stock);
WcsTaskLog wcsTaskLog1 = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog1);
dbContext.SaveChanges();
}
break;
}
}
}
}
else if (endEquip.equipType == 13) //原材料到背板安装
{
var stock = dbContext.WmsRawStock.Where(t => t.instockBatch == item.materialBatch).FirstOrDefault();
if (stock != null)
{
var location = dbContext.WmsBaseLocation
.Where(t => t.locationStatus == "1")
.Where(t => t.locationCode == stock.locationCode).FirstOrDefault();
if (location != null)
{
List<WmsBaseLocation> AllWmsBaseLocations = dbContext.WmsBaseLocation
.Where(t => t.warehouseId == item.warehouseId).ToList();
decimal? needNumber = item.outstockAmount - item.realOutstockAmount;
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28);
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode);
WcsTask wcsTask;
int qty = 0;
if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出
{
qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount);
stock.updateDate = DateTime.Now;
}
else
{
qty = Convert.ToInt32(needNumber);
stock.updateDate = DateTime.Now;
}
MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.Where(t => t.barcodeInfo == stock.instockBatch).FirstOrDefault();
if (mesBaseBarcodeInfo != null)
{
if (location.locDeep == 1)
{
int? row = 0;
if (location.locRow % 2 == 1)//五楼原材料与其他的深浅库位相反
{
row = location.locRow + 1;
}
else
{
row = location.locRow - 1;//5
}
WmsBaseLocation? wmsBaseLocation = AllWmsBaseLocations
.Where(t => t.locRow == row)
.Where(t => t.locColumn == location.locColumn)
.Where(t => t.warehouseId == location.warehouseId).FirstOrDefault();
if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode) && wmsBaseLocation.locationStatus == "1")
{
WmsRawStock? wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode);
if (wmsRawStock != null)
{
WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == location.warehouseId)
.Where(t => t.warehouseId != location.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.FirstOrDefault();
if (toLocation != null)
{
if (toLocation.locDeep == 1)
{
bool hasLocation = AllWmsBaseLocations
.Where(t => t.locRow == (toLocation.locRow % 2 == 1 ? (toLocation.locRow + 1) : (toLocation.locRow - 1)))
.Where(t => t.locColumn == toLocation.locColumn)
.Any();
if (!hasLocation)
{
Console.WriteLine(DateTime.Now + $":目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
_logger.Info($"目标库位{toLocation.locationCode}的浅库位库位状态异常,无法移库");
continue;
}
}
var RemoveTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = item.rawOutstockId,
taskType = StaticTaskType.FiveRemove,
containerNo = wmsRawStock.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now.AddSeconds(-10),
taskStatus = 0,
materialId = item.materialId,
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = toLocation.locationId,
endPointNo = toLocation.locationCode,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = qty
};
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);
}
else
{
continue;
}
}
else
{
continue;
}
}
else if (wmsBaseLocation != null && wmsBaseLocation.locationStatus != "1")
{
Console.WriteLine(DateTime.Now + $":{wmsBaseLocation.locationCode}库位状态异常,无法移库");
_logger.Info($"{wmsBaseLocation.locationCode}库位状态异常,无法移库");
continue;
}
else
{
Console.WriteLine(DateTime.Now + $":{location.locationCode}浅库位状态异常,无法移库");
_logger.Info($"{location.locationCode}浅库位状态异常,无法移库");
continue;
}
}
wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = item.rawOutstockId,
taskType = StaticTaskType.FiveRawToBack,//如果是12那么就是原材料到柜体验收区,如果是13那么就是原材料到背板安装区
containerNo = location.containerCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = item.materialId,
currPointId = location.locationId,
currPointNo = location.locationCode,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = lineEquip.objid,
endPointNo = lineEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = qty
};
//location是出库的库位mesBaseBarcodeInfo是条码信息表数据item是出库申请单
WmsRawOutstockDetail wmsProductOutstockDetail = new WmsRawOutstockDetail()
{
rawOutstockDetailId = StaticData.SnowId.NextId(),
rawOutstockId = item.rawOutstockId,
materialId = item.materialId,
createDate = DateTime.Now,
createBy = "WCS",
taskCode = wcsTask.objid.ToString(),
executeStatus = "1",
locationCode = location.locationCode,
outstockAmount = qty,
planAmount = item.outstockAmount,
warehouseId = item.warehouseId,
materialBarcode = mesBaseBarcodeInfo.barcodeInfo,
instockBatch = mesBaseBarcodeInfo.batchCode,
stackAmount = qty,
outstockPerson = "WCS",
outstockTime = DateTime.Now,
outstockWay = "2",
materialProductionDate = mesBaseBarcodeInfo.productionDate
};
if (item.beginTime == null)
{
item.beginTime = DateTime.Now;
}
SystemData.LockOutLocation(location, dbContext);
dbContext.Add(wmsProductOutstockDetail);
location.locationStatus = "6";
location.updateBy = "WCS";
location.updateTime = DateTime.Now;
endEquip.emptyCount = 1;
dbContext.Update(endEquip);
dbContext.Update(location);
dbContext.Add(wcsTask);
dbContext.Update(item);
dbContext.Update(stock);
WcsTaskLog wcsTaskLog1 = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog1);
dbContext.SaveChanges();
}
}
}
}
}
}
}
}
}
catch (Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(3000);
}
}
}
}