You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

505 lines
22 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Application.Interface;
using Application.PdaDto;
using Jc.SnowId;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto.taskType;
using SlnMesnac.Model.dto.webapi;
using SlnMesnac.Serilog;
using SqlSugar;
using System.Collections.Generic;
using System.Net;
using System.Text.Json;
namespace Application
{
public class WcsTaskApplication : IWcsTaskApplication
{
private static readonly JcSnowId _snowId = new JcSnowId();
private readonly SerilogHelper _logger;
private ISqlSugarClient? sqlSugarClient;
public WcsTaskApplication(IServiceProvider serviceProvider, ISqlSugarClient _sqlSugarClient)
{
_logger = serviceProvider.GetRequiredService<SerilogHelper>();
sqlSugarClient = _sqlSugarClient;
// sqlSugarClient = serviceProvider.GetRequiredService<ISqlSugarClient>();
}
/// <summary>
/// 接收agv接收任务通知接口
//in : 小料箱到达起点接驳位里面agv通知wcs请求退出接驳位
//start 取完料开始前往终点
//wait: agv到达等待点通知wcs判断能否进接驳位
//out: 小料箱到达终点接驳位里面agv通知wcs请求退出接驳位
//end任务结束
/// </summary>
/// <param name="agvCallbackDto"></param>
/// <returns></returns>
public ReponseagvCallbackDto AgvCallback(agvCallbackDto agvCallbackDto)
{
ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto();
try
{
WcsTask? wcsTask = sqlSugarClient.Queryable<WcsTask>().First(t => t.TaskCode == agvCallbackDto.taskCode);
WcsTaskLog? wcsTaskLog = null;
if (wcsTask != null)
{
wcsTaskLog = sqlSugarClient.Queryable<WcsTaskLog>().First(t => t.Id == wcsTask.Id);
}
sqlSugarClient.AsTenant().BeginTran();
if (wcsTask != null)
{
//任务赋值执行agv字段
wcsTask.NextPointNo = agvCallbackDto.robotCode;
if (wcsTaskLog != null)
{
wcsTaskLog.NextPointNo = agvCallbackDto.robotCode;
}
//待取货
if (agvCallbackDto.method.ToLower() == "in")
{
if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask
|| wcsTask.TaskType == StaticTaskType.DeliverTonerTask)
{
wcsTask.TaskStatus = 2;
int successflag = 0;
while (successflag == 0)
{
successflag = sqlSugarClient.Updateable(wcsTask).ExecuteCommand();
}
if (wcsTaskLog != null)
{
wcsTaskLog.TaskStatus = wcsTask.TaskStatus;
sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand();
}
}
reponseagvCallbackDto.code = "0";
reponseagvCallbackDto.message = "成功";
}
//起点取完
if (agvCallbackDto.method.ToLower() == "start")
{
if (wcsTask.TaskType == StaticTaskType.SupplyEmptyPalletTask || wcsTask.TaskType == StaticTaskType.TransferMaterialBoxTask
|| wcsTask.TaskType == StaticTaskType.MoveLocationTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletFromTonerTask
|| wcsTask.TaskType == StaticTaskType.EmptyReturnFromTonerTask || wcsTask.TaskType == StaticTaskType.ExceptionTask)
{
wcsTask.TaskStatus = 2;
}
else if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask
|| wcsTask.TaskType == StaticTaskType.DeliverTonerTask)
{
wcsTask.TaskStatus = 4;
}
int successflag = 0;
while (successflag == 0)
{
successflag = sqlSugarClient.Updateable(wcsTask).ExecuteCommand();
}
if (wcsTaskLog != null)
{
wcsTaskLog.TaskStatus = wcsTask.TaskStatus;
sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand();
}
reponseagvCallbackDto.code = "0";
reponseagvCallbackDto.message = "成功";
}
if (agvCallbackDto.method.ToLower() == "wait")
{
if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask)
{
wcsTask.TaskStatus = 6;
}
else if (wcsTask.TaskType == StaticTaskType.SupplySmallPalletFromTonerTask || wcsTask.TaskType == StaticTaskType.EmptyReturnFromTonerTask)
{
wcsTask.TaskStatus = 4;
}
int successflag = 0;
while(successflag == 0)
{
successflag = sqlSugarClient.Updateable(wcsTask).ExecuteCommand();
}
if (wcsTaskLog != null)
{
wcsTaskLog.TaskStatus = wcsTask.TaskStatus;
sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand();
}
reponseagvCallbackDto.code = "0";
reponseagvCallbackDto.message = "成功";
}
if (agvCallbackDto.method.ToLower() == "out")
{
if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask)
{
wcsTask.TaskStatus = 8;
}
else if (wcsTask.TaskType == StaticTaskType.SupplySmallPalletFromTonerTask || wcsTask.TaskType == StaticTaskType.EmptyReturnFromTonerTask)
{
wcsTask.TaskStatus = 6;
}
int successflag = 0;
while (successflag == 0)
{
successflag = sqlSugarClient.Updateable(wcsTask).ExecuteCommand();
}
if (wcsTaskLog != null)
{
wcsTaskLog.TaskStatus = wcsTask.TaskStatus;
sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand();
}
reponseagvCallbackDto.code = "0";
reponseagvCallbackDto.message = "成功";
}
//放货完成
if (agvCallbackDto.method.ToLower() == "end")
{
if (wcsTask.TaskType == StaticTaskType.SupplyEmptyPalletTask || wcsTask.TaskType == StaticTaskType.TransferMaterialBoxTask
|| wcsTask.TaskType == StaticTaskType.MoveLocationTask || wcsTask.TaskType == StaticTaskType.ExceptionTask)
{
wcsTask.TaskStatus = 4;
}
else if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask)
{
wcsTask.TaskStatus = 10;
}
else if (wcsTask.TaskType == StaticTaskType.SupplySmallPalletFromTonerTask || wcsTask.TaskType == StaticTaskType.EmptyReturnFromTonerTask)
{
wcsTask.TaskStatus = 8;
}
else if (wcsTask.TaskType == StaticTaskType.DeliverTonerTask)
{
wcsTask.TaskStatus = 6;
}
int successflag = 0;
while (successflag == 0)
{
successflag = sqlSugarClient.Updateable(wcsTask).ExecuteCommand();
}
if (wcsTaskLog != null)
{
wcsTaskLog.TaskStatus = wcsTask.TaskStatus;
sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand();
}
reponseagvCallbackDto.code = "0";
reponseagvCallbackDto.message = "成功";
}
}
else
{
reponseagvCallbackDto.code = "1";
reponseagvCallbackDto.message = "未找到当前任务";
}
}
catch (Exception ex)
{
sqlSugarClient!.AsTenant().CommitTran();
_logger.Error(ex.Message);
reponseagvCallbackDto.code = "1";
reponseagvCallbackDto.message = ex.Message;
}
sqlSugarClient!.AsTenant().CommitTran();
//返回请求
reponseagvCallbackDto.reqCode = reponseagvCallbackDto.reqCode;
return reponseagvCallbackDto;
}
/// <summary>
/// MES核减条码数量通知
/// </summary>
/// <param name="mesRequest"></param>
/// <returns></returns>
//public ReponseagvCallbackDto MesReduction(MesRequest mesRequest)
//{
// ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto();
// try
// {
// WmsPalletInfo? palletInfo = sqlSugarClient.Queryable<WmsPalletInfo>().First(t => t.Barcode == mesRequest.barcode);
// if (palletInfo != null)
// {
// sqlSugarClient.Deleteable(palletInfo).ExecuteCommand();
// reponseagvCallbackDto.code = "200";
// reponseagvCallbackDto.message = "核减成功";
// }
// else
// {
// reponseagvCallbackDto.code = "301";
// reponseagvCallbackDto.message = "核减失败:未找到条码库存";
// }
// }
// catch (Exception ex)
// {
// //sqlSugarClient!.AsTenant().CommitTran();
// _logger.Error(ex.Message);
// reponseagvCallbackDto.code = "301";
// reponseagvCallbackDto.message = "核减失败:" + ex.Message;
// }
// reponseagvCallbackDto.reqCode = mesRequest.reqCode;
// return reponseagvCallbackDto;
//}
/// <summary>
/// 根据库位编号获取托盘编号及库存信息
/// </summary>
public PadResponse GetLocationInfo(List<string> locationCodes)
{
PadResponse padResponse = new PadResponse();
try
{
List<WmsBaseLocation> wmsBaseLocations = sqlSugarClient.Queryable<WmsBaseLocation>().Where(t => locationCodes.Contains(t.LocationCode)).ToList();
List<LocationInfo> locationInfos = new List<LocationInfo>();
foreach (string locationCode in locationCodes)
{
WmsBaseLocation? location = wmsBaseLocations.FirstOrDefault(x => x.LocationCode == locationCode);
if (location != null && !string.IsNullOrEmpty(location.ContainerCode))
{
WmsPalletInfo wmsPalletInfo = sqlSugarClient.Queryable<WmsPalletInfo>().Where(t => t.PalletInfoCode == location.ContainerCode).First();
LocationInfo locationInfo = new LocationInfo();
locationInfo.LocationCode = locationCode;
locationInfo.PalletInfoCode = wmsPalletInfo.PalletInfoCode;
locationInfo.Amount = wmsPalletInfo.Amount;
locationInfos.Add(locationInfo);
}
else
{
LocationInfo locationInfo = new LocationInfo();
locationInfo.LocationCode = locationCode;
locationInfo.PalletInfoCode = "";
locationInfo.Amount = 0;
locationInfos.Add(locationInfo);
}
}
padResponse.code = "200";
padResponse.message = "成功";
padResponse.data = locationInfos;
}
catch (Exception ex)
{
_logger.Error(ex.Message);
padResponse.code = "301";
padResponse.message = "获取信息失败:" + ex.Message;
}
return padResponse;
}
/// <summary>
///根据托盘号托盘解绑
/// </summary>
/// <returns></returns>
public PadResponse UnBindPalletInfo(string palletInfoCode)
{
PadResponse padResponse = new PadResponse();
try
{
WmsPalletInfo? wmsPalletInfo = sqlSugarClient.Queryable<WmsPalletInfo>().Where(t => t.PalletInfoCode == palletInfoCode).First();
if (wmsPalletInfo != null)
{
wmsPalletInfo.Amount = 0;
wmsPalletInfo.TonerFlag = 0;
int result = sqlSugarClient.Updateable(wmsPalletInfo).ExecuteCommand();
if (result > 0)
{
padResponse.code = "200";
padResponse.message = "成功";
}
else
{
padResponse.code = "301";
padResponse.message = "失败";
}
}
else
{
padResponse.code = "301";
padResponse.message = "未查询到该托盘信息";
}
}
catch (Exception ex)
{
_logger.Error(ex.Message);
padResponse.code = "301";
padResponse.message = "失败:" + ex.Message;
}
return padResponse;
}
/// <summary>
///pad获取指定机台的RFID设备状态
/// </summary>
/// <returns></returns>
public PadResponse GetRfidInfo(string machineCode)
{
PadResponse padResponse = new PadResponse();
try
{
List<BaseRfidInfo> list = sqlSugarClient.Queryable<BaseRfidInfo>().Where(t => t.MachineCode == machineCode).ToList();
if (list != null && list.Count > 0)
{
padResponse.code = "200";
padResponse.message = "成功";
padResponse.data = list;
}
else
{
padResponse.code = "301";
padResponse.message = "未查询到该机台的RFID设备信息";
}
}
catch (Exception ex)
{
_logger.Error(ex.Message);
padResponse.code = "301";
padResponse.message = "失败:" + ex.Message;
}
return padResponse;
}
/// <summary>
///pad获取所有机台库存列表信息
/// </summary>
/// <returns></returns>
public PadResponse GetAllMachineInfos()
{
PadResponse padResponse = new PadResponse();
try
{
List<WmsBaseLocationVo> Locationlist = sqlSugarClient.SqlQueryable<WmsBaseLocationVo>
("SELECT location_code as agv_position_code,location_status,ifnull(amount,0) as amount FROM wms_base_location wbl LEFT JOIN wms_pallet_info wpi ON wbl.container_code=wpi.pallet_info_code")
.ToList();
//List<WmsBaseLocation> Locationlist = sqlSugarClient.Queryable<WmsBaseLocation>().LeftJoin<WmsPalletInfo>((wbi, wpi) => wbi.ContainerCode == wpi.PalletInfoCode).ToList();
//List <AllLocationInfo> locationInfos = new List<AllLocationInfo>();
//foreach (var location in Locationlist)
//{
// if (location != null)
// {
// AllLocationInfo locationInfo = new AllLocationInfo();
// if (location.ContainerCode != "")
// {
// WmsPalletInfo wmsPalletInfo = sqlSugarClient.Queryable<WmsPalletInfo>().Where(t => t.PalletInfoCode == location.ContainerCode).First();
// locationInfo.Amount = wmsPalletInfo.Amount;
// }
// else {
// locationInfo.Amount = 0;
// }
// locationInfo.LocationCode = location.AgvPositionCode;
// locationInfo.LocationStatus = location.LocationStatus;
// locationInfos.Add(locationInfo);
// }
// else
// {
// AllLocationInfo locationInfo = new AllLocationInfo();
// locationInfo.LocationCode = "";
// locationInfo.Amount = 0;
// locationInfo.LocationStatus = 0;
// locationInfos.Add(locationInfo);
// }
//}
padResponse.code = "200";
padResponse.message = "成功";
padResponse.data = Locationlist;
}
catch (Exception ex)
{
_logger.Error(ex.Message);
padResponse.code = "301";
padResponse.message = "失败:" + ex.Message;
}
return padResponse;
}
/// <summary>
///指定机台优先级接口:加急/不加急
///priority:0-不加急 1-加急
/// </summary>
/// <returns></returns>
//public PadResponse SetPriorityByMachineCode(string machineCode, int priority)
//{
// PadResponse response = new PadResponse();
// try
// {
// WmsMachineInfo? machineInfo = sqlSugarClient.Queryable<WmsMachineInfo>().First(t => t.MachineCode == machineCode);
// if (priority != 0 && priority != 1)
// {
// response.code = "301";
// response.message = "优先级设置失败:优先级必须为0或1";
// }
// else if (machineInfo != null)
// {
// machineInfo.Priority = priority;
// int rowsAffected = sqlSugarClient.Updateable(machineInfo).UpdateColumns(it => new { it.Priority }).ExecuteCommand();
// if (rowsAffected > 0)
// {
// response.code = "200";
// response.message = "优先级设置成功";
// }
// else
// {
// response.code = "301";
// response.message = "优先级设置失败:更新数据库异常";
// }
// }
// else
// {
// response.code = "301";
// response.message = "优先级设置失败:未找到机台信息";
// }
// }
// catch (Exception ex)
// {
// //sqlSugarClient!.AsTenant().CommitTran();
// _logger.Error(ex.Message);
// response.code = "301";
// response.message = "优先级设置失败:" + ex.Message;
// }
// return response;
//}
/// <summary>
/// 4楼到5楼原材料入口继续
/// </summary>
/// <param name="taskContinue"></param>
/// <returns></returns>
//public AgvCompeletedResponse TaskContinue(TaskContinue taskContinue)
//{
// AgvCompeletedResponse compeletedResponse = new AgvCompeletedResponse();
// try
// {
// _dbContext.ChangeTracker.Clear();
// var wcsTask = _dbContext.WcsTask
// .Where(t => t.taskType == 47)
// .Where(t => t.containerNo == taskContinue.palletInfoCode)
// .FirstOrDefault();
// if (wcsTask != null)
// {
// wcsTask.useFlag = 1;
// _dbContext.Update(wcsTask);
// _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(a => new WcsTaskLog { useFlag = 1 });
// _dbContext.SaveChanges();
// compeletedResponse.code = "0";
// compeletedResponse.message = "成功";
// }
// else
// {
// compeletedResponse.code = "1";
// compeletedResponse.message = "未找到当前任务";
// }
// }
// catch (Exception ex)
// {
// LogManager.Error(ex);
// compeletedResponse.code = "1";
// compeletedResponse.message = ex.Message;
// }
// return compeletedResponse;
// return null;
//}
}
}