zhoushihao
2 天以前 4e3b8155722b66e25df3c6fd42cc586b68dea391
UI-Project/src/views/Caching/cachingun.vue
@@ -1,265 +1,457 @@
<template>
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="340" ref="table" @selection-change="handleSelectionChange" :data="tableData"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="80" />
          <el-table-column prop="glass_id" align="center" :label="$t('sorter.glassnumber')" min-width="80" />
          <el-table-column prop="width" align="center" :label="$t('sorter.width')" min-width="120" />
          <el-table-column prop="height" align="center" :label="$t('sorter.height')" min-width="120" />
          <el-table-column align="center" :label="$t('sorter.startstatus')" min-width="80" prop="enable_state">
            <template #default="scope">
              <el-tag :type="scope.row.enable_state === 1 ? 'success' : 'danger'" @click="toggleEnableState(scope.row)">
                {{ scope.row.enable_state === 1 ? $t('sorter.start') : $t('sorter.disable') }}
              </el-tag>
            </template>
            <!-- <template #default="scope">
            <el-tag type="success" >{{ scope.row.enable_state==1?"启用":"未启用"  }}</el-tag>
          </template> -->
          </el-table-column>
          <el-table-column fixed="right" :label="$t('sorter.operate')" align="center" width="200">
            <template #default="scope">
              <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('sorter.deficiencieste')
                }}</el-button>
              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('sorter.updown') }}</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </el-card>
    <div class="awatch">
      <img src="../../assets/woshihuancun.png" alt=""
        style="width: 70%;height: 90%;margin-left: 200px;margin-top: 20px;position: relative;">
      <div style="position: relative; width: 500px;height: 95px;margin-top: -165px;margin-left: 450px;">
        <div v-for="(rect, index) in adjustedRects" :key="rect" :style="{
      position: 'absolute',
      top: `${rect.id}px`, left: `10px`, width: `${rect.width}px`, height: `5px`,
      backgroundColor: '#409EFF'
    }">
        </div>
      </div>
    </div>
  </div>
