Bläddra i källkod

增加工作站

handy 1 vecka sedan
förälder
incheckning
717f946e3e
2 ändrade filer med 97 tillägg och 4 borttagningar
  1. 79 3
      src/components/WarehouseMap.vue
  2. 18 1
      src/components/warehouse-layout-special-cells.ts

+ 79 - 3
src/components/WarehouseMap.vue

@@ -68,7 +68,7 @@
           </div>
           <div
             v-else-if="isSpecialCell(cell) && cell.label && !shouldHideNonLocationCells"
-            :class="['special-cell-label', `special-cell-label-${cell.type}`]"
+            :class="['special-cell-label', ...getSpecialCellLabelClasses(cell)]"
           >
             {{ cell.label }}
           </div>
@@ -538,9 +538,43 @@ const getWorkingHighlightClass = (cell: GridCell) => {
   return null
 }
 
+const getSpecialCellClasses = (cell: WarehouseLayoutSpecialCell) => {
+  if (cell.type !== 'workpoint') {
+    return [cell.type]
+  }
+
+  const normalizedLabel = String(cell.label || '')
+    .trim()
+    .toUpperCase()
+  if (normalizedLabel.startsWith('A')) {
+    return ['workpoint', 'workpoint-a']
+  }
+  if (normalizedLabel.startsWith('B')) {
+    return ['workpoint', 'workpoint-b']
+  }
+  return ['workpoint']
+}
+
+const getSpecialCellLabelClasses = (cell: WarehouseLayoutSpecialCell) => {
+  const classNames = [`special-cell-label-${cell.type}`]
+  if (cell.type !== 'workpoint') {
+    return classNames
+  }
+
+  const normalizedLabel = String(cell.label || '')
+    .trim()
+    .toUpperCase()
+  if (normalizedLabel.startsWith('A')) {
+    classNames.push('special-cell-label-workpoint-a')
+  } else if (normalizedLabel.startsWith('B')) {
+    classNames.push('special-cell-label-workpoint-b')
+  }
+  return classNames
+}
+
 const getCellClass = (cell: MapCell) => {
   if (isSpecialCell(cell)) {
-    return shouldHideNonLocationCells.value ? ['hidden-cell'] : [cell.type]
+    return shouldHideNonLocationCells.value ? ['hidden-cell'] : getSpecialCellClasses(cell)
   }
 
   if (!isLocationCell(cell)) {
@@ -998,6 +1032,9 @@ onBeforeUnmount(() => {
   --aisle-bg: #050505;
   --wall-bg: #151515;
   --elevator-bg: #101010;
+  --charger-bg: #231b06;
+  --workpoint-a-bg: #12311b;
+  --workpoint-b-bg: #3b102a;
   --cell-category-a: rgba(31, 122, 63, 0.18);
   --cell-category-b: rgba(47, 95, 215, 0.18);
   --cell-category-c: rgba(184, 146, 31, 0.2);
@@ -1024,6 +1061,9 @@ onBeforeUnmount(() => {
   --aisle-bg: #e9edf2;
   --wall-bg: #d9dee6;
   --elevator-bg: #e2e6ec;
+  --charger-bg: #f0e4b8;
+  --workpoint-a-bg: #cfe9d5;
+  --workpoint-b-bg: #f4d2e2;
   --cell-category-a: rgba(31, 122, 63, 0.12);
   --cell-category-b: rgba(47, 95, 215, 0.12);
   --cell-category-c: rgba(184, 146, 31, 0.18);
@@ -1116,6 +1156,26 @@ onBeforeUnmount(() => {
   cursor: default;
 }
 
+.grid-cell.charger {
+  background: var(--charger-bg);
+  cursor: default;
+}
+
+.grid-cell.workpoint-a {
+  background: var(--workpoint-a-bg);
+  cursor: default;
+}
+
+.grid-cell.workpoint-b {
+  background: var(--workpoint-b-bg);
+  cursor: default;
+}
+
+.grid-cell.workpoint:not(.workpoint-a):not(.workpoint-b) {
+  background: var(--charger-bg);
+  cursor: default;
+}
+
 .grid-cell.hidden-cell {
   background: transparent;
   cursor: default;
@@ -1167,7 +1227,7 @@ onBeforeUnmount(() => {
     0 0 18px var(--working-container-outbound);
 }
 
-.grid-cell:not(.aisle):not(.wall):not(.elevator):hover {
+.grid-cell:not(.aisle):not(.wall):not(.elevator):not(.charger):not(.workpoint):hover {
   transform: scale(1.03);
   box-shadow: var(--hover-shadow);
   z-index: 10;
@@ -1291,6 +1351,22 @@ onBeforeUnmount(() => {
   color: var(--special-label-strong);
 }
 
+.special-cell-label-charger {
+  color: var(--special-label-strong);
+}
+
+.special-cell-label-workpoint {
+  color: var(--special-label-strong);
+}
+
+.special-cell-label-workpoint-a {
+  color: var(--special-label-strong);
+}
+
+.special-cell-label-workpoint-b {
+  color: var(--special-label-strong);
+}
+
 .cell-tooltip {
   position: fixed;
   z-index: 1000;

+ 18 - 1
src/components/warehouse-layout-special-cells.ts

@@ -6,7 +6,7 @@ export interface WarehouseLayoutWallCell {
 export interface WarehouseLayoutSpecialCell {
   gridRow: number
   gridCol: number
-  type: 'wall' | 'elevator'
+  type: 'wall' | 'elevator' | 'charger' | 'workpoint'
   label?: string
 }
 
@@ -62,11 +62,28 @@ const SHARED_SPECIAL_CELLS: readonly WarehouseLayoutSpecialCell[] = [
   ...specialArea(13, 15, 20, 22, 'elevator', '提升机')
 ] as const
 
+const LEVEL_1_SPECIAL_CELLS: readonly WarehouseLayoutSpecialCell[] = [
+  specialCell(34, 1, 'workpoint', 'A1'),
+  specialCell(34, 2, 'workpoint', 'A2'),
+  specialCell(34, 3, 'workpoint', 'A3'),
+  specialCell(34, 4, 'workpoint', 'B1'),
+  specialCell(34, 6, 'workpoint', 'A4'),
+  specialCell(34, 7, 'workpoint', 'B2'),
+  specialCell(34, 12, 'workpoint', 'B3'),
+  specialCell(34, 13, 'workpoint', 'B4'),
+  specialCell(34, 26, 'charger', '充电桩'),
+  specialCell(34, 27, 'charger', '充电桩')
+] as const
+
 export const getWarehouseLayoutSpecialCells = (level: number): WarehouseLayoutSpecialCell[] => {
   if (!level) {
     return []
   }
 
+  if (level === 1) {
+    return [...SHARED_SPECIAL_CELLS, ...LEVEL_1_SPECIAL_CELLS]
+  }
+
   return [...SHARED_SPECIAL_CELLS]
 }