using HH.WCS.JingyuNongfu.device;
using HH.WCS.JingyuNongfu.wms;
using HH.WCS.JingyuNongfu.process;
using HH.WCS.JingyuNongfu.util;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using static HH.WCS.JingyuNongfu.api.ApiModel;
using static HH.WCS.JingyuNongfu.util.Settings;
using System;
namespace HH.WCS.JingyuNongfu.api
{
///
/// api接口辅助类
///
public class ApiHelper
{
static ApiHelper()
{
}
///
/// 绑定托盘物料
///
///
///
internal static ReturnResult BindArea(BindArea model)
{
ReturnResult result = new ReturnResult { ResultCode = 0, ResultMsg = "绑定成功" };
var db = new SqlHelper().GetInstance();
try
{
var locList = db.Queryable().Where(a => a.S_AREA_CODE == model.AreaCode).ToList();
if (locList.Count > 0)
{
var IsLoct = locList.Find(a => a.S_LOCK_STATE.Trim() != "无");
if (IsLoct != null)
{
result.ResultCode = -1;
result.ResultMsg = "库区存在货位有锁,不允许绑定托盘物料";
return result;
}
locList.ForEach(a =>
{
if (a.N_CURRENT_NUM == 0)
{
LogHelper.Info($"货位{a.S_LOC_CODE}库区绑定,绑定物料{model.ItemCode}");
var traylist = ContainerHelper.GenerateCntrNo();
ContainerHelper.CreateCntrItem(a.S_LOC_CODE, traylist, model.ItemCode);
}
});
}
else
{
result.ResultCode = -1;
result.ResultMsg = "根据库区找不到货位";
return result;
}
return result;
}
catch (Exception ex)
{
result.ResultCode = -1;
result.ResultMsg = ex.ToString();
return result;
}
}
///
/// 解绑库区
///
///
///
internal static ReturnResult UntieArea(UntieArea model)
{
ReturnResult result = new ReturnResult { ResultCode = 0, ResultMsg = "解绑成功" };
var db = new SqlHelper().GetInstance();
try
{
var locList = db.Queryable().Where(a => a.S_AREA_CODE == model.AreaCode).ToList();
if (locList.Count > 0)
{
var IsLoct = locList.Find(a => a.S_LOCK_STATE.Trim() != "无");
if (IsLoct != null)
{
result.ResultCode = -1;
result.ResultMsg = "库区存在货位有锁,不允许解绑托盘";
return result;
}
locList.ForEach(a =>
{
if (a.N_CURRENT_NUM > 0)
{
var cntr = db.Queryable().Where(b => b.S_LOC_CODE == a.S_LOC_CODE).First();
if (cntr != null)
{
//起点终点解绑 删除托盘表托盘
LogHelper.Info($"货位{a.S_LOC_CODE}库区解绑,删除容器{cntr.S_CNTR_CODE}");
LocationHelper.UnBindingLoc(a.S_LOC_CODE, cntr.S_CNTR_CODE.Split(',').ToList());
var tpid = cntr.S_CNTR_CODE.Split(',');
foreach (var item in tpid)
{
ContainerHelper.delCntrAndItem(item);
}
}
}
});
}
else
{
result.ResultCode = -1;
result.ResultMsg = "根据库区找不到货位";
return result;
}
return result;
}
catch (Exception ex)
{
result.ResultCode = -1;
result.ResultMsg = ex.ToString();
return result;
}
}
internal static Location FindEndcolByLocList(List locations)
{
try
{
Location end = null;
var db = new SqlHelper().GetInstance();
//根据终点货位找空闲货位
var rows = locations.Select(a => a.N_ROW).Distinct().ToList();
for (int i = 0; i < rows.Count; i++)
{
var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList();
if (rowList.Count(a => a.S_LOCK_STATE != "无") == 0 && rowList.Count(a => a.N_CURRENT_NUM == 0) > 0)
{
Location other = null;
//当前排没有锁并且有空位置
//先找满位,然后后面一位要么是空,要么不存在
var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault();
if (full == null)
{
//没有满位,那就找最小的空位
other = rowList.OrderBy(a => a.N_COL).FirstOrDefault();
}
else
{
other = rowList.OrderBy(a => a.N_COL).Where(a => a.N_COL > full.N_COL).FirstOrDefault();
}
if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "禁用"))
{
//禁用了选择后面一个货位
other = db.Queryable().OrderBy(a => a.N_COL).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "禁用") && a.S_AREA_CODE == other.S_AREA_CODE && a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First();
//LogHelper.Info($"禁用选择后一个货位{result}", "成品");
}
if (other != null)
{
end = other;
break;
}
}
}
return end;
}
catch (Exception)
{
throw;
}
}
///
/// 清洁空框位
///
///
///
internal static SimpleResult CleanReport(LocationModel model)
{
var result = new SimpleResult() { resultMsg = $"货位{model.location}清洁报工成功" };
//1\3\4 可清洁
var cntr = LocationHelper.GetLocCntr(model.location);
if (cntr.Count > 0)
{
ContainerHelper.UpdateCntrState(new List { cntr[0].S_CNTR_CODE.Trim() }, "已清洁");
}
else
{
result.resultCode = 1;
result.resultMsg = $"货位{model.location}不存在,或者没有容器";
}
JingyuNongfu.LogHelper.Debug("CleanReport Response:" + JsonConvert.SerializeObject(result));
return result;
}
///
/// 重置信号
///
///
///
internal static SimpleResult ResetDevice(DeviceModel model)
{
var result = new SimpleResult();
deviceInfo plc = null;
if (string.IsNullOrEmpty(model.type))
{
plc = Settings.deviceInfos.Where(a => a.deviceName == model.deviceName).FirstOrDefault();
}
else
{
if (model.type == "下满复位")
{
plc = Settings.deviceInfos.Where(a => a.deviceName == model.deviceName && a.deviceNo[0] == "1").FirstOrDefault();
}
else
{
plc = Settings.deviceInfos.Where(a => a.deviceName == model.deviceName && a.deviceNo[0] == "2").FirstOrDefault();
}
}
if (plc != null)
{
if (model.deviceName.Contains("无菌"))
{
LogHelper.Info($"调用接口发送信号", "发送信号");
if (PlcHelper.SendHex(plc.address, "3F00100D0A"))
{
Thread.Sleep(300);
PlcHelper.SendHex(plc.address, "3F00200D0A");
}
else
{
result.resultCode = 2;
result.resultMsg = "满托重置信号发送失败";
}
}
else if (model.deviceName.Contains("翻斗机"))
{
if (PlcHelper.SendHex(plc.address, "3F0010200D0A"))
{
}
else
{
result.resultCode = 2;
result.resultMsg = "重置信号发送失败";
}
}
else if (model.deviceName.Contains("成品"))
{
if (model.type == "下满复位")
{
if (model.deviceName.Contains("靖宇成品仓E12输送线"))
{
PlcHelper.SendHex(plc.address, "3F00200D0A");
}
else
{
PlcHelper.SendHex(plc.address, "3F00100D0A");
}
}
else
{
PlcHelper.SendHex(plc.address, "3F00200D0A");
}
}
else
{
if (PlcHelper.SendHex(plc.address, "3F00100D0A"))
{
}
else
{
result.resultCode = 2;
result.resultMsg = "重置信号发送失败";
}
}
}
else
{
result.resultCode = 1;
result.resultMsg = "设备不存在,请检查设备名称";
}
return result;
}
internal static void AddTask(AddTaskModel model)
{
if (!TaskHelper.CheckExist(model.No))
{
if (LocationHelper.CheckExist(model.From) && LocationHelper.CheckExist(model.To))
{
TaskHelper.CreateTask(model.No, model.From, model.To, "搬运", 99, "");
}
}
}
public class AddTaskModel
{
public string From { get; set; }
public string To { get; set; }
public string No { get; set; }
}
public class LocationModel
{
public string location { get; set; }
}
public class DeviceModel
{
///
/// 瓶盖机名称
///
public string deviceName { get; set; }
///
/// 1 、2
///
//public int order { get; set; }
public string type { get; set; }
}
public class RowInfo
{
public string area { get; set; }
public int row { get; set; }
}
}
}