CZT
2023-11-27 c206acfaedc69c390fb67daa81bc686f58a212ef
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
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
package com.ld.igds.n2.manager;
 
import com.ld.igds.common.CoreCommonService;
import com.ld.igds.common.CoreSerService;
import com.ld.igds.constant.BizType;
import com.ld.igds.constant.Constant;
import com.ld.igds.io.RemoteControlService;
import com.ld.igds.io.RemoteManager;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.request.DeviceAutoControlRequest;
import com.ld.igds.io.request.DeviceControlRequest;
import com.ld.igds.io.request.ExeDevice;
import com.ld.igds.io.response.DeviceControlResponse;
import com.ld.igds.models.DepotConf;
import com.ld.igds.models.DeviceSer;
import com.ld.igds.models.N2IntelConf;
import com.ld.igds.models.N2IntelTask;
import com.ld.igds.n2.N2Util;
import com.ld.igds.n2.dto.N2AutoData;
import com.ld.igds.n2.dto.N2Param;
import com.ld.igds.n2.service.CoreN2Service;
import com.ld.igds.n2.service.HN2Service;
import com.ld.igds.util.ContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
 
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
 
 
/**
 * 自动气调执行-针对的是气调动作执行,包括充氮、均氮和相关设备操作
 */
@Slf4j
@Component
public class N2AutoManager {
 
