Procházet zdrojové kódy

工作日历样式的修改

695593266@qq.com před 1 týdnem
rodič
revize
bda65dc44a

+ 2 - 2
src/views/factoryCalendar/components/StatisticsView.vue

@@ -186,14 +186,14 @@
             </el-tooltip>
           </div>
         </div>
-        <el-button
+        <!-- <el-button
           size="small"
           type="warning"
           icon="el-icon-warning-outline"
           @click="vm.runGlobalConflictCheck"
         >
           重新检测
-        </el-button>
+        </el-button> -->
       </div>
     </div>
   </div>

+ 247 - 68
src/views/factoryCalendar/components/factoryCalendar.scss

@@ -953,6 +953,14 @@
       text-align: left;
     }
 
+    .team-queue-plan .queue-name-only {
+      margin: 0;
+      color: #303133;
+      font-size: 16px;
+      font-weight: 600;
+      line-height: 22px;
+    }
+
     .plan-metrics {
       display: flex;
       align-items: center;
@@ -995,13 +1003,51 @@
     .visual-stat-page {
       display: flex;
       flex-direction: column;
-      gap: 14px;
-      padding: 16px;
+      gap: 16px;
+      padding: 18px;
       border-radius: 8px;
+      border: 1px solid rgba(116, 151, 174, 0.22);
       background:
-        linear-gradient(135deg, rgba(17, 42, 86, 0.96), rgba(18, 87, 111, 0.9)),
-        linear-gradient(180deg, rgba(255, 255, 255, 0.06), transparent);
-      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
+        repeating-linear-gradient(
+          135deg,
+          rgba(255, 255, 255, 0.018) 0,
+          rgba(255, 255, 255, 0.018) 1px,
+          transparent 1px,
+          transparent 12px
+        ),
+        linear-gradient(rgba(125, 179, 201, 0.06) 1px, transparent 1px),
+        linear-gradient(90deg, rgba(125, 179, 201, 0.04) 1px, transparent 1px),
+        linear-gradient(145deg, #111b27 0%, #0e2b30 48%, #182333 100%);
+      background-size: 100% 100%, 28px 28px, 28px 28px, 100% 100%;
+      box-shadow:
+        inset 0 0 0 1px rgba(255, 255, 255, 0.05),
+        inset 0 28px 70px rgba(255, 255, 255, 0.03),
+        inset 0 -40px 90px rgba(0, 0, 0, 0.16);
+      position: relative;
+      overflow: hidden;
+
+      &::before {
+        content: '';
+        position: absolute;
+        left: 0;
+        right: 0;
+        top: 0;
+        height: 3px;
+        background: linear-gradient(90deg, #25d0d0, #72d572, #f0b451);
+        opacity: 0.88;
+      }
+
+      &::after {
+        content: '';
+        pointer-events: none;
+        position: absolute;
+        inset: 8px;
+        border: 1px solid rgba(255, 255, 255, 0.035);
+        border-radius: 6px;
+        box-shadow:
+          inset 0 0 0 1px rgba(0, 0, 0, 0.2),
+          inset 0 0 40px rgba(78, 180, 178, 0.035);
+      }
     }
 
     .visual-overview {
@@ -1011,14 +1057,21 @@
       justify-content: space-between;
       gap: 20px;
       padding: 20px 24px;
-      border: 1px solid rgba(143, 202, 255, 0.22);
+      border: 1px solid rgba(133, 183, 206, 0.24);
       border-radius: 8px;
-      background: linear-gradient(
-        115deg,
-        rgba(255, 255, 255, 0.14),
-        rgba(255, 255, 255, 0.05)
-      );
-      box-shadow: 0 16px 32px rgba(3, 20, 43, 0.18);
+      background:
+        linear-gradient(135deg, rgba(255, 255, 255, 0.08), transparent 34%),
+        linear-gradient(90deg, rgba(32, 47, 63, 0.94), rgba(28, 78, 78, 0.82)),
+        repeating-linear-gradient(
+          90deg,
+          transparent 0,
+          transparent 46px,
+          rgba(255, 255, 255, 0.035) 47px
+        );
+      box-shadow:
+        0 16px 34px rgba(0, 0, 0, 0.2),
+        inset 0 1px 0 rgba(255, 255, 255, 0.12),
+        inset 0 -1px 0 rgba(0, 0, 0, 0.2);
       color: #fff;
       overflow: hidden;
       position: relative;
@@ -1027,16 +1080,26 @@
         content: '';
         position: absolute;
         right: 190px;
-        top: 18px;
+        top: 16px;
         width: 1px;
-        height: 82px;
+        height: 86px;
         background: linear-gradient(
           180deg,
           transparent,
-          rgba(255, 255, 255, 0.38),
+          rgba(125, 211, 230, 0.44),
           transparent
         );
       }
+
+      &::after {
+        content: '';
+        position: absolute;
+        left: 0;
+        bottom: 0;
+        width: 100%;
+        height: 1px;
+        background: linear-gradient(90deg, transparent, rgba(64, 222, 201, 0.5), transparent);
+      }
     }
 
     .overview-copy,
@@ -1050,8 +1113,9 @@
       align-items: center;
       gap: 8px;
       margin-bottom: 8px;
-      color: rgba(255, 255, 255, 0.78);
+      color: rgba(231, 242, 244, 0.78);
       font-size: 13px;
+      letter-spacing: 0;
     }
 
     .live-dot {
@@ -1065,21 +1129,29 @@
     .overview-copy {
       h3 {
         margin: 0;
-        font-size: 26px;
+        font-size: 25px;
         line-height: 34px;
         font-weight: 600;
+        color: #f3fbff;
       }
 
       p {
         max-width: 680px;
         margin: 8px 0 0;
-        color: rgba(255, 255, 255, 0.72);
+        color: rgba(224, 238, 240, 0.7);
         line-height: 22px;
       }
     }
 
     .overview-health {
       min-width: 132px;
+      padding: 10px 14px;
+      border-radius: 6px;
+      background:
+        linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.025));
+      box-shadow:
+        inset 0 0 0 1px rgba(255, 255, 255, 0.08),
+        inset 0 -12px 24px rgba(0, 0, 0, 0.12);
       text-align: center;
 
       span,
@@ -1094,7 +1166,8 @@
         margin: 4px 0;
         font-size: 42px;
         line-height: 46px;
-        color: #8fffe4;
+        color: #72f0d1;
+        text-shadow: 0 0 18px rgba(114, 240, 209, 0.24);
       }
     }
 
