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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
 
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
 
using HH.WCS.Mobox3.AnGang.core;
using HH.WCS.Mobox3.AnGang.models;
using HH.WCS.Mobox3.AnGang.util;
 
using Newtonsoft.Json;
 
using SqlSugar;
 
using static HH.WCS.Mobox3.AnGang.api.ApiModel;
using static HH.WCS.Mobox3.AnGang.api.OtherModel;
using static HH.WCS.Mobox3.AnGang.dispatch.NDC;
 
namespace HH.WCS.Mobox3.AnGang.api {
    /// <summary>
    /// 第三方调用的接口
    /// </summary>
    [RoutePrefix("api")]
    public class WmsController : System.Web.Http.ApiController {
        [HttpGet]
        [Route("GetKanbanAgvState")]
        public KanbanAgvState GetKanbanAgvState() {
            LogHelper.Info("触发API:GetKanbanAgvState:看板获取AGV状态", "API");
 
            var res = WCSCore.AgvState;
            var resName = string.Empty;
            switch (res) {
                case "in_system": resName = "系统内"; break;
                case "out_system": resName = "系统外"; break;
                case "online": resName = "在线"; break;
                case "offline": resName = "离线"; break;
                case "ready": resName = "就绪"; break;
                case "not_ready": resName = "未就绪"; break;
                case "in_dispatc": resName = "调度中"; break;
                case "out_dispatch": resName = "调度外"; break;
                case "running": resName = "运行中"; break;
                case "not_running": resName = "未运行"; break;
                default: resName = "未知状态"; break;
            }
            return new KanbanAgvState { AgvState = resName };
        }
 
        [HttpGet]
        [Route("GetLocInfo")]
        public WmsModel.tbData GetLocInfo() {
            return WmsService.GetLocInfo();
        }
 
        [HttpGet]
        [Route("GetLocStateInfo")]
        public WmsModel.LocStateInfo GetLocStateInfo() {
            return WmsService.GetLocStateInfo();
        }
 
        [HttpGet]
        [Route("GetLocCountInfo")]
        public WmsModel.LocCountInfo GetLocCountInfo() {
            return WmsService.GetLocCountInfo();
        }
    }
 
    public class WmsService {
        public static WmsModel.tbData GetLocInfo() {
            var db = new SqlHelper<object>().GetInstance();
            try {
                var locs = db.Queryable<TN_Location>().ToList();
                var haveCgDetailCntrList = db.Queryable<TN_CG_Detail>().Select(d => d.S_CNTR_CODE).ToList();
                var emptyLocs = db.Queryable<TN_Location, TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
                    .Where((l, c) => !haveCgDetailCntrList.Contains(c.S_CNTR_CODE)).Select((l, c) => l.S_CODE).ToList();
 
                return new WmsModel.tbData {
                    data = locs.Select(l => new WmsModel.tbDataOne {
                        value = $"{l.N_ROW}-{l.N_COL}-{l.N_LAYER}",
                        state = l.N_LOCK_STATE == 3 ? "货位锁" :
                                l.N_CURRENT_NUM == 0 ? "空货位" :
                                emptyLocs.Contains(l.S_CODE) ? "空托盘" : "满托盘"
                    }).ToList()
                };
            }
            catch (System.Exception) {
                return new WmsModel.tbData();
            }
        }
        public static WmsModel.LocStateInfo GetLocStateInfo() {
            var db = new SqlHelper<object>().GetInstance();
            try {
                //var locs = db.Queryable<TN_Location>().ToList();
                var result = db.Queryable<TN_Location>()
                    .Select(l => new WmsModel.LocState {
                        Code = l.S_CODE,
                        Row = l.N_ROW,
                        Column = l.N_COL,
                        Layer = l.N_LAYER,
                        CurrentNum = l.N_CURRENT_NUM,
                        LockState = l.N_LOCK_STATE,
                    }).ToList();
 
                return new WmsModel.LocStateInfo {
                    //LocStates = locs.Select(l => new WmsModel.LocState {
                    //    Code = l.S_CODE,
                    //    Row = l.N_ROW,
                    //    Column = l.N_COL,
                    //    Layer = l.N_LAYER,
                    //    CurrentNum = l.N_CURRENT_NUM,
                    //    LockState= l.N_LOCK_STATE,
                    //}).ToList(),
                    LocStates = result
                };
            }
            catch (System.Exception) {
                return new WmsModel.LocStateInfo();
            }
        }
 
        public static WmsModel.LocCountInfo GetLocCountInfo() {
            var db = new SqlHelper<object>().GetInstance();
            try {
                var result = db.Queryable<TN_Location>()
                    .GroupBy(loc => new { loc.N_ROW, loc.N_LAYER }) // 按行和层分组
                    .Select(loc => new WmsModel.LocCount {
                        Row = loc.N_ROW,          // 行
                        Layer = loc.N_LAYER,      // 层
                        Count = SqlFunc.AggregateSum(loc.N_CURRENT_NUM) // 累计 N_CURRENT_NUM 数量
                    })
                    .ToList();
                return new WmsModel.LocCountInfo {
                    locCounts= result
                };
            }
            catch (System.Exception) {
                return new WmsModel.LocCountInfo();
            }
        }
    }
 
    public class WmsModel {
        public class LocStateInfo {
            public List<LocState> LocStates = new List<LocState>();
        }
 
        public class LocState {
            public string Code { get; set; }
            public int Row { get; set; }
            public int Column { get; set; }
            public int Layer { get; set; }
            public int LockState { get; set; }
            public int CurrentNum { get; set; }
        }
 
        public class LocCountInfo {
            public List<LocCount> locCounts= new List<LocCount>();
        }
 
        public class LocCount {
            public int Row { get; set; }
            public int Layer { get; set; }
            public int Count { get; set; }
        }
 
        public class tbData {
            public List<tbDataOne> data = new List<tbDataOne>();
        }
 
        public class tbDataOne {
            public string value { get; set; }
            public string state { get; set; }
        }
    }
    
}