using AGV.Common.Base;
using AGV.Common.Diagnostics;
using AGV.Common.Enums;
using AGV.Common.Service;
using AGV.DTO;
using AGV.Entity;
using AGV.Global;
using AGV.Interface;
using AGV.Service;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace AGV.Service
{
/// <summary>
/// 抓取mes端数据 Bill
/// </summary>
public class MESService : ServiceBase, IMESService
{
private IAgvTaskService _agvTaskService;
private IAppCallCarService _appCallCarService;
public ProductLineInfoDTO GetProductLineByName(string name)
{
if (!string.IsNullOrEmpty(name))
{
List<ProductLineInfoDTO> list = Db.From<Product_Line_Info>()
.Where(Product_Line_Info._.Name.ToUpper() == name.ToUpper()
&& Product_Line_Info._.Valid == "Y")
.Select(Product_Line_Info._.All)
.ToList<ProductLineInfoDTO>();
if (list != null && list.Count > 0)
{
return list.FirstOrDefault();
}
}
return null;
}
public IAgvTaskService AgvTaskService
{
get { return _agvTaskService; }
set { _agvTaskService = value; }
}
public IAppCallCarService AppCallCarService
{
get { return _appCallCarService; }
set { _appCallCarService = value; }
}
AgvTaskDTO task = new AgvTaskDTO();
//组织代码--
private const string ORG_CODE = "C100";
private DateTime beginRecord = DateTime.Now;
private TimeSpan ts;
private double minutes;
private string beginTime;
TrafficCenter trafficCenter = TrafficCenter.Instance;
MesWebService.MesWebServiceSoapClient mesService = new MesWebService.MesWebServiceSoapClient();
List<AgvTaskDTO> tasks = new List<AgvTaskDTO>();
// _agvTaskService=new AgvTaskService();
/// <summary>
/// 每隔 多少秒 抓取一下MES端提供的任务数据
/// </summary>
/// <param name="secondsInterval">多少秒</param>
public bool FetchProductLinesTask(int secondsInterval)
{
/* 15-17 minute check the tasks that 30 minutes earlier than now
* */
ts = DateTime.Now- beginRecord;
if (15<ts.TotalMinutes) // 这样应该减少了查数据库的次数
{
tasks = trafficCenter.AgvTaskService.GetAgvTaskListByMES();
beginTime = DateTime.Now.AddMinutes(-50).ToString();
beginRecord = DateTime.Now;
}
else
{
beginTime = DateTime.Now.ToString();
}
// string beginTime = "2018/8/14 16:40:11";
string nextTime = DateTime.Now.AddSeconds(secondsInterval).ToString();
return true;
// MesWebService.INF_AGV_GET_PALLETRequestBody body = new MesWebService.INF_AGV_GET_PALLETRequestBody(beginTime, nextTime, ORG_CODE);
// MesWebService.INF_AGV_GET_PALLETRequest request = new MesWebService.INF_AGV_GET_PALLETRequest(body);
string obj = mesService.INF_AGV_GET_PALLET(beginTime, nextTime, ORG_CODE);
JObject jobj = (JObject)JsonConvert.DeserializeObject(obj);
int taskNum = jobj["data"].Count();
int successNum = 0;
#region
// JArray j = JArray.Parse(obj);
//foreach(JObject obj in j)
// {
// Console.WriteLine(obj["id"]);
// object t=jobj[]
#endregion
for (int i = 0; i < taskNum; i++)
{
string palletBarCode = (string)jobj["data"][i]["PALLET_BARCODE"]; //栈板号
string productLineName = (string)jobj["data"][i]["WORKCENTER_CODE"];
if(tasks.Any(item=>item.Pallet_Barcode== palletBarCode))
{
successNum++;
continue;
}
string toStation = (string)jobj["data"][i]["AGV_TARGET_PLACE_CODE"];
string moCode = (string)jobj["data"][i]["MO_CODE"]; //工单
task.Receive_Date = Convert.ToDateTime(jobj["data"][i]["DATETIME_CREATED"]); //接收时间
task.From_Station = GetProductLineByName(productLineName)?.Station_RFID;
// task.From_Station = ServiceHelper.CallService<IAppCallCarService,ProductLineInfoDTO>(item=>item.GetProductLineByName(productLineName)).Station_RFID;
task.Call_From = CallCarRequestFromEnum.MES;
task.Valid = "Y";
task.Status = TaskStatusEnum.NewTask;
task.Task_Type = TaskTypeEnum.Warehousing;
task.Car_Type = CarTypeEnum.Hybrid.ToString();
task.To_Station = toStation;
task.Pallet_Barcode = palletBarCode;
task.Mo_Code = moCode;
task.WorkCenter_Code = productLineName;
Thread.Sleep(500);
if (trafficCenter.AgvTaskService.AddAgvTask(task))
{
successNum++;
}
else
{
Logger.Log.Error(string.Format("从MES提取任务更新到数据库失败,时间={0}", DateTime.Now));
}
}
if (successNum == taskNum)
{
return true;
}
return false;
}
}
}