using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
|
using SqlSugar;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
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.Helper;
|
using WIDESEA_DTO;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_DTO.Task;
|
using WIDESEA_External.Model;
|
using WIDESEA_Model.Models;
|
|
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, string palletCode)
|
{
|
try
|
{
|
Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode);
|
if (task != null)
|
{
|
PushTasksToWCS(new List<Dt_Task> { task });
|
return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task));
|
}
|
|
if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null)
|
{
|
return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
|
}
|
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到组盘信息");
|
}
|
if (stockInfo.StockStatus != StockStatusEmun.MES余料退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES空托退库.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
|
}
|
if (!string.IsNullOrEmpty(stockInfo.LocationCode))
|
{
|
return WebResponseContent.Instance.Error($"该托盘已绑定货位");
|
}
|
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = stationCode,
|
Grade = 0,
|
NextAddress = "",
|
PalletCode = palletCode,
|
Roadway = "",
|
SourceAddress = stationCode,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = stockInfo.WarehouseId,
|
PalletType = stockInfo.PalletType,
|
};
|
|
|
if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
|
{
|
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
|
}
|
else
|
{
|
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
|
}
|
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
newTask.TaskId = taskId;
|
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
|
_unitOfWorkManage.CommitTran();
|
WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
|
|
PushTasksToWCS(new List<Dt_Task> { newTask });
|
if (newTask.WarehouseId == 5) PutFinish(stationCode, newTask.PalletCode, newTask.TaskNum.ToString());
|
return WebResponseContent.Instance.OK(data: wMSTaskDTO);
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <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_Task task = Repository.QueryFirst(x => x.PalletCode == 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($"该站点已有未执行的任务");
|
}
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
|
if (stockInfo == null)
|
{
|
return content.Error($"未找到组盘信息");
|
}
|
if (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 = palletCode,
|
Roadway = rowWay,
|
SourceAddress = stationCode,
|
TargetAddress = "",
|
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = stockInfo.WarehouseId,
|
PalletType = stockInfo.PalletType,
|
};
|
|
if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
|
{
|
stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
|
}
|
else
|
{
|
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;
|
}
|
/// <summary>
|
/// 原料请求组盘
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent YLPurchaseBoxing(string palletCode)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_StockInfo stockInfoOld = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
|
if (stockInfoOld != null && stockInfoOld.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt())
|
{
|
return content.OK($"新厂临时入库{stockInfoOld.PalletCode}");
|
}
|
else if (stockInfoOld != null)
|
{
|
return content.Error($"条码{stockInfoOld.PalletCode}信息已存在");
|
}
|
//获取采购信息
|
Dt_PurchaseBSTOrderDetail purchaseBSTOrderDetail = _purchaseBSTOrderDetailRepository.QueryFirst(x=>x.Barcode== palletCode);
|
if (purchaseBSTOrderDetail == null)
|
{
|
return content.Error($"未找到条码{palletCode}采购信息");
|
}
|
if (purchaseBSTOrderDetail.PurchaseBSTOrderDetailStatus!=InOrderStatusEnum.未开始.ObjToInt())
|
{
|
return content.Error($"采购{purchaseBSTOrderDetail.Barcode}信息已入库或入库中");
|
}
|
else
|
{
|
purchaseBSTOrderDetail.PurchaseBSTOrderDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
|
}
|
//获取采购主单
|
Dt_PurchaseBSTOrder purchaseBSTOrder = _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,
|
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,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
StockLength= purchaseBSTOrderDetail.ProcurementLength,
|
MaterielId= purchaseBSTOrderDetail.MaterialId
|
};
|
if (purchaseBSTOrderDetail.MaterialWide > 1200)
|
{
|
stockInfo.PalletType = 2;
|
}
|
_unitOfWorkManage.BeginTran();
|
//新增组盘信息
|
_stockRepository.StockInfoRepository.AddData(stockInfo);
|
if (purchaseBSTOrder.PurchaseOrderStatus==InOrderStatusEnum.未开始.ObjToInt())
|
{
|
purchaseBSTOrder.PurchaseOrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_purchaseBSTOrderRepository.UpdateData(purchaseBSTOrder);
|
}
|
_purchaseBSTOrderDetailRepository.UpdateData(purchaseBSTOrderDetail);
|
_unitOfWorkManage.CommitTran();
|
content.OK("请求成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
|
}
|
public string AssignYLRoadwayNo(string palletCode)
|
{
|
try
|
{
|
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 = "";
|
|
if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt())
|
{
|
//限制直径
|
if (stockInfo.MaterielThickness <= 1200)
|
{
|
//获取分配
|
List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YLDual")).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 == warehouse.WarehouseId
|
&& locationCounts.Select(j => j.RoadwayNo).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.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
|
}
|
}
|
else
|
{
|
//限制直径
|
if (stockInfo.MaterielThickness >= 800 && stockInfo.MaterielThickness <= 1500)
|
{
|
//获取分配
|
List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YL") && !x.RoadwayNo.Contains("YLDual")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
|
if (stockInfo.MaterielWide > 2200)
|
{
|
locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo == "SC02_YL").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 == warehouse.WarehouseId
|
&& locationCounts.Select(j => j.RoadwayNo).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.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>
|
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 = _agvStationInfoRepository.QueryFirst(x => x.AGVStationCode == task.SourceAddress && ( x.StationArea == AGVStationAreaEnum.AreaA.ObjToInt() || x.StationArea == AGVStationAreaEnum.AreaC.ObjToInt()));
|
if (agvstation != null)
|
{
|
agvstation.IsOccupied = WhetherEnum.False.ObjToInt();
|
}
|
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)
|
{
|
_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())
|
{
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
proStockInfo.proStockInfoDetails.ForEach(x =>
|
{
|
x.ProStockDetailStatus = StockStatusEmun.入库完成.ObjToInt();
|
});
|
_unitOfWorkManage.BeginTran();
|
if (agvstation != null)
|
{
|
_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.自动完成);
|
_unitOfWorkManage.CommitTran();
|
}
|
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)
|
{
|
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);
|
}
|
stockInfo.LocationCode = locationInfoEnd.LocationCode;
|
stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
|
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
|
_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.自动完成);
|
//上报老厂ERP
|
if (stockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt())
|
{
|
int Qty = Convert.ToInt32(stockInfo.MaterielWeight);
|
BSTPurchaseUpModel bSTPurchaseUpModel = new BSTPurchaseUpModel()
|
{
|
Barcode = stockInfo.PalletCode,
|
BarcodeQty = Qty,
|
Rfid = stockInfo.PalletCode,
|
RfidUpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
|
};
|
BSTResponse bSTResponse = _invokeERPService.BSTPurchaseUp(bSTPurchaseUpModel).DeserializeObject<BSTResponse>();
|
if (bSTResponse.Code == 500)
|
{
|
throw new Exception($"BST一期ERP同步入库信息失败,错误信息:{bSTResponse.Msg}");
|
}
|
}
|
_unitOfWorkManage.CommitTran();
|
}
|
return 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.OnlyIn.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).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.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_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, task.PalletType, task.WarehouseId);
|
if (locationInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
|
}
|
|
task.Roadway = roadwayNo;
|
task.TargetAddress = locationInfo.LocationCode;
|
if (task.Roadway.Contains("AGV"))
|
{
|
task.TaskStatus = TaskStatusEnum.AGV_Execute.ObjToInt();
|
}
|
else
|
{
|
task.TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt();
|
}
|
|
|
LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
|
//更新锁定货位
|
_unitOfWorkManage.BeginTran();
|
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, task.PalletType, LocationStatusEnum.Lock, task.WarehouseId);
|
BaseDal.UpdateData(task);
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK(data: locationInfo.LocationCode);
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="taskNum"></param>
|
/// <param name="roadwayNo"></param>
|
/// <param name="heightType"></param>
|
/// <returns></returns>
|
public WebResponseContent AssignInboundTaskLocationByHeight(int taskNum, string roadwayNo, int heightType)
|
{
|
try
|
{
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
|
if (task == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该入库任务");
|
}
|
|
if (_basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress) != null)
|
{
|
return WebResponseContent.Instance.OK(data: task.TargetAddress);
|
}
|
|
Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, task.PalletType, task.WarehouseId, heightType: heightType);
|
if (locationInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
|
}
|
|
task.Roadway = roadwayNo;
|
task.TargetAddress = locationInfo.LocationCode;
|
task.TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt();
|
|
LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
|
|
_unitOfWorkManage.BeginTran();
|
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, task.PalletType, LocationStatusEnum.Lock, task.WarehouseId);
|
BaseDal.UpdateData(task);
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK(data: locationInfo.LocationCode);
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 空框回库
|
/// </summary>
|
public WebResponseContent EmptyBackTask(string barCode, string startPoint)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//string palletCode = @"^C\d{5}$"; // 正则表达式
|
//bool isValid = Regex.IsMatch(barCode, palletCode);
|
//if (!isValid)
|
//{
|
// return content.Error($"框码格式错误{barCode}");
|
//}
|
Dt_AGVStationInfo agvstation = _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_ProStockInfo proStockInfo = new Dt_ProStockInfo()
|
{
|
PalletCode=barCode,
|
ProStockAttribute=ProStockAttributeEnum.空托.ObjToInt(),
|
PalletType=1,
|
LocationCode="",
|
WarehouseId= WarehouseEnum.LLDFL.ObjToInt(),
|
StockStatus=StockStatusEmun.MES空托退库.ObjToInt()
|
};
|
|
Dt_Task 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);
|
_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)
|
{
|
lock (_lockerFLorCP)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//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 = _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;
|
Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
|
{
|
ProductCode = materielInfo.MaterielCode,
|
ProductName= materielInfo.MaterielName,
|
ProductSpec=materielInfo.MaterielSpec,
|
ProductUnit=materielInfo.MaterielUnit,
|
StockQty = matCount,
|
ProStockDetailStatus = StockStatusEmun.手动组盘入库确认.ObjToInt()
|
};
|
Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
|
{
|
PalletCode = barCode,
|
ProStockAttribute = materielInfo.MaterielSourceType,
|
PalletType = 1,
|
LocationCode = "",
|
WarehouseId = warehouseEnum.ObjToInt(),
|
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 = 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>
|
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("未找到物料信息");
|
}
|
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 > 1200)
|
{
|
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 = 1,
|
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 > 1200)
|
{
|
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 = 1,
|
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;
|
}
|
}
|
}
|