caner 1 year ago
parent
commit
2b94ec71eb
1 changed files with 142 additions and 66 deletions
  1. 142 66
      src/pages/views/process/index.vue

+ 142 - 66
src/pages/views/process/index.vue

@@ -2,11 +2,19 @@
   <div class="process">
     <svg
       viewBox="0 0 1440 780"
-      @click.stop="details({ X: -10000, Y: -10000 })"
+      @click.stop="details({ X: -10000, Y: -10000, name: '', sTime: 0, eTime: 0 })"
     >
       <defs>
         <!-- 24小时文字样式 -->
         <g id="default">
+          <line
+            x1="0"
+            y1="0"
+            x2="1440"
+            y2="0"
+            stroke=" #195481"
+            stroke-width="1"
+          />
           <rect
             x="0"
             y="0"
@@ -60,32 +68,32 @@
         <g id="tip">
           <image
             href="./img/1.png"
-            width="150"
+            width="130"
             height="80"
           />
           <text
             fill="white"
-            y="25"
-            x="60"
+            y="28"
+            x="15"
             font-size="13"
           >
-            {{ tipData.txt }}
+            {{ tipData.name }}
           </text>
           <text
             fill="white"
-            y="45"
-            x="20"
+            y="48"
+            x="15"
             font-size="12"
           >
-            范围:{{ tipData.st }}
+            开始时间:{{ tipData.st }}
           </text>
           <text
             fill="white"
-            y="65"
-            x="20"
+            y="68"
+            x="15"
             font-size="12"
           >
-            等级:{{ tipData.et }}
+            结束时间:{{ tipData.et }}
           </text>
         </g>
       </defs>
@@ -101,7 +109,7 @@
         ry="2"
         :width="item.width"
         height="20"
-        :fill="item.color"
+        :fill="colorDic[item.name!]"
         @click.stop="details(item)"
       />
       <!-- tips -->
@@ -115,74 +123,142 @@
 </template>
 
 <script setup lang='ts'>
-import { ref } from 'vue'
+import { ref, watch } from 'vue'
 
 interface Item {
-  name?: string,
-  time?: number,
-  color?: string,
+  name: string,
   X?: number,
   Y?: number,
-  width?: number
+  width?: number,
+  sTime: number,
+  eTime: number,
+  st?: string,
+  et?: string
+}
+const props = withDefaults(defineProps<{
+  data?: Item[]
+}>(), {
+  data: () => [
+    {
+      name: '地质钻探',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '开挖(装药)',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '通风除尘',
+      sTime: 1730797200000,
+      eTime: 1730800800000
+    },
+    {
+      name: '装渣',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '运渣',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '拱架安装',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '锚杆安装',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '湿喷混凝土',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '超前支护',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '仰拱作业',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '防排水',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '二衬作业',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '养护',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    },
+    {
+      name: '水电槽',
+      sTime: 1730795400000,
+      eTime: 1730797200000
+    }
+  ]
+})
+
+const colorDic: Object = {
+  地质钻探: '#6fff8c',
+  '开挖(装药)': '#439bff',
+  通风除尘: '#ff7e47',
+  装渣: '#ff64d3',
+  运渣: '#3cecda',
+  拱架安装: '#ffc941',
+  锚杆安装: '#956dff',
+  湿喷混凝土: '#ffeb81',
+  超前支护: '#20c8ff',
+  仰拱作业: '#d510ff',
+  防排水: '#0000FF',
+  二衬作业: '#0000CD',
+  养护: '#B0C4DE',
+  水电槽: '#B0E0E6'
 }
 const time = new Array(25).fill(null).map((_, i) => i + 1)
-const data = [
-  {
-    name: '测量放样',
-    time: 0.5,
-    color: '#6fff8c'
-  },
-  {
-    name: '钻孔',
-    time: 2.5,
-    color: '#439bff'
-  },
-  {
-    name: '装药',
-    time: 0.75,
-    color: '#ff7e47'
-  },
-  {
-    name: '爆破除尘',
-    time: 0.5,
-    color: '#ff64d3'
-  },
-  {
-    name: '出渣',
-    time: 3.5,
-    color: '#3cecda'
-  }
-]
-const planDetail = setData(data) as Item[]
+const planDetail = ref([] as Item[])
 const tipData = ref({
-  X: -100000, txt: '', st: 1, et: 1, Y: -10000
-})
+  X: -100000, name: '', st: '', et: '', Y: -10000
+} as Item)
+
+function countTime(item: Item[]) {
+  const arr = item.map((el, k) => ({
+    ...el,
+    st: `${el.sTime}`,
+    et: `${el.eTime}`,
+    width: Math.floor((el.eTime! - el.sTime!) / 1000 / 60 / 60 * 10) / 10 * 60,
+    X: (new Date(el.sTime!).getHours() - 1 + new Date(el.sTime!).getMinutes() / 60) * 60,
+    Y: 50 + k * 40
+  }))
 
-function setData(list: Item[]) {
-  let lastWidth = 0
-  const arr = [] as Item[]
-  for (let k = 0; k < list.length; k++) {
-    const el = list[k]
-    arr.push({
-      ...el,
-      width: el.time! * 60,
-      X: lastWidth,
-      Y: 50 + k * 40
-    })
-    lastWidth += el.time! * 60
-  }
   return arr
 }
 
-const details = (item: Item) => {
+function details(item: Item) {
   tipData.value = {
-    txt: item.name || '',
-    X: item.X! + item.width! / 2 - 75,
-    Y: item.Y! + 20,
-    st: item.time || 0,
-    et: item.time || 0
+    ...item,
+    X: item.X! + item.width! / 2 - (130 / 2),
+    Y: item.Y! + 20
   }
 }
+
+watch(() => props.data, (v) => {
+  planDetail.value = countTime(v)
+}, { immediate: true })
+
 </script>
 <style lang="scss" scoped>
 .process {