@@ -1105,18 +1178,25 @@
     }
 
     .visual-kpi-card {
-      min-height: 118px;
-      padding: 16px 18px 14px;
-      border: 1px solid rgba(126, 211, 255, 0.26);
+      min-height: 112px;
+      padding: 15px 17px 14px;
+      border: 1px solid rgba(117, 159, 184, 0.26);
       border-radius: 8px;
       background:
-        linear-gradient(135deg, rgba(12, 42, 79, 0.92), rgba(15, 78, 100, 0.82)),
-        linear-gradient(180deg, rgba(255, 255, 255, 0.1), transparent);
+        linear-gradient(150deg, rgba(255, 255, 255, 0.08), transparent 36%),
+        linear-gradient(145deg, rgba(27, 40, 55, 0.96), rgba(17, 68, 68, 0.82)),
+        repeating-linear-gradient(
+          0deg,
+          transparent 0,
+          transparent 30px,
+          rgba(255, 255, 255, 0.026) 31px
+        );
       position: relative;
       overflow: hidden;
       box-shadow:
-        inset 0 1px 0 rgba(255, 255, 255, 0.1),
-        0 12px 24px rgba(3, 20, 43, 0.18);
+        inset 0 1px 0 rgba(255, 255, 255, 0.08),
+        inset 0 -18px 36px rgba(0, 0, 0, 0.12),
+        0 10px 24px rgba(0, 0, 0, 0.2);
       transition: transform 0.2s, border-color 0.2s, box-shadow 0.2s;
 
       &::before {
@@ -1129,12 +1209,24 @@
         background: linear-gradient(90deg, var(--kpi-color), rgba(255, 255, 255, 0));
       }
 
+      &::after {
+        content: '';
+        position: absolute;
+        right: 14px;
+        bottom: 12px;
+        width: 52px;
+        height: 18px;
+        border-right: 1px solid rgba(255, 255, 255, 0.12);
+        border-bottom: 1px solid rgba(255, 255, 255, 0.12);
+        opacity: 0.56;
+      }
+
       &:hover {
         transform: translateY(-2px);
-        border-color: rgba(126, 211, 255, 0.45);
+        border-color: rgba(126, 211, 197, 0.5);
         box-shadow:
           inset 0 1px 0 rgba(255, 255, 255, 0.14),
-          0 16px 30px rgba(3, 20, 43, 0.24);
+          0 16px 30px rgba(0, 0, 0, 0.26);
       }
 
       span,
@@ -1145,11 +1237,11 @@
 
       strong {
         display: block;
-        margin: 12px 0 3px;
-        font-size: 34px;
-        line-height: 38px;
+        margin: 10px 0 3px;
+        font-size: 32px;
+        line-height: 36px;
         color: #ffffff;
-        text-shadow: 0 0 14px rgba(126, 211, 255, 0.18);
+        text-shadow: 0 0 14px rgba(126, 211, 197, 0.18);
       }
     }
 
