using HH.WCS.Mobox3.YNJT_BZP_PT.models;
|
using HH.WCS.Mobox3.YNJT_PT.api;
|
using HH.WCS.Mobox3.YNJT_PT.models;
|
using HH.WCS.Mobox3.YNJT_PT.models.other;
|
using HH.WCS.Mobox3.YNJT_PT.util;
|
using Newtonsoft.Json;
|
using NLog.Fluent;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection;
|
using System.Runtime.Remoting.Messaging;
|
using System.Text;
|
using System.Threading.Tasks;
|
using static HH.WCS.Mobox3.YNJT_PT.api.ApiModel;
|
|
namespace HH.WCS.Mobox3.YNJT_PT.wms {
|
/// <summary>
|
/// wms管到作业
|
/// </summary>
|
internal class WMSHelper {
|
internal static string GenerateTaskNo() {
|
var id = SYSHelper.GetSerialNumber("作业号", "OP");
|
var date = DateTime.Now.ToString("yyMMdd");
|
return $"OP{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
internal static string GenerateTaskGroupNo() {
|
var id = SYSHelper.GetSerialNumber("任务组", "GP");
|
var date = DateTime.Now.ToString("yyMMdd");
|
return $"GP{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
internal static List<WMSTask> GetOperationListByState(string state) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_B_STATE == state).ToList();
|
}
|
internal static List<WMSTask> GetOperationListByState(int state) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == state).ToList();
|
}
|
internal static List<WMSTask> GetWaitingOperationList() {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == 0 || a.N_B_STATE == 3).ToList();
|
}
|
internal static PutawayOrder GetPutawayOrder(string no) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<PutawayOrder>().Where(a => a.S_NO == no).First();
|
}
|
internal static bool CreatePutawayOrder(PutawayOrder model) {
|
var db = new SqlHelper<object>().GetInstance();
|
var result = db.Insertable<PutawayOrder>(model).ExecuteCommand() > 0;
|
db.Insertable<PutawayDetail>(model.Details).ExecuteCommand();
|
return result;
|
}
|
|
internal static PutawayDetail GetPutawayOrderDetail(string no, string item_code) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<PutawayDetail>().Where(a => a.S_PUTAWAY_NO == no && a.S_ITEM_CODE == item_code).First();
|
}
|
internal static PutawayDetail GetPutawayOrderDetail(string item_code) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<PutawayDetail>().Where(a => a.S_ITEM_CODE == item_code && a.F_QTY - a.F_ACC_B_QTY > 0).OrderByDescending(a => a.T_CREATE).First();
|
}
|
|
internal static void UpdatePutawayOrderDetailQty(PutawayDetail model) {
|
var db = new SqlHelper<object>().GetInstance();
|
db.Updateable(model).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand();
|
}
|
|
|
internal static ShippingOrder GetShippingOrder(string no) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<ShippingOrder>().Includes(a => a.Details).Where(a => a.S_NO == no).First();
|
}
|
internal static bool CreateShippingOrder(ShippingOrder model) {
|
var db = new SqlHelper<object>().GetInstance();
|
var result = db.Insertable<ShippingOrder>(model).ExecuteCommand() > 0;
|
db.Insertable<ShippingDetail>(model.Details).ExecuteCommand();
|
return result;
|
}
|
|
|
|
|
|
internal static bool CreateWmsTask(WMSTask wmsTask) {
|
try {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Insertable<WMSTask>(wmsTask).ExecuteCommand() > 0;
|
}
|
catch (Exception ex) {
|
Console.WriteLine(ex.Message);
|
throw;
|
}
|
}
|
|
internal static WMSTask GetWmsTaskByCntr(string cntr, bool active = true) {
|
WMSTask result = null;
|
var db = new SqlHelper<object>().GetInstance();
|
if (active) {
|
result = db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE.Contains(cntr) && a.N_B_STATE < 2).First();
|
}
|
else {
|
result = db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE.Contains(cntr)).First();
|
}
|
return result;
|
}
|
|
internal static Location GetEnd(WMSTask a) {
|
throw new NotImplementedException();
|
}
|
|
internal static Location GetStart(WMSTask a) {
|
throw new NotImplementedException();
|
}
|
|
internal static void UpdateTaskState(WMSTask task) {
|
var db = new SqlHelper<object>().GetInstance();
|
task.T_MODIFY = DateTime.Now;
|
task.S_B_STATE = WMSTask.GetStateStr(task.N_B_STATE);
|
db.Updateable<WMSTask>(task).UpdateColumns(a => new { a.N_B_STATE, a.S_B_STATE, a.T_MODIFY }).ExecuteCommand();
|
}
|
|
internal static bool UpdateTaskEnd(WMSTask a) {
|
var db = new SqlHelper<object>().GetInstance();
|
a.T_MODIFY = DateTime.Now;
|
return db.Updateable<WMSTask>(a).UpdateColumns(it => new { it.S_END_LOC, it.T_MODIFY }).ExecuteCommand() > 0;
|
}
|
|
internal static WMSTask GetWmsTask(string code) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_CODE == code).First();
|
}
|
|
/// <summary>
|
/// 获取配货完成的分拣单,每个分拣单单独创建分拣作业
|
/// </summary>
|
/// <returns></returns>
|
internal static List<SortingOrder> GetWaitingSortingOperationList() {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<SortingOrder>().Includes(a => a.Details).Where(a => a.N_B_STATE == 2 || a.N_B_STATE == 3).ToList();
|
}
|
|
/// <summary>
|
///单个分拣单的分拣明细创建作业
|
/// </summary>
|
internal static void CreateSortingOperation(SortingOrder so) {
|
var list = so.Details.Where(a => a.N_B_STATE == 0).ToList();
|
var db = new SqlHelper<object>().GetInstance();
|
if (list.Count > 0) {
|
try {
|
db.BeginTran();
|
list.GroupBy(g => g.S_CNTR_CODE).ToList().ForEach(g => {
|
var cntr = g.Key;
|
var sdList = g.ToList();
|
//查询托盘货位,查到了创建任务,查不到说明在别的分拣作业中,不创建任务,需要回库后重新创建
|
var lcr = db.Queryable<LocCntrRel>().Where(c => c.S_CNTR_CODE == cntr).First();
|
if (lcr != null) {
|
//判断托盘是否已经创建任务了,可能多个分拣明细是同一个托盘,如果创建任务了,其它分拣的要稍后,只出一次人工会搞不清楚是哪个分拣单的
|
var wmsTask = db.Queryable<WMSTask>().Where(op => op.S_CNTR_CODE.Contains(cntr) && op.N_B_STATE < 2).First();
|
if (wmsTask == null) {
|
wmsTask = new WMSTask
|
{
|
S_CNTR_CODE = cntr,
|
S_CODE = WMSHelper.GenerateTaskNo(),
|
S_START_LOC = lcr.S_LOC_CODE,
|
S_END_LOC = "",
|
N_TYPE = 2,
|
S_TYPE = WMSTask.GetTypeStr(2),
|
S_OP_DEF_CODE = "",
|
S_OP_DEF_NAME = "分拣出立库"
|
};
|
if (db.Insertable(wmsTask).ExecuteCommand() > 0) {
|
LocationHelper.LockLoc(lcr.S_LOC_CODE, 2);
|
}
|
|
sdList.ForEach(a => {
|
a.N_B_STATE = 1;
|
a.T_MODIFY = DateTime.Now;
|
db.Updateable(a).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
|
});
|
}
|
}
|
//修改分拣单状态为开始作业(不代表作业全部创建了,因为有的托盘可能已经被占用了)
|
so.N_B_STATE = 3;
|
//如果所有的作业都已经创建了,就设置为作业已经创建
|
if (so.Details.Count(s => s.N_B_STATE == 0) == 0) {
|
so.N_B_STATE = 4;
|
}
|
so.T_MODIFY = DateTime.Now;
|
db.Updateable(so).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
|
|
});
|
db.CommitTran();
|
}
|
catch (Exception ex) {
|
Console.WriteLine(ex.Message);
|
db.RollbackTran();
|
}
|
|
}
|
}
|
|
/// <summary>
|
/// 类似农夫堆叠
|
/// </summary>
|
/// <param name="item"></param>
|
/// <param name="endArea"></param>
|
/// <returns></returns>
|
/// <exception cref="NotImplementedException"></exception>
|
internal static Location GetInstockEnd(string item, string endArea) {
|
Location end = null;
|
end = GetLocation4InAnySrc(endArea, item);
|
if (end == null)
|
{
|
end = GetLocation4InEmptyRow(endArea);
|
}
|
return end;
|
}
|
public static Location GetLocation4InAnySrc(string area, string itemCode) {
|
Location result = null;
|
|
try {
|
Console.WriteLine("成品满托入库 GetLocation4InAnySrc:" + area);
|
|
//1.0 获取每一排最大的列
|
//1.1 判断当前数量是不是满的,如果是满的并且是最大列,需要排除
|
var listMaxCol = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_AREA_CODE == area ).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
|
//1.1 查到所有有托盘的排
|
Console.WriteLine("查到所有有托盘的排 ");
|
var db = new SqlHelper<object>().GetInstance();
|
var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area ).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
|
if (list.Count > 0) {
|
//1.2 查找其它尺寸有托盘或者锁定的排
|
for (int i = list.Count - 1; i >= 0; i--) {
|
//排除已经锁定的货位 和 放满了且是最大列的货位
|
if (list[i].N_LOCK_STATE != 0 || (list[i].N_CURRENT_NUM == list[i].N_CAPACITY && listMaxCol.Count(a => a.S_CODE == list[i].S_CODE) > 0)) {
|
Console.WriteLine($"排除已经锁定的货位 和 放满了且是最大列的货位 排{list[i].N_ROW}");
|
list.Remove(list[i]);
|
}
|
else {
|
//排有锁也排除
|
var other = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.S_LOCK_STATE != "无" && a.N_LOCK_STATE != 0).First();
|
if (other != null) {
|
Console.WriteLine($"排除有锁的排{list[i].N_ROW}");
|
list.Remove(list[i]);
|
}
|
}
|
}
|
Console.WriteLine($"有托盘排数为{list.Count}");
|
if (list.Count > 0) {
|
|
//1.3 遍历判断物料类型是否相同
|
Console.WriteLine("遍历判断物料类型是否相同");
|
for (int i = 0; i < list.Count; i++) {
|
//todo 还需要判断锁
|
if (list[i].LocCntrRel != null && list[i].LocCntrRel.CntrItemRel != null) {
|
Console.WriteLine($"货位{list[i].S_CODE} 物料{list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE}");
|
if (list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE == itemCode) {
|
if (list[i].N_CURRENT_NUM < list[i].N_CAPACITY) {
|
result = list[i];
|
}
|
else {
|
Console.WriteLine("选择后面空位");
|
result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL > list[i].N_COL && a.C_ENABLE == "Y").OrderBy(a => a.N_COL).First();
|
}
|
|
if (result != null)
|
{
|
break;
|
}
|
}
|
}
|
|
}
|
}
|
}
|
|
if (result != null && (!string.IsNullOrEmpty(result.C_ENABLE) && (result.C_ENABLE == "禁用" || result.C_ENABLE == "N"))) {
|
//禁用了选择后面一个货位
|
//Console.WriteLine("禁用了选择后面一个货位");
|
result = db.Queryable<Location>().OrderBy(a => a.N_COL).Where(a => a.S_AREA_CODE == area && a.N_ROW == result.N_ROW && (string.IsNullOrEmpty(a.C_ENABLE) || (a.C_ENABLE != "禁用" && a.C_ENABLE != "N")) && a.N_COL > result.N_COL).First();
|
}
|
}
|
catch (Exception ex) {
|
LogHelper.Error("GetLocation4InFinish:" + ex.Message, ex);
|
}
|
return result;
|
}
|
public static Location GetLocation4InEmptyRow(string area) {
|
Location result = null;
|
try {
|
var db = new SqlHelper<object>().GetInstance();
|
|
#region 查找所有数量是空的排
|
//Console.WriteLine("查找所有数量是空的排");
|
//2.0 简化查询只查每一排第一列
|
var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderBy(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0 ).ToList();
|
//2.1 选一个空排
|
for (int i = 0; i < list.Count; i++) {
|
var other = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.S_LOCK_STATE != "无").First();
|
if (list[i].N_LOCK_STATE == 0 && other == null) {
|
//二次校验当前排所有货位都是空的,防止系统数据错乱
|
var rowSumInfo = db.Queryable<Location>().Where(l => l.S_AREA_CODE == area && l.N_ROW == list[i].N_ROW && l.N_CURRENT_NUM != 0).Count();
|
if (rowSumInfo == 0) {
|
result = list[i];
|
break;
|
}
|
}
|
}
|
#endregion
|
|
if (result != null && (!string.IsNullOrEmpty(result.C_ENABLE) && (result.C_ENABLE == "禁用" || result.C_ENABLE == "N"))) {
|
//禁用了选择后面一个货位
|
Console.WriteLine("禁用了选择后面一个货位");
|
result = db.Queryable<Location>().OrderBy(a => a.N_COL).Where(a => a.S_AREA_CODE == area && a.N_ROW == result.N_ROW && (string.IsNullOrEmpty(a.C_ENABLE) || (a.C_ENABLE != "禁用" && a.C_ENABLE != "N")) && a.N_COL > result.N_COL).First();
|
}
|
}
|
catch (Exception ex) {
|
|
LogHelper.Error("GetLocation4InEmptyRow:" + ex.Message, ex);
|
}
|
return result;
|
}
|
|
|
// ----------------------------------------------- 印尼佳通 - 硫化--------------------------------------------
|
|
/// <summary>
|
/// 添加成型机下线记录
|
/// </summary>
|
/// <param name="record"></param>
|
/// <returns></returns>
|
public static bool addOffLineRecord(OffLineRecord record)
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
var offLineRecord = db.Queryable<OffLineRecord>().Where(a => a.S_RFID == record.S_RFID).First();
|
if (offLineRecord != null)
|
{
|
offLineRecord.S_LOC = record.S_LOC;
|
offLineRecord.N_IS_URGENT = record.N_IS_URGENT;
|
offLineRecord.T_OFF_TIME = record.T_OFF_TIME;
|
offLineRecord.N_IS_FULL = record.N_IS_FULL;
|
result = db.Updateable(offLineRecord).ExecuteCommand() > 0;
|
}
|
else
|
{
|
result = db.Insertable(record).ExecuteCommand() > 0;
|
}
|
return result;
|
}
|
|
/// <summary>
|
/// 查询成型机下线记录
|
/// </summary>
|
/// <param name="rfid"></param>
|
/// <returns></returns>
|
public static OffLineRecord getOffLineRecord(string rfid)
|
{
|
OffLineRecord offLineRecord = null;
|
var db = new SqlHelper<object>().GetInstance();
|
if (rfid != null)
|
{
|
offLineRecord = db.Queryable<OffLineRecord>().Where(a => a.S_RFID == rfid).First();
|
}
|
return offLineRecord;
|
}
|
|
/// <summary>
|
/// 查询物料条码信息
|
/// </summary>
|
/// <param name="barcode"></param>
|
/// <returns></returns>
|
public static GreenTireInformation GetGreenTireInformation(string barcode)
|
{
|
GreenTireInformation greenTireInformation = null;
|
var db = new SqlHelper<object>().GetInstance();
|
if (barcode != null)
|
{
|
greenTireInformation = db.Queryable<GreenTireInformation>().Where(a => a.BARCODE == barcode).First();
|
}
|
return greenTireInformation;
|
}
|
|
/// <summary>
|
/// 查询入库终点货位
|
/// </summary>
|
/// <param name="itemCode"></param>
|
/// <param name="locNum">1.单货位 2.双货位</param>
|
/// <returns></returns>
|
public static List<Location> getInStockEndLoc(string itemCode, int locNum)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
List<Location> locations = new List<Location>();
|
// 1.按容积率从大到小,对巷道进行排序
|
var roadwayOrderList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y")
|
.GroupBy(a => a.N_ROADWAY)
|
.Select(a => new { roadway = a.N_ROADWAY , num = SqlFunc.AggregateCount(a.S_CODE)})
|
.OrderByDescending(a => a.num)
|
.ToList();
|
|
// 查询单货位
|
if (locNum == 1)
|
{
|
foreach (var order in roadwayOrderList)
|
{
|
// 1. 查询1号货位是否有相同物料,有,则查询对应的2号货位是否为空
|
var oneLocList = db.Queryable<Location>()
|
.LeftJoin<LocCntrRel>((a,b) => a.S_CODE == b.S_LOC_CODE)
|
.LeftJoin<CntrItemRel>((a,b,c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
|
.Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea
|
&& a.N_ROADWAY == order.roadway
|
&& a.N_COL % 2 == 1
|
&& a.N_CURRENT_NUM == 1
|
&& a.N_LOCK_STATE == 0
|
&& a.C_ENABLE == "Y"
|
&& c.S_ITEM_CODE == itemCode
|
)
|
.OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL)
|
.ToList();
|
if (oneLocList.Count > 0)
|
{
|
foreach (var loc in oneLocList)
|
{
|
var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
|
if (twoLoc != null)
|
{
|
locations.Add(twoLoc);
|
return locations;
|
}
|
}
|
}
|
|
// 2.查询2号货位是否有相同物料,有,则查询对应的1号位是否为空
|
if (locations.Count == 0)
|
{
|
var twoLocList = db.Queryable<Location>()
|
.LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
|
.LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
|
.Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea
|
&& a.N_ROADWAY == order.roadway
|
&& a.N_COL % 2 == 0
|
&& a.N_CURRENT_NUM == 1
|
&& a.N_LOCK_STATE == 0
|
&& a.C_ENABLE == "Y"
|
&& c.S_ITEM_CODE == itemCode
|
)
|
.OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL)
|
.ToList();
|
|
if (twoLocList.Count > 0)
|
{
|
foreach (var loc in twoLocList)
|
{
|
var oneLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
|
if (oneLoc != null)
|
{
|
locations.Add(oneLoc);
|
return locations;
|
}
|
}
|
}
|
}
|
|
// 3.没有相同物料的,优先放禁用货位旁边(单一货位)
|
if (locations.Count == 0)
|
{
|
var disableLocList= db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.C_ENABLE == "N").OrderBy(a => a.N_LAYER).ToList();
|
foreach (var loc in disableLocList)
|
{
|
// 货位为1号位,则查询对应二号位是否为空
|
if (loc.N_LAYER % 2 == 1)
|
{
|
var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
|
if (twoLoc != null)
|
{
|
locations.Add(twoLoc);
|
return locations;
|
}
|
}
|
|
// 货位为2号位,则查询对应一号位是否为空
|
if (loc.N_LAYER % 2 == 0)
|
{
|
var oneLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
|
if (oneLoc != null)
|
{
|
locations.Add(oneLoc);
|
return locations;
|
}
|
}
|
}
|
}
|
|
// 4.没有相同物料的,且禁用货位旁边没有空货位,则优先放1号位
|
if (locations.Count == 0)
|
{
|
oneLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_COL % 2 == 1 && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => a.N_LAYER).OrderByDescending(a => a.N_COL).ToList();
|
if (oneLocList.Count > 0)
|
{
|
locations.Add(oneLocList[0]);
|
return locations;
|
}
|
}
|
}
|
}
|
|
// 查询双货位
|
if (locNum == 2)
|
{
|
foreach (var order in roadwayOrderList)
|
{
|
var oneLocList = db.Queryable<Location>().Where( a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_COL % 2 == 1 && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL).ToList();
|
foreach (var loc in oneLocList)
|
{
|
var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
|
if (twoLoc != null)
|
{
|
locations.Add(loc);
|
locations.Add(twoLoc);
|
return locations;
|
}
|
}
|
}
|
}
|
return locations;
|
}
|
|
/// <summary>
|
/// 查询异常区空货位
|
/// </summary>
|
/// <param name="areaCode"></param>
|
public static Location getAbnormalAreaEmptyLoc(string areaCode)
|
{
|
Location location = new Location();
|
var db = new SqlHelper<object>().GetInstance();
|
location = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaCode && a.N_CURRENT_NUM == 0 && a.C_ENABLE == "Y" && a.N_LOCK_STATE == 0).First();
|
return location;
|
}
|
|
/// <summary>
|
/// 查询巷道任务最少的接驳位
|
/// </summary>
|
/// <returns></returns>
|
public static Location getMinTaskMiddleLoc(int type)
|
{
|
Location location = new Location();
|
var db = new SqlHelper<object>().GetInstance();
|
var roadwayGroup = db.Queryable<Location>()
|
.LeftJoin<WCSTask>((a,b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3)
|
.Where((a, b) => a.S_AREA_CODE == Settings.stockArea && b.S_CODE != null )
|
.GroupBy((a, b) => a.N_ROADWAY)
|
.Select( (a, b) => new { roadway = a.N_ROADWAY , num = SqlFunc.AggregateDistinctCount(a.S_CODE)})
|
.OrderBy(a => a.num)
|
.ToList();
|
|
foreach (var item in roadwayGroup)
|
{
|
// 1.查询巷道内的堆垛机状态是否正常
|
|
// 2.查询接驳位
|
var connectLoc = Settings.connectLocList.Where(a => a.type == type && a.roadway == item.roadway).FirstOrDefault();
|
if (connectLoc != null)
|
{
|
location = LocationHelper.GetLoc(connectLoc.locCode);
|
break;
|
}
|
}
|
return location;
|
}
|
|
/// <summary>
|
/// 查询物料存放时间配置信息
|
/// </summary>
|
/// <param name="bc_entried"></param>
|
/// <returns></returns>
|
public static Overage getOverage(string bc_entried)
|
{
|
|
var db = new SqlHelper<object>().GetInstance();
|
|
// 直接执行 SQL(参数化查询)
|
var sql = "SELECT get_ovg_bar(@barcode, @mcngrp) AS overage_value";
|
var sql1 = "SELECT get_minhour_bar(@barcode, @mcngrp) AS overage_value";
|
|
// 使用匿名对象传递参数
|
var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "0" });
|
var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "0" });
|
if (ovg_bar.Count > 0 && minhour_bar.Count > 0)
|
{
|
Overage overage = new Overage()
|
{
|
MINHOUR = minhour_bar[0],
|
OVERAGE = ovg_bar[0]
|
};
|
return overage;
|
}
|
return null;
|
}
|
|
public static bool bindBarcodeItemInfo( string cntrCode,GreenTireInformation greenTireInformation)
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
var cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrCode).First();
|
if (cntrItemRel == null)
|
{
|
var overage = getOverage(greenTireInformation.BARCODE);
|
DateTime txndate = DateTime.Parse(greenTireInformation.TXNDATE);
|
DateTime minTime = txndate.AddHours(overage.MINHOUR);
|
DateTime maxTime = txndate.AddDays(overage.OVERAGE);
|
cntrItemRel = new CntrItemRel()
|
{
|
S_CG_ID = greenTireInformation.BARCODE,
|
S_ITEM_CODE = greenTireInformation.ITEMCODE,
|
S_CNTR_CODE = cntrCode,
|
S_CELL_NO = greenTireInformation.TIRECODE,
|
F_QTY = greenTireInformation.QTY,
|
S_MCN = greenTireInformation.MCN,
|
S_OPR = greenTireInformation.OPR,
|
S_OPR02 = greenTireInformation.OPR02,
|
S_OPR03 = greenTireInformation.OPR03,
|
S_OPR04 = greenTireInformation.OPR04,
|
S_WINDUP = greenTireInformation.WINDUP,
|
S_TXNDATE = greenTireInformation.TXNDATE,
|
S_DATE_SHIFT = greenTireInformation.DATE_SHIFT,
|
S_EFFECTIVE_TIME = minTime.ToString("yyyy-MM-dd HH:mm:ss"),
|
S_EXPIRATION_TIME = maxTime.ToString("yyyy-MM-dd HH:mm:ss"),
|
};
|
result = db.Insertable(cntrItemRel).ExecuteCommand() > 0;
|
}
|
else
|
{
|
var overage = getOverage(greenTireInformation.BARCODE);
|
DateTime txndate = DateTime.Parse(greenTireInformation.TXNDATE);
|
DateTime minTime = txndate.AddHours(overage.MINHOUR);
|
DateTime maxTime = txndate.AddDays(overage.OVERAGE);
|
cntrItemRel.S_CG_ID = greenTireInformation.BARCODE;
|
cntrItemRel.S_ITEM_CODE = greenTireInformation.ITEMCODE;
|
cntrItemRel.S_CNTR_CODE = cntrCode;
|
cntrItemRel.S_CELL_NO = greenTireInformation.TIRECODE;
|
cntrItemRel.F_QTY = greenTireInformation.QTY;
|
cntrItemRel.S_MCN = greenTireInformation.MCN;
|
cntrItemRel.S_OPR = greenTireInformation.OPR;
|
cntrItemRel.S_OPR02 = greenTireInformation.OPR02;
|
cntrItemRel.S_OPR03 = greenTireInformation.OPR03;
|
cntrItemRel.S_OPR04 = greenTireInformation.OPR04;
|
cntrItemRel.S_WINDUP = greenTireInformation.WINDUP;
|
cntrItemRel.S_TXNDATE = greenTireInformation.TXNDATE;
|
cntrItemRel.S_DATE_SHIFT = greenTireInformation.DATE_SHIFT;
|
cntrItemRel.S_EFFECTIVE_TIME = minTime.ToString("yyyy-MM-dd HH:mm:ss");
|
cntrItemRel.S_EXPIRATION_TIME = maxTime.ToString("yyyy-MM-dd HH:mm:ss");
|
result = db.Updateable(cntrItemRel).ExecuteCommand() > 0;
|
}
|
return result;
|
}
|
}
|
}
|