package com.mes.controller; import com.mes.entity.PlcBaseData; import com.mes.service.PlcAutoTestService; import com.mes.service.PlcTestWriteService; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; /** * PLC测试写入控制器(兼容旧API) * 为前端提供模拟PLC写入操作的接口 * * @author huang * @date 2025/10/29 */ @Slf4j @RestController @RequestMapping("/plcTest/write") public class PlcTestWriteLegacyController { @Resource private PlcTestWriteService plcTestWriteService; @Resource private PlcAutoTestService plcAutoTestService; /** * 模拟PLC发送请求字 */ @PostMapping("/request") public Map simulateRequest(@RequestBody(required = false) Map params) { Map result = new HashMap<>(); try { boolean success; if (params != null && params.containsKey("dbBlock")) { String dbBlock = (String) params.get("dbBlock"); int beginIndex = (int) params.getOrDefault("beginIndex", 0); // 使用默认项目,但记录警告 log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex); success = plcTestWriteService.simulatePlcRequest(); } else { success = plcTestWriteService.simulatePlcRequest(); } result.put("success", success); result.put("message", success ? "PLC请求字发送成功" : "发送失败"); // 返回当前状态 PlcBaseData status = plcTestWriteService.readPlcStatus(); result.put("currentStatus", status); } catch (Exception e) { log.error("模拟PLC请求异常", e); result.put("success", false); result.put("message", "操作失败: " + e.getMessage()); } return result; } /** * 模拟PLC任务完成汇报 */ @PostMapping("/report") public Map simulateReport(@RequestBody(required = false) Map params) { Map result = new HashMap<>(); try { boolean success; if (params != null && params.containsKey("dbBlock")) { String dbBlock = (String) params.get("dbBlock"); int beginIndex = (int) params.getOrDefault("beginIndex", 0); // 使用默认项目,但记录警告 log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex); success = plcTestWriteService.simulatePlcReport(); } else { success = plcTestWriteService.simulatePlcReport(); } result.put("success", success); result.put("message", success ? "PLC任务汇报成功" : "汇报失败"); PlcBaseData status = plcTestWriteService.readPlcStatus(); result.put("currentStatus", status); } catch (Exception e) { log.error("模拟上片PLC汇报异常", e); result.put("success", false); result.put("message", "操作失败: " + e.getMessage()); } return result; } /** * 模拟PLC联机状态 */ @PostMapping("/online") public Map simulateOnline(@RequestBody Map params) { Map result = new HashMap<>(); try { int onlineState = (int) params.getOrDefault("onlineState", 1); boolean success; if (params.containsKey("dbBlock")) { String dbBlock = (String) params.get("dbBlock"); int beginIndex = (int) params.getOrDefault("beginIndex", 0); // 使用默认项目,但记录警告 log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex); success = plcTestWriteService.simulateOnlineStatus(onlineState); } else { success = plcTestWriteService.simulateOnlineStatus(onlineState); } result.put("success", success); result.put("message", success ? "PLC联机状态设置成功: " + onlineState : "设置失败"); PlcBaseData status = plcTestWriteService.readPlcStatus(); result.put("currentStatus", status); } catch (Exception e) { log.error("模拟PLC联机状态异常", e); result.put("success", false); result.put("message", "操作失败: " + e.getMessage()); } return result; } /** * 重置PLC状态 */ @PostMapping("/reset") public Map resetPlc(@RequestBody(required = false) Map params) { Map result = new HashMap<>(); try { boolean success; if (params != null && params.containsKey("dbBlock")) { String dbBlock = (String) params.get("dbBlock"); int beginIndex = (int) params.getOrDefault("beginIndex", 0); // 使用默认项目,但记录警告 log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex); success = plcTestWriteService.resetPlc(); } else { success = plcTestWriteService.resetPlc(); } result.put("success", success); result.put("message", success ? "PLC状态重置成功" : "重置失败"); PlcBaseData status = plcTestWriteService.readPlcStatus(); result.put("currentStatus", status); } catch (Exception e) { log.error("重置上片PLC状态异常", e); result.put("success", false); result.put("message", "操作失败: " + e.getMessage()); } return result; } /** * 读取PLC当前状态 */ @GetMapping("/status") public Map getPlcStatus(@RequestParam(required = false) String dbBlock, @RequestParam(required = false, defaultValue = "0") Integer beginIndex) { Map result = new HashMap<>(); try { PlcBaseData status; if (dbBlock != null) { // 使用默认项目,但记录警告 log.warn("使用旧API参数dbBlock={}, beginIndex={},建议使用新API基于项目ID的方式", dbBlock, beginIndex); status = plcTestWriteService.readPlcStatus(); } else { status = plcTestWriteService.readPlcStatus(); } result.put("success", true); result.put("data", status); result.put("message", "获取上片PLC状态成功"); } catch (Exception e) { log.error("读取上片PLC状态异常", e); result.put("success", false); result.put("message", "获取状态失败: " + e.getMessage()); } return result; } /** * 批量测试 - 模拟完整任务流程 */ @PostMapping("/batch/test") public Map batchTest(@RequestBody Map params) { Map result = new HashMap<>(); try { String protocolType = (String) params.get("protocolType"); int taskCount = (int) params.getOrDefault("taskCount", 1); log.info("开始批量测试,协议类型: {}, 任务数量: {}", protocolType, taskCount); // 模拟完整的任务流程 for (int i = 1; i <= taskCount; i++) { log.info("执行第{}个任务", i); if ("load".equals(protocolType)) { // 流程 plcTestWriteService.simulatePlcRequest(); // 发送请求 // 等待MES响应 Thread.sleep(1000); plcTestWriteService.simulatePlcReport(); // 任务完成 } else if ("raw".equals(protocolType)) { // 流程 plcTestWriteService.simulatePlcRequest(); // 发送请求 // 等待MES响应 Thread.sleep(1000); plcTestWriteService.simulatePlcReport(); // 任务完成 } // 任务间隔 if (i < taskCount) { Thread.sleep(2000); } } result.put("success", true); result.put("message", "批量测试完成,共执行" + taskCount + "个任务"); } catch (Exception e) { log.error("批量测试异常", e); result.put("success", false); result.put("message", "批量测试失败: " + e.getMessage()); } return result; } /** * 设置DB块地址(已废弃,仅保留兼容性) */ @PostMapping("/dbBlock") public Map setDbBlock(@RequestBody Map params) { Map result = new HashMap<>(); try { String dbBlock = (String) params.get("dbBlock"); log.warn("设置DB块地址功能已废弃,请使用新API基于项目ID的方式管理PLC配置"); result.put("success", false); result.put("message", "设置DB块地址功能已废弃,请使用新API基于项目ID的方式管理PLC配置"); } catch (Exception e) { log.error("设置DB块地址异常", e); result.put("success", false); result.put("message", "设置DB块地址失败: " + e.getMessage()); } return result; } /** * 获取当前DB块地址(已废弃,仅保留兼容性) */ @GetMapping("/dbBlock") public Map getDbBlock() { Map result = new HashMap<>(); try { log.warn("获取DB块地址功能已废弃,请使用新API基于项目ID的方式管理PLC配置"); result.put("success", false); result.put("message", "获取DB块地址功能已废弃,请使用新API基于项目ID的方式管理PLC配置"); } catch (Exception e) { log.error("获取DB块地址异常", e); result.put("success", false); result.put("message", "获取DB块地址失败: " + e.getMessage()); } return result; } /** * 启用自动测试模式 */ @PostMapping("/auto/enable") public Map enableAutoTest() { Map result = new HashMap<>(); try { plcAutoTestService.enableAutoTest(); result.put("success", true); result.put("message", "自动测试模式已启用"); } catch (Exception e) { log.error("启用自动测试模式异常", e); result.put("success", false); result.put("message", "启用自动测试模式失败: " + e.getMessage()); } return result; } /** * 禁用自动测试模式 */ @PostMapping("/auto/disable") public Map disableAutoTest() { Map result = new HashMap<>(); try { plcAutoTestService.disableAutoTest(); result.put("success", true); result.put("message", "自动测试模式已禁用"); } catch (Exception e) { log.error("禁用自动测试模式异常", e); result.put("success", false); result.put("message", "禁用自动测试模式失败: " + e.getMessage()); } return result; } /** * 获取自动测试模式状态 */ @GetMapping("/auto/status") public Map getAutoTestStatus() { Map result = new HashMap<>(); try { boolean isEnabled = plcAutoTestService.isAutoTestEnabled(); result.put("success", true); result.put("data", isEnabled); result.put("message", "获取自动测试模式状态成功"); } catch (Exception e) { log.error("获取自动测试模式状态异常", e); result.put("success", false); result.put("message", "获取自动测试模式状态失败: " + e.getMessage()); } return result; } }