From 2280d3aaaf652a89159efbe196356d9c6c35bbe8 Mon Sep 17 00:00:00 2001
From: songshankun <songshankun@foxmail.com>
Date: 星期一, 23 十月 2023 19:07:44 +0800
Subject: [PATCH] feat: 计划时间取值字段更改; 修复0通道没有任务的情况下1通道的数据跑到左边的问题

---
 src/views/visualization.vue |  379 +++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 273 insertions(+), 106 deletions(-)

diff --git a/src/views/visualization.vue b/src/views/visualization.vue
index a6dd135..24b7b59 100644
--- a/src/views/visualization.vue
+++ b/src/views/visualization.vue
@@ -31,7 +31,7 @@
               </span>
             </span>
          </template>
-          鐢熶骇绠$悊鐪嬫澘
+          鏅鸿兘宸ヤ綔鍙�
           <span
             class="font el-icon-setting set-title"
             style="float: right"
@@ -104,7 +104,8 @@
                       style="font-size: 35px; font-weight: 600"
                       class="color_green"
                     >
-                      {{ taskData.finishNumber || 0 }}{{ taskData.Order.unit }}
+                      {{ processingStatistics(taskData).finishNumber }}
+<!--                      {{ taskData.Order.unit }}-->
                     </dd>
                   </dl>
                 </div>
@@ -117,16 +118,17 @@
                       style="font-size: 35px; font-weight: 600"
                       class="color_green"
                     >
-                      {{ taskData.Order.amount || 0 }}{{ taskData.Order.unit }}
+                      {{ processingStatistics(taskData).totalNumber }}
+<!--                      {{ taskData.Order.unit }}-->
                     </dd>
                   </dl>
                 </div>
               </div>
             </div>
             <div class="content_right">
-              <div class="gif" v-if="taskData.Procedure.ID" @click="processModelClick(taskData)">
-                    <img v-if="isUpdateIcon"  src="../../public/shan.gif" />
-                    <span v-else class="yuandian"></span>
+              <div class="gif" v-if="taskData.Procedure.ID" @click="processModelClick(taskData,index)">
+                    <img class="blink" v-if="taskData.isUpdateIcon"  src="../../public/shan.gif" />
+                    <span v-else class="tip"></span>
                </div>
               <el-descriptions :column="(activeName == 1||activeName == 3) ? 2 : 1" :colon="true">
                 <el-descriptions-item label="浜у搧鍚嶇О">{{
@@ -143,9 +145,9 @@
                   {{ taskData.Procedure.procedure.workHours || "--" }}
                 </el-descriptions-item>
                 <el-descriptions-item label="璁″垝鏃堕棿"
-                  >{{ formatDate(taskData.Order.startTime) || "--" }}
+                  >{{ formatDate(taskData.Procedure.startTime) || "--" }}
                   -
-                  {{ formatDate(taskData.Order.endTime) }}</el-descriptions-item
+                  {{ formatDate(taskData.Procedure.endTime) }}</el-descriptions-item
                 >
                 <el-descriptions-item label="閫氶亾">
                   {{ channelNameConfig[taskData.Channel] || "--" }}
@@ -166,16 +168,7 @@
                     text-color="#fff"
                     :text-inside="true"
                     :stroke-width="30"
-                    :percentage="
-                      (taskData.Order && taskData.finishNumber != 0 && taskData.Order.amount)
-                        ? parseInt(
-                            (taskData.finishNumber / taskData.Order.amount) *
-                              100
-                        )>100?100:parseInt(
-                            (taskData.finishNumber / taskData.Order.amount) *
-                              100
-                        ): 0
-                    "
+                    :percentage="calculateProgress(processingStatistics(taskData))"
                   ></el-progress>
                 </el-descriptions-item>
                 <!-- <el-descriptions-item label="鍚堟牸鐜�" style="width: 100%">
@@ -297,15 +290,7 @@
                       </div>
                       <div class="card_top-3">
                         <span class="card-top-r-t"
-                          >瀹屾垚杩涘害锛歿{
-                            (taskData.Order && taskData.finishNumber != 0 && taskData.Order.amount)
-                              ? parseInt(
-                                  (taskData.finishNumber /
-                                    taskData.Order.amount) *
-                                    100
-                                )
-                              : 0
-                          }}</span
+                          >瀹屾垚杩涘害锛歿{calculateProgress(processingStatistics(taskData))}}</span
                         >
                         <span class="card-top-r-b">
                           <el-progress
