From 8934b81f82311da255aa71b672f2db28daf16bf9 Mon Sep 17 00:00:00 2001
From: wangfei <3597712270@qq.com>
Date: 星期二, 18 二月 2025 14:03:18 +0800
Subject: [PATCH] 原片仓储启用禁用字段

---
 UI-Project/src/views/Returns/upreturns.vue |  306 ++++++++++++++++++++++++++++++++------------------
 1 files changed, 197 insertions(+), 109 deletions(-)

diff --git a/UI-Project/src/views/Returns/upreturns.vue b/UI-Project/src/views/Returns/upreturns.vue
index 1c5db80..386f5b7 100644
--- a/UI-Project/src/views/Returns/upreturns.vue
+++ b/UI-Project/src/views/Returns/upreturns.vue
@@ -1,7 +1,7 @@
 <script lang="ts" setup>
-import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
+import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref, computed} from "vue";
 import {useRouter} from "vue-router"
-import {ElMessage} from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
 import {useI18n} from 'vue-i18n'
 import {host, WebSocketHost} from '@/utils/constants'
 import request from "@/utils/request"
@@ -17,13 +17,31 @@
 const blinda = ref(false)
 const blindb = ref(false)
 const dialoglea = ref(false)
+const canSelectProjecta = ref(true);
+const canSelectProjectb = ref(true);
+const canSelectProjectc = ref(false);
 const tableDatax = ref([])
+const tableDatad = ref([])
 const upstatus = ref(t('basicData.machineaa'));
-const cuttingMachineStatusColor = ref('#911005'); // 鐢ㄤ簬鍔ㄦ�佽缃甶鏍囩鐨勮儗鏅壊 
+const cuttingMachineStatusColor = ref('#911005');
 const tableDataa = ref<any[]>([]);
 const tableDatab = ref<any[]>([]);
 const tableData = ref([])
-// const tableData = reactive([]);
+const filteredData = computed(() => {
+  // applyFilters 鍑芥暟搴旇鍦ㄦ煇澶勫畾涔夛紝鐢ㄤ簬鏍规嵁褰撳墠绛涢�夋潯浠惰繃婊ゆ暟鎹�
+  return applyFilters(tableData, currentFilters);
+});
+// 褰撳墠绛涢�夋潯浠讹紝搴旇鏄竴涓搷搴斿紡鍙橀噺锛岀敤浜庡瓨鍌ㄧ敤鎴烽�夋嫨鐨勭瓫閫夊��
+const currentFilters = ref<{ state?: string }>({});
+const filterTag = (value: string, row: any) => {
+  return row.state === value
+};
+// 搴旂敤绛涢�夋潯浠剁殑鍑芥暟
+const applyFilters = (data: any[], filters: { state?: string }) => {
+  return data.filter(row => {
+    return (!filters.state || String(row.state) === filters.state);
+  });
+};
 const titleSelectJson = ref({
   engineerId: [],
 })
@@ -55,24 +73,37 @@
   try {
     const response = await request.get("/loadGlass/up-patten-usage/prioritylist");
     if (response.code === 200) {
-      tableData.splice(0, tableData.length, ...response.data);
+      tableData.value = response.data
+      // tableData.splice(0, tableData.length, ...response.data);
       ElMessage.error(response.message);
-    }
+     window.localStorage.setItem('engineeringIda', tableData[0].engineeringId)
+}
   } catch (error) {
-    // 澶勭悊璇锋眰澶辫触鐨勬儏鍐�
-    // ElMessage.error('鑾峰彇琛ㄦ牸鏁版嵁澶辫触锛岃閲嶈瘯');
+    ElMessage.error(response.message);
   }
 };
 let socket = null;
-const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/uploadGlass`;
+const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlass`;
 const handleMessage = (data: any) => {
   tableDataa.value = data.list[0].slice(0, 2);
-  // tableDatab.value = data.list[0].slice(2, 4);
+  if(data.loadTask1.length !=0){
+  tableData.value = data.loadTask1[0]
+  window.localStorage.setItem('engineeringIda', tableData.value[0].engineeringId)
+  canSelectProjecta.value = false;
+  canSelectProjectb.value = false;
+  canSelectProjectc.value = true;
+}
+else {
+  canSelectProjecta.value = true;
+  canSelectProjectb.value = true;
+  canSelectProjectc.value = false;
+  tableData.value = '';
+}
 };
 onBeforeUnmount(() => {
   closeWebSocket();
 });
