using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.APIEnum;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OtherEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.ERP;
using WIDESEA_ITaskInfoRepository;
using WIDESEA_ITaskInfoService;
using WIDESEA_Model.Models;
using WIDESEA_Common.OrderEnum;
using System.Diagnostics.Metrics;
using System.Reflection.Metadata;
using WIDESEA_DTO.Task;
using WIDESEA_DTO.Stock;
using SqlSugar;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using WIDESEA_DTO.MES;
using WIDESEA_External.Model;
using System.Text.Json;
using System.Text.RegularExpressions;
namespace WIDESEA_TaskInfoService
{
public partial class TaskService
{
static object lock_autoIssue = new object();
static object lock_manualIssue = new object();
static object lock_returnIssue = new object();
///
/// MES自动叫料接口
///
///
public WebResponseContent ReceiveAutoIssue(MESAutoIssueDTO autoIssueDTO)
{
WebResponseContent content = new WebResponseContent();
try
{
lock (lock_autoIssue)
{
if (autoIssueDTO == null)
{
return content.Error("传入信息不能为空");
}
//获取对应单据
Dt_OutMESOrder? outMESOrder = _outboundRepository.OutMESOrderRepository.QueryFirst(x => x.OutDetailId == autoIssueDTO.OutDetailId);
if (outMESOrder == null)
{
return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{autoIssueDTO.OutDetailId}不存在");
}
if (outMESOrder.OutMESOrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
{
return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{outMESOrder.ProductOrderNo}工单已出库完成");
}
//获取周转位置编号
Dt_AGVStationInfo? stationInfo = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.MESPointCode == autoIssueDTO.PointCode);
if (stationInfo == null)
{
return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{autoIssueDTO.PointCode}不存在");
}
if (autoIssueDTO.IsEmptyPallet > 0)
{
return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{autoIssueDTO.PointCode}存在空托");
}
Dt_Task? task = BaseDal.QueryData(x => x.OrderNo == outMESOrder.OutMESOrderNo && x.TaskStatus == TaskStatusEnum.CallPending.ObjToInt()).OrderByDescending(x => x.Grade).ThenBy(x => x.TaskNum).FirstOrDefault();
//获取任务
if (task == null)
{
return content.Error($"未找到领料计划编号{outMESOrder.ProductOrderNo}可配送任务");
}
//获取任务出库详情
Dt_OutStockLockInfo outStockLockInfo = _outboundRepository.OutStockLockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
//调用MES配送出发指令
PlanDistributionInfo planDistribution = new PlanDistributionInfo()
{
DispatchPlanMaterialId = autoIssueDTO.OutDetailId,
InvItemCode = task.MaterielCode,
Quantity = outStockLockInfo.AssignQuantity,
SendOutTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
ArrivalTime = DateTime.Now.AddMinutes(15).ToString("yyyy-MM-dd hh:mm:ss")
};
MESDispatchModel dispatchModel = new MESDispatchModel()
{
PRO_DispachPlanDistributionInfos = new List() { planDistribution }
};
_unitOfWorkManage.BeginTran();
task.TaskStatus = TaskStatusEnum.New.ObjToInt();
task.TargetAddress = stationInfo.AGVStationCode;
BaseDal.UpdateData(task);
MESResponse mESResponse = _invokeMESService.MESDispatchUp(dispatchModel).DeserializeObject() ?? throw new Exception("未获取到返回信息");
if (!mESResponse.Result)
{
throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(mESResponse.Msg)}");
}
PushTasksToWCS(new List { task });
_unitOfWorkManage.CommitTran();
return content.OK("叫料成功");
}
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
content.Error(ex.Message);
}
return content;
}
//将Unicode解析成中文
public static string DecodeUnicode(string input)
{
return Regex.Replace(input, @"\\u([0-9a-fA-F]{4})", match => {
return ((char)Convert.ToInt32(match.Groups[1].Value, 16)).ToString();
});
}
public WebResponseContent ReceiveManualIssue(MESManualIssueDTO manualIssueDTO)
{
WebResponseContent content = new WebResponseContent();
try
{
lock (lock_manualIssue)
{
if (manualIssueDTO == null)
{
return content.Error("传入信息不能为空");
}
//获取对应单据
Dt_OutMESOrder? outMESOrder = _outboundRepository.OutMESOrderRepository.QueryFirst(x => x.OutDetailId == manualIssueDTO.OutDetailId);
if (outMESOrder == null)
{
return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{manualIssueDTO.OutDetailId}不存在");
}
if (outMESOrder.OutMESOrderStatus == OutOrderStatusEnum.关闭.ObjToInt())
{
return content.Error($"领料计划{nameof(MESAutoIssueDTO.OutDetailId)}{outMESOrder.ProductOrderNo}工单已关闭");
}
//获取周转位置编号
Dt_AGVStationInfo? stationInfo = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.MESPointCode == manualIssueDTO.PointCode);
if (stationInfo == null)
{
return content.Error($"领料计划周转位{nameof(MESAutoIssueDTO.PointCode)}{manualIssueDTO.PointCode}不存在");
}
Dt_Task? task = BaseDal.QueryData(x => x.OrderNo == outMESOrder.OutMESOrderNo && x.TaskStatus == TaskStatusEnum.CallPending.ObjToInt()).OrderByDescending(x => x.Grade).ThenBy(x => x.TaskNum).FirstOrDefault();
//获取任务
if (task == null)
{
return content.Error($"未找到领料计划编号{outMESOrder.ProductOrderNo}可配送任务");
}
//获取任务出库详情
Dt_OutStockLockInfo outStockLockInfo = _outboundRepository.OutStockLockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
//调用MES配送出发指令
PlanDistributionInfo planDistribution = new PlanDistributionInfo()
{
DispatchPlanMaterialId = manualIssueDTO.OutDetailId,
InvItemCode = task.MaterielCode,
Quantity = outStockLockInfo.AssignQuantity,
SendOutTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
ArrivalTime = DateTime.Now.AddMinutes(15).ToString("yyyy-MM-dd hh:mm:ss")
};
MESDispatchModel dispatchModel = new MESDispatchModel()
{
PRO_DispachPlanDistributionInfos = new List() { planDistribution }
};
_unitOfWorkManage.BeginTran();
task.TaskStatus = TaskStatusEnum.New.ObjToInt();
task.TargetAddress = stationInfo.AGVStationCode;
BaseDal.UpdateData(task);
MESResponse mESResponse = _invokeMESService.MESDispatchUp(dispatchModel).DeserializeObject() ?? throw new Exception("未获取到返回信息");
if (!mESResponse.Result)
{
throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(mESResponse.Msg)}");
}
PushTasksToWCS(new List { task });
_unitOfWorkManage.CommitTran();
return content.OK("叫料成功");
}
}
catch (Exception ex)
{
content.Error(ex.Message);
}
return content;
}
///
/// MES空托/余料呼叫接口
///
///
public WebResponseContent ReceiveReturnIssue(List returnIssueDTOs)
{
WebResponseContent content = new WebResponseContent();
try
{
lock (lock_returnIssue)
{
if (returnIssueDTOs == null || returnIssueDTOs.Count <= 0)
{
return content.Error("传入信息不能为空");
}
//获取所有AGV点位
List aGVStationInfos = _basicRepository.AGVStationInfoRepository.QueryData(x => !string.IsNullOrEmpty(x.MESPointCode));
MESReturnIssueDTO? returnIssueDTO = returnIssueDTOs.FirstOrDefault(x => !aGVStationInfos.Select(x => x.MESPointCode).Contains(x.PointCode));
if (returnIssueDTO != null)
{
return content.Error($"周转位{nameof(MESReturnIssueDTO.PointCode)}{returnIssueDTO.PointCode}不存在");
}
content.OK("呼叫成功");
}
}
catch (Exception ex)
{
content.Error(ex.Message);
}
return content;
}
}
}