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 payload = buildGlassPayload(profile, request); String opName = "玻璃上料"; if (request.getPositionCode() != null) { opName = opName + "(" + request.getPositionCode() + ")"; } return devicePlcOperationService.writeFields(request.getDeviceId(), payload, opName); } private Map buildGlassPayload(DeviceControlProfile profile, DeviceGlassFeedRequest request) { if (CollectionUtils.isEmpty(profile.getGlassSlots())) { throw new IllegalStateException("设备未配置玻璃槽位信息"); } List glassIds = request.getGlassIds(); Map 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; } }