You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

552 lines
23 KiB
C#

2 years ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using CentralControl.App_Code;
using System.Configuration;
using CentralControl.BaseData;
using CentralControl.DBDAO;
using CommonFunc;
using XGL.Thrift;
using System.Data;
using Thrift.Protocol;
using Thrift.Server;
using Thrift.Transport;
using System.Reflection;
namespace CentralControl.App_Code
{
public class MainCentralControl
{
Thread OffMaterialScanThread;
object orderPlanLock = new object();
string ipaddress { get; set; }
/// <summary>
/// 系统启动初始化
/// </summary>
public void SystemInit()
{
try
{
StaticData.OrderPlanList = DBService.getOrderPlanList(""); //取时序订单
StaticData.MateriaList = DBService.GetMaterialInfoList("");//取物料信息
//StaticData.MaterialBomList = DBService.GetMaterialBomList(" is_delete=0 ", StaticData.MateriaList);//获取bom信息
StaticData.NodeSettingList = DBService.GetNodeSettingList("", StaticData.LineCatchAreaList);
//StaticData.LineCatchAreaList = DBService.GetLineCatchAreaList("");
//StaticData.PlcSettingList = DBService.GetPlcSettingList("");
//StaticData.CarMaterialList = DBService.GetCarMaterialList("");
//StaticData.CarProductList = DBService.GetCarProductList("");
//StaticData.NodeRelation = DBService.getNodeRelation("");
////绑定 上件队列信息
//StaticData.CarRealList = DBService.getCarInfoList("", StaticData.LineCatchAreaList, StaticData.CarMaterialList, StaticData.CarProductList);
////StaticData.UpLineCarCanList = DBService.getUpLineScanCarLists("");
//StaticData.OffMaterialList = DBService.getOffLineMaterialLists("");
////记录上一次扫描的条码号,暂时逻辑调整,用不到了
//// StaticData.Last_scanMaterial = DBService.GetSystemConfigItem("last_scanmaterial");
//this.ipaddress = ConfigurationManager.AppSettings["plcIp"];
//StaticData.plcHelper = new PlcHelper();
//StaticData.plcConnectionState = StaticData.plcHelper.Connection(ipaddress);
//if (!StaticData.plcConnectionState)
//{
// Console.WriteLine("PLC连接失败,重新连接");
// return;
//}
//int useBackMaterial = Convert.ToInt32(ConfigurationManager.AppSettings["useBackMaterial"]);
//OffMaterialScanThread = new Thread(ScanMaterialFromScan);
//OffMaterialScanThread.Start();
////定时任务线程
//Thread taskThread = new Thread(TaskCheckStart);
//taskThread.Start();
////// setPlanToLocator();
///////***测试数据***/
Logic101_104UpLine logic101 = new Logic101_104UpLine(StaticData.plcHelper, "101");
logic101.StartPoint();
//Logic101_104UpLine logic102 = new Logic101_104UpLine(StaticData.plcHelper, "102");
//logic102.StartPoint();
//Logic101_104UpLine logic103 = new Logic101_104UpLine(StaticData.plcHelper, "103");
//logic102.StartPoint();
//Logic101_104UpLine logic104 = new Logic101_104UpLine(StaticData.plcHelper, "104");
//logic102.StartPoint();
//Logic1003InputLocator logic1003 = new Logic1003InputLocator(StaticData.plcHelper, "1003");
//logic1003.StartPoint();
//Logic1005EmptyLocator logic1005 = new Logic1005EmptyLocator(StaticData.plcHelper, "1005");
//logic1005.StartPoint();
//Logic1006EmptyLocator logic1006 = new Logic1006EmptyLocator(StaticData.plcHelper, "1006");
//logic1006.StartPoint();
//Logic2006_2005UpLocator logic2006 = new Logic2006_2005UpLocator(StaticData.plcHelper, "2006");
//logic2006.StartPoint();
////入库口分发入库点
//Logic2004_2009_2010_2011UpLocator logic2004 = new Logic2004_2009_2010_2011UpLocator(StaticData.plcHelper, "2004");
//logic2004.StartPoint();
//Logic2008MiddleLocator logic2008 = new Logic2008MiddleLocator(StaticData.plcHelper, "2008");
//logic2008.StartPoint();
//Logic2004_2009_2010_2011UpLocator logic2009 = new Logic2004_2009_2010_2011UpLocator(StaticData.plcHelper, "2009");
//logic2009.StartPoint();
//Logic2004_2009_2010_2011UpLocator logic2010 = new Logic2004_2009_2010_2011UpLocator(StaticData.plcHelper, "2010");
//logic2010.StartPoint();
//Logic2004_2009_2010_2011UpLocator logic2011 = new Logic2004_2009_2010_2011UpLocator(StaticData.plcHelper, "2011");
//logic2011.StartPoint();
//Logic4001_4002OutLocator logic4001 = new Logic4001_4002OutLocator(StaticData.plcHelper, "4001");
//logic4001.StartPoint();
//Logic4001_4002OutLocator logic4002 = new Logic4001_4002OutLocator(StaticData.plcHelper, "4002");
//logic4002.StartPoint();
//Logic3001OffLine logic3001 = new Logic3001OffLine(StaticData.plcHelper, "3001", "5001", 7915);
//logic3001.StartPoint();
}
catch (Exception ex)
{
Logger logger = new Logger();
logger.Error("初始化控制台系统异常:" + ex.Message + ex.StackTrace + ex.ToString());
Console.WriteLine("初始化控制台系统异常:" + ex.Message + ex.StackTrace + ex.ToString());
}
}
/// <summary>
/// 定时任务
/// </summary>
private void TaskCheckStart()
{
Logger logger = new Logger();
while (true)
{
try
{
//if (DateTime.Now.Minute == 0)
//{
// //初始化订单信息
// getPlanOrderList();
//}
// Logic1004OffLine logic1004 = new Logic1004OffLine(StaticData.plcHelper, "1", 7913);
//// logic1004.StartPoint();
// logic1004.OffMaterialFromCar("fsdfsdf");
//每天8点,1分1秒开始清理垃圾数据
if (DateTime.Now.Hour == 8 && DateTime.Now.Minute == 1 && DateTime.Now.Second == 1)
{
//定时清理数据库垃圾数据
DBService.NightClearOldData();
}
//每20秒校验一次
if (DateTime.Now.Second % 20 == 0)
{
NodeSetting node = StaticData.NodeSettingList[0];
object obj1 = StaticData.plcHelper.Read(node.PlcSetting1);
object obj2 = StaticData.plcHelper.Read(node.PlcSetting2);
object obj3 = StaticData.plcHelper.Read(node.PlcSetting3);
object obj4 = StaticData.plcHelper.Read(node.PlcSetting4);
object obj5 = StaticData.plcHelper.Read(node.PlcSetting5);
if (obj1 == null && obj2 == null && obj3 == null && obj4 == null && obj5 == null)
{
StaticData.plcConnectionState = StaticData.plcHelper.Connection(this.ipaddress);
logger.Log("定时检测plc读取状态,短线重连");
}
}
}
catch (Exception ex)
{
logger.Log("定时任务异常:" + ex.Message + ex.StackTrace);
}
///每分钟执行一次
Thread.Sleep(1000);
}
}
//private void StartThrift()
//{
// try
// {
// ThriftServiceImp business = new ThriftServiceImp();
// business.SendSetCarInfoEvent += SetCarinfo;
// XGL.Thrift.ThriftCommon thriftCommon = new XGL.Thrift.ThriftCommon();
// thriftCommon.Start(business, 7916);
// }
// catch (Exception ex)
// {
// MethodInfo method = (MethodInfo)MethodBase.GetCurrentMethod();
// Common.Log.Error(method.DeclaringType.FullName + "-" + method.Name + "\r\n" + ex.Message + "\r\n" + ex.StackTrace);
// }
//}
private string SetLocatorMaterialno(int locatorid, string materialo)
{
lock (StaticData.FindLocatorLock)
{
var locator = StaticData.LineCatchAreaList.FirstOrDefault(t => t.Id == locatorid);
if (locator == null)
{
return "未匹配到库位";
}
var locatorcars = StaticData.CarRealList.Where(t => t.LocatorId == locatorid || t.LocatorNodeId == locatorid);
if (locatorcars != null && locatorcars.Count() > 0 && locatorcars.FirstOrDefault().MaterialNo != materialo)
{
return "库区内有不同型号物料";
}
else
{
locator.MaterialNo = materialo;
locator.MaterialNm = StaticData.MateriaList.Where(t => t.MaterialNo == materialo).FirstOrDefault().MaterialNm;
DBService.SetLocatorMaterial(locatorid, materialo, locator.MaterialNm);
return "";
}
}
}
private string SetCarinfo(string carno, string materialno, string materialdesc, string locatorid, string outlocatorstate, string opdt)
{
CarRealInfo car = StaticData.CarRealList.FirstOrDefault(t => t.CarNo == carno);
if (car.IsOutLocator != 1)
{
int loid = Convert.ToInt32(locatorid);
var locator = StaticData.LineCatchAreaList.FirstOrDefault(t => t.Id == loid);
car.MaterialBarNo = materialdesc;
car.MaterialNo = materialno;
car.LocatorId = locator == null ? 0 : locator.Id;
car.LocatorArea = locator;
int state = Convert.ToInt32(outlocatorstate);
if (state == 1)
{
car.HadNumber = 0;
car.OffMaterialId = 0;
}
car.IsProOutLocator = state;
DBService.ModifyRealCarinfoRecord(car);
DBService.AddSystemLog("管理员手动修改小车信息", car);
return "小车状态修改操作完成";
}
else
{
return "小车正在出库,无法进行修改操作";
}
return "";
}
/// <summary>
/// 更新静态集合中的数据
/// </summary>
/// <param name="list"></param>
private void changeOrderPlanData(List<Orderplan> list)
{
lock (orderPlanLock)
{
//便利更新内存中的时序计划状态以及信息
foreach (Orderplan nplan in list)
{
if (StaticData.OrderPlanList.Count > 0)
{
foreach (Orderplan oplan in StaticData.OrderPlanList)
{
if (nplan.id == oplan.id)
{
oplan.orderId = nplan.orderId;
oplan.orderNo = nplan.orderNo;
oplan.timeOrderNo = nplan.timeOrderNo;
oplan.productCode = nplan.productCode;
oplan.productDesc = nplan.productDesc;
oplan.factoryNo = nplan.factoryNo;
oplan.matCode = nplan.matCode;
oplan.matDesc = nplan.matDesc;
oplan.amount = nplan.amount;
oplan.line = nplan.line;
oplan.orderStartDate = nplan.orderStartDate;
oplan.orderEndDate = nplan.orderEndDate;
oplan.planType = nplan.planType;
oplan.PlanOrder = nplan.PlanOrder;
oplan.planState = nplan.planState;
oplan.planStartTime = nplan.planStartTime;
oplan.upAmount = nplan.upAmount;
oplan.downAmount = nplan.downAmount;
}
else
{
StaticData.OrderPlanList.Add(nplan);
}
}
}
else
{
StaticData.OrderPlanList.Add(nplan);
}
}
}
}
///// <summary>
///// 定时更新生产计划列表
///// </summary>
//private void getPlanOrderList()
//{
// while (true)
// {
// //周六更新计划
// if (DateTime.Now.Hour == 0 && DateTime.Now.DayOfWeek == DayOfWeek.Saturday)
// {
// // 增加时序计划的 开始结束时间条件
// // List<Orderplan> list = DBService.getOrderPlanList("");
// //changeOrderPlanData(list);
// //设置库位默认物料类型
// // setPlanToLocator();
// Thread.Sleep(600000);
// }
// }
//}
/// <summary>
/// 根据webservice 控制 出库扫描队列
/// </summary>
private void ScanMaterialFromScan()
{
Logger logger = new Logger();
//从 mes获取扫描队列
while (true)
{
logger.Log("获取mes扫描信息");
try
{
lock (StaticData.offMaterialCarLock)
{
StaticData.OffMaterialList = DBService.getOffLineMaterialLists("");
//foreach(OffLineMaterialList off in StaticData.OffMaterialAreaList)
// {
// }
}
}
catch (Exception ex)
{
logger.Error(" 定时获取扫描信息接口异常:" + ex.Message + ex.StackTrace);
}
Thread.Sleep(2000);
}
}
///// <summary>
///// 根据webservice 控制 出库扫描队列
///// </summary>
//private void ScanMaterialFromMES()
//{
// Logger logger = new Logger();
// //从 mes获取扫描队列
// while (true)
// {
// logger.Log("获取mes扫描信息");
// try
// {
// //string bdt = DateTime.Now.AddMinutes(-10).ToString("yyyy-MM-dd HH:mm:ss");
// string edt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// //if (StaticData.OffMaterialAreaList.Count > 0)
// //{
// string bdt = DBService.GetLastTime().ToString("yyyy-MM-dd HH:mm:ss");
// //var enddata = StaticData.OffMaterialAreaList.LastOrDefault();
// // if (enddate != null)
// // {
// // bdt = enddate.ToString("yyyy-MM-dd HH:mm:ss");
// // }
// // }
// ////请求webservice ,向队列中插入扫描数据
// List<MesData> list = new List<MesData>();
// string zd_bh = "BD04";
// /***测试数据**/
// // DataTable dtmes = DBService.GetOffLineMaterialByMESView(zd_bh, bdt, edt);
// DataTable dtmes = null;// MESDBService.GetOffLineMaterialByMESView(zd_bh, bdt, edt);
// if (dtmes != null)
// {
// StringBuilder sb = new StringBuilder();
// foreach (DataRow datarow in dtmes.Rows)
// {
// lock (StaticData.offMaterialCarLock)
// {
// MesData offline = new MesData();
// offline.ProdCode = datarow["Prod_Code"].ToString();
// offline.materialNo = datarow["Prod_Code"].ToString();
// offline.Order = datarow["order_id"].ToString();
// offline.ProdDesc = datarow["xh_id"].ToString();
// offline.BarCode = datarow["sern"].ToString();
// offline.LineNo = datarow["line_code"].ToString();
// list.Add(offline);
// OffLineMaterialList offmaterial = new OffLineMaterialList();
// offmaterial.Number = 1;
// offmaterial.CreateTime = DateTime.Now;
// offmaterial.MaterialNo = offline.materialNo;
// offmaterial.MaterialDes = offline.ProdDesc;
// offmaterial.ProductBarNo = offline.BarCode;
// offmaterial.OrderCode = offline.Order;
// offmaterial.LineNo = offline.LineNo;
// offmaterial.IsOver = 0;
// int id = DBService.AddOffLineMaterialHistoryList(offmaterial);
// sb.Append(" \n ProdCode:" + offline.ProdCode + " materialNo:" + offline.materialNo + " Order:" + offline.Order + " ProdDesc:" + offline.ProdDesc + " BarCode:" + offline.BarCode);
// }
// }
// logger.Log("获取mes扫描信息数量:" + sb.ToString());
// sb = null;
// }
// else
// {
// logger.Log("获取mes扫描信息数量 数量为空:");
// }
// foreach (var data in list)
// {
// //记录mes获取记录数据
// //代码实现
// lock (StaticData.offMaterialCarLock)
// {
// OffLineMaterialList offmaterial = StaticData.OffMaterialAreaList.Where(t => t.MaterialNo == data.materialNo && t.Number < 0).OrderBy(t => t.CreateTime).FirstOrDefault();
// if (offmaterial != null)
// {
// offmaterial.Number += 1;
// ///如果当前物料配对数量补齐,删除队列数据
// if (offmaterial.Number == 0)
// {
// StaticData.OffMaterialAreaList.Remove(offmaterial);
// DBService.DeleteOffLineMaterial(offmaterial.Id);
// }
// }
// else
// {
// offmaterial = new OffLineMaterialList();
// offmaterial.Number = 1;
// offmaterial.CreateTime = DateTime.Now;
// offmaterial.MaterialNo = data.materialNo;
// offmaterial.MaterialDes = data.ProdDesc;
// offmaterial.ProductBarNo = data.BarCode;
// offmaterial.OrderCode = data.Order;
// offmaterial.LineNo = data.LineNo;
// offmaterial.IsOver = 0;
// int id = DBService.AddOffLineMaterialList(offmaterial);
// offmaterial.Id = id;
// //添加到出库队列
// StaticData.OffMaterialAreaList.Add(offmaterial);
// //记录数据库
// }
// }
// }
// }
// catch (Exception ex)
// {
// logger.Error(" 定时调用mes接口异常:" + ex.Message + ex.StackTrace);
// }
// Thread.Sleep(60000);
// }
//}
/// <summary>
/// 设置库位默认物料类型
/// </summary>
//private void setPlanToLocator()
//{
// Logger logger = new Logger();
// try
// {
// //根据计划选出产量最多的订单物料 ,按照库位设置的单品顺序排列
// var orderlist = StaticData.OrderPlanList.OrderByDescending(t => t.amount).ToList();
// /***测试数据***///只入1库
// var signarealist = StaticData.LineCatchAreaList.Where(t => t.AreaType == 4 && t.LineNo == "1").ToList();
// // var signarealist = StaticData.LineCatchAreaList.Where(t => t.AreaStorageType == 1&& t.AreaType == 4).ToList();
// DBService.CleartLineAreaMaterial("");
// int number = orderlist.Count > signarealist.Count ? signarealist.Count : orderlist.Count;
// for (int i = 0; i < number; i++)
// {
// var catcharea = StaticData.LineCatchAreaList.Where(t => t.Id == signarealist[i].Id).FirstOrDefault();
// var order = StaticData.OrderPlanList.Where(t => t.id == orderlist[i].id).FirstOrDefault();
// if (catcharea != null && order != null)
// {
// catcharea.MaterialNo = order.productCode;
// DBService.SetLineAreaMaterial(catcharea.Id, catcharea.MaterialNo,catcharea.MaterialNm);
// }
// }
// }
// catch (Exception ex)
// {
// logger.Error("订单计划获取失败" + ex.Message + ex.StackTrace);
// }
//}
}
}