杨前锦
2025-07-07 c8f338feee0b6003d8f069b1d37fd9b90dd1b7f4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using HH.WCS.Mobox3.SXJK.api;
using HH.WCS.Mobox3.SXJK.core;
using HH.WCS.Mobox3.SXJK.device;
using HH.WCS.Mobox3.SXJK.process;
using HH.WCS.Mobox3.SXJK.util;
using HH.WCS.Mobox3.SXJK.wms;
using Microsoft.Owin.Hosting;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Topshelf;
using Monitor = HH.WCS.Mobox3.SXJK.core.Monitor;
 
namespace HH.WCS.Mobox3.SXJK
{
    internal class Program
    {
        static void Main(string[] args) {
 
            
            Settings.Init();
            //1.0 开启api
            Startup();
            //2.0 开启tcp
            StartTcp();
           
            //3.0 开启线程
            var rc = HostFactory.Run(x => {
                x.Service<WorkThread>(s => {
                    s.ConstructUsing(name => new WorkThread());
                    s.WhenStarted(tc => tc.Start());
                    s.WhenStopped(tc => tc.Stop());
                });
                x.RunAsLocalSystem();
 
                x.SetDescription("hh123");
                x.SetDisplayName("hh123.wms");
                x.SetServiceName("hh123.wms");
            });
 
            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
            Environment.ExitCode = exitCode;
        }
 
        private static void Startup() {
            Console.WriteLine("Startup ApiController");
            Task.Run(() => {
                //var url = "http://192.168.1.87:8901";//{SettingHelper.port}
                var url = $"http://+:{Settings.port}";//
                Console.WriteLine(url);
                using (WebApp.Start<Startup>(url)) {
                    Console.WriteLine("Running on {0}", url);
                    Console.ReadLine();
                }
            });
        }
        private static void StartTcp() {
            //new TcpServer("192.168.1.87");
            var host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (var ip in host.AddressList) {
                if (ip.AddressFamily == AddressFamily.InterNetwork) {
                    Console.WriteLine($"ip= {ip.ToString()}");
                    new TcpServer(ip.ToString());
                }
            }
        }
 
        public class WorkThread
        {
            public void Start() {
                List<Task> tasks = new List<Task>();
                //添加任务推送线程
                tasks.Add(GetTask(WCSCore.Dispatch));
                // 监测输送线
                tasks.Add(GetTask(Monitor.MonitorDevice));
                // 监测出库同步单
                tasks.Add(GetTask(Monitor.Monitor0utStockOrder));
                // 监测移库同步单
                tasks.Add(GetTask(Monitor.MonitorShiftStockOrder));
                // 监测抽检同步单
                tasks.Add(GetTask(Monitor.MonitorOutStockSpotCheckOrder));
                tasks.Add(GetTask(Monitor.MonitorInspectedSpotCheckOrder));
                // 扫描不合格品
                tasks.Add(GetTask(Monitor.scanAreaUnacceptedProduct));
                // (反馈失败的数据)重复反馈上游系统  10s
                tasks.Add(GetTask(Monitor.feedbackUpstreamSystem,10000));
 
                // 对连接失败的plc设备进行重连
                tasks.Add(GetTask(Monitor.PlcAgainLink, 600000));
                Task.WaitAll(tasks.ToArray());
            }
            public void Stop() { Console.WriteLine("work stopped"); }
            private Task GetTask(Action action, int sleepTime = 3000)
            {
                var task = Task.Run(() => {
                    while (true)
                    {
                        try
                        {
                            action();
                        }
                        catch (Exception ex)
                        {
                            LogHelper.Error(ex.Message, ex);
                        }
                        Thread.Sleep(sleepTime);
                    }
                });
                return task;
            }
        }
    }
}