#
lty
昨天 276d837c0bb808e6d93ac7c7ba6abe654c75552e
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
package com.zy.asrs.controller;
 
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.AppAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.param.ArmPrecomputeParam;
import com.zy.asrs.service.OpenService;
import com.zy.asrs.service.impl.WrkMastServiceImpl;
import com.zy.common.web.BaseController;
import com.zy.core.cache.RgvStatusCache;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.SiemensCrnThread;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
 
import javax.servlet.http.HttpServletRequest;
import java.util.*;
 
import com.zy.asrs.entity.param.TaskCreateParam;
 
/**
 * Created by vincent on 2024/10/16
 */
@Slf4j
@RestController
@RequestMapping("open/")
public class OpenController extends BaseController {
 
    private static final boolean auth = true;
    public static final ArrayList<String> APP_KEY_LIST = new ArrayList<String>() {{
        add("ea1f0459efc02a79f046f982767939ae");
    }};
 
    @Autowired
    private OpenService openService;
 
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkMastServiceImpl wrkMastService;
 
    /**
     * 添加出库单
     */
    @PostMapping("/task/cs/down/default/v1")
    @AppAuth(memo = "WCS任务下发")
    public synchronized R wcsTaskDistribution(@RequestHeader(required = false) String appkey,
                                              @RequestBody ArmPrecomputeParam param,
                                              HttpServletRequest request) {
        try{
            auth(appkey, param, request);
        } catch (Exception e){
            return new R(403,e.getMessage());
        }
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
//        if (Cools.isEmpty(param.getTaskNo())) {
//            return R.error("工作号[taskNo]不能为空");
//        }
//        if (Cools.isEmpty(param.getStartSta()) || param.getStartSta$()==0) {
//            return R.error("起点[startSta]不能为空");
//        }
//        if (Cools.isEmpty(param.getEndSta())  || param.getEndSta$()==0) {
//            return R.error("终点[endSta]不能为空");
//        }
 
        return R.ok().add(param);
    }
 
    /**
     * 设备状态
     */
    @PostMapping("/deviceStatus")
    @AppAuth(memo = "设备状态获取")
    public R deviceStatus(
            @RequestHeader(required = false) String appkey,
            HttpServletRequest request) {
 
        try {
            auth(appkey, null, request);
        } catch (Exception e) {
            return new R(403, e.getMessage());
        }
 
        // 1. 站点
        List<Map<String, Object>> devList = new ArrayList<>();
        if (slaveProperties.getDevp() != null) {
            for (DevpSlave devpSlave : slaveProperties.getDevp()) {
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devpSlave.getId());
                if (devpThread != null && devpThread.getStation() != null) {
                    for (StaProtocol staProtocol : devpThread.getStation().values()) {
                        Map<String, Object> dev = new HashMap<>();
                        dev.put("devNo", staProtocol.getSiteId());
                        dev.put("inEnable", staProtocol.isInEnable() ? "1" : "0");
                        dev.put("outEnable", staProtocol.isOutEnable() ? "1" : "0");
                        dev.put("autoing", staProtocol.isAutoing() ? "1" : "0");
                        dev.put("loading", staProtocol.isLoading() ? "1" : "0");
                        dev.put("wrkNo", staProtocol.getWorkNo());
                        dev.put("barcode", staProtocol.getBarcode());
                        dev.put("devErr", staProtocol.getErrorDev$());
                        dev.put("devErrM", staProtocol.getExceptions());
                        devList.add(dev);
                    }
                }
            }
        }
        devList.sort(Comparator.comparingInt(m -> (Integer) m.get("devNo")));
 
