using HH.WCS.Mobox3.YNJT_BZP_PT.models;
using HH.WCS.Mobox3.YNJT_PT.api;
using HH.WCS.Mobox3.YNJT_PT.dispatch;
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 {
///
/// wms管到作业
///
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 GetOperationListByState(string state) {
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.S_B_STATE == state).ToList();
}
internal static List GetOperationListByState(int state) {
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.N_B_STATE == state).ToList();
}
internal static List GetWaitingOperationList() {
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.N_B_STATE == 0 || a.N_B_STATE == 3).ToList();
}
internal static PutawayOrder GetPutawayOrder(string no) {
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.S_NO == no).First();
}
internal static bool CreatePutawayOrder(PutawayOrder model) {
var db = new SqlHelper().GetInstance();
var result = db.Insertable(model).ExecuteCommand() > 0;
db.Insertable(model.Details).ExecuteCommand();
return result;
}
internal static PutawayDetail GetPutawayOrderDetail(string no, string item_code) {
var db = new SqlHelper().GetInstance();
return db.Queryable().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().GetInstance();
return db.Queryable().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().GetInstance();
db.Updateable(model).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand();
}
internal static ShippingOrder GetShippingOrder(string no) {
var db = new SqlHelper().GetInstance();
return db.Queryable().Includes(a => a.Details).Where(a => a.S_NO == no).First();
}
internal static bool CreateShippingOrder(ShippingOrder model) {
var db = new SqlHelper().GetInstance();
var result = db.Insertable(model).ExecuteCommand() > 0;
db.Insertable(model.Details).ExecuteCommand();
return result;
}
internal static bool CreateWmsTask(WMSTask wmsTask) {
try {
var db = new SqlHelper().GetInstance();
return db.Insertable(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().GetInstance();
if (active) {
result = db.Queryable().Where(a => a.S_CNTR_CODE.Contains(cntr) && a.N_B_STATE < 2).First();
}
else {
result = db.Queryable().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().GetInstance();
task.T_MODIFY = DateTime.Now;
task.S_B_STATE = WMSTask.GetStateStr(task.N_B_STATE);
db.Updateable(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().GetInstance();
a.T_MODIFY = DateTime.Now;
return db.Updateable(a).UpdateColumns(it => new { it.S_END_LOC, it.T_MODIFY }).ExecuteCommand() > 0;
}
internal static WMSTask GetWmsTask(string code) {
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.S_CODE == code).First();
}
///
/// 获取配货完成的分拣单,每个分拣单单独创建分拣作业
///
///
internal static List GetWaitingSortingOperationList() {
var db = new SqlHelper().GetInstance();
return db.Queryable().Includes(a => a.Details).Where(a => a.N_B_STATE == 2 || a.N_B_STATE == 3).ToList();
}
///
///单个分拣单的分拣明细创建作业
///
internal static void CreateSortingOperation(SortingOrder so) {
var list = so.Details.Where(a => a.N_B_STATE == 0).ToList();
var db = new SqlHelper().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().Where(c => c.S_CNTR_CODE == cntr).First();
if (lcr != null) {
//判断托盘是否已经创建任务了,可能多个分拣明细是同一个托盘,如果创建任务了,其它分拣的要稍后,只出一次人工会搞不清楚是哪个分拣单的
var wmsTask = db.Queryable().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();
}
}
}
///
/// 类似农夫堆叠
///
///
///
///
///
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().GetInstance().Queryable().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().GetInstance();
var list = db.Queryable().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().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().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().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().GetInstance();
#region 查找所有数量是空的排
//Console.WriteLine("查找所有数量是空的排");
//2.0 简化查询只查每一排第一列
var list = db.Queryable().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().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().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().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;
}
// ----------------------------------------------- 印尼佳通 - 硫化--------------------------------------------
///
/// 添加成型机下线记录
///
///
///
public static bool addOffLineRecord(OffLineRecord record)
{
bool result = false;
var db = new SqlHelper().GetInstance();
var offLineRecord = db.Queryable().Where(a => a.S_RFID == record.S_RFID).First();
if (offLineRecord != null)
{
offLineRecord.S_DEVICE_NO = record.S_DEVICE_NO;
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;
}
///
/// 查询成型机下线记录
///
///
///
public static OffLineRecord getOffLineRecord(string rfid)
{
OffLineRecord offLineRecord = null;
var db = new SqlHelper().GetInstance();
if (rfid != null)
{
offLineRecord = db.Queryable().Where(a => a.S_RFID == rfid).First();
}
return offLineRecord;
}
///
/// 查询物料条码信息
///
///
///
public static GreenTireInformation GetGreenTireInformation(string barcode)
{
GreenTireInformation greenTireInformation = null;
var db = new SqlHelper().GetInstance();
if (barcode != null)
{
greenTireInformation = db.Queryable().Where(a => a.BARCODE == barcode).First();
}
return greenTireInformation;
}
///
/// 查询入库终点货位
///
/// 1.单货位 2.双货位
///
public static EndLocGroup getInStockEndLoc(int locNum)
{
var db = new SqlHelper().GetInstance();
EndLocGroup endLocGroup = new EndLocGroup();
List locations = new List();
// 1.按容积率从大到小,对巷道进行排序
var roadwayOrderList = db.Queryable().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();
// 查询单货位
foreach (var order in roadwayOrderList)
{
if (locNum == 1)
{
/*// 查询所有相同物料货位
var sameItemLocList = db.Queryable()
.LeftJoin((a, b) => a.S_CODE == b.S_LOC_CODE)
.LeftJoin((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_CURRENT_NUM == 1
&& a.N_LOCK_STATE == 0
&& a.C_ENABLE == "Y"
&& b.S_CNTR_CODE != null
&& c.S_ITEM_CODE == itemCode
)
.OrderBy((a, b, c) => new { a.N_LAYER, a.N_COL })
.ToList();
// 查询相同物料的左右是否有空货位
foreach (var loc in sameItemLocList)
{
var leftLoc = db.Queryable().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 (leftLoc != null)
{
locations.Add(leftLoc);
break;
}
var rightLoc = db.Queryable().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 (rightLoc != null)
{
locations.Add(leftLoc);
break;
}
}*/
// 查询空货位
var emptyLoc = db.Queryable().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).First();
if (emptyLoc != null)
{
locations.Add(emptyLoc);
endLocGroup.endLocList = locations;
return endLocGroup;
}
}
if (locNum == 2)
{
var emptyLocList = db.Queryable().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).ToList();
if (emptyLocList.Count > 0)
{
// 查询双拖空货位
if (locations.Count == 0)
{
foreach (var loc in emptyLocList)
{
var leftLoc = db.Queryable().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 (leftLoc != null)
{
locations.Add(loc);
locations.Add(leftLoc);
break;
}
var rightLoc = db.Queryable().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 (rightLoc != null)
{
locations.Add(loc);
locations.Add(leftLoc);
break;
}
}
if (locations.Count == locNum)
{
endLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
endLocGroup.endLocList = locations;
return endLocGroup;
}
}
// 查询单拖货位
foreach (var loc in emptyLocList)
{
locations.Add(loc);
if (locations.Count == locNum)
{
endLocGroup.endLocList = locations;
return endLocGroup;
}
}
}
}
}
return endLocGroup;
}
public class EndLocGroup
{
public string groupNo { get; set; }
public List endLocList { get; set; }
}
///
/// 查询出库开始货位
/// 计算(1.巷道不报警、2.物料状态OK、3.小于失效时间 大于等于生效时间 4.加急料先出、5.先入先出(生产时间))出库物料
///
///
///
public static StartLocGroup getOutStockStartLoc(string itemCode, int locNum )
{
var db = new SqlHelper().GetInstance();
StartLocGroup startLocGroup = new StartLocGroup();
// 1.查询(物料状态OK ,且小于失效时间,大于等于生效时间)出库物料,并按加急料先出,先入先出(生产时间)的原则进行排序
var query = db.Queryable()
.LeftJoin((a, b) => a.S_CODE == b.S_LOC_CODE)
.LeftJoin((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
.Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea
&& a.N_CURRENT_NUM == 1
&& a.N_LOCK_STATE == 0
&& a.C_ENABLE == "Y"
&& b.S_CNTR_CODE != null
);
if (itemCode != null)
{
query = query.Where((a, b, c) => c.S_ITEM_CODE == itemCode
&& c.S_ITEM_STATE == "OK"
&& SqlFunc.ToDate(c.S_EFFECTIVE_TIME) <= SqlFunc.GetDate() // 生效时间早于当前时间
&& SqlFunc.ToDate(c.S_EXPIRATION_TIME) >= SqlFunc.GetDate() // 失效时间晚于当前时间
&& c.S_EFFECTIVE_TIME != null
&& c.S_EXPIRATION_TIME != null)
.OrderByDescending((a, b, c) => c.N_URGENT_FLAG)
.OrderBy((a, b, c) => c.S_TXNDATE);
}
else
{
query = query.Where((a, b, c) => c.S_ITEM_CODE == itemCode);
}
var outLocList = query.ToList();
if (outLocList.Count > 0)
{
foreach (var loc in outLocList)
{
// 查询巷道是否正常,异常跳过
var stackerStates = WCSDispatch.getStackerState(loc.N_ROADWAY);
if (stackerStates.Count == 0 || stackerStates[0].roadway_state == "0" || stackerStates[0].roadway_state == "3")
{
continue;
}
var cntrItemRel = db.Queryable().LeftJoin((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE).Where((a, b) => b.S_LOC_CODE == loc.S_CODE).First();
if (cntrItemRel != null)
{
startLocGroup.startLocList.Add(loc);
if (locNum == startLocGroup.startLocList.Count)
{
break;
}
var leftLoc = db.Queryable().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
if (leftLoc != null)
{
var locCntrRel = db.Queryable()
.LeftJoin((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
.Where((a, b) => a.S_LOC_CODE == leftLoc.S_CODE && b.S_ITEM_CODE == itemCode)
.First();
if (locCntrRel != null)
{
startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
startLocGroup.startLocList.Add(leftLoc);
break;
}
}
var rightLoc = db.Queryable().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
if (rightLoc != null && startLocGroup.startLocList.Count == 0)
{
var locCntrRel = db.Queryable()
.LeftJoin((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
.Where((a, b) => a.S_LOC_CODE == rightLoc.S_CODE && b.S_ITEM_CODE == itemCode)
.First();
if (locCntrRel != null)
{
startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
startLocGroup.startLocList.Add(rightLoc);
break;
}
}
}
}
}
return startLocGroup;
}
public class StartLocGroup
{
public string groupNo { get; set; }
public List startLocList { get; set; }
}
///
/// 查询异常区空货位
///
///
public static Location getAbnormalAreaEmptyLoc(string areaCode)
{
Location location = new Location();
var db = new SqlHelper().GetInstance();
location = db.Queryable().Where(a => a.S_AREA_CODE == areaCode && a.N_CURRENT_NUM == 0 && a.C_ENABLE == "Y" && a.N_LOCK_STATE == 0).First();
return location;
}
///
/// 查询巷道任务最少的接驳位
///
///
public static Location getMinTaskMiddleLoc(int type)
{
Location location = new Location();
var db = new SqlHelper().GetInstance();
var roadwayGroup = db.Queryable()
.LeftJoin((a, b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3)
.Where((a, b) => a.S_AREA_CODE == Settings.stockArea)
.GroupBy((a, b) => a.N_ROADWAY)
.Select((a, b) => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateDistinctCount(b.S_CODE != null) })
.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;
}
///
/// 查询物料存放时间配置信息
///
///
///
public static Overage getOverage(string bc_entried)
{
var db = new SqlHelper().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(sql, new { barcode = bc_entried, mcngrp = "0" });
var minhour_bar = db.Ado.SqlQuery(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().GetInstance();
var cntrItemRel = db.Queryable().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;
}
///
/// 查询硫化工单
///
///
///
///
///
public static ProductionShedule getProductionShedule(string dateShift ,string mcn ,string shift)
{
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.DATESHIFT == dateShift && a.MCN == mcn && a.SHIFT == shift).First();
}
///
/// 查询胚胎完成硫化的数量
///
///
public static int getEmbryoFinishNum(string dateShift, string mcn, string shift)
{
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.DATE_SHIFT == dateShift && a.CUR_MCN == mcn && a.CUR_SHIFT == shift).Count();
}
}
}