huang
2025-11-17 e76f0739e647fe8a7e0e2618914e2faff554b1b7
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
package com.mes.device.service.impl;
 
import com.mes.device.request.DeviceGlassFeedRequest;
import com.mes.device.service.DeviceControlProfileService;
import com.mes.device.service.DeviceInteractionService;
import com.mes.device.service.DevicePlcOperationService;
import com.mes.device.vo.DeviceControlProfile;
import com.mes.device.vo.DevicePlcVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * 设备交互逻辑实现
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class DeviceInteractionServiceImpl implements DeviceInteractionService {
 
    private final DeviceControlProfileService controlProfileService;
    private final DevicePlcOperationService devicePlcOperationService;
 
    @Override
    public DevicePlcVO.OperationResult feedGlass(DeviceGlassFeedRequest request) {
        DeviceControlProfile profile = controlProfileService.getProfile(request.getDeviceId());
        Map<String, Object> payload = buildGlassPayload(profile, request);
        String opName = "玻璃上料";
        if (request.getPositionCode() != null) {
            opName = opName + "(" + request.getPositionCode() + ")";
        }
        return devicePlcOperationService.writeFields(request.getDeviceId(), payload, opName);
    }
 
    private Map<String, Object> buildGlassPayload(DeviceControlProfile profile, DeviceGlassFeedRequest request) {
        if (CollectionUtils.isEmpty(profile.getGlassSlots())) {
            throw new IllegalStateException("设备未配置玻璃槽位信息");
        }
        List<String> glassIds = request.getGlassIds();
        Map<String, Object> payload = new HashMap<>();
 
        // 写入玻璃ID
        for (int i = 0; i < profile.getGlassSlots().size(); i++) {
            DeviceControlProfile.GlassSlot slot = profile.getGlassSlots().get(i);
            String value = (glassIds != null && i < glassIds.size()) ? glassIds.get(i) : "";
            payload.put(slot.getField(), value);
        }
 
        // 写入玻璃数量
        if (profile.getGlassCountField() != null) {
            int count = glassIds != null ? glassIds.size() : 0;
            payload.put(profile.getGlassCountField(), count);
        }
 
        // 写入位置
        if (profile.getPositionField() != null) {
            Integer positionValue = request.getPositionValue();
            if (positionValue == null && request.getPositionCode() != null
                    && profile.getPositionMappings() != null) {
                positionValue = profile.getPositionMappings().get(request.getPositionCode());
            }
            if (positionValue != null) {
                payload.put(profile.getPositionField(), positionValue);
            }
        }
 
        // 自动触发请求字
        boolean trigger = request.getTriggerRequest() != null ? request.getTriggerRequest()
                : Boolean.TRUE.equals(profile.getAutoRequest());
        if (trigger && profile.getRequestField() != null) {
            payload.put(profile.getRequestField(), 1);
        }
 
        return payload;
    }
}