695593266@qq.com 2 kuukautta sitten
vanhempi
commit
9202964470

+ 10 - 1
src/views/productionPlan/components/gantt/components/ResourcePanel.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="resource-panel">
+  <div class="resource-panel" :class="{ 'is-fullscreen': isFullscreen }">
     <div class="resource-tabs">
       <div
         v-for="item in resourceTabs"
@@ -62,6 +62,10 @@
       selectedResource: {
         type: String,
         default: ''
+      },
+      isFullscreen: {
+        type: Boolean,
+        default: false
       }
     },
     data() {
@@ -98,6 +102,11 @@
     border: 1px solid #dfe6ec;
     border-radius: 4px;
     overflow: hidden;
+
+    &.is-fullscreen {
+      width: 200px;
+      height: 100%;
+    }
   }
 
   .resource-tabs {

+ 146 - 12
src/views/productionPlan/components/gantt/project-gantt.vue

@@ -1,23 +1,33 @@
 <template>
-  <div class="project-gantt">
+  <div class="project-gantt" :class="{ 'is-fullscreen': isFullscreen }">
     <div class="view-switch">
+      <div class="view-switch-left">
+        <el-button
+          size="mini"
+          :type="viewMode === 'gantt' ? 'primary' : 'default'"
+          @click="handleViewSwitch('gantt')"
+        >
+          甘特图
+        </el-button>
+        <el-button
+          size="mini"
+          :type="viewMode === 'calendar' ? 'primary' : 'default'"
+          @click="handleViewSwitch('calendar')"
+        >
+          工作日历
+        </el-button>
+      </div>
       <el-button
         size="mini"
-        :type="viewMode === 'gantt' ? 'primary' : 'default'"
-        @click="handleViewSwitch('gantt')"
-      >
-        甘特图
-      </el-button>
-      <el-button
-        size="mini"
-        :type="viewMode === 'calendar' ? 'primary' : 'default'"
-        @click="handleViewSwitch('calendar')"
+        :icon="isFullscreen ? 'el-icon-close' : 'el-icon-full-screen'"
+        @click="toggleFullscreen"
       >
-        工作日历
+        {{ isFullscreen ? '退出全屏' : '全屏显示' }}
       </el-button>
     </div>
     <div class="project-gantt__body">
       <resource-panel
+        :is-fullscreen="isFullscreen"
         :resource-tabs="resourceTabs"
         :active-tab="activeTab"
         :keyword="keyword"
@@ -30,6 +40,7 @@
       />
       <div v-show="viewMode === 'gantt'" class="gantt-view">
         <gantt-filter-bar
+          v-show="!isFullscreen"
           :query="ganttQuery"
           @update:query="ganttQuery = $event"
           @apply="applyGanttFilters"
@@ -41,6 +52,7 @@
       </div>
       <div v-show="viewMode === 'calendar'" class="calendar-view">
         <gantt-filter-bar
+          v-show="!isFullscreen"
           :query="calendarQuery"
           @update:query="calendarQuery = $event"
           @apply="applyCalendarFilters"
@@ -144,7 +156,8 @@
         calendarQuery: createSearchQuery(),
         calendarFilters: createSearchQuery(),
         calendarExpand: true,
-        hoverTooltip: createHoverTooltipState()
+        hoverTooltip: createHoverTooltipState(),
+        isFullscreen: false
       };
     },
     computed: {
@@ -472,6 +485,23 @@
       this.initData(); // 数据format以及gantt reload
       this.syncGanttVisibility();
       this.bindGanttHoverTooltip();
+      // 监听全屏状态变化
+      document.addEventListener(
+        'fullscreenchange',
+        this.handleFullscreenChange
+      );
+      document.addEventListener(
+        'webkitfullscreenchange',
+        this.handleFullscreenChange
+      );
+      document.addEventListener(
+        'mozfullscreenchange',
+        this.handleFullscreenChange
+      );
+      document.addEventListener(
+        'MSFullscreenChange',
+        this.handleFullscreenChange
+      );
     },
 
     methods: {
@@ -745,6 +775,72 @@
         }
         this.viewMode = mode;
       },
