ソースを参照

解决状态灯

yichael 1 週間 前
コミット
30d428e8fc

+ 21 - 4
src/page/device/device.js

@@ -7,14 +7,31 @@ let _selectedDevices = []
 export function getSelectedDevices() { return _selectedDevices }
 export function setSelectedDevicesStore(devices) { _selectedDevices = devices || [] }
 
-// 脚本执行状态,供 ConnectItem 显示灯色:grey 未执行/已停止 | green 执行中 | red 执行失败
+// 脚本执行状态,供 ConnectItem 显示灯色:gray 未执行/已停止 | green 执行中 | red 执行失败
 let _executionStatus = { running: false, executingIps: [], failedIps: [] }
 let _setExecutionStatusCallback = null
 export function getExecutionStatus() { return _executionStatus }
 export function setExecutionStatusCallback(cb) { _setExecutionStatusCallback = cb }
-export function setExecutionStatus(running, executingIps = [], failedIps = []) {
-  _executionStatus = { running, executingIps: executingIps || [], failedIps: failedIps || [] }
-  _setExecutionStatusCallback?.({ ..._executionStatus })
+
+/**
+ * 设置设备执行状态灯色(只传一个参数 color,red 时可选传失败 IP 列表)
+ * @param {'gray'|'green'|'red'} color
+ * @param {string[]} [failedIps] - 仅当 color === 'red' 时传入
+ */
+export function setExecutionStatus(color, failedIps = []) {
+  const normalized = (color || 'gray').toLowerCase()
+  const failed = Array.isArray(failedIps) ? [...failedIps] : []
+  let running = false
+  let executingIps = []
+  if (normalized === 'green') {
+    running = true
+    executingIps = [...getSelectedDevices()]
+  } else if (normalized === 'red') {
+    // failedIps 已取自上参
+  }
+  _executionStatus = { running, executingIps, failedIps: failed }
+  const payload = { running, executingIps: [...executingIps], failedIps: [...failed] }
+  _setExecutionStatusCallback?.(payload)
 }
 
 // 设备管理类,所有方法都可以通过 this. 访问属性

+ 5 - 0
src/page/device/device.jsx

@@ -20,6 +20,11 @@ function Device({ show }) {
     return () => setExecutionStatusCallback(null)
   }, [])
 
+  // 每次显示时同步一次执行状态,确保停止后切回设备列表时灯色为灰
+  useEffect(() => {
+    if (show) setExecutionStatus(getExecutionStatus())
+  }, [show])
+
   useEffect(() => {
     if (!deviceClass.current) {
       deviceClass.current = new DeviceClass()

+ 20 - 14
src/page/process/process-item/process-item.js

@@ -13,30 +13,30 @@ function parseRunProcessResult(stdout) {
   return []
 }
 
-/** 正常完成才返回:run-process 脚本跑完并退出时调用 */
+/** run-process 脚本跑完并退出时调用,按结果设红或灰 */
 function onRunComplete(setIsRunning, res, lastSelectedDevices) {
-  // setIsRunning(false)
   let failedIps = parseRunProcessResult(res.stdout || '')
   if (failedIps.length === 0 && res.exitCode !== 0 && lastSelectedDevices?.length) {
     failedIps = [lastSelectedDevices[0]]
   }
-  setExecutionStatus(false, [], failedIps)
+  setExecutionStatus('red', failedIps)
 }
 
-/** 执行中途有错误返回:脚本抛错、崩溃、超时等 Promise reject 时调用 */
+/** 脚本抛错、崩溃、超时等 Promise reject 时调用,置灰 */
 function onRunError(setIsRunning) {
-  // setIsRunning(false)
-  setExecutionStatus(false, [], [])
+  setExecutionStatus('gray')
 }
 
 class ProcessItemClass {
   constructor() {}
 
+  /** 初始化流程项与 setIsRunning 引用 */
   init(processInfo, setIsRunning) {
     this.processInfo = processInfo
     this.setIsRunning = setIsRunning
   }
 
+  /** 勾选设备后启动 run-process,并维护执行状态灯 */
   play() {
     const selectedDevices = getSelectedDevices()
     if (!Array.isArray(selectedDevices) || selectedDevices.length === 0) {
@@ -44,31 +44,37 @@ class ProcessItemClass {
       hintView.show()
       return
     }
+    this._stopped = false
     this.setIsRunning(true)
     this._lastRunParams = [JSON.stringify(selectedDevices), this.processInfo.name]
-    setExecutionStatus(true, selectedDevices, [])
+    setExecutionStatus('green')
     window.electronAPI.runNodejsScript('run-process', ...this._lastRunParams)
       .then((res) => {
+        if (this._stopped) return
         const normalExit = res.exitCode === 0 || res.exitCode === 1
         if (normalExit) {
           onRunComplete(this.setIsRunning, res, selectedDevices)
-        } else {
-          onRunError(this.setIsRunning)
+          return
         }
+        onRunError(this.setIsRunning)
+      })
+      .catch(() => {
+        if (this._stopped) return
+        onRunError(this.setIsRunning)
       })
-      .catch(() => onRunError(this.setIsRunning))
   }
 
+  /** 停止当前 run-process 并置灰,忽略后续 then/catch 对状态的覆盖 */
   stop() {
+    this._stopped = true
     this.setIsRunning(false)
-    setExecutionStatus(false, [], [])
+    setExecutionStatus('gray')
     const params = this._lastRunParams || []
     window.electronAPI.killNodejsScript('run-process', ...params).catch(() => {})
   }
 
-  delete() {
-    
-  }
+  /** 删除本流程项(预留) */
+  delete() {}
 }
 
 export { ProcessItemClass }