@@ -314,26 +299,14 @@
                             text-color="#fff"
                             :text-inside="true"
                             :stroke-width="10"
-                            :percentage="
-                             (taskData.Order && taskData.finishNumber != 0)
-                                ? parseInt(
-                                    (taskData.finishNumber /
-                                      taskData.Order.amount) *
-                                      100
-                                )>100?100:parseInt(
-                                    (taskData.finishNumber /
-                                      taskData.Order.amount) *
-                                      100
-                                )
-                                : 0
-                            "
+                            :percentage="calculateProgress(processingStatistics(taskData))"
                             :show-text="false"
                           ></el-progress>
                         </span>
                       </div>
                       <div class="card_top-2">
                         <div style="line-height: 45px; text-align: center">
-                          {{ taskData.Procedure.Status==3?'鐢熶骇瀹屾垚':'鐢熶骇涓�' }}
+                          {{ displayProcedureStatus(taskData) }}
                         </div>
                         <!-- <span class="card-top-r-t">瀹屾垚杩涘害锛�50%</span>
                           <span class="card-top-r-b">12鏈�28鏃� 08:24</span> -->
@@ -383,10 +356,11 @@
                   class="button-finish"
                   v-model="finishShow['finishShow&'+index]"
                   trigger="click"
+                  :ref="'popoverRef_' + index"
                 >
                   <p><i class="el-icon-error" style="color:red;margin-right:5px;"/>璇风‘璁ゆ槸鍚﹀凡瀹屾垚璇ョ敓浜т换鍔�?</p>
                   <div style="text-align: right; margin: 0">
-                    <el-button size="mini" @click="finishShow['finishShow&'+index] = false">
+                    <el-button size="mini" @click="closePopover(index)">
                       鍙栨秷</el-button
                     >
                     <el-button
@@ -494,26 +468,28 @@
         </div>
         <div class="right-top-m">
           璁惧鐘舵��:
-          <!-- 1鏂紑2鐢熶骇3寰呮満 -->
-          <span style="position: relative" v-if="plcStatus" >
-            <el-popover
-              v-if="plcStatus == 1&&plcNotConnected"
-              width="180"
-              :content="plcNotConnected"
-              placement="top-end"
-              trigger="click"
-            >
-              <span slot="reference">
-                <img  src="../../public/duan.png" />
-                鏂紑
+          <template v-for="(plcStatus, channel) in displayPLCStatus">
+             <!-- 1鏂紑2鐢熶骇3寰呮満 -->
+            <span class="plc-status" style="position: relative" v-if="plcStatus">
+              <el-popover
+                v-if="plcStatus === 1&&plcNotConnected"
+                width="180"
+                :content="plcNotConnected"
+                placement="top-end"
+                trigger="click"
+              >
+                <span slot="reference">
+                  <img src="../../public/duan.png"/>
+                  鏂紑
+                </span>
+              </el-popover>
+              <span v-else>
+                <img v-if="plcStatus === 1&&!plcNotConnected" src="../../public/duan.png"/>
+                <img v-else src="../../public/lian.png"/>
+                {{ plcStatus === 1 ? '鏂紑' : (plcStatus === 2 ? '鐢熶骇涓�' : '寰呮満') }}
               </span>
-            </el-popover>
-            <span v-else>
-              <img  v-if="plcStatus == 1&&!plcNotConnected"  src="../../public/duan.png" />
-              <img  v-else src="../../public/lian.png" />
-              {{ plcStatus==1?'鏂紑':(plcStatus==2?'鐢熶骇涓�':'寰呮満') }}
             </span>