@@ -1175,14 +1267,17 @@
     .kpi-icon {
       width: 38px;
       height: 38px;
-      border-radius: 8px;
+      border-radius: 6px;
       display: flex;
       align-items: center;
       justify-content: center;
       color: var(--kpi-color);
-      background: rgba(255, 255, 255, 0.08);
-      border: 1px solid rgba(255, 255, 255, 0.1);
+      background: rgba(255, 255, 255, 0.06);
+      border: 1px solid rgba(255, 255, 255, 0.12);
       font-size: 20px;
+      box-shadow:
+        inset 0 1px 0 rgba(255, 255, 255, 0.12),
+        0 6px 14px rgba(0, 0, 0, 0.14);
     }
 
     .scheduled .kpi-icon {
@@ -1206,25 +1301,54 @@
     .visual-card {
       min-height: 270px;
       padding: 18px 20px;
-      border: 1px solid rgba(126, 211, 255, 0.24);
+      border: 1px solid rgba(115, 157, 184, 0.24);
       border-radius: 8px;
       background:
-        linear-gradient(145deg, rgba(12, 42, 79, 0.9), rgba(12, 69, 91, 0.78)),
-        linear-gradient(180deg, rgba(255, 255, 255, 0.08), transparent);
+        linear-gradient(145deg, rgba(255, 255, 255, 0.07), transparent 32%),
+        linear-gradient(145deg, rgba(20, 32, 45, 0.96), rgba(13, 63, 66, 0.8)),
+        repeating-linear-gradient(
+          90deg,
+          transparent 0,
+          transparent 44px,
+          rgba(255, 255, 255, 0.022) 45px
+        );
       box-sizing: border-box;
       box-shadow:
-        inset 0 1px 0 rgba(255, 255, 255, 0.1),
-        0 14px 28px rgba(3, 20, 43, 0.18);
+        inset 0 1px 0 rgba(255, 255, 255, 0.08),
+        inset 0 -26px 50px rgba(0, 0, 0, 0.14),
+        0 12px 26px rgba(0, 0, 0, 0.2);
       overflow: hidden;
       position: relative;
 
+      &::before {
+        content: '';
+        position: absolute;
+        left: 14px;
+        top: 14px;
+        width: 46px;
+        height: 22px;
+        border-left: 2px solid rgba(51, 184, 255, 0.55);
+        border-top: 2px solid rgba(98, 212, 111, 0.48);
+        opacity: 0.75;
+      }
+
+      &::after {
+        content: '';
+        position: absolute;
+        left: 0;
+        right: 0;
+        top: 0;
+        height: 1px;
+        background: linear-gradient(90deg, transparent, rgba(114, 240, 209, 0.45), transparent);
+      }
+
       .chart-title {
         position: relative;
         margin-bottom: 4px;
         padding-left: 10px;
         font-size: 17px;
         font-weight: 600;
-        color: #f7fbff;
+        color: #f2f9fb;
 
         &::before {
           content: '';
@@ -1234,7 +1358,7 @@
           width: 3px;
           height: 16px;
           border-radius: 2px;
-          background: linear-gradient(180deg, #2f7cf6, #13c2c2);
+          background: linear-gradient(180deg, #33b8ff, #62d46f);
         }
       }
     }
@@ -1245,10 +1369,12 @@
       justify-content: space-between;
       gap: 12px;
       margin-bottom: 16px;
+      position: relative;
+      z-index: 1;
 
       p {
         margin: 0;
-        color: rgba(232, 244, 255, 0.64);
+        color: rgba(224, 238, 240, 0.62);
         font-size: 13px;
       }
 
@@ -1270,29 +1396,40 @@
       justify-content: center;
       gap: 42px;
       min-height: 220px;
+      margin-top: 8px;
+      padding: 16px;
+      border-radius: 8px;
+      background:
+        linear-gradient(180deg, rgba(255, 255, 255, 0.055), rgba(255, 255, 255, 0.018));
+      box-shadow:
+        inset 0 0 0 1px rgba(255, 255, 255, 0.05),
+        inset 0 -20px 44px rgba(0, 0, 0, 0.12);
+      position: relative;
+      z-index: 1;
     }
 
     .donut-chart {
-      width: 196px;
-      height: 196px;
+      width: 188px;
+      height: 188px;
       border-radius: 50%;
       display: flex;
       align-items: center;
       justify-content: center;
       margin: 0 auto;
       box-shadow:
-        0 18px 36px rgba(3, 20, 43, 0.2),
-        0 0 0 12px rgba(255, 255, 255, 0.04);
+        0 18px 36px rgba(0, 0, 0, 0.22),
+        0 0 0 10px rgba(255, 255, 255, 0.035),
+        inset 0 0 0 1px rgba(255, 255, 255, 0.2);
     }
 
     .donut-center {
-      width: 118px;
-      height: 118px;
+      width: 112px;
+      height: 112px;
       border-radius: 50%;
-      background: linear-gradient(180deg, rgba(255, 255, 255, 0.96), #eef7ff);
+      background: linear-gradient(180deg, #f7fbfc, #dce8ec);
       box-shadow:
-        0 0 0 1px rgba(126, 211, 255, 0.28) inset,
-        0 8px 22px rgba(3, 20, 43, 0.18);
+        0 0 0 1px rgba(55, 88, 105, 0.18) inset,
+        0 8px 22px rgba(0, 0, 0, 0.2);
       display: flex;
       flex-direction: column;
       align-items: center;
@@ -1310,6 +1447,8 @@
 
     .donut-legend {
       width: 100%;
+      position: relative;
+      z-index: 1;
 
       .el-tooltip {
         display: block;
@@ -1323,9 +1462,11 @@
       gap: 8px;
       margin-bottom: 12px;
       padding: 8px 10px;
-      border: 1px solid rgba(126, 211, 255, 0.18);
+      border: 1px solid rgba(132, 170, 188, 0.18);
       border-radius: 6px;
-      background: rgba(255, 255, 255, 0.08);
+      background:
+        linear-gradient(90deg, rgba(255, 255, 255, 0.09), rgba(255, 255, 255, 0.04));
+      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
 
       em {
         color: rgba(232, 244, 255, 0.76);
@@ -1347,21 +1488,28 @@
     .visual-bar-item {
       margin-bottom: 14px;
       padding: 10px 12px;
-      border: 1px solid rgba(126, 211, 255, 0.16);
+      border: 1px solid rgba(132, 170, 188, 0.16);
       border-radius: 6px;
-      background: rgba(255, 255, 255, 0.08);
+      background:
+        linear-gradient(90deg, rgba(255, 255, 255, 0.085), rgba(255, 255, 255, 0.035));
+      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
       cursor: pointer;
       transition: background 0.2s, border-color 0.2s, transform 0.2s;
 
       &:hover {
         transform: translateX(2px);
-        border-color: rgba(126, 211, 255, 0.36);
-        background: rgba(255, 255, 255, 0.12);
+        border-color: rgba(114, 240, 209, 0.34);
+        background: rgba(255, 255, 255, 0.1);
       }
     }
 
-    .visual-bar-list .el-tooltip {
-      display: block;
+    .visual-bar-list {
+      position: relative;
+      z-index: 1;
+
+      .el-tooltip {
+        display: block;
+      }
     }
 
     .bar-head {
@@ -1380,7 +1528,10 @@
       height: 10px;
       border-radius: 12px;
       overflow: hidden;
-      background: rgba(214, 231, 248, 0.16);
+      background: rgba(211, 226, 230, 0.14);
+      box-shadow:
+        inset 0 0 0 1px rgba(255, 255, 255, 0.04),
+        inset 0 2px 5px rgba(0, 0, 0, 0.18);
     }
 
     .bar-fill {
@@ -1395,6 +1546,8 @@
       display: grid;
       grid-template-columns: repeat(3, minmax(0, 1fr));
       gap: 12px;
+      position: relative;
+      z-index: 1;
 
       .el-tooltip {
         display: block;
@@ -1409,20 +1562,22 @@
       justify-content: center;
       gap: 10px;
       padding: 14px 10px;
-      border: 1px solid #edf2f7;
+      border: 1px solid rgba(132, 170, 188, 0.18);
       border-radius: 8px;
       background:
-        linear-gradient(180deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.06));
-      border-color: rgba(126, 211, 255, 0.16);
+        linear-gradient(160deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.045));
+      box-shadow:
+        inset 0 1px 0 rgba(255, 255, 255, 0.06),
+        inset 0 -18px 30px rgba(0, 0, 0, 0.1);
       text-align: center;
       cursor: pointer;
       transition: transform 0.2s, border-color 0.2s, background 0.2s;
 
       &:hover {
         transform: translateY(-2px);
-        border-color: rgba(126, 211, 255, 0.34);
+        border-color: rgba(114, 240, 209, 0.32);
         background:
-          linear-gradient(180deg, rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0.08));
+          linear-gradient(180deg, rgba(255, 255, 255, 0.14), rgba(255, 255, 255, 0.08));
       }
 
       span {
@@ -1454,7 +1609,7 @@
         width: 48px;
         height: 48px;
         border-radius: 50%;
-        background: rgba(255, 255, 255, 0.94);
+        background: #f4f8f8;
         color: #10233f;
         display: flex;
         align-items: center;
@@ -1490,6 +1645,8 @@
       gap: 18px;
       min-height: 172px;
       padding-bottom: 26px;
+      position: relative;
+      z-index: 1;
     }
 
     .conflict-number {
@@ -1499,6 +1656,9 @@
       background: rgba(255, 108, 108, 0.1);
       border: 1px solid rgba(255, 132, 132, 0.28);
       text-align: center;
+      box-shadow:
+        inset 0 1px 0 rgba(255, 255, 255, 0.06),
+        inset 0 -20px 28px rgba(0, 0, 0, 0.12);
 
       strong {
         display: block;
@@ -1521,8 +1681,19 @@
       gap: 10px;
       padding: 14px 8px 0;
       border-bottom: 1px solid rgba(126, 211, 255, 0.18);
-      background-image: linear-gradient(rgba(126, 211, 255, 0.1) 1px, transparent 1px);
+      background-image: linear-gradient(rgba(125, 179, 201, 0.12) 1px, transparent 1px);
       background-size: 100% 38px;
+      position: relative;
+
+      &::before {
+        content: '';
+        position: absolute;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        height: 1px;
+        background: linear-gradient(90deg, transparent, rgba(125, 211, 230, 0.45), transparent);
+      }
 
       .el-tooltip {
         height: 100%;
@@ -1847,6 +2018,14 @@
       text-align: left;
     }
 
+    .team-queue-plan .queue-name-only {
+      margin: 0;
+      color: #303133;
+      font-size: 16px;
+      font-weight: 600;
+      line-height: 22px;
+    }
+
     .plan-metrics {
       display: flex;
       align-items: center;

+ 113 - 39
src/views/factoryCalendar/index.vue

@@ -3,16 +3,6 @@
     <el-card shadow="never" class="factory-calendar-card">
       <div class="page-header">
         <div class="header-actions">
-          <el-button size="small" icon="el-icon-upload2" @click="openImport">
-            批量导入
-          </el-button>
-          <el-button
-            size="small"
-            icon="el-icon-download"
-            @click="exportCalendar"
-          >
-            导出
-          </el-button>
           <el-button
             size="small"
             type="primary"
@@ -34,18 +24,10 @@
           <multi-calendar-view :vm="vm" />
         </el-tab-pane>
 
-        <el-tab-pane label="冲突检测" name="conflict">
-          <conflict-panel ref="conflictPanel" :vm="vm" />
-        </el-tab-pane>
-
         <el-tab-pane label="临时调整审批" name="adjust">
           <adjust-approval ref="adjustApproval" :vm="vm" />
         </el-tab-pane>
 
-        <el-tab-pane label="计划联动" name="plan">
-          <plan-linkage ref="planLinkage" :vm="vm" />
-        </el-tab-pane>
-
         <el-tab-pane label="数据统计" name="stat">
           <statistics-view :vm="vm" />
         </el-tab-pane>
@@ -492,7 +474,7 @@
 
         <div class="drawer-section">
           <div class="drawer-title">
-            <span>关联计划</span>
+            <span>{{ relatedSectionTitle }}</span>
             <em>{{ relatedPlans.length }} 条</em>
           </div>
           <div v-if="relatedPlans.length" class="plan-list">
@@ -503,15 +485,37 @@
               effect="light"
             >
               <div slot="content" class="plan-tooltip">
-                <div>计划编号:{{ plan.planNo || '-' }}</div>
-                <div>计划名称:{{ plan.taskName || '-' }}</div>
-                <div>订单编号:{{ plan.orderNo || '-' }}</div>
-                <div>计划数量:{{ plan.requiredFormingNum || '-' }}</div>
-                <div>开始时间:{{ plan.displayStartTime || '-' }}</div>
-                <div>结束时间:{{ plan.displayEndTime || '-' }}</div>
+                <template v-if="isTeamQueueDrawer">
+                  <div>排班名称:{{ getRelatedQueueName(plan) }}</div>
+                </template>
+                <template v-else>
+                  <div>
+                    {{ isEquipmentDrawer ? '设备编码' : '计划编号' }}:{{
+                      getRelatedPlanCode(plan)
+                    }}
+                  </div>
+                  <div>
+                    {{ isEquipmentDrawer ? '设备名称' : '计划名称' }}:{{
+                      getRelatedPlanName(plan)
+                    }}
+                  </div>
+                  <div v-if="!isEquipmentDrawer">
+                    订单编号:{{ plan.orderNo || '-' }}
+                  </div>
+                  <div v-if="!isEquipmentDrawer">
+                    计划数量:{{ plan.requiredFormingNum || '-' }}
+                  </div>
+                  <div>开始时间:{{ plan.displayStartTime || '-' }}</div>
+                  <div>结束时间:{{ plan.displayEndTime || '-' }}</div>
+                </template>
               </div>
               <div class="plan-item">
-                <div class="plan-main">
+                <div v-if="isTeamQueueDrawer" class="plan-main team-queue-plan">
+                  <div class="plan-name queue-name-only">
+                    {{ getRelatedQueueName(plan) }}
+                  </div>
+                </div>
+                <div v-else class="plan-main">
                   <div class="plan-topline">
                     <strong>{{ plan.planNo }}</strong>
                     <span v-if="plan.orderNo">{{ plan.orderNo }}</span>
@@ -659,9 +663,7 @@
   import { solarToLunar } from 'lunar-calendar';
   import BaseManage from './components/BaseManage.vue';
   import MultiCalendarView from './components/MultiCalendarView.vue';
-  import ConflictPanel from './components/ConflictPanel.vue';
   import AdjustApproval from './components/AdjustApproval.vue';
-  import PlanLinkage from './components/PlanLinkage.vue';
   import StatisticsView from './components/StatisticsView.vue';
   import {
     addCalendar,
@@ -794,9 +796,7 @@
     components: {
       BaseManage,
       MultiCalendarView,
-      ConflictPanel,
       AdjustApproval,
-      PlanLinkage,
       StatisticsView
     },
     data() {
@@ -1370,6 +1370,25 @@
       relatedPlans() {
         return this.currentDay.relatedPlans || [];
       },
+      relatedSectionTitle() {
+        return this.isTeamQueueDrawer ? '排班详情' : '关联计划';
+      },
+      isEquipmentDrawer() {
+        return (
+          Number(this.viewQuery.calendarType) === 2 ||
+          (this.currentDay.details || []).some(
+            (item) => Number(item.calendarType) === 2
+          )
+        );
+      },
+      isTeamQueueDrawer() {
+        return (
+          Number(this.viewQuery.calendarType) === 3 ||
+          (this.currentDay.details || []).some(
+            (item) => Number(item.calendarType) === 3
+          )
+        );
+      },
       legalHolidayOptions() {
         return this.getLegalHolidayOptions(
           this.calendarForm.applyYear,
@@ -2029,10 +2048,16 @@
         const relationEamPlanList = this.normalizeRemotePlans(
           detail.relationEamPlanList || []
         );
+        const relationTeamQueueList = this.normalizeRemotePlans(
+          detail.relationTeamQueueList || []
+        );
+        const relationPlanCountMap = {
+          2: relationEamPlanList.length,
+          3: relationTeamQueueList.length
+        };
         const relationPlanCount =
-          Number(calendarType) === 2
-            ? relationEamPlanList.length
-            : Number(detail.relationPlanCount || relationPlanList.length || 0);
+          relationPlanCountMap[Number(calendarType)] ??
+          Number(detail.relationPlanCount || relationPlanList.length || 0);
         return {
           ...detail,
           id:
@@ -2050,7 +2075,8 @@
           isTempAdjust: Number(detail.isTempAdjust || 0),
           relationPlanCount,
           relationPlanList,
-          relationEamPlanList
+          relationEamPlanList,
+          relationTeamQueueList
         };
       },
       saveData() {
@@ -2176,18 +2202,30 @@
               ...(data.schedulePlanList || []),
               ...(data.relationPlanList || []),
               ...(data.relationEamPlanList || []),
+              ...(data.relationTeamQueueList || []),
               ...(data.affectedPlanList || [])
             ];
         return list.map((item, index) => {
           const planNo =
-            item.planNo || item.orderNo || item.code || `PLAN-${index + 1}`;
+            item.planNo ||
+            item.orderNo ||
+            item.code ||
+            item.teamQueueName ||
+            item.teamQueueId ||
+            `PLAN-${index + 1}`;
           const salesCode = Array.isArray(item.salesCode)
             ? item.salesCode.join(',')
             : item.salesCode;
           const rawStartTime =
-            item.rawStartTime || item.planStartTime || item.startTime;
+            item.rawStartTime ||
+            item.planStartTime ||
+            item.queueDate ||
+            item.startTime;
           const rawEndTime =
-            item.rawEndTime || item.planEndTime || item.endTime;
+            item.rawEndTime ||
+            item.planEndTime ||
+            item.queueEndTime ||
+            item.endTime;
           const startTime = this.formatPlanTime(rawStartTime);
           const endTime = this.formatPlanTime(rawEndTime);
           const displayStartTime = this.formatPlanDateTime(rawStartTime);
@@ -2204,11 +2242,19 @@
               item.salesCodeList ||
               salesCode ||
               item.batchNo ||
+              item.teamName ||
+              item.teamId ||
+              item.userName ||
+              item.userId ||
               '',
             taskName:
               item.taskName ||
               item.productName ||
               item.bomCategoryName ||
+              item.teamQueueName ||
+              item.queueName ||
+              item.teamName ||
+              item.userName ||
               item.name ||
               item.title ||
               '关联计划',
@@ -2220,6 +2266,7 @@
                   item.reqMoldTime ||
                   item.planEndTime ||
                   item.planStartTime ||
+                  item.queueDate ||
                   item.endTime ||
                   item.startTime
               ),
@@ -2266,7 +2313,8 @@
         details.forEach((detail) => {
           [
             ...(detail.relationPlanList || []),
-            ...(detail.relationEamPlanList || [])
+            ...(detail.relationEamPlanList || []),
+            ...(detail.relationTeamQueueList || [])
           ].forEach((plan, index) => {
             const normalized = this.normalizeRemotePlans([plan])[0];
             if (!normalized) {
@@ -2280,12 +2328,38 @@
             map[key] = {
               ...normalized,
               calendarId: normalized.calendarId || detail.calendarId,
-              calendarDate: detail.calendarDate || normalized.calendarDate
+              calendarDate: detail.calendarDate || normalized.calendarDate,
+              calendarType: normalized.calendarType || detail.calendarType
             };
           });
         });
         return Object.values(map);
       },
+      getRelatedPlanCode(plan = {}) {
+        return (
+          (this.isEquipmentDrawer
+            ? plan.deviceCode ||
+              plan.equipmentCode ||
+              plan.eamCode ||
+              plan.assetCode ||
+              plan.planNo
+            : plan.planNo) || '-'
+        );
+      },
+      getRelatedPlanName(plan = {}) {
+        return (
+          (this.isEquipmentDrawer
+            ? plan.deviceName ||
+              plan.equipmentName ||
+              plan.eamName ||
+              plan.assetName ||
+              plan.taskName
+            : plan.taskName) || '-'
+        );
+      },
+      getRelatedQueueName(plan = {}) {
+        return plan.teamQueueName || '-';
+      },
       getDetailPlanCount(details = []) {
         const relatedPlans = this.getDetailRelatedPlans(details);
         if (relatedPlans.length) {