using DataexchangeServer.Helper; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; namespace DataexchangeServer { public delegate void AppendTextCallBack(string text); public partial class frmMain : Form { private SQLHelper _sqlHelper; public List ListCount = new List(); public DateTime startTime; #region 默认起动软件frmMain() /// /// 默认起动软件 /// public frmMain() { InitializeComponent(); this.FormClosing += frmMain_FormClosing; this.SizeChanged += frmMain_SizeChanged; btnStart.Click += btnStart_Click; btnStop.Click += btnStop_Click; timer.Tick += timer_Tick; notifyIcon1.DoubleClick += notifyIcon1_DoubleClick; contextMenuStrip1.ItemClicked += contextMenuStrip1_ItemClicked; Initialize(); //btnStart_Click(null, null); } void frmMain_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("你确定要退出吗?", "广深软件", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK) { btnStop_Click(null, null); System.Environment.Exit(0); //退出所有的线程 } else e.Cancel = true; } #endregion #region 初始化数据 Initialize /// /// 初始化数据 /// void Initialize() { try { //BASE64加解密方式 //_sqlHelper = new SQLHelper( // Encoding.Default.GetString(Convert.FromBase64String( // ConfigurationManager.ConnectionStrings["conn"].ConnectionString))); //Int32 TimingMailInterval =Convert.ToInt32(ConfigurationManager.AppSettings["TimingMailInterval"]); //Int16 MaxThreads = Convert.ToInt16(ConfigurationManager.AppSettings["MaxThreads"]); //Int16 MinThreads = Convert.ToInt16(ConfigurationManager.AppSettings["MinThreads"]); string conn = ConfigurationManager.ConnectionStrings["conn"].ConnectionString; conn = SecurityHelper.Decrypt(conn); _sqlHelper = new SQLHelper(conn); Int32 TimingMailInterval = Convert.ToInt32(ConfigurationManager.AppSettings["TimingMailInterval"]); Int16 MaxThreads = Convert.ToInt16(ConfigurationManager.AppSettings["MaxThreads"]); Int16 MinThreads = Convert.ToInt16(ConfigurationManager.AppSettings["MinThreads"]); string conText = ConfigurationManager.AppSettings["thisText"]; this.Text = conText; notifyIcon1.Text = conText; nudminThreads.Value = MinThreads; nudmaxThreads.Value = MaxThreads; timeInterval.Value = TimingMailInterval; timer.Interval = TimingMailInterval; //一定要先设定最小线程池,再设置最大线程池,否则设置无效 ThreadPool.SetMinThreads(MinThreads, MinThreads); ThreadPool.SetMaxThreads(MaxThreads, MaxThreads); } catch (Exception exception) { MessageBox.Show(exception.Message); Application.Exit(); } } #endregion #region 轮询执行void timer_Tick(object sender, EventArgs e) /// /// 轮询执行 /// /// /// void timer_Tick(object sender, EventArgs e) { if (btnStop.Enabled) { AllocationThread(); int Sleep = ListCount.Count(a => a.state == State.Sleep); int Alive = ListCount.Count(a => a.state == State.Alive); int Finish = ListCount.Count(a => a.state == State.Finish); AddThreadPoolState(string.Format("排队的队列数量:{0},正在执行的队列:{1},已完成的队列:{2}", Sleep, Alive, Finish)); var _list = ListCount.Where(a => a.state == State.Finish).ToList(); if (_list.Count > 500) ListCount.RemoveAll(a => a.state == State.Finish); TimeSpan ts = DateTime.Now - startTime; lblTotalTimes.Text = string.Format(@"Total Times : {0}天{1}时{2}分{3}秒", ts.Days, ts.Hours, ts.Minutes, ts.Seconds); } } #endregion #region 调用线程方法 void AllocationThread() /// /// 调用线程方法 /// public void AllocationThread() { //long s =(DateTime.Now - preTime).Seconds; var _list = ListCount.Where(a => a.state == State.Alive || a.state == State.Sleep).ToList(); if (_list.Count > 0) return; string msg = string.Empty; try { msg = "query data 1 ;"; //preTime = DateTime.Now; string sqlstr = string.Format(@";with cte as ( select top 1000 case when task_name in ('TB_ERPTOMES_BM', 'TB_ERPTOMES_GW', 'TB_ERPTOMES_RY', 'TB_ERPTOMES_WF', 'TB_ERPTOMES_WL', 'TB_ERPTOMES_KH', 'TB_ERPTOMES_GYS', 'TB_ERPTOMES_CK', 'TB_ERPTOMES_GX', 'TB_ERPTOMES_BOM', 'TB_ERPTOMES_TDL') then 1 when task_name in ('TB_ERPTOMES_XCK', 'TB_ERPTOMES_QCK', 'TB_ERPTOMES_TH', 'TB_ERPTOMES_CG', 'TB_ERPTOMES_FHTZ', 'TB_ERPTOMES_WW', 'TB_ERPTOMES_TL', 'TB_ERPTOMES_DW', 'TB_ERPTOMES_TH_CONFIRM', 'TB_ERPTOMES_GDRK', 'TB_ERPTOMES_WCK', 'TB_ERPTOMES_CGDH', 'TB_ERPTOME_KHWL', 'TB_ERPTOMES_XSTH', 'TB_ERPTOMES_CGTH') then 2 when task_name in ('TB_MESTOERP_WGRK', 'TB_MESTOERP_WWRK', 'TB_MESTOERP_QTRK', 'TB_MESTOERP_CPRK', 'TB_MESTOERP_SLTZ', 'TB_MESTOERP_CGRK', 'TB_MESTOERP_XSCK', 'TB_MESTOERP_DD', 'TB_MESTOERP_PYPK', 'TB_MESTOERP_LL', 'TB_MESTOERP_SCTL', 'TB_MESTOERP_WGTL', 'TB_MESTOERP_WGTL', 'TB_MESTOERP_GDRK', 'TB_MESTOERP_ICMO', 'TB_MESTOERP_SLSH', 'TB_MESTOERP_SCDDXD', 'TB_MESTOERP_WLQDBB', 'TB_MESTOERP_TransferIn', 'TB_MESTOERP_WLQDBBV2', 'TB_MESTOERP_WWDDXD', 'TB_MESTOERP_WWCG', 'TB_MESTOERP_WWLL', 'TB_MESTOERP_XSTH' ) then 3 else 4 end gp,* from SYSDEC WITH(nolock) where states='NEW' AND descript IN ('用料清单变更','高冲物料变更','物料信息表','仓库信息表','部门信息表','员工信息表','部门信息表','领料单','委外领料单','销售退货单', '成品入库单','采购入库单','收料通知单','生产订单下达','物料客户对应表','采购订单','发货通知单','销售退货','采购退货','销售出库单','生产领料单','分步调入单','生产退料单','直接调拨单','生产补料单','委外订单','其他入库单','其他出库单','供应商信息表','委外订单下达','委外下推采购') --and task_name='TB_ERPTOMES_CG' order by create_time union all select top 10 3 gp,* from SYSDEC WITH(nolock) where task_id IN ( SELECT task_ID FROM ( SELECT task_ID, data, task_name, create_time, ROW_NUMBER() OVER (PARTITION BY data, task_name ORDER BY create_time DESC) AS rn FROM sysdec where states='NEW' AND descript IN ('生产投料单') ) AS SubQuery WHERE rn = 1) union all select top 1000 case when task_name in ('TB_ERPTOMES_BM', 'TB_ERPTOMES_GW', 'TB_ERPTOMES_RY', 'TB_ERPTOMES_WF', 'TB_ERPTOMES_WL', 'TB_ERPTOMES_KH', 'TB_ERPTOMES_GYS', 'TB_ERPTOMES_CK', 'TB_ERPTOMES_GX', 'TB_ERPTOMES_BOM', 'TB_ERPTOMES_TDL') then 1 when task_name in ('TB_ERPTOMES_XCK', 'TB_ERPTOMES_QCK', 'TB_ERPTOMES_TH', 'TB_ERPTOMES_CG', 'TB_ERPTOMES_FHTZ', 'TB_ERPTOMES_WW', 'TB_ERPTOMES_TL', 'TB_ERPTOMES_DW', 'TB_ERPTOMES_TH_CONFIRM', 'TB_ERPTOMES_GDRK', 'TB_ERPTOMES_WCK', 'TB_ERPTOMES_CGDH', 'TB_ERPTOME_KHWL', 'TB_ERPTOMES_XSTH', 'TB_ERPTOMES_CGTH') then 2 when task_name in ('TB_MESTOERP_WGRK', 'TB_MESTOERP_WWRK', 'TB_MESTOERP_QTRK', 'TB_MESTOERP_CPRK', 'TB_MESTOERP_SLTZ', 'TB_MESTOERP_CGRK', 'TB_MESTOERP_XSCK', 'TB_MESTOERP_DD', 'TB_MESTOERP_PYPK', 'TB_MESTOERP_LL', 'TB_MESTOERP_SCTL', 'TB_MESTOERP_GDRK', 'TB_MESTOERP_ICMO', 'TB_MESTOERP_SLSH', 'TB_MESTOERP_SCDDXD', 'TB_MESTOERP_WLQDBB', 'TB_MESTOERP_WLQDBBV2', 'TB_MESTOERP_TransferIn', 'TB_MESTOERP_WWDDXD', 'TB_MESTOERP_WWCG', 'TB_MESTOERP_XSTH') then 3 else 4 end gp,* from SYSDEC WITH(nolock) where states='FAIL' and retry_times<1 and CREATE_TIME>'2024-06-14 13:13:34' AND descript IN ('用料清单变更','高冲物料变更','物料信息表','仓库信息表','部门信息表','员工信息表','生产投料单','部门信息表','领料单','成品入库单','采购入库单','生产订单下达','物料客户对应表','采购订单','发货通知单','销售出库单','分步调入单','生产领料单','生产退料单','生产补料单','供应商信息表','委外订单下达','委外下推采购') and task_name not in ('TB_MESTOERP_WGRK', 'TB_MESTOERP_WWRK', 'TB_MESTOERP_QTRK', 'TB_MESTOERP_CPRK', 'TB_MESTOERP_SLTZ', 'TB_MESTOERP_CGRK', 'TB_MESTOERP_XSCK', 'TB_MESTOERP_DD', 'TB_MESTOERP_PYPK', 'TB_MESTOERP_LL', 'TB_MESTOERP_SCTL', 'TB_MESTOERP_ICMO', 'TB_MESTOERP_GDRK', 'TB_MESTOERP_SLSH', 'TB_MESTOERP_WLQDBB', 'TB_MESTOERP_WLQDBBV2', 'TB_MESTOERP_TransferIn', 'TB_MESTOERP_WWDDXD', 'TB_MESTOERP_WWCG') ) select rtrim(gp)+'-'+rtrim(rank() over(partition by gp order by data)) gcp,* from cte order by 1,create_time"); DataTable tbThread = _sqlHelper.ExecuteDataTable(sqlstr); DataTable tbgroup = tbThread.DefaultView.ToTable(true, new string[1] { "gcp" }); //对线程ID进行分组 msg = msg + "begin to allocation thread 2 ; "; foreach (DataRow r in tbgroup.Rows) { string gcp = r["gcp"].ToString(); Allocation EQ = new Allocation(); //EQ.task_id = r["task_id"].ToString(); //EQ.ID = r["data"].ToString(); EQ.strStartTime = DateTime.Now; EQ.Name = gcp; EQ.WriteLog += AddStatusText; EQ.WriteErrorLog += AddErrorText; SetTableByThreadID(gcp, tbThread, ref EQ.tbQueue); EQ.tbQueue.AcceptChanges(); ListCount.Add(EQ); ThreadPool.QueueUserWorkItem(EQ.Execute); } } catch (Exception ex) { JSONHelper.WriteToFile(msg + " 调用线程时异常:" + ex.Message); AddErrorText(msg + " 调用线程时异常:" + ex.Message); } } #endregion #region 数据行复制到数据表中void SetTableByThreadID(string tid, DataTable dataTb, ref DataTable target) /// /// 数据行复制到数据表中 /// /// /// /// private void SetTableByThreadID(string tid, DataTable dataTb, ref DataTable target) { DataRow[] rowsArray = dataTb.Select("gcp='" + tid + "'", "create_time"); if (rowsArray.Length == 0) return; target.Rows.Clear(); foreach (DataRow row in rowsArray) { DataRow newrow = target.NewRow(); foreach (DataColumn dc in dataTb.Columns) { if ("gcp;gp".Contains(dc.ColumnName)) continue; newrow[dc.ColumnName] = row[dc.ColumnName]; } target.Rows.Add(newrow); } } #endregion #region 启动服务void btnStart_Click(object sender, EventArgs e) /// /// 启动服务 /// /// /// private void btnStart_Click(object sender, EventArgs e) { ApiGlobal.Init(); AllocationThread(); btnStop.Enabled = true; btnStart.Enabled = false; timer.Enabled = false; timer.Start(); startTime = DateTime.Now; } #endregion #region 停止服务void btnStop_Click(object sender, EventArgs e) /// /// 停止服务 /// /// /// private void btnStop_Click(object sender, EventArgs e) { btnStop.Enabled = false; btnStart.Enabled = true; timer.Stop(); } #endregion #region 增加线程池信息void AddThreadPoolState(string message) /// /// 增加线程池信息 /// /// private void AddThreadPoolState(string message) { if (lsbPoolState.InvokeRequired) { AppendTextCallBack method = AddThreadPoolState; base.Invoke(method, new object[] { message }); } else { if (lsbPoolState.Items.Count > 10) { lsbPoolState.Items.Clear(); } //lsbPoolState.Items.Add(string.Format(message)); lsbPoolState.Items.Insert(0, string.Format(message)); lsbPoolState.Width = 350; lsbPoolState.ItemHeight = 10; } } #endregion #region 增加线程信息void AddStatusText(string message) /// /// 增加线程信息 /// /// private void AddStatusText(string message) { if (rtbStatus.InvokeRequired) { AppendTextCallBack method = AddStatusText; base.Invoke(method, new object[] { message }); } else { if (rtbStatus.Items.Count > 30) { rtbStatus.Items.Clear(); } //rtbStatus.Items.Add(string.Format(message)); rtbStatus.Items.Insert(0, string.Format(message)); rtbStatus.Width = 600; rtbStatus.ItemHeight = 100; } } #endregion #region 增加错误信息void AddErrorText(string message) /// /// 增加错误信息 /// /// private void AddErrorText(string message) { if (lsbErrorMsg.InvokeRequired) { AppendTextCallBack method = AddErrorText; base.Invoke(method, new object[] { message }); } else { if (lsbErrorMsg.Items.Count > 6) { lsbErrorMsg.Items.Clear(); } //lsbErrorMsg.Items.Add(string.Format(message)); lsbErrorMsg.Items.Insert(0, message);//string.Format(message) lsbErrorMsg.Width = 600; lsbErrorMsg.ItemHeight = 30; } } #endregion #region 托盘程序 void frmMain_SizeChanged(object sender, EventArgs e) { if(WindowState == FormWindowState.Minimized) { this.ShowInTaskbar = false; notifyIcon1.Visible = true; } } void notifyIcon1_DoubleClick(object sender, EventArgs e) { if(WindowState == FormWindowState.Minimized) { WindowState = FormWindowState.Normal; this.Activate(); this.ShowInTaskbar = true; notifyIcon1.Visible = false; } } void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if(e.ClickedItem == showInTaskbar) { if (WindowState == FormWindowState.Minimized) { WindowState = FormWindowState.Normal; this.Activate(); this.ShowInTaskbar = true; notifyIcon1.Visible = false; } } else if (e.ClickedItem == exitWindow) { btnStop_Click(null, null); System.Environment.Exit(0); //退出所有的线程 } } #endregion } }