        // 2. 堆垛机
        List<Map<String, Object>> crnList = new ArrayList<>();
        if (slaveProperties.getCrn() != null) {
            for (CrnSlave crnSlave : slaveProperties.getCrn()) {
                SiemensCrnThread crnThread = (SiemensCrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId());
                if (crnThread != null && crnThread.getCrnProtocol() != null) {
                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                    Map<String, Object> crn = new HashMap<>();
                    crn.put("crnNo", crnProtocol.getCrnNo());
                    crn.put("crnNoH", crnProtocol.getCrnNo());
                    crn.put("crnSts", crnProtocol.getMode());
                    crn.put("wrkNo", crnProtocol.getTaskNo());
                    crn.put("crnErr", crnProtocol.getAlarm());
                    crn.put("crnErrM", crnProtocol.getExceptions());
                    WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",crnProtocol.getTaskNo()));
                    crn.put("frmLocno",wrkMast != null ? wrkMast.getSourceLocNo():null);
                    crn.put("frmSta",wrkMast != null ? wrkMast.getSourceStaNo():0);
                    crn.put("toSta", wrkMast != null? wrkMast.getStaNo():0);
                    crn.put("toLocno", wrkMast != null ? wrkMast.getLocNo():null);
                    crnList.add(crn);
                }
            }
        }
        crnList.sort(Comparator.comparingInt(m -> (Integer) m.get("crnNo")));
 
        // 3. 穿梭车
        List<Map<String, Object>> steList = new ArrayList<>();
        Map<Integer, RgvProtocol> rgvMap = RgvStatusCache.getAllRgvStatus();
        if (rgvMap != null) {
            for (RgvProtocol rgvProtocol : rgvMap.values()) {
                Map<String, Object> ste = new HashMap<>();
                ste.put("steNo", rgvProtocol.getRgvNo());
                ste.put("crnSts", rgvProtocol.getStatusType() != null ? rgvProtocol.getStatusType().id : 1);
                ste.put("wrkNo", rgvProtocol.getTaskNo());
                ste.put("steErr", rgvProtocol.getAlarm$());
                ste.put("steErrM", rgvProtocol.getAlarmM());
                steList.add(ste);
            }
        }
        steList.sort(Comparator.comparingInt(m -> (Integer) m.get("steNo")));
 
        R r =  R.ok();
        r.put("devList", devList);
        r.put("crnList", crnList);
        r.put("steList", steList);
        return r;
    }
 
 
 
    /**
     * 任务下发
     */
    @PostMapping("/taskCreate")
    @AppAuth(memo = "任务下发")
    public R taskCreate(@RequestHeader(required = false) String appkey,
                        @RequestBody TaskCreateParam param,
                        HttpServletRequest request) {
        try {
            auth(appkey, param, request);
        } catch (Exception e) {
            return new R(403, e.getMessage());
        }
 
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        
        if (Cools.isEmpty(param.getTaskNo())) {
            return R.error("工作号[taskNo]不能为空");
        }
        if (Cools.isEmpty(param.getBarcode())) {
             return R.error("容器编码[barcode]不能为空");
        }
        if (Cools.isEmpty(param.getStartPoint())) {
             return R.error("起点[startPoint]不能为空");
        }
        if (Cools.isEmpty(param.getTargetPoint())) {
             return R.error("目标点[targetPoint]不能为空");
        }
 
        try {
            boolean result = openService.taskCreate(param);
            if (result) {
                return R.ok("任务下发成功");
            } else {
                return R.error("任务下发失败");
            }
        } catch (Exception e) {
            log.error("任务下发异常", e);
            return R.error("任务下发异常: " + e.getMessage());
        }
    }
 
    private void auth(String appkey, Object obj, HttpServletRequest request) {
//        log.info("{}接口被访问;appkey:{};请求数据:{}", "open/sensorType/list/auth/v1", appkey, JSON.toJSONString(obj));
        request.setAttribute("cache", obj);
        if (!auth) {
            return;
        }
        if (Cools.isEmpty(appkey)) {
            throw new CoolException("认证失败,请确认appkey无误!");
        }
        if (!APP_KEY_LIST.contains(appkey)) {
            throw new CoolException("认证失败,请确认appkey无误!");
        }
    }
 
 
}