using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Data;
|
using System.Drawing;
|
using System.Linq;
|
using System.Text;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using System.Windows.Forms;
|
using WMSPatch.EF;
|
|
namespace WMSPatch
|
{
|
public partial class Form1 : Form
|
{
|
Thread sendWmsTaskThread;
|
Thread finishWmsTaskThread;
|
|
public Form1()
|
{
|
InitializeComponent();
|
|
sendWmsTaskThread = new Thread(sendWmsTask);
|
sendWmsTaskThread.Start();
|
finishWmsTaskThread = new Thread(finishWmsTask);
|
finishWmsTaskThread.Start();
|
}
|
|
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
|
{
|
sendWmsTaskThread.Abort();
|
finishWmsTaskThread.Abort();
|
}
|
|
/// <summary>
|
/// 下发任务线程
|
/// </summary>
|
public void sendWmsTask()
|
{
|
while (true)
|
{
|
using (Model edm = new Model())
|
{
|
List<string> statusList=new List<string>();
|
statusList.Add("任务创建成功");
|
statusList.Add("任务下发失败");
|
statusList.Add("分配货位失败");
|
statusList.Add("目标货位未分配");
|
statusList.Add("等待移库任务完成");
|
statusList.Add("未分配到库存");
|
statusList.Add("源货位重复分配");
|
statusList.Add("设备故障已处理");
|
statusList.Add("目标货位重复分配");
|
|
List<Task_Queue> taskList = edm.Task_Queue.Where(x => statusList.Contains(x.TaskStatus) && x.FromPositionName.Contains("-") && x.DoCount < 2000).ToList();
|
for (int i = 1; i < 10; i++)
|
{
|
//优先移库
|
Task_Queue task = taskList.OrderBy(x => x.OrderNumber).ThenBy(x => x.Task_Id).FirstOrDefault(x => statusList.Contains(x.TaskStatus) && x.FromPositionName.Contains("-") && x.ToPositionName.Contains("-") && x.FromPositionName.Substring(0, 1) == i.ToString());
|
Task_Queue sendTask = new Task_Queue();
|
|
if (task != null)
|
{
|
//存在移库
|
sendTask=task;
|
}
|
else
|
{
|
task = taskList.OrderBy(x => x.OrderNumber).ThenBy(x => x.Task_Id).FirstOrDefault(x => statusList.Contains(x.TaskStatus) && x.FromPositionName.Contains("-") && !x.ToPositionName.Contains("-") && x.FromPositionName.Substring(0, 1) == i.ToString());
|
if (task != null)
|
{
|
//存在出库
|
//判断移库
|
int row = int.Parse(task.FromPositionName.Substring(3, 1));
|
if (row == 4)
|
{
|
row = 3;
|
}
|
if (row == 1)
|
{
|
row = 2;
|
}
|
string sidePosistionName = task.FromPositionName.Remove(3, 1);
|
sidePosistionName = sidePosistionName.Insert(3, row.ToString());
|
Base_ProductPosition pp = edm.Base_ProductPosition.FirstOrDefault(x => x.ProductStorage > 0 && x.PositionName == sidePosistionName);
|
if (pp != null)
|
{
|
string layer = pp.PositionName.Substring(8,2);
|
Base_Position bpEmpty = edm.Base_Position.FirstOrDefault(x => x.IsFull == "N" && x.AreaCode == pp.AreaCode && x.RowCode == layer);
|
//需要移库
|
Task_Queue newTask = new Task_Queue();
|
newTask.TaskType = "移库单";
|
newTask.Bill_Id = task.Bill_Id;
|
newTask.BillCode = task.BillCode;
|
newTask.TaskStatus = "任务创建成功";
|
newTask.PlatUser_Id = task.PlatUser_Id;
|
newTask.UserProduct_Id = task.UserProduct_Id;
|
newTask.CreateID = task.CreateID;
|
newTask.Creator = task.Creator;
|
newTask.CreateDate = DateTime.Now;
|
newTask.ModifyDate = DateTime.Now;
|
newTask.Enable = 1;
|
newTask.DoCount = 0;
|
newTask.IsDoing = 0;
|
newTask.RelationTask_Id = task.Task_Id;
|
newTask.FromPositionName = pp.PositionName;
|
newTask.ToPositionName = bpEmpty.PositionName;
|
newTask.PlateType = task.PlateType;
|
newTask.PlateCode = task.PlateCode;
|
newTask.OrderNumber = task.OrderNumber;
|
newTask.ProductPosition_Id = pp.ProductPosition_Id;
|
edm.Task_Queue.Add(newTask);
|
edm.SaveChanges();
|
continue;
|
}
|
else
|
{
|
//可以出库
|
//出库重分配
|
if (task.FromPositionName.Contains("-"))
|
{
|
Base_Position bp = edm.Base_Position.FirstOrDefault(x => x.PositionName == task.FromPositionName);
|
if (bp.IsFull != "Y")
|
{
|
//起始位无货(占用),另选
|
v3D展示数据 bpNow = edm.v3D展示数据.FirstOrDefault(x => x.器具编号 == task.PlateCode);
|
Base_Position bpFrom = edm.Base_Position.FirstOrDefault(x => x.IsFull == "Y" && x.PositionName==bpNow.货位编号);
|
if (bpFrom != null)
|
{
|
task.ToPositionName = bpFrom.PositionName;
|
edm.SaveChanges();
|
}
|
continue;
|
}
|
}
|
sendTask = task;
|
}
|
}
|
else
|
{
|
task = taskList.OrderBy(x => x.OrderNumber).ThenBy(x => x.Task_Id).FirstOrDefault(x => statusList.Contains(x.TaskStatus) && !x.FromPositionName.Contains("-") && x.ToPositionName.Contains("-") && x.FromPositionName.Substring(0, 1) == i.ToString());
|
if (task != null)
|
{
|
//入库重定向
|
if (task.ToPositionName.Contains("-"))
|
{
|
Base_Position bp = edm.Base_Position.FirstOrDefault(x => x.PositionName == task.ToPositionName);
|
if (!string.IsNullOrEmpty(bp.IsFull) && bp.IsFull != "N")
|
{
|
//目标位有货(占用),另选一个
|
Base_Position bpEmpty = edm.Base_Position.FirstOrDefault(x => x.IsFull == "N" && x.AreaCode == bp.AreaCode && x.PlateType == bp.PlateType);
|
task.ToPositionName = bpEmpty.PositionName;
|
edm.SaveChanges();
|
continue;
|
}
|
}
|
//存在入库
|
sendTask = task;
|
}
|
}
|
}
|
if (sendTask != null)
|
{
|
//下发任务
|
string sourcePlace = sendTask.FromPositionName;
|
string toPlace = sendTask.ToPositionName;
|
string palletTypeString = edm.Base_PlateType.FirstOrDefault(x => x.PlateType == sendTask.PlateType).PalletType;
|
int palletType = int.Parse(palletTypeString);
|
int taskType = 0;
|
int outType = 0;
|
if (sendTask.TaskType=="移库单")
|
{
|
taskType = 3;
|
}
|
else if (sendTask.ToPositionName.Contains("-"))
|
{
|
taskType = 1;
|
}
|
else
|
{
|
taskType = 2;
|
}
|
|
if (sendTask.TaskType == "出库单")
|
{
|
Sale_Order orderInfo = edm.Sale_Order.FirstOrDefault(x => x.Order_Id == sendTask.Bill_Id);
|
if (!string.IsNullOrEmpty(orderInfo.OutTransId))
|
{
|
if (orderInfo.DestinationName.Contains("分拣区"))
|
{
|
toPlace = "34"; // 5号口
|
}
|
else if (orderInfo.OrderType == "焊装出库")
|
{
|
toPlace = "999";
|
}
|
else if (orderInfo.OrderType == "调件出库")
|
{
|
toPlace = "997";
|
}
|
}
|
else
|
{
|
toPlace = orderInfo.OutTransId;
|
}
|
}
|
//发送
|
SrmServer.SrmServiceClient srv = new SrmServer.SrmServiceClient();
|
SrmServer.SendTaskClass result = srv.SendTask(palletType,sourcePlace,toPlace,sendTask.Task_Id,taskType,outType);
|
if (result.result)
|
{
|
//下发成功
|
Task_Queue taskSunccess = edm.Task_Queue.FirstOrDefault(x => x.Task_Id == sendTask.Task_Id);
|
taskSunccess.TaskStatus = "任务下发成功";
|
if (taskType == 2)
|
{
|
int toTranId = result.outTransId;
|
if (taskSunccess.Bill_Id != 0 && result.statusId != 90)
|
{
|
Sale_Order so = edm.Sale_Order.FirstOrDefault(x => x.Order_Id == taskSunccess.Bill_Id);
|
so.OutTransId = toTranId.ToString();
|
taskSunccess.ToPositionName = toTranId.ToString();
|
}
|
}
|
Base_Position fromBp = edm.Base_Position.FirstOrDefault(x => x.PositionName == taskSunccess.FromPositionName);
|
Base_Position toBp = edm.Base_Position.FirstOrDefault(x => x.PositionName == taskSunccess.ToPositionName);
|
if (fromBp!=null)
|
{
|
fromBp.IsFull = "TEMPOUT";
|
}
|
if (toBp != null)
|
{
|
toBp.IsFull = "TEMPIN";
|
}
|
edm.SaveChanges();
|
}
|
else
|
{
|
//下发失败
|
Task_Queue taskFail = edm.Task_Queue.FirstOrDefault(x => x.Task_Id == sendTask.Task_Id);
|
if (result.statusId == 0)
|
{
|
taskFail.TaskStatus = "任务完成中";
|
}
|
else if (result.statusId == 1)
|
{
|
taskFail.TaskStatus = "任务下发失败";
|
}
|
else if (result.statusId == 2)
|
{
|
taskFail.TaskStatus = "输送线故障中";
|
}
|
else if (result.statusId == 3)
|
{
|
taskFail.TaskStatus = "RGV故障";
|
}
|
else if (result.statusId == 4)
|
{
|
taskFail.TaskStatus = "码垛机故障";
|
}
|
else
|
{
|
taskFail.TaskStatus = "任务下发失败";
|
}
|
|
edm.SaveChanges();
|
}
|
Thread.Sleep(1000);
|
}
|
}
|
}
|
Thread.Sleep(1000);
|
}
|
}
|
|
/// <summary>
|
/// 完成任务线程
|
/// </summary>
|
public void finishWmsTask()
|
{
|
while (true)
|
{
|
Thread.Sleep(1000);
|
using (Model edm = new Model())
|
{
|
List<string> statusList=new List<string>();
|
statusList.Add("任务下发成功");
|
statusList.Add("任务完成失败");
|
statusList.Add("任务完成中");
|
List<Task_Queue> taskList = edm.Task_Queue.Where(x => statusList.Contains(x.TaskStatus)).ToList();
|
foreach (var i in taskList)
|
{
|
SrmServer.SrmServiceClient srv = new SrmServer.SrmServiceClient();
|
SrmServer.TaskFinishClass result = srv.TaskFinish(i.Task_Id);
|
////异常
|
//if (result.isError == 1)
|
//{
|
|
//}
|
if (result.result == true)
|
{
|
//任务完成
|
Base_Position fromPlace = edm.Base_Position.FirstOrDefault(x => x.PositionName == i.FromPositionName);
|
Base_Position toPlace = edm.Base_Position.FirstOrDefault(x => x.PositionName == i.ToPositionName);
|
if (fromPlace != null)
|
{
|
fromPlace.IsFull = "N";
|
}
|
if (toPlace != null)
|
{
|
toPlace.IsFull = "Y";
|
}
|
}
|
}
|
edm.SaveChanges();
|
|
}
|
}
|
}
|
}
|
}
|