using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.OtherEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.MES;
using WIDESEA_DTO.Task;
using WIDESEA_Model.Models;
namespace WIDESEA_TaskInfoService
{
public partial class TaskService
{
///
/// 申请入库任务(PDA使用,仅托盘绑定入库站台,不分配货位)
///
///
///
public WebResponseContent RequestInboundTask(SaveModel saveModel)
{
try
{
var palletCode = saveModel.MainData["barcode"].ToString();
var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
var stationCode = saveModel.MainData["startPoint"].ToString();
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehouseId);
if (warehouse == null)
{
return WebResponseContent.Instance.Error($"未找到库区");
}
Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode && x.WarehouseId == warehouseId);
if (task != null)
{
return WebResponseContent.Instance.Error($"该托盘已生成任务");
}
if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null && warehouse.WarehouseCode != WarehouseEnum.HA60.ToString())
{
return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
}
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable().Where(x=>x.PalletCode== palletCode).Includes(x=>x.Details).First();
if (stockInfo == null)
{
return WebResponseContent.Instance.Error($"未找到组盘信息");
}
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.送检完成.ObjToInt())
{
return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
}
if (!string.IsNullOrEmpty(stockInfo.LocationCode))
{
return WebResponseContent.Instance.Error($"该托盘已绑定货位");
}
if (warehouseId != stockInfo.WarehouseId)
{
return WebResponseContent.Instance.Error($"仓库不正确");
}
if (warehouse.WarehouseCode == WarehouseEnum.HA60.ToString())
{
Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == warehouseId);
if (locationInfo == null) return WebResponseContent.Instance.Error($"未找到当前库区货位信息");
if (stationCode!= "8005")
{
return WebResponseContent.Instance.Error($"起点错误:{stationCode}");
}
return DeviceRequestInboundTask(stationCode, locationInfo.RoadwayNo, palletCode);
}
else
{
Dt_Task newTask = new Dt_Task()
{
CurrentAddress = stationCode,
Grade = 0,
NextAddress = "",
PalletCode = palletCode,
Roadway = "",
SourceAddress = stationCode,
TargetAddress = "",
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = stockInfo.WarehouseId,
PalletType = stockInfo.PalletType,
MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode,
Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.StockQuantity,
};
//获取是否存在入库单
Dt_InboundOrder? inboundOrder = null;
if (stockInfo!=null && stockInfo.Details.Count>0)
{
string? orderNo = stockInfo.Details.FirstOrDefault()?.OrderNo ?? "";
inboundOrder =_inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt());
if (inboundOrder!=null)
{
newTask.OrderNo = inboundOrder.InboundOrderNo;
}
}
if (inboundOrder != null)
{
if (inboundOrder.OrderType == InOrderTypeEnum.Allocat.ObjToInt())
{
newTask.TaskType = TaskTypeEnum.InAllocate.ObjToInt();
newTask.OrderNo = inboundOrder.InboundOrderNo;
}
else if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
{
newTask.TaskType = TaskTypeEnum.ProductionReturn.ObjToInt();
newTask.OrderNo = inboundOrder.InboundOrderNo;
}
}
if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
{
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
}
else if (stockInfo.StockStatus == StockStatusEmun.拣选完成.ObjToInt())
{
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
newTask.TaskType = TaskTypeEnum.InPick.ObjToInt();
}
else if (stockInfo.StockStatus == StockStatusEmun.送检完成.ObjToInt())
{
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
newTask.TaskType = TaskTypeEnum.InQuality.ObjToInt();
}
else
{
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
}
if (warehouse.WarehouseCode==WarehouseEnum.HA57.ToString())
{
Dt_Task dt_TaskMesReturn = BaseDal.QueryFirst(x=>x.TaskType==TaskTypeEnum.MesMatReturn.ObjToInt() && x.TaskStatus!=TaskStatusEnum.SC_Executing.ObjToInt());
if (dt_TaskMesReturn!=null)
{
return WebResponseContent.Instance.Error($"退料任务正执行");
}
}
_unitOfWorkManage.BeginTran();
int taskId = BaseDal.AddData(newTask);
newTask.TaskId = taskId;
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
_unitOfWorkManage.CommitTran();
PushTasksToWCS(new List { newTask });
return WebResponseContent.Instance.OK(data: newTask);
}
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// 查询质检数量
///
/// 托盘号
///
public WebResponseContent InQualityConfirm(string palletCode)
{
WebResponseContent content = new WebResponseContent();
try
{
Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(palletCode);
if (stockInfo == null)
{
return content.Error($"未找到该托盘库存信息");
}
if (stockInfo.Details.Count<=0)
{
return content.Error($"该托盘库存明细为空");
}
if (stockInfo.StockStatus != StockStatusEmun.送检完成.ObjToInt())
{
return content.Error($"该托盘还未送检出库完成");
}
Dt_OutStockLockInfo? outStockLockInfo = _outboundRepository.OutboundStockLockInfoRepository.QueryData(x => x.PalletCode == palletCode && x.Status == OutLockStockStatusEnum.出库完成.ObjToInt() && x.OrderType== OutOrderTypeEnum.Quality.ObjToInt()).OrderByDescending(x=>x.Id).FirstOrDefault();
if (outStockLockInfo != null)
{
//获取对应检验单
Dt_CheckOrder checkOrder = _checkOrderRepository.QueryFirst(x=>x.ReceiveDetailRowNo== outStockLockInfo.Id && x.CheckOrderStatus==CheckOrderStatusEnum.Checked.ObjToInt());
if (checkOrder == null)
{
return content.Error($"该托盘送检信息未检");
}
content.OK("成功", data:new { stockInfo.Details.FirstOrDefault()?.MaterielCode,checkOrder.ReceivedQuantity,checkOrder.ScrappedQuantity,checkOrder.DefectedQuantity,checkOrder.QualifiedQuantity,stockQuantity= stockInfo.Details.Sum(x=>x.StockQuantity) }) ;
}
else
{
content.Error("该托盘送检出库详情不存在");
}
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
content.Error(ex.Message);
}
return content;
}
///
/// 入空箱
///
///
///
///
///
public WebResponseContent InEmpty(string barcode, string address, int WarehouseId)
{
try
{
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == WarehouseId);
if (warehouse == null)
{
return WebResponseContent.Instance.Error($"未找到库区");
}
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == barcode && x.StockStatus != StockStatusEmun.出库完成.ObjToInt());
if (stockInfo != null) throw new Exception($"托盘号已存在");
stockInfo = new Dt_StockInfo()
{
PalletCode = barcode,
StockStatus = StockStatusEmun.入库确认.ObjToInt(),
WarehouseId = WarehouseId,
PalletType = PalletTypeEnum.Empty.ObjToInt(),
Details = new List()
};
Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == WarehouseId);
if (locationInfo == null) return WebResponseContent.Instance.Error($"未找到当前库区货位信息");
locationInfo = _basicService.LocationInfoService.AssignLocation(locationInfo.RoadwayNo, ((PalletTypeEnum)stockInfo.PalletType).ObjToInt(), stockInfo.WarehouseId);
if (locationInfo == null)
{
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
}
Dt_Task newTask = new Dt_Task()
{
CurrentAddress = address,
Grade = 0,
NextAddress = locationInfo.LocationCode,
PalletCode = barcode,
Roadway = locationInfo.RoadwayNo,
SourceAddress = address,
TargetAddress = locationInfo.LocationCode,
TaskType = TaskTypeEnum.InEmpty.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = stockInfo.WarehouseId,
PalletType = stockInfo.PalletType
};
locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
_unitOfWorkManage.BeginTran();
int taskId = BaseDal.AddData(newTask);
newTask.TaskId = taskId;
_basicRepository.LocationInfoRepository.UpdateData(locationInfo);
_stockRepository.StockInfoRepository.AddData(stockInfo);
_unitOfWorkManage.CommitTran();
PushTasksToWCS(new List { newTask });
PutFinish(address, newTask.PalletCode, newTask.TaskNum.ToString());
return WebResponseContent.Instance.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
///
///
///
///
///
///
///
public WebResponseContent OutEmpty(int qty, string address, int WarehouseId, string barcode)
{
try
{
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == WarehouseId);
if (warehouse == null)
{
return WebResponseContent.Instance.Error($"未找到库区");
}
List stockInfos = null;
if (string.IsNullOrEmpty(barcode))
{
stockInfos = _stockRepository.StockInfoRepository.QueryData(x => x.WarehouseId == WarehouseId && x.PalletType == PalletTypeEnum.Empty.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt(), qty, nameof(Dt_StockInfo.CreateDate));
}
else
{
stockInfos = _stockRepository.StockInfoRepository.QueryData(x => x.WarehouseId == WarehouseId && x.PalletType == PalletTypeEnum.Empty.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.PalletCode == barcode);
if (stockInfos.Count == 0) return WebResponseContent.Instance.Error($"{warehouse.WarehouseName}未找到空箱【{barcode}】");
}
if (stockInfos.Count < qty) return WebResponseContent.Instance.Error($"{warehouse.WarehouseName}空箱库存不足,库存数【{stockInfos.Count}】");
List tasks = GetTasks(stockInfos, TaskTypeEnum.OutEmpty);
stockInfos.ForEach(x =>
{
x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
});
tasks.ForEach(x =>
{
x.TargetAddress = address;
x.NextAddress = address;
});
_unitOfWorkManage.BeginTran();
BaseDal.AddData(tasks);
_stockRepository.StockInfoRepository.UpdateData(stockInfos);
_unitOfWorkManage.CommitTran();
PushTasksToWCS(tasks);
return WebResponseContent.Instance.OK();
}
catch (Exception ex)
{
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
///
///
///
///
///
///
public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode,string materielBoxCode = "")
{
try
{
Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode);
if (task != null)
{
PushTasksToWCS(new List { task });
return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map(task));
}
if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null && stationCode != "8005")//辅料仓不限制入库任务
{
return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
}
if (!string.IsNullOrEmpty(materielBoxCode))
{
_unitOfWorkManage.BeginTran();
WebResponseContent responseGroup = _inboundOrderService.MaterielPPorGM(materielBoxCode);
if (!responseGroup.Status)
{
return WebResponseContent.Instance.Error($"{responseGroup.Message}");
}
Dt_StockInfo stockInfoPPorGM = responseGroup.Data as Dt_StockInfo ?? null;
if (stockInfoPPorGM==null)
{
return WebResponseContent.Instance.Error($"组盘数据转换失败");
}
Dt_LocationInfo? locationInfoPPorGM = _basicService.LocationInfoService.AssignLocation(roadwayNo, stockInfoPPorGM.PalletType, stockInfoPPorGM.WarehouseId);
if (locationInfoPPorGM == null)
{
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
}
Dt_Task newTaskPPorGM = new Dt_Task()
{
CurrentAddress = stationCode,
Grade = 0,
NextAddress = locationInfoPPorGM.LocationCode,
PalletCode = stockInfoPPorGM.PalletCode,
Roadway = roadwayNo,
SourceAddress = stationCode,
TargetAddress = locationInfoPPorGM.LocationCode,
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = stockInfoPPorGM.WarehouseId,
PalletType = stockInfoPPorGM.PalletType,
TaskLength= stockInfoPPorGM.StockLength
};
//获取是否存在入库单
Dt_InboundOrder? inboundOrderPPorGM = null;
if (stockInfoPPorGM != null && stockInfoPPorGM.Details.Count > 0)
{
string? orderNo = stockInfoPPorGM.Details.FirstOrDefault()?.OrderNo ?? "";
inboundOrderPPorGM = _inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt());
}
if (inboundOrderPPorGM != null)
{
if (inboundOrderPPorGM.OrderType == InOrderTypeEnum.Allocat.ObjToInt())
{
newTaskPPorGM.TaskType = TaskTypeEnum.InAllocate.ObjToInt();
}
else if (inboundOrderPPorGM.OrderType == InOrderTypeEnum.Return.ObjToInt())
{
newTaskPPorGM.TaskType = TaskTypeEnum.ProductionReturn.ObjToInt();
}
}
stockInfoPPorGM.StockStatus = StockStatusEmun.入库确认.ObjToInt();
LocationStatusEnum lastStatusPPorGM = (LocationStatusEnum)locationInfoPPorGM.LocationStatus;
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfoPPorGM, lastStatusPPorGM, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
_basicService.LocationInfoService.UpdateLocationStatus(locationInfoPPorGM, newTaskPPorGM.PalletType, LocationStatusEnum.Lock, newTaskPPorGM.WarehouseId);
int taskIdPPorGM = BaseDal.AddData(newTaskPPorGM);
newTaskPPorGM.TaskId = taskIdPPorGM;
_stockRepository.StockInfoRepository.Db.InsertNav(stockInfoPPorGM).Include(x => x.Details).ExecuteCommand();
_unitOfWorkManage.CommitTran();
WMSTaskDTO wMSTaskDTOPPorGM = _mapper.Map(newTaskPPorGM);
PushTasksToWCS(new List { newTaskPPorGM });
return WebResponseContent.Instance.OK(data: wMSTaskDTOPPorGM);
}
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
if (stockInfo == null)
{
return WebResponseContent.Instance.Error($"未找到组盘信息");
}
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.出库完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.送检完成.ObjToInt())
{
return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
}
if (!string.IsNullOrEmpty(stockInfo.LocationCode))
{
return WebResponseContent.Instance.Error($"该托盘已绑定货位");
}
Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, stockInfo.PalletType, stockInfo.WarehouseId);
if (locationInfo == null)
{
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
}
Dt_Task newTask = new Dt_Task()
{
CurrentAddress = stationCode,
Grade = 0,
NextAddress = locationInfo.LocationCode,
PalletCode = palletCode,
Roadway = roadwayNo,
SourceAddress = stationCode,
TargetAddress = locationInfo.LocationCode,
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = stockInfo.WarehouseId,
PalletType = stockInfo.PalletType,
};
//获取是否存在入库单
Dt_InboundOrder? inboundOrder = null;
if (stockInfo != null && stockInfo.Details.Count > 0)
{
string? orderNo = stockInfo.Details.FirstOrDefault()?.OrderNo ?? "";
inboundOrder = _inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt());
}
if (inboundOrder != null)
{
if (inboundOrder.OrderType == InOrderTypeEnum.Allocat.ObjToInt())
{
newTask.TaskType = TaskTypeEnum.InAllocate.ObjToInt();
}
else if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
{
newTask.TaskType = TaskTypeEnum.ProductionReturn.ObjToInt();
}
}
if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
{
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
}
else if (stockInfo.StockStatus == StockStatusEmun.MES退库.ObjToInt())
{
newTask.TaskType = TaskTypeEnum.MesMatReturn.ObjToInt();
}
else if (stockInfo.StockStatus == StockStatusEmun.拣选完成.ObjToInt())
{
newTask.TaskType = TaskTypeEnum.InPick.ObjToInt();
}
else if (stockInfo.StockStatus == StockStatusEmun.送检完成.ObjToInt())
{
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
newTask.TaskType = TaskTypeEnum.InQuality.ObjToInt();
}
else
{
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
}
LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
_unitOfWorkManage.BeginTran();
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, newTask.PalletType, LocationStatusEnum.Lock, newTask.WarehouseId);
int taskId = BaseDal.AddData(newTask);
newTask.TaskId = taskId;
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
_unitOfWorkManage.CommitTran();
WMSTaskDTO wMSTaskDTO = _mapper.Map(newTask);
PushTasksToWCS(new List { newTask });
if (newTask.WarehouseId == 5) PutFinish(stationCode.ToString(),newTask.PalletCode, newTask.TaskNum.ToString());
return WebResponseContent.Instance.OK(data: wMSTaskDTO);
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// 仅申请任务,让WCS根据路由确定下一地址
///
///
///
///
public WebResponseContent DeviceRequestInboundTaskSimple(string stationCode, string palletCode)
{
try
{
Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode);
if (task != null)
{
PushTasksToWCS(new List { task });
return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map(task));
}
if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null)
{
return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
}
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
if (stockInfo == null)
{
return WebResponseContent.Instance.Error($"未找到组盘信息");
}
if (stockInfo.StockStatus != StockStatusEmun.退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES空托退库.ObjToInt())
{
return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
}
if (!string.IsNullOrEmpty(stockInfo.LocationCode))
{
return WebResponseContent.Instance.Error($"该托盘已绑定货位");
}
Dt_Task newTask = new Dt_Task()
{
CurrentAddress = stationCode,
Grade = 0,
NextAddress = "",
PalletCode = palletCode,
Roadway = "",
SourceAddress = stationCode,
TargetAddress = "",
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = stockInfo.WarehouseId,
PalletType = stockInfo.PalletType,
};
if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
{
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
}
else if (stockInfo.StockStatus == StockStatusEmun.MES退库.ObjToInt())
{
newTask.TaskType = TaskTypeEnum.MesMatReturn.ObjToInt();
}
else if (stockInfo.StockStatus == StockStatusEmun.MES空托退库.ObjToInt())
{
Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x=>x.WarehouseId==stockInfo.WarehouseId && x.PalletType==stockInfo.PalletType);
//todo 小托盘暂时未启用
if (palletTypeInfo.LocaitonCount==2)
{
newTask.TaskType = TaskTypeEnum.MesPalletLargeReturn.ObjToInt();
}
else
{
newTask.TaskType = TaskTypeEnum.MesPalletSmallReturn.ObjToInt();
}
}
else
{
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
}
_unitOfWorkManage.BeginTran();
int taskId = BaseDal.AddData(newTask);
newTask.TaskId = taskId;
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
_unitOfWorkManage.CommitTran();
WMSTaskDTO wMSTaskDTO = _mapper.Map(newTask);
PushTasksToWCS(new List { newTask });
if (newTask.WarehouseId == 5) PutFinish(stationCode, newTask.PalletCode, newTask.TaskNum.ToString());
return WebResponseContent.Instance.OK(data: wMSTaskDTO);
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
///
///
///
///
///
///
///
public WebResponseContent DeviceRequestInboundTaskByRoadways(string stationCode, string palletCode, List staions, int heightType)
{
try
{
Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode);
if (task != null)
{
PushTasksToWCS(new List { task });
return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map(task));
}
if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null)
{
return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
}
string roadwayNo = AssignRoadwayNo(staions, palletCode, heightType);
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
if (stockInfo == null)
{
return WebResponseContent.Instance.Error($"未找到组盘信息");
}
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.出库完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES退库.ObjToInt())
{
return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
}
if (!string.IsNullOrEmpty(stockInfo.LocationCode))
{
return WebResponseContent.Instance.Error($"该托盘已绑定货位");
}
Dt_Task newTask = new Dt_Task()
{
CurrentAddress = stationCode,
Grade = 0,
NextAddress = "",
PalletCode = palletCode,
Roadway = roadwayNo,
SourceAddress = stationCode,
TargetAddress = roadwayNo,
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = stockInfo.WarehouseId,
PalletType = stockInfo.PalletType,
};
if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
{
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
}
else if (stockInfo.StockStatus == StockStatusEmun.MES退库.ObjToInt())
{
newTask.TaskType = TaskTypeEnum.MesMatReturn.ObjToInt();
}
else
{
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
}
_unitOfWorkManage.BeginTran();
int taskId = BaseDal.AddData(newTask);
newTask.TaskId = taskId;
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
_unitOfWorkManage.CommitTran();
WMSTaskDTO wMSTaskDTO = _mapper.Map(newTask);
PushTasksToWCS(new List { newTask });
//if (newTask.WarehouseId == 5) PutFinish(stationCode);
return WebResponseContent.Instance.OK(data: wMSTaskDTO);
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// 入库任务申请分配货位
///
/// 任务号
/// 巷道号
///
public WebResponseContent AssignInboundTaskLocation(int taskNum, string roadwayNo)
{
try
{
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null)
{
return WebResponseContent.Instance.Error($"未找到该入库任务");
}
if (_basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress) != null)
{
return WebResponseContent.Instance.OK(data: task.TargetAddress);
}
Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, task.PalletType, task.WarehouseId);
if (locationInfo == null)
{
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
}
task.Roadway = roadwayNo;
task.TargetAddress = locationInfo.LocationCode;
if (task.Roadway.Contains("AGV"))
{
task.TaskStatus = TaskStatusEnum.AGV_Execute.ObjToInt();
}
else
{
task.TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt();
}
LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
_unitOfWorkManage.BeginTran();
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, task.PalletType, LocationStatusEnum.Lock, task.WarehouseId);
BaseDal.UpdateData(task);
_unitOfWorkManage.CommitTran();
return WebResponseContent.Instance.OK(data: locationInfo.LocationCode);
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
///
///
///
///
///
///
public WebResponseContent AssignInboundTaskLocationByHeight(int taskNum, string roadwayNo, int heightType)
{
try
{
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null)
{
return WebResponseContent.Instance.Error($"未找到该入库任务");
}
if (_basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress) != null)
{
return WebResponseContent.Instance.OK(data: task.TargetAddress);
}
Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, task.PalletType, task.WarehouseId, heightType: heightType);
if (locationInfo == null)
{
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
}
task.Roadway = roadwayNo;
task.TargetAddress = locationInfo.LocationCode;
task.TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt();
LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
_unitOfWorkManage.BeginTran();
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, task.PalletType, LocationStatusEnum.Lock, task.WarehouseId);
BaseDal.UpdateData(task);
_unitOfWorkManage.CommitTran();
return WebResponseContent.Instance.OK(data: locationInfo.LocationCode);
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
public WebResponseContent RequestZHInboundTask(string agvTaskCode, string palletCode, string palletType, string materialLot)
{
WebResponseContent content = new WebResponseContent();
try
{
//获取测试架原库存信息
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA154.ToString());
//获取库存记录
List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x =>
x.WarehouseId == warehouse.WarehouseId && x.PalletCode== palletCode).Includes(x => x.Details).ToList();
if (stockInfos.Count > 0)
{
return content.Error($"载具托盘已存在");
}
Dt_StockInfo? stockInfoOld = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == materialLot));
if (stockInfoOld != null)
{
return content.Error($"库存信息已存在");
}
Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x=>x.CodeStartStr== palletType);
if (palletTypeInfo == null)
{
return content.Error($"托盘类型信息不存在");
}
////获取阻焊批次
//WebResponseContent requestLotInfo = GetZHMesMaterialLot(materialLot);
//if (!requestLotInfo.Status)
//{
// return content.Error($"请求阻焊批次信息失败,{requestLotInfo.Message}");
//}
//MesLotInfoModel mesLotInfo = JsonConvert.DeserializeObject(requestLotInfo.Data.ToString());
MesLotInfoModel mesLotInfo = new MesLotInfoModel()
{
Product="FH001",
ProductVersion="A1",
Qty=20,
LotNo= materialLot,
IsFullNumber=true
};
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
{
MaterielSpec = mesLotInfo.ProductVersion,
BatchNo = materialLot,
EffectiveDate = mesLotInfo.DateCode ?? " ",
MaterielCode = mesLotInfo.Product,
InboundOrderRowNo = 0,
MaterielName = mesLotInfo.Product,
ProductionDate = mesLotInfo.DateCode ?? " ",
OrderNo = "",
OutboundQuantity = 0,
SerialNumber = materialLot,
StockQuantity = (float)mesLotInfo.Qty,
Status = StockStatusEmun.入库确认.ObjToInt(),
Unit = "Lot",
Remark= mesLotInfo.IsFullNumber?"满Lot":"不满Lot"
};
Dt_StockInfo stockInfo = new Dt_StockInfo()
{
PalletCode = palletCode,
PalletType = palletTypeInfo.PalletType,
WarehouseId = warehouse.WarehouseId,
StockStatus = StockStatusEmun.入库确认.ObjToInt(),
Details = new List { stockInfoDetail }
};
//生成退库任务
Dt_Task taskIn = new()
{
CurrentAddress = "AGV_ZH",
Grade = 0,
PalletCode = palletCode,
NextAddress = "",
Roadway = "SC01_ZH",
SourceAddress = "AGV_ZH",
TargetAddress = "",
TaskStatus = (int)TaskStatusEnum.New,
TaskType = palletTypeInfo.LocaitonCount==2? (int)TaskTypeEnum.InZHProductLarge : (int)TaskTypeEnum.InZHProductSmall,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
PalletType = palletTypeInfo.PalletType,
WarehouseId = warehouse.WarehouseId
};
_unitOfWorkManage.BeginTran();
Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
BaseDal.AddData(taskIn);
//BaseDal.AddData(task);
_unitOfWorkManage.CommitTran();
//将任务推送到WCS
PushTasksToWCS(new List() { taskIn }, "AGV_ZH", agvTaskCode);
content.OK(data: taskIn);
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
content.Error(ex.Message);
}
return content;
}
public readonly string[] OutStartPonits = { "5230", "5237", "5244" };
///
/// 成品余料退库入仓
///
///
///
///
public WebResponseContent BackProductTask(string barCode, string startPoint)
{
WebResponseContent content = new WebResponseContent();
try
{
string palletCode = @"^C\d{5}$"; // 正则表达式
bool isValid = Regex.IsMatch(barCode, palletCode);
if (!isValid)
{
return content.Error($"框码格式错误{barCode}");
}
if (!OutStartPonits.Contains(startPoint))
{
return content.Error($"起点错误{startPoint}");
}
//判断当前点位是否重复
Dt_Task taskOldPoint = BaseDal.QueryFirst(x=>x.SourceAddress==startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt()||x.TaskStatus==TaskStatusEnum.Line_Execute.ObjToInt()|| x.TaskStatus == TaskStatusEnum.Line_Executing.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_Takeing.ObjToInt()));
if (taskOldPoint != null)
{
return content.Error($"站点{startPoint}已存在任务");
}
Dt_Task taskOld = BaseDal.QueryFirst(x => x.PalletCode == barCode);
if (taskOld != null)
{
return content.Error($"胶框{barCode}任务已存在");
}
//获取胶框余料
Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable().Where(x=>x.PalletCode== barCode).Includes(x=>x.proStockInfoDetails).First();
if (proStockInfo==null)
{
return content.Error($"未找到{barCode}胶框信息");
}
if (proStockInfo.proStockInfoDetails==null || proStockInfo.proStockInfoDetails.Count<=0)
{
return content.Error($"{barCode}胶框信息为空");
}
if (proStockInfo.StockStatus!=StockStatusEmun.出库完成.ObjToInt())
{
return content.Error($"{barCode}胶框信息状态异常");
}
//获取成品平库
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
if (proStockInfo.WarehouseId != warehouse.WarehouseId && proStockInfo.LocationCode!= "成品包装拣货区")
{
return content.Error($"{barCode}胶框信息不在拣货区");
}
//获取当前的库存属性
Dt_Warehouse? warePoint = null;
switch (proStockInfo.ProStockAttribute)
{
case (int)ProStockAttributeEnum.成品:
warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA71.ToString());
break;
case (int)ProStockAttributeEnum.尾数:
warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA72.ToString());
break;
case (int)ProStockAttributeEnum.研发:
warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA73.ToString());
break;
default:
throw new Exception($"未找到{barCode}胶框信息库存属性");
}
Dt_Warehouse warehouseLocation = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA71.ToString());
Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == warehouseLocation.WarehouseId);
if (locationInfo == null)
{
return content.Error($"未找到{warehouse.WarehouseCode}货位信息");
}
proStockInfo.StockStatus = StockStatusEmun.成品余料回库.ObjToInt();
proStockInfo.proStockInfoDetails.ForEach(x =>
{
x.ProOutDetailStatus = StockStatusEmun.成品余料回库.ObjToInt();
});
Dt_Task newTask = new Dt_Task()
{
CurrentAddress = startPoint,
Grade = 0,
NextAddress = "",
PalletCode = proStockInfo.PalletCode,
Roadway = locationInfo.RoadwayNo,
SourceAddress = startPoint,
TargetAddress = "",
TaskType = TaskTypeEnum.InProductBack.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = warePoint.WarehouseId,
PalletType = proStockInfo.PalletType,
MaterielCode = proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).FirstOrDefault()?.ProductCode,
Quantity = (float)proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).Sum(x => x.StockPcsQty)
};
_unitOfWorkManage.BeginTran();
int taskId = BaseDal.AddData(newTask);
newTask.TaskId = taskId;
_stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
_stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfo.proStockInfoDetails);
_unitOfWorkManage.CommitTran();
//推送任务
PushTasksToWCS(new List { newTask });
content.OK("发送成功");
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
content.Error(ex.Message);
}
return content;
}
///
/// 空框回库
///
public WebResponseContent EmptyBackTask(string barCode, string startPoint)
{
WebResponseContent content = new WebResponseContent();
try
{
string palletCode = @"^C\d{5}$"; // 正则表达式
bool isValid = Regex.IsMatch(barCode, palletCode);
if (!isValid)
{
return content.Error($"框码格式错误{barCode}");
}
if (!OutStartPonits.Contains(startPoint))
{
return content.Error($"起点错误{startPoint}");
}
//判断当前点位是否重复
Dt_Task taskOldPoint = BaseDal.QueryFirst(x => x.SourceAddress == startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt() || x.TaskStatus == TaskStatusEnum.Line_Execute.ObjToInt() || x.TaskStatus == TaskStatusEnum.Line_Executing.ObjToInt()));
//if (taskOldPoint != null)
//{
// return content.Error($"站点{startPoint}已存在任务");
//}
Dt_Task taskOld = BaseDal.QueryFirst(x => x.PalletCode == barCode);
if (taskOld != null)
{
return content.Error($"胶框{barCode}任务已存在");
}
//if (_stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode) != null)
//{
// return content.Error($"胶框{barCode}库存信息已存在");
//}
//todo:临时解绑
Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode);
if (_stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode) != null)
{
proStockInfo.PalletCode = proStockInfo.PalletCode + ":" + DateTime.Now.ToString("MM/dd");
}
//获取成品平库
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
Dt_Task newTask = new Dt_Task()
{
CurrentAddress = startPoint,
Grade = 0,
NextAddress = "",
PalletCode = barCode,
Roadway = "CL01_CP",
SourceAddress = startPoint,
TargetAddress = "",
TaskType = TaskTypeEnum.EmptyProductBack.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = warehouse.WarehouseId,
PalletType = 1
};
_unitOfWorkManage.BeginTran();
int taskId = BaseDal.AddData(newTask);
if (proStockInfo!=null)
{
_stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
}
newTask.TaskId = taskId;
_unitOfWorkManage.CommitTran();
//推送任务
PushTasksToWCS(new List { newTask });
content.OK("发送成功");
}
catch (Exception ex)
{
content.Error(ex.Message);
}
return content;
}
}
}