-          </span>
+          </template>
         </div>
         <div class="right-top-m-btn">
           <!-- <el-button type="primary" @click="controlClick"> 鎺у埗</el-button> -->
@@ -524,7 +500,7 @@
           <div class="right-person-box" v-if="workers && workers.length > 0">
             <dl
               class="right-small-person"
-              v-for="(item, index) in workers"
+              v-for="(item, index) in deduplicateWorkers(displayWorkers())"
               :key="index"
             >
               <dt>
@@ -605,8 +581,6 @@
 
     </template> -->
     <!-- 鎺у埗鐨勫脊妗� -->
-    <AddControl ref="control" :Arr="Arr" />
-    <!-- 鎺у埗鐨勫脊妗� -->
     <TaskControlModal
       ref="control"
       :activeName="activeName"
@@ -617,6 +591,7 @@
     <ProcessModel
       ref="processModel"
       :listData="listData"
+      @updateGet="updateGet"
     />
   </div>
 </template>
@@ -640,6 +615,7 @@
 import ProcessModel from  "../components/ProcessModel.vue";
 import TaskControlModal from "@/components/TaskControlModal.vue";
 import {channelNameConfig} from "@/common/constants";
+import _ from 'lodash'
 export default {
   components: {
     TaskControlModal,
@@ -661,6 +637,8 @@
       // 鍙充晶瀹屾垚
       finishShow:{},
       workers:[],
+      // 淇濆瓨褰撳墠涓嶅悓閫氶亾鐨勫�肩彮浜�
+      channelWorkersMap:{0:[],1:[]},
       TasksCopy:[],
       Tasks: [
         {
@@ -753,7 +731,7 @@
       cutdownTimer: null,
       ProcessModelTimer: null,
       TaskCount:0,
-      plcStatus:0,
+      PLCStatusMap:{0:0,1:0},
       isTipShow:false,
       // isFinsh:0,
       safeProduce:'',
@@ -770,11 +748,11 @@
         procedureList: [],
       },
       processList:[],
-      isUpdateIcon:false,
       listData:[],
-      resResult:null,
+      resResult:[],
       resprocInfoTimer:null,
-      channelNameConfig: channelNameConfig
+      channelNameConfig: channelNameConfig,
+      index:null,
     };
   },
   mounted() {
@@ -808,10 +786,102 @@
     //   }
     // }
   },
+  computed:{
+    displayPLCStatus(){
+      let PLCStatus = []
+      if (this.activeName===1){
+        PLCStatus =[this.PLCStatusMap[0]]
+      }else if (this.activeName===2){
+        PLCStatus =[this.PLCStatusMap[0],this.PLCStatusMap[1]]
+      }else if (this.activeName===3){
+        PLCStatus =[this.PLCStatusMap[1]]
+      }else {
+        return []
+      }
+
+      return PLCStatus
+    }
+  },
   methods: {
+    newTaskPlaceholder(channel){
+      return {
+        Order: {},
+        Procedure: {
+          procedure: { inputMaterials: [], outputMaterials: [], workers: [] },
+        },
+        Channel:channel,
+        inputMaterials: [],
+        outputMaterials: [],
+        procedureList: [],
+      }
+    },
+    /**
+     * 灞曠ず宸ュ簭鐘舵��
+     * 濡傛灉PLC鐨勭姸鎬佹槸寰呮満瑕佽窡闅廝LC鐘舵��
+     * @param taskData
+     * @return {string}
+     */
+    displayProcedureStatus(taskData){
+      if (taskData?.plcStatus === 3){
+        return '寰呮満'
+      }
+      if (!taskData?.Procedure?.Status){
+        return ''
+      }
+      if (taskData.Procedure.Status===3){
+        return '鐢熶骇瀹屾垚'
+      }else{
+        return '鐢熶骇涓�'
+      }
+    },
+    /**
+     * 浠庝换鍔′腑鑾峰彇鍔犲伐鏁板拰鐩爣鏁�
+     * @param taskData
+     * @return {{totalNumber: number, finishNumber: number}}
+     */
+    processingStatistics(taskData){
+      const totalNumber = taskData?.totalNumber ?? 0
+      const finishNumber = taskData?.finishNumber ?? 0
+
+      return {
+        /** 鐩爣鏁� */
+        totalNumber: +totalNumber,
+        /** 鍔犲伐鏁� */
+        finishNumber: +finishNumber,
+      }
+    },
+    /**
+     * 璁$畻鐢熶骇杩涘害
+     * @param {{totalNumber: number, finishNumber: number}} statistics
+     * @return {number}  杩涘害,0~100
+     */
+    calculateProgress(statistics){
+      if (statistics.finishNumber === 0){
+        return 0
+      }
+      if (statistics.finishNumber === statistics.totalNumber){
+        return 100
+      }
+
+      const result =  Math.floor(statistics.finishNumber / statistics.totalNumber * 100)
+      return result > 100 ? 100 : result
+    },
+    deduplicateWorkers(workers){
+      return _.uniqBy(workers,ele=>ele.workerName)
+    },
+    updateGet(number,val){
+      if(val){
+        this.getTaskInfo(this.activeName,'new')
+        return true;
+      }
+      this.listData.number=number
+      if(this.index){
+        this.TasksCopy[this.index].number=number
+      }
+    },
     getModelList(){
-      this.resResult=null
       for (let i in this.TasksCopy){
+        this.TasksCopy[i].isUpdateIcon=false;
         if(this.TasksCopy[i].Procedure.ID&&this.TasksCopy[i].number){
           processModelList({
             procedureId: this.TasksCopy[i].Procedure.ID,
@@ -822,21 +892,24 @@
             if(res.code==200){
               this.processList=res.data?res.data:[];
               if(this.processList.length>0){
-                for(let i in this.processList){
-                  if(this.processList[i].isUpdate){
-                    this.isUpdateIcon=true;
+                for(let j in this.processList){
+                  if(this.processList[j].isUpdate){
+                    this.TasksCopy[i].isUpdateIcon=true;
+                    this.$forceUpdate()
                     break;
                   }
                 }
               }
             }
-            this.resResult=res;
+            this.resResult[i]=res;
+            console.log( this.resResult[i],'===res111')
           })
         }
       }
     },
-    processModelClick(list){
+    processModelClick(list,index){
       this.listData=list;
+      this.index=index
       if( Object.keys(this.listData).length > 0){
         if(this.listData.Procedure.ID&&this.listData.number){
           this.$refs.processModel.islook=true
@@ -847,10 +920,19 @@
     },
     getProcessModelList(){
       this.getModelList()
-      if (!this.ProcessModelTimer&&!this.resResult) {
+      let string=false;
+      if(this.resResult.length>0){
+        for(let i in this.resResult){
+          if(this.resResult[i]){
+            string=false;
+          }
+        }
+      }
+      if (!this.ProcessModelTimer&&!string) {
           this.ProcessModelTimer = setInterval(() => {
+            this.resResult=[]
           this.getModelList();
-        }, 10000)
+        }, 5000)
       }
     },
     mergeProcessParams(params){
@@ -1052,41 +1134,66 @@
       });
     },
 
-    getTaskInfo(val) {
+    /**
+     * 鏍规嵁褰撳墠灞曠ず鐨勬槸0閫氶亾杩樻槸1閫氶亾杩樻槸涓や釜閫氶亾灞曠ず瀵瑰簲鐨勫�肩彮浜�
+     * @return {*[]}
+     */
+    displayWorkers(){
+      let showWorkers = []
+      if (this.activeName===1){
+        showWorkers =[...this.channelWorkersMap[0]]
+      }else if (this.activeName===2){
+        showWorkers =[...this.channelWorkersMap[0],...this.channelWorkersMap[1]]
+      }else if (this.activeName===3){
+        showWorkers =[...this.channelWorkersMap[1]]
+      }else {
+        return []
+      }
+
+      return showWorkers
+    },
+
+    getTaskInfo(val,info) {
       this.Tasks = [];
       this.TasksCopy=[]
       getTaskInfo({taskMode:2}).then((res) => {
         if (res.code == 200&&res.data) {
-          let arr=[]
-          if(res.data.Tasks){
-           arr.sort(function(a,b){
-            return (a.Channel - b.Channel)
-           })
-          }
-          this.TasksCopy = res.data.Tasks ? res.data.Tasks : [];
+          this.TasksCopy = res.data?.Tasks ?? [];
           // this.safeProduce=res.data.Prompt.safeProduce?res.data.Prompt.safeProduce:''
-          this.plcNotConnected=res.data.Prompt.plcNotConnected?res.data.Prompt.plcNotConnected:''
-          this.ChannelAmount=res.data.ChannelAmount?res.data.ChannelAmount:1
+          this.plcNotConnected=res.data.Prompt.plcNotConnected ?? ''
+          this.ChannelAmount=res.data.ChannelAmount ?? 1
           // if(this.ChannelAmount>1 &&this.TasksCopy.length<2){
           //   this.TasksCopy.push(this.object)
           // }
-          this.TaskCount=res.data.TaskCount?res.data.TaskCount:0
+          this.TaskCount=res.data.TaskCount ?? 0
 
-          if ((this.TasksCopy.length ==0 )||!this.TasksCopy) {
-            if (this.activeName == 1||this.activeName == 3) {
-              this.TasksCopy.push(this.object);
-            } else {
-              this.TasksCopy.push(this.object);
-              this.TasksCopy.push(this.object);
-            }
-          }
+          // 鎵惧嚭缂哄皯浠诲姟鏁版嵁鐨勯�氶亾, 浣跨敤鍗犱綅鏁版嵁鍗犱綇瀵瑰簲閫氶亾
+          const channelNumbers = this.TasksCopy.map(task=>task.Channel)
+          const allChannels = [0,1];
+          const lackChannels = _.chain(allChannels).difference(channelNumbers).value()
+          lackChannels.forEach(channel => this.TasksCopy.push(this.newTaskPlaceholder(channel)))
+          this.TasksCopy.sort((a,b)=>a.Channel - b.Channel)
+
           this.workers=res.data.workers?res.data.workers:[]
+
+          // 灏嗗�肩彮浜烘牴鎹�氶亾鍙峰垎缁�
+          const groupByChannel= _.groupBy(res.data.Tasks,ele=>ele.Channel)
+          const taskList0= _.first(groupByChannel[0])
+          const taskList1= _.first(groupByChannel[1])
+          const worker0List = taskList0?.Procedure?.procedure?.workers ?? []
+          const worker1List = taskList1?.Procedure?.procedure?.workers ?? []
+          this.channelWorkersMap['0'] =worker0List
+          this.channelWorkersMap['1'] =worker1List
+
           for (let i in this.TasksCopy) {
             this.TasksCopy[i].procedureList = [];
             this.TasksCopy[i].inputMaterials = [];
             this.TasksCopy[i].outputMaterials = [];
             this.TasksCopy[i].finishNumber = 0;
+            this.TasksCopy[i].totalNumber = 0;
+            this.TasksCopy[i].plcStatus = 0;
             this.TasksCopy[i].number=0;
+            this.TasksCopy[i].isUpdateIcon=false;
             this.finishShow['finishShow&'+i]=false
             this.TasksCopy[i].Procedure.procedure.workers = this.TasksCopy[i].Procedure
               .procedure.workers
@@ -1110,20 +1217,26 @@
                   });
                   this.TasksCopy[i].Arr=res.data.Params ? res.data.Params : []
                   // this.isFinsh=Number(i)+1
+                  this.$forceUpdate()
                 }
               });
             }
             this.setInterCard("inputMaterials", "cardBox1&" + i, i);
             this.setInterCard("outputMaterials", "cardBox3&" + i, i);
           }
+          this.getProcessModelList();
           this.getStartArr()
+          this.cutClick(val?val:1)
+          if(info=='new'){
+            return true;
+          }
+
           this.getProgressInfo();
               if (!this.procInfoTimer&&!this.resprocInfoTimer) {
                 this.procInfoTimer = setInterval(() => {
                   this.getProgressInfo();
                 }, 3000);
               }
-           this.getProcessModelList();
         }
         // if (res.code != 200 || this.TasksCopy.length == 0) {
         //   this.getcountdown();
@@ -1134,7 +1247,7 @@
         //     }, 60000);
         //   }
         // }
-        this.cutClick(val?val:1)
+
       });
       // this.TasksCopy.push(this.object)
       // this.TasksCopy.push(this.object)
