using Autofac.Core;
|
using Microsoft.IdentityModel.Tokens;
|
using Newtonsoft.Json;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
|
using OfficeOpenXml.FormulaParsing.Excel.Operators;
|
using SqlSugar;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Diagnostics.CodeAnalysis;
|
using System.Linq;
|
using System.Reflection.Metadata;
|
using System.Text;
|
using System.Text.RegularExpressions;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.CommonEnum;
|
using WIDESEA_Common.LocationEnum;
|
using WIDESEA_Common.MaterielEnum;
|
using WIDESEA_Common.OrderEnum;
|
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.Basic;
|
using WIDESEA_DTO.ERP;
|
using WIDESEA_DTO.MES;
|
using WIDESEA_DTO.Task;
|
using WIDESEA_External.Model;
|
using WIDESEA_Model.Models;
|
using WIDESEA_TaskInfoRepository;
|
|
namespace WIDESEA_TaskInfoService
|
{
|
public partial class TaskService
|
{
|
/// <summary>
|
/// 仅申请任务,让WCS根据路由确定下一地址
|
/// </summary>
|
/// <param name="stationCode"></param>
|
/// <param name="palletCode"></param>
|
/// <returns></returns>
|
public WebResponseContent DeviceRequestInboundTaskSimple(string stationCode)
|
{
|
try
|
{
|
Dt_Task task = Repository.QueryFirst(x => x.PalletCode == stationCode);
|
if (task != null)
|
{
|
PushTasksToWCS(new List<Dt_Task> { task });
|
return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task));
|
}
|
Dt_ProStockInfo stockInfo = BaseDal.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == stationCode).Includes(x => x.proStockInfoDetails).First(); ;
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到组盘信息");
|
}
|
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
|
}
|
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = stationCode,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = stationCode,
|
Roadway = "",
|
SourceAddress = stationCode,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.InProduct.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = stockInfo.WarehouseId,
|
PalletType = stockInfo.PalletType,
|
};
|
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
|
stockInfo.proStockInfoDetails.ForEach(x =>
|
{
|
x.ProStockDetailStatus = StockStatusEmun.入库确认.ObjToInt();
|
});
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
newTask.TaskId = taskId;
|
_stockRepository.ProStockInfoRepository.UpdateData(stockInfo);
|
_stockRepository.ProStockInfoDetailRepository.UpdateData(stockInfo.proStockInfoDetails);
|
_unitOfWorkManage.CommitTran();
|
WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
|
|
return WebResponseContent.Instance.OK(data: wMSTaskDTO);
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 原料申请入库
|
/// </summary>
|
/// <param name="stationCode">起始站点</param>
|
/// <param name="palletCode">托盘</param>
|
/// <returns></returns>
|
public WebResponseContent RequestYLWMSTaskSimple(string stationCode, string palletCode)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.RfidCode == palletCode);
|
if (stockInfo == null)
|
{
|
return content.Error($"未找到组盘信息");
|
}
|
Dt_Task task = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
|
if (task != null)
|
{
|
PushTasksToWCS(new List<Dt_Task> { task });
|
return content.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task));
|
}
|
|
if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null)
|
{
|
return content.Error($"该站点已有未执行的任务");
|
}
|
if (stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.老厂退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.博思通组盘暂存.ObjToInt())
|
{
|
return content.Error($"该托盘状态不正确,不可申请入库");
|
}
|
//分配巷道
|
string rowWay = AssignYLRoadwayNo(stockInfo.PalletCode);
|
if (string.IsNullOrEmpty(rowWay))
|
{
|
return content.Error($"未找到可分配巷道");
|
}
|
//生成任务
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = stationCode,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = stockInfo.PalletCode,
|
RfidCode=stockInfo.RfidCode,
|
Roadway = rowWay,
|
SourceAddress = stationCode,
|
TargetAddress = "",
|
TaskType = stationCode=="307" ? TaskTypeEnum.PaperOldYLBackInbound.ObjToInt() : TaskTypeEnum.Inbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = stockInfo.WarehouseId,
|
PalletType = stockInfo.PalletType,
|
TaskLength = (int)stockInfo.MaterielWide,
|
MaterielCode=stockInfo.MaterielCode,
|
Quantity=stockInfo.StockLength
|
};
|
//更新状态
|
if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
|
{
|
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
|
}
|
else
|
{
|
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
|
}
|
//数据更新
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
newTask.TaskId = taskId;
|
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
|
_unitOfWorkManage.CommitTran();
|
PushTasksToWCS(new List<Dt_Task> { newTask });
|
WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
|
return content.OK(data: wMSTaskDTO);
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
private readonly static object lockerYLBoxing = new object();
|
/// <summary>
|
/// 原料请求
|
/// </summary>
|
/// <param name="palletCode">RFID信息</param>
|
/// <returns></returns>
|
public WebResponseContent YLPurchaseBoxing(string palletCode, decimal weight = 0, decimal thickness = 0, decimal wide = 0, string stationCode = "")
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
lock (lockerYLBoxing)
|
{
|
Dt_StockInfo stockInfoOld = _stockRepository.StockInfoRepository.QueryFirst(x => x.RfidCode == palletCode);
|
if (stockInfoOld != null && stockInfoOld.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
|
{
|
UpdateStock(stockInfoOld, weight, thickness, wide);
|
return content.OK($"临时入库{stockInfoOld.RfidCode}");
|
}
|
else if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && stockInfoOld.StockStatus == StockStatusEmun.出库完成.ObjToInt() && stationCode.IsNotEmptyOrNull())
|
{
|
decimal oldQty = stockInfoOld.StockLength;
|
//调用更新退料库存及上报重量
|
WebResponseContent returnContent = ReturnStockUp(stockInfoOld, thickness, weight);
|
if (!returnContent.Status)
|
{
|
throw new Exception(returnContent.Message);
|
}
|
stockInfoOld = returnContent.Data as Dt_StockInfo;
|
//更新数据
|
UpdateStock(stockInfoOld, weight, thickness, wide);
|
//记录库存变动
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoOld, oldQty, oldQty < stockInfoOld.StockLength ? stockInfoOld.StockLength - oldQty : oldQty - stockInfoOld.StockLength, StockChangeTypeEnum.MaterielGroup);
|
return content.OK($"老厂未领料退库RFID{stockInfoOld.RfidCode}条码{stockInfoOld.PalletCode}");
|
}
|
else if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && stockInfoOld.StockStatus == StockStatusEmun.老厂退料暂存.ObjToInt() && stationCode.IsNotEmptyOrNull())
|
{
|
decimal oldQty = stockInfoOld.StockLength;
|
//调用更新退料库存及上报重量
|
WebResponseContent returnContent = ReturnStockUp(stockInfoOld, thickness, weight);
|
if (!returnContent.Status)
|
{
|
throw new Exception(returnContent.Message);
|
}
|
stockInfoOld = returnContent.Data as Dt_StockInfo;
|
//更新数据
|
UpdateStock(stockInfoOld, weight, thickness, wide);
|
//记录库存变动
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoOld, oldQty, oldQty < stockInfoOld.StockLength ? stockInfoOld.StockLength- oldQty: oldQty- stockInfoOld.StockLength, StockChangeTypeEnum.MaterielGroup);
|
return content.OK($"老厂领料退库RFID{stockInfoOld.RfidCode}条码{stockInfoOld.PalletCode}");
|
}
|
else if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && stockInfoOld.StockStatus == StockStatusEmun.出库完成.ObjToInt() && stockInfoOld.StockLength<=0 && stationCode.IsNullOrEmpty())
|
{
|
_stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfoOld, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
|
throw new Exception($"{palletCode}RFID信息老厂领料后无库存退料");
|
}
|
else if (stockInfoOld != null)
|
{
|
throw new Exception($"{palletCode}RFID信息已存在");
|
}
|
|
if (stationCode.IsNullOrEmpty())
|
{
|
//新厂RFID绑定逻辑
|
if (palletCode.StartsWith("A"))
|
{
|
#region 处理采购绑定RFID逻辑
|
Dt_YLInboundCache? yLInboundCache = _inboundRepository.YLInboundCacheRepository.QueryData(x => x.InvOrg == MaterielInvOrgEnum.新厂.ToString()).FirstOrDefault();
|
if (yLInboundCache == null)
|
{
|
return content.Error("未找到原料缓存条码信息");
|
}
|
if (yLInboundCache.BindStatus == WhetherEnum.True.ObjToInt())
|
{
|
return content.Error($"原料缓存条码{yLInboundCache.BarCode}已绑定RFID{yLInboundCache.RfidCode}");
|
}
|
else
|
{
|
Dt_StockInfo ExistStockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == yLInboundCache.BarCode);
|
if (ExistStockInfo != null && ExistStockInfo.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt() && ExistStockInfo.StockStatus == StockStatusEmun.组盘暂存.ObjToInt())
|
{
|
//获取采购信息
|
yLInboundCache.RfidCode = palletCode;
|
yLInboundCache.BindStatus = WhetherEnum.True.ObjToInt();
|
ExistStockInfo.RfidCode = palletCode;
|
_unitOfWorkManage.BeginTran();
|
UpdateStock(ExistStockInfo, weight, thickness, wide);
|
_inboundRepository.YLInboundCacheRepository.UpdateData(yLInboundCache);
|
_unitOfWorkManage.CommitTran();
|
return content.OK($"采购入库RFID{ExistStockInfo.RfidCode}绑定{ExistStockInfo.PalletCode}");
|
}
|
else
|
{
|
throw new Exception("未知错误");
|
}
|
}
|
#endregion
|
}
|
else //老厂RFID绑定逻辑
|
{
|
#region 处理采购绑定RFID逻辑
|
Dt_YLInboundCache? yLInboundCache = _inboundRepository.YLInboundCacheRepository.QueryData(x => x.InvOrg == MaterielInvOrgEnum.老厂.ToString()).FirstOrDefault();
|
if (yLInboundCache == null)
|
{
|
return content.Error("未找到原料缓存条码信息");
|
}
|
if (yLInboundCache.BindStatus == WhetherEnum.True.ObjToInt())
|
{
|
return content.Error($"原料缓存条码{yLInboundCache.BarCode}已绑定RFID{yLInboundCache.RfidCode}");
|
}
|
else
|
{
|
Dt_StockInfo ExistStockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == yLInboundCache.BarCode);
|
if (ExistStockInfo != null && ExistStockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && ExistStockInfo.StockStatus == StockStatusEmun.博思通组盘暂存.ObjToInt())
|
{
|
yLInboundCache.RfidCode = palletCode;
|
yLInboundCache.BindStatus = WhetherEnum.True.ObjToInt();
|
ExistStockInfo.RfidCode = palletCode;
|
_unitOfWorkManage.BeginTran();
|
//更新组盘信息
|
UpdateStock(ExistStockInfo, weight, thickness, wide);
|
_inboundRepository.YLInboundCacheRepository.UpdateData(yLInboundCache);
|
_unitOfWorkManage.CommitTran();
|
return content.OK($"博思通库存转存{ExistStockInfo.RfidCode}");
|
}
|
else if (ExistStockInfo != null && ExistStockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && ExistStockInfo.StockStatus == StockStatusEmun.组盘暂存.ObjToInt())
|
{
|
//获取采购信息
|
Dt_PurchaseBSTOrderDetail purchaseBSTOrderDetail = _inboundRepository.PurchaseBSTOrderDetailRepository.QueryFirst(x => x.Barcode == yLInboundCache.BarCode);
|
yLInboundCache.RfidCode = palletCode;
|
yLInboundCache.BindStatus = WhetherEnum.True.ObjToInt();
|
ExistStockInfo.RfidCode = palletCode;
|
purchaseBSTOrderDetail.RfidCode = palletCode;
|
_unitOfWorkManage.BeginTran();
|
UpdateStock(ExistStockInfo, weight, thickness, wide);
|
_inboundRepository.YLInboundCacheRepository.UpdateData(yLInboundCache);
|
_inboundRepository.PurchaseBSTOrderDetailRepository.UpdateData(purchaseBSTOrderDetail);
|
_unitOfWorkManage.CommitTran();
|
return content.OK($"采购入库{ExistStockInfo.RfidCode}");
|
}
|
else
|
{
|
throw new Exception("未知错误");
|
}
|
}
|
#endregion
|
}
|
}
|
else if (!stationCode.IsNullOrEmpty() && stockInfoOld == null)
|
{
|
throw new Exception($"{palletCode}RFID信息不存在");
|
}
|
else
|
{
|
throw new Exception("未知错误");
|
}
|
}
|
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 更新退料库存
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent ReturnStockUp(Dt_StockInfo stockInfoOld,decimal thickness,decimal weight)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (thickness < 400)
|
{
|
throw new Exception($"RFID{stockInfoOld.RfidCode}条码{stockInfoOld.PalletCode}直径小于400mm");
|
}
|
BSTResponse<BSTStockInfoDTO> bSTResponse = _invokeERPService.BSTStockAsync(stockInfoOld.PalletCode).DeserializeObject<BSTResponse<BSTStockInfoDTO>>();
|
if (bSTResponse.Code == 500)
|
{
|
throw new Exception($"未找到条码{stockInfoOld.PalletCode}一期ERP库存不存在");
|
}
|
BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{stockInfoOld.PalletCode}的库存信息");
|
stockInfoOld.IsPick = WhetherEnum.False.ObjToInt();
|
decimal stockLength = bSTStockInfoDTO.StockMeter;
|
decimal errWeight = Math.Abs(weight - bSTStockInfoDTO.Qty);
|
if (weight != bSTStockInfoDTO.Qty && weight < stockInfoOld.InitialWeight && errWeight <= AppSettings.Get("ErrWeight").ObjToInt())
|
{
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterialSourceId == stockInfoOld.MaterielId);
|
int gramWeight = (int)(materielInfo.MaterielWeight * 1000);
|
BSTWeightUpDTO bSTWeightUpDTO = new BSTWeightUpDTO()
|
{
|
Paper_code = stockInfoOld.PalletCode,
|
Estimate_weight = bSTStockInfoDTO.Qty,
|
Actual_weight = weight,
|
Error_weight = errWeight,
|
Weigh_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
Operator = "LiKu",
|
Width = bSTStockInfoDTO.W,
|
Gram_weight = gramWeight
|
};
|
BSTResponse<object> Response = _invokeERPService.BSTWeightUp(bSTWeightUpDTO).DeserializeObject<BSTResponse<object>>();
|
if (Response.Code != 200)
|
{
|
throw new Exception($"上报称重失败");
|
}
|
stockLength = weight / bSTStockInfoDTO.W / gramWeight * 1000000;
|
stockInfoOld.IsFull = WhetherEnum.True.ObjToInt();
|
stockInfoOld.MaterielWeight = weight;
|
}
|
stockInfoOld.StockStatus = StockStatusEmun.老厂退库.ObjToInt();
|
stockInfoOld.MaterielThickness = bSTStockInfoDTO.Thick;
|
stockInfoOld.MaterielWide = bSTStockInfoDTO.W;
|
stockInfoOld.StockLength = stockLength;
|
stockInfoOld.StockOutLength = 0;
|
stockInfoOld.WarehouseId = WarehouseEnum.LLDYL.ObjToInt();
|
List<Dt_OutLineView> outLineViewsDel = _outboundRepository.OutLineViewRepository.QueryData(x=>x.PalletCode==stockInfoOld.PalletCode);
|
if (outLineViewsDel.Count>0)
|
{
|
_outboundRepository.OutLineViewRepository.DeleteData(outLineViewsDel);
|
}
|
content.OK("成功",data:stockInfoOld);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
public void UpdateStock(Dt_StockInfo stockInfo, decimal weight = 0, decimal thickness = 0, decimal wide = 0)
|
{
|
stockInfo.CheckWeight = weight;
|
stockInfo.CheckThickness = thickness;
|
stockInfo.CheckWide = wide;
|
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
|
}
|
/// <summary>
|
/// 原料采购绑定RFID
|
/// </summary>
|
/// <param name="palletCode">纸卷条码</param>
|
/// <param name="rfidCode">纸卷RIFD</param>
|
/// <returns></returns>
|
public WebResponseContent PurchaseBoxing(string palletCode, int orderType = 0)
|
{
|
WebResponseContent content=new WebResponseContent();
|
try
|
{
|
if (string.IsNullOrEmpty(palletCode))
|
{
|
throw new Exception("条码不能为空");
|
}
|
Dt_StockInfo stockInfoOld = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
|
if (stockInfoOld != null)
|
{
|
throw new Exception($"条码信息{palletCode}库存中已存在");
|
}
|
if (orderType>0) //新厂纸卷平台入库
|
{
|
InOrderTypeEnum inOrderTypeEnum = (InOrderTypeEnum)orderType;
|
if (inOrderTypeEnum== InOrderTypeEnum.PurchaseIn)
|
{
|
//获取主单
|
Dt_PurchaseOrder inboundOrder = BaseDal.Db.Queryable<Dt_PurchaseOrder>().Includes(x => x.Details).Where(x => x.Details.Any(v => v.BarCode == palletCode)).First();
|
|
if (inboundOrder == null)
|
{
|
throw new Exception($"未找到条码{palletCode}采购入库单据信息");
|
}
|
Dt_PurchaseOrderDetail inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BarCode == palletCode);
|
|
if (inboundOrderDetail == null)
|
{
|
throw new Exception($"未找到入库单号为{inboundOrder.PurchaseOrderNo}条码{palletCode}单据信息");
|
}
|
if (inboundOrderDetail.PurchaseDetailWide < 690 || inboundOrderDetail.PurchaseDetailWide > 2500)
|
{
|
return content.Error($"物料幅宽限制为690-2500mm,当前纸卷幅宽{inboundOrderDetail.PurchaseDetailWide}");
|
}
|
if (inboundOrderDetail.PurchaseDetailThickness <= 0)
|
{
|
return content.Error("物料直径需要大于0");
|
}
|
if (inboundOrderDetail.PurchaseDetailStatus != InOrderStatusEnum.未开始.ObjToInt())
|
{
|
throw new Exception($"条码{palletCode}信息已入库或入库中");
|
}
|
Dt_YLInboundCache? yLInboundCache = _inboundRepository.YLInboundCacheRepository.QueryData(x => x.InvOrg == MaterielInvOrgEnum.新厂.ToString()).FirstOrDefault();
|
if (yLInboundCache == null)
|
{
|
throw new Exception("未找到原料条码缓存信息");
|
}
|
int Id = yLInboundCache.Id;
|
if (yLInboundCache.BarCode == palletCode)
|
{
|
throw new Exception($"条码{palletCode}已扫码");
|
}
|
else if (yLInboundCache.BarCode != palletCode && yLInboundCache.BindStatus == WhetherEnum.True.ObjToInt())
|
{
|
yLInboundCache = _mapper.Map<Dt_YLInboundCache>(inboundOrderDetail);
|
yLInboundCache.Id = Id;
|
|
//获取物料
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == inboundOrderDetail.MaterialCode);
|
//生成库存组盘信息
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
MaterielInvOrgId = materielInfo.MaterielInvOrgId,
|
PalletCode = inboundOrderDetail.BarCode,
|
RfidCode = "",
|
LocationCode = "",
|
PalletType = 1,
|
WarehouseId = materielInfo.WarehouseId,
|
StockAttribute = materielInfo.MaterielSourceType,
|
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
|
MaterielSpec = materielInfo.MaterielSpec,
|
Unit = materielInfo.MaterielUnit,
|
MaterielThickness = inboundOrderDetail.PurchaseDetailThickness,
|
MaterielWide = inboundOrderDetail.PurchaseDetailWide,
|
MaterielWeight = inboundOrderDetail.PurchaseDetailWeight,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
BatchNo = inboundOrderDetail.MaterialLot,
|
StockLength = inboundOrderDetail.PurchaseDetailQuantity
|
};
|
if (inboundOrderDetail.PurchaseDetailWide >= 1160)
|
{
|
stockInfo.PalletType = 2;
|
}
|
inboundOrderDetail.PurchaseDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
_inboundRepository.YLInboundCacheRepository.UpdateData(yLInboundCache);
|
//新增组盘信息
|
_stockRepository.StockInfoRepository.AddData(stockInfo);
|
if (inboundOrder.PurchaseOrderStatus == InOrderStatusEnum.未开始.ObjToInt())
|
{
|
inboundOrder.PurchaseOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_inboundRepository.PurchaseOrderRepository.UpdateData(inboundOrder);
|
}
|
_inboundRepository.PurchaseOrderDetailRepository.UpdateData(inboundOrderDetail);
|
//启动线体
|
WebResponseContent webResponse = YLPurchasePush();
|
if (!webResponse.Status)
|
{
|
throw new Exception(webResponse.Message);
|
}
|
_unitOfWorkManage.CommitTran();
|
Dt_StockInfo stockInfoAdd = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
|
//记录库存变动
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoAdd, 0, stockInfoAdd.StockLength, StockChangeTypeEnum.MaterielGroup);
|
return content.OK("成功", yLInboundCache);
|
}
|
else
|
{
|
throw new Exception($"上卷条码{yLInboundCache.BarCode}还未进行绑定");
|
}
|
}
|
else
|
{
|
//获取主单
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderType == orderType).Includes(x => x.Details).Where(x => x.Details.Any(v => v.BarCode == palletCode)).First();
|
if (inboundOrder == null)
|
{
|
throw new Exception($"未找到条码{palletCode}入库单据信息");
|
}
|
Dt_InboundOrderDetail inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BarCode == palletCode);
|
if (inboundOrderDetail == null)
|
{
|
throw new Exception($"未找到入库单号为{inboundOrder.UpperOrderNo}条码{palletCode}单据信息");
|
}
|
if (inboundOrderDetail.MaterialWide < 690 || inboundOrderDetail.MaterialWide > 2500)
|
{
|
return content.Error($"物料幅宽限制为690-2500mm,当前纸卷幅宽{inboundOrderDetail.MaterialWide}");
|
}
|
if (inboundOrderDetail.MaterialThick <= 0)
|
{
|
return content.Error("物料直径需要大于0");
|
}
|
if (inboundOrderDetail.OrderDetailStatus != InOrderStatusEnum.未开始.ObjToInt())
|
{
|
throw new Exception($"条码{palletCode}信息已入库或入库中");
|
}
|
Dt_YLInboundCache? yLInboundCache = _inboundRepository.YLInboundCacheRepository.QueryData(x => x.InvOrg == MaterielInvOrgEnum.新厂.ToString()).FirstOrDefault();
|
if (yLInboundCache == null)
|
{
|
throw new Exception("未找到原料条码缓存信息");
|
}
|
int Id = yLInboundCache.Id;
|
if (yLInboundCache.BarCode == palletCode)
|
{
|
throw new Exception($"条码{palletCode}已扫码");
|
}
|
else if (yLInboundCache.BarCode != palletCode && yLInboundCache.BindStatus == WhetherEnum.True.ObjToInt())
|
{
|
yLInboundCache = _mapper.Map<Dt_YLInboundCache>(inboundOrderDetail);
|
yLInboundCache.Id = Id;
|
|
//获取物料
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == inboundOrderDetail.MaterialCode);
|
//生成库存组盘信息
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
MaterielInvOrgId = materielInfo.MaterielInvOrgId,
|
PalletCode = inboundOrderDetail.BarCode,
|
RfidCode = "",
|
LocationCode = "",
|
PalletType = 1,
|
WarehouseId = materielInfo.WarehouseId,
|
StockAttribute = materielInfo.MaterielSourceType,
|
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
|
MaterielSpec = materielInfo.MaterielSpec,
|
Unit = materielInfo.MaterielUnit,
|
MaterielThickness = inboundOrderDetail.MaterialThick,
|
MaterielWide = inboundOrderDetail.MaterialWide,
|
MaterielWeight = inboundOrderDetail.MaterialWeight,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
BatchNo = inboundOrderDetail.MaterialLot,
|
StockLength = inboundOrderDetail.OrderQuantity
|
};
|
if (inboundOrderDetail.MaterialWide >= 1160)
|
{
|
stockInfo.PalletType = 2;
|
}
|
inboundOrderDetail.OrderDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
_inboundRepository.YLInboundCacheRepository.UpdateData(yLInboundCache);
|
//新增组盘信息
|
_stockRepository.StockInfoRepository.AddData(stockInfo);
|
if (inboundOrder.InboundOrderStatus == InOrderStatusEnum.未开始.ObjToInt())
|
{
|
inboundOrder.InboundOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
|
}
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
|
//启动线体
|
WebResponseContent webResponse = YLPurchasePush();
|
if (!webResponse.Status)
|
{
|
throw new Exception(webResponse.Message);
|
}
|
_unitOfWorkManage.CommitTran();
|
Dt_StockInfo stockInfoAdd = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
|
//记录库存变动
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoAdd, 0, stockInfoAdd.StockLength, StockChangeTypeEnum.MaterielGroup);
|
return content.OK("成功", yLInboundCache);
|
}
|
else
|
{
|
throw new Exception($"上卷条码{yLInboundCache.BarCode}还未进行绑定");
|
}
|
}
|
|
}
|
else //老厂纸卷平台入库
|
{
|
//获取采购信息
|
Dt_PurchaseBSTOrderDetail purchaseBSTOrderDetail = _inboundRepository.PurchaseBSTOrderDetailRepository.QueryFirst(x => x.Barcode == palletCode);
|
if (purchaseBSTOrderDetail == null)
|
{
|
BSTResponse<BSTStockInfoDTO> bSTResponse = _invokeERPService.BSTStockAsync(palletCode).DeserializeObject<BSTResponse<BSTStockInfoDTO>>();
|
if (bSTResponse.Code == 500)
|
{
|
throw new Exception($"未找到条码{palletCode}采购信息并一期ERP库存也不存在");
|
}
|
|
BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{palletCode}的库存信息");
|
if (bSTStockInfoDTO.W < 690 || bSTStockInfoDTO.W > 2500)
|
{
|
return content.Error($"物料幅宽限制为690-2500mm,当前纸卷幅宽{bSTStockInfoDTO.W}");
|
}
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterialSourceId == bSTStockInfoDTO.MaterialId) ?? throw new Exception($"未找到条码{palletCode}物料信息{bSTStockInfoDTO.MaterialNo}");
|
//生成库存组盘信息
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
MaterielInvOrgId = materielInfo.MaterielInvOrgId,
|
PalletCode = palletCode,
|
RfidCode = "",
|
LocationCode = "",
|
PalletType = 1,
|
WarehouseId = materielInfo.WarehouseId,
|
StockAttribute = materielInfo.MaterielSourceType,
|
StockStatus = StockStatusEmun.博思通组盘暂存.ObjToInt(),
|
MaterielSpec = materielInfo.MaterielSpec,
|
Unit = materielInfo.MaterielUnit,
|
MaterielThickness = bSTStockInfoDTO.Thick,
|
MaterielWide = bSTStockInfoDTO.W,
|
MaterielWeight = bSTStockInfoDTO.Qty,
|
InitialWeight = bSTStockInfoDTO.Qty,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
StockLength = bSTStockInfoDTO.StockMeter,
|
MaterielId = materielInfo.MaterialSourceId
|
};
|
if (bSTStockInfoDTO.W >= 1160)
|
{
|
stockInfo.PalletType = 2;
|
}
|
Dt_YLInboundCache? yLInboundCache = _inboundRepository.YLInboundCacheRepository.QueryData(x => x.InvOrg == MaterielInvOrgEnum.老厂.ToString()).FirstOrDefault() ?? throw new Exception("未找到原料条码缓存信息");
|
int Id = yLInboundCache.Id;
|
if (yLInboundCache.BarCode == palletCode)
|
{
|
throw new Exception($"条码{palletCode}已扫码");
|
}
|
else if (yLInboundCache.BarCode != palletCode && yLInboundCache.BindStatus == WhetherEnum.True.ObjToInt())
|
{
|
yLInboundCache = _mapper.Map<Dt_YLInboundCache>(stockInfo);
|
yLInboundCache.Id = Id;
|
_unitOfWorkManage.BeginTran();
|
//新增组盘信息
|
_stockRepository.StockInfoRepository.AddData(stockInfo);
|
_inboundRepository.YLInboundCacheRepository.UpdateData(yLInboundCache);
|
//启动线体
|
WebResponseContent webResponse = YLPurchasePush();
|
if (!webResponse.Status)
|
{
|
throw new Exception(webResponse.Message);
|
}
|
_unitOfWorkManage.CommitTran();
|
Dt_StockInfo stockInfoAdd = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
|
//记录库存变动
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoAdd, 0, stockInfoAdd.StockLength, StockChangeTypeEnum.MaterielGroup);
|
return content.OK("成功", yLInboundCache);
|
}
|
else
|
{
|
throw new Exception($"上卷条码{yLInboundCache.BarCode}还未进行绑定");
|
}
|
|
}
|
else
|
{
|
if (purchaseBSTOrderDetail.PurchaseBSTOrderDetailStatus != InOrderStatusEnum.未开始.ObjToInt())
|
{
|
throw new Exception($"条码{palletCode}采购信息已入库或入库中");
|
}
|
Dt_YLInboundCache? yLInboundCache = _inboundRepository.YLInboundCacheRepository.QueryData(x => x.InvOrg == MaterielInvOrgEnum.老厂.ToString()).FirstOrDefault();
|
if (yLInboundCache == null)
|
{
|
throw new Exception("未找到原料条码缓存信息");
|
}
|
int Id = yLInboundCache.Id;
|
if (yLInboundCache.BarCode == palletCode)
|
{
|
throw new Exception($"条码{palletCode}已扫码");
|
}
|
else if (yLInboundCache.BarCode != palletCode && yLInboundCache.BindStatus == WhetherEnum.True.ObjToInt())
|
{
|
if (purchaseBSTOrderDetail.MaterialWide < 690 || purchaseBSTOrderDetail.MaterialWide > 2500)
|
{
|
return content.Error($"物料幅宽限制为690-2500mm,当前纸卷幅宽{purchaseBSTOrderDetail.MaterialWide}");
|
}
|
yLInboundCache = _mapper.Map<Dt_YLInboundCache>(purchaseBSTOrderDetail);
|
yLInboundCache.Id = Id;
|
//获取采购主单
|
Dt_PurchaseBSTOrder purchaseBSTOrder = _inboundRepository.PurchaseBSTOrderRepository.QueryFirst(x => x.Id == purchaseBSTOrderDetail.PurchaseBSTOrderId);
|
//获取物料
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterialSourceId == purchaseBSTOrderDetail.MaterialId);
|
//生成库存组盘信息
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
MaterielInvOrgId = materielInfo.MaterielInvOrgId,
|
PalletCode = purchaseBSTOrderDetail.Barcode,
|
RfidCode = "",
|
LocationCode = "",
|
PalletType = 1,
|
WarehouseId = materielInfo.WarehouseId,
|
StockAttribute = materielInfo.MaterielSourceType,
|
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
|
MaterielSpec = materielInfo.MaterielSpec,
|
Unit = materielInfo.MaterielUnit,
|
MaterielThickness = purchaseBSTOrderDetail.MaterialThick,
|
MaterielWide = purchaseBSTOrderDetail.MaterialWide,
|
MaterielWeight = purchaseBSTOrderDetail.DeliveryQty,
|
InitialWeight=purchaseBSTOrderDetail.DeliveryQty,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
StockLength = purchaseBSTOrderDetail.ProcurementLength,
|
MaterielId = purchaseBSTOrderDetail.MaterialId
|
};
|
if (purchaseBSTOrderDetail.MaterialWide >= 1160)
|
{
|
stockInfo.PalletType = 2;
|
}
|
purchaseBSTOrderDetail.PurchaseBSTOrderDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
_inboundRepository.YLInboundCacheRepository.UpdateData(yLInboundCache);
|
//新增组盘信息
|
_stockRepository.StockInfoRepository.AddData(stockInfo);
|
if (purchaseBSTOrder.PurchaseOrderStatus == InOrderStatusEnum.未开始.ObjToInt())
|
{
|
purchaseBSTOrder.PurchaseOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_inboundRepository.PurchaseBSTOrderRepository.UpdateData(purchaseBSTOrder);
|
}
|
_inboundRepository.PurchaseBSTOrderDetailRepository.UpdateData(purchaseBSTOrderDetail);
|
//启动线体
|
WebResponseContent webResponse = YLPurchasePush();
|
if (!webResponse.Status)
|
{
|
throw new Exception(webResponse.Message);
|
}
|
_unitOfWorkManage.CommitTran();
|
Dt_StockInfo stockInfoAdd = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
|
//记录库存变动
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfoAdd, 0, stockInfoAdd.StockLength, StockChangeTypeEnum.MaterielGroup);
|
return content.OK("成功", yLInboundCache);
|
}
|
else
|
{
|
throw new Exception($"上卷条码{yLInboundCache.BarCode}还未进行绑定");
|
}
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
|
}
|
/// <summary>
|
/// 推送至WCS原料线体启动
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent YLPurchasePush()
|
{
|
try
|
{
|
string url = AppSettings.Get("WCS");
|
if (string.IsNullOrEmpty(url))
|
{
|
throw new Exception($"未找到WCSAApi地址,请检查配置文件");
|
}
|
string response = HttpHelper.Post($"{url}/api/Task/YLPurchasePush?code=406");
|
|
return JsonConvert.DeserializeObject<WebResponseContent>(response) ?? WebResponseContent.Instance.Error("返回错误");
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 原料分配巷道
|
/// </summary>
|
/// <param name="palletCode">条码号</param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public string AssignYLRoadwayNo(string palletCode, int wide = 0, int thickness = 0, int weight = 0)
|
{
|
try
|
{
|
List<string> roadways = ExistRoadwaysError();
|
bool ErrorRoadway = false;
|
if (roadways!=null && roadways.Count>0)
|
{
|
ErrorRoadway = true;
|
}
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
|
if (stockInfo==null)
|
{
|
throw new Exception($"组盘库存不存在");
|
}
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == stockInfo.WarehouseId);
|
|
if (warehouse == null)
|
{
|
throw new Exception($"未找到巷道对应仓库信息");
|
}
|
|
string roadwayNo = "";
|
|
bool isReturn=false;
|
|
if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt())
|
{
|
if (wide>0 && thickness>0 && weight>0)
|
{
|
stockInfo.CheckThickness = thickness;
|
stockInfo.CheckWeight = weight;
|
stockInfo.CheckWide = wide;
|
isReturn = true;
|
}
|
//限制直径
|
if (stockInfo.CheckThickness >= 300 && stockInfo.CheckThickness <= 1300 && stockInfo.MaterielWide >= 690 && stockInfo.MaterielWide <= 2500)
|
{
|
bool LayerLimit = stockInfo.CheckThickness >= 1200;
|
//获取分配
|
List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo.Contains("YLDual") && (stockInfo.PalletType == LocationTypeEnum.MediumPallet.ObjToInt() ? x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt(): x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt())).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).OrderBy(x => x.RoadwayNo).ToList();
|
if (LayerLimit)
|
{
|
locationCounts = locationCounts.Where(x => x.RoadwayNo != "SC03_YLDual").ToList();
|
}
|
roadwayNo = HandleRoadway(locationCounts, warehouse, ErrorRoadway ? roadways : null);
|
}
|
}
|
else
|
{
|
//限制
|
if (stockInfo.CheckThickness >= 800 && stockInfo.CheckThickness <= 1500 && stockInfo.MaterielWide >= 700 && stockInfo.MaterielWide <= 2500)
|
{
|
bool LayerLimit = stockInfo.CheckThickness > 1300;
|
bool RoadwayLimit = stockInfo.MaterielWide > 2200;
|
bool RoadwayType = stockInfo.PalletType == LocationTypeEnum.MediumPallet.ObjToInt();
|
var query = Db.Queryable<Dt_LocationInfo>()
|
.Where(x => x.WarehouseId == warehouse.WarehouseId
|
&& x.LocationStatus == (int)LocationStatusEnum.Free
|
&& x.EnableStatus == (int)EnableStatusEnum.Normal
|
&& x.RoadwayNo.Contains("YL"))
|
.Select(x => new { x.RoadwayNo, x.Columns });
|
|
// 根据条件过滤
|
if (LayerLimit)
|
{
|
query = query.Where(x => x.Columns >= 56 && !x.RoadwayNo.Contains("YLDual"));
|
}
|
if (RoadwayLimit)
|
{
|
query = query.Where(x => !x.RoadwayNo.Contains("SC01_YL"));
|
}
|
List<LocationCount> locationCounts = query
|
.GroupBy(x => x.RoadwayNo)
|
.Select(x => new LocationCount
|
{
|
RoadwayNo = x.RoadwayNo,
|
Count = SqlFunc.AggregateCount(x)
|
})
|
.OrderBy(x => x.RoadwayNo)
|
.ToList();
|
if (RoadwayType)
|
{
|
foreach (var item in locationCounts)
|
{
|
if (item.RoadwayNo.Contains("YLDual"))
|
{
|
int count = Db.Queryable<Dt_LocationInfo>()
|
.Where(x => x.WarehouseId == warehouse.WarehouseId
|
&& x.LocationStatus == (int)LocationStatusEnum.Free
|
&& x.EnableStatus == (int)EnableStatusEnum.Normal
|
&& x.LocationType==LocationTypeEnum.MediumPallet.ObjToInt()
|
&& x.RoadwayNo == item.RoadwayNo).Count();
|
item.Count = count;
|
}
|
}
|
}
|
roadwayNo = HandleRoadway(locationCounts, warehouse, ErrorRoadway ? roadways : null);
|
}
|
else if (stockInfo.CheckThickness >= 400 && stockInfo.CheckThickness < 800 && stockInfo.MaterielWide >= 700 && stockInfo.MaterielWide <= 2500)
|
{
|
bool RoadwayType = stockInfo.PalletType == LocationTypeEnum.MediumPallet.ObjToInt();
|
//获取分配
|
List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo.Contains("YLDual") && (stockInfo.PalletType == LocationTypeEnum.MediumPallet.ObjToInt() ? x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt() : x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt())).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).OrderBy(x => x.RoadwayNo).ToList();
|
roadwayNo = HandleRoadway(locationCounts, warehouse, ErrorRoadway ? roadways : null);
|
}
|
}
|
|
if (isReturn && !string.IsNullOrEmpty(roadwayNo))
|
{
|
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
|
}
|
|
return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
}
|
//处理分配巷道 任务数量
|
public string HandleRoadway(List<LocationCount> locationCounts, Dt_Warehouse warehouse,List<string> roadways=null)
|
{
|
if (roadways != null)
|
{
|
locationCounts = locationCounts.Where(x => !roadways.Contains(x.RoadwayNo)).ToList();
|
}
|
//巷道任务分配数量
|
List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
|
&& locationCounts.Select(j => j.RoadwayNo).Distinct().Contains(x.Roadway)
|
&& TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
|
|
foreach (var item in locationCounts)
|
{
|
LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
|
if (count != null)
|
{
|
item.Count -= count.Count;
|
}
|
}
|
return locationCounts.Where(x => x.Count > 0).OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
|
}
|
/// <summary>
|
/// 入库完成
|
/// </summary>
|
public WebResponseContent InboundTaskCompleted(Dt_Task task)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
|
if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString() || warehouse.WarehouseCode == WarehouseEnum.LLDFL.ToString()) //成品/辅料完成
|
{
|
Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
|
if (locationInfoEnd == null)
|
{
|
return content.Error($"未找到对应的终点货位信息");
|
}
|
Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == task.SourceAddress && ( x.StationArea == nameof(StationAreaEnum.一楼月台码头) || x.StationArea == nameof(StationAreaEnum.一楼无纺织布) || x.StationArea == nameof(StationAreaEnum.一楼无纺淋膜)));
|
if (agvstation != null)
|
{
|
agvstation.IsOccupied = WhetherEnum.False.ObjToInt();
|
}
|
//叠盘/冲切搬运至雾化 任务单独完成
|
if (task.TaskType==TaskTypeEnum.EmptyStackPlate.ObjToInt() || task.TaskType == TaskTypeEnum.PunchingInbound.ObjToInt())
|
{
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
if (agvstation != null)
|
{
|
_basicRepository.AGVStationInfoRepository.UpdateData(agvstation);
|
}
|
if (task.ProductNo.IsNotEmptyOrNull())
|
{
|
Dt_MESProInOrderInfo mESProInOrderInfo = _inboundRepository.MESProInOrderInfoRepository.QueryFirst(x=>x.BarCode== task.ProductNo);
|
mESProInOrderInfo.MESProInStatus = InOrderStatusEnum.入库完成.ObjToInt();
|
_inboundRepository.MESProInOrderInfoRepository.UpdateData(mESProInOrderInfo);
|
}
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
|
_unitOfWorkManage.CommitTran();
|
return content.OK();
|
}
|
Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x=>x.proStockInfoDetails).First();
|
if (proStockInfo != null && proStockInfo.StockStatus == StockStatusEmun.MES空托退库.ObjToInt())
|
{
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
if (agvstation != null)
|
{
|
_basicRepository.AGVStationInfoRepository.UpdateData(agvstation);
|
}
|
proStockInfo.LocationCode = locationInfoEnd.LocationCode;
|
proStockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
|
_stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, proStockInfo.PalletType, LocationStatusEnum.InStock, proStockInfo.WarehouseId);
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
|
_unitOfWorkManage.CommitTran();
|
}
|
else if (proStockInfo != null &&( proStockInfo.StockStatus == StockStatusEmun.手动组盘入库确认.ObjToInt() || proStockInfo.StockStatus == StockStatusEmun.入库确认.ObjToInt()))
|
{
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
proStockInfo.proStockInfoDetails.ForEach(x =>
|
{
|
x.ProStockDetailStatus = StockStatusEmun.入库完成.ObjToInt();
|
});
|
_unitOfWorkManage.BeginTran();
|
if (agvstation != null)
|
{
|
_basicRepository.AGVStationInfoRepository.UpdateData(agvstation);
|
}
|
proStockInfo.LocationCode = locationInfoEnd.LocationCode;
|
proStockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
|
_stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
|
_stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfo.proStockInfoDetails);
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, proStockInfo.PalletType, LocationStatusEnum.InStock, proStockInfo.WarehouseId);
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
|
if (task.TaskType==TaskTypeEnum.InProduct.ObjToInt())
|
{
|
ERPProInUpModel proInUpModel = new ERPProInUpModel();
|
List<PB_INV_PRODUCT_INItem> pRODUCT_INItems = new List<PB_INV_PRODUCT_INItem>();
|
foreach (var item in proStockInfo.proStockInfoDetails)
|
{
|
PB_INV_PRODUCT_INItem pB_INV_PRODUCT_INItem = new PB_INV_PRODUCT_INItem()
|
{
|
WP_ID=item.LotNumber.ObjToInt(),
|
INV_BARCODE=item.ProductNo,
|
QTY=(int)item.StockQty,
|
REMARK="成品入库"
|
};
|
pRODUCT_INItems.Add(pB_INV_PRODUCT_INItem);
|
}
|
proInUpModel.PB_INV_PRODUCT_IN= pRODUCT_INItems;
|
string request = _invokeERPService.ERPProInUp(proInUpModel) ?? throw new Exception("成品入库接口请求失败");
|
if (!request.Contains("Success"))
|
{
|
throw new Exception($"成品入库失败");
|
}
|
}
|
_unitOfWorkManage.CommitTran();
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(proStockInfo, 0, proStockInfo.proStockInfoDetails.Sum(x => x.StockQty), StockChangeTypeEnum.Inbound);
|
}
|
else
|
{
|
return content.Error($"未找到对应库存信息");
|
}
|
}
|
else//原料库完成
|
{
|
//获取库存
|
Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode);
|
if (stockInfo == null)
|
{
|
return content.Error($"未找到对应库存信息");
|
}
|
//获取货位信息
|
Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
|
if (locationInfoEnd == null && task.TaskType!=TaskTypeEnum.WFBBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBYLInbound.ObjToInt())
|
{
|
return content.Error($"未找到对应的终点货位信息");
|
}
|
//更新状态
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
if (task.TaskType == TaskTypeEnum.InPick.ObjToInt())
|
{
|
Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
|
}
|
if (task.TaskType != TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBYLInbound.ObjToInt())
|
{
|
stockInfo.LocationCode = locationInfoEnd.LocationCode;
|
}
|
else
|
{
|
stockInfo.LocationCode = task.TargetAddress;
|
}
|
|
stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
|
if (task.TaskType!=TaskTypeEnum.Inbound.ObjToInt())
|
{
|
stockInfo.IsFull = WhetherEnum.True.ObjToInt();
|
}
|
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
|
if (locationInfoEnd!=null)
|
{
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
|
}
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
|
_unitOfWorkManage.CommitTran();
|
//记录库存变动
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.StockLength, 0, StockChangeTypeEnum.Inbound,taskNum:task.TaskNum);
|
//上报新厂ERP
|
if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt() && task.TaskType == TaskTypeEnum.Inbound.ObjToInt())
|
{
|
string request = _invokeERPService.ERPPurchaseUp(new ERPPurchaseUpModel()
|
{
|
INV_BARCODE_RFID = new List<INV_BARCODE_RFIDItem>()
|
{
|
new INV_BARCODE_RFIDItem()
|
{
|
INV_BARCODE=stockInfo.PalletCode,
|
RFID_BARCODE=stockInfo.RfidCode
|
}
|
}
|
});
|
}
|
//上报老厂ERP
|
if (stockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && task.TaskType == TaskTypeEnum.Inbound.ObjToInt())
|
{
|
int Qty = Convert.ToInt32(stockInfo.MaterielWeight);
|
BSTPurchaseUpModel bSTPurchaseUpModel = new BSTPurchaseUpModel()
|
{
|
Barcode = stockInfo.PalletCode,
|
BarcodeQty = Qty,
|
Rfid = stockInfo.RfidCode,
|
RfidUpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
|
};
|
BSTResponse<object> bSTResponse = _invokeERPService.BSTPurchaseUp(bSTPurchaseUpModel).DeserializeObject<BSTResponse<object>>();
|
content.Message = bSTResponse?.Msg;
|
}
|
}
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 分配成品巷道
|
/// </summary>
|
/// <returns></returns>
|
public string AssignCPRoadwayNo()
|
{
|
try
|
{
|
string roadwayNo = "";
|
//获取巷道可分配的货位数量
|
List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.RoadwayNo.Contains("CP")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
|
//筛选当前入库任务中已分配巷道任务数量
|
List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => (x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt()|| x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt())
|
&& locationCounts.Select(j=>j.RoadwayNo).Distinct().Contains(x.Roadway)
|
&& TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
|
foreach (var item in locationCounts)
|
{
|
LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
|
if (count!=null)
|
{
|
item.Count -= count.Count;
|
}
|
}
|
//通过可用货位数量排序,最多的优先分配
|
roadwayNo = locationCounts.Where(x=>x.Count>0).OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
|
return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
}
|
|
/// <summary>
|
/// 入库任务申请分配货位
|
/// </summary>
|
/// <param name="taskNum">任务号</param>
|
/// <param name="roadwayNo">巷道号</param>
|
/// <returns></returns>
|
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_StockInfo? stockInfo = null;
|
if (roadwayNo.Contains("YL"))
|
{
|
stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x=>x.PalletCode==task.PalletCode);
|
}
|
//分配货位
|
Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, task.PalletType, task.WarehouseId, stockInfo);
|
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,taskNum: taskNum);
|
_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);
|
}
|
}
|
|
/// <summary>
|
/// 成品空托回库
|
/// </summary>
|
public WebResponseContent EmptyBackTask(string barCode, string startPoint,int target)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//string palletCode = @"^C\d{5}$"; // 正则表达式
|
//bool isValid = Regex.IsMatch(barCode, palletCode);
|
//if (!isValid)
|
//{
|
// return content.Error($"框码格式错误{barCode}");
|
//}
|
Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x=>x.AGVStationCode==startPoint);
|
if (agvstation==null)
|
{
|
return content.Error($"起点错误{startPoint}");
|
}
|
//判断当前点位是否重复
|
Dt_Task taskOldPoint = BaseDal.QueryFirst(x => x.SourceAddress == startPoint &&( x.TaskStatus == TaskStatusEnum.New.ObjToInt() || x.TaskStatus==TaskStatusEnum.AGV_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}任务已存在");
|
}
|
Dt_Task newTask = null;
|
Dt_ProStockInfo proStockInfo = null;
|
if (target==WhetherEnum.False.ObjToInt())//叠盘空托任务
|
{
|
newTask = new Dt_Task()
|
{
|
CurrentAddress = startPoint,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = barCode,
|
Roadway = agvstation.AGVStationCode.StartsWith("PNT_1") ? "StackPlate1": "StackPlate2",
|
SourceAddress = startPoint,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.EmptyStackPlate.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = WarehouseEnum.LLDFL.ObjToInt(),
|
PalletType = 1
|
};
|
}
|
else //立库空托任务
|
{
|
Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode);
|
if (proStockInfoOld != null)
|
{
|
return content.Error($"托盘{barCode}已存在");
|
}
|
//分配巷道
|
string roadWay = AssignCPRoadwayNo();
|
proStockInfo = new Dt_ProStockInfo()
|
{
|
PalletCode = barCode,
|
ProStockAttribute = ProStockAttributeEnum.空托.ObjToInt(),
|
PalletType = 1,
|
LocationCode = "",
|
WarehouseId = WarehouseEnum.LLDFL.ObjToInt(),
|
StockStatus = StockStatusEmun.MES空托退库.ObjToInt()
|
};
|
newTask = new Dt_Task()
|
{
|
CurrentAddress = startPoint,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = barCode,
|
Roadway = roadWay,
|
SourceAddress = startPoint,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.EmptyProductBack.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = WarehouseEnum.LLDFL.ObjToInt(),
|
PalletType = 1
|
};
|
}
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
if (proStockInfo!=null)
|
{
|
_stockRepository.ProStockInfoRepository.AddData(proStockInfo);
|
}
|
newTask.TaskId = taskId;
|
_unitOfWorkManage.CommitTran();
|
//推送任务
|
PushTasksToWCS(new List<Dt_Task> { newTask },"AGV");
|
content.OK("发送成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
private readonly static object _lockerFLorCP = new object();
|
/// <summary>
|
/// 辅料/成品临时入库
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent InboundFLOrCPTask(string barCode, string startPoint,string matCode,int matCount, int oneCount)
|
{
|
lock (_lockerFLorCP)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (matCount<1 || oneCount < 1)
|
{
|
return content.Error("物料总数或单个数量不能小于1");
|
}
|
//string palletCode = @"^C\d{5}$"; // 正则表达式
|
//bool isValid = Regex.IsMatch(barCode, palletCode);
|
//if (!isValid)
|
//{
|
// return content.Error($"框码格式错误{barCode}");
|
//}
|
//获取物料
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == matCode && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt() && (x.WarehouseId==WarehouseEnum.LLDCP.ObjToInt() || x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()));
|
if (materielInfo == null)
|
{
|
return content.Error($"未找到物料信息{matCode}");
|
}
|
Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == startPoint);
|
if (agvstation == null)
|
{
|
return content.Error($"起点错误{startPoint}");
|
}
|
//判断当前点位是否重复
|
Dt_Task taskOldPoint = BaseDal.QueryFirst(x => x.SourceAddress == startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_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}任务已存在");
|
}
|
Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode);
|
if (proStockInfoOld != null)
|
{
|
return content.Error($"托盘{barCode}已存在");
|
}
|
//分配巷道
|
string roadWay = AssignCPRoadwayNo();
|
|
//获取成品库
|
WarehouseEnum warehouseEnum = materielInfo.MaterielSourceType == MaterielTypeEnum.成品.ObjToInt() ? WarehouseEnum.LLDCP : WarehouseEnum.LLDFL;
|
List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
|
for (int i = 0; i < matCount; i++)
|
{
|
Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
|
{
|
ProductCode = materielInfo.MaterielCode,
|
ProductName = materielInfo.MaterielName,
|
ProductSpec = materielInfo.MaterielSpec,
|
ProductUnit = materielInfo.MaterielUnit,
|
StockQty = oneCount,
|
ProStockDetailStatus = StockStatusEmun.手动组盘入库确认.ObjToInt()
|
};
|
proStockInfoDetails.Add(proStockInfoDetail);
|
}
|
|
Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
|
{
|
PalletCode = barCode,
|
ProStockAttribute = materielInfo.MaterielSourceType,
|
PalletType = 1,
|
LocationCode = "",
|
WarehouseId = warehouseEnum.ObjToInt(),
|
StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(),
|
proStockInfoDetails = proStockInfoDetails
|
};
|
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = startPoint,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = barCode,
|
Roadway = roadWay,
|
SourceAddress = startPoint,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = warehouseEnum.ObjToInt(),
|
PalletType = 1
|
};
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
BaseDal.Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
|
newTask.TaskId = taskId;
|
_unitOfWorkManage.CommitTran();
|
//推送任务
|
PushTasksToWCS(new List<Dt_Task> { newTask }, "AGV");
|
content.OK("发送成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
}
|
/// <summary>
|
/// 辅料(成品)采购/期初入库
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent InboundOrderInTask(string bindCode,string barCode,string startPoint, int orderType = 0)
|
{
|
WebResponseContent content=new WebResponseContent();
|
try
|
{
|
InOrderTypeEnum inOrderTypeEnum = (InOrderTypeEnum)orderType;
|
if (inOrderTypeEnum == InOrderTypeEnum.InventoryIn)
|
{
|
//获取主单
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Includes(x => x.Details).Where(x => x.Details.Any(v => v.BarCode == bindCode)).First();
|
|
if (inboundOrder == null)
|
{
|
throw new Exception($"未找到条码{bindCode}入库单据信息");
|
}
|
Dt_InboundOrderDetail inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BarCode == bindCode);
|
if (inboundOrderDetail == null)
|
{
|
throw new Exception($"未找到入库单号为{inboundOrder.UpperOrderNo}条码{bindCode}单据信息");
|
}
|
if (inboundOrderDetail.OrderDetailStatus != InOrderStatusEnum.未开始.ObjToInt())
|
{
|
throw new Exception($"条码{bindCode}信息已入库或入库中");
|
}
|
Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == startPoint);
|
if (agvstation == null)
|
{
|
return content.Error($"起点错误{startPoint}");
|
}
|
//判断当前点位是否重复
|
Dt_Task taskOldPoint = BaseDal.QueryFirst(x => x.SourceAddress == startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_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}任务已存在");
|
}
|
Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode);
|
if (proStockInfoOld != null)
|
{
|
return content.Error($"托盘{barCode}已存在");
|
}
|
//分配巷道
|
string roadWay = AssignCPRoadwayNo();
|
//获取物料
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId && x.MaterielCode == inboundOrderDetail.MaterialCode);
|
Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
|
{
|
ProductCode = materielInfo.MaterielCode,
|
ProductNo = bindCode,
|
ProductName = materielInfo.MaterielName,
|
ProductSpec = materielInfo.MaterielSpec,
|
LotNumber = inboundOrderDetail.MaterialLot,
|
ProductUnit = materielInfo.MaterielUnit,
|
StockQty = inboundOrderDetail.OrderQuantity,
|
ProStockDetailStatus = StockStatusEmun.入库确认.ObjToInt()
|
};
|
Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
|
{
|
PalletCode = barCode,
|
ProInOrderNo = inboundOrder.UpperOrderNo,
|
ProStockAttribute = materielInfo.MaterielSourceType,
|
PalletType = 1,
|
LocationCode = "",
|
WarehouseId = materielInfo.WarehouseId,
|
StockStatus = StockStatusEmun.入库确认.ObjToInt(),
|
proStockInfoDetails = new List<Dt_ProStockInfoDetail> { proStockInfoDetail }
|
};
|
//生成任务
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = startPoint,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = barCode,
|
Roadway = roadWay,
|
SourceAddress = startPoint,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = inboundOrder.WarehouseId,
|
OrderNo = inboundOrder.UpperOrderNo,
|
MaterielCode = inboundOrderDetail.MaterialCode,
|
Quantity = inboundOrderDetail.OrderQuantity,
|
PalletType = 1
|
};
|
if (agvstation.StationArea==StationAreaEnum.二楼成品库缓存区.ToString())
|
{
|
newTask.TaskType = TaskTypeEnum.Inbound2ndFloor.ObjToInt();
|
}
|
inboundOrderDetail.OrderDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
if (inboundOrder.InboundOrderStatus == InOrderStatusEnum.未开始.ObjToInt())
|
{
|
inboundOrder.InboundOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
|
}
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
|
int taskId = BaseDal.AddData(newTask);
|
BaseDal.Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
|
newTask.TaskId = taskId;
|
_unitOfWorkManage.CommitTran();
|
//推送任务
|
PushTasksToWCS(new List<Dt_Task> { newTask }, "AGV");
|
}
|
else if (inOrderTypeEnum == InOrderTypeEnum.PurchaseIn)
|
{
|
//获取主单
|
Dt_PurchaseOrder inboundOrder = BaseDal.Db.Queryable<Dt_PurchaseOrder>().Includes(x => x.Details).Where(x => x.Details.Any(v => v.BarCode == bindCode)).First();
|
|
if (inboundOrder == null)
|
{
|
throw new Exception($"未找到条码{bindCode}采购入库单据信息");
|
}
|
Dt_PurchaseOrderDetail inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BarCode == bindCode);
|
if (inboundOrderDetail == null)
|
{
|
throw new Exception($"未找到入库单号为{inboundOrder.PurchaseOrderNo}条码{bindCode}单据信息");
|
}
|
if (inboundOrderDetail.PurchaseDetailStatus != InOrderStatusEnum.未开始.ObjToInt())
|
{
|
throw new Exception($"条码{bindCode}信息已入库或入库中");
|
}
|
Dt_AGVStationInfo agvstation = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == startPoint);
|
if (agvstation == null)
|
{
|
return content.Error($"起点错误{startPoint}");
|
}
|
//判断当前点位是否重复
|
Dt_Task taskOldPoint = BaseDal.QueryFirst(x => x.SourceAddress == startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_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}任务已存在");
|
}
|
Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == barCode);
|
if (proStockInfoOld != null)
|
{
|
return content.Error($"托盘{barCode}已存在");
|
}
|
//分配巷道
|
string roadWay = AssignCPRoadwayNo();
|
//获取物料
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId && x.MaterielCode == inboundOrderDetail.MaterialCode);
|
Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
|
{
|
ProductCode = materielInfo.MaterielCode,
|
ProductNo = bindCode,
|
ProductName = materielInfo.MaterielName,
|
ProductSpec = materielInfo.MaterielSpec,
|
LotNumber = inboundOrderDetail.MaterialLot,
|
ProductUnit = materielInfo.MaterielUnit,
|
StockQty = inboundOrderDetail.PurchaseDetailQuantity,
|
ProStockDetailStatus = StockStatusEmun.入库确认.ObjToInt()
|
};
|
Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
|
{
|
PalletCode = barCode,
|
ProInOrderNo = inboundOrder.PurchaseOrderNo,
|
ProStockAttribute = materielInfo.MaterielSourceType,
|
PalletType = 1,
|
LocationCode = "",
|
WarehouseId = materielInfo.WarehouseId,
|
StockStatus = StockStatusEmun.入库确认.ObjToInt(),
|
proStockInfoDetails = new List<Dt_ProStockInfoDetail> { proStockInfoDetail }
|
};
|
//生成任务
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = startPoint,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = barCode,
|
Roadway = roadWay,
|
SourceAddress = startPoint,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = inboundOrder.WarehouseId,
|
OrderNo = inboundOrder.PurchaseOrderNo,
|
MaterielCode=inboundOrderDetail.MaterialCode,
|
Quantity=inboundOrderDetail.PurchaseDetailQuantity,
|
PalletType = 1
|
};
|
inboundOrderDetail.PurchaseDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
if (inboundOrder.PurchaseOrderStatus == InOrderStatusEnum.未开始.ObjToInt())
|
{
|
inboundOrder.PurchaseOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_inboundRepository.PurchaseOrderRepository.UpdateData(inboundOrder);
|
}
|
_inboundRepository.PurchaseOrderDetailRepository.UpdateData(inboundOrderDetail);
|
int taskId = BaseDal.AddData(newTask);
|
BaseDal.Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
|
newTask.TaskId = taskId;
|
_unitOfWorkManage.CommitTran();
|
//推送任务
|
PushTasksToWCS(new List<Dt_Task> { newTask }, "AGV");
|
}
|
else
|
{
|
return content.Error($"未找到对应单据类型");
|
}
|
|
content.OK("发送成功");
|
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 印刷余料退料任务
|
/// </summary>
|
public WebResponseContent PrintBackInbound(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
var barcode = saveModel.MainData["palletCode"].ToString();
|
var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
|
var materSn = saveModel.MainData["materSn"];
|
//直径
|
var thickness = saveModel.MainData["thickness"].ObjToInt();
|
var weight = saveModel.MainData["weight"].ObjToInt();
|
var address = saveModel.MainData["address"].ToString();
|
//幅宽
|
var wide = saveModel.MainData["wide"].ObjToInt();
|
Dt_MaterielInfo? materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materSn);
|
if (materielInfo == null)
|
{
|
return content.Error("未找到物料信息");
|
}
|
if (materielInfo.MaterielSourceType != MaterielTypeEnum.原材料.ObjToInt())
|
{
|
return content.Error($"物料信息不符合{MaterielTypeEnum.原材料}");
|
}
|
Dt_StockInfo stockInfoOld = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == barcode);
|
if (stockInfoOld != null)
|
{
|
return content.Error("托盘信息已存在");
|
}
|
//生成库存组盘信息
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
MaterielInvOrgId = materielInfo.MaterielInvOrgId,
|
PalletCode = barcode,
|
LocationCode = "",
|
PalletType = 1,
|
WarehouseId = warehouseId,
|
StockAttribute = materielInfo.MaterielSourceType,
|
StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(),
|
MaterielSpec = materielInfo.MaterielSpec,
|
Unit = materielInfo.MaterielUnit,
|
MaterielThickness = thickness,
|
MaterielWide = wide,
|
MaterielWeight = weight,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
};
|
if (wide >= 1160)
|
{
|
stockInfo.PalletType = 2;
|
}
|
|
//生成印刷余料退料任务
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = address,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = barcode,
|
Roadway = "",
|
SourceAddress = address,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.PrintYLBackInbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = warehouseId,
|
PalletType = stockInfo.PalletType,
|
TaskLength= wide
|
};
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
_stockRepository.StockInfoRepository.AddData(stockInfo);
|
newTask.TaskId = taskId;
|
_unitOfWorkManage.CommitTran();
|
//推送任务
|
PushTasksToWCS(new List<Dt_Task> { newTask });
|
content.OK("发送成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 印刷下料任务
|
/// </summary>
|
public WebResponseContent PrintInbound(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
var barcode = saveModel.MainData["palletCode"].ToString();
|
var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
|
var materSn = saveModel.MainData["materSn"];
|
//直径
|
var thickness = saveModel.MainData["thickness"].ObjToInt();
|
var weight = saveModel.MainData["weight"].ObjToInt();
|
var address = saveModel.MainData["address"].ToString();
|
//幅宽
|
var wide = saveModel.MainData["wide"].ObjToInt();
|
Dt_MaterielInfo? materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materSn);
|
if (materielInfo == null)
|
{
|
return content.Error("未找到物料信息");
|
}
|
if (materielInfo.MaterielSourceType!=MaterielTypeEnum.半成品.ObjToInt())
|
{
|
return content.Error($"未找到物料{materielInfo.MaterielCode}半成品信息");
|
}
|
Dt_StockInfo stockInfoOld = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == barcode);
|
if (stockInfoOld != null)
|
{
|
return content.Error("托盘信息已存在");
|
}
|
//生成库存组盘信息
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
MaterielInvOrgId = materielInfo.MaterielInvOrgId,
|
PalletCode = barcode,
|
LocationCode = "",
|
PalletType = 1,
|
WarehouseId = warehouseId,
|
StockAttribute = materielInfo.MaterielSourceType,
|
StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(),
|
MaterielSpec = materielInfo.MaterielSpec,
|
Unit = materielInfo.MaterielUnit,
|
MaterielThickness = thickness,
|
MaterielWide = wide,
|
MaterielWeight = weight,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
};
|
if (wide >= 1160)
|
{
|
stockInfo.PalletType = 2;
|
}
|
|
//生成印刷半成品入库任务
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = address,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = barcode,
|
Roadway = "",
|
SourceAddress = address,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.PrintYLInbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = warehouseId,
|
PalletType = stockInfo.PalletType,
|
TaskLength = wide
|
};
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
_stockRepository.StockInfoRepository.AddData(stockInfo);
|
newTask.TaskId = taskId;
|
_unitOfWorkManage.CommitTran();
|
//推送任务
|
PushTasksToWCS(new List<Dt_Task> { newTask });
|
content.OK("发送成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 成品/半成品信息同步接口
|
/// </summary>
|
public WebResponseContent ReceiveProCodeInfo(List<MESProInDTO> proInDTOs)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (proInDTOs == null || proInDTOs.Count <= 0)
|
{
|
return content.Error("传入信息为空");
|
}
|
//获取所有成品,半成品信息
|
List<Dt_MESProInOrderInfo> proInOrderInfosOld = _inboundRepository.MESProInOrderInfoRepository.QueryData();
|
//获取所有物料信息
|
List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt());
|
|
MESProInDTO? CheckMaterialCode = proInDTOs.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialCode));
|
if (CheckMaterialCode != null)
|
{
|
return content.Error($"物料编码{nameof(MESProInDTO.MaterialCode)}:{CheckMaterialCode.MaterialCode}信息不存在");
|
}
|
//获取所有AGV点位
|
List<Dt_AGVStationInfo> aGVStationInfos = _basicRepository.AGVStationInfoRepository.QueryData(x => !string.IsNullOrEmpty(x.MESPointCode));
|
|
//判断是否存在重复
|
MESProInDTO? proInDTO = proInDTOs.FirstOrDefault(x => x.IsMantissa == false && proInOrderInfosOld.Select(x => x.BarCode).Contains(x.BarCode));
|
if (proInDTO != null)
|
{
|
return content.Error($"{proInDTO.ProductOrderNo}生产工单{proInDTO.BarCode}条码已存在");
|
}
|
Dt_MESProInOrderInfo? proInOrderInfo = proInOrderInfosOld.FirstOrDefault(x => x.MESProInStatus == InOrderStatusEnum.关闭.ObjToInt() && proInDTOs.Select(x => x.ProductOrderNo).Distinct().Contains(x.ProductOrderNo));
|
if (proInOrderInfo != null)
|
{
|
return content.Error($"{proInOrderInfo.ProductOrderNo}生产工单已关闭");
|
}
|
List<Dt_MESProInOrderInfo> AddMESProInOrders = new List<Dt_MESProInOrderInfo>();
|
foreach (var item in proInDTOs)
|
{
|
Dt_MaterielInfo materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterialCode);
|
//判断
|
if ((item.Thickness <= 0 || item.Wide <= 0) && materielInfo.WarehouseId == WarehouseEnum.LLDYL.ObjToInt())
|
{
|
return content.Error($"物料{item.MaterialCode}条码{item.BarCode}直径或幅宽不能小于0");
|
}
|
if (materielInfo.MaterielSourceType != MaterielTypeEnum.成品.ObjToInt())
|
{
|
Dt_AGVStationInfo? CheckPointCode = aGVStationInfos.FirstOrDefault(x => x.MESPointCode == item?.PointCode);
|
if (CheckPointCode == null)
|
{
|
return content.Error($"周转位{nameof(MESReturnIssueDTO.PointCode)}{item?.PointCode}不存在,仅成品物料可不传");
|
}
|
}
|
if (materielInfo.MaterielSourceType == MaterielTypeEnum.成品.ObjToInt() && (item.Length <= 0 || item.Width <= 0 || item.Height<=0))
|
{
|
return content.Error($"箱码{item.ProPackCode},长度/宽度/高度不能为0");
|
}
|
Dt_MESProInOrderInfo AddproInOrderInfo = _mapper.Map<Dt_MESProInOrderInfo>(item);
|
AddproInOrderInfo.WarehouseId = materielInfo.WarehouseId;
|
AddproInOrderInfo.MESProOrderType = materielInfo.MaterielSourceType;
|
//小于550幅宽则不能搬运
|
if (item.Wide < 550 && materielInfo.WarehouseId == WarehouseEnum.LLDYL.ObjToInt())
|
{
|
AddproInOrderInfo.MESProInStatus=InOrderStatusEnum.入库完成.ObjToInt();
|
}
|
AddMESProInOrders.Add(AddproInOrderInfo);
|
}
|
List<Dt_Task> tasks = new List<Dt_Task>();
|
_unitOfWorkManage.BeginTran();
|
_inboundRepository.MESProInOrderInfoRepository.AddData(AddMESProInOrders);
|
List<Dt_MESProInOrderInfo> mESProInOrderInfos = AddMESProInOrders.Where(x => x.MESProOrderType == MaterielTypeEnum.半成品.ObjToInt()).ToList();
|
if (mESProInOrderInfos.Count > 0)
|
{
|
List<PB_INV_PRODUCT_INItem> pRODUCT_INItems = new List<PB_INV_PRODUCT_INItem>();
|
foreach (var item in mESProInOrderInfos)
|
{
|
PB_INV_PRODUCT_INItem pB_INV_PRODUCT_INItem = new PB_INV_PRODUCT_INItem()
|
{
|
WP_ID = item.ProcessNum,
|
INV_BARCODE=item.BarCode,
|
REMARK = "半成品入库",
|
QTY=(int)item.ProQuantity
|
};
|
pRODUCT_INItems.Add(pB_INV_PRODUCT_INItem);
|
}
|
string request = _invokeERPService.ERPSemiProInUp(
|
new ERPProInUpModel()
|
{
|
PB_INV_PRODUCT_IN= pRODUCT_INItems
|
}) ?? throw new Exception("半成品入库接口请求失败");
|
//生成半成品入库
|
List<Dt_MESProInOrderInfo> semiProInOrderInfos = mESProInOrderInfos.Where(x => x.MESProInStatus == InOrderStatusEnum.未开始.ObjToInt() && x.WarehouseId==WarehouseEnum.LLDYL.ObjToInt()).ToList();
|
if (semiProInOrderInfos.Count>0)
|
{
|
WebResponseContent webResponse = SemiProInbound(semiProInOrderInfos);
|
if (!webResponse.Status)
|
{
|
throw new Exception(webResponse.Message);
|
}
|
tasks = webResponse.Data as List<Dt_Task>;
|
WebResponseContent taskResponse = PushTasksToWCS(tasks);
|
if (!taskResponse.Status)
|
{
|
throw new Exception(taskResponse.Message);
|
}
|
_inboundRepository.MESProInOrderInfoRepository.UpdateData(mESProInOrderInfos);
|
}
|
}
|
List<Dt_MESProInOrderInfo> proInOrderInfos = AddMESProInOrders.Where(x => x.MESProOrderType == MaterielTypeEnum.成品.ObjToInt()).ToList();
|
if (proInOrderInfos.Count > 0)
|
{
|
WebResponseContent webResponse = PushPackaxisTaskToWCS(proInOrderInfos);
|
if (!webResponse.Status)
|
{
|
throw new Exception(webResponse.Message);
|
}
|
}
|
_unitOfWorkManage.CommitTran();
|
content.OK("接收成功");
|
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 半成品下料MES任务
|
/// </summary>
|
public WebResponseContent SemiProInbound(List<Dt_MESProInOrderInfo> mESProInOrderInfos)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (mESProInOrderInfos.Count <= 0)
|
{
|
return content.Error("传入信息为空");
|
}
|
|
List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData();
|
List<Dt_StockInfo> stockInfos = new List<Dt_StockInfo>();
|
List<Dt_Task> tasks = new List<Dt_Task>();
|
//获取所有AGV点位
|
List<Dt_AGVStationInfo> aGVStationInfos = _basicRepository.AGVStationInfoRepository.QueryData(x => !string.IsNullOrEmpty(x.MESPointCode));
|
List<Dt_AGVStationInfo> _AGVStationInfos = new List<Dt_AGVStationInfo>();
|
//根据半成品信息呼叫对应任务
|
foreach (var item in mESProInOrderInfos)
|
{
|
Dt_AGVStationInfo? CheckPointCode = aGVStationInfos.FirstOrDefault(x => x.MESPointCode == item?.PointCode);
|
Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterialCode);
|
if (CheckPointCode==null)
|
{
|
return content.Error($"未找到{item?.PointCode}点位");
|
}
|
if (materielInfo == null)
|
{
|
return content.Error("未找到物料信息");
|
}
|
if (materielInfo.MaterielSourceType != MaterielTypeEnum.半成品.ObjToInt())
|
{
|
return content.Error($"未找到物料{materielInfo.MaterielCode}半成品信息");
|
}
|
Dt_StockInfo stockInfoOld = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == item.BarCode);
|
if (stockInfoOld != null)
|
{
|
return content.Error("托盘信息已存在");
|
}
|
//生成库存组盘信息
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
MaterielInvOrgId = materielInfo.MaterielInvOrgId,
|
PalletCode = item.BarCode,
|
LocationCode = "",
|
PalletType = 1,
|
WarehouseId = materielInfo.WarehouseId,
|
StockAttribute = materielInfo.MaterielSourceType,
|
StockStatus = StockStatusEmun.入库确认.ObjToInt(),
|
MaterielSpec = materielInfo.MaterielSpec,
|
Unit = materielInfo.MaterielUnit,
|
MaterielThickness = item.Thickness,
|
MaterielWide = item.Wide,
|
MaterielWeight = item.Weight,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
StockLength=item.ProQuantity
|
};
|
if (item.Wide >= 1160)
|
{
|
stockInfo.PalletType = 2;
|
}
|
|
//半成品入库任务
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = item.PointCode.StartsWith("YS") ? CheckPointCode.AGVStationCode : CheckPointCode.MESPointCode,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = item.BarCode,
|
Roadway = "",
|
SourceAddress = CheckPointCode.AGVStationCode,
|
TargetAddress = "",
|
TaskType = 0,
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = materielInfo.WarehouseId,
|
PalletType = stockInfo.PalletType,
|
TaskLength = (int)item.Wide,
|
WorkCentreCode=item.MakeCode,
|
MaterielCode = item.MaterialCode,
|
Quantity =item.ProQuantity
|
};
|
TaskTypeEnum taskTypeEnum = CheckPointCode.StationArea switch
|
{
|
nameof(StationAreaEnum.一楼印刷) => TaskTypeEnum.PrintYLInbound,
|
nameof(StationAreaEnum.一楼分切) => TaskTypeEnum.PartOffInbound,
|
nameof(StationAreaEnum.一楼纸张淋膜) => TaskTypeEnum.PaperFilmInbound,
|
nameof(StationAreaEnum.一楼无纺淋膜) => TaskTypeEnum.WFBYLInbound,
|
_ => throw new Exception("未找到对应任务")
|
};
|
if (taskTypeEnum == TaskTypeEnum.WFBYLInbound)
|
{
|
Dt_AGVStationInfo? stationInfo = AssignWFBStation(_AGVStationInfos?.Select(x => x.AGVStationCode).ToList()) ?? throw new Exception("未找到可用无纺布暂存架");
|
newTask.NextAddress = stationInfo.AGVStationCode;
|
newTask.TargetAddress = stationInfo.AGVStationCode;
|
newTask.Roadway = "AGV";
|
stationInfo.IsOccupied = 1;
|
_AGVStationInfos.Add(stationInfo);
|
}
|
newTask.TaskType = taskTypeEnum.ObjToInt();
|
stockInfos.Add(stockInfo);
|
tasks.Add(newTask);
|
}
|
//操作入库数据
|
BaseDal.AddData(tasks);
|
_basicRepository.AGVStationInfoRepository.UpdateData(_AGVStationInfos);
|
_stockRepository.StockInfoRepository.AddData(stockInfos);
|
//推送任务
|
content.OK("发送成功",data:tasks);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 推送码垛数据至WCS
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent PushPackaxisTaskToWCS(List<Dt_MESProInOrderInfo> mESProInOrderInfos)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
string url = AppSettings.Get("WCS");
|
if (string.IsNullOrEmpty(url))
|
{
|
throw new Exception($"未找到WCSAApi地址,请检查配置文件");
|
}
|
string response = HttpHelper.Post($"{url}/api/Packinfo/ReceivePackaxisTask", mESProInOrderInfos.Serialize());
|
|
return JsonConvert.DeserializeObject<WebResponseContent>(response) ?? WebResponseContent.Instance.Error("返回错误");
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
public Dt_AGVStationInfo? AssignWFBStation(List<string> assignPoints)
|
{
|
try
|
{
|
Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
|
{
|
{ nameof(Dt_AGVStationInfo.Depth),OrderByType.Asc }
|
};
|
List<string> stockPoints = _stockRepository.StockInfoRepository.QueryData(x=>x.StockAttribute== MaterielTypeEnum.半成品.ObjToInt() && x.LocationCode.StartsWith("PNT")).Select(x=>x.LocationCode).ToList();
|
return _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.StationArea == StationAreaEnum.一楼暂存架.ToString() && x.IsOccupied == WhetherEnum.False.ObjToInt() && !stockPoints.Contains(x.AGVStationCode) && !assignPoints.Contains(x.AGVStationCode), orderBy);
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
}
|
public WebResponseContent BoxingInBound(string stationCode,List<string> barCodes)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//获取成品库存
|
Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == stationCode);
|
if (proStockInfoOld != null)
|
{
|
return content.Error($"托盘{stationCode}已存在");
|
}
|
//获取条码信息
|
List<Dt_MESProInOrderInfo> proInOrderInfos = _inboundRepository.MESProInOrderInfoRepository.QueryData(x=> barCodes.Contains(x.BarCode));
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode== proInOrderInfos.FirstOrDefault().MaterialCode);
|
List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
|
foreach (var item in proInOrderInfos)
|
{
|
Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
|
{
|
ProductCode = materielInfo.MaterielCode,
|
ProductNo = item.BarCode,
|
ProductName = materielInfo.MaterielName,
|
ProductSpec = materielInfo.MaterielSpec,
|
LotNumber = item.ProcessNum.ToString(),
|
ProductUnit = materielInfo.MaterielUnit,
|
StockQty = item.ProQuantity,
|
ProStockDetailStatus = StockStatusEmun.组盘暂存.ObjToInt()
|
};
|
proStockInfoDetails.Add(proStockInfoDetail);
|
}
|
|
Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
|
{
|
PalletCode = stationCode,
|
ProInOrderNo = proInOrderInfos.FirstOrDefault().ProductOrderNo,
|
ProStockAttribute = materielInfo.MaterielSourceType,
|
PalletType = 1,
|
LocationCode = "",
|
WarehouseId = materielInfo.WarehouseId,
|
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
|
proStockInfoDetails = proStockInfoDetails
|
};
|
BaseDal.Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 成品入库扫码请求更新条码
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent InBoundPalletCode(int taskNum, string barCode)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//获取当前任务
|
Dt_Task? taskExist = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
|
if (taskExist==null)
|
{
|
return content.Error($"未找到任务{taskNum}");
|
}
|
//判断库存中是否存在重复托盘条码
|
Dt_ProStockInfo? proStockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x=>x.PalletCode==barCode);
|
if (proStockInfo!=null)
|
{
|
return content.Error($"库存条码{proStockInfo.PalletCode}已存在");
|
}
|
Dt_ProStockInfo proStockInfoExist = _stockRepository.ProStockInfoRepository.QueryFirst(x=>x.PalletCode== taskExist.PalletCode);
|
//更新
|
proStockInfoExist.PalletCode = barCode;
|
taskExist.PalletCode = barCode;
|
_unitOfWorkManage.BeginTran();
|
_stockRepository.ProStockInfoRepository.UpdateData(proStockInfoExist);
|
BaseDal.UpdateData(taskExist);
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 半成品托盘搬运入库
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent SemiProIn(string barcode, string palletCode, string address)
|
{
|
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//获取当前半成品信息
|
Dt_MESProInOrderInfo mESProInOrderInfo = _inboundRepository.MESProInOrderInfoRepository.QueryFirst(x=>x.BarCode==barcode) ?? throw new Exception($"半成品条码{barcode}信息不存在,请核对信息");
|
//获取加工中心
|
Dt_MakeCenterInfo makeCenterInfo = _basicRepository.MakeCenterInfoRepository.QueryFirst(x=>x.MakeCode==mESProInOrderInfo.MakeCode);
|
if (makeCenterInfo.MakeArea!=StationAreaEnum.一楼分切.ObjToInt() && makeCenterInfo.MakeArea != StationAreaEnum.一楼冲切.ObjToInt() && makeCenterInfo.MakeArea != StationAreaEnum.一楼模切.ObjToInt()) throw new Exception($"半成品条码{barcode}不属于分切/冲切/模切加工");
|
|
//判断任务
|
Dt_Task? taskExist = BaseDal.QueryFirst(x=>x.PalletCode==palletCode) == null ? null: throw new Exception($"托盘{palletCode}任务已存在");
|
//判断库存
|
Dt_ProStockInfo? proStockInfoExist = BaseDal.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode== palletCode).Includes(x => x.proStockInfoDetails).First() == null ? null : throw new Exception($"托盘{palletCode}库存已存在"); ;
|
//判断地址
|
Dt_AGVStationInfo StationInfoStart = _basicRepository.AGVStationInfoRepository.QueryFirst(x=>x.AGVStationCode==address) ?? throw new Exception($"地址码{address}不存在");
|
|
Dt_AGVStationInfo? StationInfoEnd = null;
|
Dt_Task? newTask = null;
|
#region 逻辑判断:分切&模切入成品(辅料)库;冲切搬运至二楼雾化中转区)
|
if (makeCenterInfo.MakeArea == StationAreaEnum.一楼冲切.ObjToInt())
|
{
|
//获取雾化中转区点位
|
StationInfoEnd = _basicRepository.AGVStationInfoRepository.QueryFirst(x=>x.StationArea== StationAreaEnum.二楼雾化.ToString() && x.IsOccupied==WhetherEnum.False.ObjToInt()) ?? throw new Exception($"二楼雾化可用点位不足");
|
//生成任务
|
newTask = new Dt_Task()
|
{
|
CurrentAddress = StationInfoStart.AGVStationCode,
|
Grade = 0,
|
NextAddress = StationInfoEnd.AGVStationCode,
|
PalletCode = palletCode,
|
Roadway = "AGV",
|
SourceAddress = StationInfoStart.AGVStationCode,
|
TargetAddress = StationInfoEnd.AGVStationCode,
|
TaskType = TaskTypeEnum.PunchingInbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = mESProInOrderInfo.WarehouseId,
|
PalletType = PalletTypeEnum.SmallPallet.ObjToInt(),
|
TaskLength = (int)mESProInOrderInfo.Wide,
|
WorkCentreCode = mESProInOrderInfo.MakeCode,
|
MaterielCode=mESProInOrderInfo.MaterialCode,
|
Quantity=mESProInOrderInfo.ProQuantity,
|
ProductNo=mESProInOrderInfo.BarCode
|
};
|
StationInfoEnd.IsOccupied = 1;
|
}
|
else
|
{
|
return content.Error("暂时无法满足");
|
}
|
mESProInOrderInfo.MESProInStatus = InOrderStatusEnum.入库中.ObjToInt();
|
//数据库操作并推送WCS任务
|
_unitOfWorkManage.BeginTran();
|
_basicRepository.AGVStationInfoRepository.UpdateData(StationInfoEnd);
|
BaseDal.AddData(newTask);
|
_inboundRepository.MESProInOrderInfoRepository.UpdateData(mESProInOrderInfo);
|
WebResponseContent taskResponse = PushTasksToWCS(new List<Dt_Task>() { newTask });
|
if (!taskResponse.Status)
|
{
|
throw new Exception(taskResponse.Message);
|
}
|
_unitOfWorkManage.CommitTran();
|
#endregion
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
}
|
}
|