+      async toggleFullscreen() {
+        const element = this.$el;
+        if (!this.isFullscreen) {
+          // 进入全屏
+          try {
+            if (element.requestFullscreen) {
+              await element.requestFullscreen();
+            } else if (element.webkitRequestFullscreen) {
+              await element.webkitRequestFullscreen();
+            } else if (element.mozRequestFullScreen) {
+              await element.mozRequestFullScreen();
+            } else if (element.msRequestFullscreen) {
+              await element.msRequestFullscreen();
+            }
+            this.isFullscreen = true;
+          } catch (err) {
+            console.error('全屏请求失败:', err);
+            this.$message.warning('浏览器不支持全屏功能');
+          }
+        } else {
+          // 退出全屏
+          try {
+            if (document.exitFullscreen) {
+              await document.exitFullscreen();
+            } else if (document.webkitExitFullscreen) {
+              await document.webkitExitFullscreen();
+            } else if (document.mozCancelFullScreen) {
+              await document.mozCancelFullScreen();
+            } else if (document.msExitFullscreen) {
+              await document.msExitFullscreen();
+            }
+            this.isFullscreen = false;
+          } catch (err) {
+            console.error('退出全屏失败:', err);
+          }
+        }
+
+        this.$nextTick(() => {
+          if (this.viewMode === 'gantt') {
+            gantt.render();
+          }
+        });
+      },
+      handleFullscreenChange() {
+        // 监听全屏状态变化(用户按ESC键退出全屏)
+        const isCurrentlyFullscreen = !!(
+          document.fullscreenElement ||
+          document.webkitFullscreenElement ||
+          document.mozFullScreenElement ||
+          document.msFullscreenElement
+        );
+
+        if (this.isFullscreen && !isCurrentlyFullscreen) {
+          this.isFullscreen = false;
+          this.$nextTick(() => {
+            if (this.viewMode === 'gantt') {
+              gantt.render();
+            }
+          });
+        }
+      },
+      handleEscKey(event) {
+        if (event.key === 'Escape' && this.isFullscreen) {
+          this.toggleFullscreen();
+        }
+      },
       initGantt() {
         let _this = this;
         gantt.config.readonly = true;
@@ -964,6 +1060,24 @@
           this.hideHoverTooltip
         );
       }
+      document.removeEventListener('keydown', this.handleEscKey);
+      // 移除全屏状态监听
+      document.removeEventListener(
+        'fullscreenchange',
+        this.handleFullscreenChange
+      );
+      document.removeEventListener(
+        'webkitfullscreenchange',
+        this.handleFullscreenChange
+      );
+      document.removeEventListener(
+        'mozfullscreenchange',
+        this.handleFullscreenChange
+      );
+      document.removeEventListener(
+        'MSFullscreenChange',
+        this.handleFullscreenChange
+      );
     }
   };
 </script>
@@ -975,8 +1089,28 @@
     height: 100%;
     min-height: 280px;
     gap: 12px;
+
+    &.is-fullscreen {
+      position: fixed;
+      top: 0;
+      left: 0;
+      right: 0;
+      bottom: 0;
+      width: 100vw;
+      height: 100vh;
+      z-index: 9999;
+      background: #fff;
+      padding: 16px;
+      box-sizing: border-box;
+    }
   }
   .view-switch {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    gap: 8px;
+  }
+  .view-switch-left {
     display: flex;
     align-items: center;
     gap: 8px;

+ 17 - 5
src/views/workOrder/components/chooseStation.vue

@@ -59,7 +59,9 @@
         },
         allSelection: [],
         index: '',
-        sourceTaskId: ''
+        sourceTaskId: '',
+        type: '',
+        teamId: ''
       };
     },
 