</template>
<script setup>
import { Search, Lock, Avatar } from "@element-plus/icons-vue";
import { reactive } from "vue";
import { useRouter } from "vue-router"
const router = useRouter()
const adda = ref(false)
import { WebSocketHost, host } from '@/utils/constants'
import {onBeforeUnmount, onMounted, onUnmounted, ref, reactive} from "vue";
import {useRouter} from "vue-router"
import {host, WebSocketHost} from '@/utils/constants'
import dayjs from 'dayjs';
import request from "@/utils/request"
import { ref, onMounted, onBeforeUnmount, onUnmounted } from "vue";
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
// import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
//  import LanguageMixin from './lang/LanguageMixin'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
// import i18n from '@/i18n';
const tableData = reactive([]);
const slot = ref('')
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
import {useI18n} from 'vue-i18n'
import { inject } from 'vue';
const globalDate = inject('globalDate');
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const tableDataa = ref([])
const tableDatab = ref([])
const tableDatad = ref([])
const adjustedRects = ref([]);
onMounted(async () => {
  try {
    const response = await request.get('/unLoadGlass/downStorage/selectStorageCage'); // 替换为你的API端点
    if (response.code === 200) {
      const rawRects = response.data; // 设置矩形数据
      tableData.value = response.data
      console.log(response.data);
      adjustedRects.value = rawRects.map(rect => ({
        ...rect, // 复制原始对象的其他属性
        width: rect.width * 0.5,
        id: rect.id * 10,
      }));
      console.log(adjustedRects.value);
    } else {
      ElMessage.warning(res.msg)
    }
  } catch (error) {
    // console.error('Error fetching rects :', error);
const selectValuesa = reactive([]);
const timeRange = ref([])
const taskState = ref('')
const taskType = ref('')
const glassId = ref('')
const blindb = ref(false)
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/cacheGlassTwo`;
const handleMessage = (data) => {
  const cageInfo = data.taskMessage[0];
  if (cageInfo && cageInfo.createTime) {
    cageInfo.formattedCreateTime = formatTimestamp(cageInfo.createTime);
  }
  if (cageInfo && cageInfo.updateTime) {
    cageInfo.formattedupdateTime = formatTimestamp(cageInfo.updateTime);
  }
  tableDataa.value = data.EdgStorageCageinfos[0]
  tableDatab.value = data.taskMessage
  adjustedRects.value = data.EdgStorageCageinfos[0].map((rect, index) => ({
      ...rect,
      id: rect.id * 9,
      showRect: !!data.EdgStorageCageinfos[0][index]?.details[0]
    }));
  };
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(globalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
  onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  parseAndSetTime();
});
const open = async (row) => {
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  blindb.value = true;
  iframeUrl.value = `${window.location.origin}/#/Caching/cachingunhistory`;
};
const sethistorical = async () => {
  try {
    const params = {
      deviceId: 2,
      startTime: (timeRange.value && timeRange.value[0]) || '',
      endTime: (timeRange.value && timeRange.value[1]) || '',
      glassId: glassId.value || '',
      taskState: taskState.value,
      taskType: taskType.value || ''
    };
    // 构建查询字符串
    const queryString = new URLSearchParams(params).toString();
    const url = `/cacheGlass/edgStorageDeviceTaskHistory?${queryString}`;
      const response = await request.get(url)
      if (response.code == 200) {
        ElMessage.success(response.message);
        tableDatad.value = response.data;
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 破损
 const handletake = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('sorter.information'),
      t('sorter.prompt'),
      {
        confirmButtonText: t('sorter.yes'),
        cancelButtonText: t('sorter.cancel'),
        type: 'warning',
      }
    const confirmResult = await ElMessageBox.confirm(
      t('workOrder.messagedamaged'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      // 用户点击了“是”,现在调用删除接口
      var url = "/unLoadGlass/downStorage/deleteDownStorageCage";
      console.log(url);
      const response = await request.post(url, {
        glassId: row.glass_id,
        state: 9,
        line: 1001,
        workingProcedure: '磨边前理片笼',
      const response = await request.post("/cacheGlass/edgStorageCageDetails/edgDetailsOperate", {
        glassId: row.glassId,
        state: 8,
        line: 2,
        workingProcedure: '理片笼',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
    } else {
      // 删除失败,您可以处理错误或显示错误信息给用户
      ElMessage.error(response.message);
      // alert('删除失败:' + deleteResponse.message);
    }
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }  
  }
  catch (error) {
  // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等
  console.error('发生错误:', error);
}
};
// 人工下片
const opena = async (row) => {
};
// 拿走
 const handleBindRack = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('sorter.infor'),
      t('sorter.prompt'),
      {
        confirmButtonText: t('sorter.yes'),
        cancelButtonText: t('sorter.cancel'),
        type: 'warning',
      }
    const confirmResult = await ElMessageBox.confirm(
      t('workOrder.takemessage'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/unLoadGlass/downGlassTask/generateOutGlassTask", {
        glassId: row.glass_id
      })
      if (response.code === 200) {
        ElMessage.success(response.message);
      const response = await request.post("/cacheGlass/edgStorageCageDetails/edgDetailsOperate", {
        glassId: row.glassId,
        state: 9,
        line: 2,
        workingProcedure: '理片笼',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
        // 删除失败,您可以处理错误或显示错误信息给用户
        ElMessage.error(response.message);
        // alert('删除失败:' + deleteResponse.message);
      }
    }
  }
  catch (error) {
    // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等
    console.error('发生错误:', error);
  }
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务重置
const handleptask = async() => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.partasks'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
 if (confirmResult === 'confirm') {
  var url="/cacheGlass/edgStorageDeviceTask/resetTask?deviceId="+ 2;
      const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务成功处理
const successfull = async() => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.psuccessfullyprocessed'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
 if (confirmResult === 'confirm') {
  var url="/cacheGlass/edgStorageDeviceTask/taskSuccess?deviceId="+ 2;
      const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// const open = async(row) => {
// const { t } = useI18n();
//   try {
//     const confirmMessage = t('sorter.prompt'); // 使用 $t 翻译文本
//     const confirmResult = await ElMessageBox.confirm(
//       confirmMessage,
//       t('sorter.information'),
//       {
//         confirmButtonText: t('sorter.yes'),
//         cancelButtonText: t('sorter.cancel'),
//         type: 'warning',
//       }
//     );
//     if (confirmResult === 'confirm') {
//       // 用户点击了“是”,现在调用删除接口
//       var url="/cacheGlass/edgStorageCage/edgStorageCageGlass?edgStorageCageId="+row.id;
//       console.log(url);
//       const response = await request.post(url, {
//         esdId: row.esdId
//     })
//     if (response.code === 200) {
//       ElMessage.success(response.message);
//       } else {
//         // 删除失败,您可以处理错误或显示错误信息给用户
//       ElMessage.error(response.msg);
//         // alert('删除失败:' + deleteResponse.message);
//       }
//     }
//   }
//   catch (error) {
//     // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等
//     console.error('发生错误:', error);
//   }
// };
const toggleEnableState = async (row) => {
  const newState = row.enable_state === 1 ? 0 : 1;
  // 发送请求到后端更新状态(这里省略了实际的请求逻辑)
  const response = await request.post('/unLoadGlass/downStorage/updateDownStorageCage', { id: row.id, enableState: newState });
  if (response.code === 200) {
    ElMessage.success(response.message);
  } else {
    ElMessage.error(response.message);
 // 删除
 const handledelete = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.deletemessage'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCageDetails/removeEdgDetails?glassId="+encodeURIComponent(row.glassId))
    if (response.code === 200) {
     ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
const rowClassName = ({ row }) => {
  // 根据 enableState 设置行的 CSS 类
  return row.slot % 2 === 0 ? 'success-row' : '';
};
// 样式部分
const styles = `
  .success-row {
    --el-table-tr-bg-color: var(--el-color-info-light-9);
  }
  row.enable_state = newState;
};
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/unLoadGlass/api/talk/downcache`;
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  tableData.splice(0, tableData.length, ...data.params2[0]);
  // tableData.value = data.params[0]
  // adjustedRects.value = data.EdgStorageCageinfos[0]
  adjustedRects.value = data.params2[0].map(rect => ({
    ...rect, // 复制原始对象的其他属性
    width: rect.width * 0.5,
    id: rect.id * 10,
  }));
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
onUnmounted(() => {
  if (socket) {
`;
// 动态添加样式到组件
const styleElement = document.createElement('style');
styleElement.textContent = styles;
document.head.appendChild(styleElement);
const optionsa = [
  {
    value: 0,
    label: t('hellow.starttask'),
  },
  {
    value: 1,
    label: t('searchOrder.endtask'),
  }
]
const optionsb = [
  {
    value: 1,
    label: t('sorter.advancetask'),
  },
  {
    value: 2,
    label: t('sorter.outputtasks'),
  },
  {
    value: 3,
    label: t('sorter.straighttasks'),
  }
]
function getStatusTypea(taskType) {
  switch (taskType) {
    case 1:
      return 'info';
    case 2:
      return 'success';
    case 3:
      return 'danger';
  }
}
function getStatusTexta(taskType) {
  switch (taskType) {
    case 1:
      return t('sorter.advancetask');
    case 2:
      return t('sorter.outputtasks');
    case 3:
      return t('sorter.straighttasks');
  }
}
function getStatusTypeb(taskState) {
  switch (taskState) {
    case 0:
      return 'info';
    case 1:
      return 'success';
  }
}
function getStatusTextb(taskState) {
  switch (taskState) {
    case 0:
      return t('hellow.starttask');
    case 1:
      return t('searchOrder.endtask');
  }
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
  onUnmounted(() => {
    if (socket) {
    closeWebSocket(socket);
  }
});
    }
    });
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
</script>
<template>
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;">
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="handlehistorical" type="primary">{{ $t('searchOrder.historicaltasks') }}</el-button>
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="handleptask()" type="warning">{{ $t('searchOrder.partask') }}</el-button>
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="successfull()" type="success">{{ $t('searchOrder.successfullyprocessed') }}</el-button>
    <div style="position: relative; width: 100%; height: 100%;"> <!-- 添加相对定位 -->
  <div style="position: absolute; margin-top: 28px; left: 400px; display: flex; z-index: 10;"> <!-- 添加绝对定位 -->
    <div>{{ $t('searchOrder.projectnumber') }}</div>
    <div style="margin-left: 135px;">{{ $t('hellow.flowCardId') }}</div>
    <div style="margin-left: 152px;">{{ $t('searchOrder.glassID') }}</div>
    <div style="margin-left: 135px;">{{ $t('searchOrder.width') }}</div>
    <div style="margin-left: 169px;">{{ $t('searchOrder.height') }}</div>
    <div style="margin-left: 162px;">{{ $t('searchOrder.thickness') }}</div>
    <div style="margin-left: 135px;">{{ $t('hellow.operate') }}</div>
  </div>
    <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
      <el-table
      ref="table"
      style="margin-top: 20px; height: 300px;"
      :data="tableDataa"
      :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }"
      row-key="id"
  >
    <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="10" />
          <el-table-column
            align="center"
            :label="$t('sorter.startstatus')"
            min-width="10"
            prop="enableState"
          >
          <template #default="scope">
            <el-tag
              :type="scope.row.enableState === 1 ? 'success' : 'warning'"
            >
              {{ scope.row.enableState === 1 ? $t('sorter.start') : $t('sorter.disable') }}
            </el-tag>
          </template>
      </el-table-column>
        <el-table-column>
    <template #default="props">
      <el-table
      :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }"
      :data="props.row.details" style="width: 100%;height: 70px;">
        <el-table-column prop="engineerId" align="center" min-width="80" />
          <el-table-column prop="flowCardId" align="center" min-width="80" />
          <el-table-column prop="glassId" align="center" min-width="80" />
          <el-table-column prop="width" align="center" min-width="80" />
          <el-table-column prop="height" align="center" min-width="80" />
          <el-table-column prop="thickness" align="center" min-width="80" />
    <el-table-column fixed="right" align="center" width="150">
        <template #default="scope">
          <el-button type="text" plain @click="handletake(scope.row)">{{ $t('searchOrder.breakage') }}</el-button>
          <el-button type="text" plain @click="handleBindRack(scope.row)">{{ $t('searchOrder.takeout')}} </el-button>
          <el-button type="text" plain @click="handledelete(scope.row)">{{ $t('searchOrder.delete')}} </el-button>
        </template>
      </el-table-column>
      </el-table>
      </template>
    </el-table-column>
  </el-table>
 </div>
 </div>
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;margin-top: 15px;">
        <el-table height="90" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table-column prop="glassIdIn" align="center" :label="$t('searchOrder.intoglassid')" min-width="80" />
      <el-table-column prop="glassIdOut" align="center" :label="$t('searchOrder.outputglassID')" min-width="80" />
          <el-table-column prop="currentCell" align="center" :label="$t('sorter.layernow')" min-width="80" />
          <el-table-column prop="startCell" align="center" :label="$t('processCard.layer')" min-width="120" />
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="80"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.taskState)">
          {{ getStatusTextb(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('film.enabletype')"
            min-width="80"
            prop="taskType"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypea(scope.row.taskType)">
          {{ getStatusTexta(scope.row.taskType) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="formattedCreateTime" align="center" :label="$t('film.createtime')" min-width="120" />
          <el-table-column prop="formattedupdateTime" align="center" :label="$t('sorter.updateTime')" min-width="120" />
        </el-table>
      </div>
    </el-card>
  <div class="awatch">
    <img src="../../assets/woshihuancun.png" alt="" style="width: 50%;height: 100%;margin-left: 25%;margin-top: 5px;position: relative;">
    <div style="position: relative; width: 500px;height: 95px;margin-top: -227px;margin-left: 615px;">
    <div
      v-for="(rect, index) in adjustedRects"
      v-show="rect.showRect"
      :key="rect"
      :style="{ position: 'absolute',
       top: `${rect.id}px`, left: `-85px`, width: `435px`, height: `3px`,
      backgroundColor: '#409EFF'
       }"
    >
  </div>
</div>
  </div>
</div>
<!-- 历史任务 -->
<el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl=''">
     <iframe
     :src="iframeUrl"
     marginwidth="2000px"
     marginheight="2000px"
     width="100%"
     height="750px"
     frameborder="0"
     ></iframe>
  </el-dialog>
</template>
<style scoped>
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
#dialog-footer {
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message {
#message{
  text-align: center;
  align-items: center;
  color: black;
  width: 200px;
  height: 100px;
  background-color: #337ecc;
  margin-left: 28%;
   width: 200px;
   height: 100px;
   background-color: #337ecc;
   margin-left: 28%;
}
.awatch {
  height: 460px;
.awatch{
  height: 350px;
  width: 1500px;
  max-width: 100%;
  /* margin-top: -60px; */
  margin-left: 10%
}
</style>
</style>