using MailKit.Search;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection.Metadata;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common;
|
using WIDESEA_Core;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO.WCSInfo;
|
using WIDESEA_Model.Models;
|
using WIDESEAWCS_DTO.WCSInfo;
|
|
namespace WIDESEA_TaskInfoService
|
{
|
public partial class TaskService
|
{
|
/// <summary>
|
/// 立库出库AGV搬运
|
/// </summary>
|
/// <param name="outTask"></param>
|
/// <returns></returns>
|
public WebResponseContent ShelfOutboundCarry(Dt_Task outTask)
|
{
|
Dt_CachePoint cachePoint = GetCachePointByStartPoint(outTask.TargetAddress);
|
|
Dt_Task task = new()
|
{
|
CurrentAddress = outTask.TargetAddress,
|
Grade = 0,
|
NextAddress = cachePoint.PointCode,
|
OrderNo = outTask.OrderNo,
|
PalletCode = outTask.PalletCode + "-AGV",
|
Roadway = "",
|
SourceAddress = outTask.TargetAddress,
|
TargetAddress = cachePoint.PointCode,
|
//SourceKey = outTask.TaskId,
|
TaskNum = outTask.TaskNum,
|
TaskState = AGVTaskStatusEnum.AGV_New.ObjToInt(),
|
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
|
};
|
cachePoint.PointStatus = LocationStatusEnum.OutLock.ObjToInt();
|
|
_basicService.CachePointService.Repository.UpdateData(cachePoint);
|
Repository.AddData(task);
|
return WebResponseContent.Instance.OK();
|
}
|
|
/// <summary>
|
/// 叫料
|
/// </summary>
|
/// <param name="endPoint"></param>
|
/// <returns></returns>
|
public WebResponseContent CallMateriel(string endPoint)
|
{
|
Dt_CachePoint cachePoint = GetCachePointByEndPoint(endPoint);
|
|
Dt_Task task = new Dt_Task()
|
{
|
CurrentAddress = cachePoint.PointCode,
|
Grade = 0,
|
NextAddress = endPoint,
|
OrderNo = "",
|
PalletCode = cachePoint.Remark,
|
Roadway = "",
|
SourceAddress = cachePoint.PointCode,
|
TargetAddress = endPoint,
|
//SourceKey = 0,
|
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
TaskState = AGVTaskStatusEnum.AGV_New.ObjToInt(),
|
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
|
};
|
cachePoint.PointStatus = LocationStatusEnum.OutLock.ObjToInt();
|
|
_basicService.CachePointService.Repository.UpdateData(cachePoint);
|
Repository.AddData(task);
|
return WebResponseContent.Instance.OK();
|
}
|
|
/// <summary>
|
/// 物料搬运
|
/// </summary>
|
/// <param name="startPoint"></param>
|
/// <returns></returns>
|
public WebResponseContent MaterielCarry(string startPoint)
|
{
|
Dt_CachePoint cachePoint = GetCachePointByStartPoint(startPoint);
|
|
Dt_Task task = new()
|
{
|
CurrentAddress = startPoint,
|
Grade = 0,
|
NextAddress = cachePoint.PointCode,
|
OrderNo = "",
|
PalletCode = startPoint + "-AGV",
|
Roadway = "",
|
SourceAddress = startPoint,
|
TargetAddress = cachePoint.PointCode,
|
//SourceKey = 0,
|
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
TaskState = AGVTaskStatusEnum.AGV_New.ObjToInt(),
|
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
|
};
|
cachePoint.PointStatus = LocationStatusEnum.OutLock.ObjToInt();
|
|
_basicService.CachePointService.Repository.UpdateData(cachePoint);
|
Repository.AddData(task);
|
return WebResponseContent.Instance.OK();
|
}
|
/// <summary>
|
/// 人工组盘入库
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent InMateriel(SaveModel saveModel)
|
{
|
WebResponseContent responseContent = new WebResponseContent();
|
try
|
{
|
var palletCode = saveModel.MainData["palletCode"].ToString();
|
if (string.IsNullOrEmpty(palletCode)) throw new Exception("托盘号不可为空");
|
//var orderNo = saveModel.MainData["orderNo"].ToString();
|
//if (string.IsNullOrEmpty(orderNo)) throw new Exception("批号不可为空");
|
var qty = saveModel.MainData["qty"].ToString();
|
if (string.IsNullOrEmpty(qty)) throw new Exception("袋数不可为空");
|
var batchNo = saveModel.MainData["batchNo"].ToString();
|
if (string.IsNullOrEmpty(batchNo)) throw new Exception("柜号不可为空");
|
|
#region 查询库存、入库单
|
Dt_InventoryInfo inventoryInfo = _inventoryInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
|
if (inventoryInfo != null) throw new Exception($"托盘【{palletCode}】已存在库存信息");
|
Dt_InboundOrderDetail? inboundOrderDetail = _inboundService.InboundOrderDetailService.Repository.QueryFirst(x => x.BatchNo == batchNo);
|
if (inboundOrderDetail == null) throw new Exception($"未找到批号【{batchNo}】的入库单");
|
if (inboundOrderDetail.OrderQuantity - inboundOrderDetail.ReceiptQuantity < qty.ObjToInt()) throw new Exception($"批号【{batchNo}】可组盘数量不足");
|
Dt_InboundOrder? inboundOrder = _inboundService.InbounOrderService.Repository.QueryFirst(x => x.Id == inboundOrderDetail.OrderId);
|
if (inboundOrder == null) throw new Exception($"未找到批号为【{batchNo}】的入库单");
|
Dt_Inventory_Batch inventory_Batch = _inventoryBatchRepository.QueryFirst(x => x.BatchNo == batchNo);
|
if (inventory_Batch == null) throw new Exception($"未找到批号为【{batchNo}】的批次信息");
|
#endregion
|
|
#region 创建任务
|
Dt_Task dt_Task = new Dt_Task()
|
{
|
CurrentAddress = "1001",
|
NextAddress = "1002",
|
SourceAddress = "RGRK",
|
TargetAddress = "SC01",
|
Creater = "System",
|
PalletCode = palletCode,
|
Roadway = "SC01",
|
OrderNo = batchNo,
|
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
TaskState = InTaskStatusEnum.AGV_InFinish.ObjToInt(),
|
TaskType = inboundOrder.OrderType == InOrderTypeEnum.Quality.ObjToInt() ? TaskTypeEnum.InQuality.ObjToInt() : TaskTypeEnum.Inbound.ObjToInt(),
|
CreateDate = DateTime.Now,
|
Dispatchertime = DateTime.Now,
|
};
|
#endregion
|
|
#region 添加库存信息、处理入库单
|
inventoryInfo = new Dt_InventoryInfo()
|
{
|
BatchNo = inventory_Batch.BatchNo,
|
MaterielCode = inventory_Batch.MaterielCode,
|
MaterielName = inventory_Batch.MaterielName,
|
PalletCode = palletCode,
|
ProductionDate = inventory_Batch.ProductionDate,
|
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
|
ProductStatus = dt_Task.TaskType == TaskTypeEnum.InQuality.ObjToInt() ? ProductStatusEmun.待检2.ObjToInt() : ProductStatusEmun.待检1.ObjToInt(),
|
ShelfLife = inventory_Batch.ShelfLife,
|
ValidityPeriod = inventory_Batch.ValidityPeriod,
|
StockQuantity = qty.ObjToInt(),
|
BoxQuantity = (qty.ObjToInt() % 8 > 0) ? (qty.ObjToInt() / 8) + 1 : qty.ObjToInt() / 8,
|
Creater = "System"
|
};
|
inboundOrder.OrderStatus = InboundStatusEnum.入库中.ObjToInt();
|
inboundOrderDetail.ReceiptQuantity += inventoryInfo.StockQuantity;
|
inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
|
inventory_Batch.ProductStatus = inventoryInfo.ProductStatus;
|
#endregion
|
|
Db.Ado.BeginTran();
|
_inboundService.InbounOrderService.UpdateData(inboundOrder);
|
_inboundService.InboundOrderDetailService.UpdateData(inboundOrderDetail);
|
_inventoryInfoRepository.AddData(inventoryInfo);
|
_inventoryBatchRepository.UpdateData(inventory_Batch);
|
AddData(dt_Task);
|
List<WMSTaskDTO> wMSTaskDTOs = _mapper.Map<List<WMSTaskDTO>>(new List<Dt_Task> { dt_Task });
|
var ResultData = HttpHelper.PostAsync(WCSInterfaceAddress.ReceiveTask, wMSTaskDTOs.ToJson(), headers: new Dictionary<string, string>());
|
if (ResultData.Result == null) throw new Exception($"向WCS下发入库任务超时");
|
responseContent = JsonConvert.DeserializeObject<WebResponseContent>(ResultData.Result);
|
if (responseContent == null) throw new Exception($"下发入库任务WCS无响应");
|
if (!responseContent.Status) throw new Exception(responseContent.Message);
|
Db.Ado.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
Db.Ado.RollbackTran();
|
responseContent.Error(ex.Message);
|
}
|
return responseContent;
|
}
|
|
private Dt_CachePoint GetCachePointByStartPoint(string startPoint)
|
{
|
Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.StartArea == startPoint);
|
if (areaRouter == null)
|
{
|
throw new Exception("未找到路由信息");
|
}
|
Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.NextArea);
|
if (areaInfo == null)
|
{
|
throw new Exception("未找到下一区域信息");
|
}
|
|
Dt_CachePoint? cachePoint = _basicService.CachePointService.AssignCachePoint(areaInfo.Id);
|
if (cachePoint == null)
|
{
|
throw new Exception("未找到空闲缓存点");
|
}
|
|
return cachePoint;
|
}
|
|
private Dt_CachePoint GetCachePointByEndPoint(string endPoint)
|
{
|
Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.NextArea == endPoint);
|
if (areaRouter == null)
|
{
|
throw new Exception("未找到路由信息");
|
}
|
Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.StartArea);
|
if (areaInfo == null)
|
{
|
throw new Exception("未找到起点缓存区域信息");
|
}
|
|
Dt_CachePoint? cachePoint = _basicService.CachePointService.GetIbStockCachePoint(areaInfo.Id);
|
if (cachePoint == null)
|
{
|
throw new Exception("未找到有货缓存点");
|
}
|
return cachePoint;
|
}
|
|
public object AGVTaskFeedBack(AGVTaskFeedBackModel model)
|
{
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(model.Task_id));
|
if (task == null)
|
{
|
return new { code = 404, message = "未找到该任务" };
|
}
|
|
Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress);
|
if (startCachePoint != null)
|
{
|
startCachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt();
|
_basicService.CachePointService.Repository.UpdateData(startCachePoint);
|
}
|
|
Dt_CachePoint endCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.TargetAddress);
|
if (endCachePoint != null)
|
{
|
endCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
|
_basicService.CachePointService.Repository.UpdateData(endCachePoint);
|
}
|
|
BaseDal.DeleteData(task);
|
|
return new { code = 200, message = "成功" };
|
}
|
}
|
}
|