@@ -1193,10 +1306,10 @@
             procedureId: this.TasksCopy[i].Procedure.ID,
           }).then((res) => {
             if (res.code == 200) {
-              this.TasksCopy[i].finishNumber = res.data.finishNumber
-                ? res.data.finishNumber
-                : 0;
-                this.plcStatus=res.data.plcStatus?res.data.plcStatus:0
+              this.TasksCopy[i].finishNumber = res.data?.finishNumber ?? 0;
+              this.TasksCopy[i].totalNumber = res.data?.totalNumber ?? 0;
+              this.TasksCopy[i].plcStatus = res.data?.plcStatus ?? 0
+              this.PLCStatusMap[i] = res.data?.plcStatus ?? 0
             }
             this.resprocInfoTimer=res;
           });
@@ -1239,6 +1352,15 @@
       } else {
         this.$message.error("褰撳墠璁惧娌℃湁宸ュ簭锛�");
       }
+    },
+
+    /**
+     * 鍏抽棴 tooltip
+     * @param index
+     */
+    closePopover(index){
+      this.finishShow['finishShow&'+index] = false
+      this.$refs?.['popoverRef_' + index]?.[0]?.doClose()
     },
     getRandomNumber(min, max) {
       return Math.floor(Math.random() * (max - min + 1) + min);
@@ -1530,6 +1652,28 @@
         // margin-top:-5px;
         vertical-align: middle;
       }
