From e9c1bc5f107ebfdb58b6c85e01a719bbeb643d66 Mon Sep 17 00:00:00 2001
From: songshankun <songshankun@foxmail.com>
Date: 星期日, 08 十月 2023 11:39:59 +0800
Subject: [PATCH] feat: 任务弹窗添加翻页展示

---
 vue.config.js                       |    4 
 src/components/TaskControlModal.vue |  923 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/views/visualization.vue         |   69 ++-
 3 files changed, 972 insertions(+), 24 deletions(-)

diff --git a/src/components/TaskControlModal.vue b/src/components/TaskControlModal.vue
new file mode 100644
index 0000000..a32ed8d
--- /dev/null
+++ b/src/components/TaskControlModal.vue
@@ -0,0 +1,923 @@
+<template>
+  <el-dialog
+    :close-on-click-modal="false"
+    :visible.sync="show"
+    width="753px"
+    class="add-event-dialog"
+    :show-close="false"
+  >
+    <div class="tank-box">
+      <div slot="title" class="tac drawerHeader">
+        <span class="title-l">{{ messageError ? '鎻愮ず' : '鏂颁换鍔�' }}</span>
+      </div>
+      <div class="dialog-content-box">
+        <div style="
+          margin: 0 auto;
+          width: 100%;
+          height: 100%;
+          overflow: hidden;
+          text-align: left;"
+        >
+          <template v-if="messageError">
+            <div class="error-t">
+              <span v-if="messageError ==='涓嬪彂鎴愬姛锛�'" class="el-icon-success color_success"></span>
+              <span v-else class="el-icon-error color_error"></span>
+            </div>
+            <div class="error-m">
+              {{ messageError }}
+            </div>
+            <div
+              class="font_size_20 color_fff"
+              style="text-align: center; width: 100%; margin: 10px 0"
+            >
+              <span v-if="messageError ==='涓嬪彂鎴愬姛锛�'" style="font-size:30px;">{{ 3 - Number(second) }}s</span>
+              <span v-else>璇烽噸璇�</span>
+            </div>
+
+          </template>
+          <template v-else-if="Object.keys(currentTaskData || {}).length">
+            <div class="title-box margin_bottom_13">
+              <div class="title-item color_4efefa font_size_20 title-bng">
+                褰撳墠浠诲姟锛歿{ currentTaskData.Procedure.procedure.procedureName || "" }}
+              </div>
+              <div class="title-item title-bng color_4efefa font_size_20">
+                鐢熶骇鏁伴噺锛�<span style="color:#fff;">{{ currentTaskData.Order.amount || 0 }}</span>
+              </div>
+            </div>
+            <div class="title-auto-box">
+              <div class="title-box margin_bottom_20">
+                <div class="title-item">
+                  璁㈠崟缂栧彿锛歿{ currentTaskData.Order.orderId || "" }}
+                </div>
+                <div class="title-item">
+                  宸ュ崟缂栧彿锛歿{ currentTaskData.Order.workOrderId || "" }}
+                </div>
+                <div class="title-item">
+                  浜у搧鍚嶇О锛歿{ currentTaskData.Order.productName || "" }}
+                </div>
+                <div class="title-item">
+                  鏁伴噺锛歿{ currentTaskData.Order.amount || 0 }}{{ currentTaskData.Order.unit }}
+                </div>
+                <div class="title-item">
+                  浜よ揣鏃ユ湡锛歿{ currentTaskData.Order.deliverDate || "" }}
+                </div>
+                <div class="title-item">
+                  宸ユ椂锛� {{ currentTaskData.Procedure.procedure.workHours || "" }}
+                </div>
+                <div class="title-item">
+                  璁″垝鏃堕棿锛� {{ formatDate(currentTaskData.Order.startTime) || "" }}
+                  -
+                  {{ formatDate(currentTaskData.Order.endTime) }}
+                </div>
+
+                <div class="title-item">
+                  瀹㈡埛鍚嶇О锛歿{ currentTaskData.Order.customer || "" }}
+                </div>
+                <div class="title-item title-item-two">
+                  璐х墿鎻忚堪锛� {{ currentTaskData.Order.orderAttr || "" }}
+                </div>
+
+                <div class="title-item title-item-two">
+                  鍙傛暟瑕佹眰锛歿{ currentTaskData.Order.parameter || "" }}
+                </div>
+              </div>
+              <div class="title-box margin_bottom_20">
+                <div
+                  style="
+                    color: #fff;
+                    font-size: 18px;
+                    margin-bottom: 10px;
+                    margin-top: 20px;
+                  "
+                  class="color_4efefa"
+                >
+                  宸ヨ壓鍙傛暟
+                </div>
+                <div
+                  class="title-item title-item-two"
+                  v-for="(item, index) in currentProcessParams"
+                  :key="index"
+                >
+                  {{ item.Key }}锛歿{ item.Value || "" }}
+
+                </div>
+              </div>
+            </div>
+            <div class="process-box" v-if="showBtn === 2 || showBtn === 3">
+              <div
+                style="
+                  color: red;
+                  font-size: 26px;
+                  width: 100%;
+                  text-align: center;
+                  margin-bottom: 15px;
+                  line-height:35px;
+                "
+                :class="showBtn === 3&&isLoading?'margin-top-10px':'margin-top-40px'"
+              >
+                <div class="gif-box" v-if="showBtn === 2||(showBtn === 3&&!isLoading)">
+                  <template v-if="showBtn === 2">
+                    <div class="gif">
+                      <img src="../../public/shan.gif"/>
+                    </div>
+
+                  </template>
+                  <template v-if="showBtn === 3&&!isLoading">
+                    <div class="gif">
+                      <span class="yuandian"></span>
+                    </div>
+                  </template>
+                  <div class="gif-right">
+                    ----- 鍓╀綑鏃堕棿 -----
+                    <span>00:00:{{ 30 - Number(num) < 10 ? 0 : '' }}{{ 30 - Number(num) }}</span>
+                  </div>
+                </div>
+                {{ message }}
+              </div>
+              <template v-if="showBtn === 3&&isLoading">
+                <div class="progress-item">
+                  <span>{{ (+num / 30) * 100 }}%</span>
+                  <el-progress
+                    style="width: calc(100% - 50px); float: right"
+                    define-back-color="#CDC6C6"
+                    color="#00cc66"
+                    text-color="#fff"
+                    :text-inside="true"
+                    :stroke-width="20"
+                    :percentage="(+num / 30) * 100"
+                  ></el-progress>
+                </div>
+              </template>
+            </div>
+          </template>
+        </div>
+        <!--宸︾炕椤垫寜閽�-->
+        <div v-show="showPreviousTaskBtn" class="paginator-btn previous" @click="previousTask">&lt;</div>
+        <!--鍙崇炕椤垫寜閽�-->
+        <div v-show="showNextTaskBtn" class="paginator-btn next" @click="nextTask">&gt;</div>
+      </div>
+      <div slot="footer" :class="messageError?'dialog-footer tac btn-error':'dialog-footer tac'"
+           style="overflow: hidden">
+        <template v-if="messageError">
+          <div class="btn" v-if="messageError ==='涓嬪彂鎴愬姛锛�'||getProcessParamsErrMsg" @click="closeClick">
+            <img src="../../public/close-btn.png"/>
+          </div>
+          <div class="btn" v-else @click="confirmClick2">
+            <img src="../../public/agin.png"/>
+          </div>
+        </template>
+        <template v-else>
+          <div class="btn" @click="closeClick">
+            <img src="../../public/btn1.png"/>
+          </div>
+          <div class="btn" v-if="showBtn === 1">
+            <div v-if='currentTaskData && currentTaskData.CanStarted' @click="confirmClick1">
+              <img src="../../public/confirm1.png"/>
+            </div>
+            <div v-else>
+              <img src="../../public/confirm2.png"/>
+            </div>
+          </div>
+          <div class="btn" v-if="showBtn === 2">
+            <img src="../../public/confirm2.png"/>
+          </div>
+          <div
+            class="btn"
+            v-if="showBtn === 3"
+            v-prevent-re-click="3000"
+            @click="onSubmit()"
+          >
+            <i class="el-icon-loading icon-loading" v-if="isLoading"/>
+            <img src="../../public/loading.png" v-if="isLoading"/>
+            <img src="../../public/confirm3.png" v-if="!isLoading"/>
+          </div>
+        </template>
+      </div>
+
+      <div class="paginator-text" v-if="taskList?.length">
+        <span class="page">{{ paginatorText.page }}</span>
+        <span class="total">/ {{ paginatorText.total }}</span>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import {getTaskInfo, sendProcessParams, startTask,} from "@/api/home"; // 浜х嚎
+export default {
+  name: 'TaskControlModal',
+  components: {},
+  props: {
+    activeName: {
+      type: [String, Number],
+      default: () => {
+        return 1;
+      },
+    },
+  },
+  data() {
+    return {
+      show: false,
+      // 褰撳墠搴斿睍绀虹殑浠诲姟绱㈠紩
+      currentTaskIndex: 0,
+      // 褰撳墠灞曠ず鐨勪换鍔″搴旂殑宸ヨ壓鍙傛暟
+      currentProcessParams: [],
+      getProcessParamsErrMsg: '',
+      // 浠诲姟鍒楄〃
+      taskList: [],
+      showBtn: 1,
+      num: 0,
+      timer: null,
+      safeProduce:'',
+      message: this.safeProduce,
+      messageError: "",
+      resParams: {},
+      isLoading: false,
+      second: 0,
+      secondTimer: null,
+    };
+  },
+  mounted() {
+    this.getTaskList().then(() => {
+      const firstData = this.taskList[0]
+      const id = firstData?.Procedure?.ID
+      if (id) {
+        this.currentTaskIndex = this.taskList.findIndex(ele => ele.Procedure.ID === id)
+        this.getCurrentTaskProduceParams(id)
+      }
+    })
+    this.message = this.safeProduce;
+    this.getInfo();
+  },
+  computed: {
+    /**
+     * 褰撳墠搴斿睍绀虹殑浠诲姟鏁版嵁
+     * @returns {*}
+     */
+    currentTaskData() {
+      return this.taskList[this.currentTaskIndex]
+    },
+    showPreviousTaskBtn() {
+      return this.currentTaskIndex > 0
+    },
+    showNextTaskBtn() {
+      return this.currentTaskIndex < this.taskList.length - 1
+    },
+    paginatorText() {
+      return {
+        page: this.currentTaskIndex + 1,
+        total: this.taskList.length
+      }
+    }
+  },
+  watch: {
+    taskData(val) {
+      this.message = this.safeProduce;
+      this.getInfo();
+    },
+    num() {
+      if (this.num === 30) {
+        clearInterval(this.timer);
+        this.showBtn = 3;
+      }
+    },
+    second() {
+      if (this.second === 3) {
+        clearInterval(this.secondTimer);
+        this.closeClick()
+      }
+    },
+    show(newVal) {
+      if (this.timer) {
+        clearInterval(this.timer);
+      }
+      this.num = 0;
+      this.showBtn = 1;
+      this.isLoading = false
+      this.second = 0
+      this.secondTimer = null
+      this.messageError = ''
+      this.resParams = {};
+      if (newVal){
+        this.getTaskList().then(() => {
+          const firstData = this.taskList[0]
+          const id = firstData?.Procedure?.ID
+          if (id) {
+            this.currentTaskIndex = this.taskList.findIndex(ele => ele.Procedure.ID === id)
+            this.getCurrentTaskProduceParams(id)
+          }
+        })
+        this.message = this.safeProduce;
+        this.getInfo();
+      }
+      this.$emit('isTip', this.show)
+    },
+  },
+  methods: {
+    confirmClick2() {
+      this.messageError = "";
+      this.isLoading = false;
+    },
+    confirmClick1() {
+      this.num = 0;
+      this.showBtn = 2;
+      (this.message = this.safeProduce),
+        (this.timer = setInterval(() => {
+          this.num = this.num + 1;
+        }, 1000));
+    },
+    closeClick() {
+      if (this.timer) {
+        clearInterval(this.timer);
+      }
+      this.num = 0;
+      this.shutdown();
+    },
+    /**
+     * 鑾峰彇浠诲姟鍒楄〃
+     */
+    getTaskList() {
+      return getTaskInfo({taskMode: 1}).then(res => {
+        if (res.code == 200) {
+          this.taskList = res.data?.Tasks?.length ? res.data.Tasks : []
+          this.safeProduce = res.data.Prompt.safeProduce ? res.data.Prompt.safeProduce : ''
+          this.message = this.safeProduce
+        }
+      }, err => {
+        this.taskList = []
+        console.error(err)
+      },)
+    },
+    /**
+     * 鑾峰彇褰撳墠灞曠ず鐨勪换鍔$殑宸ヨ壓鍙傛暟
+     */
+    getCurrentTaskProduceParams(id) {
+      // const id = this.currentTaskData?.Procedure?.ID
+      if (id) {
+        startTask({id}).then((res) => {
+          if (res.code === 200) {
+            this.currentProcessParams = res.data.Params ?? []
+          } else {
+            this.getProcessParamsErrMsg = res.msg ?? '鑾峰彇宸ヨ壓鍙傛暟澶辫触锛�';
+          }
+        });
+      }
+    },
+    /**
+     * 鍓嶇炕椤�
+     */
+    previousTask() {
+      if (this.currentTaskIndex - 1 >= 0) {
+        this.currentTaskIndex -= 1
+        this.$nextTick(() => {
+          const id = this.currentTaskData?.Procedure?.ID
+          this.getCurrentTaskProduceParams(id)
+          this.message = this.safeProduce;
+          this.getInfo()
+        })
+      }
+    },
+    /**
+     * 鍚庣炕椤�
+     */
+    nextTask() {
+      if (this.currentTaskIndex + 1 <= this.taskList.length - 1) {
+        this.currentTaskIndex += 1
+        this.$nextTick(() => {
+          const id = this.currentTaskData?.Procedure?.ID
+          this.getCurrentTaskProduceParams(id)
+          this.message = this.safeProduce;
+          this.getInfo()
+        })
+      }
+    },
+    getInfo() {
+      // 1 鏈敓浜� 2鐢熶骇涓� 3鐢熶骇瀹屾垚
+      if (this.currentTaskData?.Procedure?.ID && this.currentTaskData?.Procedure?.Status === 1) {
+        this.num = 0;
+        this.showBtn = 1;
+        this.show = true;
+      } else {
+        this.show = false;
+      }
+      if (this.getProcessParamsErrMsg) {
+        this.messageError = this.getProcessParamsErrMsg;
+      }
+    },
+    getDateObj(date, fmt) {
+      if (/(y+)/.test(fmt)) {
+        fmt = fmt.replace(
+          RegExp.$1,
+          (date.getFullYear() + "").substr(4 - RegExp.$1.length)
+        );
+      }
+      let o = {
+        "M+": date.getMonth() + 1,
+        "d+": date.getDate(),
+        "h+": date.getHours(),
+        "m+": date.getMinutes(),
+        "s+": date.getSeconds(),
+      };
+      for (let k in o) {
+        if (new RegExp(`(${k})`).test(fmt)) {
+          let str = o[k] + "";
+          fmt = fmt.replace(
+            RegExp.$1,
+            RegExp.$1.length === 1 ? str : this.padLeftZero(str)
+          );
+        }
+      }
+      return fmt;
+    },
+    padLeftZero(str) {
+      return ("00" + str).substr(str.length);
+    },
+    // 鏍煎紡鍖栨椂闂� ==> yyyy-mm-dd
+    formatDate(value) {
+      if (value) {
+        const now = value ? new Date(value * 1000) : new Date();
+        return this.getDateObj(now, "MM-dd hh:mm");
+      } else {
+        return "";
+      }
+    },
+
+    onSubmit() {
+      if (this.currentTaskData.Procedure.ID) {
+        this.message = "宸ヨ壓鍙傛暟涓嬪彂涓�...";
+        this.num = 0;
+        this.timer = setInterval(() => {
+          this.num = this.num + 1;
+          if (this.num === 30 || this.resParams) {
+            this.num = 30;
+            this.getCode(this.resParams);
+          }
+        }, 1000);
+        if (this.isLoading) {
+          return true;
+        }
+        this.isLoading = true;
+        sendProcessParams({
+          procedureId: this.currentTaskData.Procedure.ID,
+          position: Number(this.currentTaskData.Position),
+        }).then((res) => {
+          if (res.code === 200) {
+            this.resParams = res;
+            this.isLoading = false;
+          } else {
+            this.isLoading = false;
+            this.resParams = res;
+          }
+        }, err => {
+          console.error(err)
+        }).finally(() => {
+          this.isLoading = false
+        });
+      }
+    },
+    getCode(res) {
+      if (res.code === 200) {
+        if (this.num === 30) {
+          this.messageError = "涓嬪彂鎴愬姛锛�";
+          if (!this.secondTimer) {
+            this.secondTimer = setInterval(() => {
+              this.second = this.second + 1;
+            }, 1000);
+          }
+          clearInterval(this.timer);
+          // this.num = 30;
+          // this.showBtn = 2;
+          this.message = this.safeProduce;
+
+          this.num = 0;
+          this.showBtn = 1
+          this.shutdown();
+          this.$emit('getSetProductNumber', this.activeName)
+          // this.$message.success("涓嬪彂鐢熶骇鏁伴噺鎴愬姛锛�");
+        }
+      } else {
+        this.messageError = res.msg ? res.msg : "鎶辨瓑锛屽伐搴忎笅鍙戝け璐ワ紒";
+        clearInterval(this.timer);
+        this.num = 30;
+        this.showBtn = 2;
+        this.message = this.safeProduce;
+      }
+    },
+    shutdown() {
+      this.show = false;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.color_error {
+  color: red;
+}
+
+.color_success {
+  color: green;
+}
+
+.tank-box {
+  width: 753px;
+  height: 728px;
+  background: url("../../public/tank.png") no-repeat center center / cover;
+  position: relative;
+
+  .dialog-footer {
+    position: absolute;
+    bottom: 25px;
+    width: 100%;
+    text-align: center;
+  }
+}
+
+.margin-top-10px {
+  margin-top: 10px;
+}
+
+.margin-top-40px {
+  margin-top: 40px;
+}
+
+.color_4efefa {
+  color: #4efefa !important;
+}
+
+.color_fff {
+  color: #fff;
+}
+
+.font_size_20 {
+  font-size: 20px !important;
+}
+
+.margin_bottom_13 {
+  margin-bottom: 13px;
+}
+
+.title-box {
+  width: calc(100% - 140px);
+  height: auto;
+  overflow: hidden;
+  padding: 0 70px;
+
+  .title-item {
+    width: 45%;
+    float: left;
+    height: 35px;
+    line-height: 35px;
+    font-size: 16px;
+    color: #fff;
+
+    &:nth-of-type(odd) {
+      width: 55%;
+    }
+  }
+
+  .title-bng {
+    height: 52px;
+    line-height: 52px;
+
+    span {
+      width: calc(100% - 120px);
+      height: 52px;
+      text-align: center;
+      display: inline-block;
+      background: url("../../public/number.png") no-repeat center center / cover;
+    }
+  }
+
+  .title-item-two {
+    width: 100% !important;
+  }
+}
+
+.error-t {
+  width: 100px;
+  margin: 100px auto 40px;
+  font-size: 98px;
+
+  span {
+    display: inline-block;
+  }
+}
+
+.error-m {
+  line-height: 35px;
+  font-size: 28px;
+  color: #fff;
+  margin-bottom: 20px;
+  text-align: center;
+}
+
+::v-deep .el-dialog {
+  background: transparent;
+}
+
+::v-deep .el-dialog__header {
+  padding: 0 !important;
+}
+
+::v-deep .el-dialog__body {
+  padding: 0 !important;
+}
+
+.btn-error {
+  bottom: 80px !important;
+}
+
+.btn {
+  width: 150px;
+  height: auto;
+  display: inline-block;
+  position: relative;
+
+  img {
+    width: 100%;
+  }
+
+  .icon-loading {
+    font-size: 32px;
+    color: #333;
+    position: absolute;
+    line-height: 2.0;
+    left: 38%;
+  }
+
+  &:nth-of-type(1) {
+    // margin-right: 30px;
+    // margin-left: 110px;
+  }
+}
+
+::v-deep .el-tabs__content {
+  height: calc(100% - 55px);
+  overflow-y: auto;
+}
+
+.circel {
+  width: 100px;
+  height: 100px;
+  border-radius: 50%;
+  border: 2px solid rgba(12, 79, 218, 1);
+  position: relative;
+  float: left;
+
+  .circel-two {
+    width: 75px;
+    height: 75px;
+    position: absolute;
+    top: 11px;
+    left: 11px;
+    border-radius: 50%;
+    border: 2px solid rgba(12, 79, 218, 1);
+  }
+}
+
+.circel-text {
+  color: #fff;
+  margin-left: 20px;
+
+  .circel-text-t {
+    font-size: 18px;
+    line-height: 40px;
+  }
+
+  .circel-text-b {
+    font-weight: 700;
+    font-size: 14px;
+
+    span {
+      color: rgba(12, 79, 218, 1);
+      font-size: 38px;
+      margin-right: 10px;
+    }
+  }
+}
+
+.color_red {
+  width: 100%;
+  margin: 0 auto 25px auto;
+  text-align: center;
+  font-size: 14px;
+}
+
+.form-item {
+  width: calc(50% - 20px);
+  float: left;
+
+  &:nth-child(odd) {
+    margin-right: 20px;
+  }
+}
+
+.form-item-two {
+  width: calc(50% - 20px);
+  float: left;
+
+  &:nth-of-type(odd) {
+    margin-right: 20px;
+  }
+}
+
+.form-item-three {
+  width: calc(100% - 20px);
+  float: left;
+}
+
+.form-item-check {
+  width: calc(33% - 40px);
+  float: left;
+
+  &:nth-of-type(odd) {
+    margin-right: 20px;
+  }
+}
+
+.title {
+  width: 100%;
+}
+
+.dialog-content-box {
+  height: calc(100% - 190px);
+  padding: 20px 0 10px;
+  position: relative;
+
+  .el-form {
+    overflow: hidden;
+  }
+
+  .title-auto-box {
+    height: calc(100% - 220px);
+    overflow: auto;
+    width: calc(100% - 140px);
+    margin: 0 auto;
+    background: #0E246A;
+
+    .title-box {
+      padding: 0 10px;
+      width: calc(100% - 20px);
+    }
+  }
+
+  .gif-box {
+    width: 230px;
+    margin: 0 auto 5px auto;
+
+    .gif-right {
+      width: 210px;
+      font-size: 14px;
+      color: #fff;
+      line-height: 28px;
+
+      span {
+        font-weight: 700;
+        font-size: 18px;
+      }
+    }
+  }
+
+  .gif {
+    width: 55px;
+    vertical-align: middle;
+    float: left;
+    margin-right: 20px;
+
+    img {
+      width: 100%;
+    }
+
+    .yuandian {
+      width: 55px;
+      height: 55px;
+      float: left;
+      // background: #15d815;
+      background: red;
+      border-radius: 50%;
+      // margin-top:-5px;
+      vertical-align: middle;
+    }
+  }
+
+  .progress-item {
+    width: 55%;
+    padding: 2px 8px;
+    height: 20px;
+    background: #fff;
+    border-radius: 30px;
+    margin: 0 auto;
+    border: 2px solid rgba(255, 255, 255, 0.5);
+    box-shadow: 1px 5px 5px rgba(255, 255, 255, 0.5);
+
+    span {
+      float: left;
+      font-weight: 700;
+      color: #333;
+      font-size: 15px;
+    }
+  }
+}
+
+.num-identify {
+  padding: 5px 8px;
+  background-color: rgba(255, 153, 0, 1);
+  border-radius: 6px;
+  font-size: 14px;
+  color: #fff;
+  font-weight: 600;
+}
+
+.drawerHeader {
+  width: 98%;
+  margin: 0 auto;
+  overflow: hidden;
+
+  .title-l {
+    width: 25%;
+    float: left;
+    margin-left: 30px;
+    font-size: 25px;
+    color: #fff;
+    height: 3.2vw;
+    line-height: 4.5vw;
+  }
+
+  .title-r {
+    width: 60px;
+    float: right;
+    height: 60px;
+    line-height: 5vw;
+    cursor: pointer;
+
+    img {
+      display: inline-block;
+      width: 100%;
+    }
+  }
+
+  .identify {
+    width: 80px;
+    height: 25px;
+    line-height: 25px;
+    text-align: center;
+    border: 1px solid rgba(255, 153, 0, 1);
+    border-radius: 6px;
+    font-size: 16px;
+    color: rgba(255, 153, 0, 1);
+    transform: rotate(15deg);
+    font-weight: 600;
+    margin-right: 100px;
+    margin-top: 12px;
+    float: right;
+  }
+}
+
+.paginator-btn {
+  position: absolute;
+  height: 40px;
+  width: 40px;
+  background-color: #09e5ed;
+  color: #fff;
+  top: 50%;
+  text-align: center;
+  font-size: 24px;
+  font-weight: 500;
+  border-radius: 50%;
+  margin-top: -20px;
+  line-height: 38px;
+  box-sizing: border-box;
+  cursor: pointer;
+  user-select: none;
+
+  &.previous {
+    left: -60px;
+    padding-right: 2px;
+  }
+
+  &.next {
+    right: -60px;
+    padding-left: 4px;
+  }
+}
+
+.paginator-text {
+  position: absolute;
+  bottom: -30px;
+  height: 40px;
+  width: 100%;
+  text-align: center;
+
+  & .page {
+    color: #fff;
+    font-size: 22px;
+    padding-right: 8px;
+  }
+
+  & .total {
+    color: #ffffffaa;
+    font-size: 16px;
+  }
+}
+</style>
diff --git a/src/views/visualization.vue b/src/views/visualization.vue
index 98b8087..bbf6439 100644
--- a/src/views/visualization.vue
+++ b/src/views/visualization.vue
@@ -336,7 +336,7 @@
                     </template>
                     <template v-else>
                       <!-- <div class="card_content">
-                        
+
                       </div> -->
                       <div :class="(activeName==1||activeName == 3)?'card_top-4 font_size_20px':'card_top-4'">
                         <div>宸ヨ壓缂栧彿锛�<div >{{ list.number }}</div></div>
@@ -457,7 +457,7 @@
           <template
               v-if="activeName == 2 &&(!taskData||Object.keys(taskData).length==0)"
             >
-            
+
             <el-empty description="鏆傛棤浠诲姟..."></el-empty>
           </template>
         </div>
@@ -530,9 +530,9 @@
               <!-- <span>{{ item.phoneNum || "" }}</span> -->
               <span class="color_yellow"><i class="el-icon-star-on" /><i class="el-icon-star-on" /><i class="el-icon-star-on" /><i class="el-icon-star-on" /><i class="el-icon-star-on" /></span>
             </dl>
-           
+
           </div>
-         
+
           <!-- <div
             style="
               width: 100%;
@@ -588,19 +588,14 @@
           </div>
         </div>
       </div>
-      
+
     </template> -->
     <!-- 鎺у埗鐨勫脊妗� -->
     <AddControl ref="control" :Arr="Arr" />
     <!-- 鎺у埗鐨勫脊妗� -->
-    <AddIssue
+    <TaskControlModal
       ref="control"
-      :Arr="Arr"
       :activeName="activeName"
-      :ArrError="ArrError"
-      :safeProduce="safeProduce"
-      :taskData="taskData"
-      :Order="taskData.Order"
       @getSetProductNumber="reloadPage"
       @isTip="isTip"
     />
@@ -628,8 +623,10 @@
 import AddControl from "../components/AddControl.vue";
 import AddIssue from "../components/AddIssue.vue";
 import ProcessModel from  "../components/ProcessModel.vue";
+import TaskControlModal from "@/components/TaskControlModal.vue";
 export default {
   components: {
+    TaskControlModal,
     Card,
     Knowledge,
     AddControl,
@@ -638,6 +635,7 @@
   },
   data() {
     return {
+      pollingTaskCountTimer: null,
       activeName: 1,
       progress: 70, //杩涘害
       passrate: 30, //鍚堟牸鐜�
@@ -779,6 +777,10 @@
       this.getDate2();
     }, 5000);
     this.getTaskInfo();
+    this.getTaskCountStatistics()
+  },
+  beforeDestroy() {
+    clearTimeout(this.pollingTaskCountTimer)
   },
   watch:{
     // isFinsh(){
@@ -790,8 +792,8 @@
   methods: {
     taskClick(){
       if(this.TaskCount>0){
-        this.getStartArr()
-        this.$refs.control.islook=true
+        // this.getStartArr()
+        this.$refs.control.show=true
       }else{
         this.$message({
           message:'鐩墠娌℃湁浠诲姟锛�',
@@ -847,6 +849,8 @@
         }
       });
     },
+
+
 
     getDateObj(date, fmt) {
       if (/(y+)/.test(fmt)) {
@@ -910,7 +914,7 @@
         let String=now-date*1000;
         let seconds=Math.floor(String/1000)
         let minutes=Math.floor(seconds/60)
-        
+
         let days=Math.floor(String/1000/60/60/24)
         let hours=Math.floor(minutes/60)-days*24
         let m=minutes-days*24*60-hours*60
@@ -961,6 +965,25 @@
       }
     },
 
+    /**
+     * 杞鑾峰彇浠诲姟鏁伴噺
+     */
+    getTaskCountStatistics(){
+      getTaskInfo({taskMode:1}).then((res) => {
+        if (res.code === 200&&res.data) {
+          this.TaskCount=res.data?.TaskCount ?? 0
+        }
+      },err=>{
+        this.TaskCount = 0
+        console.error(err)
+      }).finally(()=>{
+        this.pollingTaskCountTimer = setTimeout(()=>{
+          this.getTaskCountStatistics()
+        //   20绉掍竴娆¤疆璇�
+        },20000)
+      });
+    },
+
     getTaskInfo(val) {
       this.Tasks = [];
       this.TasksCopy=[]
@@ -973,14 +996,14 @@
            })
           }
           this.TasksCopy = res.data.Tasks ? res.data.Tasks : [];
-          this.safeProduce=res.data.Prompt.safeProduce?res.data.Prompt.safeProduce:''
+          // 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
           // if(this.ChannelAmount>1 &&this.TasksCopy.length<2){
           //   this.TasksCopy.push(this.object)
           // }
           this.TaskCount=res.data.TaskCount?res.data.TaskCount:0
-          
+
           if ((this.TasksCopy.length ==0 )||!this.TasksCopy) {
             if (this.activeName == 1||this.activeName == 3) {
               this.TasksCopy.push(this.object);
@@ -1007,7 +1030,7 @@
                 ...this.TasksCopy[i].Procedure.procedure,
               },
             ]);
-           
+
             if (this.TasksCopy[i].Procedure.ID) {
               startTask({ id: this.TasksCopy[i].Procedure.ID }).then((res) => {
                 if (res.code == 200) {
@@ -1085,7 +1108,7 @@
           });
         }
       }
-      
+
     },
     // 璁剧疆
     setUrl() {
@@ -1143,7 +1166,7 @@
  background:#12234a!important;
  color:#fff!important;
  border-color: #09e5ed !important;
- 
+
  .popper__arrow::after{
   border-top-color:#09e5ed !important;
  }
@@ -1192,7 +1215,7 @@
     box-sizing: border-box;
     border-right: 1px solid #eee;
   }
-  
+
   .small_title {
     margin-bottom: 30px;
   }
@@ -1248,7 +1271,7 @@
       font-size:14px;
     }
   }
-  
+
   .el-step{
     .el-step__icon{
      background:#00cc66;
@@ -1750,7 +1773,7 @@
             border-radius: 5px 5px 0 0;
             background: rgb(19, 35, 90);
           }
-          
+
 
           .card_contentRight {
             width: 100%;
@@ -1821,7 +1844,7 @@
           display:inline-block;
         }
       }
-      
+
       .yuandian {
         width: 25px;
         height: 25px;
diff --git a/vue.config.js b/vue.config.js
index d51a8bb..cd9a548 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -72,7 +72,9 @@
        //  寮犻獮鏈湴
         // target: "http://192.168.20.120:8003",
         // 鍗氬畤
-        target: "http://192.168.20.119:8003",
+        // target: "http://192.168.20.119:8003",
+        // 绾夸笂
+        target: "http://192.168.8.113:8080",
         ws: true,
         changeOrigin: true,
       },

--
Gitblit v1.8.0