using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.APIEnum;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OtherEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.MES;
using WIDESEA_ITaskInfoRepository;
using WIDESEA_ITaskInfoService;
using WIDESEA_Model.Models;
using WIDESEA_Common.OrderEnum;
using System.Diagnostics.Metrics;
using System.Reflection.Metadata;
using WIDESEA_DTO.Task;
using WIDESEA_DTO.Stock;
using SqlSugar;
namespace WIDESEA_TaskInfoService
{
public partial class TaskService
{
static object lock_out = new object();
///
/// 测试架出仓
///
///
///
public MesResponseContent TestToolOut(TestToolOutModel model)
{
lock (lock_out)
{
MesResponseContent responseContent = new MesResponseContent();
try
{
Dt_Task exsit = Repository.QueryFirst(x => x.TargetAddress == model.TargetAddressCode);
if (exsit != null)
{
return responseContent.Error($"目标地址重复");
}
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
//获取库存记录
List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x =>
x.WarehouseId == warehouse.WarehouseId &&
x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList();
Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.ToolCode));
if (stockInfo == null)
{
return responseContent.Error($"测试架:{model.ToolCode}无可用库存");
}
Dt_Task exsit2 = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
if (exsit2 != null)
{
return responseContent.Error($"测试架批次号重复");
}
Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode &&
x.WarehouseId == stockInfo.WarehouseId &&
x.LocationStatus == (int)LocationStatusEnum.InStock &&
(x.EnableStatus == (int)EnableStatusEnum.Normal || x.EnableStatus == (int)EnableStatusEnum.OnlyOut));
if (locationInfo == null)
{
return responseContent.Error($"测试架货位。。。。。。。。。:{stockInfo.LocationCode}出库条件不满足");
}
//生成测试架出库任务 锁定库存 更改货位状态
Dt_Task taskOut = new()
{
CurrentAddress = stockInfo.LocationCode,
Grade = 0,
PalletCode = stockInfo.PalletCode,
NextAddress = "",
Roadway = locationInfo.RoadwayNo,
SourceAddress = stockInfo.LocationCode,
TargetAddress = model.TargetAddressCode,
TaskStatus = (int)TaskStatusEnum.New,
TaskType = (int)TaskTypeEnum.Outbound,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
PalletType = stockInfo.PalletType,
WarehouseId = stockInfo.WarehouseId,
};
stockInfo.StockStatus = (int)StockStatusEmun.出库锁定;
LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus;
locationInfo.LocationStatus = (int)LocationStatusEnum.Lock;
//判断是否有出库单信息
_unitOfWorkManage.BeginTran();
//更新库存状态
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
//更新货位状态
_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
//新建任务
BaseDal.AddData(taskOut);
//加入货位变动记录
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", taskOut.TaskNum);
_unitOfWorkManage.CommitTran();
//将任务推送到WCS
PushTasksToWCS(new List() { taskOut }, "AGV_CSJ");
responseContent.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
responseContent.Error(ex.Message);
}
return responseContent;
}
}
///
/// 测试架退库
///
///
public MesResponseContent TestToolBack(TestToolBackModel backModel)
{
MesResponseContent responseContent = new MesResponseContent();
try
{
//获取测试架原库存信息
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
//获取库存记录
List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x =>
x.WarehouseId == warehouse.WarehouseId &&
x.StockStatus == (int)StockStatusEmun.出库完成).Includes(x => x.Details).ToList();
Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == backModel.TestToolCode));
if (stockInfo == null)
{
return responseContent.Error($"{backModel.TestToolCode}库存信息不存在");
}
//生成退库任务
Dt_Task taskIn = new()
{
CurrentAddress = backModel.SourceAddressCode,
Grade = 0,
PalletCode = stockInfo.PalletCode,
NextAddress = "",
Roadway = "",
SourceAddress = backModel.SourceAddressCode,
TargetAddress = "",
TaskStatus = (int)TaskStatusEnum.New,
TaskType = (int)TaskTypeEnum.ProductionReturn,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
PalletType = stockInfo.PalletType,
WarehouseId = stockInfo.WarehouseId,
};
//更改库存状态
stockInfo.StockStatus = StockStatusEmun.退库.ObjToInt();
BaseDal.AddData(taskIn);
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
//将任务推送到WCS
PushTasksToWCS(new List() { taskIn }, "AGV_CSJ"); ;
responseContent.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
responseContent.Error(ex.Message);
}
return responseContent;
}
///
/// 测试架报废
///
///
public MesResponseContent TestScrap(TestToolScrap toolScraps)
{
MesResponseContent responseContent = new MesResponseContent();
try
{
//获取测试架批次号库存
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
//获取库存记录
List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x =>
x.WarehouseId == warehouse.WarehouseId &&
x.StockStatus == (int)StockStatusEmun.出库完成).Includes(x => x.Details).ToList();
List stockInfoUpdates = new List();
List stockInfoDetails = new List();
foreach (var item in toolScraps.ToolCodes)
{
Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == item));
if (stockInfo == null)
{
return responseContent.Error($"{item}库存信息不存在");
}
stockInfoUpdates.Add(stockInfo);
stockInfoDetails.Add(stockInfo.Details.FirstOrDefault());
}
//清除库存信息
_unitOfWorkManage.BeginTran();
_stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfoUpdates, OperateTypeEnum.自动删除);
_stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfoDetails, OperateTypeEnum.自动删除);
_unitOfWorkManage.CommitTran();
responseContent.OK($"报废成功");
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
responseContent.Error(ex.Message);
}
return responseContent;
}
///
/// 同步测试架寿命
///
///
///
public WebResponseContent TestSynStock(TestToolSynInfo toolSynInfo)
{
WebResponseContent content = new WebResponseContent();
try
{
Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_TestToolSync.ToString());
MESRoot root = new MESRoot()
{
From = "WMS",
DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
Content = toolSynInfo
};
JsonSerializerSettings settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
string request = JsonConvert.SerializeObject(root, settings);
string response = HttpMesHelper.Post(apiInfo.ApiAddress, request);
MesResponseContent mesResponseContent = response.DeserializeObject();
//调用接口
if (mesResponseContent.BSucc == true)
{
content.OK(mesResponseContent.StrMsg);
}
else
{
content.Error(mesResponseContent.StrMsg);
}
}
catch (Exception ex)
{
content.Error(ex.Message);
}
return content;
}
///
/// 物料出库,WMS同步出库物料批次至MES
///
///
///
public WebResponseContent UploadMesMaterialLotaAcept(MesMaterialLotaAceptModel model)
{
WebResponseContent content = new WebResponseContent();
try
{
Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_MaterialLotaAcept.ToString());
MESRoot root = new MESRoot()
{
From = "WMS",
DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
Content = model
};
JsonSerializerSettings settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
string request = JsonConvert.SerializeObject(root, settings);
string response = HttpMesHelper.Post(apiInfo.ApiAddress, request);
MesResponseContent mesResponseContent = response.DeserializeObject();
//调用接口
if (mesResponseContent.BSucc == true)
{
content.OK(mesResponseContent.StrMsg);
}
else
{
content.Error(mesResponseContent.StrMsg);
}
}
catch (Exception ex)
{
content.Error(ex.Message);
}
return content;
}
///
/// WMS同步成品出库至MES
///
///
///
public WebResponseContent ShipmentOrderSync(MesShipmentOrderSync model)
{
WebResponseContent content = new WebResponseContent();
try
{
Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_ShipmentOrderSync.ToString());
MESRoot root = new MESRoot()
{
From = "WMS",
DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
Content = model
};
JsonSerializerSettings settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
string request = JsonConvert.SerializeObject(root, settings);
string response = HttpMesHelper.Post(apiInfo.ApiAddress, request);
MesResponseContent mesResponseContent = response.DeserializeObject();
//调用接口
if (mesResponseContent.BSucc == true)
{
content.OK(mesResponseContent.StrMsg);
}
else
{
content.Error(mesResponseContent.StrMsg);
}
}
catch (Exception ex)
{
content.Error(ex.Message);
}
return content;
}
///
///
///
///
///
///
///
///
///
///
///
public MesMaterialLotaAceptModel GetMesMaterialLotaAceptModel(Dt_StockInfo stockInfo, Dt_StockInfoDetail stockInfoDetail, string taskNo, string warehouseCode, float quantity, string cutedType = "", float ppWidth = 0)
{
MesMaterialLotaAceptModel model = new MesMaterialLotaAceptModel()
{
CarrierCode = stockInfo.PalletCode,
CutedType = cutedType,
ExpirationDate = stockInfoDetail.EffectiveDate,
MaterialBarCode = stockInfoDetail.SerialNumber,
MaterialCode = stockInfoDetail.MaterielCode,
MaterialLot = stockInfoDetail.MaterielCode + "," + stockInfoDetail.BatchNo,
MaterialName = stockInfoDetail.MaterielName,
PPWidth = ppWidth,
ProductionDate = stockInfoDetail.ProductionDate,
Quantity = quantity,
Supplier = "",
TaskNo = taskNo,
Type = 1,
WarehouseArea = warehouseCode,
WarehouseLocation = warehouseCode
};
return model;
}
///
/// 基板出库
///
///
///
public MesResponseContent SubstrateOut(SubstrateOutModel model)
{
try
{
string line = string.Empty;
if (!model.Line.Contains("SCUTL"))
{
line = WarehouseEnum.HA58.ToString();
}
else
{
line = WarehouseEnum.HA57.ToString();
}
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == line);
if (warehouse == null)
{
return MesResponseContent.Instance.Error($"仓库基础信息未配置");
}
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterialCode);
if (materielInfo == null)
{
return MesResponseContent.Instance.Error($"未找到该物料信息");
}
Dt_MesOutboundOrder mesOutboundOrder = new Dt_MesOutboundOrder()
{
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
Line = model.Line,
MaterialCode = model.MaterialCode,
MaterialName = model.MaterialName,
OrderQuantity = model.RequiredQuantity,
TaskNo = model.TaskNo,
Unit = model.Unit,
OrderType = MesOutboundOrderTypeEnum.SubstrateOut.ObjToInt(),
OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(),
WarehouseId = warehouse.WarehouseId
};
List tasks = new List();
List? stockInfos = null;
List? outStockLockInfos = null;
List? locationInfos = null;
{
(List, Dt_MesOutboundOrder, List, List) result = _outboundService.MesOutboundOrderService.AssignStockOutbound(mesOutboundOrder);
if (result.Item1 != null && result.Item1.Count > 0)
{
tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound);
result.Item2.OrderStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
result.Item3.ForEach(x =>
{
x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
});
stockInfos = result.Item1;
mesOutboundOrder = result.Item2;
outStockLockInfos = result.Item3;
locationInfos = result.Item4;
}
else
{
throw new Exception("无库存");
}
}
tasks.ForEach(x =>
{
x.TargetAddress = model.Line;
});
_unitOfWorkManage.BeginTran();
int id = BaseDal.AddData(tasks);
outStockLockInfos.ForEach(x =>
{
x.OrderNo = mesOutboundOrder.TaskNo;
x.OrderDetailId = id;
});
_outboundService.MesOutboundOrderService.Repository.AddData(mesOutboundOrder);
if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
{
WebResponseContent content = _outboundService.MesOutboundOrderService.LockOutboundStockDataUpdate(stockInfos, outStockLockInfos, locationInfos, tasks: tasks);
if (!content.Status)
{
_unitOfWorkManage.RollbackTran();
return MesResponseContent.Instance.Error(content.Message);
}
}
_unitOfWorkManage.CommitTran();
PushTasksToWCS(tasks);
return MesResponseContent.Instance.OK();
}
catch (Exception ex)
{
return MesResponseContent.Instance.Error(ex.Message);
}
}
///
/// 基板余料退库
///
///
///
public MesResponseContent SubstrateBack(SubstrateBackModel model)
{
try
{
Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => model.CarrierCode.Contains(x.CodeStartStr));
if (palletTypeInfo == null)
{
return MesResponseContent.Instance.Error($"未识别该托盘类型,请确认托盘号");
}
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == palletTypeInfo.WarehouseId);
Dt_StockInfo_Hty stockInfo_Hty = _stockRepository.StockInfo_HtyRepository.QueryData(x => x.PalletCode == model.CarrierCode).OrderByDescending(x => x.SourceId).First();
Dt_StockInfoDetail_Hty stockInfoDetail_Hty = _stockRepository.StockInfoDetail_HtyRepository.QueryFirst(x => x.StockId == stockInfo_Hty.SourceId);
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
{
BatchNo = stockInfoDetail_Hty?.BatchNo ?? "",
EffectiveDate = model.ExpirationDate,
MaterielCode = model.MaterialCode,
InboundOrderRowNo = stockInfoDetail_Hty?.InboundOrderRowNo ?? 0,
MaterielName = model.MaterialCode,
ProductionDate = model.ProductionDate,
OrderNo = stockInfoDetail_Hty?.OrderNo ?? "",
OutboundQuantity = 0,
SerialNumber = stockInfoDetail_Hty?.SerialNumber ?? "0",
StockQuantity = model.Quantity,
Status = model.Quantity <= 0.0 ? StockStatusEmun.MES空托退库.ObjToInt() : StockStatusEmun.MES退库.ObjToInt(),
Unit = model.Unit
};
Dt_StockInfo stockInfo = new Dt_StockInfo()
{
PalletCode = model.CarrierCode,
PalletType = palletTypeInfo.PalletType,
WarehouseId = warehouse.WarehouseId,
StockStatus = stockInfoDetail.StockQuantity <= 0.0 ? StockStatusEmun.MES空托退库.ObjToInt() : StockStatusEmun.MES退库.ObjToInt(),
Details = new List { stockInfoDetail },
Remark = stockInfoDetail.StockQuantity <= 0.0 ? StockStatusEmun.MES空托退库.ToString() : StockStatusEmun.MES退库.ToString()
};
//Dt_Task task = new Dt_Task()
//{
// PalletCode = stockInfo.PalletCode,
// CurrentAddress = "",
// NextAddress = "",
// PalletType = stockInfo.PalletType,
// Roadway = "RGV01_BC",
// SourceAddress = "RGV01_BC",
// TargetAddress = "",
// TaskStatus = TaskStatusEnum.New.ObjToInt(),
// TaskType = TaskTypeEnum.MesMatReturn.ObjToInt(),
// WarehouseId = warehouse.WarehouseId
//};
_unitOfWorkManage.BeginTran();
Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
//BaseDal.AddData(task);
_unitOfWorkManage.CommitTran();
return MesResponseContent.Instance.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return MesResponseContent.Instance.Error(ex.Message);
}
}
///
/// PP大卷出库-进行分卷
///
///
///
public MesResponseContent PPSubsectionOut(PPSubsectionOutModel model)
{
MesResponseContent modelCount = new MesResponseContent();
try
{
Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA58.ToString());
if (warehouse == null)
{
return MesResponseContent.Instance.Error("仓库信息未配置");
}
Dt_MesPPOutboundOrder mesPPOutboundOrder = BaseDal.Db.Queryable().Where(x => x.TaskNo == model.TaskNo).Includes(x => x.Details).First();
if (mesPPOutboundOrder != null)
{
return MesResponseContent.Instance.Error("已存在此任务单号");
}
List mesPPOutboundOrderDetail = new List();
foreach (var item in model.Carriers)
{
//mesPPOutboundOrderDetail.Add(_mapper.Map(item));
Dt_MesPPOutboundOrderDetail dt_MesPPOutboundOrderDetail = new Dt_MesPPOutboundOrderDetail
{
CarrierCode = item.CarrierCode,
Warehouse = item.Warehouse,
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt()
};
mesPPOutboundOrderDetail.Add(dt_MesPPOutboundOrderDetail);
}
Dt_MesPPOutboundOrder mesOutboundOrder = new Dt_MesPPOutboundOrder()
{
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
MaterialCode = model.MaterialCode,
MaterialName = model.MaterialName,
OrderQuantity = model.RequiredQuantity,
TaskNo = model.TaskNo,
Unit = model.Unit,//PP需要转换成米(需求平方(PNL数*面积)/宽度)
Width = model.Width,
TargetAddressCode = model.TargetAddressCode,
OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(),
OrderType = OutOrderTypeEnum.Issue.ObjToInt(),
WarehouseId = warehouse.WarehouseId,
Details = mesPPOutboundOrderDetail
};
#region
//Db.InsertNav(mesOutboundOrder).Include(x=>x.Details).ExecuteCommand();
// List tasks = new List();
// List? stockInfos = null;
// List? outStockLockInfos = null;
// List? locationInfos = null;
// {
//(List, Dt_MesPPOutboundOrder, List, List) result = _outboundService.MesPPOutboundOrderService.AssignStockOutbound(mesOutboundOrder);
// if (result.Item1 != null && result.Item1.Count > 0)
// {
// tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound);
// result.Item2.OrderStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
// result.Item3.ForEach(x =>
// {
// x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
// });
// stockInfos = result.Item1;
// mesOutboundOrder = result.Item2;
// outStockLockInfos = result.Item3;
// locationInfos = result.Item4;
// mesPPOutboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
// }
// else
// {
// throw new Exception("无库存");
// }
// }
// tasks.ForEach(x =>
// {
// x.TargetAddress = model.TargetAddressCode;
// });
// _unitOfWorkManage.BeginTran();
// int id = BaseDal.AddData(tasks);
// outStockLockInfos.ForEach(x =>
// {
// x.OrderNo = mesOutboundOrder.TaskNo;
// x.OrderDetailId = id;
// });
// //_outboundService.MesPPOutboundOrderService.Repository.AddData(mesOutboundOrder);
// Db.InsertNav(mesOutboundOrder).Include(x => x.Details).ExecuteCommand();
// if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
// {
// WebResponseContent content = _outboundService.MesOutboundOrderService.LockOutboundStockDataUpdate(stockInfos, outStockLockInfos, locationInfos, tasks: tasks);
// if (!content.Status)
// {
// _unitOfWorkManage.RollbackTran();
// return MesResponseContent.Instance.Error(content.Message);
// }
// }
// _unitOfWorkManage.CommitTran();
// PushTasksToWCS(tasks);
//}
#endregion
_unitOfWorkManage.BeginTran();
Db.InsertNav(mesOutboundOrder).Include(x => x.Details).ExecuteCommand();
_unitOfWorkManage.CommitTran();
return MesResponseContent.Instance.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return MesResponseContent.Instance.Error(ex.Message);
}
}
///
/// PP小卷出库
///
///
///
public MesResponseContent PPCutOut(PPCutOutModle model)
{
try
{
Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA58.ToString());
if (warehouse == null)
{
return MesResponseContent.Instance.Error("仓库基础信息未配置");
}
Dt_MesPPCutOutboundOrder mesPPCutOutboundOrder = BaseDal.Db.Queryable().Where(x => x.TaskNo == model.TaskNo).Includes(x => x.Details).First();
if (mesPPCutOutboundOrder != null)
{
return MesResponseContent.Instance.Error("已存在此任务单号");
}
List mesPPCutOutboundOrderDetail = new List();
foreach (var item in model.MaterialDetails)
{
mesPPCutOutboundOrderDetail.Add(_mapper.Map(item));
}
Dt_MesPPCutOutboundOrder mesPPOutboundOrder = new Dt_MesPPCutOutboundOrder()
{
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
TaskNo = model.TaskNo,
OrderType = OutOrderTypeEnum.Issue.ObjToInt(),
OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(),
WarehouseId = warehouse.WarehouseId,
Details = mesPPCutOutboundOrderDetail,
};
_unitOfWorkManage.BeginTran();
Db.InsertNav(mesPPOutboundOrder).Include(x => x.Details).ExecuteCommand();
_unitOfWorkManage.CommitTran();
#region
//List tasks = new List();
//List? stockInfos = null;
//List? outStockLockInfos = null;
//List? locationInfos = null;
//{
//(List, Dt_MesPPCutOutboundOrderDetail, List, List) result = _outboundService.MesPPOutboundOrderService.AssignStockOutbound(mesPPOutboundOrder, mesPPCutOutboundOrderDetail);
// if (result.Item1 != null && result.Item1.Count > 0)
// {
// tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound);
// result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
// result.Item3.ForEach(x =>
// {
// x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
// });
// stockInfos = result.Item1;
// mesPPCutOutboundOrderDetail = result.Item2;
// outStockLockInfos = result.Item3;
// locationInfos = result.Item4;
// }
// else
// {
// throw new Exception("无库存");
// }
//}
//tasks.ForEach(x =>
//{
// x.TargetAddress = mesPPCutOutboundOrderDetail.TargetAddressCode;
//});
//_unitOfWorkManage.BeginTran();
//int id = BaseDal.AddData(tasks);
//outStockLockInfos.ForEach(x =>
//{
// x.OrderNo = mesPPOutboundOrder.TaskNo;
// x.OrderDetailId = id;
//});
////_outboundService.MesPPOutboundOrderService.Repository.AddData(mesOutboundOrder);
//Db.InsertNav(mesPPOutboundOrder).Include(x => x.Details).ExecuteCommand();
//if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
//{
// WebResponseContent content = _outboundService.MesOutboundOrderService.LockOutboundStockDataUpdate(stockInfos, outStockLockInfos, locationInfos, tasks: tasks);
// if (!content.Status)
// {
// _unitOfWorkManage.RollbackTran();
// return MesResponseContent.Instance.Error(content.Message);
// }
//}
//_unitOfWorkManage.CommitTran();
//PushTasksToWCS(tasks, "AGV_PP");
#endregion
return MesResponseContent.Instance.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return MesResponseContent.Instance.Error(ex.Message);
}
}
///
/// PP入库(大卷、小卷、张料)
///
///
///
public MesResponseContent PPBack(PPBackModel model)
{
try
{
//一次只发一卷物料入库明细
foreach (var item in model.MaterialLotInfo)
{
//获取物料信息
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterialCode);
if (materielInfo == null)
{
return MesResponseContent.Instance.Error($"物料{item.MaterialCode}不存在!");
}
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA58.ToString());
if (warehouse == null)
{
return MesResponseContent.Instance.Error($"未找到仓库信息");
}
Dt_MesPPBackInboundOrderDetail mesPPBackInboundOrderDetail = new Dt_MesPPBackInboundOrderDetail()
{
MaterialLot = item.MaterialLot,
MaterielCode = item.MaterialCode,
OrderQuantity = item.Quantity,
CutedWidth = item.CutedWidth,
MaterialLotOld = item.MaterialLotOld,
Unit = item.Unit,
ProductionDate = item.ProductionDate,
EffectiveDate = item.ExpirationDate,
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
};
Dt_MesPPBackInboundOrder mesPPBackInboundOrder = new Dt_MesPPBackInboundOrder()
{
WarehouseId = warehouse.WarehouseId,
SourceAddressCode = model.SourceAddressCode,
CarrierCode = model.CarrierCode,
OrderStatus = InOrderStatusEnum.未开始.ObjToInt(),
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
Details = new List { mesPPBackInboundOrderDetail }
};
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
{
BatchNo = mesPPBackInboundOrderDetail.MaterialLot,
MaterielCode = mesPPBackInboundOrderDetail.MaterielCode,
MaterielName = materielInfo.MaterielName,
OrderNo = "",
SerialNumber = "",
StockQuantity = mesPPBackInboundOrderDetail.OrderQuantity,
OutboundQuantity = 0,
Unit = materielInfo.MaterielUnit,
Status = StockStatusEmun.组盘暂存.ObjToInt(),
ProductionDate = mesPPBackInboundOrderDetail.ProductionDate,
EffectiveDate = mesPPBackInboundOrderDetail.EffectiveDate,
InboundOrderRowNo = mesPPBackInboundOrderDetail.RowNo,
};
Dt_StockInfo stockInfo = new Dt_StockInfo()
{
PalletCode = model.CarrierCode,
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
WarehouseId = mesPPBackInboundOrder.WarehouseId,
Details = new List { stockInfoDetail }
};
_unitOfWorkManage.BeginTran();
Db.InsertNav(mesPPBackInboundOrder).Include(x => x.Details).ExecuteCommand();
Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
WebResponseContent content = DeviceRequestInboundTask(mesPPBackInboundOrder, stockInfo);
if (!content.Status)
{
_unitOfWorkManage.RollbackTran();
return MesResponseContent.Instance.Error(content.Message);
}
_unitOfWorkManage.CommitTran();
}
return MesResponseContent.Instance.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return MesResponseContent.Instance.Error(ex.Message);
}
}
public WebResponseContent DeviceRequestInboundTask(Dt_MesPPBackInboundOrder mesPPBackInboundOrder, Dt_StockInfo stockInfo)
{
try
{
Dt_Task task = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
if (task != null)
{
PushTasksToWCS(new List { task });
return WebResponseContent.Instance.Error($"该托盘已生成任务");
}
if (Repository.QueryFirst(x => x.SourceAddress == stockInfo.PalletCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null)
{
return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
}
//Dt_StockInfo stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
//if (stockInfos == 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_LocationInfo? locationInfos = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == stockInfo.WarehouseId && x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt());
Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(locationInfos.RoadwayNo, stockInfo.PalletType, stockInfo.WarehouseId);
if (locationInfo == null)
{
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
}
Dt_Task newTask = new Dt_Task()
{
CurrentAddress = mesPPBackInboundOrder.SourceAddressCode,
Grade = 0,
NextAddress = locationInfo.LocationCode,
PalletCode = stockInfo.PalletCode,
Roadway = locationInfo.RoadwayNo,//巷道号包含AGV
SourceAddress = mesPPBackInboundOrder.SourceAddressCode,
TargetAddress = locationInfo.LocationCode,
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
TaskStatus = TaskStatusEnum.New.ObjToInt(),
WarehouseId = stockInfo.WarehouseId,
PalletType = stockInfo.PalletType
};
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);
BaseDal.AddData(newTask);
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
_unitOfWorkManage.CommitTran();
PushTasksToWCS(new List { newTask });
return WebResponseContent.Instance.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// PP库存查询
///
///
///
public MesResponseContent QueryPpByWidth(QueryPpByWidthModel model)
{
MesResponseContent content = new MesResponseContent();
try
{
//需判断查询立库,平库
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA58.ToString());
List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x =>
x.WarehouseId == warehouse.WarehouseId &&
x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList();
Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.MaterielCode == model.MaterialCode && x.CutedWidth == model.CutedWidth));
if (stockInfo == null)
{
return content.Error($"PP仓立库/平库:物料编号:{model.MaterialCode},裁切宽:{model.CutedWidth},未找到此物料库存信息");
}
var stock = stockInfo.Details.FirstOrDefault();
if (stock != null)
{
content.Content = new
{
MaterialCode = stock.MaterielCode,
Quantity = stock.StockQuantity,
Unit = stock.Unit,
Warehouse = warehouse.WarehouseCode,
WarehouseName = warehouse.WarehouseName,
CutedWidth = stock.CutedWidth,
CarrierCode = stockInfo.PalletCode,
MaterialLot = stock.BatchNo,
};
}
return content.OK();
}
catch (Exception ex)
{
return MesResponseContent.Instance.Error(ex.Message);
}
}
///
/// MES成品入库单接收
///
///
public MesResponseContent BagInfoSync(MesBagInfoModel bagInfoModel)
{
MesResponseContent content = new MesResponseContent();
try
{
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == bagInfoModel.WarehouseCode);
if (warehouse == null)
{
return content.Error("未找到仓库信息");
}
//判断是否MES内包信息是否重复
List mesProInOrderDetails = new List();
foreach (var item in bagInfoModel.BagDetails)
{
foreach (var child in item.BagItems)
{
Dt_MesProInOrderDetail mesProInOrderDetail = new Dt_MesProInOrderDetail()
{
BagNo = item.BagNo,
ProductCode = item.ProductCode,
ProductVersion = item.ProductVersion,
SETQty = child.SETQty,
OKPCSQTY = child.OKPCSQTY,
DateCode = item.DateCode,
XQty = child.XQty,
XSite = child.XSite,
Weight = item.Weight,
PackingDate = item.PackingDate,
LotNumber = child.LotNumber,
ERPOrder = child.ERPOrder,
SaleOrder = child.SaleOrder,
MoNumber = child.MoNumber,
};
mesProInOrderDetails.Add(mesProInOrderDetail);
}
}
List proStockInfoDetails = new List();
foreach (var item in mesProInOrderDetails)
{
proStockInfoDetails.Add(_mapper.Map(item));
}
Dt_MesProInOrder mesProInOrder = new Dt_MesProInOrder()
{
WarehouseId = warehouse.WarehouseId,
BatchNo = bagInfoModel.BatchNo,
WorkCenter = bagInfoModel.WorkCenter,
MesProStatus = InOrderStatusEnum.未开始.ObjToInt(),
UnPackStock = bagInfoModel.UnPackStock,
Details = mesProInOrderDetails
};
Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
{
PalletCode = bagInfoModel.BatchNo,
PalletType = 1,
WarehouseId = warehouse.WarehouseId,
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
proStockInfoDetails = proStockInfoDetails
};
_unitOfWorkManage.BeginTran();
Db.InsertNav(mesProInOrder).Include(x => x.Details).ExecuteCommand();
Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
_unitOfWorkManage.CommitTran();
return content.OK("接收成功");
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
content.Error(ex.Message);
}
return content;
}
public MesResponseContent BoxStockin(MesBoxInfoModel boxInfoModel)
{
MesResponseContent content = new MesResponseContent();
try
{
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
//获取MES内包信息
List mesProInOrderDetails = new List();
foreach (var item in boxInfoModel.Bags)
{
foreach (var child in item.BagItems)
{
Dt_MesProInOrderDetail mesProInOrderDetail = new Dt_MesProInOrderDetail()
{
BagNo = item.BagNo,
ProductCode = item.ProductCode,
ProductVersion = item.ProductVersion,
SETQty = child.SETQty,
OKPCSQTY = child.OKPCSQTY,
DateCode = item.DateCode,
XQty = child.XQty,
XSite = child.XSite,
Weight = item.Weight,
PackingDate = item.PackingDate,
LotNumber = child.LotNumber,
ERPOrder = child.ERPOrder,
SaleOrder = child.SaleOrder,
MoNumber = child.MoNumber,
};
mesProInOrderDetails.Add(mesProInOrderDetail);
}
}
List proStockInfoDetails = new List();
foreach (var item in mesProInOrderDetails)
{
proStockInfoDetails.Add(_mapper.Map(item));
}
Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
{
PalletCode = boxInfoModel.BoxNo,
PalletType = 0,
WarehouseId = warehouse.WarehouseId,
ShipmentOrder = boxInfoModel.ShipmentOrder,
StockStatus = StockStatusEmun.入库完成.ObjToInt(),
proStockInfoDetails = proStockInfoDetails
};
_unitOfWorkManage.BeginTran();
Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
_unitOfWorkManage.CommitTran();
return content.OK("外包接收成功");
}
catch (Exception ex)
{
content.Error(ex.Message);
}
return content;
}
///
/// 成品返工提库
///
///
///
public MesResponseContent RworkTask(RworkTaskModel model)
{
MesResponseContent content = new MesResponseContent();
try
{
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA72.ToString());
if (warehouse==null)
{
return MesResponseContent.Instance.Error("未找到此仓库");
}
Dt_MesRworkOutboundOrder mesRworkOutboundOrder = new Dt_MesRworkOutboundOrder()
{
WarehouseId=warehouse.WarehouseId,
TaskNo=model.TaskNo,
OrderStatus = InOrderStatusEnum.未开始.ObjToInt(),
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
ProductCode=model.ProductCode,
ProductName=model.ProductName,
ProductVersion=model.ProductVersion,
DateCode=model.DateCode,
RequiredQuantity=model.RequiredQuantity,
FactoryCode= model.FactoryCode,
SaleOrder=model.SaleOrder,
InventoryType=model.InventoryType,
};
_unitOfWorkManage.BeginTran();
_outboundService.RworkOutboundOrderService.AddData(mesRworkOutboundOrder);
_unitOfWorkManage.CommitTran();
return content.OK("提供返库单接收成功");
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
content.Error(ex.Message);
}
return content;
}
///
/// 生成PP大卷出库任务
///
/// 出库单明细主键
///
public WebResponseContent MESPPGenerateOutboundTasks(int[] keys)
{
try
{
List tasks = new List();
List stockSelectViews = new List();
List stockInfos = new List();
List outboundOrderDetails = new List();
List outStockLockInfos = new List();
List locationInfos = new List();
(List, List?, List?, List?, List?, Dt_MesPPOutboundOrder mesPPOutboundOrder) result = MESPPOutboundTaskDataHandle(keys);
if (result.Item2 != null && result.Item2.Count > 0)
{
stockInfos.AddRange(result.Item2);
}
if (result.Item3 != null && result.Item3.Count > 0)
{
outboundOrderDetails.AddRange(result.Item3);
}
if (result.Item4 != null && result.Item4.Count > 0)
{
outStockLockInfos.AddRange(result.Item4);
}
if (result.Item5 != null && result.Item5.Count > 0)
{
locationInfos.AddRange(result.Item5);
}
if (result.Item1 != null && result.Item1.Count > 0)
{
tasks.AddRange(result.Item1);
}
if (result.mesPPOutboundOrder != null)
{
}
WebResponseContent content = MESPPGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, result.mesPPOutboundOrder);
return content;
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// PP大卷出库任务数据处理
///
///
///
///
///
public (List, List?, List?, List?, List?, Dt_MesPPOutboundOrder mesPPOutboundOrder) MESPPOutboundTaskDataHandle(int[] keys)
{
List tasks = new List();
List outboundOrderDetails = BaseDal.Db.Queryable().Where(x => keys.Contains(x.Id)).ToList();
if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
{
throw new Exception("未找到出库单明细信息");
}
if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null)
{
throw new Exception("所选出库单明细存在出库中或已完成");
}
List? stockInfos = null;
List? orderDetails = null;
List? outStockLockInfos = null;
List? locationInfos = null;
Dt_MesPPOutboundOrder? mesPPOutboundOrders = null;
if (outboundOrderDetails.FirstOrDefault().OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
{
(List, List, List, List, Dt_MesPPOutboundOrder mesPPOutboundOrder) result = _outboundService.MesPPOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails);
if (result.Item1 != null && result.Item1.Count > 0)
{
Dt_MesPPOutboundOrder outboundOrder = _outboundService.MesPPOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
TaskTypeEnum typeEnum = outboundOrder.OrderType switch
{
(int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound,
(int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate,
(int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality,
_ => new TaskTypeEnum()
};
tasks = GetTasks(result.Item1, typeEnum);
result.Item2.ForEach(x =>
{
x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
});
result.Item3.ForEach(x =>
{
x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
});
stockInfos = result.Item1;
orderDetails = result.Item2;
outStockLockInfos = result.Item3;
locationInfos = result.Item4;
mesPPOutboundOrders = result.mesPPOutboundOrder;
}
else
{
throw new Exception("无库存");
}
}
//else
//{
// List stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetails.oi, OutLockStockStatusEnum.已分配);
// if (stockLockInfos != null && stockLockInfos.Count > 0)
// {
// List stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
// tasks = GetTasks(stocks);
// }
//}
return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos, mesPPOutboundOrders);
}
///
/// PP平库直接出库
///
///
///
///
public WebResponseContent PPGeneratePKOutboundTask(int orderDetailId, List stockSelectViews)
{
try
{
(List, List?, List?, List?, List?) result = PPOutboundTaskDataHandle(orderDetailId, stockSelectViews);
WebResponseContent content = PPGenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5);
return content;
}
catch (Exception ex)
{
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// PP立库小卷直接出库
///
///
///
///
public WebResponseContent PPCutOutGenerateOutboundTasks(int orderDetailId, List stockSelectViews)
{
try
{
(List, List?, List?, List?, List?) result = PPOutboundTaskDataHandle(orderDetailId, stockSelectViews);
WebResponseContent content = PPGenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5);
return content;
}
catch (Exception ex)
{
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// 出库任务数据处理
///
///
///
///
///
public (List, List?, List?, List?, List?) PPOutboundTaskDataHandle(int orderDetailId, List stockSelectViews)
{
List tasks = new List();
Dt_MesPPCutOutboundOrderDetail outboundOrderDetail = _outboundService.MesPPCutOutboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId);
if (outboundOrderDetail == null)
{
throw new Exception("未找到出库单明细信息");
}
if (stockSelectViews.Sum(x => x.UseableQuantity) > outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity)
{
throw new Exception("选择数量超出单据数量");
}
List? stockInfos = null;
Dt_MesPPCutOutboundOrderDetail? orderDetail = null;
List? outStockLockInfos = null;
List? locationInfos = null;
if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
{
(List, Dt_MesPPCutOutboundOrderDetail, List, List) result = _outboundService.MesPPCutOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews);
if (result.Item1 != null && result.Item1.Count > 0)
{
Dt_MesPPCutOutboundOrder outboundOrder = _outboundService.MesPPCutOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId);
TaskTypeEnum typeEnum = outboundOrder.OrderType switch
{
(int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound,
(int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate,
(int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality,
_ => new TaskTypeEnum()
};
tasks = GetTasks(result.Item1, TaskTypeEnum.Outbound);
result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
result.Item3.ForEach(x =>
{
x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
});
stockInfos = result.Item1;
orderDetail = result.Item2;
outStockLockInfos = result.Item3;
locationInfos = result.Item4;
}
else
{
throw new Exception("无库存");
}
}
else
{
List stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetail.OrderId, OutLockStockStatusEnum.已分配);
if (stockLockInfos != null && stockLockInfos.Count > 0)
{
List stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
tasks = GetTasks(stocks, TaskTypeEnum.Outbound);
}
}
return (tasks, stockInfos, orderDetail == null ? null : new List { orderDetail }, outStockLockInfos, locationInfos);
}
public WebResponseContent PPGenerateOutboundTaskDataUpdate(List tasks, List? stockInfos = null, List? outboundOrderDetails = null, List? outStockLockInfos = null, List? locationInfos = null)
{
try
{
_unitOfWorkManage.BeginTran();
BaseDal.AddData(tasks);
if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
{
stockInfos.ForEach(x =>
{
x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
});
WebResponseContent content = _outboundService.MesPPCutOutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
if (!content.Status)
{
_unitOfWorkManage.RollbackTran();
return content;
}
}
else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0)
{
outboundOrderDetails.ForEach(x =>
{
x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
});
_outboundService.MesPPCutOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
}
_unitOfWorkManage.CommitTran();
PushTasksToWCS(tasks);
return WebResponseContent.Instance.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
#region
///
/// 生成PP小卷出库任务
///
/// 出库单明细主键
///
//public WebResponseContent PPCutOutGenerateOutboundTasks(int[] keys)
//{
// try
// {
// List tasks = new List();
// List stockSelectViews = new List();
// List stockInfos = new List();
// List outboundOrderDetails = new List();
// List outStockLockInfos = new List();
// List locationInfos = new List();
// (List, List?, List?, List?, List?) result = PPCutOutboundTaskDataHandle(keys);
// if (result.Item2 != null && result.Item2.Count > 0)
// {
// stockInfos.AddRange(result.Item2);
// }
// if (result.Item3 != null && result.Item3.Count > 0)
// {
// outboundOrderDetails.AddRange(result.Item3);
// }
// if (result.Item4 != null && result.Item4.Count > 0)
// {
// outStockLockInfos.AddRange(result.Item4);
// }
// if (result.Item5 != null && result.Item5.Count > 0)
// {
// locationInfos.AddRange(result.Item5);
// }
// if (result.Item1 != null && result.Item1.Count > 0)
// {
// tasks.AddRange(result.Item1);
// }
// WebResponseContent content = PPCutOutGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos);
// return content;
// }
// catch (Exception ex)
// {
// _unitOfWorkManage.RollbackTran();
// return WebResponseContent.Instance.Error(ex.Message);
// }
//}
/////
///// PP小卷出库任务数据处理
/////
/////
/////
/////
/////
//public (List, List?, List?, List?, List?) PPCutOutboundTaskDataHandle(int[] keys)
//{
// List tasks = new List();
// List outboundOrderDetails = BaseDal.Db.Queryable().Where(x => keys.Contains(x.Id)).ToList();
// if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
// {
// throw new Exception("未找到出库单明细信息");
// }
// if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null)
// {
// throw new Exception("所选出库单明细存在出库中或已完成");
// }
// List? stockInfos = null;
// List? orderDetails = null;
// List? outStockLockInfos = null;
// List? locationInfos = null;
// if (outboundOrderDetails.FirstOrDefault().OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
// {
// (List, List, List, List) result = _outboundService.MesPPCutOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails);
// if (result.Item1 != null && result.Item1.Count > 0)
// {
// Dt_MesPPCutOutboundOrder outboundOrder = _outboundService.MesPPCutOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
// //TaskTypeEnum typeEnum = outboundOrder.OrderType switch
// //{
// // (int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound,
// // (int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate,
// // (int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality,
// // _ => new TaskTypeEnum()
// //};
// tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound);
// result.Item2.ForEach(x =>
// {
// x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
// });
// result.Item3.ForEach(x =>
// {
// x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
// });
// stockInfos = result.Item1;
// orderDetails = result.Item2;
// outStockLockInfos = result.Item3;
// locationInfos = result.Item4;
// }
// else
// {
// throw new Exception("无库存");
// }
// }
// //else
// //{
// // List stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetails.OrderId, OutLockStockStatusEnum.已分配);
// // if (stockLockInfos != null && stockLockInfos.Count > 0)
// // {
// // List stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
// // tasks = GetTasks(stocks);
// // }
// //}
// return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos);
//}
/////
///// 生成PP小卷出库任务后数据更新到数据库
/////
/////
/////
/////
/////
/////
/////
//public WebResponseContent PPCutOutGenerateOutboundTaskDataUpdate(List tasks, List? stockInfos = null, List? outboundOrderDetails = null, List? outStockLockInfos = null, List? locationInfos = null)
//{
// try
// {
// _unitOfWorkManage.BeginTran();
// BaseDal.AddData(tasks);
// if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
// {
// stockInfos.ForEach(x =>
// {
// x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
// });
// WebResponseContent content = _outboundService.MesPPCutOutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
// if (!content.Status)
// {
// _unitOfWorkManage.RollbackTran();
// return content;
// }
// }
// else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0)
// {
// outboundOrderDetails.ForEach(x =>
// {
// x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
// });
// _outboundService.MesPPCutOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
// }
// _unitOfWorkManage.CommitTran();
// PushTasksToWCS(tasks,"AGV_PP");
// return WebResponseContent.Instance.OK();
// }
// catch (Exception ex)
// {
// _unitOfWorkManage.RollbackTran();
// return WebResponseContent.Instance.Error(ex.Message);
// }
//}
#endregion
///
/// 生成PP大卷出库任务后数据更新到数据库
///
///
///
///
///
///
///
public WebResponseContent MESPPGenerateOutboundTaskDataUpdate(List tasks, List? stockInfos = null, List? outboundOrderDetails = null, List? outStockLockInfos = null, List? locationInfos = null, Dt_MesPPOutboundOrder? mesPPOutboundOrder = null)
{
try
{
_unitOfWorkManage.BeginTran();
BaseDal.AddData(tasks);
if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
{
stockInfos.ForEach(x =>
{
x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
});
WebResponseContent content = _outboundService.MesPPOutboundOrderDetailService.LockOutboundStockDataUpdate(mesPPOutboundOrder, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
if (!content.Status)
{
_unitOfWorkManage.RollbackTran();
return content;
}
}
else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0)
{
outboundOrderDetails.ForEach(x =>
{
x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
});
_outboundService.MesPPOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
}
_unitOfWorkManage.CommitTran();
PushTasksToWCS(tasks);
return WebResponseContent.Instance.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
return WebResponseContent.Instance.Error(ex.Message);
}
}
}
}