+
+
+.tip {
+  display:inline-block;
+  // background: #15d815;
+  background:red;
+  border-radius: 50%;
+  // margin-top:-5px;
+  vertical-align: middle;
+}
+.blink{
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+}
+.tip, .blink{
+  position: absolute;
+  top: -6px;
+  right: -6px;
+  width: 14px;
+  height: 14px;
+}
 .bottom_list {
   position: relative;
   padding: 10px;
@@ -1723,7 +1867,7 @@
           width: 100%;
           height: 30px;
           // text-align: left;
-          font-size: 24px;
+          font-size: 28px!important;
           margin: 0;
           text-align: center;
           line-height: 36px;
@@ -1738,15 +1882,18 @@
         border-radius: 6px;
         position:relative;
         .gif{
+          background: url("../../public/setting.png") no-repeat;
+          background-size:100% 100%;
           position:absolute;
           right:15px;
           top:10px;
           width:35px;
+          height: 35px;
           vertical-align: middle;
           cursor:pointer;
-          img{
-            width:100%;
-          }
+          //img{
+          //  width:100%;
+          //}
         }
         // background: #233b9e;
         .el-descriptions-row{
@@ -1798,11 +1945,11 @@
             white-space:nowrap;
           }
         .card_top-2{
-          width:35%;
+          width:38%;
         }
         .card-top-input-out-r,
         .card_top-3 {
-          width:65%;
+          width:62%;
         }
         .card_top-2,.card-top-input-out-r,
         .card_top-3 {
@@ -2118,4 +2265,24 @@
     padding: 12px;
   }
 }
+.plc-status{
+  margin-right: 24px;
+  position: relative;
+  display: inline-block;
+  height: 50px;
+  &:after{
+    content: '';
+    position: absolute;
+    top: 50%;
+    right: -12px;
+    margin-top: -15px;
+    border-right: 2px solid #ffffff;
+    height: 30px;
+  }
+}
+.plc-status:last-child{
+  &:after{
+    display: none;
+  }
+}
 </style>

--
Gitblit v1.8.0