    @Resource
    private CoreCommonService coreCommonService;
    @Resource
    private RemoteManager remoteManager;
    @Resource
    private CoreSerService coreSerService;
    @Resource
    private CoreN2Service coreN2Service;
    @Resource
    private HN2Service hn2Service;
 
 
    /**
     * 根据自动模式配置执行气调,通过创建气调任务信息进行操作
     *
     * @param autoData
     * @param param
     * @return
     */
    public DeviceControlResponse exeAuto(N2AutoData autoData, N2Param param) {
        String result;
        if (N2Util.EXE_MODE_02.equals(autoData.getExeMode())) {
            result = exeAutoActionBySer(autoData, param);
        } else {
            //result = exeAutoActionBySys(autoData, param);
            //TODO 系统暂停系统执行模式
            result = "注意:系统暂停系统端执行气调功能,请联系管理员调整为控制柜端执行";
        }
        if (null == result) {
            return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), "命令发送成功");
        }
        return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), result);
    }
 
 
    /**
     * 控制柜执行
     *
     * @param autoData
     * @param param
     * @return
     */
    public String exeAutoActionBySer(N2AutoData autoData, N2Param param) {
        try {
            DepotConf depotConf = coreCommonService.getCacheDepotConf(param.getCompanyId(), param.getDepotId());
            if (null == depotConf) {
                return "当前仓库没有获取到控制柜配置信息,无法执行,请联系管理员";
            }
            //获取粮情分机的主控信息
            DeviceSer ser = coreSerService.getCacheSer(param.getCompanyId(), depotConf.getGrainSer());
//            if (null == ser || Constant.YN_N.equals(ser.getStatus())) {
//                return "当前仓库控制柜未配置或者不在线,无法执行,请联系管理员";
//            }
 
            DeviceAutoControlRequest request = new DeviceAutoControlRequest();
            request.setDepotId(param.getDepotId());
            request.setCompanyId(param.getCompanyId());
            request.setBizType(BizType.N2.getCode());
            request.setModeTag(autoData.getModeTag());
            request.setSerId(ser.getId());
            request.setSerName(ser.getName());
            request.setModeClose(param.getModeClose());
            request.setIp(ser.getIp());
            request.setPort(ser.getPort());
            request.setDepotName(depotConf.getDepotName());
            request.setProtocol(ser.getProtocol());
 
            RemoteControlService remoteControlService = remoteManager.getRemoteControlService(ser.getProtocol());
 
            if (null == remoteControlService) {
                return "当前仓库控制分机协议没有实现,系统无法执行,请联系管理员!";
            }
            DeviceControlResponse response = remoteControlService.n2AutoControl(request);
            if (!OrderRespEnum.ORDER_SUCCESS.getCode().equals(response.getCode())) {
                return "-" + response.getMsg();
            } else {
                this.addIntelTask(autoData, request);
            }
        } catch (Exception e) {
            log.error(e.getMessage());
            return "后台执行出错:" + e.getMessage();
        }
 
        return null;
    }
 
    /**
     * 新增任务信息,同时添加到缓存中
     *
     * @param autoData
     * @param request
     */
    private void addIntelTask(N2AutoData autoData, DeviceAutoControlRequest request) {
 
        //增加执行任务信息
        N2IntelTask task = new N2IntelTask();
        task.setId(ContextUtil.getUUID());
        task.setStart(new Date());
        task.setAutoName(autoData.getName());
        task.setAutoId(autoData.getId());
        task.setOrderId(request.getOrderId());
        task.setCompanyId(autoData.getCompanyId());
        task.setDepotId(request.getDepotId());
        task.setDeptId(autoData.getDeptId());
        task.setExeMode(autoData.getExeMode());
        task.setModeTag(autoData.getModeTag());
        task.setUpdateUser(ContextUtil.getLoginUserCName());
 
        hn2Service.saveIntelTask(task);
 
 
        //添加到缓存
        task.setAutoControlRequest(request);
        coreN2Service.addIntelTaskCache(task);
    }
 
    /**
     * 新增任务信息,同时添加到缓存中
     *
     * @param autoData
     * @param request
     */
    private void addIntelTask(N2AutoData autoData, DeviceControlRequest request) {
 
        //增加执行任务信息
        N2IntelTask task = new N2IntelTask();
        task.setId(ContextUtil.getUUID());
        task.setStart(new Date());
        task.setAutoName(autoData.getName());
        task.setAutoId(autoData.getId());
        task.setOrderId(request.getOrderId());
        task.setCompanyId(autoData.getCompanyId());
        task.setDepotId(request.getDepotId());
        task.setDeptId(autoData.getDeptId());
        task.setExeMode(autoData.getExeMode());
        task.setModeTag(autoData.getModeTag());
        task.setUpdateUser(ContextUtil.getLoginUserCName());
 
        hn2Service.saveIntelTask(task);
 
        //添加到缓存
        task.setDeviceControlRequest(request);
        coreN2Service.addIntelTaskCache(task);
    }
 
 
    /**
     * 只要有一个控制柜存在无法执行则取消执行,针对系统执行需要判断是否配置气调参数。
     *
     * @param autoData
     * @param param
     * @return
     */
    public String exeAutoActionBySys(N2AutoData autoData, N2Param param) {
        try {
            N2IntelConf intelConf = hn2Service.getN2IntelConf(param);
 
            if (null == intelConf) {
                return "当前仓库未配置气调相关参数,取消执行";
            }
 
            if (null == autoData.getListConf() || autoData.getListConf().isEmpty()) {
                return "当前方案未配置执行设备配置,无法执行";
            }
 
            //设备进行分组,KEY= 分机编码
            Map<String, List<ExeDevice>> deviceMap = coreN2Service.getExeDeviceByAutoConf(autoData.getListConf(), param.getModeClose());
            if (null == deviceMap) {
                return "当前方案未配置执行设备配置,无法执行";
            }
 
            DeviceSer ser;
            RemoteControlService remoteControlService;
            DeviceControlResponse deviceControlResponse;
            for (String serId : deviceMap.keySet()) {
                ser = coreSerService.getCacheSer(param.getCompanyId(), serId);
                if (null == ser || Constant.YN_N.equals(ser.getStatus())) {
                    return "设备关联控制柜不在线,无法执行";
                }
 
                // 分机协议
                remoteControlService = remoteManager.getRemoteControlService(ser.getProtocol());
                if (null == remoteControlService) {
                    return "当前控制柜=" + ser.getName() + " 协议未实现,请联系管理员!";
                }
 
                DeviceControlRequest request = new DeviceControlRequest();
                request.setDepotId(param.getDepotId());
                request.setCompanyId(param.getCompanyId());
                request.setBizType(BizType.N2.getCode());
                request.setDepotName(param.getDepotId());
                request.setSerId(ser.getId());
                request.setSerName(ser.getName());
                request.setIp(ser.getIp());
                request.setPort(ser.getPort());
                request.setDeviceList(deviceMap.get(serId));
                request.setProtocol(ser.getProtocol());
 
                //业务逻辑调整忽略设备双通道问题,直接执行,不同控制柜协议单独区分
                deviceControlResponse = remoteControlService.deviceControl(request);
                if (OrderRespEnum.ORDER_SUCCESS.getCode().equals(deviceControlResponse.getCode())) {
                    return "命令发送失败:" + deviceControlResponse.getMsg();
                } else {
                    this.addIntelTask(autoData, request);
                }
            }
        } catch (Exception e) {
            log.error(e.getMessage());
            return "后台执行出错:" + e.getMessage();
        }
        return null;
    }
}