@@ -171,10 +173,12 @@
     },
 
     methods: {
-      open(id, list = [], index) {
+      open(id, list = [], index, type, teamId) {
         this.dispatchVisible = true;
         this.index = index;
         this.workCenterId = id;
+        this.type = type;
+        this.teamId = teamId;
 
         this.allSelection = Array.isArray(list) ? list : [];
 
@@ -208,12 +212,20 @@
       datasource({ page, limit }) {
         const notInIdsStr = this.allSelection.map((item) => item.id).join(',');
 
-        return getFactoryworkstation({
+        const params = {
           pageNum: page,
           size: limit,
-          workCenterId: this.workCenterId,
           notInIdsStr
-        });
+        };
+
+        // 根据 type 决定传递哪些参数
+        if (this.type === 1) {
+          params.teamId = this.teamId;
+        } else if (this.type === 2) {
+          params.workCenterId = this.workCenterId;
+        }
+
+        return getFactoryworkstation(params);
       },
 
       handleSelectionChange(val) {

+ 11 - 13
src/views/workOrder/mixins/planDotLineRelease.js

@@ -588,7 +588,9 @@ export default {
       this.$refs.chooseStationRef.open(
         this.form.workCenterId,
         item.list,
-        index
+        index,
+        1,
+        this.form.teamId
       );
     },
 
@@ -639,15 +641,11 @@ export default {
         this.closeDispatchDialog(done);
         return;
       }
-      this.$confirm(
-        '当前存在已派单但未下发的任务,是否仍要退出?',
-        '提示',
-        {
-          type: 'warning',
-          confirmButtonText: '确定',
-          cancelButtonText: '取消'
-        }
-      )
+      this.$confirm('当前存在已派单但未下发的任务,是否仍要退出?', '提示', {
+        type: 'warning',
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      })
         .then(() => {
           this.closeDispatchDialog(done);
         })
@@ -845,9 +843,7 @@ export default {
         return;
       }
       this.form.teamName = data.executionTeamName || '';
-      console.log(this.form.teamNam, ' this.form.teamName');
       this.form.teamId = data.executionTeamId || '';
-      console.log(this.form.teamId, 'this.form.teamId');
       await this.changeRadio(data.assignType, data.index);
     },
     // 指派选择
@@ -998,7 +994,9 @@ export default {
     // },
     operationalData(index, res, list) {
       const dataRow = this.processList[index];
-      const oldList = structuredClone(Array.isArray(dataRow.list) ? dataRow.list : []);
+      const oldList = structuredClone(
+        Array.isArray(dataRow.list) ? dataRow.list : []
+      );
       if (!dataRow) {
         console.warn('operationalData skip invalid process index:', index);
         return;

+ 11 - 11
src/views/workOrder/mixins/release.js

@@ -563,7 +563,9 @@ export default {
       this.$refs.chooseStationRef.open(
         this.form.workCenterId,
         item.list,
-        index
+        index,
+        2,
+        this.form.teamId
       );
     },
 
@@ -614,15 +616,11 @@ export default {
         this.closeDispatchDialog(done);
         return;
       }
-      this.$confirm(
-        '当前存在已派单但未下发的任务,是否仍要退出?',
-        '提示',
-        {
-          type: 'warning',
-          confirmButtonText: '确定',
-          cancelButtonText: '取消'
-        }
-      )
+      this.$confirm('当前存在已派单但未下发的任务,是否仍要退出?', '提示', {
+        type: 'warning',
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      })
         .then(() => {
           this.closeDispatchDialog(done);
         })
@@ -964,7 +962,9 @@ export default {
     // },
     operationalData(index, res, list) {
       const dataRow = this.processList[index];
-      const oldList = structuredClone(Array.isArray(dataRow.list) ? dataRow.list : []);
+      const oldList = structuredClone(
+        Array.isArray(dataRow.list) ? dataRow.list : []
+      );
       let arrMap = {};
       let codeT = null;
 

+ 2 - 2
vue.config.js

@@ -41,8 +41,8 @@ module.exports = {
         // target: 'http://192.168.1.211:18086',
         // target: 'http://192.168.1.251:18186',
         // target: 'http://192.168.1.102:18086',
-        target: 'http://aiot.zoomwin.com.cn:51001/api',
-        // target: 'http://192.168.1.125:18086',
+        // target: 'http://aiot.zoomwin.com.cn:51001/api',
+        target: 'http://192.168.1.125:18086',
 
         // target: 'http://192.168.1.116:18086',