UI-Project/src/views/MechanicalArm/mechanicalArm.vue
@@ -6,6 +6,7 @@
import { useI18n } from 'vue-i18n'
import { WebSocketHost, host } from '@/utils/constants'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
let language = ref(localStorage.getItem('lang') || 'zh')
const { t } = useI18n()
const requestData = reactive({
@@ -30,13 +31,121 @@
const machineId = pageParamsJson.machineId;//当前页面的设备ID
console.log(machineId);
var errorScanId;
// 新增:定时任务ID(用于清除定时器)
const timerId = ref(null);
/**
 * 单次接口请求函数
 * 作用:调用后端接口,获取数据后交给 handleMessage 处理
 */
const fetchMachineData = async () => {
  try {
    // 已领取的任务数据
    request.post("/deviceInteraction/primitiveTask/findMachineTask",{
      "id": machineId
    }).then((res) => { // 替换为你的API端点
      if (res.code === 200) {
        // 假设后端返回的数据格式与 handleMessage 预期一致
        const responseData = res.data || {};
        loadData.value = responseData;
      }
    });
    // 线下数据
  } catch (err) {
    console.error('定时请求后端接口【已领取的任务数据】失败:', err);
  }
  try {
    // 可领取的任务数据
    request.post("/deviceInteraction/primitiveTask/findKBBTJPDrawingBP").then((res) => { // 替换为你的API端点
      if (res.code === 200) {
        // 假设后端返回的数据格式与 handleMessage 预期一致
        const responseData = res.data || {};
        findPrimitiveTask.value = responseData;
      }
    });
  } catch (err) {
    console.error('定时请求后端接口【可领取的任务数据:客户表】失败:', err);
  }
  try {
    // 设备数据
    request.post("/deviceInteraction/machine/findMachine", {
      "id": machineId
    }).then((res) => { // 替换为你的API端点
      if (res.code === 200) {
        // 假设后端返回的数据格式与 handleMessage 预期一致
        const responseData = res.data || {};
        findMachine.value = responseData;
        if (Object.keys(findMachine.value).length === 0) {
          if (findMachine.value.mode == "1") {
            modevalue.value = {
              value: '1',
              label: '标准',
            };
          } else if (findMachine.value.mode == "2") {
            modevalue.value = {
              value: '2',
              label: '定制',
            };
          } else if (findMachine.value.mode == "3") {
            modevalue.value = {
              value: '3',
              label: '手动',
            };
          }
        }
      }
    });
  } catch (err) {
    console.error('定时请求后端接口失败【设备数据】:', err);
  }
};
/**
 * 启动定时器
 * @param {number} interval - 定时间隔(毫秒,默认500ms,与后端任务频率对齐)
 */
const startTimer = (interval = 500) => {
  // 先清除已有定时器(避免重复创建)
  if (timerId.value) clearInterval(timerId.value);
  // 立即执行一次(避免首次等待间隔)
  fetchMachineData();
  // 创建新定时器
  timerId.value = setInterval(() => {
    fetchMachineData();
  }, interval);
};
/**
 * 清除定时器(避免内存泄漏)
 */
const clearTimer = () => {
  if (timerId.value) {
    clearInterval(timerId.value);
    timerId.value = null; // 重置ID
  }
};
// 组件卸载时清除定时器(关键:避免组件销毁后定时器仍运行)
onUnmounted(() => {
  clearTimer();
});
onMounted(async () => {
  startTimer(500); // 500ms 间隔(可根据业务调整,如1000ms)
  // //使用WebSocket方式展示数据
  // socket = initializeWebSocket(socketUrl, handleMessage);// 初始化 WebSocket,并传递消息处理函数
  // //使用WebSocket方式展示数据
  // socketDownLineTask = initializeWebSocket(socketDownLineTaskUrl, handleMessage2);// 初始化 WebSocket,并传递消息处理函数
});
//使用WebSocket方式展示数据
let socket = null;
let socketDownLineTask = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/deviceInteraction/api/talk/loadTask`;
const socketDownLineTaskUrl = `ws://${WebSocketHost}:${host}/api/deviceInteraction/api/talk/downLineTask`;
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
@@ -89,38 +198,6 @@
  socketDownLineTask = initializeWebSocket(socketDownLineTaskUrl, handleMessage2);// 初始化 WebSocket,并传递消息处理函数
  
});
//报警提示
const errorInfoFuntion = async (info) => {
  let infoScancode = '扫码ID:' + info.scanId + '  ' + info.scanCode;
  ElMessageBox.confirm(
    infoScancode,
    t('delivery.prompt'),
    {
      confirmButtonText: t('functionState.sureStart'),
      cancelButtonText: t('functionState.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //重新补单
      request.post("/deviceInteraction/tasking/glassAgainTopLine",
        {
          "scanId": info.scanId,
        }).then((res) => { // 替换为你的API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('functionState.cancel'),
      })
    })
}
//修改工作状态 【失败/正在工作/完工】
const workStatus = async (row, state) => {
  let url;
@@ -431,7 +508,9 @@
        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="70">
          <template #default="scope">
            <el-button size="small" link type="primary" plain @click="startOrStopTask(scope.row, findMachine.id, 1)">{{
              $t('functionState.getTask') }}</el-button>
                $t('functionState.getTask')
              }}
            </el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -444,7 +523,8 @@
      </div>
      <div>
        手动输入上片数量:
        <el-input v-model="blindModeNumberLocal" style="width: 200px;" type="Number" id="blindMode" @keyup.enter="fetchSubmit"></el-input>
        <el-input v-model="blindModeNumberLocal" style="width: 200px;" type="Number" id="blindMode"
                  @keyup.enter="fetchSubmit"></el-input>
        
      </div>
      <!-- <div>
@@ -464,16 +544,23 @@
        </el-select>
        
        <span>
          <span @click="modeShow" style="margin-left: 40px;">{{ findMachine.mode=="3"? ("上片数量:"+findMachine.taskCount):"" }}</span>
          <span style="margin-left: 40px;">{{ findMachine.mode=="3"? ("已完成数量:"+findMachine.finshCount):"" }}</span>
          <span @click="modeShow" style="margin-left: 40px;">{{
              findMachine.mode == "3" ? ("上片数量:" + findMachine.taskCount) : ""
            }}</span>
          <span style="margin-left: 40px;">{{
              findMachine.mode == "3" ? ("已完成数量:" + findMachine.finshCount) : ""
            }}</span>
        </span>
        
        
      </div>
      <br>
      <el-button :type="(findMachine['state'] == '暂停' ? 'danger' : 'success')" id="ButtonMachineStatus"
        @click="machineStatus((findMachine['state'] == '暂停' ? '开工' : '暂停'))">{{ findMachine['state'] == '开工' ?
        $t('functionState.start') : $t('functionState.stop') }}</el-button>
                 @click="machineStatus((findMachine['state'] == '暂停' ? '开工' : '暂停'))">{{
          findMachine['state'] == '开工' ?
              $t('functionState.start') : $t('functionState.stop')
        }}
      </el-button>
      <el-button type="primary" id="ButtonTopLine" @click="topLineShow">{{ $t('functionState.getTask') }}</el-button>
    </div>
@@ -519,7 +606,9 @@
        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="270">
          <template #default="scope">
            <el-button size="mini" link type="primary" plain @click="startOrStopTask(scope.row, 2, 2)">{{
              $t('functionState.stopTask') }}</el-button>
                $t('functionState.stopTask')
              }}
            </el-button>
          </template>
        </el-table-column>
      </el-table>