-// 鍒犻櫎
+// 缁撴潫宸ョ▼
 const handledelete = (row) => {
   blindb.value = true;
 };
@@ -100,13 +131,13 @@
     const response = await request.post('/loadGlass/up-patten-usage/selectUpPattenUsage', {
       stationCell: 5,
       engineerId: selectedProjectNo.value,
-      // filmRemove: filmRemove.value,
       filmRemove: parseInt(filmRemove.value, 10),
     })
-    window.localStorage.setItem('engineeringId', selectedProjectNo.value)
+    window.localStorage.setItem('engineeringIda', selectedProjectNo.value)
     window.localStorage.setItem('filmRemove', filmRemove.value)
     if (response.code == 200) {
       ElMessage.success(response.message);
+      closeWebSocket(socket);
       tableData.value = response.data;
       dialogFormVisible.value = false;
       selectedProjectNo.value = '';
@@ -120,17 +151,20 @@
     console.error(error);
   }
 }
-// 鍒犻櫎
+// 缁撴潫宸ョ▼
 const deleteTask = async () => {
   try {
-    let engineeringId = window.localStorage.getItem('engineeringId')
-    console.log(engineeringId);
+    let engineeringId = window.localStorage.getItem('engineeringIda')
     if (engineeringId !== '') {
       const response = await request.post('/loadGlass/engineering/engineering/deleteTask', {
         engineerId: engineeringId,
       })
       if (response.code == 200) {
         ElMessage.success(response.message);
+        tableDatad.value = response.data;
+        canSelectProjecta.value = true;
+        canSelectProjectb.value = true;
+        canSelectProjectc.value = false;
         blindb.value = false;
       } else {
         ElMessage.error(response.message);
@@ -150,10 +184,9 @@
 // 寮�濮嬩笂鐗�
 const handleon = async () => {
   let filmRemove = window.localStorage.getItem('filmRemove')
-  let engineeringId = window.localStorage.getItem('engineeringId')
+  let engineeringId = window.localStorage.getItem('engineeringIda')
   if (markingMachineStatus.value === 'green' && cuttingMachineStatus.value === 'green') {
     try {
-      // const response = await request.post('/loadGlass/engineering/engineering/pause', {
       const response = await request.post('/loadGlass/engineering/engineering/changeTask', {
         stationCell: 5,
         filmRemove: filmRemove,
@@ -161,7 +194,11 @@
         state: 1,
       })
       if (response.code == 200) {
-        ElMessage.success(response.message);
+        ElMessage.success(response.message);  
+        canSelectProjecta.value = false;
+        canSelectProjectb.value = false;
+        canSelectProjectc.value = true;
+        socket = initializeWebSocket(socketUrl, handleMessage);
         blind.value = false;
       } else {
         ElMessage.error(response.message);
@@ -170,7 +207,6 @@
       console.error(error);
     }
   } else if (markingMachineStatus.value === '#911005' || cuttingMachineStatus.value === '#911005') {
-    // 鎻愮ず鐢ㄦ埛鎵撴爣鏈烘湭灏辩华
     ElMessage.warning(t('basicData.pausea'));
   }
 }
@@ -178,8 +214,7 @@
 const handleup = async () => {
   try {
     let filmRemove = window.localStorage.getItem('filmRemove')
-    let engineeringId = window.localStorage.getItem('engineeringId')
-    console.log(engineeringId);
+    let engineeringId = window.localStorage.getItem('engineeringIda')
     if (engineeringId !== '') {
       const response = await request.post('/loadGlass/engineering/engineering/pause', {
         stationCell: 5,
@@ -213,7 +248,6 @@
   }
   const response = await request.post("/loadGlass/up-patten-usage/setUpPattenRequest", {
     state: selectValuesa[0],
-    // state: stateList,
     stationCell: 5
   })
   if (response.code === 200) {
@@ -250,10 +284,9 @@
   blinda.value = true;
 };
 const toggleEnableState = async (row: any) => {
-  // 妫�鏌� id 鏄惁涓虹┖  
   if (!row.id) {  
     ElMessage.error(t('basicData.updatanull'));  
-    return; // 濡傛灉 id 涓虹┖锛屽垯涓嶆墽琛屽悗缁搷浣�  
+    return;
   }  
   const newState = row.state === 100 ? 0 : 100;
   try {
@@ -268,7 +301,91 @@
     ElMessage.error(t('basicData.glassnull'));
   }
 };
-
+// 鐮存崯
+const opena = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('searchOrder.broke'), 
+      t('productStock.prompt'),  
+      {  
+        confirmButtonText: t('productStock.yes'), 
+        cancelButtonText: t('productStock.cancel'),
+        type: 'warning',  
+      } 
+    );
+    if (confirmResult === 'confirm') {
+     const response = await request.post('/loadGlass/engineering/engineering/insetDamage', {
+       glassId: row.glassId,
+       line: 5,
+       status: 1,
+       type: 8,
+       workingProcedure: '涓婄墖',
+    })
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {
+      ElMessage.error(response.msg);
+      }  
+    }  
+  } catch (error) {
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+// 浜哄伐鎷胯蛋
+const openb = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('order.takeawaya'), 
+      t('productStock.prompt'),  
+      {  
+        confirmButtonText: t('productStock.yes'), 
+        cancelButtonText: t('productStock.cancel'),
+        type: 'warning',  
+      } 
+    );
+    if (confirmResult === 'confirm') {
+      const response = await request.post('/loadGlass/engineering/engineering/insetDamage', {
+       glassId: row.glassId,
+       line: 5,
+       status: 1,
+       type: 9,
+       workingProcedure: '涓婄墖',
+    })
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {
+      ElMessage.error(response.msg);
+      }  
+    }  
+  } catch (error) {
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+// 鏋跺瓙澶嶄綅
+const handleptask = async() => { 
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('basicData.prackreset'), 
+      t('workOrder.prompt'),  
+      {  
+        confirmButtonText: t('workOrder.yes'), 
+        cancelButtonText: t('workOrder.cancel'),
+        type: 'warning',  
+      } 
+    );
+ if (confirmResult === 'confirm') {
+  var url="/loadGlass/rawGlassStorageDetails/shelfReset?slot="+ 1;
+      const response = await request.post(url) 
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {
+      ElMessage.error(response.msg);
+      }  
+    }  
+  } catch (error) { 
+    console.error('鍙戠敓閿欒:', error); 
+  }  
+}; 
 function getStatusType2(filmRemove) {
   switch (filmRemove) {
     case 0:
@@ -279,7 +396,6 @@
       return 'warning';
   }
 }
-
 function getStatusText2(filmRemove) {
   switch (filmRemove) {
     case 0:
@@ -309,32 +425,16 @@
         </el-button>
         <div style="margin-left: 70px;">{{ upstatus }}</div>
         <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
-        <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;">{{
-            $t('basicData.change')
-          }}
-        </el-button>
   </div>
-    <el-button style="margin-top: 5px;margin-left: 15px;"  type="primary" @click="selectproject">{{ $t('Mounting.previewproject') }}</el-button>
-    <el-button style="margin-top: 5px;margin-left: 20px;" type="success" @click="handleBind">{{ $t('basicData.startloading') }}</el-button>
-    <el-button style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button>
-    <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="danger" @click="handledelete">{{ $t('searchOrder.deleteTask') }}</el-button>
+    <el-button :disabled="!canSelectProjecta" style="margin-top: 5px;margin-left: 15px;"  type="primary" @click="selectproject">{{ $t('Mounting.previewproject') }}</el-button>
+    <el-button :disabled="!canSelectProjectb" style="margin-top: 5px;margin-left: 20px;" type="success" @click="handleBind">{{ $t('basicData.startloading') }}</el-button>
+    <el-button :disabled="!canSelectProjectc" style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button>
+    <el-button :disabled="!canSelectProjectc" style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="danger" @click="handledelete">{{ $t('searchOrder.deleteTask') }}</el-button>
     <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="info" @click="handlezhiban">{{ $t('searchOrder.dutyinformation') }}</el-button>
-    <el-select disabled v-model="selectValuesa[1]" clearable :placeholder="$t('Mounting.oneloadingline')"
-               style="margin-top: 5px;margin-left: 20px;">
-      <el-option :label="$t('Mounting.all')" value="0"></el-option>
-      <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
-      <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
-    </el-select>
-    <el-select v-model="selectValuesa[0]" clearable :placeholder="$t('film.taskstatus')" style="margin-top: 5px;margin-left: 20px;" >
-      <el-option :label="$t('Mounting.waiting')" value="1"></el-option>
-      <el-option :label="$t('film.execution')" value="2"></el-option>
-      <el-option :label="$t('film.finish')" value="3"></el-option>
-    </el-select>
-    <el-button type="primary" style="margin-left: 10px;" @click="selectReportData()">{{ $t('Mounting.setparameters') }}</el-button>
     <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;" v-loading="loading">
       <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
         <el-table
-            height="350"
+            height="400"
             ref="table"
             :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
             :data="tableData"
@@ -346,38 +446,31 @@
           <el-table-column prop="filmsId" :label="$t('Mounting.loadinglinea')" align="center"/>
           <el-table-column :label="$t('Mounting.projectnumber')" align="center">
             <template #default="{ row }">
-              <!-- 杩欓噷鎬绘槸鏄剧ず 1 -->
               <span>{{ 1 }}</span>
             </template>
           </el-table-column>
-          <el-table-column
-              align="center"
-              :label="$t('Mounting.state')"
-            min-width="80"
-            prop="state"
-          >
-          <template #default="scope">
-            <el-tag
+      <el-table-column
+      align="center"
+      prop="state"
+      :label="$t('Mounting.state')"
+      min-width="80"
+      :filters="[
+        { text: t('Mounting.pass'), value: 100 },
+        { text: t('Mounting.waiting'), value: 0 },
+      ]"
+      :filter-method="filterTag"
+      filter-placement="bottom-end"
+    >
+      <template #default="scope">
+        <el-tag
                 :type="scope.row.state === 100 ? 'success' : 'warning'"
                 @click="toggleEnableState(scope.row)"
+                disable-transitions
             >
               {{ scope.row.state === 100 ? $t('Mounting.pass') : $t('Mounting.waiting') }}
             </el-tag>
-          </template>
-      </el-table-column>
-          <!-- <el-table-column prop="filmRemove" :label="$t('Mounting.removalmethodp')" align="center"/> -->
-          <!-- <el-table-column
-              align="center"
-              :label="$t('Mounting.removalmethodp')"
-              prop="filmRemove"
-          >
-            <template #default="scope">
-              <el-tag :type="getStatusType2(scope.row.filmRemove)">
-                {{ getStatusText2(scope.row.filmRemove) }}
-              </el-tag>
-            </template>
-          </el-table-column> -->
-          <!-- <el-table-column prop="stationCell" :label="$t('Mounting.loadinglinea')" align="center"/> -->
+      </template>
+    </el-table-column>
         </el-table>
       </div>
     </el-card>
@@ -387,30 +480,20 @@
           <img src="../../assets/shangpianji.png" alt=""
                style="max-width: 20%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
           <el-table :data="tableDataa" border style="width: 75%;margin-top: 10%;margin-left: 8%;"
-                    :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
-          >
+                    :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}" >
             <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60"/>
             <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80"/>
             <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80"/>
             <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80"/>
             <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80"/>
+            <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="70">
+            <template #default="scope">
+          <el-button size="mini" type="text" plain @click="handleptask()">{{ $t('basicData.rackreset') }}</el-button>
+            </template>
+        </el-table-column>
           </el-table>
     </div>
   </div>
-      <!-- <div style="width: 48%;float: right;">
-        <div style="display: flex;">
-          <img src="../../assets/shangpianji.png" alt="" style="max-width: 25%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
-          <el-table :data="tableDatab" border style="width: 75%;margin-top: 10%;margin-left: 2%;"
-       :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
-          >
-            <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60" />
-            <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80" />
-            <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80" />
-            <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
-            <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80" />
-          </el-table>
-      </div>
-  </div> -->
 </div>
   <el-dialog v-model="blind" top="30vh" width="25%" :title="$t('basicData.startfilm')">
     <template #footer>
@@ -422,31 +505,41 @@
       </div>
     </template>
   </el-dialog>
-
-  <el-dialog v-model="blindb" top="30vh" width="25%" :title="$t('searchOrder.pdeleteTask')">
-    <template #footer>
+<!-- 缁撴潫宸ョ▼ -->
+  <el-dialog v-model="blindb" top="10vh" width="80%">
+    <el-table ref="table" style="margin-top: 20px;height: 450px;" :data="tableDatad" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+        <el-table-column prop="engineerId" fixed align="center" :label="$t('basicData.projectnumber')"/>
+        <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')"/>
+        <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')"/>
+        <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')"/>
+        <el-table-column prop="width" align="center" :label="$t('basicData.width')"/>
+        <el-table-column prop="height" align="center" :label="$t('basicData.height')"/>
+        <el-table-column prop="thickness" align="center" :label="$t('basicData.thickness')"/>
+        <el-table-column prop="filmsid" align="center" :label="$t('basicData.coatingtypes')"/>
+        <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.processcards')"/>
+        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="200">
+            <template #default="scope">
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('order.dilapidation') }}</el-button>
+              <el-button size="mini" type="text" plain @click="openb(scope.row)">{{ $t('order.takeaway') }}</el-button>
+            </template>
+        </el-table-column>
+        </el-table>
+        <template #footer>
       <div id="dialog-footer">
-        <el-button type="primary" @click="deleteTask">
-          {{ $t('basicData.confirm') }}
-        </el-button>
-        <el-button @click="blindb = false">{{ $t('basicData.cancel') }}</el-button>
+        <el-button type="danger" @click="deleteTask()">{{ $t('searchOrder.deleteTask') }}</el-button>
+        <el-button @click="blindb = false">{{ $t('large.close') }}</el-button>
       </div>
     </template>
   </el-dialog>
+  <!-- 鍊肩彮淇℃伅 -->
     <el-dialog v-model="dialoglea" top="15vh" width="70%" :title="$t('searchOrder.dutyinformation')">
       <el-table ref="table" style="margin-top: 20px;height: 300px;"
                 :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
         <el-table-column prop="line" fixed align="center" :label="$t('searchOrder.line')"/>
         <el-table-column prop="workProcesses" fixed align="center" :label="$t('searchOrder.process')"/>
         <el-table-column prop="teamsGroupsName" align="center" :label="$t('searchOrder.team')">
-          <!-- <template #default="{ row }">
-            <el-input v-model="row.teamsGroupsName" autocomplete="off" min-width="150"/>
-          </template>   -->
         </el-table-column>
         <el-table-column prop="deviceName" align="center" :label="$t('searchOrder.basic')">
-          <!-- <template #default="{ row }">
-        <el-input v-model="row.deviceName" autocomplete="off" min-width="150"/>
-      </template> -->
         </el-table-column>
         </el-table>
         <template #footer>
@@ -458,8 +551,7 @@
   <el-dialog v-model="blinda" top="24vh" width="30%" :title="$t('basicData.whetherpause')">
     <div style="margin-left: 50px;margin-bottom: 10px;">
     <el-form-item :label="$t('Mounting.loadingline')" :required="true">
-      <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')"
-                 style="margin-left: 20px;">
+      <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')" style="margin-left: 20px;">
         <el-option :label="$t('Mounting.all')" value="0"></el-option>
         <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
         <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
@@ -520,22 +612,18 @@
   </el-dialog>
   </div>
 </template>
- 
 <style scoped>
  .flex-container {  
   display: flex;  
-  align-items: center; /* 鍨傜洿灞呬腑 */  
+  align-items: center;
 }  
 .flex-container .el-form-item {  
-  flex: 1; /* 浣挎瘡涓〃鍗曢」鍗犳嵁鐩哥瓑鐨勭┖闂� */  
+  flex: 1;
   margin-right: 0; /* 绉婚櫎榛樿鐨勫彸渚ц竟璺� */  
 }  
 .flex-container .el-form-item:last-child {  
   margin-left: 20px; /* 涓虹浜屼釜琛ㄥ崟椤规坊鍔犲乏渚ц竟璺� */  
 }
- 
- 
- 
 #dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
 #dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
 #dialog-footer{

--
Gitblit v1.8.0