using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Enums;
using WIDESEA_Core;
using WIDESEA_DTO.Stock;
using WIDESEA_Model.Models;
using WIDESEA_Core.Helper;
using Microsoft.AspNetCore.Http;
using System.Reflection.Metadata;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using System.Diagnostics;
using Newtonsoft.Json;
using System.Security.Policy;
using static WIDESEA_ITaskInfoService.ITaskService;
using MailKit.Search;
using WIDESEA_Common.Log;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
namespace WIDESEA_TaskInfoService
{
public partial class TaskService
{
public string ReceiveWMSTask = WIDESEA_Core.Helper.AppSettings.Configuration["ReceiveWMSTask"];
///
/// 手动生成空托出库
///
///
///
public WebResponseContent EmptyOutbound(SaveModel saveModel)
{
try
{
int Materialweight = int.Parse(saveModel.MainData["cacheNo"].ToString());
int stackcount = int.Parse(saveModel.MainData["cachcount"].ToString());
List stockInfo = _stockService.StockInfoService.Repository.QueryData(x => x.Wlstatus == (int)InventoryMaterialStatus.空托 && x.MaterialType== Materialweight).Take(stackcount).ToList(); //拿Materialweight当类型
List dt_Tasks = new List();
foreach (var item in stockInfo)
{
if (stockInfo == null)
{
return WebResponseContent.Instance.Error("未找到空托盘库存");
}
Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == item.LocationCode);
if (locationInfo == null)
{
return WebResponseContent.Instance.Error("未找到空托盘库存对应的货位信息");
}
Dt_Task task = new Dt_Task()
{
CurrentAddress = item.LocationCode,
Grade = 0,
NextAddress = "1080",
PalletCode = item.PalletCode,
Roadway = "1",
SourceAddress = item.LocationCode,
TargetAddress = "1080",
TaskStatus = OutTaskStatusEnum.OutNew.ObjToInt(),
TaskType = TaskTypeEnum.Outbound.ObjToInt(),
Depth = locationInfo.Depth,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
Materialweight = item.Materialweight,
WagonModel = item.WagonModel, //车号
WagonName = item.WagonName, //部件名称
Wagonnumber = item.Wagonnumber, //车型
Wagongroup = item.Wagongroup, //车组号
};
int beforeStatus = locationInfo.LocationStatus;
item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
locationInfo.LocationStatus = LocationStatusEnum.PalletLock.ObjToInt();
_stockService.StockInfoService.UpdateData(item);
_basicService.LocationInfoService.UpdateData(locationInfo);
_basicService.LocationInfoService.UpdateLocationLock(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false);
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), "", task.TaskNum);
dt_Tasks.Add(task);
}
_unitOfWorkManage.BeginTran();
var responses = HttpHelper.Post(ReceiveWMSTask, dt_Tasks, "下发任务入库");
BaseDal.AddData(dt_Tasks);
_unitOfWorkManage.CommitTran();
return WebResponseContent.Instance.OK("呼叫成功");
}
catch (Exception ex)
{
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// 人工手动出库(删除库存)
///
///
///
public WebResponseContent ManualOutboundDeleteinventory(SaveModel saveModel)
{
WebResponseContent content = new WebResponseContent();
try
{
List dtstockt = new List();
List locations = new List();
List dtstocktdetail = new List();
for (int i = 0; i < saveModel.DelKeys.Count; i++)
{
Dt_StockInfo stockt = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == saveModel.DelKeys[i].ToString());
if (stockt.StockStatus == (int)StockStatusEmun.已入库)
{
Dt_StockInfoDetail stocktdetail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == stockt.Id);
Dt_LocationInfo locationinfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockt.LocationCode);
Dt_Task_Hty task_Hty = new Dt_Task_Hty()
{
TaskNum = 001,
PalletCode = stockt.PalletCode,
Roadway = locationinfo.RoadwayNo,
TaskType = (int)TaskTypeEnum.Outbound,
TaskStatus = (int)OutTaskStatusEnum.OutFinish,
SourceAddress = locationinfo.LocationCode,
TargetAddress = locationinfo.LocationCode,
CurrentAddress = locationinfo.LocationCode,
NextAddress = locationinfo.LocationCode,
Grade = 1,
Dispatchertime = DateTime.Now,
Creater = App.User.UserName,
CreateDate = DateTime.Now,
ModifyDate = DateTime.Now,
Modifier = App.User.UserName,
Remark = "人工出库",
PLCTo = 1,
PalletCodequantity = 1,
MaterialType = 1
};
_taskHtyService.AddData(task_Hty);
locationinfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
dtstockt.Add(stockt);
locations.Add(locationinfo);
if (stockt.MaterialType != (int)InventoryMaterialType.空托)
{
dtstocktdetail.Add(stocktdetail);
}
WriteLog.GetLog("人工手动删除库存信息").Write($"托盘条码:{stockt.PalletCode},库位编号:{stockt.LocationCode}", $"人工出库库存");
}
else
{
return content = WebResponseContent.Instance.Error($"出库失败,该库存信息不可进行出库");
}
}
_unitOfWorkManage.BeginTran();
_stockService.StockInfoService.Repository.DeleteData(dtstockt);
_stockService.StockInfoDetailService.Repository.DeleteData(dtstocktdetail);
_basicService.LocationInfoService.Repository.UpdateData(locations);
_unitOfWorkManage.CommitTran();
content = WebResponseContent.Instance.OK();
return content;
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return content = WebResponseContent.Instance.Error($"手动出库信息失败,报错信息:{ex.Message}");
throw;
}
}
///
/// 任务取消
///
///
///
public WebResponseContent Cancelinventory(int taskNum)
{
WebResponseContent content = new WebResponseContent();
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if(task != null)
{
if(task.TaskType== (int)TaskTypeEnum.Outbound || task.TaskType == (int)TaskTypeEnum.PalletOutbound || task.TaskType == (int)TaskTypeEnum.PalletMaintenanceout)
{
//处理出库的逻辑
Dt_LocationInfo locationinfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
if (locationinfo.LocationStatus == LocationStatusEnum.Lock.ObjToInt())
{
locationinfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
}
if (locationinfo.LocationStatus == LocationStatusEnum.PalletLock.ObjToInt())
{
locationinfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt();
}
_basicService.LocationInfoService.Repository.UpdateData(locationinfo);
Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode);
stockInfo.StockStatus = (int)StockStatusEmun.已入库;
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
BaseDal.DeleteData(task);
BaseDal.DeleteAndMoveIntoHty(task, OperateType.人工删除);
WriteLog.GetLog("任务日志").Write($"出库任务取消成功,托盘条码:{task.PalletCode}", $"任务取消");
//WebResponseContent webResponseContent = HttpHelper.Post(ReceiveWCSTask, task.TaskNum, "任务删除");
return content = WebResponseContent.Instance.Error($"出库任务取消成功");
}
else if(task.TaskType == (int)TaskTypeEnum.Inbound || task.TaskType == (int)TaskTypeEnum.PalletInbound /*|| task.TaskType == (int)TaskTypeEnum.PalletMaintenancein*/)
{
//处理出库的逻辑
Dt_LocationInfo locationinfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
if (locationinfo.LocationStatus == LocationStatusEnum.Lock.ObjToInt() || locationinfo.LocationStatus == LocationStatusEnum.PalletLock.ObjToInt())
{
locationinfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
}
_basicService.LocationInfoService.Repository.UpdateData(locationinfo);
Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode);
_stockService.StockInfoService.Repository.DeleteData(stockInfo);
BaseDal.DeleteData(task);
BaseDal.DeleteAndMoveIntoHty(task, OperateType.人工删除);
WriteLog.GetLog("任务日志").Write($"入库任务取消成功,托盘条码:{task.PalletCode}", $"任务取消");
//WebResponseContent webResponseContent = HttpHelper.Post(ReceiveWCSTask, task.TaskNum, "任务删除");
return content = WebResponseContent.Instance.Error($"入库任务取消成功");
}
else if (task.TaskType == (int)TaskTypeEnum.RelocationIn) //库内移库
{
//处理出库的逻辑
Dt_LocationInfo locationinfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
if (locationinfo.LocationStatus == LocationStatusEnum.Lock.ObjToInt() || locationinfo.LocationStatus == LocationStatusEnum.PalletLock.ObjToInt())
{
locationinfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
}
_basicService.LocationInfoService.Repository.UpdateData(locationinfo);
Dt_LocationInfo locationinfo2 = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
if (locationinfo2.LocationStatus == LocationStatusEnum.Lock.ObjToInt())
{
locationinfo2.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
}
if (locationinfo2.LocationStatus == LocationStatusEnum.PalletLock.ObjToInt())
{
locationinfo2.LocationStatus = LocationStatusEnum.Pallet.ObjToInt();
}
_basicService.LocationInfoService.Repository.UpdateData(locationinfo2);
Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode);
stockInfo.StockStatus = (int)StockStatusEmun.已入库;
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
Dt_StockInfoDetail stocktdetail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == stockInfo.Id);
if (stocktdetail != null)
{
stocktdetail.Status = (int)StockStatusEmun.已入库;
_stockService.StockInfoDetailService.Repository.UpdateData(stocktdetail);
}
BaseDal.DeleteData(task);
BaseDal.DeleteAndMoveIntoHty(task, OperateType.人工删除);
WriteLog.GetLog("任务日志").Write($"入库任务取消成功,托盘条码:{task.PalletCode}", $"任务取消");
WebResponseContent webResponseContent = HttpHelper.Post(ReceiveWCSTask, task.TaskNum, "任务删除");
return content = WebResponseContent.Instance.Error($"入库任务取消成功");
}
else
{
return content = WebResponseContent.Instance.Error($"该任务的任务类型异常,取消失败");
}
}
else
{
return content = WebResponseContent.Instance.Error($"未找到任务号");
}
}
///
/// 检修出库方法
///
///
///
public WebResponseContent ManualOutbound(SaveModel saveModel)
{
WebResponseContent content = new WebResponseContent();
try
{
List dtstockt = new List();
List locations = new List();
List taskdt = new List();
List stocktData = _stockService.StockInfoService.Repository.QueryData(x => x.StockStatus == (int)StockStatusEmun.已入库 && x.MaterialType == (int)InventoryMaterialType.满托);
List locationinfoData = _basicService.LocationInfoService.Repository.QueryData(x => x.LocationStatus == LocationStatusEnum.InStock.ObjToInt());
string json = saveModel.DelKeys[0].ToString();
List palletCodes = JsonConvert.DeserializeObject>(json);
int crttask= _sys_CreateTask.QtCreatea(saveModel.DelKeys[1].ToString());
if (crttask == 2)
{
return content = WebResponseContent.Instance.Error($"该站台出入任务已满,不可出库");
}
if (palletCodes.Count >2)
{
return content = WebResponseContent.Instance.Error($"最多一个站台只可出库两个");
}
foreach (var palletCode in palletCodes)
{
Dt_StockInfo stockt = stocktData.FirstOrDefault(x => x.PalletCode == palletCode);
if (stockt != null)
{
if (stockt.StockStatus == (int)StockStatusEmun.已入库 && (stockt.Wlstatus == (int)InventoryMaterialStatus.半检修 || stockt.Wlstatus == (int)InventoryMaterialStatus.待修))
{
Dt_LocationInfo locationinfo = locationinfoData.FirstOrDefault(x => x.LocationCode == stockt.LocationCode);
if (locationinfo != null)
{
stockt.StockStatus = (int)StockStatusEmun.检修出库锁定;
if (locationinfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
{
locationinfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
}
//添加检修任务观看
Sys_CreateTask sys_Create = new Sys_CreateTask()
{
Current_PalletCode= stockt.PalletCode,
Current_Carset= stockt.Wagongroup,
Current_Models = stockt.Wagonnumber,
Current_Parts = stockt.WagonName,
Current_count = stockt.Materialweight,
Current_Vehiclenumber = stockt.WagonModel,
Current_Static = (int)StockStatusEmun.检修出库锁定,
Creater = App.User.UserName,
CreateDate = DateTime.Now,
CreateSta= saveModel.DelKeys[1].ToString(),
};
//添加进行维修记录
Dt_Repair dt_Repair = new Dt_Repair()
{
Current_PalletCode = stockt.PalletCode,
Current_Carset = stockt.Wagongroup,
Current_Models = stockt.Wagonnumber,
Current_Parts = stockt.WagonName,
Current_count = stockt.Materialweight,
Current_Vehiclenumber = stockt.WagonModel,
Current_Static = (int)StockStatusEmun.检修出库锁定,
Creater = App.User.UserName,
CreateDate = DateTime.Now,
CreateSta = saveModel.DelKeys[1].ToString(),
};
Dt_Task dt_Task = new()
{
PalletCode = stockt.PalletCode,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
Roadway = locationinfo.RoadwayNo,
TaskType = TaskTypeEnum.PalletMaintenanceout.ObjToInt(),
TaskStatus = AGVTaskStatusEnum.AGVout_Executing.ObjToInt(),
SourceAddress = locationinfo.LocationCode,
TargetAddress = saveModel.DelKeys[1].ToString(),
CurrentAddress = locationinfo.LocationCode,
NextAddress = saveModel.DelKeys[1].ToString(),
Grade = 1,
Creater = App.User.UserName,
Depth = locationinfo.Depth,
CreateDate = DateTime.Now,
PLCTo = int.Parse(saveModel.DelKeys[1].ToString()),
MaterialType = stockt.MaterialType,
Materialweight = stockt.Materialweight,
WagonModel = stockt.WagonModel, //车号
WagonName = stockt.WagonName, //部件名称
Wagonnumber = stockt.Wagonnumber, //车型
Wagongroup = stockt.Wagongroup //车组号
};
_sys_CreateTask.AddData(sys_Create);
_dtRepair.AddData(dt_Repair);
dtstockt.Add(stockt);
locations.Add(locationinfo);
taskdt.Add(dt_Task);
}
else
{
return content = WebResponseContent.Instance.Error($"出库失败,未找到对应的库位信息,请核对!!!,出库条码:{palletCode}");
}
}
else
{
return content = WebResponseContent.Instance.Error($"出库失败,请选择已入库且(待修或半检修)的物料出库!!!,出库条码:{palletCode}");
}
}
else
{
return content = WebResponseContent.Instance.Error($"出库失败,未找到对应条码的库存信息,出库条码:{palletCode}");
}
}
_unitOfWorkManage.BeginTran();
if (dtstockt.Count > 0)
{
_stockService.StockInfoService.Repository.UpdateData(dtstockt);
_basicService.LocationInfoService.Repository.UpdateData(locations);
BaseDal.AddData(taskdt);
}
_unitOfWorkManage.CommitTran();
var responses = HttpHelper.Post(ReceiveWMSTask, taskdt, "下发任务入库");
content = WebResponseContent.Instance.OK($"出库成功,出库总数:{palletCodes.Count},成功数量:{dtstockt.Count}");
return content;
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return content = WebResponseContent.Instance.Error($"出库失败,报错信息:{ex.Message}");
throw;
}
}
public WebResponseContent ManualOutbound2(SaveModel saveModel)
{
WebResponseContent content = new WebResponseContent();
try
{
List dtstockt = new List();
List locations = new List();
List taskdt = new List();
List stocktData = _stockService.StockInfoService.Repository.QueryData(x => x.StockStatus == (int)StockStatusEmun.已入库 && x.MaterialType == (int)InventoryMaterialType.满托);
List locationinfoData = _basicService.LocationInfoService.Repository.QueryData(x => x.LocationStatus == LocationStatusEnum.InStock.ObjToInt());
string json = saveModel.DelKeys[0].ToString();
if (!json.StartsWith("[") && !json.EndsWith("]"))
{
json = $"[{json}]";
}
List palletCodes = JsonConvert.DeserializeObject>(json);
foreach (var palletCode in palletCodes)
{
Dt_StockInfo stockt = stocktData.FirstOrDefault(x => x.PalletCode == palletCode);
if (stockt != null)
{
if (stockt.StockStatus == (int)StockStatusEmun.已入库 && (stockt.Wlstatus == (int)InventoryMaterialStatus.已修 || stockt.Wlstatus == (int)InventoryMaterialStatus.合格))
{
Dt_LocationInfo locationinfo = locationinfoData.FirstOrDefault(x => x.LocationCode == stockt.LocationCode);
if (locationinfo != null)
{
stockt.StockStatus = (int)StockStatusEmun.出库锁定;
if (locationinfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
{
locationinfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
}
Dt_Task dt_Task = new()
{
PalletCode = stockt.PalletCode,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
Roadway = locationinfo.RoadwayNo,
TaskType = TaskTypeEnum.Outbound.ObjToInt(),
TaskStatus = InTaskStatusEnum.InNew.ObjToInt(),
SourceAddress = locationinfo.LocationCode,
TargetAddress = "1070",
CurrentAddress = locationinfo.LocationCode,
NextAddress = "1070",
Grade = 1,
Creater = App.User.UserName,
Depth = locationinfo.Depth,
CreateDate = DateTime.Now,
PLCTo = 1,
MaterialType = stockt.MaterialType,
Materialweight = stockt.Materialweight,
WagonModel = stockt.WagonModel, //车号
WagonName = stockt.WagonName, //部件名称
Wagonnumber = stockt.Wagonnumber, //车型
Wagongroup = stockt.Wagongroup //车组号
};
dtstockt.Add(stockt);
locations.Add(locationinfo);
taskdt.Add(dt_Task);
}
else
{
return content = WebResponseContent.Instance.Error($"出库失败,未找到对应的库位信息,请核对!!!,出库条码:{palletCode}");
}
}
else
{
return content = WebResponseContent.Instance.Error($"出库失败,请选择已入库且(待修或半检修)的物料出库!!!,出库条码:{palletCode}");
}
}
else
{
return content = WebResponseContent.Instance.Error($"出库失败,未找到对应条码的库存信息,出库条码:{palletCode}");
}
}
_unitOfWorkManage.BeginTran();
if (dtstockt.Count > 0)
{
_stockService.StockInfoService.Repository.UpdateData(dtstockt);
_basicService.LocationInfoService.Repository.UpdateData(locations);
BaseDal.AddData(taskdt);
}
_unitOfWorkManage.CommitTran();
var responses = HttpHelper.Post(ReceiveWMSTask, taskdt, "下发任务入库");
content = WebResponseContent.Instance.OK($"出库成功,出库总数:{palletCodes.Count},成功数量:{dtstockt.Count}");
return content;
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return content = WebResponseContent.Instance.Error($"出库失败,报错信息:{ex.Message}");
throw;
}
}
}
}