using HH.WCS.QingXigongchang.device;
using HH.WCS.QingXigongchang.process;
using HH.WCS.QingXigongchang.util;
using HH.WCS.QingXigongchang.wms;
using Newtonsoft.Json;
using NLog.Fluent;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.ConstrainedExecution;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Security;
using static HH.WCS.QingXigongchang.api.ApiModel;
using static HH.WCS.QingXigongchang.dispatch.NDC;
namespace HH.WCS.QingXigongchang.api
{
///
/// api接口辅助类
///
public class ApiHelper
{
static ApiHelper()
{
}
///
/// 清洁空框位
///
///
///
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}不存在,或者没有容器";
}
LogHelper.Debug("CleanReport Response:" + JsonConvert.SerializeObject(result));
return result;
}
internal static SimpleResult ResetDevice(DeviceModel model)
{
var result = new SimpleResult();
var plc = Settings.GetDeviceInfoList().Where(a => a.deviceName == model.deviceName).FirstOrDefault();
if (plc != null)
{
if (model.order == 1)
{
if (PlcHelper.SendHex(plc.address, "3F00110d0a"))
{
Thread.Sleep(300);
if (!PlcHelper.SendHex(plc.address, "3F00120d0a"))
{
result.resultCode = 3;
result.resultMsg = "空托重置信号发送失败";
}
}
else
{
result.resultCode = 2;
result.resultMsg = "满托重置信号发送失败";
}
}
else
{
if (PlcHelper.SendHex(plc.address, "3F00210d0a"))
{
Thread.Sleep(300);
if (!PlcHelper.SendHex(plc.address, "3F00220d0a"))
{
result.resultCode = 3;
result.resultMsg = "空托重置信号发送失败";
}
}
else
{
result.resultCode = 2;
result.resultMsg = "满托重置信号发送失败";
}
}
}
else
{
result.resultCode = 1;
result.resultMsg = "设备不存在,请检查设备名称";
}
return result;
}
internal static SimpleResult GetAREACount(string area)
{
var result = new SimpleResult();
var res = LocationHelper.GetLocList(x => x.S_AREA_CODE == area && x.N_CURRENT_NUM > 0);
//var res = LocationHelper.SetRowLock(new RowLock { N_ROW = row, S_AREA_CODE = area.Trim(), S_LOCK_STATE = "无", S_LOCK_SRC = "", S_WORK_MODE = "正常" }, 1);
result.resultCode = res.Count;
result.resultMsg = $"库区{area} 满货位数量:{res.Count}";
return result;
}
[HttpGet]
internal static SimpleResult clearloc(string area, List row)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(area) || row.Count < 1)
{
result.resultCode = 2;
result.resultMsg = $"{area}:{row}库区,排不可为空";
return result;
}
else
{
var loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW));
if (loclist.FindAll(x => x.S_LOCK_STATE == "入库锁" || x.S_LOCK_STATE == "出库锁").Count > 0)
{
result.resultCode = -1;
result.resultMsg = $"库区{area},排{row} 中有任务锁定位置(可在可视化中查看),无法清理。";
return result;
}
var res = LocationHelper.DoAction(db =>
{
foreach (var item in loclist)
{
if (item.S_LOCK_STATE == "报废") continue;
item.N_CURRENT_NUM = 0;
item.T_FULL_TIME = null;
item.T_EMPTY_TIME = DateTime.Now;
item.S_LOCK_STATE = "无";
db.Updateable(item).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME, it.S_LOCK_STATE }).ExecuteCommand();
db.Deleteable().Where(it => item.S_LOC_CODE == it.S_LOC_CODE).ExecuteCommand();
}
return true;
});
result.resultCode = 1;
result.resultMsg = res ? $"排货位清理成功。" : $"排货位清理失败。";
}
return result;
}
[HttpGet]
internal static SimpleResult clearLoc(string area, List row)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(area) || row.Count < 1)
{
result.resultCode = 2;
result.resultMsg = $"{area}:{row}库区,排不可为空";
}
else
{
//var loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW) && x.S_LOCK_STATE != "报废");
var res = LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW), x =>
{
if (x.S_LOCK_STATE != "报废")
x.S_LOCK_STATE = "空间锁";
});
if (res)
{
result.resultCode = 1;
result.resultMsg = res ? $"锁定列成功。" : $"锁定列失败。";
}
}
return result;
}
[HttpGet]
internal static SimpleResult unlockrow(string area, List row)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(area) || row.Count < 1)
{
result.resultCode = 2;
result.resultMsg = $"{area}:{row}库区,排不可为空";
}
else
{
var res = LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW), x =>
{
if (x.S_LOCK_STATE == "空间锁")
x.S_LOCK_STATE = "无";
});
if (res)
{
result.resultCode = 1;
result.resultMsg = res ? $"锁定列成功。" : $"锁定列失败。";
}
}
return result;
}
internal static SimpleResult Outgo1(string area, List row)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(area) || row.Count < 1)
{
result.resultCode = 2;
result.resultMsg = $"{area}:{row}库区,排不可为空";
}
else
{
var res = LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_ROW), x =>
{
if (x.S_LOCK_STATE != "报废")
x.S_LOCK_STATE = "空间锁";
});
//var res = LocationHelper.SetRowLock(new RowLock { N_ROW = row, S_AREA_CODE = area.Trim(), S_LOCK_STATE = "无", S_LOCK_SRC = "", S_WORK_MODE = "正常" }, 1);
if (res)
{
result.resultCode = 1;
result.resultMsg = res ? $"锁定列成功。" : $"锁定列失败。";
}
}
return result;
}
internal static SimpleResult Outgo2(string area, List row)
{
area = area.Trim();
var result = new SimpleResult();
if (string.IsNullOrEmpty(area) || row.Count < 1)
{
result.resultCode = 2;
result.resultMsg = $"{area}:{row}库区,排不可为空";
}
else
{
var res = LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && row.Contains(x.N_COL), x =>
{
x.N_CURRENT_NUM = 0;
x.T_FULL_TIME = null;
x.T_EMPTY_TIME = null;
x.S_LOCK_STATE = "无";
x.S_NOTE = "";
}, (ms, db) =>
{
if (ms.Count > 0)
try
{
db.BeginTran();
foreach (var item in ms)
{
if (item.S_LOCK_STATE == "报废")
continue;
var m_s = db.Queryable().Where(a => a.S_LOC_CODE == item.S_LOC_CODE.Trim()).ToList();
db.Deleteable(m_s).ExecuteCommand();
}
db.Ado.CommitTran();
}
catch (Exception ex)
{
LogHelper.Info("解锁排并清托盘失败:" + ex.Message);
db.Ado.RollbackTran();
}
});
//var res = LocationHelper.SetRowLock(new RowLock { N_ROW = row, S_AREA_CODE = area.Trim(), S_LOCK_STATE = "无", S_LOCK_SRC = "", S_WORK_MODE = "正常" }, 1);
if (res)
{
result.resultCode = 1;
result.resultMsg = res ? $"解锁排成功。并清空货位" : $"解锁排失败。";
}
//var res = LocationHelper.SetRowLock(new RowLock { N_ROW = row, S_AREA_CODE = area.Trim(), S_LOCK_STATE = "无", S_LOCK_SRC = "", S_WORK_MODE = "正常" }, 0);
///// 满框区域,解锁 。 清除满框
//if (res)
//{
// if (area.Trim() == "1-3PPMK" || area.Trim() == "4-6PPMK")
// {
// LocationHelper.lOCReSetValue(x => x.S_AREA_CODE == area.Trim() && x.N_ROW == row, x =>
// {
// x.S_AGV_SITE = "";
// });
// }
//}
//else
//{
// result.resultCode = 2;
// result.resultMsg = $"解锁排失败。";
//}
}
return result;
}
internal static SimpleResult _unOutgo3(string area, string loc, string arco)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(area) || string.IsNullOrEmpty(loc))
{
result.resultCode = 2;
result.resultMsg = $"解绑库区,货位不可为空;";
}
else
{
loc = loc.Trim().ToUpper();
result.resultCode = 1;
//LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList());
LocationHelper.DoAction(db =>
{
var __loc = LocationHelper.GetLoc(loc);
if (__loc != null && __loc.S_LOCK_STATE != "无")
{
result.resultMsg = $"货位锁定,不可解绑";
return false;
}
var models = db.Queryable().Where(x => x.S_LOC_CODE == loc.Trim()).ToList();// db.Queryable().Where(x);
if (models.Count > 0)
{
//var res = db.Insertable(new LocCntrRel { S_LOC_CODE = loc.Trim(), S_CNTR_CODE = "1" }).ExecuteCommand();
var res = db.Deleteable().Where(x => x.S_LOC_CODE == loc.Trim()).ExecuteCommand();
LogHelper.Info("解绑托盘");
//重置货位。 - 如果解到 瓶坯机,那就是你操作失误。
LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == loc, x =>
{
x.N_CURRENT_NUM = 0;
x.T_FULL_TIME = null;
});
result.resultMsg = $"解绑货位成功!";
}
return true;
});
}
return result;
}
internal static SimpleResult unOutgo3(string area, string loc, string arco)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(area) || string.IsNullOrEmpty(loc))
{
result.resultCode = 2;
result.resultMsg = $"解绑库区,货位不可为空;";
}
else
{
loc = loc.Trim().ToUpper();
result.resultCode = 1;
var locd = LocationHelper.GetLoc(loc);
//LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList());
var _locs = new List();
if (arco == "o")
_locs.Add(locd);
else if (arco == "r")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW);
else if (arco == "c")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_COL == locd.N_COL);
else if (arco == "a")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE);
else
{
return SimpleResult.Error(loc + " 货位 arco a,r,c,o 指定不明");
}
if (_locs.Find(x => x.S_LOCK_STATE != "无") != null)
{
result.resultMsg = $"货位锁定,不可解绑";
return result;
}
LocationHelper.DoAction(db =>
{
//var models = db.Queryable().Where(x => x.S_LOC_CODE == loc.Trim()).ToList();// db.Queryable().Where(x);
//if (models.Count > 0)
//{
//var res = db.Insertable(new LocCntrRel { S_LOC_CODE = loc.Trim(), S_CNTR_CODE = "1" }).ExecuteCommand();
LogHelper.Info("解绑托盘");
db.Deleteable().Where(x => _locs.Select(xx => xx.S_LOC_CODE).Contains(x.S_LOC_CODE)).ExecuteCommand();
db.Updateable(_locs).ReSetValue(x => { x.N_CURRENT_NUM = 0; x.T_FULL_TIME = null; x.T_EMPTY_TIME = DateTime.Now; }).ExecuteCommand();
//重置货位。 - 如果解到 瓶坯机,那就是你操作失误。
//LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == loc, x =>
//{
// x.N_CURRENT_NUM = 0;
// x.T_FULL_TIME = null;
//});
result.resultMsg = $"解绑货位成功!";
//}
return true;
});
}
return result;
}
internal static SimpleResult Outgo3(string area, string SQL_UsingNow, string loc)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(loc))
{
result.resultCode = 2;
result.resultMsg = $"空框货位不可为空;";
}
else
{
loc = loc.Trim().ToUpper();
var locd = LocationHelper.GetLoc(loc);
var cntr = LocationHelper.GetLocCntrRel(loc);
if (locd == null)
{
result.resultCode = -1;
result.resultMsg = $"货位不存在。";
return result;
}
else if (locd.S_LOCK_STATE.Trim() != "无")
{
result.resultCode = -1;
result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行绑定";
return result;
}
else if (locd.N_CURRENT_NUM >= locd.N_CAPACITY || cntr.Count == locd.N_CAPACITY)
{
result.resultCode = 2;
result.resultMsg = $"{loc} 满了。不能再绑了";
return result;
}
result.resultCode = 1;
//LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList());
LogHelper.Info("绑定托盘:" + loc);
{
var b = false;
var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc.Trim())).FirstOrDefault();
if (plc != null)
{
if (plc.enable != 1)
return new SimpleResult
{
resultCode = -1,
resultMsg = plc.deviceName + "未启用。 先别绑定了!"
};
if (plc.deviceType == 5 || plc.deviceType == 8)
{
b = true;
}
}
LocationHelper.DoAction(db =>
{
if (!b)
{
var models = db.Queryable().Where(x => x.S_LOC_CODE == loc).ToList();// db.Queryable().Where(x);
if (models.Find(x => x.S_CNTR_CODE.Trim() == "1") == null)
{
if (models.Count() > 0)
{
db.Deleteable(models).ExecuteCommand();
}
string ccccc = "C" + Settings.GetTimeStamp();
if ("$JCJYKK,JCJYMK".IndexOf(locd.S_AREA_CODE) > 0 || locd.S_AREA_CODE.Contains("JCJY")) ccccc = "J" + Settings.GetTimeStamp(); //JCJYMK 为了绑即产满框备用的。
var res = db.Insertable(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = ccccc, S_TYPE = SQL_UsingNow }).ExecuteCommand();
//res = db.Insertable(new Container { S_CNTR_CODE = ccccc, S_DEST = "接口绑定", S_TYPE = SQL_UsingNow }).ExecuteCommand();
LogHelper.Info("瓶写托盘" + JsonConvert.SerializeObject(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = "1" }));
}
}
else
{
//瓶盖机
if (plc.deviceType <= 3)
if (string.IsNullOrEmpty(SQL_UsingNow))
{
result.resultCode = 2;
result.resultMsg = $"请选择空框是否即产?";
return false;
}
var cc = "F" + Settings.GetTimeStamp();
//if (workOrder.SQL_UsingNow.Trim() == "Y")
bool __b__ = SQL_UsingNow.Trim().ToUpper() == "Y";
if (__b__)
{
cc = "J" + Settings.GetTimeStamp();
}
var res = db.Insertable(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cc }).ExecuteCommand() > 0;
res = db.Insertable(new Container { S_CNTR_CODE = cc, S_DEST = "接口绑定", S_TYPE = (__b__ ? "即产托盘" : "非即产托盘") }).ExecuteCommand() > 0;
LogHelper.Info(loc + "写托盘" + res + JsonConvert.SerializeObject(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cc }));
}
LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == loc, x =>
{
if (b)
x.N_CURRENT_NUM = 1;
else
x.N_CURRENT_NUM++;
});
LocationHelper.SetT_FULL_TIME(loc.Trim(), DateTime.Now, (c, cc) =>
{
if (c.deviceType == 8)
{
PlcHelper.SendHex(c.address, cc);//"3F00100d0a"
result.resultMsg = $"{c.deviceName}{loc}绑定,清信号完成。";
}
else if (c.deviceType == 5)
{
PlcHelper.SendHex(c.address, "3F00110d0a");//"3F00100d0a"
result.resultMsg = $"{c.deviceName}{loc}绑定,清信号完成。";
}
else
{
result.resultMsg = $"绑定完成。;";
}
});
return true;
});
}
}
lable_end:
return result;
}
///
/// 清溪信号错误导致的问题拉扯
/// 瞎提绑定功能的沟通 开发。
///
/// 货位
/// 产线号
/// area, row,col,one
///
internal static SimpleResult BindCp(string loc, string LineNo, string arco)
{
var result = new SimpleResult() { resultCode = 0, resultMsg = "" };
var workOrder = WCSHelper.GetWorkOrder(LineNo);
if (workOrder == null)
{
LogHelper.Info(LineNo + "没有【执行中】的工单");
return SimpleResult.Error(LineNo + "没有【执行中】的工单");
}
var _locs = new List();
var _loc = LocationHelper.GetLoc(loc);
//"QX-02","QX-03","QX-04"
if (!_loc.S_AREA_CODE.Contains("QX-"))//02") && !_loc.S_AREA_CODE.Contains("QX-03") && !_loc.S_AREA_CODE.Contains("QX-05") && !_loc.S_AREA_CODE.Contains("QX-04"))
{
return SimpleResult.Error(loc + " 货位 不属于成品区");
}
if (arco == "o")
_locs.Add(_loc);
else if (arco == "r")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == _loc.S_AREA_CODE && x.N_ROW == _loc.N_ROW);
else if (arco == "c")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == _loc.S_AREA_CODE && x.N_COL == _loc.N_COL);
else if (arco == "a")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == _loc.S_AREA_CODE);
else
{
return SimpleResult.Error(loc + " 货位 arco a,r,c,o 指定不明");
}
var size = workOrder.B_Type;
var ItemName = workOrder.SQL_ItemName;
var Batch = workOrder.SQL_BatchNo;
//if(workOrder?.B_Type!= null)
//{
//}
if (string.IsNullOrEmpty(Batch))
{
LogHelper.Info(LineNo + "没有设置批次,或该工单还没有执行过下线任务");
return SimpleResult.Error(LineNo + "没有设置批次,或该工单还没有执行过下线任务");
}
if (string.IsNullOrEmpty(size))
{
LogHelper.Info(LineNo + "工单 没有指定版型");
return SimpleResult.Error(LineNo + "没有指定版型");
}
if (string.IsNullOrEmpty(ItemName))
{
LogHelper.Info(LineNo + "工单 没有指定物料");
return SimpleResult.Error(LineNo + "没有指定物料");
}
foreach (var item in _locs)
{
var cur = item.N_CURRENT_NUM;
var cap = item.N_CAPACITY;
while (cap - cur > 0)
{
cur++;
var tp1 = Settings.TPnum();
var cntr = tp1 + "_1v" + tp1 + "_2";
LogHelper.Info("成品绑定 - " + cntr);
LocationHelper.BindingLoc(item.S_LOC_CODE, new List { cntr });
var res = LocationHelper.DoAction(db =>
{
db.Insertable(new CntrItemRel { S_CNTR_CODE = cntr, S_BATCH_NO = Batch, F_QTY = "" + 0, S_ITEM_CODE = ItemName }).ExecuteCommand();
return true;
});
}
}
return result;
}
///
///
///
///
///
internal static SimpleResult Outgo31(string loc, string SQL_UsingNow, string arco)
{
switch (SQL_UsingNow)
{
case "1":
SQL_UsingNow = "集化板";
break;
case "2":
SQL_UsingNow = "大板";
break;
case "3":
SQL_UsingNow = "小板";
break;
case "4":
SQL_UsingNow = "超托板/套板";
break;
default:
break;
}
var result = new SimpleResult();
if (string.IsNullOrEmpty(loc))
{
result.resultCode = 2;
result.resultMsg = $"空框货位不可为空;";
}
else
{
var _locs = new List();
loc = loc.Trim().ToUpper();
var locd = LocationHelper.GetLoc(loc);
var cntr = LocationHelper.GetLocCntrRel(loc);
if (locd == null)
{
result.resultCode = -1;
result.resultMsg = $"货位不存在。";
return result;
}
else if (locd.S_LOCK_STATE.Trim() != "无")
{
result.resultCode = -1;
result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行绑定";
return result;
}
else if (locd.N_CURRENT_NUM >= locd.N_CAPACITY || cntr.Count == locd.N_CAPACITY)
{
result.resultCode = -1;
result.resultMsg = $"{loc} 满了。不能再绑了";
return result;
}
result.resultCode = 0;
//LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList());
LogHelper.Info("绑定成品空托盘:" + loc);
if (arco == "o")
_locs.Add(locd);
else if (arco == "r")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW);
else if (arco == "c")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_COL == locd.N_COL);
else if (arco == "a")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE);
else
{
return SimpleResult.Error(loc + " 货位 arco a,r,c,o 指定不明");
}
{
var row = _locs.FindAll(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.S_LOCK_STATE != "无" && x.S_LOCK_STATE != "报废");
//var rowloc = row.Find(x => x.S_LOCK_STATE != "无");
if (row.Any())
{
result.resultCode = -1;
result.resultMsg = $"所选区域{row.FirstOrDefault().S_LOC_CODE}排有{row.FirstOrDefault().S_LOCK_STATE}状态, 不能进行绑定";
return result;
}
LocationHelper.DoAction(db =>
{
var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int li = 0;
foreach (var __loc in _locs)
{
if (li >= s.Length)
li = 0;
string end = s[li].ToString();
db.Insertable(new LocCntrRel
{
S_LOC_CODE = __loc.S_LOC_CODE.Trim(),
S_CNTR_CODE = "TP" + Settings.GetTimeStamp() + end,
S_TYPE = SQL_UsingNow
}).ExecuteCommand();
__loc.N_CURRENT_NUM++;
if (__loc.N_CURRENT_NUM > __loc.N_CAPACITY)
__loc.N_CURRENT_NUM = __loc.N_CAPACITY;
__loc.T_FULL_TIME = DateTime.Now;
db.Updateable(__loc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME }).ExecuteCommand();
}
return true;
});
}
}
lable_end:
return result;
}
///
///
///
///
///
internal static SimpleResult Outgo34(string loc, string SQL_UsingNow, string arco, string item, bool BindORUnbind = true)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(loc))
{
result.resultCode = 2;
result.resultMsg = $"货位不可为空;";
}
else
{
var _locs = new List();
loc = loc.Trim().ToUpper();
var locd = LocationHelper.GetLoc(loc);
var cntr = LocationHelper.GetLocCntrRel(loc);
if (locd == null)
{
result.resultCode = -1;
result.resultMsg = $"货位不存在。";
return result;
}
else if (locd.S_LOCK_STATE.Trim() != "无")
{
result.resultCode = -1;
result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行绑定";
return result;
}
else if (BindORUnbind)
{
if (arco == "o")
{
if (locd.N_CURRENT_NUM >= locd.N_CAPACITY || cntr.Count == locd.N_CAPACITY)
{
result.resultCode = -1;
result.resultMsg = $"{loc} 满了。不能再绑了";
return result;
}
}
}
else
{
if (arco == "o")
{
if (locd.N_CURRENT_NUM == 0)
{
result.resultCode = -1;
result.resultMsg = $"{loc} 没货了。不能再解了";
return result;
}
}
}
if (!string.IsNullOrEmpty(item.Trim()))
if (!"J,F".Contains(SQL_UsingNow) || String.IsNullOrEmpty(SQL_UsingNow))
{
if (locd.S_AREA_CODE.StartsWith("PP"))
{
SQL_UsingNow = "F";
}
else if (locd.S_AREA_CODE.Contains("JCJY"))
{
SQL_UsingNow = "J";
}
else
return SimpleResult.Error("指明 即产和非即产的参数 JF 没有明确" + SQL_UsingNow);
}
result.resultCode = 0;
//LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList());
LogHelper.Info("解绑定PP托盘:" + loc);
if (arco == "o")
_locs.Add(locd);
else if (arco == "r")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW);
else if (arco == "c")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_COL == locd.N_COL);
else if (arco == "a")
_locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE);
else
{
return SimpleResult.Error(loc + " 货位 arco a,r,c,o 指定不明");
}
{
var row = _locs.FindAll(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.S_LOCK_STATE != "无" && x.S_LOCK_STATE != "报废");
//var rowloc = row.Find(x => x.S_LOCK_STATE != "无");
if (row.Any())
{
result.resultCode = -1;
result.resultMsg = $"所选区域{row.FirstOrDefault().S_LOC_CODE}排有{row.FirstOrDefault().S_LOCK_STATE}状态, 不能进行绑定";
return result;
}
if (BindORUnbind)
{
Location e = _locs.FindAll(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.N_CURRENT_NUM > 0).LastOrDefault();//从左往右最后一个满位。
if (e != null)
{
var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE);
if (rel.FirstOrDefault()?.S_TYPE != item)
{
LogHelper.Info($"{e.S_LOC_CODE} 位置的 物料{rel.FirstOrDefault()?.S_TYPE} 与本次绑定{item} 不符。 终止绑定");
result.resultCode = -1;
result.resultMsg = $"{e.S_LOC_CODE} 位置的 物料{rel.FirstOrDefault()?.S_TYPE} 与本次绑定{item} 不符。 终止绑定";
return result;
}
}
LocationHelper.DoAction(db =>
{
var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int li = 0;
foreach (var __loc in _locs)
{
if (__loc.N_CAPACITY <= __loc.N_CURRENT_NUM)
continue;
if (li >= s.Length)
li = 0;
string end = s[li].ToString();
db.Insertable(new LocCntrRel
{
S_LOC_CODE = __loc.S_LOC_CODE.Trim(),
S_CNTR_CODE = SQL_UsingNow + Settings.GetTimeStamp() + end,
S_TYPE = item
}).ExecuteCommand();
__loc.N_CURRENT_NUM++;
if (__loc.N_CURRENT_NUM > __loc.N_CAPACITY)
__loc.N_CURRENT_NUM = __loc.N_CAPACITY;
__loc.T_FULL_TIME = DateTime.Now;
db.Updateable(__loc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME }).ExecuteCommand();
li++;
}
return true;
});
}
else
{
LocationHelper.DoAction(db =>
{
foreach (var __loc in _locs)
{
if (0 == __loc.N_CURRENT_NUM)
continue;
db.Deleteable().Where(it => it.S_LOC_CODE == __loc.S_LOC_CODE.Trim()).ExecuteCommand();
__loc.N_CURRENT_NUM = 0;
__loc.T_FULL_TIME = null;
__loc.T_EMPTY_TIME = DateTime.Now;
db.Updateable(__loc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_EMPTY_TIME, it.T_FULL_TIME }).ExecuteCommand();
}
return true;
});
}
}
}
lable_end:
return result;
}
///
///
///
///
///
internal static SimpleResult Outgo33(string loc, string LineNo)
{
var result = new SimpleResult();
List loclist = new List();
if (loc.Contains("="))
{
//LogHelper.Info("验证loc数据a" + loc);
var aa = loc.Split('=');
//LogHelper.Info("验证loc数据aa0 " + aa[0]);
var ar = Array.ConvertAll(aa[1].Split('-'), Convert.ToInt32);
string areaaaaa = aa[0].Trim();
//LogHelper.Info("验证loc数据aa1 " + JsonConvert.SerializeObject(ar));
loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == areaaaaa && ar.Contains(x.N_ROW) && x.S_LOCK_STATE != "报废");
//LogHelper.Info("拉取数据: " + loclist.Count);
loc = loclist.FirstOrDefault()?.S_LOC_CODE;
}
//LogHelper.Info("验证loc数据V" + loc);
if (string.IsNullOrEmpty(loc))
{
result.resultCode = -1;
result.resultMsg = $"货位|库区排不可为空;";
}
else
{
loc = loc.Trim().ToUpper();
var locd = LocationHelper.GetLoc(loc);
var cntr = LocationHelper.GetLocCntrRel(loc);
LogHelper.Info("验证loc数据和托盘" + loc);
if (locd == null)
{
result.resultCode = -1;
result.resultMsg = $"货位不存在。";
return result;
}
else if (locd.S_LOCK_STATE.Trim() != "无")
{
result.resultCode = -1;
result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行绑定";
return result;
}
else if (locd.N_CURRENT_NUM >= locd.N_CAPACITY || cntr.Count == locd.N_CAPACITY)
{
result.resultCode = -1;
result.resultMsg = $"{loc} 满了。不能再绑了";
return result;
}
LogHelper.Info("验证完成" + loc);
string SQL_UsingNow = "TP";
if (locd.S_AREA_CODE.StartsWith("PP"))
{
SQL_UsingNow = "F";
}
else if (locd.S_AREA_CODE.Contains("JCJY"))
{
SQL_UsingNow = "J";
}
result.resultCode = 0;
//LocationHelper.BindingLoc(loc.Trim(), "1".Split(',').ToList());
LogHelper.Info("绑定-33-托盘:" + loc);
var _locful = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.N_CURRENT_NUM > 0).FirstOrDefault();
if (_locful != null)
{
cntr = LocationHelper.GetLocCntrRel(_locful.S_LOC_CODE);
if (cntr.Count > 0)
{
if (cntr.FirstOrDefault()?.S_TYPE?.Trim() != LineNo.Trim())
{
result.resultCode = -1;
result.resultMsg = $"{loc}所在排{_locful.S_LOC_CODE}位置物料{cntr.FirstOrDefault()?.S_TYPE}和 {LineNo} 不同!";
return result;
}
}
}
var row = LocationHelper.GetLocList(x => x.S_AREA_CODE == locd.S_AREA_CODE && x.N_ROW == locd.N_ROW && x.S_LOCK_STATE != "报废");
var rowloc = row.Find(x => x.S_LOCK_STATE != "无");
if (rowloc != null)
{
result.resultCode = -1;
result.resultMsg = $"货位所在排有{rowloc.S_LOCK_STATE}状态, 不能进行绑定";
return result;
}
if (loclist.Any())
{
List cirl = new List();
List lcir = new List();
var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int li = 0;
foreach (var item in loclist)
{
item.N_CURRENT_NUM++;
item.T_FULL_TIME = DateTime.Now;
item.T_EMPTY_TIME = null;
if (li >= s.Length)
li = 0;
string end = s[li].ToString();
var cir = new LocCntrRel
{
S_LOC_CODE = item.S_LOC_CODE.Trim(),
S_CNTR_CODE = SQL_UsingNow + end + Settings.GetTimeStamp(),
S_TYPE = LineNo.Trim(),
};
lcir.Add(cir);
cirl.Add(new Container
{
S_CNTR_CODE = cir.S_CNTR_CODE
});
li++;
LogHelper.Info("bindloc3.:" + item.S_LOC_CODE + "cnr" + cir.S_CNTR_CODE);
}
LogHelper.Info($"bindloc3.:{JsonConvert.SerializeObject(loclist)}");
LocationHelper.DoAction(db =>
{
db.Insertable(lcir).ExecuteCommand();
db.Insertable(cirl).ExecuteCommand();
db.Updateable(loclist).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME }).ExecuteCommand();
return true;
});
}
else
{
locd.N_CURRENT_NUM++;
locd.T_FULL_TIME = DateTime.Now;
locd.T_EMPTY_TIME = null;
LocationHelper.DoAction(db =>
{
db.Insertable(new LocCntrRel
{
S_LOC_CODE = locd.S_LOC_CODE.Trim(),
S_CNTR_CODE = SQL_UsingNow + Settings.GetTimeStamp(),
S_TYPE = LineNo.Trim(),
}).ExecuteCommand();
db.Updateable(locd).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME }).ExecuteCommand();
return true;
});
}
}
lable_end:
return result;
}
//按列绑定。 库区用。 -
internal static SimpleResult Outgo4(string area, List col)
{
var result = new SimpleResult();
if (string.IsNullOrEmpty(area) || col.Count < 1)
{
result.resultCode = 2;
result.resultMsg = $"{area}:{col}库区 列不可为空";
}
else
{
area = area.Trim().ToUpper();
result.resultCode = 1;
var b = LocationHelper.DoAction(db =>
{
var locs = LocationHelper.GetAllLocListByAreaCode(area, 0, 0).FindAll(x => col.Contains(x.N_COL));
if (locs.Count == 0)
{
result.resultCode = 2;
result.resultMsg = $"{area}库区 {col} 列没有货位";
return false;
}
if (locs.Find(x => x.S_LOCK_STATE.Trim() != "无") != null)
{
result.resultCode = 2;
result.resultMsg = $"{area}库区 列 货位锁定中!";
return false;
}
//if (locs.Find(x => x.N_CURRENT_NUM == 1) != null)
//{
// result.resultCode = 2;
// result.resultMsg = $"{area}库区 {_ncol} 列!";
// return false;
//}
foreach (var _loc in locs)
{
var models = db.Queryable().Where(x => x.S_LOC_CODE == _loc.S_LOC_CODE).ToList();// db.Queryable().Where(x);
if (models.Count == 0)//models.Find(x => x.S_CNTR_CODE.Trim() == "1") == null)
{
var rrr = new LocCntrRel { S_LOC_CODE = _loc.S_LOC_CODE.Trim(), S_CNTR_CODE = "C" + Settings.GetTimeStamp() };
var res = db.Insertable(rrr).ExecuteCommand();
LogHelper.Info("Range写托盘" + JsonConvert.SerializeObject(rrr));
_loc.N_CURRENT_NUM = 1;
_loc.T_FULL_TIME = DateTime.Now;
db.Updateable(_loc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME }).ExecuteCommand();
//LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == _loc.S_LOC_CODE, x =>
//{
// x.N_CURRENT_NUM = 1;
// x.T_FULL_TIME = DateTime.Now;
//});
}
}
result.resultMsg = "绑定成功!";
return true;
});
//if (index > 0 && (index + 1 < areas.Length))
//{
// index++;
// goto Labelgogog;
//}
}
ErrOrExit:
return result;
}
internal static SimpleResult unOutgo33(string locdddd, string LineNo = "")
{
string loc = locdddd;
var result = new SimpleResult();
List loclist = new List();
if (loc.Contains("="))
{
//LogHelper.Info("验证loc数据a" + loc);
var aa = loc.Split('=');
//LogHelper.Info("验证loc数据aa0 " + aa[0]);
var ar = Array.ConvertAll(aa[1].Split('-'), Convert.ToInt32);
string areaaaaa = aa[0];
//LogHelper.Info("验证loc数据aa1 " + JsonConvert.SerializeObject(ar));
loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == areaaaaa && ar.Contains(x.N_ROW) && x.S_LOCK_STATE != "报废");
//LogHelper.Info("拉取数据: " + loclist.Count);
//loc = loclist.FirstOrDefault()?.S_CODE;
if (loclist.Find(x => x.S_LOCK_STATE.Trim() != "无") != null)
{
result.resultCode = -1;
result.resultMsg = $"{locdddd} 中有锁。不能解";
return result;
}
}
//LogHelper.Info("验证loc数据V" + loc);
if (string.IsNullOrEmpty(loc))
{
result.resultCode = -1;
result.resultMsg = $"货位|库区排不可为空;";
}
else
{
if (loclist.Any())
{
//foreach (var item in loclist)
//{
// item.N_CURRENT_NUM = 0;
// item.T_FULL_TIME = null;
// item.T_EMPTY_TIME = DateTime.Now;
//}
LocationHelper.DoAction(db =>
{
var loclisssss = loclist.Select(x => x.S_LOC_CODE);
db.Deleteable().Where(x => loclisssss.Contains(x.S_LOC_CODE)).ExecuteCommand();
db.Updateable().SetColumns(it => new Location { N_CURRENT_NUM = 0, T_FULL_TIME = null, T_EMPTY_TIME = DateTime.Now }).Where(x => loclisssss.Contains(x.S_LOC_CODE)).ExecuteCommand();
//db.Updateable(loclist).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME }).ExecuteCommand();
return true;
});
}
else
{
loc = loc.Trim().ToUpper();
var locd = LocationHelper.GetLoc(loc);
var cntr = LocationHelper.GetLocCntrRel(loc);
LogHelper.Info("验证loc数据和托盘" + loc);
if (locd == null)
{
result.resultCode = -1;
result.resultMsg = $"货位不存在。";
return result;
}
else if (locd.S_LOCK_STATE.Trim() != "无")
{
result.resultCode = -1;
result.resultMsg = $"货位状态。非空闲(" + locd.S_LOCK_STATE + "), 不能进行解定";
return result;
}
else if (locd.N_CURRENT_NUM <= 0)
{
result.resultCode = -1;
result.resultMsg = $"{loc} 空的。不能再解了";
return result;
}
locd.N_CURRENT_NUM = 0;
locd.T_FULL_TIME = null;
locd.T_EMPTY_TIME = DateTime.Now;
LocationHelper.DoAction(db =>
{
db.Deleteable(cntr).ExecuteCommand();
db.Updateable(locd).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_FULL_TIME, it.T_EMPTY_TIME }).ExecuteCommand();
return true;
});
}
}
lable_end:
return result;
}
internal static SimpleResult Outgo36(string itemCode, string sArea = "", string eArea = "")
{
Location startBit = null;
Location EndBit = null;
LocCntrRel _clrel0 = null;
var locList = LocationHelper.GetAreaNormalLocList("入库区");
foreach (var item in locList.GroupBy(x => x.N_ROW).OrderBy(x => x.Key))
{
var rs = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault();
if (rs != null)
{
var _clrel = LocationHelper.GetLocCntrRel(rs.S_LOC_CODE);
if (!_clrel.Any())
{
LogHelper.Info(rs.S_LOC_CODE + " 没有货位托盘信息!");
continue;
}
_clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First();
var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim());
if (!_clcntitem.Any())
{
LogHelper.Info(rs.S_LOC_CODE + $"货位 的托盘{_clrel0.S_CNTR_CODE} 没有物料记录");
continue;
}
if (_clcntitem.FirstOrDefault().S_ITEM_CODE.Contains(itemCode))
{
startBit = rs;
break;
}
startBit = rs;
break;
}
}
if (startBit == null)
return SimpleResult.Error("") ;
locList = LocationHelper.GetAreaNormalLocList("入库区");
foreach (var item in locList.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key))
{
var rsl = item.OrderBy(x => x.N_COL).ToList();
var rs = rsl.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
if (rs != null)
{
if (rs.N_CURRENT_NUM < rs.N_CAPACITY)
{
EndBit = rs;
}
else
EndBit = rsl.Find(x => x.N_COL > rs.N_COL);
}
else
{
EndBit = rsl.FirstOrDefault();
}
if (EndBit != null)
break;
}
if (EndBit != null)
{
var res = TaskProcess.CreateTransport("", startBit.S_LOC_CODE, EndBit.S_LOC_CODE, "补满入库区", new List { _clrel0.S_CNTR_CODE }, startBit.N_CURRENT_NUM, EndBit.N_CURRENT_NUM++, 1, 50, _clrel0.S_TYPE);
}
return SimpleResult.Success();
}
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 class RowInfo
{
public string area { get; set; }
public int row { get; set; }
}
}
}